diff --git a/.circleci/config.yml b/.circleci/config.yml index 862fa126b7..751ca95b18 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,249 +1,189 @@ -version: 2 +version: 2.1 -aliases: - - &defaults +orbs: + ruby: circleci/ruby@1.2.0 + node: circleci/node@4.7.0 + +executors: + default: + parameters: + ruby-version: + type: string docker: - - image: circleci/ruby:2.7-buster-node - environment: &ruby_environment + - image: cimg/ruby:<< parameters.ruby-version >> + environment: BUNDLE_JOBS: 3 BUNDLE_RETRY: 3 - BUNDLE_APP_CONFIG: ./.bundle/ - BUNDLE_PATH: ./vendor/bundle/ + CONTINUOUS_INTEGRATION: true DB_HOST: localhost DB_USER: root - RAILS_ENV: test - ALLOW_NOPAM: true - CONTINUOUS_INTEGRATION: true DISABLE_SIMPLECOV: true - PAM_ENABLED: true - PAM_DEFAULT_SERVICE: pam_test - PAM_CONTROLLED_SERVICE: pam_test_controlled - working_directory: ~/projects/mastodon/ + RAILS_ENV: test + - image: cimg/postgres:14.0 + environment: + POSTGRES_USER: root + POSTGRES_HOST_AUTH_METHOD: trust + - image: circleci/redis:6-alpine - - &attach_workspace - attach_workspace: - at: ~/projects/ +commands: + install-system-dependencies: + steps: + - run: + name: Install system dependencies + command: | + sudo apt-get update + sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler + install-ruby-dependencies: + parameters: + ruby-version: + type: string + steps: + - run: + command: | + bundle config clean 'true' + bundle config frozen 'true' + bundle config without 'development production' + name: Set bundler settings + - ruby/install-deps: + bundler-version: '2.2.31' + key: ruby<< parameters.ruby-version >>-gems-v1 + wait-db: + steps: + - run: + command: dockerize -wait tcp://localhost:5432 -wait tcp://localhost:6379 -timeout 1m + name: Wait for PostgreSQL and Redis - - &persist_to_workspace - persist_to_workspace: - root: ~/projects/ - paths: - - ./mastodon/ - - - &restore_ruby_dependencies - restore_cache: - keys: - - v3-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }} - - v3-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}- - - v3-ruby-dependencies- - - - &install_steps +jobs: + build: + docker: + - image: cimg/ruby:3.0-node + environment: + RAILS_ENV: test steps: - checkout - - *attach_workspace - - restore_cache: - keys: - - v2-node-dependencies-{{ checksum "yarn.lock" }} - - v2-node-dependencies- + - install-system-dependencies + - install-ruby-dependencies: + ruby-version: '3.0' + - node/install-packages: + cache-version: v1 + pkg-manager: yarn - run: - name: Install yarn dependencies - command: yarn install --frozen-lockfile - - save_cache: - key: v2-node-dependencies-{{ checksum "yarn.lock" }} - paths: - - ./node_modules/ - - *persist_to_workspace - - - &install_system_dependencies - run: - name: Install system dependencies - command: | - sudo apt-get update - sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler - - - &install_ruby_dependencies - steps: - - *attach_workspace - - *install_system_dependencies - - run: - name: Set Ruby version - command: ruby -e 'puts RUBY_VERSION' | tee /tmp/.ruby-version - - *restore_ruby_dependencies - - run: - name: Set bundler settings - command: | - bundle config --local clean 'true' - bundle config --local deployment 'true' - bundle config --local with 'pam_authentication' - bundle config --local without 'development production' - bundle config --local frozen 'true' - bundle config --local path $BUNDLE_PATH - - run: - name: Install bundler dependencies - command: bundle check || (bundle install && bundle clean) - - save_cache: - key: v3-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }} - paths: - - ./.bundle/ - - ./vendor/bundle/ - - persist_to_workspace: - root: ~/projects/ - paths: - - ./mastodon/.bundle/ - - ./mastodon/vendor/bundle/ - - - &test_steps - parallelism: 4 - steps: - - *attach_workspace - - *install_system_dependencies - - run: - name: Install FFMPEG - command: sudo apt-get install -y ffmpeg - - run: - name: Load database schema - command: ./bin/rails db:create db:schema:load db:seed - - run: - name: Run rspec in parallel - command: | - bundle exec rspec --profile 10 \ - --format RspecJunitFormatter \ - --out test_results/rspec.xml \ - --format progress \ - $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings) - - store_test_results: - path: test_results -jobs: - install: - <<: *defaults - <<: *install_steps - - install-ruby2.7: - <<: *defaults - <<: *install_ruby_dependencies - - install-ruby2.6: - <<: *defaults - docker: - - image: circleci/ruby:2.6-buster-node - environment: *ruby_environment - <<: *install_ruby_dependencies - - build: - <<: *defaults - steps: - - *attach_workspace - - *install_system_dependencies - - run: - name: Precompile assets command: ./bin/rails assets:precompile + name: Precompile assets - persist_to_workspace: - root: ~/projects/ paths: - - ./mastodon/public/assets - - ./mastodon/public/packs-test/ + - public/assets + - public/packs-test + root: . + + test: + parameters: + ruby-version: + type: string + executor: + name: default + ruby-version: << parameters.ruby-version >> + environment: + ALLOW_NOPAM: true + PAM_ENABLED: true + PAM_DEFAULT_SERVICE: pam_test + PAM_CONTROLLED_SERVICE: pam_test_controlled + parallelism: 4 + steps: + - checkout + - install-system-dependencies + - run: + command: sudo apt-get install -y ffmpeg imagemagick libpam-dev + name: Install additional system dependencies + - run: + command: bundle config with 'pam_authentication' + name: Enable PAM authentication + - install-ruby-dependencies: + ruby-version: << parameters.ruby-version >> + - attach_workspace: + at: . + - wait-db + - run: + command: ./bin/rails db:create db:schema:load db:seed + name: Load database schema + - ruby/rspec-test test-migrations: - <<: *defaults - docker: - - image: circleci/ruby:2.7-buster-node - environment: *ruby_environment - - image: circleci/postgres:12.2 - environment: - POSTGRES_USER: root - POSTGRES_HOST_AUTH_METHOD: trust - - image: circleci/redis:5-alpine + executor: + name: default + ruby-version: '3.0' steps: - - *attach_workspace - - *install_system_dependencies + - checkout + - install-system-dependencies + - install-ruby-dependencies: + ruby-version: '3.0' + - wait-db - run: - name: Create database command: ./bin/rails db:create + name: Create database + - run: + command: ./bin/rails db:migrate VERSION=20171010025614 + name: Run migrations up to v2.0.0 + - run: + command: ./bin/rails tests:migrations:populate_v2 + name: Populate database with test data - run: - name: Run migrations command: ./bin/rails db:migrate + name: Run all remaining migrations - test-ruby2.7: - <<: *defaults - docker: - - image: circleci/ruby:2.7-buster-node - environment: *ruby_environment - - image: circleci/postgres:12.2 - environment: - POSTGRES_USER: root - POSTGRES_HOST_AUTH_METHOD: trust - - image: circleci/redis:5-alpine - <<: *test_steps - - test-ruby2.6: - <<: *defaults - docker: - - image: circleci/ruby:2.6-buster-node - environment: *ruby_environment - - image: circleci/postgres:12.2 - environment: - POSTGRES_USER: root - POSTGRES_HOST_AUTH_METHOD: trust - - image: circleci/redis:5-alpine - <<: *test_steps - - test-webui: - <<: *defaults - docker: - - image: circleci/node:12-buster + test-two-step-migrations: + executor: + name: default + ruby-version: '3.0' steps: - - *attach_workspace + - checkout + - install-system-dependencies + - install-ruby-dependencies: + ruby-version: '3.0' + - wait-db - run: - name: Run jest - command: yarn test:jest - - check-i18n: - <<: *defaults - steps: - - *attach_workspace - - *install_system_dependencies + command: ./bin/rails db:create + name: Create database - run: - name: Check locale file normalization - command: bundle exec i18n-tasks check-normalized + command: ./bin/rails db:migrate VERSION=20171010025614 + name: Run migrations up to v2.0.0 - run: - name: Check for unused strings - command: bundle exec i18n-tasks unused -l en + command: ./bin/rails tests:migrations:populate_v2 + name: Populate database with test data - run: - name: Check for wrong string interpolations - command: bundle exec i18n-tasks check-consistent-interpolations + command: ./bin/rails db:migrate + name: Run all pre-deployment migrations + evironment: + SKIP_POST_DEPLOYMENT_MIGRATIONS: true - run: - name: Check that all required locale files exist - command: bundle exec rake repo:check_locales_files + command: ./bin/rails db:migrate + name: Run all post-deployment remaining migrations workflows: version: 2 build-and-test: jobs: - - install - - install-ruby2.7: + - build + - test: + matrix: + parameters: + ruby-version: + - '2.7' + - '3.0' + name: test-ruby<< matrix.ruby-version >> requires: - - install - - install-ruby2.6: - requires: - - install - - install-ruby2.7 - - build: - requires: - - install-ruby2.7 + - build - test-migrations: requires: - - install-ruby2.7 - - test-ruby2.7: - requires: - - install-ruby2.7 - build - - test-ruby2.6: + - test-two-step-migrations: requires: - - install-ruby2.6 - build - - test-webui: + - node/run: + cache-version: v1 + name: test-webui + pkg-manager: yarn requires: - - install - - check-i18n: - requires: - - install-ruby2.7 + - build + version: lts + yarn-run: test:jest diff --git a/.codeclimate.yml b/.codeclimate.yml index 2d1de877ce..c253bd95a7 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -30,9 +30,12 @@ plugins: channel: eslint-7 rubocop: enabled: true - channel: rubocop-1-70 + channel: rubocop-1-9-1 sass-lint: enabled: true exclude_patterns: - spec/ -- vendor/asset +- vendor/asset/ + +- app/javascript/mastodon/locales/**/*.json +- config/locales/**/*.yml diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 0000000000..bcd3104124 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,23 @@ +version = 1 + +test_patterns = ["app/javascript/mastodon/**/__tests__/**"] + +exclude_patterns = [ + "db/migrate/**", + "db/post_migrate/**" +] + +[[analyzers]] +name = "ruby" +enabled = true + +[[analyzers]] +name = "javascript" +enabled = true + + [analyzers.meta] + environment = [ + "browser", + "jest", + "nodejs" + ] diff --git a/.dockerignore b/.dockerignore index bf918029b6..fedbea236d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,10 @@ .bundle .env .env.* +.git +.gitattributes +.gitignore +.github public/system public/assets public/packs @@ -11,5 +15,7 @@ vendor/bundle *.swp *~ postgres +postgres14 redis elasticsearch +chart diff --git a/.env.nanobox b/.env.nanobox index 5951777a2d..51dfdbd58f 100644 --- a/.env.nanobox +++ b/.env.nanobox @@ -13,7 +13,7 @@ DB_PORT=5432 # DATABASE_URL=postgresql://$DATA_DB_USER:$DATA_DB_PASS@$DATA_DB_HOST/gonano -# Optional ElasticSearch configuration +# Optional Elasticsearch configuration ES_ENABLED=true ES_HOST=$DATA_ELASTIC_HOST ES_PORT=9200 @@ -202,10 +202,6 @@ SMTP_FROM_ADDRESS=notifications@${APP_NAME}.nanoapp.io # Name of the pam service used for checking if an user can register (pam "account" section is evaluated) (nil (disabled) by default) # PAM_CONTROLLED_SERVICE=rpam -# Global OAuth settings (optional) : -# If you have only one strategy, you may want to enable this -# OAUTH_REDIRECT_AT_SIGN_IN=true - # Optional CAS authentication (cf. omniauth-cas) : # CAS_ENABLED=true # CAS_URL=https://sso.myserver.com/ @@ -228,6 +224,7 @@ SMTP_FROM_ADDRESS=notifications@${APP_NAME}.nanoapp.io # CAS_LOCATION_KEY='location' # CAS_IMAGE_KEY='image' # CAS_PHONE_KEY='phone' +# CAS_SECURITY_ASSUME_EMAIL_IS_VERIFIED=true # Optional SAML authentication (cf. omniauth-saml) # SAML_ENABLED=true diff --git a/.env.production.sample b/.env.production.sample index 12ca64a066..7de5e00f40 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -4,6 +4,12 @@ # not demonstrate all available configuration options. Please look at # https://docs.joinmastodon.org/admin/config/ for the full documentation. +# Note that this file accepts slightly different syntax depending on whether +# you are using `docker-compose` or not. In particular, if you use +# `docker-compose`, the value of each declared variable will be taken verbatim, +# including surrounding quotes. +# See: https://github.com/mastodon/mastodon/issues/16895 + # Federation # ---------- # This identifies your server and cannot be changed safely later @@ -50,11 +56,14 @@ DB_PASS= DB_PORT=5432 -# ElasticSearch (optional) +# Elasticsearch (optional) # ------------------------ #ES_ENABLED=true #ES_HOST=localhost #ES_PORT=9200 +# Authentication for ES (optional) +#ES_USER=elastic +#ES_PASS=password # Secrets @@ -269,3 +278,14 @@ MAX_POLL_OPTION_CHARS=100 # Maximum search results to display # Only relevant when elasticsearch is installed # MAX_SEARCH_RESULTS=20 + +# Maximum custom emoji file sizes +# If undefined or smaller than MAX_EMOJI_SIZE, the value +# of MAX_EMOJI_SIZE will be used for MAX_REMOTE_EMOJI_SIZE +# Units are in bytes +MAX_EMOJI_SIZE=51200 +MAX_REMOTE_EMOJI_SIZE=204800 + +# Optional hCaptcha support +# HCAPTCHA_SECRET_KEY= +# HCAPTCHA_SITE_KEY= diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 32919bd50c..fd6f74689e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -# CODEOWNERS for tootsuite/mastodon +# CODEOWNERS for mastodon/mastodon # Translators # To add translator, copy these lines, replace `fr` with appropriate language code and replace `@żelipapą` with user's GitHub nickname preceded by `@` sign or e-mail address. diff --git a/.github/ISSUE_TEMPLATE/1.bug_report.yml b/.github/ISSUE_TEMPLATE/1.bug_report.yml new file mode 100644 index 0000000000..9cdf813f7b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1.bug_report.yml @@ -0,0 +1,42 @@ +name: Bug Report +description: If something isn't working as expected +labels: bug +body: + - type: markdown + attributes: + value: | + Make sure that you are submitting a new bug that was not previously reported or already fixed. + + Please use a concise and distinct title for the issue. + - type: textarea + attributes: + label: Steps to reproduce the problem + description: What were you trying to do? + value: | + 1. + 2. + 3. + ... + validations: + required: true + - type: input + attributes: + label: Expected behaviour + description: What should have happened? + validations: + required: true + - type: input + attributes: + label: Actual behaviour + description: What happened? + validations: + required: true + - type: textarea + attributes: + label: Specifications + description: | + What version or commit hash of Mastodon did you find this bug in? + + If a front-end issue, what browser and operating systems were you using? + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/2.feature_request.yml b/.github/ISSUE_TEMPLATE/2.feature_request.yml new file mode 100644 index 0000000000..00aad13417 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2.feature_request.yml @@ -0,0 +1,21 @@ +name: Feature Request +description: I have a suggestion +body: + - type: markdown + attributes: + value: | + Please use a concise and distinct title for the issue. + + Consider: Could it be implemented as a 3rd party app using the REST API instead? + - type: textarea + attributes: + label: Pitch + description: Describe your idea for a feature. Make sure it has not already been suggested/implemented/turned down before. + validations: + required: true + - type: textarea + attributes: + label: Motivation + description: Why do you think this feature is needed? Who would benefit from it? + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/support.md b/.github/ISSUE_TEMPLATE/3.support.md similarity index 90% rename from .github/ISSUE_TEMPLATE/support.md rename to .github/ISSUE_TEMPLATE/3.support.md index 7fbc86ff14..e2217da8bc 100644 --- a/.github/ISSUE_TEMPLATE/support.md +++ b/.github/ISSUE_TEMPLATE/3.support.md @@ -1,7 +1,7 @@ --- name: Support about: Ask for help with your deployment - +title: DO NOT CREATE THIS ISSUE --- We primarily use GitHub as a bug and feature tracker. For usage questions, troubleshooting of deployments and other individual technical assistance, please use one of the resources below: diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 870394a915..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -name: Bug Report -about: If something isn't working as expected -labels: bug ---- - -[Issue text goes here]. - -* * * * - -- [ ] I searched or browsed the repo’s other issues to ensure this is not a duplicate. -- [ ] This bugs also occur on vanilla Mastodon diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index ff92c0316e..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: Feature Request -about: I have a suggestion ---- - - - - - -### Pitch - - - -### Motivation - - diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml new file mode 100644 index 0000000000..d3eeb9368c --- /dev/null +++ b/.github/workflows/build-image.yml @@ -0,0 +1,35 @@ +name: Build container image +on: + workflow_dispatch: + push: + branches: + - "main" + tags: + - "*" +jobs: + build-image: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: docker/setup-buildx-action@v1 + - uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - uses: docker/metadata-action@v3 + id: meta + with: + images: ghcr.io/${{ github.repository_owner }}/mastodon + flavor: | + latest=true + tags: | + type=edge,branch=main + type=semver,pattern={{ raw }} + - uses: docker/build-push-action@v2 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/mastodon:latest + cache-to: type=inline diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml new file mode 100644 index 0000000000..2e8f230f31 --- /dev/null +++ b/.github/workflows/check-i18n.yml @@ -0,0 +1,34 @@ +name: Check i18n + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + RAILS_ENV: test + +jobs: + check-i18n: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.0' + bundler-cache: true + - name: Check locale file normalization + run: bundle exec i18n-tasks check-normalized + - name: Check for unused strings + run: bundle exec i18n-tasks unused -l en + - name: Check for wrong string interpolations + run: bundle exec i18n-tasks check-consistent-interpolations + - name: Check that all required locale files exist + run: bundle exec rake repo:check_locales_files diff --git a/.gitignore b/.gitignore index 4545270b30..25c8388e16 100644 --- a/.gitignore +++ b/.gitignore @@ -40,13 +40,12 @@ # Ignore postgres + redis + elasticsearch volume optionally created by docker-compose /postgres +/postgres14 /redis /elasticsearch -# ignore Helm lockfile, dependency charts, and local values file -/chart/Chart.lock +# ignore Helm dependency charts /chart/charts/*.tgz -/chart/values.yaml # Ignore Apple files .DS_Store diff --git a/.nvmrc b/.nvmrc index 48082f72f0..8351c19397 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -12 +14 diff --git a/.ruby-version b/.ruby-version index 37c2961c24..75a22a26ac 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.2 +3.0.3 diff --git a/AUTHORS.md b/AUTHORS.md index 43adc3bb1a..596451737e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,43 +1,42 @@ Authors ======= -Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon) +Mastodon is available on [GitHub](https://github.com/mastodon/mastodon) and provided thanks to the work of the following contributors: * [Gargron](https://github.com/Gargron) -* [ThibG](https://github.com/ThibG) -* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview) * [dependabot[bot]](https://github.com/apps/dependabot) +* [ClearlyClaire](https://github.com/ClearlyClaire) +* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview) * [ykzts](https://github.com/ykzts) * [akihikodaki](https://github.com/akihikodaki) * [mjankowski](https://github.com/mjankowski) * [unarist](https://github.com/unarist) -* [yiskah](https://github.com/yiskah) -* [nolanlawson](https://github.com/nolanlawson) * [abcang](https://github.com/abcang) +* [yiskah](https://github.com/yiskah) +* [noellabo](https://github.com/noellabo) +* [nolanlawson](https://github.com/nolanlawson) * [mayaeh](https://github.com/mayaeh) * [ysksn](https://github.com/ysksn) * [sorin-davidoi](https://github.com/sorin-davidoi) -* [noellabo](https://github.com/noellabo) * [lynlynlynx](https://github.com/lynlynlynx) * [m4sk1n](mailto:me@m4sk.in) * [Marcin Mikołajczak](mailto:me@m4sk.in) -* [Kjwon15](https://github.com/Kjwon15) +* [tribela](https://github.com/tribela) * [renatolond](https://github.com/renatolond) * [alpaca-tc](https://github.com/alpaca-tc) -* [jeroenpraat](https://github.com/jeroenpraat) +* [zunda](https://github.com/zunda) * [nclm](https://github.com/nclm) * [ineffyble](https://github.com/ineffyble) -* [zunda](https://github.com/zunda) * [shleeable](https://github.com/shleeable) * [Masoud Abkenar](mailto:ampbox@gmail.com) * [blackle](https://github.com/blackle) * [Quent-in](https://github.com/Quent-in) * [JantsoP](https://github.com/JantsoP) +* [ariasuni](https://github.com/ariasuni) * [nullkal](https://github.com/nullkal) * [yookoala](https://github.com/yookoala) * [Brawaru](https://github.com/Brawaru) -* [ariasuni](https://github.com/ariasuni) * [Aditoo17](https://github.com/Aditoo17) * [Quenty31](https://github.com/Quenty31) * [marek-lach](https://github.com/marek-lach) @@ -45,7 +44,9 @@ and provided thanks to the work of the following contributors: * [ashfurrow](https://github.com/ashfurrow) * [danhunsaker](https://github.com/danhunsaker) * [eramdam](https://github.com/eramdam) +* [Jeroen](mailto:jeroenpraat@users.noreply.github.com) * [takayamaki](https://github.com/takayamaki) +* [dunn](https://github.com/dunn) * [masarakki](https://github.com/masarakki) * [ticky](https://github.com/ticky) * [trwnh](https://github.com/trwnh) @@ -53,15 +54,15 @@ and provided thanks to the work of the following contributors: * [hinaloe](https://github.com/hinaloe) * [hcmiya](https://github.com/hcmiya) * [stephenburgess8](https://github.com/stephenburgess8) -* [Wonderfall](mailto:wonderfall@targaryen.house) +* [Wonderfall](https://github.com/Wonderfall) * [matteoaquila](https://github.com/matteoaquila) * [yukimochi](https://github.com/yukimochi) * [palindromordnilap](https://github.com/palindromordnilap) * [rkarabut](https://github.com/rkarabut) +* [jeroenpraat](mailto:jeroenpraat@users.noreply.github.com) * [nightpool](https://github.com/nightpool) * [Artoria2e5](https://github.com/Artoria2e5) * [marrus-sh](https://github.com/marrus-sh) -* [dunn](https://github.com/dunn) * [krainboltgreene](https://github.com/krainboltgreene) * [pfigel](https://github.com/pfigel) * [BoFFire](https://github.com/BoFFire) @@ -73,18 +74,19 @@ and provided thanks to the work of the following contributors: * [SerCom_KC](mailto:sercom-kc@users.noreply.github.com) * [Sylvhem](https://github.com/Sylvhem) * [MitarashiDango](https://github.com/MitarashiDango) +* [rinsuki](https://github.com/rinsuki) * [angristan](https://github.com/angristan) * [JeanGauthier](https://github.com/JeanGauthier) * [kschaper](https://github.com/kschaper) * [beatrix-bitrot](https://github.com/beatrix-bitrot) * [koyuawsmbrtn](https://github.com/koyuawsmbrtn) * [BenLubar](https://github.com/BenLubar) +* [mkljczk](https://github.com/mkljczk) * [adbelle](https://github.com/adbelle) * [evanminto](https://github.com/evanminto) * [MightyPork](https://github.com/MightyPork) * [ashleyhull-versent](https://github.com/ashleyhull-versent) * [yhirano55](https://github.com/yhirano55) -* [rinsuki](https://github.com/rinsuki) * [devkral](https://github.com/devkral) * [camponez](https://github.com/camponez) * [hugogameiro](https://github.com/hugogameiro) @@ -100,7 +102,6 @@ and provided thanks to the work of the following contributors: * [lindwurm](https://github.com/lindwurm) * [victorhck](mailto:victorhck@geeko.site) * [voidsatisfaction](https://github.com/voidsatisfaction) -* [mkljczk](https://github.com/mkljczk) * [hikari-no-yume](https://github.com/hikari-no-yume) * [seefood](https://github.com/seefood) * [jackjennings](https://github.com/jackjennings) @@ -135,10 +136,11 @@ and provided thanks to the work of the following contributors: * [kadiix](https://github.com/kadiix) * [kodacs](https://github.com/kodacs) * [marcin mikołajczak](mailto:me@m4sk.in) -* [JMendyk](https://github.com/JMendyk) * [KScl](https://github.com/KScl) * [sterdev](https://github.com/sterdev) +* [mashirozx](https://github.com/mashirozx) * [TheKinrar](https://github.com/TheKinrar) +* [007lva](https://github.com/007lva) * [AA4ch1](https://github.com/AA4ch1) * [alexgleason](https://github.com/alexgleason) * [Bèr Kessels](mailto:ber@berk.es) @@ -150,6 +152,7 @@ and provided thanks to the work of the following contributors: * [hendotcat](https://github.com/hendotcat) * [d6rkaiz](https://github.com/d6rkaiz) * [ladyisatis](https://github.com/ladyisatis) +* [JMendyk](https://github.com/JMendyk) * [JohnD28](https://github.com/JohnD28) * [znz](https://github.com/znz) * [saper](https://github.com/saper) @@ -159,6 +162,7 @@ and provided thanks to the work of the following contributors: * [ekiru](https://github.com/ekiru) * [geta6](https://github.com/geta6) * [happycoloredbanana](https://github.com/happycoloredbanana) +* [joenepraat](https://github.com/joenepraat) * [leopku](https://github.com/leopku) * [SansPseudoFix](https://github.com/SansPseudoFix) * [spla](mailto:sp@mastodont.cat) @@ -169,13 +173,13 @@ and provided thanks to the work of the following contributors: * [nzws](https://github.com/nzws) * [duxovni](https://github.com/duxovni) * [smorimoto](https://github.com/smorimoto) -* [mashirozx](https://github.com/mashirozx) * [178inaba](https://github.com/178inaba) * [acid-chicken](https://github.com/acid-chicken) * [xgess](https://github.com/xgess) * [alyssais](https://github.com/alyssais) * [aablinov](https://github.com/aablinov) * [stalker314314](https://github.com/stalker314314) +* [cohosh](https://github.com/cohosh) * [cutls](https://github.com/cutls) * [huertanix](https://github.com/huertanix) * [eleboucher](https://github.com/eleboucher) @@ -184,7 +188,7 @@ and provided thanks to the work of the following contributors: * [treby](https://github.com/treby) * [jpdevries](https://github.com/jpdevries) * [gdpelican](https://github.com/gdpelican) -* [Korbinian](mailto:kontakt@korbinian-michl.de) +* [MonaLisaOverrdrive](https://github.com/MonaLisaOverrdrive) * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name) * [panarom](https://github.com/panarom) * [Dar13](https://github.com/Dar13) @@ -204,6 +208,7 @@ and provided thanks to the work of the following contributors: * [gled-rs](https://github.com/gled-rs) * [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl) * [R0ckweb](https://github.com/R0ckweb) +* [Izorkin](https://github.com/Izorkin) * [unasuke](https://github.com/unasuke) * [caasi](https://github.com/caasi) * [chr-1x](https://github.com/chr-1x) @@ -211,13 +216,14 @@ and provided thanks to the work of the following contributors: * [foxiehkins](https://github.com/foxiehkins) * [highemerly](https://github.com/highemerly) * [hoodie](mailto:hoodiekitten@outlook.com) +* [kaiyou](https://github.com/kaiyou) * [luzi82](https://github.com/luzi82) * [slice](https://github.com/slice) * [tmm576](https://github.com/tmm576) * [unsmell](mailto:unsmell@users.noreply.github.com) * [valerauko](https://github.com/valerauko) * [chriswmartin](https://github.com/chriswmartin) -* [vahnj](https://github.com/vahnj) +* [SuperSandro2000](https://github.com/SuperSandro2000) * [ikuradon](https://github.com/ikuradon) * [AndreLewin](https://github.com/AndreLewin) * [0xflotus](https://github.com/0xflotus) @@ -254,17 +260,20 @@ and provided thanks to the work of the following contributors: * [ian-kelling](https://github.com/ian-kelling) * [immae](https://github.com/immae) * [J0WI](https://github.com/J0WI) +* [vahnj](https://github.com/vahnj) * [foozmeat](https://github.com/foozmeat) * [jasonrhodes](https://github.com/jasonrhodes) * [Jason Snell](mailto:jason@newrelic.com) * [jviide](https://github.com/jviide) * [YuleZ](https://github.com/YuleZ) +* [jtracey](https://github.com/jtracey) * [crakaC](https://github.com/crakaC) * [tkbky](https://github.com/tkbky) * [Kaylee](mailto:kaylee@codethat.sucks) * [Kazhnuz](https://github.com/Kazhnuz) * [mkody](https://github.com/mkody) * [connyduck](https://github.com/connyduck) +* [Tak](https://github.com/Tak) * [LindseyB](https://github.com/LindseyB) * [Lorenz Diener](mailto:halcyon@icosahedron.website) * [Markus Amalthea Magnuson](mailto:markus.magnuson@gmail.com) @@ -282,9 +291,9 @@ and provided thanks to the work of the following contributors: * [lumenwrites](https://github.com/lumenwrites) * [remram44](https://github.com/remram44) * [sts10](https://github.com/sts10) -* [SuperSandro2000](https://github.com/SuperSandro2000) * [u1-liquid](https://github.com/u1-liquid) * [rosylilly](https://github.com/rosylilly) +* [withshubh](https://github.com/withshubh) * [sim6](https://github.com/sim6) * [Sir-Boops](https://github.com/Sir-Boops) * [stemid](https://github.com/stemid) @@ -305,15 +314,16 @@ and provided thanks to the work of the following contributors: * [anon5r](https://github.com/anon5r) * [aus-social](https://github.com/aus-social) * [bsky](mailto:me@imbsky.net) +* [chandrn7](https://github.com/chandrn7) * [codl](https://github.com/codl) * [cpsdqs](https://github.com/cpsdqs) * [barzamin](https://github.com/barzamin) +* [gol-cha](https://github.com/gol-cha) * [fhalna](https://github.com/fhalna) * [haoyayoi](https://github.com/haoyayoi) * [ik11235](https://github.com/ik11235) * [kawax](https://github.com/kawax) * [shrft](https://github.com/shrft) -* [007lva](https://github.com/007lva) * [mbajur](https://github.com/mbajur) * [matsurai25](https://github.com/matsurai25) * [mecab](https://github.com/mecab) @@ -353,7 +363,7 @@ and provided thanks to the work of the following contributors: * [a2](https://github.com/a2) * [alfiedotwtf](https://github.com/alfiedotwtf) * [0xa](https://github.com/0xa) -* [ArisuOngaku](https://github.com/ArisuOngaku) +* [ashpieboop](https://github.com/ashpieboop) * [virtualpain](https://github.com/virtualpain) * [sapphirus](https://github.com/sapphirus) * [amandavisconti](https://github.com/amandavisconti) @@ -367,6 +377,7 @@ and provided thanks to the work of the following contributors: * [orlea](https://github.com/orlea) * [armandfardeau](https://github.com/armandfardeau) * [raboof](https://github.com/raboof) +* [aldatsa](https://github.com/aldatsa) * [jumbosushi](https://github.com/jumbosushi) * [acuteaura](https://github.com/acuteaura) * [ayumin](https://github.com/ayumin) @@ -375,7 +386,7 @@ and provided thanks to the work of the following contributors: * [li-bei](https://github.com/li-bei) * [Benedikt Geißler](mailto:benedikt@g5r.eu) * [BenisonSebastian](https://github.com/BenisonSebastian) -* [blakebarnett](https://github.com/blakebarnett) +* [Blake](mailto:blake.barnett@postmates.com) * [Brad Janke](mailto:brad.janke@gmail.com) * [bclindner](https://github.com/bclindner) * [brycied00d](https://github.com/brycied00d) @@ -395,10 +406,12 @@ and provided thanks to the work of the following contributors: * [colindean](https://github.com/colindean) * [DeeUnderscore](https://github.com/DeeUnderscore) * [dachinat](https://github.com/dachinat) -* [monsterpit-firedemon](https://github.com/monsterpit-firedemon) +* [Daggertooth](mailto:dev@monsterpit.net) * [watilde](https://github.com/watilde) +* [dalehenries](https://github.com/dalehenries) * [daprice](https://github.com/daprice) * [da2x](https://github.com/da2x) +* [danieljakots](https://github.com/danieljakots) * [codesections](https://github.com/codesections) * [dar5hak](https://github.com/dar5hak) * [kant](https://github.com/kant) @@ -423,6 +436,7 @@ and provided thanks to the work of the following contributors: * [espenronnevik](https://github.com/espenronnevik) * [Expenses](mailto:expenses@airmail.cc) * [fabianonline](https://github.com/fabianonline) +* [shello](https://github.com/shello) * [Finariel](https://github.com/Finariel) * [siuying](https://github.com/siuying) * [zoc](https://github.com/zoc) @@ -433,7 +447,7 @@ and provided thanks to the work of the following contributors: * [hattori6789](https://github.com/hattori6789) * [algernon](https://github.com/algernon) * [Fastbyte01](https://github.com/Fastbyte01) -* [myfreeweb](https://github.com/myfreeweb) +* [unrelentingtech](https://github.com/unrelentingtech) * [gfaivre](https://github.com/gfaivre) * [Fiaxhs](https://github.com/Fiaxhs) * [rasjonell](https://github.com/rasjonell) @@ -445,17 +459,20 @@ and provided thanks to the work of the following contributors: * [Habu-Kagumba](https://github.com/Habu-Kagumba) * [suzukaze](https://github.com/suzukaze) * [Hiromi-Kai](https://github.com/Hiromi-Kai) -* [hishamhm](https://github.com/hishamhm) -* [Slaynash](https://github.com/Slaynash) -* [musashino205](https://github.com/musashino205) -* [iwaim](https://github.com/iwaim) -* [valrus](https://github.com/valrus) -* [IMcD23](https://github.com/IMcD23) -* [yi0713](https://github.com/yi0713) -* [iblech](https://github.com/iblech) +* [Hisham Muhammad](mailto:hisham@gobolinux.org) +* [Hugo "Slaynash" Flores](mailto:hugoflores@hotmail.fr) +* [INAGAKI Hiroshi](mailto:musashino205@users.noreply.github.com) +* [IWAI, Masaharu](mailto:iwaim.sub@gmail.com) +* [Ian McCowan](mailto:imccowan@gmail.com) +* [Ian McDowell](mailto:me@ianmcdowell.net) +* [Iijima Yasushi](mailto:kurage.cc@gmail.com) +* [Ikko Ashimine](mailto:eltociear@gmail.com) +* [Ingo Blechschmidt](mailto:iblech@web.de) * [J Yeary](mailto:usbsnowcrash@users.noreply.github.com) -* [jack-michaud](https://github.com/jack-michaud) -* [Floppy](https://github.com/Floppy) +* [Jack Michaud](mailto:jack-michaud@users.noreply.github.com) +* [Jakub Mendyk](mailto:jakubmendyk.szkola@gmail.com) +* [James](mailto:james.allen.vaughan@gmail.com) +* [James Smith](mailto:james@floppy.org.uk) * [Jarek Lipski](mailto:pub@loomchild.net) * [Jennifer Glauche](mailto:=^.^=@github19.jglauche.de) * [Jennifer Kruse](mailto:jenkr55@gmail.com) @@ -464,6 +481,7 @@ and provided thanks to the work of the following contributors: * [Jessica K. Litwin](mailto:jessica@litw.in) * [Jo Decker](mailto:trolldecker@users.noreply.github.com) * [Joan Montané](mailto:jmontane@users.noreply.github.com) +* [Joe](mailto:401283+htmlbyjoe@users.noreply.github.com) * [Jonathan Klee](mailto:klee.jonathan@gmail.com) * [Jordan Guerder](mailto:jguerder@fr.pulseheberg.net) * [Joseph Mingrone](mailto:jehops@users.noreply.github.com) @@ -483,7 +501,6 @@ and provided thanks to the work of the following contributors: * [Krzysztof Jurewicz](mailto:krzysztof.jurewicz@gmail.com) * [Leo Wzukw](mailto:leowzukw@users.noreply.github.com) * [Leonie](mailto:62470640+bubblineyuri@users.noreply.github.com) -* [Levi Bard](mailto:taktaktaktaktaktaktaktaktaktak@gmail.com) * [Lex Alexander](mailto:l.alexander10@gmail.com) * [Lorenz Diener](mailto:lorenzd@gmail.com) * [Luc Didry](mailto:ldidry@users.noreply.github.com) @@ -560,6 +577,7 @@ and provided thanks to the work of the following contributors: * [ScienJus](mailto:i@scienjus.com) * [Scott Larkin](mailto:scott@codeclimate.com) * [Scott Sweeny](mailto:scott@ssweeny.net) +* [Sean](mailto:sean@sean.taipei) * [Sebastian Hübner](mailto:imolein@users.noreply.github.com) * [Sebastian Morr](mailto:sebastian@morr.cc) * [Sergei Č](mailto:noiwex1911@gmail.com) @@ -570,8 +588,10 @@ and provided thanks to the work of the following contributors: * [Shouko Yu](mailto:imshouko@gmail.com) * [Sina Mashek](mailto:sina@mashek.xyz) * [Soft. Dev](mailto:24978+nileshkumar@users.noreply.github.com) +* [Sophie Parker](mailto:dev@cortices.me) * [Soshi Kato](mailto:mail@sossii.com) * [Spanky](mailto:2788886+spankyworks@users.noreply.github.com) +* [Stanislas](mailto:stanislas.lange@pm.me) * [StefOfficiel](mailto:pichard.stephane@free.fr) * [Steven Tappert](mailto:admin@dark-it.net) * [Stéphane Guillou](mailto:stephane.guillou@member.fsf.org) @@ -630,9 +650,9 @@ and provided thanks to the work of the following contributors: * [evilny0](mailto:evilny0@moomoocamp.net) * [febrezo](mailto:felixbrezo@gmail.com) * [fsubal](mailto:fsubal@users.noreply.github.com) +* [fusagiko / takayamaki](mailto:24884114+takayamaki@users.noreply.github.com) * [fusshi-](mailto:dikky1218@users.noreply.github.com) * [gentaro](mailto:gentaroooo@gmail.com) -* [gol-cha](mailto:info@mevo.xyz) * [guigeekz](mailto:pattusg@gmail.com) * [hakoai](mailto:hk--76@qa2.so-net.ne.jp) * [haosbvnker](mailto:github@chaosbunker.com) @@ -645,7 +665,7 @@ and provided thanks to the work of the following contributors: * [jooops](mailto:joops@autistici.org) * [jukper](mailto:jukkaperanto@gmail.com) * [jumoru](mailto:jumoru@mailbox.org) -* [kaiyou](mailto:pierre@jaury.eu) +* [kaias1jp](mailto:kaias1jp@gmail.com) * [karlyeurl](mailto:karl.yeurl@gmail.com) * [kawaguchi](mailto:jiikko@users.noreply.github.com) * [kedama](mailto:32974885+kedamadq@users.noreply.github.com) @@ -699,110 +719,137 @@ and provided thanks to the work of the following contributors: * [西小倉宏信](mailto:nishiko@mindia.jp) * [雨宮美羽](mailto:k737566@gmail.com) -This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead. +This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/mastodon/mastodon/graphs/contributors) instead. ## Translators Following people have contributed to translation of Mastodon: -- ᏦᏁᎢᎵᏫ 😷 (KNTRO) (*Spanish, Argentina*) +- GunChleoc (*Scottish Gaelic*) +- ᛤᚤᛠᛥⴲ 👽 (KNTRO) (*Spanish, Argentina*) +- adrmzz (*Sardinian*) +- Hồ Nhất Duy (kantcer) (*Vietnamese*) +- Zoltán Gera (gerazo) (*Hungarian*) - Sveinn í Felli (sveinki) (*Icelandic*) - qezwan (*Persian, Sorani (Kurdish)*) -- Hồ Nhất Duy (kantcer) (*Vietnamese*) -- taicv (*Vietnamese*) -- Zoltán Gera (gerazo) (*Hungarian*) -- ButterflyOfFire (BoFFire) (*French, Arabic, Kabyle*) -- adrmzz (*Sardinian*) +- NCAA (*Danish*) - Ramdziana F Y (rafeyu) (*Indonesian*) -- Evert Prants (IcyDiamond) (*Estonian*) -- Daniele Lira Mereb (danilmereb) (*Portuguese, Brazilian*) +- taicv (*Vietnamese*) +- ButterflyOfFire (BoFFire) (*French, Arabic, Kabyle*) - Xosé M. (XoseM) (*Spanish, Galician*) -- Kristijan Tkalec (lapor) (*Slovenian*) -- stan ionut (stanionut12) (*Romanian*) +- Evert Prants (IcyDiamond) (*Estonian*) - Besnik_b (*Albanian*) - Emanuel Pina (emanuelpina) (*Portuguese*) -- Thai Localization (thl10n) (*Thai*) -- 奈卜拉 (nebula_moe) (*Chinese Simplified*) - Jeong Arm (Kjwon15) (*Japanese, Korean, Esperanto*) -- Michal Stanke (mstanke) (*Czech*) -- Alix Rossi (palindromordnilap) (*French, Corsican*) +- Alix Rossi (palindromordnilap) (*French, Esperanto, Corsican*) +- Thai Localization (thl10n) (*Thai*) +- Daniele Lira Mereb (danilmereb) (*Portuguese, Brazilian*) +- Joene (joenepraat) (*Dutch*) +- Kristijan Tkalec (lapor) (*Slovenian*) +- stan ionut (stanionut12) (*Romanian*) - spla (*Spanish, Catalan*) -- Imre Kristoffer Eilertsen (DandelionSprout) (*Norwegian*) -- Jeroen (jeroenpraat) (*Dutch*) -- borys_sh (*Ukrainian*) -- Miguel Mayol (mitcoes) (*Spanish, Catalan*) +- мачко (ma4ko) (*Bulgarian*) +- 奈卜拉 (nebula_moe) (*Chinese Simplified*) +- kamee (*Armenian*) +- AJ-عجائب البرمجة (Esmail_Hazem) (*Arabic*) +- Michal Stanke (mstanke) (*Czech*) - Danial Behzadi (danialbehzadi) (*Persian*) -- yeft (*Chinese Traditional, Chinese Traditional, Hong Kong*) +- borys_sh (*Ukrainian*) +- Asier Iturralde Sarasola (aldatsa) (*Basque*) +- Imre Kristoffer Eilertsen (DandelionSprout) (*Norwegian*) - koyu (*German*) +- yeft (*Chinese Traditional, Chinese Traditional, Hong Kong*) +- Miguel Mayol (mitcoes) (*Spanish, Catalan*) +- Sasha Sorokin (Brawaru) (*French, Catalan, Danish, German, Greek, Hungarian, Armenian, Korean, Russian, Albanian, Swedish, Ukrainian, Vietnamese, Galician*) +- Roboron (*Spanish*) - Koala Yeung (yookoala) (*Chinese Traditional, Hong Kong*) +- Ondřej Pokorný (unextro) (*Czech*) - Osoitz (*Basque*) - Peterandre (*Norwegian, Norwegian Nynorsk*) - tzium (*Sardinian*) +- Mélanie Chauvel (ariasuni) (*French, Arabic, Czech, German, Greek, Hungarian, Slovenian, Ukrainian, Chinese Simplified, Portuguese, Brazilian, Persian, Norwegian Nynorsk, Esperanto, Breton, Corsican, Sardinian, Kabyle*) - Iváns (Ivans_translator) (*Galician*) -- Sasha Sorokin (Sasha-Sorokin) (*French, Catalan, Danish, German, Greek, Hungarian, Armenian, Korean, Russian, Albanian, Swedish, Ukrainian, Vietnamese, Galician*) -- kamee (*Armenian*) +- Maya Minatsuki (mayaeh) (*Japanese*) +- Manuel Viens (manuelviens) (*French*) +- Alessandro Levati (Oct326) (*Italian*) +- lamnatos (*Greek*) +- Sean Young (assanges) (*Chinese Traditional*) - tolstoevsky (*Russian*) - enolp (*Asturian*) -- FédiQuébec (manuelviens) (*French*) -- lamnatos (*Greek*) -- Maya Minatsuki (mayaeh) (*Japanese*) +- Jasmine Cam Andrever (gourmas) (*Cornish*) +- gagik_ (*Armenian*) - Masoud Abkenar (mabkenar) (*Persian*) -- Alessandro Levati (Oct326) (*Italian*) - arshat (*Kazakh*) -- Roboron (*Spanish*) -- ariasuni (*French, Arabic, Czech, German, Greek, Hungarian, Slovenian, Ukrainian, Chinese Simplified, Portuguese, Brazilian, Persian, Norwegian Nynorsk, Esperanto, Breton, Corsican, Sardinian, Kabyle*) -- Ali Demirtaş (alidemirtas) (*Turkish*) -- Em St Cenydd (cancennau) (*Welsh*) +- Marcin Mikołajczak (mkljczkk) (*Czech, Polish, Russian*) - Marek Ľach (mareklach) (*Polish, Slovak*) +- Ali Demirtaş (alidemirtas) (*Turkish*) +- Blak Ouille (BlakOuille16) (*French*) +- Em St Cenydd (cancennau) (*Welsh*) +- Diluns (*Occitan*) - Muha Aliss (muhaaliss) (*Turkish*) - Jurica (ahjk) (*Croatian*) - Aditoo17 (*Czech*) -- Diluns (*Occitan*) -- gagik_ (*Armenian*) - vishnuvaratharajan (*Tamil*) -- Marcin Mikołajczak (mkljczkk) (*Czech, Polish, Russian*) +- pulmonarycosignerkindness (*Swedish*) +- cybergene (cyber-gene) (*Japanese*) +- Takeçi (polygoat) (*French, Italian*) +- xatier (*Chinese Traditional*) +- Ihor Hordiichuk (ihor_ck) (*Ukrainian*) - regulartranslator (*Portuguese, Brazilian*) +- ozzii (*French, Serbian (Cyrillic)*) +- Irfan (Irfan_Radz) (*Malay*) +- Saederup92 (*Danish*) - Akarshan Biswas (biswasab) (*Bengali, Sanskrit*) - Yi-Jyun Pan (pan93412) (*Chinese Traditional*) +- Rafael H L Moretti (Moretti) (*Portuguese, Brazilian*) - d5Ziif3K (*Ukrainian*) - GiorgioHerbie (*Italian*) -- Rafael H L Moretti (Moretti) (*Portuguese, Brazilian*) -- Saederup92 (*Danish*) - christalleras (*Norwegian Nynorsk*) -- cybergene (cyber-gene) (*Japanese*) - Taloran (*Norwegian Nynorsk*) - ThibG (*French, Icelandic*) -- xatier (*Chinese Traditional*) - otrapersona (*Spanish, Spanish, Mexico*) +- Store (HelaBasa) (*Sinhala*) +- Mauzi (*German, Swedish*) - atarashiako (*Chinese Simplified*) - 101010 (101010pl) (*Polish*) +- erictapen (*German*) +- Tagomago (tagomago) (*French, Spanish*) +- Jaz-Michael King (jazmichaelking) (*Welsh*) +- coxde (*Chinese Simplified*) +- T. E. Kalaycı (tekrei) (*Turkish*) - silkevicious (*Italian*) - Floxu (fredrikdim1) (*Norwegian Nynorsk*) +- Ryo (DrRyo) (*Korean*) - Bertil Hedkvist (Berrahed) (*Swedish*) - William(ѕ)ⁿ (wmlgr) (*Spanish*) - norayr (*Armenian*) +- Satnam S Virdi (pika10singh) (*Punjabi*) - Tiago Epifânio (tfve) (*Portuguese*) -- Ryo (DrRyo) (*Korean*) +- Balázs Meskó (mesko.balazs) (*Hungarian*) +- Sokratis Alichanidis (alichani) (*Greek*) - Mentor Gashi (mentorgashi.com) (*Albanian*) -- Jaz-Michael King (jazmichaelking) (*Welsh*) - carolinagiorno (*Portuguese, Brazilian*) +- Hayk Khachatryan (brutusromanus123) (*Armenian*) - Roby Thomas (roby.thomas) (*Malayalam*) - Bharat Kumar (Marwari) (*Hindi*) +- Austra Muizniece (aus_m) (*Latvian*) - ThonyVezbe (*Breton*) +- v4vachan (*Malayalam*) - dkdarshan760 (*Sanskrit*) -- Tagomago (tagomago) (*French, Spanish*) - tykayn (*French*) - axi (*Finnish*) -- Selyan Slimane AMIRI (slimane_AMIRI) (*Kabyle*) -- Balázs Meskó (mesko.balazs) (*Hungarian*) +- Selyan Slimane AMIRI (SelyanKab) (*Kabyle*) +- Timur Seber (seber) (*Tatar*) - taoxvx (*Danish*) - Hrach Mkrtchyan (mhrach87) (*Armenian*) - sabri (thetomatoisavegetable) (*Spanish, Spanish, Argentina*) - Dewi (Unkorneg) (*French, Breton*) -- Coelacanthus (*Chinese Simplified*) +- CoelacanthusHex (*Chinese Simplified*) - syncopams (*Chinese Simplified, Chinese Traditional, Chinese Traditional, Hong Kong*) +- Rhys Harrison (rhedders) (*Esperanto*) +- Hakim Oubouali (zenata1) (*Standard Moroccan Tamazight*) - SteinarK (*Norwegian Nynorsk*) -- Sokratis Alichanidis (alichani) (*Greek*) +- Lalo Tafolla (lalotafo) (*Spanish, Spanish, Mexico*) - Mathias B. Vagnes (vagnes) (*Norwegian*) - dashersyed (*Urdu (Pakistan)*) - Acolyte (666noob404) (*Ukrainian*) @@ -811,104 +858,124 @@ Following people have contributed to translation of Mastodon: - Damjan Dimitrioski (gnud) (*Macedonian*) - PPNplus (*Thai*) - shioko (*Chinese Simplified*) -- v4vachan (*Malayalam*) -- Hakim Oubouali (zenata1) (*Standard Moroccan Tamazight*) +- ZiriSut (*Kabyle*) - Evgeny Petrov (kondra007) (*Russian*) - Gwenn (Belvar) (*Breton*) - StanleyFrew (*French*) -- Hayk Khachatryan (brutusromanus123) (*Armenian*) +- Nikita Epifanov (Nikets) (*Russian*) - jaranta (*Finnish*) -- Felicia (midsommar) (*Swedish*) +- Slobodan Simić (Слободан Симић) (slsimic) (*Serbian (Cyrillic)*) +- Felicia Jongleur (midsommar) (*Swedish*) - Denys (dector) (*Ukrainian*) +- iVampireSP (*Chinese Simplified, Chinese Traditional*) - Pukima (pukimaaa) (*German*) +- 游荡 (MamaShip) (*Chinese Simplified*) - Vanege (*Esperanto*) +- Rikard Linde (rikardlinde) (*Swedish*) - Jess Rafn (therealyez) (*Danish*) - strubbl (*German*) - Stasiek Michalski (hellcp) (*Polish*) - dxwc (*Bengali*) - jmontane (*Catalan*) - Liboide (*Spanish*) +- Hexandcube (hexandcube) (*Polish*) +- Chris Kay (chriskarasoulis) (*Greek*) - Johan Schiff (schyffel) (*Swedish*) - Arunmozhi (tecoholic) (*Tamil*) +- zer0-x (ZER0-X) (*Arabic*) - kat (katktv) (*Russian, Ukrainian*) -- Rikard Linde (rikardlinde) (*Swedish*) +- Lauren Liberda (selfisekai) (*Polish*) +- mynameismonkey (*Welsh*) - oti4500 (*Hungarian, Ukrainian*) -- Laura (selfisekai) (*Polish*) -- Rachida S. (ZiriSut) (*Kabyle*) +- Mats Gunnar Ahlqvist (goqbi) (*Swedish*) - diazepan (*Spanish, Spanish, Argentina*) - marzuquccen (*Kabyle*) -- Juan José Salvador Piedra (JuanjoSalvador) (*Spanish*) +- VictorCorreia (victorcorreia1984) (*Afrikaans*) - Tigran (tigransimonyan) (*Armenian*) +- Juan José Salvador Piedra (JuanjoSalvador) (*Spanish*) - BurekzFinezt (*Serbian (Cyrillic)*) - SHeija (*Finnish*) +- Gearguy (*Finnish*) - atriix (*Swedish*) - Jack R (isaac.97_WT) (*Spanish*) - antonyho (*Chinese Traditional, Hong Kong*) +- asnomgtu (*Hungarian*) +- ahangarha (*Persian*) - andruhov (*Russian, Ukrainian*) -- Aryamik Sharma (Aryamik) (*Swedish, Hindi*) - phena109 (*Chinese Traditional, Hong Kong*) +- Aryamik Sharma (Aryamik) (*Swedish, Hindi*) +- Unmual (*Spanish*) - 森の子リスのミーコの大冒険 (Phroneris) (*Japanese*) - るいーね (ruine) (*Japanese*) -- ahangarha (*Persian*) - Sam Tux (imahbub) (*Bengali*) +- Kristoffer Grundström (Umeaboy) (*Swedish*) - igordrozniak (*Polish*) -- Unmual (*Spanish*) - Isaac Huang (caasih) (*Chinese Traditional*) - AW Unad (awcodify) (*Indonesian*) - Allen Zhong (AstroProfundis) (*Chinese Simplified*) - Cutls (cutls) (*Japanese*) -- Ray (Ipsumry) (*Spanish*) - Falling Snowdin (tghgg) (*Vietnamese*) -- coxde (*Chinese Simplified*) +- Ray (Ipsumry) (*Spanish*) +- Gianfranco Fronteddu (gianfro.gianfro) (*Sardinian*) - Rasmus Lindroth (RasmusLindroth) (*Swedish*) - Andrea Lo Iacono (niels0n) (*Italian*) +- Parodper (*Galician*) +- fucsia (*Italian*) +- NadieAishi (*Spanish, Spanish, Mexico*) - Kinshuk Sunil (kinshuksunil) (*Hindi*) - Ullas Joseph (ullasjoseph) (*Malayalam*) - Goudarz Jafari (Goudarz) (*Persian*) - Yu-Pai Liu (tedliou) (*Chinese Traditional*) - Amarin Cemthong (acitmaster) (*Thai*) +- Johannes Nilsson (nlssn) (*Swedish*) - juanda097 (juanda-097) (*Spanish*) - Anunnakey (*Macedonian*) -- fragola (*Italian*) +- erikkemp (*Dutch*) - erikstl (*Esperanto*) -- twpenguin (*Chinese Traditional*) - bobchao (*Chinese Traditional*) -- Esther (esthermations) (*Portuguese*) +- twpenguin (*Chinese Traditional*) - MadeInSteak (*Finnish*) -- Heimen Stoffels (vistausss) (*Dutch*) +- Esther (esthermations) (*Portuguese*) +- t_aus_m (*German*) +- Heimen Stoffels (Vistaus) (*Dutch*) - Rajarshi Guha (rajarshiguha) (*Bengali*) -- Andrew (iAndrew3) (*Romanian*) +- Mo_der Steven (SakuraPuare) (*Chinese Simplified*) - Gopal Sharma (gopalvirat) (*Hindi*) - arethsu (*Swedish*) -- Tofiq Abdula (Xwla) (*Sorani (Kurdish)*) - Carlos Solís (csolisr) (*Esperanto*) +- Tofiq Abdula (Xwla) (*Sorani (Kurdish)*) - Parthan S Ramanujam (parthan) (*Tamil*) - Kasper Nymand (KasperNymand) (*Danish*) +- Jeff Huang (s8321414) (*Chinese Traditional*) - TS (morte) (*Finnish*) - subram (*Turkish*) - SensDeViata (*Ukrainian*) - Ptrcmd (ptrcmd) (*Chinese Traditional*) - SergioFMiranda (*Portuguese, Brazilian*) -- Scvoet (scvoet) (*Chinese Simplified*) +- Percy (scvoet) (*Chinese Simplified*) +- Vivek K J (Vivekkj) (*Malayalam*) - hiroTS (*Chinese Traditional*) - johne32rus23 (*Russian*) - AzureNya (*Chinese Simplified*) - OctolinGamer (octolingamer) (*Portuguese, Brazilian*) - Ram varma (ram4varma) (*Tamil*) -- Hexandcube (hexandcube) (*Polish*) - 北䑓如法 (Nyoho) (*Japanese*) +- Pukima (Pukimaa) (*German*) +- diorama (*Italian*) +- Daniel Dimitrov (daniel.dimitrov) (*Bulgarian*) - frumble (*German*) - kekkepikkuni (*Tamil*) -- Neo_Chen (NeoChen1024) (*Chinese Traditional*) - oorsutri (*Tamil*) -- Rhys Harrison (rhedders) (*Esperanto*) +- Neo_Chen (NeoChen1024) (*Chinese Traditional*) - Nithin V (Nithin896) (*Tamil*) +- Marcus Myge (mygg-priv) (*Norwegian*) - Miro Rauhala (mirorauhala) (*Finnish*) -- diorama (*Italian*) - AlexKoala (alexkoala) (*Korean*) +- ಚಿರಾಗ್ ನಟರಾಜ್ (chiraag-nataraj) (*Kannada*) - Aswin C (officialcjunior) (*Malayalam*) - Guillaume Turchini (orion78fr) (*French*) - Ganesh D (auntgd) (*Marathi*) +- mawoka-myblock (mawoka) (*German*) - dragnucs2 (*Arabic*) - Ryan Ho (koungho) (*Chinese Traditional*) - Pedro Henrique (exploronauta) (*Portuguese, Brazilian*) @@ -916,203 +983,245 @@ Following people have contributed to translation of Mastodon: - Vasanthan (vasanthan) (*Tamil*) - 硫酸鶏 (acid_chicken) (*Japanese*) - clarmin b8 (clarminb8) (*Sorani (Kurdish)*) +- programizer (*German*) - manukp (*Malayalam*) -- psymyn (*Hebrew*) - earth dweller (sanethoughtyt) (*Marathi*) +- psymyn (*Hebrew*) - meijerivoi (toilet) (*Finnish*) - essaar (*Tamil*) - serubeena (*Swedish*) -- Karol Kosek (krkkPL) (*Polish*) - Rintan (*Japanese*) -- valarivan (*Tamil*) +- Karol Kosek (krkkPL) (*Polish*) +- Khó͘ Tiat-lêng (khotiatleng) (*Chinese Traditional, Taigi*) - Hernik (hernik27) (*Czech*) -- Sebastián Andil (Selrond) (*Slovak*) +- valarivan (*Tamil*) +- kuchengrab (*German*) +- friedbeans (*Croatian*) +- Abi Turi (abi123) (*Georgian*) - Hinaloe (hinaloe) (*Japanese*) -- filippodb (*Italian*) +- Sebastián Andil (Selrond) (*Slovak*) - KEINOS (*Japanese*) +- filippodb (*Italian*) +- Asbjørn Olling (a2) (*Danish*) - Balázs Meskó (meskobalazs) (*Hungarian*) - Bottle (suryasalem2010) (*Tamil*) -- JzshAC (*Chinese Simplified*) - Wrya ali (John12) (*Sorani (Kurdish)*) -- Khóo (khootiatling) (*Chinese Traditional*) -- Steven Tappert (sammy8806) (*German*) +- JzshAC (*Chinese Simplified*) - Antillion (antillion99) (*Spanish*) -- Pukima (Pukimaa) (*German*) +- Steven Tappert (sammy8806) (*German*) - Reg3xp (*Persian*) -- hiphipvargas (*Portuguese*) +- Wassim EL BOUHAMIDI (elbouhamidiw) (*Arabic*) - gowthamanb (*Tamil*) +- hiphipvargas (*Portuguese*) - Ch. (sftblw) (*Korean*) -- Jeff Huang (s8321414) (*Chinese Traditional*) - Arttu Ylhävuori (arttu.ylhavuori) (*Finnish*) - tctovsli (*Norwegian Nynorsk*) - Timo Tijhof (Krinkle) (*Dutch*) +- Mikkel B. Goldschmidt (mikkelbjoern) (*Danish*) +- mecqor labi (mecqorlabi) (*Persian*) +- Odyssey346 (alexader612) (*Norwegian*) - Yamagishi Kazutoshi (ykzts) (*Japanese, Icelandic, Sorani (Kurdish)*) +- Eban (ebanDev) (*French, Esperanto*) - vjasiegd (*Polish*) - SamitiMed (samiti3d) (*Thai*) +- Nícolas Lavinicki (nclavinicki) (*Portuguese, Brazilian*) +- snatcher (*Portuguese, Brazilian*) - Rekan Adl (rekan-adl1) (*Sorani (Kurdish)*) +- VSx86 (*Russian*) - umelard (*Hebrew*) - Antara2Cinta (Se7enTime) (*Indonesian*) -- VSx86 (*Russian*) -- Daniel Dimitrov (danny-dimitrov) (*Bulgarian*) - parnikkapore (*Thai*) -- mynameismonkey (*Welsh*) - Sherwan Othman (sherwanothman11) (*Sorani (Kurdish)*) - Yassine Aït-El-Mouden (yaitelmouden) (*Standard Moroccan Tamazight*) - SKELET (*Danish*) -- Mo_der Steven (SakuraPuare) (*Chinese Simplified*) - Fei Yang (Fei1Yang) (*Chinese Traditional*) -- ALEM FARID (faridatcemlulaqbayli) (*Kabyle*) -- enipra (*Armenian*) -- musix (*Persian*) +- Ğani (freegnu) (*Tatar*) - Renato "Lond" Cerqueira (renatolond) (*Portuguese, Brazilian*) +- enipra (*Armenian*) +- ALEM FARID (faridatcemlulaqbayli) (*Kabyle*) +- musix (*Persian*) - ギャラ (gyara) (*Japanese, Chinese Simplified*) - Hougo (hougo) (*French*) - ybardapurkar (*Marathi*) +- 亜緯丹穂 (ayiniho) (*Japanese*) - Adrián Lattes (haztecaso) (*Spanish*) +- Mordi Sacks (MordiSacks) (*Hebrew*) +- Trinsec (*Dutch*) +- Tigran's Tips (tigrank08) (*Armenian*) - TracyJacks (*Chinese Simplified*) +- Szabolcs Gál (galszabolcs810624) (*Hungarian*) +- Vladislav Săcrieriu (vladislavs14) (*Romanian*) +- danreznik (*Hebrew*) - rasheedgm (*Kannada*) -- GatoOscuro (*Spanish*) -- mecqor labi (mecqorlabi) (*Persian*) -- Belkacem Mohammed (belkacem77) (*Kabyle*) -- Navjot Singh (nspeaks) (*Hindi*) - omquylzu (*Latvian*) +- c6ristian (*German*) +- Belkacem Mohammed (belkacem77) (*Kabyle*) +- lexxai (*Ukrainian*) +- Navjot Singh (nspeaks) (*Hindi*) - Ozai (*German*) - Sahak Petrosyan (petrosyan) (*Armenian*) -- siamano (*Thai, Esperanto*) +- Oymate (*Bengali*) - Viorel-Cătălin Răpițeanu (rapiteanu) (*Romanian*) +- siamano (*Thai, Esperanto*) - Siddhartha Sarathi Basu (quinoa_biryani) (*Bengali*) - Pachara Chantawong (pachara2202) (*Thai*) -- mkljczk (*Polish*) -- Skew (noan.perrot) (*French*) - Zijian Zhao (jobs2512821228) (*Chinese Simplified*) -- turtle836 (*German*) +- Skew (noan.perrot) (*French*) +- mkljczk (*Polish*) - Guru Prasath Anandapadmanaban (guruprasath) (*Tamil*) -- Lamin (laminne) (*Japanese*) +- turtle836 (*German*) - Marcepanek_ (thekingmarcepan) (*Polish*) -- Feruz Oripov (FeruzOripov) (*Russian*) +- Lamin (laminne) (*Japanese*) - Yann Aguettaz (yann-a) (*French*) +- Feruz Oripov (FeruzOripov) (*Russian*) +- serapolis (*Chinese Simplified, Chinese Traditional*) - Mick Onio (xgc.redes) (*Asturian*) -- Tianqi Zhang (tina.zhang040609) (*Chinese Simplified*) - Malik Mann (dermalikmann) (*German*) - dadosch (*German*) - r3dsp1 (*Chinese Traditional, Hong Kong*) -- padulafacundo (*Spanish*) - hg6 (*Hindi*) +- Tianqi Zhang (tina.zhang040609) (*Chinese Simplified*) +- padulafacundo (*Spanish*) +- johannes hove-henriksen (J0hsHH) (*Norwegian*) - Orlando Murcio (Atos20) (*Spanish, Mexico*) +- Padraic Calpin (padraic-padraic) (*Slovenian*) +- cenegd (*Chinese Simplified*) - piupiupiudiu (*Chinese Simplified*) - shdy (*German*) -- Padraic Calpin (padraic-padraic) (*Slovenian*) - Ильзира Рахматуллина (rahmatullinailzira53) (*Tatar*) -- cenegd (*Chinese Simplified*) - Hugh Liu (youloveonlymeh) (*Chinese Simplified*) - Pixelcode (realpixelcode) (*German*) - Yogesh K S (yogi) (*Kannada*) +- Adithya K (adithyak04) (*Malayalam*) +- Dennis Reimund (reimunddennis7) (*German*) - Rakino (rakino) (*Chinese Simplified*) -- Miquel Sabaté Solà (mssola) (*Catalan*) +- Michał Sidor (michcioperz) (*Polish*) - AmazighNM (*Kabyle*) +- Miquel Sabaté Solà (mssola) (*Catalan*) - Jothipazhani Nagarajan (jothipazhani.n) (*Tamil*) -- Clash Clans (KURD12345) (*Sorani (Kurdish)*) - hallomaurits (*Dutch*) - alnd hezh (alndhezh) (*Sorani (Kurdish)*) +- Clash Clans (KURD12345) (*Sorani (Kurdish)*) - Solid Rhino (SolidRhino) (*Dutch*) -- k_taka (peaceroad) (*Japanese*) -- Hallo Abdullah (hallo_hamza12) (*Sorani (Kurdish)*) -- hussama (*Portuguese, Brazilian*) -- Sébastien Feugère (smonff) (*French*) +- Metehan Özyürek (MetehanOzyurek) (*Turkish*) - 林水溶 (shuiRong) (*Chinese Simplified*) -- eichkat3r (*German*) -- OminousCry (*Russian*) -- SnDer (*Dutch*) +- Sébastien Feugère (smonff) (*French*) +- Y.Yamashiro (uist1idrju3i) (*Japanese*) +- Takeshi Umeda (noellabo) (*Japanese*) +- k_taka (peaceroad) (*Japanese*) +- hussama (*Portuguese, Brazilian*) +- Hallo Abdullah (hallo_hamza12) (*Sorani (Kurdish)*) +- Ashok314 (ashok314) (*Hindi*) - PifyZ (*French*) +- OminousCry (*Russian*) +- Robert Yano (throwcalmbobaway) (*Spanish, Mexico*) - Tom_ (*Czech*) - Tagada (Tagadda) (*French*) - shafouz (*Portuguese, Brazilian*) +- Yasin İsa YILDIRIM (redsfyre) (*Turkish*) +- eichkat3r (*German*) +- SnDer (*Dutch*) - Kahina Mess (K_hina) (*Kabyle*) -- Nathaël Noguès (NatNgs) (*French*) -- Kk (kishorkumara3) (*Kannada*) - Swati Sani (swatisani) (*Urdu (Pakistan)*) -- Shrinivasan T (tshrinivasan) (*Tamil*) -- さっかりんにーさん (saccharin23) (*Japanese*) -- 夜楓Yoka (Yoka2627) (*Chinese Simplified*) +- Kk (kishorkumara3) (*Kannada*) - Daniel M. (daniconil) (*Catalan*) +- Shrinivasan T (tshrinivasan) (*Tamil*) +- 夜楓Yoka (Yoka2627) (*Chinese Simplified*) +- Nathaël Noguès (NatNgs) (*French*) +- さっかりんにーさん (saccharin23) (*Japanese*) +- Rex_sa (rex07) (*Arabic*) +- Robin van der Vliet (RobinvanderVliet) (*Esperanto*) - Vikatakavi (*Kannada*) -- SusVersiva (*Catalan*) - Tradjincal (tradjincal) (*French*) - pullopen (*Chinese Simplified*) -- Robin van der Vliet (RobinvanderVliet) (*Esperanto*) +- SusVersiva (*Catalan*) +- Marvin (magicmarvman) (*German*) - Zinkokooo (*Basque*) -- mmokhi (*Persian*) - Livingston Samuel (livingston) (*Tamil*) -- prabhjot (*Hindi*) -- sergioaraujo1 (*Portuguese, Brazilian*) - CyberAmoeba (pseudoobscura) (*Chinese Simplified*) - tsundoker (*Malayalam*) +- eorn (*Breton*) +- prabhjot (*Hindi*) +- mmokhi (*Persian*) +- sergioaraujo1 (*Portuguese, Brazilian*) +- Entelekheia-ousia (*Chinese Simplified*) +- Pierre Morvan (Iriep) (*Breton*) +- oscfd (*Spanish*) - skaaarrr (*German*) -- Ricardo Colin (rysard) (*Spanish*) - mkljczk (mykylyjczyk) (*Polish*) -- Philipp Fischbeck (PFischbeck) (*German*) - fedot (*Russian*) - Paz Galindo (paz.almendra.g) (*Spanish*) -- GaggiX (*Italian*) -- ralozkolya (*Georgian*) +- Ricardo Colin (rysard) (*Spanish*) +- Philipp Fischbeck (PFischbeck) (*German*) - Zoé Bőle (zoe1337) (*German*) +- EzigboOmenana (*Cornish*) +- GaggiX (*Italian*) - Lukas Fülling (lfuelling) (*German*) - JackXu (Merman-Jack) (*Chinese Simplified*) -- Aymeric (AymBroussier) (*French*) +- ralozkolya (*Georgian*) +- Apple (blackteaovo) (*Chinese Simplified*) +- asala4544 (*Basque*) +- Xurxo Guerra (xguerrap) (*Galician*) +- qwerty287 (*German*) - Anoop (anoopp) (*Malayalam*) - pezcurrel (*Italian*) +- Samir Tighzert (samir_t7) (*Kabyle*) - Dremski (*Bulgarian*) -- Xurxo Guerra (xguerrap) (*Galician*) +- Dennis Reimund (reimund_dennis) (*German*) +- ru_mactunnag (*Scottish Gaelic*) +- Nocta (*French*) +- Aymeric (AymBroussier) (*French*) - mashirozx (*Chinese Simplified*) - Albatroz Jeremias (albjeremias) (*Portuguese*) -- Samir Tighzert (samir_t7) (*Kabyle*) -- Apple (blackteaovo) (*Chinese Simplified*) -- Nocta (*French*) -- OpenAlgeria (*Arabic*) -- tamaina (*Japanese*) -- abidin toumi (Zet24) (*Arabic*) -- xpac1985 (xpac) (*German*) -- Kaede (kaedech) (*Japanese*) -- ÀŘǾŚ PÀŚĦÀÍ (arospashai) (*Sorani (Kurdish)*) - Matias Lavik (matiaslavik) (*Norwegian Nynorsk*) -- smedvedev (*Russian*) -- mikel (mikelalas) (*Spanish*) -- Doug (douglasalvespe) (*Portuguese, Brazilian*) -- Trond Boksasp (boksasp) (*Norwegian*) -- Fleva (*Sardinian*) -- Mohammad Adnan Mahmood (adnanmig) (*Arabic*) -- Sais Lakshmanan (Saislakshmanan) (*Tamil*) - Amith Raj Shetty (amithraj1989) (*Kannada*) +- abidin toumi (Zet24) (*Arabic*) +- mikel (mikelalas) (*Spanish*) +- OpenAlgeria (*Arabic*) - random_person (*Spanish*) -- djoerd (*Dutch*) -- Baban Abdulrahman (baban.abdulrehman) (*Sorani (Kurdish)*) -- ebrezhoneg (*Breton*) -- dashty (*Sorani (Kurdish)*) -- Salh_haji6 (*Sorani (Kurdish)*) -- Amir Kurdo (kuraking202) (*Sorani (Kurdish)*) -- おさ (osapon) (*Japanese*) -- Ranj A Abdulqadir (RanjAhmed) (*Sorani (Kurdish)*) -- umonaca (*Chinese Simplified*) -- Bartek Fijałkowski (brateq) (*Polish*) -- tateisu (*Japanese*) -- centumix (*Japanese*) -- Jari Ronkainen (ronchaine) (*Finnish*) -- Savarín Electrográfico Marmota Intergalactica (herrero.maty) (*Spanish*) -- Torsten Högel (torstenhoegel) (*German*) +- Sais Lakshmanan (Saislakshmanan) (*Tamil*) +- Trond Boksasp (boksasp) (*Norwegian*) +- xpac1985 (xpac) (*German*) +- Zlr- (cZeler) (*French*) +- Mohammad Adnan Mahmood (adnanmig) (*Arabic*) +- mimikun (*Japanese*) +- smedvedev (*Russian*) +- asretro (*Chinese Traditional, Hong Kong*) +- tamaina (*Japanese*) +- Aman Alam (aalam) (*Punjabi*) +- ÀŘǾŚ PÀŚĦÀÍ (arospashai) (*Sorani (Kurdish)*) +- Kaede (kaedech) (*Japanese*) +- Doug (douglasalvespe) (*Portuguese, Brazilian*) +- Fleva (*Sardinian*) - Abijeet Patro (Abijeet) (*Basque*) -- Ács Zoltán (acszoltan111) (*Hungarian*) -- Benjamin Cobb (benjamincobb) (*German*) -- waweic (*German*) -- Aries (orlea) (*Japanese*) -- silverscat_3 (SilversCat) (*Japanese*) -- kavitha129 (*Tamil*) -- dcapillae (*Spanish*) - SamOak (*Portuguese, Brazilian*) -- capiscuas (*Spanish*) +- Aries (orlea) (*Japanese*) +- Bartek Fijałkowski (brateq) (*Polish*) - NeverMine17 (*Russian*) -- Nithya Mary (nithyamary25) (*Tamil*) -- t_aus_m (*German*) +- Brodi (brodi1) (*Dutch*) +- Ács Zoltán (zoli111) (*Hungarian*) +- capiscuas (*Spanish*) +- Benjamin Cobb (benjamincobb) (*German*) +- djoerd (*Dutch*) +- waweic (*German*) +- Amir Kurdo (kuraking202) (*Sorani (Kurdish)*) - dobrado (*Portuguese, Brazilian*) +- Baban Abdulrahman (baban.abdulrehman) (*Sorani (Kurdish)*) +- dcapillae (*Spanish*) +- Azad ahmad (dashty) (*Sorani (Kurdish)*) +- Salh_haji6 (*Sorani (Kurdish)*) +- Ranj A Abdulqadir (RanjAhmed) (*Sorani (Kurdish)*) +- tateisu (*Japanese*) +- Savarín Electrográfico Marmota Intergalactica (herrero.maty) (*Spanish*) +- ebrezhoneg (*Breton*) +- 于晚霞 (xissshawww) (*Chinese Simplified*) +- silverscat_3 (SilversCat) (*Japanese*) +- centumix (*Japanese*) +- umonaca (*Chinese Simplified*) +- Ni Futchi (futchitwo) (*Japanese*) +- おさ (osapon) (*Japanese*) +- kavitha129 (*Tamil*) - Hannah (Aniqueper1) (*Chinese Simplified*) - Jiniux (*Italian*) -- 于晚霞 (xissshawww) (*Chinese Simplified*) +- Jari Ronkainen (ronchaine) (*Finnish*) +- Nithya Mary (nithyamary25) (*Tamil*) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d749c255c..c0c6c5315d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,264 +3,476 @@ Changelog All notable changes to this project will be documented in this file. +## [3.4.3] - 2021-11-06 +### Fixed + +- Fix login being broken due to inaccurately applied backport fix in 3.4.2 ([Gargron](https://github.com/mastodon/mastodon/commit/5c47a18c8df3231aa25c6d1f140a71a7fac9cbf9)) + +## [3.4.2] - 2021-11-06 +### Added + +- Add `configuration` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/mastodon/mastodon/pull/16485)) + +### Fixed + +- Fix handling of back button with modal windows in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16499)) +- Fix pop-in player when author has long username in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16468)) +- Fix crash when a status with a playing video gets deleted in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16384)) +- Fix crash with Microsoft Translate in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16525)) +- Fix PWA not being usable from alternate domains ([HolgerHuo](https://github.com/mastodon/mastodon/pull/16714)) +- Fix locale-specific number rounding errors ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16469)) +- Fix scheduling a status decreasing status count ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16791)) +- Fix user's canonical email address being blocked when user deletes own account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16503)) +- Fix not being able to suspend users that already have their canonical e-mail blocked ([Gargron](https://github.com/mastodon/mastodon/pull/16455)) +- Fix anonymous access to outbox not being cached by the reverse proxy ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16458)) +- Fix followers synchronization mechanism not working when URI has empty path ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16744)) +- Fix serialization of counts in REST API when user hides their network ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16418)) +- Fix inefficiencies in auto-linking code ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16506)) +- Fix `tootctl self-destruct` not sending delete activities for recently-suspended accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16688)) +- Fix suspicious sign-in e-mail text being out of date ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16690)) +- Fix some frameworks being unnecessarily loaded ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16725)) +- Fix canonical e-mail blocks missing foreign key constraints ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16448)) +- Fix inconsistent order on account's statuses page in admin UI ([tribela](https://github.com/mastodon/mastodon/pull/16937)) +- Fix media from blocked domains being redownloaded by `tootctl media refresh` ([tribela](https://github.com/mastodon/mastodon/pull/16914)) +- Fix `mastodon:setup` generated env-file syntax ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16896)) +- Fix link previews being incorrectly generated from earlier links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16885)) +- Fix wrong `to`/`cc` values for remote groups in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16700)) +- Fix mentions with non-ascii TLDs not being processed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16689)) +- Fix authentication failures halfway through a sign-in attempt ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16607), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16792)) +- Fix suspended accounts statuses being merged back into timelines ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16628)) +- Fix crash when encountering invalid account fields ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16598)) +- Fix invalid blurhash handling for remote activities ([noellabo](https://github.com/mastodon/mastodon/pull/16583)) +- Fix newlines being added to accout notes when an account moves ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16415), [noellabo](https://github.com/mastodon/mastodon/pull/16576)) +- Fix crash when creating an announcement with links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16941)) +- Fix logging out from one browser logging out all other sessions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16943)) + +### Security + +- Fix user notes not having a length limit ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16942)) +- Fix revoking a specific session not working ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16943)) + +## [3.4.1] - 2021-06-03 +### Added + +- Add new emoji assets from Twemoji 13.1.0 ([Gargron](https://github.com/mastodon/mastodon/pull/16345)) + +### Fixed + +- Fix some ActivityPub identifiers in server actor outbox ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16343)) +- Fix custom CSS path setting cookies and being uncacheable due to it ([tribela](https://github.com/mastodon/mastodon/pull/16314)) +- Fix unread notification count when polling in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16272)) +- Fix health check not being accessible through localhost ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16270)) +- Fix some redis locks auto-releasing too fast ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16276), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16291)) +- Fix e-mail confirmations API not working correctly ([Gargron](https://github.com/mastodon/mastodon/pull/16348)) +- Fix migration script not being able to run if it fails midway ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16312)) +- Fix account deletion sometimes failing because of optimistic locks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16317)) +- Fix deprecated slash as division in SASS files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16347)) +- Fix `tootctl search deploy` compatibility error on Ruby 3 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16346)) +- Fix mailer jobs for deleted notifications erroring out ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16294)) + +## [3.4.0] - 2021-05-16 +### Added + +- **Add follow recommendations for onboarding** ([Gargron](https://github.com/mastodon/mastodon/pull/15945), [Gargron](https://github.com/mastodon/mastodon/pull/16161), [Gargron](https://github.com/mastodon/mastodon/pull/16060), [Gargron](https://github.com/mastodon/mastodon/pull/16077), [Gargron](https://github.com/mastodon/mastodon/pull/16078), [Gargron](https://github.com/mastodon/mastodon/pull/16160), [Gargron](https://github.com/mastodon/mastodon/pull/16079), [noellabo](https://github.com/mastodon/mastodon/pull/16044), [noellabo](https://github.com/mastodon/mastodon/pull/16045), [Gargron](https://github.com/mastodon/mastodon/pull/16152), [Gargron](https://github.com/mastodon/mastodon/pull/16153), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16082), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16173), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16159), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16189)) + - Tutorial on first web UI launch has been replaced with follow suggestions + - Follow suggestions take user locale into account and are a mix of accounts most followed by currently active local users, and accounts that wrote the most shared/favourited posts in the last 30 days + - Only accounts that have opted-in to being discoverable from their profile settings, and that do not require follow requests, will be suggested + - Moderators can review suggestions for every supported locale and suppress specific suggestions from appearing and admins can ensure certain accounts always show up in suggestions from the settings area + - New users no longer automatically follow admins +- **Add server rules** ([Gargron](https://github.com/mastodon/mastodon/pull/15769), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15778)) + - Admins can create and edit itemized server rules + - They are available through the REST API and on the about page +- **Add canonical e-mail blocks for suspended accounts** ([Gargron](https://github.com/mastodon/mastodon/pull/16049)) + - Normally, people can make multiple accounts using the same e-mail address using the `+` trick or by inserting or removing `.` characters from the first part of their address + - Once an account is suspended, it will no longer be possible for the e-mail address used by that account to be used for new sign-ups in any of its forms +- Add management of delivery availability in admin UI ([noellabo](https://github.com/mastodon/mastodon/pull/15771)) +- **Add system checks to dashboard in admin UI** ([Gargron](https://github.com/mastodon/mastodon/pull/15989), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15954), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16002)) + - The dashboard will now warn you if you some Sidekiq queues are not being processed, if you have not defined any server rules, or if you forgot to run database migrations from the latest Mastodon upgrade +- Add inline description of moderation actions in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15792)) +- Add "recommended" label to activity/peers API toggles in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/16081)) +- Add joined date to profiles in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/16169), [rinsuki](https://github.com/mastodon/mastodon/pull/16186)) +- Add transition to media modal background in web UI ([mkljczk](https://github.com/mastodon/mastodon/pull/15843)) +- Add option to opt-out of unread notification markers in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15842)) +- Add borders to 📱, 🚲, and 📲 emojis in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15794), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16035)) +- Add dropdown for boost privacy in boost confirmation modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15704)) +- Add support for Ruby 3.0 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16046), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16174)) +- Add `Message-ID` header to outgoing emails ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16076)) + - Some e-mail spam filters penalize e-mails that have a `Message-ID` header that uses a different domain name than the sending e-mail address. Now, the same domain will be used +- Add `af`, `gd` and `si` locales ([Gargron](https://github.com/mastodon/mastodon/pull/16090)) +- Add guard against DNS rebinding attacks ([noellabo](https://github.com/mastodon/mastodon/pull/16087), [noellabo](https://github.com/mastodon/mastodon/pull/16095)) +- Add HTTP header to explicitly opt-out of FLoC by default ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16036)) +- Add missing push notification title for polls and statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15929), [mkljczk](https://github.com/mastodon/mastodon/pull/15564), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15931)) +- Add `POST /api/v1/emails/confirmations` to REST API ([Gargron](https://github.com/mastodon/mastodon/pull/15816), [Gargron](https://github.com/mastodon/mastodon/pull/15949)) + - This method allows an app through which a user signed-up to request a new confirmation e-mail to be sent, or to change the e-mail of the account before it is confirmed +- Add `GET /api/v1/accounts/lookup` to REST API ([Gargron](https://github.com/mastodon/mastodon/pull/15740), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15750)) + - This method allows to quickly convert a username of a known account to an ID that can be used with the REST API, or to check if a username is available + for sign-up +- Add `policy` param to `POST /api/v1/push/subscriptions` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/16040)) + - This param allows an app to control from whom notifications should be delivered as push notifications to the app +- Add `details` to error response for `POST /api/v1/accounts` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/15803)) + - This attribute allows an app to display more helpful information to the user about why the sign-up did not succeed +- Add `SIDEKIQ_REDIS_URL` and related environment variables to optionally use a separate Redis server for Sidekiq ([noellabo](https://github.com/mastodon/mastodon/pull/16188)) + +### Changed + +- Change trending hashtags to be affected be reblogs ([Gargron](https://github.com/mastodon/mastodon/pull/16164)) + - Previously, only original posts contributed to a hashtag's trending score + - Now, reblogs of posts will also contribute to that hashtag's trending score +- Change e-mail confirmation link to always redirect to web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16151)) +- Change log level of worker lifecycle to WARN in streaming API ([Gargron](https://github.com/mastodon/mastodon/pull/16110)) + - Since running with INFO log level in production is not always desirable, it is easy to miss when a worker is shutdown and a new one is started +- Change the nouns "toot" and "status" to "post" in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/16080), [Gargron](https://github.com/mastodon/mastodon/pull/16089)) + - To be clear, the button still says "Toot!" +- Change order of dropdown menu on posts to be more intuitive in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/15647)) +- Change description of keyboard shortcuts in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/16129)) +- Change option labels on edit profile page ([Gargron](https://github.com/mastodon/mastodon/pull/16041)) + - "Lock account" is now "Require follow requests" + - "List this account on the directory" is now "Suggest account to others" + - "Hide your network" is now "Hide your social graph" +- Change newly generated account IDs to not be enumerable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15844)) +- Change Web Push API deliveries to use request pooling ([Gargron](https://github.com/mastodon/mastodon/pull/16014)) +- Change multiple mentions with same username to render with domain ([Gargron](https://github.com/mastodon/mastodon/pull/15718), [noellabo](https://github.com/mastodon/mastodon/pull/16038)) + - When a post contains mentions of two or more users who have the same username, but on different domains, render their names with domain to help disambiguate them + - Always render the domain of usernames used in profile metadata +- Change health check endpoint to reveal less information ([Gargron](https://github.com/mastodon/mastodon/pull/15988)) +- Change account counters to use upsert (requires Postgres >= 9.5) ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15913)) +- Change `mastodon:setup` to not call `assets:precompile` in Docker ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13942)) +- **Change max. image dimensions to 1920x1080px (1080p)** ([Gargron](https://github.com/mastodon/mastodon/pull/15690)) + - Previously, this was 1280x1280px + - This is the amount of pixels that original images get downsized to +- Change custom emoji to be animated when hovering container in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15637)) +- Change streaming API from deprecated ClusterWS/cws to ws ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15932)) +- Change systemd configuration to add sandboxing features ([Izorkin](https://github.com/mastodon/mastodon/pull/15937), [Izorkin](https://github.com/mastodon/mastodon/pull/16103), [Izorkin](https://github.com/mastodon/mastodon/pull/16127)) +- Change nginx configuration to make running Onion service easier ([cohosh](https://github.com/mastodon/mastodon/pull/15498)) +- Change Helm configuration ([dunn](https://github.com/mastodon/mastodon/pull/15722), [dunn](https://github.com/mastodon/mastodon/pull/15728), [dunn](https://github.com/mastodon/mastodon/pull/15748), [dunn](https://github.com/mastodon/mastodon/pull/15749), [dunn](https://github.com/mastodon/mastodon/pull/15767)) +- Change Docker configuration ([SuperSandro2000](https://github.com/mastodon/mastodon/pull/10823), [mashirozx](https://github.com/mastodon/mastodon/pull/15978)) + +### Removed + +- Remove PubSubHubbub-related columns from accounts table ([Gargron](https://github.com/mastodon/mastodon/pull/16170), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15857)) +- Remove dependency on @babel/plugin-proposal-class-properties ([ykzts](https://github.com/mastodon/mastodon/pull/16155)) +- Remove dependency on pluck_each gem ([Gargron](https://github.com/mastodon/mastodon/pull/16012)) +- Remove spam check and dependency on nilsimsa gem ([Gargron](https://github.com/mastodon/mastodon/pull/16011)) +- Remove MySQL-specific code from Mastodon::MigrationHelpers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15924)) +- Remove IE11 from supported browsers target ([gol-cha](https://github.com/mastodon/mastodon/pull/15779)) + +### Fixed + +- Fix "You might be interested in" flashing while searching in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/16162)) +- Fix display of posts without text content in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15665)) +- Fix Google Translate breaking web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15610), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15611)) +- Fix web UI crashing when SVG support is disabled ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15809)) +- Fix web UI crash when a status opened in the media modal is deleted ([kaias1jp](https://github.com/mastodon/mastodon/pull/15701)) +- Fix OCR language data failing to load in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15519)) +- Fix footer links not being clickable in Safari in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/15496)) +- Fix autofocus/autoselection not working on mobile in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15555), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15985)) +- Fix media redownload worker retrying on unexpected response codes ([Gargron](https://github.com/mastodon/mastodon/pull/16111)) +- Fix thread resolve worker retrying when status no longer exists ([Gargron](https://github.com/mastodon/mastodon/pull/16109)) +- Fix n+1 queries when rendering statuses in REST API ([abcang](https://github.com/mastodon/mastodon/pull/15641)) +- Fix n+1 queries when rendering notifications in REST API ([abcang](https://github.com/mastodon/mastodon/pull/15640)) +- Fix delete of local reply to local parent not being forwarded ([Gargron](https://github.com/mastodon/mastodon/pull/16096)) +- Fix remote reporters not receiving suspend/unsuspend activities ([Gargron](https://github.com/mastodon/mastodon/pull/16050)) +- Fix understanding (not fully qualified) `as:Public` and `Public` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15948)) +- Fix actor update not being distributed on profile picture deletion ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15461)) +- Fix processing of incoming Delete activities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16084)) +- Fix processing of incoming Block activities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15546)) +- Fix processing of incoming Update activities of unknown accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15514)) +- Fix URIs of repeat follow requests not being recorded ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15662)) +- Fix error on requests with no `Digest` header ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15782)) +- Fix activity object not requiring signature in secure mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15592)) +- Fix database serialization failure returning HTTP 500 ([Gargron](https://github.com/mastodon/mastodon/pull/16101)) +- Fix media processing getting stuck on too much stdin/stderr ([Gargron](https://github.com/mastodon/mastodon/pull/16136)) +- Fix some inefficient array manipulations ([007lva](https://github.com/mastodon/mastodon/pull/15513), [007lva](https://github.com/mastodon/mastodon/pull/15527)) +- Fix some inefficient regex matching ([007lva](https://github.com/mastodon/mastodon/pull/15528)) +- Fix some inefficient SQL queries ([abcang](https://github.com/mastodon/mastodon/pull/16104), [abcang](https://github.com/mastodon/mastodon/pull/16106), [abcang](https://github.com/mastodon/mastodon/pull/16105)) +- Fix trying to fetch key from empty URI when verifying HTTP signature ([Gargron](https://github.com/mastodon/mastodon/pull/16100)) +- Fix `tootctl maintenance fix-duplicates` failures ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15923), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15515)) +- Fix error when removing status caused by race condition ([Gargron](https://github.com/mastodon/mastodon/pull/16099)) +- Fix blocking someone not clearing up list feeds ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16205)) +- Fix misspelled URLs character counting ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15382)) +- Fix Sidekiq hanging forever due to a Resolv bug in Ruby 2.7.3 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16157)) +- Fix edge case where follow limit interferes with accepting a follow ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16098)) +- Fix inconsistent lead text style in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/16052), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16086)) +- Fix reports of already suspended accounts being recorded ([Gargron](https://github.com/mastodon/mastodon/pull/16047)) +- Fix sign-up restrictions based on IP addresses not being enforced ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15607)) +- Fix YouTube embeds failing due to YouTube serving wrong OEmbed URLs ([Gargron](https://github.com/mastodon/mastodon/pull/15716)) +- Fix error when rendering public pages with media without meta ([Gargron](https://github.com/mastodon/mastodon/pull/16112)) +- Fix misaligned logo on follow button on public pages ([noellabo](https://github.com/mastodon/mastodon/pull/15458)) +- Fix video modal not working on public pages ([noellabo](https://github.com/mastodon/mastodon/pull/15469)) +- Fix race conditions on account migration creation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15597)) +- Fix not being able to change world filter expiration back to “Never” ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15858)) +- Fix `.env.vagrant` not setting `RAILS_ENV` variable ([chandrn7](https://github.com/mastodon/mastodon/pull/15709)) +- Fix error when muting users with `duration` in REST API ([Tak](https://github.com/mastodon/mastodon/pull/15516)) +- Fix border padding on front page in light theme ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15926)) +- Fix wrong URL to custom CSS when `CDN_HOST` is used ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15927)) +- Fix `tootctl accounts unfollow` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15639)) +- Fix `tootctl emoji import` wasting time on MacOS shadow files ([cortices](https://github.com/mastodon/mastodon/pull/15430)) +- Fix `tootctl emoji import` not treating shortcodes as case-insensitive ([angristan](https://github.com/mastodon/mastodon/pull/15738)) +- Fix some issues with SAML account creation ([Gargron](https://github.com/mastodon/mastodon/pull/15222), [kaiyou](https://github.com/mastodon/mastodon/pull/15511)) +- Fix MX validation applying for explicitly allowed e-mail domains ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15930)) +- Fix share page not using configured custom mascot ([tribela](https://github.com/mastodon/mastodon/pull/15687)) +- Fix instance actor not being automatically created if it wasn't seeded properly ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15693)) +- Fix HTTPS enforcement preventing Mastodon from being run as an Onion service ([cohosh](https://github.com/mastodon/mastodon/pull/15560), [jtracey](https://github.com/mastodon/mastodon/pull/15741), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15712), [cohosh](https://github.com/mastodon/mastodon/pull/15725)) +- Fix app name, website and redirect URIs not having a maximum length ([Gargron](https://github.com/mastodon/mastodon/pull/16042)) + ## [3.3.0] - 2020-12-27 ### Added -- **Add hotkeys for audio/video control in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15158), [Gargron](https://github.com/tootsuite/mastodon/pull/15198)) +- **Add hotkeys for audio/video control in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/15158), [Gargron](https://github.com/mastodon/mastodon/pull/15198)) - `Space` and `k` to toggle playback - `m` to toggle mute - `f` to toggle fullscreen - `j` and `l` to go back and forward by 10 seconds - `.` and `,` to go back and forward by a frame (video only) -- Add expand/compress button on media modal in web UI ([mashirozx](https://github.com/tootsuite/mastodon/pull/15068), [mashirozx](https://github.com/tootsuite/mastodon/pull/15088), [mashirozx](https://github.com/tootsuite/mastodon/pull/15094)) -- Add border around 🕺 emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14769)) -- Add border around 🐞 emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14712)) -- Add home link to the getting started column when home isn't mounted ([ThibG](https://github.com/tootsuite/mastodon/pull/14707)) -- Add option to disable swiping motions across the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13885)) -- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14870), [Gargron](https://github.com/tootsuite/mastodon/pull/15157), [Gargron](https://github.com/tootsuite/mastodon/pull/14915), [noellabo](https://github.com/tootsuite/mastodon/pull/15309)) +- Add expand/compress button on media modal in web UI ([mashirozx](https://github.com/mastodon/mastodon/pull/15068), [mashirozx](https://github.com/mastodon/mastodon/pull/15088), [mashirozx](https://github.com/mastodon/mastodon/pull/15094)) +- Add border around 🕺 emoji in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14769)) +- Add border around 🐞 emoji in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14712)) +- Add home link to the getting started column when home isn't mounted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14707)) +- Add option to disable swiping motions across the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13885)) +- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/14870), [Gargron](https://github.com/mastodon/mastodon/pull/15157), [Gargron](https://github.com/mastodon/mastodon/pull/14915), [noellabo](https://github.com/mastodon/mastodon/pull/15309)) - Continue watching/listening when you scroll away - Action bar to interact with/open toot from the pop-out player -- Add unread notification markers in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14818), [ThibG](https://github.com/tootsuite/mastodon/pull/14960), [ThibG](https://github.com/tootsuite/mastodon/pull/14954), [noellabo](https://github.com/tootsuite/mastodon/pull/14897), [noellabo](https://github.com/tootsuite/mastodon/pull/14907)) -- Add paragraph about browser add-ons when encountering errors in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14801)) -- Add import and export for bookmarks ([ThibG](https://github.com/tootsuite/mastodon/pull/14956)) -- Add cache buster feature for media files ([Gargron](https://github.com/tootsuite/mastodon/pull/15155)) +- Add unread notification markers in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14818), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14960), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14954), [noellabo](https://github.com/mastodon/mastodon/pull/14897), [noellabo](https://github.com/mastodon/mastodon/pull/14907)) +- Add paragraph about browser add-ons when encountering errors in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14801)) +- Add import and export for bookmarks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14956)) +- Add cache buster feature for media files ([Gargron](https://github.com/mastodon/mastodon/pull/15155)) - If you have a proxy cache in front of object storage, deleted files will persist until the cache expires - If enabled, cache buster will make a special request to the proxy to signal a cache reset -- Add duration option to the mute function ([aquarla](https://github.com/tootsuite/mastodon/pull/13831)) -- Add replies policy option to the list function ([ThibG](https://github.com/tootsuite/mastodon/pull/9205), [trwnh](https://github.com/tootsuite/mastodon/pull/15304)) -- Add `og:published_time` OpenGraph tags on toots ([nornagon](https://github.com/tootsuite/mastodon/pull/14865)) -- **Add option to be notified when a followed user posts** ([Gargron](https://github.com/tootsuite/mastodon/pull/13546), [ThibG](https://github.com/tootsuite/mastodon/pull/14896), [Gargron](https://github.com/tootsuite/mastodon/pull/14822)) +- Add duration option to the mute function ([aquarla](https://github.com/mastodon/mastodon/pull/13831)) +- Add replies policy option to the list function ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9205), [trwnh](https://github.com/mastodon/mastodon/pull/15304)) +- Add `og:published_time` OpenGraph tags on toots ([nornagon](https://github.com/mastodon/mastodon/pull/14865)) +- **Add option to be notified when a followed user posts** ([Gargron](https://github.com/mastodon/mastodon/pull/13546), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14896), [Gargron](https://github.com/mastodon/mastodon/pull/14822)) - If you don't want to miss a toot, click the bell button! -- Add client-side validation in password change forms ([ThibG](https://github.com/tootsuite/mastodon/pull/14564)) -- Add client-side validation in the registration form ([ThibG](https://github.com/tootsuite/mastodon/pull/14560), [ThibG](https://github.com/tootsuite/mastodon/pull/14599)) -- Add support for Gemini URLs ([joshleeb](https://github.com/tootsuite/mastodon/pull/15013)) -- Add app shortcuts to web app manifest ([mkljczk](https://github.com/tootsuite/mastodon/pull/15234)) -- Add WebAuthn as an alternative 2FA method ([santiagorodriguez96](https://github.com/tootsuite/mastodon/pull/14466), [jiikko](https://github.com/tootsuite/mastodon/pull/14806)) -- Add honeypot fields and minimum fill-out time for sign-up form ([ThibG](https://github.com/tootsuite/mastodon/pull/15276)) -- Add icon for mutual relationships in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15149)) -- Add follow selected followers button in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15148)) -- **Add subresource integrity for JS and CSS assets** ([Gargron](https://github.com/tootsuite/mastodon/pull/15096)) +- Add client-side validation in password change forms ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14564)) +- Add client-side validation in the registration form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14560), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14599)) +- Add support for Gemini URLs ([joshleeb](https://github.com/mastodon/mastodon/pull/15013)) +- Add app shortcuts to web app manifest ([mkljczk](https://github.com/mastodon/mastodon/pull/15234)) +- Add WebAuthn as an alternative 2FA method ([santiagorodriguez96](https://github.com/mastodon/mastodon/pull/14466), [jiikko](https://github.com/mastodon/mastodon/pull/14806)) +- Add honeypot fields and minimum fill-out time for sign-up form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15276)) +- Add icon for mutual relationships in relationship manager ([noellabo](https://github.com/mastodon/mastodon/pull/15149)) +- Add follow selected followers button in relationship manager ([noellabo](https://github.com/mastodon/mastodon/pull/15148)) +- **Add subresource integrity for JS and CSS assets** ([Gargron](https://github.com/mastodon/mastodon/pull/15096)) - If you use a CDN for static assets (JavaScript, CSS, and so on), you have to trust that the CDN does not modify the assets maliciously - Subresource integrity compares server-generated asset digests with what's actually served from the CDN and prevents such attacks -- Add `ku`, `sa`, `sc`, `zgh` to available locales ([ykzts](https://github.com/tootsuite/mastodon/pull/15138)) -- Add ability to force an account to mark media as sensitive ([noellabo](https://github.com/tootsuite/mastodon/pull/14361)) -- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/tootsuite/mastodon/pull/14963), [ThibG](https://github.com/tootsuite/mastodon/pull/15263)) +- Add `ku`, `sa`, `sc`, `zgh` to available locales ([ykzts](https://github.com/mastodon/mastodon/pull/15138)) +- Add ability to force an account to mark media as sensitive ([noellabo](https://github.com/mastodon/mastodon/pull/14361)) +- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/mastodon/mastodon/pull/14963), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15263)) - Add rules for IPs or CIDR ranges that automatically expire after a configurable amount of time - Choose the severity of the rule, either blocking all access or merely limiting sign-ups -- **Add support for reversible suspensions through ActivityPub** ([Gargron](https://github.com/tootsuite/mastodon/pull/14989)) +- **Add support for reversible suspensions through ActivityPub** ([Gargron](https://github.com/mastodon/mastodon/pull/14989)) - Servers can signal that one of their accounts has been suspended - During suspension, the account can only delete its own content - A reversal of the suspension can be signalled the same way - A local suspension always overrides a remote one -- Add indication to admin UI of whether a report has been forwarded ([ThibG](https://github.com/tootsuite/mastodon/pull/13237)) -- Add display of reasons for joining of an account in admin UI ([mashirozx](https://github.com/tootsuite/mastodon/pull/15265)) -- Add option to obfuscate domain name in public list of domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/15355)) -- Add option to make reasons for joining required on sign-up ([ThibG](https://github.com/tootsuite/mastodon/pull/15326), [ThibG](https://github.com/tootsuite/mastodon/pull/15358), [ThibG](https://github.com/tootsuite/mastodon/pull/15385), [ThibG](https://github.com/tootsuite/mastodon/pull/15405)) -- Add ActivityPub follower synchronization mechanism ([ThibG](https://github.com/tootsuite/mastodon/pull/14510), [ThibG](https://github.com/tootsuite/mastodon/pull/15026)) -- Add outbox attribute to instance actor ([ThibG](https://github.com/tootsuite/mastodon/pull/14721)) -- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595), [noellabo](https://github.com/tootsuite/mastodon/pull/15277)) -- Add support for dereferencing objects through bearcaps ([Gargron](https://github.com/tootsuite/mastodon/pull/14683), [noellabo](https://github.com/tootsuite/mastodon/pull/14981)) -- Add `S3_READ_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/14952)) -- Add `ALLOWED_PRIVATE_ADDRESSES` environment variable ([ThibG](https://github.com/tootsuite/mastodon/pull/14722)) -- Add `--fix-permissions` option to `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/14383), [uist1idrju3i](https://github.com/tootsuite/mastodon/pull/14715)) -- Add `tootctl accounts merge` ([Gargron](https://github.com/tootsuite/mastodon/pull/15201), [ThibG](https://github.com/tootsuite/mastodon/pull/15264), [ThibG](https://github.com/tootsuite/mastodon/pull/15256)) +- Add indication to admin UI of whether a report has been forwarded ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13237)) +- Add display of reasons for joining of an account in admin UI ([mashirozx](https://github.com/mastodon/mastodon/pull/15265)) +- Add option to obfuscate domain name in public list of domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/15355)) +- Add option to make reasons for joining required on sign-up ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15326), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15358), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15385), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15405)) +- Add ActivityPub follower synchronization mechanism ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14510), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15026)) +- Add outbox attribute to instance actor ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14721)) +- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/mastodon/mastodon/pull/11595), [noellabo](https://github.com/mastodon/mastodon/pull/15277)) +- Add support for dereferencing objects through bearcaps ([Gargron](https://github.com/mastodon/mastodon/pull/14683), [noellabo](https://github.com/mastodon/mastodon/pull/14981)) +- Add `S3_READ_TIMEOUT` environment variable ([tateisu](https://github.com/mastodon/mastodon/pull/14952)) +- Add `ALLOWED_PRIVATE_ADDRESSES` environment variable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14722)) +- Add `--fix-permissions` option to `tootctl media remove-orphans` ([Gargron](https://github.com/mastodon/mastodon/pull/14383), [uist1idrju3i](https://github.com/mastodon/mastodon/pull/14715)) +- Add `tootctl accounts merge` ([Gargron](https://github.com/mastodon/mastodon/pull/15201), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15264), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15256)) - Has someone changed their domain or subdomain thereby creating two accounts where there should be one? - This command will fix it on your end -- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223), [ThibG](https://github.com/tootsuite/mastodon/pull/15373)) +- Add `tootctl maintenance fix-duplicates` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14860), [Gargron](https://github.com/mastodon/mastodon/pull/15223), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15373)) - Index corruption in the database? - This command is for you -- **Add support for managing multiple stream subscriptions in a single connection** ([Gargron](https://github.com/tootsuite/mastodon/pull/14524), [Gargron](https://github.com/tootsuite/mastodon/pull/14566), [mfmfuyu](https://github.com/tootsuite/mastodon/pull/14859), [zunda](https://github.com/tootsuite/mastodon/pull/14608)) +- **Add support for managing multiple stream subscriptions in a single connection** ([Gargron](https://github.com/mastodon/mastodon/pull/14524), [Gargron](https://github.com/mastodon/mastodon/pull/14566), [mfmfuyu](https://github.com/mastodon/mastodon/pull/14859), [zunda](https://github.com/mastodon/mastodon/pull/14608)) - Previously, getting live updates for multiple timelines required opening a HTTP or WebSocket connection for each - More connections means more resource consumption on both ends, not to mention the (ever so slight) delay when establishing a new connection - Now, with just a single WebSocket connection you can subscribe and unsubscribe to and from multiple streams -- Add support for limiting results by both `min_id` and `max_id` at the same time in REST API ([tateisu](https://github.com/tootsuite/mastodon/pull/14776)) -- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/tootsuite/mastodon/pull/11817), [noellabo](https://github.com/tootsuite/mastodon/pull/15270)) -- Add stoplight for object storage failures, return HTTP 503 in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/13043)) -- Add optional `tootctl remove media` cronjob in Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14396)) -- Add clean error message when `RAILS_ENV` is unset ([ThibG](https://github.com/tootsuite/mastodon/pull/15381)) +- Add support for limiting results by both `min_id` and `max_id` at the same time in REST API ([tateisu](https://github.com/mastodon/mastodon/pull/14776)) +- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/mastodon/mastodon/pull/11817), [noellabo](https://github.com/mastodon/mastodon/pull/15270)) +- Add stoplight for object storage failures, return HTTP 503 in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/13043)) +- Add optional `tootctl remove media` cronjob in Helm chart ([dunn](https://github.com/mastodon/mastodon/pull/14396)) +- Add clean error message when `RAILS_ENV` is unset ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15381)) ### Changed -- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221), [Gargron](https://github.com/tootsuite/mastodon/pull/15284), [Gargron](https://github.com/tootsuite/mastodon/pull/15283), [Kjwon15](https://github.com/tootsuite/mastodon/pull/15308), [noellabo](https://github.com/tootsuite/mastodon/pull/15305), [ThibG](https://github.com/tootsuite/mastodon/pull/15417)) +- **Change media modals look in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/15217), [Gargron](https://github.com/mastodon/mastodon/pull/15221), [Gargron](https://github.com/mastodon/mastodon/pull/15284), [Gargron](https://github.com/mastodon/mastodon/pull/15283), [Kjwon15](https://github.com/mastodon/mastodon/pull/15308), [noellabo](https://github.com/mastodon/mastodon/pull/15305), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15417)) - Background of the overlay matches the color of the image - Action bar to interact with or open the toot from the modal -- Change order of announcements in admin UI to be newest-first ([ThibG](https://github.com/tootsuite/mastodon/pull/15091)) -- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855), [ThibG](https://github.com/tootsuite/mastodon/pull/15380), [Gargron](https://github.com/tootsuite/mastodon/pull/15420), [Gargron](https://github.com/tootsuite/mastodon/pull/15414)) +- Change order of announcements in admin UI to be newest-first ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15091)) +- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/mastodon/mastodon/pull/14726), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15152), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15106), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15100), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15099), [noellabo](https://github.com/mastodon/mastodon/pull/14855), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15380), [Gargron](https://github.com/mastodon/mastodon/pull/15420), [Gargron](https://github.com/mastodon/mastodon/pull/15414)) - Suspensions no longer equal deletions - A suspended account can be unsuspended with minimal consequences for 30 days - Immediate deletion of data is still available as an explicit option - Suspended accounts can request an archive of their data through the UI - Change REST API to return empty data for suspended accounts (14765) -- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/14766), [Gargron](https://github.com/tootsuite/mastodon/pull/15345)) -- Change featured hashtag suggestions to be recently used instead of most used ([abcang](https://github.com/tootsuite/mastodon/pull/14760)) -- Change direct toots to appear in the home feed again ([Gargron](https://github.com/tootsuite/mastodon/pull/14711), [ThibG](https://github.com/tootsuite/mastodon/pull/15182), [noellabo](https://github.com/tootsuite/mastodon/pull/14727)) +- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/mastodon/mastodon/pull/14766), [Gargron](https://github.com/mastodon/mastodon/pull/15345)) +- Change featured hashtag suggestions to be recently used instead of most used ([abcang](https://github.com/mastodon/mastodon/pull/14760)) +- Change direct toots to appear in the home feed again ([Gargron](https://github.com/mastodon/mastodon/pull/14711), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15182), [noellabo](https://github.com/mastodon/mastodon/pull/14727)) - Return to treating all toots the same instead of trying to retrofit direct visibility into an instant messaging model -- Change email address validation to return more specific errors ([ThibG](https://github.com/tootsuite/mastodon/pull/14565)) -- Change HTTP signature requirements to include `Digest` header on `POST` requests ([ThibG](https://github.com/tootsuite/mastodon/pull/15069)) -- Change click area of video/audio player buttons to be bigger in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15049)) -- Change order of filters by alphabetic by "keyword or phrase" ([ariasuni](https://github.com/tootsuite/mastodon/pull/15050)) -- Change suspension of remote accounts to also undo outgoing follows ([ThibG](https://github.com/tootsuite/mastodon/pull/15188)) -- Change string "Home" to "Home and lists" in the filter creation screen ([ariasuni](https://github.com/tootsuite/mastodon/pull/15139)) -- Change string "Boost to original audience" to "Boost with original visibility" in web UI ([3n-k1](https://github.com/tootsuite/mastodon/pull/14598)) -- Change string "Show more" to "Show newer" and "Show older" on public pages ([ariasuni](https://github.com/tootsuite/mastodon/pull/15052)) -- Change order of announcements to be reverse chronological in web UI ([dariusk](https://github.com/tootsuite/mastodon/pull/15065), [dariusk](https://github.com/tootsuite/mastodon/pull/15070)) -- Change RTL detection to rely on unicode-bidi paragraph by paragraph in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14573)) -- Change visibility icon next to timestamp to be clickable in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15053), [mayaeh](https://github.com/tootsuite/mastodon/pull/15055)) -- Change public thread view to hide "Show thread" link ([ThibG](https://github.com/tootsuite/mastodon/pull/15266)) -- Change number format on about page from full to shortened ([Gargron](https://github.com/tootsuite/mastodon/pull/15327)) -- Change how scheduled tasks run in multi-process environments ([noellabo](https://github.com/tootsuite/mastodon/pull/15314)) +- Change email address validation to return more specific errors ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14565)) +- Change HTTP signature requirements to include `Digest` header on `POST` requests ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15069)) +- Change click area of video/audio player buttons to be bigger in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/15049)) +- Change order of filters by alphabetic by "keyword or phrase" ([ariasuni](https://github.com/mastodon/mastodon/pull/15050)) +- Change suspension of remote accounts to also undo outgoing follows ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15188)) +- Change string "Home" to "Home and lists" in the filter creation screen ([ariasuni](https://github.com/mastodon/mastodon/pull/15139)) +- Change string "Boost to original audience" to "Boost with original visibility" in web UI ([3n-k1](https://github.com/mastodon/mastodon/pull/14598)) +- Change string "Show more" to "Show newer" and "Show older" on public pages ([ariasuni](https://github.com/mastodon/mastodon/pull/15052)) +- Change order of announcements to be reverse chronological in web UI ([dariusk](https://github.com/mastodon/mastodon/pull/15065), [dariusk](https://github.com/mastodon/mastodon/pull/15070)) +- Change RTL detection to rely on unicode-bidi paragraph by paragraph in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14573)) +- Change visibility icon next to timestamp to be clickable in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/15053), [mayaeh](https://github.com/mastodon/mastodon/pull/15055)) +- Change public thread view to hide "Show thread" link ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15266)) +- Change number format on about page from full to shortened ([Gargron](https://github.com/mastodon/mastodon/pull/15327)) +- Change how scheduled tasks run in multi-process environments ([noellabo](https://github.com/mastodon/mastodon/pull/15314)) - New dedicated queue `scheduler` - Runs by default when Sidekiq is executed with no options - Has to be added manually in a multi-process environment ### Removed -- Remove fade-in animation from modals in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15199)) -- Remove auto-redirect to direct messages in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15142)) -- Remove obsolete IndexedDB operations from web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14730)) -- Remove dependency on unused and unmaintained http_parser.rb gem ([ThibG](https://github.com/tootsuite/mastodon/pull/14574)) +- Remove fade-in animation from modals in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/15199)) +- Remove auto-redirect to direct messages in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/15142)) +- Remove obsolete IndexedDB operations from web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14730)) +- Remove dependency on unused and unmaintained http_parser.rb gem ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14574)) ### Fixed -- Fix layout on about page when contact account has a long username ([ThibG](https://github.com/tootsuite/mastodon/pull/15357)) -- Fix follow limit preventing re-following of a moved account ([Gargron](https://github.com/tootsuite/mastodon/pull/14207), [ThibG](https://github.com/tootsuite/mastodon/pull/15384)) -- **Fix deletes not reaching every server that interacted with toot** ([Gargron](https://github.com/tootsuite/mastodon/pull/15200)) +- Fix layout on about page when contact account has a long username ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15357)) +- Fix follow limit preventing re-following of a moved account ([Gargron](https://github.com/mastodon/mastodon/pull/14207), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15384)) +- **Fix deletes not reaching every server that interacted with toot** ([Gargron](https://github.com/mastodon/mastodon/pull/15200)) - Previously, delete of a toot would be primarily sent to the followers of its author, people mentioned in the toot, and people who reblogged the toot - Now, additionally, it is ensured that it is sent to people who replied to it, favourited it, and to the person it replies to even if that person is not mentioned -- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ThibG](https://github.com/tootsuite/mastodon/pull/15187)) -- Fix sending redundant ActivityPub events when processing remote account deletion ([ThibG](https://github.com/tootsuite/mastodon/pull/15104)) -- Fix Move handler not being triggered when failing to fetch target account ([ThibG](https://github.com/tootsuite/mastodon/pull/15107)) -- Fix downloading remote media files when server returns empty filename ([ThibG](https://github.com/tootsuite/mastodon/pull/14867)) -- Fix account processing failing because of large collections ([ThibG](https://github.com/tootsuite/mastodon/pull/15027)) -- Fix not being able to unfavorite toots one has lost access to ([ThibG](https://github.com/tootsuite/mastodon/pull/15192)) -- Fix not being able to unbookmark toots one has lost access to ([ThibG](https://github.com/tootsuite/mastodon/pull/14604)) -- Fix possible casing inconsistencies in hashtag search ([ThibG](https://github.com/tootsuite/mastodon/pull/14906)) -- Fix updating account counters when association is not yet created ([Gargron](https://github.com/tootsuite/mastodon/pull/15108)) -- Fix cookies not having a SameSite attribute ([Gargron](https://github.com/tootsuite/mastodon/pull/15098)) -- Fix poll ending notifications being created for each vote ([ThibG](https://github.com/tootsuite/mastodon/pull/15071)) -- Fix multiple boosts of a same toot erroneously appearing in TL ([ThibG](https://github.com/tootsuite/mastodon/pull/14759)) -- Fix asset builds not picking up `CDN_HOST` change ([ThibG](https://github.com/tootsuite/mastodon/pull/14381)) -- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14985), [Gargron](https://github.com/tootsuite/mastodon/pull/15141), [ThibG](https://github.com/tootsuite/mastodon/pull/13543), [ThibG](https://github.com/tootsuite/mastodon/pull/15176)) +- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15187)) +- Fix sending redundant ActivityPub events when processing remote account deletion ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15104)) +- Fix Move handler not being triggered when failing to fetch target account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15107)) +- Fix downloading remote media files when server returns empty filename ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14867)) +- Fix account processing failing because of large collections ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15027)) +- Fix not being able to unfavorite toots one has lost access to ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15192)) +- Fix not being able to unbookmark toots one has lost access to ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14604)) +- Fix possible casing inconsistencies in hashtag search ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14906)) +- Fix updating account counters when association is not yet created ([Gargron](https://github.com/mastodon/mastodon/pull/15108)) +- Fix cookies not having a SameSite attribute ([Gargron](https://github.com/mastodon/mastodon/pull/15098)) +- Fix poll ending notifications being created for each vote ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15071)) +- Fix multiple boosts of a same toot erroneously appearing in TL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14759)) +- Fix asset builds not picking up `CDN_HOST` change ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14381)) +- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14985), [Gargron](https://github.com/mastodon/mastodon/pull/15141), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13543), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15176)) - Some time ago, browsers added a requirement that desktop notification prompts could only be displayed in response to a user-generated event (such as a click) - This means that for some time, users who haven't already given the permission before were not getting a prompt and as such were not receiving desktop notifications -- Fix "Mark media as sensitive" string not supporting pluralizations in other languages in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15051)) -- Fix glitched image uploads when canvas read access is blocked in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15180)) -- Fix some account gallery items having empty labels in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15073)) -- Fix alt-key hotkeys activating while typing in a text field in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14942)) -- Fix wrong seek bar width on media player in web UI ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/15060)) -- Fix logging out on mobile in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14901)) -- Fix wrong click area for GIFVs in media modal in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14615)) -- Fix unreadable placeholder text color in high contrast theme in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14803)) -- Fix scrolling issues when closing some dropdown menus in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14606)) -- Fix notification filter bar incorrectly filtering gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14808)) -- Fix disabled boost icon being replaced by private boost icon on hover in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14456)) -- Fix hashtag detection in compose form being different to server-side in web UI ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/14484), [ThibG](https://github.com/tootsuite/mastodon/pull/14513)) -- Fix home last read marker mishandling gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14809)) -- Fix unnecessary re-rendering of various components when typing in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15286)) -- Fix notifications being unnecessarily re-rendered in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15312)) -- Fix column swiping animation logic in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15301)) -- Fix inefficiency when fetching hashtag timeline ([noellabo](https://github.com/tootsuite/mastodon/pull/14861), [akihikodaki](https://github.com/tootsuite/mastodon/pull/14662)) -- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14674)) -- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14673)) -- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14675)) -- Fix inefficieny when deleting accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/15387), [ThibG](https://github.com/tootsuite/mastodon/pull/15409), [ThibG](https://github.com/tootsuite/mastodon/pull/15407), [ThibG](https://github.com/tootsuite/mastodon/pull/15408), [ThibG](https://github.com/tootsuite/mastodon/pull/15402), [ThibG](https://github.com/tootsuite/mastodon/pull/15416), [Gargron](https://github.com/tootsuite/mastodon/pull/15421)) -- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/tootsuite/mastodon/pull/14534)) -- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287)) -- Fix performance on instances list in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15282)) -- Fix server actor appearing in list of accounts in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14567)) -- Fix "bootstrap timeline accounts" toggle in site settings in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15325)) -- Fix PostgreSQL secret name for cronjob in Helm chart ([metal3d](https://github.com/tootsuite/mastodon/pull/15072)) -- Fix Procfile not being compatible with herokuish ([acuteaura](https://github.com/tootsuite/mastodon/pull/12685)) -- Fix installation of tini being split into multiple steps in Dockerfile ([ryncsn](https://github.com/tootsuite/mastodon/pull/14686)) +- Fix "Mark media as sensitive" string not supporting pluralizations in other languages in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/15051)) +- Fix glitched image uploads when canvas read access is blocked in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15180)) +- Fix some account gallery items having empty labels in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15073)) +- Fix alt-key hotkeys activating while typing in a text field in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14942)) +- Fix wrong seek bar width on media player in web UI ([mfmfuyu](https://github.com/mastodon/mastodon/pull/15060)) +- Fix logging out on mobile in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14901)) +- Fix wrong click area for GIFVs in media modal in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14615)) +- Fix unreadable placeholder text color in high contrast theme in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14803)) +- Fix scrolling issues when closing some dropdown menus in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14606)) +- Fix notification filter bar incorrectly filtering gaps in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14808)) +- Fix disabled boost icon being replaced by private boost icon on hover in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14456)) +- Fix hashtag detection in compose form being different to server-side in web UI ([kedamaDQ](https://github.com/mastodon/mastodon/pull/14484), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14513)) +- Fix home last read marker mishandling gaps in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14809)) +- Fix unnecessary re-rendering of various components when typing in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/15286)) +- Fix notifications being unnecessarily re-rendered in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15312)) +- Fix column swiping animation logic in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15301)) +- Fix inefficiency when fetching hashtag timeline ([noellabo](https://github.com/mastodon/mastodon/pull/14861), [akihikodaki](https://github.com/mastodon/mastodon/pull/14662)) +- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/mastodon/mastodon/pull/14674)) +- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/mastodon/mastodon/pull/14673)) +- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/mastodon/mastodon/pull/14675)) +- Fix inefficieny when deleting accounts ([Gargron](https://github.com/mastodon/mastodon/pull/15387), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15407), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15402), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15416), [Gargron](https://github.com/mastodon/mastodon/pull/15421)) +- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/mastodon/mastodon/pull/14534)) +- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/mastodon/mastodon/pull/15287)) +- Fix performance on instances list in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/15282)) +- Fix server actor appearing in list of accounts in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14567)) +- Fix "bootstrap timeline accounts" toggle in site settings in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15325)) +- Fix PostgreSQL secret name for cronjob in Helm chart ([metal3d](https://github.com/mastodon/mastodon/pull/15072)) +- Fix Procfile not being compatible with herokuish ([acuteaura](https://github.com/mastodon/mastodon/pull/12685)) +- Fix installation of tini being split into multiple steps in Dockerfile ([ryncsn](https://github.com/mastodon/mastodon/pull/14686)) ### Security -- Fix streaming API allowing connections to persist after access token invalidation ([Gargron](https://github.com/tootsuite/mastodon/pull/15111)) -- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802)) -- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364)) +- Fix streaming API allowing connections to persist after access token invalidation ([Gargron](https://github.com/mastodon/mastodon/pull/15111)) +- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/mastodon/mastodon/pull/14802)) +- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15364)) ## [3.2.2] - 2020-12-19 ### Added -- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223)) +- Add `tootctl maintenance fix-duplicates` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14860), [Gargron](https://github.com/mastodon/mastodon/pull/15223)) - Index corruption in the database? - This command is for you ### Removed -- Remove dependency on unused and unmaintained http_parser.rb gem ([ThibG](https://github.com/tootsuite/mastodon/pull/14574)) +- Remove dependency on unused and unmaintained http_parser.rb gem ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14574)) ### Fixed -- Fix Move handler not being triggered when failing to fetch target account ([ThibG](https://github.com/tootsuite/mastodon/pull/15107)) -- Fix downloading remote media files when server returns empty filename ([ThibG](https://github.com/tootsuite/mastodon/pull/14867)) -- Fix possible casing inconsistencies in hashtag search ([ThibG](https://github.com/tootsuite/mastodon/pull/14906)) -- Fix updating account counters when association is not yet created ([Gargron](https://github.com/tootsuite/mastodon/pull/15108)) -- Fix account processing failing because of large collections ([ThibG](https://github.com/tootsuite/mastodon/pull/15027)) -- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ThibG](https://github.com/tootsuite/mastodon/pull/15187)) -- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287)) +- Fix Move handler not being triggered when failing to fetch target account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15107)) +- Fix downloading remote media files when server returns empty filename ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14867)) +- Fix possible casing inconsistencies in hashtag search ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14906)) +- Fix updating account counters when association is not yet created ([Gargron](https://github.com/mastodon/mastodon/pull/15108)) +- Fix account processing failing because of large collections ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15027)) +- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15187)) +- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/mastodon/mastodon/pull/15287)) ### Security -- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802)) -- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364)) +- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/mastodon/mastodon/pull/14802)) +- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15364)) ## [3.2.1] - 2020-10-19 ### Added -- Add support for latest HTTP Signatures spec draft ([ThibG](https://github.com/tootsuite/mastodon/pull/14556)) -- Add support for inlined objects in ActivityPub `to`/`cc` ([ThibG](https://github.com/tootsuite/mastodon/pull/14514)) +- Add support for latest HTTP Signatures spec draft ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14556)) +- Add support for inlined objects in ActivityPub `to`/`cc` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14514)) ### Changed -- Change actors to not be served at all without authentication in limited federation mode ([ThibG](https://github.com/tootsuite/mastodon/pull/14800)) +- Change actors to not be served at all without authentication in limited federation mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14800)) - Previously, a bare version of an actor was served when not authenticated, i.e. username and public key - Because all actor fetch requests are signed using a separate system actor, that is no longer required ### Fixed -- Fix `tootctl media` commands not recognizing very large IDs ([ThibG](https://github.com/tootsuite/mastodon/pull/14536)) -- Fix crash when failing to load emoji picker in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14525)) -- Fix contrast requirements in thumbnail color extraction ([ThibG](https://github.com/tootsuite/mastodon/pull/14464)) -- Fix audio/video player not using `CDN_HOST` on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/14486)) -- Fix private boost icon not being used on public pages ([OmmyZhang](https://github.com/tootsuite/mastodon/pull/14471)) -- Fix audio player on Safari in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14485), [ThibG](https://github.com/tootsuite/mastodon/pull/14465)) -- Fix dereferencing remote statuses not using the correct account for signature when receiving a targeted inbox delivery ([ThibG](https://github.com/tootsuite/mastodon/pull/14656)) -- Fix nil error in `tootctl media remove` ([noellabo](https://github.com/tootsuite/mastodon/pull/14657)) -- Fix videos with near-60 fps being rejected ([Gargron](https://github.com/tootsuite/mastodon/pull/14684)) -- Fix reported statuses not being included in warning e-mail ([Gargron](https://github.com/tootsuite/mastodon/pull/14778)) -- Fix `Reject` activities of `Follow` objects not correctly destroying a follow relationship ([ThibG](https://github.com/tootsuite/mastodon/pull/14479)) -- Fix inefficiencies in fan-out-on-write service ([Gargron](https://github.com/tootsuite/mastodon/pull/14682), [noellabo](https://github.com/tootsuite/mastodon/pull/14709)) -- Fix timeout errors when trying to webfinger some IPv6 configurations ([Gargron](https://github.com/tootsuite/mastodon/pull/14919)) -- Fix files served as `application/octet-stream` being rejected without attempting mime type detection ([ThibG](https://github.com/tootsuite/mastodon/pull/14452)) +- Fix `tootctl media` commands not recognizing very large IDs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14536)) +- Fix crash when failing to load emoji picker in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14525)) +- Fix contrast requirements in thumbnail color extraction ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14464)) +- Fix audio/video player not using `CDN_HOST` on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14486)) +- Fix private boost icon not being used on public pages ([OmmyZhang](https://github.com/mastodon/mastodon/pull/14471)) +- Fix audio player on Safari in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14485), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14465)) +- Fix dereferencing remote statuses not using the correct account for signature when receiving a targeted inbox delivery ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14656)) +- Fix nil error in `tootctl media remove` ([noellabo](https://github.com/mastodon/mastodon/pull/14657)) +- Fix videos with near-60 fps being rejected ([Gargron](https://github.com/mastodon/mastodon/pull/14684)) +- Fix reported statuses not being included in warning e-mail ([Gargron](https://github.com/mastodon/mastodon/pull/14778)) +- Fix `Reject` activities of `Follow` objects not correctly destroying a follow relationship ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14479)) +- Fix inefficiencies in fan-out-on-write service ([Gargron](https://github.com/mastodon/mastodon/pull/14682), [noellabo](https://github.com/mastodon/mastodon/pull/14709)) +- Fix timeout errors when trying to webfinger some IPv6 configurations ([Gargron](https://github.com/mastodon/mastodon/pull/14919)) +- Fix files served as `application/octet-stream` being rejected without attempting mime type detection ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14452)) ## [3.2.0] - 2020-07-27 ### Added -- Add `SMTP_SSL` environment variable ([OmmyZhang](https://github.com/tootsuite/mastodon/pull/14309)) -- Add hotkey for toggling content warning input in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13987)) -- **Add e-mail-based sign in challenge for users with disabled 2FA** ([Gargron](https://github.com/tootsuite/mastodon/pull/14013)) +- Add `SMTP_SSL` environment variable ([OmmyZhang](https://github.com/mastodon/mastodon/pull/14309)) +- Add hotkey for toggling content warning input in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13987)) +- **Add e-mail-based sign in challenge for users with disabled 2FA** ([Gargron](https://github.com/mastodon/mastodon/pull/14013)) - If user tries signing in after: - Being inactive for a while - With a previously unknown IP - Without 2FA being enabled - Require to enter a token sent via e-mail before sigining in -- Add `limit` param to RSS feeds ([noellabo](https://github.com/tootsuite/mastodon/pull/13743)) -- Add `visibility` param to share page ([noellabo](https://github.com/tootsuite/mastodon/pull/13023)) -- Add blurhash to link previews ([ThibG](https://github.com/tootsuite/mastodon/pull/13984), [ThibG](https://github.com/tootsuite/mastodon/pull/14143), [ThibG](https://github.com/tootsuite/mastodon/pull/13985), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14267), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14278), [ThibG](https://github.com/tootsuite/mastodon/pull/14126), [ThibG](https://github.com/tootsuite/mastodon/pull/14261), [ThibG](https://github.com/tootsuite/mastodon/pull/14260)) +- Add `limit` param to RSS feeds ([noellabo](https://github.com/mastodon/mastodon/pull/13743)) +- Add `visibility` param to share page ([noellabo](https://github.com/mastodon/mastodon/pull/13023)) +- Add blurhash to link previews ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13984), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14143), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13985), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14267), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14278), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14126), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14261), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14260)) - In web UI, toots cannot be marked as sensitive unless there is media attached - However, it's possible to do via API or ActivityPub - Thumnails of link previews of such posts now use blurhash in web UI - The Card entity in REST API has a new `blurhash` attribute -- Add support for `summary` field for media description in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/13763)) -- Add hints about incomplete remote content to web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14031), [noellabo](https://github.com/tootsuite/mastodon/pull/14195)) -- **Add personal notes for accounts** ([ThibG](https://github.com/tootsuite/mastodon/pull/14148), [Gargron](https://github.com/tootsuite/mastodon/pull/14208), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14251)) +- Add support for `summary` field for media description in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13763)) +- Add hints about incomplete remote content to web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14031), [noellabo](https://github.com/mastodon/mastodon/pull/14195)) +- **Add personal notes for accounts** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14148), [Gargron](https://github.com/mastodon/mastodon/pull/14208), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14251)) - To clarify, these are notes only you can see, to help you remember details - Notes can be viewed and edited from profiles in web UI - New REST API: `POST /api/v1/accounts/:id/note` with `comment` param - The Relationship entity in REST API has a new `note` attribute -- Add Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14090), [dunn](https://github.com/tootsuite/mastodon/pull/14256), [dunn](https://github.com/tootsuite/mastodon/pull/14245)) -- **Add customizable thumbnails for audio and video attachments** ([Gargron](https://github.com/tootsuite/mastodon/pull/14145), [Gargron](https://github.com/tootsuite/mastodon/pull/14244), [Gargron](https://github.com/tootsuite/mastodon/pull/14273), [Gargron](https://github.com/tootsuite/mastodon/pull/14203), [ThibG](https://github.com/tootsuite/mastodon/pull/14255), [ThibG](https://github.com/tootsuite/mastodon/pull/14306), [noellabo](https://github.com/tootsuite/mastodon/pull/14358), [noellabo](https://github.com/tootsuite/mastodon/pull/14357)) +- Add Helm chart ([dunn](https://github.com/mastodon/mastodon/pull/14090), [dunn](https://github.com/mastodon/mastodon/pull/14256), [dunn](https://github.com/mastodon/mastodon/pull/14245)) +- **Add customizable thumbnails for audio and video attachments** ([Gargron](https://github.com/mastodon/mastodon/pull/14145), [Gargron](https://github.com/mastodon/mastodon/pull/14244), [Gargron](https://github.com/mastodon/mastodon/pull/14273), [Gargron](https://github.com/mastodon/mastodon/pull/14203), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14255), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14306), [noellabo](https://github.com/mastodon/mastodon/pull/14358), [noellabo](https://github.com/mastodon/mastodon/pull/14357)) - Metadata (album, artist, etc) is no longer stripped from audio files - Album art is automatically extracted from audio files - Thumbnail can be manually uploaded for both audio and video attachments @@ -269,120 +481,120 @@ All notable changes to this project will be documented in this file. - And on `PUT /api/v1/media/:id` - ActivityPub representation of media attachments represents custom thumbnails with an `icon` attribute - The Media Attachment entity in REST API now has a `preview_remote_url` to its `preview_url`, equivalent to `remote_url` to its `url` -- **Add color extraction for thumbnails** ([Gargron](https://github.com/tootsuite/mastodon/pull/14209), [ThibG](https://github.com/tootsuite/mastodon/pull/14264)) +- **Add color extraction for thumbnails** ([Gargron](https://github.com/mastodon/mastodon/pull/14209), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14264)) - The `meta` attribute on the Media Attachment entity in REST API can now have a `colors` attribute which in turn contains three hex colors: `background`, `foreground`, and `accent` - The background color is chosen from the most dominant color around the edges of the thumbnail - The foreground and accent colors are chosen from the colors that are the most different from the background color using the CIEDE2000 algorithm - The most satured color of the two is designated as the accent color - The one with the highest W3C contrast is designated as the foreground color - If there are not enough colors in the thumbnail, new ones are generated using a monochrome pattern -- Add a visibility indicator to toots in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14123), [highemerly](https://github.com/tootsuite/mastodon/pull/14292)) -- Add `tootctl email_domain_blocks` ([tateisu](https://github.com/tootsuite/mastodon/pull/13589), [Gargron](https://github.com/tootsuite/mastodon/pull/14147)) -- Add "Add new domain block" to header of federation page in admin UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13934)) -- Add ability to keep emoji picker open with ctrl+click in web UI ([bclindner](https://github.com/tootsuite/mastodon/pull/13896), [noellabo](https://github.com/tootsuite/mastodon/pull/14096)) -- Add custom icon for private boosts in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14380)) -- Add support for Create and Update activities that don't inline objects in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/14359)) -- Add support for Undo activities that don't inline activities in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/14346)) +- Add a visibility indicator to toots in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14123), [highemerly](https://github.com/mastodon/mastodon/pull/14292)) +- Add `tootctl email_domain_blocks` ([tateisu](https://github.com/mastodon/mastodon/pull/13589), [Gargron](https://github.com/mastodon/mastodon/pull/14147)) +- Add "Add new domain block" to header of federation page in admin UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13934)) +- Add ability to keep emoji picker open with ctrl+click in web UI ([bclindner](https://github.com/mastodon/mastodon/pull/13896), [noellabo](https://github.com/mastodon/mastodon/pull/14096)) +- Add custom icon for private boosts in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14380)) +- Add support for Create and Update activities that don't inline objects in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14359)) +- Add support for Undo activities that don't inline activities in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14346)) ### Changed -- Change `.env.production.sample` to be leaner and cleaner ([Gargron](https://github.com/tootsuite/mastodon/pull/14206)) +- Change `.env.production.sample` to be leaner and cleaner ([Gargron](https://github.com/mastodon/mastodon/pull/14206)) - It was overloaded as de-facto documentation and getting quite crowded - Defer to the actual documentation while still giving a minimal example -- Change `tootctl search deploy` to work faster and display progress ([Gargron](https://github.com/tootsuite/mastodon/pull/14300)) -- Change User-Agent of link preview fetching service to include "Bot" ([Gargron](https://github.com/tootsuite/mastodon/pull/14248)) +- Change `tootctl search deploy` to work faster and display progress ([Gargron](https://github.com/mastodon/mastodon/pull/14300)) +- Change User-Agent of link preview fetching service to include "Bot" ([Gargron](https://github.com/mastodon/mastodon/pull/14248)) - Some websites may not render OpenGraph tags into HTML if that's not the case -- Change behaviour to carry blocks over when someone migrates their followers ([ThibG](https://github.com/tootsuite/mastodon/pull/14144)) -- Change volume control and download buttons in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14122)) -- **Change design of audio players in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14095), [ThibG](https://github.com/tootsuite/mastodon/pull/14281), [Gargron](https://github.com/tootsuite/mastodon/pull/14282), [ThibG](https://github.com/tootsuite/mastodon/pull/14118), [Gargron](https://github.com/tootsuite/mastodon/pull/14199), [ThibG](https://github.com/tootsuite/mastodon/pull/14338)) -- Change reply filter to never filter own toots in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14128)) -- Change boost button to no longer serve as visibility indicator in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14132), [ThibG](https://github.com/tootsuite/mastodon/pull/14373)) -- Change contrast of flash messages ([cchoi12](https://github.com/tootsuite/mastodon/pull/13892)) -- Change wording from "Hide media" to "Hide image/images" in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13834)) -- Change appearence of settings pages to be more consistent ([ariasuni](https://github.com/tootsuite/mastodon/pull/13938)) -- Change "Add media" tooltip to not include long list of formats in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13954)) -- Change how badly contrasting emoji are rendered in web UI ([leo60228](https://github.com/tootsuite/mastodon/pull/13773), [ThibG](https://github.com/tootsuite/mastodon/pull/13772), [mfmfuyu](https://github.com/tootsuite/mastodon/pull/14020), [ThibG](https://github.com/tootsuite/mastodon/pull/14015)) -- Change structure of unavailable content section on about page ([ariasuni](https://github.com/tootsuite/mastodon/pull/13930)) -- Change behaviour to accept ActivityPub activities relayed through group actor ([noellabo](https://github.com/tootsuite/mastodon/pull/14279)) -- Change amount of processing retries for ActivityPub activities ([noellabo](https://github.com/tootsuite/mastodon/pull/14355)) +- Change behaviour to carry blocks over when someone migrates their followers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14144)) +- Change volume control and download buttons in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14122)) +- **Change design of audio players in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/14095), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14281), [Gargron](https://github.com/mastodon/mastodon/pull/14282), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14118), [Gargron](https://github.com/mastodon/mastodon/pull/14199), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14338)) +- Change reply filter to never filter own toots in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14128)) +- Change boost button to no longer serve as visibility indicator in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14132), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14373)) +- Change contrast of flash messages ([cchoi12](https://github.com/mastodon/mastodon/pull/13892)) +- Change wording from "Hide media" to "Hide image/images" in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13834)) +- Change appearence of settings pages to be more consistent ([ariasuni](https://github.com/mastodon/mastodon/pull/13938)) +- Change "Add media" tooltip to not include long list of formats in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13954)) +- Change how badly contrasting emoji are rendered in web UI ([leo60228](https://github.com/mastodon/mastodon/pull/13773), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13772), [mfmfuyu](https://github.com/mastodon/mastodon/pull/14020), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14015)) +- Change structure of unavailable content section on about page ([ariasuni](https://github.com/mastodon/mastodon/pull/13930)) +- Change behaviour to accept ActivityPub activities relayed through group actor ([noellabo](https://github.com/mastodon/mastodon/pull/14279)) +- Change amount of processing retries for ActivityPub activities ([noellabo](https://github.com/mastodon/mastodon/pull/14355)) ### Removed -- Remove the terms "blacklist" and "whitelist" from UX ([Gargron](https://github.com/tootsuite/mastodon/pull/14149), [mayaeh](https://github.com/tootsuite/mastodon/pull/14192)) +- Remove the terms "blacklist" and "whitelist" from UX ([Gargron](https://github.com/mastodon/mastodon/pull/14149), [mayaeh](https://github.com/mastodon/mastodon/pull/14192)) - Environment variables changed (old versions continue to work): - `WHITELIST_MODE` → `LIMITED_FEDERATION_MODE` - `EMAIL_DOMAIN_BLACKLIST` → `EMAIL_DOMAIN_DENYLIST` - `EMAIL_DOMAIN_WHITELIST` → `EMAIL_DOMAIN_ALLOWLIST` - CLI option changed: - `tootctl domains purge --whitelist-mode` → `tootctl domains purge --limited-federation-mode` -- Remove some unnecessary database indices ([lfuelling](https://github.com/tootsuite/mastodon/pull/13695), [noellabo](https://github.com/tootsuite/mastodon/pull/14259)) -- Remove unnecessary Node.js version upper bound ([ykzts](https://github.com/tootsuite/mastodon/pull/14139)) +- Remove some unnecessary database indices ([lfuelling](https://github.com/mastodon/mastodon/pull/13695), [noellabo](https://github.com/mastodon/mastodon/pull/14259)) +- Remove unnecessary Node.js version upper bound ([ykzts](https://github.com/mastodon/mastodon/pull/14139)) ### Fixed -- Fix `following` param not working when exact match is found in account search ([noellabo](https://github.com/tootsuite/mastodon/pull/14394)) -- Fix sometimes occuring duplicate mention notifications ([noellabo](https://github.com/tootsuite/mastodon/pull/14378)) -- Fix RSS feeds not being cachable ([ThibG](https://github.com/tootsuite/mastodon/pull/14368)) -- Fix lack of locking around processing of Announce activities in ActivityPub ([noellabo](https://github.com/tootsuite/mastodon/pull/14365)) -- Fix boosted toots from blocked account not being retroactively removed from TL ([ThibG](https://github.com/tootsuite/mastodon/pull/14339)) -- Fix large shortened numbers (like 1.2K) using incorrect pluralization ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14061)) -- Fix streaming server trying to use empty password to connect to Redis when `REDIS_PASSWORD` is given but blank ([ThibG](https://github.com/tootsuite/mastodon/pull/14135)) -- Fix being unable to unboost posts when blocked by their author ([ThibG](https://github.com/tootsuite/mastodon/pull/14308)) -- Fix account domain block not properly unfollowing accounts from domain ([Gargron](https://github.com/tootsuite/mastodon/pull/14304)) -- Fix removing a domain allow wiping known accounts in open federation mode ([ThibG](https://github.com/tootsuite/mastodon/pull/14298)) -- Fix blocks and mutes pagination in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14275)) -- Fix new posts pushing down origin of opened dropdown in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14271), [ThibG](https://github.com/tootsuite/mastodon/pull/14348)) -- Fix timeline markers not being saved sometimes ([ThibG](https://github.com/tootsuite/mastodon/pull/13887), [ThibG](https://github.com/tootsuite/mastodon/pull/13889), [ThibG](https://github.com/tootsuite/mastodon/pull/14155)) -- Fix CSV uploads being rejected ([noellabo](https://github.com/tootsuite/mastodon/pull/13835)) -- Fix incompatibility with ElasticSearch 7.x ([noellabo](https://github.com/tootsuite/mastodon/pull/13828)) -- Fix being able to search posts where you're in the target audience but not actively mentioned ([noellabo](https://github.com/tootsuite/mastodon/pull/13829)) -- Fix non-local posts appearing on local-only hashtag timelines in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/13827)) -- Fix `tootctl media remove-orphans` choking on unknown files in storage ([Gargron](https://github.com/tootsuite/mastodon/pull/13765)) -- Fix `tootctl upgrade storage-schema` misbehaving ([Gargron](https://github.com/tootsuite/mastodon/pull/13761), [angristan](https://github.com/tootsuite/mastodon/pull/13768)) +- Fix `following` param not working when exact match is found in account search ([noellabo](https://github.com/mastodon/mastodon/pull/14394)) +- Fix sometimes occuring duplicate mention notifications ([noellabo](https://github.com/mastodon/mastodon/pull/14378)) +- Fix RSS feeds not being cachable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14368)) +- Fix lack of locking around processing of Announce activities in ActivityPub ([noellabo](https://github.com/mastodon/mastodon/pull/14365)) +- Fix boosted toots from blocked account not being retroactively removed from TL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14339)) +- Fix large shortened numbers (like 1.2K) using incorrect pluralization ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14061)) +- Fix streaming server trying to use empty password to connect to Redis when `REDIS_PASSWORD` is given but blank ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14135)) +- Fix being unable to unboost posts when blocked by their author ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14308)) +- Fix account domain block not properly unfollowing accounts from domain ([Gargron](https://github.com/mastodon/mastodon/pull/14304)) +- Fix removing a domain allow wiping known accounts in open federation mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14298)) +- Fix blocks and mutes pagination in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14275)) +- Fix new posts pushing down origin of opened dropdown in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14271), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14348)) +- Fix timeline markers not being saved sometimes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13887), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13889), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14155)) +- Fix CSV uploads being rejected ([noellabo](https://github.com/mastodon/mastodon/pull/13835)) +- Fix incompatibility with ElasticSearch 7.x ([noellabo](https://github.com/mastodon/mastodon/pull/13828)) +- Fix being able to search posts where you're in the target audience but not actively mentioned ([noellabo](https://github.com/mastodon/mastodon/pull/13829)) +- Fix non-local posts appearing on local-only hashtag timelines in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/13827)) +- Fix `tootctl media remove-orphans` choking on unknown files in storage ([Gargron](https://github.com/mastodon/mastodon/pull/13765)) +- Fix `tootctl upgrade storage-schema` misbehaving ([Gargron](https://github.com/mastodon/mastodon/pull/13761), [angristan](https://github.com/mastodon/mastodon/pull/13768)) - Fix it marking records as upgraded even though no files were moved - Fix it not working with S3 storage - Fix it not working with custom emojis -- Fix GIF reader raising incorrect exceptions ([ThibG](https://github.com/tootsuite/mastodon/pull/13760)) -- Fix hashtag search performing account search as well ([ThibG](https://github.com/tootsuite/mastodon/pull/13758)) -- Fix Webfinger returning wrong status code on malformed or missing param ([ThibG](https://github.com/tootsuite/mastodon/pull/13759)) -- Fix `rake mastodon:setup` error when some environment variables are set ([ThibG](https://github.com/tootsuite/mastodon/pull/13928)) -- Fix admin page crashing when trying to block an invalid domain name in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13884)) -- Fix unsent toot confirmation dialog not popping up in single column mode in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13888)) -- Fix performance of follow import ([noellabo](https://github.com/tootsuite/mastodon/pull/13836)) +- Fix GIF reader raising incorrect exceptions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13760)) +- Fix hashtag search performing account search as well ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13758)) +- Fix Webfinger returning wrong status code on malformed or missing param ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13759)) +- Fix `rake mastodon:setup` error when some environment variables are set ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13928)) +- Fix admin page crashing when trying to block an invalid domain name in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13884)) +- Fix unsent toot confirmation dialog not popping up in single column mode in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13888)) +- Fix performance of follow import ([noellabo](https://github.com/mastodon/mastodon/pull/13836)) - Reduce timeout of Webfinger requests to that of other requests - Use circuit breakers to stop hitting unresponsive servers - Avoid hitting servers that are already known to be generally unavailable -- Fix filters ignoring media descriptions ([BenLubar](https://github.com/tootsuite/mastodon/pull/13837)) -- Fix some actions on custom emojis leading to cryptic errors in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13951)) -- Fix ActivityPub serialization of replies when some of them are URIs ([ThibG](https://github.com/tootsuite/mastodon/pull/13957)) -- Fix `rake mastodon:setup` choking on environment variables containing `%` ([ThibG](https://github.com/tootsuite/mastodon/pull/13940)) -- Fix account redirect confirmation message talking about moved followers ([ThibG](https://github.com/tootsuite/mastodon/pull/13950)) -- Fix avatars having the wrong size on public detailed status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/14140)) -- Fix various issues around OpenGraph representation of media ([Gargron](https://github.com/tootsuite/mastodon/pull/14133)) +- Fix filters ignoring media descriptions ([BenLubar](https://github.com/mastodon/mastodon/pull/13837)) +- Fix some actions on custom emojis leading to cryptic errors in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13951)) +- Fix ActivityPub serialization of replies when some of them are URIs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13957)) +- Fix `rake mastodon:setup` choking on environment variables containing `%` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13940)) +- Fix account redirect confirmation message talking about moved followers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13950)) +- Fix avatars having the wrong size on public detailed status pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14140)) +- Fix various issues around OpenGraph representation of media ([Gargron](https://github.com/mastodon/mastodon/pull/14133)) - Pages containing audio no longer say "Attached: 1 image" in description - Audio attachments now represented as OpenGraph `og:audio` - The `twitter:player` page now uses Mastodon's proper audio/video player - Audio/video buffered bars now display correctly in audio/video player - Volume and progress bars now respond to movement/move smoother -- Fix audio/video/images/cards not reacting to window resizes in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14130)) -- Fix very wide media attachments resulting in too thin a thumbnail in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14127)) -- Fix crash when merging posts into home feed after following someone ([ThibG](https://github.com/tootsuite/mastodon/pull/14129)) -- Fix unique username constraint for local users not being enforced in database ([ThibG](https://github.com/tootsuite/mastodon/pull/14099)) -- Fix unnecessary gap under video modal in web UI ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/14098)) -- Fix 2FA and sign in token pages not respecting user locale ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/14087)) -- Fix unapproved users being able to view profiles when in limited-federation mode *and* requiring approval for sign-ups ([ThibG](https://github.com/tootsuite/mastodon/pull/14093)) -- Fix initial audio volume not corresponding to what's displayed in audio player in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14057)) -- Fix timelines sometimes jumping when closing modals in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14019)) -- Fix memory usage of downloading remote files ([Gargron](https://github.com/tootsuite/mastodon/pull/14184), [Gargron](https://github.com/tootsuite/mastodon/pull/14181), [noellabo](https://github.com/tootsuite/mastodon/pull/14356)) +- Fix audio/video/images/cards not reacting to window resizes in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14130)) +- Fix very wide media attachments resulting in too thin a thumbnail in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14127)) +- Fix crash when merging posts into home feed after following someone ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14129)) +- Fix unique username constraint for local users not being enforced in database ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14099)) +- Fix unnecessary gap under video modal in web UI ([mfmfuyu](https://github.com/mastodon/mastodon/pull/14098)) +- Fix 2FA and sign in token pages not respecting user locale ([mfmfuyu](https://github.com/mastodon/mastodon/pull/14087)) +- Fix unapproved users being able to view profiles when in limited-federation mode *and* requiring approval for sign-ups ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14093)) +- Fix initial audio volume not corresponding to what's displayed in audio player in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14057)) +- Fix timelines sometimes jumping when closing modals in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14019)) +- Fix memory usage of downloading remote files ([Gargron](https://github.com/mastodon/mastodon/pull/14184), [Gargron](https://github.com/mastodon/mastodon/pull/14181), [noellabo](https://github.com/mastodon/mastodon/pull/14356)) - Don't read entire file (up to 40 MB) into memory - Read and write it to temp file in small chunks -- Fix inconsistent account header padding in web UI ([trwnh](https://github.com/tootsuite/mastodon/pull/14179)) -- Fix Thai being skipped from language detection ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13989)) +- Fix inconsistent account header padding in web UI ([trwnh](https://github.com/mastodon/mastodon/pull/14179)) +- Fix Thai being skipped from language detection ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/13989)) - Since Thai has its own alphabet, it can be detected more reliably -- Fix broken hashtag column options styling in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14247)) -- Fix pointer cursor being shown on toots that are not clickable in web UI ([arielrodrigues](https://github.com/tootsuite/mastodon/pull/14185)) -- Fix lock icon not being shown when locking account in profile settings ([ThibG](https://github.com/tootsuite/mastodon/pull/14190)) -- Fix domain blocks doing work the wrong way around ([ThibG](https://github.com/tootsuite/mastodon/pull/13424)) +- Fix broken hashtag column options styling in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14247)) +- Fix pointer cursor being shown on toots that are not clickable in web UI ([arielrodrigues](https://github.com/mastodon/mastodon/pull/14185)) +- Fix lock icon not being shown when locking account in profile settings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14190)) +- Fix domain blocks doing work the wrong way around ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13424)) - Instead of suspending accounts one by one, mark all as suspended first (quick) - Only then proceed to start removing their data (slow) - Clear out media attachments in a separate worker (slow) @@ -390,1301 +602,1301 @@ All notable changes to this project will be documented in this file. ## [3.1.5] - 2020-07-07 ### Security -- Fix media attachment enumeration ([ThibG](https://github.com/tootsuite/mastodon/pull/14254)) -- Change rate limits for various paths ([Gargron](https://github.com/tootsuite/mastodon/pull/14253)) -- Fix other sessions not being logged out on password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14252)) +- Fix media attachment enumeration ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14254)) +- Change rate limits for various paths ([Gargron](https://github.com/mastodon/mastodon/pull/14253)) +- Fix other sessions not being logged out on password change ([Gargron](https://github.com/mastodon/mastodon/pull/14252)) ## [3.1.4] - 2020-05-14 ### Added -- Add `vi` to available locales ([taicv](https://github.com/tootsuite/mastodon/pull/13542)) -- Add ability to remove identity proofs from account ([Gargron](https://github.com/tootsuite/mastodon/pull/13682)) -- Add ability to exclude local content from federated timeline ([noellabo](https://github.com/tootsuite/mastodon/pull/13504), [noellabo](https://github.com/tootsuite/mastodon/pull/13745)) +- Add `vi` to available locales ([taicv](https://github.com/mastodon/mastodon/pull/13542)) +- Add ability to remove identity proofs from account ([Gargron](https://github.com/mastodon/mastodon/pull/13682)) +- Add ability to exclude local content from federated timeline ([noellabo](https://github.com/mastodon/mastodon/pull/13504), [noellabo](https://github.com/mastodon/mastodon/pull/13745)) - Add `remote` param to `GET /api/v1/timelines/public` REST API - Add `public/remote` / `public:remote` variants to streaming API - "Remote only" option in federated timeline column settings in web UI -- Add ability to exclude remote content from hashtag timelines in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/13502)) +- Add ability to exclude remote content from hashtag timelines in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/13502)) - No changes to REST API - "Local only" option in hashtag column settings in web UI -- Add Capistrano tasks that reload the services after deploying ([berkes](https://github.com/tootsuite/mastodon/pull/12642)) -- Add `invites_enabled` attribute to `GET /api/v1/instance` in REST API ([ThibG](https://github.com/tootsuite/mastodon/pull/13501)) -- Add `tootctl emoji export` command ([lfuelling](https://github.com/tootsuite/mastodon/pull/13534)) -- Add separate cache directory for non-local uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/12821), [Hanage999](https://github.com/tootsuite/mastodon/pull/13593), [mayaeh](https://github.com/tootsuite/mastodon/pull/13551)) +- Add Capistrano tasks that reload the services after deploying ([berkes](https://github.com/mastodon/mastodon/pull/12642)) +- Add `invites_enabled` attribute to `GET /api/v1/instance` in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13501)) +- Add `tootctl emoji export` command ([lfuelling](https://github.com/mastodon/mastodon/pull/13534)) +- Add separate cache directory for non-local uploads ([Gargron](https://github.com/mastodon/mastodon/pull/12821), [Hanage999](https://github.com/mastodon/mastodon/pull/13593), [mayaeh](https://github.com/mastodon/mastodon/pull/13551)) - Add `tootctl upgrade storage-schema` command to move old non-local uploads to the cache directory -- Add buttons to delete header and avatar from profile settings ([sternenseemann](https://github.com/tootsuite/mastodon/pull/13234)) -- Add emoji graphics and shortcodes from Twemoji 12.1.5 ([DeeUnderscore](https://github.com/tootsuite/mastodon/pull/13021)) +- Add buttons to delete header and avatar from profile settings ([sternenseemann](https://github.com/mastodon/mastodon/pull/13234)) +- Add emoji graphics and shortcodes from Twemoji 12.1.5 ([DeeUnderscore](https://github.com/mastodon/mastodon/pull/13021)) ### Changed -- Change error message when trying to migrate to an account that does not have current account set as an alias to be more clear ([TheEvilSkeleton](https://github.com/tootsuite/mastodon/pull/13746)) -- Change delivery failure tracking to work with hostnames instead of URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/13437), [noellabo](https://github.com/tootsuite/mastodon/pull/13481), [noellabo](https://github.com/tootsuite/mastodon/pull/13482), [noellabo](https://github.com/tootsuite/mastodon/pull/13535)) -- Change Content-Security-Policy to not need unsafe-inline style-src ([ThibG](https://github.com/tootsuite/mastodon/pull/13679), [ThibG](https://github.com/tootsuite/mastodon/pull/13692), [ThibG](https://github.com/tootsuite/mastodon/pull/13576), [ThibG](https://github.com/tootsuite/mastodon/pull/13575), [ThibG](https://github.com/tootsuite/mastodon/pull/13438)) -- Change how RSS items are titled and formatted ([ThibG](https://github.com/tootsuite/mastodon/pull/13592), [ykzts](https://github.com/tootsuite/mastodon/pull/13591)) +- Change error message when trying to migrate to an account that does not have current account set as an alias to be more clear ([TheEvilSkeleton](https://github.com/mastodon/mastodon/pull/13746)) +- Change delivery failure tracking to work with hostnames instead of URLs ([Gargron](https://github.com/mastodon/mastodon/pull/13437), [noellabo](https://github.com/mastodon/mastodon/pull/13481), [noellabo](https://github.com/mastodon/mastodon/pull/13482), [noellabo](https://github.com/mastodon/mastodon/pull/13535)) +- Change Content-Security-Policy to not need unsafe-inline style-src ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13679), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13692), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13576), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13575), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13438)) +- Change how RSS items are titled and formatted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13592), [ykzts](https://github.com/mastodon/mastodon/pull/13591)) ### Fixed -- Fix dropdown of muted and followed accounts offering option to hide boosts in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13748)) -- Fix "You are already signed in" alert being shown at wrong times ([ThibG](https://github.com/tootsuite/mastodon/pull/13547)) -- Fix retrying of failed-to-download media files not actually working ([noellabo](https://github.com/tootsuite/mastodon/pull/13741)) -- Fix first poll option not being focused when adding a poll in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13740)) -- Fix `sr` locale being selected over `sr-Latn` ([ThibG](https://github.com/tootsuite/mastodon/pull/13693)) -- Fix error within error when limiting backtrace to 3 lines ([Gargron](https://github.com/tootsuite/mastodon/pull/13120)) -- Fix `tootctl media remove-orphans` crashing on "Import" files ([ThibG](https://github.com/tootsuite/mastodon/pull/13685)) -- Fix regression in `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/13405)) -- Fix old unique jobs digests not having been cleaned up ([Gargron](https://github.com/tootsuite/mastodon/pull/13683)) -- Fix own following/followers not showing muted users ([ThibG](https://github.com/tootsuite/mastodon/pull/13614)) -- Fix list of followed people ignoring sorting on Follows & Followers page ([taras2358](https://github.com/tootsuite/mastodon/pull/13676)) -- Fix wrong pgHero Content-Security-Policy when `CDN_HOST` is set ([ThibG](https://github.com/tootsuite/mastodon/pull/13595)) -- Fix needlessly deduplicating usernames on collisions with remote accounts when signing-up through SAML/CAS ([kaiyou](https://github.com/tootsuite/mastodon/pull/13581)) -- Fix page incorrectly scrolling when bringing up dropdown menus in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13574)) -- Fix messed up z-index when NoScript blocks media/previews in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13449)) -- Fix "See what's happening" page showing public instead of local timeline for logged-in users ([ThibG](https://github.com/tootsuite/mastodon/pull/13499)) -- Fix not being able to resolve public resources in development environment ([Gargron](https://github.com/tootsuite/mastodon/pull/13505)) -- Fix uninformative error message when uploading unsupported image files ([ThibG](https://github.com/tootsuite/mastodon/pull/13540)) -- Fix expanded video player issues in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13541), [eai04191](https://github.com/tootsuite/mastodon/pull/13533)) -- Fix and refactor keyboard navigation in dropdown menus in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13528)) -- Fix uploaded image orientation being messed up in some browsers in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13493)) -- Fix actions log crash when displaying updates of deleted announcements in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13489)) -- Fix search not working due to proxy settings when using hidden services ([Gargron](https://github.com/tootsuite/mastodon/pull/13488)) -- Fix poll refresh button not being debounced in web UI ([rasjonell](https://github.com/tootsuite/mastodon/pull/13485), [ThibG](https://github.com/tootsuite/mastodon/pull/13490)) -- Fix confusing error when failing to add an alias to an unknown account ([ThibG](https://github.com/tootsuite/mastodon/pull/13480)) -- Fix "Email changed" notification sometimes having wrong e-mail ([ThibG](https://github.com/tootsuite/mastodon/pull/13475)) -- Fix varioues issues on the account aliases page ([ThibG](https://github.com/tootsuite/mastodon/pull/13452)) -- Fix API footer link in web UI ([bubblineyuri](https://github.com/tootsuite/mastodon/pull/13441)) -- Fix pagination of following, followers, follow requests, blocks and mutes lists in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13445)) -- Fix styling of polls in JS-less fallback on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/13436)) -- Fix trying to delete already deleted file when post-processing ([Gargron](https://github.com/tootsuite/mastodon/pull/13406)) +- Fix dropdown of muted and followed accounts offering option to hide boosts in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13748)) +- Fix "You are already signed in" alert being shown at wrong times ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13547)) +- Fix retrying of failed-to-download media files not actually working ([noellabo](https://github.com/mastodon/mastodon/pull/13741)) +- Fix first poll option not being focused when adding a poll in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13740)) +- Fix `sr` locale being selected over `sr-Latn` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13693)) +- Fix error within error when limiting backtrace to 3 lines ([Gargron](https://github.com/mastodon/mastodon/pull/13120)) +- Fix `tootctl media remove-orphans` crashing on "Import" files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13685)) +- Fix regression in `tootctl media remove-orphans` ([Gargron](https://github.com/mastodon/mastodon/pull/13405)) +- Fix old unique jobs digests not having been cleaned up ([Gargron](https://github.com/mastodon/mastodon/pull/13683)) +- Fix own following/followers not showing muted users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13614)) +- Fix list of followed people ignoring sorting on Follows & Followers page ([taras2358](https://github.com/mastodon/mastodon/pull/13676)) +- Fix wrong pgHero Content-Security-Policy when `CDN_HOST` is set ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13595)) +- Fix needlessly deduplicating usernames on collisions with remote accounts when signing-up through SAML/CAS ([kaiyou](https://github.com/mastodon/mastodon/pull/13581)) +- Fix page incorrectly scrolling when bringing up dropdown menus in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13574)) +- Fix messed up z-index when NoScript blocks media/previews in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13449)) +- Fix "See what's happening" page showing public instead of local timeline for logged-in users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13499)) +- Fix not being able to resolve public resources in development environment ([Gargron](https://github.com/mastodon/mastodon/pull/13505)) +- Fix uninformative error message when uploading unsupported image files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13540)) +- Fix expanded video player issues in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13541), [eai04191](https://github.com/mastodon/mastodon/pull/13533)) +- Fix and refactor keyboard navigation in dropdown menus in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13528)) +- Fix uploaded image orientation being messed up in some browsers in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13493)) +- Fix actions log crash when displaying updates of deleted announcements in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13489)) +- Fix search not working due to proxy settings when using hidden services ([Gargron](https://github.com/mastodon/mastodon/pull/13488)) +- Fix poll refresh button not being debounced in web UI ([rasjonell](https://github.com/mastodon/mastodon/pull/13485), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13490)) +- Fix confusing error when failing to add an alias to an unknown account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13480)) +- Fix "Email changed" notification sometimes having wrong e-mail ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13475)) +- Fix varioues issues on the account aliases page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13452)) +- Fix API footer link in web UI ([bubblineyuri](https://github.com/mastodon/mastodon/pull/13441)) +- Fix pagination of following, followers, follow requests, blocks and mutes lists in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13445)) +- Fix styling of polls in JS-less fallback on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13436)) +- Fix trying to delete already deleted file when post-processing ([Gargron](https://github.com/mastodon/mastodon/pull/13406)) ### Security -- Fix Doorkeeper vulnerability that exposed app secret to users who authorized the app and reset secret of the web UI that could have been exposed ([dependabot-preview[bot]](https://github.com/tootsuite/mastodon/pull/13613), [Gargron](https://github.com/tootsuite/mastodon/pull/13688)) +- Fix Doorkeeper vulnerability that exposed app secret to users who authorized the app and reset secret of the web UI that could have been exposed ([dependabot-preview[bot]](https://github.com/mastodon/mastodon/pull/13613), [Gargron](https://github.com/mastodon/mastodon/pull/13688)) - For apps that self-register on behalf of every individual user (such as most mobile apps), this is a non-issue - The issue only affects developers of apps who are shared between multiple users, such as server-side apps like cross-posters ## [3.1.3] - 2020-04-05 ### Added -- Add ability to filter audit log in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13381)) -- Add titles to warning presets in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13252)) -- Add option to include resolved DNS records when blacklisting e-mail domains in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13254)) -- Add ability to delete files uploaded for settings in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13192)) -- Add sorting by username, creation and last activity in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13076)) -- Add explanation as to why unlocked accounts may have follow requests in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13385)) -- Add link to bookmarks to dropdown in web UI ([mayaeh](https://github.com/tootsuite/mastodon/pull/13273)) -- Add support for links to statuses in announcements to be opened in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13212), [ThibG](https://github.com/tootsuite/mastodon/pull/13250)) -- Add tooltips to audio/video player buttons in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13203)) -- Add submit button to the top of preferences pages ([guigeekz](https://github.com/tootsuite/mastodon/pull/13068)) -- Add specific rate limits for posting, following and reporting ([Gargron](https://github.com/tootsuite/mastodon/pull/13172), [Gargron](https://github.com/tootsuite/mastodon/pull/13390)) +- Add ability to filter audit log in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/13381)) +- Add titles to warning presets in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/13252)) +- Add option to include resolved DNS records when blacklisting e-mail domains in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/13254)) +- Add ability to delete files uploaded for settings in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13192)) +- Add sorting by username, creation and last activity in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13076)) +- Add explanation as to why unlocked accounts may have follow requests in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13385)) +- Add link to bookmarks to dropdown in web UI ([mayaeh](https://github.com/mastodon/mastodon/pull/13273)) +- Add support for links to statuses in announcements to be opened in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13212), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13250)) +- Add tooltips to audio/video player buttons in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13203)) +- Add submit button to the top of preferences pages ([guigeekz](https://github.com/mastodon/mastodon/pull/13068)) +- Add specific rate limits for posting, following and reporting ([Gargron](https://github.com/mastodon/mastodon/pull/13172), [Gargron](https://github.com/mastodon/mastodon/pull/13390)) - 300 posts every 3 hours - 400 follows or follow requests every 24 hours - 400 reports every 24 hours -- Add federation support for the "hide network" preference ([ThibG](https://github.com/tootsuite/mastodon/pull/11673)) -- Add `--skip-media-remove` option to `tootctl statuses remove` ([tateisu](https://github.com/tootsuite/mastodon/pull/13080)) +- Add federation support for the "hide network" preference ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11673)) +- Add `--skip-media-remove` option to `tootctl statuses remove` ([tateisu](https://github.com/mastodon/mastodon/pull/13080)) ### Changed -- **Change design of polls in web UI** ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13257), [ThibG](https://github.com/tootsuite/mastodon/pull/13313)) -- Change status click areas in web UI to be bigger ([ariasuni](https://github.com/tootsuite/mastodon/pull/13327)) -- **Change `tootctl media remove-orphans` to work for all classes** ([Gargron](https://github.com/tootsuite/mastodon/pull/13316)) -- **Change local media attachments to perform heavy processing asynchronously** ([Gargron](https://github.com/tootsuite/mastodon/pull/13210)) -- Change video uploads to always be converted to H264/MP4 ([Gargron](https://github.com/tootsuite/mastodon/pull/13220), [ThibG](https://github.com/tootsuite/mastodon/pull/13239), [ThibG](https://github.com/tootsuite/mastodon/pull/13242)) -- Change video uploads to enforce certain limits ([Gargron](https://github.com/tootsuite/mastodon/pull/13218)) +- **Change design of polls in web UI** ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/13257), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13313)) +- Change status click areas in web UI to be bigger ([ariasuni](https://github.com/mastodon/mastodon/pull/13327)) +- **Change `tootctl media remove-orphans` to work for all classes** ([Gargron](https://github.com/mastodon/mastodon/pull/13316)) +- **Change local media attachments to perform heavy processing asynchronously** ([Gargron](https://github.com/mastodon/mastodon/pull/13210)) +- Change video uploads to always be converted to H264/MP4 ([Gargron](https://github.com/mastodon/mastodon/pull/13220), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13239), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13242)) +- Change video uploads to enforce certain limits ([Gargron](https://github.com/mastodon/mastodon/pull/13218)) - Dimensions smaller than 1920x1200px - Frame rate at most 60fps -- Change the tooltip "Toggle visibility" to "Hide media" in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13199)) -- Change description of privacy levels to be more intuitive in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13197)) -- Change GIF label to be displayed even when autoplay is enabled in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/13209)) -- Change the string "Hide everything from …" to "Block domain …" in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13178), [mayaeh](https://github.com/tootsuite/mastodon/pull/13221)) -- Change wording of media display preferences to be more intuitive ([ariasuni](https://github.com/tootsuite/mastodon/pull/13198)) +- Change the tooltip "Toggle visibility" to "Hide media" in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13199)) +- Change description of privacy levels to be more intuitive in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13197)) +- Change GIF label to be displayed even when autoplay is enabled in web UI ([koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/13209)) +- Change the string "Hide everything from …" to "Block domain …" in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13178), [mayaeh](https://github.com/mastodon/mastodon/pull/13221)) +- Change wording of media display preferences to be more intuitive ([ariasuni](https://github.com/mastodon/mastodon/pull/13198)) ### Deprecated -- `POST /api/v1/media` → `POST /api/v2/media` ([Gargron](https://github.com/tootsuite/mastodon/pull/13210)) +- `POST /api/v1/media` → `POST /api/v2/media` ([Gargron](https://github.com/mastodon/mastodon/pull/13210)) ### Fixed -- Fix `tootctl media remove-orphans` ignoring `PAPERCLIP_ROOT_PATH` ([Gargron](https://github.com/tootsuite/mastodon/pull/13375)) -- Fix returning results when searching for URL with non-zero offset ([Gargron](https://github.com/tootsuite/mastodon/pull/13377)) -- Fix pinning a column in web UI sometimes redirecting out of web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13376)) -- Fix background jobs not using locks like they are supposed to ([Gargron](https://github.com/tootsuite/mastodon/pull/13361)) -- Fix content warning being unnecessarily cleared when hiding content warning input in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13348)) -- Fix "Show more" not switching to "Show less" on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/13174)) -- Fix import overwrite option not being selectable ([noellabo](https://github.com/tootsuite/mastodon/pull/13347)) -- Fix wrong color for ellipsis in boost confirmation dialog in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13355)) -- Fix unnecessary unfollowing when importing follows with overwrite option ([noellabo](https://github.com/tootsuite/mastodon/pull/13350)) -- Fix 404 and 410 API errors being silently discarded in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13279)) -- Fix OCR not working on Safari because of unsupported worker-src CSP ([ThibG](https://github.com/tootsuite/mastodon/pull/13323)) -- Fix media not being marked sensitive when a content warning is set with no text ([ThibG](https://github.com/tootsuite/mastodon/pull/13277)) -- Fix crash after deleting announcements in web UI ([codesections](https://github.com/tootsuite/mastodon/pull/13283), [ThibG](https://github.com/tootsuite/mastodon/pull/13312)) -- Fix bookmarks not being searchable ([Kjwon15](https://github.com/tootsuite/mastodon/pull/13271), [noellabo](https://github.com/tootsuite/mastodon/pull/13293)) -- Fix reported accounts not being whitelisted from further spam checks when resolving a spam check report ([ThibG](https://github.com/tootsuite/mastodon/pull/13289)) -- Fix web UI crash in single-column mode on prehistoric browsers ([ThibG](https://github.com/tootsuite/mastodon/pull/13267)) -- Fix some timeouts when searching for URLs ([ThibG](https://github.com/tootsuite/mastodon/pull/13253)) -- Fix detailed view of direct messages displaying a 0 boost count in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13244)) -- Fix regression in “Edit media” modal in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13243)) -- Fix public posts from silenced accounts not being changed to unlisted visibility ([ThibG](https://github.com/tootsuite/mastodon/pull/13096)) -- Fix error when searching for URLs that contain the mention syntax ([ThibG](https://github.com/tootsuite/mastodon/pull/13151)) -- Fix text area above/right of emoji picker being accidentally clickable in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13148)) -- Fix too large announcements not being scrollable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13211)) -- Fix `tootctl media remove-orphans` crashing when encountering invalid media ([ThibG](https://github.com/tootsuite/mastodon/pull/13170)) -- Fix installation failing when Redis password contains special characters ([ThibG](https://github.com/tootsuite/mastodon/pull/13156)) -- Fix announcements with fully-qualified mentions to local users crashing web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13164)) +- Fix `tootctl media remove-orphans` ignoring `PAPERCLIP_ROOT_PATH` ([Gargron](https://github.com/mastodon/mastodon/pull/13375)) +- Fix returning results when searching for URL with non-zero offset ([Gargron](https://github.com/mastodon/mastodon/pull/13377)) +- Fix pinning a column in web UI sometimes redirecting out of web UI ([Gargron](https://github.com/mastodon/mastodon/pull/13376)) +- Fix background jobs not using locks like they are supposed to ([Gargron](https://github.com/mastodon/mastodon/pull/13361)) +- Fix content warning being unnecessarily cleared when hiding content warning input in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13348)) +- Fix "Show more" not switching to "Show less" on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13174)) +- Fix import overwrite option not being selectable ([noellabo](https://github.com/mastodon/mastodon/pull/13347)) +- Fix wrong color for ellipsis in boost confirmation dialog in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13355)) +- Fix unnecessary unfollowing when importing follows with overwrite option ([noellabo](https://github.com/mastodon/mastodon/pull/13350)) +- Fix 404 and 410 API errors being silently discarded in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13279)) +- Fix OCR not working on Safari because of unsupported worker-src CSP ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13323)) +- Fix media not being marked sensitive when a content warning is set with no text ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13277)) +- Fix crash after deleting announcements in web UI ([codesections](https://github.com/mastodon/mastodon/pull/13283), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13312)) +- Fix bookmarks not being searchable ([Kjwon15](https://github.com/mastodon/mastodon/pull/13271), [noellabo](https://github.com/mastodon/mastodon/pull/13293)) +- Fix reported accounts not being whitelisted from further spam checks when resolving a spam check report ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13289)) +- Fix web UI crash in single-column mode on prehistoric browsers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13267)) +- Fix some timeouts when searching for URLs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13253)) +- Fix detailed view of direct messages displaying a 0 boost count in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13244)) +- Fix regression in “Edit media” modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13243)) +- Fix public posts from silenced accounts not being changed to unlisted visibility ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13096)) +- Fix error when searching for URLs that contain the mention syntax ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13151)) +- Fix text area above/right of emoji picker being accidentally clickable in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13148)) +- Fix too large announcements not being scrollable in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13211)) +- Fix `tootctl media remove-orphans` crashing when encountering invalid media ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13170)) +- Fix installation failing when Redis password contains special characters ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13156)) +- Fix announcements with fully-qualified mentions to local users crashing web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13164)) ### Security -- Fix re-sending of e-mail confirmation not being rate limited ([Gargron](https://github.com/tootsuite/mastodon/pull/13360)) +- Fix re-sending of e-mail confirmation not being rate limited ([Gargron](https://github.com/mastodon/mastodon/pull/13360)) ## [v3.1.2] - 2020-02-27 ### Added -- Add `--reset-password` option to `tootctl accounts modify` ([ThibG](https://github.com/tootsuite/mastodon/pull/13126)) -- Add source-mapped stacktrace to error message in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13082)) +- Add `--reset-password` option to `tootctl accounts modify` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13126)) +- Add source-mapped stacktrace to error message in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13082)) ### Fixed -- Fix dismissing an announcement twice raising an obscure error ([ThibG](https://github.com/tootsuite/mastodon/pull/13124)) -- Fix misleading error when attempting to re-send a pending follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/13133)) -- Fix backups failing when files are missing from media attachments ([ThibG](https://github.com/tootsuite/mastodon/pull/13146)) -- Fix duplicate accounts being created when fetching an account for its key only ([ThibG](https://github.com/tootsuite/mastodon/pull/13147)) -- Fix `/web` redirecting to `/web/web` in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13128)) -- Fix previously OStatus-based accounts not being detected as ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/13129)) -- Fix account JSON/RSS not being cacheable due to wrong mime type comparison ([ThibG](https://github.com/tootsuite/mastodon/pull/13116)) -- Fix old browsers crashing because of missing `finally` polyfill in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13115)) -- Fix account's bio not being shown if there are no proofs/fields in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13075)) -- Fix sign-ups without checked user agreement being accepted through the web form ([ThibG](https://github.com/tootsuite/mastodon/pull/13088)) -- Fix non-x64 architectures not being able to build Docker image because of hardcoded Node.js architecture ([SaraSmiseth](https://github.com/tootsuite/mastodon/pull/13081)) -- Fix invite request input not being shown on sign-up error if left empty ([ThibG](https://github.com/tootsuite/mastodon/pull/13089)) -- Fix some migration hints mentioning GitLab instead of Mastodon ([saper](https://github.com/tootsuite/mastodon/pull/13084)) +- Fix dismissing an announcement twice raising an obscure error ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13124)) +- Fix misleading error when attempting to re-send a pending follow request ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13133)) +- Fix backups failing when files are missing from media attachments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13146)) +- Fix duplicate accounts being created when fetching an account for its key only ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13147)) +- Fix `/web` redirecting to `/web/web` in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13128)) +- Fix previously OStatus-based accounts not being detected as ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13129)) +- Fix account JSON/RSS not being cacheable due to wrong mime type comparison ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13116)) +- Fix old browsers crashing because of missing `finally` polyfill in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13115)) +- Fix account's bio not being shown if there are no proofs/fields in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13075)) +- Fix sign-ups without checked user agreement being accepted through the web form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13088)) +- Fix non-x64 architectures not being able to build Docker image because of hardcoded Node.js architecture ([SaraSmiseth](https://github.com/mastodon/mastodon/pull/13081)) +- Fix invite request input not being shown on sign-up error if left empty ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13089)) +- Fix some migration hints mentioning GitLab instead of Mastodon ([saper](https://github.com/mastodon/mastodon/pull/13084)) ### Security -- Fix leak of arbitrary statuses through unfavourite action in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/13161)) +- Fix leak of arbitrary statuses through unfavourite action in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/13161)) ## [3.1.1] - 2020-02-10 ### Fixed -- Fix yanked dependency preventing installation ([mayaeh](https://github.com/tootsuite/mastodon/pull/13059)) +- Fix yanked dependency preventing installation ([mayaeh](https://github.com/mastodon/mastodon/pull/13059)) ## [3.1.0] - 2020-02-09 ### Added -- Add bookmarks ([ThibG](https://github.com/tootsuite/mastodon/pull/7107), [Gargron](https://github.com/tootsuite/mastodon/pull/12494), [Gomasy](https://github.com/tootsuite/mastodon/pull/12381)) -- Add announcements ([Gargron](https://github.com/tootsuite/mastodon/pull/12662), [Gargron](https://github.com/tootsuite/mastodon/pull/12967), [Gargron](https://github.com/tootsuite/mastodon/pull/12970), [Gargron](https://github.com/tootsuite/mastodon/pull/12963), [Gargron](https://github.com/tootsuite/mastodon/pull/12950), [Gargron](https://github.com/tootsuite/mastodon/pull/12990), [Gargron](https://github.com/tootsuite/mastodon/pull/12949), [Gargron](https://github.com/tootsuite/mastodon/pull/12989), [Gargron](https://github.com/tootsuite/mastodon/pull/12964), [Gargron](https://github.com/tootsuite/mastodon/pull/12965), [ThibG](https://github.com/tootsuite/mastodon/pull/12958), [ThibG](https://github.com/tootsuite/mastodon/pull/12957), [Gargron](https://github.com/tootsuite/mastodon/pull/12955), [ThibG](https://github.com/tootsuite/mastodon/pull/12946), [ThibG](https://github.com/tootsuite/mastodon/pull/12954)) -- Add number animations in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12948), [Gargron](https://github.com/tootsuite/mastodon/pull/12971)) -- Add `kab`, `is`, `kn`, `mr`, `ur` to available locales ([Gargron](https://github.com/tootsuite/mastodon/pull/12882), [BoFFire](https://github.com/tootsuite/mastodon/pull/12962), [Gargron](https://github.com/tootsuite/mastodon/pull/12379)) -- Add profile filter category ([ThibG](https://github.com/tootsuite/mastodon/pull/12918)) -- Add ability to add oneself to lists ([ThibG](https://github.com/tootsuite/mastodon/pull/12271)) -- Add hint how to contribute translations to preferences page ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12736)) -- Add signatures to statuses in archive takeout ([noellabo](https://github.com/tootsuite/mastodon/pull/12649)) -- Add support for `magnet:` and `xmpp` links ([ThibG](https://github.com/tootsuite/mastodon/pull/12905), [ThibG](https://github.com/tootsuite/mastodon/pull/12709)) -- Add `follow_request` notification type ([ThibG](https://github.com/tootsuite/mastodon/pull/12198)) -- Add ability to filter reports by account domain in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12154)) -- Add link to search for users connected from the same IP address to admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12157)) -- Add link to reports targeting a specific domain in admin view ([ThibG](https://github.com/tootsuite/mastodon/pull/12513)) -- Add support for EventSource streaming in web UI ([BenLubar](https://github.com/tootsuite/mastodon/pull/12887)) -- Add hotkey for opening media attachments in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12498), [Kjwon15](https://github.com/tootsuite/mastodon/pull/12546)) -- Add relationship-based options to status dropdowns in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12377), [ThibG](https://github.com/tootsuite/mastodon/pull/12535), [Gargron](https://github.com/tootsuite/mastodon/pull/12430)) -- Add support for submitting media description with `ctrl`+`enter` in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12272)) -- Add download button to audio and video players in web UI ([NimaBoscarino](https://github.com/tootsuite/mastodon/pull/12179)) -- Add setting for whether to crop images in timelines in web UI ([duxovni](https://github.com/tootsuite/mastodon/pull/12126)) -- Add support for `Event` activities ([tcitworld](https://github.com/tootsuite/mastodon/pull/12637)) -- Add basic support for `Group` actors ([noellabo](https://github.com/tootsuite/mastodon/pull/12071)) -- Add `S3_OVERRIDE_PATH_STYLE` environment variable ([Gargron](https://github.com/tootsuite/mastodon/pull/12594)) -- Add `S3_OPEN_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/12459)) -- Add `LDAP_MAIL` environment variable ([madmath03](https://github.com/tootsuite/mastodon/pull/12053)) -- Add `LDAP_UID_CONVERSION_ENABLED` environment variable ([madmath03](https://github.com/tootsuite/mastodon/pull/12461)) -- Add `--remote-only` option to `tootctl emoji purge` ([ThibG](https://github.com/tootsuite/mastodon/pull/12810)) -- Add `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/12568), [Gargron](https://github.com/tootsuite/mastodon/pull/12571)) -- Add `tootctl media lookup` command ([irlcatgirl](https://github.com/tootsuite/mastodon/pull/12283)) -- Add cache for OEmbed endpoints to avoid extra HTTP requests ([Gargron](https://github.com/tootsuite/mastodon/pull/12403)) -- Add support for KaiOS arrow navigation to public pages ([nolanlawson](https://github.com/tootsuite/mastodon/pull/12251)) -- Add `discoverable` to accounts in REST API ([trwnh](https://github.com/tootsuite/mastodon/pull/12508)) -- Add admin setting to disable default follows ([ArisuOngaku](https://github.com/tootsuite/mastodon/pull/12566)) -- Add support for LDAP and PAM in the OAuth password grant strategy ([ntl-purism](https://github.com/tootsuite/mastodon/pull/12390), [Gargron](https://github.com/tootsuite/mastodon/pull/12743)) -- Allow support for `Accept`/`Reject` activities with a non-embedded object ([puckipedia](https://github.com/tootsuite/mastodon/pull/12199)) -- Add "Show thread" button to public profiles ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13000)) +- Add bookmarks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/7107), [Gargron](https://github.com/mastodon/mastodon/pull/12494), [Gomasy](https://github.com/mastodon/mastodon/pull/12381)) +- Add announcements ([Gargron](https://github.com/mastodon/mastodon/pull/12662), [Gargron](https://github.com/mastodon/mastodon/pull/12967), [Gargron](https://github.com/mastodon/mastodon/pull/12970), [Gargron](https://github.com/mastodon/mastodon/pull/12963), [Gargron](https://github.com/mastodon/mastodon/pull/12950), [Gargron](https://github.com/mastodon/mastodon/pull/12990), [Gargron](https://github.com/mastodon/mastodon/pull/12949), [Gargron](https://github.com/mastodon/mastodon/pull/12989), [Gargron](https://github.com/mastodon/mastodon/pull/12964), [Gargron](https://github.com/mastodon/mastodon/pull/12965), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12958), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12957), [Gargron](https://github.com/mastodon/mastodon/pull/12955), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12946), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12954)) +- Add number animations in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12948), [Gargron](https://github.com/mastodon/mastodon/pull/12971)) +- Add `kab`, `is`, `kn`, `mr`, `ur` to available locales ([Gargron](https://github.com/mastodon/mastodon/pull/12882), [BoFFire](https://github.com/mastodon/mastodon/pull/12962), [Gargron](https://github.com/mastodon/mastodon/pull/12379)) +- Add profile filter category ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12918)) +- Add ability to add oneself to lists ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12271)) +- Add hint how to contribute translations to preferences page ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12736)) +- Add signatures to statuses in archive takeout ([noellabo](https://github.com/mastodon/mastodon/pull/12649)) +- Add support for `magnet:` and `xmpp` links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12905), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12709)) +- Add `follow_request` notification type ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12198)) +- Add ability to filter reports by account domain in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12154)) +- Add link to search for users connected from the same IP address to admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12157)) +- Add link to reports targeting a specific domain in admin view ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12513)) +- Add support for EventSource streaming in web UI ([BenLubar](https://github.com/mastodon/mastodon/pull/12887)) +- Add hotkey for opening media attachments in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12498), [Kjwon15](https://github.com/mastodon/mastodon/pull/12546)) +- Add relationship-based options to status dropdowns in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12377), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12535), [Gargron](https://github.com/mastodon/mastodon/pull/12430)) +- Add support for submitting media description with `ctrl`+`enter` in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12272)) +- Add download button to audio and video players in web UI ([NimaBoscarino](https://github.com/mastodon/mastodon/pull/12179)) +- Add setting for whether to crop images in timelines in web UI ([duxovni](https://github.com/mastodon/mastodon/pull/12126)) +- Add support for `Event` activities ([tcitworld](https://github.com/mastodon/mastodon/pull/12637)) +- Add basic support for `Group` actors ([noellabo](https://github.com/mastodon/mastodon/pull/12071)) +- Add `S3_OVERRIDE_PATH_STYLE` environment variable ([Gargron](https://github.com/mastodon/mastodon/pull/12594)) +- Add `S3_OPEN_TIMEOUT` environment variable ([tateisu](https://github.com/mastodon/mastodon/pull/12459)) +- Add `LDAP_MAIL` environment variable ([madmath03](https://github.com/mastodon/mastodon/pull/12053)) +- Add `LDAP_UID_CONVERSION_ENABLED` environment variable ([madmath03](https://github.com/mastodon/mastodon/pull/12461)) +- Add `--remote-only` option to `tootctl emoji purge` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12810)) +- Add `tootctl media remove-orphans` ([Gargron](https://github.com/mastodon/mastodon/pull/12568), [Gargron](https://github.com/mastodon/mastodon/pull/12571)) +- Add `tootctl media lookup` command ([irlcatgirl](https://github.com/mastodon/mastodon/pull/12283)) +- Add cache for OEmbed endpoints to avoid extra HTTP requests ([Gargron](https://github.com/mastodon/mastodon/pull/12403)) +- Add support for KaiOS arrow navigation to public pages ([nolanlawson](https://github.com/mastodon/mastodon/pull/12251)) +- Add `discoverable` to accounts in REST API ([trwnh](https://github.com/mastodon/mastodon/pull/12508)) +- Add admin setting to disable default follows ([ArisuOngaku](https://github.com/mastodon/mastodon/pull/12566)) +- Add support for LDAP and PAM in the OAuth password grant strategy ([ntl-purism](https://github.com/mastodon/mastodon/pull/12390), [Gargron](https://github.com/mastodon/mastodon/pull/12743)) +- Allow support for `Accept`/`Reject` activities with a non-embedded object ([puckipedia](https://github.com/mastodon/mastodon/pull/12199)) +- Add "Show thread" button to public profiles ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/13000)) ### Changed -- Change `last_status_at` to be a date, not datetime in REST API ([ThibG](https://github.com/tootsuite/mastodon/pull/12966)) -- Change followers page to relationships page in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12927), [Gargron](https://github.com/tootsuite/mastodon/pull/12934)) -- Change reported media attachments to always be hidden in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12879), [ThibG](https://github.com/tootsuite/mastodon/pull/12907)) -- Change string from "Disable" to "Disable login" in admin UI ([nileshkumar](https://github.com/tootsuite/mastodon/pull/12201)) -- Change report page structure in admin UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12615)) -- Change swipe sensitivity to be lower on small screens in web UI ([umonaca](https://github.com/tootsuite/mastodon/pull/12168)) -- Change audio/video playback to stop playback when out of view in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12486)) -- Change media description label based on upload type in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12270)) -- Change large numbers to render without decimal units in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/12706)) -- Change "Add a choice" button to be disabled rather than hidden when poll limit reached in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12319), [hinaloe](https://github.com/tootsuite/mastodon/pull/12544)) -- Change `tootctl statuses remove` to keep statuses favourited or bookmarked by local users ([ThibG](https://github.com/tootsuite/mastodon/pull/11267), [Gomasy](https://github.com/tootsuite/mastodon/pull/12818)) -- Change domain block behavior to update user records (fast) before deleting data (slower) ([ThibG](https://github.com/tootsuite/mastodon/pull/12247)) -- Change behaviour to strip audio metadata on uploads ([hugogameiro](https://github.com/tootsuite/mastodon/pull/12171)) -- Change accepted length of remote media descriptions from 420 to 1,500 characters ([ThibG](https://github.com/tootsuite/mastodon/pull/12262)) -- Change preferences pages structure ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12497), [mayaeh](https://github.com/tootsuite/mastodon/pull/12517), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12801), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12797), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12799), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12793)) -- Change format of titles in RSS ([devkral](https://github.com/tootsuite/mastodon/pull/8596)) -- Change favourite icon animation from spring-based motion to CSS animation in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12175)) -- Change minimum required Node.js version to 10, and default to 12 ([Shleeble](https://github.com/tootsuite/mastodon/pull/12791), [mkody](https://github.com/tootsuite/mastodon/pull/12906), [Shleeble](https://github.com/tootsuite/mastodon/pull/12703)) -- Change spam check to exempt server staff ([ThibG](https://github.com/tootsuite/mastodon/pull/12874)) -- Change to fallback to to `Create` audience when `object` has no defined audience ([ThibG](https://github.com/tootsuite/mastodon/pull/12249)) -- Change Twemoji library to 12.1.3 in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/12342)) -- Change blocked users to be hidden from following/followers lists ([ThibG](https://github.com/tootsuite/mastodon/pull/12733)) -- Change signature verification to ignore signatures with invalid host ([Gargron](https://github.com/tootsuite/mastodon/pull/13033)) +- Change `last_status_at` to be a date, not datetime in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12966)) +- Change followers page to relationships page in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12927), [Gargron](https://github.com/mastodon/mastodon/pull/12934)) +- Change reported media attachments to always be hidden in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12879), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12907)) +- Change string from "Disable" to "Disable login" in admin UI ([nileshkumar](https://github.com/mastodon/mastodon/pull/12201)) +- Change report page structure in admin UI ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12615)) +- Change swipe sensitivity to be lower on small screens in web UI ([umonaca](https://github.com/mastodon/mastodon/pull/12168)) +- Change audio/video playback to stop playback when out of view in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12486)) +- Change media description label based on upload type in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12270)) +- Change large numbers to render without decimal units in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/12706)) +- Change "Add a choice" button to be disabled rather than hidden when poll limit reached in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12319), [hinaloe](https://github.com/mastodon/mastodon/pull/12544)) +- Change `tootctl statuses remove` to keep statuses favourited or bookmarked by local users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11267), [Gomasy](https://github.com/mastodon/mastodon/pull/12818)) +- Change domain block behavior to update user records (fast) before deleting data (slower) ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12247)) +- Change behaviour to strip audio metadata on uploads ([hugogameiro](https://github.com/mastodon/mastodon/pull/12171)) +- Change accepted length of remote media descriptions from 420 to 1,500 characters ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12262)) +- Change preferences pages structure ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12497), [mayaeh](https://github.com/mastodon/mastodon/pull/12517), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12801), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12797), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12799), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12793)) +- Change format of titles in RSS ([devkral](https://github.com/mastodon/mastodon/pull/8596)) +- Change favourite icon animation from spring-based motion to CSS animation in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12175)) +- Change minimum required Node.js version to 10, and default to 12 ([Shleeble](https://github.com/mastodon/mastodon/pull/12791), [mkody](https://github.com/mastodon/mastodon/pull/12906), [Shleeble](https://github.com/mastodon/mastodon/pull/12703)) +- Change spam check to exempt server staff ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12874)) +- Change to fallback to to `Create` audience when `object` has no defined audience ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12249)) +- Change Twemoji library to 12.1.3 in web UI ([koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/12342)) +- Change blocked users to be hidden from following/followers lists ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12733)) +- Change signature verification to ignore signatures with invalid host ([Gargron](https://github.com/mastodon/mastodon/pull/13033)) ### Removed -- Remove unused dependencies ([ykzts](https://github.com/tootsuite/mastodon/pull/12861), [mayaeh](https://github.com/tootsuite/mastodon/pull/12826), [ThibG](https://github.com/tootsuite/mastodon/pull/12822), [ykzts](https://github.com/tootsuite/mastodon/pull/12533)) +- Remove unused dependencies ([ykzts](https://github.com/mastodon/mastodon/pull/12861), [mayaeh](https://github.com/mastodon/mastodon/pull/12826), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12822), [ykzts](https://github.com/mastodon/mastodon/pull/12533)) ### Fixed -- Fix some translatable strings being used wrongly ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12569), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12589), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12502), [mayaeh](https://github.com/tootsuite/mastodon/pull/12231)) -- Fix headline of public timeline page when set to local-only ([ykzts](https://github.com/tootsuite/mastodon/pull/12224)) -- Fix space between tabs not being spread evenly in web UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12944), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12961), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12446)) -- Fix interactive delays in database migrations with no TTY ([Gargron](https://github.com/tootsuite/mastodon/pull/12969)) -- Fix status overflowing in report dialog in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12959)) -- Fix unlocalized dropdown button title in web UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12947)) -- Fix media attachments without file being uploadable ([Gargron](https://github.com/tootsuite/mastodon/pull/12562)) -- Fix unfollow confirmations in profile directory in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12922)) -- Fix duplicate `description` meta tag on accounts public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/12923)) -- Fix slow query of federated timeline ([notozeki](https://github.com/tootsuite/mastodon/pull/12886)) -- Fix not all of account's active IPs showing up in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12909), [Gargron](https://github.com/tootsuite/mastodon/pull/12943)) -- Fix search by IP not using alternative browser sessions in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12904)) -- Fix “X new items” not showing up for slow mode on empty timelines in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12875)) -- Fix OEmbed endpoint being inaccessible in secure mode ([Gargron](https://github.com/tootsuite/mastodon/pull/12864)) -- Fix proofs API being inaccessible in secure mode ([Gargron](https://github.com/tootsuite/mastodon/pull/12495)) -- Fix Ruby 2.7 incompatibilities ([ThibG](https://github.com/tootsuite/mastodon/pull/12831), [ThibG](https://github.com/tootsuite/mastodon/pull/12824), [Shleeble](https://github.com/tootsuite/mastodon/pull/12759), [zunda](https://github.com/tootsuite/mastodon/pull/12769)) -- Fix invalid poll votes being accepted in REST API ([ThibG](https://github.com/tootsuite/mastodon/pull/12601)) -- Fix old migrations failing because of strong migrations update ([ThibG](https://github.com/tootsuite/mastodon/pull/12787), [ThibG](https://github.com/tootsuite/mastodon/pull/12692)) -- Fix reuse of detailed status components in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12792)) -- Fix base64-encoded file uploads not being possible in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/12748), [Gargron](https://github.com/tootsuite/mastodon/pull/12857)) -- Fix error due to missing authentication call in filters controller ([Gargron](https://github.com/tootsuite/mastodon/pull/12746)) -- Fix uncaught unknown format error in host meta controller ([Gargron](https://github.com/tootsuite/mastodon/pull/12747)) -- Fix URL search not returning private toots user has access to ([ThibG](https://github.com/tootsuite/mastodon/pull/12742), [ThibG](https://github.com/tootsuite/mastodon/pull/12336)) -- Fix cache digesting log noise on status embeds ([Gargron](https://github.com/tootsuite/mastodon/pull/12750)) -- Fix slowness due to layout thrashing when reloading a large set of statuses in web UI ([panarom](https://github.com/tootsuite/mastodon/pull/12661), [panarom](https://github.com/tootsuite/mastodon/pull/12744), [Gargron](https://github.com/tootsuite/mastodon/pull/12712)) -- Fix error when fetching followers/following from REST API when user has network hidden ([Gargron](https://github.com/tootsuite/mastodon/pull/12716)) -- Fix IDN mentions not being processed, IDN domains not being rendered ([Gargron](https://github.com/tootsuite/mastodon/pull/12715), [Gargron](https://github.com/tootsuite/mastodon/pull/13035), [Gargron](https://github.com/tootsuite/mastodon/pull/13030)) -- Fix error when searching for empty phrase ([Gargron](https://github.com/tootsuite/mastodon/pull/12711)) -- Fix backups stopping due to read timeouts ([chr-1x](https://github.com/tootsuite/mastodon/pull/12281)) -- Fix batch actions on non-pending tags in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12537)) -- Fix sample `SAML_ACS_URL`, `SAML_ISSUER` ([orlea](https://github.com/tootsuite/mastodon/pull/12669)) -- Fix manual scrolling issue on Firefox/Windows in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12648)) -- Fix archive takeout failing if total dump size exceeds 2GB ([scd31](https://github.com/tootsuite/mastodon/pull/12602), [Gargron](https://github.com/tootsuite/mastodon/pull/12653)) -- Fix custom emoji category creation silently erroring out on duplicate category ([ThibG](https://github.com/tootsuite/mastodon/pull/12647)) -- Fix link crawler not specifying preferred content type ([ThibG](https://github.com/tootsuite/mastodon/pull/12646)) -- Fix featured hashtag setting page erroring out instead of rejecting invalid tags ([ThibG](https://github.com/tootsuite/mastodon/pull/12436)) -- Fix tooltip messages of single/multiple-choice polls switcher being reversed in web UI ([acid-chicken](https://github.com/tootsuite/mastodon/pull/12616)) -- Fix typo in help text of `tootctl statuses remove` ([trwnh](https://github.com/tootsuite/mastodon/pull/12603)) -- Fix generic HTTP 500 error on duplicate records ([Gargron](https://github.com/tootsuite/mastodon/pull/12563)) -- Fix old migration failing with new status default scope ([ThibG](https://github.com/tootsuite/mastodon/pull/12493)) -- Fix errors when using search API with no query ([Gargron](https://github.com/tootsuite/mastodon/pull/12541), [trwnh](https://github.com/tootsuite/mastodon/pull/12549)) -- Fix poll options not being selectable via keyboard in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12538)) -- Fix conversations not having an unread indicator in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12506)) -- Fix lost focus when modals open/close in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12437)) -- Fix pending upload count not being decremented on error in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12499)) -- Fix empty poll options not being removed on remote poll update ([ThibG](https://github.com/tootsuite/mastodon/pull/12484)) -- Fix OCR with delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12465)) -- Fix blur behind closed registration message ([ThibG](https://github.com/tootsuite/mastodon/pull/12442)) -- Fix OEmbed discovery not handling different URL variants in query ([Gargron](https://github.com/tootsuite/mastodon/pull/12439)) -- Fix link crawler crashing on `` tags without `href` ([ThibG](https://github.com/tootsuite/mastodon/pull/12159)) -- Fix whitelisted subdomains being ignored in whitelist mode ([noiob](https://github.com/tootsuite/mastodon/pull/12435)) -- Fix broken audit log in whitelist mode in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12303)) -- Fix unread indicator not honoring "Only media" option in local and federated timelines in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12330)) -- Fix error when rebuilding home feeds ([dariusk](https://github.com/tootsuite/mastodon/pull/12324)) -- Fix relationship caches being broken as result of a follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/12299)) -- Fix more items than the limit being uploadable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12300)) -- Fix various issues with account migration ([ThibG](https://github.com/tootsuite/mastodon/pull/12301)) -- Fix filtered out items being counted as pending items in slow mode in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12266)) -- Fix notification filters not applying to poll options ([ThibG](https://github.com/tootsuite/mastodon/pull/12269)) -- Fix notification message for user's own poll saying it's a poll they voted on in web UI ([ykzts](https://github.com/tootsuite/mastodon/pull/12219)) -- Fix polls with an expiration not showing up as expired in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/12222)) -- Fix volume slider having an offset between cursor and slider in Chromium in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12158)) -- Fix Vagrant image not accepting connections ([shrft](https://github.com/tootsuite/mastodon/pull/12180)) -- Fix batch actions being hidden on small screens in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12183)) -- Fix incoming federation not working in whitelist mode ([ThibG](https://github.com/tootsuite/mastodon/pull/12185)) -- Fix error when passing empty `source` param to `PUT /api/v1/accounts/update_credentials` ([jglauche](https://github.com/tootsuite/mastodon/pull/12259)) -- Fix HTTP-based streaming API being cacheable by proxies ([BenLubar](https://github.com/tootsuite/mastodon/pull/12945)) -- Fix users being able to register while `tootctl self-destruct` is in progress ([Kjwon15](https://github.com/tootsuite/mastodon/pull/12877)) -- Fix microformats detection in link crawler not ignoring `h-card` links ([nightpool](https://github.com/tootsuite/mastodon/pull/12189)) -- Fix outline on full-screen video in web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/12176)) -- Fix TLD domain blocks not being editable ([ThibG](https://github.com/tootsuite/mastodon/pull/12805)) -- Fix Nanobox deploy hooks ([danhunsaker](https://github.com/tootsuite/mastodon/pull/12663)) -- Fix needlessly complicated SQL query when performing account search amongst followings ([ThibG](https://github.com/tootsuite/mastodon/pull/12302)) -- Fix favourites count not updating when unfavouriting in web UI ([NimaBoscarino](https://github.com/tootsuite/mastodon/pull/12140)) -- Fix occasional crash on scroll in Chromium in web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/12274)) -- Fix intersection observer not working in single-column mode web UI ([panarom](https://github.com/tootsuite/mastodon/pull/12735)) -- Fix voting issue with remote polls that contain trailing spaces ([ThibG](https://github.com/tootsuite/mastodon/pull/12515)) -- Fix dynamic elements not working in pgHero due to CSP rules ([ykzts](https://github.com/tootsuite/mastodon/pull/12489)) -- Fix overly verbose backtraces when delivering ActivityPub payloads ([zunda](https://github.com/tootsuite/mastodon/pull/12798)) -- Fix rendering `` without `href` when scheme unsupported ([Gargron](https://github.com/tootsuite/mastodon/pull/13040)) -- Fix unfiltered params error when generating ActivityPub tag pagination ([Gargron](https://github.com/tootsuite/mastodon/pull/13049)) -- Fix malformed HTML causing uncaught error ([Gargron](https://github.com/tootsuite/mastodon/pull/13042)) -- Fix native share button not being displayed for unlisted toots ([ThibG](https://github.com/tootsuite/mastodon/pull/13045)) -- Fix remote convertible media attachments (e.g. GIFs) not being saved ([Gargron](https://github.com/tootsuite/mastodon/pull/13032)) -- Fix account query not using faster index ([abcang](https://github.com/tootsuite/mastodon/pull/13016)) -- Fix error when sending moderation notification ([renatolond](https://github.com/tootsuite/mastodon/pull/13014)) +- Fix some translatable strings being used wrongly ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12569), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12589), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12502), [mayaeh](https://github.com/mastodon/mastodon/pull/12231)) +- Fix headline of public timeline page when set to local-only ([ykzts](https://github.com/mastodon/mastodon/pull/12224)) +- Fix space between tabs not being spread evenly in web UI ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12944), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12961), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12446)) +- Fix interactive delays in database migrations with no TTY ([Gargron](https://github.com/mastodon/mastodon/pull/12969)) +- Fix status overflowing in report dialog in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12959)) +- Fix unlocalized dropdown button title in web UI ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12947)) +- Fix media attachments without file being uploadable ([Gargron](https://github.com/mastodon/mastodon/pull/12562)) +- Fix unfollow confirmations in profile directory in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12922)) +- Fix duplicate `description` meta tag on accounts public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12923)) +- Fix slow query of federated timeline ([notozeki](https://github.com/mastodon/mastodon/pull/12886)) +- Fix not all of account's active IPs showing up in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12909), [Gargron](https://github.com/mastodon/mastodon/pull/12943)) +- Fix search by IP not using alternative browser sessions in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12904)) +- Fix “X new items” not showing up for slow mode on empty timelines in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12875)) +- Fix OEmbed endpoint being inaccessible in secure mode ([Gargron](https://github.com/mastodon/mastodon/pull/12864)) +- Fix proofs API being inaccessible in secure mode ([Gargron](https://github.com/mastodon/mastodon/pull/12495)) +- Fix Ruby 2.7 incompatibilities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12831), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12824), [Shleeble](https://github.com/mastodon/mastodon/pull/12759), [zunda](https://github.com/mastodon/mastodon/pull/12769)) +- Fix invalid poll votes being accepted in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12601)) +- Fix old migrations failing because of strong migrations update ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12787), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12692)) +- Fix reuse of detailed status components in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12792)) +- Fix base64-encoded file uploads not being possible in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/12748), [Gargron](https://github.com/mastodon/mastodon/pull/12857)) +- Fix error due to missing authentication call in filters controller ([Gargron](https://github.com/mastodon/mastodon/pull/12746)) +- Fix uncaught unknown format error in host meta controller ([Gargron](https://github.com/mastodon/mastodon/pull/12747)) +- Fix URL search not returning private toots user has access to ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12742), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12336)) +- Fix cache digesting log noise on status embeds ([Gargron](https://github.com/mastodon/mastodon/pull/12750)) +- Fix slowness due to layout thrashing when reloading a large set of statuses in web UI ([panarom](https://github.com/mastodon/mastodon/pull/12661), [panarom](https://github.com/mastodon/mastodon/pull/12744), [Gargron](https://github.com/mastodon/mastodon/pull/12712)) +- Fix error when fetching followers/following from REST API when user has network hidden ([Gargron](https://github.com/mastodon/mastodon/pull/12716)) +- Fix IDN mentions not being processed, IDN domains not being rendered ([Gargron](https://github.com/mastodon/mastodon/pull/12715), [Gargron](https://github.com/mastodon/mastodon/pull/13035), [Gargron](https://github.com/mastodon/mastodon/pull/13030)) +- Fix error when searching for empty phrase ([Gargron](https://github.com/mastodon/mastodon/pull/12711)) +- Fix backups stopping due to read timeouts ([chr-1x](https://github.com/mastodon/mastodon/pull/12281)) +- Fix batch actions on non-pending tags in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12537)) +- Fix sample `SAML_ACS_URL`, `SAML_ISSUER` ([orlea](https://github.com/mastodon/mastodon/pull/12669)) +- Fix manual scrolling issue on Firefox/Windows in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12648)) +- Fix archive takeout failing if total dump size exceeds 2GB ([scd31](https://github.com/mastodon/mastodon/pull/12602), [Gargron](https://github.com/mastodon/mastodon/pull/12653)) +- Fix custom emoji category creation silently erroring out on duplicate category ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12647)) +- Fix link crawler not specifying preferred content type ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12646)) +- Fix featured hashtag setting page erroring out instead of rejecting invalid tags ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12436)) +- Fix tooltip messages of single/multiple-choice polls switcher being reversed in web UI ([acid-chicken](https://github.com/mastodon/mastodon/pull/12616)) +- Fix typo in help text of `tootctl statuses remove` ([trwnh](https://github.com/mastodon/mastodon/pull/12603)) +- Fix generic HTTP 500 error on duplicate records ([Gargron](https://github.com/mastodon/mastodon/pull/12563)) +- Fix old migration failing with new status default scope ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12493)) +- Fix errors when using search API with no query ([Gargron](https://github.com/mastodon/mastodon/pull/12541), [trwnh](https://github.com/mastodon/mastodon/pull/12549)) +- Fix poll options not being selectable via keyboard in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12538)) +- Fix conversations not having an unread indicator in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12506)) +- Fix lost focus when modals open/close in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12437)) +- Fix pending upload count not being decremented on error in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12499)) +- Fix empty poll options not being removed on remote poll update ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12484)) +- Fix OCR with delete & redraft in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12465)) +- Fix blur behind closed registration message ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12442)) +- Fix OEmbed discovery not handling different URL variants in query ([Gargron](https://github.com/mastodon/mastodon/pull/12439)) +- Fix link crawler crashing on `` tags without `href` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12159)) +- Fix whitelisted subdomains being ignored in whitelist mode ([noiob](https://github.com/mastodon/mastodon/pull/12435)) +- Fix broken audit log in whitelist mode in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12303)) +- Fix unread indicator not honoring "Only media" option in local and federated timelines in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12330)) +- Fix error when rebuilding home feeds ([dariusk](https://github.com/mastodon/mastodon/pull/12324)) +- Fix relationship caches being broken as result of a follow request ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12299)) +- Fix more items than the limit being uploadable in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12300)) +- Fix various issues with account migration ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12301)) +- Fix filtered out items being counted as pending items in slow mode in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12266)) +- Fix notification filters not applying to poll options ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12269)) +- Fix notification message for user's own poll saying it's a poll they voted on in web UI ([ykzts](https://github.com/mastodon/mastodon/pull/12219)) +- Fix polls with an expiration not showing up as expired in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/12222)) +- Fix volume slider having an offset between cursor and slider in Chromium in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12158)) +- Fix Vagrant image not accepting connections ([shrft](https://github.com/mastodon/mastodon/pull/12180)) +- Fix batch actions being hidden on small screens in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12183)) +- Fix incoming federation not working in whitelist mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12185)) +- Fix error when passing empty `source` param to `PUT /api/v1/accounts/update_credentials` ([jglauche](https://github.com/mastodon/mastodon/pull/12259)) +- Fix HTTP-based streaming API being cacheable by proxies ([BenLubar](https://github.com/mastodon/mastodon/pull/12945)) +- Fix users being able to register while `tootctl self-destruct` is in progress ([Kjwon15](https://github.com/mastodon/mastodon/pull/12877)) +- Fix microformats detection in link crawler not ignoring `h-card` links ([nightpool](https://github.com/mastodon/mastodon/pull/12189)) +- Fix outline on full-screen video in web UI ([hinaloe](https://github.com/mastodon/mastodon/pull/12176)) +- Fix TLD domain blocks not being editable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12805)) +- Fix Nanobox deploy hooks ([danhunsaker](https://github.com/mastodon/mastodon/pull/12663)) +- Fix needlessly complicated SQL query when performing account search amongst followings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12302)) +- Fix favourites count not updating when unfavouriting in web UI ([NimaBoscarino](https://github.com/mastodon/mastodon/pull/12140)) +- Fix occasional crash on scroll in Chromium in web UI ([hinaloe](https://github.com/mastodon/mastodon/pull/12274)) +- Fix intersection observer not working in single-column mode web UI ([panarom](https://github.com/mastodon/mastodon/pull/12735)) +- Fix voting issue with remote polls that contain trailing spaces ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12515)) +- Fix dynamic elements not working in pgHero due to CSP rules ([ykzts](https://github.com/mastodon/mastodon/pull/12489)) +- Fix overly verbose backtraces when delivering ActivityPub payloads ([zunda](https://github.com/mastodon/mastodon/pull/12798)) +- Fix rendering `` without `href` when scheme unsupported ([Gargron](https://github.com/mastodon/mastodon/pull/13040)) +- Fix unfiltered params error when generating ActivityPub tag pagination ([Gargron](https://github.com/mastodon/mastodon/pull/13049)) +- Fix malformed HTML causing uncaught error ([Gargron](https://github.com/mastodon/mastodon/pull/13042)) +- Fix native share button not being displayed for unlisted toots ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13045)) +- Fix remote convertible media attachments (e.g. GIFs) not being saved ([Gargron](https://github.com/mastodon/mastodon/pull/13032)) +- Fix account query not using faster index ([abcang](https://github.com/mastodon/mastodon/pull/13016)) +- Fix error when sending moderation notification ([renatolond](https://github.com/mastodon/mastodon/pull/13014)) ### Security -- Fix OEmbed leaking information about existence of non-public statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/12930)) -- Fix password change/reset not immediately invalidating other sessions ([Gargron](https://github.com/tootsuite/mastodon/pull/12928)) -- Fix settings pages being cacheable by the browser ([Gargron](https://github.com/tootsuite/mastodon/pull/12714)) +- Fix OEmbed leaking information about existence of non-public statuses ([Gargron](https://github.com/mastodon/mastodon/pull/12930)) +- Fix password change/reset not immediately invalidating other sessions ([Gargron](https://github.com/mastodon/mastodon/pull/12928)) +- Fix settings pages being cacheable by the browser ([Gargron](https://github.com/mastodon/mastodon/pull/12714)) ## [3.0.1] - 2019-10-10 ### Added -- Add `tootctl media usage` command ([Gargron](https://github.com/tootsuite/mastodon/pull/12115)) -- Add admin setting to auto-approve trending hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/12122), [Gargron](https://github.com/tootsuite/mastodon/pull/12130)) +- Add `tootctl media usage` command ([Gargron](https://github.com/mastodon/mastodon/pull/12115)) +- Add admin setting to auto-approve trending hashtags ([Gargron](https://github.com/mastodon/mastodon/pull/12122), [Gargron](https://github.com/mastodon/mastodon/pull/12130)) ### Changed -- Change `tootctl media refresh` to skip already downloaded attachments ([Gargron](https://github.com/tootsuite/mastodon/pull/12118)) +- Change `tootctl media refresh` to skip already downloaded attachments ([Gargron](https://github.com/mastodon/mastodon/pull/12118)) ### Removed -- Remove auto-silence behaviour from spam check ([Gargron](https://github.com/tootsuite/mastodon/pull/12117)) -- Remove HTML `lang` attribute from individual statuses in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12124)) -- Remove fallback to long description on sidebar and meta description ([Gargron](https://github.com/tootsuite/mastodon/pull/12119)) +- Remove auto-silence behaviour from spam check ([Gargron](https://github.com/mastodon/mastodon/pull/12117)) +- Remove HTML `lang` attribute from individual statuses in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12124)) +- Remove fallback to long description on sidebar and meta description ([Gargron](https://github.com/mastodon/mastodon/pull/12119)) ### Fixed -- Fix preloaded JSON-LD context for identity not being used ([Gargron](https://github.com/tootsuite/mastodon/pull/12138)) -- Fix media editing modal changing dimensions once the image loads ([Gargron](https://github.com/tootsuite/mastodon/pull/12131)) -- Fix not showing whether a custom emoji has a local counterpart in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12135)) -- Fix attachment not being re-downloaded even if file is not stored ([Gargron](https://github.com/tootsuite/mastodon/pull/12125)) -- Fix old migration trying to use new column due to default status scope ([Gargron](https://github.com/tootsuite/mastodon/pull/12095)) -- Fix column back button missing for not found accounts ([trwnh](https://github.com/tootsuite/mastodon/pull/12094)) -- Fix issues with tootctl's parallelization and progress reporting ([Gargron](https://github.com/tootsuite/mastodon/pull/12093), [Gargron](https://github.com/tootsuite/mastodon/pull/12097)) -- Fix existing user records with now-renamed `pt` locale ([Gargron](https://github.com/tootsuite/mastodon/pull/12092)) -- Fix hashtag timeline REST API accepting too many hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/12091)) -- Fix `GET /api/v1/instance` REST APIs being unavailable in secure mode ([Gargron](https://github.com/tootsuite/mastodon/pull/12089)) -- Fix performance of home feed regeneration and merging ([Gargron](https://github.com/tootsuite/mastodon/pull/12084)) -- Fix ffmpeg performance issues due to stdout buffer overflow ([hugogameiro](https://github.com/tootsuite/mastodon/pull/12088)) -- Fix S3 adapter retrying failing uploads with exponential backoff ([Gargron](https://github.com/tootsuite/mastodon/pull/12085)) -- Fix `tootctl accounts cull` advertising unused option flag ([Kjwon15](https://github.com/tootsuite/mastodon/pull/12074)) +- Fix preloaded JSON-LD context for identity not being used ([Gargron](https://github.com/mastodon/mastodon/pull/12138)) +- Fix media editing modal changing dimensions once the image loads ([Gargron](https://github.com/mastodon/mastodon/pull/12131)) +- Fix not showing whether a custom emoji has a local counterpart in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12135)) +- Fix attachment not being re-downloaded even if file is not stored ([Gargron](https://github.com/mastodon/mastodon/pull/12125)) +- Fix old migration trying to use new column due to default status scope ([Gargron](https://github.com/mastodon/mastodon/pull/12095)) +- Fix column back button missing for not found accounts ([trwnh](https://github.com/mastodon/mastodon/pull/12094)) +- Fix issues with tootctl's parallelization and progress reporting ([Gargron](https://github.com/mastodon/mastodon/pull/12093), [Gargron](https://github.com/mastodon/mastodon/pull/12097)) +- Fix existing user records with now-renamed `pt` locale ([Gargron](https://github.com/mastodon/mastodon/pull/12092)) +- Fix hashtag timeline REST API accepting too many hashtags ([Gargron](https://github.com/mastodon/mastodon/pull/12091)) +- Fix `GET /api/v1/instance` REST APIs being unavailable in secure mode ([Gargron](https://github.com/mastodon/mastodon/pull/12089)) +- Fix performance of home feed regeneration and merging ([Gargron](https://github.com/mastodon/mastodon/pull/12084)) +- Fix ffmpeg performance issues due to stdout buffer overflow ([hugogameiro](https://github.com/mastodon/mastodon/pull/12088)) +- Fix S3 adapter retrying failing uploads with exponential backoff ([Gargron](https://github.com/mastodon/mastodon/pull/12085)) +- Fix `tootctl accounts cull` advertising unused option flag ([Kjwon15](https://github.com/mastodon/mastodon/pull/12074)) ## [3.0.0] - 2019-10-03 ### Added -- Add "not available" label to unloaded media attachments in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11715), [Gargron](https://github.com/tootsuite/mastodon/pull/11745)) -- **Add profile directory to web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11688), [mayaeh](https://github.com/tootsuite/mastodon/pull/11872)) +- Add "not available" label to unloaded media attachments in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11715), [Gargron](https://github.com/mastodon/mastodon/pull/11745)) +- **Add profile directory to web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11688), [mayaeh](https://github.com/mastodon/mastodon/pull/11872)) - Add profile directory opt-in federation - Add profile directory REST API -- Add special alert for throttled requests in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11677)) -- Add confirmation modal when logging out from the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11671)) -- **Add audio player in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11644), [Gargron](https://github.com/tootsuite/mastodon/pull/11652), [Gargron](https://github.com/tootsuite/mastodon/pull/11654), [ThibG](https://github.com/tootsuite/mastodon/pull/11629), [Gargron](https://github.com/tootsuite/mastodon/pull/12056)) -- **Add autosuggestions for hashtags in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11422), [ThibG](https://github.com/tootsuite/mastodon/pull/11632), [Gargron](https://github.com/tootsuite/mastodon/pull/11764), [Gargron](https://github.com/tootsuite/mastodon/pull/11588), [Gargron](https://github.com/tootsuite/mastodon/pull/11442)) -- **Add media editing modal with OCR tool in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11563), [Gargron](https://github.com/tootsuite/mastodon/pull/11566), [ThibG](https://github.com/tootsuite/mastodon/pull/11575), [ThibG](https://github.com/tootsuite/mastodon/pull/11576), [Gargron](https://github.com/tootsuite/mastodon/pull/11577), [Gargron](https://github.com/tootsuite/mastodon/pull/11573), [Gargron](https://github.com/tootsuite/mastodon/pull/11571)) -- Add indicator of unread notifications to window title when web UI is out of focus ([Gargron](https://github.com/tootsuite/mastodon/pull/11560), [Gargron](https://github.com/tootsuite/mastodon/pull/11572)) -- Add indicator for which options you voted for in a poll in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11195)) -- **Add search results pagination to web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11409), [ThibG](https://github.com/tootsuite/mastodon/pull/11447)) -- **Add option to disable real-time updates in web UI ("slow mode")** ([Gargron](https://github.com/tootsuite/mastodon/pull/9984), [ykzts](https://github.com/tootsuite/mastodon/pull/11880), [ThibG](https://github.com/tootsuite/mastodon/pull/11883), [Gargron](https://github.com/tootsuite/mastodon/pull/11898), [ThibG](https://github.com/tootsuite/mastodon/pull/11859)) -- Add option to disable blurhash previews in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11188)) -- Add native smooth scrolling when supported in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11207)) -- Add scrolling to the search bar on focus in web UI ([Kjwon15](https://github.com/tootsuite/mastodon/pull/12032)) -- Add refresh button to list of rebloggers/favouriters in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12031)) -- Add error description and button to copy stack trace to web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12033)) -- Add search and sort functions to hashtag admin UI ([mayaeh](https://github.com/tootsuite/mastodon/pull/11829), [Gargron](https://github.com/tootsuite/mastodon/pull/11897), [mayaeh](https://github.com/tootsuite/mastodon/pull/11875)) -- Add setting for default search engine indexing in admin UI ([brortao](https://github.com/tootsuite/mastodon/pull/11804)) -- Add account bio to account view in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11473)) -- **Add option to include reported statuses in warning e-mail from admin UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11639), [Gargron](https://github.com/tootsuite/mastodon/pull/11812), [Gargron](https://github.com/tootsuite/mastodon/pull/11741), [Gargron](https://github.com/tootsuite/mastodon/pull/11698), [mayaeh](https://github.com/tootsuite/mastodon/pull/11765)) -- Add number of pending accounts and pending hashtags to dashboard in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11514)) -- **Add account migration UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11846), [noellabo](https://github.com/tootsuite/mastodon/pull/11905), [noellabo](https://github.com/tootsuite/mastodon/pull/11907), [noellabo](https://github.com/tootsuite/mastodon/pull/11906), [noellabo](https://github.com/tootsuite/mastodon/pull/11902)) -- **Add table of contents to about page** ([Gargron](https://github.com/tootsuite/mastodon/pull/11885), [ykzts](https://github.com/tootsuite/mastodon/pull/11941), [ykzts](https://github.com/tootsuite/mastodon/pull/11895), [Kjwon15](https://github.com/tootsuite/mastodon/pull/11916)) -- **Add password challenge to 2FA settings, e-mail notifications** ([Gargron](https://github.com/tootsuite/mastodon/pull/11878)) -- **Add optional public list of domain blocks with comments** ([ThibG](https://github.com/tootsuite/mastodon/pull/11298), [ThibG](https://github.com/tootsuite/mastodon/pull/11515), [Gargron](https://github.com/tootsuite/mastodon/pull/11908)) -- Add an RSS feed for featured hashtags ([noellabo](https://github.com/tootsuite/mastodon/pull/10502)) -- Add explanations to featured hashtags UI and profile ([Gargron](https://github.com/tootsuite/mastodon/pull/11586)) -- **Add hashtag trends with admin and user settings** ([Gargron](https://github.com/tootsuite/mastodon/pull/11490), [Gargron](https://github.com/tootsuite/mastodon/pull/11502), [Gargron](https://github.com/tootsuite/mastodon/pull/11641), [Gargron](https://github.com/tootsuite/mastodon/pull/11594), [Gargron](https://github.com/tootsuite/mastodon/pull/11517), [mayaeh](https://github.com/tootsuite/mastodon/pull/11845), [Gargron](https://github.com/tootsuite/mastodon/pull/11774), [Gargron](https://github.com/tootsuite/mastodon/pull/11712), [Gargron](https://github.com/tootsuite/mastodon/pull/11791), [Gargron](https://github.com/tootsuite/mastodon/pull/11743), [Gargron](https://github.com/tootsuite/mastodon/pull/11740), [Gargron](https://github.com/tootsuite/mastodon/pull/11714), [ThibG](https://github.com/tootsuite/mastodon/pull/11631), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/11569), [Gargron](https://github.com/tootsuite/mastodon/pull/11524), [Gargron](https://github.com/tootsuite/mastodon/pull/11513)) +- Add special alert for throttled requests in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11677)) +- Add confirmation modal when logging out from the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11671)) +- **Add audio player in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11644), [Gargron](https://github.com/mastodon/mastodon/pull/11652), [Gargron](https://github.com/mastodon/mastodon/pull/11654), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11629), [Gargron](https://github.com/mastodon/mastodon/pull/12056)) +- **Add autosuggestions for hashtags in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11422), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11632), [Gargron](https://github.com/mastodon/mastodon/pull/11764), [Gargron](https://github.com/mastodon/mastodon/pull/11588), [Gargron](https://github.com/mastodon/mastodon/pull/11442)) +- **Add media editing modal with OCR tool in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11563), [Gargron](https://github.com/mastodon/mastodon/pull/11566), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11575), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11576), [Gargron](https://github.com/mastodon/mastodon/pull/11577), [Gargron](https://github.com/mastodon/mastodon/pull/11573), [Gargron](https://github.com/mastodon/mastodon/pull/11571)) +- Add indicator of unread notifications to window title when web UI is out of focus ([Gargron](https://github.com/mastodon/mastodon/pull/11560), [Gargron](https://github.com/mastodon/mastodon/pull/11572)) +- Add indicator for which options you voted for in a poll in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11195)) +- **Add search results pagination to web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11447)) +- **Add option to disable real-time updates in web UI ("slow mode")** ([Gargron](https://github.com/mastodon/mastodon/pull/9984), [ykzts](https://github.com/mastodon/mastodon/pull/11880), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11883), [Gargron](https://github.com/mastodon/mastodon/pull/11898), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11859)) +- Add option to disable blurhash previews in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11188)) +- Add native smooth scrolling when supported in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11207)) +- Add scrolling to the search bar on focus in web UI ([Kjwon15](https://github.com/mastodon/mastodon/pull/12032)) +- Add refresh button to list of rebloggers/favouriters in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12031)) +- Add error description and button to copy stack trace to web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12033)) +- Add search and sort functions to hashtag admin UI ([mayaeh](https://github.com/mastodon/mastodon/pull/11829), [Gargron](https://github.com/mastodon/mastodon/pull/11897), [mayaeh](https://github.com/mastodon/mastodon/pull/11875)) +- Add setting for default search engine indexing in admin UI ([brortao](https://github.com/mastodon/mastodon/pull/11804)) +- Add account bio to account view in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11473)) +- **Add option to include reported statuses in warning e-mail from admin UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11639), [Gargron](https://github.com/mastodon/mastodon/pull/11812), [Gargron](https://github.com/mastodon/mastodon/pull/11741), [Gargron](https://github.com/mastodon/mastodon/pull/11698), [mayaeh](https://github.com/mastodon/mastodon/pull/11765)) +- Add number of pending accounts and pending hashtags to dashboard in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/11514)) +- **Add account migration UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11846), [noellabo](https://github.com/mastodon/mastodon/pull/11905), [noellabo](https://github.com/mastodon/mastodon/pull/11907), [noellabo](https://github.com/mastodon/mastodon/pull/11906), [noellabo](https://github.com/mastodon/mastodon/pull/11902)) +- **Add table of contents to about page** ([Gargron](https://github.com/mastodon/mastodon/pull/11885), [ykzts](https://github.com/mastodon/mastodon/pull/11941), [ykzts](https://github.com/mastodon/mastodon/pull/11895), [Kjwon15](https://github.com/mastodon/mastodon/pull/11916)) +- **Add password challenge to 2FA settings, e-mail notifications** ([Gargron](https://github.com/mastodon/mastodon/pull/11878)) +- **Add optional public list of domain blocks with comments** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11298), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11515), [Gargron](https://github.com/mastodon/mastodon/pull/11908)) +- Add an RSS feed for featured hashtags ([noellabo](https://github.com/mastodon/mastodon/pull/10502)) +- Add explanations to featured hashtags UI and profile ([Gargron](https://github.com/mastodon/mastodon/pull/11586)) +- **Add hashtag trends with admin and user settings** ([Gargron](https://github.com/mastodon/mastodon/pull/11490), [Gargron](https://github.com/mastodon/mastodon/pull/11502), [Gargron](https://github.com/mastodon/mastodon/pull/11641), [Gargron](https://github.com/mastodon/mastodon/pull/11594), [Gargron](https://github.com/mastodon/mastodon/pull/11517), [mayaeh](https://github.com/mastodon/mastodon/pull/11845), [Gargron](https://github.com/mastodon/mastodon/pull/11774), [Gargron](https://github.com/mastodon/mastodon/pull/11712), [Gargron](https://github.com/mastodon/mastodon/pull/11791), [Gargron](https://github.com/mastodon/mastodon/pull/11743), [Gargron](https://github.com/mastodon/mastodon/pull/11740), [Gargron](https://github.com/mastodon/mastodon/pull/11714), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11631), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/11569), [Gargron](https://github.com/mastodon/mastodon/pull/11524), [Gargron](https://github.com/mastodon/mastodon/pull/11513)) - Add hashtag usage breakdown to admin UI - Add batch actions for hashtags to admin UI - Add trends to web UI - Add trends to public pages - Add user preference to hide trends - Add admin setting to disable trends -- **Add categories for custom emojis** ([Gargron](https://github.com/tootsuite/mastodon/pull/11196), [Gargron](https://github.com/tootsuite/mastodon/pull/11793), [Gargron](https://github.com/tootsuite/mastodon/pull/11920), [highemerly](https://github.com/tootsuite/mastodon/pull/11876)) +- **Add categories for custom emojis** ([Gargron](https://github.com/mastodon/mastodon/pull/11196), [Gargron](https://github.com/mastodon/mastodon/pull/11793), [Gargron](https://github.com/mastodon/mastodon/pull/11920), [highemerly](https://github.com/mastodon/mastodon/pull/11876)) - Add custom emoji categories to emoji picker in web UI - Add `category` to custom emojis in REST API - Add batch actions for custom emojis in admin UI -- Add max image dimensions to error message ([raboof](https://github.com/tootsuite/mastodon/pull/11552)) -- Add aac, m4a, 3gp, amr, wma to allowed audio formats ([Gargron](https://github.com/tootsuite/mastodon/pull/11342), [umonaca](https://github.com/tootsuite/mastodon/pull/11687)) -- **Add search syntax for operators and phrases** ([Gargron](https://github.com/tootsuite/mastodon/pull/11411)) -- **Add REST API for managing featured hashtags** ([noellabo](https://github.com/tootsuite/mastodon/pull/11778)) -- **Add REST API for managing timeline read markers** ([Gargron](https://github.com/tootsuite/mastodon/pull/11762)) -- Add `exclude_unreviewed` param to `GET /api/v2/search` REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11977)) -- Add `reason` param to `POST /api/v1/accounts` REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/12064)) -- **Add ActivityPub secure mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11269), [ThibG](https://github.com/tootsuite/mastodon/pull/11332), [ThibG](https://github.com/tootsuite/mastodon/pull/11295)) -- Add HTTP signatures to all outgoing ActivityPub GET requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11284), [ThibG](https://github.com/tootsuite/mastodon/pull/11300)) -- Add support for ActivityPub Audio activities ([ThibG](https://github.com/tootsuite/mastodon/pull/11189)) -- Add ActivityPub actor representing the entire server ([ThibG](https://github.com/tootsuite/mastodon/pull/11321), [rtucker](https://github.com/tootsuite/mastodon/pull/11400), [ThibG](https://github.com/tootsuite/mastodon/pull/11561), [Gargron](https://github.com/tootsuite/mastodon/pull/11798)) -- **Add whitelist mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11291), [mayaeh](https://github.com/tootsuite/mastodon/pull/11634)) -- Add config of multipart threshold for S3 ([ykzts](https://github.com/tootsuite/mastodon/pull/11924), [ykzts](https://github.com/tootsuite/mastodon/pull/11944)) -- Add health check endpoint for web ([ykzts](https://github.com/tootsuite/mastodon/pull/11770), [ykzts](https://github.com/tootsuite/mastodon/pull/11947)) -- Add HTTP signature keyId to request log ([Gargron](https://github.com/tootsuite/mastodon/pull/11591)) -- Add `SMTP_REPLY_TO` environment variable ([hugogameiro](https://github.com/tootsuite/mastodon/pull/11718)) -- Add `tootctl preview_cards remove` command ([mayaeh](https://github.com/tootsuite/mastodon/pull/11320)) -- Add `tootctl media refresh` command ([Gargron](https://github.com/tootsuite/mastodon/pull/11775)) -- Add `tootctl cache recount` command ([Gargron](https://github.com/tootsuite/mastodon/pull/11597)) -- Add option to exclude suspended domains from `tootctl domains crawl` ([dariusk](https://github.com/tootsuite/mastodon/pull/11454)) -- Add parallelization to `tootctl search deploy` ([noellabo](https://github.com/tootsuite/mastodon/pull/12051)) -- Add soft delete for statuses for instant deletes through API ([Gargron](https://github.com/tootsuite/mastodon/pull/11623), [Gargron](https://github.com/tootsuite/mastodon/pull/11648)) -- Add rails-level JSON caching ([Gargron](https://github.com/tootsuite/mastodon/pull/11333), [Gargron](https://github.com/tootsuite/mastodon/pull/11271)) -- **Add request pool to improve delivery performance** ([Gargron](https://github.com/tootsuite/mastodon/pull/10353), [ykzts](https://github.com/tootsuite/mastodon/pull/11756)) -- Add concurrent connection attempts to resolved IP addresses ([ThibG](https://github.com/tootsuite/mastodon/pull/11757)) -- Add index for remember_token to improve login performance ([abcang](https://github.com/tootsuite/mastodon/pull/11881)) -- **Add more accurate hashtag search** ([Gargron](https://github.com/tootsuite/mastodon/pull/11579), [Gargron](https://github.com/tootsuite/mastodon/pull/11427), [Gargron](https://github.com/tootsuite/mastodon/pull/11448)) -- **Add more accurate account search** ([Gargron](https://github.com/tootsuite/mastodon/pull/11537), [Gargron](https://github.com/tootsuite/mastodon/pull/11580)) -- **Add a spam check** ([Gargron](https://github.com/tootsuite/mastodon/pull/11217), [Gargron](https://github.com/tootsuite/mastodon/pull/11806), [ThibG](https://github.com/tootsuite/mastodon/pull/11296)) -- Add new languages ([Gargron](https://github.com/tootsuite/mastodon/pull/12062)) +- Add max image dimensions to error message ([raboof](https://github.com/mastodon/mastodon/pull/11552)) +- Add aac, m4a, 3gp, amr, wma to allowed audio formats ([Gargron](https://github.com/mastodon/mastodon/pull/11342), [umonaca](https://github.com/mastodon/mastodon/pull/11687)) +- **Add search syntax for operators and phrases** ([Gargron](https://github.com/mastodon/mastodon/pull/11411)) +- **Add REST API for managing featured hashtags** ([noellabo](https://github.com/mastodon/mastodon/pull/11778)) +- **Add REST API for managing timeline read markers** ([Gargron](https://github.com/mastodon/mastodon/pull/11762)) +- Add `exclude_unreviewed` param to `GET /api/v2/search` REST API ([Gargron](https://github.com/mastodon/mastodon/pull/11977)) +- Add `reason` param to `POST /api/v1/accounts` REST API ([Gargron](https://github.com/mastodon/mastodon/pull/12064)) +- **Add ActivityPub secure mode** ([Gargron](https://github.com/mastodon/mastodon/pull/11269), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11332), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11295)) +- Add HTTP signatures to all outgoing ActivityPub GET requests ([Gargron](https://github.com/mastodon/mastodon/pull/11284), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11300)) +- Add support for ActivityPub Audio activities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11189)) +- Add ActivityPub actor representing the entire server ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11321), [rtucker](https://github.com/mastodon/mastodon/pull/11400), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11561), [Gargron](https://github.com/mastodon/mastodon/pull/11798)) +- **Add whitelist mode** ([Gargron](https://github.com/mastodon/mastodon/pull/11291), [mayaeh](https://github.com/mastodon/mastodon/pull/11634)) +- Add config of multipart threshold for S3 ([ykzts](https://github.com/mastodon/mastodon/pull/11924), [ykzts](https://github.com/mastodon/mastodon/pull/11944)) +- Add health check endpoint for web ([ykzts](https://github.com/mastodon/mastodon/pull/11770), [ykzts](https://github.com/mastodon/mastodon/pull/11947)) +- Add HTTP signature keyId to request log ([Gargron](https://github.com/mastodon/mastodon/pull/11591)) +- Add `SMTP_REPLY_TO` environment variable ([hugogameiro](https://github.com/mastodon/mastodon/pull/11718)) +- Add `tootctl preview_cards remove` command ([mayaeh](https://github.com/mastodon/mastodon/pull/11320)) +- Add `tootctl media refresh` command ([Gargron](https://github.com/mastodon/mastodon/pull/11775)) +- Add `tootctl cache recount` command ([Gargron](https://github.com/mastodon/mastodon/pull/11597)) +- Add option to exclude suspended domains from `tootctl domains crawl` ([dariusk](https://github.com/mastodon/mastodon/pull/11454)) +- Add parallelization to `tootctl search deploy` ([noellabo](https://github.com/mastodon/mastodon/pull/12051)) +- Add soft delete for statuses for instant deletes through API ([Gargron](https://github.com/mastodon/mastodon/pull/11623), [Gargron](https://github.com/mastodon/mastodon/pull/11648)) +- Add rails-level JSON caching ([Gargron](https://github.com/mastodon/mastodon/pull/11333), [Gargron](https://github.com/mastodon/mastodon/pull/11271)) +- **Add request pool to improve delivery performance** ([Gargron](https://github.com/mastodon/mastodon/pull/10353), [ykzts](https://github.com/mastodon/mastodon/pull/11756)) +- Add concurrent connection attempts to resolved IP addresses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11757)) +- Add index for remember_token to improve login performance ([abcang](https://github.com/mastodon/mastodon/pull/11881)) +- **Add more accurate hashtag search** ([Gargron](https://github.com/mastodon/mastodon/pull/11579), [Gargron](https://github.com/mastodon/mastodon/pull/11427), [Gargron](https://github.com/mastodon/mastodon/pull/11448)) +- **Add more accurate account search** ([Gargron](https://github.com/mastodon/mastodon/pull/11537), [Gargron](https://github.com/mastodon/mastodon/pull/11580)) +- **Add a spam check** ([Gargron](https://github.com/mastodon/mastodon/pull/11217), [Gargron](https://github.com/mastodon/mastodon/pull/11806), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11296)) +- Add new languages ([Gargron](https://github.com/mastodon/mastodon/pull/12062)) - Breton - Spanish (Argentina) - Estonian - Macedonian - New Norwegian -- Add NodeInfo endpoint ([Gargron](https://github.com/tootsuite/mastodon/pull/12002), [Gargron](https://github.com/tootsuite/mastodon/pull/12058)) +- Add NodeInfo endpoint ([Gargron](https://github.com/mastodon/mastodon/pull/12002), [Gargron](https://github.com/mastodon/mastodon/pull/12058)) ### Changed -- **Change conversations UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11896)) -- Change dashboard to short number notation ([noellabo](https://github.com/tootsuite/mastodon/pull/11847), [noellabo](https://github.com/tootsuite/mastodon/pull/11911)) -- Change REST API `GET /api/v1/timelines/public` to require authentication when public preview is off ([ThibG](https://github.com/tootsuite/mastodon/pull/11802)) -- Change REST API `POST /api/v1/follow_requests/:id/(approve|reject)` to return relationship ([ThibG](https://github.com/tootsuite/mastodon/pull/11800)) -- Change rate limit for media proxy ([ykzts](https://github.com/tootsuite/mastodon/pull/11814)) -- Change unlisted custom emoji to not appear in autosuggestions ([Gargron](https://github.com/tootsuite/mastodon/pull/11818)) -- Change max length of media descriptions from 420 to 1500 characters ([Gargron](https://github.com/tootsuite/mastodon/pull/11819), [ThibG](https://github.com/tootsuite/mastodon/pull/11836)) -- **Change deletes to preserve soft-deleted statuses in unresolved reports** ([Gargron](https://github.com/tootsuite/mastodon/pull/11805)) -- **Change tootctl to use inline parallelization instead of Sidekiq** ([Gargron](https://github.com/tootsuite/mastodon/pull/11776)) -- **Change account deletion page to have better explanations** ([Gargron](https://github.com/tootsuite/mastodon/pull/11753), [Gargron](https://github.com/tootsuite/mastodon/pull/11763)) -- Change hashtag component in web UI to show numbers for 2 last days ([Gargron](https://github.com/tootsuite/mastodon/pull/11742), [Gargron](https://github.com/tootsuite/mastodon/pull/11755), [Gargron](https://github.com/tootsuite/mastodon/pull/11754)) -- Change OpenGraph description on sign-up page to reflect invite ([Gargron](https://github.com/tootsuite/mastodon/pull/11744)) -- Change layout of public profile directory to be the same as in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11705)) -- Change detailed status child ordering to sort self-replies on top ([ThibG](https://github.com/tootsuite/mastodon/pull/11686)) -- Change window resize handler to switch to/from mobile layout as soon as needed ([ThibG](https://github.com/tootsuite/mastodon/pull/11656)) -- Change icon button styles to make hover/focus states more obvious ([ThibG](https://github.com/tootsuite/mastodon/pull/11474)) -- Change contrast of status links that are not mentions or hashtags ([ThibG](https://github.com/tootsuite/mastodon/pull/11406)) -- **Change hashtags to preserve first-used casing** ([Gargron](https://github.com/tootsuite/mastodon/pull/11416), [Gargron](https://github.com/tootsuite/mastodon/pull/11508), [Gargron](https://github.com/tootsuite/mastodon/pull/11504), [Gargron](https://github.com/tootsuite/mastodon/pull/11507), [Gargron](https://github.com/tootsuite/mastodon/pull/11441)) -- **Change unconfirmed user login behaviour** ([Gargron](https://github.com/tootsuite/mastodon/pull/11375), [ThibG](https://github.com/tootsuite/mastodon/pull/11394), [Gargron](https://github.com/tootsuite/mastodon/pull/11860)) -- **Change single-column mode to scroll the whole page** ([Gargron](https://github.com/tootsuite/mastodon/pull/11359), [Gargron](https://github.com/tootsuite/mastodon/pull/11894), [Gargron](https://github.com/tootsuite/mastodon/pull/11891), [ThibG](https://github.com/tootsuite/mastodon/pull/11655), [Gargron](https://github.com/tootsuite/mastodon/pull/11463), [Gargron](https://github.com/tootsuite/mastodon/pull/11458), [ThibG](https://github.com/tootsuite/mastodon/pull/11395), [Gargron](https://github.com/tootsuite/mastodon/pull/11418)) -- Change `tootctl accounts follow` to only work with local accounts ([angristan](https://github.com/tootsuite/mastodon/pull/11592)) -- Change Dockerfile ([Shleeble](https://github.com/tootsuite/mastodon/pull/11710), [ykzts](https://github.com/tootsuite/mastodon/pull/11768), [Shleeble](https://github.com/tootsuite/mastodon/pull/11707)) -- Change supported Node versions to include v12 ([abcang](https://github.com/tootsuite/mastodon/pull/11706)) -- Change Portuguese language from `pt` to `pt-PT` ([Gargron](https://github.com/tootsuite/mastodon/pull/11820)) -- Change domain block silence to always require approval on follow ([ThibG](https://github.com/tootsuite/mastodon/pull/11975)) -- Change link preview fetcher to not perform a HEAD request first ([Gargron](https://github.com/tootsuite/mastodon/pull/12028)) -- Change `tootctl domains purge` to accept multiple domains at once ([Gargron](https://github.com/tootsuite/mastodon/pull/12046)) +- **Change conversations UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11896)) +- Change dashboard to short number notation ([noellabo](https://github.com/mastodon/mastodon/pull/11847), [noellabo](https://github.com/mastodon/mastodon/pull/11911)) +- Change REST API `GET /api/v1/timelines/public` to require authentication when public preview is off ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11802)) +- Change REST API `POST /api/v1/follow_requests/:id/(approve|reject)` to return relationship ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11800)) +- Change rate limit for media proxy ([ykzts](https://github.com/mastodon/mastodon/pull/11814)) +- Change unlisted custom emoji to not appear in autosuggestions ([Gargron](https://github.com/mastodon/mastodon/pull/11818)) +- Change max length of media descriptions from 420 to 1500 characters ([Gargron](https://github.com/mastodon/mastodon/pull/11819), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11836)) +- **Change deletes to preserve soft-deleted statuses in unresolved reports** ([Gargron](https://github.com/mastodon/mastodon/pull/11805)) +- **Change tootctl to use inline parallelization instead of Sidekiq** ([Gargron](https://github.com/mastodon/mastodon/pull/11776)) +- **Change account deletion page to have better explanations** ([Gargron](https://github.com/mastodon/mastodon/pull/11753), [Gargron](https://github.com/mastodon/mastodon/pull/11763)) +- Change hashtag component in web UI to show numbers for 2 last days ([Gargron](https://github.com/mastodon/mastodon/pull/11742), [Gargron](https://github.com/mastodon/mastodon/pull/11755), [Gargron](https://github.com/mastodon/mastodon/pull/11754)) +- Change OpenGraph description on sign-up page to reflect invite ([Gargron](https://github.com/mastodon/mastodon/pull/11744)) +- Change layout of public profile directory to be the same as in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11705)) +- Change detailed status child ordering to sort self-replies on top ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11686)) +- Change window resize handler to switch to/from mobile layout as soon as needed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11656)) +- Change icon button styles to make hover/focus states more obvious ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11474)) +- Change contrast of status links that are not mentions or hashtags ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11406)) +- **Change hashtags to preserve first-used casing** ([Gargron](https://github.com/mastodon/mastodon/pull/11416), [Gargron](https://github.com/mastodon/mastodon/pull/11508), [Gargron](https://github.com/mastodon/mastodon/pull/11504), [Gargron](https://github.com/mastodon/mastodon/pull/11507), [Gargron](https://github.com/mastodon/mastodon/pull/11441)) +- **Change unconfirmed user login behaviour** ([Gargron](https://github.com/mastodon/mastodon/pull/11375), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11394), [Gargron](https://github.com/mastodon/mastodon/pull/11860)) +- **Change single-column mode to scroll the whole page** ([Gargron](https://github.com/mastodon/mastodon/pull/11359), [Gargron](https://github.com/mastodon/mastodon/pull/11894), [Gargron](https://github.com/mastodon/mastodon/pull/11891), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11655), [Gargron](https://github.com/mastodon/mastodon/pull/11463), [Gargron](https://github.com/mastodon/mastodon/pull/11458), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11395), [Gargron](https://github.com/mastodon/mastodon/pull/11418)) +- Change `tootctl accounts follow` to only work with local accounts ([angristan](https://github.com/mastodon/mastodon/pull/11592)) +- Change Dockerfile ([Shleeble](https://github.com/mastodon/mastodon/pull/11710), [ykzts](https://github.com/mastodon/mastodon/pull/11768), [Shleeble](https://github.com/mastodon/mastodon/pull/11707)) +- Change supported Node versions to include v12 ([abcang](https://github.com/mastodon/mastodon/pull/11706)) +- Change Portuguese language from `pt` to `pt-PT` ([Gargron](https://github.com/mastodon/mastodon/pull/11820)) +- Change domain block silence to always require approval on follow ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11975)) +- Change link preview fetcher to not perform a HEAD request first ([Gargron](https://github.com/mastodon/mastodon/pull/12028)) +- Change `tootctl domains purge` to accept multiple domains at once ([Gargron](https://github.com/mastodon/mastodon/pull/12046)) ### Removed -- **Remove OStatus support** ([Gargron](https://github.com/tootsuite/mastodon/pull/11205), [Gargron](https://github.com/tootsuite/mastodon/pull/11303), [Gargron](https://github.com/tootsuite/mastodon/pull/11460), [ThibG](https://github.com/tootsuite/mastodon/pull/11280), [ThibG](https://github.com/tootsuite/mastodon/pull/11278)) -- Remove Atom feeds and old URLs in the form of `GET /:username/updates/:id` ([Gargron](https://github.com/tootsuite/mastodon/pull/11247)) -- Remove WebP support ([angristan](https://github.com/tootsuite/mastodon/pull/11589)) -- Remove deprecated config options from Heroku and Scalingo ([ykzts](https://github.com/tootsuite/mastodon/pull/11925)) -- Remove deprecated REST API `GET /api/v1/search` API ([Gargron](https://github.com/tootsuite/mastodon/pull/11823)) -- Remove deprecated REST API `GET /api/v1/statuses/:id/card` ([Gargron](https://github.com/tootsuite/mastodon/pull/11213)) -- Remove deprecated REST API `POST /api/v1/notifications/dismiss?id=:id` ([Gargron](https://github.com/tootsuite/mastodon/pull/11214)) -- Remove deprecated REST API `GET /api/v1/timelines/direct` ([Gargron](https://github.com/tootsuite/mastodon/pull/11212)) +- **Remove OStatus support** ([Gargron](https://github.com/mastodon/mastodon/pull/11205), [Gargron](https://github.com/mastodon/mastodon/pull/11303), [Gargron](https://github.com/mastodon/mastodon/pull/11460), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11280), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11278)) +- Remove Atom feeds and old URLs in the form of `GET /:username/updates/:id` ([Gargron](https://github.com/mastodon/mastodon/pull/11247)) +- Remove WebP support ([angristan](https://github.com/mastodon/mastodon/pull/11589)) +- Remove deprecated config options from Heroku and Scalingo ([ykzts](https://github.com/mastodon/mastodon/pull/11925)) +- Remove deprecated REST API `GET /api/v1/search` API ([Gargron](https://github.com/mastodon/mastodon/pull/11823)) +- Remove deprecated REST API `GET /api/v1/statuses/:id/card` ([Gargron](https://github.com/mastodon/mastodon/pull/11213)) +- Remove deprecated REST API `POST /api/v1/notifications/dismiss?id=:id` ([Gargron](https://github.com/mastodon/mastodon/pull/11214)) +- Remove deprecated REST API `GET /api/v1/timelines/direct` ([Gargron](https://github.com/mastodon/mastodon/pull/11212)) ### Fixed -- Fix manifest warning ([ykzts](https://github.com/tootsuite/mastodon/pull/11767)) -- Fix admin UI for custom emoji not respecting GIF autoplay preference ([ThibG](https://github.com/tootsuite/mastodon/pull/11801)) -- Fix page body not being scrollable in admin/settings layout ([Gargron](https://github.com/tootsuite/mastodon/pull/11893)) -- Fix placeholder colors for inputs not being explicitly defined ([Gargron](https://github.com/tootsuite/mastodon/pull/11890)) -- Fix incorrect enclosure length in RSS ([tsia](https://github.com/tootsuite/mastodon/pull/11889)) -- Fix TOTP codes not being filtered from logs during enabling/disabling ([Gargron](https://github.com/tootsuite/mastodon/pull/11877)) -- Fix webfinger response not returning 410 when account is suspended ([Gargron](https://github.com/tootsuite/mastodon/pull/11869)) -- Fix ActivityPub Move handler queuing jobs that will fail if account is suspended ([Gargron](https://github.com/tootsuite/mastodon/pull/11864)) -- Fix SSO login not using existing account when e-mail is verified ([Gargron](https://github.com/tootsuite/mastodon/pull/11862)) -- Fix web UI allowing uploads past status limit via drag & drop ([Gargron](https://github.com/tootsuite/mastodon/pull/11863)) -- Fix expiring polls not being displayed as such in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11835)) -- Fix 2FA challenge and password challenge for non-database users ([Gargron](https://github.com/tootsuite/mastodon/pull/11831), [Gargron](https://github.com/tootsuite/mastodon/pull/11943)) -- Fix profile fields overflowing page width in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11828)) -- Fix web push subscriptions being deleted on rate limit or timeout ([Gargron](https://github.com/tootsuite/mastodon/pull/11826)) -- Fix display of long poll options in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11717), [ThibG](https://github.com/tootsuite/mastodon/pull/11833)) -- Fix search API not resolving URL when `type` is given ([Gargron](https://github.com/tootsuite/mastodon/pull/11822)) -- Fix hashtags being split by ZWNJ character ([Gargron](https://github.com/tootsuite/mastodon/pull/11821)) -- Fix scroll position resetting when opening media modals in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11815)) -- Fix duplicate HTML IDs on about page ([ThibG](https://github.com/tootsuite/mastodon/pull/11803)) -- Fix admin UI showing superfluous reject media/reports on suspended domain blocks ([ThibG](https://github.com/tootsuite/mastodon/pull/11749)) -- Fix ActivityPub context not being dynamically computed ([ThibG](https://github.com/tootsuite/mastodon/pull/11746)) -- Fix Mastodon logo style on hover on public pages' footer ([ThibG](https://github.com/tootsuite/mastodon/pull/11735)) -- Fix height of dashboard counters ([ThibG](https://github.com/tootsuite/mastodon/pull/11736)) -- Fix custom emoji animation on hover in web UI directory bios ([ThibG](https://github.com/tootsuite/mastodon/pull/11716)) -- Fix non-numbers being passed to Redis and causing an error ([Gargron](https://github.com/tootsuite/mastodon/pull/11697)) -- Fix error in REST API for an account's statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/11700)) -- Fix uncaught error when resource param is missing in Webfinger request ([Gargron](https://github.com/tootsuite/mastodon/pull/11701)) -- Fix uncaught domain normalization error in remote follow ([Gargron](https://github.com/tootsuite/mastodon/pull/11703)) -- Fix uncaught 422 and 500 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11590), [Gargron](https://github.com/tootsuite/mastodon/pull/11811)) -- Fix uncaught parameter missing exceptions and missing error templates ([Gargron](https://github.com/tootsuite/mastodon/pull/11702)) -- Fix encoding error when checking e-mail MX records ([Gargron](https://github.com/tootsuite/mastodon/pull/11696)) -- Fix items in StatusContent render list not all having a key ([ThibG](https://github.com/tootsuite/mastodon/pull/11645)) -- Fix remote and staff-removed statuses leaving media behind for a day ([Gargron](https://github.com/tootsuite/mastodon/pull/11638)) -- Fix CSP needlessly allowing blob URLs in script-src ([ThibG](https://github.com/tootsuite/mastodon/pull/11620)) -- Fix ignoring whole status because of one invalid hashtag ([Gargron](https://github.com/tootsuite/mastodon/pull/11621)) -- Fix hidden statuses losing focus ([ThibG](https://github.com/tootsuite/mastodon/pull/11208)) -- Fix loading bar being obscured by other elements in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11598)) -- Fix multiple issues with replies collection for pages further than self-replies ([ThibG](https://github.com/tootsuite/mastodon/pull/11582)) -- Fix blurhash and autoplay not working on public pages ([Gargron](https://github.com/tootsuite/mastodon/pull/11585)) -- Fix 422 being returned instead of 404 when POSTing to unmatched routes ([Gargron](https://github.com/tootsuite/mastodon/pull/11574), [Gargron](https://github.com/tootsuite/mastodon/pull/11704)) -- Fix client-side resizing of image uploads ([ThibG](https://github.com/tootsuite/mastodon/pull/11570)) -- Fix short number formatting for numbers above million in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11559)) -- Fix ActivityPub and REST API queries setting cookies and preventing caching ([ThibG](https://github.com/tootsuite/mastodon/pull/11539), [ThibG](https://github.com/tootsuite/mastodon/pull/11557), [ThibG](https://github.com/tootsuite/mastodon/pull/11336), [ThibG](https://github.com/tootsuite/mastodon/pull/11331)) -- Fix some emojis in profile metadata labels are not emojified. ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/11534)) -- Fix account search always returning exact match on paginated results ([Gargron](https://github.com/tootsuite/mastodon/pull/11525)) -- Fix acct URIs with IDN domains not being resolved ([Gargron](https://github.com/tootsuite/mastodon/pull/11520)) -- Fix admin dashboard missing latest features ([Gargron](https://github.com/tootsuite/mastodon/pull/11505)) -- Fix jumping of toot date when clicking spoiler button ([ariasuni](https://github.com/tootsuite/mastodon/pull/11449)) -- Fix boost to original audience not working on mobile in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11371)) -- Fix handling of webfinger redirects in ResolveAccountService ([ThibG](https://github.com/tootsuite/mastodon/pull/11279)) -- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/tootsuite/mastodon/pull/11231)) -- Fix support for HTTP proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/11245)) -- Fix HTTP requests to IPv6 hosts ([ThibG](https://github.com/tootsuite/mastodon/pull/11240)) -- Fix error in ElasticSearch index import ([mayaeh](https://github.com/tootsuite/mastodon/pull/11192)) -- Fix duplicate account error when seeding development database ([ysksn](https://github.com/tootsuite/mastodon/pull/11366)) -- Fix performance of session clean-up scheduler ([abcang](https://github.com/tootsuite/mastodon/pull/11871)) -- Fix older migrations not running ([zunda](https://github.com/tootsuite/mastodon/pull/11377)) -- Fix URLs counting towards RTL detection ([ahangarha](https://github.com/tootsuite/mastodon/pull/11759)) -- Fix unnecessary status re-rendering in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11211)) -- Fix http_parser.rb gem not being compiled when no network available ([petabyteboy](https://github.com/tootsuite/mastodon/pull/11444)) -- Fix muted text color not applying to all text ([trwnh](https://github.com/tootsuite/mastodon/pull/11996)) -- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11986)) -- Fix n+1 query when approving multiple follow requests ([abcang](https://github.com/tootsuite/mastodon/pull/12004)) -- Fix records not being indexed into ElasticSearch sometimes ([Gargron](https://github.com/tootsuite/mastodon/pull/12024)) -- Fix needlessly indexing unsearchable statuses into ElasticSearch ([Gargron](https://github.com/tootsuite/mastodon/pull/12041)) -- Fix new user bootstrapping crashing when to-be-followed accounts are invalid ([ThibG](https://github.com/tootsuite/mastodon/pull/12037)) -- Fix featured hashtag URL being interpreted as media or replies tab ([Gargron](https://github.com/tootsuite/mastodon/pull/12048)) -- Fix account counters being overwritten by parallel writes ([Gargron](https://github.com/tootsuite/mastodon/pull/12045)) +- Fix manifest warning ([ykzts](https://github.com/mastodon/mastodon/pull/11767)) +- Fix admin UI for custom emoji not respecting GIF autoplay preference ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11801)) +- Fix page body not being scrollable in admin/settings layout ([Gargron](https://github.com/mastodon/mastodon/pull/11893)) +- Fix placeholder colors for inputs not being explicitly defined ([Gargron](https://github.com/mastodon/mastodon/pull/11890)) +- Fix incorrect enclosure length in RSS ([tsia](https://github.com/mastodon/mastodon/pull/11889)) +- Fix TOTP codes not being filtered from logs during enabling/disabling ([Gargron](https://github.com/mastodon/mastodon/pull/11877)) +- Fix webfinger response not returning 410 when account is suspended ([Gargron](https://github.com/mastodon/mastodon/pull/11869)) +- Fix ActivityPub Move handler queuing jobs that will fail if account is suspended ([Gargron](https://github.com/mastodon/mastodon/pull/11864)) +- Fix SSO login not using existing account when e-mail is verified ([Gargron](https://github.com/mastodon/mastodon/pull/11862)) +- Fix web UI allowing uploads past status limit via drag & drop ([Gargron](https://github.com/mastodon/mastodon/pull/11863)) +- Fix expiring polls not being displayed as such in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11835)) +- Fix 2FA challenge and password challenge for non-database users ([Gargron](https://github.com/mastodon/mastodon/pull/11831), [Gargron](https://github.com/mastodon/mastodon/pull/11943)) +- Fix profile fields overflowing page width in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11828)) +- Fix web push subscriptions being deleted on rate limit or timeout ([Gargron](https://github.com/mastodon/mastodon/pull/11826)) +- Fix display of long poll options in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11717), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11833)) +- Fix search API not resolving URL when `type` is given ([Gargron](https://github.com/mastodon/mastodon/pull/11822)) +- Fix hashtags being split by ZWNJ character ([Gargron](https://github.com/mastodon/mastodon/pull/11821)) +- Fix scroll position resetting when opening media modals in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11815)) +- Fix duplicate HTML IDs on about page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11803)) +- Fix admin UI showing superfluous reject media/reports on suspended domain blocks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11749)) +- Fix ActivityPub context not being dynamically computed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11746)) +- Fix Mastodon logo style on hover on public pages' footer ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11735)) +- Fix height of dashboard counters ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11736)) +- Fix custom emoji animation on hover in web UI directory bios ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11716)) +- Fix non-numbers being passed to Redis and causing an error ([Gargron](https://github.com/mastodon/mastodon/pull/11697)) +- Fix error in REST API for an account's statuses ([Gargron](https://github.com/mastodon/mastodon/pull/11700)) +- Fix uncaught error when resource param is missing in Webfinger request ([Gargron](https://github.com/mastodon/mastodon/pull/11701)) +- Fix uncaught domain normalization error in remote follow ([Gargron](https://github.com/mastodon/mastodon/pull/11703)) +- Fix uncaught 422 and 500 errors ([Gargron](https://github.com/mastodon/mastodon/pull/11590), [Gargron](https://github.com/mastodon/mastodon/pull/11811)) +- Fix uncaught parameter missing exceptions and missing error templates ([Gargron](https://github.com/mastodon/mastodon/pull/11702)) +- Fix encoding error when checking e-mail MX records ([Gargron](https://github.com/mastodon/mastodon/pull/11696)) +- Fix items in StatusContent render list not all having a key ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11645)) +- Fix remote and staff-removed statuses leaving media behind for a day ([Gargron](https://github.com/mastodon/mastodon/pull/11638)) +- Fix CSP needlessly allowing blob URLs in script-src ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11620)) +- Fix ignoring whole status because of one invalid hashtag ([Gargron](https://github.com/mastodon/mastodon/pull/11621)) +- Fix hidden statuses losing focus ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11208)) +- Fix loading bar being obscured by other elements in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11598)) +- Fix multiple issues with replies collection for pages further than self-replies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11582)) +- Fix blurhash and autoplay not working on public pages ([Gargron](https://github.com/mastodon/mastodon/pull/11585)) +- Fix 422 being returned instead of 404 when POSTing to unmatched routes ([Gargron](https://github.com/mastodon/mastodon/pull/11574), [Gargron](https://github.com/mastodon/mastodon/pull/11704)) +- Fix client-side resizing of image uploads ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11570)) +- Fix short number formatting for numbers above million in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11559)) +- Fix ActivityPub and REST API queries setting cookies and preventing caching ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11539), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11557), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11336), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11331)) +- Fix some emojis in profile metadata labels are not emojified. ([kedamaDQ](https://github.com/mastodon/mastodon/pull/11534)) +- Fix account search always returning exact match on paginated results ([Gargron](https://github.com/mastodon/mastodon/pull/11525)) +- Fix acct URIs with IDN domains not being resolved ([Gargron](https://github.com/mastodon/mastodon/pull/11520)) +- Fix admin dashboard missing latest features ([Gargron](https://github.com/mastodon/mastodon/pull/11505)) +- Fix jumping of toot date when clicking spoiler button ([ariasuni](https://github.com/mastodon/mastodon/pull/11449)) +- Fix boost to original audience not working on mobile in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11371)) +- Fix handling of webfinger redirects in ResolveAccountService ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11279)) +- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/mastodon/mastodon/pull/11231)) +- Fix support for HTTP proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11245)) +- Fix HTTP requests to IPv6 hosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11240)) +- Fix error in ElasticSearch index import ([mayaeh](https://github.com/mastodon/mastodon/pull/11192)) +- Fix duplicate account error when seeding development database ([ysksn](https://github.com/mastodon/mastodon/pull/11366)) +- Fix performance of session clean-up scheduler ([abcang](https://github.com/mastodon/mastodon/pull/11871)) +- Fix older migrations not running ([zunda](https://github.com/mastodon/mastodon/pull/11377)) +- Fix URLs counting towards RTL detection ([ahangarha](https://github.com/mastodon/mastodon/pull/11759)) +- Fix unnecessary status re-rendering in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11211)) +- Fix http_parser.rb gem not being compiled when no network available ([petabyteboy](https://github.com/mastodon/mastodon/pull/11444)) +- Fix muted text color not applying to all text ([trwnh](https://github.com/mastodon/mastodon/pull/11996)) +- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11986)) +- Fix n+1 query when approving multiple follow requests ([abcang](https://github.com/mastodon/mastodon/pull/12004)) +- Fix records not being indexed into ElasticSearch sometimes ([Gargron](https://github.com/mastodon/mastodon/pull/12024)) +- Fix needlessly indexing unsearchable statuses into ElasticSearch ([Gargron](https://github.com/mastodon/mastodon/pull/12041)) +- Fix new user bootstrapping crashing when to-be-followed accounts are invalid ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12037)) +- Fix featured hashtag URL being interpreted as media or replies tab ([Gargron](https://github.com/mastodon/mastodon/pull/12048)) +- Fix account counters being overwritten by parallel writes ([Gargron](https://github.com/mastodon/mastodon/pull/12045)) ### Security -- Fix performance of GIF re-encoding and always strip EXIF data from videos ([Gargron](https://github.com/tootsuite/mastodon/pull/12057)) +- Fix performance of GIF re-encoding and always strip EXIF data from videos ([Gargron](https://github.com/mastodon/mastodon/pull/12057)) ## [2.9.3] - 2019-08-10 ### Added -- Add GIF and WebP support for custom emojis ([Gargron](https://github.com/tootsuite/mastodon/pull/11519)) -- Add logout link to dropdown menu in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/11353)) -- Add indication that text search is unavailable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11112), [ThibG](https://github.com/tootsuite/mastodon/pull/11202)) -- Add `suffix` to `Mastodon::Version` to help forks ([clarfon](https://github.com/tootsuite/mastodon/pull/11407)) -- Add on-hover animation to animated custom emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11348), [ThibG](https://github.com/tootsuite/mastodon/pull/11404), [ThibG](https://github.com/tootsuite/mastodon/pull/11522)) -- Add custom emoji support in profile metadata labels ([ThibG](https://github.com/tootsuite/mastodon/pull/11350)) +- Add GIF and WebP support for custom emojis ([Gargron](https://github.com/mastodon/mastodon/pull/11519)) +- Add logout link to dropdown menu in web UI ([koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/11353)) +- Add indication that text search is unavailable in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11112), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11202)) +- Add `suffix` to `Mastodon::Version` to help forks ([clarfon](https://github.com/mastodon/mastodon/pull/11407)) +- Add on-hover animation to animated custom emoji in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11348), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11404), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11522)) +- Add custom emoji support in profile metadata labels ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11350)) ### Changed -- Change default interface of web and streaming from 0.0.0.0 to 127.0.0.1 ([Gargron](https://github.com/tootsuite/mastodon/pull/11302), [zunda](https://github.com/tootsuite/mastodon/pull/11378), [Gargron](https://github.com/tootsuite/mastodon/pull/11351), [zunda](https://github.com/tootsuite/mastodon/pull/11326)) -- Change the retry limit of web push notifications ([highemerly](https://github.com/tootsuite/mastodon/pull/11292)) -- Change ActivityPub deliveries to not retry HTTP 501 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11233)) -- Change language detection to include hashtags as words ([Gargron](https://github.com/tootsuite/mastodon/pull/11341)) -- Change terms and privacy policy pages to always be accessible ([Gargron](https://github.com/tootsuite/mastodon/pull/11334)) -- Change robots tag to include `noarchive` when user opts out of indexing ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11421)) +- Change default interface of web and streaming from 0.0.0.0 to 127.0.0.1 ([Gargron](https://github.com/mastodon/mastodon/pull/11302), [zunda](https://github.com/mastodon/mastodon/pull/11378), [Gargron](https://github.com/mastodon/mastodon/pull/11351), [zunda](https://github.com/mastodon/mastodon/pull/11326)) +- Change the retry limit of web push notifications ([highemerly](https://github.com/mastodon/mastodon/pull/11292)) +- Change ActivityPub deliveries to not retry HTTP 501 errors ([Gargron](https://github.com/mastodon/mastodon/pull/11233)) +- Change language detection to include hashtags as words ([Gargron](https://github.com/mastodon/mastodon/pull/11341)) +- Change terms and privacy policy pages to always be accessible ([Gargron](https://github.com/mastodon/mastodon/pull/11334)) +- Change robots tag to include `noarchive` when user opts out of indexing ([Kjwon15](https://github.com/mastodon/mastodon/pull/11421)) ### Fixed -- Fix account domain block not clearing out notifications ([Gargron](https://github.com/tootsuite/mastodon/pull/11393)) -- Fix incorrect locale sometimes being detected for browser ([Gargron](https://github.com/tootsuite/mastodon/pull/8657)) -- Fix crash when saving invalid domain name ([Gargron](https://github.com/tootsuite/mastodon/pull/11528)) -- Fix pinned statuses REST API returning pagination headers ([Gargron](https://github.com/tootsuite/mastodon/pull/11526)) -- Fix "cancel follow request" button having unreadable text in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11521)) -- Fix image uploads being blank when canvas read access is blocked ([ThibG](https://github.com/tootsuite/mastodon/pull/11499)) -- Fix avatars not being animated on hover when not logged in ([ThibG](https://github.com/tootsuite/mastodon/pull/11349)) -- Fix overzealous sanitization of HTML lists ([ThibG](https://github.com/tootsuite/mastodon/pull/11354)) -- Fix block crashing when a follow request exists ([ThibG](https://github.com/tootsuite/mastodon/pull/11288)) -- Fix backup service crashing when an attachment is missing ([ThibG](https://github.com/tootsuite/mastodon/pull/11241)) -- Fix account moderation action always sending e-mail notification ([Gargron](https://github.com/tootsuite/mastodon/pull/11242)) -- Fix swiping columns on mobile sometimes failing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11200)) -- Fix wrong actor URI being serialized into poll updates ([ThibG](https://github.com/tootsuite/mastodon/pull/11194)) -- Fix statsd UDP sockets not being cleaned up in Sidekiq ([Gargron](https://github.com/tootsuite/mastodon/pull/11230)) -- Fix expiration date of filters being set to "never" when editing them ([ThibG](https://github.com/tootsuite/mastodon/pull/11204)) -- Fix support for MP4 files that are actually M4V files ([Gargron](https://github.com/tootsuite/mastodon/pull/11210)) -- Fix `alerts` not being typecast correctly in push subscription in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11343)) -- Fix some notices staying on unrelated pages ([ThibG](https://github.com/tootsuite/mastodon/pull/11364)) -- Fix unboosting sometimes preventing a boost from reappearing on feed ([ThibG](https://github.com/tootsuite/mastodon/pull/11405), [Gargron](https://github.com/tootsuite/mastodon/pull/11450)) -- Fix only one middle dot being recognized in hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/11345), [ThibG](https://github.com/tootsuite/mastodon/pull/11363)) -- Fix unnecessary SQL query performed on unauthenticated requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11179)) -- Fix incorrect timestamp displayed on featured tags ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11477)) -- Fix privacy dropdown active state when dropdown is placed on top of it ([ThibG](https://github.com/tootsuite/mastodon/pull/11495)) -- Fix filters not being applied to poll options ([ThibG](https://github.com/tootsuite/mastodon/pull/11174)) -- Fix keyboard navigation on various dropdowns ([ThibG](https://github.com/tootsuite/mastodon/pull/11511), [ThibG](https://github.com/tootsuite/mastodon/pull/11492), [ThibG](https://github.com/tootsuite/mastodon/pull/11491)) -- Fix keyboard navigation in modals ([ThibG](https://github.com/tootsuite/mastodon/pull/11493)) -- Fix image conversation being non-deterministic due to timestamps ([Gargron](https://github.com/tootsuite/mastodon/pull/11408)) -- Fix web UI performance ([ThibG](https://github.com/tootsuite/mastodon/pull/11211), [ThibG](https://github.com/tootsuite/mastodon/pull/11234)) -- Fix scrolling to compose form when not necessary in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11246), [ThibG](https://github.com/tootsuite/mastodon/pull/11182)) -- Fix save button being enabled when list title is empty in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11475)) -- Fix poll expiration not being pre-filled on delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11203)) -- Fix content warning sometimes being set when not requested in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11206)) +- Fix account domain block not clearing out notifications ([Gargron](https://github.com/mastodon/mastodon/pull/11393)) +- Fix incorrect locale sometimes being detected for browser ([Gargron](https://github.com/mastodon/mastodon/pull/8657)) +- Fix crash when saving invalid domain name ([Gargron](https://github.com/mastodon/mastodon/pull/11528)) +- Fix pinned statuses REST API returning pagination headers ([Gargron](https://github.com/mastodon/mastodon/pull/11526)) +- Fix "cancel follow request" button having unreadable text in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11521)) +- Fix image uploads being blank when canvas read access is blocked ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11499)) +- Fix avatars not being animated on hover when not logged in ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11349)) +- Fix overzealous sanitization of HTML lists ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11354)) +- Fix block crashing when a follow request exists ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11288)) +- Fix backup service crashing when an attachment is missing ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11241)) +- Fix account moderation action always sending e-mail notification ([Gargron](https://github.com/mastodon/mastodon/pull/11242)) +- Fix swiping columns on mobile sometimes failing in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11200)) +- Fix wrong actor URI being serialized into poll updates ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11194)) +- Fix statsd UDP sockets not being cleaned up in Sidekiq ([Gargron](https://github.com/mastodon/mastodon/pull/11230)) +- Fix expiration date of filters being set to "never" when editing them ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11204)) +- Fix support for MP4 files that are actually M4V files ([Gargron](https://github.com/mastodon/mastodon/pull/11210)) +- Fix `alerts` not being typecast correctly in push subscription in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/11343)) +- Fix some notices staying on unrelated pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11364)) +- Fix unboosting sometimes preventing a boost from reappearing on feed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11405), [Gargron](https://github.com/mastodon/mastodon/pull/11450)) +- Fix only one middle dot being recognized in hashtags ([Gargron](https://github.com/mastodon/mastodon/pull/11345), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11363)) +- Fix unnecessary SQL query performed on unauthenticated requests ([Gargron](https://github.com/mastodon/mastodon/pull/11179)) +- Fix incorrect timestamp displayed on featured tags ([Kjwon15](https://github.com/mastodon/mastodon/pull/11477)) +- Fix privacy dropdown active state when dropdown is placed on top of it ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11495)) +- Fix filters not being applied to poll options ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11174)) +- Fix keyboard navigation on various dropdowns ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11511), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11492), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11491)) +- Fix keyboard navigation in modals ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11493)) +- Fix image conversation being non-deterministic due to timestamps ([Gargron](https://github.com/mastodon/mastodon/pull/11408)) +- Fix web UI performance ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11211), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11234)) +- Fix scrolling to compose form when not necessary in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11246), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11182)) +- Fix save button being enabled when list title is empty in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11475)) +- Fix poll expiration not being pre-filled on delete & redraft in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11203)) +- Fix content warning sometimes being set when not requested in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11206)) ### Security -- Fix invites not being disabled upon account suspension ([ThibG](https://github.com/tootsuite/mastodon/pull/11412)) -- Fix blocked domains still being able to fill database with account records ([Gargron](https://github.com/tootsuite/mastodon/pull/11219)) +- Fix invites not being disabled upon account suspension ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11412)) +- Fix blocked domains still being able to fill database with account records ([Gargron](https://github.com/mastodon/mastodon/pull/11219)) ## [2.9.2] - 2019-06-22 ### Added -- Add `short_description` and `approval_required` to `GET /api/v1/instance` ([Gargron](https://github.com/tootsuite/mastodon/pull/11146)) +- Add `short_description` and `approval_required` to `GET /api/v1/instance` ([Gargron](https://github.com/mastodon/mastodon/pull/11146)) ### Changed -- Change camera icon to paperclip icon in upload form ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/11149)) +- Change camera icon to paperclip icon in upload form ([koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/11149)) ### Fixed -- Fix audio-only OGG and WebM files not being processed as such ([Gargron](https://github.com/tootsuite/mastodon/pull/11151)) -- Fix audio not being downloaded from remote servers ([Gargron](https://github.com/tootsuite/mastodon/pull/11145)) +- Fix audio-only OGG and WebM files not being processed as such ([Gargron](https://github.com/mastodon/mastodon/pull/11151)) +- Fix audio not being downloaded from remote servers ([Gargron](https://github.com/mastodon/mastodon/pull/11145)) ## [2.9.1] - 2019-06-22 ### Added -- Add moderation API ([Gargron](https://github.com/tootsuite/mastodon/pull/9387)) -- Add audio uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/11123), [Gargron](https://github.com/tootsuite/mastodon/pull/11141)) +- Add moderation API ([Gargron](https://github.com/mastodon/mastodon/pull/9387)) +- Add audio uploads ([Gargron](https://github.com/mastodon/mastodon/pull/11123), [Gargron](https://github.com/mastodon/mastodon/pull/11141)) ### Changed -- Change domain blocks to automatically support subdomains ([Gargron](https://github.com/tootsuite/mastodon/pull/11138)) -- Change Nanobox configuration to bring it up to date ([danhunsaker](https://github.com/tootsuite/mastodon/pull/11083)) +- Change domain blocks to automatically support subdomains ([Gargron](https://github.com/mastodon/mastodon/pull/11138)) +- Change Nanobox configuration to bring it up to date ([danhunsaker](https://github.com/mastodon/mastodon/pull/11083)) ### Removed -- Remove expensive counters from federation page in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11139)) +- Remove expensive counters from federation page in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/11139)) ### Fixed -- Fix converted media being saved with original extension and mime type ([Gargron](https://github.com/tootsuite/mastodon/pull/11130)) -- Fix layout of identity proofs settings ([acid-chicken](https://github.com/tootsuite/mastodon/pull/11126)) -- Fix active scope only returning suspended users ([ThibG](https://github.com/tootsuite/mastodon/pull/11111)) -- Fix sanitizer making block level elements unreadable ([Gargron](https://github.com/tootsuite/mastodon/pull/10836)) -- Fix label for site theme not being translated in admin UI ([palindromordnilap](https://github.com/tootsuite/mastodon/pull/11121)) -- Fix statuses not being filtered irreversibly in web UI under some circumstances ([ThibG](https://github.com/tootsuite/mastodon/pull/11113)) -- Fix scrolling behaviour in compose form ([ThibG](https://github.com/tootsuite/mastodon/pull/11093)) +- Fix converted media being saved with original extension and mime type ([Gargron](https://github.com/mastodon/mastodon/pull/11130)) +- Fix layout of identity proofs settings ([acid-chicken](https://github.com/mastodon/mastodon/pull/11126)) +- Fix active scope only returning suspended users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11111)) +- Fix sanitizer making block level elements unreadable ([Gargron](https://github.com/mastodon/mastodon/pull/10836)) +- Fix label for site theme not being translated in admin UI ([palindromordnilap](https://github.com/mastodon/mastodon/pull/11121)) +- Fix statuses not being filtered irreversibly in web UI under some circumstances ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11113)) +- Fix scrolling behaviour in compose form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11093)) ## [2.9.0] - 2019-06-13 ### Added -- **Add single-column mode in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/10807), [Gargron](https://github.com/tootsuite/mastodon/pull/10848), [Gargron](https://github.com/tootsuite/mastodon/pull/11003), [Gargron](https://github.com/tootsuite/mastodon/pull/10961), [Hanage999](https://github.com/tootsuite/mastodon/pull/10915), [noellabo](https://github.com/tootsuite/mastodon/pull/10917), [abcang](https://github.com/tootsuite/mastodon/pull/10859), [Gargron](https://github.com/tootsuite/mastodon/pull/10820), [Gargron](https://github.com/tootsuite/mastodon/pull/10835), [Gargron](https://github.com/tootsuite/mastodon/pull/10809), [Gargron](https://github.com/tootsuite/mastodon/pull/10963), [noellabo](https://github.com/tootsuite/mastodon/pull/10883), [Hanage999](https://github.com/tootsuite/mastodon/pull/10839)) -- Add waiting time to the list of pending accounts in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10985)) -- Add a keyboard shortcut to hide/show media in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10647), [Gargron](https://github.com/tootsuite/mastodon/pull/10838), [ThibG](https://github.com/tootsuite/mastodon/pull/10872)) -- Add `account_id` param to `GET /api/v1/notifications` ([pwoolcoc](https://github.com/tootsuite/mastodon/pull/10796)) -- Add confirmation modal for unboosting toots in web UI ([aurelien-reeves](https://github.com/tootsuite/mastodon/pull/10287)) -- Add emoji suggestions to content warning and poll option fields in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10555)) -- Add `source` attribute to response of `DELETE /api/v1/statuses/:id` ([ThibG](https://github.com/tootsuite/mastodon/pull/10669)) -- Add some caching for HTML versions of public status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/10701)) -- Add button to conveniently copy OAuth code ([ThibG](https://github.com/tootsuite/mastodon/pull/11065)) +- **Add single-column mode in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/10807), [Gargron](https://github.com/mastodon/mastodon/pull/10848), [Gargron](https://github.com/mastodon/mastodon/pull/11003), [Gargron](https://github.com/mastodon/mastodon/pull/10961), [Hanage999](https://github.com/mastodon/mastodon/pull/10915), [noellabo](https://github.com/mastodon/mastodon/pull/10917), [abcang](https://github.com/mastodon/mastodon/pull/10859), [Gargron](https://github.com/mastodon/mastodon/pull/10820), [Gargron](https://github.com/mastodon/mastodon/pull/10835), [Gargron](https://github.com/mastodon/mastodon/pull/10809), [Gargron](https://github.com/mastodon/mastodon/pull/10963), [noellabo](https://github.com/mastodon/mastodon/pull/10883), [Hanage999](https://github.com/mastodon/mastodon/pull/10839)) +- Add waiting time to the list of pending accounts in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/10985)) +- Add a keyboard shortcut to hide/show media in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10647), [Gargron](https://github.com/mastodon/mastodon/pull/10838), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10872)) +- Add `account_id` param to `GET /api/v1/notifications` ([pwoolcoc](https://github.com/mastodon/mastodon/pull/10796)) +- Add confirmation modal for unboosting toots in web UI ([aurelien-reeves](https://github.com/mastodon/mastodon/pull/10287)) +- Add emoji suggestions to content warning and poll option fields in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10555)) +- Add `source` attribute to response of `DELETE /api/v1/statuses/:id` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10669)) +- Add some caching for HTML versions of public status pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10701)) +- Add button to conveniently copy OAuth code ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11065)) ### Changed -- **Change default layout to single column in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/10847)) -- **Change light theme** ([Gargron](https://github.com/tootsuite/mastodon/pull/10992), [Gargron](https://github.com/tootsuite/mastodon/pull/10996), [yuzulabo](https://github.com/tootsuite/mastodon/pull/10754), [Gargron](https://github.com/tootsuite/mastodon/pull/10845)) -- **Change preferences page into appearance, notifications, and other** ([Gargron](https://github.com/tootsuite/mastodon/pull/10977), [Gargron](https://github.com/tootsuite/mastodon/pull/10988)) -- Change priority of delete activity forwards for replies and reblogs ([Gargron](https://github.com/tootsuite/mastodon/pull/11002)) -- Change Mastodon logo to use primary text color of the given theme ([Gargron](https://github.com/tootsuite/mastodon/pull/10994)) -- Change reblogs counter to be updated when boosted privately ([Gargron](https://github.com/tootsuite/mastodon/pull/10964)) -- Change bio limit from 160 to 500 characters ([trwnh](https://github.com/tootsuite/mastodon/pull/10790)) -- Change API rate limiting to reduce allowed unauthenticated requests ([ThibG](https://github.com/tootsuite/mastodon/pull/10860), [hinaloe](https://github.com/tootsuite/mastodon/pull/10868), [mayaeh](https://github.com/tootsuite/mastodon/pull/10867)) -- Change help text of `tootctl emoji import` command to specify a gzipped TAR archive is required ([dariusk](https://github.com/tootsuite/mastodon/pull/11000)) -- Change web UI to hide poll options behind content warnings ([ThibG](https://github.com/tootsuite/mastodon/pull/10983)) -- Change silencing to ensure local effects and remote effects are the same for silenced local users ([ThibG](https://github.com/tootsuite/mastodon/pull/10575)) -- Change `tootctl domains purge` to remove custom emoji as well ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10721)) -- Change Docker image to keep `apt` working ([SuperSandro2000](https://github.com/tootsuite/mastodon/pull/10830)) +- **Change default layout to single column in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/10847)) +- **Change light theme** ([Gargron](https://github.com/mastodon/mastodon/pull/10992), [Gargron](https://github.com/mastodon/mastodon/pull/10996), [yuzulabo](https://github.com/mastodon/mastodon/pull/10754), [Gargron](https://github.com/mastodon/mastodon/pull/10845)) +- **Change preferences page into appearance, notifications, and other** ([Gargron](https://github.com/mastodon/mastodon/pull/10977), [Gargron](https://github.com/mastodon/mastodon/pull/10988)) +- Change priority of delete activity forwards for replies and reblogs ([Gargron](https://github.com/mastodon/mastodon/pull/11002)) +- Change Mastodon logo to use primary text color of the given theme ([Gargron](https://github.com/mastodon/mastodon/pull/10994)) +- Change reblogs counter to be updated when boosted privately ([Gargron](https://github.com/mastodon/mastodon/pull/10964)) +- Change bio limit from 160 to 500 characters ([trwnh](https://github.com/mastodon/mastodon/pull/10790)) +- Change API rate limiting to reduce allowed unauthenticated requests ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10860), [hinaloe](https://github.com/mastodon/mastodon/pull/10868), [mayaeh](https://github.com/mastodon/mastodon/pull/10867)) +- Change help text of `tootctl emoji import` command to specify a gzipped TAR archive is required ([dariusk](https://github.com/mastodon/mastodon/pull/11000)) +- Change web UI to hide poll options behind content warnings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10983)) +- Change silencing to ensure local effects and remote effects are the same for silenced local users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10575)) +- Change `tootctl domains purge` to remove custom emoji as well ([Kjwon15](https://github.com/mastodon/mastodon/pull/10721)) +- Change Docker image to keep `apt` working ([SuperSandro2000](https://github.com/mastodon/mastodon/pull/10830)) ### Removed -- Remove `dist-upgrade` from Docker image ([SuperSandro2000](https://github.com/tootsuite/mastodon/pull/10822)) +- Remove `dist-upgrade` from Docker image ([SuperSandro2000](https://github.com/mastodon/mastodon/pull/10822)) ### Fixed -- Fix RTL layout not being RTL within the columns area in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10990)) -- Fix display of alternative text when a media attachment is not available in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10981)) -- Fix not being able to directly switch between list timelines in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10973)) -- Fix media sensitivity not being maintained in delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10980)) -- Fix emoji picker being always displayed in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/10979), [yuzulabo](https://github.com/tootsuite/mastodon/pull/10801), [wcpaez](https://github.com/tootsuite/mastodon/pull/10978)) -- Fix potential private status leak through caching ([ThibG](https://github.com/tootsuite/mastodon/pull/10969)) -- Fix refreshing featured toots when the new collection is empty in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10971)) -- Fix undoing domain block also undoing individual moderation on users from before the domain block ([ThibG](https://github.com/tootsuite/mastodon/pull/10660)) -- Fix time not being local in the audit log ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10751)) -- Fix statuses removed by moderation re-appearing on subsequent fetches ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10732)) -- Fix misattribution of inlined announces if `attributedTo` isn't present in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/10967)) -- Fix `GET /api/v1/polls/:id` not requiring authentication for non-public polls ([Gargron](https://github.com/tootsuite/mastodon/pull/10960)) -- Fix handling of blank poll options in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/10946)) -- Fix avatar preview aspect ratio on edit profile page ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10931)) -- Fix web push notifications not being sent for polls ([ThibG](https://github.com/tootsuite/mastodon/pull/10864)) -- Fix cut off letters in last paragraph of statuses in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/10821)) -- Fix list not being automatically unpinned when it returns 404 in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11045)) -- Fix login sometimes redirecting to paths that are not pages ([Gargron](https://github.com/tootsuite/mastodon/pull/11019)) +- Fix RTL layout not being RTL within the columns area in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10990)) +- Fix display of alternative text when a media attachment is not available in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10981)) +- Fix not being able to directly switch between list timelines in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10973)) +- Fix media sensitivity not being maintained in delete & redraft in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10980)) +- Fix emoji picker being always displayed in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/10979), [yuzulabo](https://github.com/mastodon/mastodon/pull/10801), [wcpaez](https://github.com/mastodon/mastodon/pull/10978)) +- Fix potential private status leak through caching ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10969)) +- Fix refreshing featured toots when the new collection is empty in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10971)) +- Fix undoing domain block also undoing individual moderation on users from before the domain block ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10660)) +- Fix time not being local in the audit log ([yuzulabo](https://github.com/mastodon/mastodon/pull/10751)) +- Fix statuses removed by moderation re-appearing on subsequent fetches ([Kjwon15](https://github.com/mastodon/mastodon/pull/10732)) +- Fix misattribution of inlined announces if `attributedTo` isn't present in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10967)) +- Fix `GET /api/v1/polls/:id` not requiring authentication for non-public polls ([Gargron](https://github.com/mastodon/mastodon/pull/10960)) +- Fix handling of blank poll options in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10946)) +- Fix avatar preview aspect ratio on edit profile page ([Kjwon15](https://github.com/mastodon/mastodon/pull/10931)) +- Fix web push notifications not being sent for polls ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10864)) +- Fix cut off letters in last paragraph of statuses in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/10821)) +- Fix list not being automatically unpinned when it returns 404 in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11045)) +- Fix login sometimes redirecting to paths that are not pages ([Gargron](https://github.com/mastodon/mastodon/pull/11019)) ## [2.8.4] - 2019-05-24 ### Fixed -- Fix delivery not retrying on some inbox errors that should be retriable ([ThibG](https://github.com/tootsuite/mastodon/pull/10812)) -- Fix unnecessary 5 minute cooldowns on signature verifications in some cases ([ThibG](https://github.com/tootsuite/mastodon/pull/10813)) -- Fix possible race condition when processing statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10815)) +- Fix delivery not retrying on some inbox errors that should be retriable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10812)) +- Fix unnecessary 5 minute cooldowns on signature verifications in some cases ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10813)) +- Fix possible race condition when processing statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10815)) ### Security -- Require specific OAuth scopes for specific endpoints of the streaming API, instead of merely requiring a token for all endpoints, and allow using WebSockets protocol negotiation to specify the access token instead of using a query string ([ThibG](https://github.com/tootsuite/mastodon/pull/10818)) +- Require specific OAuth scopes for specific endpoints of the streaming API, instead of merely requiring a token for all endpoints, and allow using WebSockets protocol negotiation to specify the access token instead of using a query string ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10818)) ## [2.8.3] - 2019-05-19 ### Added -- Add `og:image:alt` OpenGraph tag ([BenLubar](https://github.com/tootsuite/mastodon/pull/10779)) -- Add clickable area below avatar in statuses in web UI ([Dar13](https://github.com/tootsuite/mastodon/pull/10766)) -- Add crossed-out eye icon on account gallery in web UI ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10715)) -- Add media description tooltip to thumbnails in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10713)) +- Add `og:image:alt` OpenGraph tag ([BenLubar](https://github.com/mastodon/mastodon/pull/10779)) +- Add clickable area below avatar in statuses in web UI ([Dar13](https://github.com/mastodon/mastodon/pull/10766)) +- Add crossed-out eye icon on account gallery in web UI ([Kjwon15](https://github.com/mastodon/mastodon/pull/10715)) +- Add media description tooltip to thumbnails in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10713)) ### Changed -- Change "mark as sensitive" button into a checkbox for clarity ([ThibG](https://github.com/tootsuite/mastodon/pull/10748)) +- Change "mark as sensitive" button into a checkbox for clarity ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10748)) ### Fixed -- Fix bug allowing users to publicly boost their private statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10775), [ThibG](https://github.com/tootsuite/mastodon/pull/10783)) -- Fix performance in formatter by a little ([ThibG](https://github.com/tootsuite/mastodon/pull/10765)) -- Fix some colors in the light theme ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10754)) -- Fix some colors of the high contrast theme ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10711)) -- Fix ambivalent active state of poll refresh button in web UI ([MaciekBaron](https://github.com/tootsuite/mastodon/pull/10720)) -- Fix duplicate posting being possible from web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/10785)) -- Fix "invited by" not showing up in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10791)) +- Fix bug allowing users to publicly boost their private statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10775), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10783)) +- Fix performance in formatter by a little ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10765)) +- Fix some colors in the light theme ([yuzulabo](https://github.com/mastodon/mastodon/pull/10754)) +- Fix some colors of the high contrast theme ([yuzulabo](https://github.com/mastodon/mastodon/pull/10711)) +- Fix ambivalent active state of poll refresh button in web UI ([MaciekBaron](https://github.com/mastodon/mastodon/pull/10720)) +- Fix duplicate posting being possible from web UI ([hinaloe](https://github.com/mastodon/mastodon/pull/10785)) +- Fix "invited by" not showing up in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10791)) ## [2.8.2] - 2019-05-05 ### Added -- Add `SOURCE_TAG` environment variable ([ushitora-anqou](https://github.com/tootsuite/mastodon/pull/10698)) +- Add `SOURCE_TAG` environment variable ([ushitora-anqou](https://github.com/mastodon/mastodon/pull/10698)) ### Fixed -- Fix cropped hero image on frontpage ([BaptisteGelez](https://github.com/tootsuite/mastodon/pull/10702)) -- Fix blurhash gem not compiling on some operating systems ([Gargron](https://github.com/tootsuite/mastodon/pull/10700)) -- Fix unexpected CSS animations in some browsers ([ThibG](https://github.com/tootsuite/mastodon/pull/10699)) -- Fix closing video modal scrolling timelines to top ([ThibG](https://github.com/tootsuite/mastodon/pull/10695)) +- Fix cropped hero image on frontpage ([BaptisteGelez](https://github.com/mastodon/mastodon/pull/10702)) +- Fix blurhash gem not compiling on some operating systems ([Gargron](https://github.com/mastodon/mastodon/pull/10700)) +- Fix unexpected CSS animations in some browsers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10699)) +- Fix closing video modal scrolling timelines to top ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10695)) ## [2.8.1] - 2019-05-04 ### Added -- Add link to existing domain block when trying to block an already-blocked domain ([ThibG](https://github.com/tootsuite/mastodon/pull/10663)) -- Add button to view context to media modal when opened from account gallery in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10676)) -- Add ability to create multiple-choice polls in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10603)) -- Add `GITHUB_REPOSITORY` and `SOURCE_BASE_URL` environment variables ([rosylilly](https://github.com/tootsuite/mastodon/pull/10600)) -- Add `/interact/` paths to `robots.txt` ([ThibG](https://github.com/tootsuite/mastodon/pull/10666)) -- Add `blurhash` to the Attachment entity in the REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/10630)) +- Add link to existing domain block when trying to block an already-blocked domain ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10663)) +- Add button to view context to media modal when opened from account gallery in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10676)) +- Add ability to create multiple-choice polls in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10603)) +- Add `GITHUB_REPOSITORY` and `SOURCE_BASE_URL` environment variables ([rosylilly](https://github.com/mastodon/mastodon/pull/10600)) +- Add `/interact/` paths to `robots.txt` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10666)) +- Add `blurhash` to the Attachment entity in the REST API ([Gargron](https://github.com/mastodon/mastodon/pull/10630)) ### Changed -- Change hidden media to be shown as a blurhash-based colorful gradient instead of a black box in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10630)) -- Change rejected media to be shown as a blurhash-based gradient instead of a list of filenames in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10630)) -- Change e-mail whitelist/blacklist to not be checked when invited ([Gargron](https://github.com/tootsuite/mastodon/pull/10683)) -- Change cache header of REST API results to no-cache ([ThibG](https://github.com/tootsuite/mastodon/pull/10655)) -- Change the "mark media as sensitive" button to be more obvious in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10673), [Gargron](https://github.com/tootsuite/mastodon/pull/10682)) -- Change account gallery in web UI to display 3 columns, open media modal ([Gargron](https://github.com/tootsuite/mastodon/pull/10667), [Gargron](https://github.com/tootsuite/mastodon/pull/10674)) +- Change hidden media to be shown as a blurhash-based colorful gradient instead of a black box in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10630)) +- Change rejected media to be shown as a blurhash-based gradient instead of a list of filenames in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10630)) +- Change e-mail whitelist/blacklist to not be checked when invited ([Gargron](https://github.com/mastodon/mastodon/pull/10683)) +- Change cache header of REST API results to no-cache ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10655)) +- Change the "mark media as sensitive" button to be more obvious in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10673), [Gargron](https://github.com/mastodon/mastodon/pull/10682)) +- Change account gallery in web UI to display 3 columns, open media modal ([Gargron](https://github.com/mastodon/mastodon/pull/10667), [Gargron](https://github.com/mastodon/mastodon/pull/10674)) ### Fixed -- Fix LDAP/PAM/SAML/CAS users not being pre-approved ([Gargron](https://github.com/tootsuite/mastodon/pull/10621)) -- Fix accounts created through tootctl not being always pre-approved ([Gargron](https://github.com/tootsuite/mastodon/pull/10684)) -- Fix Sidekiq retrying ActivityPub processing jobs that fail validation ([ThibG](https://github.com/tootsuite/mastodon/pull/10614)) -- Fix toots not being scrolled into view sometimes through keyboard selection ([ThibG](https://github.com/tootsuite/mastodon/pull/10593)) -- Fix expired invite links being usable to bypass approval mode ([ThibG](https://github.com/tootsuite/mastodon/pull/10657)) -- Fix not being able to save e-mail preference for new pending accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/10622)) -- Fix upload progressbar when image resizing is involved ([ThibG](https://github.com/tootsuite/mastodon/pull/10632)) -- Fix block action not automatically cancelling pending follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/10633)) -- Fix stoplight logging to stderr separate from Rails logger ([Gargron](https://github.com/tootsuite/mastodon/pull/10624)) -- Fix sign up button not saying sign up when invite is used ([Gargron](https://github.com/tootsuite/mastodon/pull/10623)) -- Fix health checks in Docker Compose configuration ([fabianonline](https://github.com/tootsuite/mastodon/pull/10553)) -- Fix modal items not being scrollable on touch devices ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/10605)) -- Fix Keybase configuration using wrong domain when a web domain is used ([BenLubar](https://github.com/tootsuite/mastodon/pull/10565)) -- Fix avatar GIFs not being animated on-hover on public profiles ([hyenagirl64](https://github.com/tootsuite/mastodon/pull/10549)) -- Fix OpenGraph parser not understanding some valid property meta tags ([da2x](https://github.com/tootsuite/mastodon/pull/10604)) -- Fix wrong fonts being displayed when Roboto is installed on user's machine ([ThibG](https://github.com/tootsuite/mastodon/pull/10594)) -- Fix confirmation modals being too narrow for a secondary action button ([ThibG](https://github.com/tootsuite/mastodon/pull/10586)) +- Fix LDAP/PAM/SAML/CAS users not being pre-approved ([Gargron](https://github.com/mastodon/mastodon/pull/10621)) +- Fix accounts created through tootctl not being always pre-approved ([Gargron](https://github.com/mastodon/mastodon/pull/10684)) +- Fix Sidekiq retrying ActivityPub processing jobs that fail validation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10614)) +- Fix toots not being scrolled into view sometimes through keyboard selection ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10593)) +- Fix expired invite links being usable to bypass approval mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10657)) +- Fix not being able to save e-mail preference for new pending accounts ([Gargron](https://github.com/mastodon/mastodon/pull/10622)) +- Fix upload progressbar when image resizing is involved ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10632)) +- Fix block action not automatically cancelling pending follow request ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10633)) +- Fix stoplight logging to stderr separate from Rails logger ([Gargron](https://github.com/mastodon/mastodon/pull/10624)) +- Fix sign up button not saying sign up when invite is used ([Gargron](https://github.com/mastodon/mastodon/pull/10623)) +- Fix health checks in Docker Compose configuration ([fabianonline](https://github.com/mastodon/mastodon/pull/10553)) +- Fix modal items not being scrollable on touch devices ([kedamaDQ](https://github.com/mastodon/mastodon/pull/10605)) +- Fix Keybase configuration using wrong domain when a web domain is used ([BenLubar](https://github.com/mastodon/mastodon/pull/10565)) +- Fix avatar GIFs not being animated on-hover on public profiles ([hyenagirl64](https://github.com/mastodon/mastodon/pull/10549)) +- Fix OpenGraph parser not understanding some valid property meta tags ([da2x](https://github.com/mastodon/mastodon/pull/10604)) +- Fix wrong fonts being displayed when Roboto is installed on user's machine ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10594)) +- Fix confirmation modals being too narrow for a secondary action button ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10586)) ## [2.8.0] - 2019-04-10 ### Added -- Add polls ([Gargron](https://github.com/tootsuite/mastodon/pull/10111), [ThibG](https://github.com/tootsuite/mastodon/pull/10155), [Gargron](https://github.com/tootsuite/mastodon/pull/10184), [ThibG](https://github.com/tootsuite/mastodon/pull/10196), [Gargron](https://github.com/tootsuite/mastodon/pull/10248), [ThibG](https://github.com/tootsuite/mastodon/pull/10255), [ThibG](https://github.com/tootsuite/mastodon/pull/10322), [Gargron](https://github.com/tootsuite/mastodon/pull/10138), [Gargron](https://github.com/tootsuite/mastodon/pull/10139), [Gargron](https://github.com/tootsuite/mastodon/pull/10144), [Gargron](https://github.com/tootsuite/mastodon/pull/10145),[Gargron](https://github.com/tootsuite/mastodon/pull/10146), [Gargron](https://github.com/tootsuite/mastodon/pull/10148), [Gargron](https://github.com/tootsuite/mastodon/pull/10151), [ThibG](https://github.com/tootsuite/mastodon/pull/10150), [Gargron](https://github.com/tootsuite/mastodon/pull/10168), [Gargron](https://github.com/tootsuite/mastodon/pull/10165), [Gargron](https://github.com/tootsuite/mastodon/pull/10172), [Gargron](https://github.com/tootsuite/mastodon/pull/10170), [Gargron](https://github.com/tootsuite/mastodon/pull/10171), [Gargron](https://github.com/tootsuite/mastodon/pull/10186), [Gargron](https://github.com/tootsuite/mastodon/pull/10189), [ThibG](https://github.com/tootsuite/mastodon/pull/10200), [rinsuki](https://github.com/tootsuite/mastodon/pull/10203), [Gargron](https://github.com/tootsuite/mastodon/pull/10213), [Gargron](https://github.com/tootsuite/mastodon/pull/10246), [Gargron](https://github.com/tootsuite/mastodon/pull/10265), [Gargron](https://github.com/tootsuite/mastodon/pull/10261), [ThibG](https://github.com/tootsuite/mastodon/pull/10333), [Gargron](https://github.com/tootsuite/mastodon/pull/10352), [ThibG](https://github.com/tootsuite/mastodon/pull/10140), [ThibG](https://github.com/tootsuite/mastodon/pull/10142), [ThibG](https://github.com/tootsuite/mastodon/pull/10141), [ThibG](https://github.com/tootsuite/mastodon/pull/10162), [ThibG](https://github.com/tootsuite/mastodon/pull/10161), [ThibG](https://github.com/tootsuite/mastodon/pull/10158), [ThibG](https://github.com/tootsuite/mastodon/pull/10156), [ThibG](https://github.com/tootsuite/mastodon/pull/10160), [Gargron](https://github.com/tootsuite/mastodon/pull/10185), [Gargron](https://github.com/tootsuite/mastodon/pull/10188), [ThibG](https://github.com/tootsuite/mastodon/pull/10195), [ThibG](https://github.com/tootsuite/mastodon/pull/10208), [Gargron](https://github.com/tootsuite/mastodon/pull/10187), [ThibG](https://github.com/tootsuite/mastodon/pull/10214), [ThibG](https://github.com/tootsuite/mastodon/pull/10209)) -- Add follows & followers managing UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10268), [Gargron](https://github.com/tootsuite/mastodon/pull/10308), [Gargron](https://github.com/tootsuite/mastodon/pull/10404), [Gargron](https://github.com/tootsuite/mastodon/pull/10293)) -- Add identity proof integration with Keybase ([Gargron](https://github.com/tootsuite/mastodon/pull/10297), [xgess](https://github.com/tootsuite/mastodon/pull/10375), [Gargron](https://github.com/tootsuite/mastodon/pull/10338), [Gargron](https://github.com/tootsuite/mastodon/pull/10350), [Gargron](https://github.com/tootsuite/mastodon/pull/10414)) -- Add option to overwrite imported data instead of merging ([Gargron](https://github.com/tootsuite/mastodon/pull/9962)) -- Add featured hashtags to profiles ([Gargron](https://github.com/tootsuite/mastodon/pull/9755), [Gargron](https://github.com/tootsuite/mastodon/pull/10167), [Gargron](https://github.com/tootsuite/mastodon/pull/10249), [ThibG](https://github.com/tootsuite/mastodon/pull/10034)) -- Add admission-based registrations mode ([Gargron](https://github.com/tootsuite/mastodon/pull/10250), [ThibG](https://github.com/tootsuite/mastodon/pull/10269), [Gargron](https://github.com/tootsuite/mastodon/pull/10264), [ThibG](https://github.com/tootsuite/mastodon/pull/10321), [Gargron](https://github.com/tootsuite/mastodon/pull/10349), [Gargron](https://github.com/tootsuite/mastodon/pull/10469)) -- Add support for WebP uploads ([acid-chicken](https://github.com/tootsuite/mastodon/pull/9879)) -- Add "copy link" item to status action bars in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9983)) -- Add list title editing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9748)) -- Add a "Block & Report" button to the block confirmation dialog in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10360)) -- Add disappointed elephant when the page crashes in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10275)) -- Add ability to upload multiple files at once in web UI ([tmm576](https://github.com/tootsuite/mastodon/pull/9856)) -- Add indication when you are not allowed to follow an account in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10420), [Gargron](https://github.com/tootsuite/mastodon/pull/10491)) -- Add validations to admin settings to catch common mistakes ([Gargron](https://github.com/tootsuite/mastodon/pull/10348), [ThibG](https://github.com/tootsuite/mastodon/pull/10354)) -- Add `type`, `limit`, `offset`, `min_id`, `max_id`, `account_id` to search API ([Gargron](https://github.com/tootsuite/mastodon/pull/10091)) -- Add a preferences API so apps can share basic behaviours ([Gargron](https://github.com/tootsuite/mastodon/pull/10109)) -- Add `visibility` param to reblog REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9851), [ThibG](https://github.com/tootsuite/mastodon/pull/10302)) -- Add `allowfullscreen` attribute to OEmbed iframe ([rinsuki](https://github.com/tootsuite/mastodon/pull/10370)) -- Add `blocked_by` relationship to the REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/10373)) -- Add `tootctl statuses remove` to sweep unreferenced statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/10063)) -- Add `tootctl search deploy` to avoid ugly rake task syntax ([Gargron](https://github.com/tootsuite/mastodon/pull/10403)) -- Add `tootctl self-destruct` to shut down server gracefully ([Gargron](https://github.com/tootsuite/mastodon/pull/10367)) -- Add option to hide application used to toot ([ThibG](https://github.com/tootsuite/mastodon/pull/9897), [rinsuki](https://github.com/tootsuite/mastodon/pull/9994), [hinaloe](https://github.com/tootsuite/mastodon/pull/10086)) -- Add `DB_SSLMODE` configuration variable ([sascha-sl](https://github.com/tootsuite/mastodon/pull/10210)) -- Add click-to-copy UI to invites page ([Gargron](https://github.com/tootsuite/mastodon/pull/10259)) -- Add self-replies fetching ([ThibG](https://github.com/tootsuite/mastodon/pull/10106), [ThibG](https://github.com/tootsuite/mastodon/pull/10128), [ThibG](https://github.com/tootsuite/mastodon/pull/10175), [ThibG](https://github.com/tootsuite/mastodon/pull/10201)) -- Add rate limit for media proxy requests ([Gargron](https://github.com/tootsuite/mastodon/pull/10490)) -- Add `tootctl emoji purge` ([Gargron](https://github.com/tootsuite/mastodon/pull/10481)) -- Add `tootctl accounts approve` ([Gargron](https://github.com/tootsuite/mastodon/pull/10480)) -- Add `tootctl accounts reset-relationships` ([noellabo](https://github.com/tootsuite/mastodon/pull/10483)) +- Add polls ([Gargron](https://github.com/mastodon/mastodon/pull/10111), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10155), [Gargron](https://github.com/mastodon/mastodon/pull/10184), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10196), [Gargron](https://github.com/mastodon/mastodon/pull/10248), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10255), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10322), [Gargron](https://github.com/mastodon/mastodon/pull/10138), [Gargron](https://github.com/mastodon/mastodon/pull/10139), [Gargron](https://github.com/mastodon/mastodon/pull/10144), [Gargron](https://github.com/mastodon/mastodon/pull/10145),[Gargron](https://github.com/mastodon/mastodon/pull/10146), [Gargron](https://github.com/mastodon/mastodon/pull/10148), [Gargron](https://github.com/mastodon/mastodon/pull/10151), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10150), [Gargron](https://github.com/mastodon/mastodon/pull/10168), [Gargron](https://github.com/mastodon/mastodon/pull/10165), [Gargron](https://github.com/mastodon/mastodon/pull/10172), [Gargron](https://github.com/mastodon/mastodon/pull/10170), [Gargron](https://github.com/mastodon/mastodon/pull/10171), [Gargron](https://github.com/mastodon/mastodon/pull/10186), [Gargron](https://github.com/mastodon/mastodon/pull/10189), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10200), [rinsuki](https://github.com/mastodon/mastodon/pull/10203), [Gargron](https://github.com/mastodon/mastodon/pull/10213), [Gargron](https://github.com/mastodon/mastodon/pull/10246), [Gargron](https://github.com/mastodon/mastodon/pull/10265), [Gargron](https://github.com/mastodon/mastodon/pull/10261), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10333), [Gargron](https://github.com/mastodon/mastodon/pull/10352), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10140), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10142), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10141), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10162), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10161), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10158), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10156), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10160), [Gargron](https://github.com/mastodon/mastodon/pull/10185), [Gargron](https://github.com/mastodon/mastodon/pull/10188), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10195), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10208), [Gargron](https://github.com/mastodon/mastodon/pull/10187), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10214), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10209)) +- Add follows & followers managing UI ([Gargron](https://github.com/mastodon/mastodon/pull/10268), [Gargron](https://github.com/mastodon/mastodon/pull/10308), [Gargron](https://github.com/mastodon/mastodon/pull/10404), [Gargron](https://github.com/mastodon/mastodon/pull/10293)) +- Add identity proof integration with Keybase ([Gargron](https://github.com/mastodon/mastodon/pull/10297), [xgess](https://github.com/mastodon/mastodon/pull/10375), [Gargron](https://github.com/mastodon/mastodon/pull/10338), [Gargron](https://github.com/mastodon/mastodon/pull/10350), [Gargron](https://github.com/mastodon/mastodon/pull/10414)) +- Add option to overwrite imported data instead of merging ([Gargron](https://github.com/mastodon/mastodon/pull/9962)) +- Add featured hashtags to profiles ([Gargron](https://github.com/mastodon/mastodon/pull/9755), [Gargron](https://github.com/mastodon/mastodon/pull/10167), [Gargron](https://github.com/mastodon/mastodon/pull/10249), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10034)) +- Add admission-based registrations mode ([Gargron](https://github.com/mastodon/mastodon/pull/10250), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10269), [Gargron](https://github.com/mastodon/mastodon/pull/10264), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10321), [Gargron](https://github.com/mastodon/mastodon/pull/10349), [Gargron](https://github.com/mastodon/mastodon/pull/10469)) +- Add support for WebP uploads ([acid-chicken](https://github.com/mastodon/mastodon/pull/9879)) +- Add "copy link" item to status action bars in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/9983)) +- Add list title editing in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9748)) +- Add a "Block & Report" button to the block confirmation dialog in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10360)) +- Add disappointed elephant when the page crashes in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10275)) +- Add ability to upload multiple files at once in web UI ([tmm576](https://github.com/mastodon/mastodon/pull/9856)) +- Add indication when you are not allowed to follow an account in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10420), [Gargron](https://github.com/mastodon/mastodon/pull/10491)) +- Add validations to admin settings to catch common mistakes ([Gargron](https://github.com/mastodon/mastodon/pull/10348), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10354)) +- Add `type`, `limit`, `offset`, `min_id`, `max_id`, `account_id` to search API ([Gargron](https://github.com/mastodon/mastodon/pull/10091)) +- Add a preferences API so apps can share basic behaviours ([Gargron](https://github.com/mastodon/mastodon/pull/10109)) +- Add `visibility` param to reblog REST API ([Gargron](https://github.com/mastodon/mastodon/pull/9851), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10302)) +- Add `allowfullscreen` attribute to OEmbed iframe ([rinsuki](https://github.com/mastodon/mastodon/pull/10370)) +- Add `blocked_by` relationship to the REST API ([Gargron](https://github.com/mastodon/mastodon/pull/10373)) +- Add `tootctl statuses remove` to sweep unreferenced statuses ([Gargron](https://github.com/mastodon/mastodon/pull/10063)) +- Add `tootctl search deploy` to avoid ugly rake task syntax ([Gargron](https://github.com/mastodon/mastodon/pull/10403)) +- Add `tootctl self-destruct` to shut down server gracefully ([Gargron](https://github.com/mastodon/mastodon/pull/10367)) +- Add option to hide application used to toot ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9897), [rinsuki](https://github.com/mastodon/mastodon/pull/9994), [hinaloe](https://github.com/mastodon/mastodon/pull/10086)) +- Add `DB_SSLMODE` configuration variable ([sascha-sl](https://github.com/mastodon/mastodon/pull/10210)) +- Add click-to-copy UI to invites page ([Gargron](https://github.com/mastodon/mastodon/pull/10259)) +- Add self-replies fetching ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10106), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10128), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10175), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10201)) +- Add rate limit for media proxy requests ([Gargron](https://github.com/mastodon/mastodon/pull/10490)) +- Add `tootctl emoji purge` ([Gargron](https://github.com/mastodon/mastodon/pull/10481)) +- Add `tootctl accounts approve` ([Gargron](https://github.com/mastodon/mastodon/pull/10480)) +- Add `tootctl accounts reset-relationships` ([noellabo](https://github.com/mastodon/mastodon/pull/10483)) ### Changed -- Change design of landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10232), [Gargron](https://github.com/tootsuite/mastodon/pull/10260), [ThibG](https://github.com/tootsuite/mastodon/pull/10284), [ThibG](https://github.com/tootsuite/mastodon/pull/10291), [koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/10356), [Gargron](https://github.com/tootsuite/mastodon/pull/10245)) -- Change design of profile column in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10337), [Aditoo17](https://github.com/tootsuite/mastodon/pull/10387), [ThibG](https://github.com/tootsuite/mastodon/pull/10390), [mayaeh](https://github.com/tootsuite/mastodon/pull/10379), [ThibG](https://github.com/tootsuite/mastodon/pull/10411)) -- Change language detector threshold from 140 characters to 4 words ([Gargron](https://github.com/tootsuite/mastodon/pull/10376)) -- Change language detector to always kick in for non-latin alphabets ([Gargron](https://github.com/tootsuite/mastodon/pull/10276)) -- Change icons of features on admin dashboard ([Gargron](https://github.com/tootsuite/mastodon/pull/10366)) -- Change DNS timeouts from 1s to 5s ([ThibG](https://github.com/tootsuite/mastodon/pull/10238)) -- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/10100), [BenLubar](https://github.com/tootsuite/mastodon/pull/10212)) -- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/tootsuite/mastodon/pull/9059)) -- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/10339)) -- Change web UI to not not empty timeline of blocked users on block ([ThibG](https://github.com/tootsuite/mastodon/pull/10359)) -- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/tootsuite/mastodon/pull/10378)) -- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/tootsuite/mastodon/pull/9924)) -- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/tootsuite/mastodon/pull/10289)) -- Change web UI to use new Web Share Target API ([gol-cha](https://github.com/tootsuite/mastodon/pull/9963)) -- Change ActivityPub reports to have persistent URIs ([ThibG](https://github.com/tootsuite/mastodon/pull/10303)) -- Change `tootctl accounts cull --dry-run` to list accounts that would be deleted ([BenLubar](https://github.com/tootsuite/mastodon/pull/10460)) -- Change format of CSV exports of follows and mutes to include extra settings ([ThibG](https://github.com/tootsuite/mastodon/pull/10495), [ThibG](https://github.com/tootsuite/mastodon/pull/10335)) -- Change ActivityPub collections to be cacheable by proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/10467)) -- Change REST API and public profiles to not return follows/followers for users that have blocked you ([Gargron](https://github.com/tootsuite/mastodon/pull/10491)) -- Change the groupings of menu items in settings navigation ([Gargron](https://github.com/tootsuite/mastodon/pull/10533)) +- Change design of landing page ([Gargron](https://github.com/mastodon/mastodon/pull/10232), [Gargron](https://github.com/mastodon/mastodon/pull/10260), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10284), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10291), [koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/10356), [Gargron](https://github.com/mastodon/mastodon/pull/10245)) +- Change design of profile column in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10337), [Aditoo17](https://github.com/mastodon/mastodon/pull/10387), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10390), [mayaeh](https://github.com/mastodon/mastodon/pull/10379), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10411)) +- Change language detector threshold from 140 characters to 4 words ([Gargron](https://github.com/mastodon/mastodon/pull/10376)) +- Change language detector to always kick in for non-latin alphabets ([Gargron](https://github.com/mastodon/mastodon/pull/10276)) +- Change icons of features on admin dashboard ([Gargron](https://github.com/mastodon/mastodon/pull/10366)) +- Change DNS timeouts from 1s to 5s ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10238)) +- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/mastodon/mastodon/pull/10100), [BenLubar](https://github.com/mastodon/mastodon/pull/10212)) +- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/mastodon/mastodon/pull/9059)) +- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10339)) +- Change web UI to not not empty timeline of blocked users on block ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10359)) +- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/mastodon/mastodon/pull/10378)) +- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/mastodon/mastodon/pull/9924)) +- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/mastodon/mastodon/pull/10289)) +- Change web UI to use new Web Share Target API ([gol-cha](https://github.com/mastodon/mastodon/pull/9963)) +- Change ActivityPub reports to have persistent URIs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10303)) +- Change `tootctl accounts cull --dry-run` to list accounts that would be deleted ([BenLubar](https://github.com/mastodon/mastodon/pull/10460)) +- Change format of CSV exports of follows and mutes to include extra settings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10495), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10335)) +- Change ActivityPub collections to be cacheable by proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10467)) +- Change REST API and public profiles to not return follows/followers for users that have blocked you ([Gargron](https://github.com/mastodon/mastodon/pull/10491)) +- Change the groupings of menu items in settings navigation ([Gargron](https://github.com/mastodon/mastodon/pull/10533)) ### Removed -- Remove zopfli compression to speed up Webpack from 6min to 1min ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10288)) -- Remove stats.json generation to speed up Webpack ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10290)) +- Remove zopfli compression to speed up Webpack from 6min to 1min ([nolanlawson](https://github.com/mastodon/mastodon/pull/10288)) +- Remove stats.json generation to speed up Webpack ([nolanlawson](https://github.com/mastodon/mastodon/pull/10290)) ### Fixed -- Fix public timelines being broken by new toots when they are not mounted in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10131)) -- Fix quick filter settings not being saved when selecting a different filter in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10296)) -- Fix remote interaction dialogs being indexed by search engines ([Gargron](https://github.com/tootsuite/mastodon/pull/10240)) -- Fix maxed-out invites not showing up as expired in UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10274)) -- Fix scrollbar styles on compose textarea ([Gargron](https://github.com/tootsuite/mastodon/pull/10292)) -- Fix timeline merge workers being queued for remote users ([Gargron](https://github.com/tootsuite/mastodon/pull/10355)) -- Fix alternative relay support regression ([Gargron](https://github.com/tootsuite/mastodon/pull/10398)) -- Fix trying to fetch keys of unknown accounts on a self-delete from them ([ThibG](https://github.com/tootsuite/mastodon/pull/10326)) -- Fix CAS `:service_validate_url` option ([enewhuis](https://github.com/tootsuite/mastodon/pull/10328)) -- Fix race conditions when creating backups ([ThibG](https://github.com/tootsuite/mastodon/pull/10234)) -- Fix whitespace not being stripped out of username before validation ([aurelien-reeves](https://github.com/tootsuite/mastodon/pull/10239)) -- Fix n+1 query when deleting status ([Gargron](https://github.com/tootsuite/mastodon/pull/10247)) -- Fix exiting follows not being rejected when suspending a remote account ([ThibG](https://github.com/tootsuite/mastodon/pull/10230)) -- Fix the underlying button element in a disabled icon button not being disabled ([ThibG](https://github.com/tootsuite/mastodon/pull/10194)) -- Fix race condition when streaming out deleted statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10280)) -- Fix performance of admin federation UI by caching account counts ([Gargron](https://github.com/tootsuite/mastodon/pull/10374)) -- Fix JS error on pages that don't define a CSRF token ([hinaloe](https://github.com/tootsuite/mastodon/pull/10383)) -- Fix `tootctl accounts cull` sometimes removing accounts that are temporarily unreachable ([BenLubar](https://github.com/tootsuite/mastodon/pull/10460)) +- Fix public timelines being broken by new toots when they are not mounted in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10131)) +- Fix quick filter settings not being saved when selecting a different filter in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10296)) +- Fix remote interaction dialogs being indexed by search engines ([Gargron](https://github.com/mastodon/mastodon/pull/10240)) +- Fix maxed-out invites not showing up as expired in UI ([Gargron](https://github.com/mastodon/mastodon/pull/10274)) +- Fix scrollbar styles on compose textarea ([Gargron](https://github.com/mastodon/mastodon/pull/10292)) +- Fix timeline merge workers being queued for remote users ([Gargron](https://github.com/mastodon/mastodon/pull/10355)) +- Fix alternative relay support regression ([Gargron](https://github.com/mastodon/mastodon/pull/10398)) +- Fix trying to fetch keys of unknown accounts on a self-delete from them ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10326)) +- Fix CAS `:service_validate_url` option ([enewhuis](https://github.com/mastodon/mastodon/pull/10328)) +- Fix race conditions when creating backups ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10234)) +- Fix whitespace not being stripped out of username before validation ([aurelien-reeves](https://github.com/mastodon/mastodon/pull/10239)) +- Fix n+1 query when deleting status ([Gargron](https://github.com/mastodon/mastodon/pull/10247)) +- Fix exiting follows not being rejected when suspending a remote account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10230)) +- Fix the underlying button element in a disabled icon button not being disabled ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10194)) +- Fix race condition when streaming out deleted statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10280)) +- Fix performance of admin federation UI by caching account counts ([Gargron](https://github.com/mastodon/mastodon/pull/10374)) +- Fix JS error on pages that don't define a CSRF token ([hinaloe](https://github.com/mastodon/mastodon/pull/10383)) +- Fix `tootctl accounts cull` sometimes removing accounts that are temporarily unreachable ([BenLubar](https://github.com/mastodon/mastodon/pull/10460)) ## [2.7.4] - 2019-03-05 ### Fixed -- Fix web UI not cleaning up notifications after block ([Gargron](https://github.com/tootsuite/mastodon/pull/10108)) -- Fix redundant HTTP requests when resolving private statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10115)) -- Fix performance of account media query ([abcang](https://github.com/tootsuite/mastodon/pull/10121)) -- Fix mention processing for unknown accounts ([ThibG](https://github.com/tootsuite/mastodon/pull/10125)) -- Fix getting started column not scrolling on short screens ([trwnh](https://github.com/tootsuite/mastodon/pull/10075)) -- Fix direct messages pagination in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10126)) -- Fix serialization of Announce activities ([ThibG](https://github.com/tootsuite/mastodon/pull/10129)) -- Fix home timeline perpetually reloading when empty in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10130)) -- Fix lists export ([ThibG](https://github.com/tootsuite/mastodon/pull/10136)) -- Fix edit profile page crash for suspended-then-unsuspended users ([ThibG](https://github.com/tootsuite/mastodon/pull/10178)) +- Fix web UI not cleaning up notifications after block ([Gargron](https://github.com/mastodon/mastodon/pull/10108)) +- Fix redundant HTTP requests when resolving private statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10115)) +- Fix performance of account media query ([abcang](https://github.com/mastodon/mastodon/pull/10121)) +- Fix mention processing for unknown accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10125)) +- Fix getting started column not scrolling on short screens ([trwnh](https://github.com/mastodon/mastodon/pull/10075)) +- Fix direct messages pagination in the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10126)) +- Fix serialization of Announce activities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10129)) +- Fix home timeline perpetually reloading when empty in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10130)) +- Fix lists export ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10136)) +- Fix edit profile page crash for suspended-then-unsuspended users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10178)) ## [2.7.3] - 2019-02-23 ### Added -- Add domain filter to the admin federation page ([ThibG](https://github.com/tootsuite/mastodon/pull/10071)) -- Add quick link from admin account view to block/unblock instance ([ThibG](https://github.com/tootsuite/mastodon/pull/10073)) +- Add domain filter to the admin federation page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10071)) +- Add quick link from admin account view to block/unblock instance ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10073)) ### Fixed -- Fix video player width not being updated to fit container width ([ThibG](https://github.com/tootsuite/mastodon/pull/10069)) -- Fix domain filter being shown in admin page when local filter is active ([ThibG](https://github.com/tootsuite/mastodon/pull/10074)) -- Fix crash when conversations have no valid participants ([ThibG](https://github.com/tootsuite/mastodon/pull/10078)) -- Fix error when performing admin actions on no statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10094)) +- Fix video player width not being updated to fit container width ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10069)) +- Fix domain filter being shown in admin page when local filter is active ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10074)) +- Fix crash when conversations have no valid participants ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10078)) +- Fix error when performing admin actions on no statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10094)) ### Changed -- Change custom emojis to randomize stored file name ([hinaloe](https://github.com/tootsuite/mastodon/pull/10090)) +- Change custom emojis to randomize stored file name ([hinaloe](https://github.com/mastodon/mastodon/pull/10090)) ## [2.7.2] - 2019-02-17 ### Added -- Add support for IPv6 in e-mail validation ([zoc](https://github.com/tootsuite/mastodon/pull/10009)) -- Add record of IP address used for signing up ([ThibG](https://github.com/tootsuite/mastodon/pull/10026)) -- Add tight rate-limit for API deletions (30 per 30 minutes) ([Gargron](https://github.com/tootsuite/mastodon/pull/10042)) -- Add support for embedded `Announce` objects attributed to the same actor ([ThibG](https://github.com/tootsuite/mastodon/pull/9998), [Gargron](https://github.com/tootsuite/mastodon/pull/10065)) -- Add spam filter for `Create` and `Announce` activities ([Gargron](https://github.com/tootsuite/mastodon/pull/10005), [Gargron](https://github.com/tootsuite/mastodon/pull/10041), [Gargron](https://github.com/tootsuite/mastodon/pull/10062)) -- Add `registrations` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/tootsuite/mastodon/pull/10060)) -- Add `vapid_key` to `POST /api/v1/apps` and `GET /api/v1/apps/verify_credentials` ([Gargron](https://github.com/tootsuite/mastodon/pull/10058)) +- Add support for IPv6 in e-mail validation ([zoc](https://github.com/mastodon/mastodon/pull/10009)) +- Add record of IP address used for signing up ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10026)) +- Add tight rate-limit for API deletions (30 per 30 minutes) ([Gargron](https://github.com/mastodon/mastodon/pull/10042)) +- Add support for embedded `Announce` objects attributed to the same actor ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9998), [Gargron](https://github.com/mastodon/mastodon/pull/10065)) +- Add spam filter for `Create` and `Announce` activities ([Gargron](https://github.com/mastodon/mastodon/pull/10005), [Gargron](https://github.com/mastodon/mastodon/pull/10041), [Gargron](https://github.com/mastodon/mastodon/pull/10062)) +- Add `registrations` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/mastodon/mastodon/pull/10060)) +- Add `vapid_key` to `POST /api/v1/apps` and `GET /api/v1/apps/verify_credentials` ([Gargron](https://github.com/mastodon/mastodon/pull/10058)) ### Fixed -- Fix link color and add link underlines in high-contrast theme ([Gargron](https://github.com/tootsuite/mastodon/pull/9949), [Gargron](https://github.com/tootsuite/mastodon/pull/10028)) -- Fix unicode characters in URLs not being linkified ([JMendyk](https://github.com/tootsuite/mastodon/pull/8447), [hinaloe](https://github.com/tootsuite/mastodon/pull/9991)) -- Fix URLs linkifier grabbing ending quotation as part of the link ([Gargron](https://github.com/tootsuite/mastodon/pull/9997)) -- Fix authorized applications page design ([rinsuki](https://github.com/tootsuite/mastodon/pull/9969)) -- Fix custom emojis not showing up in share page emoji picker ([rinsuki](https://github.com/tootsuite/mastodon/pull/9970)) -- Fix too liberal application of whitespace in toots ([trwnh](https://github.com/tootsuite/mastodon/pull/9968)) -- Fix misleading e-mail hint being displayed in admin view ([ThibG](https://github.com/tootsuite/mastodon/pull/9973)) -- Fix tombstones not being cleared out ([abcang](https://github.com/tootsuite/mastodon/pull/9978)) -- Fix some timeline jumps ([ThibG](https://github.com/tootsuite/mastodon/pull/9982), [ThibG](https://github.com/tootsuite/mastodon/pull/10001), [rinsuki](https://github.com/tootsuite/mastodon/pull/10046)) -- Fix content warning input taking keyboard focus even when hidden ([hinaloe](https://github.com/tootsuite/mastodon/pull/10017)) -- Fix hashtags select styling in default and high-contrast themes ([Gargron](https://github.com/tootsuite/mastodon/pull/10029)) -- Fix style regressions on landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10030)) -- Fix hashtag column not subscribing to stream on mount ([Gargron](https://github.com/tootsuite/mastodon/pull/10040)) -- Fix relay enabling/disabling not resetting inbox availability status ([Gargron](https://github.com/tootsuite/mastodon/pull/10048)) -- Fix mutes, blocks, domain blocks and follow requests not paginating ([Gargron](https://github.com/tootsuite/mastodon/pull/10057)) -- Fix crash on public hashtag pages when streaming fails ([ThibG](https://github.com/tootsuite/mastodon/pull/10061)) +- Fix link color and add link underlines in high-contrast theme ([Gargron](https://github.com/mastodon/mastodon/pull/9949), [Gargron](https://github.com/mastodon/mastodon/pull/10028)) +- Fix unicode characters in URLs not being linkified ([JMendyk](https://github.com/mastodon/mastodon/pull/8447), [hinaloe](https://github.com/mastodon/mastodon/pull/9991)) +- Fix URLs linkifier grabbing ending quotation as part of the link ([Gargron](https://github.com/mastodon/mastodon/pull/9997)) +- Fix authorized applications page design ([rinsuki](https://github.com/mastodon/mastodon/pull/9969)) +- Fix custom emojis not showing up in share page emoji picker ([rinsuki](https://github.com/mastodon/mastodon/pull/9970)) +- Fix too liberal application of whitespace in toots ([trwnh](https://github.com/mastodon/mastodon/pull/9968)) +- Fix misleading e-mail hint being displayed in admin view ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9973)) +- Fix tombstones not being cleared out ([abcang](https://github.com/mastodon/mastodon/pull/9978)) +- Fix some timeline jumps ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9982), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10001), [rinsuki](https://github.com/mastodon/mastodon/pull/10046)) +- Fix content warning input taking keyboard focus even when hidden ([hinaloe](https://github.com/mastodon/mastodon/pull/10017)) +- Fix hashtags select styling in default and high-contrast themes ([Gargron](https://github.com/mastodon/mastodon/pull/10029)) +- Fix style regressions on landing page ([Gargron](https://github.com/mastodon/mastodon/pull/10030)) +- Fix hashtag column not subscribing to stream on mount ([Gargron](https://github.com/mastodon/mastodon/pull/10040)) +- Fix relay enabling/disabling not resetting inbox availability status ([Gargron](https://github.com/mastodon/mastodon/pull/10048)) +- Fix mutes, blocks, domain blocks and follow requests not paginating ([Gargron](https://github.com/mastodon/mastodon/pull/10057)) +- Fix crash on public hashtag pages when streaming fails ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10061)) ### Changed -- Change icon for unlisted visibility level ([clarcharr](https://github.com/tootsuite/mastodon/pull/9952)) -- Change queue of actor deletes from push to pull for non-follower recipients ([ThibG](https://github.com/tootsuite/mastodon/pull/10016)) -- Change robots.txt to exclude media proxy URLs ([nightpool](https://github.com/tootsuite/mastodon/pull/10038)) -- Change upload description input to allow line breaks ([BenLubar](https://github.com/tootsuite/mastodon/pull/10036)) -- Change `dist/mastodon-streaming.service` to recommend running node without intermediary npm command ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10032)) -- Change conversations to always show names of other participants ([Gargron](https://github.com/tootsuite/mastodon/pull/10047)) -- Change buttons on timeline preview to open the interaction dialog ([Gargron](https://github.com/tootsuite/mastodon/pull/10054)) -- Change error graphic to hover-to-play ([Gargron](https://github.com/tootsuite/mastodon/pull/10055)) +- Change icon for unlisted visibility level ([clarcharr](https://github.com/mastodon/mastodon/pull/9952)) +- Change queue of actor deletes from push to pull for non-follower recipients ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10016)) +- Change robots.txt to exclude media proxy URLs ([nightpool](https://github.com/mastodon/mastodon/pull/10038)) +- Change upload description input to allow line breaks ([BenLubar](https://github.com/mastodon/mastodon/pull/10036)) +- Change `dist/mastodon-streaming.service` to recommend running node without intermediary npm command ([nolanlawson](https://github.com/mastodon/mastodon/pull/10032)) +- Change conversations to always show names of other participants ([Gargron](https://github.com/mastodon/mastodon/pull/10047)) +- Change buttons on timeline preview to open the interaction dialog ([Gargron](https://github.com/mastodon/mastodon/pull/10054)) +- Change error graphic to hover-to-play ([Gargron](https://github.com/mastodon/mastodon/pull/10055)) ## [2.7.1] - 2019-01-28 ### Fixed -- Fix SSO authentication not working due to missing agreement boolean ([Gargron](https://github.com/tootsuite/mastodon/pull/9915)) -- Fix slow fallback of CopyAccountStats migration setting stats to 0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9930)) -- Fix wrong command in migration error message ([angristan](https://github.com/tootsuite/mastodon/pull/9877)) -- Fix initial value of volume slider in video player and handle volume changes ([ThibG](https://github.com/tootsuite/mastodon/pull/9929)) -- Fix missing hotkeys for notifications ([ThibG](https://github.com/tootsuite/mastodon/pull/9927)) -- Fix being able to attach unattached media created by other users ([ThibG](https://github.com/tootsuite/mastodon/pull/9921)) -- Fix unrescued SSL error during link verification ([renatolond](https://github.com/tootsuite/mastodon/pull/9914)) -- Fix Firefox scrollbar color regression ([trwnh](https://github.com/tootsuite/mastodon/pull/9908)) -- Fix scheduled status with media immediately creating a status ([ThibG](https://github.com/tootsuite/mastodon/pull/9894)) -- Fix missing strong style for landing page description ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9892)) +- Fix SSO authentication not working due to missing agreement boolean ([Gargron](https://github.com/mastodon/mastodon/pull/9915)) +- Fix slow fallback of CopyAccountStats migration setting stats to 0 ([Gargron](https://github.com/mastodon/mastodon/pull/9930)) +- Fix wrong command in migration error message ([angristan](https://github.com/mastodon/mastodon/pull/9877)) +- Fix initial value of volume slider in video player and handle volume changes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9929)) +- Fix missing hotkeys for notifications ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9927)) +- Fix being able to attach unattached media created by other users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9921)) +- Fix unrescued SSL error during link verification ([renatolond](https://github.com/mastodon/mastodon/pull/9914)) +- Fix Firefox scrollbar color regression ([trwnh](https://github.com/mastodon/mastodon/pull/9908)) +- Fix scheduled status with media immediately creating a status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9894)) +- Fix missing strong style for landing page description ([Kjwon15](https://github.com/mastodon/mastodon/pull/9892)) ## [2.7.0] - 2019-01-20 ### Added -- Add link for adding a user to a list from their profile ([namelessGonbai](https://github.com/tootsuite/mastodon/pull/9062)) -- Add joining several hashtags in a single column ([gdpelican](https://github.com/tootsuite/mastodon/pull/8904)) -- Add volume sliders for videos ([sumdog](https://github.com/tootsuite/mastodon/pull/9366)) -- Add a tooltip explaining what a locked account is ([pawelngei](https://github.com/tootsuite/mastodon/pull/9403)) -- Add preloaded cache for common JSON-LD contexts ([ThibG](https://github.com/tootsuite/mastodon/pull/9412)) -- Add profile directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9427)) -- Add setting to not group reblogs in home feed ([ThibG](https://github.com/tootsuite/mastodon/pull/9248)) -- Add admin ability to remove a user's header image ([ThibG](https://github.com/tootsuite/mastodon/pull/9495)) -- Add account hashtags to ActivityPub actor JSON ([Gargron](https://github.com/tootsuite/mastodon/pull/9450)) -- Add error message for avatar image that's too large ([sumdog](https://github.com/tootsuite/mastodon/pull/9518)) -- Add notification quick-filter bar ([pawelngei](https://github.com/tootsuite/mastodon/pull/9399)) -- Add new first-time tutorial ([Gargron](https://github.com/tootsuite/mastodon/pull/9531)) -- Add moderation warnings ([Gargron](https://github.com/tootsuite/mastodon/pull/9519)) -- Add emoji codepoint mappings for v11.0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9618)) -- Add REST API for creating an account ([Gargron](https://github.com/tootsuite/mastodon/pull/9572)) -- Add support for Malayalam in language filter ([tachyons](https://github.com/tootsuite/mastodon/pull/9624)) -- Add exclude_reblogs option to account statuses API ([Gargron](https://github.com/tootsuite/mastodon/pull/9640)) -- Add local followers page to admin account UI ([chr-1x](https://github.com/tootsuite/mastodon/pull/9610)) -- Add healthcheck commands to docker-compose.yml ([BenLubar](https://github.com/tootsuite/mastodon/pull/9143)) -- Add handler for Move activity to migrate followers ([Gargron](https://github.com/tootsuite/mastodon/pull/9629)) -- Add CSV export for lists and domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/9677)) -- Add `tootctl accounts follow ACCT` ([Gargron](https://github.com/tootsuite/mastodon/pull/9414)) -- Add scheduled statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9706)) -- Add immutable caching for S3 objects ([nolanlawson](https://github.com/tootsuite/mastodon/pull/9722)) -- Add cache to custom emojis API ([Gargron](https://github.com/tootsuite/mastodon/pull/9732)) -- Add preview cards to non-detailed statuses on public pages ([Gargron](https://github.com/tootsuite/mastodon/pull/9714)) -- Add `mod` and `moderator` to list of default reserved usernames ([Gargron](https://github.com/tootsuite/mastodon/pull/9713)) -- Add quick links to the admin interface in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/8545)) -- Add `tootctl domains crawl` ([Gargron](https://github.com/tootsuite/mastodon/pull/9809)) -- Add attachment list fallback to public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9780)) -- Add `tootctl --version` ([Gargron](https://github.com/tootsuite/mastodon/pull/9835)) -- Add information about how to opt-in to the directory on the directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9834)) -- Add timeouts for S3 ([Gargron](https://github.com/tootsuite/mastodon/pull/9842)) -- Add support for non-public reblogs from ActivityPub ([Gargron](https://github.com/tootsuite/mastodon/pull/9841)) -- Add sending of `Reject` activity when sending a `Block` activity ([ThibG](https://github.com/tootsuite/mastodon/pull/9811)) +- Add link for adding a user to a list from their profile ([namelessGonbai](https://github.com/mastodon/mastodon/pull/9062)) +- Add joining several hashtags in a single column ([gdpelican](https://github.com/mastodon/mastodon/pull/8904)) +- Add volume sliders for videos ([sumdog](https://github.com/mastodon/mastodon/pull/9366)) +- Add a tooltip explaining what a locked account is ([pawelngei](https://github.com/mastodon/mastodon/pull/9403)) +- Add preloaded cache for common JSON-LD contexts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9412)) +- Add profile directory ([Gargron](https://github.com/mastodon/mastodon/pull/9427)) +- Add setting to not group reblogs in home feed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9248)) +- Add admin ability to remove a user's header image ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9495)) +- Add account hashtags to ActivityPub actor JSON ([Gargron](https://github.com/mastodon/mastodon/pull/9450)) +- Add error message for avatar image that's too large ([sumdog](https://github.com/mastodon/mastodon/pull/9518)) +- Add notification quick-filter bar ([pawelngei](https://github.com/mastodon/mastodon/pull/9399)) +- Add new first-time tutorial ([Gargron](https://github.com/mastodon/mastodon/pull/9531)) +- Add moderation warnings ([Gargron](https://github.com/mastodon/mastodon/pull/9519)) +- Add emoji codepoint mappings for v11.0 ([Gargron](https://github.com/mastodon/mastodon/pull/9618)) +- Add REST API for creating an account ([Gargron](https://github.com/mastodon/mastodon/pull/9572)) +- Add support for Malayalam in language filter ([tachyons](https://github.com/mastodon/mastodon/pull/9624)) +- Add exclude_reblogs option to account statuses API ([Gargron](https://github.com/mastodon/mastodon/pull/9640)) +- Add local followers page to admin account UI ([chr-1x](https://github.com/mastodon/mastodon/pull/9610)) +- Add healthcheck commands to docker-compose.yml ([BenLubar](https://github.com/mastodon/mastodon/pull/9143)) +- Add handler for Move activity to migrate followers ([Gargron](https://github.com/mastodon/mastodon/pull/9629)) +- Add CSV export for lists and domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/9677)) +- Add `tootctl accounts follow ACCT` ([Gargron](https://github.com/mastodon/mastodon/pull/9414)) +- Add scheduled statuses ([Gargron](https://github.com/mastodon/mastodon/pull/9706)) +- Add immutable caching for S3 objects ([nolanlawson](https://github.com/mastodon/mastodon/pull/9722)) +- Add cache to custom emojis API ([Gargron](https://github.com/mastodon/mastodon/pull/9732)) +- Add preview cards to non-detailed statuses on public pages ([Gargron](https://github.com/mastodon/mastodon/pull/9714)) +- Add `mod` and `moderator` to list of default reserved usernames ([Gargron](https://github.com/mastodon/mastodon/pull/9713)) +- Add quick links to the admin interface in the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8545)) +- Add `tootctl domains crawl` ([Gargron](https://github.com/mastodon/mastodon/pull/9809)) +- Add attachment list fallback to public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9780)) +- Add `tootctl --version` ([Gargron](https://github.com/mastodon/mastodon/pull/9835)) +- Add information about how to opt-in to the directory on the directory ([Gargron](https://github.com/mastodon/mastodon/pull/9834)) +- Add timeouts for S3 ([Gargron](https://github.com/mastodon/mastodon/pull/9842)) +- Add support for non-public reblogs from ActivityPub ([Gargron](https://github.com/mastodon/mastodon/pull/9841)) +- Add sending of `Reject` activity when sending a `Block` activity ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9811)) ### Changed -- Temporarily pause timeline if mouse moved recently ([lmorchard](https://github.com/tootsuite/mastodon/pull/9200)) -- Change the password form order ([mayaeh](https://github.com/tootsuite/mastodon/pull/9267)) -- Redesign admin UI for accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/9340), [Gargron](https://github.com/tootsuite/mastodon/pull/9643)) -- Redesign admin UI for instances/domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/9645)) -- Swap avatar and header input fields in profile page ([ThibG](https://github.com/tootsuite/mastodon/pull/9271)) -- When posting in mobile mode, go back to previous history location ([ThibG](https://github.com/tootsuite/mastodon/pull/9502)) -- Split out is_changing_upload from is_submitting ([ThibG](https://github.com/tootsuite/mastodon/pull/9536)) -- Back to the getting-started when pins the timeline. ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9561)) -- Allow unauthenticated REST API access to GET /api/v1/accounts/:id/statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9573)) -- Limit maximum visibility of local silenced users to unlisted ([ThibG](https://github.com/tootsuite/mastodon/pull/9583)) -- Change API error message for unconfirmed accounts ([noellabo](https://github.com/tootsuite/mastodon/pull/9625)) -- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/tootsuite/mastodon/pull/9378)) -- Do not ignore federated reports targetting already-reported accounts ([ThibG](https://github.com/tootsuite/mastodon/pull/9534)) -- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9688)) -- Change e-mail digest frequency ([Gargron](https://github.com/tootsuite/mastodon/pull/9689)) -- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/9438)) -- Display fallback link card thumbnail when none is given ([Gargron](https://github.com/tootsuite/mastodon/pull/9715)) -- Change account bio length validation to ignore mention domains and URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/9717)) -- Use configured contact user for "anonymous" federation activities ([yukimochi](https://github.com/tootsuite/mastodon/pull/9661)) -- Change remote interaction dialog to use specific actions instead of generic "interact" ([Gargron](https://github.com/tootsuite/mastodon/pull/9743)) -- Always re-fetch public key when signature verification fails to support blind key rotation ([ThibG](https://github.com/tootsuite/mastodon/pull/9667)) -- Make replies to boosts impossible, connect reply to original status instead ([valerauko](https://github.com/tootsuite/mastodon/pull/9129)) -- Change e-mail MX validation to check both A and MX records against blacklist ([Gargron](https://github.com/tootsuite/mastodon/pull/9489)) -- Hide floating action button on search and getting started pages ([tmm576](https://github.com/tootsuite/mastodon/pull/9826)) -- Redesign public hashtag page to use a masonry layout ([Gargron](https://github.com/tootsuite/mastodon/pull/9822)) -- Use `summary` as summary instead of content warning for converted ActivityPub objects ([Gargron](https://github.com/tootsuite/mastodon/pull/9823)) -- Display a double reply arrow on public pages for toots that are replies ([ThibG](https://github.com/tootsuite/mastodon/pull/9808)) -- Change admin UI right panel size to be wider ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9768)) +- Temporarily pause timeline if mouse moved recently ([lmorchard](https://github.com/mastodon/mastodon/pull/9200)) +- Change the password form order ([mayaeh](https://github.com/mastodon/mastodon/pull/9267)) +- Redesign admin UI for accounts ([Gargron](https://github.com/mastodon/mastodon/pull/9340), [Gargron](https://github.com/mastodon/mastodon/pull/9643)) +- Redesign admin UI for instances/domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/9645)) +- Swap avatar and header input fields in profile page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9271)) +- When posting in mobile mode, go back to previous history location ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9502)) +- Split out is_changing_upload from is_submitting ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9536)) +- Back to the getting-started when pins the timeline. ([kedamaDQ](https://github.com/mastodon/mastodon/pull/9561)) +- Allow unauthenticated REST API access to GET /api/v1/accounts/:id/statuses ([Gargron](https://github.com/mastodon/mastodon/pull/9573)) +- Limit maximum visibility of local silenced users to unlisted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9583)) +- Change API error message for unconfirmed accounts ([noellabo](https://github.com/mastodon/mastodon/pull/9625)) +- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/mastodon/mastodon/pull/9378)) +- Do not ignore federated reports targetting already-reported accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9534)) +- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/mastodon/mastodon/pull/9688)) +- Change e-mail digest frequency ([Gargron](https://github.com/mastodon/mastodon/pull/9689)) +- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/mastodon/mastodon/pull/9438)) +- Display fallback link card thumbnail when none is given ([Gargron](https://github.com/mastodon/mastodon/pull/9715)) +- Change account bio length validation to ignore mention domains and URLs ([Gargron](https://github.com/mastodon/mastodon/pull/9717)) +- Use configured contact user for "anonymous" federation activities ([yukimochi](https://github.com/mastodon/mastodon/pull/9661)) +- Change remote interaction dialog to use specific actions instead of generic "interact" ([Gargron](https://github.com/mastodon/mastodon/pull/9743)) +- Always re-fetch public key when signature verification fails to support blind key rotation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9667)) +- Make replies to boosts impossible, connect reply to original status instead ([valerauko](https://github.com/mastodon/mastodon/pull/9129)) +- Change e-mail MX validation to check both A and MX records against blacklist ([Gargron](https://github.com/mastodon/mastodon/pull/9489)) +- Hide floating action button on search and getting started pages ([tmm576](https://github.com/mastodon/mastodon/pull/9826)) +- Redesign public hashtag page to use a masonry layout ([Gargron](https://github.com/mastodon/mastodon/pull/9822)) +- Use `summary` as summary instead of content warning for converted ActivityPub objects ([Gargron](https://github.com/mastodon/mastodon/pull/9823)) +- Display a double reply arrow on public pages for toots that are replies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9808)) +- Change admin UI right panel size to be wider ([Kjwon15](https://github.com/mastodon/mastodon/pull/9768)) ### Removed -- Remove links to bridge.joinmastodon.org (non-functional) ([Gargron](https://github.com/tootsuite/mastodon/pull/9608)) -- Remove LD-Signatures from activities that do not need them ([ThibG](https://github.com/tootsuite/mastodon/pull/9659)) +- Remove links to bridge.joinmastodon.org (non-functional) ([Gargron](https://github.com/mastodon/mastodon/pull/9608)) +- Remove LD-Signatures from activities that do not need them ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9659)) ### Fixed -- Remove unused computation of reblog references from updateTimeline ([ThibG](https://github.com/tootsuite/mastodon/pull/9244)) -- Fix loaded embeds resetting if a status arrives from API again ([ThibG](https://github.com/tootsuite/mastodon/pull/9270)) -- Fix race condition causing shallow status with only a "favourited" attribute ([ThibG](https://github.com/tootsuite/mastodon/pull/9272)) -- Remove intermediary arrays when creating hash maps from results ([Gargron](https://github.com/tootsuite/mastodon/pull/9291)) -- Extract counters from accounts table to account_stats table to improve performance ([Gargron](https://github.com/tootsuite/mastodon/pull/9295)) -- Change identities id column to a bigint ([Gargron](https://github.com/tootsuite/mastodon/pull/9371)) -- Fix conversations API pagination ([ThibG](https://github.com/tootsuite/mastodon/pull/9407)) -- Improve account suspension speed and completeness ([Gargron](https://github.com/tootsuite/mastodon/pull/9290)) -- Fix thread depth computation in statuses_controller ([ThibG](https://github.com/tootsuite/mastodon/pull/9426)) -- Fix database deadlocks by moving account stats update outside transaction ([ThibG](https://github.com/tootsuite/mastodon/pull/9437)) -- Escape HTML in profile name preview in profile settings ([pawelngei](https://github.com/tootsuite/mastodon/pull/9446)) -- Use same CORS policy for /@:username and /users/:username ([ThibG](https://github.com/tootsuite/mastodon/pull/9485)) -- Make custom emoji domains case insensitive ([Esteth](https://github.com/tootsuite/mastodon/pull/9474)) -- Various fixes to scrollable lists and media gallery ([ThibG](https://github.com/tootsuite/mastodon/pull/9501)) -- Fix bootsnap cache directory being declared relatively ([Gargron](https://github.com/tootsuite/mastodon/pull/9511)) -- Fix timeline pagination in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9516)) -- Fix padding on dropdown elements in preferences ([ThibG](https://github.com/tootsuite/mastodon/pull/9517)) -- Make avatar and headers respect GIF autoplay settings ([ThibG](https://github.com/tootsuite/mastodon/pull/9515)) -- Do no retry Web Push workers if the server returns a 4xx response ([Gargron](https://github.com/tootsuite/mastodon/pull/9434)) -- Minor scrollable list fixes ([ThibG](https://github.com/tootsuite/mastodon/pull/9551)) -- Ignore low-confidence CharlockHolmes guesses when parsing link cards ([ThibG](https://github.com/tootsuite/mastodon/pull/9510)) -- Fix `tootctl accounts rotate` not updating public keys ([Gargron](https://github.com/tootsuite/mastodon/pull/9556)) -- Fix CSP / X-Frame-Options for media players ([jomo](https://github.com/tootsuite/mastodon/pull/9558)) -- Fix unnecessary loadMore calls when the end of a timeline has been reached ([ThibG](https://github.com/tootsuite/mastodon/pull/9581)) -- Skip mailer job retries when a record no longer exists ([Gargron](https://github.com/tootsuite/mastodon/pull/9590)) -- Fix composer not getting focus after reply confirmation dialog ([ThibG](https://github.com/tootsuite/mastodon/pull/9602)) -- Fix signature verification stoplight triggering on non-timeout errors ([Gargron](https://github.com/tootsuite/mastodon/pull/9617)) -- Fix ThreadResolveWorker getting queued with invalid URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/9628)) -- Fix crash when clearing uninitialized timeline ([ThibG](https://github.com/tootsuite/mastodon/pull/9662)) -- Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker ([ThibG](https://github.com/tootsuite/mastodon/pull/9660)) -- Skip full text search if it fails, instead of erroring out completely ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9654)) -- Fix profile metadata links not verifying correctly sometimes ([shrft](https://github.com/tootsuite/mastodon/pull/9673)) -- Ensure blocked user unfollows blocker if Block/Undo-Block activities are processed out of order ([ThibG](https://github.com/tootsuite/mastodon/pull/9687)) -- Fix unreadable text color in report modal for some statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9716)) -- Stop GIFV timeline preview explicitly when it's opened in modal ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9749)) -- Fix scrollbar width compensation ([ThibG](https://github.com/tootsuite/mastodon/pull/9824)) -- Fix race conditions when processing deleted toots ([ThibG](https://github.com/tootsuite/mastodon/pull/9815)) -- Fix SSO issues on WebKit browsers by disabling Same-Site cookie again ([moritzheiber](https://github.com/tootsuite/mastodon/pull/9819)) -- Fix empty OEmbed error ([renatolond](https://github.com/tootsuite/mastodon/pull/9807)) -- Fix drag & drop modal not disappearing sometimes ([hinaloe](https://github.com/tootsuite/mastodon/pull/9797)) -- Fix statuses with content warnings being displayed in web push notifications sometimes ([ThibG](https://github.com/tootsuite/mastodon/pull/9778)) -- Fix scroll-to-detailed status not working on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9773)) -- Fix media modal loading indicator ([ThibG](https://github.com/tootsuite/mastodon/pull/9771)) -- Fix hashtag search results not having a permalink fallback in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9810)) -- Fix slightly cropped font on settings page dropdowns when using system font ([ariasuni](https://github.com/tootsuite/mastodon/pull/9839)) -- Fix not being able to drag & drop text into forms ([tmm576](https://github.com/tootsuite/mastodon/pull/9840)) +- Remove unused computation of reblog references from updateTimeline ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9244)) +- Fix loaded embeds resetting if a status arrives from API again ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9270)) +- Fix race condition causing shallow status with only a "favourited" attribute ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9272)) +- Remove intermediary arrays when creating hash maps from results ([Gargron](https://github.com/mastodon/mastodon/pull/9291)) +- Extract counters from accounts table to account_stats table to improve performance ([Gargron](https://github.com/mastodon/mastodon/pull/9295)) +- Change identities id column to a bigint ([Gargron](https://github.com/mastodon/mastodon/pull/9371)) +- Fix conversations API pagination ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9407)) +- Improve account suspension speed and completeness ([Gargron](https://github.com/mastodon/mastodon/pull/9290)) +- Fix thread depth computation in statuses_controller ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9426)) +- Fix database deadlocks by moving account stats update outside transaction ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9437)) +- Escape HTML in profile name preview in profile settings ([pawelngei](https://github.com/mastodon/mastodon/pull/9446)) +- Use same CORS policy for /@:username and /users/:username ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9485)) +- Make custom emoji domains case insensitive ([Esteth](https://github.com/mastodon/mastodon/pull/9474)) +- Various fixes to scrollable lists and media gallery ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9501)) +- Fix bootsnap cache directory being declared relatively ([Gargron](https://github.com/mastodon/mastodon/pull/9511)) +- Fix timeline pagination in the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9516)) +- Fix padding on dropdown elements in preferences ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9517)) +- Make avatar and headers respect GIF autoplay settings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9515)) +- Do no retry Web Push workers if the server returns a 4xx response ([Gargron](https://github.com/mastodon/mastodon/pull/9434)) +- Minor scrollable list fixes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9551)) +- Ignore low-confidence CharlockHolmes guesses when parsing link cards ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9510)) +- Fix `tootctl accounts rotate` not updating public keys ([Gargron](https://github.com/mastodon/mastodon/pull/9556)) +- Fix CSP / X-Frame-Options for media players ([jomo](https://github.com/mastodon/mastodon/pull/9558)) +- Fix unnecessary loadMore calls when the end of a timeline has been reached ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9581)) +- Skip mailer job retries when a record no longer exists ([Gargron](https://github.com/mastodon/mastodon/pull/9590)) +- Fix composer not getting focus after reply confirmation dialog ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9602)) +- Fix signature verification stoplight triggering on non-timeout errors ([Gargron](https://github.com/mastodon/mastodon/pull/9617)) +- Fix ThreadResolveWorker getting queued with invalid URLs ([Gargron](https://github.com/mastodon/mastodon/pull/9628)) +- Fix crash when clearing uninitialized timeline ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9662)) +- Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9660)) +- Skip full text search if it fails, instead of erroring out completely ([Kjwon15](https://github.com/mastodon/mastodon/pull/9654)) +- Fix profile metadata links not verifying correctly sometimes ([shrft](https://github.com/mastodon/mastodon/pull/9673)) +- Ensure blocked user unfollows blocker if Block/Undo-Block activities are processed out of order ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9687)) +- Fix unreadable text color in report modal for some statuses ([Gargron](https://github.com/mastodon/mastodon/pull/9716)) +- Stop GIFV timeline preview explicitly when it's opened in modal ([kedamaDQ](https://github.com/mastodon/mastodon/pull/9749)) +- Fix scrollbar width compensation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9824)) +- Fix race conditions when processing deleted toots ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9815)) +- Fix SSO issues on WebKit browsers by disabling Same-Site cookie again ([moritzheiber](https://github.com/mastodon/mastodon/pull/9819)) +- Fix empty OEmbed error ([renatolond](https://github.com/mastodon/mastodon/pull/9807)) +- Fix drag & drop modal not disappearing sometimes ([hinaloe](https://github.com/mastodon/mastodon/pull/9797)) +- Fix statuses with content warnings being displayed in web push notifications sometimes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9778)) +- Fix scroll-to-detailed status not working on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9773)) +- Fix media modal loading indicator ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9771)) +- Fix hashtag search results not having a permalink fallback in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9810)) +- Fix slightly cropped font on settings page dropdowns when using system font ([ariasuni](https://github.com/mastodon/mastodon/pull/9839)) +- Fix not being able to drag & drop text into forms ([tmm576](https://github.com/mastodon/mastodon/pull/9840)) ### Security -- Sanitize and sandbox toot embeds in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9552)) -- Add tombstones for remote statuses to prevent replay attacks ([ThibG](https://github.com/tootsuite/mastodon/pull/9830)) +- Sanitize and sandbox toot embeds in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9552)) +- Add tombstones for remote statuses to prevent replay attacks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9830)) ## [2.6.5] - 2018-12-01 ### Changed -- Change lists to display replies to others on the list and list owner ([ThibG](https://github.com/tootsuite/mastodon/pull/9324)) +- Change lists to display replies to others on the list and list owner ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9324)) ### Fixed -- Fix failures caused by commonly-used JSON-LD contexts being unavailable ([ThibG](https://github.com/tootsuite/mastodon/pull/9412)) +- Fix failures caused by commonly-used JSON-LD contexts being unavailable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9412)) ## [2.6.4] - 2018-11-30 ### Fixed -- Fix yarn dependencies not installing due to yanked event-stream package ([Gargron](https://github.com/tootsuite/mastodon/pull/9401)) +- Fix yarn dependencies not installing due to yanked event-stream package ([Gargron](https://github.com/mastodon/mastodon/pull/9401)) ## [2.6.3] - 2018-11-30 ### Added -- Add hyphen to characters allowed in remote usernames ([ThibG](https://github.com/tootsuite/mastodon/pull/9345)) +- Add hyphen to characters allowed in remote usernames ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9345)) ### Changed -- Change server user count to exclude suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/9380)) +- Change server user count to exclude suspended accounts ([Gargron](https://github.com/mastodon/mastodon/pull/9380)) ### Fixed -- Fix ffmpeg processing sometimes stalling due to overfilled stdout buffer ([hugogameiro](https://github.com/tootsuite/mastodon/pull/9368)) -- Fix missing DNS records raising the wrong kind of exception ([Gargron](https://github.com/tootsuite/mastodon/pull/9379)) -- Fix already queued deliveries still trying to reach inboxes marked as unavailable ([Gargron](https://github.com/tootsuite/mastodon/pull/9358)) +- Fix ffmpeg processing sometimes stalling due to overfilled stdout buffer ([hugogameiro](https://github.com/mastodon/mastodon/pull/9368)) +- Fix missing DNS records raising the wrong kind of exception ([Gargron](https://github.com/mastodon/mastodon/pull/9379)) +- Fix already queued deliveries still trying to reach inboxes marked as unavailable ([Gargron](https://github.com/mastodon/mastodon/pull/9358)) ### Security -- Fix TLS handshake timeout not being enforced ([Gargron](https://github.com/tootsuite/mastodon/pull/9381)) +- Fix TLS handshake timeout not being enforced ([Gargron](https://github.com/mastodon/mastodon/pull/9381)) ## [2.6.2] - 2018-11-23 ### Added -- Add Page to whitelisted ActivityPub types ([mbajur](https://github.com/tootsuite/mastodon/pull/9188)) -- Add 20px to column width in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9227)) -- Add amount of freed disk space in `tootctl media remove` ([Gargron](https://github.com/tootsuite/mastodon/pull/9229), [Gargron](https://github.com/tootsuite/mastodon/pull/9239), [mayaeh](https://github.com/tootsuite/mastodon/pull/9288)) -- Add "Show thread" link to self-replies ([Gargron](https://github.com/tootsuite/mastodon/pull/9228)) +- Add Page to whitelisted ActivityPub types ([mbajur](https://github.com/mastodon/mastodon/pull/9188)) +- Add 20px to column width in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/9227)) +- Add amount of freed disk space in `tootctl media remove` ([Gargron](https://github.com/mastodon/mastodon/pull/9229), [Gargron](https://github.com/mastodon/mastodon/pull/9239), [mayaeh](https://github.com/mastodon/mastodon/pull/9288)) +- Add "Show thread" link to self-replies ([Gargron](https://github.com/mastodon/mastodon/pull/9228)) ### Changed -- Change order of Atom and RSS links so Atom is first ([Alkarex](https://github.com/tootsuite/mastodon/pull/9302)) -- Change Nginx configuration for Nanobox apps ([danhunsaker](https://github.com/tootsuite/mastodon/pull/9310)) -- Change the follow action to appear instant in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9220)) -- Change how the ActiveRecord connection is instantiated in on_worker_boot ([Gargron](https://github.com/tootsuite/mastodon/pull/9238)) -- Change `tootctl accounts cull` to always touch accounts so they can be skipped ([renatolond](https://github.com/tootsuite/mastodon/pull/9293)) -- Change mime type comparison to ignore JSON-LD profile ([valerauko](https://github.com/tootsuite/mastodon/pull/9179)) +- Change order of Atom and RSS links so Atom is first ([Alkarex](https://github.com/mastodon/mastodon/pull/9302)) +- Change Nginx configuration for Nanobox apps ([danhunsaker](https://github.com/mastodon/mastodon/pull/9310)) +- Change the follow action to appear instant in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/9220)) +- Change how the ActiveRecord connection is instantiated in on_worker_boot ([Gargron](https://github.com/mastodon/mastodon/pull/9238)) +- Change `tootctl accounts cull` to always touch accounts so they can be skipped ([renatolond](https://github.com/mastodon/mastodon/pull/9293)) +- Change mime type comparison to ignore JSON-LD profile ([valerauko](https://github.com/mastodon/mastodon/pull/9179)) ### Fixed -- Fix web UI crash when conversation has no last status ([sammy8806](https://github.com/tootsuite/mastodon/pull/9207)) -- Fix follow limit validator reporting lower number past threshold ([Gargron](https://github.com/tootsuite/mastodon/pull/9230)) -- Fix form validation flash message color and input borders ([Gargron](https://github.com/tootsuite/mastodon/pull/9235)) -- Fix invalid twitter:player cards being displayed ([ThibG](https://github.com/tootsuite/mastodon/pull/9254)) -- Fix emoji update date being processed incorrectly ([ThibG](https://github.com/tootsuite/mastodon/pull/9255)) -- Fix playing embed resetting if status is reloaded in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9270), [Gargron](https://github.com/tootsuite/mastodon/pull/9275)) -- Fix web UI crash when favouriting a deleted status ([ThibG](https://github.com/tootsuite/mastodon/pull/9272)) -- Fix intermediary arrays being created for hash maps ([Gargron](https://github.com/tootsuite/mastodon/pull/9291)) -- Fix filter ID not being a string in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9303)) +- Fix web UI crash when conversation has no last status ([sammy8806](https://github.com/mastodon/mastodon/pull/9207)) +- Fix follow limit validator reporting lower number past threshold ([Gargron](https://github.com/mastodon/mastodon/pull/9230)) +- Fix form validation flash message color and input borders ([Gargron](https://github.com/mastodon/mastodon/pull/9235)) +- Fix invalid twitter:player cards being displayed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9254)) +- Fix emoji update date being processed incorrectly ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9255)) +- Fix playing embed resetting if status is reloaded in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9270), [Gargron](https://github.com/mastodon/mastodon/pull/9275)) +- Fix web UI crash when favouriting a deleted status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9272)) +- Fix intermediary arrays being created for hash maps ([Gargron](https://github.com/mastodon/mastodon/pull/9291)) +- Fix filter ID not being a string in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/9303)) ### Security -- Fix multiple remote account deletions being able to deadlock the database ([Gargron](https://github.com/tootsuite/mastodon/pull/9292)) -- Fix HTTP connection timeout of 10s not being enforced ([Gargron](https://github.com/tootsuite/mastodon/pull/9329)) +- Fix multiple remote account deletions being able to deadlock the database ([Gargron](https://github.com/mastodon/mastodon/pull/9292)) +- Fix HTTP connection timeout of 10s not being enforced ([Gargron](https://github.com/mastodon/mastodon/pull/9329)) ## [2.6.1] - 2018-10-30 ### Fixed -- Fix resolving resources by URL not working due to a regression in [valerauko](https://github.com/tootsuite/mastodon/pull/9132) ([Gargron](https://github.com/tootsuite/mastodon/pull/9171)) -- Fix reducer error in web UI when a conversation has no last status ([Gargron](https://github.com/tootsuite/mastodon/pull/9173)) +- Fix resolving resources by URL not working due to a regression in [valerauko](https://github.com/mastodon/mastodon/pull/9132) ([Gargron](https://github.com/mastodon/mastodon/pull/9171)) +- Fix reducer error in web UI when a conversation has no last status ([Gargron](https://github.com/mastodon/mastodon/pull/9173)) ## [2.6.0] - 2018-10-30 ### Added -- Add link ownership verification ([Gargron](https://github.com/tootsuite/mastodon/pull/8703)) -- Add conversations API ([Gargron](https://github.com/tootsuite/mastodon/pull/8832)) -- Add limit for the number of people that can be followed from one account ([Gargron](https://github.com/tootsuite/mastodon/pull/8807)) -- Add admin setting to customize mascot ([ashleyhull-versent](https://github.com/tootsuite/mastodon/pull/8766)) -- Add support for more granular ActivityPub audiences from other software, i.e. circles ([Gargron](https://github.com/tootsuite/mastodon/pull/8950), [Gargron](https://github.com/tootsuite/mastodon/pull/9093), [Gargron](https://github.com/tootsuite/mastodon/pull/9150)) -- Add option to block all reports from a domain ([Gargron](https://github.com/tootsuite/mastodon/pull/8830)) -- Add user preference to always expand toots marked with content warnings ([webroo](https://github.com/tootsuite/mastodon/pull/8762)) -- Add user preference to always hide all media ([fvh-P](https://github.com/tootsuite/mastodon/pull/8569)) -- Add `force_login` param to OAuth authorize page ([Gargron](https://github.com/tootsuite/mastodon/pull/8655)) -- Add `tootctl accounts backup` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts create` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts cull` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts delete` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts modify` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts refresh` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl feeds build` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl feeds clear` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl settings registrations open` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl settings registrations close` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `min_id` param to REST API to support backwards pagination ([Gargron](https://github.com/tootsuite/mastodon/pull/8736)) -- Add a confirmation dialog when hitting reply and the compose box isn't empty ([ThibG](https://github.com/tootsuite/mastodon/pull/8893)) -- Add PostgreSQL disk space growth tracking in PGHero ([Gargron](https://github.com/tootsuite/mastodon/pull/8906)) -- Add button for disabling local account to report quick actions bar ([Gargron](https://github.com/tootsuite/mastodon/pull/9024)) -- Add Czech language ([Aditoo17](https://github.com/tootsuite/mastodon/pull/8594)) -- Add `same-site` (`lax`) attribute to cookies ([sorin-davidoi](https://github.com/tootsuite/mastodon/pull/8626)) -- Add support for styled scrollbars in Firefox Nightly ([sorin-davidoi](https://github.com/tootsuite/mastodon/pull/8653)) -- Add highlight to the active tab in web UI profiles ([rhoio](https://github.com/tootsuite/mastodon/pull/8673)) -- Add auto-focus for comment textarea in report modal ([ThibG](https://github.com/tootsuite/mastodon/pull/8689)) -- Add auto-focus for emoji picker's search field ([ThibG](https://github.com/tootsuite/mastodon/pull/8688)) -- Add nginx and systemd templates to `dist/` directory ([Gargron](https://github.com/tootsuite/mastodon/pull/8770)) -- Add support for `/.well-known/change-password` ([Gargron](https://github.com/tootsuite/mastodon/pull/8828)) -- Add option to override FFMPEG binary path ([sascha-sl](https://github.com/tootsuite/mastodon/pull/8855)) -- Add `dns-prefetch` tag when using different host for assets or uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/8942)) -- Add `description` meta tag ([Gargron](https://github.com/tootsuite/mastodon/pull/8941)) -- Add `Content-Security-Policy` header ([ThibG](https://github.com/tootsuite/mastodon/pull/8957)) -- Add cache for the instance info API ([ykzts](https://github.com/tootsuite/mastodon/pull/8765)) -- Add suggested follows to search screen in mobile layout ([Gargron](https://github.com/tootsuite/mastodon/pull/9010)) -- Add CORS header to `/.well-known/*` routes ([BenLubar](https://github.com/tootsuite/mastodon/pull/9083)) -- Add `card` attribute to statuses returned from REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) -- Add in-stream link preview ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) -- Add support for ActivityPub `Page` objects ([mbajur](https://github.com/tootsuite/mastodon/pull/9121)) +- Add link ownership verification ([Gargron](https://github.com/mastodon/mastodon/pull/8703)) +- Add conversations API ([Gargron](https://github.com/mastodon/mastodon/pull/8832)) +- Add limit for the number of people that can be followed from one account ([Gargron](https://github.com/mastodon/mastodon/pull/8807)) +- Add admin setting to customize mascot ([ashleyhull-versent](https://github.com/mastodon/mastodon/pull/8766)) +- Add support for more granular ActivityPub audiences from other software, i.e. circles ([Gargron](https://github.com/mastodon/mastodon/pull/8950), [Gargron](https://github.com/mastodon/mastodon/pull/9093), [Gargron](https://github.com/mastodon/mastodon/pull/9150)) +- Add option to block all reports from a domain ([Gargron](https://github.com/mastodon/mastodon/pull/8830)) +- Add user preference to always expand toots marked with content warnings ([webroo](https://github.com/mastodon/mastodon/pull/8762)) +- Add user preference to always hide all media ([fvh-P](https://github.com/mastodon/mastodon/pull/8569)) +- Add `force_login` param to OAuth authorize page ([Gargron](https://github.com/mastodon/mastodon/pull/8655)) +- Add `tootctl accounts backup` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts create` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts cull` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts delete` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts modify` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts refresh` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl feeds build` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl feeds clear` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl settings registrations open` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl settings registrations close` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `min_id` param to REST API to support backwards pagination ([Gargron](https://github.com/mastodon/mastodon/pull/8736)) +- Add a confirmation dialog when hitting reply and the compose box isn't empty ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8893)) +- Add PostgreSQL disk space growth tracking in PGHero ([Gargron](https://github.com/mastodon/mastodon/pull/8906)) +- Add button for disabling local account to report quick actions bar ([Gargron](https://github.com/mastodon/mastodon/pull/9024)) +- Add Czech language ([Aditoo17](https://github.com/mastodon/mastodon/pull/8594)) +- Add `same-site` (`lax`) attribute to cookies ([sorin-davidoi](https://github.com/mastodon/mastodon/pull/8626)) +- Add support for styled scrollbars in Firefox Nightly ([sorin-davidoi](https://github.com/mastodon/mastodon/pull/8653)) +- Add highlight to the active tab in web UI profiles ([rhoio](https://github.com/mastodon/mastodon/pull/8673)) +- Add auto-focus for comment textarea in report modal ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8689)) +- Add auto-focus for emoji picker's search field ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8688)) +- Add nginx and systemd templates to `dist/` directory ([Gargron](https://github.com/mastodon/mastodon/pull/8770)) +- Add support for `/.well-known/change-password` ([Gargron](https://github.com/mastodon/mastodon/pull/8828)) +- Add option to override FFMPEG binary path ([sascha-sl](https://github.com/mastodon/mastodon/pull/8855)) +- Add `dns-prefetch` tag when using different host for assets or uploads ([Gargron](https://github.com/mastodon/mastodon/pull/8942)) +- Add `description` meta tag ([Gargron](https://github.com/mastodon/mastodon/pull/8941)) +- Add `Content-Security-Policy` header ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8957)) +- Add cache for the instance info API ([ykzts](https://github.com/mastodon/mastodon/pull/8765)) +- Add suggested follows to search screen in mobile layout ([Gargron](https://github.com/mastodon/mastodon/pull/9010)) +- Add CORS header to `/.well-known/*` routes ([BenLubar](https://github.com/mastodon/mastodon/pull/9083)) +- Add `card` attribute to statuses returned from REST API ([Gargron](https://github.com/mastodon/mastodon/pull/9120)) +- Add in-stream link preview ([Gargron](https://github.com/mastodon/mastodon/pull/9120)) +- Add support for ActivityPub `Page` objects ([mbajur](https://github.com/mastodon/mastodon/pull/9121)) ### Changed -- Change forms design ([Gargron](https://github.com/tootsuite/mastodon/pull/8703)) -- Change reports overview to group by target account ([Gargron](https://github.com/tootsuite/mastodon/pull/8674)) -- Change web UI to show "read more" link on overly long in-stream statuses ([lanodan](https://github.com/tootsuite/mastodon/pull/8205)) -- Change design of direct messages column ([Gargron](https://github.com/tootsuite/mastodon/pull/8832), [Gargron](https://github.com/tootsuite/mastodon/pull/9022)) -- Change home timelines to exclude DMs ([Gargron](https://github.com/tootsuite/mastodon/pull/8940)) -- Change list timelines to exclude all replies ([cbayerlein](https://github.com/tootsuite/mastodon/pull/8683)) -- Change admin accounts UI default sort to most recent ([Gargron](https://github.com/tootsuite/mastodon/pull/8813)) -- Change documentation URL in the UI ([Gargron](https://github.com/tootsuite/mastodon/pull/8898)) -- Change style of success and failure messages ([Gargron](https://github.com/tootsuite/mastodon/pull/8973)) -- Change DM filtering to always allow DMs from staff ([qguv](https://github.com/tootsuite/mastodon/pull/8993)) -- Change recommended Ruby version to 2.5.3 ([zunda](https://github.com/tootsuite/mastodon/pull/9003)) -- Change docker-compose default to persist volumes in current directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9055)) -- Change character counters on edit profile page to input length limit ([Gargron](https://github.com/tootsuite/mastodon/pull/9100)) -- Change notification filtering to always let through messages from staff ([Gargron](https://github.com/tootsuite/mastodon/pull/9152)) -- Change "hide boosts from user" function also hiding notifications about boosts ([ThibG](https://github.com/tootsuite/mastodon/pull/9147)) -- Change CSS `detailed-status__wrapper` class actually wrap the detailed status ([trwnh](https://github.com/tootsuite/mastodon/pull/8547)) +- Change forms design ([Gargron](https://github.com/mastodon/mastodon/pull/8703)) +- Change reports overview to group by target account ([Gargron](https://github.com/mastodon/mastodon/pull/8674)) +- Change web UI to show "read more" link on overly long in-stream statuses ([lanodan](https://github.com/mastodon/mastodon/pull/8205)) +- Change design of direct messages column ([Gargron](https://github.com/mastodon/mastodon/pull/8832), [Gargron](https://github.com/mastodon/mastodon/pull/9022)) +- Change home timelines to exclude DMs ([Gargron](https://github.com/mastodon/mastodon/pull/8940)) +- Change list timelines to exclude all replies ([cbayerlein](https://github.com/mastodon/mastodon/pull/8683)) +- Change admin accounts UI default sort to most recent ([Gargron](https://github.com/mastodon/mastodon/pull/8813)) +- Change documentation URL in the UI ([Gargron](https://github.com/mastodon/mastodon/pull/8898)) +- Change style of success and failure messages ([Gargron](https://github.com/mastodon/mastodon/pull/8973)) +- Change DM filtering to always allow DMs from staff ([qguv](https://github.com/mastodon/mastodon/pull/8993)) +- Change recommended Ruby version to 2.5.3 ([zunda](https://github.com/mastodon/mastodon/pull/9003)) +- Change docker-compose default to persist volumes in current directory ([Gargron](https://github.com/mastodon/mastodon/pull/9055)) +- Change character counters on edit profile page to input length limit ([Gargron](https://github.com/mastodon/mastodon/pull/9100)) +- Change notification filtering to always let through messages from staff ([Gargron](https://github.com/mastodon/mastodon/pull/9152)) +- Change "hide boosts from user" function also hiding notifications about boosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9147)) +- Change CSS `detailed-status__wrapper` class actually wrap the detailed status ([trwnh](https://github.com/mastodon/mastodon/pull/8547)) ### Deprecated -- `GET /api/v1/timelines/direct` → `GET /api/v1/conversations` ([Gargron](https://github.com/tootsuite/mastodon/pull/8832)) -- `POST /api/v1/notifications/dismiss` → `POST /api/v1/notifications/:id/dismiss` ([Gargron](https://github.com/tootsuite/mastodon/pull/8905)) -- `GET /api/v1/statuses/:id/card` → `card` attributed included in status ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) +- `GET /api/v1/timelines/direct` → `GET /api/v1/conversations` ([Gargron](https://github.com/mastodon/mastodon/pull/8832)) +- `POST /api/v1/notifications/dismiss` → `POST /api/v1/notifications/:id/dismiss` ([Gargron](https://github.com/mastodon/mastodon/pull/8905)) +- `GET /api/v1/statuses/:id/card` → `card` attributed included in status ([Gargron](https://github.com/mastodon/mastodon/pull/9120)) ### Removed -- Remove "on this device" label in column push settings ([rhoio](https://github.com/tootsuite/mastodon/pull/8704)) -- Remove rake tasks in favour of tootctl commands ([Gargron](https://github.com/tootsuite/mastodon/pull/8675)) +- Remove "on this device" label in column push settings ([rhoio](https://github.com/mastodon/mastodon/pull/8704)) +- Remove rake tasks in favour of tootctl commands ([Gargron](https://github.com/mastodon/mastodon/pull/8675)) ### Fixed -- Fix remote statuses using instance's default locale if no language given ([Kjwon15](https://github.com/tootsuite/mastodon/pull/8861)) -- Fix streaming API not exiting when port or socket is unavailable ([Gargron](https://github.com/tootsuite/mastodon/pull/9023)) -- Fix network calls being performed in database transaction in ActivityPub handler ([Gargron](https://github.com/tootsuite/mastodon/pull/8951)) -- Fix dropdown arrow position ([ThibG](https://github.com/tootsuite/mastodon/pull/8637)) -- Fix first element of dropdowns being focused even if not using keyboard ([ThibG](https://github.com/tootsuite/mastodon/pull/8679)) -- Fix tootctl requiring `bundle exec` invocation ([abcang](https://github.com/tootsuite/mastodon/pull/8619)) -- Fix public pages not using animation preference for avatars ([renatolond](https://github.com/tootsuite/mastodon/pull/8614)) -- Fix OEmbed/OpenGraph cards not understanding relative URLs ([ThibG](https://github.com/tootsuite/mastodon/pull/8669)) -- Fix some dark emojis not having a white outline ([ThibG](https://github.com/tootsuite/mastodon/pull/8597)) -- Fix media description not being displayed in various media modals ([ThibG](https://github.com/tootsuite/mastodon/pull/8678)) -- Fix generated URLs of desktop notifications missing base URL ([GenbuHase](https://github.com/tootsuite/mastodon/pull/8758)) -- Fix RTL styles ([mabkenar](https://github.com/tootsuite/mastodon/pull/8764), [mabkenar](https://github.com/tootsuite/mastodon/pull/8767), [mabkenar](https://github.com/tootsuite/mastodon/pull/8823), [mabkenar](https://github.com/tootsuite/mastodon/pull/8897), [mabkenar](https://github.com/tootsuite/mastodon/pull/9005), [mabkenar](https://github.com/tootsuite/mastodon/pull/9007), [mabkenar](https://github.com/tootsuite/mastodon/pull/9018), [mabkenar](https://github.com/tootsuite/mastodon/pull/9021), [mabkenar](https://github.com/tootsuite/mastodon/pull/9145), [mabkenar](https://github.com/tootsuite/mastodon/pull/9146)) -- Fix crash in streaming API when tag param missing ([Gargron](https://github.com/tootsuite/mastodon/pull/8955)) -- Fix hotkeys not working when no element is focused ([ThibG](https://github.com/tootsuite/mastodon/pull/8998)) -- Fix some hotkeys not working on detailed status view ([ThibG](https://github.com/tootsuite/mastodon/pull/9006)) -- Fix og:url on status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9047)) -- Fix upload option buttons only being visible on hover ([Gargron](https://github.com/tootsuite/mastodon/pull/9074)) -- Fix tootctl not returning exit code 1 on wrong arguments ([sascha-sl](https://github.com/tootsuite/mastodon/pull/9094)) -- Fix preview cards for appearing for profiles mentioned in toot ([ThibG](https://github.com/tootsuite/mastodon/pull/6934), [ThibG](https://github.com/tootsuite/mastodon/pull/9158)) -- Fix local accounts sometimes being duplicated as faux-remote ([Gargron](https://github.com/tootsuite/mastodon/pull/9109)) -- Fix emoji search when the shortcode has multiple separators ([ThibG](https://github.com/tootsuite/mastodon/pull/9124)) -- Fix dropdowns sometimes being partially obscured by other elements ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9126)) -- Fix cache not updating when reply/boost/favourite counters or media sensitivity update ([Gargron](https://github.com/tootsuite/mastodon/pull/9119)) -- Fix empty display name precedence over username in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9163)) -- Fix td instead of th in sessions table header ([Gargron](https://github.com/tootsuite/mastodon/pull/9162)) -- Fix handling of content types with profile ([valerauko](https://github.com/tootsuite/mastodon/pull/9132)) +- Fix remote statuses using instance's default locale if no language given ([Kjwon15](https://github.com/mastodon/mastodon/pull/8861)) +- Fix streaming API not exiting when port or socket is unavailable ([Gargron](https://github.com/mastodon/mastodon/pull/9023)) +- Fix network calls being performed in database transaction in ActivityPub handler ([Gargron](https://github.com/mastodon/mastodon/pull/8951)) +- Fix dropdown arrow position ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8637)) +- Fix first element of dropdowns being focused even if not using keyboard ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8679)) +- Fix tootctl requiring `bundle exec` invocation ([abcang](https://github.com/mastodon/mastodon/pull/8619)) +- Fix public pages not using animation preference for avatars ([renatolond](https://github.com/mastodon/mastodon/pull/8614)) +- Fix OEmbed/OpenGraph cards not understanding relative URLs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8669)) +- Fix some dark emojis not having a white outline ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8597)) +- Fix media description not being displayed in various media modals ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8678)) +- Fix generated URLs of desktop notifications missing base URL ([GenbuHase](https://github.com/mastodon/mastodon/pull/8758)) +- Fix RTL styles ([mabkenar](https://github.com/mastodon/mastodon/pull/8764), [mabkenar](https://github.com/mastodon/mastodon/pull/8767), [mabkenar](https://github.com/mastodon/mastodon/pull/8823), [mabkenar](https://github.com/mastodon/mastodon/pull/8897), [mabkenar](https://github.com/mastodon/mastodon/pull/9005), [mabkenar](https://github.com/mastodon/mastodon/pull/9007), [mabkenar](https://github.com/mastodon/mastodon/pull/9018), [mabkenar](https://github.com/mastodon/mastodon/pull/9021), [mabkenar](https://github.com/mastodon/mastodon/pull/9145), [mabkenar](https://github.com/mastodon/mastodon/pull/9146)) +- Fix crash in streaming API when tag param missing ([Gargron](https://github.com/mastodon/mastodon/pull/8955)) +- Fix hotkeys not working when no element is focused ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8998)) +- Fix some hotkeys not working on detailed status view ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9006)) +- Fix og:url on status pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9047)) +- Fix upload option buttons only being visible on hover ([Gargron](https://github.com/mastodon/mastodon/pull/9074)) +- Fix tootctl not returning exit code 1 on wrong arguments ([sascha-sl](https://github.com/mastodon/mastodon/pull/9094)) +- Fix preview cards for appearing for profiles mentioned in toot ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/6934), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/9158)) +- Fix local accounts sometimes being duplicated as faux-remote ([Gargron](https://github.com/mastodon/mastodon/pull/9109)) +- Fix emoji search when the shortcode has multiple separators ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9124)) +- Fix dropdowns sometimes being partially obscured by other elements ([kedamaDQ](https://github.com/mastodon/mastodon/pull/9126)) +- Fix cache not updating when reply/boost/favourite counters or media sensitivity update ([Gargron](https://github.com/mastodon/mastodon/pull/9119)) +- Fix empty display name precedence over username in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/9163)) +- Fix td instead of th in sessions table header ([Gargron](https://github.com/mastodon/mastodon/pull/9162)) +- Fix handling of content types with profile ([valerauko](https://github.com/mastodon/mastodon/pull/9132)) ## [2.5.2] - 2018-10-12 ### Security -- Fix XSS vulnerability ([Gargron](https://github.com/tootsuite/mastodon/pull/8959)) +- Fix XSS vulnerability ([Gargron](https://github.com/mastodon/mastodon/pull/8959)) ## [2.5.1] - 2018-10-07 ### Fixed -- Fix database migrations for PostgreSQL below 9.5 ([Gargron](https://github.com/tootsuite/mastodon/pull/8903)) -- Fix class autoloading issue in ActivityPub Create handler ([Gargron](https://github.com/tootsuite/mastodon/pull/8820)) -- Fix cache statistics not being sent via statsd when statsd enabled ([ykzts](https://github.com/tootsuite/mastodon/pull/8831)) -- Bump puma from 3.11.4 to 3.12.0 ([dependabot[bot]](https://github.com/tootsuite/mastodon/pull/8883)) +- Fix database migrations for PostgreSQL below 9.5 ([Gargron](https://github.com/mastodon/mastodon/pull/8903)) +- Fix class autoloading issue in ActivityPub Create handler ([Gargron](https://github.com/mastodon/mastodon/pull/8820)) +- Fix cache statistics not being sent via statsd when statsd enabled ([ykzts](https://github.com/mastodon/mastodon/pull/8831)) +- Bump puma from 3.11.4 to 3.12.0 ([dependabot[bot]](https://github.com/mastodon/mastodon/pull/8883)) ### Security -- Fix some local images not having their EXIF metadata stripped on upload ([ThibG](https://github.com/tootsuite/mastodon/pull/8714)) -- Fix being able to enable a disabled relay via ActivityPub Accept handler ([ThibG](https://github.com/tootsuite/mastodon/pull/8864)) -- Bump nokogiri from 1.8.4 to 1.8.5 ([dependabot[bot]](https://github.com/tootsuite/mastodon/pull/8881)) -- Fix being able to report statuses not belonging to the reported account ([ThibG](https://github.com/tootsuite/mastodon/pull/8916)) +- Fix some local images not having their EXIF metadata stripped on upload ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8714)) +- Fix being able to enable a disabled relay via ActivityPub Accept handler ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8864)) +- Bump nokogiri from 1.8.4 to 1.8.5 ([dependabot[bot]](https://github.com/mastodon/mastodon/pull/8881)) +- Fix being able to report statuses not belonging to the reported account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8916)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4b2d1f3e84..a5b5513ff1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,7 +48,7 @@ If your contributions are accepted into Mastodon, you can request to be paid thr ## Bug reports -Bug reports and feature suggestions must use descriptive and concise titles and be submitted to [GitHub Issues](https://github.com/tootsuite/mastodon/issues). Please use the search function to make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected. +Bug reports and feature suggestions must use descriptive and concise titles and be submitted to [GitHub Issues](https://github.com/mastodon/mastodon/issues). Please use the search function to make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected. ## Translations @@ -58,9 +58,17 @@ You can submit translations via [Crowdin](https://crowdin.com/project/mastodon). ## Pull requests -Please use clean, concise titles for your pull requests. We use commit squashing, so the final commit in the master branch will carry the title of the pull request. +**Please use clean, concise titles for your pull requests.** Unless the pull request is about refactoring code, updating dependencies or other internal tasks, assume that the person reading the pull request title is not a programmer or Mastodon developer, but instead a Mastodon user or server administrator, and **try to describe your change or fix from their perspective**. We use commit squashing, so the final commit in the main branch will carry the title of the pull request, and commits from the main branch are fed into the changelog. The changelog is separated into [keepachangelog.com categories](https://keepachangelog.com/en/1.0.0/), and while that spec does not prescribe how the entries ought to be named, for easier sorting, start your pull request titles using one of the verbs "Add", "Change", "Deprecate", "Remove", or "Fix" (present tense). -The smaller the set of changes in the pull request is, the quicker it can be reviewed and merged. Splitting tasks into multiple smaller pull requests is often preferable. +Example: + +|Not ideal|Better| +|---|----| +|Fixed NoMethodError in RemovalWorker|Fix nil error when removing statuses caused by race condition| + +It is not always possible to phrase every change in such a manner, but it is desired. + +**The smaller the set of changes in the pull request is, the quicker it can be reviewed and merged.** Splitting tasks into multiple smaller pull requests is often preferable. **Pull requests that do not pass automated checks may not be reviewed**. In particular, you need to keep in mind: @@ -70,6 +78,6 @@ The smaller the set of changes in the pull request is, the quicker it can be rev ## Documentation -The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to tootsuite/documentation](https://github.com/tootsuite/documentation). +The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/documentation](https://github.com/mastodon/documentation). diff --git a/Dockerfile b/Dockerfile index 136b2a35ae..c6287b5a7a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,11 @@ FROM ubuntu:20.04 as build-dep # Use bash for the shell -SHELL ["/usr/bin/bash", "-c"] +SHELL ["/bin/bash", "-c"] +RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections -# Install Node v12 (LTS) -ENV NODE_VER="12.20.0" +# Install Node v16 (LTS) +ENV NODE_VER="16.13.2" RUN ARCH= && \ dpkgArch="$(dpkg --print-architecture)" && \ case "${dpkgArch##*-}" in \ @@ -17,35 +18,19 @@ RUN ARCH= && \ *) echo "unsupported architecture"; exit 1 ;; \ esac && \ echo "Etc/UTC" > /etc/localtime && \ - apt update && \ - apt -y install wget python && \ + apt-get update && \ + apt-get install -y --no-install-recommends ca-certificates wget python apt-utils && \ cd ~ && \ - wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-$ARCH.tar.gz && \ + wget -q https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-$ARCH.tar.gz && \ tar xf node-v$NODE_VER-linux-$ARCH.tar.gz && \ rm node-v$NODE_VER-linux-$ARCH.tar.gz && \ mv node-v$NODE_VER-linux-$ARCH /opt/node -# Install jemalloc -ENV JE_VER="5.2.1" -RUN apt update && \ - apt -y install make autoconf gcc g++ && \ - cd ~ && \ - wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \ - tar xf $JE_VER.tar.gz && \ - cd jemalloc-$JE_VER && \ - ./autogen.sh && \ - ./configure --prefix=/opt/jemalloc && \ - make -j$(nproc) > /dev/null && \ - make install_bin install_include install_lib && \ - cd .. && rm -rf jemalloc-$JE_VER $JE_VER.tar.gz - -# Install Ruby -ENV RUBY_VER="2.7.2" -ENV CPPFLAGS="-I/opt/jemalloc/include" -ENV LDFLAGS="-L/opt/jemalloc/lib/" -RUN apt update && \ - apt -y install build-essential \ - bison libyaml-dev libgdbm-dev libreadline-dev \ +# Install Ruby 3.0 +ENV RUBY_VER="3.0.3" +RUN apt-get update && \ + apt-get install -y --no-install-recommends build-essential \ + bison libyaml-dev libgdbm-dev libreadline-dev libjemalloc-dev \ libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \ cd ~ && \ wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \ @@ -55,25 +40,26 @@ RUN apt update && \ --with-jemalloc \ --with-shared \ --disable-install-doc && \ - ln -s /opt/jemalloc/lib/* /usr/lib/ && \ - make -j$(nproc) > /dev/null && \ + make -j"$(nproc)" > /dev/null && \ make install && \ - cd .. && rm -rf ruby-$RUBY_VER.tar.gz ruby-$RUBY_VER + rm -rf ../ruby-$RUBY_VER.tar.gz ../ruby-$RUBY_VER ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin" -RUN npm install -g yarn && \ +RUN npm install -g npm@latest && \ + npm install -g yarn && \ gem install bundler && \ - apt update && \ - apt -y install git libicu-dev libidn11-dev \ - libpq-dev libprotobuf-dev protobuf-compiler + apt-get update && \ + apt-get install -y --no-install-recommends git libicu-dev libidn11-dev \ + libpq-dev libprotobuf-dev protobuf-compiler shared-mime-info COPY Gemfile* package.json yarn.lock /opt/mastodon/ RUN cd /opt/mastodon && \ - bundle config set deployment 'true' && \ - bundle config set without 'development test' && \ - bundle install -j$(nproc) && \ + bundle config set --local deployment 'true' && \ + bundle config set --local without 'development test' && \ + bundle config set silence_root_warning true && \ + bundle install -j"$(nproc)" && \ yarn install --pure-lockfile FROM ubuntu:20.04 @@ -81,7 +67,6 @@ FROM ubuntu:20.04 # Copy over all the langs needed for runtime COPY --from=build-dep /opt/node /opt/node COPY --from=build-dep /opt/ruby /opt/ruby -COPY --from=build-dep /opt/jemalloc /opt/jemalloc # Add more PATHs to the PATH ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin" @@ -89,35 +74,27 @@ ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin" # Create the mastodon user ARG UID=991 ARG GID=991 -RUN apt update && \ +SHELL ["/bin/bash", "-o", "pipefail", "-c"] +RUN apt-get update && \ echo "Etc/UTC" > /etc/localtime && \ - ln -s /opt/jemalloc/lib/* /usr/lib/ && \ - apt install -y whois wget && \ + apt-get install -y --no-install-recommends whois wget && \ addgroup --gid $GID mastodon && \ useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \ - echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd + echo "mastodon:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256)" | chpasswd && \ + rm -rf /var/lib/apt/lists/* # Install mastodon runtime deps -RUN apt -y --no-install-recommends install \ - libssl1.1 libpq5 imagemagick ffmpeg \ +RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections +RUN apt-get update && \ + apt-get -y --no-install-recommends install \ + libssl1.1 libpq5 imagemagick ffmpeg libjemalloc2 \ libicu66 libprotobuf17 libidn11 libyaml-0-2 \ - file ca-certificates tzdata libreadline8 && \ - apt -y install gcc && \ + file ca-certificates tzdata libreadline8 gcc tini apt-utils && \ ln -s /opt/mastodon /mastodon && \ gem install bundler && \ rm -rf /var/cache && \ rm -rf /var/lib/apt/lists/* -# Add tini -ENV TINI_VERSION="0.19.0" -RUN dpkgArch="$(dpkg --print-architecture)" && \ - ARCH=$dpkgArch && \ - wget https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-$ARCH \ - https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-$ARCH.sha256sum && \ - cat tini-$ARCH.sha256sum | sha256sum -c - && \ - mv tini-$ARCH /tini && rm tini-$ARCH.sha256sum && \ - chmod +x /tini - # Copy over mastodon source, and dependencies from building, and set permissions COPY --chown=mastodon:mastodon . /opt/mastodon COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon @@ -140,5 +117,5 @@ RUN cd ~ && \ # Set the work dir and the container entry point WORKDIR /opt/mastodon -ENTRYPOINT ["/tini", "--"] +ENTRYPOINT ["/usr/bin/tini", "--"] EXPOSE 3000 4000 diff --git a/FEDERATION.md b/FEDERATION.md new file mode 100644 index 0000000000..cd1957cbd1 --- /dev/null +++ b/FEDERATION.md @@ -0,0 +1,30 @@ +## ActivityPub federation in Mastodon + +Mastodon largely follows the ActivityPub server-to-server specification but it makes uses of some non-standard extensions, some of which are required for interacting with Mastodon at all. + +Supported vocabulary: https://docs.joinmastodon.org/spec/activitypub/ + +### Required extensions + +#### Webfinger + +In Mastodon, users are identified by a `username` and `domain` pair (e.g., `Gargron@mastodon.social`). +This is used both for discovery and for unambiguously mentioning users across the fediverse. Furthermore, this is part of Mastodon's database design from its very beginnings. + +As a result, Mastodon requires that each ActivityPub actor uniquely maps back to an `acct:` URI that can be resolved via WebFinger. + +More information and examples are available at: https://docs.joinmastodon.org/spec/webfinger/ + +#### HTTP Signatures + +In order to authenticate activities, Mastodon relies on HTTP Signatures, signing every `POST` and `GET` request to other ActivityPub implementations on behalf of the user authoring an activity (for `POST` requests) or an actor representing the Mastodon server itself (for most `GET` requests). + +Mastodon requires all `POST` requests to be signed, and MAY require `GET` requests to be signed, depending on the configuration of the Mastodon server. + +More information on HTTP Signatures, as well as examples, can be found here: https://docs.joinmastodon.org/spec/security/#http + +### Optional extensions + +- Linked-Data Signatures: https://docs.joinmastodon.org/spec/security/#ld +- Bearcaps: https://docs.joinmastodon.org/spec/bearcaps/ +- Followers collection synchronization: https://git.activitypub.dev/ActivityPubDev/Fediverse-Enhancement-Proposals/src/branch/main/feps/fep-8fcf.md diff --git a/Gemfile b/Gemfile index cfc392c3c7..1ddb6f383a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,40 +1,39 @@ # frozen_string_literal: true source 'https://rubygems.org' -ruby '>= 2.5.0', '< 3.0.0' +ruby '>= 2.5.0', '< 3.1.0' gem 'pkg-config', '~> 1.4' +gem 'rexml', '~> 3.2' -gem 'puma', '~> 5.1' -gem 'rails', '~> 5.2.4.4' +gem 'puma', '~> 5.5' +gem 'rails', '~> 6.1.4' gem 'sprockets', '~> 3.7.2' -gem 'thor', '~> 1.0' +gem 'thor', '~> 1.2' gem 'rack', '~> 2.2.3' gem 'hamlit-rails', '~> 0.2' -gem 'pg', '~> 1.2' +gem 'pg', '~> 1.3' gem 'makara', '~> 0.5' -gem 'pghero', '~> 2.7' +gem 'pghero', '~> 2.8' gem 'dotenv-rails', '~> 2.7' -gem 'aws-sdk-s3', '~> 1.87', require: false +gem 'aws-sdk-s3', '~> 1.111', require: false gem 'fog-core', '<= 2.1.0' gem 'fog-openstack', '~> 0.3', require: false -gem 'paperclip', '~> 6.0' -gem 'paperclip-av-transcoder', '~> 0.6' -gem 'streamio-ffmpeg', '~> 3.0' +gem 'kt-paperclip', '~> 7.0' gem 'blurhash', '~> 0.1' gem 'active_model_serializers', '~> 0.10' -gem 'addressable', '~> 2.7' -gem 'bootsnap', '~> 1.5', require: false +gem 'addressable', '~> 2.8' +gem 'bootsnap', '~> 1.10.2', require: false gem 'browser' gem 'charlock_holmes', '~> 0.7.7' gem 'iso-639' -gem 'chewy', '~> 5.1' -gem 'cld3', '~> 3.4.1' -gem 'devise', '~> 4.7' -gem 'devise-two-factor', '~> 3.1' +gem 'chewy', '~> 7.2' +gem 'cld3', '~> 3.4.4' +gem 'devise', '~> 4.8' +gem 'devise-two-factor', '~> 4.0' group :pam_authentication, optional: true do gem 'devise_pam_authenticatable2', '~> 9.2' @@ -48,70 +47,67 @@ gem 'omniauth-rails_csrf_protection', '~> 0.1' gem 'color_diff', '~> 0.1' gem 'discard', '~> 1.2' -gem 'doorkeeper', '~> 5.4' -gem 'ed25519', '~> 1.2' +gem 'doorkeeper', '~> 5.5' +gem 'ed25519', '~> 1.3' gem 'fast_blank', '~> 1.0' gem 'fastimage' gem 'hiredis', '~> 0.6' gem 'redis-namespace', '~> 1.8' -gem 'health_check', git: 'https://github.com/ianheggie/health_check', ref: '0b799ead604f900ed50685e9b2d469cd2befba5b' gem 'htmlentities', '~> 4.3' -gem 'http', '~> 4.4' +gem 'http', '~> 5.0' gem 'http_accept_language', '~> 2.1' -gem 'httplog', '~> 1.4.3' +gem 'httplog', '~> 1.5.0' gem 'idn-ruby', require: 'idn' gem 'kaminari', '~> 1.2' gem 'link_header', '~> 0.0' -gem 'mime-types', '~> 3.3.1', require: 'mime/types/columnar' -gem 'nilsimsa', git: 'https://github.com/witgo/nilsimsa', ref: 'fd184883048b922b176939f851338d0a4971a532' -gem 'nokogiri', '~> 1.11' +gem 'mime-types', '~> 3.4.1', require: 'mime/types/columnar' +gem 'nokogiri', '~> 1.13' gem 'nsa', '~> 0.2' -gem 'oj', '~> 3.11' +gem 'oj', '~> 3.13' gem 'ox', '~> 2.14' gem 'parslet' -gem 'parallel', '~> 1.20' gem 'posix-spawn' gem 'pundit', '~> 2.1' gem 'premailer-rails' -gem 'rack-attack', '~> 6.3' +gem 'rack-attack', '~> 6.5' gem 'rack-cors', '~> 1.1', require: 'rack/cors' -gem 'rails-i18n', '~> 5.1' +gem 'rails-i18n', '~> 6.0' gem 'rails-settings-cached', '~> 0.6' -gem 'redis', '~> 4.2', require: ['redis', 'redis/connection/hiredis'] +gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis'] gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock' -gem 'rqrcode', '~> 1.2' +gem 'rqrcode', '~> 2.1' gem 'ruby-progressbar', '~> 1.11' -gem 'sanitize', '~> 5.2' +gem 'sanitize', '~> 6.0' gem 'scenic', '~> 1.5' -gem 'sidekiq', '~> 6.1' -gem 'sidekiq-scheduler', '~> 3.0' -gem 'sidekiq-unique-jobs', '~> 6.0' +gem 'sidekiq', '~> 6.4' +gem 'sidekiq-scheduler', '~> 3.1' +gem 'sidekiq-unique-jobs', '~> 7.1' gem 'sidekiq-bulk', '~>0.2.0' -gem 'simple-navigation', '~> 4.1' -gem 'simple_form', '~> 5.0' -gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie' +gem 'simple-navigation', '~> 4.3' +gem 'simple_form', '~> 5.1' +gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie' gem 'stoplight', '~> 2.2.1' gem 'strong_migrations', '~> 0.7' gem 'tty-prompt', '~> 0.23', require: false -gem 'twitter-text', '~> 1.14' -gem 'tzinfo-data', '~> 1.2020' -gem 'webpacker', '~> 5.2' -gem 'webpush' +gem 'twitter-text', '~> 3.1.0' +gem 'tzinfo-data', '~> 1.2021' +gem 'webpacker', '~> 5.4' +gem 'webpush', '~> 0.3' gem 'webauthn', '~> 3.0.0.alpha1' gem 'json-ld' -gem 'json-ld-preloaded', '~> 3.1' -gem 'rdf-normalize', '~> 0.4' +gem 'json-ld-preloaded', '~> 3.2' +gem 'rdf-normalize', '~> 0.5' -gem 'redcarpet', '~> 3.4' +gem 'redcarpet', '~> 3.5' group :development, :test do - gem 'fabrication', '~> 2.21' + gem 'fabrication', '~> 2.24' gem 'fuubar', '~> 2.5' gem 'i18n-tasks', '~> 0.9', require: false gem 'pry-byebug', '~> 3.9' gem 'pry-rails', '~> 0.3' - gem 'rspec-rails', '~> 4.0' + gem 'rspec-rails', '~> 5.0' end group :production, :test do @@ -119,16 +115,15 @@ group :production, :test do end group :test do - gem 'capybara', '~> 3.34' + gem 'capybara', '~> 3.36' gem 'climate_control', '~> 0.2' - gem 'faker', '~> 2.15' + gem 'faker', '~> 2.19' gem 'microformats', '~> 4.2' gem 'rails-controller-testing', '~> 1.0' gem 'rspec-sidekiq', '~> 3.1' gem 'simplecov', '~> 0.21', require: false - gem 'webmock', '~> 3.11' - gem 'parallel_tests', '~> 3.4' - gem 'rspec_junit_formatter', '~> 0.4' + gem 'webmock', '~> 3.14' + gem 'rspec_junit_formatter', '~> 0.5' end group :development do @@ -136,16 +131,16 @@ group :development do gem 'annotate', '~> 3.1' gem 'better_errors', '~> 2.9' gem 'binding_of_caller', '~> 1.0' - gem 'bullet', '~> 6.1' + gem 'bullet', '~> 7.0' gem 'letter_opener', '~> 1.7' - gem 'letter_opener_web', '~> 1.4' + gem 'letter_opener_web', '~> 2.0' gem 'memory_profiler' - gem 'rubocop', '~> 1.7', require: false - gem 'rubocop-rails', '~> 2.9', require: false - gem 'brakeman', '~> 4.10', require: false - gem 'bundler-audit', '~> 0.7', require: false + gem 'rubocop', '~> 1.25', require: false + gem 'rubocop-rails', '~> 2.13', require: false + gem 'brakeman', '~> 5.2', require: false + gem 'bundler-audit', '~> 0.9', require: false - gem 'capistrano', '~> 3.15' + gem 'capistrano', '~> 3.16' gem 'capistrano-rails', '~> 1.6' gem 'capistrano-rbenv', '~> 2.2' gem 'capistrano-yarn', '~> 2.0' @@ -155,11 +150,11 @@ end group :production do gem 'lograge', '~> 0.11' - gem 'redis-rails', '~> 5.0' end gem 'concurrent-ruby', require: false gem 'connection_pool', require: false gem 'xorcist', '~> 1.1' -gem 'pluck_each', '~> 0.1.3' + +gem 'hcaptcha', '~> 7.1' diff --git a/Gemfile.lock b/Gemfile.lock index bea9f78784..545032b2a4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,69 +1,72 @@ -GIT - remote: https://github.com/ianheggie/health_check - revision: 0b799ead604f900ed50685e9b2d469cd2befba5b - ref: 0b799ead604f900ed50685e9b2d469cd2befba5b - specs: - health_check (4.0.0.pre) - rails (>= 4.0) - -GIT - remote: https://github.com/witgo/nilsimsa - revision: fd184883048b922b176939f851338d0a4971a532 - ref: fd184883048b922b176939f851338d0a4971a532 - specs: - nilsimsa (1.1.2) - GEM remote: https://rubygems.org/ specs: - actioncable (5.2.4.4) - actionpack (= 5.2.4.4) + actioncable (6.1.4.4) + actionpack (= 6.1.4.4) + activesupport (= 6.1.4.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.4.4) - actionpack (= 5.2.4.4) - actionview (= 5.2.4.4) - activejob (= 5.2.4.4) + actionmailbox (6.1.4.4) + actionpack (= 6.1.4.4) + activejob (= 6.1.4.4) + activerecord (= 6.1.4.4) + activestorage (= 6.1.4.4) + activesupport (= 6.1.4.4) + mail (>= 2.7.1) + actionmailer (6.1.4.4) + actionpack (= 6.1.4.4) + actionview (= 6.1.4.4) + activejob (= 6.1.4.4) + activesupport (= 6.1.4.4) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.4.4) - actionview (= 5.2.4.4) - activesupport (= 5.2.4.4) - rack (~> 2.0, >= 2.0.8) + actionpack (6.1.4.4) + actionview (= 6.1.4.4) + activesupport (= 6.1.4.4) + rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.4.4) - activesupport (= 5.2.4.4) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (6.1.4.4) + actionpack (= 6.1.4.4) + activerecord (= 6.1.4.4) + activestorage (= 6.1.4.4) + activesupport (= 6.1.4.4) + nokogiri (>= 1.8.5) + actionview (6.1.4.4) + activesupport (= 6.1.4.4) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.3) - active_model_serializers (0.10.12) - actionpack (>= 4.1, < 6.2) - activemodel (>= 4.1, < 6.2) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + active_model_serializers (0.10.13) + actionpack (>= 4.1, < 7.1) + activemodel (>= 4.1, < 7.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) active_record_query_trace (1.8) - activejob (5.2.4.4) - activesupport (= 5.2.4.4) + activejob (6.1.4.4) + activesupport (= 6.1.4.4) globalid (>= 0.3.6) - activemodel (5.2.4.4) - activesupport (= 5.2.4.4) - activerecord (5.2.4.4) - activemodel (= 5.2.4.4) - activesupport (= 5.2.4.4) - arel (>= 9.0) - activestorage (5.2.4.4) - actionpack (= 5.2.4.4) - activerecord (= 5.2.4.4) - marcel (~> 0.3.1) - activesupport (5.2.4.4) + activemodel (6.1.4.4) + activesupport (= 6.1.4.4) + activerecord (6.1.4.4) + activemodel (= 6.1.4.4) + activesupport (= 6.1.4.4) + activestorage (6.1.4.4) + actionpack (= 6.1.4.4) + activejob (= 6.1.4.4) + activerecord (= 6.1.4.4) + activesupport (= 6.1.4.4) + marcel (~> 1.0.0) + mini_mime (>= 1.1.0) + activesupport (6.1.4.4) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - addressable (2.7.0) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) airbrussh (1.4.0) sshkit (>= 1.6.1, != 1.7.0) @@ -71,52 +74,52 @@ GEM annotate (3.1.1) activerecord (>= 3.2, < 7.0) rake (>= 10.4, < 14.0) - arel (9.0.0) - ast (2.4.1) + ast (2.4.2) attr_encrypted (3.1.0) encryptor (~> 3.0.0) - av (0.9.0) - cocaine (~> 0.5.3) awrence (1.1.1) - aws-eventstream (1.1.0) - aws-partitions (1.413.0) - aws-sdk-core (3.110.0) + aws-eventstream (1.2.0) + aws-partitions (1.549.0) + aws-sdk-core (3.125.5) aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) + aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.40.0) - aws-sdk-core (~> 3, >= 3.109.0) + aws-sdk-kms (1.53.0) + aws-sdk-core (~> 3, >= 3.125.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.87.0) - aws-sdk-core (~> 3, >= 3.109.0) + aws-sdk-s3 (1.111.3) + aws-sdk-core (~> 3, >= 3.125.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.2) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.4.0) aws-eventstream (~> 1, >= 1.0.2) bcrypt (3.1.16) better_errors (2.9.1) coderay (>= 1.0.0) erubi (>= 1.0.0) rack (>= 0.9.0) - bindata (2.4.8) + bindata (2.4.10) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) - blurhash (0.1.4) - ffi (~> 1.10.0) - bootsnap (1.5.1) - msgpack (~> 1.0) - brakeman (4.10.1) + blurhash (0.1.5) + ffi (~> 1.14) + bootsnap (1.10.2) + msgpack (~> 1.2) + brakeman (5.2.0) browser (4.2.0) + brpoplpush-redis_script (0.1.2) + concurrent-ruby (~> 1.0, >= 1.0.5) + redis (>= 1.0, <= 5.0) builder (3.2.4) - bullet (6.1.2) + bullet (7.0.1) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) - bundler-audit (0.7.0.1) + bundler-audit (0.9.0.1) bundler (>= 1.2.0, < 3) - thor (>= 0.18, < 2) + thor (~> 1.0) byebug (11.1.3) - capistrano (3.15.0) + capistrano (3.16.0) airbrussh (>= 1.0.0) i18n rake (>= 10.0.0) @@ -131,32 +134,31 @@ GEM sshkit (~> 1.3) capistrano-yarn (2.0.2) capistrano (~> 3.0) - capybara (3.34.0) + capybara (3.36.0) addressable + matrix mini_mime (>= 0.1.3) nokogiri (~> 1.8) rack (>= 1.6.0) rack-test (>= 0.6.3) - regexp_parser (~> 1.5) + regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) case_transform (0.2) activesupport cbor (0.5.9.6) charlock_holmes (0.7.7) - chewy (5.1.0) - activesupport (>= 4.0) - elasticsearch (>= 2.0.0) + chewy (7.2.3) + activesupport (>= 5.2) + elasticsearch (>= 7.12.0, < 7.14.0) elasticsearch-dsl - chunky_png (1.3.15) - cld3 (3.4.1) - ffi (>= 1.1.0, < 1.15.0) + chunky_png (1.4.0) + cld3 (3.4.4) + ffi (>= 1.1.0, < 1.16.0) climate_control (0.2.0) - cocaine (0.5.8) - climate_control (>= 0.0.3, < 1.0) coderay (1.1.3) color_diff (0.1) - concurrent-ruby (1.1.8) - connection_pool (2.2.3) + concurrent-ruby (1.1.9) + connection_pool (2.2.5) cose (1.0.0) cbor (~> 0.5.9) openssl-signature_algorithm (~> 0.4.0) @@ -166,42 +168,42 @@ GEM css_parser (1.7.1) addressable debug_inspector (1.0.0) - devise (4.7.3) + devise (4.8.1) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-two-factor (3.1.0) - activesupport (< 6.1) + devise-two-factor (4.0.1) + activesupport (< 6.2) attr_encrypted (>= 1.3, < 4, != 2) devise (~> 4.0) - railties (< 6.1) - rotp (~> 2.0) + railties (< 6.2) + rotp (~> 6.0) devise_pam_authenticatable2 (9.2.0) devise (>= 4.0.0) rpam2 (~> 4.0) diff-lcs (1.4.4) - discard (1.2.0) - activerecord (>= 4.2, < 7) + discard (1.2.1) + activerecord (>= 4.2, < 8) docile (1.3.4) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.4.0) + doorkeeper (5.5.4) railties (>= 5) dotenv (2.7.6) dotenv-rails (2.7.6) dotenv (= 2.7.6) railties (>= 3.2) e2mmap (0.1.0) - ed25519 (1.2.4) - elasticsearch (7.9.0) - elasticsearch-api (= 7.9.0) - elasticsearch-transport (= 7.9.0) - elasticsearch-api (7.9.0) + ed25519 (1.3.0) + elasticsearch (7.13.3) + elasticsearch-api (= 7.13.3) + elasticsearch-transport (= 7.13.3) + elasticsearch-api (7.13.3) multi_json - elasticsearch-dsl (0.1.9) - elasticsearch-transport (7.9.0) + elasticsearch-dsl (0.1.10) + elasticsearch-transport (7.13.3) faraday (~> 1) multi_json encryptor (3.0.0) @@ -209,14 +211,31 @@ GEM et-orbi (1.2.4) tzinfo excon (0.76.0) - fabrication (2.21.1) - faker (2.15.1) + fabrication (2.24.0) + faker (2.19.0) i18n (>= 1.6, < 2) - faraday (1.0.1) + faraday (1.8.0) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0.1) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) multipart-post (>= 1.2, < 3) - fast_blank (1.0.0) - fastimage (2.2.1) - ffi (1.10.0) + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + fast_blank (1.0.1) + fastimage (2.2.6) + ffi (1.15.5) ffi-compiler (1.0.1) ffi (>= 1.0.0) rake @@ -233,14 +252,14 @@ GEM fog-json (>= 1.0) ipaddress (>= 0.8) formatador (0.2.5) - fugit (1.3.9) + fugit (1.4.5) et-orbi (~> 1.1, >= 1.1.8) - raabro (~> 1.3) + raabro (~> 1.4) fuubar (2.5.1) rspec-core (~> 3.0) ruby-progressbar (~> 1.4) - globalid (0.4.2) - activesupport (>= 4.2.0) + globalid (1.0.0) + activesupport (>= 5.0) hamlit (2.13.0) temple (>= 0.8.2) thor @@ -250,31 +269,29 @@ GEM activesupport (>= 4.0.1) hamlit (>= 1.2.0) railties (>= 4.0.1) - hamster (3.0.0) - concurrent-ruby (~> 1.0) hashdiff (1.0.1) hashie (4.1.0) + hcaptcha (7.1.0) + json highline (2.0.3) hiredis (0.6.3) hkdf (0.3.0) htmlentities (4.3.4) - http (4.4.1) - addressable (~> 2.3) + http (5.0.4) + addressable (~> 2.8) http-cookie (~> 1.0) http-form_data (~> 2.2) - http-parser (~> 1.2.0) - http-cookie (1.0.3) + llhttp-ffi (~> 0.4.0) + http-cookie (1.0.4) domain_name (~> 0.5) http-form_data (2.3.0) - http-parser (1.2.1) - ffi-compiler (>= 1.0, < 2.0) http_accept_language (2.1.1) - httplog (1.4.3) + httplog (1.5.0) rack (>= 1.0) rainbow (>= 2.0.0) - i18n (1.8.7) + i18n (1.8.11) concurrent-ruby (~> 1.0) - i18n-tasks (0.9.33) + i18n-tasks (0.9.37) activesupport (>= 4.0.2) ast (>= 2.1.0) erubi @@ -284,92 +301,99 @@ GEM rails-i18n rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) - idn-ruby (0.1.0) + idn-ruby (0.1.4) ipaddress (0.8.3) iso-639 (0.3.5) - jmespath (1.4.0) - json (2.3.1) - json-canonicalization (0.2.0) - json-ld (3.1.7) + jmespath (1.5.0) + json (2.5.1) + json-canonicalization (0.3.0) + json-ld (3.2.0) htmlentities (~> 4.3) - json-canonicalization (~> 0.2) + json-canonicalization (~> 0.3) link_header (~> 0.0, >= 0.0.8) - multi_json (~> 1.14) - rack (~> 2.0) - rdf (~> 3.1) - json-ld-preloaded (3.1.4) - json-ld (~> 3.1) - rdf (~> 3.1) + multi_json (~> 1.15) + rack (~> 2.2) + rdf (~> 3.2) + json-ld-preloaded (3.2.0) + json-ld (~> 3.2) + rdf (~> 3.2) jsonapi-renderer (0.2.2) jwt (2.2.2) - kaminari (1.2.1) + kaminari (1.2.2) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.1) - kaminari-activerecord (= 1.2.1) - kaminari-core (= 1.2.1) - kaminari-actionview (1.2.1) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) actionview - kaminari-core (= 1.2.1) - kaminari-activerecord (1.2.1) + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) activerecord - kaminari-core (= 1.2.1) - kaminari-core (1.2.1) + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) + kt-paperclip (7.0.1) + activemodel (>= 4.2.0) + activesupport (>= 4.2.0) + marcel (~> 1.0.1) + mime-types + terrapin (~> 0.6.0) launchy (2.5.0) addressable (~> 2.7) letter_opener (1.7.0) launchy (~> 2.2) - letter_opener_web (1.4.0) - actionmailer (>= 3.2) - letter_opener (~> 1.0) - railties (>= 3.2) + letter_opener_web (2.0.0) + actionmailer (>= 5.2) + letter_opener (~> 1.7) + railties (>= 5.2) + rexml link_header (0.0.8) + llhttp-ffi (0.4.0) + ffi-compiler (~> 1.0) + rake (~> 13.0) lograge (0.11.2) actionpack (>= 4) activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.8.0) + loofah (2.13.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) mini_mime (>= 0.1.1) - makara (0.5.0) - activerecord (>= 3.0.0) - marcel (0.3.3) - mimemagic (~> 0.3.2) + makara (0.5.1) + activerecord (>= 5.2.0) + marcel (1.0.1) mario-redis-lock (1.2.1) redis (>= 3.0.5) + matrix (0.4.2) memory_profiler (1.0.0) method_source (1.0.0) - microformats (4.2.1) + microformats (4.3.1) json (~> 2.2) nokogiri (~> 1.10) - mime-types (3.3.1) + mime-types (3.4.1) mime-types-data (~> 3.2015) - mime-types-data (3.2020.0512) - mimemagic (0.3.5) - mini_mime (1.0.2) - mini_portile2 (2.5.0) - minitest (5.14.3) - msgpack (1.3.3) + mime-types-data (3.2021.1115) + mini_mime (1.1.2) + mini_portile2 (2.7.1) + minitest (5.15.0) + msgpack (1.4.4) multi_json (1.15.0) multipart-post (2.1.1) net-ldap (0.17.0) net-scp (3.0.0) net-ssh (>= 2.6.5, < 7.0.0) net-ssh (6.1.0) - nio4r (2.5.4) - nokogiri (1.11.1) - mini_portile2 (~> 2.5.0) + nio4r (2.5.8) + nokogiri (1.13.1) + mini_portile2 (~> 2.7.0) racc (~> 1.4) - nokogumbo (2.0.4) - nokogiri (~> 1.8, >= 1.8.4) - nsa (0.2.7) - activesupport (>= 4.2, < 6) + nsa (0.2.8) + activesupport (>= 4.2, < 7) concurrent-ruby (~> 1.0, >= 1.0.2) sidekiq (>= 3.5) statsd-ruby (~> 1.4, >= 1.4.0) - oj (3.11.0) + oj (3.13.11) omniauth (1.9.1) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) @@ -386,31 +410,17 @@ GEM openssl (2.2.0) openssl-signature_algorithm (0.4.0) orm_adapter (0.5.0) - ox (2.14.1) - paperclip (6.0.0) - activemodel (>= 4.2.0) - activesupport (>= 4.2.0) - mime-types - mimemagic (~> 0.3.0) - terrapin (~> 0.6.0) - paperclip-av-transcoder (0.6.4) - av (~> 0.9.0) - paperclip (>= 2.5.2) - parallel (1.20.1) - parallel_tests (3.4.0) - parallel - parser (3.0.0.0) + ox (2.14.6) + parallel (1.21.0) + parser (3.1.0.0) ast (~> 2.4.1) parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) - pg (1.2.3) - pghero (2.7.3) + pg (1.3.0) + pghero (2.8.2) activerecord (>= 5) - pkg-config (1.4.4) - pluck_each (0.1.3) - activerecord (> 3.2.0) - activesupport (> 3.0.0) + pkg-config (1.4.7) posix-spawn (0.3.15) premailer (1.14.2) addressable @@ -429,33 +439,35 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (4.0.6) - puma (5.1.1) + puma (5.5.2) nio4r (~> 2.0) - pundit (2.1.0) + pundit (2.1.1) activesupport (>= 3.0.0) - raabro (1.3.3) - racc (1.5.2) + raabro (1.4.0) + racc (1.6.0) rack (2.2.3) - rack-attack (6.3.1) + rack-attack (6.5.0) rack (>= 1.0, < 3) rack-cors (1.1.1) rack (>= 2.0.0) - rack-proxy (0.6.5) + rack-proxy (0.7.0) rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (5.2.4.4) - actioncable (= 5.2.4.4) - actionmailer (= 5.2.4.4) - actionpack (= 5.2.4.4) - actionview (= 5.2.4.4) - activejob (= 5.2.4.4) - activemodel (= 5.2.4.4) - activerecord (= 5.2.4.4) - activestorage (= 5.2.4.4) - activesupport (= 5.2.4.4) - bundler (>= 1.3.0) - railties (= 5.2.4.4) + rails (6.1.4.4) + actioncable (= 6.1.4.4) + actionmailbox (= 6.1.4.4) + actionmailer (= 6.1.4.4) + actionpack (= 6.1.4.4) + actiontext (= 6.1.4.4) + actionview (= 6.1.4.4) + activejob (= 6.1.4.4) + activemodel (= 6.1.4.4) + activerecord (= 6.1.4.4) + activestorage (= 6.1.4.4) + activesupport (= 6.1.4.4) + bundler (>= 1.15.0) + railties (= 6.1.4.4) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -464,71 +476,54 @@ GEM rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-html-sanitizer (1.3.0) + rails-html-sanitizer (1.4.2) loofah (~> 2.3) - rails-i18n (5.1.3) + rails-i18n (6.0.0) i18n (>= 0.7, < 2) - railties (>= 5.0, < 6) + railties (>= 6.0.0, < 7) rails-settings-cached (0.6.6) rails (>= 4.2.0) - railties (5.2.4.4) - actionpack (= 5.2.4.4) - activesupport (= 5.2.4.4) + railties (6.1.4.4) + actionpack (= 6.1.4.4) + activesupport (= 6.1.4.4) method_source - rake (>= 0.8.7) - thor (>= 0.19.0, < 2.0) - rainbow (3.0.0) - rake (13.0.3) - rdf (3.1.8) - hamster (~> 3.0) + rake (>= 0.13) + thor (~> 1.0) + rainbow (3.1.1) + rake (13.0.6) + rdf (3.2.3) link_header (~> 0.0, >= 0.0.8) - rdf-normalize (0.4.0) - rdf (~> 3.1) - redcarpet (3.5.0) - redis (4.2.5) - redis-actionpack (5.2.0) - actionpack (>= 5, < 7) - redis-rack (>= 2.1.0, < 3) - redis-store (>= 1.1.0, < 2) - redis-activesupport (5.2.0) - activesupport (>= 3, < 7) - redis-store (>= 1.3, < 2) - redis-namespace (1.8.0) + rdf-normalize (0.5.0) + rdf (~> 3.2) + redcarpet (3.5.1) + redis (4.5.1) + redis-namespace (1.8.1) redis (>= 3.0.4) - redis-rack (2.1.3) - rack (>= 2.0.8, < 3) - redis-store (>= 1.2, < 2) - redis-rails (5.0.2) - redis-actionpack (>= 5.0, < 6) - redis-activesupport (>= 5.0, < 6) - redis-store (>= 1.2, < 2) - redis-store (1.9.0) - redis (>= 4, < 5) - regexp_parser (1.8.2) + regexp_parser (2.2.0) request_store (1.5.0) rack (>= 1.4) responders (3.0.1) actionpack (>= 5.0) railties (>= 5.0) - rexml (3.2.4) - rotp (2.1.2) + rexml (3.2.5) + rotp (6.2.0) rpam2 (4.0.2) - rqrcode (1.2.0) + rqrcode (2.1.0) chunky_png (~> 1.0) - rqrcode_core (~> 0.2) - rqrcode_core (0.2.0) + rqrcode_core (~> 1.0) + rqrcode_core (1.2.0) rspec-core (3.10.1) rspec-support (~> 3.10.0) rspec-expectations (3.10.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.10.0) - rspec-mocks (3.10.1) + rspec-mocks (3.10.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.10.0) - rspec-rails (4.0.2) - actionpack (>= 4.2) - activesupport (>= 4.2) - railties (>= 4.2) + rspec-rails (5.0.2) + actionpack (>= 5.2) + activesupport (>= 5.2) + railties (>= 5.2) rspec-core (~> 3.10) rspec-expectations (~> 3.10) rspec-mocks (~> 3.10) @@ -536,62 +531,64 @@ GEM rspec-sidekiq (3.1.0) rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) - rspec-support (3.10.1) - rspec_junit_formatter (0.4.1) + rspec-support (3.10.3) + rspec_junit_formatter (0.5.1) rspec-core (>= 2, < 4, != 2.12.0) - rubocop (1.7.0) + rubocop (1.25.0) parallel (~> 1.10) - parser (>= 2.7.1.5) + parser (>= 3.1.0.0) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml - rubocop-ast (>= 1.2.0, < 2.0) + rubocop-ast (>= 1.15.1, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 2.0) - rubocop-ast (1.3.0) - parser (>= 2.7.1.5) - rubocop-rails (2.9.1) + unicode-display_width (>= 1.4.0, < 3.0) + rubocop-ast (1.15.1) + parser (>= 3.0.1.1) + rubocop-rails (2.13.2) activesupport (>= 4.2.0) rack (>= 1.1) - rubocop (>= 0.90.0, < 2.0) + rubocop (>= 1.7.0, < 2.0) ruby-progressbar (1.11.0) - ruby-saml (1.11.0) - nokogiri (>= 1.5.10) - rufus-scheduler (3.6.0) + ruby-saml (1.13.0) + nokogiri (>= 1.10.5) + rexml + ruby2_keywords (0.0.5) + rufus-scheduler (3.7.0) fugit (~> 1.1, >= 1.1.6) safety_net_attestation (0.4.0) jwt (~> 2.0) - sanitize (5.2.3) + sanitize (6.0.0) crass (~> 1.0.2) - nokogiri (>= 1.8.0) - nokogumbo (~> 2.0) - scenic (1.5.4) + nokogiri (>= 1.12.0) + scenic (1.5.5) activerecord (>= 4.0.0) railties (>= 4.0.0) securecompare (1.0.0) - semantic_range (2.3.0) - sidekiq (6.1.2) + semantic_range (3.0.0) + sidekiq (6.4.0) connection_pool (>= 2.2.2) rack (~> 2.0) redis (>= 4.2.0) sidekiq-bulk (0.2.0) sidekiq - sidekiq-scheduler (3.0.1) + sidekiq-scheduler (3.1.0) e2mmap redis (>= 3, < 5) rufus-scheduler (~> 3.2) sidekiq (>= 3) thwait tilt (>= 1.4.0) - sidekiq-unique-jobs (6.0.25) + sidekiq-unique-jobs (7.1.12) + brpoplpush-redis_script (> 0.1.1, <= 2.0.0) concurrent-ruby (~> 1.0, >= 1.0.5) - sidekiq (>= 4.0, < 7.0) - thor (>= 0.20, < 2.0) - simple-navigation (4.1.0) + sidekiq (>= 5.0, < 8.0) + thor (>= 0.20, < 3.0) + simple-navigation (4.3.0) activesupport (>= 2.3.2) - simple_form (5.0.3) - actionpack (>= 5.0) - activemodel (>= 5.0) + simple_form (5.1.0) + actionpack (>= 5.2) + activemodel (>= 5.2) simplecov (0.21.2) docile (~> 1.1) simplecov-html (~> 0.11) @@ -601,27 +598,24 @@ GEM sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.2) - actionpack (>= 4.0) - activesupport (>= 4.0) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) - sshkit (1.21.1) + sshkit (1.21.2) net-scp (>= 1.1.2) net-ssh (>= 2.8.0) - stackprof (0.2.16) - statsd-ruby (1.4.0) + stackprof (0.2.17) + statsd-ruby (1.5.0) stoplight (2.2.1) - streamio-ffmpeg (3.0.2) - multi_json (~> 1.8) - strong_migrations (0.7.6) + strong_migrations (0.7.9) activerecord (>= 5) temple (0.8.2) - terminal-table (2.0.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) terrapin (0.6.0) climate_control (>= 0.0.3, < 1.0) - thor (1.0.1) - thread_safe (0.3.6) + thor (1.2.1) thwait (0.2.0) e2mmap tilt (2.0.10) @@ -630,7 +624,7 @@ GEM openssl-signature_algorithm (~> 0.4.0) tty-color (0.6.0) tty-cursor (0.7.1) - tty-prompt (0.23.0) + tty-prompt (0.23.1) pastel (~> 0.8) tty-reader (~> 0.8) tty-reader (0.9.0) @@ -638,17 +632,18 @@ GEM tty-screen (~> 0.8) wisper (~> 2.0) tty-screen (0.8.1) - twitter-text (1.14.7) + twitter-text (3.1.0) + idn-ruby unf (~> 0.1.0) - tzinfo (1.2.9) - thread_safe (~> 0.1) - tzinfo-data (1.2020.6) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2021.5) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) - uniform_notifier (1.13.0) + unf_ext (0.0.8) + unicode-display_width (2.1.0) + uniform_notifier (1.14.2) warden (1.2.9) rack (>= 2.0.9) webauthn (3.0.0.alpha1) @@ -661,11 +656,11 @@ GEM safety_net_attestation (~> 0.4.0) securecompare (~> 1.0) tpm-key_attestation (~> 0.9.0) - webmock (3.11.1) - addressable (>= 2.3.6) + webmock (3.14.0) + addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webpacker (5.2.1) + webpacker (5.4.3) activesupport (>= 5.2) rack-proxy (>= 0.6.1) railties (>= 5.2) @@ -673,13 +668,14 @@ GEM webpush (0.3.8) hkdf (~> 0.2) jwt (~> 2.0) - websocket-driver (0.7.3) + websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) wisper (2.0.1) xorcist (1.1.2) xpath (3.2.0) nokogiri (~> 1.8) + zeitwerk (2.5.3) PLATFORMS ruby @@ -687,131 +683,125 @@ PLATFORMS DEPENDENCIES active_model_serializers (~> 0.10) active_record_query_trace (~> 1.8) - addressable (~> 2.7) + addressable (~> 2.8) annotate (~> 3.1) - aws-sdk-s3 (~> 1.87) + aws-sdk-s3 (~> 1.111) better_errors (~> 2.9) binding_of_caller (~> 1.0) blurhash (~> 0.1) - bootsnap (~> 1.5) - brakeman (~> 4.10) + bootsnap (~> 1.10.2) + brakeman (~> 5.2) browser - bullet (~> 6.1) - bundler-audit (~> 0.7) - capistrano (~> 3.15) + bullet (~> 7.0) + bundler-audit (~> 0.9) + capistrano (~> 3.16) capistrano-rails (~> 1.6) capistrano-rbenv (~> 2.2) capistrano-yarn (~> 2.0) - capybara (~> 3.34) + capybara (~> 3.36) charlock_holmes (~> 0.7.7) - chewy (~> 5.1) - cld3 (~> 3.4.1) + chewy (~> 7.2) + cld3 (~> 3.4.4) climate_control (~> 0.2) color_diff (~> 0.1) concurrent-ruby connection_pool - devise (~> 4.7) - devise-two-factor (~> 3.1) + devise (~> 4.8) + devise-two-factor (~> 4.0) devise_pam_authenticatable2 (~> 9.2) discard (~> 1.2) - doorkeeper (~> 5.4) + doorkeeper (~> 5.5) dotenv-rails (~> 2.7) - ed25519 (~> 1.2) - fabrication (~> 2.21) - faker (~> 2.15) + ed25519 (~> 1.3) + fabrication (~> 2.24) + faker (~> 2.19) fast_blank (~> 1.0) fastimage fog-core (<= 2.1.0) fog-openstack (~> 0.3) fuubar (~> 2.5) hamlit-rails (~> 0.2) - health_check! + hcaptcha (~> 7.1) hiredis (~> 0.6) htmlentities (~> 4.3) - http (~> 4.4) + http (~> 5.0) http_accept_language (~> 2.1) - httplog (~> 1.4.3) + httplog (~> 1.5.0) i18n-tasks (~> 0.9) idn-ruby iso-639 json-ld - json-ld-preloaded (~> 3.1) + json-ld-preloaded (~> 3.2) kaminari (~> 1.2) + kt-paperclip (~> 7.0) letter_opener (~> 1.7) - letter_opener_web (~> 1.4) + letter_opener_web (~> 2.0) link_header (~> 0.0) lograge (~> 0.11) makara (~> 0.5) mario-redis-lock (~> 1.2) memory_profiler microformats (~> 4.2) - mime-types (~> 3.3.1) + mime-types (~> 3.4.1) net-ldap (~> 0.17) - nilsimsa! - nokogiri (~> 1.11) + nokogiri (~> 1.13) nsa (~> 0.2) - oj (~> 3.11) + oj (~> 3.13) omniauth (~> 1.9) omniauth-cas (~> 2.0) omniauth-rails_csrf_protection (~> 0.1) omniauth-saml (~> 1.10) ox (~> 2.14) - paperclip (~> 6.0) - paperclip-av-transcoder (~> 0.6) - parallel (~> 1.20) - parallel_tests (~> 3.4) parslet - pg (~> 1.2) - pghero (~> 2.7) + pg (~> 1.3) + pghero (~> 2.8) pkg-config (~> 1.4) - pluck_each (~> 0.1.3) posix-spawn premailer-rails private_address_check (~> 0.5) pry-byebug (~> 3.9) pry-rails (~> 0.3) - puma (~> 5.1) + puma (~> 5.5) pundit (~> 2.1) rack (~> 2.2.3) - rack-attack (~> 6.3) + rack-attack (~> 6.5) rack-cors (~> 1.1) - rails (~> 5.2.4.4) + rails (~> 6.1.4) rails-controller-testing (~> 1.0) - rails-i18n (~> 5.1) + rails-i18n (~> 6.0) rails-settings-cached (~> 0.6) - rdf-normalize (~> 0.4) - redcarpet (~> 3.4) - redis (~> 4.2) + rdf-normalize (~> 0.5) + redcarpet (~> 3.5) + redis (~> 4.5) redis-namespace (~> 1.8) - redis-rails (~> 5.0) - rqrcode (~> 1.2) - rspec-rails (~> 4.0) + rexml (~> 3.2) + rqrcode (~> 2.1) + rspec-rails (~> 5.0) rspec-sidekiq (~> 3.1) - rspec_junit_formatter (~> 0.4) - rubocop (~> 1.7) - rubocop-rails (~> 2.9) + rspec_junit_formatter (~> 0.5) + rubocop (~> 1.25) + rubocop-rails (~> 2.13) ruby-progressbar (~> 1.11) - sanitize (~> 5.2) + sanitize (~> 6.0) scenic (~> 1.5) - sidekiq (~> 6.1) + sidekiq (~> 6.4) sidekiq-bulk (~> 0.2.0) - sidekiq-scheduler (~> 3.0) - sidekiq-unique-jobs (~> 6.0) - simple-navigation (~> 4.1) - simple_form (~> 5.0) + sidekiq-scheduler (~> 3.1) + sidekiq-unique-jobs (~> 7.1) + simple-navigation (~> 4.3) + simple_form (~> 5.1) simplecov (~> 0.21) sprockets (~> 3.7.2) - sprockets-rails (~> 3.2) + sprockets-rails (~> 3.4) stackprof stoplight (~> 2.2.1) - streamio-ffmpeg (~> 3.0) strong_migrations (~> 0.7) - thor (~> 1.0) + thor (~> 1.2) tty-prompt (~> 0.23) - twitter-text (~> 1.14) - tzinfo-data (~> 1.2020) + twitter-text (~> 3.1.0) + tzinfo-data (~> 1.2021) webauthn (~> 3.0.0.alpha1) - webmock (~> 3.11) - webpacker (~> 5.2) - webpush + webmock (~> 3.14) + webpacker (~> 5.4) + webpush (~> 0.3) xorcist (~> 1.1) diff --git a/README.md b/README.md index 470e379dc0..256f2d2def 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,12 @@ > Now with automated deploys! [![Build Status](https://img.shields.io/circleci/project/github/glitch-soc/mastodon.svg)][circleci] +[![Code Climate](https://img.shields.io/codeclimate/maintainability/glitch-soc/mastodon.svg)][code_climate] [circleci]: https://circleci.com/gh/glitch-soc/mastodon +[code_climate]: https://codeclimate.com/github/glitch-soc/mastodon -So here's the deal: we all work on this code, and then it runs on dev.glitch.social and anyone who uses that does so absolutely at their own risk. can you dig it? +So here's the deal: we all work on this code, and anyone who uses that does so absolutely at their own risk. can you dig it? - You can view documentation for this project at [glitch-soc.github.io/docs/](https://glitch-soc.github.io/docs/). - And contributing guidelines are available [here](CONTRIBUTING.md) and [here](https://glitch-soc.github.io/docs/contributing/). diff --git a/SECURITY.md b/SECURITY.md index 7625597fe1..9d351fce61 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,8 +4,9 @@ | Version | Supported | | ------- | ------------------ | -| 3.1.x | :white_check_mark: | -| < 3.1 | :x: | +| 3.4.x | :white_check_mark: | +| 3.3.x | :white_check_mark: | +| < 3.3 | :x: | ## Reporting a Vulnerability diff --git a/Vagrantfile b/Vagrantfile index 143fa27fdb..aeff2f233b 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -12,7 +12,7 @@ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main' # Add repo for NodeJS -curl -sL https://deb.nodesource.com/setup_10.x | sudo bash - +curl -sL https://deb.nodesource.com/setup_14.x | sudo bash - # Add firewall rule to redirect 80 to PORT and save sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]} @@ -45,16 +45,8 @@ sudo apt-get install \ # Install rvm read RUBY_VERSION < .ruby-version -gpg_command="gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB" -$($gpg_command) -if [ $? -ne 0 ];then - echo "GPG command failed, This prevented RVM from installing." - echo "Retrying once..." && $($gpg_command) - if [ $? -ne 0 ];then - echo "GPG failed for the second time, please ensure network connectivity." - echo "Exiting..." && exit 1 - fi -fi +curl -sSL https://rvm.io/mpapis.asc | gpg --import +curl -sSL https://rvm.io/pkuczynski.asc | gpg --import curl -sSL https://raw.githubusercontent.com/rvm/rvm/stable/binscripts/rvm-installer | bash -s stable --ruby=$RUBY_VERSION source /home/vagrant/.rvm/scripts/rvm @@ -72,10 +64,12 @@ bundle install yarn install # Build Mastodon +export RAILS_ENV=development export $(cat ".env.vagrant" | xargs) bundle exec rails db:setup # Configure automatic loading of environment variable +echo 'export RAILS_ENV=development' >> ~/.bash_profile echo 'export $(cat "/vagrant/.env.vagrant" | xargs)' >> ~/.bash_profile SCRIPT diff --git a/app.json b/app.json index e4f7cf403e..6b43653834 100644 --- a/app.json +++ b/app.json @@ -1,8 +1,8 @@ { "name": "Mastodon", "description": "A GNU Social-compatible microblogging server", - "repository": "https://github.com/tootsuite/mastodon", - "logo": "https://github.com/tootsuite.png", + "repository": "https://github.com/mastodon/mastodon", + "logo": "https://github.com/mastodon.png", "env": { "HEROKU": { "description": "Leave this as true", diff --git a/app/chewy/accounts_index.rb b/app/chewy/accounts_index.rb index b814e009e5..6f9ea76e9a 100644 --- a/app/chewy/accounts_index.rb +++ b/app/chewy/accounts_index.rb @@ -23,21 +23,21 @@ class AccountsIndex < Chewy::Index }, } - define_type ::Account.searchable.includes(:account_stat), delete_if: ->(account) { account.destroyed? || !account.searchable? } do - root date_detection: false do - field :id, type: 'long' + index_scope ::Account.searchable.includes(:account_stat), delete_if: ->(account) { account.destroyed? || !account.searchable? } - field :display_name, type: 'text', analyzer: 'content' do - field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content' - end + root date_detection: false do + field :id, type: 'long' - field :acct, type: 'text', analyzer: 'content', value: ->(account) { [account.username, account.domain].compact.join('@') } do - field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content' - end - - field :following_count, type: 'long', value: ->(account) { account.following.local.count } - field :followers_count, type: 'long', value: ->(account) { account.followers.local.count } - field :last_status_at, type: 'date', value: ->(account) { account.last_status_at || account.created_at } + field :display_name, type: 'text', analyzer: 'content' do + field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content' end + + field :acct, type: 'text', analyzer: 'content', value: ->(account) { [account.username, account.domain].compact.join('@') } do + field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content' + end + + field :following_count, type: 'long', value: ->(account) { account.following.local.count } + field :followers_count, type: 'long', value: ->(account) { account.followers.local.count } + field :last_status_at, type: 'date', value: ->(account) { account.last_status_at || account.created_at } end end diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb index 47cb856ea9..1903c2ea30 100644 --- a/app/chewy/statuses_index.rb +++ b/app/chewy/statuses_index.rb @@ -31,36 +31,36 @@ class StatusesIndex < Chewy::Index }, } - define_type ::Status.unscoped.kept.without_reblogs.includes(:media_attachments, :preloadable_poll) do - crutch :mentions do |collection| - data = ::Mention.where(status_id: collection.map(&:id)).where(account: Account.local, silent: false).pluck(:status_id, :account_id) - data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } + index_scope ::Status.unscoped.kept.without_reblogs.includes(:media_attachments, :preloadable_poll) + + crutch :mentions do |collection| + data = ::Mention.where(status_id: collection.map(&:id)).where(account: Account.local, silent: false).pluck(:status_id, :account_id) + data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } + end + + crutch :favourites do |collection| + data = ::Favourite.where(status_id: collection.map(&:id)).where(account: Account.local).pluck(:status_id, :account_id) + data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } + end + + crutch :reblogs do |collection| + data = ::Status.where(reblog_of_id: collection.map(&:id)).where(account: Account.local).pluck(:reblog_of_id, :account_id) + data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } + end + + crutch :bookmarks do |collection| + data = ::Bookmark.where(status_id: collection.map(&:id)).where(account: Account.local).pluck(:status_id, :account_id) + data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } + end + + root date_detection: false do + field :id, type: 'long' + field :account_id, type: 'long' + + field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).concat(status.preloadable_poll ? status.preloadable_poll.options : []).join("\n\n") } do + field :stemmed, type: 'text', analyzer: 'content' end - crutch :favourites do |collection| - data = ::Favourite.where(status_id: collection.map(&:id)).where(account: Account.local).pluck(:status_id, :account_id) - data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } - end - - crutch :reblogs do |collection| - data = ::Status.where(reblog_of_id: collection.map(&:id)).where(account: Account.local).pluck(:reblog_of_id, :account_id) - data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } - end - - crutch :bookmarks do |collection| - data = ::Bookmark.where(status_id: collection.map(&:id)).where(account: Account.local).pluck(:status_id, :account_id) - data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } - end - - root date_detection: false do - field :id, type: 'long' - field :account_id, type: 'long' - - field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).concat(status.preloadable_poll ? status.preloadable_poll.options : []).join("\n\n") } do - field :stemmed, type: 'text', analyzer: 'content' - end - - field :searchable_by, type: 'long', value: ->(status, crutches) { status.searchable_by(crutches) } - end + field :searchable_by, type: 'long', value: ->(status, crutches) { status.searchable_by(crutches) } end end diff --git a/app/chewy/tags_index.rb b/app/chewy/tags_index.rb index 300fc128f6..f9db2b03af 100644 --- a/app/chewy/tags_index.rb +++ b/app/chewy/tags_index.rb @@ -23,15 +23,15 @@ class TagsIndex < Chewy::Index }, } - define_type ::Tag.listable, delete_if: ->(tag) { tag.destroyed? || !tag.listable? } do - root date_detection: false do - field :name, type: 'text', analyzer: 'content' do - field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content' - end + index_scope ::Tag.listable, delete_if: ->(tag) { tag.destroyed? || !tag.listable? } - field :reviewed, type: 'boolean', value: ->(tag) { tag.reviewed? } - field :usage, type: 'long', value: ->(tag) { tag.history.reduce(0) { |total, day| total + day[:accounts].to_i } } - field :last_status_at, type: 'date', value: ->(tag) { tag.last_status_at || tag.created_at } + root date_detection: false do + field :name, type: 'text', analyzer: 'content' do + field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content' end + + field :reviewed, type: 'boolean', value: ->(tag) { tag.reviewed? } + field :usage, type: 'long', value: ->(tag) { tag.history.reduce(0) { |total, day| total + day.accounts } } + field :last_status_at, type: 'date', value: ->(tag) { tag.last_status_at || tag.created_at } end end diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index 5ff6990d70..620c0ff78f 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -22,6 +22,7 @@ class AboutController < ApplicationController toc_generator = TOCGenerator.new(@instance_presenter.site_extended_description) + @rules = Rule.ordered @contents = toc_generator.html @table_of_contents = toc_generator.toc @blocks = DomainBlock.with_user_facing_limitations.by_severity if display_blocks? diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index dfe94af7d9..03c07c50b0 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -29,7 +29,7 @@ class AccountsController < ApplicationController return end - @pinned_statuses = cache_collection(@account.pinned_statuses.not_local_only, Status) if show_pinned_statuses? + @pinned_statuses = cached_filtered_status_pins if show_pinned_statuses? @statuses = cached_filtered_status_page @rss_url = rss_url @@ -65,6 +65,10 @@ class AccountsController < ApplicationController [replies_requested?, media_requested?, tag_requested?, params[:max_id].present?, params[:min_id].present?].none? end + def filtered_pinned_statuses + @account.pinned_statuses.not_local_only.where(visibility: [:public, :unlisted]) + end + def filtered_statuses default_statuses.tap do |statuses| statuses.merge!(hashtag_scope) if tag_requested? @@ -78,11 +82,7 @@ class AccountsController < ApplicationController end def only_media_scope - Status.where(id: account_media_status_ids) - end - - def account_media_status_ids - @account.media_attachments.attached.reorder(nil).select(:status_id).group(:status_id) + Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id) end def no_replies_scope @@ -136,15 +136,22 @@ class AccountsController < ApplicationController end def media_requested? - request.path.split('.').first.ends_with?('/media') && !tag_requested? + request.path.split('.').first.end_with?('/media') && !tag_requested? end def replies_requested? - request.path.split('.').first.ends_with?('/with_replies') && !tag_requested? + request.path.split('.').first.end_with?('/with_replies') && !tag_requested? end def tag_requested? - request.path.split('.').first.ends_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize) + request.path.split('.').first.end_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize) + end + + def cached_filtered_status_pins + cache_collection( + filtered_pinned_statuses, + Status + ) end def cached_filtered_status_page diff --git a/app/controllers/activitypub/collections_controller.rb b/app/controllers/activitypub/collections_controller.rb index 00f3d3cba8..ac7ab8a0b2 100644 --- a/app/controllers/activitypub/collections_controller.rb +++ b/app/controllers/activitypub/collections_controller.rb @@ -21,6 +21,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController case params[:id] when 'featured' @items = for_signed_account { cache_collection(@account.pinned_statuses.not_local_only, Status) } + @items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) } when 'tags' @items = for_signed_account { @account.featured_tags } when 'devices' diff --git a/app/controllers/activitypub/followers_synchronizations_controller.rb b/app/controllers/activitypub/followers_synchronizations_controller.rb index 5250311058..940b77cf0a 100644 --- a/app/controllers/activitypub/followers_synchronizations_controller.rb +++ b/app/controllers/activitypub/followers_synchronizations_controller.rb @@ -19,11 +19,11 @@ class ActivityPub::FollowersSynchronizationsController < ActivityPub::BaseContro private def uri_prefix - signed_request_account.uri[/http(s?):\/\/[^\/]+\//] + signed_request_account.uri[Account::URL_PREFIX_RE] end def set_items - @items = @account.followers.where(Account.arel_table[:uri].matches(uri_prefix + '%', false, true)).pluck(:uri) + @items = @account.followers.where(Account.arel_table[:uri].matches("#{Account.sanitize_sql_like(uri_prefix)}/%", false, true)).or(@account.followers.where(uri: uri_prefix)).pluck(:uri) end def collection_presenter diff --git a/app/controllers/activitypub/outboxes_controller.rb b/app/controllers/activitypub/outboxes_controller.rb index 5fd735ad6a..b2aab56a56 100644 --- a/app/controllers/activitypub/outboxes_controller.rb +++ b/app/controllers/activitypub/outboxes_controller.rb @@ -11,7 +11,11 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController before_action :set_cache_headers def show - expires_in(page_requested? ? 0 : 3.minutes, public: public_fetch_mode? && !(signed_request_account.present? && page_requested?)) + if page_requested? + expires_in(1.minute, public: public_fetch_mode? && signed_request_account.nil?) + else + expires_in(3.minutes, public: public_fetch_mode?) + end render json: outbox_presenter, serializer: ActivityPub::OutboxSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json' end @@ -20,7 +24,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController def outbox_presenter if page_requested? ActivityPub::CollectionPresenter.new( - id: outbox_url(page_params), + id: outbox_url(**page_params), type: :ordered, part_of: outbox_url, prev: prev_page, @@ -29,7 +33,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController ) else ActivityPub::CollectionPresenter.new( - id: account_outbox_url(@account), + id: outbox_url, type: :ordered, size: @account.statuses_count, first: outbox_url(page: true), @@ -47,11 +51,11 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController end def next_page - account_outbox_url(@account, page: true, max_id: @statuses.last.id) if @statuses.size == LIMIT + outbox_url(page: true, max_id: @statuses.last.id) if @statuses.size == LIMIT end def prev_page - account_outbox_url(@account, page: true, min_id: @statuses.first.id) unless @statuses.empty? + outbox_url(page: true, min_id: @statuses.first.id) unless @statuses.empty? end def set_statuses @@ -76,4 +80,8 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController def set_account @account = params[:account_username].present? ? Account.find_local!(username_param) : Account.representative end + + def set_cache_headers + response.headers['Vary'] = 'Signature' if authorized_fetch_mode? || page_requested? + end end diff --git a/app/controllers/admin/account_moderation_notes_controller.rb b/app/controllers/admin/account_moderation_notes_controller.rb index 44f6e34f80..4f36f33f47 100644 --- a/app/controllers/admin/account_moderation_notes_controller.rb +++ b/app/controllers/admin/account_moderation_notes_controller.rb @@ -14,7 +14,7 @@ module Admin else @account = @account_moderation_note.target_account @moderation_notes = @account.targeted_moderation_notes.latest - @warnings = @account.targeted_account_warnings.latest.custom + @warnings = @account.strikes.custom.latest render template: 'admin/accounts/show' end diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index 1dd7430e09..e7f56e243b 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -2,13 +2,24 @@ module Admin class AccountsController < BaseController - before_action :set_account, except: [:index] + before_action :set_account, except: [:index, :batch] before_action :require_remote_account!, only: [:redownload] before_action :require_local_account!, only: [:enable, :memorialize, :approve, :reject] def index authorize :account, :index? + @accounts = filtered_accounts.page(params[:page]) + @form = Form::AccountBatch.new + end + + def batch + @form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button)) + @form.save + rescue ActionController::ParameterMissing + flash[:alert] = I18n.t('admin.accounts.no_account_selected') + ensure + redirect_to admin_accounts_path(filter_params) end def show @@ -17,7 +28,7 @@ module Admin @deletion_request = @account.deletion_request @account_moderation_note = current_account.account_moderation_notes.new(target_account: @account) @moderation_notes = @account.targeted_moderation_notes.latest - @warnings = @account.targeted_account_warnings.latest.custom + @warnings = @account.strikes.custom.latest @domain_block = DomainBlock.rule_for(@account.domain) end @@ -38,13 +49,13 @@ module Admin def approve authorize @account.user, :approve? @account.user.approve! - redirect_to admin_pending_accounts_path, notice: I18n.t('admin.accounts.approved_msg', username: @account.acct) + redirect_to admin_accounts_path(status: 'pending'), notice: I18n.t('admin.accounts.approved_msg', username: @account.acct) end def reject authorize @account.user, :reject? DeleteAccountService.new.call(@account, reserve_email: false, reserve_username: false) - redirect_to admin_pending_accounts_path, notice: I18n.t('admin.accounts.rejected_msg', username: @account.acct) + redirect_to admin_accounts_path(status: 'pending'), notice: I18n.t('admin.accounts.rejected_msg', username: @account.acct) end def destroy @@ -106,6 +117,16 @@ module Admin redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.removed_header_msg', username: @account.acct) end + def unblock_email + authorize @account, :unblock_email? + + CanonicalEmailBlock.where(reference_account: @account).delete_all + + log_action :unblock_email, @account + + redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.unblocked_email_msg', username: @account.acct) + end + private def set_account @@ -121,11 +142,25 @@ module Admin end def filtered_accounts - AccountFilter.new(filter_params).results + AccountFilter.new(filter_params.with_defaults(order: 'recent')).results end def filter_params params.slice(*AccountFilter::KEYS).permit(*AccountFilter::KEYS) end + + def form_account_batch_params + params.require(:form_account_batch).permit(:action, account_ids: []) + end + + def action_from_button + if params[:suspend] + 'suspend' + elsif params[:approve] + 'approve' + elsif params[:reject] + 'reject' + end + end end end diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index 4116f99f45..f0a9354110 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -1,50 +1,17 @@ # frozen_string_literal: true -require 'sidekiq/api' module Admin class DashboardController < BaseController def index - @users_count = User.count + @system_checks = Admin::SystemCheck.perform + @time_period = (29.days.ago.to_date...Time.now.utc.to_date) @pending_users_count = User.pending.count - @registrations_week = Redis.current.get("activity:accounts:local:#{current_week}") || 0 - @logins_week = Redis.current.pfcount("activity:logins:#{current_week}") - @interactions_week = Redis.current.get("activity:interactions:#{current_week}") || 0 - @relay_enabled = Relay.enabled.exists? - @single_user_mode = Rails.configuration.x.single_user_mode - @registrations_enabled = Setting.registrations_mode != 'none' - @deletions_enabled = Setting.open_deletion - @invites_enabled = Setting.min_invite_role == 'user' - @search_enabled = Chewy.enabled? - @version = Mastodon::Version.to_s - @database_version = ActiveRecord::Base.connection.execute('SELECT VERSION()').first['version'].match(/\A(?:PostgreSQL |)([^\s]+).*\z/)[1] - @redis_version = redis_info['redis_version'] - @reports_count = Report.unresolved.count - @queue_backlog = Sidekiq::Stats.new.enqueued - @recent_users = User.confirmed.recent.includes(:account).limit(8) - @database_size = ActiveRecord::Base.connection.execute('SELECT pg_database_size(current_database())').first['pg_database_size'] - @redis_size = redis_info['used_memory'] - @ldap_enabled = ENV['LDAP_ENABLED'] == 'true' - @cas_enabled = ENV['CAS_ENABLED'] == 'true' - @saml_enabled = ENV['SAML_ENABLED'] == 'true' - @pam_enabled = ENV['PAM_ENABLED'] == 'true' - @hidden_service = ENV['ALLOW_ACCESS_TO_HIDDEN_SERVICE'] == 'true' - @trending_hashtags = TrendingTags.get(10, filtered: false) + @pending_reports_count = Report.unresolved.count @pending_tags_count = Tag.pending_review.count - @authorized_fetch = authorized_fetch_mode? - @whitelist_enabled = whitelist_mode? - @profile_directory = Setting.profile_directory - @timeline_preview = Setting.timeline_preview - @keybase_integration = Setting.enable_keybase - @spam_check_enabled = Setting.spam_check_enabled - @trends_enabled = Setting.trends end private - def current_week - @current_week ||= Time.now.utc.to_date.cweek - end - def redis_info @redis_info ||= begin if Redis.current.is_a?(Redis::Namespace) diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index ba927b04ad..b140c454c1 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -22,7 +22,7 @@ module Admin if existing_domain_block.present? && !@domain_block.stricter_than?(existing_domain_block) @domain_block.save flash.now[:alert] = I18n.t('admin.domain_blocks.existing_domain_block_html', name: existing_domain_block.domain, unblock_url: admin_domain_block_path(existing_domain_block)).html_safe # rubocop:disable Rails/OutputSafety - @domain_block.errors[:domain].clear + @domain_block.errors.delete(:domain) render :new else if existing_domain_block.present? diff --git a/app/controllers/admin/follow_recommendations_controller.rb b/app/controllers/admin/follow_recommendations_controller.rb new file mode 100644 index 0000000000..e3eac62b36 --- /dev/null +++ b/app/controllers/admin/follow_recommendations_controller.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +module Admin + class FollowRecommendationsController < BaseController + before_action :set_language + + def show + authorize :follow_recommendation, :show? + + @form = Form::AccountBatch.new + @accounts = filtered_follow_recommendations + end + + def update + @form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button)) + @form.save + rescue ActionController::ParameterMissing + # Do nothing + ensure + redirect_to admin_follow_recommendations_path(filter_params) + end + + private + + def set_language + @language = follow_recommendation_filter.language + end + + def filtered_follow_recommendations + follow_recommendation_filter.results + end + + def follow_recommendation_filter + @follow_recommendation_filter ||= FollowRecommendationFilter.new(filter_params) + end + + def form_account_batch_params + params.require(:form_account_batch).permit(:action, account_ids: []) + end + + def filter_params + params.slice(*FollowRecommendationFilter::KEYS).permit(*FollowRecommendationFilter::KEYS) + end + + def action_from_button + if params[:suppress] + 'suppress_follow_recommendation' + elsif params[:unsuppress] + 'unsuppress_follow_recommendation' + end + end + end +end diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb index b5918d231c..306ec1f532 100644 --- a/app/controllers/admin/instances_controller.rb +++ b/app/controllers/admin/instances_controller.rb @@ -3,7 +3,8 @@ module Admin class InstancesController < BaseController before_action :set_instances, only: :index - before_action :set_instance, only: :show + before_action :set_instance, except: :index + before_action :set_exhausted_deliveries_days, only: :show def index authorize :instance, :index? @@ -13,14 +14,64 @@ module Admin authorize :instance, :show? end + def destroy + authorize :instance, :destroy? + + Admin::DomainPurgeWorker.perform_async(@instance.domain) + + log_action :destroy, @instance + redirect_to admin_instances_path, notice: I18n.t('admin.instances.destroyed_msg', domain: @instance.domain) + end + + def clear_delivery_errors + authorize :delivery, :clear_delivery_errors? + + @instance.delivery_failure_tracker.clear_failures! + redirect_to admin_instance_path(@instance.domain) + end + + def restart_delivery + authorize :delivery, :restart_delivery? + + last_unavailable_domain = unavailable_domain + + if last_unavailable_domain.present? + @instance.delivery_failure_tracker.track_success! + log_action :destroy, last_unavailable_domain + end + + redirect_to admin_instance_path(@instance.domain) + end + + def stop_delivery + authorize :delivery, :stop_delivery? + + UnavailableDomain.create(domain: @instance.domain) + log_action :create, unavailable_domain + redirect_to admin_instance_path(@instance.domain) + end + private def set_instance @instance = Instance.find(params[:id]) end + def set_exhausted_deliveries_days + @exhausted_deliveries_days = @instance.delivery_failure_tracker.exhausted_deliveries_days + end + def set_instances @instances = filtered_instances.page(params[:page]) + warning_domains_map = DeliveryFailureTracker.warning_domains_map + + @instances.each do |instance| + instance.failure_days = warning_domains_map[instance.domain] + end + end + + def unavailable_domain + UnavailableDomain.find_by(domain: @instance.domain) end def filtered_instances diff --git a/app/controllers/admin/pending_accounts_controller.rb b/app/controllers/admin/pending_accounts_controller.rb deleted file mode 100644 index b62a9bc846..0000000000 --- a/app/controllers/admin/pending_accounts_controller.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -module Admin - class PendingAccountsController < BaseController - before_action :set_accounts, only: :index - - def index - @form = Form::AccountBatch.new - end - - def batch - @form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button)) - @form.save - rescue ActionController::ParameterMissing - flash[:alert] = I18n.t('admin.accounts.no_account_selected') - ensure - redirect_to admin_pending_accounts_path(current_params) - end - - def approve_all - Form::AccountBatch.new(current_account: current_account, account_ids: User.pending.pluck(:account_id), action: 'approve').save - redirect_to admin_pending_accounts_path(current_params) - end - - def reject_all - Form::AccountBatch.new(current_account: current_account, account_ids: User.pending.pluck(:account_id), action: 'reject').save - redirect_to admin_pending_accounts_path(current_params) - end - - private - - def set_accounts - @accounts = Account.joins(:user).merge(User.pending.recent).includes(user: :invite_request).page(params[:page]) - end - - def form_account_batch_params - params.require(:form_account_batch).permit(:action, account_ids: []) - end - - def action_from_button - if params[:approve] - 'approve' - elsif params[:reject] - 'reject' - end - end - - def current_params - params.slice(:page).permit(:page) - end - end -end diff --git a/app/controllers/admin/report_notes_controller.rb b/app/controllers/admin/report_notes_controller.rb index b816c5b5d4..3fd815b60a 100644 --- a/app/controllers/admin/report_notes_controller.rb +++ b/app/controllers/admin/report_notes_controller.rb @@ -14,20 +14,17 @@ module Admin if params[:create_and_resolve] @report.resolve!(current_account) log_action :resolve, @report - - redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg') - return - end - - if params[:create_and_unresolve] + elsif params[:create_and_unresolve] @report.unresolve! log_action :reopen, @report end - redirect_to admin_report_path(@report), notice: I18n.t('admin.report_notes.created_msg') + redirect_to after_create_redirect_path, notice: I18n.t('admin.report_notes.created_msg') else - @report_notes = (@report.notes.latest + @report.history + @report.target_account.targeted_account_warnings.latest.custom).sort_by(&:created_at) - @form = Form::StatusBatch.new + @report_notes = @report.notes.includes(:account).order(id: :desc) + @action_logs = @report.history.includes(:target) + @form = Admin::StatusBatchAction.new + @statuses = @report.statuses.with_includes render template: 'admin/reports/show' end @@ -41,6 +38,14 @@ module Admin private + def after_create_redirect_path + if params[:create_and_resolve] + admin_reports_path + else + admin_report_path(@report) + end + end + def resource_params params.require(:report_note).permit( :content, diff --git a/app/controllers/admin/reported_statuses_controller.rb b/app/controllers/admin/reported_statuses_controller.rb deleted file mode 100644 index 3ba9f5df21..0000000000 --- a/app/controllers/admin/reported_statuses_controller.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -module Admin - class ReportedStatusesController < BaseController - before_action :set_report - - def create - authorize :status, :update? - - @form = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button)) - flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save - - redirect_to admin_report_path(@report) - rescue ActionController::ParameterMissing - flash[:alert] = I18n.t('admin.statuses.no_status_selected') - - redirect_to admin_report_path(@report) - end - - private - - def status_params - params.require(:status).permit(:sensitive) - end - - def form_status_batch_params - params.require(:form_status_batch).permit(status_ids: []) - end - - def action_from_button - if params[:nsfw_on] - 'nsfw_on' - elsif params[:nsfw_off] - 'nsfw_off' - elsif params[:delete] - 'delete' - end - end - - def set_report - @report = Report.find(params[:report_id]) - end - end -end diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 7c831b3d4c..00d200d7c8 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -13,8 +13,10 @@ module Admin authorize @report, :show? @report_note = @report.notes.new - @report_notes = (@report.notes.latest + @report.history + @report.target_account.targeted_account_warnings.latest.custom).sort_by(&:created_at) - @form = Form::StatusBatch.new + @report_notes = @report.notes.includes(:account).order(id: :desc) + @action_logs = @report.history.includes(:target) + @form = Admin::StatusBatchAction.new + @statuses = @report.statuses.with_includes end def assign_to_self diff --git a/app/controllers/admin/resets_controller.rb b/app/controllers/admin/resets_controller.rb index db8f61d64c..7962b7a58c 100644 --- a/app/controllers/admin/resets_controller.rb +++ b/app/controllers/admin/resets_controller.rb @@ -6,9 +6,9 @@ module Admin def create authorize @user, :reset_password? - @user.send_reset_password_instructions + @user.reset_password! log_action :reset_password, @user - redirect_to admin_accounts_path + redirect_to admin_account_path(@user.account_id) end end end diff --git a/app/controllers/admin/rules_controller.rb b/app/controllers/admin/rules_controller.rb new file mode 100644 index 0000000000..f3bed3ad8e --- /dev/null +++ b/app/controllers/admin/rules_controller.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +module Admin + class RulesController < BaseController + before_action :set_rule, except: [:index, :create] + + def index + authorize :rule, :index? + + @rules = Rule.ordered + @rule = Rule.new + end + + def create + authorize :rule, :create? + + @rule = Rule.new(resource_params) + + if @rule.save + redirect_to admin_rules_path + else + @rules = Rule.ordered + render :index + end + end + + def edit + authorize @rule, :update? + end + + def update + authorize @rule, :update? + + if @rule.update(resource_params) + redirect_to admin_rules_path + else + render :edit + end + end + + def destroy + authorize @rule, :destroy? + + @rule.discard + + redirect_to admin_rules_path + end + + private + + def set_rule + @rule = Rule.find(params[:id]) + end + + def resource_params + params.require(:rule).permit(:text, :priority) + end + end +end diff --git a/app/controllers/admin/sign_in_token_authentications_controller.rb b/app/controllers/admin/sign_in_token_authentications_controller.rb new file mode 100644 index 0000000000..e620ab2926 --- /dev/null +++ b/app/controllers/admin/sign_in_token_authentications_controller.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Admin + class SignInTokenAuthenticationsController < BaseController + before_action :set_target_user + + def create + authorize @user, :enable_sign_in_token_auth? + @user.update(skip_sign_in_token: false) + log_action :enable_sign_in_token_auth, @user + redirect_to admin_account_path(@user.account_id) + end + + def destroy + authorize @user, :disable_sign_in_token_auth? + @user.update(skip_sign_in_token: true) + log_action :disable_sign_in_token_auth, @user + redirect_to admin_account_path(@user.account_id) + end + + private + + def set_target_user + @user = User.find(params[:user_id]) + end + end +end diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb index d7c192f0d6..8d039b2810 100644 --- a/app/controllers/admin/statuses_controller.rb +++ b/app/controllers/admin/statuses_controller.rb @@ -2,72 +2,57 @@ module Admin class StatusesController < BaseController - helper_method :current_params - before_action :set_account + before_action :set_statuses PER_PAGE = 20 def index authorize :status, :index? - @statuses = @account.statuses.where(visibility: [:public, :unlisted]) - - if params[:media] - account_media_status_ids = @account.media_attachments.attached.reorder(nil).select(:status_id).group(:status_id) - @statuses.merge!(Status.where(id: account_media_status_ids)) - end - - @statuses = @statuses.preload(:media_attachments, :mentions).page(params[:page]).per(PER_PAGE) - @form = Form::StatusBatch.new + @status_batch_action = Admin::StatusBatchAction.new end - def show - authorize :status, :index? - - @statuses = @account.statuses.where(id: params[:id]) - authorize @statuses.first, :show? - - @form = Form::StatusBatch.new - end - - def create - authorize :status, :update? - - @form = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button)) - flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save - - redirect_to admin_account_statuses_path(@account.id, current_params) + def batch + @status_batch_action = Admin::StatusBatchAction.new(admin_status_batch_action_params.merge(current_account: current_account, report_id: params[:report_id], type: action_from_button)) + @status_batch_action.save! rescue ActionController::ParameterMissing flash[:alert] = I18n.t('admin.statuses.no_status_selected') - - redirect_to admin_account_statuses_path(@account.id, current_params) + ensure + redirect_to after_create_redirect_path end private - def form_status_batch_params - params.require(:form_status_batch).permit(:action, status_ids: []) + def admin_status_batch_action_params + params.require(:admin_status_batch_action).permit(status_ids: []) + end + + def after_create_redirect_path + if @status_batch_action.report_id.present? + admin_report_path(@status_batch_action.report_id) + else + admin_account_statuses_path(params[:account_id], current_params) + end end def set_account @account = Account.find(params[:account_id]) end - def current_params - page = (params[:page] || 1).to_i + def set_statuses + @statuses = Admin::StatusFilter.new(@account, filter_params).results.preload(:application, :preloadable_poll, :media_attachments, active_mentions: :account, reblog: [:account, :application, :preloadable_poll, :media_attachments, active_mentions: :account]).page(params[:page]).per(PER_PAGE) + end - { - media: params[:media], - page: page > 1 && page, - }.select { |_, value| value.present? } + def filter_params + params.slice(*Admin::StatusFilter::KEYS).permit(*Admin::StatusFilter::KEYS) end def action_from_button - if params[:nsfw_on] - 'nsfw_on' - elsif params[:nsfw_off] - 'nsfw_off' + if params[:report] + 'report' + elsif params[:remove_from_report] + 'remove_from_report' elsif params[:delete] 'delete' end diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 59df4470e6..749e2f144d 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -2,38 +2,12 @@ module Admin class TagsController < BaseController - before_action :set_tag, except: [:index, :batch, :approve_all, :reject_all] - before_action :set_usage_by_domain, except: [:index, :batch, :approve_all, :reject_all] - before_action :set_counters, except: [:index, :batch, :approve_all, :reject_all] - - def index - authorize :tag, :index? - - @tags = filtered_tags.page(params[:page]) - @form = Form::TagBatch.new - end - - def batch - @form = Form::TagBatch.new(form_tag_batch_params.merge(current_account: current_account, action: action_from_button)) - @form.save - rescue ActionController::ParameterMissing - flash[:alert] = I18n.t('admin.accounts.no_account_selected') - ensure - redirect_to admin_tags_path(filter_params) - end - - def approve_all - Form::TagBatch.new(current_account: current_account, tag_ids: Tag.pending_review.pluck(:id), action: 'approve').save - redirect_to admin_tags_path(filter_params) - end - - def reject_all - Form::TagBatch.new(current_account: current_account, tag_ids: Tag.pending_review.pluck(:id), action: 'reject').save - redirect_to admin_tags_path(filter_params) - end + before_action :set_tag def show authorize @tag, :show? + + @time_period = (6.days.ago.to_date...Time.now.utc.to_date) end def update @@ -52,52 +26,8 @@ module Admin @tag = Tag.find(params[:id]) end - def set_usage_by_domain - @usage_by_domain = @tag.statuses - .with_public_visibility - .excluding_silenced_accounts - .where(Status.arel_table[:id].gteq(Mastodon::Snowflake.id_at(Time.now.utc.beginning_of_day))) - .joins(:account) - .group('accounts.domain') - .reorder('statuses_count desc') - .pluck('accounts.domain, count(*) AS statuses_count') - end - - def set_counters - @accounts_today = @tag.history.first[:accounts] - @accounts_week = Redis.current.pfcount(*current_week_days.map { |day| "activity:tags:#{@tag.id}:#{day}:accounts" }) - end - - def filtered_tags - TagFilter.new(filter_params).results - end - - def filter_params - params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS) - end - def tag_params params.require(:tag).permit(:name, :trendable, :usable, :listable) end - - def current_week_days - now = Time.now.utc.beginning_of_day.to_date - - (Date.commercial(now.cwyear, now.cweek)..now).map do |date| - date.to_time(:utc).beginning_of_day.to_i - end - end - - def form_tag_batch_params - params.require(:form_tag_batch).permit(:action, tag_ids: []) - end - - def action_from_button - if params[:approve] - 'approve' - elsif params[:reject] - 'reject' - end - end end end diff --git a/app/controllers/admin/trends/links/preview_card_providers_controller.rb b/app/controllers/admin/trends/links/preview_card_providers_controller.rb new file mode 100644 index 0000000000..2c26e03f36 --- /dev/null +++ b/app/controllers/admin/trends/links/preview_card_providers_controller.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseController + def index + authorize :preview_card_provider, :index? + + @preview_card_providers = filtered_preview_card_providers.page(params[:page]) + @form = Form::PreviewCardProviderBatch.new + end + + def batch + @form = Form::PreviewCardProviderBatch.new(form_preview_card_provider_batch_params.merge(current_account: current_account, action: action_from_button)) + @form.save + rescue ActionController::ParameterMissing + flash[:alert] = I18n.t('admin.accounts.no_account_selected') + ensure + redirect_to admin_trends_links_preview_card_providers_path(filter_params) + end + + private + + def filtered_preview_card_providers + PreviewCardProviderFilter.new(filter_params).results + end + + def filter_params + params.slice(:page, *PreviewCardProviderFilter::KEYS).permit(:page, *PreviewCardProviderFilter::KEYS) + end + + def form_preview_card_provider_batch_params + params.require(:form_preview_card_provider_batch).permit(:action, preview_card_provider_ids: []) + end + + def action_from_button + if params[:approve] + 'approve' + elsif params[:reject] + 'reject' + end + end +end diff --git a/app/controllers/admin/trends/links_controller.rb b/app/controllers/admin/trends/links_controller.rb new file mode 100644 index 0000000000..619b37deb1 --- /dev/null +++ b/app/controllers/admin/trends/links_controller.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +class Admin::Trends::LinksController < Admin::BaseController + def index + authorize :preview_card, :index? + + @preview_cards = filtered_preview_cards.page(params[:page]) + @form = Form::PreviewCardBatch.new + end + + def batch + @form = Form::PreviewCardBatch.new(form_preview_card_batch_params.merge(current_account: current_account, action: action_from_button)) + @form.save + rescue ActionController::ParameterMissing + flash[:alert] = I18n.t('admin.accounts.no_account_selected') + ensure + redirect_to admin_trends_links_path(filter_params) + end + + private + + def filtered_preview_cards + PreviewCardFilter.new(filter_params.with_defaults(trending: 'all')).results + end + + def filter_params + params.slice(:page, *PreviewCardFilter::KEYS).permit(:page, *PreviewCardFilter::KEYS) + end + + def form_preview_card_batch_params + params.require(:form_preview_card_batch).permit(:action, preview_card_ids: []) + end + + def action_from_button + if params[:approve] + 'approve' + elsif params[:approve_all] + 'approve_all' + elsif params[:reject] + 'reject' + elsif params[:reject_all] + 'reject_all' + end + end +end diff --git a/app/controllers/admin/trends/tags_controller.rb b/app/controllers/admin/trends/tags_controller.rb new file mode 100644 index 0000000000..91ff33d406 --- /dev/null +++ b/app/controllers/admin/trends/tags_controller.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +class Admin::Trends::TagsController < Admin::BaseController + def index + authorize :tag, :index? + + @tags = filtered_tags.page(params[:page]) + @form = Form::TagBatch.new + end + + def batch + @form = Form::TagBatch.new(form_tag_batch_params.merge(current_account: current_account, action: action_from_button)) + @form.save + rescue ActionController::ParameterMissing + flash[:alert] = I18n.t('admin.accounts.no_account_selected') + ensure + redirect_to admin_trends_tags_path(filter_params) + end + + private + + def filtered_tags + TagFilter.new(filter_params).results + end + + def filter_params + params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS) + end + + def form_tag_batch_params + params.require(:form_tag_batch).permit(:action, tag_ids: []) + end + + def action_from_button + if params[:approve] + 'approve' + elsif params[:reject] + 'reject' + end + end +end diff --git a/app/controllers/admin/two_factor_authentications_controller.rb b/app/controllers/admin/two_factor_authentications_controller.rb index 0652c3a7a4..f7fb7eb8fe 100644 --- a/app/controllers/admin/two_factor_authentications_controller.rb +++ b/app/controllers/admin/two_factor_authentications_controller.rb @@ -9,7 +9,7 @@ module Admin @user.disable_two_factor! log_action :disable_2fa, @user UserMailer.two_factor_disabled(@user).deliver_later! - redirect_to admin_accounts_path + redirect_to admin_account_path(@user.account_id) end private diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index 85f4cc7681..b863d86438 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -40,7 +40,12 @@ class Api::BaseController < ApplicationController render json: { error: 'This action is not allowed' }, status: 403 end - rescue_from Mastodon::RaceConditionError, Seahorse::Client::NetworkingError, Stoplight::Error::RedLight do + rescue_from Seahorse::Client::NetworkingError do |e| + Rails.logger.warn "Storage server error: #{e}" + render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503 + end + + rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight do render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503 end diff --git a/app/controllers/api/proofs_controller.rb b/app/controllers/api/proofs_controller.rb deleted file mode 100644 index dd32cd577b..0000000000 --- a/app/controllers/api/proofs_controller.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -class Api::ProofsController < Api::BaseController - include AccountOwnedConcern - - skip_before_action :require_authenticated_user! - - before_action :set_provider - - def index - render json: @account, serializer: @provider.serializer_class - end - - private - - def set_provider - @provider = ProofProvider.find(params[:provider]) || raise(ActiveRecord::RecordNotFound) - end - - def username_param - params[:username] - end -end diff --git a/app/controllers/api/v1/accounts/identity_proofs_controller.rb b/app/controllers/api/v1/accounts/identity_proofs_controller.rb index 4b5f6902c7..48f293f47a 100644 --- a/app/controllers/api/v1/accounts/identity_proofs_controller.rb +++ b/app/controllers/api/v1/accounts/identity_proofs_controller.rb @@ -5,8 +5,7 @@ class Api::V1::Accounts::IdentityProofsController < Api::BaseController before_action :set_account def index - @proofs = @account.suspended? ? [] : @account.identity_proofs.active - render json: @proofs, each_serializer: REST::IdentityProofSerializer + render json: [] end private diff --git a/app/controllers/api/v1/accounts/lookup_controller.rb b/app/controllers/api/v1/accounts/lookup_controller.rb new file mode 100644 index 0000000000..aee6be18a9 --- /dev/null +++ b/app/controllers/api/v1/accounts/lookup_controller.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class Api::V1::Accounts::LookupController < Api::BaseController + before_action -> { authorize_if_got_token! :read, :'read:accounts' } + before_action :set_account + + def show + render json: @account, serializer: REST::AccountSerializer + end + + private + + def set_account + @account = ResolveAccountService.new.call(params[:acct], skip_webfinger: true) || raise(ActiveRecord::RecordNotFound) + end +end diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index 92ccb80615..2c027ea769 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -46,9 +46,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController end def pinned_scope - return Status.none if @account.blocking?(current_account) - - @account.pinned_statuses + @account.pinned_statuses.permitted_for(@account, current_account) end def no_replies_scope diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 953874e1ab..5c47158e02 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class Api::V1::AccountsController < Api::BaseController - before_action -> { authorize_if_got_token! :read, :'read:accounts' }, except: [:create, :follow, :unfollow, :block, :unblock, :mute, :unmute] - before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, only: [:follow, :unfollow] + before_action -> { authorize_if_got_token! :read, :'read:accounts' }, except: [:create, :follow, :unfollow, :remove_from_followers, :block, :unblock, :mute, :unmute] + before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, only: [:follow, :unfollow, :remove_from_followers] before_action -> { doorkeeper_authorize! :follow, :'write:mutes' }, only: [:mute, :unmute] before_action -> { doorkeeper_authorize! :follow, :'write:blocks' }, only: [:block, :unblock] before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:create] @@ -27,13 +27,15 @@ class Api::V1::AccountsController < Api::BaseController self.response_body = Oj.dump(response.body) self.status = response.status + rescue ActiveRecord::RecordInvalid => e + render json: ValidationErrorFormatter.new(e, :'account.username' => :username, :'invite_request.text' => :reason).as_json, status: :unprocessable_entity end def follow follow = FollowService.new.call(current_user.account, @account, reblogs: params.key?(:reblogs) ? truthy_param?(:reblogs) : nil, notify: params.key?(:notify) ? truthy_param?(:notify) : nil, with_rate_limit: true) options = @account.locked? || current_user.account.silenced? ? {} : { following_map: { @account.id => { reblogs: follow.show_reblogs?, notify: follow.notify? } }, requested_map: { @account.id => false } } - render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships(options) + render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships(**options) end def block @@ -51,6 +53,11 @@ class Api::V1::AccountsController < Api::BaseController render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships end + def remove_from_followers + RemoveFromFollowersService.new.call(current_user.account, @account) + render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships + end + def unblock UnblockService.new.call(current_user.account, @account) render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships @@ -68,7 +75,7 @@ class Api::V1::AccountsController < Api::BaseController end def relationships(**options) - AccountRelationshipsPresenter.new([@account.id], current_user.account_id, options) + AccountRelationshipsPresenter.new([@account.id], current_user.account_id, **options) end def account_params @@ -76,10 +83,14 @@ class Api::V1::AccountsController < Api::BaseController end def check_enabled_registrations - forbidden if single_user_mode? || !allowed_registrations? + forbidden if single_user_mode? || omniauth_only? || !allowed_registrations? end def allowed_registrations? Setting.registrations_mode != 'none' end + + def omniauth_only? + ENV['OMNIAUTH_ONLY'] == 'true' + end end diff --git a/app/controllers/api/v1/admin/account_actions_controller.rb b/app/controllers/api/v1/admin/account_actions_controller.rb index 29c9b7107b..15af50822e 100644 --- a/app/controllers/api/v1/admin/account_actions_controller.rb +++ b/app/controllers/api/v1/admin/account_actions_controller.rb @@ -1,7 +1,9 @@ # frozen_string_literal: true class Api::V1::Admin::AccountActionsController < Api::BaseController - before_action -> { doorkeeper_authorize! :'admin:write', :'admin:write:accounts' } + protect_from_forgery with: :exception + + before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:accounts' } before_action :require_staff! before_action :set_account diff --git a/app/controllers/api/v1/admin/accounts_controller.rb b/app/controllers/api/v1/admin/accounts_controller.rb index 63cc521ed0..65330b8c81 100644 --- a/app/controllers/api/v1/admin/accounts_controller.rb +++ b/app/controllers/api/v1/admin/accounts_controller.rb @@ -1,13 +1,15 @@ # frozen_string_literal: true class Api::V1::Admin::AccountsController < Api::BaseController + protect_from_forgery with: :exception + include Authorization include AccountableConcern LIMIT = 100 - before_action -> { doorkeeper_authorize! :'admin:read', :'admin:read:accounts' }, only: [:index, :show] - before_action -> { doorkeeper_authorize! :'admin:write', :'admin:write:accounts' }, except: [:index, :show] + before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:accounts' }, only: [:index, :show] + before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:accounts' }, except: [:index, :show] before_action :require_staff! before_action :set_accounts, only: :index before_action :set_account, except: :index @@ -94,7 +96,7 @@ class Api::V1::Admin::AccountsController < Api::BaseController private def set_accounts - @accounts = filtered_accounts.order(id: :desc).includes(user: [:invite_request, :invite]).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) + @accounts = filtered_accounts.order(id: :desc).includes(user: [:invite_request, :invite, :ips]).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) end def set_account diff --git a/app/controllers/api/v1/admin/dimensions_controller.rb b/app/controllers/api/v1/admin/dimensions_controller.rb new file mode 100644 index 0000000000..b1f7389901 --- /dev/null +++ b/app/controllers/api/v1/admin/dimensions_controller.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class Api::V1::Admin::DimensionsController < Api::BaseController + protect_from_forgery with: :exception + + before_action -> { authorize_if_got_token! :'admin:read' } + before_action :require_staff! + before_action :set_dimensions + + def create + render json: @dimensions, each_serializer: REST::Admin::DimensionSerializer + end + + private + + def set_dimensions + @dimensions = Admin::Metrics::Dimension.retrieve( + params[:keys], + params[:start_at], + params[:end_at], + params[:limit], + params + ) + end +end diff --git a/app/controllers/api/v1/admin/measures_controller.rb b/app/controllers/api/v1/admin/measures_controller.rb new file mode 100644 index 0000000000..d64c3cdf70 --- /dev/null +++ b/app/controllers/api/v1/admin/measures_controller.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class Api::V1::Admin::MeasuresController < Api::BaseController + protect_from_forgery with: :exception + + before_action -> { authorize_if_got_token! :'admin:read' } + before_action :require_staff! + before_action :set_measures + + def create + render json: @measures, each_serializer: REST::Admin::MeasureSerializer + end + + private + + def set_measures + @measures = Admin::Metrics::Measure.retrieve( + params[:keys], + params[:start_at], + params[:end_at], + params + ) + end +end diff --git a/app/controllers/api/v1/admin/reports_controller.rb b/app/controllers/api/v1/admin/reports_controller.rb index c8f4cd8d80..fbfd0ee128 100644 --- a/app/controllers/api/v1/admin/reports_controller.rb +++ b/app/controllers/api/v1/admin/reports_controller.rb @@ -1,13 +1,15 @@ # frozen_string_literal: true class Api::V1::Admin::ReportsController < Api::BaseController + protect_from_forgery with: :exception + include Authorization include AccountableConcern LIMIT = 100 - before_action -> { doorkeeper_authorize! :'admin:read', :'admin:read:reports' }, only: [:index, :show] - before_action -> { doorkeeper_authorize! :'admin:write', :'admin:write:reports' }, except: [:index, :show] + before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:reports' }, only: [:index, :show] + before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:reports' }, except: [:index, :show] before_action :require_staff! before_action :set_reports, only: :index before_action :set_report, except: :index @@ -32,6 +34,12 @@ class Api::V1::Admin::ReportsController < Api::BaseController render json: @report, serializer: REST::Admin::ReportSerializer end + def update + authorize @report, :update? + @report.update!(report_params) + render json: @report, serializer: REST::Admin::ReportSerializer + end + def assign_to_self authorize @report, :update? @report.update!(assigned_account_id: current_account.id) @@ -74,6 +82,10 @@ class Api::V1::Admin::ReportsController < Api::BaseController ReportFilter.new(filter_params).results end + def report_params + params.permit(:category, rule_ids: []) + end + def filter_params params.permit(*FILTER_PARAMS) end diff --git a/app/controllers/api/v1/admin/retention_controller.rb b/app/controllers/api/v1/admin/retention_controller.rb new file mode 100644 index 0000000000..4af5a5c4dc --- /dev/null +++ b/app/controllers/api/v1/admin/retention_controller.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +class Api::V1::Admin::RetentionController < Api::BaseController + protect_from_forgery with: :exception + + before_action -> { authorize_if_got_token! :'admin:read' } + before_action :require_staff! + before_action :set_cohorts + + def create + render json: @cohorts, each_serializer: REST::Admin::CohortSerializer + end + + private + + def set_cohorts + @cohorts = Admin::Metrics::Retention.new( + params[:start_at], + params[:end_at], + params[:frequency] + ).cohorts + end +end diff --git a/app/controllers/api/v1/admin/trends/tags_controller.rb b/app/controllers/api/v1/admin/trends/tags_controller.rb new file mode 100644 index 0000000000..4815af31ea --- /dev/null +++ b/app/controllers/api/v1/admin/trends/tags_controller.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class Api::V1::Admin::Trends::TagsController < Api::BaseController + protect_from_forgery with: :exception + + before_action -> { authorize_if_got_token! :'admin:read' } + before_action :require_staff! + before_action :set_tags + + def index + render json: @tags, each_serializer: REST::Admin::TagSerializer + end + + private + + def set_tags + @tags = Trends.tags.get(false, limit_param(10)) + end +end diff --git a/app/controllers/api/v1/emails/confirmations_controller.rb b/app/controllers/api/v1/emails/confirmations_controller.rb new file mode 100644 index 0000000000..f1d9954d09 --- /dev/null +++ b/app/controllers/api/v1/emails/confirmations_controller.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class Api::V1::Emails::ConfirmationsController < Api::BaseController + before_action :doorkeeper_authorize! + before_action :require_user_owned_by_application! + before_action :require_user_not_confirmed! + + def create + current_user.update!(email: params[:email]) if params.key?(:email) + current_user.resend_confirmation_instructions + + render_empty + end + + private + + def require_user_owned_by_application! + render json: { error: 'This method is only available to the application the user originally signed-up with' }, status: :forbidden unless current_user && current_user.created_by_application_id == doorkeeper_token.application_id + end + + def require_user_not_confirmed! + render json: { error: 'This method is only available while the e-mail is awaiting confirmation' }, status: :forbidden if current_user.confirmed? || current_user.unconfirmed_email.blank? + end +end diff --git a/app/controllers/api/v1/follow_requests_controller.rb b/app/controllers/api/v1/follow_requests_controller.rb index b34c76f29e..f4b2a74d0a 100644 --- a/app/controllers/api/v1/follow_requests_controller.rb +++ b/app/controllers/api/v1/follow_requests_controller.rb @@ -29,7 +29,7 @@ class Api::V1::FollowRequestsController < Api::BaseController end def relationships(**options) - AccountRelationshipsPresenter.new([params[:id]], current_user.account_id, options) + AccountRelationshipsPresenter.new([params[:id]], current_user.account_id, **options) end def load_accounts diff --git a/app/controllers/api/v1/instances/activity_controller.rb b/app/controllers/api/v1/instances/activity_controller.rb index 4f6b4bcbfa..bad61425a5 100644 --- a/app/controllers/api/v1/instances/activity_controller.rb +++ b/app/controllers/api/v1/instances/activity_controller.rb @@ -14,22 +14,21 @@ class Api::V1::Instances::ActivityController < Api::BaseController private def activity - weeks = [] + statuses_tracker = ActivityTracker.new('activity:statuses:local', :basic) + logins_tracker = ActivityTracker.new('activity:logins', :unique) + registrations_tracker = ActivityTracker.new('activity:accounts:local', :basic) - 12.times do |i| - day = i.weeks.ago.to_date - week_id = day.cweek - week = Date.commercial(day.cwyear, week_id) + (0...12).map do |i| + start_of_week = i.weeks.ago + end_of_week = start_of_week + 6.days - weeks << { - week: week.to_time.to_i.to_s, - statuses: Redis.current.get("activity:statuses:local:#{week_id}") || '0', - logins: Redis.current.pfcount("activity:logins:#{week_id}").to_s, - registrations: Redis.current.get("activity:accounts:local:#{week_id}") || '0', + { + week: start_of_week.to_i.to_s, + statuses: statuses_tracker.sum(start_of_week, end_of_week).to_s, + logins: logins_tracker.sum(start_of_week, end_of_week).to_s, + registrations: registrations_tracker.sum(start_of_week, end_of_week).to_s, } end - - weeks end def require_enabled_api! diff --git a/app/controllers/api/v1/instances/rules_controller.rb b/app/controllers/api/v1/instances/rules_controller.rb new file mode 100644 index 0000000000..93cf3c7594 --- /dev/null +++ b/app/controllers/api/v1/instances/rules_controller.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class Api::V1::Instances::RulesController < Api::BaseController + skip_before_action :require_authenticated_user!, unless: :whitelist_mode? + + before_action :set_rules + + def index + render json: @rules, each_serializer: REST::RuleSerializer + end + + private + + def set_rules + @rules = Rule.ordered + end +end diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index fda3482651..eefd28d455 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -40,12 +40,13 @@ class Api::V1::NotificationsController < Api::BaseController private def load_notifications - cache_collection_paginated_by_id( - browserable_account_notifications, - Notification, + notifications = browserable_account_notifications.includes(from_account: :account_stat).to_a_paginated_by_id( limit_param(DEFAULT_NOTIFICATIONS_LIMIT), params_slice(:max_id, :since_id, :min_id) ) + Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses| + cache_collection(target_statuses, Status) + end end def browserable_account_notifications diff --git a/app/controllers/api/v1/push/subscriptions_controller.rb b/app/controllers/api/v1/push/subscriptions_controller.rb index 0918c61e97..47f2e6440c 100644 --- a/app/controllers/api/v1/push/subscriptions_controller.rb +++ b/app/controllers/api/v1/push/subscriptions_controller.rb @@ -3,13 +3,13 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController before_action -> { doorkeeper_authorize! :push } before_action :require_user! - before_action :set_web_push_subscription - before_action :check_web_push_subscription, only: [:show, :update] + before_action :set_push_subscription + before_action :check_push_subscription, only: [:show, :update] def create - @web_subscription&.destroy! + @push_subscription&.destroy! - @web_subscription = ::Web::PushSubscription.create!( + @push_subscription = Web::PushSubscription.create!( endpoint: subscription_params[:endpoint], key_p256dh: subscription_params[:keys][:p256dh], key_auth: subscription_params[:keys][:auth], @@ -18,31 +18,31 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController access_token_id: doorkeeper_token.id ) - render json: @web_subscription, serializer: REST::WebPushSubscriptionSerializer + render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer end def show - render json: @web_subscription, serializer: REST::WebPushSubscriptionSerializer + render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer end def update - @web_subscription.update!(data: data_params) - render json: @web_subscription, serializer: REST::WebPushSubscriptionSerializer + @push_subscription.update!(data: data_params) + render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer end def destroy - @web_subscription&.destroy! + @push_subscription&.destroy! render_empty end private - def set_web_push_subscription - @web_subscription = ::Web::PushSubscription.find_by(access_token_id: doorkeeper_token.id) + def set_push_subscription + @push_subscription = Web::PushSubscription.find_by(access_token_id: doorkeeper_token.id) end - def check_web_push_subscription - not_found if @web_subscription.nil? + def check_push_subscription + not_found if @push_subscription.nil? end def subscription_params @@ -52,6 +52,6 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController def data_params return {} if params[:data].blank? - params.require(:data).permit(alerts: [:follow, :follow_request, :favourite, :reblog, :mention, :poll, :status]) + params.require(:data).permit(:policy, alerts: [:follow, :follow_request, :favourite, :reblog, :mention, :poll, :status]) end end diff --git a/app/controllers/api/v1/statuses/histories_controller.rb b/app/controllers/api/v1/statuses/histories_controller.rb new file mode 100644 index 0000000000..c2c1fac5d5 --- /dev/null +++ b/app/controllers/api/v1/statuses/histories_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class Api::V1::Statuses::HistoriesController < Api::BaseController + include Authorization + + before_action -> { authorize_if_got_token! :read, :'read:statuses' } + before_action :set_status + + def show + render json: @status.edits, each_serializer: REST::StatusEditSerializer + end + + private + + def set_status + @status = Status.find(params[:status_id]) + authorize @status, :show? + rescue Mastodon::NotPermittedError + not_found + end +end diff --git a/app/controllers/api/v1/statuses/sources_controller.rb b/app/controllers/api/v1/statuses/sources_controller.rb new file mode 100644 index 0000000000..4340864513 --- /dev/null +++ b/app/controllers/api/v1/statuses/sources_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class Api::V1::Statuses::SourcesController < Api::BaseController + include Authorization + + before_action -> { doorkeeper_authorize! :read, :'read:statuses' } + before_action :set_status + + def show + render json: @status, serializer: REST::StatusSourceSerializer + end + + private + + def set_status + @status = Status.find(params[:status_id]) + authorize @status, :show? + rescue Mastodon::NotPermittedError + not_found + end +end diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index c8529318ff..b1390ae485 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -57,7 +57,7 @@ class Api::V1::StatusesController < Api::BaseController authorize @status, :destroy? @status.discard - RemovalWorker.perform_async(@status.id, redraft: true) + RemovalWorker.perform_async(@status.id, { 'redraft' => true }) @status.account.statuses_count = @status.account.statuses_count - 1 render json: @status, serializer: REST::StatusSerializer, source_requested: true diff --git a/app/controllers/api/v1/suggestions_controller.rb b/app/controllers/api/v1/suggestions_controller.rb index 52054160df..9737ae5cb6 100644 --- a/app/controllers/api/v1/suggestions_controller.rb +++ b/app/controllers/api/v1/suggestions_controller.rb @@ -5,20 +5,20 @@ class Api::V1::SuggestionsController < Api::BaseController before_action -> { doorkeeper_authorize! :read } before_action :require_user! - before_action :set_accounts def index - render json: @accounts, each_serializer: REST::AccountSerializer + suggestions = suggestions_source.get(current_account, limit: limit_param(DEFAULT_ACCOUNTS_LIMIT)) + render json: suggestions.map(&:account), each_serializer: REST::AccountSerializer end def destroy - PotentialFriendshipTracker.remove(current_account.id, params[:id]) + suggestions_source.remove(current_account, params[:id]) render_empty end private - def set_accounts - @accounts = PotentialFriendshipTracker.get(current_account.id, limit: limit_param(DEFAULT_ACCOUNTS_LIMIT)) + def suggestions_source + AccountSuggestions::PastInteractionsSource.new end end diff --git a/app/controllers/api/v1/trends/links_controller.rb b/app/controllers/api/v1/trends/links_controller.rb new file mode 100644 index 0000000000..1c3ab1e1c2 --- /dev/null +++ b/app/controllers/api/v1/trends/links_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class Api::V1::Trends::LinksController < Api::BaseController + before_action :set_links + + def index + render json: @links, each_serializer: REST::Trends::LinkSerializer + end + + private + + def set_links + @links = begin + if Setting.trends + Trends.links.get(true, limit_param(10)) + else + [] + end + end + end +end diff --git a/app/controllers/api/v1/trends/tags_controller.rb b/app/controllers/api/v1/trends/tags_controller.rb new file mode 100644 index 0000000000..947b53de23 --- /dev/null +++ b/app/controllers/api/v1/trends/tags_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class Api::V1::Trends::TagsController < Api::BaseController + before_action :set_tags + + def index + render json: @tags, each_serializer: REST::TagSerializer + end + + private + + def set_tags + @tags = begin + if Setting.trends + Trends.tags.get(true, limit_param(10)) + else + [] + end + end + end +end diff --git a/app/controllers/api/v1/trends_controller.rb b/app/controllers/api/v1/trends_controller.rb deleted file mode 100644 index c875e90414..0000000000 --- a/app/controllers/api/v1/trends_controller.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::TrendsController < Api::BaseController - before_action :set_tags - - def index - render json: @tags, each_serializer: REST::TagSerializer - end - - private - - def set_tags - @tags = TrendingTags.get(limit_param(10)) - end -end diff --git a/app/controllers/api/v2/suggestions_controller.rb b/app/controllers/api/v2/suggestions_controller.rb new file mode 100644 index 0000000000..35eb276c01 --- /dev/null +++ b/app/controllers/api/v2/suggestions_controller.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class Api::V2::SuggestionsController < Api::BaseController + include Authorization + + before_action -> { doorkeeper_authorize! :read } + before_action :require_user! + before_action :set_suggestions + + def index + render json: @suggestions, each_serializer: REST::SuggestionSerializer + end + + private + + def set_suggestions + @suggestions = AccountSuggestions.get(current_account, limit_param(DEFAULT_ACCOUNTS_LIMIT)) + end +end diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb index 1dce3e70f2..bed57fc54c 100644 --- a/app/controllers/api/web/push_subscriptions_controller.rb +++ b/app/controllers/api/web/push_subscriptions_controller.rb @@ -2,6 +2,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController before_action :require_user! + before_action :set_push_subscription, only: :update def create active_session = current_session @@ -15,9 +16,11 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController alerts_enabled = active_session.detection.device.mobile? || active_session.detection.device.tablet? data = { + policy: 'all', + alerts: { follow: alerts_enabled, - follow_request: false, + follow_request: alerts_enabled, favourite: alerts_enabled, reblog: alerts_enabled, mention: alerts_enabled, @@ -28,7 +31,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController data.deep_merge!(data_params) if params[:data] - web_subscription = ::Web::PushSubscription.create!( + push_subscription = ::Web::PushSubscription.create!( endpoint: subscription_params[:endpoint], key_p256dh: subscription_params[:keys][:p256dh], key_auth: subscription_params[:keys][:auth], @@ -37,27 +40,27 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController access_token_id: active_session.access_token_id ) - active_session.update!(web_push_subscription: web_subscription) + active_session.update!(web_push_subscription: push_subscription) - render json: web_subscription, serializer: REST::WebPushSubscriptionSerializer + render json: push_subscription, serializer: REST::WebPushSubscriptionSerializer end def update - params.require([:id]) - - web_subscription = ::Web::PushSubscription.find(params[:id]) - web_subscription.update!(data: data_params) - - render json: web_subscription, serializer: REST::WebPushSubscriptionSerializer + @push_subscription.update!(data: data_params) + render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer end private + def set_push_subscription + @push_subscription = ::Web::PushSubscription.find(params[:id]) + end + def subscription_params @subscription_params ||= params.require(:subscription).permit(:endpoint, keys: [:auth, :p256dh]) end def data_params - @data_params ||= params.require(:data).permit(alerts: [:follow, :follow_request, :favourite, :reblog, :mention, :poll, :status]) + @data_params ||= params.require(:data).permit(:policy, alerts: [:follow, :follow_request, :favourite, :reblog, :mention, :poll, :status]) end end diff --git a/app/controllers/api/web/settings_controller.rb b/app/controllers/api/web/settings_controller.rb index 3d65e46ed9..601e25e6ee 100644 --- a/app/controllers/api/web/settings_controller.rb +++ b/app/controllers/api/web/settings_controller.rb @@ -2,17 +2,16 @@ class Api::Web::SettingsController < Api::Web::BaseController before_action :require_user! + before_action :set_setting def update - setting.data = params[:data] - setting.save! - + @setting.update!(data: params[:data]) render_empty end private - def setting - @_setting ||= ::Web::Setting.where(user: current_user).first_or_initialize(user: current_user) + def set_setting + @setting = ::Web::Setting.where(user: current_user).first_or_initialize(user: current_user) end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 41fe9d88a4..08cca0734f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,13 +5,12 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - force_ssl if: :https_enabled? - include Localized include UserTrackingConcern include SessionTrackingConcern include CacheConcern include DomainControlHelper + include ThemingConcern helper_method :current_account helper_method :current_session @@ -21,17 +20,21 @@ class ApplicationController < ActionController::Base helper_method :use_seamless_external_login? helper_method :whitelist_mode? - rescue_from ActionController::RoutingError, with: :not_found - rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity - rescue_from ActionController::UnknownFormat, with: :not_acceptable - rescue_from ActionController::ParameterMissing, with: :bad_request - rescue_from Paperclip::AdapterRegistry::NoHandlerError, with: :bad_request - rescue_from ActiveRecord::RecordNotFound, with: :not_found + rescue_from ActionController::ParameterMissing, Paperclip::AdapterRegistry::NoHandlerError, with: :bad_request rescue_from Mastodon::NotPermittedError, with: :forbidden - rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error - rescue_from Mastodon::RaceConditionError, Seahorse::Client::NetworkingError, Stoplight::Error::RedLight, with: :service_unavailable + rescue_from ActionController::RoutingError, ActiveRecord::RecordNotFound, with: :not_found + rescue_from ActionController::UnknownFormat, with: :not_acceptable + rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests + rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error + rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight, ActiveRecord::SerializationFailure, with: :service_unavailable + + rescue_from Seahorse::Client::NetworkingError do |e| + Rails.logger.warn "Storage server error: #{e}" + service_unavailable + end + before_action :store_current_location, except: :raise_not_found, unless: :devise_controller? before_action :require_functional!, if: :user_signed_in? @@ -43,10 +46,6 @@ class ApplicationController < ActionController::Base private - def https_enabled? - Rails.env.production? && !request.path.start_with?('/health') - end - def authorized_fetch_mode? ENV['AUTHORIZED_FETCH'] == 'true' || Rails.configuration.x.whitelist_mode end @@ -75,75 +74,6 @@ class ApplicationController < ActionController::Base new_user_session_path end - def pack(data, pack_name, skin = 'default') - return nil unless pack?(data, pack_name) - pack_data = { - common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin), - flavour: data['name'], - pack: pack_name, - preload: nil, - skin: nil, - supported_locales: data['locales'], - } - if data['pack'][pack_name].is_a?(Hash) - pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false - pack_data[:pack] = nil unless data['pack'][pack_name]['filename'] - if data['pack'][pack_name]['preload'] - pack_data[:preload] = [data['pack'][pack_name]['preload']] if data['pack'][pack_name]['preload'].is_a?(String) - pack_data[:preload] = data['pack'][pack_name]['preload'] if data['pack'][pack_name]['preload'].is_a?(Array) - end - if skin != 'default' && data['skin'][skin] - pack_data[:skin] = skin if data['skin'][skin].include?(pack_name) - else # default skin - pack_data[:skin] = 'default' if data['pack'][pack_name]['stylesheet'] - end - end - pack_data - end - - def pack?(data, pack_name) - if data['pack'].is_a?(Hash) && data['pack'].key?(pack_name) - return true if data['pack'][pack_name].is_a?(String) || data['pack'][pack_name].is_a?(Hash) - end - false - end - - def nil_pack(data, pack_name, skin = 'default') - { - common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin), - flavour: data['name'], - pack: nil, - preload: nil, - skin: nil, - supported_locales: data['locales'], - } - end - - def resolve_pack(data, pack_name, skin = 'default') - result = pack(data, pack_name, skin) - unless result - if data['name'] && data.key?('fallback') - if data['fallback'].nil? - return nil_pack(data, pack_name, skin) - elsif data['fallback'].is_a?(String) && Themes.instance.flavour(data['fallback']) - return resolve_pack(Themes.instance.flavour(data['fallback']), pack_name) - elsif data['fallback'].is_a?(Array) - data['fallback'].each do |fallback| - return resolve_pack(Themes.instance.flavour(fallback), pack_name) if Themes.instance.flavour(fallback) - end - end - return nil_pack(data, pack_name, skin) - end - return data.key?('name') && data['name'] != Setting.default_settings['flavour'] ? resolve_pack(Themes.instance.flavour(Setting.default_settings['flavour']), pack_name) : nil_pack(data, pack_name, skin) - end - result - end - - def use_pack(pack_name) - @core = resolve_pack(Themes.instance.core, pack_name) - @theme = resolve_pack(Themes.instance.flavour(current_flavour), pack_name, current_skin) - end - protected def truthy_param?(key) diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index 4e89446c7c..17ad56fa87 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -1,12 +1,18 @@ # frozen_string_literal: true class Auth::ConfirmationsController < Devise::ConfirmationsController + include CaptchaConcern + layout 'auth' before_action :set_body_classes before_action :set_pack + before_action :set_confirmation_user!, only: [:show, :confirm_captcha] before_action :require_unconfirmed! + before_action :extend_csp_for_captcha!, only: [:show, :confirm_captcha] + before_action :require_captcha_if_needed!, only: [:show] + skip_before_action :require_functional! def new @@ -15,14 +21,54 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController resource.email = current_user.unconfirmed_email || current_user.email if user_signed_in? end + def show + old_session_values = session.to_hash + reset_session + session.update old_session_values.except('session_id') + + super + end + + def confirm_captcha + check_captcha! do |message| + flash.now[:alert] = message + render :captcha + return + end + + show + end + private + def require_captcha_if_needed! + render :captcha if captcha_required? + end + + def set_confirmation_user! + # We need to reimplement looking up the user because + # Devise::ConfirmationsController#show looks up and confirms in one + # step. + confirmation_token = params[:confirmation_token] + return if confirmation_token.nil? + @confirmation_user = User.find_first_by_auth_conditions(confirmation_token: confirmation_token) + end + + def captcha_user_bypass? + return true if @confirmation_user.nil? || @confirmation_user.confirmed? + + invite = Invite.find(@confirmation_user.invite_id) if @confirmation_user.invite_id.present? + invite.present? && !invite.max_uses.nil? + end + def set_pack use_pack 'auth' end def require_unconfirmed! - redirect_to edit_user_registration_path if user_signed_in? && current_user.confirmed? && current_user.unconfirmed_email.blank? + if user_signed_in? && current_user.confirmed? && current_user.unconfirmed_email.blank? + redirect_to(current_user.approved? ? root_path : edit_user_registration_path) + end end def set_body_classes diff --git a/app/controllers/auth/omniauth_callbacks_controller.rb b/app/controllers/auth/omniauth_callbacks_controller.rb index 682c77016f..991a50b034 100644 --- a/app/controllers/auth/omniauth_callbacks_controller.rb +++ b/app/controllers/auth/omniauth_callbacks_controller.rb @@ -10,6 +10,15 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController @user = User.find_for_oauth(request.env['omniauth.auth'], current_user) if @user.persisted? + LoginActivity.create( + user: @user, + success: true, + authentication_method: :omniauth, + provider: provider, + ip: request.remote_ip, + user_agent: request.user_agent + ) + sign_in_and_redirect @user, event: :authentication set_flash_message(:notice, :success, kind: provider_id.capitalize) if is_navigational_format? else diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb index 42534f8ce6..609220eb18 100644 --- a/app/controllers/auth/passwords_controller.rb +++ b/app/controllers/auth/passwords_controller.rb @@ -11,7 +11,6 @@ class Auth::PasswordsController < Devise::PasswordsController super do |resource| if resource.errors.empty? resource.session_activations.destroy_all - resource.forget_me! end end end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index 6429bd9690..6b1f3fa822 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class Auth::RegistrationsController < Devise::RegistrationsController - include Devise::Controllers::Rememberable include RegistrationSpamConcern layout :determine_layout @@ -31,8 +30,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController super do |resource| if resource.saved_change_to_encrypted_password? resource.clear_other_sessions(current_session.session_id) - resource.forget_me! - remember_me(resource) end end end @@ -85,13 +82,17 @@ class Auth::RegistrationsController < Devise::RegistrationsController end def check_enabled_registrations - redirect_to root_path if single_user_mode? || !allowed_registrations? + redirect_to root_path if single_user_mode? || omniauth_only? || !allowed_registrations? end def allowed_registrations? Setting.registrations_mode != 'none' || @invite&.valid_for_use? end + def omniauth_only? + ENV['OMNIAUTH_ONLY'] == 'true' + end + def invite_code if params[:user] params[:user][:invite_code] diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 548832b21b..8607077f71 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Auth::SessionsController < Devise::SessionsController - include Devise::Controllers::Rememberable - layout 'auth' skip_before_action :require_no_authentication, only: [:create] @@ -17,19 +15,13 @@ class Auth::SessionsController < Devise::SessionsController before_action :set_instance_presenter, only: [:new] before_action :set_body_classes - def new - Devise.omniauth_configs.each do |provider, config| - return redirect_to(omniauth_authorize_path(resource_name, provider)) if config.strategy.redirect_at_sign_in - end - - super - end - def create super do |resource| - resource.update_sign_in!(request, new_sign_in: true) - remember_me(resource) - flash.delete(:notice) + # We only need to call this if this hasn't already been + # called from one of the two-factor or sign-in token + # authentication methods + + on_authentication_success(resource, :password) unless @on_authentication_success_called end end @@ -42,11 +34,12 @@ class Auth::SessionsController < Devise::SessionsController end def webauthn_options - user = find_user + user = User.find_by(id: session[:attempt_user_id]) - if user.webauthn_enabled? + if user&.webauthn_enabled? options_for_get = WebAuthn::Credential.options_for_get( - allow: user.webauthn_credentials.pluck(:external_id) + allow: user.webauthn_credentials.pluck(:external_id), + user_verification: 'discouraged' ) session[:webauthn_challenge] = options_for_get.challenge @@ -60,16 +53,20 @@ class Auth::SessionsController < Devise::SessionsController protected def find_user - if session[:attempt_user_id] + if user_params[:email].present? + find_user_from_params + elsif session[:attempt_user_id] User.find_by(id: session[:attempt_user_id]) - else - user = User.authenticate_with_ldap(user_params) if Devise.ldap_authentication - user ||= User.authenticate_with_pam(user_params) if Devise.pam_authentication - user ||= User.find_for_authentication(email: user_params[:email]) - user end end + def find_user_from_params + user = User.authenticate_with_ldap(user_params) if Devise.ldap_authentication + user ||= User.authenticate_with_pam(user_params) if Devise.pam_authentication + user ||= User.find_for_authentication(email: user_params[:email]) + user + end + def user_params params.require(:user).permit(:email, :password, :otp_attempt, :sign_in_token_attempt, credential: {}) end @@ -84,14 +81,6 @@ class Auth::SessionsController < Devise::SessionsController end end - def after_sign_out_path_for(_resource_or_scope) - Devise.omniauth_configs.each_value do |config| - return root_path if config.strategy.redirect_at_sign_in - end - - super - end - def require_no_authentication super @@ -142,4 +131,33 @@ class Auth::SessionsController < Devise::SessionsController session.delete(:attempt_user_id) session.delete(:attempt_user_updated_at) end + + def on_authentication_success(user, security_measure) + @on_authentication_success_called = true + + clear_attempt_from_session + + user.update_sign_in!(new_sign_in: true) + sign_in(user) + flash.delete(:notice) + + LoginActivity.create( + user: user, + success: true, + authentication_method: security_measure, + ip: request.remote_ip, + user_agent: request.user_agent + ) + end + + def on_authentication_failure(user, security_measure, failure_reason) + LoginActivity.create( + user: user, + success: false, + authentication_method: security_measure, + failure_reason: failure_reason, + ip: request.remote_ip, + user_agent: request.user_agent + ) + end end diff --git a/app/controllers/concerns/account_owned_concern.rb b/app/controllers/concerns/account_owned_concern.rb index 62e379846a..25149d03fb 100644 --- a/app/controllers/concerns/account_owned_concern.rb +++ b/app/controllers/concerns/account_owned_concern.rb @@ -8,6 +8,7 @@ module AccountOwnedConcern before_action :set_account, if: :account_required? before_action :check_account_approval, if: :account_required? before_action :check_account_suspension, if: :account_required? + before_action :check_account_confirmation, if: :account_required? end private @@ -28,6 +29,10 @@ module AccountOwnedConcern not_found if @account.local? && @account.user_pending? end + def check_account_confirmation + not_found if @account.local? && !@account.user_confirmed? + end + def check_account_suspension if @account.suspended_permanently? permanent_suspension_response diff --git a/app/controllers/concerns/accountable_concern.rb b/app/controllers/concerns/accountable_concern.rb index 3cdcffc51c..87d62478da 100644 --- a/app/controllers/concerns/accountable_concern.rb +++ b/app/controllers/concerns/accountable_concern.rb @@ -3,7 +3,7 @@ module AccountableConcern extend ActiveSupport::Concern - def log_action(action, target) - Admin::ActionLog.create(account: current_account, action: action, target: target) + def log_action(action, target, options = {}) + Admin::ActionLog.create(account: current_account, action: action, target: target, recorded_changes: options.stringify_keys) end end diff --git a/app/controllers/concerns/cache_concern.rb b/app/controllers/concerns/cache_concern.rb index 3fb4b962a3..05e431b19a 100644 --- a/app/controllers/concerns/cache_concern.rb +++ b/app/controllers/concerns/cache_concern.rb @@ -31,7 +31,9 @@ module CacheConcern def cache_collection(raw, klass) return raw unless klass.respond_to?(:with_includes) - raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation) + raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation) + return [] if raw.empty? + cached_keys_with_value = Rails.cache.read_multi(*raw).transform_keys(&:id) uncached_ids = raw.map(&:id) - cached_keys_with_value.keys diff --git a/app/controllers/concerns/captcha_concern.rb b/app/controllers/concerns/captcha_concern.rb new file mode 100644 index 0000000000..538c1ffb14 --- /dev/null +++ b/app/controllers/concerns/captcha_concern.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +module CaptchaConcern + extend ActiveSupport::Concern + include Hcaptcha::Adapters::ViewMethods + + included do + helper_method :render_captcha + end + + def captcha_available? + ENV['HCAPTCHA_SECRET_KEY'].present? && ENV['HCAPTCHA_SITE_KEY'].present? + end + + def captcha_enabled? + captcha_available? && Setting.captcha_enabled + end + + def captcha_user_bypass? + false + end + + def captcha_required? + captcha_enabled? && !captcha_user_bypass? + end + + def check_captcha! + return true unless captcha_required? + + if verify_hcaptcha + true + else + if block_given? + message = flash[:hcaptcha_error] + flash.delete(:hcaptcha_error) + yield message + end + false + end + end + + def extend_csp_for_captcha! + policy = request.content_security_policy + return unless captcha_required? && policy.present? + + %w(script_src frame_src style_src connect_src).each do |directive| + values = policy.send(directive) + values << 'https://hcaptcha.com' unless values.include?('https://hcaptcha.com') || values.include?('https:') + values << 'https://*.hcaptcha.com' unless values.include?('https://*.hcaptcha.com') || values.include?('https:') + policy.send(directive, *values) + end + end + + def render_captcha + return unless captcha_required? + + hcaptcha_tags + end +end diff --git a/app/controllers/concerns/sign_in_token_authentication_concern.rb b/app/controllers/concerns/sign_in_token_authentication_concern.rb index 51ebcb1152..4eb3d7181c 100644 --- a/app/controllers/concerns/sign_in_token_authentication_concern.rb +++ b/app/controllers/concerns/sign_in_token_authentication_concern.rb @@ -16,23 +16,26 @@ module SignInTokenAuthenticationConcern end def authenticate_with_sign_in_token - user = self.resource = find_user + if user_params[:email].present? + user = self.resource = find_user_from_params + prompt_for_sign_in_token(user) if user&.external_or_valid_password?(user_params[:password]) + elsif session[:attempt_user_id] + user = self.resource = User.find_by(id: session[:attempt_user_id]) + return if user.nil? - if user.present? && session[:attempt_user_id].present? && session[:attempt_user_updated_at] != user.updated_at.to_s - restart_session - elsif user_params.key?(:sign_in_token_attempt) && session[:attempt_user_id] - authenticate_with_sign_in_token_attempt(user) - elsif user.present? && user.external_or_valid_password?(user_params[:password]) - prompt_for_sign_in_token(user) + if session[:attempt_user_updated_at] != user.updated_at.to_s + restart_session + elsif user_params.key?(:sign_in_token_attempt) + authenticate_with_sign_in_token_attempt(user) + end end end def authenticate_with_sign_in_token_attempt(user) if valid_sign_in_token_attempt?(user) - clear_attempt_from_session - remember_me(user) - sign_in(user) + on_authentication_success(user, :sign_in_token) else + on_authentication_failure(user, :sign_in_token, :invalid_sign_in_token) flash.now[:alert] = I18n.t('users.invalid_sign_in_token') prompt_for_sign_in_token(user) end diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index fc3978fbbd..4dd0cac55d 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -133,6 +133,7 @@ module SignatureVerification def verify_body_digest! return unless signed_headers.include?('digest') + raise SignatureVerificationError, 'Digest header missing' unless request.headers.key?('Digest') digests = request.headers['Digest'].split(',').map { |digest| digest.split('=', 2) }.map { |key, value| [key.downcase, value] } sha256 = digests.assoc('sha-256') diff --git a/app/controllers/concerns/theming_concern.rb b/app/controllers/concerns/theming_concern.rb new file mode 100644 index 0000000000..1ee3256c04 --- /dev/null +++ b/app/controllers/concerns/theming_concern.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +module ThemingConcern + extend ActiveSupport::Concern + + def use_pack(pack_name) + @core = resolve_pack_with_common(Themes.instance.core, pack_name) + @theme = resolve_pack_with_common(Themes.instance.flavour(current_flavour), pack_name, current_skin) + end + + private + + def valid_pack_data?(data, pack_name) + data['pack'].is_a?(Hash) && [String, Hash].any? { |c| data['pack'][pack_name].is_a?(c) } + end + + def nil_pack(data) + { + use_common: true, + flavour: data['name'], + pack: nil, + preload: nil, + skin: nil, + supported_locales: data['locales'], + } + end + + def pack(data, pack_name, skin) + pack_data = { + use_common: true, + flavour: data['name'], + pack: pack_name, + preload: nil, + skin: nil, + supported_locales: data['locales'], + } + + return pack_data unless data['pack'][pack_name].is_a?(Hash) + + pack_data[:use_common] = false if data['pack'][pack_name]['use_common'] == false + pack_data[:pack] = nil unless data['pack'][pack_name]['filename'] + + preloads = data['pack'][pack_name]['preload'] + pack_data[:preload] = [preloads] if preloads.is_a?(String) + pack_data[:preload] = preloads if preloads.is_a?(Array) + + if skin != 'default' && data['skin'][skin] + pack_data[:skin] = skin if data['skin'][skin].include?(pack_name) + elsif data['pack'][pack_name]['stylesheet'] + pack_data[:skin] = 'default' + end + + pack_data + end + + def resolve_pack(data, pack_name, skin) + return pack(data, pack_name, skin) if valid_pack_data?(data, pack_name) + return if data['name'].blank? + + fallbacks = [] + if data.key?('fallback') + fallbacks = data['fallback'] if data['fallback'].is_a?(Array) + fallbacks = [data['fallback']] if data['fallback'].is_a?(String) + elsif data['name'] != Setting.default_settings['flavour'] + fallbacks = [Setting.default_settings['flavour']] + end + + fallbacks.each do |fallback| + return resolve_pack(Themes.instance.flavour(fallback), pack_name) if Themes.instance.flavour(fallback) + end + + nil + end + + def resolve_pack_with_common(data, pack_name, skin = 'default') + result = resolve_pack(data, pack_name, skin) || nil_pack(data) + result[:common] = resolve_pack(data, 'common', skin) if result.delete(:use_common) + result + end +end diff --git a/app/controllers/concerns/two_factor_authentication_concern.rb b/app/controllers/concerns/two_factor_authentication_concern.rb index 4800db3480..c9477a1d42 100644 --- a/app/controllers/concerns/two_factor_authentication_concern.rb +++ b/app/controllers/concerns/two_factor_authentication_concern.rb @@ -35,16 +35,20 @@ module TwoFactorAuthenticationConcern end def authenticate_with_two_factor - user = self.resource = find_user + if user_params[:email].present? + user = self.resource = find_user_from_params + prompt_for_two_factor(user) if user&.external_or_valid_password?(user_params[:password]) + elsif session[:attempt_user_id] + user = self.resource = User.find_by(id: session[:attempt_user_id]) + return if user.nil? - if user.present? && session[:attempt_user_id].present? && session[:attempt_user_updated_at] != user.updated_at.to_s - restart_session - elsif user.webauthn_enabled? && user_params.key?(:credential) && session[:attempt_user_id] - authenticate_with_two_factor_via_webauthn(user) - elsif user_params.key?(:otp_attempt) && session[:attempt_user_id] - authenticate_with_two_factor_via_otp(user) - elsif user.present? && user.external_or_valid_password?(user_params[:password]) - prompt_for_two_factor(user) + if session[:attempt_user_updated_at] != user.updated_at.to_s + restart_session + elsif user.webauthn_enabled? && user_params.key?(:credential) + authenticate_with_two_factor_via_webauthn(user) + elsif user_params.key?(:otp_attempt) + authenticate_with_two_factor_via_otp(user) + end end end @@ -52,21 +56,19 @@ module TwoFactorAuthenticationConcern webauthn_credential = WebAuthn::Credential.from_get(user_params[:credential]) if valid_webauthn_credential?(user, webauthn_credential) - clear_attempt_from_session - remember_me(user) - sign_in(user) - render json: { redirect_path: root_path }, status: :ok + on_authentication_success(user, :webauthn) + render json: { redirect_path: after_sign_in_path_for(user) }, status: :ok else + on_authentication_failure(user, :webauthn, :invalid_credential) render json: { error: t('webauthn_credentials.invalid_credential') }, status: :unprocessable_entity end end def authenticate_with_two_factor_via_otp(user) if valid_otp_attempt?(user) - clear_attempt_from_session - remember_me(user) - sign_in(user) + on_authentication_success(user, :otp) else + on_authentication_failure(user, :otp, :invalid_otp_token) flash.now[:alert] = I18n.t('users.invalid_otp_token') prompt_for_two_factor(user) end diff --git a/app/controllers/concerns/user_tracking_concern.rb b/app/controllers/concerns/user_tracking_concern.rb index efda37fae7..45f3aab0d0 100644 --- a/app/controllers/concerns/user_tracking_concern.rb +++ b/app/controllers/concerns/user_tracking_concern.rb @@ -3,7 +3,7 @@ module UserTrackingConcern extend ActiveSupport::Concern - UPDATE_SIGN_IN_HOURS = 24 + UPDATE_SIGN_IN_FREQUENCY = 24.hours.freeze included do before_action :update_user_sign_in @@ -12,10 +12,10 @@ module UserTrackingConcern private def update_user_sign_in - current_user.update_sign_in!(request) if user_needs_sign_in_update? + current_user.update_sign_in! if user_needs_sign_in_update? end def user_needs_sign_in_update? - user_signed_in? && (current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < UPDATE_SIGN_IN_HOURS.hours.ago) + user_signed_in? && (current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < UPDATE_SIGN_IN_FREQUENCY.ago) end end diff --git a/app/controllers/custom_css_controller.rb b/app/controllers/custom_css_controller.rb index 0a667a6a66..e1dc5eaf6d 100644 --- a/app/controllers/custom_css_controller.rb +++ b/app/controllers/custom_css_controller.rb @@ -3,11 +3,16 @@ class CustomCssController < ApplicationController skip_before_action :store_current_location skip_before_action :require_functional! + skip_before_action :update_user_sign_in + skip_before_action :set_session_activity + + skip_around_action :set_locale before_action :set_cache_headers def show expires_in 3.minutes, public: true + request.session_options[:skip] = true render plain: Setting.custom_css || '', content_type: 'text/css' end end diff --git a/app/controllers/directories_controller.rb b/app/controllers/directories_controller.rb index 549c6a39e0..2263f286b3 100644 --- a/app/controllers/directories_controller.rb +++ b/app/controllers/directories_controller.rb @@ -6,7 +6,6 @@ class DirectoriesController < ApplicationController before_action :authenticate_user!, if: :whitelist_mode? before_action :require_enabled! before_action :set_instance_presenter - before_action :set_tag, only: :show before_action :set_accounts before_action :set_pack @@ -16,10 +15,6 @@ class DirectoriesController < ApplicationController render :index end - def show - render :index - end - private def set_pack @@ -30,13 +25,8 @@ class DirectoriesController < ApplicationController return not_found unless Setting.profile_directory end - def set_tag - @tag = Tag.discoverable.find_normalized!(params[:id]) - end - def set_accounts @accounts = Account.local.discoverable.by_recent_status.page(params[:page]).per(20).tap do |query| - query.merge!(Account.tagged_with(@tag.id)) if @tag query.merge!(Account.not_excluded_by_account(current_account)) if current_account end end diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb index 18b281325b..d519138cdd 100644 --- a/app/controllers/follower_accounts_controller.rb +++ b/app/controllers/follower_accounts_controller.rb @@ -86,7 +86,7 @@ class FollowerAccountsController < ApplicationController if page_requested? || !@account.user_hides_network? # Return all fields else - %i(id type totalItems) + %i(id type total_items) end end end diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb index eba44d34be..4b4978fb9a 100644 --- a/app/controllers/following_accounts_controller.rb +++ b/app/controllers/following_accounts_controller.rb @@ -86,7 +86,7 @@ class FollowingAccountsController < ApplicationController if page_requested? || !@account.user_hides_network? # Return all fields else - %i(id type totalItems) + %i(id type total_items) end end end diff --git a/app/controllers/health_controller.rb b/app/controllers/health_controller.rb new file mode 100644 index 0000000000..2a22a05570 --- /dev/null +++ b/app/controllers/health_controller.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class HealthController < ActionController::Base + def show + render plain: 'OK' + end +end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index c9b8408817..450f92bd40 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -16,30 +16,7 @@ class HomeController < ApplicationController def redirect_unauthenticated_to_permalinks! return if user_signed_in? - matches = request.path.match(/\A\/web\/(statuses|accounts)\/([\d]+)\z/) - - if matches - case matches[1] - when 'statuses' - status = Status.find_by(id: matches[2]) - - if status&.distributable? - redirect_to(ActivityPub::TagManager.instance.url_for(status)) - return - end - when 'accounts' - account = Account.find_by(id: matches[2]) - - if account - redirect_to(ActivityPub::TagManager.instance.url_for(account)) - return - end - end - end - - matches = request.path.match(%r{\A/web/timelines/tag/(?.+)\z}) - - redirect_to(matches ? tag_path(CGI.unescape(matches[:tag])) : default_redirect_path) + redirect_to(PermalinkRedirector.new(request.path).redirect_path || default_redirect_path) end def set_pack diff --git a/app/controllers/instance_actors_controller.rb b/app/controllers/instance_actors_controller.rb index 4b074ca192..b3b5476e2f 100644 --- a/app/controllers/instance_actors_controller.rb +++ b/app/controllers/instance_actors_controller.rb @@ -13,7 +13,7 @@ class InstanceActorsController < ApplicationController private def set_account - @account = Account.find(-99) + @account = Account.representative end def restrict_fields_to diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb index 772fc42cb4..d2de432ba4 100644 --- a/app/controllers/media_controller.rb +++ b/app/controllers/media_controller.rb @@ -28,7 +28,12 @@ class MediaController < ApplicationController private def set_media_attachment - @media_attachment = MediaAttachment.attached.find_by!(shortcode: params[:id] || params[:medium_id]) + id = params[:id] || params[:medium_id] + return if id.nil? + + scope = MediaAttachment.local.attached + # If id is 19 characters long, it's a shortcode, otherwise it's an identifier + @media_attachment = id.size == 19 ? scope.find_by!(shortcode: id) : scope.find_by!(id: id) end def verify_permitted_status! diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb index 0b1d09de93..5596e92d18 100644 --- a/app/controllers/media_proxy_controller.rb +++ b/app/controllers/media_proxy_controller.rb @@ -37,7 +37,7 @@ class MediaProxyController < ApplicationController end def version - if request.path.ends_with?('/small') + if request.path.end_with?('/small') :small else :original @@ -45,7 +45,7 @@ class MediaProxyController < ApplicationController end def lock_options - { redis: Redis.current, key: "media_download:#{params[:id]}" } + { redis: Redis.current, key: "media_download:#{params[:id]}", autorelease: 15.minutes.seconds } end def reject_media? diff --git a/app/controllers/settings/deletes_controller.rb b/app/controllers/settings/deletes_controller.rb index 7b8f8d2078..e0dd5edcb1 100644 --- a/app/controllers/settings/deletes_controller.rb +++ b/app/controllers/settings/deletes_controller.rb @@ -42,7 +42,7 @@ class Settings::DeletesController < Settings::BaseController end def destroy_account! - current_account.suspend!(origin: :local) + current_account.suspend!(origin: :local, block_email: false) AccountDeletionWorker.perform_async(current_user.account_id) sign_out end diff --git a/app/controllers/settings/identity_proofs_controller.rb b/app/controllers/settings/identity_proofs_controller.rb deleted file mode 100644 index 4618c78836..0000000000 --- a/app/controllers/settings/identity_proofs_controller.rb +++ /dev/null @@ -1,65 +0,0 @@ -# frozen_string_literal: true - -class Settings::IdentityProofsController < Settings::BaseController - before_action :check_required_params, only: :new - before_action :check_enabled, only: :new - - def index - @proofs = AccountIdentityProof.where(account: current_account).order(provider: :asc, provider_username: :asc) - @proofs.each(&:refresh!) - end - - def new - @proof = current_account.identity_proofs.new( - token: params[:token], - provider: params[:provider], - provider_username: params[:provider_username] - ) - - if current_account.username.casecmp(params[:username]).zero? - render layout: 'auth' - else - redirect_to settings_identity_proofs_path, alert: I18n.t('identity_proofs.errors.wrong_user', proving: params[:username], current: current_account.username) - end - end - - def create - @proof = current_account.identity_proofs.where(provider: resource_params[:provider], provider_username: resource_params[:provider_username]).first_or_initialize(resource_params) - @proof.token = resource_params[:token] - - if @proof.save - PostStatusService.new.call(current_user.account, text: post_params[:status_text]) if publish_proof? - redirect_to @proof.on_success_path(params[:user_agent]) - else - redirect_to settings_identity_proofs_path, alert: I18n.t('identity_proofs.errors.failed', provider: @proof.provider.capitalize) - end - end - - def destroy - @proof = current_account.identity_proofs.find(params[:id]) - @proof.destroy! - redirect_to settings_identity_proofs_path, success: I18n.t('identity_proofs.removed') - end - - private - - def check_enabled - not_found unless Setting.enable_keybase - end - - def check_required_params - redirect_to settings_identity_proofs_path unless [:provider, :provider_username, :username, :token].all? { |k| params[k].present? } - end - - def resource_params - params.require(:account_identity_proof).permit(:provider, :provider_username, :token) - end - - def publish_proof? - ActiveModel::Type::Boolean.new.cast(post_params[:post_status]) - end - - def post_params - params.require(:account_identity_proof).permit(:post_status, :status_text) - end -end diff --git a/app/controllers/settings/login_activities_controller.rb b/app/controllers/settings/login_activities_controller.rb new file mode 100644 index 0000000000..ee77524b13 --- /dev/null +++ b/app/controllers/settings/login_activities_controller.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class Settings::LoginActivitiesController < Settings::BaseController + def index + @login_activities = LoginActivity.where(user: current_user).order(id: :desc).page(params[:page]) + end + + private + + def set_pack + use_pack 'settings' + end +end diff --git a/app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb b/app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb index bd6f83134c..7e2d43dcd3 100644 --- a/app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb +++ b/app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb @@ -21,7 +21,8 @@ module Settings display_name: current_user.account.username, id: current_user.webauthn_id, }, - exclude: current_user.webauthn_credentials.pluck(:external_id) + exclude: current_user.webauthn_credentials.pluck(:external_id), + authenticator_selection: { user_verification: 'discouraged' } ) session[:webauthn_challenge] = options_for_create.challenge diff --git a/app/controllers/statuses_cleanup_controller.rb b/app/controllers/statuses_cleanup_controller.rb new file mode 100644 index 0000000000..3d4f4af021 --- /dev/null +++ b/app/controllers/statuses_cleanup_controller.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +class StatusesCleanupController < ApplicationController + layout 'admin' + + before_action :authenticate_user! + before_action :set_policy + before_action :set_body_classes + before_action :set_pack + + def show; end + + def update + if @policy.update(resource_params) + redirect_to statuses_cleanup_path, notice: I18n.t('generic.changes_saved_msg') + else + render action: :show + end + rescue ActionController::ParameterMissing + # Do nothing + end + + private + + def set_pack + use_pack 'settings' + end + + def set_policy + @policy = current_account.statuses_cleanup_policy || current_account.build_statuses_cleanup_policy(enabled: false) + end + + def resource_params + params.require(:account_statuses_cleanup_policy).permit(:enabled, :min_status_age, :keep_direct, :keep_pinned, :keep_polls, :keep_media, :keep_self_fav, :keep_self_bookmark, :min_favs, :min_reblogs) + end + + def set_body_classes + @body_classes = 'admin' + end +end diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index 3290224b4e..3812f541ed 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -16,7 +16,6 @@ class StatusesController < ApplicationController before_action :set_referrer_policy_header, only: :show before_action :set_cache_headers before_action :set_body_classes - before_action :set_autoplay, only: :embed skip_around_action :set_locale, if: -> { request.format == :json } skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode? @@ -85,8 +84,4 @@ class StatusesController < ApplicationController def set_referrer_policy_header response.headers['Referrer-Policy'] = 'origin' unless @status.distributable? end - - def set_autoplay - @autoplay = truthy_param?(:autoplay) - end end diff --git a/app/controllers/well_known/keybase_proof_config_controller.rb b/app/controllers/well_known/keybase_proof_config_controller.rb deleted file mode 100644 index 03232df2d3..0000000000 --- a/app/controllers/well_known/keybase_proof_config_controller.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module WellKnown - class KeybaseProofConfigController < ActionController::Base - before_action :check_enabled - - def show - render json: {}, serializer: ProofProvider::Keybase::ConfigSerializer, root: 'keybase_config' - end - - private - - def check_enabled - head 404 unless Setting.enable_keybase - end - end -end diff --git a/app/controllers/well_known/webfinger_controller.rb b/app/controllers/well_known/webfinger_controller.rb index 0227f722a7..2b296ea3be 100644 --- a/app/controllers/well_known/webfinger_controller.rb +++ b/app/controllers/well_known/webfinger_controller.rb @@ -4,7 +4,6 @@ module WellKnown class WebfingerController < ActionController::Base include RoutingHelper - before_action { response.headers['Vary'] = 'Accept' } before_action :set_account before_action :check_account_suspension @@ -39,10 +38,12 @@ module WellKnown end def bad_request + expires_in(3.minutes, public: true) head 400 end def not_found + expires_in(3.minutes, public: true) head 404 end diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb index e977db2c6d..bb2374c0ef 100644 --- a/app/helpers/accounts_helper.rb +++ b/app/helpers/accounts_helper.rb @@ -84,19 +84,19 @@ module AccountsHelper def account_description(account) prepend_stats = [ [ - number_to_human(account.statuses_count, strip_insignificant_zeros: true), + number_to_human(account.statuses_count, precision: 3, strip_insignificant_zeros: true), I18n.t('accounts.posts', count: account.statuses_count), ].join(' '), [ - number_to_human(account.following_count, strip_insignificant_zeros: true), + number_to_human(account.following_count, precision: 3, strip_insignificant_zeros: true), I18n.t('accounts.following', count: account.following_count), ].join(' '), ] unless hide_followers_count?(account) prepend_stats << [ - number_to_human(account.followers_count, strip_insignificant_zeros: true), + number_to_human(account.followers_count, precision: 3, strip_insignificant_zeros: true), I18n.t('accounts.followers', count: account.followers_count), ].join(' ') end diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb index 0f3ca36e2d..f3aa4be4f2 100644 --- a/app/helpers/admin/action_logs_helper.rb +++ b/app/helpers/admin/action_logs_helper.rb @@ -21,7 +21,7 @@ module Admin::ActionLogsHelper record.shortcode when 'Report' link_to "##{record.id}", admin_report_path(record) - when 'DomainBlock', 'DomainAllow', 'EmailDomainBlock' + when 'DomainBlock', 'DomainAllow', 'EmailDomainBlock', 'UnavailableDomain' link_to record.domain, "https://#{record.domain}" when 'Status' link_to record.account.acct, ActivityPub::TagManager.instance.url_for(record) @@ -31,14 +31,18 @@ module Admin::ActionLogsHelper link_to truncate(record.text), edit_admin_announcement_path(record.id) when 'IpBlock' "#{record.ip}/#{record.ip.prefix} (#{I18n.t("simple_form.labels.ip_block.severities.#{record.severity}")})" + when 'Instance' + record.domain end end def log_target_from_history(type, attributes) case type + when 'User' + attributes['username'] when 'CustomEmoji' attributes['shortcode'] - when 'DomainBlock', 'DomainAllow', 'EmailDomainBlock' + when 'DomainBlock', 'DomainAllow', 'EmailDomainBlock', 'UnavailableDomain' link_to attributes['domain'], "https://#{attributes['domain']}" when 'Status' tmp_status = Status.new(attributes.except('reblogs_count', 'favourites_count')) @@ -52,6 +56,8 @@ module Admin::ActionLogsHelper truncate(attributes['text'].is_a?(Array) ? attributes['text'].last : attributes['text']) when 'IpBlock' "#{attributes['ip']}/#{attributes['ip'].prefix} (#{I18n.t("simple_form.labels.ip_block.severities.#{attributes['severity']}")})" + when 'Instance' + attributes['domain'] end end end diff --git a/app/helpers/admin/dashboard_helper.rb b/app/helpers/admin/dashboard_helper.rb index 4ee2cdef47..c21d413419 100644 --- a/app/helpers/admin/dashboard_helper.rb +++ b/app/helpers/admin/dashboard_helper.rb @@ -1,10 +1,41 @@ # frozen_string_literal: true module Admin::DashboardHelper - def feature_hint(feature, enabled) - indicator = safe_join([enabled ? t('simple_form.yes') : t('simple_form.no'), fa_icon('power-off fw')], ' ') - class_names = enabled ? 'pull-right positive-hint' : 'pull-right neutral-hint' + def relevant_account_ip(account, ip_query) + ips = account.user.present? ? account.user.ips.to_a : [] - safe_join([feature, content_tag(:span, indicator, class: class_names)]) + matched_ip = begin + ip_query_addr = IPAddr.new(ip_query) + ips.find { |ip| ip_query_addr.include?(ip.ip) } || ips.first + rescue IPAddr::Error + ips.first + end + + if matched_ip + link_to matched_ip.ip, admin_accounts_path(ip: matched_ip.ip) + else + '-' + end + end + + def relevant_account_timestamp(account) + timestamp, exact = begin + if account.user_current_sign_in_at && account.user_current_sign_in_at < 24.hours.ago + [account.user_current_sign_in_at, true] + elsif account.user_current_sign_in_at + [account.user_current_sign_in_at, false] + elsif account.user_pending? + [account.user_created_at, true] + elsif account.last_status_at.present? + [account.last_status_at, true] + else + [nil, false] + end + end + + return '-' if timestamp.nil? + return t('generic.today') unless exact + + content_tag(:time, l(timestamp), class: 'time-ago', datetime: timestamp.iso8601, title: l(timestamp)) end end diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb index ba0ca96389..907529b372 100644 --- a/app/helpers/admin/filter_helper.rb +++ b/app/helpers/admin/filter_helper.rb @@ -6,11 +6,14 @@ module Admin::FilterHelper CustomEmojiFilter::KEYS, ReportFilter::KEYS, TagFilter::KEYS, + PreviewCardProviderFilter::KEYS, + PreviewCardFilter::KEYS, InstanceFilter::KEYS, InviteFilter::KEYS, RelationshipFilter::KEYS, AnnouncementFilter::KEYS, Admin::ActionLogFilter::KEYS, + Admin::StatusFilter::KEYS, ].flatten.freeze def filter_link_to(text, link_to_params, link_class_params = link_to_params) diff --git a/app/helpers/admin/settings_helper.rb b/app/helpers/admin/settings_helper.rb index baf14ab257..f99a2b8c8a 100644 --- a/app/helpers/admin/settings_helper.rb +++ b/app/helpers/admin/settings_helper.rb @@ -8,4 +8,8 @@ module Admin::SettingsHelper link = link_to t('admin.site_uploads.delete'), admin_site_upload_path(upload), data: { method: :delete } safe_join([hint, link], '
'.html_safe) end + + def captcha_available? + ENV['HCAPTCHA_SECRET_KEY'].present? && ENV['HCAPTCHA_SITE_KEY'].present? + end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5a9496bd42..8b41033a51 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -14,6 +14,17 @@ module ApplicationHelper ku ).freeze + def friendly_number_to_human(number, **options) + # By default, the number of precision digits used by number_to_human + # is looked up from the locales definition, and rails-i18n comes with + # values that don't seem to make much sense for many languages, so + # override these values with a default of 3 digits of precision. + options[:precision] = 3 + options[:strip_insignificant_zeros] = true + + number_to_human(number, **options) + end + def active_nav_class(*paths) paths.any? { |path| current_page?(path) } ? 'active' : '' end @@ -39,13 +50,39 @@ module ApplicationHelper end def available_sign_up_path - if closed_registrations? + if closed_registrations? || omniauth_only? 'https://joinmastodon.org/#getting-started' else new_user_registration_path end end + def omniauth_only? + ENV['OMNIAUTH_ONLY'] == 'true' + end + + def link_to_login(name = nil, html_options = nil, &block) + target = new_user_session_path + + html_options = name if block_given? + + if omniauth_only? && Devise.mappings[:user].omniauthable? && User.omniauth_providers.size == 1 + target = omniauth_authorize_path(:user, User.omniauth_providers[0]) + html_options ||= {} + html_options[:method] = :post + end + + if block_given? + link_to(target, html_options, &block) + else + link_to(name, target, html_options) + end + end + + def provider_sign_in_link(provider) + link_to I18n.t("auth.providers.#{provider}", default: provider.to_s.chomp('_oauth2').capitalize), omniauth_authorize_path(:user, provider), class: "button button-#{provider}", method: :post + end + def open_deletion? Setting.open_deletion end @@ -126,6 +163,10 @@ module ApplicationHelper end end + def react_admin_component(name, props = {}) + content_tag(:div, nil, data: { 'admin-component': name.to_s.camelcase, props: Oj.dump({ locale: I18n.locale }.merge(props)) }) + end + def body_classes output = (@body_classes || '').split(' ') output << "flavour-#{current_flavour.parameterize}" diff --git a/app/helpers/email_helper.rb b/app/helpers/email_helper.rb new file mode 100644 index 0000000000..360783c628 --- /dev/null +++ b/app/helpers/email_helper.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module EmailHelper + def self.included(base) + base.extend(self) + end + + def email_to_canonical_email(str) + username, domain = str.downcase.split('@', 2) + username, = username.gsub('.', '').split('+', 2) + + "#{username}@#{domain}" + end + + def email_to_canonical_email_hash(str) + Digest::SHA2.new(256).hexdigest(email_to_canonical_email(str)) + end +end diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index 1c473efa3f..c24d2ddf10 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -34,7 +34,13 @@ module JsonLdHelper end def as_array(value) - value.is_a?(Array) ? value : [value] + if value.nil? + [] + elsif value.is_a?(Array) + value + else + [value] + end end def value_or_id(value) @@ -67,7 +73,7 @@ module JsonLdHelper unless id json = fetch_resource_without_id_validation(uri, on_behalf_of) - return unless json + return if !json.is_a?(Hash) || unsupported_uri_scheme?(json['id']) uri = json['id'] end diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb new file mode 100644 index 0000000000..7307242086 --- /dev/null +++ b/app/helpers/languages_helper.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +module LanguagesHelper + HUMAN_LOCALES = { + af: 'Afrikaans', + ar: 'العربية', + ast: 'Asturianu', + bg: 'Български', + bn: 'বাংলা', + br: 'Breton', + ca: 'Català', + co: 'Corsu', + cs: 'Čeština', + cy: 'Cymraeg', + da: 'Dansk', + de: 'Deutsch', + el: 'Ελληνικά', + en: 'English', + eo: 'Esperanto', + 'es-AR': 'Español (Argentina)', + 'es-MX': 'Español (México)', + es: 'Español', + et: 'Eesti', + eu: 'Euskara', + fa: 'فارسی', + fi: 'Suomi', + fr: 'Français', + ga: 'Gaeilge', + gd: 'Gàidhlig', + gl: 'Galego', + he: 'עברית', + hi: 'हिन्दी', + hr: 'Hrvatski', + hu: 'Magyar', + hy: 'Հայերեն', + id: 'Bahasa Indonesia', + io: 'Ido', + is: 'Íslenska', + it: 'Italiano', + ja: '日本語', + ka: 'ქართული', + kab: 'Taqbaylit', + kk: 'Қазақша', + kmr: 'Kurmancî', + kn: 'ಕನ್ನಡ', + ko: '한국어', + ku: 'سۆرانی', + lt: 'Lietuvių', + lv: 'Latviešu', + mk: 'Македонски', + ml: 'മലയാളം', + mr: 'मराठी', + ms: 'Bahasa Melayu', + nl: 'Nederlands', + nn: 'Nynorsk', + no: 'Norsk', + oc: 'Occitan', + pl: 'Polski', + 'pt-BR': 'Português (Brasil)', + 'pt-PT': 'Português (Portugal)', + pt: 'Português', + ro: 'Română', + ru: 'Русский', + sa: 'संस्कृतम्', + sc: 'Sardu', + si: 'සිංහල', + sk: 'Slovenčina', + sl: 'Slovenščina', + sq: 'Shqip', + 'sr-Latn': 'Srpski (latinica)', + sr: 'Српски', + sv: 'Svenska', + ta: 'தமிழ்', + te: 'తెలుగు', + th: 'ไทย', + tr: 'Türkçe', + uk: 'Українська', + ur: 'اُردُو', + vi: 'Tiếng Việt', + zgh: 'ⵜⴰⵎⴰⵣⵉⵖⵜ', + 'zh-CN': '简体中文', + 'zh-HK': '繁體中文(香港)', + 'zh-TW': '繁體中文(臺灣)', + zh: '中文', + }.freeze + + def human_locale(locale) + if locale == 'und' + I18n.t('generic.none') + else + HUMAN_LOCALES[locale.to_sym] || locale + end + end +end diff --git a/app/helpers/mascot_helper.rb b/app/helpers/mascot_helper.rb new file mode 100644 index 0000000000..0124c74f19 --- /dev/null +++ b/app/helpers/mascot_helper.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module MascotHelper + def mascot_url + full_asset_url(instance_presenter.mascot&.file&.url || asset_pack_path('media/images/elephant_ui_plane.svg')) + end + + private + + def instance_presenter + @instance_presenter ||= InstancePresenter.new + end +end diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 5b39497b6b..23739d1cd4 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -1,90 +1,8 @@ # frozen_string_literal: true module SettingsHelper - HUMAN_LOCALES = { - ar: 'العربية', - ast: 'Asturianu', - bg: 'Български', - bn: 'বাংলা', - br: 'Breton', - ca: 'Català', - co: 'Corsu', - cs: 'Čeština', - cy: 'Cymraeg', - da: 'Dansk', - de: 'Deutsch', - el: 'Ελληνικά', - en: 'English', - eo: 'Esperanto', - 'es-AR': 'Español (Argentina)', - es: 'Español', - et: 'Eesti', - eu: 'Euskara', - fa: 'فارسی', - fi: 'Suomi', - fr: 'Français', - ga: 'Gaeilge', - gl: 'Galego', - he: 'עברית', - hi: 'हिन्दी', - hr: 'Hrvatski', - hu: 'Magyar', - hy: 'Հայերեն', - id: 'Bahasa Indonesia', - io: 'Ido', - is: 'Íslenska', - it: 'Italiano', - ja: '日本語', - ka: 'ქართული', - kab: 'Taqbaylit', - kk: 'Қазақша', - kn: 'ಕನ್ನಡ', - ko: '한국어', - ku: 'سۆرانی', - lt: 'Lietuvių', - lv: 'Latviešu', - mk: 'Македонски', - ml: 'മലയാളം', - mr: 'मराठी', - ms: 'Bahasa Melayu', - nl: 'Nederlands', - nn: 'Nynorsk', - no: 'Norsk', - oc: 'Occitan', - pl: 'Polski', - 'pt-BR': 'Português (Brasil)', - 'pt-PT': 'Português (Portugal)', - pt: 'Português', - ro: 'Română', - ru: 'Русский', - sa: 'संस्कृतम्', - sc: 'Sardu', - sk: 'Slovenčina', - sl: 'Slovenščina', - sq: 'Shqip', - 'sr-Latn': 'Srpski (latinica)', - sr: 'Српски', - sv: 'Svenska', - ta: 'தமிழ்', - te: 'తెలుగు', - th: 'ไทย', - tr: 'Türkçe', - uk: 'Українська', - ur: 'اُردُو', - vi: 'Tiếng Việt', - zgh: 'ⵜⴰⵎⴰⵣⵉⵖⵜ', - 'zh-CN': '简体中文', - 'zh-HK': '繁體中文(香港)', - 'zh-TW': '繁體中文(臺灣)', - zh: '中文', - }.freeze - - def human_locale(locale) - HUMAN_LOCALES[locale] - end - def filterable_languages - LanguageDetector.instance.language_names.select(&HUMAN_LOCALES.method(:key?)) + LanguageDetector.instance.language_names.select(&LanguagesHelper::HUMAN_LOCALES.method(:key?)) end def hash_to_object(hash) diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb index 1f654f34fc..25f079e9df 100644 --- a/app/helpers/statuses_helper.rb +++ b/app/helpers/statuses_helper.rb @@ -130,4 +130,84 @@ module StatusesHelper def embedded_view? params[:controller] == EMBEDDED_CONTROLLER && params[:action] == EMBEDDED_ACTION end + + def render_video_component(status, **options) + video = status.media_attachments.first + + meta = video.file.meta || {} + + component_params = { + sensitive: sensitized?(status, current_account), + src: full_asset_url(video.file.url(:original)), + preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), + alt: video.description, + blurhash: video.blurhash, + frameRate: meta.dig('original', 'frame_rate'), + inline: true, + media: [ + ActiveModelSerializers::SerializableResource.new(video, serializer: REST::MediaAttachmentSerializer), + ].as_json, + }.merge(**options) + + react_component :video, component_params do + render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments } + end + end + + def render_audio_component(status, **options) + audio = status.media_attachments.first + + meta = audio.file.meta || {} + + component_params = { + src: full_asset_url(audio.file.url(:original)), + poster: full_asset_url(audio.thumbnail.present? ? audio.thumbnail.url : status.account.avatar_static_url), + alt: audio.description, + backgroundColor: meta.dig('colors', 'background'), + foregroundColor: meta.dig('colors', 'foreground'), + accentColor: meta.dig('colors', 'accent'), + duration: meta.dig('original', 'duration'), + }.merge(**options) + + react_component :audio, component_params do + render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments } + end + end + + def render_media_gallery_component(status, **options) + component_params = { + sensitive: sensitized?(status, current_account), + autoplay: prefers_autoplay?, + media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }, + }.merge(**options) + + react_component :media_gallery, component_params do + render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments } + end + end + + def render_card_component(status, **options) + component_params = { + sensitive: sensitized?(status, current_account), + maxDescription: 160, + card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json, + }.merge(**options) + + react_component :card, component_params + end + + def render_poll_component(status, **options) + component_params = { + disabled: true, + poll: ActiveModelSerializers::SerializableResource.new(status.preloadable_poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json, + }.merge(**options) + + react_component :poll, component_params do + render partial: 'statuses/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: prefers_autoplay? } + end + end + + def prefers_autoplay? + ActiveModel::Type::Boolean.new.cast(params[:autoplay]) || current_user&.setting_auto_play_gif + end end diff --git a/app/javascript/flavours/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js index 912a3d179f..0cf64e0762 100644 --- a/app/javascript/flavours/glitch/actions/accounts.js +++ b/app/javascript/flavours/glitch/actions/accounts.js @@ -5,6 +5,10 @@ export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST'; export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS'; export const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL'; +export const ACCOUNT_LOOKUP_REQUEST = 'ACCOUNT_LOOKUP_REQUEST'; +export const ACCOUNT_LOOKUP_SUCCESS = 'ACCOUNT_LOOKUP_SUCCESS'; +export const ACCOUNT_LOOKUP_FAIL = 'ACCOUNT_LOOKUP_FAIL'; + export const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST'; export const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS'; export const ACCOUNT_FOLLOW_FAIL = 'ACCOUNT_FOLLOW_FAIL'; @@ -104,6 +108,34 @@ export function fetchAccount(id) { }; }; +export const lookupAccount = acct => (dispatch, getState) => { + dispatch(lookupAccountRequest(acct)); + + api(getState).get('/api/v1/accounts/lookup', { params: { acct } }).then(response => { + dispatch(fetchRelationships([response.data.id])); + dispatch(importFetchedAccount(response.data)); + dispatch(lookupAccountSuccess()); + }).catch(error => { + dispatch(lookupAccountFail(acct, error)); + }); +}; + +export const lookupAccountRequest = (acct) => ({ + type: ACCOUNT_LOOKUP_REQUEST, + acct, +}); + +export const lookupAccountSuccess = () => ({ + type: ACCOUNT_LOOKUP_SUCCESS, +}); + +export const lookupAccountFail = (acct, error) => ({ + type: ACCOUNT_LOOKUP_FAIL, + acct, + error, + skipAlert: true, +}); + export function fetchAccountRequest(id) { return { type: ACCOUNT_FETCH_REQUEST, diff --git a/app/javascript/flavours/glitch/actions/boosts.js b/app/javascript/flavours/glitch/actions/boosts.js new file mode 100644 index 0000000000..6e14065d6f --- /dev/null +++ b/app/javascript/flavours/glitch/actions/boosts.js @@ -0,0 +1,29 @@ +import { openModal } from './modal'; + +export const BOOSTS_INIT_MODAL = 'BOOSTS_INIT_MODAL'; +export const BOOSTS_CHANGE_PRIVACY = 'BOOSTS_CHANGE_PRIVACY'; + +export function initBoostModal(props) { + return (dispatch, getState) => { + const default_privacy = getState().getIn(['compose', 'default_privacy']); + + const privacy = props.status.get('visibility') === 'private' ? 'private' : default_privacy; + + dispatch({ + type: BOOSTS_INIT_MODAL, + privacy + }); + + dispatch(openModal('BOOST', props)); + }; +} + + +export function changeBoostPrivacy(privacy) { + return dispatch => { + dispatch({ + type: BOOSTS_CHANGE_PRIVACY, + privacy, + }); + }; +} diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index f837380936..261c72b2a7 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -10,6 +10,7 @@ import { importFetchedAccounts } from './importer'; import { updateTimeline } from './timelines'; import { showAlertForError } from './alerts'; import { showAlert } from './alerts'; +import { openModal } from './modal'; import { defineMessages } from 'react-intl'; let cancelFetchComposeSuggestionsAccounts, cancelFetchComposeSuggestionsTags; @@ -38,6 +39,7 @@ export const THUMBNAIL_UPLOAD_PROGRESS = 'THUMBNAIL_UPLOAD_PROGRESS'; export const COMPOSE_SUGGESTIONS_CLEAR = 'COMPOSE_SUGGESTIONS_CLEAR'; export const COMPOSE_SUGGESTIONS_READY = 'COMPOSE_SUGGESTIONS_READY'; export const COMPOSE_SUGGESTION_SELECT = 'COMPOSE_SUGGESTION_SELECT'; +export const COMPOSE_SUGGESTION_IGNORE = 'COMPOSE_SUGGESTION_IGNORE'; export const COMPOSE_SUGGESTION_TAGS_UPDATE = 'COMPOSE_SUGGESTION_TAGS_UPDATE'; export const COMPOSE_TAG_HISTORY_UPDATE = 'COMPOSE_TAG_HISTORY_UPDATE'; @@ -68,6 +70,11 @@ export const COMPOSE_POLL_OPTION_CHANGE = 'COMPOSE_POLL_OPTION_CHANGE'; export const COMPOSE_POLL_OPTION_REMOVE = 'COMPOSE_POLL_OPTION_REMOVE'; export const COMPOSE_POLL_SETTINGS_CHANGE = 'COMPOSE_POLL_SETTINGS_CHANGE'; +export const INIT_MEDIA_EDIT_MODAL = 'INIT_MEDIA_EDIT_MODAL'; + +export const COMPOSE_CHANGE_MEDIA_DESCRIPTION = 'COMPOSE_CHANGE_MEDIA_DESCRIPTION'; +export const COMPOSE_CHANGE_MEDIA_FOCUS = 'COMPOSE_CHANGE_MEDIA_FOCUS'; + const messages = defineMessages({ uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' }, uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' }, @@ -77,7 +84,7 @@ const COMPOSE_PANEL_BREAKPOINT = 600 + (285 * 1) + (10 * 1); export const ensureComposeIsVisible = (getState, routerHistory) => { if (!getState().getIn(['compose', 'mounted']) && window.innerWidth < COMPOSE_PANEL_BREAKPOINT) { - routerHistory.push('/statuses/new'); + routerHistory.push('/publish'); } }; @@ -170,7 +177,8 @@ export function submitCompose(routerHistory) { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), }, }).then(function (response) { - if (routerHistory && routerHistory.location.pathname === '/statuses/new' + if (routerHistory + && (routerHistory.location.pathname === '/publish' || routerHistory.location.pathname === '/statuses/new') && window.history.state && !getState().getIn(['compose', 'advanced_options', 'threaded_mode'])) { routerHistory.goBack(); @@ -278,12 +286,15 @@ export function uploadCompose(files) { if (status === 200) { dispatch(uploadComposeSuccess(data, f)); } else if (status === 202) { + let tryCount = 1; const poll = () => { api(getState).get(`/api/v1/media/${data.id}`).then(response => { if (response.status === 200) { dispatch(uploadComposeSuccess(response.data, f)); } else if (response.status === 206) { - setTimeout(() => poll(), 1000); + let retryAfter = (Math.log2(tryCount) || 1) * 1000; + tryCount += 1; + setTimeout(() => poll(), retryAfter); } }).catch(error => dispatch(uploadComposeFail(error))); }; @@ -339,6 +350,32 @@ export const uploadThumbnailFail = error => ({ skipLoading: true, }); +export function initMediaEditModal(id) { + return dispatch => { + dispatch({ + type: INIT_MEDIA_EDIT_MODAL, + id, + }); + + dispatch(openModal('FOCAL_POINT', { id })); + }; +}; + +export function onChangeMediaDescription(description) { + return { + type: COMPOSE_CHANGE_MEDIA_DESCRIPTION, + description, + }; +}; + +export function onChangeMediaFocus(focusX, focusY) { + return { + type: COMPOSE_CHANGE_MEDIA_FOCUS, + focusX, + focusY, + }; +}; + export function changeUploadCompose(id, params) { return (dispatch, getState) => { dispatch(changeUploadComposeRequest()); @@ -529,13 +566,25 @@ export function selectComposeSuggestion(position, token, suggestion, path) { completion = '@' + getState().getIn(['accounts', suggestion.id, 'acct']); } - dispatch({ - type: COMPOSE_SUGGESTION_SELECT, - position, - token, - completion, - path, - }); + // We don't want to replace hashtags that vary only in case due to accessibility, but we need to fire off an event so that + // the suggestions are dismissed and the cursor moves forward. + if (suggestion.type !== 'hashtag' || token.slice(1).localeCompare(suggestion.name, undefined, { sensitivity: 'accent' }) !== 0) { + dispatch({ + type: COMPOSE_SUGGESTION_SELECT, + position, + token, + completion, + path, + }); + } else { + dispatch({ + type: COMPOSE_SUGGESTION_IGNORE, + position, + token, + completion, + path, + }); + } }; }; diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js index 05955963c9..bda15a9b08 100644 --- a/app/javascript/flavours/glitch/actions/importer/normalizer.js +++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js @@ -24,6 +24,7 @@ export function normalizeAccount(account) { account.display_name_html = emojify(escapeTextContentForBrowser(displayName), emojiMap); account.note_emojified = emojify(account.note, emojiMap); + account.note_plain = unescapeHTML(account.note); if (account.fields) { account.fields = account.fields.map(pair => ({ @@ -53,15 +54,16 @@ export function normalizeStatus(status, normalOldStatus) { normalStatus.poll = status.poll.id; } - // Only calculate these values when status first encountered - // Otherwise keep the ones already in the reducer - if (normalOldStatus) { + // Only calculate these values when status first encountered and + // when the underlying values change. Otherwise keep the ones + // already in the reducer + if (normalOldStatus && normalOldStatus.get('content') === normalStatus.content && normalOldStatus.get('spoiler_text') === normalStatus.spoiler_text) { normalStatus.search_index = normalOldStatus.get('search_index'); normalStatus.contentHtml = normalOldStatus.get('contentHtml'); normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml'); } else { const spoilerText = normalStatus.spoiler_text || ''; - const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).join('\n\n').replace(//g, '\n').replace(/<\/p>

/g, '\n\n'); + const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(//g, '\n').replace(/<\/p>

/g, '\n\n'); const emojiMap = makeEmojiMap(normalStatus); normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent; diff --git a/app/javascript/flavours/glitch/actions/interactions.js b/app/javascript/flavours/glitch/actions/interactions.js index 4407f8b6ea..336c8fa907 100644 --- a/app/javascript/flavours/glitch/actions/interactions.js +++ b/app/javascript/flavours/glitch/actions/interactions.js @@ -41,11 +41,11 @@ export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST'; export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS'; export const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL'; -export function reblog(status) { +export function reblog(status, visibility) { return function (dispatch, getState) { dispatch(reblogRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/reblog`).then(function (response) { + api(getState).post(`/api/v1/statuses/${status.get('id')}/reblog`, { visibility }).then(function (response) { // The reblog API method returns a new status wrapped around the original. In this case we are only // interested in how the original is modified, hence passing it skipping the wrapper dispatch(importFetchedStatus(response.data.reblog)); diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js index bd3a34e5d9..4b00ea632a 100644 --- a/app/javascript/flavours/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -1,6 +1,6 @@ import api, { getLinks } from 'flavours/glitch/util/api'; import IntlMessageFormat from 'intl-messageformat'; -import { fetchRelationships } from './accounts'; +import { fetchFollowRequests, fetchRelationships } from './accounts'; import { importFetchedAccount, importFetchedAccounts, @@ -90,6 +90,10 @@ export function updateNotifications(notification, intlMessages, intlLocale) { filtered = regex && regex.test(searchIndex); } + if (['follow_request'].includes(notification.type)) { + dispatch(fetchFollowRequests()); + } + dispatch(submitMarkers()); if (showInColumn) { diff --git a/app/javascript/flavours/glitch/actions/picture_in_picture.js b/app/javascript/flavours/glitch/actions/picture_in_picture.js index 4085cb59e0..33d8d57d47 100644 --- a/app/javascript/flavours/glitch/actions/picture_in_picture.js +++ b/app/javascript/flavours/glitch/actions/picture_in_picture.js @@ -22,13 +22,20 @@ export const PICTURE_IN_PICTURE_REMOVE = 'PICTURE_IN_PICTURE_REMOVE'; * @param {MediaProps} props * @return {object} */ -export const deployPictureInPicture = (statusId, accountId, playerType, props) => ({ - type: PICTURE_IN_PICTURE_DEPLOY, - statusId, - accountId, - playerType, - props, -}); +export const deployPictureInPicture = (statusId, accountId, playerType, props) => { + return (dispatch, getState) => { + // Do not open a player for a toot that does not exist + if (getState().hasIn(['statuses', statusId])) { + dispatch({ + type: PICTURE_IN_PICTURE_DEPLOY, + statusId, + accountId, + playerType, + props, + }); + } + }; +}; /* * @return {object} diff --git a/app/javascript/flavours/glitch/actions/search.js b/app/javascript/flavours/glitch/actions/search.js index a025f352a5..b4aee4525d 100644 --- a/app/javascript/flavours/glitch/actions/search.js +++ b/app/javascript/flavours/glitch/actions/search.js @@ -32,6 +32,7 @@ export function submitSearch() { const value = getState().getIn(['search', 'value']); if (value.length === 0) { + dispatch(fetchSearchSuccess({ accounts: [], statuses: [], hashtags: [] }, '')); return; } diff --git a/app/javascript/flavours/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js index 4d2bda78be..7db357df1b 100644 --- a/app/javascript/flavours/glitch/actions/statuses.js +++ b/app/javascript/flavours/glitch/actions/statuses.js @@ -128,6 +128,9 @@ export function deleteStatusFail(id, error) { }; }; +export const updateStatus = status => dispatch => + dispatch(importFetchedStatus(status)); + export function fetchContext(id) { return (dispatch, getState) => { dispatch(fetchContextRequest(id)); diff --git a/app/javascript/flavours/glitch/actions/store.js b/app/javascript/flavours/glitch/actions/store.js index 34dcafc510..9dbc0b2148 100644 --- a/app/javascript/flavours/glitch/actions/store.js +++ b/app/javascript/flavours/glitch/actions/store.js @@ -1,6 +1,7 @@ import { Iterable, fromJS } from 'immutable'; import { hydrateCompose } from './compose'; import { importFetchedAccounts } from './importer'; +import { saveSettings } from './settings'; export const STORE_HYDRATE = 'STORE_HYDRATE'; export const STORE_HYDRATE_LAZY = 'STORE_HYDRATE_LAZY'; @@ -9,9 +10,22 @@ const convertState = rawState => fromJS(rawState, (k, v) => Iterable.isIndexed(v) ? v.toList() : v.toMap()); +const applyMigrations = (state) => { + return state.withMutations(state => { + // Migrate glitch-soc local-only “Show unread marker” setting to Mastodon's setting + if (state.getIn(['local_settings', 'notifications', 'show_unread']) !== undefined) { + // Only change if the Mastodon setting does not deviate from default + if (state.getIn(['settings', 'notifications', 'showUnread']) !== false) { + state.setIn(['settings', 'notifications', 'showUnread'], state.getIn(['local_settings', 'notifications', 'show_unread'])); + } + state.removeIn(['local_settings', 'notifications', 'show_unread']) + } + }); +}; + export function hydrateStore(rawState) { return dispatch => { - const state = convertState(rawState); + const state = applyMigrations(convertState(rawState)); dispatch({ type: STORE_HYDRATE, @@ -20,5 +34,6 @@ export function hydrateStore(rawState) { dispatch(hydrateCompose()); dispatch(importFetchedAccounts(Object.values(rawState.accounts))); + dispatch(saveSettings()); }; }; diff --git a/app/javascript/flavours/glitch/actions/streaming.js b/app/javascript/flavours/glitch/actions/streaming.js index 35db5dcc92..223924534e 100644 --- a/app/javascript/flavours/glitch/actions/streaming.js +++ b/app/javascript/flavours/glitch/actions/streaming.js @@ -10,6 +10,7 @@ import { } from './timelines'; import { updateNotifications, expandNotifications } from './notifications'; import { updateConversations } from './conversations'; +import { updateStatus } from './statuses'; import { fetchAnnouncements, updateAnnouncements, @@ -75,6 +76,9 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti case 'update': dispatch(updateTimeline(timelineId, JSON.parse(data.payload), options.accept)); break; + case 'status.update': + dispatch(updateStatus(JSON.parse(data.payload))); + break; case 'delete': dispatch(deleteFromTimelines(data.payload)); break; diff --git a/app/javascript/flavours/glitch/actions/suggestions.js b/app/javascript/flavours/glitch/actions/suggestions.js index 3687136ff4..7070250e3e 100644 --- a/app/javascript/flavours/glitch/actions/suggestions.js +++ b/app/javascript/flavours/glitch/actions/suggestions.js @@ -1,5 +1,6 @@ import api from 'flavours/glitch/util/api'; import { importFetchedAccounts } from './importer'; +import { fetchRelationships } from './accounts'; export const SUGGESTIONS_FETCH_REQUEST = 'SUGGESTIONS_FETCH_REQUEST'; export const SUGGESTIONS_FETCH_SUCCESS = 'SUGGESTIONS_FETCH_SUCCESS'; @@ -7,13 +8,17 @@ export const SUGGESTIONS_FETCH_FAIL = 'SUGGESTIONS_FETCH_FAIL'; export const SUGGESTIONS_DISMISS = 'SUGGESTIONS_DISMISS'; -export function fetchSuggestions() { +export function fetchSuggestions(withRelationships = false) { return (dispatch, getState) => { dispatch(fetchSuggestionsRequest()); - api(getState).get('/api/v1/suggestions').then(response => { - dispatch(importFetchedAccounts(response.data)); + api(getState).get('/api/v2/suggestions', { params: { limit: 20 } }).then(response => { + dispatch(importFetchedAccounts(response.data.map(x => x.account))); dispatch(fetchSuggestionsSuccess(response.data)); + + if (withRelationships) { + dispatch(fetchRelationships(response.data.map(item => item.account.id))); + } }).catch(error => dispatch(fetchSuggestionsFail(error))); }; }; @@ -25,10 +30,10 @@ export function fetchSuggestionsRequest() { }; }; -export function fetchSuggestionsSuccess(accounts) { +export function fetchSuggestionsSuccess(suggestions) { return { type: SUGGESTIONS_FETCH_SUCCESS, - accounts, + suggestions, skipLoading: true, }; }; @@ -48,5 +53,12 @@ export const dismissSuggestion = accountId => (dispatch, getState) => { id: accountId, }); - api(getState).delete(`/api/v1/suggestions/${accountId}`); + api(getState).delete(`/api/v1/suggestions/${accountId}`).then(() => { + dispatch(fetchSuggestionsRequest()); + + api(getState).get('/api/v2/suggestions').then(response => { + dispatch(importFetchedAccounts(response.data.map(x => x.account))); + dispatch(fetchSuggestionsSuccess(response.data)); + }).catch(error => dispatch(fetchSuggestionsFail(error))); + }).catch(() => {}); }; diff --git a/app/javascript/flavours/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js index b19666e62c..24cc0d63fd 100644 --- a/app/javascript/flavours/glitch/actions/timelines.js +++ b/app/javascript/flavours/glitch/actions/timelines.js @@ -20,6 +20,8 @@ export const TIMELINE_LOAD_PENDING = 'TIMELINE_LOAD_PENDING'; export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT'; export const TIMELINE_CONNECT = 'TIMELINE_CONNECT'; +export const TIMELINE_MARK_AS_PARTIAL = 'TIMELINE_MARK_AS_PARTIAL'; + export const loadPending = timeline => ({ type: TIMELINE_LOAD_PENDING, timeline, @@ -31,6 +33,13 @@ export function updateTimeline(timeline, status, accept) { return; } + if (getState().getIn(['timelines', timeline, 'isPartial'])) { + // Prevent new items from being added to a partial timeline, + // since it will be reloaded anyway + + return; + } + const filters = getFiltersRegex(getState(), { contextType: timeline }); const dropRegex = filters[0]; const regex = filters[1]; @@ -198,3 +207,8 @@ export const disconnectTimeline = timeline => ({ timeline, usePendingItems: preferPendingItems, }); + +export const markAsPartial = timeline => ({ + type: TIMELINE_MARK_AS_PARTIAL, + timeline, +}); diff --git a/app/javascript/flavours/glitch/blurhash.js b/app/javascript/flavours/glitch/blurhash.js new file mode 100644 index 0000000000..5adcc3e770 --- /dev/null +++ b/app/javascript/flavours/glitch/blurhash.js @@ -0,0 +1,112 @@ +const DIGIT_CHARACTERS = [ + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', + '#', + '$', + '%', + '*', + '+', + ',', + '-', + '.', + ':', + ';', + '=', + '?', + '@', + '[', + ']', + '^', + '_', + '{', + '|', + '}', + '~', +]; + +export const decode83 = (str) => { + let value = 0; + let c, digit; + + for (let i = 0; i < str.length; i++) { + c = str[i]; + digit = DIGIT_CHARACTERS.indexOf(c); + value = value * 83 + digit; + } + + return value; +}; + +export const intToRGB = int => ({ + r: Math.max(0, (int >> 16)), + g: Math.max(0, (int >> 8) & 255), + b: Math.max(0, (int & 255)), +}); + +export const getAverageFromBlurhash = blurhash => { + if (!blurhash) { + return null; + } + + return intToRGB(decode83(blurhash.slice(2, 6))); +}; diff --git a/app/javascript/flavours/glitch/components/account.js b/app/javascript/flavours/glitch/components/account.js index 23399c630e..396a36ea0f 100644 --- a/app/javascript/flavours/glitch/components/account.js +++ b/app/javascript/flavours/glitch/components/account.js @@ -87,8 +87,10 @@ class Account extends ImmutablePureComponent { let buttons; - if (onActionClick && actionIcon) { - buttons = ; + if (onActionClick) { + if (actionIcon) { + buttons = ; + } } else if (account.get('id') !== me && !small && account.get('relationship', null) !== null) { const following = account.getIn(['relationship', 'following']); const requested = account.getIn(['relationship', 'requested']); @@ -126,7 +128,7 @@ class Account extends ImmutablePureComponent {

- +
{mute_expires_at} diff --git a/app/javascript/flavours/glitch/components/admin/Counter.js b/app/javascript/flavours/glitch/components/admin/Counter.js new file mode 100644 index 0000000000..2bc9ce482c --- /dev/null +++ b/app/javascript/flavours/glitch/components/admin/Counter.js @@ -0,0 +1,116 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import api from 'flavours/glitch/util/api'; +import { FormattedNumber } from 'react-intl'; +import { Sparklines, SparklinesCurve } from 'react-sparklines'; +import classNames from 'classnames'; +import Skeleton from 'flavours/glitch/components/skeleton'; + +const percIncrease = (a, b) => { + let percent; + + if (b !== 0) { + if (a !== 0) { + percent = (b - a) / a; + } else { + percent = 1; + } + } else if (b === 0 && a === 0) { + percent = 0; + } else { + percent = - 1; + } + + return percent; +}; + +export default class Counter extends React.PureComponent { + + static propTypes = { + measure: PropTypes.string.isRequired, + start_at: PropTypes.string.isRequired, + end_at: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + href: PropTypes.string, + params: PropTypes.object, + }; + + state = { + loading: true, + data: null, + }; + + componentDidMount () { + const { measure, start_at, end_at, params } = this.props; + + api().post('/api/v1/admin/measures', { keys: [measure], start_at, end_at, [measure]: params }).then(res => { + this.setState({ + loading: false, + data: res.data, + }); + }).catch(err => { + console.error(err); + }); + } + + render () { + const { label, href } = this.props; + const { loading, data } = this.state; + + let content; + + if (loading) { + content = ( + + + + + ); + } else { + const measure = data[0]; + const percentChange = percIncrease(measure.previous_total * 1, measure.total * 1); + + content = ( + + + 0, negative: percentChange < 0 })}>{percentChange > 0 && '+'} + + ); + } + + const inner = ( + +
+ {content} +
+ +
+ {label} +
+ +
+ {!loading && ( + x.value * 1)}> + + + )} +
+
+ ); + + if (href) { + return ( +
+ {inner} + + ); + } else { + return ( +
+ {inner} +
+ ); + } + } + +} diff --git a/app/javascript/flavours/glitch/components/admin/Dimension.js b/app/javascript/flavours/glitch/components/admin/Dimension.js new file mode 100644 index 0000000000..a924d093c8 --- /dev/null +++ b/app/javascript/flavours/glitch/components/admin/Dimension.js @@ -0,0 +1,93 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import api from 'flavours/glitch/util/api'; +import { FormattedNumber } from 'react-intl'; +import { roundTo10 } from 'flavours/glitch/util/numbers'; +import Skeleton from 'flavours/glitch/components/skeleton'; + +export default class Dimension extends React.PureComponent { + + static propTypes = { + dimension: PropTypes.string.isRequired, + start_at: PropTypes.string.isRequired, + end_at: PropTypes.string.isRequired, + limit: PropTypes.number.isRequired, + label: PropTypes.string.isRequired, + params: PropTypes.object, + }; + + state = { + loading: true, + data: null, + }; + + componentDidMount () { + const { start_at, end_at, dimension, limit, params } = this.props; + + api().post('/api/v1/admin/dimensions', { keys: [dimension], start_at, end_at, limit, [dimension]: params }).then(res => { + this.setState({ + loading: false, + data: res.data, + }); + }).catch(err => { + console.error(err); + }); + } + + render () { + const { label, limit } = this.props; + const { loading, data } = this.state; + + let content; + + if (loading) { + content = ( + + + {Array.from(Array(limit)).map((_, i) => ( + + + + + + ))} + +
+ + + +
+ ); + } else { + const sum = data[0].data.reduce((sum, cur) => sum + (cur.value * 1), 0); + + content = ( + + + {data[0].data.map(item => ( + + + + + + ))} + +
+ + {item.human_key} + + {typeof item.human_value !== 'undefined' ? item.human_value : } +
+ ); + } + + return ( +
+

{label}

+ + {content} +
+ ); + } + +} diff --git a/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.js b/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.js new file mode 100644 index 0000000000..0f2a4fe362 --- /dev/null +++ b/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.js @@ -0,0 +1,159 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import api from 'flavours/glitch/util/api'; +import { injectIntl, defineMessages } from 'react-intl'; +import classNames from 'classnames'; + +const messages = defineMessages({ + other: { id: 'report.categories.other', defaultMessage: 'Other' }, + spam: { id: 'report.categories.spam', defaultMessage: 'Spam' }, + violation: { id: 'report.categories.violation', defaultMessage: 'Content violates one or more server rules' }, +}); + +class Category extends React.PureComponent { + + static propTypes = { + id: PropTypes.string.isRequired, + text: PropTypes.string.isRequired, + selected: PropTypes.bool, + disabled: PropTypes.bool, + onSelect: PropTypes.func, + children: PropTypes.node, + }; + + handleClick = () => { + const { id, disabled, onSelect } = this.props; + + if (!disabled) { + onSelect(id); + } + }; + + render () { + const { id, text, disabled, selected, children } = this.props; + + return ( +
+ {selected && } + +
+ + {text} +
+ + {(selected && children) && ( +
+ {children} +
+ )} +
+ ); + } + +} + +class Rule extends React.PureComponent { + + static propTypes = { + id: PropTypes.string.isRequired, + text: PropTypes.string.isRequired, + selected: PropTypes.bool, + disabled: PropTypes.bool, + onToggle: PropTypes.func, + }; + + handleClick = () => { + const { id, disabled, onToggle } = this.props; + + if (!disabled) { + onToggle(id); + } + }; + + render () { + const { id, text, disabled, selected } = this.props; + + return ( +
+ + {selected && } + {text} +
+ ); + } + +} + +export default @injectIntl +class ReportReasonSelector extends React.PureComponent { + + static propTypes = { + id: PropTypes.string.isRequired, + category: PropTypes.string.isRequired, + rule_ids: PropTypes.arrayOf(PropTypes.string), + disabled: PropTypes.bool, + intl: PropTypes.object.isRequired, + }; + + state = { + category: this.props.category, + rule_ids: this.props.rule_ids || [], + rules: [], + }; + + componentDidMount() { + api().get('/api/v1/instance').then(res => { + this.setState({ + rules: res.data.rules, + }); + }).catch(err => { + console.error(err); + }); + } + + _save = () => { + const { id, disabled } = this.props; + const { category, rule_ids } = this.state; + + if (disabled) { + return; + } + + api().put(`/api/v1/admin/reports/${id}`, { + category, + rule_ids, + }).catch(err => { + console.error(err); + }); + }; + + handleSelect = id => { + this.setState({ category: id }, () => this._save()); + }; + + handleToggle = id => { + const { rule_ids } = this.state; + + if (rule_ids.includes(id)) { + this.setState({ rule_ids: rule_ids.filter(x => x !== id ) }, () => this._save()); + } else { + this.setState({ rule_ids: [...rule_ids, id] }, () => this._save()); + } + }; + + render () { + const { disabled, intl } = this.props; + const { rules, category, rule_ids } = this.state; + + return ( +
+ + + + {rules.map(rule => )} + +
+ ); + } + +} diff --git a/app/javascript/flavours/glitch/components/admin/Retention.js b/app/javascript/flavours/glitch/components/admin/Retention.js new file mode 100644 index 0000000000..6d7e4b2798 --- /dev/null +++ b/app/javascript/flavours/glitch/components/admin/Retention.js @@ -0,0 +1,151 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import api from 'flavours/glitch/util/api'; +import { FormattedMessage, FormattedNumber, FormattedDate } from 'react-intl'; +import classNames from 'classnames'; +import { roundTo10 } from 'flavours/glitch/util/numbers'; + +const dateForCohort = cohort => { + switch(cohort.frequency) { + case 'day': + return ; + default: + return ; + } +}; + +export default class Retention extends React.PureComponent { + + static propTypes = { + start_at: PropTypes.string, + end_at: PropTypes.string, + frequency: PropTypes.string, + }; + + state = { + loading: true, + data: null, + }; + + componentDidMount () { + const { start_at, end_at, frequency } = this.props; + + api().post('/api/v1/admin/retention', { start_at, end_at, frequency }).then(res => { + this.setState({ + loading: false, + data: res.data, + }); + }).catch(err => { + console.error(err); + }); + } + + render () { + const { loading, data } = this.state; + const { frequency } = this.props; + + let content; + + if (loading) { + content = ; + } else { + content = ( + + + + + + + + {data[0].data.slice(1).map((retention, i) => ( + + ))} + + + + + + + + {data[0].data.slice(1).map((retention, i) => { + const average = data.reduce((sum, cohort, k) => cohort.data[i + 1] ? sum + (cohort.data[i + 1].rate - sum)/(k + 1) : sum, 0); + + return ( + + ); + })} + + + + + {data.slice(0, -1).map(cohort => ( + + + + + + {cohort.data.slice(1).map(retention => ( + + ))} + + ))} + +
+
+ +
+
+
+ +
+
+
+ {i + 1} +
+
+
+ +
+
+
+ sum + ((cohort.data[0].value * 1) - sum) / (i + 1), 0)} maximumFractionDigits={0} /> +
+
+
+ +
+
+
+ {dateForCohort(cohort)} +
+
+
+ +
+
+
+ +
+
+ ); + } + + let title = null; + switch(frequency) { + case 'day': + title = ; + break; + default: + title = ; + }; + + return ( +
+

{title}

+ + {content} +
+ ); + } + +} diff --git a/app/javascript/flavours/glitch/components/admin/Trends.js b/app/javascript/flavours/glitch/components/admin/Trends.js new file mode 100644 index 0000000000..60e367f001 --- /dev/null +++ b/app/javascript/flavours/glitch/components/admin/Trends.js @@ -0,0 +1,73 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import api from 'flavours/glitch/util/api'; +import { FormattedMessage } from 'react-intl'; +import classNames from 'classnames'; +import Hashtag from 'flavours/glitch/components/hashtag'; + +export default class Trends extends React.PureComponent { + + static propTypes = { + limit: PropTypes.number.isRequired, + }; + + state = { + loading: true, + data: null, + }; + + componentDidMount () { + const { limit } = this.props; + + api().get('/api/v1/admin/trends/tags', { params: { limit } }).then(res => { + this.setState({ + loading: false, + data: res.data, + }); + }).catch(err => { + console.error(err); + }); + } + + render () { + const { limit } = this.props; + const { loading, data } = this.state; + + let content; + + if (loading) { + content = ( +
+ {Array.from(Array(limit)).map((_, i) => ( + + ))} +
+ ); + } else { + content = ( +
+ {data.map(hashtag => ( + day.uses)} + className={classNames(hashtag.requires_review && 'trends__item--requires-review', !hashtag.trendable && !hashtag.requires_review && 'trends__item--disabled')} + /> + ))} +
+ ); + } + + return ( +
+

+ + {content} +
+ ); + } + +} diff --git a/app/javascript/flavours/glitch/components/attachment_list.js b/app/javascript/flavours/glitch/components/attachment_list.js index 68d8d29c7f..68b80b19fe 100644 --- a/app/javascript/flavours/glitch/components/attachment_list.js +++ b/app/javascript/flavours/glitch/components/attachment_list.js @@ -2,6 +2,8 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import ImmutablePureComponent from 'react-immutable-pure-component'; +import { FormattedMessage } from 'react-intl'; +import classNames from 'classnames'; import Icon from 'flavours/glitch/components/icon'; const filename = url => url.split('/').pop().split('#')[0].split('?')[0]; @@ -16,29 +18,13 @@ export default class AttachmentList extends ImmutablePureComponent { render () { const { media, compact } = this.props; - if (compact) { - return ( -
-
    - {media.map(attachment => { - const displayUrl = attachment.get('remote_url') || attachment.get('url'); - - return ( -
  • - {filename(displayUrl)} -
  • - ); - })} -
-
- ); - } - return ( -
-
- -
+
+ {!compact && ( +
+ +
+ )}
    {media.map(attachment => { @@ -46,7 +32,11 @@ export default class AttachmentList extends ImmutablePureComponent { return (
  • - {filename(displayUrl)} + + {compact && } + {compact && ' ' } + {displayUrl ? filename(displayUrl) : } +
  • ); })} diff --git a/app/javascript/flavours/glitch/components/autosuggest_input.js b/app/javascript/flavours/glitch/components/autosuggest_input.js index cc0ff7deaa..b40a2ff350 100644 --- a/app/javascript/flavours/glitch/components/autosuggest_input.js +++ b/app/javascript/flavours/glitch/components/autosuggest_input.js @@ -6,7 +6,6 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import ImmutablePureComponent from 'react-immutable-pure-component'; import classNames from 'classnames'; -import { List as ImmutableList } from 'immutable'; const textAtCursorMatchesToken = (str, caretPosition, searchTokens) => { let word; @@ -55,7 +54,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { static defaultProps = { autoFocus: true, - searchTokens: ImmutableList(['@', ':', '#']), + searchTokens: ['@', ':', '#'], }; state = { diff --git a/app/javascript/flavours/glitch/components/avatar_composite.js b/app/javascript/flavours/glitch/components/avatar_composite.js index 125b51c449..e30dfe68a8 100644 --- a/app/javascript/flavours/glitch/components/avatar_composite.js +++ b/app/javascript/flavours/glitch/components/avatar_composite.js @@ -82,7 +82,7 @@ export default class AvatarComposite extends React.PureComponent { this.props.onAccountClick(account.get('id'), e)} + onClick={(e) => this.props.onAccountClick(account.get('acct'), e)} title={`@${account.get('acct')}`} key={account.get('id')} > diff --git a/app/javascript/flavours/glitch/components/column_header.js b/app/javascript/flavours/glitch/components/column_header.js index ccd0714f1b..500612093b 100644 --- a/app/javascript/flavours/glitch/components/column_header.js +++ b/app/javascript/flavours/glitch/components/column_header.js @@ -124,8 +124,8 @@ class ColumnHeader extends React.PureComponent { moveButtons = (
    - - + +
    ); } else if (multiColumn && this.props.onPin) { @@ -146,8 +146,8 @@ class ColumnHeader extends React.PureComponent { ]; if (multiColumn) { - collapsedContent.push(moveButtons); collapsedContent.push(pinButton); + collapsedContent.push(moveButtons); } if (children || (multiColumn && this.props.onPin)) { diff --git a/app/javascript/flavours/glitch/components/display_name.js b/app/javascript/flavours/glitch/components/display_name.js index 44662a8b87..9c7da744e4 100644 --- a/app/javascript/flavours/glitch/components/display_name.js +++ b/app/javascript/flavours/glitch/components/display_name.js @@ -15,45 +15,30 @@ export default class DisplayName extends React.PureComponent { handleClick: PropTypes.func, }; - _updateEmojis () { - const node = this.node; - - if (!node || autoPlayGif) { + handleMouseEnter = ({ currentTarget }) => { + if (autoPlayGif) { return; } - const emojis = node.querySelectorAll('.custom-emoji'); + const emojis = currentTarget.querySelectorAll('.custom-emoji'); for (var i = 0; i < emojis.length; i++) { let emoji = emojis[i]; - if (emoji.classList.contains('status-emoji')) { - continue; - } - emoji.classList.add('status-emoji'); - - emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false); - emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false); + emoji.src = emoji.getAttribute('data-original'); } } - componentDidMount () { - this._updateEmojis(); - } + handleMouseLeave = ({ currentTarget }) => { + if (autoPlayGif) { + return; + } - componentDidUpdate () { - this._updateEmojis(); - } + const emojis = currentTarget.querySelectorAll('.custom-emoji'); - handleEmojiMouseEnter = ({ target }) => { - target.src = target.getAttribute('data-original'); - } - - handleEmojiMouseLeave = ({ target }) => { - target.src = target.getAttribute('data-static'); - } - - setRef = (c) => { - this.node = c; + for (var i = 0; i < emojis.length; i++) { + let emoji = emojis[i]; + emoji.src = emoji.getAttribute('data-static'); + } } render() { @@ -76,7 +61,7 @@ export default class DisplayName extends React.PureComponent {
    onAccountClick(a.get('id'), e)} + onClick={(e) => onAccountClick(a.get('acct'), e)} title={`@${a.get('acct')}`} rel='noopener noreferrer' > @@ -91,7 +76,7 @@ export default class DisplayName extends React.PureComponent { } suffix = ( - onAccountClick(account.get('id'), e)} rel='noopener noreferrer'> + onAccountClick(account.get('acct'), e)} rel='noopener noreferrer'> @{acct} ); @@ -101,7 +86,7 @@ export default class DisplayName extends React.PureComponent { } return ( - + {displayName} {inline ? ' ' : null} {suffix} diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js index d1aba691ca..023fecb9ab 100644 --- a/app/javascript/flavours/glitch/components/dropdown_menu.js +++ b/app/javascript/flavours/glitch/components/dropdown_menu.js @@ -177,7 +177,6 @@ export default class Dropdown extends React.PureComponent { disabled: PropTypes.bool, status: ImmutablePropTypes.map, isUserTouching: PropTypes.func, - isModalOpen: PropTypes.bool.isRequired, onOpen: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired, dropdownPlacement: PropTypes.string, diff --git a/app/javascript/flavours/glitch/components/error_boundary.js b/app/javascript/flavours/glitch/components/error_boundary.js index 8e6cd14617..4537bde1d4 100644 --- a/app/javascript/flavours/glitch/components/error_boundary.js +++ b/app/javascript/flavours/glitch/components/error_boundary.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; +import { source_url } from 'flavours/glitch/util/initial_state'; import { preferencesLink } from 'flavours/glitch/util/backend_links'; import StackTrace from 'stacktrace-js'; @@ -64,6 +65,11 @@ export default class ErrorBoundary extends React.PureComponent { debugInfo += 'React component stack\n---------------------\n\n```\n' + componentStack.toString() + '\n```'; } + let issueTracker = source_url; + if (source_url.match(/^https:\/\/github\.com\/[^/]+\/[^/]+\/?$/)) { + issueTracker = source_url + '/issues'; + } + return (
    @@ -84,7 +90,7 @@ export default class ErrorBoundary extends React.PureComponent { }} + values={{ issuetracker: }} /> { debugInfo !== '' && (
    diff --git a/app/javascript/flavours/glitch/components/hashtag.js b/app/javascript/flavours/glitch/components/hashtag.js index 639d87a1e6..769185a2b5 100644 --- a/app/javascript/flavours/glitch/components/hashtag.js +++ b/app/javascript/flavours/glitch/components/hashtag.js @@ -2,9 +2,36 @@ import React from 'react'; import { Sparklines, SparklinesCurve } from 'react-sparklines'; import { FormattedMessage } from 'react-intl'; +import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Permalink from './permalink'; import ShortNumber from 'flavours/glitch/components/short_number'; +import Skeleton from 'flavours/glitch/components/skeleton'; +import classNames from 'classnames'; + +class SilentErrorBoundary extends React.Component { + + static propTypes = { + children: PropTypes.node, + }; + + state = { + error: false, + }; + + componentDidCatch () { + this.setState({ error: true }); + } + + render () { + if (this.state.error) { + return null; + } + + return this.props.children; + } + +} /** * Used to render counter of how much people are talking about hashtag @@ -22,52 +49,53 @@ const accountsCountRenderer = (displayNumber, pluralReady) => ( /> ); -const Hashtag = ({ hashtag }) => ( -
    +export const ImmutableHashtag = ({ hashtag }) => ( + day.get('uses')).toArray()} + /> +); + +ImmutableHashtag.propTypes = { + hashtag: ImmutablePropTypes.map.isRequired, +}; + +const Hashtag = ({ name, href, to, people, uses, history, className }) => ( +
    - - #{hashtag.get('name')} + + {name ? #{name} : } - + {typeof people !== 'undefined' ? : }
    - + {typeof uses !== 'undefined' ? : }
    - day.get('uses')) - .toArray()} - > - - + + 0)}> + + +
    ); Hashtag.propTypes = { - hashtag: ImmutablePropTypes.map.isRequired, + name: PropTypes.string, + href: PropTypes.string, + to: PropTypes.string, + people: PropTypes.number, + uses: PropTypes.number, + history: PropTypes.arrayOf(PropTypes.number), + className: PropTypes.string, }; export default Hashtag; diff --git a/app/javascript/flavours/glitch/components/logo.js b/app/javascript/flavours/glitch/components/logo.js new file mode 100644 index 0000000000..d1c7f08a91 --- /dev/null +++ b/app/javascript/flavours/glitch/components/logo.js @@ -0,0 +1,9 @@ +import React from 'react'; + +const Logo = () => ( + + + +); + +export default Logo; diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js index 890a422d3c..68195ea807 100644 --- a/app/javascript/flavours/glitch/components/media_gallery.js +++ b/app/javascript/flavours/glitch/components/media_gallery.js @@ -24,7 +24,7 @@ const messages = defineMessages({ id: 'status.sensitive_toggle', }, toggle_visible: { - defaultMessage: 'Hide {number, plural, one {image} other {images}}', + defaultMessage: '{number, plural, one {Hide image} other {Hide images}}', id: 'media_gallery.toggle_visible', }, warning: { diff --git a/app/javascript/flavours/glitch/components/modal_root.js b/app/javascript/flavours/glitch/components/modal_root.js index 13a8e8702d..7b5a630e5b 100644 --- a/app/javascript/flavours/glitch/components/modal_root.js +++ b/app/javascript/flavours/glitch/components/modal_root.js @@ -2,6 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import 'wicg-inert'; import { createBrowserHistory } from 'history'; +import { multiply } from 'color-blend'; export default class ModalRoot extends React.PureComponent { static contextTypes = { @@ -11,6 +12,11 @@ export default class ModalRoot extends React.PureComponent { static propTypes = { children: PropTypes.node, onClose: PropTypes.func.isRequired, + backgroundColor: PropTypes.shape({ + r: PropTypes.number, + g: PropTypes.number, + b: PropTypes.number, + }), noEsc: PropTypes.bool, }; @@ -68,14 +74,15 @@ export default class ModalRoot extends React.PureComponent { Promise.resolve().then(() => { this.activeElement.focus({ preventScroll: true }); this.activeElement = null; - }).catch((error) => { - console.error(error); - }); + }).catch(console.error); - this.handleModalClose(); + this._handleModalClose(); } if (this.props.children && !prevProps.children) { - this.handleModalOpen(); + this._handleModalOpen(); + } + if (this.props.children) { + this._ensureHistoryBuffer(); } } @@ -84,22 +91,29 @@ export default class ModalRoot extends React.PureComponent { window.removeEventListener('keydown', this.handleKeyDown); } - handleModalClose () { + _handleModalOpen () { + this._modalHistoryKey = Date.now(); + this.unlistenHistory = this.history.listen((_, action) => { + if (action === 'POP') { + this.props.onClose(); + } + }); + } + + _handleModalClose () { this.unlistenHistory(); - const state = this.history.location.state; - if (state && state.mastodonModalOpen) { + const { state } = this.history.location; + if (state && state.mastodonModalKey === this._modalHistoryKey) { this.history.goBack(); } } - handleModalOpen () { - const history = this.history; - const state = {...history.location.state, mastodonModalOpen: true}; - history.push(history.location.pathname, state); - this.unlistenHistory = history.listen(() => { - this.props.onClose(); - }); + _ensureHistoryBuffer () { + const { pathname, state } = this.history.location; + if (!state || state.mastodonModalKey !== this._modalHistoryKey) { + this.history.push(pathname, { ...state, mastodonModalKey: this._modalHistoryKey }); + } } getSiblings = () => { @@ -120,10 +134,16 @@ export default class ModalRoot extends React.PureComponent { ); } + let backgroundColor = null; + + if (this.props.backgroundColor) { + backgroundColor = multiply({ ...this.props.backgroundColor, a: 1 }, { r: 0, g: 0, b: 0, a: 0.7 }); + } + return (
    -
    +
    {children}
    diff --git a/app/javascript/flavours/glitch/components/poll.js b/app/javascript/flavours/glitch/components/poll.js index f230823cc3..970b007051 100644 --- a/app/javascript/flavours/glitch/components/poll.js +++ b/app/javascript/flavours/glitch/components/poll.js @@ -12,8 +12,18 @@ import RelativeTimestamp from './relative_timestamp'; import Icon from 'flavours/glitch/components/icon'; const messages = defineMessages({ - closed: { id: 'poll.closed', defaultMessage: 'Closed' }, - voted: { id: 'poll.voted', defaultMessage: 'You voted for this answer', description: 'Tooltip of the "voted" checkmark in polls' }, + closed: { + id: 'poll.closed', + defaultMessage: 'Closed', + }, + voted: { + id: 'poll.voted', + defaultMessage: 'You voted for this answer', + }, + votes: { + id: 'poll.votes', + defaultMessage: '{votes, plural, one {# vote} other {# votes}}', + }, }); const makeEmojiMap = record => record.get('emojis').reduce((obj, emoji) => { @@ -148,9 +158,16 @@ class Poll extends ImmutablePureComponent { data-index={optionIndex} /> )} - {showResults && - {Math.round(percent)}% - } + {showResults && ( + + {Math.round(percent)}% + + )} ( +const RegenerationIndicator = () => (
    @@ -15,4 +15,4 @@ const MissingIndicator = () => (
    ); -export default MissingIndicator; +export default RegenerationIndicator; diff --git a/app/javascript/flavours/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js index cc8d9f1f31..16f13afa49 100644 --- a/app/javascript/flavours/glitch/components/scrollable_list.js +++ b/app/javascript/flavours/glitch/components/scrollable_list.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { ScrollContainer } from 'react-router-scroll-4'; +import ScrollContainer from 'flavours/glitch/containers/scroll_container'; import PropTypes from 'prop-types'; import IntersectionObserverArticleContainer from 'flavours/glitch/containers/intersection_observer_article_container'; import LoadMore from './load_more'; @@ -34,7 +34,6 @@ class ScrollableList extends PureComponent { onScrollToTop: PropTypes.func, onScroll: PropTypes.func, trackScroll: PropTypes.bool, - shouldUpdateScroll: PropTypes.func, isLoading: PropTypes.bool, showLoading: PropTypes.bool, hasMore: PropTypes.bool, @@ -264,11 +263,6 @@ class ScrollableList extends PureComponent { this.props.onLoadMore(); } - defaultShouldUpdateScroll = (prevRouterProps, { location }) => { - if ((((prevRouterProps || {}).location || {}).state || {}).mastodonModalOpen) return false; - return !(location.state && location.state.mastodonModalOpen); - } - handleLoadPending = e => { e.preventDefault(); this.props.onLoadPending(); @@ -282,7 +276,7 @@ class ScrollableList extends PureComponent { } render () { - const { children, scrollKey, trackScroll, shouldUpdateScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props; + const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props; const { fullscreen } = this.state; const childrenCount = React.Children.count(children); @@ -348,7 +342,7 @@ class ScrollableList extends PureComponent { if (trackScroll) { return ( - + {scrollableArea} ); diff --git a/app/javascript/flavours/glitch/components/skeleton.js b/app/javascript/flavours/glitch/components/skeleton.js new file mode 100644 index 0000000000..09093e99c7 --- /dev/null +++ b/app/javascript/flavours/glitch/components/skeleton.js @@ -0,0 +1,11 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const Skeleton = ({ width, height }) => ; + +Skeleton.propTypes = { + width: PropTypes.number, + height: PropTypes.number, +}; + +export default Skeleton; diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index fcbf4be8c3..02ff9ab28e 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -346,7 +346,9 @@ class Status extends ImmutablePureComponent { return; } else { if (destination === undefined) { - destination = `/statuses/${ + destination = `/@${ + status.getIn(['reblog', 'account', 'acct'], status.getIn(['account', 'acct'])) + }/${ status.getIn(['reblog', 'id'], status.get('id')) }`; } @@ -362,38 +364,32 @@ class Status extends ImmutablePureComponent { this.setState({ showMedia: !this.state.showMedia }); } - handleAccountClick = (e) => { - if (this.context.router && e.button === 0) { - const id = e.currentTarget.getAttribute('data-id'); - e.preventDefault(); - let state = {...this.context.router.history.location.state}; - state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1; - this.context.router.history.push(`/accounts/${id}`, state); - } - } - handleExpandedToggle = () => { if (this.props.status.get('spoiler_text')) { this.setExpansion(!this.state.isExpanded); } }; - handleOpenVideo = (media, options) => { - this.props.onOpenVideo(media, options); + handleOpenVideo = (options) => { + const { status } = this.props; + this.props.onOpenVideo(status.get('id'), status.getIn(['media_attachments', 0]), options); + } + + handleOpenMedia = (media, index) => { + this.props.onOpenMedia(this.props.status.get('id'), media, index); } handleHotkeyOpenMedia = e => { const { status, onOpenMedia, onOpenVideo } = this.props; + const statusId = status.get('id'); e.preventDefault(); if (status.get('media_attachments').size > 0) { - if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { - // TODO: toggle play/paused? - } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') { - onOpenVideo(status.getIn(['media_attachments', 0]), { startTime: 0 }); + if (status.getIn(['media_attachments', 0, 'type']) === 'video') { + onOpenVideo(statusId, status.getIn(['media_attachments', 0]), { startTime: 0 }); } else { - onOpenMedia(status.get('media_attachments'), 0); + onOpenMedia(statusId, status.get('media_attachments'), 0); } } } @@ -429,13 +425,14 @@ class Status extends ImmutablePureComponent { handleHotkeyOpen = () => { let state = {...this.context.router.history.location.state}; state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1; - this.context.router.history.push(`/statuses/${this.props.status.get('id')}`, state); + const status = this.props.status; + this.context.router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`, state); } handleHotkeyOpenProfile = () => { let state = {...this.context.router.history.location.state}; state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1; - this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`, state); + this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state); } handleHotkeyMoveUp = e => { @@ -512,8 +509,8 @@ class Status extends ImmutablePureComponent { const { isExpanded, isCollapsed, forceFilter } = this.state; let background = null; let attachments = null; - let media = null; - let mediaIcon = null; + let media = []; + let mediaIcons = []; if (status === null) { return null; @@ -539,9 +536,8 @@ class Status extends ImmutablePureComponent { return (
    - {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} - {' '} - {status.get('content')} + {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} + {status.get('content')}
    ); @@ -583,25 +579,27 @@ class Status extends ImmutablePureComponent { // After we have generated our appropriate media element and stored it in // `media`, we snatch the thumbnail to use as our `background` if media // backgrounds for collapsed statuses are enabled. + attachments = status.get('media_attachments'); if (status.get('poll')) { - media = ; - mediaIcon = 'tasks'; - } else if (usingPiP) { - media = ; - mediaIcon = 'video-camera'; + media.push(); + mediaIcons.push('tasks'); + } + if (usingPiP) { + media.push(); + mediaIcons.push('video-camera'); } else if (attachments.size > 0) { if (muted || attachments.some(item => item.get('type') === 'unknown')) { - media = ( + media.push( + />, ); } else if (attachments.getIn([0, 'type']) === 'audio') { const attachment = status.getIn(['media_attachments', 0]); - media = ( + media.push( {Component => ( )} - + , ); - mediaIcon = 'music'; + mediaIcons.push('music'); } else if (attachments.getIn([0, 'type']) === 'video') { const attachment = status.getIn(['media_attachments', 0]); - media = ( + media.push( {Component => ()} - + , ); - mediaIcon = 'video-camera'; + mediaIcons.push('video-camera'); } else { // Media type is 'image' or 'gifv' - media = ( + media.push( {Component => ( + , ); - mediaIcon = 'picture-o'; + mediaIcons.push('picture-o'); } if (!status.get('sensitive') && !(status.get('spoiler_text').length > 0) && settings.getIn(['collapsed', 'backgrounds', 'preview_images'])) { background = attachments.getIn([0, 'preview_url']); } } else if (status.get('card') && settings.get('inline_preview_cards')) { - media = ( + media.push( + />, ); - mediaIcon = 'link'; + mediaIcons.push('link'); } // Here we prepare extra data-* attributes for CSS selectors. @@ -750,7 +748,7 @@ class Status extends ImmutablePureComponent { { let state = {...this.context.router.history.location.state}; - if (state.mastodonModalOpen) { - this.context.router.history.replace(`/statuses/${this.props.status.get('id')}`, { mastodonBackSteps: (state.mastodonBackSteps || 0) + 1 }); + if (state.mastodonModalKey) { + this.context.router.history.replace(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`, { mastodonBackSteps: (state.mastodonBackSteps || 0) + 1 }); } else { state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1; - this.context.router.history.push(`/statuses/${this.props.status.get('id')}`, state); + this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`, state); } } @@ -193,9 +194,11 @@ class StatusActionBar extends ImmutablePureComponent { render () { const { status, intl, withDismiss, showReplyCount, directMessage, scrollKey } = this.props; - const mutingConversation = status.get('muted'); const anonymousAccess = !me; + const mutingConversation = status.get('muted'); const publicStatus = ['public', 'unlisted'].includes(status.get('visibility')); + const pinnableStatus = ['public', 'unlisted', 'private'].includes(status.get('visibility')); + const writtenByMe = status.getIn(['account', 'id']) === me; let menu = []; let reblogIcon = 'retweet'; @@ -211,16 +214,17 @@ class StatusActionBar extends ImmutablePureComponent { menu.push(null); - if (status.getIn(['account', 'id']) === me || withDismiss) { + if (writtenByMe && pinnableStatus) { + menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick }); + menu.push(null); + } + + if (writtenByMe || withDismiss) { menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick }); menu.push(null); } - if (status.getIn(['account', 'id']) === me) { - if (publicStatus) { - menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick }); - } - + if (writtenByMe) { menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); } else { @@ -321,7 +325,9 @@ class StatusActionBar extends ImmutablePureComponent {
    , ]} - + + {status.get('edited_at') && *} +
    ); } diff --git a/app/javascript/flavours/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js index 61a28e9a76..1d32b35e5f 100644 --- a/app/javascript/flavours/glitch/components/status_content.js +++ b/app/javascript/flavours/glitch/components/status_content.js @@ -69,8 +69,8 @@ export default class StatusContent extends React.PureComponent { expanded: PropTypes.bool, collapsed: PropTypes.bool, onExpandedToggle: PropTypes.func, - media: PropTypes.element, - mediaIcon: PropTypes.string, + media: PropTypes.node, + mediaIcons: PropTypes.arrayOf(PropTypes.string), parseClick: PropTypes.func, disabled: PropTypes.bool, onUpdate: PropTypes.func, @@ -154,35 +154,38 @@ export default class StatusContent extends React.PureComponent { } } - _updateStatusEmojis () { - const node = this.node; - - if (!node || autoPlayGif) { + handleMouseEnter = ({ currentTarget }) => { + if (autoPlayGif) { return; } - const emojis = node.querySelectorAll('.custom-emoji'); + const emojis = currentTarget.querySelectorAll('.custom-emoji'); for (var i = 0; i < emojis.length; i++) { let emoji = emojis[i]; - if (emoji.classList.contains('status-emoji')) { - continue; - } - emoji.classList.add('status-emoji'); + emoji.src = emoji.getAttribute('data-original'); + } + } - emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false); - emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false); + handleMouseLeave = ({ currentTarget }) => { + if (autoPlayGif) { + return; + } + + const emojis = currentTarget.querySelectorAll('.custom-emoji'); + + for (var i = 0; i < emojis.length; i++) { + let emoji = emojis[i]; + emoji.src = emoji.getAttribute('data-static'); } } componentDidMount () { this._updateStatusLinks(); - this._updateStatusEmojis(); } componentDidUpdate () { this._updateStatusLinks(); - this._updateStatusEmojis(); if (this.props.onUpdate) this.props.onUpdate(); } @@ -194,7 +197,7 @@ export default class StatusContent extends React.PureComponent { onMentionClick = (mention, e) => { if (this.props.parseClick) { - this.props.parseClick(e, `/accounts/${mention.get('id')}`); + this.props.parseClick(e, `/@${mention.get('acct')}`); } } @@ -202,18 +205,10 @@ export default class StatusContent extends React.PureComponent { hashtag = hashtag.replace(/^#/, ''); if (this.props.parseClick) { - this.props.parseClick(e, `/timelines/tag/${hashtag}`); + this.props.parseClick(e, `/tags/${hashtag}`); } } - handleEmojiMouseEnter = ({ target }) => { - target.src = target.getAttribute('data-original'); - } - - handleEmojiMouseLeave = ({ target }) => { - target.src = target.getAttribute('data-static'); - } - handleMouseDown = (e) => { this.startXY = [e.clientX, e.clientY]; } @@ -229,8 +224,8 @@ export default class StatusContent extends React.PureComponent { const [ deltaX, deltaY ] = [Math.abs(e.clientX - startX), Math.abs(e.clientY - startY)]; let element = e.target; - while (element) { - if (['button', 'video', 'a', 'label', 'canvas'].includes(element.localName)) { + while (element !== e.currentTarget) { + if (['button', 'video', 'a', 'label', 'canvas'].includes(element.localName) || element.getAttribute('role') === 'button') { return; } element = element.parentNode; @@ -253,10 +248,6 @@ export default class StatusContent extends React.PureComponent { } } - setRef = (c) => { - this.node = c; - } - setContentsRef = (c) => { this.contentsNode = c; } @@ -265,7 +256,7 @@ export default class StatusContent extends React.PureComponent { const { status, media, - mediaIcon, + mediaIcons, parseClick, disabled, tagLinks, @@ -286,7 +277,7 @@ export default class StatusContent extends React.PureComponent { const mentionLinks = status.get('mentions').map(item => ( )).reduce((aggregate, item) => [...aggregate, item, ' '], []); - const toggleText = hidden ? [ - , - mediaIcon ? ( -
-

Kérhetsz mentést minden tárolt adatodról, tülködről, média fájlodról, profil- és háttér képedről.

+

Kérhetsz mentést minden tárolt adatodról, bejegyzésedről, média fájlodról, profil- és háttér képedről.

Bármikor visszaállíthatatlanul le is törölheted a fiókodat.

@@ -1299,7 +1394,7 @@ hu:

Igen. A sütik pici állományok, melyeket az oldalunk a böngésződön keresztül a háttértáradra rak, ha engedélyezed ezt. Ezek a sütik teszik lehetővé, hogy az oldalunk felismerje a böngésződet, és ha regisztráltál, hozzá tudjon kötni a fiókodhoz.

-

Arra is használjuk a sütiket, hogy elmenthessük a beállításaidat egy következő látogatás céljából.

+

Arra is használjuk a sütiket, hogy elmenthessük a beállításaidat egy következő látogatás alkalmára.


@@ -1307,9 +1402,9 @@ hu:

Az azonosításodra alkalmazható adatokat nem adjuk el, nem kereskedünk vele, nem adjuk át külső szereplőnek. Ez nem foglalja magában azon harmadik személyeket, aki az üzemeltetésben, felhasználók kiszolgálásban és a tevékenységünkben segítenek, de csak addig, amíg ők is elfogadják, hogy ezeket az adatokat bizalmasan kezelik. Akkor is átadhatjuk ezeket az adatokat, ha erre hitünk szerint törvény kötelez minket, ha betartatjuk az oldalunk szabályzatát vagy megvédjük a saját vagy mások személyiségi jogait, tulajdonát, biztonságát.

-

A nyilvános tartalmaidat más hálózatban lévő szerverek letölthetik. A nyilvános és csak követőknek szánt tülkjeid olyan szerverekre is elküldődnek, melyeken követőid vannak. A közvetlen üzenetek is átkerülnek a címzettek szervereire, ha ők más szerveren regisztráltak.

+

A nyilvános tartalmaidat más hálózatban lévő szerverek letölthetik. A nyilvános és csak követőknek szánt bejegyzéseid olyan szerverekre is elküldődnek, melyeken követőid vannak. A közvetlen üzenetek is átkerülnek a címzettek szervereire, ha ők más szerveren regisztráltak.

-

Ha felhatalmazol egy alkalmazást, hogy használja a fiókodat, a jóváhagyott hatásköröktől függően ez elérheti a nyilvános profiladataidat, a követettjeid listáját, a követőidet, listáidat, tülkjeidet és kedvenceidet is. Ezek az alkalmazások ugyanakkor sosem érhetik el a jelszavadat és e-mail címedet.

+

Ha felhatalmazol egy alkalmazást, hogy használja a fiókodat, a jóváhagyott hatásköröktől függően ez elérheti a nyilvános profiladataidat, a követettjeid listáját, a követőidet, listáidat, bejegyzéseidet és kedvenceidet is. Ezek az alkalmazások ugyanakkor sosem érhetik el a jelszavadat és e-mail címedet.


@@ -1368,47 +1463,44 @@ hu: warning: explanation: disable: A fiókod befagyasztott állapotban megtartja minden adatát, de feloldásig nem csinálhatsz vele semmit. - sensitive: A feltöltött és hivatkozott médiatartalmaidat szenzitívként kezeljük. - silence: A fiókod korlátozott állapotában csak a követőid láthatják a tülkjeidet, valamint nem kerülsz rá nyilvános idővonalakra. Ugyanakkor mások manuálisan még követhetnek. - suspend: A fiókodat felfüggesztették, így minden tülköd és feltöltött fájlod menthetetlenül elveszett erről a szerverről és minden olyanról is, ahol voltak követőid. + sensitive: A feltöltött és hivatkozott médiatartalmaidat kényesként kezeljük. + silence: A fiókodat így is használhatod, de csak a követőid láthatják a bejegyzéseidet ezen a szerveren, valamint kimaradhatsz a nyilvános idővonalakról is. Ugyanakkor ettől még mások manuálisan bekövethetnek. + suspend: Többé nem használhatod a fiókodat, a profilod és más adataid többé nem elérhetőek. Még be tudsz jelentkezni, hogy lementsd az adataidat addig, amíg azokat teljesen le nem töröljük, bár néhány adatot megtartunk, hogy a jövőben ne tudd elkerülni a felfüggesztést. get_in_touch: Válaszolhatsz erre az emailre, hogy kapcsolatba lépj a %{instance} csapatával. review_server_policies: Szerver szabályzat átnézése statuses: 'Különösen hozzá:' subject: disable: A fiókodat %{acct} befagyasztották none: Figyelmeztetés a %{acct} fióknak - sensitive: A %{acct} fiókod médiatartalmait szenzitívnek jelölték + sensitive: A %{acct} fiókod médiatartalmait kényesnek jelölték silence: A fiókodat %{acct} korlátozták suspend: A fiókodat %{acct} felfüggesztették title: disable: Befagyasztott fiók none: Figyelem - sensitive: Médiatartalmadat szenzitívnek jelölték + sensitive: Médiatartalmadat kényesnek jelölték silence: Lekorlátozott fiók suspend: Felfüggesztett fiók welcome: edit_profile_action: Készítsd el profilod - edit_profile_step: 'Itt tudod egyedivé tenni a profilod: feltölthetsz profil- és borítóképet, megváltoztathatod a megjelenített neved és így tovább. Ha jóvá szeretnéd hagyni követőidet, mielőtt láthatják a tülkjeid, itt tudod a fiókodat zárttá tenni.' + edit_profile_step: 'Itt tudod egyedivé tenni a profilod: feltölthetsz profil- és borítóképet, megváltoztathatod a megjelenített neved és így tovább. Ha jóvá szeretnéd hagyni követőidet, mielőtt követhetnek, itt tudod a fiókodat zárttá tenni.' explanation: Néhány tipp a kezdeti lépésekhez - final_action: Kezdj tülkölni - final_step: 'Kezdj tülkölni! Publikus üzeneteid még követők híján is megjelennek másoknak, például a helyi idővonalon és a hashtageknél. Kezdd például azzal, hogy bemutatkozol: használd a #bemutatkozas vagy az #introductions hashtaget a tülködben.' + final_action: Kezdj bejegyzéseket írni + final_step: 'Kezdj tülkölni! Nyilvános üzeneteid még követők híján is megjelennek másoknak, például a helyi idővonalon és a hashtageknél. Kezdd azzal, hogy bemutatkozol a #bemutatkozas vagy az #introductions hashtag használatával.' full_handle: Teljes felhasználóneved full_handle_hint: Ez az, amit megadhatsz másoknak, hogy üzenhessenek neked vagy követhessenek téged más szerverekről. review_preferences_action: Beállítások módosítása - review_preferences_step: Tekintsd át beállításaidat, például hogy milyen értesítéseket kérsz e-mailben vagy hogy alapértelmezettként mi legyen a tülkjeid láthatósága. Ha nem vagy szédülős alkat, azt is engedélyezheted, hogy automatikusan lejátsszuk a GIF-eket. + review_preferences_step: Tekintsd át a beállításaidat, például hogy milyen értesítéseket kérsz e-mailben, vagy hogy alapértelmezettként mi legyen a bejegyzéseid láthatósága. Ha nem vagy szédülős alkat, GIF-ek automatikus lejátszását is engedélyezheted. subject: Üdvözöl a Mastodon - tip_federated_timeline: A nyilvános idővonal a Mastodon ütőere, ahol minden tülkölés összefolyik. Nem teljes ugyan, mert csak azokat az embereket fogod látni, akiket a szervered többi felhasználója közül valaki követ. + tip_federated_timeline: A föderációs idővonal a Mastodon hálózat ütőere. Nem teljes, mivel csak azokat az embereket fogod látni, akiket a szervered többi felhasználója közül valaki már követ. tip_following: Alapértelmezettként szervered adminisztrátorait követed. Látogasd meg a helyi és a nyilvános idővonalat, hogy más érdekes emberekre is rátalálj. tip_local_timeline: A helyi idővonal a saját szervered (%{instance}) ütőere. Ezek a kedves emberek itt mind a szomszédaid! tip_mobile_webapp: Ha a böngésződ lehetővé teszi, hogy a kezdőképernyődhöz add a Mastodont, még értesítéseket is fogsz kapni, akárcsak egy igazi alkalmazás esetében! tips: Tippek title: Üdv a fedélzeten, %{name}! users: - blocked_email_provider: Ez az email szolgáltató nem engedélyezett follow_limit_reached: Nem követhetsz több, mint %{limit} embert generic_access_help_html: Nem tudod elérni a fiókodat? Segítségért lépj kapcsolatba velünk ezen %{email} - invalid_email: A megadott e-mail cím helytelen - invalid_email_mx: Az email cím nem tűnik létezőnek invalid_otp_token: Érvénytelen ellenőrző kód invalid_sign_in_token: Érvénytelen biztonsági kód otp_lost_help_html: Ha mindkettőt elvesztetted, kérhetsz segítséget itt %{email} diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 0cfae56efd..fb9df01560 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -1,7 +1,7 @@ --- hy: about: - about_hashtag_html: Սրանք #%{hashtag} հեշթեգով հանրային թթերն են։ Կարող եք փոխգործակցել դրանց հետ եթե ունեք որեւէ հաշիու դաշտեզերքում։ + about_hashtag_html: Սրանք #%{hashtag} հեշթեգով հանրային հրապարակումներն են։ Կարող էք փոխգործակցել դրանց հետ եթե ունէք որեւէ հաշիւ դաշտեզերքում։ about_mastodon_html: Ապագայի սոցցանցը։ Ոչ մի գովազդ, ոչ մի կորպորատիվ վերահսկողութիւն, էթիկական դիզայն, եւ ապակենտրոնացում։ Մաստադոնում դու ես քո տուեալների տէրը։ about_this: Մեր մասին active_count_after: ակտիվ @@ -18,15 +18,15 @@ hy: contact_unavailable: Ոչինչ չկա discover_users: Գտնել օգտատերներ documentation: Փաստաթղթեր - federation_hint_html: "%{instance} հանգոյցում հաշիւ բացելով կարող ես հետեւել այլ մարդկանց Մաստադոնի ցանկացած հանգոյցից և ոչ միայն։" + federation_hint_html: "«%{instance}»-ում հաշիւ բացելով դու կը կարողանաք հետեւել մարդկանց Մաստադոնի ցանկացած հանգոյցից և ոչ միայն։" get_apps: Փորձեք բջջային հավելվածը hosted_on: Մաստոդոնը տեղակայուած է %{domain}ում - instance_actor_flash: 'Այս հաշիւ վիրտուալ դերասան է, օգտագործուում է սպասարկիչը, այլ ոչ անհատ օգտատիրոջը ներկայացնելու, համար։ Օգտագործուում է ֆեդերացիայի նպատակով, ու չպէտք է արգելափակուի, եթէ չէք ցանկանում արգելափակել ողջ հանգոյցը, որի դէպքում պէտք է օգտագործէք տիրոյթի արգելափակումը։ - -' + instance_actor_flash: "Այս հաշիւ վիրտուալ դերասան է, օգտագործուում է սպասարկիչը, այլ ոչ անհատ օգտատիրոջը ներկայացնելու, համար։ Օգտագործուում է ֆեդերացիայի նպատակով, ու չպէտք է արգելափակուի, եթէ չէք ցանկանում արգելափակել ողջ հանգոյցը, որի դէպքում պէտք է օգտագործէք տիրոյթի արգելափակումը։ \n" learn_more: Իմանալ ավելին privacy_policy: Գաղտնիության քաղաքականություն - see_whats_happening: Տես ինչ ա կատարվում + rules: Սերուերի կանոնները + rules_html: Այս սերուերում հաշիւ ունենալու համար անհրաժեշտ է պահպանել ստորեւ նշուած կանոնները։ + see_whats_happening: Տես ինչ կը կատարուի server_stats: Սերվերի վիճակը․ source_code: Ելատեքստ status_count_after: @@ -62,7 +62,7 @@ hy: following: Հետևում եք instance_actor_flash: Այս հաշիւը վիրտուալ դերասան է, որը ներկայացնում է հանգոյցը, եւ ոչ որեւէ անհատ օգտատիրոջ։ Այն օգտագործուում է ֆեդերացիայի նպատակներով եւ չպէտք է կասեցուի։ joined: Միացել են %{date} - last_active: վերջին թութը + last_active: վերջին այցը link_verified_on: Սոյն յղման տիրապետումը ստուգուած է՝ %{date}֊ին media: Մեդիա moved_html: "%{name} տեղափոխուել է %{new_profile_link}" @@ -74,11 +74,10 @@ hy: pin_errors: following: Դու պէտք է հետեւես մարդուն, որին ցանկանում ես խրախուսել posts: - one: Թութ - other: Թութերից - posts_tab_heading: Թթեր - posts_with_replies: Թթեր եւ պատասխաններ - reserved_username: Ծածկանունն արդէն վերցուած է + one: Գրառում + other: Գրառումներ + posts_tab_heading: Գրառումներ + posts_with_replies: Գրառումներ եւ պատասխաններ roles: admin: Ադմինիստրատոր bot: Բոտ @@ -112,7 +111,7 @@ hy: title: Փոխել էլ․ փոստը %{username}ի համար confirm: Հաստատել confirmed: Հաստատված է - confirming: Հաստատում + confirming: Հաստատման սպասող delete: Ջնջել տվյալները deleted: Ջնջված է demote: Աստիճանազրկել @@ -190,6 +189,10 @@ hy: search: Որոնել search_same_email_domain: Այլ օգտատէրեր նոյն էլ․ փոստի դոմէյնով search_same_ip: Այլ օգտատէրեր նոյն IP֊ով + security_measures: + only_password: Միայն ծածկագիր + password_and_2fa: Ծածկագիր եւ 2FA + password_and_sign_in_token: ծածկագիր եւ էլ. նամակով բանալի sensitive: Զգայուն sensitized: նշուեց որպէս դիւրազգաց shared_inbox_url: Ընդհանուր մուտքային URL @@ -259,47 +262,6 @@ hy: update_custom_emoji: Թարմացնել սեփական էմոջիները update_domain_block: Թարմացնել տիրոյթի արգելափակումը update_status: Թարմացնել գրառումը - actions: - assigned_to_self_report: "%{name} բողոքել է %{target} իրենց համար" - change_email_user: "%{name} փոփոխել է %{target} օգտատիրոջ էլ․ հասցէն" - confirm_user: "%{name} հաստատել է %{target} օգտատիրոջ էլ․ հասցէն" - create_account_warning: "%{name} զգուշացրել է %{target}ին" - create_announcement: "%{name} ստեղծեց նոր յայտարարութիւն %{target}" - create_custom_emoji: "%{name} վերբեռնել է նոր էմոջի՝ %{target}" - create_domain_allow: "%{name} թոյլատրել ֆեդերացիան %{target} տիրոյթի հետ" - create_domain_block: "%{name} արգելափակեց %{target} տիրոյթը" - create_email_domain_block: "%{name} արգելափակեց էլ․ փոստի տիրոյթ %{target}" - create_ip_block: "%{name} ստեղծեց կանոն %{target} IP֊ի համար" - demote_user: "%{name} աստիճանազրկեց օգտատիրոջ %{target}" - destroy_announcement: "%{name} ջնջեց յայտարարութիւն %{target}" - destroy_custom_emoji: "%{name} ջնջել է %{target} էմոջին" - destroy_domain_allow: "%{name} չթոյլատրեց ֆեդերացիան %{target} տիրոյթի հետ" - destroy_domain_block: "%{name} ապաարգելափակեց տիրոյթ %{target}" - destroy_email_domain_block: "%{name} ապաարգելափակեց էլ․ փոստի տիրոյթ %{target}" - destroy_ip_block: "%{name} ջնջեց կանոնը %{target} IP֊ի համար" - destroy_status: "%{name} ջնջեց %{target}ի գրառում" - disable_2fa_user: "%{name}ը կասեցրեց 2F պահանջը %{target} օգտատիրոջ համար" - disable_custom_emoji: "%{name} ապակտիւացրել է %{target} էմոջին" - disable_user: "%{name} անջատել է մուտքը %{target} օգտատիրոջ համար" - enable_custom_emoji: "%{name} ակտիվացրել է %{target} էմոջին" - enable_user: "%{name} թոյլատրեց մուտք %{target} օգտատիրոջ համար" - memorialize_account: "%{name} դարձրեց %{target}ի հաշիւը յիշատակի էջ" - promote_user: "%{name} աջակցեց օգտատիրոջը %{target}" - remove_avatar_user: "%{name} հեռացրեց %{target}ի աւատարը" - reopen_report: "%{name} վերաբացեց բողոք %{target}" - reset_password_user: "%{name} վերականգնեց օգտատիրոջ գաղտնաբառը %{target}" - resolve_report: "%{name} լուծարեց բողոքը %{target}" - sensitive_account: "%{name}ը նշեց %{target}ի մեդիան որպէս զգայուն" - silence_account: "%{name} լռեցրեց %{target}ի հաշիւը" - suspend_account: "%{name} լռեցրեց %{target}ի հաշիւը" - unassigned_report: "%{name} չսահմանուած բողոք %{target}" - unsensitive_account: "%{name}ը հեռացրեց %{target}֊ի մեդիայի զգայուն նշումը" - unsilence_account: "%{name}֊ը հանեց լռեցումը %{target}֊ի հաշուից" - unsuspend_account: "%{name}ը ապակասեցրեց %{target}ի հաշիւը" - update_announcement: "%{name}ը թարմացրեց %{target}ի յայտարարութիւնը" - update_custom_emoji: "%{name} թարմացրել է %{target} էմոջին" - update_domain_block: "%{name}ը թարմացրեց %{target}ի տիրոյթի արգելափակումը" - update_status: "%{name}ը թարմացրեց %{target}ի կարգավիճակը" deleted_status: "(ջնջուած գրառում)" empty: Ոչ մի գրառում չկայ։ filter_by_action: Զտել ըստ գործողութեան @@ -314,10 +276,12 @@ hy: new: create: Ստեղծել յայտարարութիւն title: Նոր յայտարարութիւն + publish: Հրապարակել published_msg: Յայտարարութիւնը բարեյաջող հրապարակուեց scheduled_for: Պլանաւորուած է %{time}ին scheduled_msg: Յայտարարութիւնը նախապատրաստուեց հրապարակման title: Յայտարարութիւններ + unpublish: Ապահրապարակել unpublished_msg: Յայտարարութիւնը բարեյաջող ապահրապարակուեց updated_msg: Յայտարարութիւնը բարեյաջող թարմացուեց custom_emojis: @@ -354,32 +318,9 @@ hy: updated_msg: Էմոջին թարմացուեց upload: Վերբեռնել dashboard: - authorized_fetch_mode: Անվտանգ եղանակ - config: Կարգաւորում - feature_deletions: Հաշուի հեռացումներ - feature_invites: Հրաւէրի յղումներ - feature_profile_directory: Օգտատիրոջ մատեան - feature_registrations: Գրանցումներ - feature_relay: Ֆեդերացիայի շերտ - feature_spam_check: Հակա-սպամ - feature_timeline_preview: Հոսքի նախադիտում - features: Յատկանիշներ - hidden_service: Ֆեդերացիա թաքնուած ծառայութիւնների հետ - open_reports: բաց բողոքներ - pending_tags: պիտակներն սպասում են վերանայման - pending_users: օգտատէրերն սպասում են վերանայման - recent_users: Վերջին օգտատէրերը - search: Տեքստային որոնում - single_user_mode: Մէկ օգտատիրոջ ռեժիմ software: Ծրագրային ապահովում space: Տարածքի օգտագործում title: Գործիքների վահանակ - total_users: ընդհանուր օգտատէրեր - trends: Թրենդներ - week_interactions: շաբաթուայ գործողութիւններ - week_users_active: շաբաթուայ ակտիւութիւն - week_users_new: շաբաթուայ օգտատէրեր - whitelist_mode: Սահմանափակ ֆեդերացիայի ռեժիմ domain_allows: add_new: Թոյլատրել ֆեդերացիա տիրոյթի հետ created_msg: Տիրոյթը յաջողութեամբ թոյլատրուեց ֆեդերացուելու @@ -423,8 +364,18 @@ hy: create: Ավելացնել դոմեն title: Արգելափակել էլ․ փոստի նոր տիրոյթ title: էլ․ փոստի արգելափակուած տիրոյթներ + follow_recommendations: + language: Լեզուի համար + status: Կարգավիճակ instances: + back_to_all: Բոլորը + back_to_limited: Սահամանփակ + back_to_warning: Զգուշացում by_domain: Դոմեն + delivery: + all: Բոլորը + unavailable: Անհասանելի է + warning: Զգուշացում empty: Դոմեյնները չեն գտնուել known_accounts: one: "%{count} յայտնի հաշիւ" @@ -507,6 +458,12 @@ hy: unassign: Չնշանակել unresolved: Չլուծուած updated_at: Թարմացուած + rules: + add_new: Աւելացնել կանոն + delete: Ջնջել + edit: Խմբագրել կանոնը + empty: Սերուերի կանոնները դեռեւս սահմանուած չեն։ + title: Սերուերի կանոնները settings: contact_information: email: Գործնական էլփոստ @@ -547,6 +504,7 @@ hy: title: Կայքի հակիրճ նկարագրութիւն site_terms: desc_html: Դու կարող ես գրել քո սեփական գաղտնիութեան քաղաքականութիւնը, օգտագործման պայմանները եւ այլ կանոններ։ Կարող ես օգտագործել HTML թեգեր + title: Սեփական օգտագործման կանոնները site_title: Սպասարկչի անուն thumbnail: title: Հանգոյցի նկարը @@ -560,6 +518,7 @@ hy: back_to_account: Վերադառնալ անձնական էջ batch: delete: Ջնջել + nsfw_off: Նշել որպէս ոչ դիւրազգաց nsfw_on: Նշել որպէս դիւրազգաց deleted: Ջնջված է failed_to_execute: Կատարումը ձախողուեց @@ -569,7 +528,6 @@ hy: title: Օգտատիրոջ գրառումները with_media: Մեդիայի հետ tags: - context: Համատեքստ last_active: Վերջին ակտիւութիւնը most_popular: Ամէնայայտնի most_recent: Վերջին @@ -595,33 +553,33 @@ hy: discovery: Բացայայտում localization: body: Մաստոդոնը թարգմանուում է կամաւորների կողմից։ - guide_link: https://crowdin.com/project/mastodon guide_link_text: Աջակցել կարող են բոլորը։ sensitive_content: Զգայուն բովանդակութիւն application_mailer: - salutation: "%{name}," + notification_preferences: Փոխել փոստային կարգաւորումները + salutation: "%{name}" view: Նայել․ view_profile: Նայել անձնական էջը view_status: Նայել գրառումը applications: invalid_url: Տրամադրուած URL անվաւեր է + regenerate_token: Ստեղծել նոր հասանելիութեան կտրոն your_token: Քո մուտքի բանալին auth: apply_for_account: Հրաւէրի հարցում change_password: Գաղտնաբառ - checkbox_agreement_html: Ես համաձայն եմ սպասարկչի կայանքներին և ծառայությունների պայմաններին + checkbox_agreement_html: Ես համաձայն եմ սպասարկիչի կանոններին և ծառայութեան պայմաններին checkbox_agreement_without_rules_html: Ես համաձայն եմ ծառայությունների պայմաններին delete_account: Ջնջել հաշիվը description: prefix_sign_up: Գրանցուի՛ր Մաստոդոնում հենց այսօր + didnt_get_confirmation: Չե՞ս ստացել հաստատման ուղեցոյց։ + dont_have_your_security_key: Չունե՞ս անվտանգութեան բանալի։ forgot_password: Մոռացե՞լ ես գաղտնաբառդ login: Մտնել logout: Դուրս գալ migrate_account: Տեղափոխուել այլ հաշիւ or_log_in_with: Կամ մուտք գործել օգտագործելով՝ - providers: - cas: CAS - saml: SAML register: Գրանցվել registration_closed: "%{instance}ը չի ընդունում նոր անդամներ" reset_password: Վերականգնել գաղտանաբառը @@ -632,8 +590,12 @@ hy: status: account_status: Հաշուի կարգավիճակ pending: Դիմումը պէտք է քննուի մեր անձնակազմի կողմից, ինչը կարող է մի փոքր ժամանակ խլել։ Դիմումի հաստատուելու դէպքում, կտեղեկացնենք նամակով։ + trouble_logging_in: Մուտք գործելու խնդիրնե՞ր կան։ authorize_follow: + already_following: Դու արդէն հետեւում ես այս հաշուին + already_requested: Դու արդէն ուղարկել ես հետեւմանն յայտ այս հաշուին follow: Հետևել + follow_request: Դու ուղարկել ես հետեւելու հայց՝ following: Յաջողութի՜ւն։ Դու այժմ հետեւում ես․ post_follow: close: Կամ, կարող ես պարզապէս փակել այս պատուհանը։ @@ -669,11 +631,15 @@ hy: deletes: challenge_not_passed: Մուտքագրուած տեղեկութիւնը ստոյգ չէ confirm_password: Նոյնականացման համար մուտքագրիր ծածկագիրդ + confirm_username: Մուտքագրիր օգտանունդ գործողութիւնը հաստատելու համար proceed: Ջնջել հաշիվը success_msg: Հաշիւդ բարեյաջող ջնջուեց + warning: + username_available: Քո օգտանունը կրկին հասանելի կը դառնայ directories: directory: Հաշուի մատեան - explore_mastodon: Բացայայտել %{title} + explanation: Բացայայտիր մարդկանց ըստ նրանց հետաքրքրութիւնների + explore_mastodon: Ուսումնասիրիր «%{title}»-ը domain_validator: invalid_domain: անվաւէր տիրոյթի անուն errors: @@ -698,7 +664,6 @@ hy: size: Չափը blocks: Արգելափակել bookmarks: Էջանիշեր - csv: CSV domain_blocks: Տիրոյթի արգելափակումներ lists: Ցանկեր mutes: Լռեցրել ես @@ -716,6 +681,7 @@ hy: title: Խմբագրել զտիչը index: delete: Ջնջել + empty: Դու ֆիլտրեր չունես։ title: Ֆիլտրեր new: title: Ավելացնել ֆիլտր @@ -738,7 +704,7 @@ hy: i_am_html: Ես %{username}ն եմ %{service}ում։ identity: Ինքնութիւն inactive: Ոչ ակտիւ - publicize_checkbox: Թթել սա․ + publicize_checkbox: Հրապարակել սա՝ publicize_toot: 'Ապացուցուա՜ծ է․ Ես%{username} եմ %{service}ում․ %{url} ' remove: Հաշուից հեռացնել ապացոյցը removed: Ապացոյցը բարեյաջող հեռացուեց հաշուից @@ -755,6 +721,7 @@ hy: bookmarks: Էջանիշեր domain_blocking: Տիրոյթի արգելափակումների ցուցակ following: Հետեւումների ցանկ + muting: Լռեցման ցանկ upload: Վերբեռնել invites: delete: Ապաակտիւացնել @@ -768,6 +735,7 @@ hy: '86400': 1 օր expires_in_prompt: Երբեք generate: Գեներացնել հրաւէրի յղում + invited_by: Ձեզ հրաւիրել է՝ max_uses: one: "%{count} կիրառում" other: "%{count} կիրառում" @@ -776,34 +744,57 @@ hy: expires_at: Սպառւում է uses: Կիրառում title: Հրաւիրել մարդկանց + login_activities: + authentication_methods: + otp: երկքայլ նոյնականացման յաւելուած + password: գաղտնաբառ media_attachments: validations: too_many: 4-ից աւել ֆայլ չի կարող կցուել migrations: acct: Տեղափոխել դեպի + cancel: Չեղարկել վերահասցեաորումը errors: + move_to_self: չի կարող լինել ներկայիս հաշիւը not_found: չգտնուեց past_migrations: Նախոդ միգրացիաները proceed_with_move: Տեղափոխել հետեւորդներին redirecting_to: Քո հաշիւը վերահասցեաորում է %{acct}-ին warning: followers: Այս քայլով քո բոլոր հետեւորդներին այս հաշուից կը տեղափոխես դէպի նորը + only_redirect_html: Որպէս այլընտրանք, կարող ես ուղղակի վերահասցէաւորել քո հաշիւը + other_data: Մնացեալ տուեալները ինքնուրոյն չեն փոխադրուի moderation: title: Մոդերացիա notification_mailer: digest: + action: Դիտել բոլոր ծանուցումները title: Երբ բացակայ էիր... favourite: + body: Քո գրառումը հաւանել է %{name}-ը։ + subject: "%{name} հաւանեց գրառումդ" title: Նոր հաւանում follow: body: "%{name}ը հետեւում է քեզ!" subject: "%{name}ը հետեւում է քեզ" title: Նոր հետևորդներ follow_request: + action: Կառավարել հետեւելու հայցերը + subject: "%{name} ցանկանում է հետեւել ձեզ" title: Նոր հետեւելու հայցեր mention: action: Պատասխանել + body: "%{name} յիշատակել է ձեզ գրառման մէջ՝" + subject: Ձեզ յիշատակել է %{name} + title: Նոր յիշատակում + reblog: + body: Քո գրառումը տարածել է %{name}-ը։ + subject: "%{name} տարածեց գրառումդ" + title: Նոր տարածում + status: + subject: "%{name}-ը հենց նոր գրառում արեց" notifications: + email_events_hint: Ընտրիր իրադարձութիւնները, որոնց վերաբերեալ ցանկանում ես ստանալ ծանուցումներ․ other_settings: Ծանուցումների այլ կարգաւորումներ number: human: @@ -816,6 +807,8 @@ hy: thousand: Հազ trillion: Տրլ otp_authentication: + code_hint: Մուտքագրիր քո նոյնականացման յաւելուածով գեներացուած կոդը՝ հաստատման համար + description_html: Եթէ միացնես 2F նոյնականացումը՝ օգտագործելով նոյնականացնող յաւելուած, մուտք գործելիս կը պահանջուի հեռախօս, որով կը ստեղծես մուտքագրման կտրոններ։ enable: Միացնել setup: Կարգաւորել pagination: @@ -823,17 +816,25 @@ hy: next: Հաջորդ older: Ավելի հին prev: Նախորդ - truncate: "…" polls: errors: + already_voted: Դու արդէն մասնակցել ես այս հարցմանը + duplicate_options: պարունակում է կրկնուող ընտրանքներ duration_too_short: շատ կարճ է + expired: Հարցումն արդէն աւարտուել է + too_few_options: ընտրանքները պէտք է լինեն մէկից աւել + too_many_options: չի կարող պարունակել աւելի քան %{max} ընտրանք preferences: other: Այլ posting_defaults: Կանխադիր կարգաւորումներ public_timelines: Հանրային հոսք + reactions: + errors: + unrecognized_emoji: ճանաչուած էմոջի չէ relationships: activity: Հաշուի ակտիւութիւնը dormant: Չգօրծող + follow_selected_followers: Հետեւել նշուած հետեւորդներին followers: Հետեւորդներ following: Հետեւում ես invited: Հրաւիրուած է @@ -845,11 +846,15 @@ hy: relationship: Կապ remove_selected_domains: Հեռացնել բոլոր հետեւորդներին նշուած դոմեյններից remove_selected_followers: Հեռացնել նշուած հետեւորդներին + remove_selected_follows: Ապահետեւել նշուած օգտատէրերին status: Հաշուի կարգավիճակ + remote_follow: + acct: Մուտքագրիր քո օգտանուն@տիրոյթ, որի անունից ցանկանում ես գործել + prompt: Դու պատրաստուում ես հետևել՝ scheduled_statuses: too_soon: Նախադրուած ամսաթիւը պէտք է լինի ապագայում sessions: - activity: Վերջին թութը + activity: Վերջին Ակտիւութիւնը browser: Դիտարկիչ browsers: alipay: Alipay @@ -869,13 +874,14 @@ hy: safari: Safari uc_browser: UCBrowser weibo: Weibo + current_session: Ընթացիկ սեսսիա description: "%{browser}, %{platform}" ip: IP platforms: adobe_air: Adobe Air android: Անդրոիդ blackberry: Blackberry - chrome_os: ChromeOS + chrome_os: Chrome OS firefox_os: Firefox OS ios: iOS linux: Լինուքս @@ -890,6 +896,7 @@ hy: account: Հաշիվ account_settings: Հաշուի կարգաւորումներ appearance: Տեսք + authorized_apps: Լիազօրուած յաւելուածներ back: Ետ գնալ մաստադոն delete: Հաշուի ջնջում development: Ծրագրավորում @@ -917,6 +924,7 @@ hy: video: one: "%{count} վիդեո" other: "%{count} վիդեո" + content_warning: Նախազգուշացում։ %{warning} language_detection: Ինքնուրոյն ճանաչել լեզուն open_in_web: Բացել վէբում over_character_limit: "%{max} նիշի սահմանը գերազանցուած է" @@ -929,18 +937,31 @@ hy: other: "%{count} ձայներ" vote: Քուէարկել show_more: Աւելին + show_newer: Ցուցադրել նորերը + show_older: Ցուցադրել հները show_thread: Բացել շղթան sign_in_to_participate: Մուտք գործէք՝ զրոյցին միանալու համար title: '%{name}: "%{quote}"' visibilities: + direct: Հասցէագրուած private: Միայն հետեւողներին private_long: Հասանելի միայն հետեւորդներին public: Հրապարակային public_long: Տեսանելի բոլորին unlisted: Ծածուկ unlisted_long: Տեսանելի է բոլորին, բայց չի յայտնւում հանրային հոսքերում + statuses_cleanup: + exceptions: Բացառություններ + min_age: + '1209600': 2 շաբաթ + '15778476': 6 ամիս + '2629746': 1 ամիս + '31556952': 1 տարի + '5259492': 2 ամիս + '63113904': 2 տարի + '7889238': 3 ամիս stream_entries: - pinned: Ամրացուած թութ + pinned: Ամրացուած գրառում reblogged: տարածուած sensitive_content: Կասկածելի բովանդակութիւն terms: @@ -950,29 +971,29 @@ hy:

Ինչ անձնական տեղեկութիւններ ենք մենք հաւաքում

    -
  • Առաջնային հաւաքվող տւալներ: Եթե դուք գրանցվեք էք այս սերւերում, ձեզանից կարող են պահանջել մուտքագրել օգտուողի անուն, էլփոստի հասցէ և գաղտնաբառ։ Դուք կարող էք նաև մուտքագրել հավելյալ տվյալներ, ինչպիսիք են օրինակ՝ ցուցադրուող անունը եւ կենսագրութիւնը, նաև վերբեռնել գլխանկար և ետնանակար։ Օգտուողի անունը, կենսագրութիւնը, գլխանկարը և ետնանկարը համարվում են հանրային տեղեկատուութիւն։
  • -
  • Գրառումները, հետեւումները և այլ հանրային տեղեկատուութիւնը։ : Ձեր հետևած մարդկանց ցուցակը ներկայացուած է հանրայնորեն, նոյնը ճշմարիտ է նաև հետևորդների համար։ Երբ դուք ուղարկում եք հաղորդագրութիւն, հաղորդագրութեան ուղարկման ամսաթիւը և ժամանակը, ինչպէս նաև հավելվածը որից այն ուղարկուել է, պահւում է։ Հաղորդագրութիւնները կարող են պարունակել մեդիա կցումներ, ինչպիսիք են նկարները և տեսանիւթերը։ Հանրային և ծածուկ գրառումները հանրայնորեն հասանելի են։ Անձնական էջում կցուած գրառումները նույնպես հանրայնորեն հասանելի տեղեկատուութիւն է։ Ձեր գրառումները ուղարկւում են ձեր հետևորդներին, ինչը նշանակում է, որ որոշ դէպքերում դրանք ուղարկւում են այլ սերվերներ և պատճեները պահւում են այնտեղ։ Երբ դուք ջնջում էք ձեր գրառումները, սա նույնպես ուղարկւում է ձեր հետևորդներին։ Մեկ այլ գրառման տարածումը կամ հաւանումը միշտ հանրային է։
  • -
  • Հասցէագրած և միայն հետևորդներին գրառումները: Բոլոր գրառումները պահւում և մշակւում են սերվերի վրայ։ Միայն հետևորդներին գրառումները ուղարկւում են միայն ձեր հետևորդներին և այն օգտատերերին ովքեր նշուած են գրառման մէջ, իսկ հասցէագրեցուած գրառումները ուղարկւում են միայն դրանում նշուած օգտատերերին։ Որոշ դէպքերում դա նշանակում է, որ այդ գրառումները ուղարկւում են այլ սերվերներ և պատճեները պահւում այնտեղ։ Մենք բարեխիղճ ջանք են գործադրում սահմանափակելու այդ գրառումների մուտքը միայն լիազօրուած անձանց, բայց այլ սերվերներ կարող են ձախողել դրա կատարումը։ Այդ պատճառով կարևոր է վերանայել այն սերվերները որին ձեր հետևորդները պատկանում են։ Դուք կարող էք կարգաւորումներից միացնել նոր հետևորդներին ինքնուրոյն ընդունելու և մերժելու ընտրանքը։ Խնդրում ենք յիշել, որ սերվերի գործարկուն և ցանկացած ստացող սերվեր կարող է դիտել այդ տեսակ հաղորդագրութիւնները, իսկ ստացողները կարող են էկրանահանել, պատճէնել և այլ կերպ վերատարածել դրանք։Մաստադոնով մի կիսվեք որևէ վտանգաւոր տեղեկատուութեամբ։
  • -
  • IP հասցէներ և այլ մետատվյալներ: Երբ դուք մուտք էք գործում, մենք պահում են ձեր մուտք գործելու IP հասցէն, ինչպէս նաև զննարկիչի տեսակը։ Կարգավորումենում հասանելի է մուտքի բոլոր սեսսիաների վերանայման և մարման հնարաւորութիւնը։ Վերջին օգտագործուած IP հասցէն պահւում է մինչև 12 ամիս ժամկէտով։ Մենք կարող ենք նաև պահել սերվերի մատեանի նիշքերը, որը պարունակում է սերվերին արուած իւրաքանչիւր հարցման IP հասցէն։
  • +
  • Առաջնային հաւաքուող տուեալներ: Եթե դուք գրանցուէք էք այս սերուերում, ձեզանից կարող են պահանջել մուտքագրել օգտուողի անուն, էլ-փոստի հասցէ և գաղտնաբառ։ Դուք կարող էք նաև մուտքագրել յաւելեալ տուեալներ, ինչպիսիք են օրինակ՝ ցուցադրուող անունը եւ կենսագրութիւնը, նաև վերբեռնել գլխանկար և ետնանակար։ Օգտուողի անունը, կենսագրութիւնը, գլխանկարը և ետնանկարը համարվում են հանրային տեղեկատուութիւն։
  • +
  • Գրառումները, հետեւումները և այլ հանրային տեղեկատուութիւնը։ Ձեր հետևած մարդկանց ցուցակը ներկայացուած է հանրայնօրէն, նոյնը ճշմարիտ է նաև հետևորդների համար։ Երբ դուք ուղարկում էք հաղորդագրութիւն, հաղորդագրութեան ուղարկման ամսաթիւը և ժամանակը, ինչպէս նաև յաւելուածը որից այն ուղարկուել է, պահւում է։ Հաղորդագրութիւնները կարող են պարունակել մեդիա կցումներ, ինչպիսիք են նկարները և տեսանիւթերը։ Հանրային և ծածուկ գրառումները հանրայնօրէն հասանելի են։ Անձնական էջում կցուած գրառումները նոյնպես հանրայնօրէն հասանելի տեղեկատուութիւն է։ Ձեր գրառումները ուղարկւում են ձեր հետևորդներին, ինչը նշանակում է, որ որոշ դէպքերում դրանք ուղարկւում են այլ սերուերներ և պատճէները պահւում են այնտեղ։ Երբ դուք ջնջում էք ձեր գրառումները, սա նոյնպէս ուղարկւում է ձեր հետևորդներին։ Մէկ այլ գրառման տարածումը կամ հաւանումը միշտ հանրային է։
  • +
  • Հասցէագրած և միայն հետևորդներին գրառումները: Բոլոր գրառումները պահւում և մշակւում են սերուերի վրայ։ Միայն հետևորդներին գրառումները ուղարկւում են միայն ձեր հետևորդներին և այն օգտատէրերին ովքեր նշուած են գրառման մէջ, իսկ հասցէագրեցուած գրառումները ուղարկւում են միայն դրանում նշուած օգտատէրերին։ Որոշ դէպքերում դա նշանակում է, որ այդ գրառումները ուղարկւում են այլ սերուերներ և պատճէները պահւում այնտեղ։ Մենք բարեխիղճ ջանք են գործադրում սահմանափակելու այդ գրառումների մուտքը միայն լիազօրուած անձանց, բայց այլ սերուերներ կարող են ձախողել դրա կատարումը։ Այդ պատճառով կարևոր է վերանայել այն սերուերները որին ձեր հետևորդները պատկանում են։ Դուք կարող էք կարգաւորումներից միացնել նոր հետևորդներին ինքնուրոյն ընդունելու և մերժելու ընտրանքը։ Խնդրում ենք յիշել, որ սերուերի գործարկուն և ցանկացած ստացող սերուեր կարող է դիտել այդ տեսակ հաղորդագրութիւնները, իսկ ստացողները կարող են էկրանահանել, պատճէնել և այլ կերպ վերատարածել դրանք։Մաստադոնով մի կիսուէք որևէ վտանգաւոր տեղեկատուութեամբ։
  • +
  • IP հասցէներ և այլ մետատուեալներ: Երբ դուք մուտք էք գործում, մենք պահում են ձեր մուտք գործելու IP հասցէն, ինչպէս նաև զննարկիչի տեսակը։ Կարգաւորումներում հասանելի է մուտքի բոլոր սեսիաների վերանայման և մարման հնարաւորութիւնը։ Վերջին օգտագործուած IP հասցէն պահւում է մինչև 12 ամիս ժամկէտով։ Մենք կարող ենք նաև պահել սերուերի մատեանի նիշքերը, որը պարունակում է սերուերին արուած իւրաքանչիւր հարցման IP հասցէն։

Ինչպէս ենք օգտագործում ձեր անձնական տեղեկութիւնները

-

Ցանկացած տուեալ, որը մենք հաւաքում ենք ձեզնից կարող է օգտագործուել հետևայլ նպատակներով՝

+

Ցանկացած տուեալ, որը մենք հաւաքում ենք ձեզնից կարող է օգտագործուել հետեւեալ նպատակներով՝

    -
  • Մատուցելու Մաստադոնի հիմնական գործառութիւնները։ Դուք կարող եք փոխգործակցել այլ մարդկանց բովանդակութեան հետ և տեղադրել ձեր սեփական բովանդակութիւնը միայն մուտք գործելուց յետոյ։ Օրինակ՝ դուք կարող էք հետեւել այլ մարդկանց նրանց համակցուած գրառումները ձեր անձնական հոսքում տեսնելու համար ։
  • -
  • Նպաստելու համայնքի մոդերացիային։ Օրինակ՝ համեմատելու ձեր IP հասցէն այլ արդեն յայտնի հասցէի հետ՝ բացայայտելու արգելափակումից խուսափելու կամ այլ խախտումների դեպքերը ։
  • -
  • Ձեր տրամադրած էլփոստի հասցէն կարող է օգտագործուել ձեզ տեղեկատուութիւն տրամադրելու, այլ մարդկանց՝ ձեր բովանդակութեան հետ փոխգործակցութեան կամ ձեզ հասցէագրած նամակի մասին ծանուցելու, ինչպէս նաև հայցումներին կամ այլ յայտերին ու հարցերին պատասխանելու համար։
  • +
  • Մատուցելու Մաստադոնի հիմնական գործառութիւնները։ Դուք կարող էք փոխգործակցել այլ մարդկանց բովանդակութեան հետ և տեղադրել ձեր սեփական բովանդակութիւնը միայն մուտք գործելուց յետոյ։ Օրինակ՝ դուք կարող էք հետեւել այլ մարդկանց նրանց համակցուած գրառումները ձեր անձնական հոսքում տեսնելու համար ։
  • +
  • Նպաստելու համայնքի մոդերացիային։ Օրինակ՝ համեմատելու ձեր IP հասցէն այլ արդեն յայտնի հասցէի հետ՝ բացայայտելու արգելափակումից խուսափելու կամ այլ խախտումների դէպքերը ։
  • +
  • Ձեր տրամադրած էլ-փոստի հասցէն կարող է օգտագործուել ձեզ տեղեկատուութիւն տրամադրելու, այլ մարդկանց՝ ձեր բովանդակութեան հետ փոխգործակցութեան կամ ձեզ հասցէագրած նամակի մասին ծանուցելու, ինչպէս նաև հայցումներին կամ այլ յայտերին ու հարցերին պատասխանելու համար։

-

Ինչպես ենք պաշտպանում ձեր անձնական

+

Ինչպէս ենք պաշտպանում ձեր անձնական

-

Մենք կիրառում ենք տարբեր անվտանգութեան միջոցների պահպանելու ձեր անձնական տվյալների անվտանգութիւնը, երբ դուք մուտքագրում, ուղարկում կամ դիտում էգ ձեր անձնական տեղեկութիւնները։ Ի թիւս մնացած բաների, ձեր դիտարկչի սեսսիան, ինչպէս նաև ձեր հավելվածի և API միջև տրաֆիկը պաշտպանուած են SSL-ով, իսկ ձեր գաղտնաբառը պատահականացված է միակողմանի ալգորիթմով։ Դուք կարող էք միացնել երկաստիճան ինքնորոշումը, ձեր հաշուի մուտքը աւելի պաշտպանուած դարձնելու համար։

+

Մենք կիրառում ենք տարբեր անվտանգութեան միջոցների պահպանելու ձեր անձնական տուեալների անվտանգութիւնը, երբ դուք մուտքագրում, ուղարկում կամ դիտում էգ ձեր անձնական տեղեկութիւնները։ Ի թիւս մնացած բաների, ձեր դիտարկչի սեսիան, ինչպէս նաև ձեր յաւելուածի և API միջև տրաֆիկը պաշտպանուած են SSL-ով, իսկ ձեր գաղտնաբառը պատահականացուած է միակողմանի ալգորիթմով։ Դուք կարող էք միացնել երկաստիճան ինքնորոշումը, ձեր հաշուի մուտքը աւելի պաշտպանուած դարձնելու համար։


@@ -981,8 +1002,8 @@ hy:

Մենք գործադրում ենք բարեխիղճ ջանք՝

    -
  • պահպանելու սերվերի մատեանի նիշքերը՝ այս սերվերին արուած բոլոր հարցումների IP հասցէներով, այնքանով որքանով նման նիշքերը պահւում են, ոչ աւել քան 90 օր ժամկէտով։
  • -
  • պահպանելու գրանցուած օգտատերի հաշուի հետ կապակցուած IP հասցէները, ոչ աւել քան 12 ամիս ժամկէտով։
  • +
  • պահպանելու սերուերի մատեանի նիշքերը՝ այս սերուերին արուած բոլոր հարցումների IP հասցէներով, այնքանով որքանով նման նիշքերը պահւում են, ոչ աւել քան 90 օր ժամկէտով։
  • +
  • պահպանելու գրանցուած օգտատէրի հաշուի հետ կապակցուած IP հասցէները, ոչ աւել քան 12 ամիս ժամկէտով։

Դուք կարող էք ուղարկել հայց ներբեռնելու ձեր բովանդակութեան պատճէն՝ ներառեալ ձեր գրառումները, մեդիա կցումները, գլխանկարը և ետնանկարը։

@@ -991,7 +1012,7 @@ hy:
-

Օգտագործում էք արդյո՞ք թխուկներ

+

Օգտագործում էք արդեօ՞ք թխուկներ

Այո։ Թխուկները փոքր ֆայլեր են որը կայքը կամ նրան ծառայութեան մատուցողը փոխանցում է ձեր համակարգչի կոշտ սկաւառակին դիտարկչի միջոցով (ձեր թոյլատուութիւն)։ Թխուկները հնարաւորութիւն են տալիս կայքին ճանաչելու ձեր դիտարկիչը, և գրանցուած հաշուի դէպքում՝ նոյնացնելու այն ձեր հաշուի հետ։ @@ -1001,19 +1022,19 @@ hy:

Բացայայտում երրորդ կողմերին

-

Մենք չենք վաճառում, փոխանակում, կամ այլ կերպ փոխանցում անձնական նոյնացնող տեղեկատուութիւն երրորդ կողմերին։ Սա չի ներառում վստահելի երրորդ կողմերին որոնք օգտնում են կայքի գործարկման, մեր գործունեության ծավալման, կամ ձեզ ծառայելու համար, այնքան ժամանակ որքան այդ երրորդ կողմերը համաձայն են գաղտնի պահել այդ տվյալները։ Մենք կարող ենք նաև հանրայնացնել ձեր տեղեկատուութիւնը երբ հաւատացած ենք որ դրա հանրայնացումը անհրաժեշտ է օրէնքի պահանջների կատարման, կամ կայքի քաղաքականութեան կիրառման համար, կամ պաշտպանելու մեր կամ այլոց իրաւունքները, սեփականութիւնը կամ անվտանգութիւնը։

+

Մենք չենք վաճառում, փոխանակում, կամ այլ կերպ փոխանցում անձնական նոյնացնող տեղեկատուութիւն երրորդ կողմերին։ Սա չի ներառում վստահելի երրորդ կողմերին որոնք օգնում են կայքի գործարկման, մեր գործունէութեան ծավալման, կամ ձեզ ծառայելու համար, այնքան ժամանակ որքան այդ երրորդ կողմերը համաձայն են գաղտնի պահել այդ տուեալները։ Մենք կարող ենք նաև հանրայնացնել ձեր տեղեկատուութիւնը երբ հաւատացած ենք որ դրա հանրայնացումը անհրաժեշտ է օրէնքի պահանջների կատարման, կամ կայքի քաղաքականութեան կիրառման համար, կամ պաշտպանելու մեր կամ այլոց իրաւունքները, սեփականութիւնը կամ անվտանգութիւնը։

-

Ձեր հանրային բովանդակութիւնը կարող է բեռնուել ցանցի միւս սերվերների կողմից։ Ձեր հանրային և միայն հետևորդներին գրառումները ուղարկւում են այն սերվերներին որտեղ գրանցած են ձեր հետևորդները, և հասցեական հաղորդագրութիւնները ուղարկւում են հասցէատէրերի սերվերներին, այն դէպքում երբ այդ հետևորդները կամ հասցէատէրերը գտնւում են այս սերվերից տարբեր սերվերի վրայ։

+

Ձեր հանրային բովանդակութիւնը կարող է բեռնուել ցանցի միւս սերուերների կողմից։ Ձեր հանրային և միայն հետևորդներին գրառումները ուղարկւում են այն սերուերներին որտեղ գրանցած են ձեր հետևորդները, և հասցէական հաղորդագրութիւնները ուղարկւում են հասցէատէրերի սերուերներին, այն դէպքում երբ այդ հետևորդները կամ հասցէատէրերը գտնւում են այս սերուերից տարբեր սերուերի վրայ։

-

Երբ դուք թոյլատրում էք հավելվածի օգտագործել ձեր հաշիւը, կախուած թույլտվությունների շրջանակից, այն կարող է մուտք ունենալ ձեր հաշիւ հանրային տեղեկատվությանը, ձեր հետևողների ցանկին, ձեր հետևորդներից ցանկին, ցանկերին, ձեր բոլոր գրառումներին, և ձեր հաւանումներին։ Հավելվածները երբեք չենք կարող մուտք ունենալ ձեր էլփոստի հասցէին կամ գաղտնաբառին։

+

Երբ դուք թոյլատրում էք յաւելուածի օգտագործել ձեր հաշիւը, կախուած թոյլտւութիւնների շրջանակից, այն կարող է մուտք ունենալ ձեր հաշիւ հանրային տեղեկատւութեանը, ձեր հետևողների ցանկին, ձեր հետևորդներից ցանկին, ցանկերին, ձեր բոլոր գրառումներին, և ձեր հաւանումներին։ Յաւելուածները երբեք չենք կարող մուտք ունենալ ձեր էլ-փոստի հասցէին կամ գաղտնաբառին։


Կայքի օգտագործումը երեխաների կողմից

-

Եթէ այս սերվերը գտնում է ԵՄ-ում կամ ԵՏԳ-ում. Մեր կայքը, արտադրանքները և ծառայութիւնները նախատեսուած են 16 տարին լրացած անձանց համար: Եթէ ձեր 16 տարեկանը չի լրացել, ապա հետևելով GDPR (General Data Protection Regulation) պահանջներին՝ մի օգտագործէք այս կայքը։

+

Եթէ այս սերուերը գտնում է ԵՄ-ում կամ ԵՏԳ-ում. Մեր կայքը, արտադրանքները և ծառայութիւնները նախատեսուած են 16 տարին լրացած անձանց համար: Եթէ ձեր 16 տարեկանը չի լրացել, ապա հետևելով GDPR (General Data Protection Regulation) պահանջներին՝ մի օգտագործէք այս կայքը։

-

Եթէ այս սերվերը գտնւում է ԱՄՆ-ում. Մեր կայքը, արտադրանքները և ծառայութիւնները նախատեսուած են 13 տարին լրացած անձանց համար: Եթէ ձեր 16 տարեկանը չի լրացել, ապա հետևելով COPPA (Children's Online Privacy Protection Act) պահանջներին՝ մի օգտագործէք այս կայքը։ +

Եթէ այս սերուերը գտնւում է ԱՄՆ-ում. Մեր կայքը, արտադրանքները և ծառայութիւնները նախատեսուած են 13 տարին լրացած անձանց համար: Եթէ ձեր 16 տարեկանը չի լրացել, ապա հետևելով COPPA (Children's Online Privacy Protection Act) պահանջներին՝ մի օգտագործէք այս կայքը։

Այլ երկրների իրաւասութիւն շրջաններում օրէնքի պահանջները կարող են տարբերուել։

@@ -1056,24 +1077,27 @@ hy: warning: get_in_touch: Կարող էք կապուել %{instance} հանգոյցի անձնակազմի հետ պատասխանելով այս նամակին։ statuses: Մասնաւորապէս, միայն՝ + subject: + disable: Քո %{acct} հաշիւը սառեցուել է + none: Նախազգուշացուեմ %{acct}-ին title: + disable: Հաշիւը սառեցուած է none: Զգուշացում sensitive: Մեդիաֆայլը պիտակուել է որպէս զգայուն։ + silence: Հաշիւը սահմանափակուած է suspend: Հաշիւը արգելափակուած է welcome: edit_profile_action: Կարգաւորել հաշիւը - final_action: Սկսել թթել - final_step: 'Սկսիր թթե՛լ։ Անգամ առանց հետեւորդների քո հանրային գրառումներ կարող են երևալ ուրիշների մօտ, օրինակ՝ տեղական հոսում կամ հեշթեգերում։ Թէ ցանկանաս, կարող ես յայտնել քո մասին օգտագործելով #եսնորեկեմ հեշթեգը։' + final_action: Սկսել գրել + final_step: 'Սկսիր գրել։ Անգամ առանց հետեւորդների քո հանրային գրառումներ կարող են երևալ ուրիշների մօտ, օրինակ՝ տեղական հոսում կամ հեշթեգերում։ Թէ ցանկանաս, կարող ես յայտնել քո մասին օգտագործելով #եսնորեկեմ հեշթեգը։' review_preferences_action: Փոփոխել կարգաւորումները subject: Բարի գալուստ Մաստոդոն tip_federated_timeline: Դաշնային հոսքում երևում է ամբողջ Մաստոդոնի ցանցը։ Բայց այն ներառում է միայն այն օգտատերերին որոնց բաժանորդագրուած են ձեր հարևաններ, այդ պատճառով այն կարող է լինել ոչ ամբողջական։ tip_following: Դու հետեւում էս քո հանգոյցի ադմին(ներ)ին լռելայն։ Այլ հետաքրքիր անձանց գտնելու համար՝ թերթիր տեղական և դաշնային հոսքերը։ tip_local_timeline: Տեղական հոսքում երևում են %{instance} հանգոյցի օգտատերի գրառումները։ Նրանք քո հանգոյցի հարևաններն են։ tips: Հուշումներ + title: Բարի գալուստ նաւամատոյց, %{name} users: - blocked_email_provider: Սույն էլփոստի տրամադրողը արգելված է - invalid_email: Էլ․ հասցէն անվաւեր է - invalid_email_mx: Այս հասցէն կարծես թէ գոյութիւն չունի invalid_otp_token: Անվաւեր 2F կոդ invalid_sign_in_token: Անվաւեր անվտանգութեան կոդ signed_in_as: Մոտք գործել որպէս․ @@ -1083,4 +1107,5 @@ hy: webauthn_credentials: delete: Ջնջել not_enabled: WebAuthn-ը դեռ միացուած չէ + not_supported: Այս դիտարկիչը չի աջակցում անվտանգութեան բանալիներ registered_on: Գրանցուել է %{date} diff --git a/config/locales/id.yml b/config/locales/id.yml index bf63f62a48..d3987ceb71 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -8,7 +8,7 @@ id: active_footnote: Pengguna Aktif Bulanan (PAB) administered_by: 'Dikelola oleh:' api: API - apps: Aplikasi hp + apps: Aplikasi mobile apps_platforms: Gunakan Mastodon dari iOS, Android, dan platform lain browse_directory: Jelajahi direktori profil dan saring sesuai minat browse_local_posts: Jelajahi siaran langsung dari pos publik server ini @@ -21,11 +21,11 @@ id: federation_hint_html: Dengan akun di %{instance} Anda dapat mengikuti orang di server Mastodon mana pun dan di luarnya. get_apps: Coba aplikasi mobile hosted_on: Mastodon dihosting di %{domain} - instance_actor_flash: 'Akun ini adalah aktor virtual yang dipakai untuk merepresentasikan server, bukan pengguna individu. Ini dipakai untuk tujuan federasi dan jangan diblokir kecuali Anda ingin memblokir seluruh instansi, yang seharusnya Anda pakai blokir domain. - -' + instance_actor_flash: "Akun ini adalah aktor virtual yang dipakai untuk merepresentasikan server, bukan pengguna individu. Ini dipakai untuk tujuan federasi dan jangan diblokir kecuali Anda ingin memblokir seluruh instansi, yang seharusnya Anda pakai blokir domain. \n" learn_more: Pelajari selengkapnya privacy_policy: Kebijakan Privasi + rules: Aturan server + rules_html: 'Di bawah ini adalah ringkasan aturan yang perlu Anda ikuti jika Anda ingin memiliki akun di server Mastodon ini:' see_whats_happening: Lihat apa yang sedang terjadi server_stats: 'Statistik server:' source_code: Kode sumber @@ -74,7 +74,6 @@ id: other: Toot posts_tab_heading: Toot posts_with_replies: Toot dan balasan - reserved_username: Nama pengguna telah dipesan roles: admin: Admin bot: Bot @@ -114,14 +113,16 @@ id: demote: Turunkan destroyed_msg: Data %{username} masuk antrean untuk dihapus segera disable: Nonaktifkan + disable_sign_in_token_auth: Nonaktifkan otentikasi token email disable_two_factor_authentication: Nonaktifkan 2FA disabled: Dinonaktifkan display_name: Nama domain: Domain edit: Ubah - email: E-mail + email: Email email_status: Status Email enable: Aktifkan + enable_sign_in_token_auth: Aktifkan otentikasi token email enabled: Diaktifkan enabled_msg: Berhasil mencairkan akun %{username} followers: Pengikut @@ -174,7 +175,7 @@ id: already_confirmed: Pengguna ini sudah dikonfirmasi send: Kirim ulang email konfirmasi success: Email konfirmasi berhasil dikirim! - reset: Reset + reset: Atur ulang reset_password: Reset kata sandi resubscribe: Langganan ulang role: Hak akses @@ -186,6 +187,10 @@ id: search: Cari search_same_email_domain: Pengguna lain dengan domain email yang sama search_same_ip: Pengguna lain dengan IP yang sama + security_measures: + only_password: Hanya kata sandi + password_and_2fa: Kata sandi dan 2FA + password_and_sign_in_token: Kata sandi dan token email sensitive: Sensitif sensitized: ditandai sebagai sensitif shared_inbox_url: URL kotak masuk bersama @@ -225,6 +230,7 @@ id: create_domain_block: Buat Blokir Domain create_email_domain_block: Buat Email Blokir Domain create_ip_block: Buat aturan IP + create_unavailable_domain: Buat Domain yang Tidak Tersedia demote_user: Turunkan Pengguna destroy_announcement: Hapus Pengumuman destroy_custom_emoji: Hapus Emoji Khusus @@ -233,10 +239,13 @@ id: destroy_email_domain_block: Hapus email blokir domain destroy_ip_block: Hapus aturan IP destroy_status: Hapus Status + destroy_unavailable_domain: Hapus Domain yang Tidak Tersedia disable_2fa_user: Nonaktifkan 2FA disable_custom_emoji: Nonaktifkan Emoji Khusus + disable_sign_in_token_auth_user: Nonaktifkan Otentikasi Token Email untuk Pengguna disable_user: Nonaktifkan Pengguna enable_custom_emoji: Aktifkan Emoji Khusus + enable_sign_in_token_auth_user: Aktifkan Otentikasi Token Email untuk Pengguna enable_user: Aktifkan Pengguna memorialize_account: Kenang Akun promote_user: Promosikan Pengguna @@ -256,46 +265,50 @@ id: update_domain_block: Perbarui Blokir Domain update_status: Perbarui Status actions: - assigned_to_self_report: "%{name} menugaskan laporan %{target} kpd dirinya sendiri" - change_email_user: "%{name} mengubah alamat email pengguna %{target}" - confirm_user: "%{name} mengonfirmasi alamat email pengguna %{target}" - create_account_warning: "%{name} mengirim peringatan untuk %{target}" - create_announcement: "%{name} membuat pengumuman baru %{target}" - create_custom_emoji: "%{name} mengunggah emoji baru %{target}" - create_domain_allow: "%{name} memasukkan ke daftar putih domain %{target}" - create_domain_block: "%{name} memblokir domain %{target}" - create_email_domain_block: "%{name} memblokir domain email %{target}" - create_ip_block: "%{name} membuat aturan untuk IP %{target}" - demote_user: "%{name} menurunkan pengguna %{target}" - destroy_announcement: "%{name} menghapus pengumuman %{target}" - destroy_custom_emoji: "%{name} menghapus emoji %{target}" - destroy_domain_allow: "%{name} menghapus domain %{target} dari daftar putih" - destroy_domain_block: "%{name} membuka blokir domain %{target}" - destroy_email_domain_block: "%{name} membuka blokir domain email %{target}" - destroy_ip_block: "%{name} menghapus aturan untuk IP %{target}" - destroy_status: "%{name} menghapus status %{target}" - disable_2fa_user: "%{name} mematikan syarat dua faktor utk pengguna %{target}" - disable_custom_emoji: "%{name} mematikan emoji %{target}" - disable_user: "%{name} mematikan login untuk pengguna %{target}" - enable_custom_emoji: "%{name} mengaktifkan emoji %{target}" - enable_user: "%{name} mengaktifkan login untuk pengguna %{target}" - memorialize_account: "%{name} mengubah akun %{target} jadi halaman memorial" - promote_user: "%{name} mempromosikan pengguna %{target}" - remove_avatar_user: "%{name} menghapus avatar %{target}" - reopen_report: "%{name} membuka ulang laporan %{target}" - reset_password_user: "%{name} mereset kata sandi pengguna %{target}" - resolve_report: "%{name} menyelesaikan laporan %{target}" - sensitive_account: "%{name} menandai media %{target} sebagai sensitif" - silence_account: "%{name} membungkam akun %{target}" - suspend_account: "%{name} menangguhkan akun %{target}" - unassigned_report: "%{name} tidak menugaskan laporan %{target}" - unsensitive_account: "%{name} membatalkan tanda media %{target} sebagai sensitif" - unsilence_account: "%{name} menghapus bungkaman akun %{target}" - unsuspend_account: "%{name} menghapus penangguhan akun %{target}" - update_announcement: "%{name} memperbarui pengumuman %{target}" - update_custom_emoji: "%{name} memperbarui emoji %{target}" - update_domain_block: "%{name} memperbarui blokir domain untuk %{target}" - update_status: "%{name} memperbarui status %{target}" + assigned_to_self_report_html: "%{name} menugaskan laporan %{target} ke dirinya sendiri" + change_email_user_html: "%{name} mengubah alamat email pengguna %{target}" + confirm_user_html: "%{name} mengonfirmasi alamat email pengguna %{target}" + create_account_warning_html: "%{name} mengirim peringatan untuk %{target}" + create_announcement_html: "%{name} membuat pengumuman baru %{target}" + create_custom_emoji_html: "%{name} mengunggah emoji baru %{target}" + create_domain_allow_html: "%{name} mengizinkan penggabungan dengan domain %{target}" + create_domain_block_html: "%{name} memblokir domain %{target}" + create_email_domain_block_html: "%{name} memblokir domain email %{target}" + create_ip_block_html: "%{name} membuat aturan untuk IP %{target}" + create_unavailable_domain_html: "%{name} menghentikan pengiriman ke domain %{target}" + demote_user_html: "%{name} menurunkan pengguna %{target}" + destroy_announcement_html: "%{name} menghapus pengumuman %{target}" + destroy_custom_emoji_html: "%{name} menghapus emoji %{target}" + destroy_domain_allow_html: "%{name} membatalkan izin penggabungan dengan domain %{target}" + destroy_domain_block_html: "%{name} membuka blokir domain %{target}" + destroy_email_domain_block_html: "%{name} membuka blokir domain email %{target}" + destroy_ip_block_html: "%{name} menghapus aturan untuk IP %{target}" + destroy_status_html: "%{name} menghapus status %{target}" + destroy_unavailable_domain_html: "%{name} melanjutkan pengiriman ke domain %{target}" + disable_2fa_user_html: "%{name} mematikan syarat dua faktor utk pengguna %{target}" + disable_custom_emoji_html: "%{name} mematikan emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} menonaktifkan otentikasi token email untuk %{target}" + disable_user_html: "%{name} mematikan login untuk pengguna %{target}" + enable_custom_emoji_html: "%{name} mengaktifkan emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} mengaktifkan otentikasi token email untuk %{target}" + enable_user_html: "%{name} mengaktifkan login untuk pengguna %{target}" + memorialize_account_html: "%{name} mengubah akun %{target} jadi halaman memorial" + promote_user_html: "%{name} mempromosikan pengguna %{target}" + remove_avatar_user_html: "%{name} menghapus avatar %{target}" + reopen_report_html: "%{name} membuka ulang laporan %{target}" + reset_password_user_html: "%{name} mereset kata sandi pengguna %{target}" + resolve_report_html: "%{name} menyelesaikan laporan %{target}" + sensitive_account_html: "%{name} menandai media %{target} sebagai sensitif" + silence_account_html: "%{name} membisukan akun %{target}" + suspend_account_html: "%{name} menangguhkan akun %{target}" + unassigned_report_html: "%{name} membatalkan penugasan laporan %{target}" + unsensitive_account_html: "%{name} membatalkan tanda media %{target} sebagai sensitif" + unsilence_account_html: "%{name} membunyikan akun %{target}" + unsuspend_account_html: "%{name} membatalkan penangguhan akun %{target}" + update_announcement_html: "%{name} memperbarui pengumuman %{target}" + update_custom_emoji_html: "%{name} memperbarui emoji %{target}" + update_domain_block_html: "%{name} memperbarui blokir domain untuk %{target}" + update_status_html: "%{name} memperbarui status %{target}" deleted_status: "(status dihapus)" empty: Log tidak ditemukan. filter_by_action: Filter berdasarkan tindakan @@ -310,10 +323,12 @@ id: new: create: Buat pengumuman title: Pengumuman baru + publish: Terbitkan published_msg: Pengumuman berhasil diterbitkan! scheduled_for: Dijadwalkan untuk %{time} scheduled_msg: Pengumuman dijadwalkan untuk publikasi! title: Pengumuman + unpublish: Batal terbitkan unpublished_msg: Pengumuman berhasil ditarik! updated_msg: Pengumuman berhasil diperbarui! custom_emojis: @@ -350,33 +365,25 @@ id: updated_msg: Emoji berhasil diperbarui! upload: Unggah dashboard: - authorized_fetch_mode: Mode aman - backlog: pekerjaan di-backlog - config: Konfigurasi - feature_deletions: Penghapusan akun - feature_invites: Tautan undangan - feature_profile_directory: Direktori profil - feature_registrations: Registrasi - feature_relay: Relai federasi - feature_spam_check: Anti-spam - feature_timeline_preview: Pratinjau linimasa - features: Fitur - hidden_service: Federasi dengan layanan tersembunyi - open_reports: buka laporan - pending_tags: tagar menunggu ditinjau - pending_users: pengguna menunggu ditinjau - recent_users: Pengguna terbaru - search: Pencarian teks lengkap - single_user_mode: Mode pengguna tunggal + active_users: pengguna aktif + interactions: interaksi + media_storage: Penyimpanan media + new_users: pengguna baru + opened_reports: laporan dibuka + pending_reports_html: + other: "%{count} laporan ditunda" + pending_tags_html: + other: "%{count} tagar ditunda" + pending_users_html: + other: "%{count} pengguna ditunda" + resolved_reports: laporan sudah diselesaikan software: Perangkat lunak + sources: Sumber pendaftaran space: Penggunaan ruang title: Dasbor - total_users: total pengguna - trends: Tren - week_interactions: interaksi minggu ini - week_users_active: aktif minggu ini - week_users_new: pengguna minggu ini - whitelist_mode: Mode daftar putih + top_languages: Bahasa aktif teratas + top_servers: Server aktif teratas + website: Situs web domain_allows: add_new: Daftar putihkan domain created_msg: Domain berhasil masuk daftar putih @@ -398,6 +405,8 @@ id: silence: Pendiaman suspend: Suspen title: Pemblokiran domain baru + obfuscate: Nama domain kabur + obfuscate_hint: Mengaburkan nama domain sebagian di daftar jika pengiklanan batasan daftar domain diaktifkan private_comment: Komentar pribadi private_comment_hint: Komentar tentang pembatasan domain ini untuk penggunaan internal oleh moderator. public_comment: Komentar publik @@ -433,9 +442,33 @@ id: create: Tambah domain title: Blokir domain email baru title: Domain email terblokir + follow_recommendations: + description_html: "Rekomendasi untuk diikuti" membantu pengguna baru untuk secara cepat menemukan konten yang menarik. Ketika pengguna belum cukup berinteraksi dengan lainnya sehingga belum memunculkan rekomendasi, akun-akun ini akan direkomendasikan. Mereka dihitung ulang secara harian dari campuran akun-akun dengan keterlibatan tertinggi baru-baru ini dan jumlah pengikut lokal tertinggi untuk bahasa tertentu. + language: Untuk bahasa + status: Status + suppress: Hapus akun yang direkomendasikan untuk diikuti + suppressed: Dihapus + title: Rekomendasi untuk diikuti + unsuppress: Kembalikan rekomendasi untuk diikuti instances: + back_to_all: Semua + back_to_limited: Terbatas + back_to_warning: Peringatan by_domain: Domain + delivery: + all: Semua + clear: Hapus galat pengiriman + restart: Mulai ulang pengiriman + stop: Setop pengiriman + title: Pengiriman + unavailable: Tidak tersedia + unavailable_message: Pengiriman tidak tersedia + warning: Peringatan + warning_message: + other: Kegagalan pengiriman %{count} hari delivery_available: Pengiriman tersedia + delivery_error_days: Lama hari pengiriman galat + delivery_error_hint: Jika pengiriman tidak terjadi selama %{count} hari, ia akan ditandai secara otomatis sebagai tidak terkirim. empty: Domain tidak ditemukan. known_accounts: other: "%{count} akun yang dikenal" @@ -528,10 +561,18 @@ id: resolved: Terseleseikan resolved_msg: Laporan berhasil diselesaikan! status: Status + target_origin: Akun asal yang dilaporkan title: Laporan unassign: Bebas Tugas unresolved: Belum Terseleseikan updated_at: Diperbarui + rules: + add_new: Tambah aturan + delete: Hapus + description_html: Saat kebanyakan mengklaim sudah membaca dan menyetujui ketentuan layanan, biasanya orang-orang tidak membacanya sampai masalah muncul. Lebih mudah melihat sepintas aturan server Anda dengan menampilkannya dalam daftar bulatan. Coba buat aturan individu sependek dan sesederhana mungkin, tapi coba jangan memisahkannya ke dalam item terpisah yang sangat banyak. + edit: Edit aturan + empty: Belum ada aturan server yang didefinisikan. + title: Aturan server settings: activity_api_enabled: desc_html: Hitung status yang dipos scr lokal, pengguna aktif, dan registrasi baru dlm keranjang bulanan @@ -555,9 +596,6 @@ id: users: Ke pengguna lokal yang sudah login domain_blocks_rationale: title: Tampilkan alasan - enable_bootstrap_timeline_accounts: - desc_html: Buat pengguna baru mengikuti akun yang sudah dipilih agar beranda mereka tidak kosong - title: Aktifkan opsi ikuti otomatis untuk pengguna baru hero: desc_html: Ditampilkan di halaman depan. Direkomendasikan minimal 600x100px. Jika tidak diatur, kembali ke server gambar kecil title: Gambar pertama @@ -611,9 +649,6 @@ id: desc_html: Anda dapat menulis kebijakan privasi, ketentuan layanan, atau hal legal lainnya sendiri. Anda dapat menggunakan tag HTML title: Ketentuan layanan kustom site_title: Judul Situs - spam_check_enabled: - desc_html: Mastodon dapat melaporkan secara otomatis akun yang mengirimkan pesan berulang tanpa diminta. Ini mungkin ada kesalahan. - title: Automasi anti-spam thumbnail: desc_html: Dipakai sebagai pratinjau via OpenGraph dan API. Direkomendasikan 1200x630px title: Server gambar kecil @@ -644,13 +679,18 @@ id: no_status_selected: Tak ada status yang berubah karena tak ada yang dipilih title: Status akun with_media: Dengan media + system_checks: + database_schema_check: + message_html: Ada proses migrasi basis data tertunda. Silakan jalankan untuk memastikan aplikasi bekerja seperti yang diharapkan + rules_check: + action: Kelola aturan server + message_html: Anda belum menentukan aturan server apapun. + sidekiq_process_check: + message_html: Tidak ada proses Sidekiq yang berjalan untuk %{value} antrian. Silakan tinjau konfigurasi Sidekiq Anda tags: accounts_today: Penggunaan unik hari ini accounts_week: Penggunaan unik minggu ini breakdown: Rinci penggunaan hari ini berdasar sumber - context: Konteks - directory: Di direktori - in_directory: "%{count} di direktori" last_active: Terakhir aktif most_popular: Paling populer most_recent: Terkini @@ -667,6 +707,7 @@ id: add_new: Tambah baru delete: Hapus edit_preset: Sunting preset peringatan + empty: Anda belum mendefinisikan peringatan apapun. title: Kelola preset peringatan admin_mailer: new_pending_account: @@ -954,6 +995,17 @@ id: lists: errors: limit: Daftar Anda telah mencapai jumlah maksimum + login_activities: + authentication_methods: + otp: aplikasi otentikasi dua-faktor + password: kata sandi + sign_in_token: kode keamanan email + webauthn: kunci keamanan + description_html: Jika Anda melihat aktivitas tidak dikenal, pertimbangkan untuk mengubah kata sandi dan mengaktifkan otentikasi dua-faktor. + empty: Riwayat otentikasi tidak tersedia + failed_sign_in_html: Upaya gagal masuk dengan %{method} dari %{ip} (%{browser}) + successful_sign_in_html: Berhasil masuk dengan %{method} dari %{ip} (%{browser}) + title: Riwayat otentikasi media_attachments: validations: images_and_video: Tidak bisa melampirkan video pada status yang telah memiliki gambar @@ -1024,10 +1076,14 @@ id: body: 'Anda disebut oleh %{name} pada:' subject: Anda disebut oleh %{name} title: Sebutan baru + poll: + subject: Japat oleh %{name} telah berakhir reblog: body: 'Status anda di-boost oleh %{name}:' subject: "%{name} mem-boost status anda" title: Boost baru + status: + subject: "%{name} baru saja memposting" notifications: email_events: Event untuk notifikasi email email_events_hint: 'Pilih event yang ingin Anda terima notifikasinya:' @@ -1154,6 +1210,7 @@ id: revoke: Cabut izin revoke_success: Sesi berhasil dicabut title: Sesi + view_authentication_history: Lihat riwayat otentikasi akun Anda settings: account: Akun account_settings: Pengaturan akun @@ -1174,10 +1231,9 @@ id: preferences: Pilihan profile: Profil relationships: Ikuti dan pengikut + statuses_cleanup: Hapus kiriman otomatis two_factor_authentication: Autentikasi Two-factor webauthn_authentication: Kunci keamanan - spam_check: - spam_detected: Ini adalah laporan otomatis. Spam terdeteksi. statuses: attached: audio: @@ -1214,12 +1270,47 @@ id: sign_in_to_participate: Masuk untuk mengikuti percakapan title: '%{name}: "%{quote}"' visibilities: + direct: Langsung private: Khusus pengikut private_long: Hanya tampilkan ke pengikut public: Publik public_long: Bisa dilihat semua orang unlisted: Bisa dilihat semua orang, tapi tidak ditampilkan di linimasa publik unlisted_long: Tidak terdaftar di linimasa publik tetapi siapapun dapat melihat + statuses_cleanup: + enabled: Otomatis hapus kiriman lama + enabled_hint: "Otomatis menghapus kiriman Anda saat sudah mencapai batasan usia, kecuali yang cocok \nsesuai di bawah ini" + exceptions: Pengecualian + explanation: Karena menghapus kiriman adalah operasi dengan sumber daya besar, ini akan dilakukan perlahan ketika server tidak sedang sibuk. Karena alasan ini, kiriman akan dihapus setelah mencapai batas waktu. + ignore_favs: Abaikan favorit + ignore_reblogs: Abaikan boost + interaction_exceptions: Pengecualian berdasar interaksi + interaction_exceptions_explanation: Perlu diingat tidak ada jaminan kiriman akan dihapus jika ia di bawah batas favorit atau boost setelah sebelumnya berhasil melewatinya. + keep_direct: Simpan pesan langsung + keep_direct_hint: Tidak mengapus pesan langsung Anda + keep_media: Simpan kiriman dengan lampiran media + keep_media_hint: Tidak menghapus kiriman Anda dengan lampiran media + keep_pinned: Simpan kiriman tersemat + keep_pinned_hint: Tidak menghapus kiriman tersemat Anda + keep_polls: Simpan japat + keep_polls_hint: Tidak menghapus japat Anda + keep_self_bookmark: Simpan kiriman yang Anda markahi + keep_self_bookmark_hint: Tidak menghapus kiriman Anda sendiri jika Anda telah memasukkannya ke markah + keep_self_fav: Simpan kiriman favorit Anda + keep_self_fav_hint: Tidak menghapus kiriman Anda yang Anda favoritkan + min_age: + '1209600': 2 minggu + '15778476': 6 bulan + '2629746': 1 bulan + '31556952': 1 tahun + '5259492': 2 bulan + '63113904': 2 tahun + '7889238': 3 bulan + min_age_label: Batas usia + min_favs: Simpan kiriman favorit lebih dari + min_favs_hint: Tidak menghapus kiriman Anda yang mendapatkan sekian favorit. Kosongkan bila ingin menghapus kiriman tanpa peduli jumlah favoritnya + min_reblogs: Simpan kiriman yang di-boost lebih dari + min_reblogs_hint: Tidak menghapus kiriman Anda yang di-boost lebih dari sekian kali. Kosongkan bila ingin menghapus kiriman tanpa peduli jumlah boost-nya stream_entries: pinned: Toot tersemat reblogged: di-boost-kan @@ -1382,11 +1473,8 @@ id: tips: Tips title: Selamat datang, %{name}! users: - blocked_email_provider: Layanan email ini tidak diizinkan follow_limit_reached: Anda tidak dapat mengikuti lebih dari %{limit} orang generic_access_help_html: Mengalami masalah saat akses akun? Anda mungkin perlu menghubungi %{email} untuk mencari bantuan - invalid_email: Alamat email tidak cocok - invalid_email_mx: Alamat email ini sepertinya tidak ada invalid_otp_token: Kode dua faktor tidak cocok invalid_sign_in_token: Kode keamanan tidak valid otp_lost_help_html: Jika Anda kehilangan akses keduanya, Anda dapat menghubungi %{email} diff --git a/config/locales/io.yml b/config/locales/io.yml index a99c4a9665..ad9ac5be62 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -155,5 +155,4 @@ io: generate_recovery_codes: Generate Recovery Codes recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe, for example by printing them and storing them with other important documents. users: - invalid_email: La retpost-adreso ne esas valida invalid_otp_token: La dufaktora autentikigila kodexo ne esas valida diff --git a/config/locales/is.yml b/config/locales/is.yml index 2d6102d98d..f17977aa94 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -26,6 +26,8 @@ is: Tilgangur hans tengist virkni vefþjónasambandsins og ætti alls ekki að loka á hann nema að þú viljir útiloka allan viðkomandi vefþjón, en þá ætti frekar að útiloka sjálft lénið. learn_more: Kanna nánar privacy_policy: Persónuverndarstefna + rules: Reglur netþjónsins + rules_html: 'Hér fyrir neðan er yfirlit yfir þær reglur sem þú þarft að fara eftir ef þú ætlar að vera með notandaaðgang á þessum Mastodon-netþjóni:' see_whats_happening: Sjáðu hvað er í gangi server_stats: 'Tölfræði þjóns:' source_code: Grunnkóði @@ -78,7 +80,6 @@ is: other: Tíst posts_tab_heading: Tíst posts_with_replies: Tíst og svör - reserved_username: Notandanafnið er frátekið roles: admin: Stjóri bot: Róbót @@ -118,6 +119,7 @@ is: demote: Lækka í tign destroyed_msg: Gögn notandans %{username} eru núna í bið eftir að vera endanlega eytt disable: Gera óvirkt + disable_sign_in_token_auth: Gera óvirka auðkenningu með teikni í tölvupósti disable_two_factor_authentication: Gera tveggja-þátta auðkenningu óvirka disabled: Óvirkt display_name: Birtingarnafn @@ -126,6 +128,7 @@ is: email: Tölvupóstfang email_status: Staða tölvupósts enable: Virkja + enable_sign_in_token_auth: Virkja auðkenningu með teikni í tölvupósti enabled: Virkt enabled_msg: Tókst að affrysta aðgang notandans %{username} followers: Fylgjendur @@ -190,6 +193,10 @@ is: search: Leita search_same_email_domain: Aðra notendur með sama tölvupóstlén search_same_ip: Aðrir notendur með sama IP-vistfang + security_measures: + only_password: Aðeins lykilorð + password_and_2fa: Lykilorð og 2-þátta auðkenning + password_and_sign_in_token: Lykilorð og teikn í tölvupósti sensitive: Viðkvæmt sensitized: merkt sem viðkvæmt shared_inbox_url: Slóð á sameiginlegt innhólf @@ -229,6 +236,7 @@ is: create_domain_block: Búa til lén bannað create_email_domain_block: Búa til tölvupóstfang bannað create_ip_block: Búa til IP-reglu + create_unavailable_domain: Útbúa lén sem ekki er tiltækt demote_user: Lækka notanda í tign destroy_announcement: Eyða tilkynningu destroy_custom_emoji: Eyða sérsniðnu tjáningartákni @@ -237,10 +245,13 @@ is: destroy_email_domain_block: Eyða tölvupóstfangi bannað destroy_ip_block: Eyða IP-reglu destroy_status: Eyða stöðufærslu + destroy_unavailable_domain: Eyða léni sem ekki er tiltækt disable_2fa_user: Gera tveggja-þátta auðkenningu óvirka disable_custom_emoji: Gera sérsniðið tjáningartákn óvirkt + disable_sign_in_token_auth_user: Gera óvirka auðkenningu með teikni í tölvupósti fyrir notandann disable_user: Gera notanda óvirkan enable_custom_emoji: Virkja sérsniðið tjáningartákn + enable_sign_in_token_auth_user: Gera virka auðkenningu með teikni í tölvupósti fyrir notandann enable_user: Virkja notanda memorialize_account: Gera aðgang að minningargrein promote_user: Hækka notanda í tign @@ -260,46 +271,50 @@ is: update_domain_block: Uppfæra útilokun léns update_status: Uppfæra stöðufærslu actions: - assigned_to_self_report: "%{name} úthlutaði skýrslu %{target} til sín" - change_email_user: "%{name} breytti tölvupóstfangi fyrir notandann %{target}" - confirm_user: "%{name} staðfesti tölvupóstfang fyrir notandann %{target}" - create_account_warning: "%{name} sendi aðvörun til %{target}" - create_announcement: "%{name} útbjó auglýsingu %{target}" - create_custom_emoji: "%{name} sendi inn nýtt tjáningartákn %{target}" - create_domain_allow: "%{name} setti lén %{target} á lista yfir leyft" - create_domain_block: "%{name} útilokaði lénið %{target}" - create_email_domain_block: "%{name} setti póstlén %{target} á lista yfir bannað" - create_ip_block: "%{name} bjó til reglu fyrir IP-vistfangið %{target}" - demote_user: "%{name} lækkaði notandann %{target} í tign" - destroy_announcement: "%{name} eyddi auglýsingu %{target}" - destroy_custom_emoji: "%{name} henti út tjáningartákninu %{target}" - destroy_domain_allow: "%{name} fjarlægði lén %{target} af lista yfir leyft" - destroy_domain_block: "%{name} aflétti útilokun af léninu %{target}" - destroy_email_domain_block: "%{name} setti póstlén %{target} á lista yfir leyft" - destroy_ip_block: "%{name} eyddi reglu fyrir IP-vistfangið %{target}" - destroy_status: "%{name} fjarlægði stöðufærslu frá %{target}" - disable_2fa_user: "%{name} gerði tveggja-þátta auðkenningu óvirka fyrir notandann %{target}" - disable_custom_emoji: "%{name} gerði tjáningartáknið %{target} óvirkt" - disable_user: "%{name} gerðir innskráningu óvirka fyrir notandann %{target}" - enable_custom_emoji: "%{name} gerði tjáningartáknið %{target} virkt" - enable_user: "%{name} gerðir innskráningu virka fyrir notandann %{target}" - memorialize_account: "%{name} breytti notandaaðgangnum %{target} í minningargreinarsíðu" - promote_user: "%{name} hækkaði notandann %{target} í tign" - remove_avatar_user: "%{name} fjarlægði auðkennismynd af %{target}" - reopen_report: "%{name} enduropnaði skýrslu %{target}" - reset_password_user: "%{name} endurstillti lykilorð fyrir notandann %{target}" - resolve_report: "%{name} leysti skýrslu %{target}" - sensitive_account: "%{name} merkti myndefni frá %{target} sem viðkvæmt" - silence_account: "%{name} gerði notandaaðganginn %{target} hulinn" - suspend_account: "%{name} setti notandaaðganginn %{target} í bið" - unassigned_report: "%{name} fjarlægði úthlutun af skýrslu %{target}" - unsensitive_account: "%{name} afmerkti myndefni frá %{target} sem viðkvæmt" - unsilence_account: "%{name} hætti að hylja notandaaðganginn %{target}" - unsuspend_account: "%{name} tók notandaaðganginn %{target} úr bið" - update_announcement: "%{name} uppfærði auglýsingu %{target}" - update_custom_emoji: "%{name} uppfærði tjáningartákn %{target}" - update_domain_block: "%{name} uppfærði útilokun lénsins %{target}" - update_status: "%{name} uppfærði stöðufærslu frá %{target}" + assigned_to_self_report_html: "%{name} úthlutaði kæru %{target} til sín" + change_email_user_html: "%{name} breytti tölvupóstfangi fyrir notandann %{target}" + confirm_user_html: "%{name} staðfesti tölvupóstfang fyrir notandann %{target}" + create_account_warning_html: "%{name} sendi aðvörun til %{target}" + create_announcement_html: "%{name} útbjó nýja tilkynningu %{target}" + create_custom_emoji_html: "%{name} sendi inn nýtt tjáningartákn %{target}" + create_domain_allow_html: "%{name} leyfði skýjasamband með léninu %{target}" + create_domain_block_html: "%{name} útilokaði lénið %{target}" + create_email_domain_block_html: "%{name} útilokaði póstlénið %{target}" + create_ip_block_html: "%{name} útbjó reglu fyrir IP-vistfangið %{target}" + create_unavailable_domain_html: "%{name} stöðvaði afhendingu til lénsins %{target}" + demote_user_html: "%{name} lækkaði notandann %{target} í tign" + destroy_announcement_html: "%{name} eyddi tilkynninguni %{target}" + destroy_custom_emoji_html: "%{name} henti út tjáningartákninu %{target}" + destroy_domain_allow_html: "%{name} bannaði skýjasamband með léninu %{target}" + destroy_domain_block_html: "%{name} aflétti útilokun af léninu %{target}" + destroy_email_domain_block_html: "%{name} aflétti útilokun af póstléninu %{target}" + destroy_ip_block_html: "%{name} eyddi reglu fyrir IP-vistfangið %{target}" + destroy_status_html: "%{name} fjarlægði stöðufærslu frá %{target}" + destroy_unavailable_domain_html: "%{name} hóf aftur afhendingu til lénsins %{target}" + disable_2fa_user_html: "%{name} gerði kröfu um tveggja-þátta innskráningu óvirka fyrir notandann %{target}" + disable_custom_emoji_html: "%{name} gerði tjáningartáknið %{target} óvirkt" + disable_sign_in_token_auth_user_html: "%{name} gerði óvirka auðkenningu með teikni í tölvupósti fyrir %{target}" + disable_user_html: "%{name} gerði innskráningu óvirka fyrir notandann %{target}" + enable_custom_emoji_html: "%{name} gerði tjáningartáknið %{target} virkt" + enable_sign_in_token_auth_user_html: "%{name} gerði virka auðkenningu með teikni í tölvupósti fyrir %{target}" + enable_user_html: "%{name} gerði innskráningu virka fyrir notandann %{target}" + memorialize_account_html: "%{name} breytti notandaaðgangnum %{target} í minningargreinarsíðu" + promote_user_html: "%{name} hækkaði notandann %{target} í tign" + remove_avatar_user_html: "%{name} fjarlægði auðkennismynd af %{target}" + reopen_report_html: "%{name} enduropnaði kæru %{target}" + reset_password_user_html: "%{name} endurstillti lykilorð fyrir notandann %{target}" + resolve_report_html: "%{name} leysti kæru %{target}" + sensitive_account_html: "%{name} merkti myndefni frá %{target} sem viðkvæmt" + silence_account_html: "%{name} þaggaði niður í aðgangnum %{target}" + suspend_account_html: "%{name} setti notandaaðganginn %{target} í bið" + unassigned_report_html: "%{name} fjarlægði úthlutun af kæru %{target}" + unsensitive_account_html: "%{name} tók merkinguna viðkvæmt af myndefni frá %{target}" + unsilence_account_html: "%{name} hætti að hylja notandaaðganginn %{target}" + unsuspend_account_html: "%{name} tók notandaaðganginn %{target} úr bið" + update_announcement_html: "%{name} uppfærði tilkynningu %{target}" + update_custom_emoji_html: "%{name} uppfærði tjáningartáknið %{target}" + update_domain_block_html: "%{name} uppfærði lénalás fyrir %{target}" + update_status_html: "%{name} uppfærði stöðufærslu frá %{target}" deleted_status: "(eydd stöðufærsla)" empty: Engar atvikaskrár fundust. filter_by_action: Sía eftir aðgerð @@ -314,10 +329,12 @@ is: new: create: Búa til auglýsingu title: Ný auglýsing + publish: Birta published_msg: Það tókst að birta auglýsinguna! scheduled_for: Áætlað %{time} scheduled_msg: Auglýsing var sett á áætlun! title: Auglýsingar + unpublish: Taka úr birtingu unpublished_msg: Það tókst að taka auglýsinguna úr birtingu! updated_msg: Það tókst að uppfæra auglýsinguna! custom_emojis: @@ -354,33 +371,9 @@ is: updated_msg: Tókst að uppfæra tjáningartákn! upload: Senda inn dashboard: - authorized_fetch_mode: Öruggur hamur - backlog: bakskráð verk - config: Stillingar - feature_deletions: Eyðingar notandaaðganga - feature_invites: Boðstenglar - feature_profile_directory: Notandasniðamappa - feature_registrations: Nýskráningar - feature_relay: Sambandsendurvarpi - feature_spam_check: Ruslpóstvarnir - feature_timeline_preview: Forskoðun tímalínu - features: Eiginleikar - hidden_service: Skýjasamband með faldar þjónustur - open_reports: opnar kærur - pending_tags: myllumerki bíða eftir yfirferð - pending_users: notendur bíða eftir yfirferð - recent_users: Nýlegir notendur - search: Leit í öllum texta - single_user_mode: Eins-notandahamur software: Hugbúnaður space: Notkun geymslurýmis title: Stjórnborð - total_users: notendur alls - trends: Tilhneiging - week_interactions: aðgerðir í þessari viku - week_users_active: virkir í þessari viku - week_users_new: notendur þessari viku - whitelist_mode: Hamur til að leyfa (whitelist) domain_allows: add_new: Setja lén á lista yfir leyft created_msg: Það tókst að setja lénið á lista yfir leyft @@ -440,9 +433,34 @@ is: create: Bæta við léni title: Ný færsla á bannlista fyrir tölvupóstföng title: Bannlisti yfir tölvupóstföng + follow_recommendations: + description_html: "Að fylgja meðmælum hjálpar nýjum notendum að finna áhugavert efni á einfaldan máta. Þegar notandi hefur ekki átt í nægilegum samskiptum við aðra til að vera farinn að móta sér skoðanir á hverju hann vill fylgjast með, er mælt með að fylgjast með þessum aðgöngum. Þeir eru endurreiknaðir daglega út frá blöndu þeirra aðganga sem eru með hvað mestri þáttöku í umræðum og mesta fylgjendafjölda út frá hverju tungumáli." + language: Fyrir tungumálið + status: Staða + suppress: Útiloka að fylgja meðmælum + suppressed: Útilokað + title: Fylgja meðmælum + unsuppress: Endurheimta að fylgja meðmælum instances: + back_to_all: Allt + back_to_limited: Takmarkað + back_to_warning: Aðvörun by_domain: Lén + delivery: + all: Allt + clear: Hreinsa afhendingarvillur + restart: Endurræsa afhendingu + stop: Stöðva afhendingu + title: Afhending + unavailable: Ekki tiltækt + unavailable_message: Afhending ekki möguleg + warning: Aðvörun + warning_message: + one: "%{count} dagur með villum í afhendingu" + other: "%{count} dagar með villum í afhendingu" delivery_available: Afhending er til taks + delivery_error_days: Dagar með villum í afhendingu + delivery_error_hint: Ef afhending er ekki möguleg í %{count} daga, verður það sjálfkrafa merkt sem óafhendanlegt. empty: Engin lén fundust. known_accounts: one: "%{count} þekktur notandaaðgangur" @@ -538,10 +556,18 @@ is: resolved: Leyst resolved_msg: Það tókst að leysa kæruna! status: Staða + target_origin: Uppruni kærða notandaaðgangsins title: Kærur unassign: Aftengja úthlutun unresolved: Óleyst updated_at: Uppfært + rules: + add_new: Skrá reglu + delete: Eyða + description_html: Þó að flestir segist hafa lesið og samþykkt þjónustuskilmála, er fólk samt gjarnt á að lesa slíkar upplýsingar ekki til enda fyrr en upp koma einhver vandamál. Gerðu fólki auðvelt að sjá mikilvægustu reglurnar með því að setja þær fram í flötum punktalista. Reyndu að hafa hverja reglu stutta og skýra, en ekki vera heldur að skipta þeim upp í mörg aðskilin atriði. + edit: Breyta reglu + empty: Engar reglur fyrir netþjón hafa ennþá verið skilgreindar. + title: Reglur netþjónsins settings: activity_api_enabled: desc_html: Fjöldi staðværra stöðufærslna, virkra notenda og nýskráninga í vikulegum skömmtum @@ -565,9 +591,6 @@ is: users: Til innskráðra staðværra notenda domain_blocks_rationale: title: Birta röksemdafærslu - enable_bootstrap_timeline_accounts: - desc_html: Láta nýja notendur sjálfkrafa fylgjast með uppsettum aðgöngum svo að heimastreymi þeirra byrji ekki autt - title: Virkja sjálfgefnar fylgnistillingar fyrir nýja notendur hero: desc_html: Birt á forsíðunni. Mælt með að hún sé a.m.k. 600×100 mynddílar. Þegar þetta er ekki stillt, er notuð smámynd netþjónsins title: Aðalmynd @@ -621,9 +644,6 @@ is: desc_html: Þú getur skrifað þína eigin persónuverndarstefnu, þjónustuskilmála eða annað lagatæknilegt. Þú getur notað HTML-einindi title: Sérsniðnir þjónustuskilmálar site_title: Heiti vefþjóns - spam_check_enabled: - desc_html: Mastodon getur tilkynnt sjálfvirkt um aðganga sem senda ítrekað óumbeðin skilaboð. Mögulega geta verið rangar slíkar tilkynningar. - title: Sjálfvirkar ruslpóstvarnir thumbnail: desc_html: Notað við forskoðun í gegnum OpenGraph og API-kerfisviðmót. Mælt með 1200×630 mynddílum title: Smámynd vefþjóns @@ -654,13 +674,18 @@ is: no_status_selected: Engum stöðufærslum var breytt þar sem engar voru valdar title: Staða notendaaðganga with_media: Með myndefni + system_checks: + database_schema_check: + message_html: Það eru fyrirliggjandi yfirfærslur á gagnagrunnum. Keyrðu þær til að tryggja að forritið hegði sér eins og skyldi + rules_check: + action: Sýsla með reglur netþjónsins + message_html: Þú hefur ekki skilgreint neinar reglur fyrir netþjón. + sidekiq_process_check: + message_html: Ekkert Sidekiq-ferli er í gangi fyrir %{value} biðröð/biðraðir. Endilega athugaðu Sidekiq-uppsetninguna þína tags: accounts_today: Einstök afnot í dag accounts_week: Einstök afnot í þessari viku breakdown: Samantekt á notkun dagsins eftir uppruna - context: Samhengi - directory: Í möppunni - in_directory: "%{count} í möppunni" last_active: Síðasta virkni most_popular: Vinsælast most_recent: Nýjast @@ -677,6 +702,7 @@ is: add_new: Bæta við nýju delete: Eyða edit_preset: Breyta forstilltri aðvörun + empty: Þú hefur ekki enn skilgreint neinar aðvaranaforstillingar. title: Sýsla með forstilltar aðvaranir admin_mailer: new_pending_account: @@ -966,6 +992,17 @@ is: lists: errors: limit: Þú hefur náð hámarksfjölda lista + login_activities: + authentication_methods: + otp: tveggja-þátta auðkenningarforrit + password: lykilorð + sign_in_token: öryggiskóði í tölvupósti + webauthn: öryggislyklar + description_html: Ef þú sérð einhverja virkni sem þú kannast ekki við, skaltu íhuga að skipta um lykilorð og að virkja tveggja-þátta auðkenningu. + empty: Enginn aðkenningarferill tiltækur + failed_sign_in_html: Misheppnuð tilraun til innskráningar með %{method} frá %{ip} (%{browser}) + successful_sign_in_html: Vel heppnuð tilraun til innskráningar með %{method} frá %{ip} (%{browser}) + title: Auðkenningarferill media_attachments: validations: images_and_video: Ekki er hægt að hengja myndskeið við stöðufærslu sem þegar inniheldur myndir @@ -1038,10 +1075,14 @@ is: body: "%{name} minntist á þig í:" subject: "%{name} minntist á þig" title: Ný tilvísun + poll: + subject: Könnun frá %{name} er lokið reblog: body: "%{name} endurbirti stöðufærsluna þína:" subject: "%{name} endurbirti stöðufærsluna þína" title: Ný endurbirting + status: + subject: "%{name} sendi inn rétt í þessu" notifications: email_events: Atburðir fyrir tilkynningar í tölvupósti email_events_hint: 'Veldu þá atburði sem þú vilt fá tilkynningar í tölvupósti þegar þeir koma upp:' @@ -1168,6 +1209,7 @@ is: revoke: Afturkalla revoke_success: Tókst að afturkalla setu title: Setur + view_authentication_history: Skoða aðkenningarferil aðgangsins þíns settings: account: Notandaaðgangur account_settings: Stillingar notandaaðgangs @@ -1188,10 +1230,9 @@ is: preferences: Kjörstillingar profile: Notandasnið relationships: Fylgist með og fylgjendur + statuses_cleanup: Sjálfvirk eyðing færslna two_factor_authentication: Tveggja-þátta auðkenning webauthn_authentication: Öryggislyklar - spam_check: - spam_detected: Þetta er sjálfvirk kæra. Ruslpóstur hefur fundist. statuses: attached: audio: @@ -1234,12 +1275,47 @@ is: sign_in_to_participate: Skráðu þig inn til að taka þátt í samtalinu title: "%{name}: „%{quote}‟" visibilities: + direct: Beint private: Einungis fylgjendur private_long: Aðeins birt fylgjendum public: Opinber public_long: Allir geta séð unlisted: Óskráð unlisted_long: Allir geta skoðað, en er ekki talið upp á opinberum tímalínum + statuses_cleanup: + enabled: Sjálfkrafa eyða eldri færslum + enabled_hint: Eyðir sjálfkrafa færslum þínum um leið og þær ná tilteknum aldursmörkum, nema ef þær samsvara einni af undantekningunum hér fyrir neðan + exceptions: Undantekningar + explanation: Þar sem eyðing færslna gerir talsverðar kröfur til kerfisins, er þetta gert smátt og smátt þegar netþjónninn er ekki upptekinn við annað. Að þessum sökum má vera að færslunum þínum sé eytt einhverjum tíma eftir að þær ná skilgreindum aldursmörkum. + ignore_favs: Hunsa eftirlæti + ignore_reblogs: Hunsa endurbirtingar + interaction_exceptions: Undantekningar byggðar á gagnvirkni + interaction_exceptions_explanation: Athugaðu að ekki er öruggt að færslum sé eytt við að fara niður fyrir skilgreind mörk eftirlæta eða endurbirtinga ef þær hafa einu sinni farið upp fyrir þessi mörk. + keep_direct: Halda beinum skilaboðum + keep_direct_hint: Eyðir ekki neinum af beinu skilaboðunum þínum + keep_media: Halda færslum með myndaviðhengjum + keep_media_hint: Eyðir ekki neinum af færslunum þínum sem eru með myndaviðhengi + keep_pinned: Halda festum færslum + keep_pinned_hint: Eyðir ekki neinum af festu færslunum þínum + keep_polls: Halda könnunum + keep_polls_hint: Eyðir ekki neinum af könnununum þínum + keep_self_bookmark: Halda bókamerktum færslum + keep_self_bookmark_hint: Eyðir ekki þínum eigin færslum ef þú hefur bókamerkt þær + keep_self_fav: Halda eftirlætisfærslum + keep_self_fav_hint: Eyðir ekki þínum eigin færslum ef þú hefur sett þær í eftirlæti + min_age: + '1209600': 2 vikur + '15778476': 6 mánuðir + '2629746': 1 mánuður + '31556952': 1 ár + '5259492': 2 mánuðir + '63113904': 2 ár + '7889238': 3 mánuðir + min_age_label: Aldursmörk + min_favs: Halda færslum sem eru í eftirlætum oftar en + min_favs_hint: Eyðir ekki þínum eigin færslum sem settar hafa verið í eftirlæti þetta oft. Skildu þetta eftir autt til að eyða færslum burtséð frá fjölda eftirlæta + min_reblogs: Halda færslum sem eru endurbirtar oftar en + min_reblogs_hint: Eyðir ekki þínum eigin færslum sem endurbirtar hafa verið þetta oft. Skildu þetta eftir autt til að eyða færslum burtséð frá fjölda endurbirtinga stream_entries: pinned: Fest tíst reblogged: endurbirt @@ -1402,11 +1478,8 @@ is: tips: Ábendingar title: Velkomin/n um borð, %{name}! users: - blocked_email_provider: Þessi tölvupóstþjónusta er ekki leyfileg follow_limit_reached: Þú getur ekki fylgst með fleiri en %{limit} aðilum generic_access_help_html: Vandamál við að tengjast aðgangnum þínum? Þú getur sett þig í samband við %{email} til að fá aðstoð - invalid_email: Tölvupóstfangið er ógilt - invalid_email_mx: Tölvupóstfangið virðist ekki vera til invalid_otp_token: Ógildur tveggja-þátta kóði invalid_sign_in_token: Ógildur öryggiskóði otp_lost_help_html: Ef þú hefur misst aðganginn að hvoru tveggja, geturðu sett þig í samband við %{email} diff --git a/config/locales/it.yml b/config/locales/it.yml index 1e0ab42f09..8194e4a2cb 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -26,6 +26,8 @@ it: È utilizzato per scopi di federazione e non dovrebbe essere bloccato a meno che non si voglia bloccare l'intera istanza: in questo caso si dovrebbe utilizzare un blocco di dominio. learn_more: Scopri altro privacy_policy: Politica della privacy + rules: Regole del server + rules_html: 'Di seguito è riportato un riassunto delle regole che devi seguire se vuoi avere un account su questo server di Mastodon:' see_whats_happening: Guarda cosa succede server_stats: 'Statistiche del server:' source_code: Codice sorgente @@ -35,7 +37,7 @@ it: status_count_before: Che hanno pubblicato tagline: Segui amici e trovane di nuovi terms: Termini di Servizio - unavailable_content: Contenuto non disponibile + unavailable_content: Server moderati unavailable_content_description: domain: Server reason: 'Motivo:' @@ -78,7 +80,6 @@ it: other: Toot posts_tab_heading: Toot posts_with_replies: Toot e risposte - reserved_username: Questo nome utente è già stato preso roles: admin: Amministratore bot: Bot @@ -118,6 +119,7 @@ it: demote: Declassa destroyed_msg: I dati di %{username} sono ora in coda per essere eliminati tra poco disable: Disabilita + disable_sign_in_token_auth: Disabilita autenticazione con token email disable_two_factor_authentication: Disabilita l'autenticazione a due fattori disabled: Disabilitato display_name: Nome visualizzato @@ -126,6 +128,7 @@ it: email: Email email_status: Stato email enable: Abilita + enable_sign_in_token_auth: Abilita autenticazione con token email enabled: Abilitato enabled_msg: L'account di %{username} è stato scongelato followers: Follower @@ -190,6 +193,10 @@ it: search: Cerca search_same_email_domain: Altri utenti con lo stesso dominio e-mail search_same_ip: Altri utenti con lo stesso IP + security_measures: + only_password: Solo password + password_and_2fa: Password e autenticazione a due fattori + password_and_sign_in_token: Password e codice via email sensitive: Sensibile sensitized: contrassegnato come sensibile shared_inbox_url: URL Inbox Condiviso @@ -229,6 +236,7 @@ it: create_domain_block: Crea blocco di dominio create_email_domain_block: Crea blocco dominio e-mail create_ip_block: Crea regola IP + create_unavailable_domain: Crea dominio non disponibile demote_user: Degrada l'utente destroy_announcement: Cancella annuncio destroy_custom_emoji: Cancella emoji personalizzata @@ -237,10 +245,13 @@ it: destroy_email_domain_block: Cancella blocco dominio e-mail destroy_ip_block: Elimina regola IP destroy_status: Cancella stato + destroy_unavailable_domain: Elimina dominio non disponibile disable_2fa_user: Disabilita l'autenticazione a due fattori disable_custom_emoji: Disabilita emoji personalizzata + disable_sign_in_token_auth_user: Disabilita autenticazione con codice via email per l'utente disable_user: Disabilita utente enable_custom_emoji: Abilita emoji personalizzata + enable_sign_in_token_auth_user: Abilita autenticazione con codice via email per l'utente enable_user: Abilita utente memorialize_account: Trasforma in account commemorativo promote_user: Promuovi utente @@ -260,46 +271,50 @@ it: update_domain_block: Aggiorna blocco di dominio update_status: Aggiorna stato actions: - assigned_to_self_report: "%{name} ha assegnato il rapporto %{target} a se stesso" - change_email_user: "%{name} ha cambiato l'indirizzo email per l'utente %{target}" - confirm_user: "%{name} ha confermato l'indirizzo email per l'utente %{target}" - create_account_warning: "%{name} ha mandato un avvertimento a %{target}" - create_announcement: "%{name} ha creato un nuovo annuncio %{target}" - create_custom_emoji: "%{name} ha caricato un nuovo emoji %{target}" - create_domain_allow: "%{name} ha messo il dominio %{target} nella whitelist" - create_domain_block: "%{name} ha bloccato il dominio %{target}" - create_email_domain_block: "%{name} ha messo il dominio email %{target} nella blacklist" - create_ip_block: "%{name} ha creato la regola per l'IP %{target}" - demote_user: "%{name} ha degradato l'utente %{target}" - destroy_announcement: "%{name} ha eliminato l'annuncio %{target}" - destroy_custom_emoji: "%{name} ha distrutto l'emoji %{target}" - destroy_domain_allow: "%{name} ha tolto il dominio %{target} dalla whitelist" - destroy_domain_block: "%{name} ha sbloccato il dominio %{target}" - destroy_email_domain_block: "%{name}ha messo il dominio email %{target} nella whitelist" - destroy_ip_block: "%{name} ha eliminato la regola per l'IP %{target}" - destroy_status: "%{name} ha eliminato lo status di %{target}" - disable_2fa_user: "%{name} ha disabilitato l'obbligo dei due fattori per l'utente %{target}" - disable_custom_emoji: "%{name} ha disabilitato l'emoji %{target}" - disable_user: "%{name} ha disabilitato il login per l'utente %{target}" - enable_custom_emoji: "%{name} ha abilitato l'emoji %{target}" - enable_user: "%{name} ha abilitato il login per l'utente %{target}" - memorialize_account: "%{name} ha trasformato l'account di %{target} in una pagina in memoriam" - promote_user: "%{name} ha promosso l'utente %{target}" - remove_avatar_user: "%{name} ha eliminato l'avatar di %{target}" - reopen_report: "%{name} ha riaperto il rapporto %{target}" - reset_password_user: "%{name} ha reimpostato la password dell'utente %{target}" - resolve_report: "%{name} ha risolto il rapporto %{target}" - sensitive_account: "%{name} ha contrassegnato il media di %{target} come sensibile" - silence_account: "%{name} ha silenziato l'account di %{target}" - suspend_account: "%{name} ha sospeso l'account di %{target}" - unassigned_report: "%{name} report non assegnato %{target}" - unsensitive_account: "%{name} ha deselezionato il media di %{target} come sensibile" - unsilence_account: "%{name} ha de-silenziato l'account di %{target}" - unsuspend_account: "%{name} ha annullato la sospensione dell'account di %{target}" - update_announcement: "%{name} ha aggiornato l'annuncio %{target}" - update_custom_emoji: "%{name} ha aggiornato l'emoji %{target}" - update_domain_block: "%{name} ha aggiornato il blocco di dominio per %{target}" - update_status: "%{name} stato aggiornato da %{target}" + assigned_to_self_report_html: "%{name} ha assegnato il rapporto %{target} a se stesso" + change_email_user_html: "%{name} ha cambiato l'indirizzo e-mail dell'utente %{target}" + confirm_user_html: "%{name} ha confermato l'indirizzo e-mail dell'utente %{target}" + create_account_warning_html: "%{name} ha inviato un avviso a %{target}" + create_announcement_html: "%{name} ha creato un nuovo annuncio %{target}" + create_custom_emoji_html: "%{name} ha caricato una nuova emoji %{target}" + create_domain_allow_html: "%{name} ha consentito alla federazione col dominio %{target}" + create_domain_block_html: "%{name} ha bloccato dominio %{target}" + create_email_domain_block_html: "%{name} ha bloccato dominio e-mail %{target}" + create_ip_block_html: "%{name} ha creato una regola per l'IP %{target}" + create_unavailable_domain_html: "%{name} ha interrotto la consegna al dominio %{target}" + demote_user_html: "%{name} ha retrocesso l'utente %{target}" + destroy_announcement_html: "%{name} ha eliminato l'annuncio %{target}" + destroy_custom_emoji_html: "%{name} ha eliminato emoji %{target}" + destroy_domain_allow_html: "%{name} ha negato la federazione al dominio %{target}" + destroy_domain_block_html: "%{name} ha sbloccato dominio %{target}" + destroy_email_domain_block_html: "%{name} ha sbloccato il dominio e-mail %{target}" + destroy_ip_block_html: "%{name} ha eliminato la regola per l'IP %{target}" + destroy_status_html: "%{name} ha eliminato lo status di %{target}" + destroy_unavailable_domain_html: "%{name} ha ripreso la consegna al dominio %{target}" + disable_2fa_user_html: "%{name} ha disabilitato l'autenticazione a due fattori per l'utente %{target}" + disable_custom_emoji_html: "%{name} ha disabilitato emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} ha disabilitato l'autenticazione con codice via email per %{target}" + disable_user_html: "%{name} ha disabilitato il login per l'utente %{target}" + enable_custom_emoji_html: "%{name} ha abilitato emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} ha abilitato l'autenticazione con codice via email per %{target}" + enable_user_html: "%{name} ha abilitato il login per l'utente %{target}" + memorialize_account_html: "%{name} ha trasformato l'account di %{target} in una pagina in memoriam" + promote_user_html: "%{name} ha promosso l'utente %{target}" + remove_avatar_user_html: "%{name} ha rimosso l'immagine profilo di %{target}" + reopen_report_html: "%{name} ha riaperto il rapporto %{target}" + reset_password_user_html: "%{name} ha reimpostato la password dell'utente %{target}" + resolve_report_html: "%{name} ha risolto il rapporto %{target}" + sensitive_account_html: "%{name} ha segnato il media di %{target} come sensibile" + silence_account_html: "%{name} ha silenziato l'account di %{target}" + suspend_account_html: "%{name} ha sospeso l'account di %{target}" + unassigned_report_html: "%{name} ha disassegnato il rapporto %{target}" + unsensitive_account_html: "%{name} ha annullato il segnare il media di %{target} come sensibile" + unsilence_account_html: "%{name} ha riattivato l'account di %{target}" + unsuspend_account_html: "%{name} ha annullato la sospensione dell'account di %{target}" + update_announcement_html: "%{name} ha aggiornato l'annuncio %{target}" + update_custom_emoji_html: "%{name} ha aggiornato emoji %{target}" + update_domain_block_html: "%{name} ha aggiornato il blocco dominio per %{target}" + update_status_html: "%{name} ha aggiornato lo status di %{target}" deleted_status: "(stato cancellato)" empty: Nessun log trovato. filter_by_action: Filtra per azione @@ -314,10 +329,12 @@ it: new: create: Crea annuncio title: Nuovo annuncio + publish: Pubblica published_msg: Annuncio pubblicato! scheduled_for: Programmato per %{time} scheduled_msg: Annuncio programmato per la pubblicazione! title: Annunci + unpublish: Annulla la pubblicazione unpublished_msg: Annuncio ritirato! updated_msg: Annuncio aggiornato! custom_emojis: @@ -354,33 +371,25 @@ it: updated_msg: Emoji aggiornata con successo! upload: Carica dashboard: - authorized_fetch_mode: Modalità sicura - backlog: lavori arretrati - config: Configurazione - feature_deletions: Cancellazioni di account - feature_invites: Link di invito - feature_profile_directory: Directory dei profili - feature_registrations: Registrazioni - feature_relay: Ripetitore di federazione - feature_spam_check: Anti-spam - feature_timeline_preview: Anteprima timeline - features: Funzionalità - hidden_service: Federazione con servizi nascosti - open_reports: apri report - pending_tags: hashtag in attesa di essere esaminati - pending_users: utenti in attesa di essere esaminati - recent_users: Utenti Recenti - search: Ricerca testo intero - single_user_mode: Modalita utente singolo + active_users: utenti attivi + interactions: interazioni + media_storage: Archiviazione media + new_users: nuovi utenti + opened_reports: rapporti aperti + pending_reports_html: + one: "1 rapporto in attesa" + other: "%{count} rapporti in attesa" + pending_users_html: + one: "1 utente in attesa" + other: "%{count} utenti in attesa" + resolved_reports: segnalazioni risolte software: Software + sources: Sorgenti di registrazione space: Utilizzo dello spazio title: Cruscotto - total_users: utenti totali - trends: Tendenze - week_interactions: interazioni per questa settimana - week_users_active: attivi questa settimana - week_users_new: utenti questa settimana - whitelist_mode: Modalità whitelist + top_languages: Lingue più attive + top_servers: Server più attivi + website: Sito web domain_allows: add_new: Dominio nella whitelist created_msg: Il dominio è stato inserito nella whitelist @@ -440,9 +449,34 @@ it: create: Aggiungi dominio title: Nuova voce della lista nera delle email title: Lista nera email + follow_recommendations: + description_html: "I consigli su chi seguire aiutano i nuovi utenti a trovare rapidamente dei contenuti interessanti. Quando un utente non ha interagito abbastanza con altri per avere dei consigli personalizzati, vengono consigliati questi account. Sono ricalcolati ogni giorno da un misto di account con le più alte interazioni recenti e con il maggior numero di seguaci locali per una data lingua." + language: Per lingua + status: Stato + suppress: Nascondi consigli su chi seguire + suppressed: Nascosti + title: Consigli su chi seguire + unsuppress: Ripristina consigli su chi seguire instances: + back_to_all: Tutto + back_to_limited: Limitato + back_to_warning: Avviso by_domain: Dominio + delivery: + all: Tutto + clear: Cancella errori di consegna + restart: Riavvia la consegna + stop: Interrompi consegna + title: Consegna + unavailable: Non disponibile + unavailable_message: Consegna non disponibile + warning: Avviso + warning_message: + one: Errore di consegna %{count} giorno + other: Errori di consegna %{count} giorni delivery_available: Distribuzione disponibile + delivery_error_days: Giorni con errori di consegna + delivery_error_hint: Se la consegna non è possibile per %{count} giorni, sarà automaticamente contrassegnata come non consegnabile. empty: Nessun dominio trovato. known_accounts: one: "%{count} account noto" @@ -538,10 +572,18 @@ it: resolved: Risolto resolved_msg: Rapporto risolto! status: Stato + target_origin: Origine dell'account segnalato title: Rapporti unassign: Non assegnare unresolved: Non risolto updated_at: Aggiornato + rules: + add_new: Aggiungi regola + delete: Cancella + description_html: Mentre la maggior parte degli utenti sostiene di aver letto e accettato i termini di servizio, di solito non li leggono fino a quando sorge un problema. Rendi più facile vedere le regole del server, fornendole in un semplice elenco. Cerca di mantenere le singole regole brevi e semplici, ma cerca anche di non dividerle in molti elementi separati. + edit: Modifica regola + empty: Non sono ancora state definite regole del server. + title: Regole del server settings: activity_api_enabled: desc_html: Conteggi degli status pubblicati localmente, degli utenti attivi e delle nuove registrazioni in gruppi settimanali @@ -565,9 +607,6 @@ it: users: Agli utenti locali connessi domain_blocks_rationale: title: Mostra motivazione - enable_bootstrap_timeline_accounts: - desc_html: I nuovi utenti seguiranno automaticamente gli account configurati, in modo che il loro home feed all'inizio non sia vuoto - title: Abilita seguiti predefiniti per i nuovi utenti hero: desc_html: Mostrata nella pagina iniziale. Almeno 600x100 px consigliati. Se non impostata, sarà usato il thumbnail del server title: Immagine dell'eroe @@ -621,9 +660,6 @@ it: desc_html: Potete scrivere la vostra politica sulla privacy, condizioni del servizio o altre informazioni legali. Potete usare tag HTML title: Termini di servizio personalizzati site_title: Nome del server - spam_check_enabled: - desc_html: Mastodon può silenziare e segnalare automaticamente account che inviano ripetutamente messaggi non richiesti. Potrebbero esserci falsi positivi. - title: Automazione anti-spam thumbnail: desc_html: Usato per anteprime tramite OpenGraph e API. 1200x630px consigliati title: Thumbnail del server @@ -654,13 +690,18 @@ it: no_status_selected: Nessun status è stato modificato perché nessuno era stato selezionato title: Gli status dell'account with_media: con media + system_checks: + database_schema_check: + message_html: Ci sono migrazioni del database in attesa. Sei pregato di eseguirle per assicurarti che l'applicazione si comporti come previsto + rules_check: + action: Gestisci regole del server + message_html: Non hai definito alcuna regola del server. + sidekiq_process_check: + message_html: Nessun processo di Sidekiq in esecuzione per le code di %{value}. Sei pregato di revisionare la tua configurazione di Sidekiq tags: accounts_today: Usi unici oggi accounts_week: Usi unici questa settimana breakdown: Suddivisione dell'utilizzo di oggi per fonte - context: Contesto - directory: Nella directory - in_directory: "%{count} nella directory" last_active: Ultima attività most_popular: Più popolari most_recent: Più recenti @@ -677,6 +718,7 @@ it: add_new: Aggiungi nuovo delete: Cancella edit_preset: Modifica avviso predefinito + empty: Non hai ancora definito alcun avviso preimpostato. title: Gestisci avvisi predefiniti admin_mailer: new_pending_account: @@ -688,7 +730,7 @@ it: subject: Nuova segnalazione per %{instance} (#%{id}) new_trending_tag: body: 'L''hashtag #%{name} oggi è di tendenza, ma non è stato mai controllato. Non sarà visualizzato pubblicamente se non lo permetti; se salvi il form senza modifiche non lo vedrai mai più.' - subject: Nuovo hashtag pronto per essere controllato su %{instance} (%{name}) + subject: Nuovo hashtag pronto per essere controllato su %{instance} (#%{name}) aliases: add_new: Crea alias created_msg: Hai creato un nuovo alias. Ora puoi iniziare lo spostamento dal vecchio account. @@ -968,6 +1010,17 @@ it: lists: errors: limit: Hai raggiunto il numero massimo di liste + login_activities: + authentication_methods: + otp: app per autenticazione a due fattori + password: password + sign_in_token: codice di sicurezza via e-mail + webauthn: chiavi di sicurezza + description_html: Se vedi attività non riconosciuta, considera di cambiare la tua password e di abilitare l'autenticazione a due fattori. + empty: Cronologia di autenticazione non disponibile + failed_sign_in_html: Tentativo di accesso fallito con %{method} da %{ip} (%{browser}) + successful_sign_in_html: Accesso riuscito con %{method} da %{ip} (%{browser}) + title: Cronologia delle autenticazioni media_attachments: validations: images_and_video: Impossibile allegare video a un post che contiene già immagini @@ -1040,10 +1093,14 @@ it: body: 'Sei stato menzionato da %{name} su:' subject: Sei stato menzionato da %{name} title: Nuova menzione + poll: + subject: Un sondaggio da %{name} è terminato reblog: body: 'Il tuo status è stato condiviso da %{name}:' subject: "%{name} ha condiviso il tuo status" title: Nuova condivisione + status: + subject: "%{name} ha appena pubblicato un post" notifications: email_events: Eventi per notifiche via email email_events_hint: 'Seleziona gli eventi per i quali vuoi ricevere le notifiche:' @@ -1170,6 +1227,7 @@ it: revoke: Revoca revoke_success: Sessione revocata con successo title: Sessioni + view_authentication_history: Visualizza la cronologia di autenticazione del tuo account settings: account: Account account_settings: Impostazioni dell'account @@ -1190,10 +1248,9 @@ it: preferences: Preferenze profile: Profilo relationships: Follows e followers + statuses_cleanup: Cancellazione automatica dei post two_factor_authentication: Autenticazione a due fattori webauthn_authentication: Chiavi di sicurezza - spam_check: - spam_detected: Questo è un rapporto automatico. È stato rilevato dello spam. statuses: attached: audio: @@ -1236,12 +1293,47 @@ it: sign_in_to_participate: Accedi per partecipare alla conversazione title: '%{name}: "%{quote}"' visibilities: + direct: Diretto private: Mostra solo ai tuoi seguaci private_long: Mostra solo ai seguaci public: Pubblico public_long: Tutti lo possono vedere unlisted: Pubblico, ma non visibile sulla timeline pubblica unlisted_long: Tutti lo possono vedere, ma non compare nelle timeline pubbliche + statuses_cleanup: + enabled: Cancella automaticamente i vecchi post + enabled_hint: Cancella automaticamente i tuoi post quando diventano più vecchi di una soglia di età specificata, a meno che non corrispondano a una delle eccezioni sotto + exceptions: Eccezioni + explanation: Poiché l'eliminazione dei post è un'operazione che richiede molte risorse, questa viene eseguita quando il server non è occupato da altre operazioni. Per questo motivo, i tuoi post possono essere cancellati un po' dopo che raggiungono la soglia di età. + ignore_favs: Ignora preferiti + ignore_reblogs: Ignora condivisioni + interaction_exceptions: Eccezioni basate sulle interazioni + interaction_exceptions_explanation: Tieni conto che non c'è garanzia che i post vengano cancellati se vanno al di sotto della soglia per i preferiti o i condivisi dopo averla superata. + keep_direct: Conserva messaggi diretti + keep_direct_hint: Non cancella nessuno dei tuoi messaggi diretti + keep_media: Conserva post con media allegati + keep_media_hint: Non cancella nessuno dei tuoi post che hanno media allegati + keep_pinned: Conserva post fissati in cima + keep_pinned_hint: Non cancella nessuno dei tuoi post fissati in cima + keep_polls: Conserva sondaggi + keep_polls_hint: Non cancella nessuno dei tuoi sondaggi + keep_self_bookmark: Conserva post che hai marcato con segnalibro + keep_self_bookmark_hint: Non cancella i tuoi post se li hai marcati con segnalibro + keep_self_fav: Conserva post che hai marcato come apprezzato + keep_self_fav_hint: Non cancella i tuoi post se li hai marcati come apprezzati + min_age: + '1209600': 2 settimane + '15778476': 6 mesi + '2629746': 1 mese + '31556952': 1 anno + '5259492': 2 mesi + '63113904': 2 anni + '7889238': 3 mesi + min_age_label: Soglia di età + min_favs: Conserva i post preferiti più di + min_favs_hint: Non cancella nessuno dei tuoi post che ha ricevuto più di questo numero di preferiti. Lascia vuoto per cancellare i post indipendentemente dal loro numero di preferiti + min_reblogs: Conserva i post condivisi più di + min_reblogs_hint: Non cancella nessuno dei tuoi post che è stato condiviso più di questo numero di volte. Lascia vuoto per cancellare i post indipendentemente dal loro numero di condivisioni stream_entries: pinned: Toot fissato in cima reblogged: condiviso @@ -1340,7 +1432,7 @@ it: mastodon-light: Mastodon (chiaro) time: formats: - default: "%b %d, %Y, %H:%M" + default: "%d %b %Y, %H:%M" month: "%b %Y" two_factor_authentication: add: Aggiungi @@ -1373,7 +1465,7 @@ it: disable: Mentre il tuo account è congelato, i tuoi dati dell'account rimangono intatti, ma non potrai eseguire nessuna azione fintanto che non viene sbloccato. sensitive: I tuoi file multimediali caricati e multimedia collegati saranno trattati come sensibili. silence: Mentre il tuo account è limitato, solo le persone che già ti seguono possono vedere i tuoi toot su questo server, e potresti essere escluso da vari elenchi pubblici. Comunque, altri possono manualmente seguirti. - suspend: Il tuo account è stato sospeso, e tutti i tuoi toot ed i tuoi file media caricati sono stati irreversibilmente rimossi da questo server, e dai server dove avevi dei seguaci. + suspend: Non puoi più utilizzare il tuo account, e il tuo profilo e altri dati non sono più accessibili. È ancora possibile effettuare il login per richiedere un backup dei dati fino a quando i dati non vengono completamente rimossi, ma conserveremo alcuni dati per impedirti di eludere la sospensione. get_in_touch: Puoi rispondere a questa email per entrare in contatto con lo staff di %{instance}. review_server_policies: Rivedi regole del server statuses: 'Nello specifico, per:' @@ -1407,11 +1499,8 @@ it: tips: Suggerimenti title: Benvenuto a bordo, %{name}! users: - blocked_email_provider: Questo provider di posta non è consentito follow_limit_reached: Non puoi seguire più di %{limit} persone generic_access_help_html: Problemi nell'accesso al tuo account? Puoi contattare %{email} per assistenza - invalid_email: L'indirizzo email inserito non è valido - invalid_email_mx: L'indirizzo e-mail non sembra esistere invalid_otp_token: Codice d'accesso non valido invalid_sign_in_token: Codice di sicurezza non valido otp_lost_help_html: Se perdessi l'accesso ad entrambi, puoi entrare in contatto con %{email} diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 1b5eeec8d2..85c22a0f4d 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1,7 +1,7 @@ --- ja: about: - about_hashtag_html: ハッシュタグ #%{hashtag} の付いた公開トゥートです。どこでもいいので、連合に参加しているSNS上にアカウントを作れば会話に参加することができます。 + about_hashtag_html: ハッシュタグ #%{hashtag} の付いた公開投稿です。どこでもいいので、連合に参加しているSNS上にアカウントを作れば会話に参加することができます。 about_mastodon_html: Mastodon は、オープンなウェブプロトコルを採用した、自由でオープンソースなソーシャルネットワークです。電子メールのような分散型の仕組みを採っています。 about_this: 詳細情報 active_count_after: 人アクティブ @@ -21,17 +21,17 @@ ja: federation_hint_html: "%{instance} のアカウントひとつでどんなMastodon互換サーバーのユーザーでもフォローできるでしょう。" get_apps: モバイルアプリを試す hosted_on: Mastodon hosted on %{domain} - instance_actor_flash: 'このアカウントはサーバーそのものを示す仮想的なもので、特定のユーザーを示すものではありません。これはサーバーの連合のために使用されます。サーバー全体をブロックするときは、このアカウントをブロックせずに、ドメインブロックを使用してください。 - -' + instance_actor_flash: "このアカウントはサーバーそのものを示す仮想的なもので、特定のユーザーを示すものではありません。これはサーバーの連合のために使用されます。サーバー全体をブロックするときは、このアカウントをブロックせずに、ドメインブロックを使用してください。 \n" learn_more: もっと詳しく privacy_policy: プライバシーポリシー + rules: サーバーのルール + rules_html: 'このMastodonサーバーには、アカウントの所持にあたって従うべきルールが設定されています。概要は以下の通りです:' see_whats_happening: やりとりを見てみる server_stats: 'サーバー統計:' source_code: ソースコード status_count_after: - other: トゥート - status_count_before: トゥート数 + other: 投稿 + status_count_before: 投稿数 tagline: Follow friends and discover new ones terms: 利用規約 unavailable_content: 制限中のサーバー @@ -71,10 +71,9 @@ ja: pin_errors: following: おすすめしたい人はあなたが既にフォローしている必要があります posts: - other: トゥート - posts_tab_heading: トゥート - posts_with_replies: トゥートと返信 - reserved_username: このユーザー名は予約されています + other: 投稿 + posts_tab_heading: 投稿 + posts_with_replies: 投稿と返信 roles: admin: Admin bot: Bot @@ -186,6 +185,8 @@ ja: search: 検索 search_same_email_domain: 同じドメインのメールアドレスを使用しているユーザー search_same_ip: 同じ IP のユーザーを検索 + security_measures: + password_and_2fa: パスワードと 2FA sensitive: 閲覧注意 sensitized: 閲覧注意済み shared_inbox_url: Shared inbox URL @@ -194,7 +195,7 @@ ja: targeted_reports: このアカウントについての通報 silence: サイレンス silenced: サイレンス済み - statuses: トゥート数 + statuses: 投稿数 subscribe: 購読する suspended: 停止済み suspension_irreversible: このアカウントのデータは削除され元に戻せなくなります。後日アカウントの凍結を解除することはできますがデータは元に戻せません。 @@ -225,6 +226,7 @@ ja: create_domain_block: ドメインブロックを作成 create_email_domain_block: メールドメインブロックを作成 create_ip_block: IPルールを作成 + create_unavailable_domain: 配送できないドメインを作成 demote_user: ユーザーを降格 destroy_announcement: お知らせを削除 destroy_custom_emoji: カスタム絵文字を削除 @@ -232,7 +234,8 @@ ja: destroy_domain_block: ドメインブロックを削除 destroy_email_domain_block: メールドメインブロックを削除 destroy_ip_block: IPルールを削除 - destroy_status: トゥートを削除 + destroy_status: 投稿を削除 + destroy_unavailable_domain: 配送できないドメインを削除 disable_2fa_user: 二段階認証を無効化 disable_custom_emoji: カスタム絵文字を無効化 disable_user: ユーザーを無効化 @@ -241,7 +244,7 @@ ja: memorialize_account: 追悼アカウント化 promote_user: ユーザーを昇格 remove_avatar_user: アイコンを削除 - reopen_report: 通報を再度開く + reopen_report: 未解決に戻す reset_password_user: パスワードをリセット resolve_report: 通報を解決済みにする sensitive_account: アカウントのメディアを閲覧注意にマーク @@ -254,48 +257,50 @@ ja: update_announcement: お知らせを更新 update_custom_emoji: カスタム絵文字を更新 update_domain_block: ドメインブロックを更新 - update_status: トゥートを更新 + update_status: 投稿を更新 actions: - assigned_to_self_report: "%{name} さんが通報 %{target} を自身の担当に割り当てました" - change_email_user: "%{name} さんが %{target} さんのメールアドレスを変更しました" - confirm_user: "%{name} さんが %{target} さんのメールアドレスを確認済みにしました" - create_account_warning: "%{name} さんが %{target} さんに警告メールを送信しました" - create_announcement: "%{name} さんが新しいお知らせ %{target} を作成しました" - create_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を追加しました" - create_domain_allow: "%{name} さんが %{target} の連合を許可しました" - create_domain_block: "%{name} さんがドメイン %{target} をブロックしました" - create_email_domain_block: "%{name} さんが %{target} をメールドメインブロックに追加しました" - create_ip_block: "%{name} さんが IP %{target} のルールを作成しました" - demote_user: "%{name} さんが %{target} さんを降格しました" - destroy_announcement: "%{name} さんがお知らせ %{target} を削除しました" - destroy_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を削除しました" - destroy_domain_allow: "%{name} さんが %{target} の連合許可を外しました" - destroy_domain_block: "%{name} さんがドメイン %{target} のブロックを外しました" - destroy_email_domain_block: "%{name} さんが %{target} をメールドメインブロックから外しました" - destroy_ip_block: "%{name} さんが IP %{target} のルールを削除しました" - destroy_status: "%{name} さんが %{target} さんのトゥートを削除しました" - disable_2fa_user: "%{name} さんが %{target} さんの二段階認証を無効化しました" - disable_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を無効化しました" - disable_user: "%{name} さんが %{target} さんのログインを無効化しました" - enable_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を有効化しました" - enable_user: "%{name} さんが %{target} さんのログインを有効化しました" - memorialize_account: "%{name} さんが %{target} さんを追悼アカウントページに登録しました" - promote_user: "%{name} さんが %{target} さんを昇格しました" - remove_avatar_user: "%{name} さんが %{target} さんのアイコンを削除しました" - reopen_report: "%{name} さんが通報 %{target} を再び開きました" - reset_password_user: "%{name} さんが %{target} さんのパスワードをリセットしました" - resolve_report: "%{name} さんが通報 %{target} を解決済みにしました" - sensitive_account: "%{name} さんが %{target} さんのメディアを閲覧注意にマークしました" - silence_account: "%{name} さんが %{target} さんをサイレンスにしました" - suspend_account: "%{name} さんが %{target} さんを停止しました" - unassigned_report: "%{name} さんが通報 %{target} の担当を外しました" - unsensitive_account: "%{name} さんが %{target} さんのメディアの閲覧注意を解除しました" - unsilence_account: "%{name} さんが %{target} さんのサイレンスを解除しました" - unsuspend_account: "%{name} さんが %{target} さんの停止を解除しました" - update_announcement: "%{name} さんがお知らせ %{target} を更新しました" - update_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を更新しました" - update_domain_block: "%{name} が %{target} のドメインブロックを更新しました" - update_status: "%{name} さんが %{target} さんのトゥートを更新しました" + assigned_to_self_report_html: "%{name} さんが通報 %{target} を自身の担当に割り当てました" + change_email_user_html: "%{name} さんが %{target} さんのメールアドレスを変更しました" + confirm_user_html: "%{name} さんが %{target} さんのメールアドレスを確認済みにしました" + create_account_warning_html: "%{name} さんが %{target} さんに警告メールを送信しました" + create_announcement_html: "%{name} さんが新しいお知らせ %{target} を作成しました" + create_custom_emoji_html: "%{name} さんがカスタム絵文字 %{target} を追加しました" + create_domain_allow_html: "%{name} さんが %{target} の連合を許可しました" + create_domain_block_html: "%{name} さんがドメイン %{target} をブロックしました" + create_email_domain_block_html: "%{name} さんが %{target} をメールドメインブロックに追加しました" + create_ip_block_html: "%{name} さんが IP %{target} のルールを作成しました" + create_unavailable_domain_html: "%{name} がドメイン %{target} への配送を停止しました" + demote_user_html: "%{name} さんが %{target} さんを降格しました" + destroy_announcement_html: "%{name} さんがお知らせ %{target} を削除しました" + destroy_custom_emoji_html: "%{name} さんがカスタム絵文字 %{target} を削除しました" + destroy_domain_allow_html: "%{name} さんが %{target} の連合許可を外しました" + destroy_domain_block_html: "%{name} さんがドメイン %{target} のブロックを外しました" + destroy_email_domain_block_html: "%{name} さんが %{target} をメールドメインブロックから外しました" + destroy_ip_block_html: "%{name} さんが IP %{target} のルールを削除しました" + destroy_status_html: "%{name} さんが %{target} さんの投稿を削除しました" + destroy_unavailable_domain_html: "%{name} がドメイン %{target} への配送を再開しました" + disable_2fa_user_html: "%{name} さんが %{target} さんの二段階認証を無効化しました" + disable_custom_emoji_html: "%{name} さんがカスタム絵文字 %{target} を無効化しました" + disable_user_html: "%{name} さんが %{target} さんのログインを無効化しました" + enable_custom_emoji_html: "%{name} さんがカスタム絵文字 %{target} を有効化しました" + enable_user_html: "%{name} さんが %{target} さんのログインを有効化しました" + memorialize_account_html: "%{name} さんが %{target} さんを追悼アカウントページに登録しました" + promote_user_html: "%{name} さんが %{target} さんを昇格しました" + remove_avatar_user_html: "%{name} さんが %{target} さんのアイコンを削除しました" + reopen_report_html: "%{name} さんが通報 %{target} を未解決に戻しました" + reset_password_user_html: "%{name} さんが %{target} さんのパスワードをリセットしました" + resolve_report_html: "%{name} さんが通報 %{target} を解決済みにしました" + sensitive_account_html: "%{name} さんが %{target} さんのメディアを閲覧注意にマークしました" + silence_account_html: "%{name} さんが %{target} さんをサイレンスにしました" + suspend_account_html: "%{name} さんが %{target} さんを停止しました" + unassigned_report_html: "%{name} さんが通報 %{target} の担当を外しました" + unsensitive_account_html: "%{name} さんが %{target} さんのメディアの閲覧注意を解除しました" + unsilence_account_html: "%{name} さんが %{target} さんのサイレンスを解除しました" + unsuspend_account_html: "%{name} さんが %{target} さんの停止を解除しました" + update_announcement_html: "%{name} さんがお知らせ %{target} を更新しました" + update_custom_emoji_html: "%{name} さんがカスタム絵文字 %{target} を更新しました" + update_domain_block_html: "%{name} が %{target} のドメインブロックを更新しました" + update_status_html: "%{name} さんが %{target} さんの投稿を更新しました" deleted_status: "(削除済)" empty: ログが見つかりませんでした filter_by_action: アクションでフィルター @@ -310,10 +315,12 @@ ja: new: create: お知らせを作成 title: お知らせを追加 + publish: 公開する published_msg: お知らせを掲載しました scheduled_for: "%{time} に予約" scheduled_msg: お知らせの掲載を予約しました title: お知らせ + unpublish: 非公開にする unpublished_msg: お知らせを非掲載にしました updated_msg: お知らせを更新しました custom_emojis: @@ -350,33 +357,9 @@ ja: updated_msg: 絵文字の更新に成功しました! upload: アップロード dashboard: - authorized_fetch_mode: セキュアモード - backlog: 未処理のジョブ - config: 構成 - feature_deletions: アカウント削除 - feature_invites: 招待リンク - feature_profile_directory: ディレクトリ - feature_registrations: 新規登録 - feature_relay: 連合リレー - feature_spam_check: スパム対策 - feature_timeline_preview: タイムラインプレビュー - features: 機能 - hidden_service: 秘匿サービスとの連合 - open_reports: 未解決の通報 - pending_tags: 審査待ちのハッシュタグ - pending_users: 承認待ちの人数 - recent_users: 最近登録したユーザー - search: 全文検索 - single_user_mode: シングルユーザーモード software: ソフトウェア space: ディスク使用量 title: ダッシュボード - total_users: 全ユーザー - trends: トレンドタグ - week_interactions: 今週交流のあった回数 - week_users_active: 今週活動した人数 - week_users_new: 今週登録した人数 - whitelist_mode: 連合制限モード domain_allows: add_new: 連合を許可 created_msg: 連合を許可しました @@ -393,7 +376,7 @@ ja: create: ブロックを作成 hint: ドメインブロックはデータベース中のアカウント項目の作成を妨げませんが、遡って自動的に指定されたモデレーションをそれらのアカウントに適用します。 severity: - desc_html: "サイレンスはアカウントのトゥートをフォローしていない人から隠します。停止はそのアカウントのコンテンツ、メディア、プロフィールデータをすべて削除します。メディアファイルを拒否したいだけの場合はなしを使います。" + desc_html: "サイレンスはアカウントの投稿をフォローしていない人から隠します。停止はそのアカウントのコンテンツ、メディア、プロフィールデータをすべて削除します。メディアファイルを拒否したいだけの場合はなしを使います。" noop: なし silence: サイレンス suspend: 停止 @@ -435,9 +418,33 @@ ja: create: ドメインを追加 title: 新規メールドメインブロック title: メールドメインブロック + follow_recommendations: + description_html: "おすすめフォローは、新規ユーザーが興味のあるコンテンツをすばやく見つけるのに役立ちます。ユーザーが他のユーザーとの交流を十分にしていない場合、パーソナライズされたおすすめフォローを生成する代わりに、これらのアカウントが表示されます。最近のエンゲージメントが最も高いアカウントと、特定の言語のローカルフォロワー数が最も多いアカウントを組み合わせて、毎日再計算されます。" + language: 言語 + status: ステータス + suppress: おすすめフォローに表示しない + suppressed: 非表示 + title: おすすめフォロー + unsuppress: おすすめフォローを復元 instances: + back_to_all: すべて + back_to_limited: 制限あり + back_to_warning: 警告あり by_domain: ドメイン + delivery: + all: すべて + clear: 配送エラーをクリア + restart: 配送を再開 + stop: 配送を停止 + title: 配送 + unavailable: 配送不可 + unavailable_message: 配送不可 + warning: 警告あり + warning_message: + other: "%{count} 日配送失敗" delivery_available: 配送可能 + delivery_error_days: 配送エラー発生日 + delivery_error_hint: "%{count} 日間配送ができない場合は、自動的に配送不可としてマークされます。" empty: ドメインが見つかりませんでした。 known_accounts: other: 既知のアカウント数 %{count} @@ -483,11 +490,11 @@ ja: relays: add_new: リレーを追加 delete: 削除 - description_html: "連合リレーとは、登録しているサーバー間の公開トゥートを仲介するサーバーです。中小規模のサーバーが連合のコンテンツを見つけるのを助けます。これを使用しない場合、ローカルユーザーがリモートユーザーを手動でフォローする必要があります。" + description_html: "連合リレーとは、登録しているサーバー間の公開投稿を仲介するサーバーです。中小規模のサーバーが連合のコンテンツを見つけるのを助けます。これを使用しない場合、ローカルユーザーがリモートユーザーを手動でフォローする必要があります。" disable: 無効化 disabled: 無効 enable: 有効化 - enable_hint: 有効にすると、リレーから全ての公開トゥートを受信するようになり、またこのサーバーの全ての公開トゥートをリレーに送信するようになります。 + enable_hint: 有効にすると、リレーから全ての公開投稿を受信するようになり、またこのサーバーの全ての公開投稿をリレーに送信するようになります。 enabled: 有効 inbox_url: リレーURL pending: リレーサーバーの承認待ちです @@ -516,14 +523,14 @@ ja: forwarded: 転送済み forwarded_to: "%{domain} に転送されました" mark_as_resolved: 解決済みとしてマーク - mark_as_unresolved: 未解決として再び開く + mark_as_unresolved: 未解決に戻す notes: create: 書き込む create_and_resolve: 書き込み、解決済みにする - create_and_unresolve: 書き込み、未解決として開く + create_and_unresolve: 書き込み、未解決に戻す delete: 削除 placeholder: どのような措置が取られたか、または関連する更新を記述してください… - reopen: 再び開く + reopen: 未解決に戻す report: 通報#%{id} reported_account: 報告対象アカウント reported_by: 報告者 @@ -534,13 +541,20 @@ ja: unassign: 担当を外す unresolved: 未解決 updated_at: 更新日時 + rules: + add_new: ルールを追加 + delete: 削除 + description_html: たいていの人が利用規約を読んで同意したと言いますが、普通は問題が発生するまで読みません。箇条書きにして、サーバーのルールが一目で分かるようにしましょう。個々のルールは短くシンプルなものにし、多くの項目に分割しないようにしましょう。 + edit: ルールを編集 + empty: サーバーのルールが定義されていません。 + title: サーバーのルール settings: activity_api_enabled: - desc_html: 週ごとのローカルに投稿されたトゥート数、アクティブなユーザー数、新規登録者数 + desc_html: 週ごとのローカルに投稿された投稿数、アクティブなユーザー数、新規登録者数 title: ユーザーアクティビティに関する統計を公開する bootstrap_timeline_accounts: - desc_html: 複数のユーザー名はコンマで区切ります。ローカルの公開アカウントのみ有効です。指定しない場合は管理者がデフォルトで指定されます。 - title: 新規ユーザーが自動フォローするアカウント + desc_html: 複数のユーザー名を指定する場合コンマで区切ります。おすすめに表示されます。 + title: 新規ユーザーにおすすめするアカウント contact_information: email: ビジネスメールアドレス username: 連絡先ユーザー名 @@ -557,9 +571,6 @@ ja: users: ログイン済みローカルユーザーのみ許可 domain_blocks_rationale: title: コメントを表示 - enable_bootstrap_timeline_accounts: - desc_html: 新規ユーザーが設定したアカウントを自動的にフォローして、ホームフィードが空にならないようにする - title: 新規ユーザーの自動フォローを有効にする hero: desc_html: フロントページに表示されます。サイズは600x100px以上推奨です。未設定の場合、標準のサムネイルが使用されます title: ヒーローイメージ @@ -595,7 +606,7 @@ ja: open: 誰でも登録可 title: 新規登録 show_known_fediverse_at_about_page: - desc_html: チェックを外すと、ランディングページからリンクされた公開タイムラインにローカルの公開トゥートのみ表示します。 + desc_html: チェックを外すと、ランディングページからリンクされた公開タイムラインにローカルの公開投稿のみ表示します。 title: 公開タイムラインに連合先のコンテンツも表示する show_staff_badge: desc_html: ユーザーページにスタッフのバッジを表示します @@ -613,9 +624,6 @@ ja: desc_html: 独自のプライバシーポリシーや利用規約、その他の法的根拠を記述できます。HTMLタグが使えます title: カスタム利用規約 site_title: サーバーの名前 - spam_check_enabled: - desc_html: 迷惑なメッセージを繰り返し送信するアカウントを自動で通報することができます。誤検知を含む可能性があります。 - title: スパム対策を有効にする thumbnail: desc_html: OpenGraphとAPIによるプレビューに使用されます。サイズは1200×630px推奨です title: サーバーのサムネイル @@ -644,15 +652,20 @@ ja: title: メディア no_media: メディアなし no_status_selected: 何も選択されていないため、変更されていません - title: トゥート一覧 + title: 投稿一覧 with_media: メディアあり + system_checks: + database_schema_check: + message_html: 未実行のデータベースマイグレーションがあります。実行して正常に動作するようにしてください。 + rules_check: + action: サーバーのルールを管理 + message_html: サーバーのルールを定義していません。 + sidekiq_process_check: + message_html: "%{value} キューに対応するSidekiq プロセスがありません。Sidekiq の設定を確認してください。" tags: accounts_today: 本日使用した人数 accounts_week: 今週使用した人数 breakdown: 直近のサーバー別使用状況 - context: 表示先 - directory: ディレクトリに使用 - in_directory: "%{count} 人がディレクトリに使用" last_active: 最近使われた順 most_popular: 使用頻度順 most_recent: 新着順 @@ -661,7 +674,7 @@ ja: reviewed: 審査済み title: ハッシュタグ trending_right_now: 現在のトレンド - unique_uses_today: 本日 %{count} 人がトゥートに使用 + unique_uses_today: 本日 %{count} 人が投稿に使用 unreviewed: 未審査 updated_msg: ハッシュタグ設定が更新されました title: 管理 @@ -669,6 +682,7 @@ ja: add_new: 追加 delete: 削除 edit_preset: プリセット警告文を編集 + empty: まだプリセット警告文が作成されていません。 title: プリセット警告文を管理 admin_mailer: new_pending_account: @@ -699,14 +713,14 @@ ja: guide_link: https://ja.crowdin.com/project/mastodon guide_link_text: 誰でも参加することができます。 sensitive_content: 閲覧注意コンテンツ - toot_layout: トゥートレイアウト + toot_layout: 投稿のレイアウト application_mailer: notification_preferences: メール設定の変更 salutation: "%{name} さん" settings: 'メール設定の変更: %{link}' view: 'リンク:' view_profile: プロフィールを表示 - view_status: トゥートを表示 + view_status: 投稿を表示 applications: created: アプリが作成されました destroyed: アプリが削除されました @@ -811,7 +825,7 @@ ja: email_change_html: アカウントを削除しなくてもメールアドレスを変更できます email_contact_html: それでも届かない場合、%{email} までメールで問い合わせてください email_reconfirmation_html: 確認のメールが届かない場合、もう一度申請できます。 - irreversible: アカウントを元に戻したり復活させることはできません + irreversible: 削除操作の撤回やアカウントの復活はできません more_details_html: 詳しくはプライバシーポリシーをご覧ください。 username_available: あなたのユーザー名は再利用できるようになります username_unavailable: あなたのユーザー名は引き続き利用できません @@ -843,7 +857,7 @@ ja: archive_takeout: date: 日時 download: ダウンロード - hint_html: "トゥートとメディアのアーカイブをリクエストできます。 データはActivityPub形式で、対応しているソフトウェアで読み込むことができます。7日毎にアーカイブをリクエストできます。" + hint_html: "投稿本文とメディアのアーカイブをリクエストできます。 データはActivityPub形式で、対応しているソフトウェアで読み込むことができます。7日毎にアーカイブをリクエストできます。" in_progress: 準備中... request: アーカイブをリクエスト size: 容量 @@ -905,11 +919,11 @@ ja: verification_failed: KeybaseはこのトークンをKeybaseユーザー%{kb_username}の署名として認識しませんでした。Keybaseから再試行してください。 wrong_user: "%{current}としてログインしている間%{proving}の証明を作成することはできません。%{proving}としてログインし、もう一度やり直してください。" explanation_html: ここではKeybaseのような他のサービスのアカウントと暗号化し関連づけることができます。これによりそれらのサービス上で他の人が暗号化されたメッセージを送信したり、あなたの送信した内容があなたからのものであると信用できるようになります。 - i_am_html: I am %{username} on %{service}. - identity: Identity + i_am_html: 私は %{service} の %{username} です。 + identity: 所属 inactive: 非アクティブ publicize_checkbox: 'そしてこれをトゥートします:' - publicize_toot: 'It is proven! I am %{username} on %{service}: %{url}' + publicize_toot: '証明されました!私は %{service} の %{username} です: %{url}' remove: アカウントから証明書を削除 removed: アカウントから証明書を削除することに成功しました status: 認証状態 @@ -956,6 +970,11 @@ ja: lists: errors: limit: リストの上限に達しました + login_activities: + authentication_methods: + password: パスワード + sign_in_token: 電子メールセキュリティコード + webauthn: セキュリティキー media_attachments: validations: images_and_video: 既に画像が追加されているため、動画を追加することはできません @@ -1009,7 +1028,7 @@ ja: other: "新しい%{count}件の通知 \U0001F418" title: 不在の間に… favourite: - body: "%{name} さんにお気に入り登録された、あなたのトゥートがあります:" + body: "%{name} さんにお気に入り登録された、あなたの投稿があります:" subject: "%{name} さんにお気に入りに登録されました" title: 新たなお気に入り登録 follow: @@ -1026,10 +1045,14 @@ ja: body: "%{name} さんから返信がありました:" subject: "%{name} さんに返信されました" title: 新たな返信 + poll: + subject: "%{name}  さんの投票が終了しました" reblog: - body: "%{name} さんにブーストされた、あなたのトゥートがあります:" + body: "%{name} さんにブーストされた、あなたの投稿があります:" subject: "%{name} さんにブーストされました" title: 新たなブースト + status: + subject: "%{name} さんが投稿しました" notifications: email_events: メールによる通知 email_events_hint: '受信する通知を選択:' @@ -1053,9 +1076,9 @@ ja: setup: セットアップ wrong_code: コードが間違っています。サーバーとデバイスの時計にずれがあるかもしれません。 pagination: - newer: 新しいトゥート + newer: 新しい投稿 next: 次 - older: 以前のトゥート + older: 以前の投稿 prev: 前 truncate: "…" polls: @@ -1176,10 +1199,9 @@ ja: preferences: ユーザー設定 profile: プロフィール relationships: フォロー・フォロワー + statuses_cleanup: 投稿の自動削除 two_factor_authentication: 二段階認証 webauthn_authentication: セキュリティキー - spam_check: - spam_detected: これは自動的に作成された通報です。スパムが検出されています。 statuses: attached: audio: @@ -1194,14 +1216,14 @@ ja: disallowed_hashtags: other: '許可されていないハッシュタグが含まれています: %{tags}' errors: - in_reply_not_found: あなたが返信しようとしているトゥートは存在しないようです。 + in_reply_not_found: あなたが返信しようとしている投稿は存在しないようです。 language_detection: 自動検出 open_in_web: Webで開く over_character_limit: 上限は %{max}文字までです pin_errors: - limit: 固定できるトゥート数の上限に達しました - ownership: 他人のトゥートを固定することはできません - private: 非公開のトゥートを固定することはできません + limit: 固定できる投稿数の上限に達しました + ownership: 他人の投稿を固定することはできません + private: 非公開の投稿を固定することはできません reblog: ブーストを固定することはできません poll: total_people: @@ -1216,14 +1238,49 @@ ja: sign_in_to_participate: ログインして会話に参加 title: '%{name}: "%{quote}"' visibilities: + direct: ダイレクト private: フォロワー限定 private_long: フォロワーにのみ表示されます public: 公開 public_long: 誰でも見ることができ、かつ公開タイムラインに表示されます unlisted: 未収載 unlisted_long: 誰でも見ることができますが、公開タイムラインには表示されません + statuses_cleanup: + enabled: 古い投稿を自動的に削除する + enabled_hint: 設定した期間を過ぎた投稿は、以下の例外に該当しない限り、自動的に削除されます + exceptions: 例外 + explanation: 投稿の削除はサーバーに負荷がかかるため、サーバーが混み合っていないときに時間をかけて行われます。 + ignore_favs: お気に入りされた数を無視 + ignore_reblogs: ブーストされた数を無視 + interaction_exceptions: インタラクションに基づく例外 + interaction_exceptions_explanation: お気に入りやブーストの基準値を一度超えてしまった投稿は、基準値を下回った後であっても、削除される保証はありません。 + keep_direct: ダイレクトメッセージを保持 + keep_direct_hint: ダイレクトメッセージを削除せずに残します + keep_media: メディア付きの投稿を保持 + keep_media_hint: メディア付きの投稿を削除せずに残します + keep_pinned: ピン留めされた投稿を保持 + keep_pinned_hint: ピン留めされた投稿を削除せずに残します + keep_polls: アンケート付きの投稿を保持 + keep_polls_hint: アンケート付きの投稿を削除せずに残します + keep_self_bookmark: ブックマークした投稿を保持 + keep_self_bookmark_hint: 自分自身でブックマークした投稿を削除せずに残します + keep_self_fav: お気に入りに登録した投稿を保持 + keep_self_fav_hint: 自分自身でお気に入りに登録した投稿を削除せずに残します + min_age: + '1209600': 2週間 + '15778476': 6ヶ月 + '2629746': 1ヶ月 + '31556952': 1年 + '5259492': 2ヶ月 + '63113904': 2年 + '7889238': 3ヶ月 + min_age_label: 投稿を保持する期間 + min_favs: これ以上お気に入りに登録された投稿を無視する + min_favs_hint: この数以上、お気に入りに登録された投稿を削除しません。空白にしておくと、お気に入りに登録された数に関わらず投稿を削除します。 + min_reblogs: これ以上ブーストされた投稿を無視する + min_reblogs_hint: この数以上、ブーストされた投稿を削除しません。空白にしておくと、ブーストされた数に関わらず投稿を削除します。 stream_entries: - pinned: 固定されたトゥート + pinned: 固定された投稿 reblogged: さんがブースト sensitive_content: 閲覧注意 tags: @@ -1349,11 +1406,11 @@ ja: explanation: disable: あなたのアカウントはログインが禁止され使用できなくなりました。しかしアカウントのデータはそのまま残っています。 sensitive: あなたのアップロードしたメディアファイルとリンク先のメディアは、閲覧注意として扱われます。 - silence: あなたのアカウントは制限されましたがそのまま使用できます。ただし既にフォローしている人はあなたのトゥートを見ることができますが、様々な公開タイムラインには表示されない場合があります。また他のユーザーは今後も手動であなたをフォローすることができます。 + silence: あなたのアカウントは制限されましたがそのまま使用できます。ただし既にフォローしている人はあなたの投稿を見ることができますが、様々な公開タイムラインには表示されない場合があります。また他のユーザーは今後も手動であなたをフォローすることができます。 suspend: あなたのアカウントは使用できなくなりプロフィールやその他データにアクセスできなくなりました。アカウントが完全に削除されるまではログインしてデータのエクスポートをリクエストできます。証拠隠滅を防ぐため一部のデータは削除されず残ります。 get_in_touch: このメールに返信することで %{instance} のスタッフと連絡を取ることができます。 review_server_policies: サーバーのポリシーを確認 - statuses: '特に次のトゥート:' + statuses: '特に次の投稿:' subject: disable: あなたのアカウント %{acct} は凍結されました none: "%{acct} に対する警告" @@ -1384,11 +1441,8 @@ ja: tips: 豆知識 title: ようこそ、%{name}! users: - blocked_email_provider: このメールプロバイダは許可されていません follow_limit_reached: あなたは現在 %{limit} 人以上フォローできません generic_access_help_html: アクセスできませんか? %{email} に問い合わせることができます。 - invalid_email: メールアドレスが無効です - invalid_email_mx: メールアドレスが存在しないようです invalid_otp_token: 二段階認証コードが間違っています invalid_sign_in_token: 無効なセキュリティコードです otp_lost_help_html: どちらも使用できない場合、%{email} に連絡を取ると解決できるかもしれません diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 523d2bdd50..02f0986f4e 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -33,7 +33,6 @@ ka: pin_errors: following: იმ ადამიანს, ვინც მოგწონთ, უკვე უნდა მიჰყვებოდეთ posts_with_replies: ტუტები და პასუხები - reserved_username: მომხმარებელი რეზერვირებულია roles: admin: ადმინისტრატორი bot: ბოტი @@ -127,35 +126,6 @@ ka: username: მომხმარებლის სახელი web: ვები action_logs: - actions: - assigned_to_self_report: "%{name}-მა დანიშნა რეპორტი %{target} საკუთარ თავზე" - change_email_user: "%{name}-მა შეცვალა %{target} მომხმარებლის ელ-ფოსტის მისამართი" - confirm_user: "%{name}-მა დაამოწმა %{target} მომხმარებლის ელ-ფოსტის მისამართი" - create_custom_emoji: "%{name}-მა ატვირთა ახალი ემოჯი %{target}" - create_domain_block: "%{name}-მა დაბლოკა დომენი %{target}" - create_email_domain_block: "%{name}-მა შავ სიაში მოაქცია დომენი %{target}" - demote_user: "%{name}-მა დააქვეითა მომხმარებელი %{target}" - destroy_domain_block: "%{name}-მა ბლოკი მოხსნა დომენს %{target}" - destroy_email_domain_block: "%{name} თეთრ სიაში მოაქცია დომენი %{target}" - destroy_status: "%{name}-მა გააუქმა სტატუსი %{target}-ზე" - disable_2fa_user: "%{name} გათიშა მეორე ფაქტორის მოთხოვნილება მომხმარებელზე %{target}" - disable_custom_emoji: "%{name}-მა გათისა ემოჯი %{target}" - disable_user: "%{name}-მა გათიშა ლოგინი მომხმარებლისთვის %{target}" - enable_custom_emoji: "%{name}-მა ჩართო ემოჯი %{target}" - enable_user: "%{name}-მა ჩართო ლოგინი მომხმარებლისთვის %{target}" - memorialize_account: "%{name}-მა აქცია ანგარიში %{target} მემორანდუმის გვერდად" - promote_user: "%{name}-მა დააწინაურა მომხმარებელი %{target}" - remove_avatar_user: "%{name}-მა გააუქმა %{target} მომხმარებლის ავატარი" - reopen_report: "%{name}-მა ხელახლა გახსნა რეპორტი %{target}" - reset_password_user: "%{name} გადატვირთა მომხმარებლის %{target} პაროლი" - resolve_report: "%{name}-მა მოაგვარა %{target} მომხმარებლის რეპორტი" - silence_account: "%{name}-მა გააჩუმა %{target} ანგარიში" - suspend_account: "%{name} შეაჩერა %{target} ანგარიში" - unassigned_report: "%{name}-მა მოაშორა რეპორტი %{target}" - unsilence_account: "%{name}-მა მოაშორა გაჩუმება %{target} ანგარიშს" - unsuspend_account: "%{name}-მა მოაშორა შეჩერება %{target} ანგარიშს" - update_custom_emoji: "%{name}-მა განაახლა ემოჯი %{target}" - update_status: "%{name}-მა განაახლა სტატუსი %{target}-ით" deleted_status: "(გაუქმებული სტატუსი)" title: აუდიტის ლოგი custom_emojis: @@ -184,26 +154,9 @@ ka: updated_msg: ემოჯი წარმატებით განახლდა! upload: ატვირთვა dashboard: - backlog: დაუსრულებელი საქმეები - config: კონფიგურაცია - feature_deletions: ანგარიშის გაუქმებები - feature_invites: მოწვევის ბმულები - feature_registrations: რეგისტრაციები - feature_relay: ფედერაციის რილეი - features: ფუნქციები - hidden_service: ფედერაცია დამალულ სერვისებთან - open_reports: ღია რეპორტები - recent_users: ახალი მომხმარებლები - search: სრული-ტექსტის ძიება - single_user_mode: ერთ-მომხმარებლიანი რეჟიმი software: პროგრამა space: მოცულობის მოხმარება title: დაფა - total_users: სულ მომხმარებლები - trends: ტრენდები - week_interactions: ამ კვირის ინტერაქციები - week_users_active: აქტიური ამ კვირას - week_users_new: ამ კვირის მომხმარებლები domain_blocks: add_new: ახლის დამატება created_msg: დომენის ბლოკი ახლა პროცესირების ქვეშაა @@ -783,7 +736,6 @@ ka: tips: რჩევები title: კეთილი იყოს თქვენი მობრძანება, %{name}! users: - invalid_email: ელ-ფოსტის მისამართი არაა მართებული invalid_otp_token: არასწორი მეორე ფაქტორის კოდი otp_lost_help_html: თუ დაკარგეთ წვდომა ორივეზე, შესაძლოა დაუკავშირდეთ %{email}-ს seamless_external_login: შესული ხართ გარე სერვისით, აქედან გამომდინარე პაროლი და ელ-ფოსტის მისამართი არაა ხელმისაწვდომი. diff --git a/config/locales/kab.yml b/config/locales/kab.yml index af83d5fc6d..5f675127fd 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -21,6 +21,7 @@ kab: hosted_on: Maṣṭudun yersen deg %{domain} learn_more: Issin ugar privacy_policy: Tasertit tabaḍnit + rules: Ilugan n uqeddac see_whats_happening: Ẓer d acu i iḍerrun server_stats: 'Tidaddanin n uqeddac:' source_code: Tangalt Taɣbalut @@ -63,7 +64,6 @@ kab: other: Tijewwiqin posts_tab_heading: Tijewwiqin posts_with_replies: Tijewwaqin akked tririyin - reserved_username: Isem-agi n umseqdac yettwaṭṭef yakan roles: admin: Anedbal bot: Aṛubut @@ -78,6 +78,7 @@ kab: create: Eǧǧ tazmilt delete: Kkes accounts: + add_email_domain_block: Sewḥel taɣult n yimayl approve: Qbel approve_all: Qbel kullec are_you_sure: Tetḥeqqeḍ? @@ -97,6 +98,7 @@ kab: deleted: Yettwakkes demote: Sider s weswir disable: Gdel + disable_sign_in_token_auth: Sens asesteb yebnan ɣef ujiṭun s yimayl disable_two_factor_authentication: Gdel 2FA disabled: Yensa display_name: Isem ara d-yettwaskanen @@ -105,6 +107,7 @@ kab: email: Imayl email_status: Addad n imayl enable: Rmed + enable_sign_in_token_auth: Rmed asesteb yebnan ɣef ujiṭun s yimayl enabled: Yermed followers: Imeḍfaṛen follows: Yeṭafaṛ @@ -120,13 +123,17 @@ kab: remote: Ameccaq title: Amḍiq login_status: Addad n tuqqna + media_attachments: Imeddayen n umidya memorialize: Err amiḍan d asebter n usmekti + memorialized_msg: Yuɣal %{username} d amiḍan n usmekti akken iwata moderation: active: Yermed all: Akk pending: Yettraǧu silenced: Yettwasgugem suspended: Yeḥbes + title: Aseɣyed + moderation_notes: Tamawin n useɣyed most_recent_activity: Armud aneggaru most_recent_ip: Tansa IP taneggarut no_account_selected: Ula yiwen n umiḍan ur yettwabeddel acku ula yiwen ur yettwafren @@ -137,6 +144,7 @@ kab: promote: Ali s uswir protocol: Aneggaf public: Azayez + push_subscription_expires: Ajerred PuSH ad ifakk redownload: Smiren amaɣnu reject: Aggi reject_all: Aggi-ten akk @@ -156,7 +164,12 @@ kab: staff: Tarbaɛt user: Amseqdac search: Nadi + search_same_email_domain: Iseqdacen-nniḍen s yiwet n taɣult n yimayl search_same_ip: Imseqdacen-nniḍen s tansa IP am tinn-ik + security_measures: + only_password: Awal uffir kan + password_and_2fa: Awal uffir d 2FA + password_and_sign_in_token: Ajiṭun n wawal uffir d yimayl shared_inbox_url: Bḍu URL n tbewwaḍt show: created_reports: Eg ineqqisen @@ -172,60 +185,91 @@ kab: undo_silenced: Kkes asgugem unsubscribe: Ur ṭafar ara username: Isem n useqdac + view_domain: Sken-d agzul n taɣult + warn: Alɣu web: Web whitelisted: Deg tebdert tamellalt action_logs: action_types: change_email_user: Beddel imayl i useqdac confirm_user: Sentem aseqdac + create_announcement: Rnu-d ulɣu create_custom_emoji: Rnu imujit udmawan + create_domain_allow: Rnu-d taɣult yettusirgen + create_domain_block: Rnu-d asewḥel n taɣult + create_email_domain_block: Rnu-d asewḥel n taɣult n yimayl create_ip_block: Rnu alugen n IP + create_unavailable_domain: Rnu-d taɣult ur nelli ara + destroy_announcement: Kkes ulɣu + destroy_custom_emoji: Kkes imujit udmawan + destroy_domain_allow: Kkes taɣult yettusirgen + destroy_domain_block: Kkes asewḥel n taɣult + destroy_email_domain_block: Kkes asewḥel n taɣult n yimayl destroy_ip_block: Kkes alugen n IP + destroy_status: Kkes tasufeɣt + destroy_unavailable_domain: Kkes taɣult ur nelli ara disable_2fa_user: Gdel 2FA + disable_custom_emoji: Sens imujit udmawan + disable_sign_in_token_auth_user: Sens asesteb yebnan ɣef ujiṭun s yimayl i useqdac + disable_user: Sens aseqdac + enable_custom_emoji: Rmed imujit udmawan + enable_sign_in_token_auth_user: Rmed asesteb yebnan ɣef ujiṭun s yimayl i useqdac enable_user: Rmed aseqdac + promote_user: Aseqdac anmeggag remove_avatar_user: Kkes avaṭar + reopen_report: Allus n ulday n uneqqis reset_password_user: Ales awennez n wawal n uffir + resolve_report: Ferru n uneqqis silence_account: Sgugem amiḍan + update_announcement: Leqqem ulɣu + update_custom_emoji: Leqqem imuji udmawan update_domain_block: Leqqem iḥder n taɣult + update_status: Leqqem tasufeɣt actions: - assigned_to_self_report: "%{name} imudd aneqqis %{target} i yiman-nsen" - change_email_user: "%{name} ibeddel imayl n umseqdac %{target}" - confirm_user: "%{name} isentem tansa imayl n umseqdac %{target}" - create_account_warning: "%{name} yuzen alɣu i %{target}" - create_announcement: "%{name} yerna taselɣut tamaynut %{target}" - create_custom_emoji: "%{name} yessuli-d imujiten imaynuten %{target}" - create_domain_allow: "%{name} yerna taɣult %{target} ɣer tebdart tamellalt" - create_domain_block: "%{name} yesseḥbes taɣult %{target}" - create_email_domain_block: "%{name} yerna taɣult n imayl %{target} ɣer tebdart taberkant" - create_ip_block: "%{name} rnu alugen i IP %{target}" - demote_user: "%{name} iṣubb-d deg usellun aseqdac %{target}" - destroy_announcement: "%{name} yekkes taselɣut %{target}" - destroy_custom_emoji: "%{name} ihudd imuji %{target}" - destroy_domain_allow: "%{name} yekkes taɣult %{target} seg tebdart tamellalt" - destroy_domain_block: "%{name} yekkes aseḥbes n taɣult %{target}" - destroy_email_domain_block: "%{name} yerna taɣult n imayl %{target} ɣer tebdart tamellalt" - destroy_ip_block: "%{name} kkes alugen i IP %{target}" - destroy_status: "%{name} yekkes tasuffeɣt n %{target}" - disable_custom_emoji: "%{name} yessens imuji %{target}" - disable_user: "%{name} yessens tuqqna i umseqdac %{target}" - enable_custom_emoji: "%{name} yermed imuji %{target}" - enable_user: "%{name} yermed tuqqna i umseqdac %{target}" - memorialize_account: "%{name} yerra amiḍan n %{target} d asebter n usmekti" - promote_user: "%{name} yerna deg usellun n useqdac %{target}" - remove_avatar_user: "%{name} yekkes avaṭar n %{target}" - reset_password_user: "%{name} iwennez awal uffir n useqdac %{target}" - resolve_report: "%{name} yefra aneqqis %{target}" - silence_account: "%{name} yesgugem amiḍan n %{target}" - unsilence_account: "%{name} yekkes asgugem n umiḍan n %{target}" - update_announcement: "%{name} ileqqem taselɣut %{target}" - update_custom_emoji: "%{name} yelqem imuji %{target}" - update_domain_block: "%{name} ileqqem iḥder n taɣult i %{target}" - update_status: "%{name} yelqem tasuffeɣt n %{target}" + assigned_to_self_report_html: "%{name} imudd aneqqis %{target} i yiman-nsen" + change_email_user_html: "%{name} ibeddel tansa imayl n useqdac %{target}" + confirm_user_html: "%{name} isentem tansa imayl n useqdac %{target}" + create_account_warning_html: "%{name} yuzen alɣu i %{target}" + create_announcement_html: "%{name} yerna taselɣut tamaynut %{target}" + create_custom_emoji_html: "%{name} yessuli-d imujiten imaynuten %{target}" + create_domain_allow_html: "%{name} yerna taɣult %{target} ɣer tebdart tamellalt" + create_domain_block_html: "%{name} yessewḥel taɣult %{target}" + create_email_domain_block_html: "%{name} yessewḥel taɣult n yimayl %{target}" + create_ip_block_html: "%{name} yerna alugen i IP %{target}" + create_unavailable_domain_html: "%{name} iseḥbes asiweḍ ɣer taɣult %{target}" + demote_user_html: "%{name} iṣubb-d deg usellun aseqdac %{target}" + destroy_announcement_html: "%{name} yekkes taselɣut %{target}" + destroy_custom_emoji_html: "%{name} ihudd imuji %{target}" + destroy_domain_allow_html: "%{name} yekkes taɣult %{target} seg tebdart tamellalt" + destroy_domain_block_html: "%{name} yekkes aseḥbes n taɣult %{target}" + destroy_email_domain_block_html: "%{name} yekkes asewḥel i taɣult n imayl %{target}" + destroy_ip_block_html: "%{name} yekkes alugen i IP %{target}" + destroy_status_html: "%{name} yekkes tasufeɣt n %{target}" + destroy_unavailable_domain_html: "%{name} yerra-d asiweḍ ɣer taɣult %{target}" + disable_2fa_user_html: "%{name} yssens asesteb s snat n tarrayin i useqdac %{target}" + disable_custom_emoji_html: "%{name} yessens imuji %{target}" + disable_sign_in_token_auth_user_html: "%{name} yessens asesteb yebnan ɣef ujiṭun s yimayl i %{target}" + disable_user_html: "%{name} yessens tuqqna i useqdac %{target}" + enable_custom_emoji_html: "%{name} yermed imuji %{target}" + enable_sign_in_token_auth_user_html: "%{name} yermed asesteb yebnan ɣef ujiṭun s yimayl i %{target}" + enable_user_html: "%{name} yermed tuqqna i useqdac %{target}" + memorialize_account_html: "%{name} yerra amiḍan n %{target} d asebter n usmekti" + promote_user_html: "%{name} yerna deg usellun n useqdac %{target}" + remove_avatar_user_html: "%{name} yekkes avaṭar n %{target}" + reopen_report_html: "%{name} yules alday n uneqqis %{target}" + reset_password_user_html: "%{name} iwennez awal uffir n useqdac %{target}" + resolve_report_html: "%{name} yefra aneqqis %{target}" + update_announcement_html: "%{name} ileqqem taselɣut %{target}" + update_custom_emoji_html: "%{name} ileqqem imuji %{target}" + update_domain_block_html: "%{name} ileqqem iḥder n taɣult i %{target}" + update_status_html: "%{name} ileqqem tasufeɣt n %{target}" deleted_status: "(tasuffeɣt tettwakkes)" empty: Ulac iɣmisen i yellan. + filter_by_action: Fren s tigawt filter_by_user: Sizdeg s useqdac title: Aɣmis n usenqed announcements: + destroyed_msg: Tamselɣut tettwakkes akken iwata! edit: title: Ẓreg ulγu empty: Ulac kra n ulγuyen. @@ -233,6 +277,10 @@ kab: new: create: Rnu-d ulγu title: Ulγu amaynut + publish: Sufeɣ + published_msg: Tamselɣut tettwasufeɣ-d akken iwata! + scheduled_for: Yettusɣiwsen i %{time} + scheduled_msg: Tamselɣut tettusɣiwes i usufeɣ! title: Ulγuyen custom_emojis: assign_category: Efk taggayt @@ -262,21 +310,9 @@ kab: update_failed_msg: Ur izmir ara ad-issali umuji-a upload: Sali dashboard: - config: Tawila - feature_deletions: Imiḍan yettwaksen - feature_invites: Iseɣwan n iɛaṛuḍen - feature_profile_directory: Akaram n imaɣnuten - feature_registrations: Ajerred - feature_relay: Anmegli n tfidiṛalitt - features: Timahaltin - open_reports: yeldin d ineqqisen - pending_users: imseqdacen ttrajun aɛiwed n tmuɣli - recent_users: Iseqdacen n memli kan software: Aseɣẓan + space: Tallunt yettwasqedcen title: Tafelwit - total_users: igellan akk d iseqdacen - week_users_active: urmiden deg yimalas-agi - week_users_new: imseqdacen deg yimalas-agi domain_allows: add_new: Timerna n taɣult ɣer tabdert tamellalt created_msg: Taγult-a tettwarna γer wumuγ amellal mebla ugur @@ -286,17 +322,25 @@ kab: add_new: Rni iḥder amaynut n taɣult domain: Taγult new: + create: Rnu-d iḥder severity: noop: Ula yiwen silence: Sgugem suspend: Ḥbes di leεḍil + title: Iḥder amaynut n taɣult private_comment: Awennit uslig public_comment: Awennit azayez + reject_media: Agi ifuyla n umidya + reject_reports: Agi ineqqisen + rejecting_media: agami n yifuyla n umidya + rejecting_reports: agami n yineqqisen severity: silence: yettwasgugem suspend: yeḥbes show: undo: Sefsex + undo: Sefsex iḥder n taɣult + view: Sken-d iḥder n taɣult email_domain_blocks: add_new: Rnu amaynut delete: Kkes @@ -306,9 +350,25 @@ kab: create: Rnu taγult title: Timerna n taɣult tamaynut n imayl ɣer tebdart taberkant title: Tabdart taberkant n imayl + follow_recommendations: + language: I tutlayt + status: Addad + suppressed: Yettwakkes instances: + back_to_all: Akk + back_to_limited: Ɣur-s talast by_domain: Taγult + delivery: + all: Akk + clear: Sfeḍ tuccḍiwin n usiweḍ + restart: Ales asiweḍ + stop: Seḥbes asiweḍ + title: Asiweḍ + unavailable: Ur yelli ara + unavailable_message: Asiweḍ ur yelli ara + warning: Aneddeh delivery_available: Yella usiweḍ + delivery_error_days: Ussan n tuccḍiwin n usiweḍ empty: Ulac taɣultin yettwafen. known_accounts: one: "%{count} n umiḍan i yettwasnen" @@ -316,13 +376,17 @@ kab: moderation: all: Akk limited: Yettwasgugem + title: Aseɣyed private_comment: Awennit uslig public_comment: Awennit azayez title: Tamatut total_blocked_by_us: Ttwasḥebsen sγur-neγ total_followed_by_them: Ṭtafaṛen-t total_followed_by_us: Neṭṭafaṛ-it + total_reported: Ineqqisen fell-asen + total_storage: Imeddayen n umidya invites: + deactivate_all: Sens kullec filter: all: Akk available: Yella @@ -375,13 +439,23 @@ kab: mark_as_unresolved: Creḍ-it ur yefra ara notes: create: Rnu tazmilt + create_and_resolve: Fru s tamawt + create_and_unresolve: Alew alday s tamawt delete: Kkes + reopen: Allus n ulday n uneqqis report: 'Aneqqis #%{id}' + reported_account: Amiḍan yettumlen resolved: Fran status: Addad title: Ineqqisen unresolved: Ur yefra ara updated_at: Yettwaleqqem + rules: + add_new: Rnu alugen + delete: Kkes + edit: Ẓreg alugen + empty: Mazal ur ttwasbadun ara yilugan n uqeddac. + title: Ilugan n uqeddac settings: custom_css: desc_html: Beddel aγan s CSS ara d-yettwasalayen deg yal asebter @@ -416,9 +490,6 @@ kab: title: Tisuffiγin n umiḍan with_media: S taγwalt tags: - context: Asatal - directory: Deg ukaram - in_directory: "%{count} deg ukaram" last_active: Armud aneggaru most_popular: Ittwasnen aṭas most_recent: Melmi kan @@ -437,16 +508,15 @@ kab: appearance: discovery: Asnirem localization: - guide_link: https://crowdin.com/project/mastodon guide_link_text: Yal yiwen·t y·tezmer a ttekki. sensitive_content: Agbur amḥulfu application_mailer: - salutation: "%{name}," view: 'Ẓaṛ:' view_profile: Ssken-d amaɣnu view_status: Ssken-d tasuffiɣt applications: token_regenerated: Ajuṭu n unekcum yettusirew i tikkelt-nniḍen akken iwata + your_token: Ajiṭun-ik·im n unekcum auth: apply_for_account: Suter asnebgi change_password: Awal uffir @@ -461,9 +531,6 @@ kab: logout: Ffeγ migrate_account: Gujj γer umiḍan nniḍen or_log_in_with: Neγ eqqen s - providers: - cas: CAS - saml: SAML register: Jerred registration_closed: "%{instance} ur yeqbil ara imttekkiyen imaynuten" reset_password: Wennez awal uffir @@ -491,7 +558,6 @@ kab: date: formats: default: "%d %b %Y" - with_month_name: "%B %d, %Y" datetime: distance_in_words: about_x_hours: "%{count}isr" @@ -531,7 +597,6 @@ kab: archive_takeout: date: Azemz size: Teγzi - csv: CSV lists: Tibdarin mutes: Wid tesgugmeḍ featured_tags: @@ -572,6 +637,8 @@ kab: merge: Smezdi overwrite: Semselsi types: + blocking: Tabdart n yimiḍanen iweḥlen + bookmarks: Ticraḍ following: Tabdert n wid teṭṭafareḍ muting: Tabdert n wid tesgugmeḍ upload: Sali @@ -594,6 +661,11 @@ kab: table: expires_at: Ad ifat di title: Ɛreḍ-d kra n yimdanen + login_activities: + authentication_methods: + password: awal uffir + sign_in_token: tangalt n tɣellist n tansa imayl + webauthn: tisura n tɣellist migrations: acct: Ibeddel γer incoming_migrations: Tusiḍ-d seg umiḍan nniḍen @@ -625,11 +697,9 @@ kab: number: human: decimal_units: - format: "%n%u" units: billion: AṬ million: A - thousand: K trillion: Am otp_authentication: enable: Rmed @@ -639,7 +709,6 @@ kab: next: Wayed older: Aqbuṛ prev: Win iɛeddan - truncate: "…" preferences: other: Wiyaḍ relationships: @@ -676,11 +745,11 @@ kab: generic: Iminig arusin ie: Internet Explorer micro_messenger: MicroMessenger - nokia: Nokia S40 Ovi Browser + nokia: Iminig Nokia S40 Ovi opera: Opera otter: Otter phantom_js: PhantomJS - qq: QQ Browser + qq: Iminig QQ safari: Safari uc_browser: UCBrowser weibo: Weibo @@ -691,11 +760,12 @@ kab: adobe_air: Adobe Air android: Android blackberry: Blackberry - chrome_os: ChromeOS + chrome_os: Chrome OS firefox_os: Firefox OS ios: iOS linux: Linux mac: macOS + other: anagraw arussin windows: Windows windows_mobile: Windows Mobile windows_phone: Tiliγri Windows Phone @@ -718,6 +788,7 @@ kab: preferences: Imenyafen profile: Ameγnu relationships: Imeḍfaṛen akked wid i teṭṭafaṛeḍ + two_factor_authentication: Asesteb s snat n tarrayin webauthn_authentication: Tisura n teɣlist statuses: attached: @@ -743,13 +814,21 @@ kab: show_more: Ssken-d ugar show_thread: Ssken-d lxiḍ sign_in_to_participate: Qqen i waken ad tzeddiḍ deg udiwenni - title: '%{name}: "%{quote}"' visibilities: private: Imeḍfaṛen kan private_long: Ssken i ymeḍfaṛen kan public: Azayez public_long: Yal yiwen·t yezmer at iwali unlisted: War tabdert + statuses_cleanup: + min_age: + '1209600': 2 n yimalasen + '15778476': 6 n wayyuren + '2629746': 1 n wayyur + '31556952': 1 n useggas + '5259492': 2 n wayyuren + '63113904': 2 n yiseggasen + '7889238': 3 n wayyuren stream_entries: pinned: Tijewwiqt yettwasentḍen sensitive_content: Agbur amḥulfu @@ -759,15 +838,13 @@ kab: contrast: Maṣṭudun (agnil awriran) default: Maṣṭudun (Aberkan) mastodon-light: Maṣṭudun (Aceɛlal) - time: - formats: - default: "%b %d, %Y, %H:%M" - month: "%b %Y" two_factor_authentication: add: Rnu disable: Gdel disabled_success: Asesteb s snat n tarrayin yensa akken iwata edit: Ẓreg + enabled: Asesteb s snat n tarrayin yermed + enabled_success: Asesteb s snat n tarrayin yermed akken iwata otp: Asnas n usesteb webauthn: Tisura n teɣlist user_mailer: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 5f0da18883..1c4445ee96 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -7,7 +7,6 @@ kk: active_count_after: актив active_footnote: Соңғы айдағы актив қолданушылар (MAU) administered_by: 'Админ:' - api: API apps: Мобиль қосымшалар apps_platforms: iOS, Android және басқа платформалардағы Mastodon қолданыңыз browse_directory: Профильдер каталогын қажет фильтрлер арқылы қараңыз @@ -74,7 +73,6 @@ kk: other: Жазба posts_tab_heading: Жазба posts_with_replies: Жазбалар және жауаптар - reserved_username: Мұндай логин тіркелген roles: admin: Админ bot: Бот @@ -193,39 +191,6 @@ kk: web: Веб whitelisted: Рұқсат тізімі action_logs: - actions: - assigned_to_self_report: "%{name} шағым тастады %{target} өздері үшін" - change_email_user: "%{name} e-mail адресін өзгертті - %{target}" - confirm_user: "%{name} e-mail адресін құптады - %{target}" - create_account_warning: "%{name} ескерту жіберді - %{target}" - create_custom_emoji: "%{name} жаңа эмодзи қосты %{target}" - create_domain_allow: "%{name} ақ тізімдегі домен %{target}" - create_domain_block: "%{name} домен бұғаттады - %{target}" - create_email_domain_block: "%{name} e-mail доменін қара тізімге қосты - %{target}" - demote_user: "%{name} төмендетілген қолданушы - %{target}" - destroy_custom_emoji: "%{name} эмодзи жойды %{target}" - destroy_domain_allow: "%{name} домені %{target} ақ тізімнен шығарылды" - destroy_domain_block: "%{name} бұғатталмаған домен %{target}" - destroy_email_domain_block: "%{name} e-mail доменін ақ тізімге кіргізді %{target}" - destroy_status: "%{name} жазбасын өшірді %{target}" - disable_2fa_user: "%{name} қолданушы үшін екі фактор ажыратылған %{target}" - disable_custom_emoji: "%{name} эмодзи алып тастады %{target}" - disable_user: "%{name} қосылмаған логин %{target}" - enable_custom_emoji: "%{name} қосылған эмодзи %{target}" - enable_user: "%{name} қосылған логин %{target}" - memorialize_account: "%{name} %{target} аккаунтын естеліктеріне қосты" - promote_user: "%{name} жарнамалады %{target}" - remove_avatar_user: "%{name} %{target} аватарын өшірді" - reopen_report: "%{name} %{target} шағымын қайта қарады" - reset_password_user: "%{name} %{target} құпиясөзін қалпына келтірді" - resolve_report: "%{name} %{target} шағымын қарастырды" - silence_account: "%{name} %{target} аккаунтын үнсіз қылды" - suspend_account: "%{name} %{target} аккаунтын тоқтатты" - unassigned_report: "%{name} бекітілмеген есеп %{target}" - unsilence_account: "%{name} %{target} аккаунтын қайта қосты" - unsuspend_account: "%{name} %{target} аккаунтын қайта қосты" - update_custom_emoji: "%{name} эмодзи жаңартты %{target}" - update_status: "%{name} жазбасын жаңартты %{target}" deleted_status: "(өшірілген жазба)" title: Аудит логы announcements: @@ -268,33 +233,9 @@ kk: updated_msg: Эмодзи сәтті жаңартылды! upload: Жүктеу dashboard: - authorized_fetch_mode: Қауіпсіз режим - backlog: босатылған тапсырмалар - config: Конфигурация - feature_deletions: Аккаунттарды жою - feature_invites: Шақыру сілтемелері - feature_profile_directory: Профиль каталогы - feature_registrations: Тіркелулер - feature_relay: Федерация релесі - feature_spam_check: Анти-спам - feature_timeline_preview: Таймлайн превьюі - features: Мүмкіндіктер - hidden_service: Жасырын қызметтер федерациясы - open_reports: ашық шағымдар - pending_tags: хештегтер күтілуде - pending_users: қолданушылар күтілуде - recent_users: Соңғы қолданушылар - search: Толық мәтінмен іздеу - single_user_mode: Жалғыз пайдаланушы режимі software: Бағдарлама space: Пайдаланылған кеңістік title: Басқару тақтасы - total_users: барлық қолданушы - trends: Трендтер - week_interactions: осы аптадағы әрекеттер - week_users_active: осы аптадағы белсенділік - week_users_new: осы аптадағы қолданушылар - whitelist_mode: Рұқсат тізімі domain_allows: add_new: Рұқсат етілген домендер created_msg: Доменге рұқсат берілді @@ -451,8 +392,6 @@ kk: users: Жергілікті қолданушыларға domain_blocks_rationale: title: Дәлелді көрсету - enable_bootstrap_timeline_accounts: - title: Жаңа қолданушылар жазылатын адамдарды белгілеу hero: desc_html: Бастапқы бетінде көрсетіледі. Кем дегенде 600x100px ұсынылады. Орнатылмаған кезде, сервердің нобайына оралады title: Қаһарман суреті @@ -503,9 +442,6 @@ kk: desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML тег title: Қолдану шарттары мен ережелер site_title: Сервер аты - spam_check_enabled: - desc_html: Мастодон бірнеше рет қажетсіз хабарламаларды жіберетін есептік жазбаларды автоматты түрде жасай алады. Жалған позитивтер болуы мүмкін. - title: Спамға қарсы автоматика thumbnail: desc_html: Used for previews via OpenGraph and API. 1200x630px рекоменделеді title: Сервер суреті @@ -540,9 +476,6 @@ kk: accounts_today: Бүгін қолданылғандар accounts_week: Осы аптада қолданылғандар breakdown: Бүгінгі пайдалану көздері бойынша бөлу - context: Контекст - directory: Бөлім ішінде - in_directory: "%{count} бөлім ішінде" last_active: Соңғы белсенділік most_popular: Ең танымал most_recent: Ең соңғы @@ -575,7 +508,6 @@ kk: add_new: Алиас қосу created_msg: Жаңа алиас сәтті жасалды. Енді сіз ескі аккаунттан көшіруді бастай аласыз. deleted_msg: Алиасты сәтті алып тастаңыз. Осы есептік жазбадан екіншіге ауысу мүмкін болмайды. - hint_html: If you want to move from another account to this one, here you can create an alias, which is required before you can proceed with moving followers from the old account to this one. This action by itself is harmless and reversible. The account migration is initiated from the old account. remove: Алиас сілтемесін алып тастау appearance: advanced_web_interface: Кеңейтілген веб-интерфейс @@ -587,7 +519,6 @@ kk: toot_layout: Жазба формасы application_mailer: notification_preferences: Change e-mail prеferences - salutation: "%{name}," settings: 'Change e-mail preferеnces: %{link}' view: 'Viеw:' view_profile: Viеw Profile @@ -835,26 +766,9 @@ kk: missing_also_known_as: бұл тіркелгіге сілтеме жасамайды move_to_self: ағымдағы шот болуы мүмкін емес not_found: табылмады - on_cooldown: You are on cooldown followers_count: Көшу кезіндегі оқырмандар - incoming_migrations: Moving from a different account - incoming_migrations_html: To move from another account to this one, first you need to create an account alias. - moved_msg: Your account is now redirecting to %{acct} and your followers are being moved over. - not_redirecting: Your account is not redirecting to any other account currently. - on_cooldown: You have recently migrated your account. This function will become available again in %{count} days. - past_migrations: Past migrations - proceed_with_move: Move followers - redirecting_to: Your account is redirecting to %{acct}. - set_redirect: Set redirect warning: - backreference_required: The new account must first be configured to back-reference this one before: 'Жұмысты бастамас бұрын, осы жазбаларды мұқият оқып шығыңыз:' - cooldown: After moving there is a cooldown period during which you will not be able to move again - disabled_account: Your current account will not be fully usable afterwards. However, you will have access to data export as well as re-activation. - followers: This action will move all followers from the current account to the new account - only_redirect_html: Alternatively, you can only put up a redirect on your profile. - other_data: No other data will be moved automatically - redirect: Your current account's profile will be updated with a redirect notice and be excluded from searches moderation: title: Модерация notification_mailer: @@ -898,11 +812,9 @@ kk: number: human: decimal_units: - format: "%n%u" units: billion: В million: М - quadrillion: Q thousand: К trillion: Т pagination: @@ -910,7 +822,6 @@ kk: next: Келесі older: Ерте prev: Алдыңғы - truncate: "…" polls: errors: already_voted: Бұл сауалнамаға қатысқансыз @@ -1028,8 +939,6 @@ kk: profile: Профиль relationships: Жазылымдар және оқырмандар two_factor_authentication: Екі-факторлы авторизация - spam_check: - spam_detected: Бұл автоматтандырылған есеп. Спам анықталды. statuses: attached: description: 'Жүктелді: %{attached}' @@ -1063,7 +972,6 @@ kk: show_more: Тағы әкел show_thread: Тақырыпты көрсет sign_in_to_participate: Сұхбатқа қатысу үшін кіріңіз - title: '%{name}: "%{quote}"' visibilities: private: Тек оқырмандарға private_long: Тек оқырмандарға ғана көрінеді @@ -1164,10 +1072,6 @@ kk: contrast: Mastodon (Жоғары контраст) default: Mastodon (Қою) mastodon-light: Mastodon (Ашық) - time: - formats: - default: "%b %d, %Y, %H:%M" - month: "%b %Y" two_factor_authentication: disable: Ажырату enabled: Екі-факторлы авторизация қосылған @@ -1219,7 +1123,6 @@ kk: title: Ортаға қош келдің, %{name}! users: follow_limit_reached: Сіз %{limit} лимитінен көп адамға жазыла алмайсыз - invalid_email: Бұл e-mail адрес қате invalid_otp_token: Қате екі-факторлы код otp_lost_help_html: Егер кіру жолдарын жоғалтып алсаңыз, сізге %{email} арқылы жіберіледі seamless_external_login: Сыртқы сервис арқылы кіріпсіз, сондықтан құпиясөз және электрондық пошта параметрлері қол жетімді емес. diff --git a/config/locales/kmr.yml b/config/locales/kmr.yml new file mode 100644 index 0000000000..5a275b4c96 --- /dev/null +++ b/config/locales/kmr.yml @@ -0,0 +1,1527 @@ +--- +kmr: + about: + about_hashtag_html: Ev şandiyeke gelemperî ye bi #%{hashtag} re nîşankirî ye. Tu dikarî pê re çalak bibî heke ajimêreke te heye li ser fediverse. + about_mastodon_html: 'Tora civakî ya pêşerojê: Ne reklam, ne çavdêriya pargîdanî, sêwirana exlaqî, û desentralîzasyon! Bi Mastodon re bibe xwediyê daneyên xwe!' + about_this: Derbar + active_count_after: çalak + active_footnote: Mehane bikarhênerên çalak (MBÇ) + administered_by: 'Tê bi rêvebirin ji aliyê:' + api: API + apps: Sepana mobîl + apps_platforms: Mastodon ji iOS, Android û platformên din bi kar bîne + browse_directory: Li riya profîlê bigere û li gorî berjewendiyan parzûn bike + browse_local_posts: Ji vî rajekarê weşaneke zindî ya şandiyên giştî bigere + browse_public_posts: Weşaneke zindî ya şandiyên giştî bigere li ser Mastodon + contact: Têkilî + contact_missing: Nehate sazkirin + contact_unavailable: N/A + discover_users: Bikarhêneran keşf bike + documentation: Pelbend + federation_hint_html: Bi ajimêrê xwe %{instance} re tu dikarî kesên rajekar û li derveyî mastodonê bişopînî. + get_apps: Sepaneke mobîl bicerbîne + hosted_on: Mastodon li ser%{domain} tê hildanê + instance_actor_flash: Ev ajimêr aktorekî aşopî ye ji bo rajekar were temsîl kirin tê bikaranîn ne ajimêra kesî ye. Ji bo armanca federasyonê dixebite û divê ney asteng kirin heta ku te xwest hemû nimûneyan asteng bikî, di vir de ger tu blogek navper bikarbînî. + learn_more: Bêtir fêr bibe + privacy_policy: Polîtikaya nihêniyê + rules: Rêbazên rajekar + rules_html: 'Heger tu bixwazî ajimêrekî li ser rajekarê mastodon vebikî, li jêrê de kurtasî ya qaîdeyên ku tu guh bidî heye:' + see_whats_happening: Binêre ka çi diqewime + server_stats: 'Statîstîkên rajekar:' + source_code: Çavkaniya Kodî + status_count_after: + one: şandî + other: şandî + status_count_before: Hatin weşan + tagline: Hevalên xwe bişopîne û yên nû bibîne + terms: Peyama mercan + unavailable_content: Rajekarên li hev kirî + unavailable_content_description: + domain: Rajekar + reason: Sedem + rejecting_media: 'Pelên medyayê yên ji van rajekaran nayên pêvajoyî kirin an tomarkirin, û tu dîmenek nayên xuyakirin, ku pêdivî ye ku bi desta pêlêkirina pelika rasteqîn hebe:' + rejecting_media_title: Medyayên parzûnkirî + silenced: 'Şandiyên ji van rajekaran dê di demnameyên û axaftinên gelemperî de bêne veşartin, û heya ku tu wan neşopînî dê ji çalakiyên bikarhênerên wan agahdariyek çênebe:' + silenced_title: Rajekarên sînor kirî + suspended: 'Dê tu daneya ji van rajekaran neyê berhev kirin, tomarkirin an jî guhertin, ku têkilî an danûstendinek bi bikarhênerên van rajekaran re tune dike:' + suspended_title: Rajekarên rawestî + unavailable_content_html: Mastodon bi gelemperî dihêle ku tu naverokê bibînî û bi bikarhênerên ji rajekareke din a li fendiverse re têkilî dayne. Ev awaretyên ku li ser vê rajekara taybetî hatine çêkirin ev in. + user_count_after: + one: bikarhêner + other: bikarhêner + user_count_before: Serrûpel + what_is_mastodon: Mastodon çi ye? + accounts: + choices_html: 'Hilbijartina %{name}:' + endorsements_hint: Tu dikarî kesên ku di navrûyê wep de dişopînî bipejirînî û ew li vir were nîşan kirin. + featured_tags_hint: Tu dikarî hashtagên teybetî li vir tê nîşan kirin di pê de derxî. + follow: Bişopîne + followers: + one: Şopîner + other: Şopîner + following: Dişopîne + instance_actor_flash: Ev ajimêr listikvaneke rastkî ye ku ji bo wek nûnerê rajekar bixwe tê bikaranîn û ne bikarhênerek kesane. Ew ji bo mebestên yekbûyî tê bikaranîn û divê neyê rawestandin. + joined: Di %{date} de tevlî bû + last_active: çalakiya dawî + link_verified_on: Xwedaniya li vê girêdanê di %{date} de hatiye kontrolkirin + media: Medya + moved_html: "%{name} bar kire %{new_profile_link}:" + network_hidden: Ev zanyarî berdest nîne + never_active: Tu car + nothing_here: Li vir tiştek tune ye! + people_followed_by: Kesên ku%{name} wan dişopîne + people_who_follow: Kesên%{name} dişopîne + pin_errors: + following: Kesê ku tu dixwazî bipejirînî jixwe tu vê dişopînî + posts: + one: Şandî + other: Şandî + posts_tab_heading: Şandî + posts_with_replies: Şandî û bersiv + roles: + admin: Rêvebir + bot: Bot + group: Kom + moderator: Moderator + unavailable: Profîl nay bikaranîn + unfollow: Neşopîne + admin: + account_actions: + action: Çalakî yê bike + title: Li ser %{acct} çalakiyên li hev hatî pêk bîne + account_moderation_notes: + create: Nîşeyekê bihêle + created_msg: Nîşeyê moderator bi awayekî serkeftî hate afirandin! + delete: Jê bibe + destroyed_msg: Nîşeyê moderator bi awayekî serkeftî hate tinne kirin! + accounts: + add_email_domain_block: Navparê e-nameyê asteng bike + approve: Bipejirîne + approve_all: Hemûyan bipejirîne + approved_msg: Tomarkirina %{username} bi awayekî serkeftî hate pejirandin + are_you_sure: Ma tu bawerî? + avatar: Wêne + by_domain: Navper + change_email: + changed_msg: E-nameya ajimêr bi awayekî serkeftî hate guhertin! + current_email: E-nameya heyî + label: E-nameyê biguherîne + new_email: E-nameya nû + submit: E-nameyê biguherîne + title: E-nameyê biguherîne bo %{username} + confirm: Bipejirîne + confirmed: Hate pejirandin + confirming: Tê pejirandin + delete: Daneyan jê bibe + deleted: Hate jêbirin + demote: Ast daxistin + destroyed_msg: Daneyên %{username} niha ket rêzê da yê demek nêz da were jêbirin + disable: Qerisî ye + disable_sign_in_token_auth: E-name ya rastandina token neçalak bike + disable_two_factor_authentication: 2FA ne çalak bike + disabled: Qerisî ye + display_name: Navê xuyangê + domain: Navper + edit: Serrast bike + email: E-name + email_status: Rewşa E-nameyê + enable: Çalak bike + enable_sign_in_token_auth: E-name ya rastandina token çalak bike + enabled: Çalakkirî + enabled_msg: Ajimêra %{username} bi serkeftî hat çalak kirin + followers: Şopîner + follows: Dişopînê + header: Jormalper + inbox_url: Peyamên hatî URl + invite_request_text: Sedemên tevlêbûnê + invited_by: Bi vexwendinê + ip: IP + joined: Tevlî bû + location: + all: Hemû + local: Herêmî + remote: Ji dûr ve + title: Cih + login_status: Rewşa têketinê + media_attachments: Pêvekên medya + memorialize: Vegerîne bîranînê + memorialized: Bû bîranîn + memorialized_msg: "%{username} bi serkeftî veguherî ajimêra bîranînê" + moderation: + active: Çalak + all: Hemû + pending: Tê nirxandin + silenced: Sînorkirî + suspended: Sekinandî + title: Çavdêrî + moderation_notes: Nîşeyên Rêvebirinê + most_recent_activity: Çalakîyên dawî + most_recent_ip: IP' a dawî + no_account_selected: Tu ajimêr nehat hilbijartin ji ber vê tu ajimêr nehat guhertin + no_limits_imposed: Sînor nay danîn + not_subscribed: Beşdar nebû + pending: Li benda nirxandinê ye + perform_full_suspension: Sekinî + promote: Derbasê asteke bilind be + protocol: Protokol + public: Gelemperî + push_subscription_expires: Beşdarbûna PuSH diqede + redownload: Profîl nûve bike + redownloaded_msg: Bi serkeftî profîla %{username} ji kokê va hat nûve kirin + reject: Nepejirîne + reject_all: Hemûyan red bike + rejected_msg: Tomarkirina %{username} bi awayekî serkeftî nehate pejirandin + remove_avatar: Avatarê rake + remove_header: Sernavê rake + removed_avatar_msg: Wêneyê %{username} bi awayekî serkeftî hate rakirin + removed_header_msg: Wêneyê dîwar ê %{username} bi awayekî serkeftî hate rakirin + resend_confirmation: + already_confirmed: Ev bikarhêner jixwe hatiye pejirandin + send: E-nameya pejirandinê dîsa bişîne + success: E-nameya pejirandinê bi awayekî serkeftî hate şandin! + reset: Ji nû ve saz bike + reset_password: Pêborînê ji nû ve saz bike + resubscribe: Dîsa beşdar bibe + role: Maf + roles: + admin: Rêvebir + moderator: Çavdêr + staff: Xebatkar + user: Bikarhêner + search: Bigere + search_same_email_domain: Bikarhênerên din ên bi heman navpera e-nameyê + search_same_ip: Bikarhênerên din ên xwedî heman IP + security_measures: + only_password: Têne pêborîn + password_and_2fa: Pêborîn û 2FA + password_and_sign_in_token: Pêborîn û navnîşana e-nameyê + sensitive: Hêz-hestiyar + sensitized: Wek hestiyar hatiye nîşankirin + shared_inbox_url: URLya wergirtiyên parvekirî + show: + created_reports: Ragihandinên ku çêkiriye + targeted_reports: Ji aliyê kesên din ve hatiye ragihandin + silence: Sînor + silenced: Bêdeng kirî + statuses: Şandî + subscribe: Bibe kiryar + suspended: Hatiye rawestandin + suspension_irreversible: Daneyên vê ajimêrê bêveger hatine jêbirin. Tu dikarî ajimêra xwe ji rawestandinê vegerinî da ku ew bi kar bînî lê ew ê tu daneya ku berê hebû venegere. + suspension_reversible_hint_html: Ajimêr hat qerisandin, û daneyên di %{date} de hemû were rakirin. Hetta vê demê, ajimêr bê bandorên nebaş dikare dîsa vegere. Heke tu dixwazî hemû daneyan ajimêrê niha rakî, tu dikarî li jêrê bikî. + time_in_queue: Di dorê de sekinandin %{time} + title: Ajimêr + unconfirmed_email: E-nameya nepejirandî + undo_sensitized: Hestiyariyê vegerîne + undo_silenced: Sînorê vegerîne + undo_suspension: Dûrxistinê paşve vegerîne + unsilenced_msg: Ajimêra %{username} bi awayekî serkeftî bêsînor çêbû + unsubscribe: Dev ji beşdarbûnê berde + unsuspended_msg: Bi awayekî serkeftî beşdarbûna bi ajimêra %{username} hate berdan + username: Navê bikarhêneriyê + view_domain: Kurte ji bo navperê bide nîşan + warn: Hişyarî + web: Tevn + whitelisted: Ji bona yekbûyînê maf tê dayîn + action_logs: + action_types: + assigned_to_self_report: Ragihandinê diyar bike + change_email_user: E-nameya bikarhêner biguherîne + confirm_user: Bikarhêner bipejirîne + create_account_warning: Hişyariyekê çê bike + create_announcement: Daxûyaniyekê çê bike + create_custom_emoji: Emojiyên kesanekirî çê bike + create_domain_allow: Navpera ku destûr standiye peyda bike + create_domain_block: Navpera ku asteng bûye ava bike + create_email_domain_block: Navpera e-name yê de asteng kirinê peyda bike + create_ip_block: Rêziknameya IPyê saz bike + create_unavailable_domain: Navpera ku nayê bikaranîn pêk bîne + demote_user: Bikarhênerê kaşê jêr bike + destroy_announcement: Daxûyanîyê jê bibe + destroy_custom_emoji: Emojîya kesanekirî jê bibe + destroy_domain_allow: Navperên mafdayî jê bibe + destroy_domain_block: Navperên astengkirî jê bibe + destroy_email_domain_block: Navperên e-nameyê yên astengkirî jê bibe + destroy_ip_block: Tomara IPyê jêbibe + destroy_status: Şandiyê jê bibe + destroy_unavailable_domain: Navperên tuneyî jê bibe + disable_2fa_user: 2FA neçalak bike + disable_custom_emoji: Emojîya kesanekirî neçalak bike + disable_sign_in_token_auth_user: Ji bo bikarhênerê piştrastkirina navnîşana e-name yê ya token neçalak bike + disable_user: Bikarhêner neçalak bike + enable_custom_emoji: Emojîya kesanekirî çalak bike + enable_sign_in_token_auth_user: Ji bo bikarhênerê piştrastkirina navnîşana e-name yê ya token çalak bike + enable_user: Bikarhêner çalak bike + memorialize_account: Ajimêrê bike bîranînek + promote_user: Bikarhêner pêş bixe + remove_avatar_user: Avatarê rake + reopen_report: Ragihandina ji nû ve veke + reset_password_user: Pêborînê ji nû ve saz bike + resolve_report: Ragihandinê çareser bike + sensitive_account: Ajimêra hêz-hestiyar + silence_account: Ajimêrê bi sînor bike + suspend_account: Ajimêr rawestîne + unassigned_report: Ragihandinê diyar neke + unsensitive_account: Medyayên di ajimêrê te de wek hestyarî nepejirîne + unsilence_account: Ajimêra sînorkirî vegerîne + unsuspend_account: Ajimêrê xwe ji rewestandinê rake + update_announcement: Daxûyaniyê rojane bike + update_custom_emoji: Emojîya kesanekirî rojane bike + update_domain_block: Navperên astengkirî rojane bike + update_status: Şandiyê rojane bike + actions: + assigned_to_self_report_html: "%{name} ji xwe re ragihandinek %{target} hilda" + change_email_user_html: "%{name} navnîşana e-nameya bikarhêner %{target} guherand" + confirm_user_html: "%{name} navnîşana e-nameya bikarhêner %{target} piştrast kir" + create_account_warning_html: "%{name} ji bo %{target} hişyariyek şand" + create_announcement_html: "%{name} agahdarkirineke nû çêkir %{target}" + create_custom_emoji_html: "%{name} emojîyeke nû ya %{target} bar kir" + create_domain_allow_html: "%{name} bi navperê %{target} re maf da federeyê" + create_domain_block_html: "%{name} ji navperê %{target} asteng kir" + create_email_domain_block_html: "%{name} e-name ya navperê %{target} asteng kir" + create_ip_block_html: "%{name} ji bo IPya %{target} rêzikname saz kir" + create_unavailable_domain_html: "%{name} bi navperê %{target} re gihandinê rawestand" + demote_user_html: "%{name} bikarhênerê %{target} kaşê jêr kir" + destroy_announcement_html: "%{name} daxûyaniyeke %{target} jê bir" + destroy_custom_emoji_html: "%{name} emojiya %{target} tune kir" + destroy_domain_allow_html: "%{name} bi navperê %{target} re maf neda federeyê" + destroy_domain_block_html: "%{name} navpera astengkirî %{target}" + destroy_email_domain_block_html: "%{name} e-name yê navpera %{target} asteng kirinê rakir" + destroy_ip_block_html: "%{name}, ji bo IPya %{target} rêziknameyê jêbir" + destroy_status_html: "%{name} ji alîyê %{target} ve şandiyê rakir" + destroy_unavailable_domain_html: "%{name} bi navperê %{target} re gihandinê berdewam kir" + disable_2fa_user_html: "%{name} ji bo bikarhênerê %{target} du faktorî neçalak kir" + disable_custom_emoji_html: "%{name} emojiya %{target} neçalak kir" + disable_sign_in_token_auth_user_html: "%{name} ji bo %{target} biştraskirina e-name ya token ne çalak kir" + disable_user_html: "%{name}, ji bo bikarhênerê %{target} têketinê neçalak kir" + enable_custom_emoji_html: "%{name} emojiya %{target} çalak kir" + enable_sign_in_token_auth_user_html: "%{name} ji bo %{target} biştraskirina e-name ya token çalak kir" + enable_user_html: "%{name}, ji bo bikarhênerê %{target} têketinê çalak kir" + memorialize_account_html: "%{name} ajimêra %{target} veguherand rûpeleke bîranînê" + promote_user_html: "%{name}, bikarhêner %{target} bilind kir" + remove_avatar_user_html: "%{name} avatara bikarhêner %{target} rakir" + reopen_report_html: "%{name} gilîyê %{target} ji nû ve vekir" + reset_password_user_html: "%{name} şifre ya bikarhênerê %{target} ji nû ve saz kir" + resolve_report_html: "%{name} gilîya %{target} çareser kir" + sensitive_account_html: "%{name} medyayê %{target} ê wek hestiyarî nîşan kir" + silence_account_html: "%{name} ajimêrê %{target} ê sînor kir" + suspend_account_html: "%{name} ajimêrê %{target} ê hilda rawestandinê" + unassigned_report_html: "%{name} gilîkirina %{target} rakir" + unsensitive_account_html: "%{name} medyayê %{target} ê nîşandana hestiyarî rakir" + unsilence_account_html: "%{name} bêdengiya ajimêrê %{target} ê rakir" + unsuspend_account_html: "%{name} ajimêrê %{target} ê de rawestandinê rakir" + update_announcement_html: "%{name} agahdarî ya%{target} rojane kir" + update_custom_emoji_html: "%{name} emojiyê %{target} rojane kir" + update_domain_block_html: "%{name} ji bo navperê %{target} asteng kirinê rojane kir" + update_status_html: "%{name} şandiya bikarhêner %{target} rojanekir" + deleted_status: "(şandiyeke jêbirî)" + empty: Tomarkirin nehate dîtin. + filter_by_action: Li gorî çalakiyê biparzinîne + filter_by_user: Li gorî bikarhênerê biparzinîne + title: Tomarê çavdêriyê + announcements: + destroyed_msg: Daxûyanî bi awayekî serkeftî hate jêbirin! + edit: + title: Daxûyaniyê serrast bike + empty: Daxûyanî nehat dîtin. + live: Zindî + new: + create: Daxûyaniyekê çê bike + title: Daxûyaniya nû + publish: Biweşîne + published_msg: Daxûyanî bi awayekî serkeftî hate weşan! + scheduled_for: Bo %{time} hatiye demsazkirin + scheduled_msg: Daxûyanî hate demsazkirin bo weşanê! + title: Daxuyanî + unpublish: Neweşîne + unpublished_msg: Daxûyanî bi awayekî serkeftî weşan pûç kir! + updated_msg: Daxûyanî bi awayekî serkeftî hate rojanekirin! + custom_emojis: + assign_category: Diyarkirina beşê + by_domain: Navper + copied_msg: Jêgirtiyê emojî ya herêmî bi serkeftî hate afirandin + copy: Jê bigire + copy_failed_msg: Jêgirtiyêke emojî ya herêmî nehate afirandin + create_new_category: Beşêke nû biafirîne + created_msg: Hestok bi serkeftî hate çêkirin! + delete: Jê bibe + destroyed_msg: Hestok bi serkeftî hate rûxandin! + disable: Neçalak bike + disabled: Neçalakkirî + disabled_msg: Ev hestok bi serkeftî hate neçalak kirin + emoji: Emoji + enable: Çalak bike + enabled: Çalakkirî + enabled_msg: Ev hestok bi serkeftî hate çalak kirin + image_hint: Mezinahiya pelê PNG heya 50Kb te + list: Rêzok + listed: Rêzokkirî + new: + title: Hestokên kesane yên nû lê zêde bike + not_permitted: Mafê te tune ku tu vê çalakiyê bikî + overwrite: Bi ser de binivsîne + shortcode: Kurtekod + shortcode_hint: Herê kêm 2 tîp, tenê tîpên alfahejmarî û yên bin xêzkirî + title: Hestokên kesane + uncategorized: Bêbeş + unlist: Dervî rêzokê + unlisted: Nerêzokkirî + update_failed_msg: Ev hestok nehate rojanekirin + updated_msg: Emojî bi awayekî serkeftî hate rojanekirin! + upload: Bar bike + dashboard: + active_users: bikarhênerên çalak + interactions: têgerîn + media_storage: Bîrdanaka medyayê + new_users: bikarhênerên nû + opened_reports: ragihandin hatin vekirin + pending_reports_html: + one: "1 ragihandin benda nirxandinê" + other: "%{count} ragihandin benda nirxandinê" + pending_tags_html: + one: "1 hashtag benda nirxandinê" + other: "%{count} hashtag benda nirxandinê" + pending_users_html: + one: "1 bikarhêner benda nirxandinê" + other: "%{count} bikarhêner benda nirxandinê" + resolved_reports: ragihandinên çareserkirî + software: Nermalav + sources: Çavkaniyên tomarkirî + space: Bikaranîna cîh + title: Destgeha venasînê + top_languages: Zimanên herî çalak + top_servers: Rajekarên herî çalak + website: Malpera tevnê + domain_allows: + add_new: Maf bide navpera federasyonê + created_msg: Ji bo federasyonê maf dayîna navperê bi serkeftî hate dayîn + destroyed_msg: Ji bo federasyonê maf dayîna navperê nehat dayîn + undo: Maf nede navpera federasyonê + domain_blocks: + add_new: Astengkirina navpera nû + created_msg: Navpera asteng kirinê nû hat şixulandin + destroyed_msg: Navpera asteng kirinê hat rakirin + domain: Navper + edit: Astengkirina navperê serrast bike + existing_domain_block_html: Te bi bandorê mezin sînor danî ser %{name}, Divê tu asteng kirinê rabikî, pêşî ya . + new: + create: Astengkirinekê çê bike + hint: Navpera asteng kirî pêşî li çê kirina têketinên ajimêra ên di danegehê da negire, lê dê bi paş ve bizivirin û bi xweberî va ji ajimêran bi teybetî kontrola rêbazan bikin. + severity: + desc_html: |- + Bêdeng kirî ajimêrên wusa çêkirine xêncî şopînerên vê kes nikare şandîyên vê bibîne. + rawestî ajimêrên wusa çêkirine hemî naveroka, medya û daneyên profîlê jê bibe. Heke tu bixwazî pelên medyayê red bikîyek ji wanbi kar bîne. + noop: Ne yek + silence: Bêdengî + suspend: Dur bike + title: Astengkirina navpera nû + obfuscate: Navê navperê biveşêre + obfuscate_hint: Heke rêzoka sînorên navperê were çalakkirin navê navperê di rêzokê de bi qismî veşêre + private_comment: Şîroveya taybet + private_comment_hint: Derbarê sînorkirina vê navperê da ji bo bikaranîna hundirîn a moderatoran şîrove bikin. + public_comment: Şîroveya gelemperî + public_comment_hint: Heke reklamkirina rêzoka sînorên navperê çalak be, derbarê sînorkirina vê navperê da ji bo raya giştî şîrove bikin. + reject_media: Pelên medyayê red bike + reject_media_hint: Pelên medyayê herêmî hatine tomarkirin radike û di pêşerojê de daxistinê red dike. Ji bo rawstandinê ne girîng e + reject_reports: Ragihandinan red bike + reject_reports_hint: Ragihandinên ku ji vê navperê tê paşguh bike. Ji bo dûrbûnê re ne guncav e + rejecting_media: pelên medyayê red bike + rejecting_reports: ragihandinê red bike + severity: + silence: sînorkirî + suspend: hatiye rawestandin + show: + affected_accounts: + one: Yek ajimêr di danegehê de bandor kir + other: "%{count} ajimêr di danegehê de bandor kir" + retroactive: + silence: Vê navperê de sînorê li ser hemî ajimêran rabike + suspend: Vê navperê de rawestandinê li ser hemî ajimêran rabike + title: Ji bo navperê %{domain} asteng kirinê hilde + undo: Vegerîne + undo: Astengkirina navperê vegerîne + view: Astengkirina navperê nîşan bike + email_domain_blocks: + add_new: Nû tevlî bike + created_msg: Bi serkeftî navpera e-name hat asteng kirin + delete: Jê bibe + destroyed_msg: Bi serkeftî navpera e-name yê ji asteng kirinê derket + domain: Navper + empty: Tu navperên e-nameyê astengkirî bo niha tune ne. + from_html: ji %{domain} + new: + create: Navper tevlî bike + title: Navparê e-nameyê nû asteng bike + title: Navparên e-nameyê astengkirî + follow_recommendations: + description_html: "Şopandina pêşniyaran ji bo bikarhênerên nû re dibe alîkar ku zû naveroka balkêş bibînin. Gava ku bikarhênerek têra xwe bi kesên din re têkildar nebê da ku pêşnîyarên şopandina yên kesane bo xwe çêbike, li şûna van ajimêran têne pêşniyarkirin. Ew her roj ji tevliheviya ajimêrên bi tevlêbûnên herî dawîn ên herî bilind û jimara şopdarên herêmî yên herî pir ji bo zimaneke diyarkirî ji nû ve têne pêşniyarkirin." + language: Bo zimanê + status: Rewş + suppress: Bi bandorek mezin pêşniyara şopandinê bike + suppressed: Bandoreke mezin dibe + title: Pêşniyarên şopandinê + unsuppress: Pêşniyara şopandinê paşve vegerîne + instances: + back_to_all: Hemû + back_to_limited: Sînorkirî + back_to_warning: Hişyarî + by_domain: Navper + delivery: + all: Hemû + clear: Çewtiyên gihandinê paqij bike + restart: Gihandinê nû va bike + stop: Gehandinê rawestîne + title: Gihiştin + unavailable: Nederbasdar + unavailable_message: Gihandin berdest nîne + warning: Hişyarî + warning_message: + one: Sernekeftina radestkirinê %{count} roj + other: Sernekeftina radestkirinê %{count} roj + delivery_available: Gihandin berdest e + delivery_error_days: Rojên çewtiyên gehandinê + delivery_error_hint: Ger gehandin %{count} rojan ne pêkan be ewê wek bixweber wê nayê gehandin were nîşandan. + empty: Tu navper nehatine dîtin. + known_accounts: + one: "%{count} ajimêra naskirî" + other: "%{count} ajimêrên naskirî" + moderation: + all: Hemû + limited: Sînorkirî + title: Çavdêrî + private_comment: Şîroveya taybet + public_comment: Şîroveya ji hemû kesî re vekirî + title: Giştî + total_blocked_by_us: Ji aliyê me ve hatiye astengkirin + total_followed_by_them: Ji aliyê wan ve hatiye şopandin + total_followed_by_us: Ji aliyê ve me hate şopandin + total_reported: Giliyên derheqê wan de + total_storage: Pêvekên medyayê + invites: + deactivate_all: Hemûyan neçalak bike + filter: + all: Hemû + available: Heye + expired: Dema wê qediya + title: Parzûn + title: Vexwendin + ip_blocks: + add_new: Rêbaz çê bike + created_msg: Rêzika nû a IPyê bi awayekî serkeftî hat tevlêkirin + delete: Jê bibe + expires_in: + '1209600': 2 hefte + '15778476': 6 meh + '2629746': 1 meh + '31556952': 1 sal + '86400': 1 roj + '94670856': 3 sal + new: + title: Rêzika nû a IPyê çêbike + no_ip_block_selected: Ji ber ku tu ajimêr nehat hilbijartin tu rêzika IPyê nehate guhertin + title: Rêbazên IP + pending_accounts: + title: Ajimêrên di dorê de ne (%{count}) + relationships: + title: Têkiliyên %{acct} + relays: + add_new: Guhêrkerê nû tevlê bike + delete: Jê bibe + description_html: "Guhêrkerê giştî rajekareke navberkar e ku hejmareke mezin ji şandiyan di navbera rajekaran ku jê re dibin endam û weşanê dikin diguherîne. Ew dikare ji rajekarên piçûk û navîn re bibe alîkar ku naveroka ji fendiverse ê bibîne, ku bi rengeke din pêdivî dike ku bikarhênerên herêmî bi desta li dû kesên din ên li rajekarên ji dûr be bişopînin." + disable: Neçalak bike + disabled: Neçalakkirî + enable: Çalak bike + enable_hint: Gava were çalakkirin, rajekara te dê ji hemî şandiyên giştî yên vê guhêrkerê re bibe endam, û dê dest bi şandina şandiyên giştî yên vê rajekarê bike. + enabled: Çalakkirî + inbox_url: URLa guhêrker + pending: Li benda pêjirandina guhêrker e + save_and_enable: Tomar û çalak bike + setup: Girêdanekê guhêrker saz bike + signatures_not_enabled: Dema ku moda ewle ya jî moda rêzoka spî çalak be guhêrker wê birêkûpêk nexebite + status: Rewş + title: Guhêrker + report_notes: + created_msg: Nîşeyê ragihandinê bi awayekî serkeftî pêk hat! + destroyed_msg: Nîşeyê ragihandinê bi awayekî serkeftî hate jêbirin! + reports: + account: + notes: + one: "%{count} nîşe" + other: "%{count} nîşe" + reports: + one: "%{count} gilî" + other: "%{count} gilî" + action_taken_by: Çalakî hate kirin ji aliyê + are_you_sure: Gelo tu bawerî? + assign_to_self: Bo min diyar bike + assigned: Çavdêrê diyarkirî + by_target_domain: Navperê ya ajimêrê ragihandî + comment: + none: Ne yek + created_at: Hate ragihandin + forwarded: Beralîkirî + forwarded_to: Beralîkirî bo %{domain} + mark_as_resolved: Wekî çareserkirî nîşan bide + mark_as_unresolved: Wekî neçareserkirî nîşan bide + notes: + create: Nîşe tevlî bike + create_and_resolve: Bi nîşe re çareser bike + create_and_unresolve: Bi nîşe re dîsa veke + delete: Jê bibe + placeholder: Bide nasîn ka çi çalakî hatine kirin, an jî heman rojanekirinên din ên têkildar... + reopen: Ragihandina ji nû ve veke + report: "@%{id} Ragihîne" + reported_account: Ajimêra ragihandî + reported_by: Ragihandî ji aliyê + resolved: Çareserkirî + resolved_msg: Ragihandin bi awayekî serkeftî hate çareserkirin! + status: Rewş + target_origin: Jêdera ajimêrê ragihandî + title: Ragihandinên + unassign: Diyar neke + unresolved: Neçareserkirî + updated_at: Rojanekirî + rules: + add_new: Rêbazekê tevlî bike + delete: Jê bibe + description_html: Dema ku piranîya dibêjin ku wan merçên karanînê xwendine û dipejirînin jî, bi gelemperî mirov heta ku pirsgirêkek dernekeve holê naxwîne. Bi peydakirina wan di navnîşek xala guleya rast de hêsantir bike ku tu rêbazên rajekera xwe li ser çavekî bibîne. Hewl bide ku rêbazênn yekkesî kurt û hêsan bihêlî, lê hewl bide ku wan tênexî gelek hêmanên cuda jî. + edit: Rêbazê serrast bike + empty: Tu rêbazên rajekar hê nehatine dîyarkirin. + title: Rêbazên rajekar + settings: + activity_api_enabled: + desc_html: Hejmara şandiyên weşandî yên herêmî, bikarhênerên çalak, û tomarkirin ên nû heftane + title: Tevahî amarên ên di derbarê çalakiya bikarhêneran de biweşîne + bootstrap_timeline_accounts: + desc_html: Navên bikarhênerên pir bi xalîçê veqetîne. Dê van ajimêran di pêşnîyarên jêrîn de werin xuyakirin + title: Van ajimêran ji bikarhênerên nû re pêşniyar bike + contact_information: + email: E-nameya karsazî + username: Bi bikarhêner re têkeve têkiliyê + custom_css: + desc_html: Bi CSS a ku li her rûpelê hatiye barkirin, awayê dîmenê biguherîne + title: CSS a kesanekirî + default_noindex: + desc_html: Hemû bikarhênerên ku ev sazkarî bi xwe neguhertiye bandor dike + title: Pêlrêçkirna bikarhêneran ji motorê lêgerînê dûr bixe + domain_blocks: + all: Bo herkesî + disabled: Bo tu kesî + title: Astengkirinên navperê nîşan bide + users: Ji bo bikarhênerên herêmî yên xwe tomar kirine + domain_blocks_rationale: + title: Sedemê nîşan bike + hero: + desc_html: Li ser rûpela pêşîn tê xuyakirin. Bi kêmanî 600x100px tê pêşniyarkirin. Dema ku neyê sazkirin, vedigere ser dîmena wêneya piçûk a rajekar + title: Wêneya lehengê + mascot: + desc_html: Li ser rûpela pêşîn tê xuyakirin. Bi kêmanî 293×205px tê pêşniyarkirin. Dema ku neyê sazkirin, vedigere ser dîmena wêneya piçûk a maskot ya heyî + title: Wêneya maskot + peers_api_enabled: + desc_html: Navê navperên ku ev rajekar di fendiverse de rastî wan hatiye + title: Rêzoka rajekarên hatiye dîtin di API-yê de biweşîne + preview_sensitive_media: + desc_html: Pêşdîtinên girêdanê yên li ser malperên din tevlî ku medya wekî hestyar hatiye nîşandan wê wekî wêneyekî piçûk nîşan bide + title: Medyayê hestyar nîşan bide di pêşdîtinên OpenGraph de + profile_directory: + desc_html: Mafê bide bikarhêneran ku bêne vedîtin + title: Pelrêçên profilê çalak bike + registrations: + closed_message: + desc_html: Gava ku tomarkirin têne girtin li ser rûpelê pêşîn têne xuyang kirin. Tu dikarî nîşanên HTML-ê bi kar bîne + title: Tomarkirinê girtî ya peyaman + deletion: + desc_html: Maf bide ku herkes bikaribe ajimêrê te jê bibe + title: Jê birina ajimêrê vekek + min_invite_role: + disabled: Ne yek + title: Maf bide vexwendinên ji alîyê + require_invite_text: + desc_html: Gava ku tomarkirin pêdiviya pejirandina destan dike, Têketina nivîsê "Tu çima dixwazî beşdar bibî?" Bibe sereke ji devla vebijêrkî be + title: Ji bo bikarhênerên nû divê ku sedemek tevlêbûnê binivîsinin + registrations_mode: + modes: + approved: Ji bo têketinê erêkirin pêwîste + none: Kesek nikare tomar bibe + open: Herkes dikare tomar bibe + title: Awayê tomarkirinê + show_known_fediverse_at_about_page: + desc_html: Dema ku neçalak be, demnameya gerdûnî ya ku ji rûpela zeviyê ve hatî girêdan tenê bi nîşandana naveroka herêmî tên sînorkirin + title: Li ser rûpela demnameya ne naskirî naveroka giştî nîşan bide + show_staff_badge: + desc_html: Di rûpela bikarhêner da rozeta xebatkaran nîşan bike + title: Rozeta xebatkara nîşan bike + site_description: + desc_html: Paragrafa destpêkê li ser API. Dide nasîn ka çi ev rajekarê Mastodon taybet dike û tiştên din ên girîn. Tu dikarî hashtagên HTML-ê, bi kar bîne di <a> û <em> de. + title: Danasîna rajekar + site_description_extended: + desc_html: Ji bo kodê perwerdetî, rêzik, rêbername û tiştên din ên ku rajekara te ji hev cihê dike cîhekî baş e. Tu dikarî hashtagên HTML-ê bi kar bîne + title: Zanyarên berfirehkirî ya rajekar + site_short_description: + desc_html: Ew di alavdanka kêlekê û tagên meta de tên xuyakirin. Di yek paragrafê de rave bike ka Mastodon çi ye û ya ku ev rajekar taybetî dike. + title: Danasîna rajekarê kurt + site_terms: + desc_html: Tu dikarî polîtika nihêniyê xwe, mercên karûbar an nameyên din binvisîne. Tu dikarî nîşanên HTML-ê bi kar bîne + title: Mercên bikaranîn a kesanekirî + site_title: Navê rajekar + thumbnail: + desc_html: Ji bo pêşdîtinên bi riya OpenGraph û API-yê têne bikaranîn. 1200x630px tê pêşniyar kirin + title: Wêneya piçûk a rajekar + timeline_preview: + desc_html: Girêdana demnameya gelemperî li ser rûpela daxistinê nîşan bide û mafê bide ku API bêyî rastandinê bigihîje damnameya gelemperî + title: Mafê bide gihîştina ne naskirî bo demnameya gelemperî + title: Sazkariyên malperê + trendable_by_default: + desc_html: Hashtagên ku berê hatibûn qedexekirin bandor dike + title: Bihêle ku hashtag bêyî nirxandinek pêşîn bibe rojev + trends: + desc_html: Hashtagên ku berê hatibûn nirxandin ên ku niha rojev in bi gelemperî bide xuyakirin + title: Hashtagên rojevê + site_uploads: + delete: Pela barkirî jê bibe + destroyed_msg: Barkirina malperê bi serkeftî hate jêbirin! + statuses: + back_to_account: Vegere bo rûpela ajimêr + batch: + delete: Jê bibe + nsfw_off: Wekî ne hestiyar nîşan bide + nsfw_on: Wekî hestiyar nîşan bide + deleted: Hate jêbirin + failed_to_execute: Bi ser neket + media: + title: Medya + no_media: Medya nîne + no_status_selected: Tu şandî nehat hilbijartin ji ber vê tu şandî jî nehat guhertin + title: Şandiyên ajimêr + with_media: Bi medya yê re + system_checks: + database_schema_check: + message_html: Koçberiyên databasê yên li bendê hene. Ji kerema xwe wan bişopîne da ku bicîh bikî ku sepan wekî ku tê hêvî kirin tevbigere + rules_check: + action: Rêzikên rajekara bi rê ve bibe + message_html: Te qet rêzikên rajekara diyar nekiriye. + sidekiq_process_check: + message_html: Pêvajoyên Sidekiq ên heyî ji bo %{value} di rêz (an) de tune ne. Ji kerema xwe sazkariyên Sidekiq a xwe binirxîne + tags: + accounts_today: Bikaranînên bêhempa yên îro + accounts_week: Bikaranînên bêhempa yên vê heftê + breakdown: Dabeşkirina bikaranîn yên îro li gorî çavkaniyan ve + last_active: Çalakiyên dawî + most_popular: Herî navdar + most_recent: Çalakiyên herî nû + name: Hashtag + review: Binêre rewşê + reviewed: Hate vekolandin + title: Hashtag + trending_right_now: Niha di rojevê de + unique_uses_today: "%{count} şandiyên îro" + unreviewed: Nehatiye nirxandin + updated_msg: Sazkariyên hashtag bi awayekî serkeftî hate rojanekirin + title: Rêvebirî + warning_presets: + add_new: Yeka nû tevlî bike + delete: Jê bibe + edit_preset: Hişyariyên pêşsazkirî serrast bike + empty: Te hin tu hişyariyên pêşsazkirî destnîşan nekirine. + title: Hişyariyên pêşsazkirî bi rêve bibe + admin_mailer: + new_pending_account: + body: Zanyariyênn ajimêra nû li jêr in. Tu dikarî vê serîlêdanê bipejirîne an pûç bike. + subject: "(%{username}) ajimêrê nû ji bo vekolandina li ser %{instance}" + new_report: + body: "%{reporter} ji %{target} ê ragihand" + body_remote: Kesekî bi navê %{domain} ji %{target} ê ragihand + subject: Ragihandinek nû ji bo %{instance} (#%{id}) + new_trending_tag: + body: 'Hashtaga #%{name} îro rojev e, lê berê nehatibû nirxandin. Heya ku tu mafê nedît, ew ê bi gelemperî neyê xuyang kirin, an jî tenê formê tomar bike ku ew e ku tu careke din li ser wê tiştekî nebîne.' + subject: "(#%{name}) Hashtagek nû ji bo vekolandina li ser%{instance}" + aliases: + add_new: Naveke sexte çê bike + created_msg: Bi serkeftî nûçikê nû hat çêkirin. Tu niha dikarî di ajimêrê xwe kevn bar bikî. + deleted_msg: Nûçik bi serkeftî hat rakirin. Êdî nepêkan e vê ajimêrê de barkirina ajimêrek din. + empty: Nûçikên te tune ne. + hint_html: Heke tu dixwazî ji ajimêreke din bar bike bo yekî din, li vir tu dikarî bernavekê biafirîne, ku pêdivî ye berî ku tu bi şopandina şopînerên xwe ji ajimêra kevn ber bi vê yekê biçe. Ev çalakî bi serê xwe bê ziyan û vegere.Koçberiya ajimêr ji ajimêreke kevin dest pê dike. + remove: Girêdana nûçikê rake + appearance: + advanced_web_interface: Navrûya tevnê yê pêşketî + advanced_web_interface_hint: 'Heke tu bixwazin tevahiya ferehiya dîmendera xwe bi kar bînî, navrûya pêşketî ya tevnê dihêle ku tu gelek stûnên cihêreng saz bikî da ku di heman demê de bi qasî ku tu dixwazî zanyariyan bibînî: Serrûpel, agahdarî, demnameya giştî, her hejmarek ji rêzik û hashtagan.' + animations_and_accessibility: Anîmasyon û gihînî + confirmation_dialogs: Gotûbêjên piştrastkirî + discovery: Vedîtin + localization: + body: Mastodon ji aliyê xêrxwazan tê wergerandin. + guide_link: https://crowdin.com/project/mastodon + guide_link_text: Herkes dikare beşdar bibe. + sensitive_content: Naveroka hestiyarî + toot_layout: Xêzkirina şandîya + application_mailer: + notification_preferences: Hevyazên e-name yê biguherîne + salutation: "%{name}," + settings: 'Hevyazên e-name yê biguherîne: %{link}' + view: 'Nîşan bide:' + view_profile: Profîlê nîşan bide + view_status: Şandiyê nîşan bide + applications: + created: Sepan bi awayekî serkeftî hat çêkirin + destroyed: Sepan bi awayekî serkeftî hat jêbirin + invalid_url: URL ya hatiye dayîn ne derbasdar e + regenerate_token: Nîşandera gihandinê bi nûve çêbike + token_regenerated: Nîşandera gihandinê bi serkeftî nû ve hat çêkirin + warning: Bi van daneyan re pir baldar be. Tu caran bi kesî re parve neke! + your_token: Nîşana gihîştina te + auth: + apply_for_account: Daxwaza vexwendinekê bike + change_password: Pêborîn + checkbox_agreement_html: Ez rêbazên rajeker û hêmanên karûbaran dipejirînim + checkbox_agreement_without_rules_html: Ez hêmanên karûbaran rêbazên rajeker dipejirînim + delete_account: Ajimêr jê bibe + delete_account_html: Heke tu dixwazî ajimêra xwe jê bibe, tu dikarî li vir bidomîne. Ji te tê xwestin ku were pejirandin. + description: + prefix_invited_by_user: "@%{name} te vedixwîne ku tu beşdarî vê rajekara Mastodon-ê bibî!" + prefix_sign_up: Îro li Mastodonê tomar bibe! + suffix: Bi ajimêrekê, tu yê karibî kesan bişopînî, rojanekirinan bişînî û bi bikarhênerên ji her rajekarê Mastodon re peyaman bişînî û bêhtir! + didnt_get_confirmation: Te rêwerzên pejirandinê wernegirt? + dont_have_your_security_key: Kilîda te ya ewlehiyê tune ye? + forgot_password: Te pêborîna xwe jibîrkir? + invalid_reset_password_token: Ji nû ve sazkirina pêborînê nederbasdar e an jî qediya ye. Jkx daxwaza yeka nû bike. + link_to_otp: Ji têlefona xwe an jî ji kodeke rizgarkirinê kodeke du-gavî binivîsine + link_to_webauth: Amûra kilîta ewlehiya xwe bi kar bîne + login: Têkeve + logout: Derkeve + migrate_account: Derbasî ajimêreke din bibe + migrate_account_html: Heke tu dixwazî ev ajimêr li ajimêreke cuda beralî bikî, tu dikarî ji vir de saz bike. + or_log_in_with: An têketinê bike bi riya + providers: + cas: CAS + saml: SAML + register: Tomar bibe + registration_closed: "%{instance} endamên nû napejirîne" + resend_confirmation: Rêwerên pejirandinê ji nû ve bişîne + reset_password: Pêborînê ji nû ve saz bike + security: Ewlehî + set_new_password: Pêborîneke nû ji nû ve saz bike + setup: + email_below_hint_html: Heke navnîşana e-nameya jêrîn ne rast be, tu dikarî wê li vir biguherîne û e-nameyeke pejirandinê ya nû bistîne. + email_settings_hint_html: E-nameya pejirandinê ji %{email} re hate şandin. Heke ew navnîşana e-nameyê ne rast be, tu dikarî wê di sazkariyên ajimêr de biguherîne. + title: Damezirandin + status: + account_status: Rewşa ajimêr + confirming: Li benda pejirandina e-nameyê ne da ku biqede. + functional: Ajimêra te êdî amade ye. + pending: Daxwaza te li benda vekolînê ji hêla xebatkarên me ye. Ev dibe ku hinek dem bigire. Heke daxwaza te were pejirandin tu yê e-nameyekê bistîne. + redirecting_to: Ajimêra te neçalak e ji ber ku niha ber bi %{acct} ve tê beralîkirin. + too_fast: Form pir zû hat şandin, dîsa biceribîne. + trouble_logging_in: Têketina te de pirsgirêk çêdibe? + use_security_key: Kilîteke ewlehiyê bikar bîne + authorize_follow: + already_following: Jixwe tu vê ajimêrê dişopînî + already_requested: Jixwe te ji vê ajimêrê re daxwazîya şopandinê şandi bû + error: Mixabin, dema ajimêr hat gerandin çewtiyek çêbû + follow: Bişopîne + follow_request: 'Te ji vê kesê re daxwazîya şopandinê şand:' + following: 'Serkeftin! Tu êdî dikarî bişopînî:' + post_follow: + close: An jî, tu dikarî tenê ev çarçoveyê bigirî. + return: Profîla vê bikarhênerê nîşan bike + web: Biçe tevneyê + title: Bişopîne %{acct} + challenge: + confirm: Bidomîne + hint_html: "Nîşe:Ji bo demjimêreke din em ê pêborîna te careke din ji te nexwazin." + invalid_password: Pêborîna nederbasdar + prompt: Ji bo bidomî lêborînê bipejirîne + crypto: + errors: + invalid_key: ed25519 ne derbasdare ne jî Curve25519 kilîta + invalid_signature: Ed25519 ne îmzeyek derbasdar e + date: + formats: + default: "%b%d%Y" + with_month_name: "%B %d, %Y" + datetime: + distance_in_words: + about_x_hours: "%{count}d" + about_x_months: "%{count}meh" + about_x_years: "%{count}sal" + almost_x_years: "%{count}sal" + half_a_minute: Hema niha + less_than_x_minutes: "%{count}xulek" + less_than_x_seconds: Hema niha + over_x_years: "%{count}sal" + x_days: "%{count}roj" + x_minutes: "%{count}xulek" + x_months: "%{count}meh" + x_seconds: "%{count}çirke" + deletes: + challenge_not_passed: Zanyariyên ku te nivîsandî ne rast in + confirm_password: Pêborîna xwe ya heyî binivîsine da ku nasnameya xwe piştrast bikî + confirm_username: Navê bikarhêneriyê xwe binivîse da ku prosedurê piştrast bike + proceed: Ajimêr jê bibe + success_msg: Ajimêra te bi serkeftî hate jêbirin + warning: + before: 'Berî ku tu pêşve biçî, jkx nvan nîşeyan bi baldarî bixwîne:' + caches: Naveroka ku ji hêla rajekarên din ve hatiye pêşbîrkirin dibe ku bimîne + data_removal: Şandiyên te û daneyên din wê bi awayekî dawî bêne rakirin + email_change_html: Tu dikarî navnîşana e-nameya xwe biguherînî bêyî ku tu ajimêra xwe jê bibî + email_contact_html: Heke ew hîn jî negihîştiye, tu dikarî ji bo alîkariyê %{email} e-nameyê bişînî + email_reconfirmation_html: Heke te e-nameya pejirandinê nesitand, tu dikarî dîsa daxwaz bike + irreversible: Tu yê nikaribe ajimêra xwe serrast bike an ji nû ve çalak bike + more_details_html: Bo bêhtir zanyarî, polîtika nihêniyê binêre. + username_available: Navê bikarhêneriyê te wê dîsa peyda bibe + username_unavailable: Navê bikarhêneriyê ye wê tuneyî bimîne + directories: + directory: Rêgeha profîlê + explanation: Bikarhêneran li gorî berjewendiyên wan bibîne + explore_mastodon: Vekole %{title} + domain_validator: + invalid_domain: ne naveke navper a derbasdar e + errors: + '400': Daxwaza ku te şand nederbasdar an çewt bû. + '403': Ji bo dîtina vê rûpelê mafê te nîn e. + '404': Rûpela ku tu lê digerî ne li vir e. + '406': Ev rûpel di awayê ku tê xwestin de peyda nabe. + '410': Ew rûpela ku tu lê digeriya êdî li vir nîne. + '422': + content: Rastekirina ewlehiyê têk çû. Ma tu kiloran asteng dikî? + title: Rastekirina ewlehiyê têk çû + '429': Gelek daxwazî + '500': + content: Em xemgîn in, lê tiştek di aliyê me de şaş çû. + title: Ev rûpel ne rast e + '503': Ji ber têkçûna rajekar a demkî rûpel nayê bikaranîn. + noscript_html: Ji bo ku tu sepanaa Mastodon a tevnê bi kar bîne, jkx JavaScript-ê çalak bike. Wekî din, yek ji sepanên xwemalî ji bo Mastodon ji bo platforma xwe biceribîne. + existing_username_validator: + not_found: nikaribû bikarhênerek herêmî bi wê navê bikarhêner bibîne + not_found_multiple: "%{usernames} nehat dîtin" + exports: + archive_takeout: + date: Dem + download: Arşîva xwe daxîne + hint_html: Tu dikarî arşîvek ji weşanên xwe û medyayên barkirî re bixwaze. Daneyên derxistî dê di forma ActivityPub de bin, ku ji hêla nermalava ku vê formê ve têne xwendin. Tu dikarî her 7 rojan arşîvekê bixwaze. + in_progress: Arşîve te tê berhev kirin... + request: Daxwaza arşîva ajimêra xwe bike + size: Mezinahî + blocks: Yên te astengkirî + bookmarks: Şûnpel + csv: CSV + domain_blocks: Navperên astengkirî + lists: Rêzok + mutes: Te bêdeng kir + storage: Bîrdanaka medyayê + featured_tags: + add_new: Yeka nû tevlî bike + errors: + limit: Te jixwe berê pirtirîn hashtag destnîşan kiriye + hint_html: " Hashtagên destnîşankirî çi ne? Ew bi eşkere li ser profîla te ya gelemperî têne xuyakirin û dihêlin ku mirov bi taybetî di binê wan hashtagan de li şandiyên te yên gelemperî bigere. Ew ji bo şopandina karên afirîner an projeyên demdirêj amûrek girîng in." + filters: + contexts: + account: Profîl + home: Serrûpel û rêzok + notifications: Agahdarî + public: Demnameya gelemperî + thread: Axaftin + edit: + title: Parzûnê serrast bike + errors: + invalid_context: Naverok tune ye yan jî nederbasdar tê peydakirin + invalid_irreversible: Tenê qadên agahdarkirinê û serrûpel bi parzûna bêveger re dixebitin + index: + delete: Jê bibe + empty: Parzûnên te tune ne. + title: Parzûn + new: + title: Parzûnek nû li zêde bike + footer: + developers: Pêşdebir + more: Bêtir… + resources: Çavkanî + trending_now: Niha rojevê de + generic: + all: Hemû + changes_saved_msg: Guhertin bi serkeftî tomar bû! + copy: Jê bigire + delete: Jê bibe + no_batch_actions_available: Di vê rûpelê da tu çalakîyên tevahî tune ne + order_by: Rêz bike bi + save_changes: Guhertinan tomar bike + validation_errors: + one: Tiştek hîn ne rast e! Ji kerema xwe çewtiya li jêr di ber çavan re derbas bike + other: Tiştek hîn ne rast e! Ji kerema xwe %{count} çewtî li jêr di ber çavan re derbas bike + html_validator: + invalid_markup: 'di nav de nîşana HTML a nederbasdar heye: %{error}' + identity_proofs: + active: Çalak + authorize: Erê, bide rastandin + authorize_connection_prompt: Tu dixwazî ev girêdana şîfrekirinê bidî rastandin? + errors: + failed: Girêdana şîfrekirinê têk çû. Ji kerema xwe dîsa biceribîne ji%{provider}. + keybase: + invalid_token: Nîşanên Keybase beşek ji îmzeyan in û divê 66 tîpên hex bin + verification_failed: Keybase vê wekî îmzeya bikarhênerê %{kb_username} nas nake. Ji kerema xwe ji Keybase dîsa biceribîne. + wrong_user: Dema ku wekî %{current} têketin dikî, ji bo %{proving} delîl nayê çêkirin. Wekî %{proving} têkeve û dîsa biceribîne. + explanation_html: Li vir tu dikarî nasnameyên xwe yên din ji platformên din, wek Keybase, bi şîfrekî ve girê bidî. Ev dihêle mirovên din ji te re peyamên şîfrekirî li ser wan platforman bişînin û dihêle ew pê bawer bin ku naveroka ku tu ji wan re dişînin ji te tê. + i_am_html: Ez %{username} li ser %{service}. + identity: Nasname + inactive: Neçalak e + publicize_checkbox: 'Û vê toot bike:' + publicize_toot: 'Hat eşkerekirin! Ez %{username} li ser %{service}: %{url}' + remove: Di ajimêrê de delîla rabike + removed: Delîl di ajimêrê de bi serkeftî hat rakirin + status: Piştrastkirina rewşê + view_proof: Delîlan nîşan bike + imports: + errors: + over_rows_processing_limit: ji %{count} zêdetir rêzok hene + modes: + merge: Bi hev re bike + merge_long: Tomarên heyî bigire û yên nû lê zêde bike + overwrite: Bi ser de binivsîne + overwrite_long: Tomarkirinên heyî bi yên nû re biguherîne + preface: Tu dikarî têxistin ê daneyên bike ku te ji rajekareke din derxistî ye wek rêzoka kesên ku tu dişopîne an jî asteng dike. + success: Daneyên te bi serkeftî hat barkirin û di dema xwe de were pêvajotin + types: + blocking: Rêzoka astengkirinê + bookmarks: Şûnpel + domain_blocking: Rêzoka navperên astengkirî + following: Rêzoka yên tên şopandin + muting: Rêzoka bêdengiyê + upload: Bar bike + in_memoriam_html: Di bîranînê de. + invites: + delete: Neçalak bike + expired: Dema wê qediya + expires_in: + '1800': 30 xulek + '21600': 6 demjimêr + '3600': 1 demjimêr + '43200': 12 demjimêr + '604800': 1 hefte + '86400': 1 roj + expires_in_prompt: Tu car + generate: Girêdana vexwendinê çê bike + invited_by: 'Tu hatî vexwendin ji hêla:' + max_uses: + one: 1 bikaranîn + other: "%{count} bikaranîn" + max_uses_prompt: Bê sînor + prompt: Girêdanan bi kesên din re çê bike û parve bike da ku bigihîjin vê rajekarê + table: + expires_at: Diqede + uses: Bikaranîn + title: Mirovan vexwîne + lists: + errors: + limit: Tu gihîştî hejmara rêzika a herî zêde + login_activities: + authentication_methods: + otp: sepandina rastandina du-gavî + password: pêborîn + sign_in_token: koda ewlehiyê bo e-nameyê + webauthn: kilîtên ewlehiyê + description_html: Heke çalakiya ku nas nakî dibînî, çêtir dibe ku pêborîna xwe biguherînî û rastandina du-gavî çalak bikî. + empty: Dîroka piştrastkirinê tune ye + failed_sign_in_html: Hewldana têketinê ser neket bi%{method} ji %{ip} (%{browser}) de + successful_sign_in_html: Bi serkeftî têketin bi %{method} ji %{ip}(%{browser}) çêbû + title: Dîroka piştrastkirinê + media_attachments: + validations: + images_and_video: Nikare vîdyoyekê tevlî şandiyê ku berê wêne tê de heye bike + not_ready: Nikare pelên ku pêvajo neqedandî ve girêbide. Di demekê de dîsa biceribîne! + too_many: Zedetirî 4 pelan nayê tevlêkirin + migrations: + acct: Hate lîvandin bo + cancel: Beralîkirinê red bike + cancel_explanation: Dev berdan ji beralîkirinê dê ajimêra te ya heyî ji nû ve çalak bike, lê şopgerên ku li wê ajimêrê hatine livandin venagerêne. + cancelled_msg: Beralîkirin bi serkeftî hate betal kirin. + errors: + already_moved: heman ajimêr e ku te berê lê bar kiriye ye + missing_also_known_as: ne nasnavê vê ajimêrê ye + move_to_self: nikare bibe ajimêra heyî + not_found: nehate dîtin + on_cooldown: Tu li ser sarbûnê yî + followers_count: Di dema tevgerê de şopîner + incoming_migrations: Derbasî ajimêreke din bibe + incoming_migrations_html: Ji bo ku tu ji ajimêrek din bar bikî vê yekê, pêşî divê tu ajimêreke bi bernaveke çê bike . + moved_msg: Ajimêrate niha li %{acct} tê rêve kirin (beralîkirin) û şopînerên te têne livandin bo wê. + not_redirecting: Ajimêra te niha bo ajimêreke din nayê beralîkirin. + on_cooldown: Te herî dawî dev ji ajimêra xwe berda. Ev fonksiyon dê di %{count} rojan de dîsa peyda bibe. + past_migrations: Koçên berê + proceed_with_move: Şopîneran bilivîne + redirected_msg: Ajimêra te niha bo %{acct} tê beralîkirin. + redirecting_to: Ajimêra te niha bo %{acct} tê beralîkirin. + set_redirect: Beralîkirin saz bike + warning: + backreference_required: Pêdivî ye ku ajimêra nû wekî referanseke paşîn a vê ajimêrê were sazkirin + before: 'Berî ku tu berdewam bikî, ji kerema xwe re van nîşaneyan bi baldarî bixwîne:' + cooldown: Piştî livandin demek heye ku di wê navberê de tu yê nikaribe dîsa bilive + disabled_account: Ajimêra te ya heyî dê paşê bi tevahî neyê bikaranîn. Lê belê, tu dikarî bigihîje derxistinê daneyan û hem jî ji nû ve çalakkirinê. + followers: Ev çalakî dê hemî şopînerên ji ajimêra heyî bar bike ajimêra nû + only_redirect_html: Wekî din, tu dikarî tenê beralîkirinekê li ser profîla xwe bicîh bike . + other_data: Daneyên din dê bi xweberî neyên livandin + redirect: Profîla ajimêra te ya heyî dê bi nîşeyeke beralîkirinê were nûve kirin û ji lêgerînan were bi dûrxistin + moderation: + title: Çavdêrî + move_handler: + carry_blocks_over_text: Ev bikarhêner ji %{acct}, ku te astengkirî bû, bar kir. + carry_mutes_over_text: Ev bikarhêner ji %{acct}, ku te bê deng kirbû, bar kir. + copy_account_note_text: 'Ev bikarhêner ji %{acct} livî ye, li vir nîşeyên te yên berê ku te di derbarê wî/ê de nivîsandiye:' + notification_mailer: + digest: + action: Hemû agahdariyan nîşan bide + body: Li vir kurteyeke peyamên ku li te derbasbûnd ji serdana te ya dawîn di %{since} de + mention: "%{name} behsa te kir:" + new_followers_summary: + one: Herwiha, dema tu dûr bûyî te şopînerek nû bi dest xist! Bijî! + other: Herwiha, dema tu dûr bûyî te %{count} şopînerek nû bi dest xist! Bijî! + subject: + one: "1 agahdarî ji serdana te ya herî dawî ji \U0001F418" + other: "%{count} agahdarî ji serdana te ya herî dawî ji \U0001F418" + title: Di tunebûna te de... + favourite: + body: 'Şandiya te hate bijartin ji alî %{name} ve:' + subject: "%{name} şandiya te hez kir" + title: Bijarteyek nû + follow: + body: "%{name} niha te dişopîne!" + subject: "%{name} niha te dişopîne" + title: Şopînereke nû + follow_request: + action: Daxwazên şopandinê bi rê ve bibe + body: "%{name} daxwaza şopandina te kir" + subject: Şopîner li bendê ye:%{name} + title: Daxwazeke şopandinê ya nû + mention: + action: Bersivê bide + body: 'Tu hatiyî qalkirin ji aliyê %{name}:' + subject: Tu hatiye qalkirin ji aliyê %{name} + title: Qalkirina nû + poll: + subject: Rapirsî ji hêla %{name} ve qediya + reblog: + body: 'Şandiye te hate bilindkirin ji hêla %{name} ve:' + subject: "%{name} şandiya te bilind kir" + title: Bilindkirinên nû + status: + subject: "%{name} niha şand" + notifications: + email_events: Bûyer bo agahdariyên e-nameyê + email_events_hint: 'Bûyera ku tu dixwazî agahdariyan jê wergerî hilbijêre:' + other_settings: Sazkariya agahdariyên din + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: Hezar + trillion: Trîlyon + otp_authentication: + code_hint: Ji bo pejirandinê têkeve koda te ya ku ji alîyê sepana piştraskirinê va hatiye çê kirin + description_html: Heke tubi piştrastkirina du-faktorî re sepana piştrastkirinê çalak bikî, ji bo têketinê hewceye telefona te li ba te be, ji bona têketinê te ra nîşaneyan çê bike. + enable: Çalak bike + instructions_html: "Vê kodê QR kontrol bike bi riya Google Authenticator an jî sepanekeTOTP li ser têlefona xwe . Ji niha û pê ve, ew sepan dê nîşanên ku divê tu binivîsîne dema têketinê de biafirîne." + manual_instructions: 'Heke tu nikarî bî koda QR venêrî û pêwîst be bi dest bikevî, ev nivîsê hêsan ê veşartî:' + setup: Saz bike + wrong_code: Koda têketinê betal e! Dema rajekarê û dema amûrê raste? + pagination: + newer: Nûtir + next: Pêş + older: Kevntir + prev: Paş + truncate: "…" + polls: + errors: + already_voted: Te berê deng dabû vê rapirsîyê + duplicate_options: tiştên dubare tê de hene + duration_too_long: di pêşerojê de pir dûr e + duration_too_short: gelek zû ye + expired: Jixwe rapirsî dawî bû + invalid_choice: Vebijarka dengdanê ya bijartî tune + over_character_limit: her yek ji %{max} karakterê dirêjtirîn nabe + too_few_options: divê ji yekî zêdetir tişt hebin + too_many_options: nikare ji %{max} hêmanan bêhtir pêk bê + preferences: + other: Yên din + posting_defaults: Berdestên şandiyê + public_timelines: Demnameya gelemperî + reactions: + errors: + limit_reached: Sînorê reaksiyonên cihêrengî gihîşte asta dawî + unrecognized_emoji: emojîyeke ne naskirî ye + relationships: + activity: Çalakiya ajimêrê + dormant: Xewok + follow_selected_followers: Şopînerên hilbijartî bişopîne + followers: Şopîner + following: Dişopîne + invited: Vexwendî + last_active: Çalakiya dawî + most_recent: Herî dawî + moved: Barkirî + mutual: Hevpar + primary: Sereke + relationship: Pêwendî + remove_selected_domains: Hemû şopînerên ji navpera hilbijartî rake + remove_selected_followers: Şopînerên hilbijartî rake + remove_selected_follows: Bikarhênerên hilbijartî neşopîne + status: Rewşa ajimêr + remote_follow: + acct: Navnîşana ajimêra xwe username@domain yê ku tu yê jê çalakî bikî binvsîne + missing_resource: Ji bona ajimêra te pêwistiya beralîkirina URLyê nehate dîtin + no_account_html: Ajimêra te tune? Tu dikarîli vir tomar bibe + proceed: Şopandinê bidomîne + prompt: 'Tu yê bişopînî:' + reason_html: "Ev gav ji bona çi pêwîst e?%{instance}rajekerên ku tu tomarkiriyî dibe ku tunebe, ji bona vê divê pêşî te beralîyê rajekera te bi xwe bikin." + remote_interaction: + favourite: + proceed: Ber bi bijarê ve biçe + prompt: 'Tu dixwazî vê şandiyê bibijêrî:' + reblog: + proceed: Bo bilindkirinê bidomîne + prompt: 'Tu dixwazî vê şandî ye rabikî:' + reply: + proceed: Bersivandinê bidomîne + prompt: 'Tu dixwazî bersiva vê şandiyê bidî:' + scheduled_statuses: + over_daily_limit: Te sînorê %{limit} şandiyên demsazkirî yên ji bo îro derbas kir + over_total_limit: Te sînorê %{limit} şandiyên demsazkirî derbas kir + too_soon: Dîroka bernamesazkirinê divê dîrokeke ji îro pêşvetir be + sessions: + activity: Çalakiya dawî + browser: Gerok + browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + generic: Gerokeke nenas + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: Geroka QQ + safari: Safari + uc_browser: Geroka UCB + weibo: Weibo + current_session: Danişîna heyî + description: "%{platform} ser %{browser}" + explanation: Gerokên tevnê di dema heyî de hene ku têketin kirine di ajimêra te ya Mastodon. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: Chrome OS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: macOS + other: platforma nenas + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Rake + revoke_success: Danişîn bi serkeftî hate rakirin + title: Danîştin + view_authentication_history: Dîroka rastekirina ajimêra xwe bibîne + settings: + account: Ajimêr + account_settings: Sazkariyên ajimêr + aliases: Nûçikên ajimêra + appearance: Xuyang + authorized_apps: Rayedarê sepanan + back: Vegere bo Mastodon + delete: Jêbirina ajimêr + development: Pêşdebir + edit_profile: Profîlê serrast bike + export: Derxistinê daneyan + featured_tags: Hashtagên bijarte + identity_proofs: Delîlên nasnameyê + import: Têxistin + import_and_export: Têxistin û derxistin + migrate: Barkirina ajimêrê + notifications: Agahdarî + preferences: Hilbijarte + profile: Profîl + relationships: Yên tê şopandin û şopîner + statuses_cleanup: Bi xweberî va jê birina şandiya + two_factor_authentication: Piştrastkirinê du-faktorî + webauthn_authentication: Kilîdên ewlehiyê + statuses: + attached: + audio: + one: "%{count} deng" + other: "%{count} deng" + description: 'Pêvek: %{attached}' + image: + one: "%{count} wêne" + other: "%{count} wêne" + video: + one: "%{count} vîdyo" + other: "%{count} vîdyo" + boosted_from_html: Bilindkirî ji alî %{acct_link} ve + content_warning: 'Hişyariya naverokê: %{warning}' + disallowed_hashtags: + one: 'hashtagek bê maf tê de hebû: %{tags}' + other: 'hashtagek bê maf tê de hebû: %{tags}' + errors: + in_reply_not_found: Ew şandiya ku tu dikî nakî bersivê bide xuya nake an jî hatiye jêbirin. + language_detection: Bi xweberî ziman nas bike + open_in_web: Di tevnê de veke + over_character_limit: sînorê karakterê %{max} derbas kir + pin_errors: + limit: Jixwe te mezintirîn hejmara şandîyên xwe derzî kir + ownership: Şandiya kesekî din nay derzî kirin + private: Şandiyên negelemperî nayên daliqandin + reblog: Ev şandî nayê derzî kirin + poll: + total_people: + one: "%{count} kes" + other: "%{count} kes" + total_votes: + one: "%{count} deng" + other: "%{count} deng" + vote: Deng bide + show_more: Bêtir nîşan bide + show_newer: Nûtirîn nîşan bide + show_older: Kevntirîn nîşan bide + show_thread: Mijarê nîşan bide + sign_in_to_participate: Ji bo tevlî sohbetê bibî xwe tomar bike + title: "%{name}%{quote}" + visibilities: + direct: Rasterast + private: Tenê şopîneran + private_long: Tenê bo şopîneran nîşan bide + public: Gelemperî + public_long: Herkes dikare bibîne + unlisted: Nerêzokkirî + unlisted_long: Herkes dikare bibîne, lê di demnameya gelemperî de nayê rêz kirin + statuses_cleanup: + enabled: Şandiyên berê bi xweberî va jê bibe + enabled_hint: Gava ku ew gihîştibe sînorê temenê diyarkirî, şandiyên te bi xweberî jê dibe, ji bilî van awareteyên jêrîn + exceptions: Awarte + explanation: Ji ber ku jêbirina şandiyan pêvajoyeke biha ye, ev hêdî hêdî bi demê re tê kirin dema ku rajekar wekî din mijûl nebe. Ji ber vê sedemê, dibe ku şandiyên te demek şûnda ku bigihîjin sînorê temenê wê werin jêbirin. + ignore_favs: Ecibandinan paşguh bike + ignore_reblogs: Rakirina piştguh bike + interaction_exceptions: Awarteyên li ser bingehên têkiliyan + interaction_exceptions_explanation: Bizanibe ku heke şandiyeke ku ji binî ve têkeve jêrî bijare an bilindkirin ê piştî ku carek din di ser wan re derbas bibe, garantiyek tune ku werin jêbirin. + keep_direct: Peyamên rasterast veşêre + keep_direct_hint: Tu peyamên te yekcar jê naçe + keep_media: Peyamên bi pêvekên medyayê ve ne biveşêre + keep_media_hint: Yek ji peyamên te yê ku bi pêvekên medyayê ve ne jê nabe + keep_pinned: Peyamên xwe yên ku hatine derzîkirî veşêre + keep_pinned_hint: Yek ji peyamên te yê derzîkirî jê nabe + keep_polls: Rapirsîyan veşêre + keep_polls_hint: Yek ji rapirsiyên te jê nabe + keep_self_bookmark: Şandiyên ku wek şûnpel hatine tevlêkirin veşêre + keep_self_bookmark_hint: Şandî heke te wek şûnpel tomar kiriye we neyê jêbirin + keep_self_fav: Şandiyên ku te eciband veşêre + keep_self_fav_hint: Ger te şandiyên xwe ecibandibe jê nabe + min_age: + '1209600': 2 hefte + '15778476': 6 meh + '2629746': 1 meh + '31556952': 1 sal + '5259492': 2 meh + '63113904': 2 sal + '7889238': 3 meh + min_age_label: Şêmûga demê + min_favs: Peyamên ku ji wê zêdetir hatine ecibandin veşêre + min_favs_hint: Şandî ku ji evqas hezkirin wergirtibe nayê jêbirin. Vala bihêle da ku şandiyan jê bibî tevlî ku çiqas hezkirin wergirtibe + min_reblogs: Şandiyên ku zêdetir hatine rakirin veşêre + min_reblogs_hint: Şandî ku ji ji vê hejmarê bêtir bilindkirin wergirtibe nayê jêbirin. Vala bihêle da ku şandiyan jê bibî tevlî ku çiqas hezkirin wergirtibe + stream_entries: + pinned: Şandiya derzîkirî + reblogged: bilindkirî + sensitive_content: Naveroka hestiyarî + tags: + does_not_match_previous_name: bi navê berê re li hev nayê + terms: + body_html: | +

Privacy Policy

+

What information do we collect?

+ +
    +
  • Basic account information: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
  • +
  • Posts, following and other public information: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
  • +
  • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
  • +
  • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
  • +
+ +
+ +

What do we use your information for?

+ +

Any of the information we collect from you may be used in the following ways:

+ +
    +
  • To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
  • +
  • To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.
  • +
  • The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.
  • +
+ +
+ +

How do we protect your information?

+ +

We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL, and your password is hashed using a strong one-way algorithm. You may enable two-factor authentication to further secure access to your account.

+ +
+ +

What is our data retention policy?

+ +

We will make a good faith effort to:

+ +
    +
  • Retain server logs containing the IP address of all requests to this server, in so far as such logs are kept, no more than 90 days.
  • +
  • Retain the IP addresses associated with registered users no more than 12 months.
  • +
+ +

You can request and download an archive of your content, including your posts, media attachments, profile picture, and header image.

+ +

You may irreversibly delete your account at any time.

+ +
+ +

Do we use cookies?

+ +

Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.

+ +

We use cookies to understand and save your preferences for future visits.

+ +
+ +

Do we disclose any information to outside parties?

+ +

We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety.

+ +

Your public content may be downloaded by other servers in the network. Your public and followers-only posts are delivered to the servers where your followers reside, and direct messages are delivered to the servers of the recipients, in so far as those followers or recipients reside on a different server than this.

+ +

When you authorize an application to use your account, depending on the scope of permissions you approve, it may access your public profile information, your following list, your followers, your lists, all your posts, and your favourites. Applications can never access your e-mail address or password.

+ +
+ +

Site usage by children

+ +

If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

+ +

If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+ +

Law requirements can be different if this server is in another jurisdiction.

+ +
+ +

Changes to our Privacy Policy

+ +

If we decide to change our privacy policy, we will post those changes on this page.

+ +

This document is CC-BY-SA. It was last updated March 7, 2018.

+ +

Originally adapted from the Discourse privacy policy.

+ title: "%{instance} mercên bikaranîn û politîkayên nehêniyê" + themes: + contrast: Mastodon (dijberiya bilind) + default: Mastodon (Tarî) + mastodon-light: Mastodon (Ronahî) + time: + formats: + default: "%b %d, %Y, %H:%M" + month: "%b %Y" + two_factor_authentication: + add: Tevlî bike + disable: 2FA neçalak bike + disabled_success: Rastandina du-gavî bi serfirazî hate sekinandin + edit: Serrast bike + enabled: Rastandina du-gavî bi serfirazî hate çalak kirin + enabled_success: Rastandina du-gavî bi serfirazî hate çalak kirin + generate_recovery_codes: Kodên xilaskirinê çêbike + lost_recovery_codes: Ku telefon winda bibe kodên xilaskirinê derfet dide ku tu bigihijî ajimêra xwe. Heke te kodên xwe yê xilaskirinê winda kiribe tu dikarî ji vê derê dîsa ava bikî. Kodên te yê xilaskirinê ên kevin wê nederbasdar bibe. + methods: Rêbazên du-gavî + otp: Sepana Authenticator + recovery_codes: Kilîtên rizgarbûna hilanînê + recovery_codes_regenerated: Kilîtên rizgarbûna bi serkeftî hate nûvkirin + recovery_instructions_html: Heke gava te têlefona xwe winda kir, tu dikarî yek ji kodên rizgarkirinê yên jêrîn bi kar bîne da ku tu bigihîjî ajimêra xwe. Kodên rizgarkirinê li cihekî ewle biparêze . Mînakî, tu dikarî wan çap bikî û wan bi peldandkên din ên girîng re tomar bike. + webauthn: Kilîdên ewlehiyê + user_mailer: + backup_ready: + explanation: Te yedekîya tijê ya ajimêrê xwe Mastodonê xwest. Niha ji daxistinê re amade ye! + subject: Arşîva te amede ye bo daxistinê + title: Pakêtkirina arşîvan + sign_in_token: + details: 'Li vir hûrgiliyên hewldanê hene:' + explanation: 'Me hewildanek têketina ajimêra te ji navnîşana IPya nenas nas kir. Ger ev tu bî, ji kerema xwe koda ewlehiyê ya jêr têkeve rûpela jêpirsînê:' + further_actions: 'Ger ev ne tu bî, ji kerema xwe re şîfreya xwe biguherîne û li ser hesaba xwe rastkirina du-gavî çalak bike. Tu dikarî wê ji vê derê çêkî:' + subject: Ji kerema xwe re hewldanên têketinê piştrast bike + title: Hewldanên têketinê + warning: + explanation: + disable: Tu êdî nikarî têkevî ajimêra xwe an wê bi rengeke din bi kar bînî, lê profîla te û daneyên din saxlem dimînin. + sensitive: Pelên te yê medyayê a barkirî û girêdanên te yên medyayê wek hestiyarî wê bihê nirxandin. + silence: Gava ajimêra te sînorkirî be dîsa jî tu dikarî ajimêra xwe bi kar bînî lê tenê kesên ku berê te dişopînin dê şandiyên te li ser vê rajekarê bibînin, û dibe ku tu ji navnîşên cihêreng ên gelemperî bêne awaretkirin. Lêbelê, dibe ku yên din hîn te bişopînin bi destan. + suspend: Tu êdî nikarî têkevî ajimêra xwe, û profîla te û daneyên din êdî nayên gihîştin. Dîsa jî tu dikarî têkevî da ku hilanîna daneyên xwe daxwaz bikî heya ku dane bi tevahî werin rakirin, lê em ê hin daneyan biparêzin da ku tu ji rawestandinê rizgar bikin. + get_in_touch: Ji bo bi xebatkarên %{instance} têkilî deynî tu dikarî vê e-nameyê bibersivînî. + review_server_policies: Rêbazên rajeker lêkolîn bike + statuses: 'Bi taybetî, ji bo wê:' + subject: + disable: Ajimêra te a %{acct} hat qerisandin + none: Hişyarî bo %{acct} + sensitive: Ajimêra te %{acct} medyaya ku wek hestyar hatiye nîşandin weşandiye + silence: Ajimêra te ya %{acct} hate bisînorkirin + suspend: Ajimêra te %{acct} hate rawestandin + title: + disable: Ajimêr hate qerisandin + none: Hişyarî + sensitive: Medyayê te wekî hestyar hate nîşandan + silence: Ajimêr sînor kiriye + suspend: Ajimêr hatiye rawestandin + welcome: + edit_profile_action: Profîlê saz bike + edit_profile_step: Tu dikarî profîla xwe bi barkirina wêne, sernav, guherandina navê xuyangê xwe û bêhtir ve xweş bikî. Heke tu dixwazî şagirtên nû binirxînî berî ku mafê bidî ku ew te bişopînê, tu dikarî ajimêra xwe kilît bike. + explanation: Li vir çend serişte hene ku tu dest pê bike + final_action: Dest bi weşandinê bike + final_step: 'Dest bi weşandinê bike! Bêyî şopîneran jî dibe ku şandiyên te yên gelemperî ji hêla kesên din ve werin dîtin, mînakî li ser demjimêra herêmî û di hashtagan de. Dibe ku tu bixwazî xwe li ser hashtagê #nasname bidî nasandin.' + full_handle: Hemî destikê te + full_handle_hint: Ji hevalên xwe re, ji bona ji rajekarekê din peyam bişîne an jî ji bona ku te bikaribe bişopîne tişta ku tu bibêjî ev e. + review_preferences_action: Bijartinan biguherîne + review_preferences_step: Pê bawer be ku vebijêrkên xwe saz bikî, wek mînak kîjan e-nameyên ku tu dixwaziî wergirîne, an tu dixwazî weşanên te ji kîjan astê nehêniyê de kesanekirî bin. Heke nexweşiya te ya tevgerê tune be, tu dikarî hilbijêrî ku GIF ya xweser çalak bibe. + subject: Tu bi xêr hatî Mastodon + tip_federated_timeline: Demnameya giştî dimenêke gelemperî a Mastodon e. Lê tenê kesên ku ciranên te endamên wê ne dihewîne, ji ber vê yekê ew hemû nîne. + tip_following: Tu rêvebir (ên) rajeker wek berdest dişopînî. Ji bo mirovên balkêştir bibînî, demnameya herêmî û federasyonî kontrol bike. + tip_local_timeline: Demnameya herêmî, dimenêke bi giştî ye li ser %{instance} e. Ev ciranên te yên herî nêzik in! + tip_mobile_webapp: Ger geroka te ya desta pêşkêşî te bike ku tu Mastodon li ser ekrana xwe ya malê lê zêde bikî, tu dikarî agahdariyên push bistînî. Ew bi gelek awayan mîna serîlêdanek xwemalî tevdigere! + tips: Serbend + title: Bi xêr hatî, %{name}! + users: + follow_limit_reached: Tu nikarî zêdetirî %{limit} kesan bişopînî + generic_access_help_html: Di gihîştina ajimêrê te de pirsgirêk heye? Tu dikarî ji bo alîkariyê bi %{email} re têkilî deyne + invalid_otp_token: Koda du-gavî ya nelê + invalid_sign_in_token: Kilîda ewlehiyê a nelê + otp_lost_help_html: Heke te gihîştina herduyan ji dest da, dibe ku tu bi %{email} re têkilî deyne + seamless_external_login: Te bi servîsekî biyanî re têketina xwe kir, ji ber vê yekê şîfre û e-name nayê bikaranîn. + signed_in_as: 'Têketin wekî:' + suspicious_sign_in_confirmation: Xuya dike ku te berê têketin ji vê amûrê nekiriye, ji ber vê yekê em kodeke ewlehiyê ji navnîşana e-nameya te re dişînin da ku piştrast bikî ku tu ye an na. + verification: + explanation_html: 'Tu dikarî xwe wekî xwediyê girêdanên li daneyê meta profîla xwe piştrast bikî. Ji bo vê, hewceye girêda malperê di nav profîla te ya mastodonê de girêdanekî paş hebe. Girêdana paşhewceye taybetîyek rel="me"hebe. Naveroka nivîsa girêdanê ne girîng e. Ev jî mînakek e:' + verification: Piştrastkirin + webauthn_credentials: + add: Kilîteke ewlehiyê nû tevlî bike + create: + error: Gava Kilîteke ewlehiyê nû dihat tevlîkirin pirsgirêkek derket. Jkx dîsa biceribîne. + success: Tevlîkirina kilîteke ewlehiyê nû bi awayekî serkeftî qediya. + delete: Jê bibe + delete_confirmation: Ma tu bi rastî dixwazî ku ev kilîta ewlehiyê jê bibe? + description_html: Heker tu piştrastkirina kilîta ewlehiyê çalak bikî, Ji bo têketinê ger tu kilîtekî ewlehiyê bikarbînî. + destroy: + error: Dema kilîda ewlehiyê hate jêbirin pirsgirêkek peyda bû. Ji kerema xwe re careke din biceribîne. + success: Kilîda ewlehiyê bi awayekî serkeftî hatê jêbirin. + invalid_credential: Kilîda ewlehiyê a nelê + nickname_hint: Bernavka kilîda te ya ewlehiyê a nû têkevê + not_enabled: Te hê WebAuthn çalak nekiriye + not_supported: Ev gerok piştgiriya kilîtên ewlehiyê nakê + otp_required: Ji bo ku tu kilîtên ewlehiyê bikar bînî, ji kerema xwe re pêşî piştrastkirina du-gavî çalak bike. + registered_on: Di %{date} dîrokê de tomar bû diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 042660432e..c9d5238eee 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1,7 +1,7 @@ --- ko: about: - about_hashtag_html: "#%{hashtag} 해시태그가 붙은 공개 툿 입니다. 같은 연합에 속한 임의의 인스턴스에 계정을 생성하면 당신도 대화에 참여할 수 있습니다." + about_hashtag_html: "#%{hashtag} 해시태그가 붙은 공개 게시물입니다. 같은 연합에 속한 임의의 인스턴스에 계정을 생성하면 당신도 대화에 참여할 수 있습니다." about_mastodon_html: 마스토돈은 오픈 소스 기반의 소셜 네트워크 서비스 입니다. 상용 플랫폼의 대체로서 분산형 구조를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 — 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 마스토돈 인스턴스를 만들 수 있으며, 아주 매끄럽게 소셜 네트워크에 참가할 수 있습니다. about_this: 이 인스턴스에 대해서 active_count_after: 활성 사용자 @@ -26,12 +26,14 @@ ko: 이것은 페더레이션을 목적으로 사용 되며 인스턴스 전체를 차단하려 하지 않는 이상 차단하지 않아야 합니다, 그 경우에는 도메인 차단을 사용하세요. learn_more: 자세히 privacy_policy: 개인정보 정책 + rules: 서버 규칙 + rules_html: '아래의 글은 이 마스토돈 서버에 계정이 있다면 따라야 할 규칙의 요약입니다:' see_whats_happening: 무슨 일이 일어나는 지 보기 server_stats: '서버 통계:' source_code: 소스 코드 status_count_after: - other: 툿 - status_count_before: 툿 수 + other: 개 + status_count_before: 게시물 수 tagline: 친구들을 팔로우 하고 새로운 사람들도 만나기 terms: 이용약관 unavailable_content: 이용 불가능한 컨텐츠 @@ -44,7 +46,7 @@ ko: silenced_title: 침묵 된 서버들 suspended: 이 서버의 아무도 팔로우 할 수 없으며, 어떤 데이터도 처리되거나 저장 되지 않고 데이터가 교환 되지도 않습니다. suspended_title: 금지된 서버들 - unavailable_content_html: 마스토돈은 일반적으로 연합우주에 있는 어떤 서버의 유저와도 게시물을 보고 응답을 할 수 있도록 허용합니다. 다음 항목들은 특정한 서버에 대해 만들어 진 예외사항입니다. + unavailable_content_html: 마스토돈은 일반적으로 별무리에 있는 어떤 서버의 유저와도 게시물을 보고 응답을 할 수 있도록 허용합니다. 다음 항목들은 특정한 서버에 대해 만들어 진 예외사항입니다. user_count_after: other: 명 user_count_before: 사용자 수 @@ -71,10 +73,9 @@ ko: pin_errors: following: 추천하려는 사람을 팔로우 하고 있어야 합니다 posts: - other: 툿 - posts_tab_heading: 툿 - posts_with_replies: 툿과 답장 - reserved_username: 이 아이디는 예약되어 있습니다 + other: 게시물 + posts_tab_heading: 게시물 + posts_with_replies: 게시물과 답장 roles: admin: 관리자 bot: 봇 @@ -112,8 +113,9 @@ ko: delete: 데이터 삭제 deleted: 삭제됨 demote: 강등 - destroyed_msg: "%{username}의 데이터는 곧 삭제되도록 큐에 들어갔습니다" + destroyed_msg: "%{username}의 데이터는 곧 삭제되도록 대기열에 들어갔습니다" disable: 비활성화 + disable_sign_in_token_auth: 이메일 토큰 인증 비활성화 disable_two_factor_authentication: 2단계 인증을 비활성화 disabled: 비활성화된 display_name: 이름 @@ -122,6 +124,7 @@ ko: email: 이메일 email_status: 이메일 상태 enable: 활성화 + enable_sign_in_token_auth: 이메일 토큰 인증 활성화 enabled: 활성 enabled_msg: "%{username}의 계정을 성공적으로 얼리기 해제하였습니다" followers: 팔로워 수 @@ -139,9 +142,9 @@ ko: title: 위치 login_status: 로그인 상태 media_attachments: 첨부된 미디어 - memorialize: 메모리엄으로 전환 - memorialized: 기념비화 됨 - memorialized_msg: 성공적으로 %{username}를 기념비 계정으로 전환하였습니다 + memorialize: 추모비로 전환 + memorialized: 추모비화 됨 + memorialized_msg: 성공적으로 %{username}를 추모비 계정으로 전환하였습니다 moderation: active: 활동 all: 전체 @@ -159,7 +162,7 @@ ko: perform_full_suspension: 정지시키기 promote: 승급 protocol: 프로토콜 - public: 전체 공개 + public: 공개 push_subscription_expires: PuSH 구독 기간 만료 redownload: 프로필 업데이트 redownloaded_msg: 성공적으로 %{username}의 프로필을 원본으로부터 업데이트 하였습니다 @@ -186,6 +189,10 @@ ko: search: 검색 search_same_email_domain: 같은 이메일 도메인을 가진 다른 사용자들 search_same_ip: 같은 IP의 다른 사용자들 + security_measures: + only_password: 암호만 + password_and_2fa: 암호와 2단계 인증 + password_and_sign_in_token: 암호와 이메일 토큰 sensitive: 민감함 sensitized: 민감함으로 설정됨 shared_inbox_url: 공유된 inbox URL @@ -194,10 +201,10 @@ ko: targeted_reports: 이 계정에 대한 신고 silence: 침묵 silenced: 침묵 됨 - statuses: 툿 수 + statuses: 게시물 subscribe: 구독하기 suspended: 정지 됨 - suspension_irreversible: 이 계정의 데이터는 복구할 수 없도록 삭제 됩니다. 계정을 정지 해제함으로서 계정을 다시 사용 가능하게 할 수 있지만 이전에 삭제한 어떤 데이터도 복구되지 않습니다. + suspension_irreversible: 이 계정의 데이터는 복구할 수 없도록 삭제되었습니다. 계정을 정지 해제함으로서 계정을 다시 사용 가능하게 할 수 있지만 이전에 삭제한 어떤 데이터도 복구되지 않습니다. suspension_reversible_hint_html: 계정이 정지되었습니다, 그리고 %{date}에 데이터가 완전히 삭제될 것입니다. 그 때까지는 어떤 안 좋은 효과 없이 계정이 복구 될 수 있습니다. 만약 지금 당장 계정의 모든 데이터를 삭제하고 싶다면, 아래에서 행할 수 있습니다. time_in_queue: "%{time}동안 기다림" title: 계정 @@ -225,6 +232,7 @@ ko: create_domain_block: 도메인 차단 추가 create_email_domain_block: 이메일 도메인 차단 생성 create_ip_block: IP 규칙 만들기 + create_unavailable_domain: 사용 불가능한 도메인 생성 demote_user: 사용자 강등 destroy_announcement: 공지사항 삭제 destroy_custom_emoji: 커스텀 에모지 삭제 @@ -233,12 +241,15 @@ ko: destroy_email_domain_block: 이메일 도메인 차단 삭제 destroy_ip_block: IP 규칙 삭제 destroy_status: 게시물 삭제 + destroy_unavailable_domain: 사용 불가능한 도메인 제거 disable_2fa_user: 2단계 인증 비활성화 disable_custom_emoji: 커스텀 에모지 비활성화 + disable_sign_in_token_auth_user: 사용자에 대한 이메일 토큰 인증 비활성화 disable_user: 사용자 비활성화 enable_custom_emoji: 커스텀 에모지 활성화 + enable_sign_in_token_auth_user: 사용자에 대한 이메일 토큰 인증 활성화 enable_user: 사용자 활성화 - memorialize_account: 계정을 장기 저장 + memorialize_account: 추모계정으로 전환 promote_user: 사용자 승급 remove_avatar_user: 아바타 지우기 reopen_report: 신고 다시 열기 @@ -256,47 +267,51 @@ ko: update_domain_block: 도메인 차단 갱신 update_status: 게시물 게시 actions: - assigned_to_self_report: "%{name}이 리포트 %{target}을 자신에게 할당했습니다" - change_email_user: "%{name}이 %{target}의 이메일 주소를 변경했습니다" - confirm_user: "%{name}이 %{target}의 이메일 주소를 컨펌했습니다" - create_account_warning: "%{name}가 %{target}에게 경고 보냄" - create_announcement: "%{name} 님이 새 공지 %{target}을 만들었습니다" - create_custom_emoji: "%{name}이 새로운 에모지 %{target}를 추가했습니다" - create_domain_allow: "%{name} 님이 %{target} 도메인을 허용리스트에 넣었습니다" - create_domain_block: "%{name}이 도메인 %{target}를 차단했습니다" - create_email_domain_block: "%{name}이 이메일 도메인 %{target}를 차단했습니다" - create_ip_block: "%{name} 님이 IP 규칙 %{target}을 만들었습니다" - demote_user: "%{name}이 %{target}을 강등했습니다" - destroy_announcement: "%{name} 님이 공지 %{target}을 삭제했습니다" - destroy_custom_emoji: "%{name}이 %{target} 에모지를 삭제함" - destroy_domain_allow: "%{name} 님이 %{target} 도메인을 허용리스트에서 제거하였습니다" - destroy_domain_block: "%{name}이 도메인 %{target}의 차단을 해제했습니다" - destroy_email_domain_block: "%{name}이 이메일 도메인 %{target}을 허용리스트에 넣었습니다" - destroy_ip_block: "%{name} 님이 IP 규칙 %{target}을 삭제하였습니다" - destroy_status: "%{name}이 %{target}의 툿을 삭제했습니다" - disable_2fa_user: "%{name}이 %{target}의 2FA를 비활성화 했습니다" - disable_custom_emoji: "%{name}이 에모지 %{target}를 비활성화 했습니다" - disable_user: "%{name}이 %{target}의 로그인을 비활성화 했습니다" - enable_custom_emoji: "%{name}이 에모지 %{target}를 활성화 했습니다" - enable_user: "%{name}이 %{target}의 로그인을 활성화 했습니다" - memorialize_account: "%{name}이 %{target}의 계정을 메모리엄으로 전환했습니다" - promote_user: "%{name}이 %{target}를 승급시켰습니다" - remove_avatar_user: "%{name}이 %{target}의 아바타를 지웠습니다" - reopen_report: "%{name}이 리포트 %{target}을 다시 열었습니다" - reset_password_user: "%{name}이 %{target}의 암호를 초기화했습니다" - resolve_report: "%{name}이 %{target} 신고를 처리됨으로 변경하였습니다" - sensitive_account: "%{name} 님이 %{target}의 미디어를 민감함으로 표시했습니다" - silence_account: "%{name}이 %{target}의 계정을 침묵시켰습니다" - suspend_account: "%{name}이 %{target}의 계정을 정지시켰습니다" - unassigned_report: "%{name}이 리포트 %{target}을 할당 해제했습니다" - unsensitive_account: "%{name} 님이 %{target}의 미디어를 민감하지 않음으로 표시했습니다" - unsilence_account: "%{name}이 %{target}에 대한 침묵을 해제했습니다" - unsuspend_account: "%{name}이 %{target}에 대한 정지를 해제했습니다" - update_announcement: "%{name} 님이 공지 %{target}을 갱신했습니다" - update_custom_emoji: "%{name}이 에모지 %{target}를 업데이트 했습니다" - update_domain_block: "%{name} 님이 %{target}에 대한 도메인 차단을 갱신했습니다" - update_status: "%{name}이 %{target}의 상태를 업데이트 했습니다" - deleted_status: "(삭제됨)" + assigned_to_self_report_html: "%{name} 님이 신고 %{target}을 자신에게 할당했습니다" + change_email_user_html: "%{name} 님이 사용자 %{target}의 이메일 주소를 변경했습니다" + confirm_user_html: "%{name} 님이 사용자 %{target}의 이메일 주소를 승인했습니다" + create_account_warning_html: "%{name} 님이 %{target}에게 경고를 보냈습니다" + create_announcement_html: "%{name} 님이 새 공지 %{target}을 만들었습니다" + create_custom_emoji_html: "%{name} 님이 새로운 에모지 %{target}를 업로드 했습니다" + create_domain_allow_html: "%{name} 님이 %{target} 도메인을 허용리스트에 넣었습니다" + create_domain_block_html: "%{name} 님이 도메인 %{target}를 차단했습니다" + create_email_domain_block_html: "%{name} 님이 이메일 도메인 %{target}를 차단했습니다" + create_ip_block_html: "%{name} 님이 IP 규칙 %{target}을 만들었습니다" + create_unavailable_domain_html: "%{name} 님이 도메인 %{target}에 대한 전달을 중지" + demote_user_html: "%{name} 님이 사용자 %{target} 님을 강등했습니다" + destroy_announcement_html: "%{name} 님이 공지 %{target}을 삭제했습니다" + destroy_custom_emoji_html: "%{name} 님이 %{target} 에모지를 삭제했습니다" + destroy_domain_allow_html: "%{name} 님이 %{target} 도메인과의 연합을 금지했습니다" + destroy_domain_block_html: "%{name} 님이 도메인 %{target}의 차단을 해제했습니다" + destroy_email_domain_block_html: "%{name} 님이 이메일 도메인 %{target}을 차단 해제하였습니다" + destroy_ip_block_html: "%{name} 님이 IP 규칙 %{target}을 삭제하였습니다" + destroy_status_html: "%{name} 님이 %{target}의 게시물을 삭제했습니다" + destroy_unavailable_domain_html: "%{name} 님이 도메인 %{target}에 대한 전달을 재개" + disable_2fa_user_html: "%{name} 님이 사용자 %{target}의 2FA를 비활성화 했습니다" + disable_custom_emoji_html: "%{name} 님이 에모지 %{target}를 비활성화 했습니다" + disable_sign_in_token_auth_user_html: "%{name} 님이 %{target} 님의 이메일 토큰 인증을 비활성화 했습니다" + disable_user_html: "%{name} 님이 사용자 %{target}의 로그인을 비활성화 했습니다" + enable_custom_emoji_html: "%{name} 님이 에모지 %{target}를 활성화 했습니다" + enable_sign_in_token_auth_user_html: "%{name} 님이 %{target} 님의 이메일 토큰 인증을 활성화 했습니다" + enable_user_html: "%{name} 님이 사용자 %{target}의 로그인을 활성화 했습니다" + memorialize_account_html: "%{name} 님이 %{target}의 계정을 추모비 페이지로 전환했습니다" + promote_user_html: "%{name} 님이 사용자 %{target}를 승급시켰습니다" + remove_avatar_user_html: "%{name} 님이 %{target}의 아바타를 지웠습니다" + reopen_report_html: "%{name} 님이 신고 %{target}을 다시 열었습니다" + reset_password_user_html: "%{name} 님이 사용자 %{target}의 암호를 초기화했습니다" + resolve_report_html: "%{name} 님이 신고 %{target}를 처리됨으로 변경하였습니다" + sensitive_account_html: "%{name} 님이 %{target}의 미디어를 민감함으로 표시했습니다" + silence_account_html: "%{name} 님이 %{target}의 계정을 침묵시켰습니다" + suspend_account_html: "%{name} 님이 %{target}의 계정을 정지시켰습니다" + unassigned_report_html: "%{name} 님이 신고 %{target}을 할당 해제했습니다" + unsensitive_account_html: "%{name} 님이 %{target}의 미디어를 민감하지 않음으로 표시했습니다" + unsilence_account_html: "%{name} 님이 %{target}의 계정에 대한 침묵을 해제했습니다" + unsuspend_account_html: "%{name} 님이 %{target}의 계정에 대한 정지를 해제했습니다" + update_announcement_html: "%{name} 님이 공지사항 %{target}을 갱신했습니다" + update_custom_emoji_html: "%{name} 님이 에모지 %{target}를 업데이트 했습니다" + update_domain_block_html: "%{name} 님이 %{target}에 대한 도메인 차단을 갱신했습니다" + update_status_html: "%{name} 님이 %{target}의 게시물을 업데이트 했습니다" + deleted_status: "(삭제된 게시물)" empty: 로그를 찾을 수 없습니다 filter_by_action: 행동으로 거르기 filter_by_user: 유저로 거르기 @@ -310,10 +325,12 @@ ko: new: create: 공지사항 생성 title: 새 공지사항 + publish: 게시 published_msg: 공지가 성공적으로 발행되었습니다! scheduled_for: "%{time}에 예약됨" scheduled_msg: 공지의 발행이 예약되었습니다! title: 공지사항 + unpublish: 게시 취소 unpublished_msg: 공지가 성공적으로 발행 취소되었습니다! updated_msg: 공지가 성공적으로 업데이트되었습니다! custom_emojis: @@ -334,7 +351,7 @@ ko: enabled: 활성됨 enabled_msg: 성공적으로 활성화하였습니다 image_hint: 50KB 이하의 PNG - list: 목록 + list: 목록에 추가 listed: 목록에 실림 new: title: 새 커스텀 에모지 추가 @@ -350,33 +367,9 @@ ko: updated_msg: 에모지가 성공적으로 업데이트 되었습니다! upload: 업로드 dashboard: - authorized_fetch_mode: 인증 된 페치 모드 - backlog: 미처리 된 작업 - config: 설정 - feature_deletions: 계정 삭제 - feature_invites: 초대 링크 - feature_profile_directory: 프로필 책자 - feature_registrations: 가입 - feature_relay: 연합 릴레이 - feature_spam_check: 안티 스팸 - feature_timeline_preview: 타임라인 미리보기 - features: 기능 - hidden_service: 히든 서비스와의 연합 - open_reports: 미해결 신고 - pending_tags: 심사를 기다리는 해시태그 - pending_users: 심사를 기다리는 유저 - recent_users: 최근 가입 한 유저 - search: 전문 검색 - single_user_mode: 싱글 유저 모드 software: 소프트웨어 space: 디스크 사용량 title: 대시보드 - total_users: 총 유저 수 - trends: 트렌드 - week_interactions: 이번 주의 상호작용 - week_users_active: 이번 주의 활성 사용자 - week_users_new: 이번 주의 신규 유저 - whitelist_mode: 제한된 페더레이션 모드 domain_allows: add_new: 도메인 허용 created_msg: 도메인이 성공적으로 허용 목록에 추가되었습니다 @@ -394,7 +387,7 @@ ko: hint: 도메인 차단은 내부 데이터베이스에 계정이 생성되는 것까지는 막을 수 없지만, 그 도메인에서 생성된 계정에 자동적으로 특정한 중재 규칙을 적용하게 할 수 있습니다. severity: desc_html: |- - 침묵은 계정을 팔로우 하지 않고 있는 사람들에겐 계정의 툿을 보이지 않게 합니다. 정지는 계정의 컨텐츠, 미디어, 프로필 데이터를 삭제합니다. + 침묵은 계정을 팔로우 하지 않고 있는 사람들에겐 계정의 게시물을 보이지 않게 합니다. 정지는 계정의 컨텐츠, 미디어, 프로필 데이터를 삭제합니다. 미디어 파일만을 거부하고 싶다면 없음으로 두세요. noop: 없음 silence: 침묵 @@ -437,9 +430,33 @@ ko: create: 차단 규칙 생성 title: 새 이메일 도메인 차단 title: Email 도메인 차단 + follow_recommendations: + description_html: "팔로우 추천은 새 사용자들이 관심 가는 콘텐트를 빠르게 찾을 수 있도록 도와줍니다. 사용자가 개인화 된 팔로우 추천이 만들어지기 위한 충분한 상호작용을 하지 않은 경우, 이 계정들이 대신 추천 됩니다. 이들은 해당 언어에 대해 많은 관심을 갖거나 많은 로컬 팔로워를 가지고 있는 계정들을 섞어서 날마다 다시 계산 됩니다." + language: 할당할 언어 + status: 상태 + suppress: 팔로우 추천 숨기기 + suppressed: 숨겨짐 + title: 팔로우 추천 + unsuppress: 팔로우 추천 복원 instances: + back_to_all: 전체 + back_to_limited: 제한됨 + back_to_warning: 경고 by_domain: 도메인 + delivery: + all: 전체 + clear: 전달 에러 초기화 + restart: 전달 재시작 + stop: 전달 중지 + title: 전달 + unavailable: 사용불가 + unavailable_message: 전달 불가 + warning: 경고 + warning_message: + other: 전달 실패 %{count}일 delivery_available: 전송 가능 + delivery_error_days: 전달 에러가 난 날짜들 + delivery_error_hint: 만약 %{count}일동안 전달이 불가능하다면, 자동으로 전달불가로 표시됩니다. empty: 도메인이 하나도 없습니다. known_accounts: other: 알려진 계정 %{count}개 @@ -485,11 +502,11 @@ ko: relays: add_new: 릴레이 추가 delete: 삭제 - description_html: "연합 릴레이는 서버들 사이에서 많은 양의 공개 툿을 구독하고 중개하는 서버입니다. 이것은 중소 규모의 서버에서 연합우주를 발견하는 데에 도움을 줄 수 있습니다, 이제 로컬 유저들이 다른 서버의 유저들을 수동으로 팔로우 하지 않아도 됩니다." + description_html: "연합 릴레이는 서버들 사이에서 많은 양의 공개 게시물을 구독하고 중개하는 서버입니다. 이것은 중소 규모의 서버에서 별무리를 발견하는 데에 도움을 줄 수 있습니다, 이제 로컬 유저들이 다른 서버의 유저들을 수동으로 팔로우 하지 않아도 됩니다." disable: 비활성화 disabled: 비활성화 됨 enable: 활성화 - enable_hint: 활성화 되면, 이 릴레이의 모든 공개 툿을 구독하고 이 서버의 공개 툿을 전송하게 됩니다. + enable_hint: 활성화 되면, 이 릴레이의 모든 공개 게시물을 구독하고 이 서버의 공개 게시물을 전송하게 됩니다. enabled: 활성화 됨 inbox_url: 릴레이 URL pending: 릴레이의 승인 대기중 @@ -532,17 +549,25 @@ ko: resolved: 해결됨 resolved_msg: 리포트가 성공적으로 해결되었습니다! status: 상태 + target_origin: 신고된 계정의 소속 title: 신고 unassign: 할당 해제 unresolved: 미해결 updated_at: 업데이트 시각 + rules: + add_new: 규칙 추가 + delete: 삭제 + description_html: 대부분의 경우 사람들이 이용약관을 반드시 읽고 동의하도록 하지만, 보통의 사람들은 문제가 일어나기 전까지는 읽지 않습니다. 여러분의 서버 규칙을 목록으로 정리해서 한 번에 읽기 쉽게 만드세요. 규칙 각각을 짧고 단순하게 만들고, 하나를 여러 개로 쪼개지도 마세요. + edit: 규칙 수정 + empty: 아직 정의된 서버 규칙이 없습니다. + title: 서버 규칙 settings: activity_api_enabled: desc_html: 주별 로컬에 게시 된 글, 활성 사용자 및 새로운 가입자 수 title: 유저 활동에 대한 통계 발행 bootstrap_timeline_accounts: - desc_html: 콤마로 여러 유저명을 구분. 로컬의 잠기지 않은 계정만 가능합니다. 비워 둘 경우 모든 로컬 관리자가 기본으로 사용 됩니다. - title: 새 유저가 팔로우 할 계정들 + desc_html: 콤마로 여러 유저명을 구분. 이 계정들은 팔로우 추천에 반드시 나타나게 됩니다 + title: 새로운 사용자들에게 추천할 계정들 contact_information: email: 공개할 메일 주소를 입력 username: 연락 받을 관리자 유저네임 @@ -559,9 +584,6 @@ ko: users: 로그인 한 유저에게 domain_blocks_rationale: title: 사유 보여주기 - enable_bootstrap_timeline_accounts: - desc_html: 새 사용자들이 자동으로 설정 된 계정들을 팔로우 하도록 해서 그들의 홈 피드가 빈 상태로 시작하지 않도록 합니다 - title: 새 유저가 팔로우할 계정을 보여주기 hero: desc_html: 프론트페이지에 표시 됩니다. 최소 600x100픽셀을 권장합니다. 만약 설정되지 않았다면, 서버의 썸네일이 사용 됩니다 title: 히어로 이미지 @@ -597,7 +619,7 @@ ko: open: 누구나 가입 할 수 있음 title: 가입 모드 show_known_fediverse_at_about_page: - desc_html: 활성화 되면 프리뷰 페이지에서 페디버스의 모든 툿을 표시합니다. 비활성화시 로컬에 있는 툿만 표시 됩니다. + desc_html: 활성화 되면 프리뷰 페이지에서 페디버스의 모든 게시물을 표시합니다. 비활성화시 로컬에 있는 게시물만 표시 됩니다. title: 타임라인 프리뷰에 알려진 페디버스 표시하기 show_staff_badge: desc_html: 유저 페이지에 스태프 배지를 표시합니다 @@ -615,9 +637,6 @@ ko: desc_html: 당신은 독자적인 개인정보 취급 방침이나 이용약관, 그 외의 법적 근거를 작성할 수 있습니다. HTML태그를 사용할 수 있습니다 title: 커스텀 서비스 이용 약관 site_title: 서버 이름 - spam_check_enabled: - desc_html: 마스토돈은 반복된 메시지 등의 측정값에 따라 자동으로 계정을 침묵, 신고할 수 있습니다. 위양성(False-positive)이 존재할 수 있습니다. - title: 안티 스팸 thumbnail: desc_html: OpenGraph와 API의 미리보기로 사용 됩니다. 1200x630px을 권장합니다 title: 서버 썸네일 @@ -645,19 +664,24 @@ ko: media: title: 미디어 no_media: 미디어 없음 - no_status_selected: 아무 것도 선택 되지 않아 아무 것도 바뀌지 않았습니다 - title: 계정 툿 + no_status_selected: 아무 게시물도 선택 되지 않아 아무 것도 바뀌지 않았습니다 + title: 계정 게시물 with_media: 미디어 있음 + system_checks: + database_schema_check: + message_html: 데이터베이스 마이그레이션이 대기중입니다. 응용프로그램이 예상한대로 동작할 수 있도록 마이그레이션을 실행해 주세요 + rules_check: + action: 서버 규칙 관리 + message_html: 아직 서버규칙을 정하지 않았습니다. + sidekiq_process_check: + message_html: "%{value} 큐에 대한 사이드킥 프로세스가 발견되지 않았습니다. 사이드킥 설정을 검토해주세요" tags: accounts_today: 오늘의 순 사용자 accounts_week: 금주의 순 사용자 breakdown: 소스별 오늘의 사용량 분석 - context: 문맥 - directory: 책자에 있음 - in_directory: 디렉토리에 %{count}개 있음 - last_active: 최근 활동 + last_active: 최근에 사용됨 most_popular: 최고 인기 - most_recent: 최신 + most_recent: 최근에 추가됨 name: 해시태그 review: 심사 상태 reviewed: 심사 됨 @@ -671,6 +695,7 @@ ko: add_new: 새로 추가 delete: 삭제 edit_preset: 경고 틀 수정 + empty: 아직 어떤 경고 틀도 정의되지 않았습니다. title: 경고 틀 관리 admin_mailer: new_pending_account: @@ -701,7 +726,7 @@ ko: guide_link: https://crowdin.com/project/mastodon guide_link_text: 누구나 기여할 수 있습니다. sensitive_content: 민감한 내용 - toot_layout: 툿 레이아웃 + toot_layout: 게시물 레이아웃 application_mailer: notification_preferences: 메일 설정 변경 salutation: "%{name} 님," @@ -785,7 +810,7 @@ ko: date: formats: default: "%Y-%b-%d" - with_month_name: "%Y-%B-%d" + with_month_name: "%Y년 %B %d일" datetime: distance_in_words: about_x_hours: "%{count}시간" @@ -845,7 +870,7 @@ ko: archive_takeout: date: 날짜 download: 아카이브 다운로드 - hint_html: 당신의 툿과 업로드 된 미디어의 아카이브를 요청할 수 있습니다. 내보내지는 데이터는 ActivityPub 포맷입니다. 호환 되는 모든 소프트웨어에서 읽을 수 있습니다. 7일마다 새로운 아카이브를 요청할 수 있습니다. + hint_html: 당신의 게시물과 업로드 된 미디어의 아카이브를 요청할 수 있습니다. 내보내지는 데이터는 ActivityPub 포맷입니다. 호환 되는 모든 소프트웨어에서 읽을 수 있습니다. 7일마다 새로운 아카이브를 요청할 수 있습니다. in_progress: 당신의 아카이브를 컴파일 중입니다… request: 아카이브 요청하기 size: 크기 @@ -910,7 +935,7 @@ ko: i_am_html: 나는 %{service}의 %{username} 입니다. identity: 신원 inactive: 비활성 - publicize_checkbox: '그리고 이것을 툿 하세요:' + publicize_checkbox: '그리고 이것을 게시하세요:' publicize_toot: '증명되었습니다! 저는 %{service}에 있는 %{username}입니다: %{url}' remove: 계정증명 삭제 removed: 성공적으로 계정증명을 삭제했습니다 @@ -933,7 +958,7 @@ ko: following: 팔로우 중인 계정 목록 muting: 뮤트 중인 계정 목록 upload: 업로드 - in_memoriam_html: 메모리엄에 있음. + in_memoriam_html: 고인의 계정입니다. invites: delete: 비활성화 expired: 만료됨 @@ -958,6 +983,17 @@ ko: lists: errors: limit: 리스트 최대치에 도달했습니다 + login_activities: + authentication_methods: + otp: 2단계 인증 앱 + password: 암호 + sign_in_token: 이메일 보안 코드 + webauthn: 보안 키 + description_html: 확인되지 않은 활동이 보인다면, 암호를 바꾸거나 2단계 인증을 활성화 하는 것을 고려해 보세요. + empty: 인증 이력이 존재하지 않습니다 + failed_sign_in_html: 실패한 로그인 시도 %{method} %{ip} (%{browser}) + successful_sign_in_html: 성공한 로그인 시도 %{method} %{ip} (%{browser}) + title: 인증 이력 media_attachments: validations: images_and_video: 이미 사진이 첨부 된 게시물엔 동영상을 첨부 할 수 없습니다 @@ -1011,8 +1047,8 @@ ko: other: "%{count}건의 새로운 알림 \U0001F418" title: 당신이 없는 동안에... favourite: - body: "%{name} 님이 내 툿을 즐겨찾기에 등록했습니다:" - subject: "%{name} 님이 내 툿을 즐겨찾기에 등록했습니다" + body: '당신의 게시물을 %{name} 님이 즐겨찾기에 등록했습니다:' + subject: "%{name} 님이 내 게시물을 즐겨찾기에 등록했습니다" title: 새 즐겨찾기 follow: body: "%{name} 님이 나를 팔로우 했습니다!" @@ -1028,10 +1064,14 @@ ko: body: "%{name} 님이 답장을 보냈습니다:" subject: "%{name} 님이 답장을 보냈습니다" title: 새 멘션 + poll: + subject: "%{name}의 투표가 종료되었습니다" reblog: - body: "%{name} 님이 내 툿을 부스트 했습니다:" - subject: "%{name} 님이 내 툿을 부스트 했습니다" + body: '당신의 게시물을 %{name} 님이 부스트 했습니다:' + subject: "%{name} 님이 내 게시물을 부스트 했습니다" title: 새 부스트 + status: + subject: "%{name} 님이 방금 게시물을 올렸습니다" notifications: email_events: 이메일 알림에 대한 이벤트 email_events_hint: '알림 받을 이벤트를 선택해주세요:' @@ -1055,9 +1095,9 @@ ko: setup: 설정 wrong_code: 코드가 올바르지 않습니다! 서버와 휴대전화 간의 시각이 일치하나요? pagination: - newer: 새로운 툿 + newer: 최근 next: 다음 - older: 오래된 툿 + older: 이전 prev: 이전 truncate: "…" polls: @@ -1106,58 +1146,59 @@ ko: remote_interaction: favourite: proceed: 즐겨찾기 진행 - prompt: '이 툿을 즐겨찾기 하려고 합니다:' + prompt: '이 게시물을 즐겨찾기 하려고 합니다:' reblog: proceed: 부스트 진행 - prompt: '이 툿을 부스트 하려 합니다:' + prompt: '이 게시물을 부스트 하려 합니다:' reply: proceed: 답장 진행 - prompt: '이 툿에 답장을 하려 합니다:' + prompt: '이 게시물에 답장을 하려 합니다:' scheduled_statuses: - over_daily_limit: 그 날짜에 대한 %{limit}개의 예약 툿 제한을 초과합니다 - over_total_limit: 예약 툿 제한 %{limit}을 초과합니다 + over_daily_limit: 그 날짜에 대한 %{limit}개의 예약 게시물 제한을 초과합니다 + over_total_limit: 예약 게시물 제한 %{limit}을 초과합니다 too_soon: 예약 날짜는 미래여야 합니다 sessions: activity: 마지막 활동 browser: 브라우저 browsers: - alipay: Alipay - blackberry: Blackberry - chrome: Chrome - edge: Microsoft Edge - electron: Electron - firefox: Firefox + alipay: 알리페이 + blackberry: 블랙베리 + chrome: 크롬 + edge: 마이크로소프트 엣지 + electron: 일렉트론 + firefox: 파이어폭스 generic: 알 수 없는 브라우저 - ie: Internet Explorer - micro_messenger: MicroMessenger + ie: 인터넷 익스플로러 + micro_messenger: 마이크로메신저 nokia: Nokia S40 Ovi 브라우저 - opera: Opera + opera: 오페라 otter: Otter - phantom_js: PhantomJS + phantom_js: 팬텀JS qq: QQ 브라우저 - safari: Safari + safari: 사파리 uc_browser: UC브라우저 - weibo: Weibo + weibo: 웨이보 current_session: 현재 세션 description: "%{platform}의 %{browser}" explanation: 내 마스토돈 계정에 현재 로그인 중인 웹 브라우저 목록입니다. ip: IP platforms: - adobe_air: Adobe Air - android: Android - blackberry: Blackberry - chrome_os: ChromeOS - firefox_os: Firefox OS + adobe_air: 어도비 Air + android: 안드로이드 + blackberry: 블랙베리 + chrome_os: 크롬OS + firefox_os: 파이어폭스OS ios: iOS - linux: Linux - mac: macOS + linux: 리눅스 + mac: 맥OS other: 알 수 없는 플랫폼 - windows: Windows - windows_mobile: Windows Mobile - windows_phone: Windows Phone + windows: 윈도우즈 + windows_mobile: 윈도우즈 모바일 + windows_phone: 윈도우즈 폰 revoke: 삭제 revoke_success: 세션이 성공적으로 삭제되었습니다 title: 세션 + view_authentication_history: 내 계정에 대한 인증 이력 보기 settings: account: 계정 account_settings: 계정 설정 @@ -1178,10 +1219,9 @@ ko: preferences: 사용자 설정 profile: 프로필 relationships: 팔로잉과 팔로워 + statuses_cleanup: 게시물 자동 삭제 two_factor_authentication: 2단계 인증 webauthn_authentication: 보안 키 - spam_check: - spam_detected: 이것은 자동화 된 신고입니다. 스팸이 감지되었습니다. statuses: attached: audio: @@ -1201,9 +1241,9 @@ ko: open_in_web: Web으로 열기 over_character_limit: 최대 %{max}자까지 입력할 수 있습니다 pin_errors: - limit: 이미 너무 많은 툿을 고정했습니다 - ownership: 다른 사람의 툿은 고정될 수 없습니다 - private: 비공개 툿은 고정될 수 없습니다 + limit: 이미 너무 많은 게시물을 고정했습니다 + ownership: 다른 사람의 게시물은 고정될 수 없습니다 + private: 비공개 게시물은 고정될 수 없습니다 reblog: 부스트는 고정될 수 없습니다 poll: total_people: @@ -1218,14 +1258,49 @@ ko: sign_in_to_participate: 로그인 하여 이 대화에 참여하기 title: '%{name}: "%{quote}"' visibilities: + direct: 다이렉트 private: 비공개 private_long: 팔로워에게만 공개됩니다 public: 공개 public_long: 누구나 볼 수 있으며, 공개 타임라인에 표시됩니다 unlisted: 공개 타임라인 비공개 unlisted_long: 누구나 볼 수 있지만, 공개 타임라인에는 표시되지 않습니다 + statuses_cleanup: + enabled: 오래된 게시물 자동 삭제 + enabled_hint: 아래의 예외 목록에 해당하지 않는다면, 명시된 기한 이후 당신의 게시물을 자동으로 삭제합니다 + exceptions: 예외 + explanation: 게시물 삭제는 많은 성능이 필요하기 때문에, 서버에서 바쁘지 않을 때 시간을 들여서 천천히 진행합니다. 이런 이유로, 당신의 게시물은 아마도 정해진 기간보다 좀 더 시간이 지난 이후에 삭제될 것입니다. + ignore_favs: 즐겨찾기 무시 + ignore_reblogs: 부스트 무시 + interaction_exceptions: 상호작용에 기반한 예외들 + interaction_exceptions_explanation: 즐겨찾기나 부스트 수가 설정한 값을 넘은 후 다시 낮아진 경우에는 게시물이 삭제되는 것을 보장하지 못합니다. + keep_direct: 다이렉트 메시지 유지 + keep_direct_hint: 다이렉트 메시지를 삭제하지 않습니다 + keep_media: 미디어가 있는 게시물 유지 + keep_media_hint: 미디어가 첨부된 게시물을 삭제하지 않습니다 + keep_pinned: 고정된 게시물 유지 + keep_pinned_hint: 고정 게시물을 삭제하지 않습니다 + keep_polls: 투표 유지 + keep_polls_hint: 투표를 삭제하지 않습니다 + keep_self_bookmark: 북마크된 게시물 유지 + keep_self_bookmark_hint: 내 스스로 북마크한 본인의 게시물을 삭제하지 않습니다 + keep_self_fav: 즐겨찾기한 게시물 유지 + keep_self_fav_hint: 내 스스로 즐겨찾기한 본인의 게시물을 삭제하지 않습니다 + min_age: + '1209600': 2 주 + '15778476': 6 개월 + '2629746': 1 개월 + '31556952': 1 년 + '5259492': 2 개월 + '63113904': 2 년 + '7889238': 3 개월 + min_age_label: 기한 + min_favs: 해당 횟수 이상 즐겨찾기된 게시물 유지 + min_favs_hint: 이 횟수 이상의 즐겨찾기가 된 게시물은 삭제하지 않습니다. 즐겨찾기 수와 관계없이 게시물을 지우고 싶다면 공백으로 두세요 + min_reblogs: 해당 횟수 이상 부스트된 게시물 유지 + min_reblogs_hint: 이 횟수 이상의 부스트가 된 게시물은 삭제하지 않습니다. 부스트 수와 관계없이 게시물을 지우고 싶다면 공백으로 두세요 stream_entries: - pinned: 고정된 툿 + pinned: 고정된 게시물 reblogged: 님이 부스트 했습니다 sensitive_content: 민감한 컨텐츠 tags: @@ -1236,7 +1311,7 @@ ko:

우리가 어떤 정보를 수집하나요?

    -
  • 기본 계정 정보: 이 서버에 가입하실 때 유저네임, 이메일 주소, 패스워드 등을 입력 받게 됩니다. 추가적으로 디스플레이네임이나 자기소개, 프로필 이미지, 헤더 이미지 등의 프로필 정보를 입력하게 됩니다. 유저네임, 디스플레이네임, 자기소개, 프로필 이미지와 헤더 이미지는 언제나 공개적으로 게시됩니다.
  • +
  • 기본 계정 정보: 이 서버에 가입하실 때 사용자명, 이메일 주소, 패스워드 등을 입력 받게 됩니다. 추가적으로 표시되는 이름이나 자기소개, 프로필 이미지, 헤더 이미지 등의 프로필 정보를 입력하게 됩니다. 사용자명, 표시되는 이름, 자기소개, 프로필 이미지와 헤더 이미지는 언제나 공개적으로 게시됩니다.
  • 게시물, 팔로잉, 기타 공개된 정보: 당신이 팔로우 하는 사람들의 리스트는 공개됩니다. 당신을 팔로우 하는 사람들도 마찬가지입니다. 당신이 게시물을 작성하는 경우, 응용프로그램이 메시지를 받았을 때의 날짜와 시간이 기록 됩니다. 게시물은 그림이나 영상 등의 미디어를 포함할 수 있습니다. 퍼블릭과 미표시(unlisted) 게시물은 공개적으로 접근이 가능합니다. 프로필에 게시물을 고정하는 경우 마찬가지로 공개적으로 접근 가능한 정보가 됩니다. 당신의 게시물들은 당신의 팔로워들에게 전송 됩니다. 몇몇 경우 이것은 다른 서버에 전송되고 그곳에 사본이 저장 됩니다. 당신이 게시물을 삭제하는 경우 이 또한 당신의 팔로워들에게 전송 됩니다. 다른 게시물을 리블로깅 하거나 즐겨찾기 하는 경우 이는 언제나 공개적으로 제공 됩니다.
  • DM, 팔로워 공개 게시물: 모든 게시물들은 서버에서 처리되고 저장됩니다. 팔로워 공개 게시물은 당신의 팔로워와 멘션 된 사람들에게 전달이 됩니다. 다이렉트 메시지는 멘션 된 사람들에게만 전송 됩니다. 몇몇 경우 이것은 다른 서버에 전송 되고 그곳에 사본이 저장됨을 의미합니다. 우리는 이 게시물들이 권한을 가진 사람들만 열람이 가능하도록 노력을 할 것이지만 다른 서버에서는 이것이 실패할 수도 있습니다. 그러므로 당신의 팔로워들이 속한 서버를 재확인하는 것이 중요합니다. 당신은 새 팔로워를 수동으로 승인하거나 거절하도록 설정을 변경할 수 있습니다. 해당 서버의 운영자는 서버가 받는 메시지를 열람할 수 있다는 것을 항상 염두해 두세요, 그리고 수신자들은 스크린샷을 찍거나 복사하는 등의 방법으로 다시 공유할 수 있습니다. 위험한 정보를 마스토돈을 통해 공유하지 마세요.
  • IP와 기타 메타데이터: 당신이 로그인 하는 경우 IP 주소와 브라우저의 이름을 저장합니다. 모든 세션은 당신이 검토하고 취소할 수 있도록 설정에서 제공 됩니다. 마지막으로 사용 된 IP 주소는 최대 12개월 간 저장됩니다. 또한, 모든 요청에 대해 IP주소를 포함한 정보를 로그에 저장할 수 있습니다.
  • @@ -1268,7 +1343,7 @@ ko:
    • IP를 포함해 이 서버에 전송 되는 모든 요청에 대한 로그는 90일을 초과하여 저장되지 않습니다.
    • -
    • 가입 된 유저의 IP 정보는 12개월을 초과하여 저장 되지 않습니다.
    • +
    • 가입 된 사용자의 IP 정보는 12개월을 초과하여 저장 되지 않습니다.

    당신은 언제든지 게시물, 미디어 첨부, 프로필 이미지, 헤더 이미지를 포함한 당신의 컨텐트에 대한 아카이브를 요청하고 다운로드 할 수 있습니다.

    @@ -1351,8 +1426,8 @@ ko: explanation: disable: 당신의 계정이 동결 된 동안 당신의 계정은 유지 됩니다. 하지만 잠금이 풀릴 때까지 당신은 아무 것도 할 수 없습니다. sensitive: 당신의 업로드 한 미디어 파일들과 링크된 미디어들은 민감함으로 취급됩니다. - silence: 당신의 계정이 제한 된 동안엔 당신의 팔로워 이외엔 툿을 받아 볼 수 없고 공개 리스팅에서 제외 됩니다. 하지만 다른 사람들은 여전히 당신을 팔로우 가능합니다. - suspend: 당신의 계정은 정지 되었으며, 모든 툿과 업로드 한 미디어가 서버에서 삭제 되어 되돌릴 수 없습니다. + silence: 당신의 계정이 제한 된 동안엔 당신의 팔로워 이외엔 게시물을 받아 볼 수 없고 공개 리스팅에서 제외 됩니다. 하지만 다른 사람들은 여전히 당신을 팔로우 가능합니다. + suspend: 당신의 계정은 정지 되었으며, 모든 게시물과 업로드 한 미디어가 서버에서 삭제 되어 되돌릴 수 없습니다. get_in_touch: 이 메일에 대해 답장해서 %{instance}의 스태프와 연락 할 수 있습니다. review_server_policies: 서버 정책 검토하기 statuses: '구체적으로:' @@ -1386,11 +1461,8 @@ ko: tips: 팁 title: 환영합니다 %{name} 님! users: - blocked_email_provider: 허용된 이메일 제공자가 아닙니다 follow_limit_reached: 당신은 %{limit}명의 사람을 넘어서 팔로우 할 수 없습니다 generic_access_help_html: 계정 로그인에 문제가 있나요? %{email} 로 도움을 요청할 수 있습니다 - invalid_email: 메일 주소가 올바르지 않습니다 - invalid_email_mx: 이메일 주소가 존재하지 않는 것 같습니다 invalid_otp_token: 2단계 인증 코드가 올바르지 않습니다 invalid_sign_in_token: 잘못된 보안 코드 otp_lost_help_html: 만약 양쪽 모두를 잃어버렸다면 %{email}을 통해 복구할 수 있습니다 diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 0d76e1b97d..d421b42a76 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -7,7 +7,6 @@ ku: active_count_after: چالاک active_footnote: بەکارهێنەرانی چالاکی مانگانە (MAU) administered_by: 'بەڕێوەبراو لەلایەن:' - api: API apps: ئەپەکانی مۆبایل apps_platforms: بەکارهێنانی ماستۆدۆن لە iOS، ئەندرۆید و سەکۆکانی تر browse_directory: گەڕان لە ڕێبەرێکی پرۆفایل و پاڵاوتن بەپێی بەرژەوەندیەکان @@ -77,7 +76,6 @@ ku: other: تووتەکان posts_tab_heading: تووتەکان posts_with_replies: تووتەکان و وڵامەکان - reserved_username: ناوی بەکارهێنەر پارێزراوە roles: admin: بەڕێوەبەر bot: بۆت @@ -256,46 +254,6 @@ ku: update_announcement: بەڕۆژکردنەوەی راگەیەندراو update_custom_emoji: بەڕۆژکردنی ئێمۆمۆجی دڵخواز update_status: بەڕۆژکردنی دۆخ - actions: - assigned_to_self_report: "%{name} پێداچوونەوە بە گوزارشتی %{target} لە ئەستۆ گرتووە" - change_email_user: "%{name} ناونیشانی ئیمەیلی بەکارهینەری %{target} گۆڕا" - confirm_user: "%{name} ناونیشانی ئیمەیلی بەکارهینەری %{target} پەسەند کرد" - create_account_warning: "%{name} ئاگاداریێک بۆ %{target} نارد" - create_announcement: "%{name} ئاگاداری نوێی دروستکرد %{target}" - create_custom_emoji: "%{name} ئیمۆجی نوێی %{target} بارکرد" - create_domain_allow: "%{name} دۆمەینی %{target} ڕێپێدا" - create_domain_block: "%{name} دۆمەنی %{target} بلۆککرد" - create_email_domain_block: "%{name} دۆمەینی ئیمەیلی %{target} بلۆککرد" - create_ip_block: "%{name} یاسای دروستکراو بۆ ئای‌پی %{target}" - demote_user: "%{name} ئاستی بەکارهێنەری %{target} دابەزاند" - destroy_announcement: "%{name} ئاگاداری %{target} سڕیەوە" - destroy_custom_emoji: "%{name} ئیمۆجی %{target} لە ناوبرد" - destroy_domain_allow: "%{name} دۆمەنی%{target} لە پێرستی ڕێپێدراو لابرد" - destroy_domain_block: "%{name} بەرگیری لە دۆمەینی %{target} لابرد" - destroy_email_domain_block: "%{name} دۆمەینی ئیمەیلی %{target} خستە پێرستی ڕێپێدراو" - destroy_ip_block: "%{name} یاسای سڕینەوە بۆ ئای‌پی %{target}" - destroy_status: "%{name} نووسراوەی %{target} سڕیەوە" - disable_2fa_user: "%{name} دوو مەرجی فاکتەر بۆ بەکارهێنەر %{target} لە کارخست" - disable_custom_emoji: "%{name} ئیمۆجی %{target} ناچالاک کرد" - disable_user: "%{name} چوونەژوورەوەی بەکارهێنەری %{target} لەکارخست" - enable_custom_emoji: "%{name} ئیمۆجی %{target} چالاک کرد" - enable_user: "%{name} چوونەژوورەوەی بەکارهێنەری %{target} چالککرد" - memorialize_account: "%{name} هەژمارەی بەکارهێنەری %{target} گۆڕا بە پەڕەی یادەوەری" - promote_user: "%{name} ئاستی بەکارهێنەری %{target} بەرزکردەوە" - remove_avatar_user: "%{name} وێنۆچکەی بەکارهێنەری %{target} سڕیەوە" - reopen_report: "%{name} گوزارشتی %{target} دووبارە وەگڕخستەوە" - reset_password_user: "%{name} تێپەروشەی بەکارهێنەری %{target} گەڕانەوە" - resolve_report: "%{name} گوزارشتی %{target} دووبارە وەگڕخستەوە" - sensitive_account: "%{name} بە %{target}'s میدیا وەک هەستیار دیاری کراوە" - silence_account: "%{name} هەژماری %{target}'s بێدەنگ کرا" - suspend_account: "%{name} هەژماری %{target}'ی ڕاگیرا" - unassigned_report: "%{name} ڕاپۆرتی دیاری نەکراوی %{target}" - unsensitive_account: "%{name} بە %{target}'s میدیا وەک هەستیار دیاری نەکراوە" - unsilence_account: "%{name} هەژماری %{target}'s بێ دەنگ" - unsuspend_account: "%{name} هەژماری %{target}'s هەڵنەپەسێردراو" - update_announcement: "%{name} بەڕۆژکراوەی راگەیاندنی %{target}" - update_custom_emoji: "%{name} ئیمۆجی %{target} نوێکرایەوە" - update_status: "%{name} نووسراوەی %{target} بەڕۆژکرد" deleted_status: "(نووسراوە سڕاوە)" empty: هیچ لاگی کارنەدۆزرایەوە. filter_by_action: فلتەر کردن بە کردار @@ -358,7 +316,6 @@ ku: feature_profile_directory: ڕێنیشاندەرێکی پرۆفایل feature_registrations: تۆمارکراوەکان feature_relay: گواستنەوەی گشتی - feature_spam_check: دژە سپام feature_timeline_preview: پێش نیشاندانی نووسراوەکان features: تایبەتمەندیەکان hidden_service: پەیوەندی نێوان ڕاژە یان خزمەتگوزاری نێننی @@ -556,8 +513,6 @@ ku: users: بۆ چوونە ژوورەوەی بەکارهێنەرانی ناوخۆ domain_blocks_rationale: title: پیشاندانی ڕێژەیی - enable_bootstrap_timeline_accounts: - title: چالاککردنی بەدواکەکانی گریمانەیی بۆ بەکارهێنەرە نوێکان hero: desc_html: نیشان درا لە پەڕەی سەرەتا. بەلایەنی کەمەوە 600x100px پێشنیارکراوە. کاتێک ڕێک نەکەویت، دەگەڕێتەوە بۆ وێنۆجکەی ڕاژە title: وێنەی پاڵەوان @@ -608,9 +563,6 @@ ku: desc_html: دەتوانیت سیاسەتی تایبەتیێتی خۆت بنووسیت، مەرجەکانی خزمەتگوزاری یان یاسایی تر. دەتوانیت تاگەکانی HTML بەکاربێنیت title: مەرجەکانی خزمەتگوزاری ئاسایی site_title: ناوی ڕاژە - spam_check_enabled: - desc_html: ماستۆدۆن دەتوانێت هەژمارەکان خۆکارانە بێدەنگ یان گوزارشتیان بکا. زۆر جار بۆ ناسینی هەرزەپەیام و پەیامی نەخوازیاری دووپاتدەبێتەوە،جار و بار بە هەڵە دەردەچێت. - title: دژە هەرزەنامە thumbnail: desc_html: بۆ پێشبینین بەکارهاتووە لە ڕێگەی OpenGraph وە API. ڕووناکی بینین ١٢٠٠x٦٣٠پیکسێڵ پێشنیارکراوە title: وێنەی بچکۆلەی ڕاژە @@ -645,9 +597,6 @@ ku: accounts_today: بەکارهێنانی بێ هاوتای ئەمڕۆ accounts_week: بەکارهێنەری یەکتا لەم هەفتەیە breakdown: بەکارهێنانی ئەمڕۆ بە جوداکردنی سەرچاوە - context: دەق - directory: لە پێرست - in_directory: "%{count} لە پێرست" last_active: دوا چالاکی most_popular: بەناوبانگترین most_recent: تازەترین @@ -691,13 +640,11 @@ ku: discovery: دۆزینەوە localization: body: ماستۆدۆن لەلایەن خۆبەخشەوە وەردەگێڕێت. - guide_link: https://crowdin.com/project/mastodon guide_link_text: هەموو کەسێک دەتوانێت بەشداری بکات. sensitive_content: ناوەڕۆکی هەستیار toot_layout: لۆی توت application_mailer: notification_preferences: گۆڕینی پەسەندکراوەکانی ئیمەیڵ - salutation: "%{name}," settings: 'گۆڕینی پەسەندکراوەکانی ئیمەیڵ: %{link}' view: 'نیشاندان:' view_profile: پرۆفایل نیشان بدە @@ -732,9 +679,6 @@ ku: migrate_account: گواستنەوە بۆ ئەژمێرێکی تر migrate_account_html: ئەگەر دەتەوێت ئەم هەژمارە دووبارە ئاڕاستە بکەیت بۆ ئەژمێرێکی تر، دەتوانیت کرتەیەک لێرە بکەی . or_log_in_with: یان چوونە ژوورەوە بە - providers: - cas: CAS - saml: SAML register: خۆ تۆمارکردن registration_closed: "%{instance} ئەندامانی نوێ قبووڵ ناکات" resend_confirmation: دووبارە ناردنی ڕێنماییەکانی دووپاتکردنەوە @@ -774,24 +718,15 @@ ku: errors: invalid_key: کلیلی باوڕپێکراو Ed25519 یان Curve25519 دروست نییە invalid_signature: واژووی Ed25519 بڕوادار نییە - date: - formats: - default: "%b %d, %Y" - with_month_name: "%B %d, %Y" datetime: distance_in_words: about_x_hours: "%{count}کات" - about_x_months: "%{count}mo" about_x_years: "%{count}ساڵ" almost_x_years: "%{count}ساڵ" half_a_minute: ئێستا - less_than_x_minutes: "%{count}m" less_than_x_seconds: ئێستا over_x_years: "%{count}ساڵ" x_days: "%{count}ڕۆژ" - x_minutes: "%{count}m" - x_months: "%{count}mo" - x_seconds: "%{count}s" deletes: challenge_not_passed: ئەو زانیاریانەی تێنووست کردووە ڕاست نەبوو confirm_password: تێپەڕوشەی ئێستات تێبنووسە بۆ سەلماندنی ناسنامەکەت @@ -843,7 +778,6 @@ ku: size: قەبارە blocks: تۆ بلۆک دەکەیت bookmarks: نیشانکراوەکان - csv: CSV domain_blocks: دۆمەین قەپاتکرا lists: لیستەکان mutes: هەژمارە بێدەنگ کراوە @@ -1030,16 +964,6 @@ ku: email_events: رووداوەکان بۆ ئاگاداری ئیمەیلی email_events_hint: 'ئەو ڕووداوانە دیاریبکە کە دەتەوێت ئاگانامەکان وەربگری بۆ:' other_settings: ڕێکبەندەکانی ئاگانامەکانی تر - number: - human: - decimal_units: - format: "%n%u" - units: - billion: B - million: M - quadrillion: Q - thousand: K - trillion: T otp_authentication: code_hint: کۆدێک داخڵ بکە کە دروست کراوە لەلایەن ئەپی ڕەسەنایەتیەوە بۆ دڵنیابوون description_html: ئەگەر تۆ هاتنەژوورەوەی دوو قۆناغی بە یارمەتی ئەپێکی پەسەندکردن چالاک بکەن، پێویستە بۆ چوونەژوورەوە ، بە تەلەفۆنەکەتان کە کۆدیکتان بۆ دروستدەکات دەستپێگەیشتنتان هەبێت. @@ -1053,7 +977,6 @@ ku: next: داهاتوو older: کۆنتر prev: پێشوو - truncate: "…" polls: errors: already_voted: تۆ پێشتر دەنگت داوە لەسەر ئەم ڕاپرسییە @@ -1115,7 +1038,6 @@ ku: activity: دوایین چالاکی browser: وێبگەڕ browsers: - alipay: Alipay blackberry: بلاکبێری chrome: کرۆم edge: مایکرۆسۆفت ئیچ @@ -1131,18 +1053,15 @@ ku: qq: وێبگەڕی QQ safari: سافری uc_browser: وێبگەڕی UC - weibo: Weibo current_session: دانیشتنی ئێستا description: "%{browser} لەسەر %{platform}" explanation: ئەمانە وێبگەڕەکەن کە ئێستا چووەتە ژوورەوە بۆ ئەژمێری ماستۆدۆنی خۆت. ip: ئای‌پی platforms: - adobe_air: Adobe Air android: ئەندرۆید blackberry: بلاکبێری chrome_os: سیستەمی کارگێڕی کرۆم firefox_os: سیستەمی کارگێڕی فایەرفۆکس - ios: iOS linux: لینۆکس mac: ماک other: سیستەمیکارگێڕی نەناسراو @@ -1174,8 +1093,6 @@ ku: relationships: شوێنکەوتوو و شوێنکەوتوان two_factor_authentication: کۆدی دووقۆناغی هاتنەژوور webauthn_authentication: کلیلەکانی پاراستن - spam_check: - spam_detected: ئەمە هەژمارەیەکی خۆکارانەیەبۆ ناساندنی سپام. statuses: attached: audio: @@ -1216,7 +1133,6 @@ ku: show_older: پیشاندانی کۆنتر show_thread: نیشاندانی ڕشتە sign_in_to_participate: بچۆ ژوورەوە بۆ بەشداریکردن لە گفتوگۆکەدا - title: '%{name}: "%{quote}"' visibilities: private: شوێنکەوتوانی تەنها private_long: تەنها بۆ شوێنکەوتوانی پیشان بدە @@ -1313,10 +1229,6 @@ ku: contrast: ماستۆدۆن (کۆنتراستی بەرز) default: ماستۆدۆن (ڕەش) mastodon-light: ماستۆدۆن (کاڵ) - time: - formats: - default: "%b %d, %Y, %H:%M" - month: "%b %Y" two_factor_authentication: add: زیادکردن disable: لەکارخستنی 2FA @@ -1382,11 +1294,8 @@ ku: tips: ئامۆژگاریەکان title: بەخێربێیت، بەکارهێنەر %{name}! users: - blocked_email_provider: ئەم دابینکەری ئیمەیڵە رێگەپێدراو نییە follow_limit_reached: ناتوانیت زیاتر لە %{limit} خەڵک پەیڕەو کەیت generic_access_help_html: کێشەت هەیە لە گەیشتن بە هەژمارەکەت؟ دەتوانیت لەگەڵ %{email} بۆ یارمەتیدان پەیوەندی بگرن - invalid_email: ناونیشانی ئیمەیڵەکە نادروستە - invalid_email_mx: لەوە ناچێت ناونیشانی ئیمەیڵ بوونی هەبێت invalid_otp_token: کۆدی دوو-فاکتەر نادروستە invalid_sign_in_token: کۆدی پاراستن دروست نیە otp_lost_help_html: گەر بەو دووڕێگا نەتوانی بچیتە ژوورەوە، لەوانەیە پەیوەندی بگری بە %{email} بۆ یارمەتی diff --git a/config/locales/kw.yml b/config/locales/kw.yml new file mode 100644 index 0000000000..62d535b1b0 --- /dev/null +++ b/config/locales/kw.yml @@ -0,0 +1,24 @@ +--- +kw: + about: + about_this: A-dro dhe + accounts: + roles: + group: Bagas + admin: + accounts: + email: Ebost + followers: Holyoryon + title: Akontow + errors: + '400': The request you submitted was invalid or malformed. + '403': You don't have permission to view this page. + '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. + '410': The page you were looking for doesn't exist here anymore. + '422': + '429': Too many requests + '500': + '503': The page could not be served due to a temporary server failure. + settings: + account: Akont diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 0e4bb65bc8..b0de04024e 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -34,7 +34,6 @@ lt: following: Privalai sekti žmogų kurį nori pagerbti posts_tab_heading: Tootai posts_with_replies: Tootai ir atsakymai - reserved_username: Vartotojo vardas rezervuotas roles: admin: Administratorius bot: Bot'as @@ -139,37 +138,6 @@ lt: username: Slapyvardis warn: Įspėti action_logs: - actions: - assigned_to_self_report: "%{name} paskyrė reportą %{target} saviems" - change_email_user: "%{name} pakeitė el pašto adresą vartotojui %{target}" - confirm_user: "%{name} patvirtino el pašto adresą vartotojui %{target}" - create_account_warning: "%{name} išsiuntė įspėjimą %{target}" - create_custom_emoji: "%{name} įkėlė naują jaustuką %{target}" - create_domain_block: "%{name} užblokavo domena %{target}" - create_email_domain_block: "%{name} įkėlė į juodajį sąrašą el pašto domena %{target}" - demote_user: "%{name} pažemino %{target}" - destroy_custom_emoji: "%{name} sunaikino jaustuką %{target}" - destroy_domain_block: "%{name} atrakino domeną %{target}" - destroy_email_domain_block: "%{name} pašalino iš juodojo sąrašo el pašto domeną %{target}" - destroy_status: "%{name} pašalino statusą %{target}" - disable_2fa_user: "%{name} išjungė 2 faktorių autentikavimo sistemos reikalavimus vartotojui %{target}" - disable_custom_emoji: "%{name} išjungė jaustuką %{target}" - disable_user: "%{name} išjungė prisijungimą vartotojui %{target}" - enable_custom_emoji: "%{name} įjungė jaustuką %{target}" - enable_user: "%{name} įjungė prisijungimą vartotojui %{target}" - memorialize_account: "%{name} pavertė vartotojo %{target} paskyrą į prisiminimų puslapį" - promote_user: "%{name} paaukštino vartotoją %{target}" - remove_avatar_user: "%{name} panaikino vartotojo %{target} profilio nuotrauką" - reopen_report: "%{name} atidarė skundą %{target}" - reset_password_user: "%{name} atstatyti slaptažodį vartotojui %{target}" - resolve_report: "%{name} išsprendė skundą %{target}" - silence_account: "%{name} pritildė vartotojo %{target} paskyrą" - suspend_account: "%{name} laikinai užblokavo vartotojo %{target} paskyrą" - unassigned_report: "%{name} nepaskirtas skundas %{target}" - unsilence_account: "%{name} atitildė vartotojo %{target} paskyrą" - unsuspend_account: "%{name} atblokavo vartotojo %{target} paskyrą" - update_custom_emoji: "%{name} atnaujino jaustuką %{target}" - update_status: "%{name} pakeitė statusą %{target}" deleted_status: "(panaikintas statusas)" title: Audito žurnalas custom_emojis: @@ -198,27 +166,9 @@ lt: updated_msg: Jaustukas sėkmingai pakeistas! upload: Įkelti dashboard: - backlog: Neatlikti darbai - config: Konfiguracija - feature_deletions: Paskyrų šalinimas - feature_invites: Pakivetimo nuorodos - feature_profile_directory: Profilio direktorija - feature_registrations: Registracijos - feature_relay: Federacijos perjungėjas - features: Išskirtinumai - hidden_service: Federacija su paslėptomis paslaugomis - open_reports: atidaryti skundai - recent_users: Neseni vartotojai - search: Pilno teksto paieška - single_user_mode: Vieno vartotojo būsena software: Programinė įranga space: Naudojama atmintis title: Pagrindinis puslapis - total_users: viso vartotoju - trends: Tendencijos - week_interactions: naudojimai šią savaitę - week_users_active: aktyvūs šią savaitę - week_users_new: vartotojai šią savaitę domain_blocks: add_new: Pridėti naują domeno bloką created_msg: Domeno užblokavimas nagrinėjamas @@ -824,7 +774,6 @@ lt: title: Sveiki atvykę, %{name}! users: follow_limit_reached: Negalite sekti daugiau nei %{limit} žmonių - invalid_email: Netinkamas el pašto adresas invalid_otp_token: Netinkamas dviejų veiksnių kodas otp_lost_help_html: Jeigu praradote prieiga prie abiejų, susisiekite su mumis per %{email} seamless_external_login: Jūs esate prisijungę per išorini įrenginį, todėl slaptąžodis ir el pašto nustatymai neprieinami. diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 510458c5e1..5b51b2bca9 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1,5 +1,480 @@ --- lv: + about: + about_hashtag_html: Šīs ir publiskas ziņas, kas atzīmētas ar #%{hashtag} . Tu vari mijiedarboties ar viņiem, ja tev ir konts jebkurā federācijas vietnē. + about_mastodon_html: 'Nākotnes sociālais tīkls: bez reklāmām, bez korporatīvās uzraudzības, ētisks dizains un decentralizācija! Pārvaldi savus datus ar Mastodon!' + about_this: Par + active_count_after: aktīvs + active_footnote: Ikmēneša aktīvie lietotāji (IAL) + administered_by: 'Administrē:' + api: API + apps: Mobilās lietotnes + apps_platforms: Lieto Mastodon uz iOS, Android un citām platformām + browse_directory: Pārlūko profila direktoriju un atlasi pēc interesēm + browse_local_posts: Pārlūko publisko ziņu straumi no šī servera + browse_public_posts: Pārlūko publisko ziņu straumi no Mastodon + contact: Kontakts + contact_missing: Nav uzstādīts + contact_unavailable: N/A + discover_users: Atklāj lietotājus + documentation: Dokumentācija + federation_hint_html: Izmantojot kontu vietnē %{instance}, varēsi sekot cilvēkiem jebkurā Mastodon serverī un ārpus tā. + get_apps: Izmēģini mobilo lietotni + hosted_on: Mastodon mitināts %{domain} + instance_actor_flash: | + Šis konts ir virtuāls aktieris, ko izmanto, lai pārstāvētu pašu serveri, nevis atsevišķu lietotāju. + To izmanto apvienošanas nolūkos, un to nedrīkst bloķēt, ja vien nevēlies bloķēt visu instanci, un tādā gadījumā tev jāizmanto domēna bloķēšana. + learn_more: Uzzināt vairāk + privacy_policy: Privātuma politika + rules: Servera noteikumi + rules_html: 'Tālāk ir sniegts noteikumu kopsavilkums, kas jāievēro, ja vēlies izveidot kontu šajā Mastodon serverī:' + see_whats_happening: Redzēt, kas notiek + server_stats: 'Servera statistika:' + source_code: Pirmkods + status_count_after: + one: ziņa + other: ziņas + zero: nav + status_count_before: Kurš publicējis + tagline: Seko draugiem un atrodi jaunus + terms: Pakalpojuma noteikumi + unavailable_content: Moderētie serveri + unavailable_content_description: + domain: Serveris + reason: Iemesls + rejecting_media: 'Multivides faili no šiem serveriem netiks apstrādāti vai saglabāti, un netiks parādīti sīktēli, kuriem nepieciešama manuāla noklikšķināšana uz sākotnējā faila:' + rejecting_media_title: Filtrēts saturs + silenced: 'Ziņas no šiem serveriem tiks paslēptas publiskās ziņu lentās un sarunās, un no lietotāju mijiedarbības netiks ģenerēti paziņojumi, ja vien tu tiem nesekosi:' + silenced_title: Ierobežoti serveri + suspended: 'Nekādi dati no šiem serveriem netiks apstrādāti, uzglabāti vai apmainīti, padarot neiespējamu jebkādu mijiedarbību vai saziņu ar lietotājiem no šiem serveriem:' + suspended_title: Apturēti serveri + unavailable_content_html: Mastodon parasti ļauj apskatīt saturu un mijiedarboties ar lietotājiem no jebkura cita federācijas servera. Šie ir izņēmumi, kas veikti šajā konkrētajā serverī. + user_count_after: + one: lietotājs + other: lietotāji + zero: lietotājI + user_count_before: Mājās uz + what_is_mastodon: Kas ir Mastodon? + accounts: + choices_html: "%{name} izvēles:" + endorsements_hint: Jūs varat apstiprināt cilvēkus, kuriem sekojat no tīmekļa saskarnes, un viņi tiks parādīti šeit. + featured_tags_hint: Šeit vari norādīt īpašus tēmturus, kuri tiks parādīti šeit. + follow: Seko + following: Seko + instance_actor_flash: Šis konts ir virtuāls aktieris, ko izmanto, lai pārstāvētu pašu serveri, nevis atsevišķu lietotāju. To izmanto federācijas nolūkos, un to nevajadzētu apturēt. + joined: Pievienojās %{date} + last_active: pēdējā aktivitāte + link_verified_on: Šīs saites piederība tika pārbaudīta %{date} + media: Mediji + moved_html: "%{name} ir pārcēlies uz %{new_profile_link}:" + network_hidden: Šāda informācija nav pieejama + never_active: Nekad + nothing_here: Te nekā nav! + people_followed_by: Cilvēki, kuriem %{name} seko + people_who_follow: Cilvēki, kuri seko %{name} + pin_errors: + following: Tev jau ir jāseko personai, kuru vēlies apstiprināt + posts_tab_heading: Ziņas + posts_with_replies: Ziņas un atbildes + roles: + admin: Admins + bot: Bots + group: Grupa + moderator: Moder + unavailable: Profils nav pieejams + unfollow: Pārstāt sekot + admin: + account_actions: + action: Veikt darbību + title: Veikt moderācijas darbību %{acct} + account_moderation_notes: + create: Atstāt piezīmi + created_msg: Moderācijas piezīme ir veiksmīgi izveidota! + delete: Dzēst + destroyed_msg: Moderācijas piezīme ir veiksmīgi iznīcināta! + accounts: + add_email_domain_block: Bloķēt e-pasta domēnu + approve: Apstiprināt + approve_all: Apstiprināt visus + approved_msg: Veiksmīgi apstiprināts %{username} reģistrēšanās pieteikums + are_you_sure: Vai esi pārliecināts? + avatar: Avatars + by_domain: Domēns + change_email: + changed_msg: Konta e-pasts veiksmīgi nomainīts! + current_email: Pašreizējais e-pasts + label: Mainīt e-pastu + new_email: Jaunā e-pasta adrese + submit: Mainīt e-pastu + title: Mainīt e-pastu %{username} + confirm: Apstiprināt + confirmed: Apstiprināts + confirming: Apstiprina + delete: Dzēst datus + deleted: Dzēsts + demote: Pazemināt + destroyed_msg: Lietotāja %{username} dati tagad ievietoti rindā, lai tos nekavējoties izdzēstu + disable: Iesaldēt + disable_sign_in_token_auth: Atspējot autentifikāciju ar e-pasta marķieri + disable_two_factor_authentication: Atspējot 2FA + disabled: Iesaldēts + display_name: Parādāmais vārds + domain: Domēns + edit: Rediģēt + email: E-pasts + email_status: E-pasta statuss + enable: Atsaldēt + enable_sign_in_token_auth: Iespējot autentifikāciju ar e-pasta marķieri + enabled: Iespējots + enabled_msg: Veiksmīgi atsaldēts %{username} konts + followers: Sekotāji + follows: Seko + header: Galvene + inbox_url: Iesūtnes URL + invite_request_text: Pievienošanās iemesli + invited_by: Uzaicināja + ip: IP + joined: Pievienojies + location: + all: Visi + local: Vietējie + remote: Attālinātie + title: Atrašanās vieta + login_status: Pieteikšanās statuss + media_attachments: Mediju pielikumi + memorialize: Pārvērst atmiņās + memorialized: Piemiņa saglabāta + memorialized_msg: "%{username} veiksmīgi pārvērsts par piemiņas kontu" + moderation: + active: Aktīvie + all: Visi + pending: Gaida + silenced: Ierobežotie + suspended: Apturētie + title: Moderācija + moderation_notes: Moderācijas piezīmes + most_recent_activity: Pati pēdējā darbība + most_recent_ip: Pati pēdējā IP + no_account_selected: Neviens konts netika mainīts, jo neviens netika atlasīts + no_limits_imposed: Nav noteikti ierobežojumi + not_subscribed: Nav abonēts + pending: Gaida pārskatīšanu + perform_full_suspension: Apturēt + promote: Veicināt + protocol: Protokols + public: Publisks + push_subscription_expires: PuSH abonements beidzas + redownload: Atsvaidzināt profilu + redownloaded_msg: Veiksmīgi atsvaidzināts %{username} profils no izcelsmes + reject: Noraidīt + reject_all: Noraidīt visus + rejected_msg: Veiksmīgi noraidīts %{username} reģistrēšanās pieteikums + remove_avatar: Noņemt avatāru + remove_header: Noņemt galveni + removed_avatar_msg: Veiksmīgi noņemts %{username} avatāra attēls + removed_header_msg: Veiksmīgi noņemts %{username} galvenes attēls + resend_confirmation: + already_confirmed: Šis lietotājs jau ir apstiprināts + send: Atkārtoti nosūtīt apstiprinājuma e-pastu + success: Apstiprinājuma e-pasts veiksmīgi nosūtīts! + reset: Atiestatīt + reset_password: Atiestatīt paroli + resubscribe: Pieteikties vēlreiz + role: Privilēģijas + roles: + admin: Administrators + moderator: Moderators + user: Lietotājs + search: Meklēt + search_same_email_domain: Citi lietotāji ar tādu pašu e-pasta domēnu + search_same_ip: Citi lietotāji ar tādu pašu IP + security_measures: + only_password: Tikai parole + password_and_2fa: Parole un 2FA + password_and_sign_in_token: Parole un e-pasta marķieris + sensitive: Sensitīvs + sensitized: Atzīmēts kā sensitīvs + shared_inbox_url: Koplietotās iesūtnes URL + show: + created_reports: Sastādītie ziņojumi + targeted_reports: Ziņojuši citi + silence: Ierobežot + silenced: Ierobežots + statuses: Ziņas + subscribe: Abonēt + suspended: Apturēts + suspension_irreversible: Šī konta dati ir neatgriezeniski izdzēsti. Tu vari atcelt konta darbības apturēšanu, lai tas būtu izmantojams, taču tas neatjaunos iepriekšējos datus. + suspension_reversible_hint_html: Konta darbība ir apturēta, un dati tiks pilnībā noņemti %{date}. Līdz tam kontu var atjaunot bez jebkādām nelabvēlīgām sekām. Ja vēlies nekavējoties noņemt visus konta datus, to vari izdarīt zemāk. + time_in_queue: Gaida rindā %{time} + title: Konti + unconfirmed_email: Neapstiprināts e-pasts + undo_sensitized: Atcelt sensitivizēšanu + action_logs: + action_types: + unsuspend_account: Atcelt konta apturēšanu + update_announcement: Atjaunināt Paziņojumu + update_custom_emoji: Atjaunināt pielāgoto emocijzīmi + update_domain_block: Atjaunināt Domēna Bloku + update_status: Atjaunināt ziņu + actions: + assigned_to_self_report_html: "%{name} piešķīra pārskatu %{target} sev" + change_email_user_html: "%{name} nomainīja e-pasta adresi lietotājam %{target}" + confirm_user_html: "%{name} apstiprināja e-pasta adresi lietotājam %{target}" + create_account_warning_html: "%{name} nosūtīja brīdinājumu %{target}" + create_announcement_html: "%{name} izveidoja jaunu paziņojumu %{target}" + create_custom_emoji_html: "%{name} augšupielādēja jaunu emocijzīmi %{target}" + create_domain_allow_html: "%{name} atļāva federāciju ar domēnu %{target}" + create_domain_block_html: "%{name} bloķēja domēnu %{target}" + create_email_domain_block_html: "%{name} bloķēja e-pasta domēnu %{target}" + create_ip_block_html: "%{name} izveidoja nosacījumu priekš IP %{target}" + create_unavailable_domain_html: "%{name} apturēja piegādi uz domēnu %{target}" + demote_user_html: "%{name} pazemināja lietotāju %{target}" + destroy_announcement_html: "%{name} izdzēsa paziņojumu %{target}" + destroy_custom_emoji_html: "%{name} iznīcināja emocijzīmi %{target}" + destroy_domain_allow_html: "%{name} neatļāva federāciju ar domēnu %{target}" + destroy_domain_block_html: "%{name} atbloķēja domēnu %{target}" + destroy_email_domain_block_html: "%{name} atbloķēja e-pasta domēnu %{target}" + destroy_ip_block_html: "%{name} izdzēsa nosacījumu priekš IP %{target}" + destroy_status_html: "%{name} noņēma ziņu %{target}" + destroy_unavailable_domain_html: "%{name} atjaunoja piegādi uz domēnu %{target}" + disable_2fa_user_html: "%{name} atspējoja divfaktoru prasības lietotājam %{target}" + disable_custom_emoji_html: "%{name} atspējoja emocijzīmi %{target}" + disable_sign_in_token_auth_user_html: "%{name} atspējoja e-pasta marķiera autentifikāciju %{target}" + disable_user_html: "%{name} atspējoja pieteikšanos lietotājam %{target}" + enable_custom_emoji_html: "%{name} iespējoja emocijzīmi %{target}" + enable_sign_in_token_auth_user_html: "%{name} iespējoja e-pasta marķiera autentifikāciju %{target}" + enable_user_html: "%{name} iespējoja pieteikšanos lietotājam %{target}" + memorialize_account_html: "%{name} pārvērta %{target} kontu par atmiņas lapu" + promote_user_html: "%{name} paaugstināja lietotāju %{target}" + remove_avatar_user_html: "%{name} noņēma %{target} avatāru" + reopen_report_html: "%{name} atkārtoti atvēra ziņojumu %{target}" + reset_password_user_html: "%{name} atiestatīja paroli lietotājam %{target}" + resolve_report_html: "%{name} atrisināja ziņojumu %{target}" + sensitive_account_html: "%{name} atzīmēja %{target} mediju kā sensitīvu" + silence_account_html: "%{name} ierobežoja %{target} kontu" + suspend_account_html: "%{name} apturēja %{target} kontu" + unassigned_report_html: "%{name} nepiešķīra ziņojumu %{target}" + unsensitive_account_html: "%{name} atmarķēja %{target} mediju kā sensitīvu" + unsilence_account_html: "%{name} atcēla ierobežojumu %{target} kontam" + unsuspend_account_html: "%{name} neapturēja %{target} kontu" + update_announcement_html: "%{name} atjaunināja paziņojumu %{target}" + update_custom_emoji_html: "%{name} atjaunināja emocijzīmi %{target}" + update_domain_block_html: "%{name} atjaunināja domēna bloku %{target}" + update_status_html: "%{name} atjaunināja ziņu %{target}" + deleted_status: "(dzēsta ziņa)" + empty: Žurnāli nav atrasti. + filter_by_action: Filtrēt pēc darbības + filter_by_user: Filtrēt pēc lietotāja + title: Auditācijas pieraksti + announcements: + destroyed_msg: Paziņojums ir veiksmīgi izdzēsts! + edit: + title: Rediģēt paziņojumu + empty: Neviens paziņojums netika atrasts. + live: Dzīvajā + new: + create: Izveidot paziņojumu + title: Jauns paziņojums + publish: Publicēt + published_msg: Paziņojums ir veiksmīgi publicēts! + scheduled_for: Plānots uz %{time} + scheduled_msg: Paziņojums ieplānots publicēšanai! + title: Paziņojumi + unpublish: Atcelt publicēšanu + unpublished_msg: Paziņojuma publicēšana veiksmīgi atcelta! + updated_msg: Paziņojums ir veiksmīgi atjaunināts! + custom_emojis: + assign_category: Piešķirt kategoriju + by_domain: Domēns + copied_msg: Emocijas vietējā kopija ir veiksmīgi izveidota + copy: Kopēt + copy_failed_msg: Nevarēja izveidot šīs emocijzīmes vietējo kopiju + create_new_category: Izveidot jaunu kategoriju + created_msg: Emocijzīme veiksmīgi izveidota! + delete: Dzēst + destroyed_msg: Emocijzīme ir veiksmīgi iznīcināta! + disable: Atspējot + disabled: Atspējots + disabled_msg: Šī emocijzīme ir veiksmīgi atspējota + emoji: Emocijzīmes + enable: Iespējot + enabled: Iespējots + enabled_msg: Šī emocijzīme ir veiksmīgi iespējota + image_hint: PNG līdz 50 KB + list: Saraksts + listed: Uzrakstītas + new: + title: Pievienojiet jaunas pielāgotās emocijzīmes + not_permitted: Tev nav atļauts veikt šo darbību + overwrite: Pārrakstīt + shortcode: Īskods + shortcode_hint: Vismaz 2 rakstzīmes, tikai burtciparu rakstzīmes un pasvītrojumi + title: Pielāgotās emocijzīmes + uncategorized: Nekategorizētās + unlist: Izslēgt + unlisted: Neminētie + update_failed_msg: Nevarēja atjaunināt šo emocijzīmi + updated_msg: Emocijzīme veiksmīgi atjaunināta! + upload: Augšupielādēt + dashboard: + active_users: aktīvie lietotāji + software: Programmatūra + space: Vietas izmantošana + title: Panelis + domain_allows: + add_new: Atļaut federāciju ar domēnu + created_msg: Domēns ir veiksmīgi atļauts federācijai + destroyed_msg: Domēns ir aizliegts federācijai + undo: Aizliegt federāciju ar domēnu + domain_blocks: + add_new: Pievienot jaunu domēna bloku + created_msg: Domēna bloķēšana tagad tiek apstrādāta + destroyed_msg: Domēna bloķēšana ir atsaukta + domain: Domēns + edit: Rediģēt domēna bloķēšanu + email_domain_blocks: + title: Bloķētie e-pasta domēni + follow_recommendations: + description_html: "Sekošana rekomendācijām palīdz jaunajiem lietotājiem ātri atrast interesantu saturu. Ja lietotājs nav pietiekami mijiedarbojies ar citiem, lai izveidotu personalizētus ieteikumus, ieteicams izmantot šos kontus. Tie tiek pārrēķināti katru dienu, izmantojot vairākus kontus ar visaugstākajām pēdējā laika saistībām un vislielāko vietējo sekotāju skaitu noteiktā valodā." + language: Valodai + status: Statuss + suppress: Apspiest sekošanas rekomendāciju + suppressed: Apspiestie + title: Sekošanas rekomendācijas + unsuppress: Atjaunot sekošanas rekomendāciju + instances: + back_to_all: Visas + back_to_limited: Ierobežotās + back_to_warning: Brīdinājums + by_domain: Domēns + delivery: + all: Visas + clear: Notīrīt piegādes kļūdas + restart: Pārstartēt piegādi + stop: Apturēt piegādi + title: Piegāde + unavailable: Nav pieejams + unavailable_message: Piegāde nav iespējama + warning: Brīdinājums + delivery_available: Piegāde ir iespējama + delivery_error_days: Piegādes kļūdu dienas + delivery_error_hint: Ja piegāde nav iespējama %{count} dienas, tā tiks automātiski atzīmēta kā nepiegādājama. + empty: Domēni nav atrasti. + moderation: + all: Visas + limited: Ierobežotās + title: Moderācija + private_comment: Privāts komentārs + public_comment: Publisks komentārs + title: Federācija + total_blocked_by_us: Mūsu bloķēta + total_followed_by_them: Viņiem seko + total_followed_by_us: Mums seko + total_reported: Ziņojumi par viņiem + total_storage: Mediju pielikumi + invites: + deactivate_all: Deaktivēt visu + filter: + all: Visus + available: Pieejams + expired: Derīguma termiņš beidzies + title: Filtrēt + title: Uzaicinājumi + ip_blocks: + add_new: Izveidot noteikumu + created_msg: Veiksmīgi pievienots jauns IP noteikums + delete: Dzēst + expires_in: + '1209600': 2 nedēļas + '15778476': 6 mēneši + '2629746': 1 mēnesis + '31556952': 1 gads + '86400': 1 day + '94670856': 3 years + reports: + title: Ziņojumi + unassign: Atsaukt + unresolved: Neatrisinātie + updated_at: Atjaunināts + rules: + add_new: Pievienot noteikumu + delete: Dzēst + description_html: Lai gan lielākā daļa apgalvo, ka ir izlasījuši pakalpojumu sniegšanas noteikumus un piekrīt tiem, parasti cilvēki to izlasa tikai pēc problēmas rašanās. Padariet vienkāršāku sava servera noteikumu uztveršanu, veidojot tos vienkāršā sarakstā pa punktiem. Centieties, lai atsevišķi noteikumi būtu īsi un vienkārši, taču arī nesadaliet tos daudzos atsevišķos vienumos. + edit: Rediģēt noteikumu + empty: Servera noteikumi vēl nav definēti. + title: Servera noteikumi + settings: + activity_api_enabled: + desc_html: Vietēji publicēto ziņu, aktīvo lietotāju un jauno reģistrāciju skaits nedēļas kopās + title: Publicējiet apkopotu statistiku par lietotāju darbībām API + bootstrap_timeline_accounts: + desc_html: Atdaliet vairākus lietotājvārdus ar komatu. Tiks garantēts, ka šie konti tiks parādīti ieteikumos + title: Iesaki šos kontus jaunajiem lietotājiem + contact_information: + email: Lietišķais e-pasts + username: Saziņas lietotājvārds + custom_css: + desc_html: Maini izskatu, izmantojot CSS, kas ielādēta katrā lapā + title: Pielāgota CSS + default_noindex: + desc_html: Ietekmē visus lietotājus, kuri paši nav mainījuši šo iestatījumu + title: Pēc noklusējuma lietotāji būs atteikušies no meklētājprogrammu indeksēšanas + domain_blocks: + all: Visiem + disabled: Nevienam + title: Rādīt domēnu bloķēšanas + users: Vietējiem reģistrētiem lietotājiem + domain_blocks_rationale: + title: Rādīt pamatojumus + hero: + desc_html: Parādīts pirmajā lapā. Ieteicams vismaz 600x100 pikseļus. Ja tas nav iestatīts, atgriežas servera sīktēlā + title: Varoņa attēls + mascot: + desc_html: Parādīts vairākās lapās. Ieteicams vismaz 293 × 205 pikseļi. Ja tas nav iestatīts, tiek atgriezts noklusējuma talismans + title: Talismana attēls + peers_api_enabled: + desc_html: Domēna vārdi, ar kuriem šis serveris ir saskāries fediversā + title: Publicēt API atklāto serveru sarakstu + preview_sensitive_media: + desc_html: Saites priekšskatījumus citās vietnēs parādīs kā sīktēlu pat tad, ja medijs ir atzīmēts kā sensitīvs + title: Parādīt sensitīvos medijus OpenGraph priekšskatījumos + profile_directory: + desc_html: Atļaut lietotājiem būt atklājamiem + title: Iespējot profila direktoriju + registrations: + closed_message: + desc_html: Tiek parādīts sākumlapā, kad reģistrācija ir slēgta. Tu vari izmantot HTML tagus + title: Paziņojums par slēgtu reģistrāciju + deletion: + desc_html: Atļaut ikvienam dzēst savu kontu + title: Atvērt konta dzēšanu + min_invite_role: + disabled: Nevienam + title: Atļaut uzaicinājumus + require_invite_text: + desc_html: 'Ja reģistrācijai nepieciešama manuāla apstiprināšana, izdari, lai teksta: “Kāpēc vēlaties pievienoties?” ievade ir obligāta, nevis neobligāts' + title: Pieprasīt jauniem lietotājiem ievadīt pievienošanās iemeslu + registrations_mode: + modes: + approved: Reģistrācijai nepieciešams apstiprinājums + none: Neviens nevar reģistrēties + open: Jebkurš var reģistrēties + title: Reģistrācijas režīms + show_known_fediverse_at_about_page: + desc_html: Ja šī funkcija ir atspējota, tā ierobežo publisko ziņu lentu, kas ir saistīta ar galveno lapu, lai parādītu tikai vietējo saturu + title: Iekļaut federēto saturu neautentificētā publiskā ziņu lentas lapā + show_staff_badge: + desc_html: Parādiet personāla emblēmu lietotāja lapā + title: Administrēšana + warning_presets: + add_new: Pievienot jaunu + delete: Dzēst + edit_preset: Labot iepriekš iestatītus brīdinājumus + empty: Tu vēl neesi definējis iepriekš iestatītos brīdinājumus. + title: Pārvaldīt brīdinājuma iestatījumus + admin_mailer: + new_pending_account: + body: Sīkāka informācija par jauno kontu ir sniegta zemāk. Tu vari apstiprināt vai noraidīt šo pieteikumu. errors: '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. diff --git a/config/locales/ml.yml b/config/locales/ml.yml index 2f24ee3ece..1d6cbaf22d 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -2,12 +2,13 @@ ml: about: about_this: കുറിച്ച് - api: API + api: എപിഐ apps: മൊബൈൽ ആപ്പുകൾ contact: ബന്ധപ്പെടുക contact_missing: സജ്ജമാക്കിയിട്ടില്ല contact_unavailable: ലഭ്യമല്ല discover_users: ഉപയോഗ്‌താക്കളെ കണ്ടെത്തുക + documentation: വിവരണം get_apps: മൊബൈൽ ആപ്പ് പരീക്ഷിക്കുക learn_more: കൂടുതൽ പഠിക്കുക privacy_policy: സ്വകാര്യതാ നയം @@ -20,6 +21,7 @@ ml: unavailable_content_description: domain: സെർവർ reason: കാരണം + suspended_title: താൽക്കാലികമായി നിർത്തിവെച്ച സെർവറുകൾ what_is_mastodon: എന്താണ് മാസ്റ്റഡോൺ? accounts: follow: പിന്തുടരുക @@ -69,11 +71,17 @@ ml: edit: തിരുത്തുക email: ഇമെയിൽ header: തലക്കെട്ട് + joined: ജോയിൻ ചെയ്‌തിരിക്കുന്നു location: all: എല്ലാം + local: പ്രാദേശികം + title: സ്ഥലം + login_status: ലോഗിൻ അവസ്ഥ moderation: active: സജീവമാണ് all: എല്ലാം + suspended: താൽക്കാലികമായി നിർത്തി + title: മധ്യസ്ഥന്‍ resend_confirmation: send: സ്ഥിരീകരണ ഇമെയിൽ വീണ്ടും അയയ്ക്കുക success: സ്ഥിരീകരണ ഇമെയിൽ വിജയകരമായി അയച്ചു! @@ -98,11 +106,7 @@ ml: delete: ഇല്ലാതാക്കുക emoji: ഇമോജി dashboard: - feature_profile_directory: പ്രൊഫൈൽ ഡയറക്ടറി - features: സവിശേഷതകൾ title: ഡാഷ്ബോർഡ് - total_users: മൊത്തം ഉപയോക്താക്കൾ - trends: ട്രെൻഡുകൾ email_domain_blocks: add_new: പുതിയത് ചേര്‍ക്കുക delete: ഇല്ലാതാക്കുക diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 089707d03b..3305c17c9d 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1,82 +1,138 @@ --- ms: about: - about_hashtag_html: Terdapat toot awam yang ditanda dengan #%{hashtag}. Anda boleh berinteraksi dengan mereka jika anda mempunyai akaun di mana-mana dunia persekutuan Mastodon. - about_mastodon_html: Mastodon ialah rangkaian sosial berasaskan protokol web terbuka dan perisian percuma bersumber terbuka. Ianya tak terpusat seperti emel. - about_this: Mengenai Kami + about_hashtag_html: Ini semua hantaran awam yang ditandakan dengan #%{hashtag}. Anda boleh berinteraksi dengan mereka jika anda mempunyai akaun di mana-mana dunia persekutuan. + about_mastodon_html: 'Rangkaian sosial masa hadapan: Tiada iklan, tiada pengawasan korporat, reka bentuk beretika, dan desentralisasi! Miliki data anda dengan Mastodon!' + about_this: Perihal + active_count_after: aktif + active_footnote: Pengguna Aktif Bulanan (MAU) administered_by: 'Ditadbir oleh:' + api: API apps: Aplikasi mudah alih + apps_platforms: Guna Mastodon daripada iOS, Android dan platform yang lain + browse_directory: Layari direktori profil dan tapis mengikut minat + browse_local_posts: Layari strim langsung hantaran awam daripada pelayan ini + browse_public_posts: Layari strim langsung hantaran awam di Mastodon contact: Hubungi kami contact_missing: Tidak ditetapkan contact_unavailable: Tidak tersedia + discover_users: Terokai pengguna documentation: Pendokumenan + federation_hint_html: Dengan akaun di %{instance} anda akan mampu mengikuti orang di mana-mana pelayan Mastodon dan lebih lagi. + get_apps: Cuba aplikasi mudah alih hosted_on: Mastodon dihoskan di %{domain} + instance_actor_flash: | + Akaun ini ialah pelaku maya yang digunakan untuk mewakili pelayan itu sendiri dan bukannya mana-mana pengguna individu. + Ia digunakan untuk tujuan persekutuan dan tidak patut disekat melainkan anda ingin menyekat keseluruhan tika, yang mana anda sepatutnya gunakan sekatan domain. learn_more: Ketahui lebih lanjut privacy_policy: Polisi privasi + rules: Peraturan pelayan + rules_html: 'Di bawah ini ringkasan peraturan yang anda perlu ikuti jika anda ingin mempunyai akaun di pelayan Mastodon yang ini:' + see_whats_happening: Lihat apa yang sedang berlaku + server_stats: 'Statistik pelayan:' source_code: Kod sumber status_count_after: - other: status - status_count_before: Telah menulis + other: hantaran + status_count_before: Siapa terbitkan + tagline: Ikuti rakan lama dan terokai rakan baharu terms: Terma perkhidmatan + unavailable_content: Pelayan disederhanakan + unavailable_content_description: + domain: Pelayan + reason: Sebab + rejecting_media: 'Fail-fail media daripada pelayan-pelayan ini tidak akan diproses atau disimpan, dan tiada gambar kecil yang akan dipaparkan, memerlukan anda untuk klik fail asal:' + rejecting_media_title: Media ditapis + silenced: 'Hantaran daripada pelayan-pelayan ini akan disembunyikan di garis masa dan perbualan awam, dan tiada pemberitahuan yang akan dijana daripada interaksi pengguna mereka, melainkan anda mengikuti mereka:' + silenced_title: Pelayan didiamkan + suspended: 'Tiada data daripada pelayan-pelayan ini yang akan diproses, disimpan atau ditukar, membuatkan sebarang interaksi atau perhubungan dengan pengguna daripada pelayan-pelayan ini menjadi mustahil:' + suspended_title: Pelayan digantung + unavailable_content_html: Mastodon secara amnya membenarkan anda melihat kandungan daripada dan berinteraksi dengan pengguna daripada mana-mana pelayan dalam dunia persekutuan. Ini pengecualian yang telah dilakukan di pelayan ini secara khususnya. user_count_after: other: pengguna - user_count_before: Rumah kepada + user_count_before: Rumah bagi what_is_mastodon: Apakah itu Mastodon? accounts: choices_html: 'Pilihan %{name}:' + endorsements_hint: Anda boleh syorkan orang yang anda ikuti menggunakan antara muka sesawang, dan mereka akan ditunjukkan di sini. + featured_tags_hint: Anda boleh mempromosikan tanda pagar khusus yang akan dipaparkan di sini. follow: Ikut followers: other: Pengikut following: Mengikuti + instance_actor_flash: Akaun ini ialah pelaku maya yang digunakan untuk mewakili pelayan itu sendiri dan bukan mana-mana pengguna individu. Ia digunakan untuk tujuan persekutuan dan tidak patut digantung. joined: Sertai pada %{date} + last_active: aktif terakhir link_verified_on: Pemilikan pautan ini diperiksa pada %{date} + media: Media moved_html: "%{name} telah berpindah ke %{new_profile_link}:" network_hidden: Maklumat ini tidak tersedia + never_active: Belum pernah nothing_here: Tiada apa-apa di sini! people_followed_by: Orang yang %{name} ikuti people_who_follow: Orang yang mengikut %{name} pin_errors: following: Anda mestilah sudah mengikuti orang yang anda ingin syorkan posts: - other: Toot - posts_tab_heading: Toot - posts_with_replies: Toot dan maklum balas - reserved_username: Nama pengguna ini terpelihara + other: Hantaran + posts_tab_heading: Hantaran + posts_with_replies: Hantaran dan balasan roles: - moderator: Pengawal + admin: Pentadbir + bot: Bot + group: Kumpulan + moderator: Penyederhana + unavailable: Profil tidak tersedia unfollow: Nyahikut admin: + account_actions: + action: Ambil tindakan + title: Ambil tindakan penyederhanaan ke atas %{acct} account_moderation_notes: - create: Tinggalkan nota - created_msg: Nota kawalan telah berjaya dicipta! + create: Tinggalkan catatan + created_msg: Catatan penyederhanaan telah berjaya dicipta! delete: Padam - destroyed_msg: Nota kawalan telah berjaya dipadam! + destroyed_msg: Catatan penyederhanaan telah berjaya dipadam! accounts: - are_you_sure: Anda pasti? + add_email_domain_block: Sekat domain e-mel + approve: Luluskan + approve_all: Luluskan semua + approved_msg: Berjaya meluluskan permohonan pendaftaran %{username} + are_you_sure: Adakah anda pasti? + avatar: Avatar + by_domain: Domain change_email: - changed_msg: Emel akaun telah berjaya ditukar! - current_email: Emel Semasa - label: Tukar Emel - new_email: Emel Baru - submit: Tukar Emel - title: Tukar Emel untuk %{username} + changed_msg: E-mel akaun telah berjaya ditukar! + current_email: E-mel semasa + label: Ubah e-mel + new_email: E-mel baharu + submit: Ubah e-mel + title: Ubah e-mel untuk %{username} confirm: Sahkan confirmed: Disahkan confirming: Mengesahkan - demote: Turunkan pangkat - disable: Lumpuhkan + delete: Padam data + deleted: Dipadamkan + demote: Turunkan taraf + destroyed_msg: Data %{username} kini menunggu giliran untuk dipadam sebentar lagi + disable: Bekukan disable_two_factor_authentication: Lumpuhkan 2FA - disabled: Dilumpuhkan + disabled: Dibekukan display_name: Nama paparan - edit: Tukar - email: Emel - email_status: Status Emel - enable: Bolehkan - enabled: Dibolehkan + domain: Domain + edit: Sunting + email: E-mel + email_status: Status e-mel + enable: Nyahbekukan + enabled: Didayakan + enabled_msg: Berjaya menyahbekukan akaun %{username} followers: Pengikut follows: Mengikuti + header: Pengepala inbox_url: URL mesej masuk + invite_request_text: Sebab untuk menyertai + invited_by: Diundang oleh ip: Alamat IP + joined: Sertai pada location: all: Semua local: Tempatan @@ -84,167 +140,326 @@ ms: title: Kedudukan login_status: Status log masuk media_attachments: Lampiran media - memorialize: Tukarkan menjadi akaun peringatan + memorialize: Tukarkan menjadi akaun kenangan + memorialized: Dikenang + memorialized_msg: Berjaya mengubah %{username} menjadi akaun kenangan moderation: + active: Aktif all: Semua - silenced: Disenyapkan + pending: Menunggu + silenced: Didiamkan suspended: Digantungkan - title: Kawalan - moderation_notes: Nota kawalan + title: Penyederhanaan + moderation_notes: Catatan penyederhana most_recent_activity: Aktiviti terbaru - most_recent_ip: IP terbaru - no_limits_imposed: Tiada had dikuatkuasakan + most_recent_ip: Alamat IP terbaru + no_account_selected: Tiada akaun diubah kerana tiada yang dipilih + no_limits_imposed: Tiada pengehadan dikenakan not_subscribed: Tiada langganan + pending: Menunggu semak semula perform_full_suspension: Gantung - promote: Naikkan pangkat + promote: Naikkan taraf protocol: Protokol public: Awam push_subscription_expires: Langganan PuSH tamat tempoh - redownload: Segarkan semula avatar + redownload: Segarkan semula profil + redownloaded_msg: Berjaya segarkan semula profil %{username} daripada asalnya + reject: Tolak + reject_all: Tolak semua + rejected_msg: Berjaya menolak permohonan pendaftaran %{username} remove_avatar: Buang avatar + remove_header: Buang pengepala + removed_avatar_msg: Berjaya membuang imej avatar %{username} + removed_header_msg: Berjaya membuang imej pengepala %{username} resend_confirmation: already_confirmed: Pengguna ini telah disahkan - send: Hantar semula emel pengesahan - success: Emel pengesahan telah berjaya dihantar! - reset: Set semula - reset_password: Set semula kata laluan + send: Hantar semula e-mel pengesahan + success: E-mel pengesahan telah berjaya dihantar! + reset: Tetapkan semula + reset_password: Tetapkan semula kata laluan resubscribe: Langgan semula role: Kebenaran roles: admin: Pentadbir - moderator: Pengawal + moderator: Penyederhana staff: Kakitangan user: Pengguna search: Cari - shared_inbox_url: URL Peti Masuk Berkongsi + search_same_email_domain: Pengguna lain dengan domain e-mel yang sama + search_same_ip: Pengguna lain dengan alamat IP yang sama + sensitive: Sensitif + sensitized: ditandakan sebagai sensitif + shared_inbox_url: URL peti masuk berkongsi show: - created_reports: Laporan yang dicipta oleh akaun ini - targeted_reports: Laporan yang dicipta berkaitan akaun ini - silence: Senyap - silenced: Disenyapkan - statuses: Status + created_reports: Laporan dicipta oleh akaun ini + targeted_reports: Laporan dicipta berkaitan akaun ini + silence: Hadkan + silenced: Dihadkan + statuses: Hantaran subscribe: Langgan suspended: Digantung + suspension_irreversible: Data akaun ini telah dipadam secara kekal. Anda boleh nyahgantungkannya untuk membuatkan akaun ini boleh digunakan semula tetapi data lama tidak akan diperolehi. + suspension_reversible_hint_html: Akaun ini telah digantung, dan datanya akan dibuang pada %{date}. Sebelum tarikh itu, akaun ini boleh diperoleh semula tanpa kesan buruk. Jika anda mahu memadamkan kesemua data akaun ini serta-merta, anda boleh melakukannya di bawah. + time_in_queue: Menunggu giliran %{time} title: Akaun - unconfirmed_email: Emel Belum Disahkan - undo_silenced: Buang senyap - undo_suspension: Buang penggantungan + unconfirmed_email: E-mel belum disahkan + undo_sensitized: Nyahtanda sensitif + undo_silenced: Nyahdiamkan + undo_suspension: Nyahgantungkan + unsilenced_msg: Berjaya menjadikan akaun %{username} tidak terhad unsubscribe: Buang langganan + unsuspended_msg: Berjaya menyahgantungkan akaun %{username} username: Nama pengguna + view_domain: Lihat ringkasan untuk domain + warn: Beri amaran + web: Sesawang + whitelisted: Dibenarkan untuk persekutuan action_logs: + action_types: + assigned_to_self_report: Buat Laporan + change_email_user: Ubah E-mel untuk Pengguna + confirm_user: Sahkan Pengguna + create_account_warning: Cipta Amaran + create_announcement: Cipta Pengumuman + create_custom_emoji: Cipta Emoji Tersendiri + create_domain_allow: Cipta Pelepasan Domain + create_domain_block: Cipta Penyekatan Domain + create_email_domain_block: Cipta Penyekatan Domain E-mel + create_ip_block: Cipta peraturan alamat IP + create_unavailable_domain: Cipta Domain Tidak Tersedia + demote_user: Turunkan Taraf Pengguna + destroy_announcement: Padam Pengumuman + destroy_custom_emoji: Padam Emoji Tersendiri + destroy_domain_allow: Padam Pelepasan Domain + destroy_domain_block: Padam Penyekatan Domain + destroy_email_domain_block: Padam penyekatan domain e-mel + destroy_ip_block: Padam peraturan alamat IP + destroy_status: Padam Hantaran + destroy_unavailable_domain: Padam Domain Tidak Tersedia + disable_2fa_user: Nyahdayakan 2FA + disable_custom_emoji: Nyahdayakan Emoji Tersendiri + disable_user: Nyahdayakan Pengguna + enable_custom_emoji: Dayakan Emoji Tersendiri + enable_user: Dayakan Pengguna + memorialize_account: Jadikan Akaun Kenangan + promote_user: Naikkan Taraf Pengguna + remove_avatar_user: Buang Avatar + reopen_report: Buka Semula Laporan + reset_password_user: Tetapkan Semula Kata Laluan + resolve_report: Buat Keputusan Laporan + sensitive_account: Tandakan media di akaun anda sebagai sensitif + silence_account: Diamkan Akaun + suspend_account: Gantungkan Akaun + unassigned_report: Menyahtugaskan Laporan + unsensitive_account: Nyahtanda media di akaun anda sebagai sensitif + unsilence_account: Nyahdiamkan Akaun + unsuspend_account: Nyahgantungkan Akaun + update_announcement: Kemas Kini Pengumuman + update_custom_emoji: Kemas Kini Emoji Tersendiri + update_domain_block: Kemas Kini Penyekatan Domain + update_status: Kemas Kini Hantaran actions: - assigned_to_self_report: "%{name} memberikan laporan %{target} kepada diri mereka sendiri" - change_email_user: "%{name} menukar alamat emel pengguna %{target}" - confirm_user: "%{name} mengesahkan alamat emel pengguna %{target}" - create_custom_emoji: "%{name} memuat naik emoji baru %{target}" - create_domain_block: "%{name} menyekat domain %{target}" - create_email_domain_block: "%{name} menyenaraihitamkan domain emel %{target}" - demote_user: "%{name} menurunkan pangkat pengguna %{target}" - destroy_custom_emoji: "%{name} membuang emoji %{target}" - destroy_domain_block: "%{name} membuang sekatan domain %{target}" - destroy_email_domain_block: "%{name} menyenaraiputihkan domain emel %{target}" - destroy_status: "%{name} membuang status oleh %{target}" - disable_2fa_user: "%{name} melumpuhkan keperluan dua faktor untuk pengguna %{target}" - disable_custom_emoji: "%{name} melumpuhkan emoji %{target}" - disable_user: "%{name} melumpuhkan log masuk untuk pengguna %{target}" - enable_custom_emoji: "%{name} membolehkan emoji %{target}" - enable_user: "%{name} membolehkan log masuk untuk pengguna %{target}" - memorialize_account: "%{name} menukarkan akaun %{target} menjadi halaman peringatan" - promote_user: "%{name} menaikkan pangkat pengguna %{target}" - remove_avatar_user: "%{name} membuang avatar pengguna %{target}" - reopen_report: "%{name} membuka semula laporan %{target}" - reset_password_user: "%{name} set semula kata laluan pengguna %{target}" - resolve_report: "%{name} menyelesaikan laporan %{target}" - silence_account: "%{name} menyenyapkan akaun %{target}" - suspend_account: "%{name} menggantung akaun %{target}" - unassigned_report: "%{name} menyahtugaskan laporan %{target}" - unsilence_account: "%{name} menyahsenyapkan akaun %{target}" - unsuspend_account: "%{name} menyahgantungkan akaun %{target}" - update_custom_emoji: "%{name} mengemaskini emoji %{target}" - update_status: "%{name} mengemaskini status oleh %{target}" - deleted_status: "(status telah dipadam)" + assigned_to_self_report_html: "%{name} menugaskan laporan %{target} kepada dirinya sendiri" + change_email_user_html: "%{name} telah mengubah alamat e-mel pengguna %{target}" + confirm_user_html: "%{name} telah mengesahkan alamat e-mel pengguna %{target}" + create_account_warning_html: "%{name} telah memberi amaran kepada %{target}" + create_announcement_html: "%{name} telah mencipta pengumuman baharu %{target}" + create_custom_emoji_html: "%{name} telah memuat naik emoji baharu %{target}" + create_domain_allow_html: "%{name} membenarkan persekutuan dengan domain %{target}" + create_domain_block_html: "%{name} telah menyekat domain %{target}" + create_email_domain_block_html: "%{name} telah menyekat domain e-mel %{target}" + create_ip_block_html: "%{name} telah mencipta peraturan alamat IP %{target}" + create_unavailable_domain_html: "%{name} telah menghentikan penghantaran ke domain %{target}" + demote_user_html: "%{name} telah menurunkan taraf pengguna %{target}" + destroy_announcement_html: "%{name} telah memadamkan pengumuman %{target}" + destroy_custom_emoji_html: "%{name} telah memusnahkan emoji %{target}" + destroy_domain_allow_html: "%{name} telah membuang kebenaran persekutuan dengan domain %{target}" + destroy_domain_block_html: "%{name} telah menyahsekat domain %{target}" + destroy_email_domain_block_html: "%{name} telah menyahsekat domain e-mel %{target}" + destroy_ip_block_html: "%{name} telah memadamkan peraturan untuk alamat IP %{target}" + destroy_status_html: "%{name} telah membuang hantaran oleh %{target}" + destroy_unavailable_domain_html: "%{name} telah menyambung penghantaran ke domain %{target}" + disable_2fa_user_html: "%{name} menyahdayakan keperluan dua faktor bagi pengguna %{target}" + disable_custom_emoji_html: "%{name} telah menyahdayakan emoji %{target}" + disable_user_html: "%{name} telah menyahdayakan log masuk bagi pengguna %{target}" + enable_custom_emoji_html: "%{name} telah mendayakan emoji %{target}" + enable_user_html: "%{name} telah mendayakan log masuk untuk pengguna %{target}" + memorialize_account_html: "%{name} telah mengubah akaun %{target} menjadi halaman kenangan" + promote_user_html: "%{name} telah menaikkan taraf pengguna %{target}" + remove_avatar_user_html: "%{name} telah membuang avatar %{target}" + reopen_report_html: "%{name} telah membuka semula laporan %{target}" + reset_password_user_html: "%{name} telah menetapkan semula kata laluan pengguna %{target}" + resolve_report_html: "%{name} telah menyelesaikan laporan %{target}" + sensitive_account_html: "%{name} telah menanda media %{target} sebagai sensitif" + silence_account_html: "%{name} telah mendiamkan akaun %{target}" + suspend_account_html: "%{name} telah menggantung akaun %{target}" + unassigned_report_html: "%{name} telah menyahtugaskan laporan %{target}" + unsensitive_account_html: "%{name} telah menyahtanda media %{target} sebagai sensitif" + unsilence_account_html: "%{name} telah menyahdiamkan akaun %{target}" + unsuspend_account_html: "%{name} telah menyahgantungkan akaun %{target}" + update_announcement_html: "%{name} telah mengemaskini pengumuman %{target}" + update_custom_emoji_html: "%{name} telah mengemaskini emoji %{target}" + update_domain_block_html: "%{name} telah mengemaskini penyekatan domain untuk %{target}" + update_status_html: "%{name} telah mengemaskini hantaran oleh %{target}" + deleted_status: "(hantaran telah dipadam)" + empty: Tiada log dijumpai. + filter_by_action: Tapis mengikut tindakan + filter_by_user: Tapis mengikut pengguna title: Log audit + announcements: + destroyed_msg: Pengumuman berjaya dipadam! + edit: + title: Sunting pengumuman + empty: Tiada pengumuman dijumpai. + live: Langsung + new: + create: Cipta pengumuman + title: Pengumuman baharu + publish: Terbitkan + published_msg: Pengumuman berjaya diterbitkan! + scheduled_for: Dijadualkan untuk %{time} + scheduled_msg: Pengumuman dijadualkan untuk terbitan! + title: Pengumuman + unpublish: Nyahterbit + unpublished_msg: Pengumuman berjaya dinyahterbitkan! + updated_msg: Pengumuman berjaya dikemaskini! custom_emojis: + assign_category: Menugaskan kategori + by_domain: Domain copied_msg: Telah berjaya mencipta salinan tempatan emoji copy: Salin copy_failed_msg: Tidak dapat membuat salinan tempatan emoji tersebut + create_new_category: Cipta kategori baharu created_msg: Emoji berjaya dicipta! delete: Padam - destroyed_msg: Emoji berjaya dipadam! - disable: Lumpuhkan - disabled_msg: Emoji tersebut berjaya dilumpuhkan - enable: Bolehkan - enabled_msg: Emoji tersebut berjaya dibolehkan + destroyed_msg: Emoji berjaya dimusnahkan! + disable: Nyahdayakan + disabled: Dinyahdayakan + disabled_msg: Emoji tersebut berjaya dinyahdayakan + emoji: Emoji + enable: Dayakan + enabled: Didayakan + enabled_msg: Emoji tersebut berjaya didayakan image_hint: PNG, maksimum 50KB + list: Senarai listed: Disenaraikan new: - title: Tambah emoji sendiri baru + title: Tambah emoji sendiri baharu + not_permitted: Anda tidak dibenarkan untuk membuat tindakan ini overwrite: Tulis ganti shortcode: Kod pendek shortcode_hint: Sekurang-kurangnya 2 aksara, hanya aksara angka abjad dan garis bawah title: Emoji sendiri - unlisted: Tidak disenaraikan + uncategorized: Tidak dikategorikan + unlist: Nyahsenaraikan + unlisted: Dinyahsenaraikan update_failed_msg: Tidak boleh mengemaskini emoji tersebut updated_msg: Emoji berjaya dikemaskini! upload: Muat naik dashboard: - backlog: tugasan tunggakan - config: Tatarajah - feature_deletions: Pemadaman akaun - feature_invites: Pautan undangan - feature_registrations: Pendaftaran - feature_relay: Geganti persekutuan - features: Ciri-ciri - hidden_service: Persekutuan dengan perkhidmatan tersembunyi - open_reports: laporan belum selesai - recent_users: Pengguna terbaru - search: Carian teks penuh - single_user_mode: Mod pengguna tunggal software: Perisian space: Kegunaan ruang title: Papan pemuka - total_users: pengguna keseluruhannya - trends: Trend - week_interactions: interaksi minggu ini - week_users_active: aktif minggu ini - week_users_new: pengguna minggu ini + domain_allows: + add_new: Benarkan persekutuan dengan domain + created_msg: Domain telah berjaya dibenarkan untuk persekutuan + destroyed_msg: Domain telah dibuang kebenaran daripada persekutuan + undo: Buang kebenaran persekutuan dengan domain domain_blocks: - add_new: Tambah + add_new: Tambah penyekatan domain baharu created_msg: Sekatan domain sedang diproses - destroyed_msg: Sekatan domain telah dibatalkan + destroyed_msg: Sekatan domain telah diundurkan + domain: Domain + edit: Sunting penyekatan domain + existing_domain_block_html: Anda telah mengenakan pengehadan yang lebih tegas ke atas %{name}, anda perlu menyahsekatinya dahulu. new: create: Cipta sekatan - hint: Sekatan domain tidak akan menghindarkan penciptaan entri akaun dalam pangkalan data, tetapi akan diberikan kaedah kawalan khusus tertentu pada akaun-akaun tersebut secara retroaktif dan automatik. + hint: Sekatan domain tidak akan menghindarkan penciptaan entri akaun dalam pangkalan data, tetapi akan dikenakan kaedah penyederhanaan khusus tertentu pada akaun-akaun tersebut secara retroaktif dan automatik. severity: - desc_html: "Senyapkan akan membuatkan hantaran akaun tidak kelihatan kepada sesiapa yang tidak mengikut mereka. Gantungkan akan membuang semua kandungan, media, dan data profil akaun tersebut. Gunakan Tiada jika anda hanya ingin menolak fail media." + desc_html: "Diamkan akan membuatkan hantaran akaun tidak kelihatan kepada sesiapa yang tidak mengikut mereka. Gantungkan akan membuang kesemua kandungan, media, dan data profil akaun tersebut. Gunakan Tiada jika anda hanya ingin menolak fail media." noop: Tiada - silence: Senyapkan + silence: Diamkan suspend: Gantungkan - title: Sekatan domain baru + title: Sekatan domain baharu + obfuscate: Mengaburkan nama domain + obfuscate_hint: Mengaburkan nama domain secara separa dalam senarai sekiranya pengehadan pengiklanan senarai domain didayakan + private_comment: Ulasan peribadi + private_comment_hint: Ulasan mengenai pengehadan domain ini untuk kegunaan dalaman penyederhana. + public_comment: Ulasan awam + public_comment_hint: Ulasan mengenai pengehadan domain ini untuk orang awam, sekiranya pengehadan pengiklanan senarai domain didayakan. reject_media: Tolak fail media - reject_media_hint: Buang fail media yang disimpan di sini dan menolak sebarang muat turun pada masa depan. Tidak berkaitan dengan penggantungan + reject_media_hint: Buang fail media yang disimpan secara tempatan dan tolak sebarang muat turun pada masa hadapan. Tidak terpakai untuk penggantungan reject_reports: Tolak laporan - reject_reports_hint: Abaikan semua laporan daripada domain ini. Tidak dikira untuk penggantungan + reject_reports_hint: Abaikan semua laporan daripada domain ini. Tidak terpakai untuk penggantungan + rejecting_media: menolak fail media + rejecting_reports: menolak laporan + severity: + silence: didiamkan + suspend: digantungkan show: affected_accounts: other: "%{count} akaun dalam pangkalan data menerima kesan" retroactive: - silence: Buang penyenyapan semua akaun sedia ada daripada domain ini - suspend: Buang penggantungan semua akaun sedia ada daripada domain ini - title: Buang sekatan domain %{domain} - undo: Buang - undo: Buang + silence: Nyahdiamkan akaun yang menerima kesan sedia ada daripada domain ini + suspend: Nyahgantungkan akaun yang menerima kesan sedia ada daripada domain ini + title: Undurkan sekatan domain untuk %{domain} + undo: Undurkan + undo: Undurkan penyekatan domain + view: Lihat penyekatan domain email_domain_blocks: - add_new: Tambah - created_msg: Berjaya menambah domain emel ke dalam senarai hitam + add_new: Tambah baharu + created_msg: Telah berjaya menyekat domain e-mel delete: Padam - destroyed_msg: Berjaya memadam domain emel daripada senarai hitam + destroyed_msg: Telah berjaya menyahsekat domain e-mel + domain: Domain + empty: Tiada domain e-mel sedang disekat. + from_html: dari %{domain} new: create: Tambah domain - title: Entri senarai hitam emel baru - title: Senarai hitam emel + title: Sekat domain e-mel baharu + title: Domain e-mel disekat + follow_recommendations: + description_html: "Saranan ikutan membantu pengguna baharu mencari kandungan menarik dengan cepat. Apabila pengguna belum cukup berinteraksi dengan akaun lain untuk membentuk saranan ikutan tersendiri, akaun-akaun inilah yang akan disarankan. Ia dinilai semula setiap hari dari gabungan keterlibatan tertinggi terkini dan juga jumlah pengikut tempatan tertinggi mengikut bahasa masing-masing." + language: Untuk bahasa + status: Status + suppress: Hadkan saranan ikutan + suppressed: Dihadkan + title: Saranan ikutan + unsuppress: Tetap semula saranan ikutan instances: - title: Tika diketahui + back_to_all: Semua + back_to_limited: Terhad + back_to_warning: Amaran + by_domain: Domain + delivery: + all: Semua + clear: Buang ralat penghantaran + restart: Mulakan semula penghantaran + stop: Hentikan penghantaran + title: Penghantaran + unavailable: Tidak tersedia + unavailable_message: Penghantaran tidak tersedia + warning: Amaran + warning_message: + other: Penghantaran gagal selama %{count} hari + delivery_available: Penghantaran tersedia + delivery_error_days: Hari ralat penghantaran + delivery_error_hint: Jika penghantaran tidak berjaya selama %{count} hari, ia akan ditanda sebagai tidak boleh dihantar. + empty: Tiada domain dijumpai. + known_accounts: + other: "%{count} akaun dikenali" + moderation: + all: Semua + limited: Terhad + title: Penyederhanaan + private_comment: Ulasan peribadi + public_comment: Ulasan awam + title: Persekutuan + total_blocked_by_us: Disekati kami + total_followed_by_them: Diikuti mereka + total_followed_by_us: Diikuti kami + total_reported: Laporan tentang mereka + total_storage: Lampiran media invites: deactivate_all: Nyahaktifkan semua filter: @@ -253,37 +468,114 @@ ms: expired: Tamat tempoh title: Tapis title: Undangan - relays: - add_new: Tambah geganti baru + ip_blocks: + add_new: Cipta peraturan + created_msg: Telah berjaya menambah peraturan alamat IP baharu delete: Padam - description_html: "Geganti persekutuan ialah pelayan perantara yang saling menukar toot awam dalam jumlah yang banyak di antara pelayan yang melanggan ia dan menerbitkan kepada ia. Ia boleh bantu pelayan kecil dan sederhana untuk menemui kandungan daripada dunia persekutuan Mastodon, yang mana jika tidak digunakan akan memerlukan pengguna tempatan mengikut orang lain di pelayan jarak jauh secara manual." - disable: Lumpuhkan - disabled: Dilumpuhkan - enable: Bolehkan - enable_hint: Apabila dibolehkan, pelayan anda akan melanggan kesemua toot awam daripada geganti ini, dan akan mula menghantar toot awam pelayan ini kepada ia. - enabled: Dibolehkan + expires_in: + '1209600': 2 minggu + '15778476': 6 bulan + '2629746': 1 bulan + '31556952': 1 tahun + '86400': 1 hari + '94670856': 3 tahun + new: + title: Cipta peraturan alamat IP baharu + no_ip_block_selected: Tiada peraturan alamat IP diubah kerana tiada yang dipilih + title: Peraturan alamat IP + pending_accounts: + title: Akaun sedang menunggu (%{count}) + relationships: + title: Hubungan %{acct} + relays: + add_new: Tambah geganti baharu + delete: Padam + description_html: "Geganti persekutuan ialah pelayan perantara yang saling menukar hantaran awam dalam jumlah yang banyak di antara pelayan yang melanggan ia dan menerbitkan kepadanya. Ia boleh bantu pelayan kecil dan sederhana untuk menemui kandungan daripada dunia persekutuan, yang mana jika tidak digunakan akan memerlukan pengguna tempatan mengikut orang lain di pelayan jarak jauh secara manual." + disable: Nyahdayakan + disabled: Dinyahdayakan + enable: Dayakan + enable_hint: Apabila didayakan, pelayan anda akan melanggan kesemua hantaran awam daripada geganti ini, dan akan mula menghantar hantaran awam pelayan ini kepadanya. + enabled: Didayakan inbox_url: URL geganti - pending: Menunggu persetujuan geganti - save_and_enable: Simpan dan bolehkan + pending: Menunggu kelulusan geganti + save_and_enable: Simpan dan dayakan setup: Tetapkan sambungan geganti + signatures_not_enabled: Geganti tidak akan berfungsi dengan betul apabila mod selamat atau mod persekutuan terhad didayakan + status: Status title: Geganti report_notes: - created_msg: Nota laporan berjaya dicipta! - destroyed_msg: Nota laporan berjaya dipadam! + created_msg: Catatan laporan telah berjaya dicipta! + destroyed_msg: Catatan laporan telah berjaya dipadam! reports: - action_taken_by: Tindakan oleh - are_you_sure: Anda pasti? - assign_to_self: Berikan pada saya - assigned: Pengawal yang menerima + account: + notes: + other: "%{count} catatan" + reports: + other: "%{count} laporan" + action_taken_by: Tindakan diambil oleh + are_you_sure: Adakah anda pasti? + assign_to_self: Menugaskan kepada saya + assigned: Penyederhana yang ditugaskan + by_target_domain: Domain bagi akaun yang dilaporkan comment: none: Tiada created_at: Dilaporkan + forwarded: Dipanjangkan + forwarded_to: Dipanjangkan ke %{domain} mark_as_resolved: Tanda sebagai sudah selesai mark_as_unresolved: Tanda sebagai belum selesai notes: - create: Tambah nota - create_and_resolve: Selesaikan dengan nota + create: Tambah catatan + create_and_resolve: Selesaikan dengan catatan + create_and_unresolve: Buka semula dengan catatan + delete: Padam placeholder: Terangkan tindakan apa yang telah diambil, atau sebarang kemas kini lain yang berkaitan... + reopen: Buka semula laporan + report: 'Laporan #%{id}' + reported_account: Akaun yang dilaporkan + reported_by: Dilaporkan oleh + resolved: Diselesaikan + resolved_msg: Laporan berjaya diselesaikan! + status: Status + title: Laporan + unassign: Nyahtugaskan + unresolved: Nyahselesaikan + updated_at: Dikemaskini + rules: + add_new: Tambah peraturan + delete: Padam + description_html: Walaupun ramai yang berkata mereka telah membaca dan bersetuju dengan terma-terma perkhidmatan, selalunya orang tidak baca dengan teliti sehinggalah terjadinya sesuatu masalah. Buatkan peraturan pelayan anda lebih mudah dilihat dalam sekali pandang dengan menyediakannya dalam bentuk senarai titik peluru rata. Cuba untuk kekalkan setiap peraturan khusus itu pendek dan mudah, tetapi jangan pula terlalu pisahkannya menjadi terlalu banyak item yang berlainan. + edit: Sunting peraturan + empty: Masih belum ada peraturan pelayan yang ditakrifkan. + title: Peraturan pelayan + settings: + peers_api_enabled: + title: Terbitkan senarai pelayan ditemukan dalam aplikasi + preview_sensitive_media: + desc_html: Pratonton laman sesawang daripada pautan akan terpapar di gambar kecil meski jika media itu ditanda sebagai sensitif + title: Papar media sensitif di pratonton OpenGraph + profile_directory: + desc_html: Benarkan pengguna untuk ditemukan + title: Benarkan direktori profil + registrations: + closed_message: + desc_html: Dipaparkan di muka depan apabil pendaftaran ditutup. Anda boleh menggunakan penanda HTML + title: Mesej pendaftaran telah ditutup + deletion: + desc_html: Benarkan sesiapapun memadamkan akaun mereka + title: Buka pemadaman akaun + min_invite_role: + disabled: Tiada sesiapa + title: Benarkan jemputan dari + require_invite_text: + desc_html: Apabila pendaftaran memerlukan kelulusan manual, tandakan input teks "Kenapa anda mahu menyertai?" sebagai wajib, bukan pilihan + title: Memerlukan alasan bagi pengguna baru untuk menyertai + registrations_mode: + modes: + approved: Kelulusan diperlukan untuk pendaftaran + none: Tiada siapa boleh mendaftar + open: Sesiapapun boleh mendaftar + title: Mod pendaftaran errors: '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. diff --git a/config/locales/nl.yml b/config/locales/nl.yml index a419e0b47d..7a7773f468 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -21,11 +21,11 @@ nl: federation_hint_html: Met een account op %{instance} ben je in staat om mensen die zich op andere Mastodonservers (en op andere plekken) bevinden te volgen. get_apps: Mobiele apps hosted_on: Mastodon op %{domain} - instance_actor_flash: 'Dit account is een virtuel actor dat wordt gebruikt om de server zelf te vertegenwoordigen en is geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden geblokkeerd, tenzij je de hele server wilt blokkeren. In zo''n geval dien je echter een domeinblokkade te gebruiken. - -' + instance_actor_flash: "Dit account is een virtuel actor dat wordt gebruikt om de server zelf te vertegenwoordigen en is geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden geblokkeerd, tenzij je de hele server wilt blokkeren. In zo'n geval dien je echter een domeinblokkade te gebruiken. \n" learn_more: Meer leren privacy_policy: Privacybeleid + rules: Serverregels + rules_html: 'Hieronder vind je een samenvatting van de regels die je op deze Mastodon-server moet opvolgen:' see_whats_happening: Kijk wat er aan de hand is server_stats: 'Serverstatistieken:' source_code: Broncode @@ -78,7 +78,6 @@ nl: other: Toots posts_tab_heading: Toots posts_with_replies: Toots en reacties - reserved_username: Deze gebruikersnaam is gereserveerd roles: admin: Beheerder bot: Bot @@ -229,6 +228,7 @@ nl: create_domain_block: Domeinblokkade aanmaken create_email_domain_block: E-maildomeinblokkade aanmaken create_ip_block: IP-regel aanmaken + create_unavailable_domain: Niet beschikbaar domein aanmaken demote_user: Gebruiker degraderen destroy_announcement: Mededeling verwijderen destroy_custom_emoji: Lokale emoji verwijderen @@ -237,6 +237,7 @@ nl: destroy_email_domain_block: E-maildomeinblokkade verwijderen destroy_ip_block: IP-regel verwijderen destroy_status: Toot verwijderen + destroy_unavailable_domain: Niet beschikbaar domein verwijderen disable_2fa_user: Tweestapsverificatie uitschakelen disable_custom_emoji: Lokale emojij uitschakelen disable_user: Gebruiker uitschakelen @@ -260,41 +261,48 @@ nl: update_domain_block: Domeinblokkade bijwerken update_status: Toot bijwerken actions: - assigned_to_self_report: "%{name} heeft rapportage %{target} aan zichzelf toegewezen" - change_email_user: "%{name} veranderde het e-mailadres van gebruiker %{target}" - confirm_user: E-mailadres van gebruiker %{target} is door %{name} bevestigd - create_account_warning: "%{name} verzond een waarschuwing naar %{target}" - create_announcement: "%{name} heeft de nieuwe mededeling %{target} aangemaakt" - create_custom_emoji: Nieuwe emoji %{target} is door %{name} geüpload - create_domain_allow: "%{name} heeft federatie met het domein %{target} goedgekeurd" - create_domain_block: Domein %{target} is door %{name} geblokkeerd - create_email_domain_block: "%{name} heeft het e-maildomein %{target} geblokkeerd" - demote_user: Gebruiker %{target} is door %{name} gedegradeerd - destroy_announcement: "%{name} heeft de mededeling %{target} verwijderd" - destroy_custom_emoji: "%{name} verwijderde emoji %{target}" - destroy_domain_allow: "%{name} heeft federatie met het domein %{target} afgekeurd" - destroy_domain_block: Domein %{target} is door %{name} gedeblokkeerd - destroy_email_domain_block: "%{name} heeft het e-maildomein %{target} gedeblokkeerd" - destroy_status: Toot van %{target} is door %{name} verwijderd - disable_2fa_user: Vereisten tweestapsverificatie van %{target} zijn door %{name} uitgeschakeld - disable_custom_emoji: Emoji %{target} is door %{name} uitgeschakeld - disable_user: Inloggen voor %{target} is door %{name} uitgeschakeld - enable_custom_emoji: Emoji %{target} is door %{name} ingeschakeld - enable_user: Inloggen voor %{target} is door %{name} ingeschakeld - memorialize_account: Het account %{target} is door %{name} in een In memoriam veranderd - promote_user: Gebruiker %{target} is door %{name} gepromoveerd - remove_avatar_user: "%{name} verwijderde de avatar van %{target}" - reopen_report: "%{name} heeft rapportage %{target} heropend" - reset_password_user: Wachtwoord van gebruiker %{target} is door %{name} opnieuw ingesteld - resolve_report: "%{name} heeft rapportage %{target} opgelost" - silence_account: Account %{target} is door %{name} genegeerd - suspend_account: Account %{target} is door %{name} opgeschort - unassigned_report: "%{name} heeft het toewijzen van rapportage %{target} ongedaan gemaakt" - unsilence_account: Negeren van account %{target} is door %{name} opgeheven - unsuspend_account: Opschorten van account %{target} is door %{name} opgeheven - update_announcement: "%{name} heeft de mededeling %{target} bijgewerkt" - update_custom_emoji: Emoji %{target} is door %{name} bijgewerkt - update_status: De toots van %{target} zijn door %{name} bijgewerkt + assigned_to_self_report_html: "%{name} heeft rapportage %{target} aan zichzelf toegewezen" + change_email_user_html: "%{name} veranderde het e-mailadres van gebruiker %{target}" + confirm_user_html: E-mailadres van gebruiker %{target} is door %{name} bevestigd + create_account_warning_html: "%{name} verzond een waarschuwing naar %{target}" + create_announcement_html: "%{name} heeft de nieuwe mededeling %{target} aangemaakt" + create_custom_emoji_html: Nieuwe emoji %{target} is door %{name} geüpload + create_domain_allow_html: "%{name} heeft de federatie met het domein %{target} goedgekeurd" + create_domain_block_html: Domein %{target} is door %{name} geblokkeerd + create_email_domain_block_html: "%{name} heeft het e-maildomein %{target} geblokkeerd" + create_ip_block_html: "%{name} maakte regel aan voor IP %{target}" + create_unavailable_domain_html: "%{name} heeft de bezorging voor domein %{target} beëindigd" + demote_user_html: Gebruiker %{target} is door %{name} gedegradeerd + destroy_announcement_html: "%{name} heeft de mededeling %{target} verwijderd" + destroy_custom_emoji_html: "%{name} verwijderde emoji %{target}" + destroy_domain_allow_html: "%{name} heeft de federatie met het domein %{target} afgekeurd" + destroy_domain_block_html: Domein %{target} is door %{name} gedeblokkeerd + destroy_email_domain_block_html: "%{name} heeft het e-maildomein %{target} gedeblokkeerd" + destroy_ip_block_html: "%{name} verwijderde regel voor IP %{target}" + destroy_status_html: Toot van %{target} is door %{name} verwijderd + destroy_unavailable_domain_html: "%{name} heeft de bezorging voor domein %{target} hervat" + disable_2fa_user_html: De vereiste tweestapsverificatie voor %{target} is door %{name} uitgeschakeld + disable_custom_emoji_html: Emoji %{target} is door %{name} uitgeschakeld + disable_user_html: Inloggen voor %{target} is door %{name} uitgeschakeld + enable_custom_emoji_html: Emoji %{target} is door %{name} ingeschakeld + enable_user_html: Inloggen voor %{target} is door %{name} ingeschakeld + memorialize_account_html: Het account %{target} is door %{name} in een In memoriam veranderd + promote_user_html: Gebruiker %{target} is door %{name} gepromoveerd + remove_avatar_user_html: "%{name} verwijderde de avatar van %{target}" + reopen_report_html: "%{name} heeft rapportage %{target} heropend" + reset_password_user_html: Wachtwoord van gebruiker %{target} is door %{name} opnieuw ingesteld + resolve_report_html: "%{name} heeft rapportage %{target} opgelost" + sensitive_account_html: "%{name} markeerde de media van %{target} als gevoelig" + silence_account_html: Account %{target} is door %{name} beperkt + suspend_account_html: Account %{target} is door %{name} opgeschort + unassigned_report_html: "%{name} heeft het toewijzen van rapportage %{target} ongedaan gemaakt" + unsensitive_account_html: "%{name} markeerde media van %{target} als niet gevoelig" + unsilence_account_html: Beperking van account %{target} is door %{name} opgeheven + unsuspend_account_html: Opschorten van account %{target} is door %{name} opgeheven + update_announcement_html: "%{name} heeft de mededeling %{target} bijgewerkt" + update_custom_emoji_html: Emoji %{target} is door %{name} bijgewerkt + update_domain_block_html: "%{name} heeft de domeinblokkade bijgewerkt voor %{target}" + update_status_html: "%{name} heeft de toots van %{target} bijgewerkt" deleted_status: "(verwijderde toot}" empty: Geen logs gevonden. filter_by_action: Op actie filteren @@ -309,10 +317,12 @@ nl: new: create: Mededeling aanmaken title: Nieuwe mededeling + publish: Inschakelen published_msg: Publiceren van mededeling geslaagd! scheduled_for: Ingepland voor %{time} scheduled_msg: Mededeling staat ingepland voor publicatie! title: Mededelingen + unpublish: Uitschakelen unpublished_msg: Ongedaan maken van gepubliceerde mededeling geslaagd! updated_msg: Bijwerken van mededeling geslaagd! custom_emojis: @@ -349,33 +359,9 @@ nl: updated_msg: Bijwerken van emoji is geslaagd! upload: Uploaden dashboard: - authorized_fetch_mode: Veilige modus - backlog: achterstallige taken - config: Configuratie - feature_deletions: Verwijderen van account - feature_invites: Uitnodigingen - feature_profile_directory: Gebruikersgids - feature_registrations: Registraties - feature_relay: Federatierelay - feature_spam_check: Anti-spam - feature_timeline_preview: Voorvertoning van tijdlijn - features: Functies - hidden_service: Federatie met verborgen diensten - open_reports: onopgeloste rapportages - pending_tags: hashtags die op een beoordeling wachten - pending_users: gebruikers die op een beoordeling wachten - recent_users: Recente gebruikers - search: In volledige tekst zoeken - single_user_mode: Modus voor één gebruiker software: Software space: Ruimtegebruik title: Dashboard - total_users: gebruikers in totaal - trends: Trends - week_interactions: interacties deze week - week_users_active: actieve gebruikers deze week - week_users_new: nieuwe gebruikers deze week - whitelist_mode: Beperkte federatiemodus domain_allows: add_new: Federatie met domein goedkeuren created_msg: Federatie met domein is succesvol goedgekeurd @@ -397,6 +383,8 @@ nl: silence: Negeren suspend: Opschorten title: Nieuwe domeinblokkade + obfuscate: Domeinnaam verdoezelen + obfuscate_hint: De domeinnaam gedeeltelijk verdoezelen wanneer de lijst met domeinblokkades wordt getoond private_comment: Privé-opmerking private_comment_hint: Opmerking over deze domeinbeperking voor intern gebruik door de moderatoren. public_comment: Openbare opmerking @@ -433,9 +421,34 @@ nl: create: Blokkeren title: Nieuw e-maildomein blokkeren title: Geblokkeerde e-maildomeinen + follow_recommendations: + description_html: "Deze aanbevolen accounts helpen nieuwe gebruikers snel interessante inhoudte vinden. Wanneer een gebruiker niet met andere gebruikers genoeg interactie heeft gehad om gepersonaliseerde aanbevelingen te krijgen, worden in plaats daarvan deze accounts aanbevolen. Deze accounts worden dagelijks opnieuw berekend met behulp van accounts met het hoogste aantal recente interacties en het hoogste aantal lokale volgers in een bepaalde taal." + language: Voor taal + status: Status + suppress: Aanbevolen account niet meer aanbevelen + suppressed: Account niet meer aanbevolen + title: Aanbevolen accounts + unsuppress: Account weer aanbevelen instances: + back_to_all: Alles + back_to_limited: Beperkt + back_to_warning: Waarschuwing by_domain: Domein + delivery: + all: Alles + clear: Bezorgfouten weghalen + restart: Bezorging herstarten + stop: Bezorging beëindigen + title: Bezorging + unavailable: Niet beschikbaar + unavailable_message: Bezorging is niet beschikbaar + warning: Waarschuwing + warning_message: + one: Bezorgingsfout voor %{count} dag + other: Bezorgfout voor %{count} dagen delivery_available: Bezorging is mogelijk + delivery_error_days: Dagen met bezorgfouten + delivery_error_hint: Wanneer de bezorging voor %{count} dagen niet mogelijk is, wordt de bezorging automatisch als niet beschikbaar gemarkeerd. empty: Geen domeinen gevonden. known_accounts: one: "%{count} bekend account" @@ -535,13 +548,20 @@ nl: unassign: Niet langer toewijzen unresolved: Onopgelost updated_at: Bijgewerkt + rules: + add_new: Regel toevoegen + delete: Verwijderen + description_html: Hoewel de meeste mensen zeggen dat ze de gebruiksvoorwaarden hebben gelezen en er mee akkoord gaan, lezen mensen deze meestal niet totdat er een probleem optreedt. Maak het eenvoudiger om de regels van deze server in één oogopslag te zien, door ze puntsgewijs in een lijst te zetten. Probeer de verschillende regels kort en simpel te houden, maar probeer ze ook niet in verschillende items onder te verdelen. + edit: Regel bewerken + empty: Voor deze server zijn nog geen regels opgesteld. + title: Serverregels settings: activity_api_enabled: desc_html: Wekelijks overzicht van de hoeveelheid lokale toots, actieve gebruikers en nieuwe registraties - title: Statistieken over gebruikersactiviteit publiceren + title: Statistieken over gebruikersactiviteit via de API publiceren bootstrap_timeline_accounts: - desc_html: Meerdere gebruikersnamen met komma's scheiden. Alleen lokale en niet opgeschorte accounts werken. Laat leeg voor alle lokale beheerders. - title: Standaard te volgen accounts voor nieuwe gebruikers + desc_html: Meerdere gebruikersnamen met komma's scheiden. Deze accounts worden in ieder geval aan nieuwe gebruikers aanbevolen + title: Aanbevolen accounts voor nieuwe gebruikers contact_information: email: Vul een openbaar gebruikt e-mailadres in username: Vul een gebruikersnaam in @@ -552,14 +572,12 @@ nl: desc_html: Heeft invloed op alle gebruikers die deze instelling niet zelf hebben veranderd title: Toots van gebruikers standaard niet door zoekmachines laten indexeren domain_blocks: - all: Naar iedereen - disabled: Naar niemand + all: Aan iedereen + disabled: Aan niemand title: Domeinblokkades tonen - users: Naar ingelogde lokale gebruikers + users: Aan ingelogde lokale gebruikers domain_blocks_rationale: title: Motivering tonen - enable_bootstrap_timeline_accounts: - title: Standaard te volgen accounts voor nieuwe gebruikers inschakelen hero: desc_html: Wordt op de voorpagina getoond. Tenminste 600x100px aanbevolen. Wanneer dit niet is ingesteld wordt de thumbnail van de Mastodonserver getoond title: Hero-afbeelding @@ -568,7 +586,7 @@ nl: title: Mascotte-afbeelding peers_api_enabled: desc_html: Domeinnamen die deze server in de fediverse is tegengekomen - title: Lijst van bekende servers publiceren + title: Lijst van bekende servers via de API publiceren preview_sensitive_media: desc_html: Linkvoorvertoningen op andere websites hebben een thumbnail, zelfs als een afbeelding of video als gevoelig is gemarkeerd title: Gevoelige afbeeldingen en video's in OpenGraph-voorvertoningen tonen @@ -585,6 +603,9 @@ nl: min_invite_role: disabled: Niemand title: Uitnodigingen toestaan door + require_invite_text: + desc_html: Maak het invullen van "Waarom wil je je hier registreren?" verplicht in plaats van optioneel, wanneer registraties handmatig moeten worden goedgekeurd + title: Nieuwe gebruikers moeten een reden invullen waarom ze zich willen registreren registrations_mode: modes: approved: Goedkeuring vereist om te kunnen registreren @@ -610,9 +631,6 @@ nl: desc_html: Je kan hier jouw eigen privacybeleid, gebruiksvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken title: Aangepaste gebruiksvoorwaarden site_title: Naam Mastodonserver - spam_check_enabled: - desc_html: Mastodon kan accounts die herhaaldelijk ongevraagde berichten versturen automatisch negeren of rapporteren. Het is mogelijk dat er foutpositieven tussen zitten. - title: Automatische spambestrijding thumbnail: desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen title: Thumbnail Mastodonserver @@ -643,13 +661,18 @@ nl: no_status_selected: Er werden geen toots gewijzigd, omdat er geen enkele werd geselecteerd title: Toots van account with_media: Met media + system_checks: + database_schema_check: + message_html: Niet alle databasemigraties zijn voltooid. Je moet deze uitvoeren om er voor te zorgen dat de applicatie blijft werken zoals het hoort + rules_check: + action: Serverregels beheren + message_html: Je hebt voor deze server geen regels opgesteld. + sidekiq_process_check: + message_html: Er draait geen Sidekiqproces voor de wachtrij(en) %{value}. Controleer je Sidekiqconfiguratie tags: accounts_today: Aantal verschillende keren vandaag gebruikt accounts_week: Aantal verschillende keren deze week gebruikt breakdown: Uitsplitsing van het gebruik van vandaag naar bron - context: Context - directory: In de gebruikersgids - in_directory: "%{count} keer in de gebruikersgids" last_active: Laatst actief most_popular: Meest populair most_recent: Meest recent @@ -665,8 +688,9 @@ nl: warning_presets: add_new: Nieuwe toevoegen delete: Verwijderen - edit_preset: Voorinstelling van waarschuwing bewerken - title: Voorinstellingen van waarschuwingen beheren + edit_preset: Preset voor waarschuwing bewerken + empty: Je hebt nog geen presets voor waarschuwingen toegevoegd. + title: Presets voor waarschuwingen beheren admin_mailer: new_pending_account: body: Zie hieronder de details van het nieuwe account. Je kunt de aanvraag goedkeuren of afkeuren. @@ -703,7 +727,7 @@ nl: settings: 'E-mailvoorkeuren wijzigen: %{link}' view: 'Bekijk:' view_profile: Profiel bekijken - view_status: Status bekijken + view_status: Toot bekijken applications: created: Aanmaken toepassing geslaagd destroyed: Verwijderen toepassing geslaagd @@ -1027,10 +1051,14 @@ nl: body: 'Jij bent door %{name} vermeld in:' subject: Jij bent vermeld door %{name} title: Nieuwe vermelding + poll: + subject: Een poll van %{name} is beëindigd reblog: body: 'Jouw toot werd door %{name} geboost:' subject: "%{name} boostte jouw toot" title: Nieuwe boost + status: + subject: "%{name} heeft zojuist een toot geplaatst" notifications: email_events: E-mailmeldingen voor gebeurtenissen email_events_hint: 'Selecteer gebeurtenissen waarvoor je meldingen wilt ontvangen:' @@ -1047,9 +1075,9 @@ nl: trillion: bln. otp_authentication: code_hint: Voer de code in die door de authenticatie-app werd gegenereerd - description_html: Na het instellen van tweestapsverificatie met een authenticatie-app, kun je alleen inloggen als je jouw mobiele telefoon bij je hebt. Hiermee genereer je namelijk de in te voeren aanmeldcode. + description_html: Na het instellen van tweestapsverificatie met een authenticatie-app, kun je alleen inloggen als je jouw mobiele telefoon bij je hebt. Hiermee genereer je namelijk de in te voeren toegangscode. enable: Inschakelen - instructions_html: "Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon. Van nu af aan genereert deze app aanmeldcodes die je bij het inloggen moet invoeren." + instructions_html: "Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon. Van nu af aan genereert deze app toegangscodes die je bij het inloggen moet invoeren." manual_instructions: 'Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren, vind je hieronder de geheime code in platte tekst:' setup: Instellen wrong_code: De ingevoerde code is ongeldig! Klopt de systeemtijd van de server en die van jouw apparaat? @@ -1179,8 +1207,6 @@ nl: relationships: Volgers en gevolgden two_factor_authentication: Tweestapsverificatie webauthn_authentication: Beveiligingssleutels - spam_check: - spam_detected: Dit is een automatisch gegenereerde rapportage. Er is spam gedetecteerd. statuses: attached: audio: @@ -1194,7 +1220,7 @@ nl: one: "%{count} video" other: "%{count} video's" boosted_from_html: Geboost van %{acct_link} - content_warning: 'Tekstwaarschuwing: %{warning}' + content_warning: 'Inhoudswaarschuwing: %{warning}' disallowed_hashtags: one: 'bevatte een niet toegestane hashtag: %{tags}' other: 'bevatte niet toegestane hashtags: %{tags}' @@ -1223,6 +1249,7 @@ nl: sign_in_to_participate: Meld je aan om aan dit gesprek mee te doen title: '%{name}: "%{quote}"' visibilities: + direct: Direct private: Alleen volgers private_long: Alleen aan jouw volgers tonen public: Openbaar @@ -1391,12 +1418,9 @@ nl: tips: Tips title: Welkom aan boord %{name}! users: - blocked_email_provider: Deze e-mailprovider is niet toegestaan follow_limit_reached: Je kunt niet meer dan %{limit} accounts volgen generic_access_help_html: Problemen met toegang tot je account? Neem dan contact op met %{email} voor assistentie - invalid_email: E-mailadres is ongeldig - invalid_email_mx: Het e-mailadres lijkt niet te bestaan - invalid_otp_token: Ongeldige tweestaps-aanmeldcode + invalid_otp_token: Ongeldige tweestaps-toegangscode invalid_sign_in_token: Ongeldige beveiligingscode otp_lost_help_html: Als je toegang tot beiden kwijt bent geraakt, neem dan contact op via %{email} seamless_external_login: Je bent ingelogd via een externe dienst, daarom zijn wachtwoorden en e-mailinstellingen niet beschikbaar. diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 463364e3d5..005523a9fc 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -24,12 +24,14 @@ nn: instance_actor_flash: "Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet. \n" learn_more: Lær meir privacy_policy: Personvernsreglar + rules: Server regler + rules_html: 'Nedenfor er et sammendrag av reglene du må følge om du vil ha en konto på denne serveren av Mastodon:' see_whats_happening: Sjå kva som skjer server_stats: 'Tenarstatistikk:' source_code: Kjeldekode status_count_after: - one: status - other: statusar + one: innlegg + other: statuser status_count_before: Som skreiv tagline: Fylg vener og oppdag nye terms: Brukarvilkår @@ -58,6 +60,7 @@ nn: one: Fylgjar other: Fylgjarar following: Fylgjer + instance_actor_flash: Denne kontoen er en virtuell figur som brukes til å representere selve serveren og ikke noen individuell bruker. Den brukes til forbundsformål og bør ikke oppheves. joined: Vart med %{date} last_active: sist aktiv link_verified_on: Eigarskap for denne lenkja vart sist sjekka %{date} @@ -75,7 +78,6 @@ nn: other: Tut posts_tab_heading: Tut posts_with_replies: Tut og svar - reserved_username: Dette brukarnamnet er oppteke roles: admin: Administrator bot: Robot @@ -96,6 +98,7 @@ nn: add_email_domain_block: Gøym e-postdomene approve: Godtak approve_all: Godtak alle + approved_msg: Godkjent %{username} sin registreringsapplikasjon are_you_sure: Er du sikker? avatar: Bilete by_domain: Domene @@ -112,7 +115,9 @@ nn: delete: Slett data deleted: Sletta demote: Degrader + destroyed_msg: "%{username} sine data er nå i kø for å bli slettet minimum" disable: Slå av + disable_sign_in_token_auth: Deaktiver e-post token autentisering disable_two_factor_authentication: Slå av 2FA disabled: Slege av display_name: Synleg namn @@ -121,13 +126,16 @@ nn: email: E-post email_status: E-poststatus enable: Slå på + enable_sign_in_token_auth: Aktiver godkjenning av e-post token enabled: Aktivert + enabled_msg: Frossent %{username} sin konto followers: Fylgjarar follows: Fylgje header: Overskrift inbox_url: Innbokslenkje + invite_request_text: Begrunnelse for å bli med invited_by: Innboden av - ip: IP + ip: IP-adresse joined: Vart med location: all: Alle @@ -137,6 +145,8 @@ nn: login_status: Innlogginsstatus media_attachments: Medievedlegg memorialize: Gjør om til et minne + memorialized: Minnet + memorialized_msg: Vellykket gjort av %{username} til en minnestedet moderation: active: Aktiv all: Alle @@ -157,10 +167,14 @@ nn: public: Offentleg push_subscription_expires: PuSH-abonnent utløper redownload: Last inn profil på nytt + redownloaded_msg: Oppdatert %{username} sin profil fra opprinnelse reject: Avvis reject_all: Avvis alle + rejected_msg: Vellykket avvist %{username} sin registreringsapplikasjon remove_avatar: Fjern bilete remove_header: Fjern overskrift + removed_avatar_msg: Fjernet %{username} sitt avatarbilde + removed_header_msg: Fjernet %{username} sin topptekst bilde resend_confirmation: already_confirmed: Denne brukaren er allereie stadfesta send: Send stadfestings-e-posten på nytt @@ -171,12 +185,17 @@ nn: role: Løyve roles: admin: Administrator - moderator: Moderator + moderator: Ordstyrer staff: Personell user: Brukar search: Søk search_same_email_domain: Andre brukarar med same e-postdomene search_same_ip: Andre brukarar med same IP + security_measures: + only_password: Bare passord + password_and_2fa: Passord og 2FA + password_and_sign_in_token: Passord og e-post token + sensitized: Merket som følsom shared_inbox_url: Delt Innboks URL show: created_reports: Rapportar frå denne kontoen @@ -186,6 +205,8 @@ nn: statuses: Statusar subscribe: Ting suspended: Utvist + suspension_irreversible: Dataene fra denne kontoen har blitt ikke reverserbart slettet. Du kan oppheve suspenderingen av kontoen for å gjøre den brukbart, men den vil ikke gjenopprette alle data den tidligere har hatt. + suspension_reversible_hint_html: Kontoen har blitt suspendert, og dataene vil bli fullstendig fjernet den %{date}. Frem til da kan kontoen gjenopprettes uten negative effekter. Hvis du ønsker å fjerne alle kontoens data umiddelbart, kan du gjøre det nedenfor. time_in_queue: Ventar i kø %{time} title: Kontoar unconfirmed_email: E-post utan stadfesting @@ -236,43 +257,12 @@ nn: update_custom_emoji: Oppdater tilpassa emoji update_status: Oppdater tut actions: - assigned_to_self_report: "%{name} tilegnet rapport %{target} til seg selv" - change_email_user: "%{name} endra e-postadressa til brukaren %{target}" - confirm_user: "%{name} stadfesta e-postadressa til brukaren %{target}" - create_account_warning: "%{name} sende ei åtvaring til %{target}" - create_announcement: "%{name} laget en ny kunngjøring %{target}" - create_custom_emoji: "%{name} lasta opp eit nytt kjensleteikn %{target}" - create_domain_allow: "%{name} kvitlista domenet %{target}" - create_domain_block: "%{name} blokkerte domenet %{target}" - create_email_domain_block: "%{name} svartelista e-postdomenet %{target}" - create_ip_block: "%{name} opprettet en regel for IP-en %{target}" - demote_user: "%{name} degraderte brukaren %{target}" - destroy_announcement: "%{name} slettet kunngjøring %{target}" - destroy_custom_emoji: "%{name} utsletta kjensleteiknet %{target}" - destroy_domain_allow: "%{name} fjerna domenet %{target} frå kvitliste" - destroy_domain_block: "%{name} slutta å blokkera domenet %{target}" - destroy_email_domain_block: "%{name} kvitlista e-postdomenet %{target}" - destroy_ip_block: "%{name} slettet en regel for IP-en %{target}" - destroy_status: "%{name} sletta status av %{target}" - disable_2fa_user: "%{name} tok vekk krav om tofaktorautentisering for brukaren %{target}" - disable_custom_emoji: "%{name} deaktiverte emojien %{target}" - disable_user: "%{name} slo av innlogging for brukaren %{target}" - enable_custom_emoji: "%{name} aktiverte emojien %{target}" - enable_user: "%{name} aktiverte innlogging for brukaren %{target}" - memorialize_account: "%{name} endret %{target}s konto til en minneside" - promote_user: "%{name} fremja brukaren %{target}" - remove_avatar_user: "%{name} fjerna %{target} sitt profilbilete" - reopen_report: "%{name} opna rapporten %{target} på nytt" - reset_password_user: "%{name} nullstilte passordet til brukaren %{target}" - resolve_report: "%{name} løyste ein rapport %{target}" - silence_account: "%{name} målbatt %{target} sin konto" - suspend_account: "%{name} utviste %{target} sin konto" - unassigned_report: "%{name} avtilegnet rapport %{target}" - unsilence_account: "%{name} fjernet forstummingen av %{target}s konto" - unsuspend_account: "%{name} utviste %{target} sin konto" - update_announcement: "%{name} oppdaterte kunngjøring %{target}" - update_custom_emoji: "%{name} oppdaterte kjensleteiknet %{target}" - update_status: "%{name} oppdaterte status for %{target}" + create_custom_emoji_html: "%{name} lastet opp ny emoji %{target}" + create_domain_allow_html: "%{name} tillatt føderasjon med domenet %{target}" + create_domain_block_html: "%{name} blokkert domene %{target}" + create_email_domain_block_html: "%{name} blokkert e-post domene %{target}" + create_ip_block_html: "%{name} opprettet regel for IP %{target}" + silence_account_html: "%{name} begrenset %{target} sin konto" deleted_status: "(sletta status)" empty: Ingen loggar funne. filter_by_action: Sorter etter handling @@ -287,10 +277,12 @@ nn: new: create: Lag kunngjøring title: Ny kunngjøring + publish: Publiser published_msg: Kunngjøring publisert! scheduled_for: Planlagt for %{time} scheduled_msg: Kunngjøring planlagt for publisering! title: Kunngjøringer + unpublish: Avpubliser unpublished_msg: Kunngjøring upublisert! updated_msg: Kunngjøringen er oppdatert! custom_emojis: @@ -327,33 +319,9 @@ nn: updated_msg: Kjensleteiknet er oppdatert! upload: Last opp dashboard: - authorized_fetch_mode: Trygg modus - backlog: opphopsloggede jobber - config: Oppsett - feature_deletions: Kontoslettingar - feature_invites: Innbydingar - feature_profile_directory: Profilmappe - feature_registrations: Registreringar - feature_relay: Føderasjonsoverganger - feature_spam_check: Søppelvern - feature_timeline_preview: Førehandsvisning av tidsline - features: Eigenskapar - hidden_service: Føderering med skjulte tjenester - open_reports: opne rapportar - pending_tags: emneknaggar som ventar på gjennomgang - pending_users: brukarar som ventar på gjennomgang - recent_users: Nylege brukarar - search: Fulltekstsøking - single_user_mode: Enkeltbrukarmodus software: Programvare space: Lagrinsplass nytta title: Dashbord - total_users: brukarar til saman - trends: Populært - week_interactions: samhandlingar denne veka - week_users_active: aktive denne veka - week_users_new: brukarar denne veka - whitelist_mode: Kvitlistemodus domain_allows: add_new: Kvitlist domene created_msg: Domene er vorte kvitlista @@ -375,6 +343,8 @@ nn: silence: Togn suspend: Utvis title: Ny domeneblokkering + obfuscate: Obfuskere domenenavn + obfuscate_hint: Delvis skjule domenenavnet i listen hvis det er aktivert for å annonsere listen over domenebegrensninger private_comment: Privat kommentar private_comment_hint: Kommenter angående denne domenebegrensningen for internt bruk av moderatorene. public_comment: Offentleg kommentar @@ -411,8 +381,27 @@ nn: create: Legg til domene title: Ny blokkeringsoppføring av e-postdomene title: Blokkerte e-postadresser + follow_recommendations: + description_html: "Følg anbefalinger hjelper nye brukere med å finne interessant innhold. Når en bruker ikke har kommunisert med andre nok til å danne personlig tilpassede følger anbefalinger, anbefales disse kontoene i stedet. De beregnes daglig på nytt fra en blanding av kontoer der de høyeste engasjementene er og med høyest lokal tilhenger for et gitt språk." + language: For språk + status: Status + suppress: Undertrykk anbefalte følger + suppressed: Dempet + title: Følg anbefalinger + unsuppress: Gjenopprett følg-anbefaling instances: + back_to_all: All + back_to_limited: Begrenset + back_to_warning: Advarsel by_domain: Domene + delivery: + all: All + clear: Feil ved fjerning + restart: Starte levering + stop: Stopp levering + title: Levering + unavailable: Ikke tilgjengelig + warning: Advarsel delivery_available: Levering er tilgjengelig known_accounts: one: "%{count} kjend konto" @@ -435,7 +424,7 @@ nn: all: Alle available: Tilgjengeleg expired: Utgått - title: Filter + title: Filtrer title: Innbydingar ip_blocks: add_new: Opprett regel @@ -450,6 +439,7 @@ nn: '94670856': 3 år new: title: Opprett ny IP-regel + no_ip_block_selected: Ingen IP-regler ble endret da ingen ble valgt title: IP-regler pending_accounts: title: Kontoar som ventar (%{count}) @@ -490,6 +480,8 @@ nn: comment: none: Ingen created_at: Rapportert + forwarded: Videresendt + forwarded_to: Videresendt til %{domain} mark_as_resolved: Merk som løyst mark_as_unresolved: Merk som uløyst notes: @@ -505,10 +497,18 @@ nn: resolved: Oppløyst resolved_msg: Rapporten er løyst! status: Status + target_origin: Opprinnelse for innrapportert konto title: Rapportar unassign: Avset unresolved: Uløyst updated_at: Oppdatert + rules: + add_new: Legg til et filter + delete: Slett + description_html: Mens de fleste hevder å ha lest og samtykket i tjenestevilkårene, leser de vanligvis ikke gjennom før etter et problem oppstår. Gjør det enklere å se serverens regler på et øyeblikk ved å gi dem i en flat kulepunktsliste. Prøv å holde individuelle regler korte og enkelt, men prøv å ikke dele dem opp i mange separate elementer heller. + edit: Rediger regel + empty: Ingen serverregler har blitt definert ennå. + title: Server regler settings: activity_api_enabled: desc_html: Antall lokale statusposter, aktive brukere og nye registreringer i ukentlige oppdelinger @@ -524,6 +524,7 @@ nn: title: Eigen CSS default_noindex: desc_html: Påverkar alle brukarar som ikkje har justert denne innstillinga sjølve + title: Velg brukere som er ute av søkemotoren indeksering som standard domain_blocks: all: Til alle disabled: Til ingen @@ -556,12 +557,17 @@ nn: min_invite_role: disabled: Ingen title: Tillat innbydingar frå + require_invite_text: + desc_html: Når registreringer krever manuell godkjenning, må du føye «Hvorfor vil du bli med?» tekstinput obligatoriske i stedet for valgfritt + title: Krev nye brukere for å oppgi en grunn for å delta registrations_mode: modes: approved: Godkjenning kreves for påmelding none: Ingen kan melda seg inn open: Kven som helst kan melda seg inn title: Registreringsmodus + show_known_fediverse_at_about_page: + desc_html: Begrenser den offentlige tidslinjen som er knyttet til landingssiden når den er deaktivert, og viser bare lokalt innhold show_staff_badge: desc_html: Vis personalmerke på ei brukarside title: Vis personalmerke @@ -578,9 +584,6 @@ nn: desc_html: Du kan skrive din egen personverns-strategi, bruksviklår og andre regler. Du kan bruke HTML tagger title: Eigne brukarvilkår site_title: Tenarnamn - spam_check_enabled: - desc_html: Mastodon kan auto-rapportere kontoer som sender gjentatte uforespurte meldinger. Det kan oppstå falske positive treff. - title: Nettsøppelvern thumbnail: desc_html: Brukes ved forhandsvisning via OpenGraph og API. 1200x630px anbefales title: Småbilete for tenaren @@ -610,13 +613,16 @@ nn: no_status_selected: Ingen statusar vart endra sidan ingen vart valde title: Kontostatusar with_media: Med media + system_checks: + database_schema_check: + message_html: Det venter på databaseoverføringer. Vennligst kjør disse for å sikre at applikasjonen oppfører seg som forventet + rules_check: + action: Behandle serverregler + message_html: Du har ikke definert noen serverregler. tags: accounts_today: Ulike brukarar i dag accounts_week: Unike brukstilfeller denne uken breakdown: Oversyn over bruk i dag etter kjelde - context: Kontekst - directory: I mappen - in_directory: "%{count} i mappen" last_active: Sist aktiv most_popular: Mest populær most_recent: Nyast @@ -660,7 +666,6 @@ nn: discovery: Oppdaging localization: body: Mastodon er oversatt av frivillige. - guide_link: https://crowdin.com/project/mastodon guide_link_text: Alle kan bidra. sensitive_content: Sensitivt innhold toot_layout: Tutoppsett @@ -743,9 +748,6 @@ nn: errors: invalid_key: er ikkje ein gild Ed25519 eller Curve25519 nykel invalid_signature: er ikkje ein gild Ed25519-signatur - date: - formats: - default: "%b %d, %Y" datetime: distance_in_words: about_x_hours: "%{count}t" @@ -756,10 +758,10 @@ nn: less_than_x_minutes: "%{count}min" less_than_x_seconds: No nettopp over_x_years: "%{count} år" - x_days: "%{count}d" + x_days: "%{count} dager" x_minutes: "%{count}min" x_months: "%{count}md" - x_seconds: "%{count}s" + x_seconds: "%{count} sek" deletes: challenge_not_passed: Det du skreiv var ikkje rett confirm_password: Skriv det noverande passordet ditt for å stadfesta identiteten din @@ -810,6 +812,7 @@ nn: request: Bed om arkivet ditt size: Storleik blocks: Du blokkerer + bookmarks: Bokmerker csv: CSV domain_blocks: Domeneblokkeringer lists: Lister @@ -883,6 +886,7 @@ nn: success: Dataa dine vart lasta opp og vert no handsama så fort som mogeleg types: blocking: Blokkeringsliste + bookmarks: Bokmerker domain_blocking: Liste over blokkerte domene following: Fylgjeliste muting: Dempeliste @@ -913,6 +917,10 @@ nn: lists: errors: limit: Du har nådd grensa for kor mange lister du kan ha + login_activities: + authentication_methods: + password: passord + title: Autentiseringshistorikk media_attachments: validations: images_and_video: Kan ikkje leggja ved video til status som allereie inneheld bilete @@ -988,6 +996,8 @@ nn: body: 'Statusen din vart framheva av %{name}:' subject: "%{name} framheva statusen din" title: Ny framheving + status: + subject: "%{name} postet nettopp" notifications: email_events: E-postvarslinger for hendelser email_events_hint: 'Velg hendelser som du vil motta varslinger for:' @@ -995,12 +1005,12 @@ nn: number: human: decimal_units: - format: "%n%u" + format: "%n %u" units: billion: Mrd million: Mil quadrillion: Bil - thousand: K + thousand: T trillion: Bil otp_authentication: code_hint: Skriv inn koden generert av autentiseringsappen din for å bekrefte @@ -1038,6 +1048,7 @@ nn: relationships: activity: Kontoaktivitet dormant: I dvale + follow_selected_followers: Følg valgte tilhengere followers: Følgere following: Følginger invited: Invitert @@ -1076,8 +1087,8 @@ nn: activity: Siste aktivitet browser: Nettlesar browsers: - alipay: Alipay - blackberry: Blackberry + alipay: AliPay + blackberry: BlackBerry chrome: Chrome edge: Microsoft Edge electron: Electron @@ -1096,11 +1107,11 @@ nn: current_session: Noverande økt description: "%{browser} på %{platform}" explanation: Desse nettlesarane er logga inn på Mastodon-kontoen din. - ip: IP + ip: IP-adresse platforms: adobe_air: Adobe Air android: Android - blackberry: Blackberry + blackberry: BlackBerry chrome_os: Chrome OS firefox_os: Firefox OS ios: IOS @@ -1113,6 +1124,7 @@ nn: revoke: Tilbakekall revoke_success: Økt tilbakekalt title: Økter + view_authentication_history: Vis autentiseringshistorikk for kontoen din settings: account: Konto account_settings: Kontoinnstillingar @@ -1135,8 +1147,6 @@ nn: relationships: Fylgjar og fylgjarar two_factor_authentication: Tostegsautorisering webauthn_authentication: Sikkerhetsnøkler - spam_check: - spam_detected: Dette er en automatisert rapport. Spam har blitt oppdaget. statuses: attached: audio: @@ -1148,7 +1158,7 @@ nn: other: "%{count} bilete" video: one: "%{count} video" - other: "%{count} videoar" + other: "%{count} videoer" boosted_from_html: Framheva av %{acct_link} content_warning: 'Innhaldsåtvaring: %{warning}' disallowed_hashtags: @@ -1167,16 +1177,19 @@ nn: poll: total_people: one: "%{count} person" - other: "%{count} folk" + other: "%{count} personer" total_votes: one: "%{count} røyst" other: "%{count} røyster" vote: Røyst show_more: Vis meir + show_newer: Vis nyere + show_older: Vis eldre show_thread: Vis tråden sign_in_to_participate: Logg inn for å verta med i samtalen title: "%{name}: «%{quote}»" visibilities: + direct: Direkte private: Berre fylgjarar private_long: Vis berre til fylgjarar public: Offentleg @@ -1301,12 +1314,14 @@ nn: subject: Arkivet ditt er klart til å lastes ned sign_in_token: details: 'Her er forsøksdetaljane:' + explanation: 'Vi oppdaget et forsøk på å logge på kontoen fra en ukjent IP-adresse. Hvis dette er deg, vennligst skriv inn sikkerhetskoden nedenfor på påloggingssiden:' further_actions: 'Om dette ikkje var deg, so venlegast endra passordet ditt og skruv på tostegsgodkjenning på kontoen din. Du kan gjera det her:' subject: Venlegast stadfest forsøket på å logga inn title: Forsøk på å logga inn warning: explanation: disable: Mens kontoen din er fryst, forblir dine kontodata intakt, men du kan ikke utføre noen handlinger før den har blitt tint opp. + sensitive: De opplastede mediefilene og linket vil bli behandlet som sensitive. silence: Mens kontoen din er begrenset, vil bare folk som allerede følger deg se dine tuter på denne tjeneren, og du kan bli ekskludert fra diverse offentlige oppføringer. Men andre kan fortsatt følge deg manuelt. suspend: Kontoen din har blitt suspendert, og alle dine tuter og opplastede media har blitt ugjenkallelig fjernet fra denne tjeneren, og fra tjenere der du hadde følgere. get_in_touch: Du kan svare på denne E-posten for å komme i kontakt med styret i %{instance}. @@ -1315,11 +1330,13 @@ nn: subject: disable: Kontoen din, %{acct}, har blitt fryst none: Åtvaring for %{acct} + sensitive: Din konto %{acct} medier har blitt merket som følsom silence: Kontoen din, %{acct}, er vorten avgrensa suspend: Kontoen din, %{acct}, er vorten utvist title: disable: Konto frosen none: Åtvaring + sensitive: Mediet ditt er markert som følsom silence: Konto avgrensa suspend: Konto utvist welcome: @@ -1340,10 +1357,8 @@ nn: tips: Tips title: Velkomen om bord, %{name}! users: - blocked_email_provider: Denne E-postleverandøren er ikke tillatt follow_limit_reached: Du kan ikkje fylgja fleire enn %{limit} folk generic_access_help_html: Har du vanskar med tilgjenge til kontoen din? Tak gjerne kontakt med %{email} - invalid_email: E-mailadressa er ugyldig invalid_otp_token: Ugyldig tostegskode invalid_sign_in_token: Ugild trygdenykel otp_lost_help_html: Hvis du mistet tilgangen til begge deler, kan du komme i kontakt med %{email} @@ -1360,7 +1375,11 @@ nn: delete: Slett delete_confirmation: Er du sikker på at du vil slette denne sikkerhetsnøkkelen? destroy: + error: Det oppsto et problem med å slette sikkerhetsnøkkelen. Prøv igjen. success: Sikkerhetsnøkkelen din ble vellykket slettet. invalid_credential: Ugyldig sikkerhetsnøkkel + nickname_hint: Skriv inn kallenavnet til din nye sikkerhetsnøkkel + not_enabled: Du har ikke aktivert WebAuthn ennå not_supported: Denne nettleseren støtter ikke sikkerhetsnøkler + otp_required: For å bruke sikkerhetsnøkler, må du først aktivere to-faktor autentisering. registered_on: Registrert den %{date} diff --git a/config/locales/no.yml b/config/locales/no.yml index b70eb167c4..668efca9c5 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -21,16 +21,16 @@ federation_hint_html: Med en konto på %{instance} vil du kunne følge folk på enhver Mastodon-tjener, og mer til. get_apps: Prøv en mobilapp hosted_on: Mastodon driftet på %{domain} - instance_actor_flash: 'Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet. - -' + instance_actor_flash: "Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet. \n" learn_more: Lær mer privacy_policy: Privatlivsretningslinjer + rules: Server regler + rules_html: 'Nedenfor er et sammendrag av reglene du må følge om du vil ha en konto på denne serveren av Mastodon:' see_whats_happening: Se hva som skjer server_stats: 'Tjenerstatistikker:' source_code: Kildekode status_count_after: - one: status + one: innlegg other: statuser status_count_before: Som skrev tagline: Følg venner og oppdag nye @@ -60,6 +60,7 @@ one: Følger other: Følgere following: Følger + instance_actor_flash: Denne kontoen er en virtuell figur som brukes til å representere selve serveren og ikke noen individuell bruker. Den brukes til forbundsformål og bør ikke oppheves. joined: Ble med den %{date} last_active: sist aktiv link_verified_on: Eierskap av denne lenken ble sjekket %{date} @@ -77,7 +78,6 @@ other: Tuter posts_tab_heading: Tuter posts_with_replies: Tuter med svar - reserved_username: Brukernavnet er reservert roles: admin: Administrator bot: Bot @@ -98,6 +98,7 @@ add_email_domain_block: Svartelist E-postdomenet approve: Godkjenn approve_all: Godkjenn alle + approved_msg: Godkjent %{username} sin registreringsapplikasjon are_you_sure: Er du sikker? avatar: Profilbilde by_domain: Domene @@ -114,7 +115,9 @@ delete: Slett data deleted: Slettet demote: Degrader + destroyed_msg: "%{username} sine data er nå i kø for å bli slettet minimum" disable: Deaktiver + disable_sign_in_token_auth: Deaktiver e-post token autentisering disable_two_factor_authentication: Skru av 2FA disabled: Deaktivert display_name: Visningsnavn @@ -123,11 +126,14 @@ email: E-post email_status: E-poststatus enable: Aktiver + enable_sign_in_token_auth: Aktiver godkjenning av e-post token enabled: Aktivert + enabled_msg: Frossent %{username} sin konto followers: Følgere follows: Følginger header: Overskrift inbox_url: Innboks URL + invite_request_text: Begrunnelse for å bli med invited_by: Invitert av ip: IP-adresse joined: Ble med den @@ -139,6 +145,8 @@ login_status: Innloggingsstatus media_attachments: Mediavedlegg memorialize: Gjør om til et minne + memorialized: Minnet + memorialized_msg: Vellykket gjort av %{username} til en minnestedet moderation: active: Aktive all: Alle @@ -159,10 +167,14 @@ public: Offentlig push_subscription_expires: PuSH-abonnent utløper redownload: Oppdater avatar + redownloaded_msg: Oppdatert %{username} sin profil fra opprinnelse reject: Avslå reject_all: Avslå alle + rejected_msg: Vellykket avvist %{username} sin registreringsapplikasjon remove_avatar: Fjern profilbilde remove_header: Fjern overskrift + removed_avatar_msg: Fjernet %{username} sitt avatarbilde + removed_header_msg: Fjernet %{username} sin topptekst bilde resend_confirmation: already_confirmed: Denne brukeren er allerede bekreftet send: Send bekreftelses-epost på nytt @@ -173,12 +185,17 @@ role: Rettigheter roles: admin: Administrator - moderator: Moderator + moderator: Ordstyrer staff: Personale user: Bruker search: Søk search_same_email_domain: Andre brukere med samme E-postdomene search_same_ip: Andre brukere med den samme IP-en + security_measures: + only_password: Bare passord + password_and_2fa: Passord og 2FA + password_and_sign_in_token: Passord og e-post token + sensitized: Merket som følsom shared_inbox_url: Delt Innboks URL show: created_reports: Rapporter laget av denne kontoen @@ -188,6 +205,8 @@ statuses: Statuser subscribe: Abonnere suspended: Suspendert + suspension_irreversible: Dataene fra denne kontoen har blitt ikke reverserbart slettet. Du kan oppheve suspenderingen av kontoen for å gjøre den brukbart, men den vil ikke gjenopprette alle data den tidligere har hatt. + suspension_reversible_hint_html: Kontoen har blitt suspendert, og dataene vil bli fullstendig fjernet den %{date}. Frem til da kan kontoen gjenopprettes uten negative effekter. Hvis du ønsker å fjerne alle kontoens data umiddelbart, kan du gjøre det nedenfor. time_in_queue: Venter i kø %{time} title: Kontoer unconfirmed_email: Ubekreftet E-postadresse @@ -235,43 +254,12 @@ update_custom_emoji: Oppdater tilpasset Emoji update_status: Oppdater statusen actions: - assigned_to_self_report: "%{name} tilegnet rapport %{target} til seg selv" - change_email_user: "%{name} forandret e-postadressen for bruker %{target}" - confirm_user: "%{name} bekreftet e-postadresse for bruker %{target}" - create_account_warning: "%{name} sendte en advarsel til %{target}" - create_announcement: "%{name} laget en ny kunngjøring %{target}" - create_custom_emoji: "%{name} lastet opp ny emoji %{target}" - create_domain_allow: "%{name} hvitelistet domenet %{target}" - create_domain_block: "%{name} blokkerte domenet %{target}" - create_email_domain_block: "%{name} svartelistet e-postdomenet %{target}" - create_ip_block: "%{name} opprettet en regel for IP-en %{target}" - demote_user: "%{name} degraderte bruker %{target}" - destroy_announcement: "%{name} slettet kunngjøring %{target}" - destroy_custom_emoji: "%{name} ødela emojien %{target}" - destroy_domain_allow: "%{name} fjernet domenet %{target} fra hvitelisten" - destroy_domain_block: "%{name} fjernet blokkeringen av domenet %{target}" - destroy_email_domain_block: "%{name} hvitelistet e-postdomenet %{target}" - destroy_ip_block: "%{name} slettet en regel for IP-en %{target}" - destroy_status: "%{name} fjernet status av %{target}" - disable_2fa_user: "%{name} deaktiverte tofaktor-autentiseringskravet for bruker %{target}" - disable_custom_emoji: "%{name} deaktiverte emoji %{target}" - disable_user: "%{name} deaktiverte innlogging for bruker %{target}" - enable_custom_emoji: "%{name} aktiverte emoji %{target}" - enable_user: "%{name} aktiverte innlogging for bruker %{target}" - memorialize_account: "%{name} endret %{target}s konto til en minneside" - promote_user: "%{name} oppgraderte bruker %{target}" - remove_avatar_user: "%{name} fjernet %{target} sitt profilbilde" - reopen_report: "%{name} gjenåpnet rapporten %{target}" - reset_password_user: "%{name} nullstilte passordet til bruker %{target}" - resolve_report: "%{name} avviste rapporten %{target}" - silence_account: "%{name} forstummet %{target}s konto" - suspend_account: "%{name} suspendert %{target}s konto" - unassigned_report: "%{name} avtilegnet rapport %{target}" - unsilence_account: "%{name} fjernet forstummingen av %{target}s konto" - unsuspend_account: "%{name} opphevde suspenderingen av %{target}s konto" - update_announcement: "%{name} oppdaterte kunngjøring %{target}" - update_custom_emoji: "%{name} oppdaterte emoji %{target}" - update_status: "%{name} oppdaterte status for %{target}" + create_custom_emoji_html: "%{name} lastet opp ny emoji %{target}" + create_domain_allow_html: "%{name} tillatt føderasjon med domenet %{target}" + create_domain_block_html: "%{name} blokkert domene %{target}" + create_email_domain_block_html: "%{name} blokkert e-post domene %{target}" + create_ip_block_html: "%{name} opprettet regel for IP %{target}" + silence_account_html: "%{name} begrenset %{target} sin konto" deleted_status: "(statusen er slettet)" empty: Ingen loggføringer ble funnet. filter_by_action: Sorter etter handling @@ -286,10 +274,12 @@ new: create: Lag kunngjøring title: Ny kunngjøring + publish: Publiser published_msg: Kunngjøring publisert! scheduled_for: Planlagt for %{time} scheduled_msg: Kunngjøring planlagt for publisering! title: Kunngjøringer + unpublish: Avpubliser unpublished_msg: Kunngjøring upublisert! updated_msg: Kunngjøringen er oppdatert! custom_emojis: @@ -326,33 +316,28 @@ updated_msg: Emoji oppdatert uten problemer! upload: Last opp dashboard: - authorized_fetch_mode: Sikkermodus - backlog: opphopsloggede jobber - config: Oppsett - feature_deletions: Kontoslettinger - feature_invites: Invitasjonslenker - feature_profile_directory: Profilmappe - feature_registrations: Registreringer - feature_relay: Føderasjonsoverganger - feature_spam_check: Anti-spam - feature_timeline_preview: Tidslinje-forhåndsvisning - features: Egenskaper - hidden_service: Føderering med skjulte tjenester - open_reports: åpne rapporter - pending_tags: emneknagger som venter gjennomgang - pending_users: brukere som venter gjennomgang - recent_users: Nylige brukere - search: Fulltekstsøk - single_user_mode: Enpersons-modus + active_users: aktive brukere + interactions: interaksjoner + media_storage: Medialagring + new_users: nye brukere + opened_reports: rapporter åpnet + pending_reports_html: + one: "1 ventende rapport" + other: "%{count} ventende rapporter" + pending_tags_html: + one: "1 ventende hashtag" + other: "%{count} ventende hashtags" + pending_users_html: + one: "1 ventende bruker" + other: "%{count} ventende brukere" + resolved_reports: rapporter løst software: Programvare + sources: Kilder for registreringer space: Plassbruk title: Kontrollpanel - total_users: brukere totalt - trends: Trender - week_interactions: samhandlinger denne uken - week_users_active: aktiv denne uken - week_users_new: brukere denne uken - whitelist_mode: Hvitelistemodus + top_languages: Mest aktive språk + top_servers: Mest aktive servere + website: Nettside domain_allows: add_new: Hvitelist domene created_msg: Domenet har blitt hvitelistet @@ -374,6 +359,8 @@ silence: Målbind suspend: Utvis title: Ny domeneblokkering + obfuscate: Obfuskere domenenavn + obfuscate_hint: Delvis skjule domenenavnet i listen hvis det er aktivert for å annonsere listen over domenebegrensninger private_comment: Privat kommentar private_comment_hint: Kommenter angående denne domenebegrensningen for internt bruk av moderatorene. public_comment: Offentlig kommentar @@ -410,8 +397,27 @@ create: Legg til domene title: Ny blokkeringsoppføring av e-postdomene title: Blokkering av e-postdomene + follow_recommendations: + description_html: "Følg anbefalinger hjelper nye brukere med å finne interessant innhold. Når en bruker ikke har kommunisert med andre nok til å danne personlig tilpassede følger anbefalinger, anbefales disse kontoene i stedet. De beregnes daglig på nytt fra en blanding av kontoer der de høyeste engasjementene er og med høyest lokal tilhenger for et gitt språk." + language: For språk + status: Status + suppress: Undertrykk anbefalte følger + suppressed: Dempet + title: Følg anbefalinger + unsuppress: Gjenopprett følg-anbefaling instances: + back_to_all: All + back_to_limited: Begrenset + back_to_warning: Advarsel by_domain: Domene + delivery: + all: All + clear: Feil ved fjerning + restart: Starte levering + stop: Stopp levering + title: Levering + unavailable: Ikke tilgjengelig + warning: Advarsel delivery_available: Levering er tilgjengelig known_accounts: one: "%{count} kjent konto" @@ -449,6 +455,7 @@ '94670856': 3 år new: title: Opprett ny IP-regel + no_ip_block_selected: Ingen IP-regler ble endret da ingen ble valgt title: IP-regler pending_accounts: title: Avventende brukere (%{count}) @@ -489,6 +496,8 @@ comment: none: Ingen created_at: Rapportert + forwarded: Videresendt + forwarded_to: Videresendt til %{domain} mark_as_resolved: Merk som løst mark_as_unresolved: Merk som uoppklart notes: @@ -504,10 +513,18 @@ resolved: Løst resolved_msg: Rapport løst! status: Status + target_origin: Opprinnelse for innrapportert konto title: Rapporter unassign: Fjern tilegning unresolved: Uløst updated_at: Oppdatert + rules: + add_new: Legg til et filter + delete: Slett + description_html: Mens de fleste hevder å ha lest og samtykket i tjenestevilkårene, leser de vanligvis ikke gjennom før etter et problem oppstår. Gjør det enklere å se serverens regler på et øyeblikk ved å gi dem i en flat kulepunktsliste. Prøv å holde individuelle regler korte og enkelt, men prøv å ikke dele dem opp i mange separate elementer heller. + edit: Rediger regel + empty: Ingen serverregler har blitt definert ennå. + title: Server regler settings: activity_api_enabled: desc_html: Antall lokale statusposter, aktive brukere og nye registreringer i ukentlige oppdelinger @@ -523,6 +540,7 @@ title: Egendefinert CSS default_noindex: desc_html: Påvirker alle brukerne som ikke har justert denne innstillingen selv + title: Velg brukere som er ute av søkemotoren indeksering som standard domain_blocks: all: Til alle disabled: Til ingen @@ -555,12 +573,17 @@ min_invite_role: disabled: Ingen title: Tillat invitasjoner fra + require_invite_text: + desc_html: Når registreringer krever manuell godkjenning, må du føye «Hvorfor vil du bli med?» tekstinput obligatoriske i stedet for valgfritt + title: Krev nye brukere for å oppgi en grunn for å delta registrations_mode: modes: approved: Godkjenning kreves for påmelding none: Ingen kan melde seg inn open: Hvem som helst kan melde seg inn title: Registreringsmodus + show_known_fediverse_at_about_page: + desc_html: Begrenser den offentlige tidslinjen som er knyttet til landingssiden når den er deaktivert, og viser bare lokalt innhold show_staff_badge: desc_html: Vis personalemerke på brukersiden title: Vis personalemerke @@ -577,9 +600,6 @@ desc_html: Du kan skrive din egen personverns-strategi, bruksviklår og andre regler. Du kan bruke HTML tagger title: Skreddersydde bruksvilkår site_title: Nettstedstittel - spam_check_enabled: - desc_html: Mastodon kan auto-rapportere kontoer som sender gjentatte uforespurte meldinger. Det kan oppstå falske positive treff. - title: Anti-spam-automatisering thumbnail: desc_html: Brukes ved forhandsvisning via OpenGraph og API. 1200x630px anbefales title: Miniatyrbilde for instans @@ -587,10 +607,14 @@ desc_html: Vis offentlig tidslinje på landingssiden title: Forhandsvis tidslinjen title: Nettstedsinnstillinger + trendable_by_default: + desc_html: Påvirker hashtags som ikke har blitt nektet tidligere + title: Tillat hashtags for trend uten foregående vurdering trends: title: Trendende emneknagger site_uploads: delete: Slett den opplastede filen + destroyed_msg: Vellykket sletting av sideopplasting! statuses: back_to_account: Tilbake til kontosiden batch: @@ -605,12 +629,15 @@ no_status_selected: Ingen statuser ble endret da ingen ble valgt title: Kontostatuser with_media: Med media + system_checks: + database_schema_check: + message_html: Det venter på databaseoverføringer. Vennligst kjør disse for å sikre at applikasjonen oppfører seg som forventet + rules_check: + action: Behandle serverregler + message_html: Du har ikke definert noen serverregler. tags: accounts_today: Ulike brukere i dag accounts_week: Unike brukstilfeller denne uken - context: Sammenheng - directory: I mappen - in_directory: "%{count} i mappen" last_active: Senest aktiv most_popular: Mest populært most_recent: Nyligst @@ -648,7 +675,6 @@ discovery: Oppdagelse localization: body: Mastodon er oversatt av frivillige. - guide_link: https://crowdin.com/project/mastodon guide_link_text: Alle kan bidra. sensitive_content: Sensitivt innhold toot_layout: Tut-utseende @@ -730,9 +756,6 @@ errors: invalid_key: er ikke en gyldig Ed25519- eller Curve25519-nøkkel invalid_signature: er ikke en gyldig Ed25519-signatur - date: - formats: - default: "%b %d, %Y" datetime: distance_in_words: about_x_hours: "%{count} timer" @@ -797,6 +820,7 @@ request: Be om ditt arkiv size: Størrelse blocks: Du blokkerer + bookmarks: Bokmerker csv: CSV domain_blocks: Domeneblokkeringer lists: Lister @@ -860,6 +884,7 @@ success: Dine data ble mottatt og vil bli behandlet så fort som mulig types: blocking: Blokkeringsliste + bookmarks: Bokmerker domain_blocking: Domeneblokkeringsliste following: Følgeliste muting: Dempeliste @@ -890,6 +915,10 @@ lists: errors: limit: Du har nådd det maksimale antall lister + login_activities: + authentication_methods: + password: passord + title: Autentiseringshistorikk media_attachments: validations: images_and_video: Kan ikke legge ved video på en status som allerede inneholder bilder @@ -965,6 +994,8 @@ body: 'Din status ble fremhevd av %{name}:' subject: "%{name} fremhevde din status" title: Ny fremheving + status: + subject: "%{name} postet nettopp" notifications: email_events: E-postvarslinger for hendelser email_events_hint: 'Velg hendelser som du vil motta varslinger for:' @@ -1015,6 +1046,7 @@ relationships: activity: Kontoaktivitet dormant: Dormende + follow_selected_followers: Følg valgte tilhengere followers: Følgere following: Følginger invited: Invitert @@ -1090,6 +1122,7 @@ revoke: Tilbakekall revoke_success: Økt tilbakekalt title: Økter + view_authentication_history: Vis autentiseringshistorikk for kontoen din settings: account: Konto account_settings: Kontoinnstillinger @@ -1112,8 +1145,6 @@ relationships: Følginger og følgere two_factor_authentication: Tofaktorautentisering webauthn_authentication: Sikkerhetsnøkler - spam_check: - spam_detected: Dette er en automatisert rapport. Spam har blitt oppdaget. statuses: attached: audio: @@ -1126,7 +1157,10 @@ video: one: "%{count} video" other: "%{count} videoer" + boosted_from_html: Boostet fra %{acct_link} content_warning: 'Innholdsadvarsel: %{warning}' + errors: + in_reply_not_found: Posten du prøver å svare ser ikke ut til eksisterer. language_detection: Oppdag språk automatisk open_in_web: Åpne i nettleser over_character_limit: grense på %{max} tegn overskredet @@ -1144,10 +1178,13 @@ other: "%{count} stemmer" vote: Stem show_more: Vis mer + show_newer: Vis nyere + show_older: Vis eldre show_thread: Vis tråden sign_in_to_participate: Logg på for å delta i samtalen title: "%{name}: «%{quote}»" visibilities: + direct: Direkte private: Privat private_long: Synlig kun for følgere public: Offentlig @@ -1272,10 +1309,14 @@ subject: Arkivet ditt er klart til å lastes ned sign_in_token: details: 'Her er detaljene om forsøket:' + explanation: 'Vi oppdaget et forsøk på å logge på kontoen fra en ukjent IP-adresse. Hvis dette er deg, vennligst skriv inn sikkerhetskoden nedenfor på påloggingssiden:' + further_actions: 'Hvis dette ikke var deg, vennligst endre passordet ditt og aktivere to-faktor autentisering på kontoen din. Du kan gjøre det her:' + subject: Bekreft forsøk på å logge inn title: Påloggingsforsøk warning: explanation: disable: Mens kontoen din er fryst, forblir dine kontodata intakt, men du kan ikke utføre noen handlinger før den har blitt tint opp. + sensitive: De opplastede mediefilene og linket vil bli behandlet som sensitive. silence: Mens kontoen din er begrenset, vil bare folk som allerede følger deg se dine tuter på denne tjeneren, og du kan bli ekskludert fra diverse offentlige oppføringer. Men andre kan fortsatt følge deg manuelt. suspend: Kontoen din har blitt suspendert, og alle dine tuter og opplastede media har blitt ugjenkallelig fjernet fra denne tjeneren, og fra tjenere der du hadde følgere. get_in_touch: Du kan svare på denne E-posten for å komme i kontakt med styret i %{instance}. @@ -1284,11 +1325,13 @@ subject: disable: Kontoen din, %{acct}, har blitt fryst none: Advarsel for %{acct} + sensitive: Din konto %{acct} medier har blitt merket som følsom silence: Kontoen din, %{acct}, har blitt begrenset suspend: Kontoen din, %{acct}, har blitt suspendert title: disable: Kontoen er fryst none: Advarsel + sensitive: Mediet ditt er markert som følsom silence: Kontoen er begrenset suspend: Kontoen er suspendert welcome: @@ -1309,13 +1352,14 @@ tips: Tips title: Velkommen ombord, %{name}! users: - blocked_email_provider: Denne E-postleverandøren er ikke tillatt follow_limit_reached: Du kan ikke følge mer enn %{limit} personer - invalid_email: E-postaddressen er ugyldig + generic_access_help_html: Problemer med å få tilgang til din konto? Du kan kontakte %{email} for assistanse invalid_otp_token: Ugyldig to-faktorkode invalid_sign_in_token: Ugyldig sikkerhetskode otp_lost_help_html: Hvis du mistet tilgangen til begge deler, kan du komme i kontakt med %{email} + seamless_external_login: Du er logget inn via en ekstern tjeneste, så passord og e-post innstillinger er ikke tilgjengelige. signed_in_as: 'Innlogget som:' + suspicious_sign_in_confirmation: Du ser ikke ut til å ha logget inn fra denne enheten før, og du har ikke logget inn en stund, så vi sender en sikkerhetskode til din e-postadresse for å bekrefte at det er deg. verification: explanation_html: 'Du kan bekrefte at du selv er eieren av lenkene i din profilmetadata. For å gjøre det, må det tillenkede nettstedet inneholde en lenke som fører tilbake til Mastodon-profilen din. Lenken tilbake ha en rel="me"-attributt. Tekstinnholdet til lenken er irrelevant. Her er et eksempel:' verification: Bekreftelse @@ -1326,7 +1370,11 @@ delete: Slett delete_confirmation: Er du sikker på at du vil slette denne sikkerhetsnøkkelen? destroy: + error: Det oppsto et problem med å slette sikkerhetsnøkkelen. Prøv igjen. success: Sikkerhetsnøkkelen din ble vellykket slettet. invalid_credential: Ugyldig sikkerhetsnøkkel + nickname_hint: Skriv inn kallenavnet til din nye sikkerhetsnøkkel + not_enabled: Du har ikke aktivert WebAuthn ennå not_supported: Denne nettleseren støtter ikke sikkerhetsnøkler + otp_required: For å bruke sikkerhetsnøkler, må du først aktivere to-faktor autentisering. registered_on: Registrert den %{date} diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 3837ce56a5..64035d34a8 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -23,6 +23,7 @@ oc: hosted_on: Mastodon albergat sus %{domain} learn_more: Ne saber mai privacy_policy: Politica de confidencialitat + rules: Règlas del servidor see_whats_happening: Agachatz çò qu’arriba server_stats: 'Estatisticas del servidor :' source_code: Còdi font @@ -71,7 +72,6 @@ oc: other: Tuts posts_tab_heading: Tuts posts_with_replies: Tuts e responsas - reserved_username: Aqueste nom d’utilizaire es reservat roles: admin: Admin bot: Robòt @@ -226,42 +226,6 @@ oc: update_announcement: Actualizar l’anóncia update_custom_emoji: Actualizar l’emoji personalizat update_status: Actualizar l’estatut - actions: - assigned_to_self_report: "%{name} s’assignèt lo rapòrt %{target}" - change_email_user: "%{name} cambièt l’adreça de corrièl de %{target}" - confirm_user: "%{name} confirmèt l’adreça a %{target}" - create_account_warning: "%{name} mandèt un avertiment a %{target}" - create_announcement: "%{name} creèt una nòva anóncia %{target}" - create_custom_emoji: "%{name} mandèt un nòu emoji %{target}" - create_domain_allow: "%{name} botèt a la lista blanca lo domeni %{target}" - create_domain_block: "%{name} bloquèt lo domeni %{target}" - create_email_domain_block: "%{name} botèt a la lista nègra lo domeni de corrièl %{target}" - demote_user: "%{name} retragradèt l‘utilizaire %{target}" - destroy_announcement: "%{name} suprimiguèt una anóncia %{target}" - destroy_custom_emoji: "%{name} destruguèt l’emoji %{target}" - destroy_domain_allow: "%{name} levèt lo domeni %{target} de la lista blanca" - destroy_domain_block: "%{name} desbloquèt lo domeni %{target}" - destroy_email_domain_block: "%{name} botèt a la lista blanca lo domeni de corrièl %{target}" - destroy_status: "%{name} levèt l‘estatut a %{target}" - disable_2fa_user: "%{name} desactivèt l’autentificacion en dos temps per %{target}" - disable_custom_emoji: "%{name} desactivèt l’emoji %{target}" - disable_user: "%{name} desactivèt la connexion per %{target}" - enable_custom_emoji: "%{name} activèt l’emoji %{target}" - enable_user: "%{name} activèt la connexion per %{target}" - memorialize_account: "%{name} transformèt en memorial la pagina de perfil a %{target}" - promote_user: "%{name} promoguèt %{target}" - remove_avatar_user: "%{name} suprimèt l’avatar a %{target}" - reopen_report: "%{name} tornèt dobrir lo rapòrt %{target}" - reset_password_user: "%{name} reïnicializèt lo senhal a %{target}" - resolve_report: "%{name} anullèt lo rapòrt %{target}" - silence_account: "%{name} metèt en silenci lo compte a %{target}" - suspend_account: "%{name} susprenguèt lo compte a %{target}" - unassigned_report: "%{name} daissèt de tractar lo rapòrt %{target}" - unsilence_account: "%{name} levèt lo silenci del compte a %{target}" - unsuspend_account: "%{name} restabliguèt lo compte a %{target}" - update_announcement: "%{name} actualizèt una anóncia %{target}" - update_custom_emoji: "%{name} metèt a jorn l’emoji %{target}" - update_status: "%{name} metèt a jorn l’estatut a %{target}" deleted_status: "(estatut suprimit)" empty: Cap de jornal pas trobat. filter_by_action: Filtrar per accion @@ -276,10 +240,12 @@ oc: new: create: Crear una anóncia title: Anóncia novèla + publish: Publicar published_msg: Anóncia corrèctament publicada ! scheduled_for: Programada per %{time} scheduled_msg: Anóncia programada per publicacion ! title: Anóncias + unpublish: Despublicar unpublished_msg: Anóncia corrèctament tirada ! updated_msg: Anóncia corrèctament actualizada ! custom_emojis: @@ -315,33 +281,26 @@ oc: updated_msg: Emoji ben mes a jorn ! upload: Enviar dashboard: - authorized_fetch_mode: Mòde recuperacion autorizat - backlog: Accions en retard - config: Configuracion - feature_deletions: Supressions de comptes - feature_invites: Ligams convidat - feature_profile_directory: Annuari de perfils - feature_registrations: Inscripcions - feature_relay: Relai de federacion - feature_spam_check: Anti-spam - feature_timeline_preview: Apercebut del flux d’actualitats - features: Foncionalitats - hidden_service: Federacion amb servicis amagats - open_reports: Senhalaments dobèrts - pending_tags: etiquetas en espèra de validacion - pending_users: utilizaires en espèra de validacion - recent_users: Utilizaires recents - search: Recèrca tèxte complèt - single_user_mode: Mòde sol utilizaire + active_users: utilizaires actius + interactions: interraccions + media_storage: Emmagazinatge dels mèdias + new_users: utilizaire novèl + pending_reports_html: + one: "1 senhalament en espèra" + other: "%{count} senhalaments en espèra" + pending_tags_html: + one: "1 etiqueta en espèra" + other: "%{count} etiquetas en espèra" + pending_users_html: + one: "1 utilizaire en espèra" + other: "%{count} utilizaires en espèra" + resolved_reports: senhalament resolguts software: Logicial space: Utilizacion de l’espaci title: Tablèu de bòrd - total_users: total dels utilizaires - trends: Tendéncias - week_interactions: interaccions aquesta setmana - week_users_active: actius aquesta setmana - week_users_new: utilizaires aquesta setmana - whitelist_mode: Mòde lista blanca + top_languages: Lengas mai activas + top_servers: Servidors mai actius + website: Site web domain_allows: add_new: Plaçar en lista blanca created_msg: Lo domeni es corrèctament estat plaçat en lista blanca @@ -398,6 +357,9 @@ oc: create: Crear un blocatge title: Nòu blocatge de domeni de corrièl title: Blocatge de domeni de corrièl + follow_recommendations: + language: Per lenga + status: Estat instances: by_domain: Domeni delivery_available: Liurason disponibla @@ -495,6 +457,8 @@ oc: unassign: Levar unresolved: Pas resolgut updated_at: Actualizat + rules: + title: Règlas del servidor settings: activity_api_enabled: desc_html: Nombre d’estatuts publicats, d’utilizaires actius e de novèlas inscripcions en rapòrt setmanièr @@ -517,13 +481,11 @@ oc: users: Als utilizaires locals connectats domain_blocks_rationale: title: Mostrar lo rasonament - enable_bootstrap_timeline_accounts: - title: Activar lo seguiment per defaut pels nòuvenguts hero: desc_html: Mostrat en primièra pagina. Almens 600x100px recomandat. S’es pas configurat l’imatge del servidor serà mostrat title: Imatge de l’eròi mascot: - desc_html: Mostrat sus mantun paginas. Almens 293×205px recomandat. S’es pas configurat, mostrarem la mascòta per defaut + desc_html: Mostrat sus mantun pagina. Almens 293×205px recomandat. S’es pas configurat, mostrarem la mascòta per defaut title: Imatge de la mascòta peers_api_enabled: desc_html: Noms de domeni qu’aqueste servidor a trobats pel fediverse @@ -569,8 +531,6 @@ oc: desc_html: Afichada sus la pagina de las condicions d’utilizacion
    Podètz utilizar de balisas HTML title: Politica de confidencialitat del site site_title: Títol del servidor - spam_check_enabled: - title: Anti-spam thumbnail: desc_html: Servís pels apercebuts via OpenGraph e las API. Talha de 1200x630px recomandada title: Miniatura del servidor @@ -596,12 +556,13 @@ oc: no_status_selected: Cap d’estatut pas cambiat estant que cap èra pas seleccionat title: Estatuts del compte with_media: Amb mèdia + system_checks: + rules_check: + action: Gerir las règlas servidor + message_html: Avètz pas definida cap de règla. tags: accounts_today: Utilizacions unicas uèi accounts_week: Utilizacions unicas aquesta setmana - context: Contèxt - directory: A l’annuari - in_directory: "%{count} a l’annuari" last_active: Darrièra activitat most_popular: Mai popularas most_recent: Mai recentas @@ -640,7 +601,6 @@ oc: discovery: Descobèrta localization: body: Mastodon es traduch per de benevòls. - guide_link: https://crowdin.com/project/mastodon guide_link_text: Tot lo monde pòt contribuïr. sensitive_content: Contengut sensible toot_layout: Disposicion del tut @@ -726,7 +686,6 @@ oc: x_days: "%{count} jorns" x_minutes: "%{count} min" x_months: "%{count} meses" - x_seconds: "%{count}s" deletes: challenge_not_passed: Las informacions qu’avètz fornidas son pas corrèctas confirm_password: Picatz vòstre senhal actual per verificar vòstra identitat @@ -941,6 +900,8 @@ oc: body: "%{name} a tornat partejar vòstre estatut :" subject: "%{name} a tornat partejar vòstre estatut" title: Novèl partatge + status: + subject: "%{name} ven de publicar" notifications: email_events: Eveniments per las notificacions per corrièl email_events_hint: 'Seleccionatz los eveniments que volètz recebre :' @@ -949,12 +910,6 @@ oc: human: decimal_units: format: "%n%u" - units: - billion: B - million: M - quadrillion: Q - thousand: K - trillion: T otp_authentication: enable: Activar setup: Parametrar @@ -963,7 +918,6 @@ oc: next: Seguent older: Mai ancians prev: Precedent - truncate: "…" polls: errors: already_voted: Avètz ja votat per aqueste sondatge @@ -1083,8 +1037,6 @@ oc: relationships: Abonaments e seguidors two_factor_authentication: Autentificacion en dos temps webauthn_authentication: Claus de seguretat - spam_check: - spam_detected: Aquò es un senhalament automatic. D’spam es estat detectat. statuses: attached: audio: @@ -1119,6 +1071,8 @@ oc: other: "%{count} vòtes" vote: Votar show_more: Ne veire mai + show_newer: Veire mai recents + show_older: Veire mai ancians show_thread: Mostrar lo fil sign_in_to_participate: Inscrivètz-vos per participar a la conversacion title: '%{name} : "%{quote}"' @@ -1129,6 +1083,11 @@ oc: public_long: Tot lo monde pòt veire unlisted: Pas listat unlisted_long: Tot lo monde pòt veire mai serà pas visible sul flux public + statuses_cleanup: + enabled: Supression automatica de publicacions ancianas + keep_direct: Gardar los messatges dirèctes + keep_media: Gardar las publicacions amb pèça-junta + keep_pinned: Gardar las publicacions penjadas stream_entries: pinned: Tut penjat reblogged: a partejat @@ -1236,6 +1195,7 @@ oc: enabled_success: L’autentificacion en dos temps es ben activada generate_recovery_codes: Generar los còdis de recuperacion lost_recovery_codes: Los còdi de recuperacion vos permeton d’accedir a vòstre compte se perdètz vòstre mobil. S’avètz perdut vòstres còdis de recuperacion los podètz tornar generar aquí. Los ancians còdis seràn pas mai valides. + methods: Metòde en dos temps recovery_codes: Salvar los còdis de recuperacion recovery_codes_regenerated: Los còdis de recuperacion son ben estats tornats generar recovery_instructions_html: Se vos arriba de perdre vòstre mobil, podètz utilizar un dels còdis de recuperacion cai-jos per poder tornar accedir a vòstre compte. Gardatz los còdis en seguretat, per exemple, imprimissètz los e gardatz los amb vòstres documents importants. @@ -1248,7 +1208,7 @@ oc: warning: explanation: disable: Quand vòstre compte es gelat, las donadas d’aqueste demòran senceras, mas podètz pas realizar cap d’accion fins que siá desblocat. - silence: Del temps que vòstre compte es limitat, solament lo monde que vos sègon veiràn vòstres tuts sus aqueste servidor, e poiriatz èsser tirat de mantunas listas publicas. Pasmens, d’autres vos pòdon sègre manualament. + silence: Del temps que vòstre compte es limitat, solament lo monde que vos sègon veiràn vòstres tuts sus aqueste servidor, e poiriatz èsser tirat de mantuna lista publica. Pasmens, d’autres vos pòdon sègre manualament. suspend: Vòstre compte es suspendut e totes vòstres tuts e fichièrs enviats son estats suprimits sens retorn possible d’aqueste servidor e los de vòstres seguidors. get_in_touch: Podètz respondre a aqueste corrièl per contactar la còla de %{instance}. review_server_policies: Repassar las politicas del servidor @@ -1282,7 +1242,6 @@ oc: title: Vos desirem la benvenguda a bòrd %{name} ! users: follow_limit_reached: Podètz pas sègre mai de %{limit} personas - invalid_email: L’adreça de corrièl es invalida invalid_otp_token: Còdi d’autentificacion en dos temps invalid invalid_sign_in_token: Còdi de seguretat invalid otp_lost_help_html: Se perdatz l’accès al dos, podètz benlèu contactar %{email} diff --git a/config/locales/pa.yml b/config/locales/pa.yml new file mode 100644 index 0000000000..0fc957a99f --- /dev/null +++ b/config/locales/pa.yml @@ -0,0 +1,12 @@ +--- +pa: + errors: + '400': The request you submitted was invalid or malformed. + '403': You don't have permission to view this page. + '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. + '410': The page you were looking for doesn't exist here anymore. + '422': + '429': Too many requests + '500': + '503': The page could not be served due to a temporary server failure. diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 23c67267e0..8023251c9a 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -26,6 +26,8 @@ pl: Jest używane w celu federowania i nie powinno być blokowane, chyba że chcesz zablokować całą instację, w takim przypadku użyj blokady domeny. learn_more: Dowiedz się więcej privacy_policy: Polityka prywatności + rules: Regulamin serwera + rules_html: 'Poniżej znajduje się podsumowanie zasad, których musisz przestrzegać, jeśli chcesz mieć konto na tym serwerze Mastodona:' see_whats_happening: Zobacz co się dzieje server_stats: 'Statystyki serwera:' source_code: Kod źródłowy @@ -86,7 +88,6 @@ pl: other: Wpisów posts_tab_heading: Wpisy posts_with_replies: Wpisy z odpowiedziami - reserved_username: Ta nazwa użytkownika jest zarezerwowana roles: admin: Administrator bot: Bot @@ -126,6 +127,7 @@ pl: demote: Degraduj destroyed_msg: Dane %{username} są teraz w kolejce do natychmiastowego usunięcia disable: Dezaktywuj + disable_sign_in_token_auth: Wyłącz uwierzytelnianie tokenu e-mail disable_two_factor_authentication: Wyłącz uwierzytelnianie dwuetapowe disabled: Dezaktywowano display_name: Wyświetlana nazwa @@ -134,6 +136,7 @@ pl: email: Adres e-mail email_status: Stan e-maila enable: Aktywuj + enable_sign_in_token_auth: Włącz uwierzytelnianie tokenu e-mail enabled: Aktywowano enabled_msg: Pomyślnie odblokowano konto %{username} followers: Śledzący @@ -198,6 +201,10 @@ pl: search: Szukaj search_same_email_domain: Inni użytkownicy z e-mail w tej domenie search_same_ip: Inni użytkownicy z tym samym IP + security_measures: + only_password: Tylko hasło + password_and_2fa: Hasło i 2FA + password_and_sign_in_token: Hasło i token e-mail sensitive: Wrażliwe sensitized: oznaczono jako wrażliwe shared_inbox_url: Adres udostępnianej skrzynki @@ -237,6 +244,7 @@ pl: create_domain_block: Utwórz blokadę domeny create_email_domain_block: Utwórz blokadę domeny e-mail create_ip_block: Utwórz regułę IP + create_unavailable_domain: Utwórz niedostępną domenę demote_user: Zdegraduj użytkownika destroy_announcement: Usuń ogłoszenie destroy_custom_emoji: Usuń niestandardowe emoji @@ -245,10 +253,13 @@ pl: destroy_email_domain_block: Usuń blokadę domeny e-mail destroy_ip_block: Usuń regułę IP destroy_status: Usuń wpis + destroy_unavailable_domain: Usuń niedostępną domenę disable_2fa_user: Wyłącz 2FA disable_custom_emoji: Wyłącz niestandardowe emoji + disable_sign_in_token_auth_user: Wyłącz uwierzytelnianie tokenu e-mail dla użytkownika disable_user: Wyłącz użytkownika enable_custom_emoji: Włącz niestandardowe emoji + enable_sign_in_token_auth_user: Włącz uwierzytelnianie tokenu e-mail dla użytkownika enable_user: Włącz użytkownika memorialize_account: Upamiętnij konto promote_user: Podnieś uprawnienia @@ -268,46 +279,50 @@ pl: update_domain_block: Zaktualizuj blokadę domeny update_status: Aktualizuj wpis actions: - assigned_to_self_report: "%{name} przypisał(a) sobie zgłoszenie %{target}" - change_email_user: "%{name} zmienił(a) adres e-mail użytkownika %{target}" - confirm_user: "%{name} potwierdził(a) adres e-mail użytkownika %{target}" - create_account_warning: "%{name} wysłał(a) ostrzeżenie do %{target}" - create_announcement: "%{name} utworzył(a) nowe ogłoszenie %{target}" - create_custom_emoji: "%{name} dodał(a) nowe emoji %{target}" - create_domain_allow: "%{name} dodał(a) na białą listę domenę %{target}" - create_domain_block: "%{name} zablokował(a) domenę %{target}" - create_email_domain_block: "%{name} dodał(a) domenę e-mail %{target} na czarną listę" - create_ip_block: "%{name} stworzył dla IP %{target}" - demote_user: "%{name} zdegradował(a) użytkownika %{target}" - destroy_announcement: "%{name} usunął(-ęła) ogłoszenie %{target}" - destroy_custom_emoji: "%{name} usunął(-ęła) emoji %{target}" - destroy_domain_allow: "%{name} usunął(-ęła) domenę %{target} z białej listy" - destroy_domain_block: "%{name} odblokował(a) domenę %{target}" - destroy_email_domain_block: "%{name} usunął(-ęła) domenę e-mail %{target} z czarnej listy" - destroy_ip_block: "%{name} usunął regułę dla IP %{target}" - destroy_status: "%{name} usunął(-ęła) wpis użytkownika %{target}" - disable_2fa_user: "%{name} wyłączył(a) uwierzytelnianie dwustopniowe użytkownikowi %{target}" - disable_custom_emoji: "%{name} wyłączył(a) emoji %{target}" - disable_user: "%{name} zablokował(a) możliwość logowania użytkownikowi %{target}" - enable_custom_emoji: "%{name} włączył(a) emoji %{target}" - enable_user: "%{name} przywrócił(a) możliwość logowania użytkownikowi %{target}" - memorialize_account: "%{name} nadał(a) kontu %{target} status in memoriam" - promote_user: "%{name} podniósł(a) uprawnienia użytkownikowi %{target}" - remove_avatar_user: "%{name} usunął(-ęła) awatar użytkownikowi %{target}" - reopen_report: "%{name} otworzył(a) ponownie zgłoszenie %{target}" - reset_password_user: "%{name} przywrócił(a) hasło użytkownikowi %{target}" - resolve_report: "%{name} rozwiązał(a) zgłoszenie %{target}" - sensitive_account: "%{name} oznaczył(a) zawartość multimedialną %{target} jako wrażliwą" - silence_account: "%{name} wyciszył(a) konto %{target}" - suspend_account: "%{name} zawiesił(a) konto %{target}" - unassigned_report: "%{name} cofnął(-ęła) przypisanie zgłoszenia %{target}" - unsensitive_account: "%{name} cofnął(-ęła) oznaczenie zawartości multimedialnej %{target} jako wrażliwą" - unsilence_account: "%{name} cofnął(-ęła) wyciszenie konta %{target}" - unsuspend_account: "%{name} cofnął(-ęła) zawieszenie konta %{target}" - update_announcement: "%{name} zaktualizował(-a) ogłoszenie %{target}" - update_custom_emoji: "%{name} zaktualizował(a) emoji %{target}" - update_domain_block: "%{name} zaktualizował(-a) blokadę domeny dla %{target}" - update_status: "%{name} zaktualizował(a) wpis użytkownika %{target}" + assigned_to_self_report_html: "%{name} przypisał(a) sobie zgłoszenie %{target}" + change_email_user_html: "%{name} zmienił(a) adres e-mail użytkownika %{target}" + confirm_user_html: "%{name} potwierdził(a) adres e-mail użytkownika %{target}" + create_account_warning_html: "%{name} wysłał(a) ostrzeżenie do %{target}" + create_announcement_html: "%{name} utworzył(a) nowe ogłoszenie %{target}" + create_custom_emoji_html: "%{name} dodał(a) nowe emoji %{target}" + create_domain_allow_html: "%{name} dodał(a) na białą listę domenę %{target}" + create_domain_block_html: "%{name} zablokował(a) domenę %{target}" + create_email_domain_block_html: "%{name} dodał(a) domenę e-mail %{target} na czarną listę" + create_ip_block_html: "%{name} stworzył(a) regułę dla IP %{target}" + create_unavailable_domain_html: "%{name} przestał(a) doręczać na domenę %{target}" + demote_user_html: "%{name} zdegradował(a) użytkownika %{target}" + destroy_announcement_html: "%{name} usunął(-ęła) ogłoszenie %{target}" + destroy_custom_emoji_html: "%{name} usunął(-ęła) emoji %{target}" + destroy_domain_allow_html: "%{name} usunął(-ęła) domenę %{target} z białej listy" + destroy_domain_block_html: "%{name} odblokował(a) domenę %{target}" + destroy_email_domain_block_html: "%{name} usunął(-ęła) domenę e-mail %{target} z czarnej listy" + destroy_ip_block_html: "%{name} usunął(-ęła) regułę dla IP %{target}" + destroy_status_html: "%{name} usunął(-ęła) wpis użytkownika %{target}" + destroy_unavailable_domain_html: "%{name} wznowił(a) doręczanie do domeny %{target}" + disable_2fa_user_html: "%{name} wyłączył(a) uwierzytelnianie dwustopniowe użytkownikowi %{target}" + disable_custom_emoji_html: "%{name} wyłączył(a) emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} wyłączył/a uwierzytelnianie tokenem e-mail dla %{target}" + disable_user_html: "%{name} zablokował(a) możliwość logowania użytkownikowi %{target}" + enable_custom_emoji_html: "%{name} włączył(a) emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} włączył/a uwierzytelnianie tokenem e-mail dla %{target}" + enable_user_html: "%{name} przywrócił(a) możliwość logowania użytkownikowi %{target}" + memorialize_account_html: "%{name} nadał(a) kontu %{target} status in memoriam" + promote_user_html: "%{name} podniósł(a) uprawnienia użytkownikowi %{target}" + remove_avatar_user_html: "%{name} usunął(-ęła) awatar użytkownikowi %{target}" + reopen_report_html: "%{name} otworzył(a) ponownie zgłoszenie %{target}" + reset_password_user_html: "%{name} przywrócił(a) hasło użytkownikowi %{target}" + resolve_report_html: "%{name} rozwiązał(a) zgłoszenie %{target}" + sensitive_account_html: "%{name} oznaczył(a) zawartość multimedialną %{target} jako wrażliwą" + silence_account_html: "%{name} wyciszył(a) konto %{target}" + suspend_account_html: "%{name} zawiesił(a) konto %{target}" + unassigned_report_html: "%{name} cofnął(-ęła) przypisanie zgłoszenia %{target}" + unsensitive_account_html: "%{name} cofnął(-ęła) oznaczenie zawartości multimedialnej %{target} jako wrażliwą" + unsilence_account_html: "%{name} cofnął(-ęła) wyciszenie konta %{target}" + unsuspend_account_html: "%{name} cofnął(-ęła) zawieszenie konta %{target}" + update_announcement_html: "%{name} zaktualizował(a) ogłoszenie %{target}" + update_custom_emoji_html: "%{name} zaktualizował(a) emoji %{target}" + update_domain_block_html: "%{name} zaktualizował(a) blokadę domeny dla %{target}" + update_status_html: "%{name} zaktualizował(a) wpis użytkownika %{target}" deleted_status: "(usunięty wpis)" empty: Nie znaleziono aktywności w dzienniku. filter_by_action: Filtruj według działania @@ -322,10 +337,12 @@ pl: new: create: Utwórz ogłoszenie title: Nowe ogłoszenie + publish: Opublikuj published_msg: Pomyślnie opublikowano ogłoszenie! scheduled_for: Zaplanowano na %{time} scheduled_msg: Zaplanowano publikację ogłoszenia! title: Ogłoszenia + unpublish: Cofnij publikację unpublished_msg: Pomyślnie wycofano publikację ogłoszenia! updated_msg: Pomyślnie zaktualizowano ogłoszenie! custom_emojis: @@ -362,33 +379,34 @@ pl: updated_msg: Pomyślnie zaktualizowano emoji! upload: Dodaj dashboard: - authorized_fetch_mode: Tryb bezpieczny - backlog: zaległe zadania - config: Konfiguracja - feature_deletions: Usuwanie kont - feature_invites: Zaproszenia - feature_profile_directory: Katalog profilów - feature_registrations: Rejestracja - feature_relay: Przekazywanie federacji - feature_spam_check: Anty-spam - feature_timeline_preview: Podgląd osi czasu - features: Możliwości - hidden_service: Federowanie z ukrytymi usługami - open_reports: otwarte zgłoszenia - pending_tags: hasztagi oczekujące na sprawdzenie - pending_users: użytkownicy oczekujący na sprawdzenie - recent_users: Ostatni użytkownicy - search: Wyszukiwanie pełnego tekstu - single_user_mode: Tryb jednego użytkownika + active_users: aktywni użytkownicy + interactions: interakcje + media_storage: Przechowywanie mediów + new_users: nowi użytkownicy + opened_reports: otwarte zgłoszenia + pending_reports_html: + few: "%{count} oczekujące raporty" + many: "%{count} oczekujących raportów" + one: "1 oczekujący raport" + other: "%{count} oczekujących raportów" + pending_tags_html: + few: "%{count} oczekujące hashtagi" + many: "%{count} oczekujących hashtagów" + one: "1 oczekujący hashtag" + other: "%{count} oczekujących hashtagów" + pending_users_html: + few: "%{count} oczekujących użytkowników" + many: "%{count} oczekujących użytkowników" + one: "1 oczekujący użytkownik" + other: "%{count} oczekujących użytkowników" + resolved_reports: zamkniętych zgłoszeń software: Oprogramowanie + sources: Źródła rejestracji space: Używana powierzchnia title: Panel administracyjny - total_users: łącznie użytkowników - trends: Na czasie - week_interactions: interakcje w tym tygodniu - week_users_active: aktywni w tym tygodniu - week_users_new: rejestracje w tym tygodniu - whitelist_mode: Tryb białej listy + top_languages: Najbardziej aktywne języki + top_servers: Najbardziej aktywne serwery + website: Strona domain_allows: add_new: Zatwierdź domenę created_msg: Domena dodana do białej listy @@ -450,9 +468,36 @@ pl: create: Utwórz blokadę title: Nowa blokada domeny e-mail title: Blokowanie domen e-mail + follow_recommendations: + description_html: "Polecane śledzenia pomagają nowym użytkownikom szybko odnaleźć interesujące treści. Jeżeli użytkownik nie wchodził w interakcje z innymi wystarczająco często, aby powstały spersonalizowane rekomendacje, polecane są te konta. Są one obliczane każdego dnia na podstawie kombinacji kont o największej liczbie niedawnej aktywności i największej liczbie lokalnych obserwatorów dla danego języka." + language: Dla języka + status: Stan + suppress: Usuń polecenie śledzenia + suppressed: Usunięto + title: Polecane konta + unsuppress: Przywróć polecenie śledzenia konta instances: + back_to_all: Wszystkie + back_to_limited: Ograniczone + back_to_warning: Ostrzeżenie by_domain: Domena + delivery: + all: Wszystkie + clear: Wyczyść błędy w doręczaniu + restart: Uruchom ponownie doręczenie + stop: Zatrzymaj doręczanie + title: Doręczanie + unavailable: Niedostępne + unavailable_message: Doręczaniei niedostępne + warning: Ostrzeżenie + warning_message: + few: "%{count} dni niepowodzenia doręczenia" + many: "%{count} dni niepowodzenia doręczenia" + one: "%{count} dzień niepowodzenia doręczenia" + other: "%{count} dni niepowodzenia doręczenia" delivery_available: Doręczanie jest dostępne + delivery_error_days: Dni błędów doręczenia + delivery_error_hint: Jeżeli doręczanie nie będzie możliwe przez %{count} dni, zostanie automatycznie oznaczona jako nie do doręczania. empty: Nie znaleziono domen. known_accounts: few: "%{count} znane konta" @@ -554,10 +599,18 @@ pl: resolved: Rozwiązane resolved_msg: Pomyślnie rozwiązano zgłoszenie. status: Stan + target_origin: Pochodzenie zgłaszanego konta title: Zgłoszenia unassign: Cofnij przypisanie unresolved: Nierozwiązane updated_at: Zaktualizowano + rules: + add_new: Dodaj zasadę + delete: Usuń + description_html: Chociaż większość twierdzi, że przeczytała i zgadza się z warunkami korzystania z usługi, zwykle ludzie nie czytają ich, dopóki nie pojawi się problem. Ułatw użytkownikom szybkie przejrzenie zasad serwera, umieszczając je na prostej liście punktowanej. Postaraj się, aby poszczególne zasady były krótkie i proste, ale staraj się też nie dzielić ich na wiele oddzielnych elementów. + edit: Edytuj zasadę + empty: Jeszcze nie zdefiniowano zasad serwera. + title: Regulamin serwera settings: activity_api_enabled: desc_html: Liczy publikowane lokalnie wpisy, aktywnych użytkowników i nowe rejestracje w ciągu danego tygodnia @@ -581,9 +634,6 @@ pl: users: Zalogowanym lokalnym użytkownikom domain_blocks_rationale: title: Pokaż uzasadnienia - enable_bootstrap_timeline_accounts: - desc_html: Niech nowi użytkownicy automatycznie śledzą ustawione konta, aby ich główna oś czasu nie był początkowo pusta - title: Dodawaj domyślne obserwacje nowym użytkownikom hero: desc_html: Wyświetlany na stronie głównej. Zalecany jest rozmiar przynajmniej 600x100 pikseli. Jeżeli nie ustawiony, zostanie użyta miniatura serwera title: Obraz bohatera @@ -637,9 +687,6 @@ pl: desc_html: Miejsce na własną politykę prywatności, zasady użytkowania i inne unormowania prawne. Możesz korzystać ze znaczników HTML title: Niestandardowe zasady użytkowania site_title: Nazwa serwera - spam_check_enabled: - desc_html: Mastodon może automatycznie zgłaszać konta, które wysyłają powtarzające się niechciane wiadomości. Część zgłoszeń może być nieprawidłowa. - title: Automatyzacja antyspamu thumbnail: desc_html: 'Używana w podglądzie przez OpenGraph i API. Zalecany rozmiar: 1200x630 pikseli' title: Miniatura serwera @@ -670,13 +717,18 @@ pl: no_status_selected: Żaden wpis nie został zmieniony, bo żaden nie został wybrany title: Wpisy konta with_media: Z zawartością multimedialną + system_checks: + database_schema_check: + message_html: Istnieją oczekujące migracje bazy danych. Uruchom je, aby upewnić się, że aplikacja działa tak, jak powinna + rules_check: + action: Zarządzaj regułami serwera + message_html: Nie zdefiniowano żadnych reguł serwera. + sidekiq_process_check: + message_html: Brak uruchomionego procesu Sidekiq dla kolejki(-ek) %{value}. Sprawdź konfigurację Sidekiq tags: accounts_today: Unikalne wykorzystania dzisiaj accounts_week: Unikalne wykorzystania w tym tygodniu breakdown: Podział dzisiejszego wykorzystania według źródła - context: Kontekst - directory: W katalogu - in_directory: "%{count} w katalogu" last_active: Ostatnia aktywność most_popular: Najpopularniejsze most_recent: Ostatnie @@ -693,6 +745,7 @@ pl: add_new: Dodaj nowy delete: Usuń edit_preset: Edytuj szablon ostrzeżenia + empty: Nie zdefiniowano jeszcze żadnych szablonów ostrzegawczych. title: Zarządzaj szablonami ostrzeżeń admin_mailer: new_pending_account: @@ -821,7 +874,7 @@ pl: x_days: "%{count} dni" x_minutes: "%{count}min" x_months: "%{count} miesięcy" - x_seconds: "%{count}s" + x_seconds: "%{count} s" deletes: challenge_not_passed: Wprowadzone informacje za nieprawidłowe confirm_password: Wprowadź aktualne hasło, aby potwierdzić tożsamość @@ -986,6 +1039,17 @@ pl: lists: errors: limit: Przekroczyłeś maksymalną liczbę utworzonych list + login_activities: + authentication_methods: + otp: aplikacja weryfikacji dwuetapowej + password: hasło + sign_in_token: kod bezpieczeństwa e-mail + webauthn: klucze bezpieczeństwa + description_html: Jeśli widzisz aktywność, której nie rozpoznajesz, rozważ zmianę hasła i włączenie weryfikacji dwuetapowej. + empty: Brak historii uwierzytelniania + failed_sign_in_html: Próba logowania zakończona niepowodzeniem przy pomocy %{method} z %{ip} (%{browser}) + successful_sign_in_html: Pomyślne logowanie przy pomocy %{method} z %{ip} (%{browser}) + title: Historia uwierzytelniania media_attachments: validations: images_and_video: Nie możesz załączyć pliku wideo do wpisu, który zawiera już zdjęcia @@ -1062,10 +1126,14 @@ pl: body: "%{name} wspomniał(a) o Tobie w:" subject: "%{name} wspomniał(a) o Tobie" title: Nowe wspomnienie o Tobie + poll: + subject: Ankieta %{name} zakończyła się reblog: body: 'Twój wpis został podbity przez %{name}:' subject: Twój wpis został podbity przez %{name} title: Nowe podbicie + status: + subject: "%{name} właśnie opublikował(a) wpis" notifications: email_events: 'Powiadamiaj e-mailem o:' email_events_hint: 'Wybierz wydarzenia, o których chcesz otrzymywać powiadomienia:' @@ -1164,7 +1232,7 @@ pl: generic: nieznana przeglądarka ie: Internet Explorer micro_messenger: MicroMessenger - nokia: Nokia S40 Ovi Browser + nokia: Przeglądarka Nokia S40 Ovi opera: Opera otter: Przeglądarka Otter phantom_js: PhantomJS @@ -1192,6 +1260,7 @@ pl: revoke: Unieważnij revoke_success: Pomyślnie unieważniono sesję title: Sesje + view_authentication_history: Zobacz historię uwierzytelniania swojego konta settings: account: Konto account_settings: Ustawienia konta @@ -1212,10 +1281,9 @@ pl: preferences: Preferencje profile: Profil relationships: Śledzeni i śledzący + statuses_cleanup: Automatyczne usuwanie posta two_factor_authentication: Uwierzytelnianie dwuetapowe webauthn_authentication: Klucze bezpieczeństwa - spam_check: - spam_detected: To zgłoszenie jest automatyczne. Został wykryty spam. statuses: attached: audio: @@ -1270,12 +1338,47 @@ pl: sign_in_to_participate: Zaloguj się, aby udzielić się w tej konwersacji title: '%{name}: "%{quote}"' visibilities: + direct: Bezpośredni private: Tylko dla śledzących private_long: Widoczne tylko dla osób, które Cię śledzą public: Publiczne public_long: Widoczne dla wszystkich użytkowników unlisted: Niewypisane unlisted_long: Widoczne dla wszystkich, ale nie wyświetlane na publicznych osiach czasu + statuses_cleanup: + enabled: Automatycznie usuwaj stare wiadomości + enabled_hint: Automatycznie usuwa Twoje posty, gdy osiągną określony próg wiekowy, chyba że spełniają jeden z poniższych wyjątków + exceptions: Wyjątki + explanation: Ponieważ usuwanie postów jest kosztowną operacją, odbywa się to powoli, gdy serwer nie jest zajęty. Z tego powodu Twoje posty mogą zostać usunięte po pewnym czasie po osiągnięciu progu wiekowego. + ignore_favs: Ignoruj ulubione + ignore_reblogs: Ignoruj podbicia + interaction_exceptions: Wyjątki oparte na interakcjach + interaction_exceptions_explanation: Zauważ, że nie ma gwarancji usunięcia wpisów, jeśli ich wartość spadnie poniżej progu ulubionych lub podbić po tym, kiedy już były raz sprawdzone. + keep_direct: Zachowaj bezpośrednie wiadomości + keep_direct_hint: Nie usuwa żadnych bezpośrednich wiadomości + keep_media: Zachowaj posty z załącznikami multimedialnymi + keep_media_hint: Nie usuwa żadnych postów z załącznikami multimedialnymi + keep_pinned: Zachowaj przypięte posty + keep_pinned_hint: Nie usuwa żadnych przypiętych postów + keep_polls: Zachowaj ankiety + keep_polls_hint: Nie usuwa żadnej z ankiet + keep_self_bookmark: Zachowaj posty, które dodałeś do zakładek + keep_self_bookmark_hint: Nie usuwaj własnych postów, jeśli je dodałeś do zakładek + keep_self_fav: Zachowaj ulubione posty + keep_self_fav_hint: Nie usuwaj własnych postów, jeśli je polubiłeś + min_age: + '1209600': 2 tygodnie + '15778476': 6 miesięcy + '2629746': 1 miesiąc + '31556952': 1 rok + '5259492': 2 miesiące + '63113904': 2 lata + '7889238': 3 miesiące + min_age_label: Próg wieku + min_favs: Zachowaj ulubione posty więcej niż + min_favs_hint: Nie usuwa żadnego z Twoich wpisów, które otrzymały więcej niż tę liczbę ulubionych. Pozostaw puste, aby usunąć posty bez względu na ich liczbę ulubionych + min_reblogs: Utrzymuj posty wzmocnione więcej niż + min_reblogs_hint: Nie usuwa żadnego z Twoich wpisów, które zostały wzmocnione więcej niż tyle razy. Pozostaw puste, aby usunąć posty bez względu na ich liczbę wzmocnień stream_entries: pinned: Przypięty wpis reblogged: podbił @@ -1438,11 +1541,8 @@ pl: tips: Wskazówki title: Witaj na pokładzie, %{name}! users: - blocked_email_provider: Ten dostawca e-mail jest niedozwolony follow_limit_reached: Nie możesz śledzić więcej niż %{limit} osób generic_access_help_html: Nie możesz uzyskać dostępu do konta? Skontaktuj się z %{email} aby uzyskać pomoc - invalid_email: Adres e-mail jest niepoprawny - invalid_email_mx: Ten adres e-mail wydaje się nie istnieć invalid_otp_token: Kod uwierzytelniający jest niepoprawny invalid_sign_in_token: Nieprawidłowy kod zabezpieczający otp_lost_help_html: Jeżeli utracisz dostęp do obu, możesz skontaktować się z %{email} diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 529548225a..8129728674 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -26,6 +26,8 @@ pt-BR: É usado para propósitos de federação e não deve ser bloqueado a menos que queira bloquear toda a instância, o que no caso devia usar um bloqueio de domínio. learn_more: Saiba mais privacy_policy: Política de Privacidade + rules: Regras do servidor + rules_html: 'Abaixo está um resumo das regras que você precisa seguir se você quer ter uma conta neste servidor do Mastodon:' see_whats_happening: Veja o que está acontecendo server_stats: 'Estatísticas da instância:' source_code: Código-fonte @@ -78,12 +80,11 @@ pt-BR: other: Toots posts_tab_heading: Toots posts_with_replies: Toots e respostas - reserved_username: Nome de usuário reservado roles: admin: Admin bot: Robô group: Grupo - moderator: Mod + moderator: Moderador unavailable: Perfil indisponível unfollow: Deixar de seguir admin: @@ -138,7 +139,6 @@ pt-BR: joined: Entrou location: all: Todos - local: Local remote: Remoto title: Localização login_status: Situação da conta @@ -260,46 +260,9 @@ pt-BR: update_domain_block: Atualizar bloqueio de domínio update_status: Editar Status actions: - assigned_to_self_report: "%{name} pegou a denúncia %{target}" - change_email_user: "%{name} alterou o endereço de e-mail do usuário %{target}" - confirm_user: "%{name} confirmou o endereço de e-mail do usuário %{target}" - create_account_warning: "%{name} enviou um aviso para %{target}" - create_announcement: "%{name} criou o novo anúncio %{target}" - create_custom_emoji: "%{name} enviou o novo emoji %{target}" - create_domain_allow: "%{name} permitiu %{target}" - create_domain_block: "%{name} bloqueou %{target}" - create_email_domain_block: "%{name} adicionou o domínio de e-mail %{target} à lista negra" - create_ip_block: "%{name} criou regra para o IP %{target}" - demote_user: "%{name} rebaixou o usuário %{target}" - destroy_announcement: "%{name} excluiu o anúncio %{target}" - destroy_custom_emoji: "%{name} excluiu emoji %{target}" - destroy_domain_allow: "%{name} bloqueou %{target}" - destroy_domain_block: "%{name} desbloqueou %{target}" - destroy_email_domain_block: "%{name} adicionou domínio de e-mail %{target} à lista branca" - destroy_ip_block: "%{name} excluiu regra para o IP %{target}" - destroy_status: "%{name} excluiu toot de %{target}" - disable_2fa_user: "%{name} desativou a exigência de autenticação de dois fatores para o usuário %{target}" - disable_custom_emoji: "%{name} desativou o emoji %{target}" - disable_user: "%{name} desativou o acesso para o usuário %{target}" - enable_custom_emoji: "%{name} ativou o emoji %{target}" - enable_user: "%{name} ativou o acesso para o usuário %{target}" - memorialize_account: "%{name} transformou a conta de %{target} em um página de memorial" - promote_user: "%{name} promoveu o usuário %{target}" - remove_avatar_user: "%{name} removeu a imagem de perfil de %{target}" - reopen_report: "%{name} reabriu a denúncia %{target}" - reset_password_user: "%{name} redefiniu a senha do usuário %{target}" - resolve_report: "%{name} resolveu a denúncia %{target}" - sensitive_account: "%{name} marcou a mídia de %{target} como sensível" - silence_account: "%{name} silenciou a conta de %{target}" - suspend_account: "%{name} baniu a conta de %{target}" - unassigned_report: "%{name} largou a denúncia %{target}" - unsensitive_account: "%{name} desmarcou a mídia de %{target} como sensível" - unsilence_account: "%{name} desativou o silêncio de %{target}" - unsuspend_account: "%{name} removeu a suspensão da conta de %{target}" - update_announcement: "%{name} atualizou o anúncio %{target}" - update_custom_emoji: "%{name} atualizou o emoji %{target}" - update_domain_block: "%{name} atualizou o bloqueio de domínio para %{target}" - update_status: "%{name} atualizou o status de %{target}" + create_account_warning_html: "%{name} enviou um aviso para %{target}" + create_domain_block_html: "%{name} bloqueou o domínio %{target}" + create_email_domain_block_html: "%{name} bloqueou do domínio de e-mail %{target}" deleted_status: "(status excluído)" empty: Nenhum registro encontrado. filter_by_action: Filtrar por ação @@ -314,10 +277,12 @@ pt-BR: new: create: Criar anúncio title: Novo anúncio + publish: Publicar published_msg: Anúncio publicado com sucesso! scheduled_for: Agendado para %{time} scheduled_msg: Anúncio agendado para publicação! title: Anúncios + unpublish: Cancelar publicação unpublished_msg: Anúncio despublicado com sucesso! updated_msg: Anúncio atualizado com sucesso! custom_emojis: @@ -333,7 +298,6 @@ pt-BR: disable: Desativar disabled: Desativado disabled_msg: Emoji desativado com sucesso - emoji: Emoji enable: Ativar enabled: Ativado enabled_msg: Emoji ativado com sucesso @@ -354,33 +318,9 @@ pt-BR: updated_msg: Emoji atualizado com sucesso! upload: Enviar dashboard: - authorized_fetch_mode: Modo seguro - backlog: tarefas na fila - config: Configuração - feature_deletions: Exclusão de contas - feature_invites: Convites - feature_profile_directory: Diretório de perfis - feature_registrations: Novas contas - feature_relay: Repetidor da federação - feature_spam_check: Anti-spam - feature_timeline_preview: Prévia da linha - features: Funcionalidades - hidden_service: Federação com serviços onion - open_reports: Denúncias em aberto - pending_tags: hashtags pendentes - pending_users: usuários pendentes - recent_users: Usuários recentes - search: Pesquisa em texto - single_user_mode: Modo de usuário único software: Software space: Uso de espaço em disco title: Painel de controle - total_users: usuários no total - trends: Em alta - week_interactions: interações essa semana - week_users_active: ativos essa semana - week_users_new: usuários essa semana - whitelist_mode: Modo lista de permitidos domain_allows: add_new: Permitir domínio created_msg: Domínio foi permitido @@ -402,6 +342,7 @@ pt-BR: silence: Silenciar suspend: Banir title: Novo bloqueio de domínio + obfuscate: Ofuscar nome de domínio private_comment: Comentário privado private_comment_hint: Comente sobre essa restrição ao domínio para uso interno dos moderadores. public_comment: Comentário público @@ -439,6 +380,7 @@ pt-BR: title: Nova entrada de lista negra de e-mail title: Lista de negra de e-mail instances: + back_to_warning: Aviso by_domain: Domínio delivery_available: Envio disponível empty: Nenhum domínio encontrado. @@ -498,7 +440,6 @@ pt-BR: save_and_enable: Salvar e ativar setup: Configurar uma conexão de repetidor signatures_not_enabled: Repetidores não funcionarão adequadamente enquanto o modo seguro ou o modo lista de permitidos estiverem ativos - status: Status title: Repetidores report_notes: created_msg: Nota de denúncia criada com sucesso! @@ -535,11 +476,17 @@ pt-BR: reported_by: Denunciada por resolved: Resolvido resolved_msg: Denúncia resolvida com sucesso! - status: Status title: Denúncias unassign: Largar unresolved: Não resolvido updated_at: Atualizado + rules: + add_new: Adicionar regra + delete: Deletar + description_html: Embora a maioria afirme ter lido e concordado com os termos de serviço, geralmente as pessoas só leem depois de surgir um problema. Faça com que seja mais fácil ver as regras do seu servidor rapidamente fornecendo-as em uma lista. Tente manter cada regra curta e simples, mas também tente não dividi-las em muitos itens separados. + edit: Editar regra + empty: Nenhuma regra do servidor foi definida. + title: Regras do servidor settings: activity_api_enabled: desc_html: Contagem de toots locais, usuários ativos e novos usuários semanalmente @@ -563,8 +510,6 @@ pt-BR: users: Para usuários locais logados domain_blocks_rationale: title: Mostrar motivo - enable_bootstrap_timeline_accounts: - title: Ativar seguidos por padrão por novas contas hero: desc_html: Aparece na página inicial. Recomendado ao menos 600x100px. Se não estiver definido, a miniatura da instância é usada no lugar title: Imagem de capa @@ -618,9 +563,6 @@ pt-BR: desc_html: Você pode escrever a sua própria Política de Privacidade, Termos de Serviço, entre outras coisas. Você pode usar tags HTML title: Termos de serviço personalizados site_title: Nome da instância - spam_check_enabled: - desc_html: Mastodon pode denunciar automaticamente contas que enviem repetidamente toots não solicitados. Pode haver falsos positivos. - title: Automação anti-spam thumbnail: desc_html: Usada para prévias via OpenGraph e API. Recomenda-se 1200x630px title: Miniatura da instância @@ -651,20 +593,18 @@ pt-BR: no_status_selected: Nenhum status foi modificado porque nenhum estava selecionado title: Toots da conta with_media: Com mídia + system_checks: + rules_check: + message_html: Você não definiu nenhuma regra de servidor. tags: accounts_today: Usos únicos de hoje accounts_week: Usos únicos desta semana breakdown: Descrição do consumo atual por fonte - context: Contexto - directory: No diretório - in_directory: "%{count} no diretório" last_active: Última atividade most_popular: Mais populares most_recent: Mais recentes - name: Hashtag review: Status da revisão reviewed: Revisado - title: Hashtags trending_right_now: Em alta no momento unique_uses_today: "%{count} tootando hoje" unreviewed: Não revisadas @@ -707,7 +647,6 @@ pt-BR: toot_layout: Layout do Toot application_mailer: notification_preferences: Alterar preferências de e-mail - salutation: "%{name}," settings: 'Alterar e-mail de preferência: %{link}' view: 'Ver:' view_profile: Ver perfil @@ -742,9 +681,6 @@ pt-BR: migrate_account: Mudar-se para outra conta migrate_account_html: Se você quer redirecionar essa conta para uma outra você pode configurar isso aqui. or_log_in_with: Ou entre com - providers: - cas: CAS - saml: SAML register: Criar conta registration_closed: "%{instance} não está aceitando novos membros" resend_confirmation: Reenviar instruções de confirmação @@ -791,15 +727,12 @@ pt-BR: with_month_name: "%d de %b de %Y" datetime: distance_in_words: - about_x_hours: "%{count}h" about_x_months: "%{count}m" about_x_years: "%{count}a" almost_x_years: "%{count}a" half_a_minute: Agora - less_than_x_minutes: "%{count}m" less_than_x_seconds: Agora over_x_years: "%{count}a" - x_days: "%{count}d" x_minutes: "%{count}min" x_months: "%{count}m" x_seconds: "%{count}seg" @@ -854,7 +787,6 @@ pt-BR: size: Tamanho blocks: Você bloqueou bookmarks: Marcadores - csv: CSV domain_blocks: Bloqueios de domínio lists: Listas mutes: Você silenciou @@ -1044,7 +976,6 @@ pt-BR: number: human: decimal_units: - format: "%n%u" units: billion: BI million: MI @@ -1064,7 +995,6 @@ pt-BR: next: Próximo older: Mais antigo prev: Anterior - truncate: "…" polls: errors: already_voted: Enquete votada @@ -1146,18 +1076,10 @@ pt-BR: current_session: Sessão atual description: "%{browser} em %{platform}" explanation: Estes são os navegadores que estão conectados com a sua conta Mastodon. - ip: IP platforms: - adobe_air: Adobe Air - android: Android blackberry: BlackBerry - chrome_os: ChromeOS - firefox_os: Firefox OS - ios: iOS - linux: Linux mac: MacOS other: Plataforma desconhecida - windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone revoke: Fechar @@ -1185,8 +1107,6 @@ pt-BR: relationships: Seguindo e seguidores two_factor_authentication: Autenticação de dois fatores webauthn_authentication: Chaves de segurança - spam_check: - spam_detected: Esta é uma denúncia automática. Spam foi detectado. statuses: attached: audio: @@ -1227,7 +1147,6 @@ pt-BR: show_older: Mostrar mais antigos show_thread: Mostrar conversa sign_in_to_participate: Entre para participar dessa conversa - title: '%{name}: "%{quote}"' visibilities: private: Privado private_long: Posta apenas para seguidores @@ -1397,11 +1316,8 @@ pt-BR: tips: Dicas title: Boas vindas, %{name}! users: - blocked_email_provider: Este provedor de e-mail não é permitido follow_limit_reached: Você não pode seguir mais de %{limit} pessoas generic_access_help_html: Problemas para acessar sua conta? Você pode entrar em contato com %{email} para obter ajuda - invalid_email: Endereço de e-mail inválido - invalid_email_mx: O endereço de e-mail parece não existir invalid_otp_token: Código de dois fatores inválido invalid_sign_in_token: Cógido de segurança inválido otp_lost_help_html: Se você perder o acesso à ambos, você pode entrar em contato com %{email} diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index f7b47fb10e..93b375c3d7 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -26,6 +26,8 @@ pt-PT: É usada para motivos de federação e não deve ser bloqueada a não ser que que queira bloquear a instância por completo. Se for esse o caso, deverá usar o bloqueio de domínio. learn_more: Saber mais privacy_policy: Política de privacidade + rules: Regras da instância + rules_html: 'Abaixo está um resumo das regras que precisa seguir se pretender ter uma conta nesta instância do Mastodon:' see_whats_happening: Veja o que está a acontecer server_stats: 'Estatísticas da instância:' source_code: Código fonte @@ -78,7 +80,6 @@ pt-PT: other: Publicações posts_tab_heading: Publicações posts_with_replies: Posts e Respostas - reserved_username: Este nome de utilizadores é reservado roles: admin: Administrador(a) bot: Robô @@ -96,7 +97,7 @@ pt-PT: delete: Eliminar destroyed_msg: Nota de moderação excluída com sucesso! accounts: - add_email_domain_block: Adicionar o domínio de email à lista negra + add_email_domain_block: Adicionar o domínio de e-mail à lista negra approve: Aprovar approve_all: Aprovar todos approved_msg: Inscrição de %{username} aprovada com sucesso @@ -105,7 +106,7 @@ pt-PT: by_domain: Domínio change_email: changed_msg: E-mail da conta alterado com sucesso! - current_email: E-mail actual + current_email: E-mail atual label: Alterar e-mail new_email: Novo e-mail submit: Alterar e-mail @@ -114,10 +115,11 @@ pt-PT: confirmed: Confirmado confirming: A confirmar delete: Eliminar dados - deleted: Apagada - demote: Rebaixar + deleted: Eliminada + demote: Despromoveu destroyed_msg: Os dados de %{username} estão agora em fila de espera para serem eliminados de imediato - disable: Desativar + disable: Congelar + disable_sign_in_token_auth: Desativar token de autenticação por e-mail disable_two_factor_authentication: Desativar 2FA disabled: Congelada display_name: Nome a mostrar @@ -125,7 +127,8 @@ pt-PT: edit: Editar email: E-mail email_status: Estado do e-mail - enable: Ativar + enable: Descongelar + enable_sign_in_token_auth: Ativar token de autenticação por e-mail enabled: Ativado enabled_msg: Descongelou com sucesso a conta %{username} followers: Seguidores @@ -176,8 +179,8 @@ pt-PT: removed_header_msg: Imagem de cabeçalho de %{username} removida com sucesso resend_confirmation: already_confirmed: Este utilizador já está confirmado - send: Reenviar um email de confirmação - success: Email de confirmação enviado com sucesso! + send: Reenviar um e-mail de confirmação + success: E-mail de confirmação enviado com sucesso! reset: Restaurar reset_password: Reset palavra-passe resubscribe: Reinscrever @@ -188,8 +191,12 @@ pt-PT: staff: Equipa user: Utilizador search: Pesquisar - search_same_email_domain: Outros utilizadores com o mesmo domínio de email + search_same_email_domain: Outros utilizadores com o mesmo domínio de e-mail search_same_ip: Outros utilizadores com o mesmo IP + security_measures: + only_password: Apenas palavra-passe + password_and_2fa: Palavra-passe e 2FA + password_and_sign_in_token: Palavra-passe e token por e-mail sensitive: Marcar como sensível sensitized: marcada como sensível shared_inbox_url: URL da caixa de entrada compartilhada @@ -201,7 +208,7 @@ pt-PT: statuses: Status subscribe: Inscrever-se suspended: Suspensa - suspension_irreversible: Os dados desta conta foram eliminados irreversivelmente. Você pode cancelar a suspensão da conta para torná-la utilizável, mas ela não irá recuperar os dados que possuía anteriormente. + suspension_irreversible: Os dados desta conta foram eliminados irreversivelmente. Pode cancelar a suspensão da conta para torná-la utilizável, mas ela não irá recuperar os dados que possuía anteriormente. suspension_reversible_hint_html: A conta foi suspensa e os dados serão totalmente eliminados em %{date}. Até lá, a conta poderá ser recuperada sem quaisquer efeitos negativos. Se deseja eliminar todos os dados desta conta imediatamente, pode fazê-lo em baixo. time_in_queue: Aguardando na fila %{time} title: Contas @@ -229,18 +236,22 @@ pt-PT: create_domain_block: Criar Bloqueio de Domínio create_email_domain_block: Criar Bloqueio de Domínio de E-mail create_ip_block: Criar regra de IP + create_unavailable_domain: Criar Domínio Indisponível demote_user: Despromover Utilizador - destroy_announcement: Remover Anúncio - destroy_custom_emoji: Remover Emoji Personalizado - destroy_domain_allow: Remover Permissão de Domínio - destroy_domain_block: Remover Bloqueio de Domínio - destroy_email_domain_block: Remover Bloqueio de Domínio de E-mail + destroy_announcement: Eliminar Anúncio + destroy_custom_emoji: Eliminar Emoji Personalizado + destroy_domain_allow: Eliminar Permissão de Domínio + destroy_domain_block: Eliminar Bloqueio de Domínio + destroy_email_domain_block: Eliminar Bloqueio de Domínio de E-mail destroy_ip_block: Eliminar regra de IP - destroy_status: Remover Estado + destroy_status: Eliminar Publicação + destroy_unavailable_domain: Eliminar Domínio Indisponível disable_2fa_user: Desativar 2FA disable_custom_emoji: Desativar Emoji Personalizado + disable_sign_in_token_auth_user: Desativar token de autenticação por e-mail para Utilizador disable_user: Desativar Utilizador enable_custom_emoji: Ativar Emoji Personalizado + enable_sign_in_token_auth_user: Ativar token de autenticação por e-mail para Utilizador enable_user: Ativar Utilizador memorialize_account: Memorizar Conta promote_user: Promover Utilizador @@ -260,53 +271,57 @@ pt-PT: update_domain_block: Atualizar Bloqueio de Domínio update_status: Atualizar Estado actions: - assigned_to_self_report: "%{name} atribuiu o relatório %{target} a si próprios" - change_email_user: "%{name} alterou o endereço de e-mail do utilizador %{target}" - confirm_user: "%{name} confirmou o endereço de e-mail do utilizador %{target}" - create_account_warning: "%{name} enviou um aviso para %{target}" - create_announcement: "%{name} criou um novo anúncio %{target}" - create_custom_emoji: "%{name} enviado emoji novo %{target}" - create_domain_allow: "%{name} colocou o domínio %{target} na lista branca" - create_domain_block: "%{name} bloqueou o domínio %{target}" - create_email_domain_block: "%{name} adicionou na lista negra o domínio de correio electrónico %{target}" - create_ip_block: "%{name} criou regra para o IP %{target}" - demote_user: "%{name} rebaixou o utilizador %{target}" - destroy_announcement: "%{name} excluiu o anúncio %{target}" - destroy_custom_emoji: "%{name} destruiu o emoji %{target}" - destroy_domain_allow: "%{name} removeu o domínio %{target} da lista branca" - destroy_domain_block: "%{name} desbloqueou o domínio %{target}" - destroy_email_domain_block: "%{name} retirou o domínio de e-mail %{target} da lista negra" - destroy_ip_block: "%{name} eliminou regra para o IP %{target}" - destroy_status: "%{name} removeu o publicação feita por %{target}" - disable_2fa_user: "%{name} desactivou o requerimento de autenticação em dois passos para o utilizador %{target}" - disable_custom_emoji: "%{name} desabilitou o emoji %{target}" - disable_user: "%{name} desativou o acesso para o utilizador %{target}" - enable_custom_emoji: "%{name} habilitou o emoji %{target}" - enable_user: "%{name} ativou o acesso para o utilizador %{target}" - memorialize_account: "%{name} transformou a conta de %{target} em um memorial" - promote_user: "%{name} promoveu o utilizador %{target}" - remove_avatar_user: "%{name} removeu a imagem de perfil de %{target}" - reopen_report: "%{name} reabriu o relatório %{target}" - reset_password_user: "%{name} restabeleceu a palavra-passe do utilizador %{target}" - resolve_report: "%{name} recusou o relatório %{target}" - sensitive_account: "%{name} marcou a media de %{target} como sensível" - silence_account: "%{name} silenciou a conta de %{target}" - suspend_account: "%{name} suspendeu a conta de %{target}" - unassigned_report: "%{name} não atribuiu o relatório %{target}" - unsensitive_account: "%{name} desmarcou a media de %{target} como sensível" - unsilence_account: "%{name} desativou o silêncio de %{target}" - unsuspend_account: "%{name} desativou a suspensão de %{target}" - update_announcement: "%{name} atualizou o anúncio %{target}" - update_custom_emoji: "%{name} atualizou o emoji %{target}" - update_domain_block: "%{name} atualizou o bloqueio de domínio para %{target}" - update_status: "%{name} atualizou o estado de %{target}" - deleted_status: "(apagou a publicação)" + assigned_to_self_report_html: "%{name} atribuiu o relatório %{target} a si próprio" + change_email_user_html: "%{name} alterou o endereço de e-mail do utilizador %{target}" + confirm_user_html: "%{name} confirmou o endereço de e-mail do utilizador %{target}" + create_account_warning_html: "%{name} enviou um aviso para %{target}" + create_announcement_html: "%{name} criou o novo anúncio %{target}" + create_custom_emoji_html: "%{name} carregou o novo emoji %{target}" + create_domain_allow_html: "%{name} habilitou a federação com o domínio %{target}" + create_domain_block_html: "%{name} bloqueou o domínio %{target}" + create_email_domain_block_html: "%{name} bloqueou o domínio de e-mail %{target}" + create_ip_block_html: "%{name} criou regra para o IP %{target}" + create_unavailable_domain_html: "%{name} parou a entrega ao domínio %{target}" + demote_user_html: "%{name} despromoveu o utilizador %{target}" + destroy_announcement_html: "%{name} eliminou o anúncio %{target}" + destroy_custom_emoji_html: "%{name} destruiu o emoji %{target}" + destroy_domain_allow_html: "%{name} desabilitou a federação com o domínio %{target}" + destroy_domain_block_html: "%{name} desbloqueou o domínio %{target}" + destroy_email_domain_block_html: "%{name} desbloqueou o domínio de e-mail %{target}" + destroy_ip_block_html: "%{name} eliminou regra para o IP %{target}" + destroy_status_html: "%{name} removeu a publicação de %{target}" + destroy_unavailable_domain_html: "%{name} retomou a entrega ao domínio %{target}" + disable_2fa_user_html: "%{name} desativou o requerimento de autenticação em dois passos para o utilizador %{target}" + disable_custom_emoji_html: "%{name} desabilitou o emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} desativou token de autenticação por e-mail para %{target}" + disable_user_html: "%{name} desativou o acesso para o utilizador %{target}" + enable_custom_emoji_html: "%{name} habilitou o emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} ativou token de autenticação por e-mail para %{target}" + enable_user_html: "%{name} ativou o acesso para o utilizador %{target}" + memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial" + promote_user_html: "%{name} promoveu o utilizador %{target}" + remove_avatar_user_html: "%{name} removeu a imagem de perfil de %{target}" + reopen_report_html: "%{name} reabriu o relatório %{target}" + reset_password_user_html: "%{name} restabeleceu a palavra-passe do utilizador %{target}" + resolve_report_html: "%{name} resolveu o relatório %{target}" + sensitive_account_html: "%{name} marcou a media de %{target} como sensível" + silence_account_html: "%{name} silenciou a conta de %{target}" + suspend_account_html: "%{name} suspendeu a conta de %{target}" + unassigned_report_html: "%{name} desatribuiu o realtório %{target}" + unsensitive_account_html: "%{name} desmarcou a media de %{target} como sensível" + unsilence_account_html: "%{name} desativou o silêncio de %{target}" + unsuspend_account_html: "%{name} desativou a suspensão de %{target}" + update_announcement_html: "%{name} atualizou o anúncio %{target}" + update_custom_emoji_html: "%{name} atualizou o emoji %{target}" + update_domain_block_html: "%{name} atualizou o bloqueio de domínio para %{target}" + update_status_html: "%{name} atualizou o estado de %{target}" + deleted_status: "(publicação eliminada)" empty: Não foram encontrados registos. filter_by_action: Filtrar por ação filter_by_user: Filtrar por utilizador title: Registo de auditoria announcements: - destroyed_msg: Anúncio excluído com sucesso! + destroyed_msg: Anúncio eliminado com sucesso! edit: title: Editar anúncio empty: Nenhum anúncio encontrado. @@ -314,10 +329,12 @@ pt-PT: new: create: Criar anúncio title: Novo anúncio + publish: Publicar published_msg: Anúncio publicado com sucesso! scheduled_for: Agendado para %{time} scheduled_msg: Anúncio agendado para publicação! title: Anúncios + unpublish: Anular publicação unpublished_msg: Anúncio retirado de exibição com sucesso! updated_msg: Anúncio atualizado com sucesso! custom_emojis: @@ -328,7 +345,7 @@ pt-PT: copy_failed_msg: Não foi possível criar uma cópia local deste emoji create_new_category: Criar nova categoria created_msg: Emoji criado com sucesso! - delete: Apagar + delete: Eliminar destroyed_msg: Emoji destruído com sucesso! disable: Desativar disabled: Desativado @@ -354,33 +371,28 @@ pt-PT: updated_msg: Emoji atualizado com sucesso! upload: Enviar dashboard: - authorized_fetch_mode: Modo seguro - backlog: trabalhos atrasados - config: Configuração - feature_deletions: Eliminações da conta - feature_invites: Links de convites - feature_profile_directory: Directório de perfil - feature_registrations: Registos - feature_relay: Repetidor da federação - feature_spam_check: Anti-spam - feature_timeline_preview: Pré-visualização da cronologia - features: Componentes - hidden_service: Federação com serviços escondidos - open_reports: relatórios abertos - pending_tags: hashtags a aguardar revisão - pending_users: utilizadores a aguardar revisão - recent_users: Utilizadores recentes - search: Pesquisa com texto completo - single_user_mode: Modo de utilizador único + active_users: utilizadores activos + interactions: interações + media_storage: Armazenamento de media + new_users: novos utilizadores + opened_reports: relatórios abertos + pending_reports_html: + one: "1 relatório pendente" + other: "%{count} relatórios pendentes" + pending_tags_html: + one: "1 hashtag pendente" + other: "%{count} hashtags pendentes" + pending_users_html: + one: "1 utilizador pendente" + other: "%{count} utilizadores pendentes" + resolved_reports: relatórios resolvidos software: Software + sources: Origem de inscrições space: Utilização do espaço title: Painel de controlo - total_users: total de utilizadores - trends: Tendências - week_interactions: interacções desta semana - week_users_active: activo esta semana - week_users_new: utilizadores nesta semana - whitelist_mode: Modo lista branca + top_languages: Principais idiomas activos + top_servers: Servidores mais activos + website: Website domain_allows: add_new: Colocar domínio na lista branca created_msg: Domínio foi adicionado à lista branca com sucesso @@ -430,19 +442,44 @@ pt-PT: view: Ver domínios bloqueados email_domain_blocks: add_new: Adicionar novo - created_msg: Bloqueio de domínio de email criado com sucesso + created_msg: Bloqueio de domínio de e-mail criado com sucesso delete: Eliminar - destroyed_msg: Bloqueio de domínio de email excluído com sucesso + destroyed_msg: Bloqueio de domínio de e-mail excluído com sucesso domain: Domínio empty: Nenhum domínio de e-mail atualmente na lista negra. from_html: de %{domain} new: create: Adicionar domínio - title: Novo bloqueio de domínio de email - title: Bloqueio de Domínio de Email + title: Novo bloqueio de domínio de e-mail + title: Domínios de e-mail bloqueados + follow_recommendations: + description_html: "Recomendações de quem seguir ajudam novos utilizadores a encontrar conteúdo interessante rapidamente.. Quando um utilizador não interage com outros o suficiente para formar recomendações personalizadas, estas contas são recomendadas. Elas são recalculadas diariamente a partir de uma mistura de contas com mais atividade recente e maior número de seguidores locais para um determinado idioma." + language: Para o idioma + status: Estado + suppress: Suprimir recomendação de contas a seguir + suppressed: Suprimida + title: Seguir recomendações + unsuppress: Restaurar recomendações de contas a seguir instances: + back_to_all: Todas + back_to_limited: Limitadas + back_to_warning: Aviso by_domain: Domínio + delivery: + all: Todas + clear: Limpar erros de entrega + restart: Reiniciar entrega + stop: Parar entrega + title: Entrega + unavailable: Indisponível + unavailable_message: Entrega indisponível + warning: Aviso + warning_message: + one: Falhou entrega %{count} dia + other: Falhou entrega %{count} dias delivery_available: Entrega disponível + delivery_error_days: Dias de erro de entrega + delivery_error_hint: Se a entrega não for possível durante %{count} dias, será automaticamente marcada como não realizável. empty: Não foram encontrados domínios. known_accounts: one: "%{count} conta conhecida" @@ -460,7 +497,7 @@ pt-PT: total_reported: Relatórios sobre eles total_storage: Anexos de media invites: - deactivate_all: Desactivar todos + deactivate_all: Desativar todos filter: all: Todos available: Disponíveis @@ -488,9 +525,9 @@ pt-PT: title: Relações de %{acct} relays: add_new: Adicionar novo repetidor - delete: Apagar + delete: Eliminar description_html: Um repetidor de federação é um servidor intermediário que troca grandes volumes de publicações públicas entre instâncias que o subscrevem e publicam. Ele pode ajudar pequenas e medias instâncias a descobrir conteúdo do fediverso que, de outro modo, exigiria que os utilizadores locais seguissem manualmente outras pessoas em instâncias remotas. - disable: Desactivar + disable: Desativar disabled: Desactivado enable: Activar enable_hint: Uma vez ativado, a tua instância irá subscrever a todas as publicações deste repetidor e irá começar a enviar as suas publicações públicas para ele. @@ -504,7 +541,7 @@ pt-PT: title: Retransmissores report_notes: created_msg: Relatório criado com sucesso! - destroyed_msg: Relatório apagado com sucesso! + destroyed_msg: Nota de relatório eliminada com sucesso! reports: account: notes: @@ -529,7 +566,7 @@ pt-PT: create: Adicionar nota create_and_resolve: Resolver com nota create_and_unresolve: Reabrir com nota - delete: Apagar + delete: Eliminar placeholder: Descreve as ações que foram tomadas ou quaisquer outras atualizações relacionadas... reopen: Reabrir relatório report: 'Denúncia #%{id}' @@ -538,10 +575,18 @@ pt-PT: resolved: Resolvido resolved_msg: Relatório resolvido com sucesso! status: Estado + target_origin: Origem da conta reportada title: Relatórios unassign: Não atribuir unresolved: Por resolver updated_at: Atualizado + rules: + add_new: Adicionar regra + delete: Eliminar + description_html: Embora a maioria afirme ter lido e concordado com os termos de serviço, geralmente as pessoas só leem depois de surgir um problema. Dê uma olhada nas regras do seu servidor fornecendo-as em uma lista de marcadores planos. Tente manter as regras individuais curtas e simples, mas tente também não dividi-las em muitos itens separados. + edit: Editar regra + empty: Nenhuma regra de instância foi ainda definida. + title: Regras da instância settings: activity_api_enabled: desc_html: Contagem semanais de publicações locais, utilizadores activos e novos registos @@ -550,14 +595,14 @@ pt-PT: desc_html: Separa os nomes de utilizadores por vírgulas. Funciona apenas com contas locais e desbloqueadas. O padrão quando vazio são todos os administradores locais. title: Seguidores predefinidos para novas contas contact_information: - email: Inserir um endereço de email para tornar público + email: Inserir um endereço de e-mail para tornar público username: Insira um nome de utilizador custom_css: desc_html: Modificar a aparência com CSS carregado em cada página title: CSS personalizado default_noindex: desc_html: Afeta todos os utilizadores que não alteraram esta configuração - title: Desactivar, por omissão, a indexação de utilizadores por parte dos motores de pesquisa + title: Desativar, por omissão, a indexação de utilizadores por parte dos motores de pesquisa domain_blocks: all: Para toda a gente disabled: Para ninguém @@ -565,9 +610,6 @@ pt-PT: users: Para utilizadores locais que se encontrem autenticados domain_blocks_rationale: title: Mostrar motivo - enable_bootstrap_timeline_accounts: - desc_html: Faça com que novos utilizadores sigam automaticamente contas configuradas, para que a cronologia destes não se apresente inicialmente vazia - title: Habilitar seguidores predefinidos para novos utilizadores hero: desc_html: Apresentado na primeira página. Pelo menos 600x100px recomendados. Quando não é definido, é apresentada a miniatura da instância title: Imagem Hero @@ -588,7 +630,7 @@ pt-PT: desc_html: Mostrar na página inicial quando registos estão encerrados
    Podes usar tags HTML title: Mensagem de registos encerrados deletion: - desc_html: Permite a qualquer um apagar a conta + desc_html: Permitir a qualquer utilizador eliminar a sua conta title: Permitir eliminar contas min_invite_role: disabled: Ninguém @@ -621,9 +663,6 @@ pt-PT: desc_html: Podes escrever a sua própria política de privacidade, termos de serviço, entre outras coisas. Pode utilizar etiquetas HTML title: Termos de serviço personalizados site_title: Título do site - spam_check_enabled: - desc_html: O Mastodon pode reportar automaticamente contas que enviem repetidamente mensagens não solicitadas. Poderão ocorrer alguns falso-positivos. - title: Automação anti-spam thumbnail: desc_html: Usada para visualizações via OpenGraph e API. Recomenda-se 1200x630px title: Miniatura da instância @@ -638,15 +677,15 @@ pt-PT: desc_html: Exibir publicamente hashtags atualmente em destaque que já tenham sido revistas anteriormente title: Hashtags em destaque site_uploads: - delete: Excluir arquivo carregado - destroyed_msg: Upload do site excluído com sucesso! + delete: Eliminar arquivo carregado + destroyed_msg: Upload do site eliminado com sucesso! statuses: back_to_account: Voltar para página da conta batch: delete: Eliminar nsfw_off: NSFW OFF nsfw_on: NSFW ON - deleted: Apagado + deleted: Eliminado failed_to_execute: Falhou ao executar media: title: Media @@ -654,13 +693,18 @@ pt-PT: no_status_selected: Nenhum estado foi alterado porque nenhum foi selecionado title: Estado das contas with_media: Com media + system_checks: + database_schema_check: + message_html: Existem migrações de base de dados pendentes. Por favor, execute-as para garantir que o aplicativo se comporte como esperado + rules_check: + action: Gerir regras da instância + message_html: Não definiu nenhuma regra para a instância. + sidekiq_process_check: + message_html: Nenhum processo Sidekiq em execução para a(s) fila(s) %{value}. Reveja a configuração do seu Sidekiq tags: accounts_today: Usos únicos hoje accounts_week: Usos únicos desta semana breakdown: Descrição do consumo atual por fonte - context: Contexto - directory: No diretório - in_directory: "%{count} no diretório" last_active: Última actividade most_popular: Mais popular most_recent: Mais recente @@ -675,8 +719,9 @@ pt-PT: title: Administração warning_presets: add_new: Adicionar novo - delete: Apagar + delete: Eliminar edit_preset: Editar o aviso predefinido + empty: Ainda não definiu nenhum aviso predefinido. title: Gerir os avisos predefinidos admin_mailer: new_pending_account: @@ -692,7 +737,7 @@ pt-PT: aliases: add_new: Criar pseudónimo created_msg: Criou com sucesso um novo pseudónimo. Pode agora iniciar a migração da conta antiga. - deleted_msg: Removido o pseudónimo com sucesso. Migrar dessa conta para esta não será mais possível. + deleted_msg: O pseudónimo foi eliminado com sucesso. Migrar dessa conta para esta não será mais possível. empty: Não tem pseudónimos. hint_html: Se quiser mudar de outra conta para esta, pode criar aqui um pseudónimo, que é necessário antes de poder prosseguir com a migração de seguidores da conta antiga para esta. Esta ação por si só é inofensiva e reversível. A migração da conta é iniciada a partir da conta antiga. remove: Desvincular pseudónimo @@ -704,14 +749,14 @@ pt-PT: discovery: Descobrir localization: body: Mastodon é traduzido por voluntários. - guide_link: https://crowdin.com/project/mastodon/pt-PT + guide_link: https://pt.crowdin.com/project/mastodon/ guide_link_text: Todos podem contribuir. sensitive_content: Conteúdo sensível toot_layout: Disposição do Toot application_mailer: notification_preferences: Alterar preferências de e-mail salutation: "%{name}," - settings: 'Alterar preferências de email: %{link}' + settings: 'Alterar preferências de e-mail: %{link}' view: 'Ver:' view_profile: Ver perfil view_status: Ver publicação @@ -729,21 +774,21 @@ pt-PT: checkbox_agreement_html: Concordo com as regras da instância e com os termos de serviço checkbox_agreement_without_rules_html: Concordo com os termos do serviço delete_account: Eliminar conta - delete_account_html: Se desejas eliminar a conta, podes continua aqui. Uma confirmação será pedida. + delete_account_html: Se deseja eliminar a sua conta, pode continuar aqui. Uma confirmação será solicitada. description: prefix_invited_by_user: "@%{name} convidou-o a juntar-se a esta instância do Mastodon!" prefix_sign_up: Inscreva-se hoje no Mastodon! suffix: Com uma conta, poderá seguir pessoas, publicar atualizações e trocar mensagens com utilizadores de qualquer instância Mastodon e muito mais! - didnt_get_confirmation: Não recebeu o email de confirmação? + didnt_get_confirmation: Não recebeu o e-mail de confirmação? dont_have_your_security_key: Não tem a sua chave de segurança? forgot_password: Esqueceste a palavra-passe? invalid_reset_password_token: Token de modificação da palavra-passe é inválido ou expirou. Por favor, solicita um novo. - link_to_otp: Insere um código de duas etapas do teu telemóvel ou um código de recuperação + link_to_otp: Insira um código de autenticação em duas etapas do seu telemóvel ou um código de recuperação link_to_webauth: Usa o teu dispositivo de chave de segurança login: Entrar logout: Sair migrate_account: Mudar para uma conta diferente - migrate_account_html: Se desejas redirecionar esta conta para uma outra podesconfigurar isso aqui. + migrate_account_html: Se deseja redirecionar esta conta para uma outra pode configurar isso aqui. or_log_in_with: Ou iniciar sessão com providers: cas: CAS @@ -756,7 +801,7 @@ pt-PT: set_new_password: Editar palavra-passe setup: email_below_hint_html: Se o endereço de e-mail abaixo estiver incorreto, pode alterá-lo aqui e receber um novo e-mail de confirmação. - email_settings_hint_html: O e-mail de confirmação foi enviado para %{email}. Se esse endereço de e-mail não estiver correcto, pode alterá-lo nas definições da conta. + email_settings_hint_html: O e-mail de confirmação foi enviado para %{email}. Se esse endereço de e-mail não estiver correto, pode alterá-lo nas definições da conta. title: Configuração status: account_status: Estado da conta @@ -781,9 +826,9 @@ pt-PT: title: Seguir %{acct} challenge: confirm: Continuar - hint_html: "Dica: Não vamos pedir novamente a sua senha durante a próxima hora." - invalid_password: Senha inválida - prompt: Confirme a sua senha para continuar + hint_html: "Dica: Não vamos pedir novamente a sua palavra-passe durante a próxima hora." + invalid_password: Palavra-passe inválida + prompt: Confirmar a sua palavra-passe para continuar crypto: errors: invalid_key: não é uma chave Ed25519 ou Curve25519 válida @@ -808,14 +853,14 @@ pt-PT: x_seconds: "%{count} segundos" deletes: challenge_not_passed: A informação que introduziu não estava correta - confirm_password: Introduz a palavra-passe atual para verificar a tua identidade + confirm_password: Introduza a sua palavra-passe atual para verificar a sua identidade confirm_username: Introduza o seu nome de utilizador para confirmar o procedimento proceed: Eliminar conta - success_msg: A tua conta foi eliminada com sucesso + success_msg: A sua conta foi eliminada com sucesso warning: before: 'Antes de continuar, por favor leia cuidadosamente estas notas:' caches: O conteúdo que foi armazenado em cache por outras instâncias pode persistir - data_removal: As suas publicações e outros dados serão removidos permanentemente + data_removal: As suas publicações e outros dados serão eliminados permanentemente email_change_html: Pode alterar o seu endereço de e-mail sem eliminar a sua conta email_contact_html: Se ainda não chegou, pode enviar um e-mail a %{email} para obter ajuda email_reconfirmation_html: Se não recebeu o e-mail de confirmação, pode pedi-lo novamente @@ -880,7 +925,7 @@ pt-PT: invalid_context: Inválido ou nenhum contexto fornecido invalid_irreversible: Filtragem irreversível só funciona no contexto das notificações ou do início index: - delete: Apagar + delete: Eliminar empty: Não tem filtros. title: Filtros new: @@ -966,6 +1011,17 @@ pt-PT: lists: errors: limit: Número máximo de listas alcançado + login_activities: + authentication_methods: + otp: aplicação de autenticação em duas etapas + password: palavra-passe + sign_in_token: código de segurança por e-mail + webauthn: chaves de segurança + description_html: Se vê atividade que não reconhece, considere alterar a sua palavra-passe e ativar a autenticação em duas etapas. + empty: Sem histórico de autenticação disponível + failed_sign_in_html: Tentativa falhada de início de sessão com %{method} de %{ip} (%{browser}) + successful_sign_in_html: Iniciada sessão com sucesso com %{method} de %{ip} (%{browser}) + title: Histórico de autenticação media_attachments: validations: images_and_video: Não é possível anexar um vídeo a uma publicação que já contém imagens @@ -1038,10 +1094,14 @@ pt-PT: body: 'Foste mencionado por %{name}:' subject: "%{name} mencionou-te" title: Nova menção + poll: + subject: Uma votação realizada por %{name} terminou reblog: body: 'O teu post foi partilhado por %{name}:' subject: "%{name} partilhou o teu post" title: Nova partilha + status: + subject: "%{name} acabou de publicar" notifications: email_events: Eventos para notificações por e-mail email_events_hint: 'Selecione os eventos para os quais deseja receber notificações:' @@ -1168,6 +1228,7 @@ pt-PT: revoke: Revogar revoke_success: Sessão revogada com sucesso title: Sessões + view_authentication_history: Ver histórico de autenticação da sua conta settings: account: Conta account_settings: Definições da conta @@ -1188,10 +1249,9 @@ pt-PT: preferences: Preferências profile: Perfil relationships: Seguindo e seguidores - two_factor_authentication: Autenticação em dois passos + statuses_cleanup: Remoção automática da publicação + two_factor_authentication: Autenticação em duas etapas webauthn_authentication: Chaves de segurança - spam_check: - spam_detected: Este é um relatório automatizado. Foi detectado spam. statuses: attached: audio: @@ -1234,12 +1294,47 @@ pt-PT: sign_in_to_participate: Inicie a sessão para participar na conversa title: '%{name}: "%{quote}"' visibilities: + direct: Direto private: Mostrar apenas para seguidores private_long: Mostrar apenas para seguidores public: Público public_long: Todos podem ver unlisted: Público, mas não mostre no timeline público unlisted_long: Todos podem ver, porém não será postado nas timelines públicas + statuses_cleanup: + enabled: Apagar publicações antigas automaticamente + enabled_hint: Apaga automaticamente as suas publicações assim que atingirem um limite de idade específico, a não ser que correspondam a uma das exceções abaixo + exceptions: Exceções + explanation: Como excluir publicações é uma operação cara, isto é realizado lentamente ao longo do tempo, quando o servidor não está ocupado de outra forma. Por esta razão, as suas publicações podem ser apagadas um pouco depois de atingirem o limite de idade. + ignore_favs: Ignorar favoritos + ignore_reblogs: Ignorar partilhas + interaction_exceptions: Exceções baseadas em interações + interaction_exceptions_explanation: Note que não há garantia de que as publicações sejam excluídas se ficarem abaixo do limite de favoritos ou partilhas após as ter verificado uma vez. + keep_direct: Manter mensagens diretas + keep_direct_hint: Não apaga nenhuma das suas mensagens diretas + keep_media: Manter publicações com anexos de multimédia + keep_media_hint: Não exclui nenhuma das suas publicações com multimédia anexada + keep_pinned: Manter publicações fixadas + keep_pinned_hint: Não apagar nenhuma das suas publicações fixadas + keep_polls: Manter enquetes + keep_polls_hint: Não apaga nenhuma das suas enquetes + keep_self_bookmark: Manter as publicações que guardou + keep_self_bookmark_hint: Não apaga as suas próprias publicações se as tiver guardado + keep_self_fav: Manter as publicações que gostou + keep_self_fav_hint: Não apaga as suas próprias publicações se as tiver favoritado + min_age: + '1209600': 2 semanas + '15778476': 6 meses + '2629746': 1 mês + '31556952': 1 ano + '5259492': 2 meses + '63113904': 2 anos + '7889238': 3 meses + min_age_label: Limite de idade + min_favs: Manter as publicações favoritas mais de + min_favs_hint: Não apaga nenhuma das suas publicações que tenha recebido mais do que esta quantidade de favoritos. Deixe em branco para apagar as publicações, independentemente do número de favoritos + min_reblogs: Manter as publicações partilhadas mais de + min_reblogs_hint: Não apaga nenhuma das suas publicações que tenha sido partilhada mais do que este número de vezes. Deixe em branco para apagar as publicações, independentemente do número de partilhas stream_entries: pinned: Toot fixado reblogged: partilhado @@ -1342,11 +1437,11 @@ pt-PT: disable: Desativar disabled_success: Autenticação em duas etapas desativada com sucesso edit: Editar - enabled: A autenticação em dois passos está ativada - enabled_success: Autenticação em dois passos ativada com sucesso + enabled: A autenticação em duas etapas está ativada + enabled_success: Autenticação em duas etapas ativada com sucesso generate_recovery_codes: Gerar códigos para recuperar conta lost_recovery_codes: Códigos de recuperação permite que você recupere o acesso a sua conta se você perder seu telefone. Se você perder os códigos de recuperação, você pode regera-los aqui. Seus códigos antigos serão invalidados. - methods: Métodos de duas etapas + methods: Métodos de autenticação em duas etapas otp: Aplicação de autenticação recovery_codes: Cópia de segurança dos códigos de recuperação recovery_codes_regenerated: Códigos de recuperação foram gerados com sucesso @@ -1360,7 +1455,7 @@ pt-PT: sign_in_token: details: 'Aqui estão os detalhes da tentativa:' explanation: 'Detectamos uma tentativa de entrar na sua conta a partir de um endereço IP não reconhecido. Se é você, por favor, insira o código de segurança abaixo na página de acesso:' - further_actions: 'Se não foi você, por favor altere sua senha e ative a autenticação de dois fatores na sua conta. Pode fazê-lo aqui:' + further_actions: 'Se não foi você, por favor altere a sua palavra-passe e ative a autenticação em duas etapzs na sua conta. Pode fazê-lo aqui:' subject: Por favor, confirme a tentativa de acesso title: Tentativa de acesso warning: @@ -1393,7 +1488,7 @@ pt-PT: full_handle: O teu nome completo full_handle_hint: Isto é o que você diria aos seus amigos para que eles lhe possam enviar mensagens ou seguir a partir de outra instância. review_preferences_action: Alterar preferências - review_preferences_step: Certifica-te de configurar as tuas preferências, tais como os e-mails que gostarias de receber ou o nível de privacidade que desejas que as tuas publicações tenham por defeito. Se não sofres de enjoo, podes ativar a opção de auto-iniciar GIFs. + review_preferences_step: Certifique-se de configurar as suas preferências, tais como os e-mails que gostaria de receber ou o nível de privacidade que deseja que as suas publicações tenham por defeito. Se não sofres de enjoo, podes ativar a opção de auto-iniciar GIFs. subject: Bem-vindo ao Mastodon tip_federated_timeline: A cronologia federativa é uma visão global da rede Mastodon. Mas só inclui pessoas que os teus vizinhos subscrevem, por isso não é uma visão completa. tip_following: Segues o(s) administrador(es) do teu servidor por defeito. Para encontrar mais pessoas interessantes, procura nas cronologias local e federada. @@ -1402,34 +1497,31 @@ pt-PT: tips: Dicas title: Bem-vindo a bordo, %{name}! users: - blocked_email_provider: Este provedor de e-mail não é permitido follow_limit_reached: Não podes seguir mais do que %{limit} pessoas generic_access_help_html: Problemas para aceder à sua conta? Pode entrar em contacto com %{email} para obter ajuda - invalid_email: O endereço de e-mail é inválido - invalid_email_mx: O endereço de e-mail não parece existir invalid_otp_token: Código de autenticação inválido invalid_sign_in_token: Cógido de segurança inválido - otp_lost_help_html: Se tu perdeste acesso a ambos, tu podes entrar em contacto com %{email} + otp_lost_help_html: Se perdeu acesso a ambos, pode entrar em contacto com %{email} seamless_external_login: Tu estás ligado via um serviço externo. Por isso, as configurações da palavra-passe e do e-mail não estão disponíveis. signed_in_as: 'Registado como:' suspicious_sign_in_confirmation: Parece que não iniciou sessão através deste dispositivo antes, e não acede à sua conta há algum tempo. Portanto, enviámos um código de segurança para o seu endereço de e-mail para confirmar que é você. verification: - explanation_html: 'Tu podes comprovar que és o dono dos links nos metadados do teu perfil. Para isso, o website para o qual o link aponta tem de conter um link para o teu perfil do Mastodon. Este link tem de ter um rel="me" atributo. O conteúdo do texto não é relevante. Aqui está um exemplo:' + explanation_html: 'Pode comprovar que é o dono dos links nos metadados do seu perfil. Para isso, o website para o qual o link aponta tem de conter um link para o seu perfil do Mastodon. Esse link tem de ter um atributo rel="me". O conteúdo do texto não é relevante. Aqui está um exemplo:' verification: Verificação webauthn_credentials: add: Adicionar nova chave de segurança create: error: Ocorreu um problema ao adicionar sua chave de segurança. Tente novamente. success: A sua chave de segurança foi adicionada com sucesso. - delete: Remover - delete_confirmation: Tem a certeza de que pretende remover esta chave de segurança? + delete: Eliminar + delete_confirmation: Tem a certeza de que pretende eliminar esta chave de segurança? description_html: Se você ativar a autenticação com chave de segurança, para aceder à sua conta será necessário que utilize uma das suas chaves de segurança. destroy: error: Ocorreu um problema ao remover a sua chave de segurança. Tente novamente. - success: A sua chave de segurança foi removida com sucesso. + success: A sua chave de segurança foi eliminada com sucesso. invalid_credential: Chave de segurança inválida nickname_hint: Introduza o apelido da sua nova chave de segurança not_enabled: Ainda não ativou o WebAuthn not_supported: Este navegador não suporta chaves de segurança - otp_required: Para usar chaves de segurança, por favor ative primeiro a autenticação de duas etapas. + otp_required: Para usar chaves de segurança, por favor ative primeiro a autenticação em duas etapas. registered_on: Registado em %{date} diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 630bd91d64..0e2dc57af5 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -7,15 +7,12 @@ ro: active_count_after: activi active_footnote: Utilizatori activi lunar (UAL) administered_by: 'Administrat de:' - api: API apps: Aplicații mobile apps_platforms: Folosește Mastodon de pe iOS, Android și alte platforme browse_directory: Răsfoiți directorul de profil și filtrați după interese browse_local_posts: Răsfoiți un flux live al postărilor publice de pe acest server browse_public_posts: Răsfoiește un flux live de postări publice pe Mastodon - contact: Contact contact_missing: Nesetat - contact_unavailable: N/A discover_users: Descoperă utilizatori documentation: Documentație federation_hint_html: Cu un cont pe %{instance} vei putea urmări oameni pe orice server de Mastodon sau mai departe. @@ -38,7 +35,6 @@ ro: terms: Termeni de serviciu unavailable_content: Conținut indisponibil unavailable_content_description: - domain: Server reason: Motiv rejecting_media: 'Fişierele media de pe aceste servere nu vor fi procesate sau stocate şi nici o miniatură nu va fi afişată, necesitând click manual la fişierul original:' rejecting_media_title: Fișiere media filtrate @@ -65,7 +61,6 @@ ro: joined: Înscris %{date} last_active: ultima activitate link_verified_on: Proprietatea acestui link a fost verificată la %{date} - media: Media moved_html: "%{name} s-a mutat la %{new_profile_link}:" network_hidden: Aceste informaţii nu sunt disponibile never_active: Niciodată @@ -80,12 +75,9 @@ ro: other: De Postări posts_tab_heading: Postări posts_with_replies: Postări și răspunsuri - reserved_username: Numele de utilizator este rezervat roles: - admin: Admin bot: Robot group: Grup - moderator: Mod unavailable: Profil indisponibil unfollow: Nu mai urmării admin: @@ -102,7 +94,6 @@ ro: approve: Aprobă approve_all: Aprobă toate are_you_sure: Ești sigur? - avatar: Avatar by_domain: Domeniu change_email: changed_msg: E-mail de cont schimbat cu succes! @@ -131,11 +122,9 @@ ro: header: Antet inbox_url: URL mesaje primite invited_by: Invitat de - ip: IP joined: Înscris location: all: Toate - local: Local remote: La distanţă title: Locaţie login_status: Stare conectare @@ -157,8 +146,6 @@ ro: pending: În așteptare perform_full_suspension: Suspendate promote: Promovează - protocol: Protocol - public: Public push_subscription_expires: Abonamentul PuSH expiră redownload: Reîmprospătează profilul reject: Respinge @@ -174,8 +161,6 @@ ro: resubscribe: Resubscrie-te role: Permisiuni roles: - admin: Administrator - moderator: Moderator staff: Personal user: Utilizator search: Caută @@ -198,7 +183,6 @@ ro: unsubscribe: Dezabonare username: Nume warn: Avertizează - web: Web whitelisted: Excluse la blocare action_logs: action_types: @@ -246,13 +230,11 @@ ro: remove: Deconectare alias appearance: localization: - guide_link: https://crowdin.com/project/mastodon guide_link_text: Toată lumea poate contribui. sensitive_content: Conținut sensibil toot_layout: Aspect postare application_mailer: notification_preferences: Modifică preferințe e-mail - salutation: "%{name}," settings: 'Modifică preferințe e-mail: %{link}' view: 'Vizualizare:' view_profile: Vizualizați profilul @@ -284,9 +266,6 @@ ro: migrate_account: Transfer către un alt cont migrate_account_html: Dacă dorești să redirecționezi acest cont către un altul, poți configura asta aici. or_log_in_with: Sau conectează-te cu - providers: - cas: CAS - saml: SAML register: Înregistrare registration_closed: "%{instance} nu acceptă membri noi" resend_confirmation: Retrimite instrucțiunile de confirmare @@ -335,9 +314,7 @@ ro: less_than_x_seconds: Chiar acum over_x_years: "%{count}ani" x_days: "%{count}z" - x_minutes: "%{count}m" x_months: "%{count}l" - x_seconds: "%{count}s" deletes: challenge_not_passed: Informațiile introduse nu au fost corecte confirm_password: Introdu parola curentă pentru a-ți verifica identitatea @@ -522,14 +499,7 @@ ro: activity: Ultima activitate browser: Navigator browsers: - alipay: Alipay - blackberry: Blackberry - chrome: Chrome - edge: Microsoft Edge - electron: Electron - firefox: Firefox generic: Navigator necunoscut - ie: Internet Explorer settings: account: Cont back: Înapoi la Mastodon @@ -543,10 +513,6 @@ ro: few: "%{count} imagini" one: "%{count} imagine" other: "%{count} de imagini" - video: - few: "%{count} videoclipuri" - one: "%{count} video" - other: "%{count} de videoclipuri" boosted_from_html: Impuls de la %{acct_link} content_warning: 'Avertisment privind conținutul: %{warning}' disallowed_hashtags: @@ -576,11 +542,9 @@ ro: show_more: Arată mai mult show_thread: Arată discuția sign_in_to_participate: Conectează-te pentru a participa la conversație - title: '%{name}: "%{quote}"' visibilities: private: Doar urmăritorii private_long: Arată doar urmăritorilor - public: Public public_long: Toată lumea poate vedea unlisted: Nelistat unlisted_long: Toată lumea poate vedea, dar nu este listată pe fluxurile publice @@ -730,7 +694,6 @@ ro: title: Bine ai venit la bord, %{name}! users: follow_limit_reached: Nu poți urmări mai mult de %{limit} persoane - invalid_email: Adresa de e-mail nu este validă invalid_otp_token: Cod doi pași nevalid otp_lost_help_html: Dacă ai pierdut accesul la ambele, poți lua legătura cu %{email} seamless_external_login: Sunteți autentificat prin intermediul unui serviciu extern, astfel încât parola și setările de e-mail nu sunt disponibile. diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 9895f9a55d..a5f71ae106 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -26,6 +26,8 @@ ru: Используется для целей федерации и не должен быть заблокирован, если вы не хотите заблокировать всю инстанцию, вместо этого лучше использовать доменную блокировку. learn_more: Узнать больше privacy_policy: Политика конфиденциальности + rules: Правила сервера + rules_html: 'Ниже приведена сводка правил, которых вам нужно придерживаться, если вы хотите иметь учётную запись на этом сервере Мастодона:' see_whats_happening: Узнайте, что происходит вокруг server_stats: 'Статистика сервера:' source_code: Исходный код @@ -86,7 +88,6 @@ ru: other: статусов posts_tab_heading: Посты posts_with_replies: Посты с ответами - reserved_username: Имя пользователя зарезервировано roles: admin: Администратор bot: Бот @@ -126,6 +127,7 @@ ru: demote: Разжаловать destroyed_msg: Данные %{username} поставлены в очередь на удаление disable: Заморозка + disable_sign_in_token_auth: Отключить аутентификацию по e-mail кодам disable_two_factor_authentication: Отключить 2FA disabled: Отключено display_name: Отображаемое имя @@ -134,6 +136,7 @@ ru: email: E-mail email_status: Статус e-mail enable: Включить + enable_sign_in_token_auth: Включить аутентификацию по e-mail кодам enabled: Включен enabled_msg: Учётная запись %{username} успешно разморожена followers: Подписчики @@ -150,7 +153,7 @@ ru: remote: Удаленные title: Размещение login_status: Статус учётной записи - media_attachments: Файлы мультимедиа + media_attachments: Медиафайлы memorialize: Сделать мемориалом memorialized: Превращён в памятник memorialized_msg: "%{username} успешно превращён в памятник" @@ -198,8 +201,12 @@ ru: search: Поиск search_same_email_domain: Другие пользователи с тем же доменом электронной почты search_same_ip: Другие пользователи с таким же IP - sensitive: Деликатный - sensitized: отмечено как деликатный контент + security_measures: + only_password: Только пароль + password_and_2fa: Пароль и 2FA + password_and_sign_in_token: Пароль и e-mail код + sensitive: Отметить как «деликатного содержания» + sensitized: отмечено как «деликатного характера» shared_inbox_url: URL общих входящих show: created_reports: Жалобы, отправленные с этой учётной записи @@ -214,7 +221,7 @@ ru: time_in_queue: Ожидание в очереди %{time} title: Учётные записи unconfirmed_email: Неподтверждённый e-mail - undo_sensitized: Снять отметку "деликатный" + undo_sensitized: Убрать отметку «деликатного содержания» undo_silenced: Отменить скрытие undo_suspension: Снять блокировку unsilenced_msg: Ограничения с учётной записи %{username} сняты успешно @@ -233,81 +240,89 @@ ru: create_account_warning: Выдача предупреждения create_announcement: Создание объявлений create_custom_emoji: Добавление эмодзи - create_domain_allow: Создать разрешение для домена + create_domain_allow: Разрешение доменов create_domain_block: Блокировка доменов create_email_domain_block: Блокировка e-mail доменов - create_ip_block: Создать IP правило + create_ip_block: Создание правил для IP-адресов + create_unavailable_domain: Добавление домена в список недоступных demote_user: Разжалование пользователей destroy_announcement: Удаление объявлений destroy_custom_emoji: Удаление эмодзи - destroy_domain_allow: Удалить разрешение для домена + destroy_domain_allow: Отзыв разрешений для доменов destroy_domain_block: Разблокировка доменов destroy_email_domain_block: Разблокировка e-mail доменов - destroy_ip_block: Удалить IP правило + destroy_ip_block: Удаление правил для IP-адресов destroy_status: Удаление постов + destroy_unavailable_domain: Исключение доменов из списка недоступных disable_2fa_user: Отключение 2FA disable_custom_emoji: Отключение эмодзи + disable_sign_in_token_auth_user: Отключение аутентификации по e-mail кодам у пользователей disable_user: Заморозка пользователей enable_custom_emoji: Включение эмодзи + enable_sign_in_token_auth_user: Включение аутентификации по e-mail кодам у пользователей enable_user: Разморозка пользователей - memorialize_account: Сделать мемориалом + memorialize_account: Присвоение пользователям статуса «мемориала» promote_user: Повышение пользователей remove_avatar_user: Удаление аватаров reopen_report: Возобновление жалоб reset_password_user: Сброс пароля пользователей resolve_report: Отметка жалоб «решёнными» - sensitive_account: Отметить все медиафайлы в вашей учётной записи как деликатные + sensitive_account: Присвоение пользователям отметки «деликатного содержания» silence_account: Скрытие пользователей suspend_account: Блокировка пользователей unassigned_report: Снятие жалоб - unsensitive_account: Снять отметку "деликатный" с медиафайлов вашей учётной записи + unsensitive_account: Снятие с пользователей отметки «деликатного содержания» unsilence_account: Отмена скрытия пользователей unsuspend_account: Разблокировка пользователей update_announcement: Обновление объявлений update_custom_emoji: Обновление эмодзи - update_domain_block: Изменить блокировку домена + update_domain_block: Изменение блокировки домена update_status: Изменение постов actions: - assigned_to_self_report: "%{name} назначил(а) себя для решения жалобы %{target}" - change_email_user: "%{name} сменил(а) e-mail пользователя %{target}" - confirm_user: "%{name} подтвердил(а) e-mail адрес пользователя %{target}" - create_account_warning: "%{name} выдал(а) предупреждение %{target}" - create_announcement: "%{name} создал(а) новое объявление %{target}" - create_custom_emoji: "%{name} загрузил(а) новый эмодзи %{target}" - create_domain_allow: "%{name} внес(ла) домен %{target} в белый список" - create_domain_block: "%{name} заблокировал(а) домен %{target}" - create_email_domain_block: "%{name} добавил(а) e-mail домен %{target} в чёрный список" - create_ip_block: "%{name} создал правило для IP %{target}" - demote_user: "%{name} разжаловал(а) пользователя %{target}" - destroy_announcement: "%{name} удалил объявление %{target}" - destroy_custom_emoji: "%{name} измельчил(а) эмодзи %{target} в пыль" - destroy_domain_allow: "%{name} убрал домен %{target} из белого списка" - destroy_domain_block: "%{name} разблокировал(а) домен %{target}" - destroy_email_domain_block: "%{name} добавил(а) e-mail домен %{target} в белый список" - destroy_ip_block: "%{name} удалил правило для IP %{target}" - destroy_status: "%{name} удалил(а) пост пользователя %{target}" - disable_2fa_user: "%{name} отключил(а) требование двухэтапной авторизации для пользователя %{target}" - disable_custom_emoji: "%{name} отключил(а) эмодзи %{target}" - disable_user: "%{name} заморозил(а) пользователя %{target}" - enable_custom_emoji: "%{name} включил(а) эмодзи %{target}" - enable_user: "%{name} разморозил(а) пользователя %{target}" - memorialize_account: "%{name} перевел(а) учётную запись пользователя %{target} в режим памятника" - promote_user: "%{name} повысил(а) пользователя %{target}" - remove_avatar_user: "%{name} убрал(а) аватарку пользователя %{target}" - reopen_report: "%{name} переоткрыл(а) жалобу %{target}" - reset_password_user: "%{name} сбросил(а) пароль пользователя %{target}" - resolve_report: "%{name} решил(а) жалобу %{target}" - sensitive_account: "%{name} пометил медиа %{target} как деликатное" - silence_account: "%{name} наложил(а) ограничения на видимость постов учётной записи %{target}" - suspend_account: "%{name} заблокировал(а) учётную запись %{target}" - unassigned_report: "%{name} сняла назначение жалобы %{target}" - unsensitive_account: '%{name} снял отметку "деликатное" с медиа %{target}' - unsilence_account: "%{name} снял ограничения видимости постов пользователя %{target}" - unsuspend_account: "%{name} снял(а) блокировку с пользователя %{target}" - update_announcement: "%{name} обновил объявление %{target}" - update_custom_emoji: "%{name} обновил(а) эмодзи %{target}" - update_domain_block: "%{name} обновил блокировку домена для %{target}" - update_status: "%{name} изменил(а) пост пользователя %{target}" + assigned_to_self_report_html: "%{name} назначил(а) себя для решения жалобы %{target}" + change_email_user_html: "%{name} сменил(а) e-mail пользователя %{target}" + confirm_user_html: "%{name} подтвердил(а) e-mail адрес пользователя %{target}" + create_account_warning_html: "%{name} выдал(а) предупреждение %{target}" + create_announcement_html: "%{name} создал(а) новое объявление %{target}" + create_custom_emoji_html: "%{name} загрузил(а) новый эмодзи %{target}" + create_domain_allow_html: "%{name} разрешил(а) федерацию с доменом %{target}" + create_domain_block_html: "%{name} заблокировал(а) домен %{target}" + create_email_domain_block_html: "%{name} заблокировал(а) e-mail домен %{target}" + create_ip_block_html: "%{name} создал(а) правило для IP %{target}" + create_unavailable_domain_html: "%{name} приостановил доставку на узел %{target}" + demote_user_html: "%{name} разжаловал(а) пользователя %{target}" + destroy_announcement_html: "%{name} удалил(а) объявление %{target}" + destroy_custom_emoji_html: "%{name} удалил(а) эмодзи %{target}" + destroy_domain_allow_html: "%{name} запретил(а) федерацию с доменом %{target}" + destroy_domain_block_html: "%{name} снял(а) блокировку с домена %{target}" + destroy_email_domain_block_html: "%{name} снял(а) блокировку с e-mail домена %{target}" + destroy_ip_block_html: "%{name} удалил(а) правило для IP %{target}" + destroy_status_html: "%{name} удалил(а) пост пользователя %{target}" + destroy_unavailable_domain_html: "%{name} возобновил доставку на узел %{target}" + disable_2fa_user_html: "%{name} отключил(а) требование двухэтапной авторизации для пользователя %{target}" + disable_custom_emoji_html: "%{name} отключил(а) эмодзи %{target}" + disable_sign_in_token_auth_user_html: "%{name} отключил(а) аутентификацию по e-mail кодам для %{target}" + disable_user_html: "%{name} заморозил(а) пользователя %{target}" + enable_custom_emoji_html: "%{name} включил(а) эмодзи %{target}" + enable_sign_in_token_auth_user_html: "%{name} включил(а) аутентификацию по e-mail кодам для %{target}" + enable_user_html: "%{name} разморозил(а) пользователя %{target}" + memorialize_account_html: "%{name} перевел(а) учётную запись пользователя %{target} в статус памятника" + promote_user_html: "%{name} повысил(а) пользователя %{target}" + remove_avatar_user_html: "%{name} убрал(а) аватарку пользователя %{target}" + reopen_report_html: "%{name} повторно открыл(а) жалобу %{target}" + reset_password_user_html: "%{name} сбросил(а) пароль пользователя %{target}" + resolve_report_html: "%{name} решил(а) жалобу %{target}" + sensitive_account_html: "%{name} установил(а) отметку файлов %{target} как «деликатного характера»" + silence_account_html: "%{name} наложил(а) ограничения на видимость постов пользователя %{target}" + suspend_account_html: "%{name} заблокировал(а) учётную запись %{target}" + unassigned_report_html: "%{name} снял(а) назначение жалобы %{target}" + unsensitive_account_html: "%{name} снял(а) отметку файлов %{target} как «деликатного характера»" + unsilence_account_html: "%{name} снял(а) ограничения видимости постов пользователя %{target}" + unsuspend_account_html: "%{name} снял(а) блокировку с пользователя %{target}" + update_announcement_html: "%{name} обновил(а) объявление %{target}" + update_custom_emoji_html: "%{name} обновил(а) эмодзи %{target}" + update_domain_block_html: "%{name} обновил(а) блокировку домена для %{target}" + update_status_html: "%{name} изменил(а) пост пользователя %{target}" deleted_status: "(удалённый пост)" empty: Журнал пуст. filter_by_action: Фильтр по действию @@ -322,10 +337,12 @@ ru: new: create: Создать объявление title: Новое объявление + publish: Опубликовать published_msg: Объявление опубликовано. scheduled_for: Запланировано на %{time} scheduled_msg: Объявление добавлено в очередь публикации. title: Объявления + unpublish: Отменить публикацию unpublished_msg: Объявление скрыто. updated_msg: Объявление обновлено. custom_emojis: @@ -362,33 +379,34 @@ ru: updated_msg: Эмодзи обновлён! upload: Загрузить dashboard: - authorized_fetch_mode: Защищённый режим - backlog: задачи - config: Конфигурация - feature_deletions: Удаление учётных записей - feature_invites: Пригласительные ссылки - feature_profile_directory: Каталог профилей - feature_registrations: Регистрация - feature_relay: Ретрансляторы - feature_spam_check: Анти-спам - feature_timeline_preview: Предпросмотр ленты - features: Возможности - hidden_service: Федерация со скрытыми сервисами - open_reports: открытых жалоб - pending_tags: хэштеги, ожидающие проверки - pending_users: пользователи, ожидающие проверки - recent_users: Недавние пользователи - search: Полнотекстовый поиск - single_user_mode: Однопользовательский режим + active_users: активные пользователи + interactions: взаимодействия + media_storage: Медиа файлы + new_users: новые пользователи + opened_reports: жалоб открыто + pending_reports_html: + few: "%{count} жалобы к рассмотрению" + many: "%{count} жалоб к рассмотрению" + one: "%{count} жалоба к рассмотрению" + other: "%{count} жалобы к рассмотрению" + pending_tags_html: + few: "%{count} хэштега к рассмотрению" + many: "%{count} хэштегов к рассмотрению" + one: "%{count} хэштег к рассмотрению" + other: "%{count} хэштега к рассмотрению" + pending_users_html: + few: "%{count} регистрации к рассмотрению" + many: "%{count} регистраций к рассмотрению" + one: "%{count} регистрация к рассмотрению" + other: "%{count} регистрации к рассмотрению" + resolved_reports: жалоб решено software: Программное обеспечение + sources: Источники регистрации space: Использовано места title: Панель управления - total_users: всего пользователей - trends: Актуальное - week_interactions: взаимодействий на этой неделе - week_users_active: активно на этой неделе - week_users_new: пользователей на этой неделе - whitelist_mode: Белый список + top_languages: Самые активные языки + top_servers: Самые активные серверы + website: Веб-сайт domain_allows: add_new: Внести в белый список created_msg: Домен добавлен в белый список @@ -415,6 +433,8 @@ ru: silence: Скрытие suspend: Блокировка title: Новая блокировка e-mail домена + obfuscate: Скрыть доменное имя + obfuscate_hint: Частично скрыть доменное имя в списке, если включена публикация списка ограничений домена private_comment: Приватный комментарий private_comment_hint: Комментарий к доменной блокировке для внутреннего использования модераторами. public_comment: Публичный комментарий @@ -453,9 +473,36 @@ ru: create: Создать блокировку title: Новая блокировка по домену title: Блокировка e-mail доменов + follow_recommendations: + description_html: "Следуйте рекомендациям, чтобы помочь новым пользователям быстро находить интересный контент. Если пользователь не взаимодействовал с другими в достаточной степени, чтобы сформировать персонализированные рекомендации, вместо этого рекомендуется использовать эти учетные записи. Они пересчитываются на ежедневной основе на основе комбинации аккаунтов с наибольшим количеством недавних взаимодействий и наибольшим количеством местных подписчиков для данного языка." + language: Для языка + status: Статус + suppress: Скрыть рекомендацию + suppressed: Скрыта + title: Рекомендации подписок + unsuppress: Восстановить рекомендацию instances: + back_to_all: Все узлы + back_to_limited: Все ограниченные узлы + back_to_warning: Все узлы требующие внимания by_domain: Домен + delivery: + all: Все + clear: Очистить ошибки доставки + restart: Перезапустить доставку + stop: Остановить доставку + title: По доступности + unavailable: Недоступные + unavailable_message: Доставка невозможна + warning: Требующие внимания + warning_message: + few: Доставка невозможна %{count} дня + many: Доставка невозможна %{count} дней + one: Доставка невозможна %{count} день + other: Доставка невозможна %{count} дня delivery_available: Доставка возможна + delivery_error_days: Дней ошибок доставки + delivery_error_hint: Если доставка доставка не удастся в течение %{count} дней, он будет автоматически отмечен недоступным для доставки. empty: Домены не найдены. known_accounts: few: "%{count} известные учётные записи" @@ -557,10 +604,18 @@ ru: resolved: Решённые resolved_msg: Жалоба обработана, спасибо! status: Статус + target_origin: Происхождение объекта жалобы title: Жалобы unassign: Снять назначение unresolved: Нерешённые updated_at: Обновлена + rules: + add_new: Добавить правило + delete: Удалить + description_html: Хотя большинство утверждает, что прочитали и согласны с условиями обслуживания, обычно люди не читают их до тех пор, пока не возникнет проблема. Упростите просмотр правил вашего сервера с первого взгляда, предоставив их в виде простого маркированного списка. Старайтесь, чтобы отдельные правила были краткими и простыми, но старайтесь не разбивать их на множество отдельных элементов. + edit: Редактировать правило + empty: Правила сервера еще не определены. + title: Правила сервера settings: activity_api_enabled: desc_html: Подсчёт количества локальных постов, активных пользователей и новых регистраций на еженедельной основе @@ -584,8 +639,6 @@ ru: users: Залогиненным локальным пользователям domain_blocks_rationale: title: Показать обоснование - enable_bootstrap_timeline_accounts: - title: Включить подписки по умолчанию для новых пользователей hero: desc_html: Отображается на главной странице. Рекомендуется разрешение не менее 600х100px. Если не установлено, используется изображение узла title: Баннер узла @@ -596,8 +649,8 @@ ru: desc_html: Домены, которые были замечены этим узлом среди всей федерации title: Публикация списка обнаруженных узлов preview_sensitive_media: - desc_html: Предпросмотр для ссылок будет отображать миниатюры даже для содержимого, помеченного как деликатное - title: Показывать деликатные медиафайлы в превью OpenGraph + desc_html: Предпросмотр для ссылок будет показывать миниатюры даже для содержимого, помеченного как «деликатного характера» + title: Показывать медиафайлы «деликатного характера» в превью OpenGraph profile_directory: desc_html: Позволять находить пользователей title: Включить каталог профилей @@ -639,9 +692,6 @@ ru: desc_html: Вы можете добавить сюда собственную политику конфиденциальности, пользовательское соглашение и другие документы. Можно использовать теги HTML title: Условия использования site_title: Название сайта - spam_check_enabled: - desc_html: Мастодон может автоматически сообщать об учётных записях, отправляющих повторяющиеся нежелательные сообщения. Возможны ложные срабатывания. - title: Анти-спам thumbnail: desc_html: Используется для предпросмотра с помощью OpenGraph и API. Рекомендуется разрешение 1200x630px title: Картинка узла @@ -662,8 +712,8 @@ ru: back_to_account: Назад к учётной записи batch: delete: Удалить - nsfw_off: Снять отметку «деликатного» - nsfw_on: Отметить как «деликатное» + nsfw_off: Снять отметку «деликатного характера» + nsfw_on: Отметить как «деликатного характера» deleted: Удалено failed_to_execute: Не удалось выполнить media: @@ -672,13 +722,18 @@ ru: no_status_selected: Ничего не изменилось, так как ни один пост не был выделен title: Посты пользователя with_media: С файлами + system_checks: + database_schema_check: + message_html: Есть отложенные миграции базы данных. Запустите их, чтобы убедиться, что приложение работает должным образом + rules_check: + action: Управление правилами сервера + message_html: Вы не определили правила сервера. + sidekiq_process_check: + message_html: Ни один Sidekiq не запущен для %{value} очереди(-ей). Пожалуйста, просмотрите настройки Sidekiq tags: accounts_today: Уникальных использований за сегодня accounts_week: Уникальных использований за эту неделю breakdown: Разбивка сегодняшнего использования по источникам - context: Контекст - directory: В каталоге - in_directory: "%{count} в каталоге" last_active: Последняя активность most_popular: Самые популярные most_recent: Последние @@ -695,6 +750,7 @@ ru: add_new: Добавить delete: Удалить edit_preset: Удалить шаблон предупреждения + empty: Вы еще не определили пресеты предупреждений. title: Управление шаблонами предупреждений admin_mailer: new_pending_account: @@ -716,7 +772,7 @@ ru: remove: Отвязать псевдоним appearance: advanced_web_interface: Многоколоночный интерфейс - advanced_web_interface_hint: 'Если вы хотите использовать всю ширину экрана, расширенный веб-интерфейс позволяет настроить множество различных столбцов, чтобы увидеть столько информации, сколько вы хотите: главную ленту, уведомления, глобальную ленту, любое количество списков и хэштегов.' + advanced_web_interface_hint: 'Если вы хотите использовать всю ширину экрана, многоколоночный веб-интерфейс позволяет настроить множество различных столбцов и видеть столько информации, сколько вы захотите: главную ленту, уведомления, глобальную ленту, неограниченное количество списков и хэштегов.' animations_and_accessibility: Анимации и доступность confirmation_dialogs: Окна подтверждений discovery: Обзор @@ -724,7 +780,7 @@ ru: body: Mastodon переводится добровольцами. guide_link: https://sasha-sorokin.gitlab.io/mastodon-ru/ guide_link_text: Каждый может внести свой вклад. - sensitive_content: Деликатное содержимое + sensitive_content: Содержимое деликатного характера toot_layout: Структура постов application_mailer: notification_preferences: Настроить уведомления можно здесь @@ -751,7 +807,7 @@ ru: description: prefix_invited_by_user: "@%{name} приглашает вас присоединиться к этому узлу Mastodon." prefix_sign_up: Зарегистрируйтесь в Mastodon уже сегодня! - suffix: Имея учётную запись, вы можете подписываться на людей, постить обновления, обмениваться сообщениями с пользователями любых узлов Mastodon и не только! + suffix: С учётной записью вы сможете подписываться на людей, публиковать обновления, обмениваться сообщениями с пользователями любых сообществ Mastodon и не только! didnt_get_confirmation: Не получили инструкцию для подтверждения? dont_have_your_security_key: У вас нет ключа безопасности? forgot_password: Забыли пароль? @@ -944,6 +1000,8 @@ ru: status: Статус view_proof: Посмотреть подтверждение imports: + errors: + over_rows_processing_limit: содержит более %{count} строк modes: merge: Объединить merge_long: Сохранить имеющиеся данные и добавить новые. @@ -986,6 +1044,17 @@ ru: lists: errors: limit: Вы достигли максимального числа списков + login_activities: + authentication_methods: + otp: приложение двухфакторной аутентификации + password: пароль + sign_in_token: код безопасности из e-mail + webauthn: ключи безопасности + description_html: Если вы видите неопознанное действие, смените пароль и/или включите двухфакторную авторизацию. + empty: Нет доступной истории входов + failed_sign_in_html: Неудачная попытка входа используя %{method} через %{browser} (%{ip}) + successful_sign_in_html: Успешный вход используя %{method} через %{browser} (%{ip}) + title: История входов media_attachments: validations: images_and_video: Нельзя добавить видео к посту с изображениями @@ -1062,10 +1131,14 @@ ru: body: 'Вас упомянул(а) %{name} в:' subject: "%{name} упомянул(а) вас" title: Новое упоминание + poll: + subject: Опрос %{name} завершился reblog: body: 'Ваш пост был продвинут %{name}:' subject: "%{name} продвинул(а) ваш пост" title: Новое продвижение + status: + subject: "%{name} только что запостил(а)" notifications: email_events: События для e-mail уведомлений email_events_hint: 'Выберите события, для которых вы хотели бы получать уведомления:' @@ -1082,11 +1155,11 @@ ru: trillion: трлн otp_authentication: code_hint: Для подтверждения введите код, сгенерированный приложением-аутентификатором - description_html: Если вы включите двухфакторную аутентификацию с помощью приложения-аутентификатора, Вход в систему потребует от вас наличия вашего телефона, который будет генерировать токены для входа в систему. + description_html: Подключив двуфакторную авторизацию, для входа в свою учётную запись вам будет необходим смартфон и приложение-аутентификатор на нём, которое будет генерировать специальные временные коды. Без этих кодов войти в учётную запись не получиться, даже если все данные верны, что существенно увеличивает безопасность вашей учётной записи. enable: Включить - instructions_html: "Отсканируйте этот QR-код в Google Authenticator или аналогичном приложении TOTP на вашем телефоне. С этого момента приложение будет генерировать токены, которые вам придется вводить при входе." - manual_instructions: 'Если вы не можете отсканировать QR-код и ввести его вручную, то вот секретный текст:' - setup: Создан + instructions_html: "Отсканируйте этот QR-код с помощью приложения-аутентификатора, такого как Google Authenticator, Яндекс.Ключ или andOTP. После сканирования и добавления, приложение начнёт генерировать коды, которые потребуется вводить для завершения входа в учётную запись." + manual_instructions: 'Если отсканировать QR-код не получается или не представляется возможным, вы можете ввести ключ настройки вручную:' + setup: Настроить wrong_code: Введенный код недействителен! Время сервера и время устройства правильно? pagination: newer: Новее @@ -1174,7 +1247,7 @@ ru: weibo: Weibo current_session: Текущая сессия description: "%{browser} на %{platform}" - explanation: Здесь отображаются все веб-браузеры, в которых выполнен вход в вашу учётную запись. Авторизованные приложения отображаются в другой секции. + explanation: Здесь отображаются все браузеры, с которых выполнен вход в вашу учётную запись. Авторизованные приложения находятся в секции «Приложения». ip: IP platforms: adobe_air: Adobe Air @@ -1192,6 +1265,7 @@ ru: revoke: Завершить revoke_success: Сессия завершена title: Сессии + view_authentication_history: Посмотреть историю входов с учётной записью settings: account: Учётная запись account_settings: Управление учётной записью @@ -1212,10 +1286,9 @@ ru: preferences: Настройки profile: Профиль relationships: Подписки и подписчики + statuses_cleanup: Авто-удаление постов two_factor_authentication: Подтверждение входа webauthn_authentication: Ключи безопасности - spam_check: - spam_detected: Это автоматический отчет. Обнаружен спам. statuses: attached: audio: @@ -1270,16 +1343,51 @@ ru: sign_in_to_participate: Войдите, чтобы принять участие в дискуссии title: '%{name}: "%{quote}"' visibilities: + direct: Адресованный private: Для подписчиков private_long: Показывать только подписчикам public: Для всех public_long: Показывать всем unlisted: Скрывать из лент unlisted_long: Показывать всем, но не отображать в публичных лентах + statuses_cleanup: + enabled: Автоматически удалять устаревшие посты + enabled_hint: Автоматически удаляет ваши посты после того, как они достигли определённого возраста, за некоторыми исключениями ниже. + exceptions: Исключения + explanation: Из-за того, что удаление постов — это ресурсоёмкий процесс, оно производится медленно со временем, когда сервер менее всего занят. По этой причине, посты могут удаляться не сразу, а спустя определённое время, по достижению возрастного порога. + ignore_favs: Игнорировать отметки «избранного» + ignore_reblogs: Игнорировать продвижения + interaction_exceptions: Исключения на основе взаимодействий + interaction_exceptions_explanation: 'Обратите внимание: нет никаких гарантий, что посты будут удалены, после того, как они единожды перешли порог по отметкам «избранного» или продвижений.' + keep_direct: Не удалять адресованные посты + keep_direct_hint: Не удалять ваши посты с «адресованной» видимостью. + keep_media: Не удалять посты с вложениями + keep_media_hint: Не удалять ваши посты, содержащие любые медийные вложения + keep_pinned: Не удалять закреплённые посты + keep_pinned_hint: Не удалять ваши посты, которые закреплены в профиле. + keep_polls: Не удалять опросы + keep_polls_hint: Не удалять ваши посты с опросами. + keep_self_bookmark: Не удалять закладки + keep_self_bookmark_hint: Не удалять ваши посты с закладками + keep_self_fav: Оставить посты, отмеченные «избранными» + keep_self_fav_hint: Не удалять ваши посты, если вы отметили их как «избранные». + min_age: + '1209600': 2 недели + '15778476': 6 месяцев + '2629746': 1 месяц + '31556952': 1 год + '5259492': 2 месяца + '63113904': 2 года + '7889238': 3 месяца + min_age_label: Возрастной порог + min_favs: Порог отметок «избранного» + min_favs_hint: Не удаляет ваши посты, которые получили отметок «избранного» больше, чем указано выше. Оставьте поле пустым, чтобы удалять посты независимо от количества отметок. + min_reblogs: Порог продвижений + min_reblogs_hint: Не удаляет ваши посты, количество продвижений которых больше, чем указано выше. Оставьте поле пустым, чтобы удалять посты независимо от количества продвижений. stream_entries: pinned: Закреплённый пост reblogged: продвинул(а) - sensitive_content: Деликатное содержимое + sensitive_content: Содержимое деликатного характера tags: does_not_match_previous_name: не совпадает с предыдущим именем terms: @@ -1382,7 +1490,7 @@ ru: otp: Приложение для проверки подлинности recovery_codes: Коды восстановления recovery_codes_regenerated: Коды восстановления успешно сгенерированы - recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. Каждый код действителен один раз.' + recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. Каждый код действителен только один раз.' webauthn: Ключи безопасности user_mailer: backup_ready: @@ -1398,7 +1506,7 @@ ru: warning: explanation: disable: Пока ваша учётная запись заморожена, ваши данные остаются нетронутыми, но вы не можете производить никаких действий до разблокировки. - sensitive: Ваши загруженные медиа-файлы и связанные с ними медиа будут рассматриваться как деликатные. + sensitive: Все загружаемые и прикреплённые вами медиафайлы будут расцениваться как «деликатного характера». silence: Пока действуют данные ограничения, публикуемые вами посты будут видеть исключительно люди, которые на вас уже подписаны на этом узле, вы также можете быть исключены из различных публичных лент. Несмотря на это, остальные пользователи по-прежнему могут подписаться на вас, чтобы читать новые посты. suspend: Ваша учётная запись заблокирована и все ваши посты и загруженные медиафайлы безвозвратно удалены с этого сервера и других серверов, где у вас были подписчики. get_in_touch: Вы можете ответить на это письмо, чтобы связаться с сотрудниками %{instance}. @@ -1407,13 +1515,13 @@ ru: subject: disable: Ваша учётная запись %{acct} заморожена none: "%{acct} вынесено предупреждение" - sensitive: Ваша учётная запись %{acct} помечена как деликатная + sensitive: Ваша учётная запись %{acct} была отмечена как «деликатного содержания» silence: На учётную запись %{acct} наложены ограничения suspend: Ваша учётная запись %{acct} была заблокирована title: disable: Учётная запись заморожена none: Предупреждение - sensitive: Ваш медиафайл был отмечен как деликатный + sensitive: Ваши медиафайлы отмечены как «деликатного характера» silence: На учётную запись наложены ограничения suspend: Учётная запись заблокирована welcome: @@ -1434,11 +1542,8 @@ ru: tips: Советы title: Добро пожаловать на борт, %{name}! users: - blocked_email_provider: Этот почтовый провайдер не разрешен follow_limit_reached: Вы не можете подписаться больше, чем на %{limit} человек generic_access_help_html: Не можете войти в свою учётную запись? Свяжитесь с %{email} для помощи - invalid_email: Введенный e-mail неверен - invalid_email_mx: Адрес электронной почты не существует invalid_otp_token: Введен неверный код двухфакторной аутентификации invalid_sign_in_token: Неверный код безопасности otp_lost_help_html: Если Вы потеряли доступ к обоим, свяжитесь с %{email} @@ -1447,7 +1552,7 @@ ru: suspicious_sign_in_confirmation: Похоже, вы раньше не входили с этого устройства, и давно не осуществляли вход, поэтому мы отправили вам код безопасности на почту, чтобы подтвердить, что это действительно вы. verification: explanation_html: 'Владение ссылками в профиле можно подтвердить. Для этого на указанном сайте должна содержаться ссылка на ваш профиль Mastodon, а у самой ссылки должен быть атрибут rel="me". Что внутри ссылки — значения не имеет. Вот вам пример ссылки:' - verification: Подтверждение + verification: Верификация ссылок webauthn_credentials: add: Добавить новый ключ безопасности create: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 626c7671c0..eeea2793de 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -2,50 +2,50 @@ sc: about: about_hashtag_html: Custos sunt tuts pùblicos etichetados cun #%{hashtag}. Bi podes intrare in cuntatu si tenes unu contu in cale si siat logu de su fediversu. - about_mastodon_html: 'Sa rete sotziale de su benidore: sena publitzidade, sena vigilàntzia corporativa, disignu èticu e detzentralizatzione! Sias mere de is datos tuos cun Mastodon!' + about_mastodon_html: 'Sa rete sotziale de su benidore: sena publitzidade, sena vigilàntzia corporativa, disinnu èticu e detzentralizatzione! Sias mere de is datos tuos cun Mastodon!' about_this: Informatziones active_count_after: ativu - active_footnote: Utentes Ativos Mensiles (UAM) + active_footnote: Utentes cun atividade mensile (UAM) administered_by: 'Amministradu dae:' - api: "*API" + api: API apps: Aplicatziones mòbiles apps_platforms: Imprea Mastodon dae iOS, Android e àteras prataformas - browse_directory: Nàviga su diretòriu de profilos e filtra segundu interessos - browse_local_posts: Nàviga unu flussu in direta de messàgios pùblicos de custu serbidore - browse_public_posts: Nàviga unu flussu in direta de messàgios pùblicos in Mastodon + browse_directory: Nàviga in su diretòriu de profilos e filtra segundu interessos + browse_local_posts: Nàviga in unu flussu in direta de messàgios pùblicos de custu serbidore + browse_public_posts: Nàviga in unu flussu in direta de messàgios pùblicos in Mastodon contact: Cuntatu - contact_missing: No impostadu + contact_missing: No cunfiguradu contact_unavailable: No a disponimentu discover_users: Iscoberi utentes documentation: Documentatzione federation_hint_html: Cun unu contu in %{instance} as a pòdere sighire persones in cale si siat serbidore de Mastodon o de su fediversu. get_apps: Proa un'aplicatzione mòbile - hosted_on: Mastodon acasagiadu in %{domain} - instance_actor_flash: 'Custu contu est un''atore virtuale impreadu pro rapresentare su serbidore matessi, no est un''utente individuale. Benit impreadu pro punnas de federatzione e non lu dias dèpere blocare si non cheres blocare su domìniu intreu, e in cussu casu dias dèpere impreare unu blocu de domìniu. - -' + hosted_on: Mastodon allogiadu in %{domain} + instance_actor_flash: Custu contu est un'atore virtuale impreadu pro rapresentare su pròpiu serbidore, no est un'utente individuale. Benit impreadu pro punnas de federatzione e no ddu dias dèpere blocare si non boles blocare su domìniu intreu, e in cussu casu dias dèpere impreare unu blocu de domìniu. learn_more: Àteras informatziones privacy_policy: Polìtica de riservadesa + rules: Règulas de su serbidore + rules_html: 'Depes sighire is règulas imbenientes si boles tènnere unu contu in custu serbidore de Mastodon:' see_whats_happening: Càstia su chi est acontessende server_stats: 'Istatìsticas de su serbidore:' - source_code: Còdighe mitza + source_code: Còdighe de orìgine status_count_after: one: istadu other: istados - status_count_before: Autores de - tagline: Sighi is amigos tuos e iscoberi·nde de noos + status_count_before: Atributzione de + tagline: Sighi is amistades tuas e iscoberi·nde àteras terms: Cunditziones de su servìtziu unavailable_content: Serbidores moderados unavailable_content_description: domain: Serbidore reason: Resone - rejecting_media: 'Is documentos multimediales de custos serbidores no at a èssere protzessadu o sarvadu e peruna miniadura at a èssere ammustradas, ca tenent bisòngiu de un''incarcu manuale in su documentu originale:' - rejecting_media_title: Mèdios filtrados + rejecting_media: 'Is documentos multimediales de custos serbidores no ant a èssere protzessados o sarvados e peruna miniadura at a èssere ammustrada, ca tenent bisòngiu de unu clic manuale in su documentu originale:' + rejecting_media_title: Cuntenutos multimediales filtrados silenced: 'Is messàgios dae custos serbidores ant a èssere cuados in is lìnias de tempus e is arresonadas pùblicas, e no at a èssere generada peruna notìfica dae is interatziones de is utentes, francu chi nde sias sighende:' silenced_title: Serbidores a sa muda suspended: 'Perunu datu de custos serbidores at a èssere protzessadu, immagasinadu o cuncambiadu; est impossìbile duncas cale si siat interatzione o comunicatzione cun is utentes de custos serbidores:' suspended_title: Serbidores suspèndidos - unavailable_content_html: Mastodon ti permitit de bìdere su cuntenutu de utentes de cale si siat àteru serbidore de su fediversu. Custas sunt etzetziones chi fatas in custu serbidore particulare. + unavailable_content_html: Mastodon ti permitit de bìdere su cuntenutu de utentes de cale si siat àteru serbidore de su fediversu. Custas sunt etzetziones fatas in custu serbidore ispetzìficu. user_count_after: one: utente other: utentes @@ -60,12 +60,13 @@ sc: one: Sighidura other: Sighiduras following: Sighende + instance_actor_flash: Custu contu est un'atore virtuale chi costumaiat a rapresentare su serbidore etotu e nono unu cale si siat utente individuale. Est impreadu pro finalidades de sa federatzione e non si depet suspèndere. joined: At aderidu su %{date} last_active: ùrtima atividade link_verified_on: Sa propiedade de custu ligàmene est istada controllada su %{date} media: Elementos multimediales moved_html: "%{name} est istadu trasferidu a %{new_profile_link}:" - network_hidden: Custa informatzione no a disponimentu + network_hidden: Custa informatzione no est a disponimentu never_active: Mai nothing_here: Nudda inoghe. people_followed_by: Gente sighida dae %{name} @@ -77,12 +78,11 @@ sc: other: Tuts posts_tab_heading: Tuts posts_with_replies: Tuts e rispostas - reserved_username: Custu nòmine de utente est giai impreadu roles: admin: Admin bot: Bot group: Grupu - moderator: Moderadore + moderator: Moderatzione unavailable: Su profilu no est a disponimentu unfollow: Non sigas prus admin: @@ -106,7 +106,7 @@ sc: changed_msg: As cambiadu s'indiritzu eletrònicu. current_email: Indiritzu eletrònicu atuale label: Muda s'indiritzu eletrònicu - new_email: Indiritzu de eletrònicu nou + new_email: Indiritzu eletrònicu nou submit: Muda s'indiritzu eletrònicu title: Muda s'indiritzu eletrònicu de %{username} confirm: Cunfirma @@ -131,6 +131,7 @@ sc: follows: Sighende header: Intestatzione inbox_url: URL de intrada + invite_request_text: Resones pro aderire invited_by: Invitu dae ip: IP joined: At aderidu @@ -143,7 +144,7 @@ sc: media_attachments: Allegados multimediales memorialize: Cunverte in memoriam memorialized: Memorializadu - memorialized_msg: As trasformadu %{username} in unu contu de ammentu + memorialized_msg: As trasformadu %{username} in unu contu de regordu moderation: active: Ativu all: Totus @@ -164,13 +165,13 @@ sc: public: Pùblicu push_subscription_expires: Sa sutiscritzione PuSH iscadit redownload: Atualiza su profilu - redownloaded_msg: Su profilu de %{username} est istadu agiornadu dae s'orìgine + redownloaded_msg: Su profilu de %{username} est istadu atualizadu dae s'orìgine reject: Refuda reject_all: Refuda totu rejected_msg: Sa dimanda de registru de %{username} est istada refudada remove_avatar: Boga immàgine de profilu remove_header: Boga s'intestatzione - removed_avatar_msg: S'immàgine de d'àvatar de %{username} est istada bogada + removed_avatar_msg: S'immàgine de profilu de %{username} est istada bogada removed_header_msg: S'immàgine de intestatzione de %{username} est istada bogada resend_confirmation: already_confirmed: Custa persone est giai cunfirmada @@ -181,8 +182,8 @@ sc: resubscribe: Torra a sutascrìere role: Permissos roles: - admin: Admin - moderator: Mod + admin: Amministratzione + moderator: Moderatzione staff: Personale user: Utente search: Chirca @@ -240,13 +241,13 @@ sc: disable_user: Disativa utente enable_custom_emoji: Ativa s'emoji personalizadu enable_user: Ativa utente - memorialize_account: Regorda su contu + memorialize_account: Torra in unu contu de regordu promote_user: Promove utente remove_avatar_user: Cantzella immàgine de profilu reopen_report: Torra a abèrrere s'informe reset_password_user: Reseta sa crae resolve_report: Isorve s'informe - sensitive_account: Marca sos cuntenutos multimediales in su contu tuo comente sensìbile + sensitive_account: Marca is cuntenutos multimediales in su contu tuo comente sensìbiles silence_account: Pone custu contu a sa muda suspend_account: Suspende custu contu unassigned_report: Boga s'assignatzione de custu informe @@ -255,47 +256,49 @@ sc: unsuspend_account: Boga custu contu de is contos suspèndidos update_announcement: Atualiza s'annùntziu update_custom_emoji: Atualiza s'emoji personalizadu + update_domain_block: Atualiza blocu de domìniu update_status: Atualiza s'istadu actions: - assigned_to_self_report: "%{name} s'est auto-assignadu s'informe %{target}" - change_email_user: "%{name} at mudadu s'indiritzu de posta eletrònica de s'utente %{target}" - confirm_user: "%{name} at cunfirmadu s'indiritzu de posta eletrònica de s'utente %{target}" - create_account_warning: "%{name} at imbiadu un'avisu a %{target}" - create_announcement: "%{name} at creadu un'annùntziu nou %{target}" - create_custom_emoji: "%{name} at carrigadu un'emoji nou%{target}" - create_domain_allow: "%{name} at permìtidu sa federatzione cun su domìniu %{target}" - create_domain_block: "%{name} at blocadu su domìniu %{target}" - create_email_domain_block: "%{name} at blocadu su domìniu de posta eletrònica %{target}" - create_ip_block: "%{name} at creadu una règula pro s'IP %{target}" - demote_user: "%{name} at degradadu s'utente %{target}" - destroy_announcement: "%{name} at cantzelladu s'annùntziu %{target}" - destroy_custom_emoji: "%{name} at cantzelladu s'emoji %{target}" - destroy_domain_allow: "%{name} no at permìtidu sa federatzione cun su domìniu %{target}" - destroy_domain_block: "%{name} at isblocadu su domìniu %{target}" - destroy_email_domain_block: "%{name} at isblocadu su domìniu de posta eletrònica %{target}" - destroy_ip_block: "%{name} at cantzelladu sa règula pro s'IP %{target}" - destroy_status: "%{name} at eliminadu s'istadu de %{target}" - disable_2fa_user: "%{name} at disativadu su rechisitu de duos fatores pro s'utente %{target}" - disable_custom_emoji: "%{name} at disativadu s'emoji %{target}" - disable_user: "%{name} at disativadu s'atzessu pro s'utente %{target}" - enable_custom_emoji: "%{name} at ativadu s'emoji %{target}" - enable_user: "%{name} at ativadu s'atzessu pro s'utente %{target}" - memorialize_account: "%{name} at cunvertidu su contu %{target} in una pàgina in memoriam" - promote_user: "%{name} at promòvidu s'utente %{target}" - remove_avatar_user: "%{name} at cantzelladu s'immàgine de profilu de %{target}" - reopen_report: "%{name} at torradu a abèrrere s'informe %{target}" - reset_password_user: "%{name} at restadu sa crae de s'utente %{target}" - resolve_report: "%{name} at isòrvidu s'informe %{target}" - sensitive_account: "%{name} at marcadu s'elementu multimediale de %{target} comente sensìbile" - silence_account: "%{name} at postu su contu de %{target} a sa muda" - suspend_account: "%{name} at suspèndidu su contu de %{target}" - unassigned_report: "%{name} at bogadu s'assignatzione de s'informe %{target}" - unsensitive_account: '%{name} at bogadu sa marcadura "sensìbile" a s''elementu multimediale de %{target}' - unsilence_account: "%{name} at postu su contu de %{target} a sa muda" - unsuspend_account: "%{name} at bogadu sa suspensione de su contu de %{target}" - update_announcement: "%{name} at atualizadu s'annùntziu %{target}" - update_custom_emoji: "%{name} at atualizadu s'emoji %{target}" - update_status: "%{name} at atualizadu s'istadu de %{target}" + assigned_to_self_report_html: "%{name} s'est auto-assignadu s'informe %{target}" + change_email_user_html: "%{name} at mudadu s'indiritzu de posta eletrònica de s'utente %{target}" + confirm_user_html: "%{name} at cunfirmadu s'indiritzu de posta eletrònica de s'utente %{target}" + create_account_warning_html: "%{name} at imbiadu un'avisu a %{target}" + create_announcement_html: "%{name} at creadu un'annùntziu nou %{target}" + create_custom_emoji_html: "%{name} at carrigadu un'emoji nou %{target}" + create_domain_allow_html: "%{name} at permìtidu sa federatzione cun su domìniu %{target}" + create_domain_block_html: "%{name} at blocadu su domìniu %{target}" + create_email_domain_block_html: "%{name} at blocadu su domìniu de posta eletrònica %{target}" + create_ip_block_html: "%{name} at creadu una règula pro s'IP %{target}" + demote_user_html: "%{name} at degradadu s'utente %{target}" + destroy_announcement_html: "%{name} at cantzelladu s'annùntziu %{target}" + destroy_custom_emoji_html: "%{name} at cantzelladu s'emoji %{target}" + destroy_domain_allow_html: "%{name} no at permìtidu sa federatzione cun su domìniu %{target}" + destroy_domain_block_html: "%{name} at isblocadu su domìniu %{target}" + destroy_email_domain_block_html: "%{name} at isblocadu su domìniu de posta eletrònica %{target}" + destroy_ip_block_html: "%{name} at cantzelladu sa règula pro s'IP %{target}" + destroy_status_html: "%{name} at eliminadu sa publicatzione de %{target}" + disable_2fa_user_html: "%{name} at disativadu su rechisitu de duos fatores pro s'utente %{target}" + disable_custom_emoji_html: "%{name} at disativadu s'emoji %{target}" + disable_user_html: "%{name} at disativadu s'atzessu pro s'utente %{target}" + enable_custom_emoji_html: "%{name} at ativadu s'emoji %{target}" + enable_user_html: "%{name} at ativadu s'atzessu pro s'utente %{target}" + memorialize_account_html: "%{name} at cunvertidu su contu %{target} in una pàgina in memoriam" + promote_user_html: "%{name} at promòvidu s'utente %{target}" + remove_avatar_user_html: "%{name} at cantzelladu s'immàgine de profilu de %{target}" + reopen_report_html: "%{name} at torradu a abèrrere s'informe %{target}" + reset_password_user_html: "%{name} at resetadu sa crae de s'utente %{target}" + resolve_report_html: "%{name} at isòrvidu s'informe %{target}" + sensitive_account_html: "%{name} at marcadu s'elementu multimediale de %{target} comente sensìbile" + silence_account_html: "%{name} at postu su contu de %{target} a sa muda" + suspend_account_html: "%{name} at suspèndidu su contu de %{target}" + unassigned_report_html: "%{name} at bogadu s'assignatzione de s'informe %{target}" + unsensitive_account_html: '%{name} at bogadu sa marcadura "sensìbile" a s''elementu multimediale de %{target}' + unsilence_account_html: "%{name} at ativadu is notìficas pro su contu de %{target}" + unsuspend_account_html: "%{name} at bogadu sa suspensione de su contu de %{target}" + update_announcement_html: "%{name} at atualizadu s'annùntziu %{target}" + update_custom_emoji_html: "%{name} at atualizadu s'emoji %{target}" + update_domain_block_html: "%{name} at atualizadu su blocu de domìniu pro %{target}" + update_status_html: "%{name} at atualizadu sa publicatzione de %{target}" deleted_status: "(istadu cantzelladu)" empty: Perunu registru agatadu. filter_by_action: Filtra pro atzione @@ -310,10 +313,12 @@ sc: new: create: Crea un'annùntziu title: Annùntziu nou + publish: Pùblica published_msg: As publicadu s'annùntziu. scheduled_for: Programmadu pro %{time} scheduled_msg: As programmadu s'annùntziu pro èssere publicadu! title: Annùntzios + unpublish: Annulla sa publicatzione unpublished_msg: As ritiradu s'annùntziu! updated_msg: As atualizadu s'annùntziu. custom_emojis: @@ -327,7 +332,7 @@ sc: delete: Cantzella destroyed_msg: As cantzelladu s'emoji. disable: Disativa - disabled: Disativu + disabled: Disativadu disabled_msg: As disativadu s'emoji emoji: Emoji enable: Ativa @@ -339,7 +344,7 @@ sc: new: title: Agiunghe emoji personalizadu nou not_permitted: Non tenes su permissu de fàghere custa atzione - overwrite: Subraiscrie + overwrite: Subrascrie shortcode: Incurtzadura shortcode_hint: Mìnimu 2 caràteres, isceti caràteres alfanumèricos e tratigheddos bàscios title: Emojis personalizados @@ -350,33 +355,9 @@ sc: updated_msg: Emoji atualizadu upload: Càrriga dashboard: - authorized_fetch_mode: Modalidade segura - backlog: tareas arretradas - config: Cunfiguratzione - feature_deletions: Eliminatzione de contos - feature_invites: Ligàmenes de invitu - feature_profile_directory: Diretòriu de profilos - feature_registrations: Registradas - feature_relay: Ripetidore de federatzione - feature_spam_check: Anti-àliga - feature_timeline_preview: Pre-visualizatzione de sa lìnia de tempus - features: Caraterìsticas - hidden_service: Federatzione cun servìtzios cuados - open_reports: informes abertos - pending_tags: etichetas de revisionare - pending_users: persones de revisionare - recent_users: Persones reghentes - search: Chirca de testu cumpletu - single_user_mode: Modalidade de utente ùnicu software: Programmas space: Impreu de ispàtziu title: Pannellu - total_users: persones in totale - trends: Tendèntzias - week_interactions: interatziones de custa chida - week_users_active: persones ativas custa chida - week_users_new: persones noas de custa chida - whitelist_mode: Modalidade de federatzione limitada domain_allows: add_new: Permite sa federatzione cun domìniu created_msg: Sa federatzione cun su domìniu est istada permìtida @@ -393,17 +374,19 @@ sc: create: Crea unu blocu hint: Su blocu de domìniu no at a impedire sa creatzione de contos noos in sa base de datos, ma ant a èssere aplicados in manera retroativa mètodos de moderatzione ispetzìficos subra custos contos. severity: - desc_html: "A sa muda at a pònnere is messàgios de custos contos comente invisìbiles a sa gente chi no ddi siat sighende. Sa suspensione at a cantzellare totu su cuntenutu de su contu, elementos multimediales e datos de profilu. Imprea Perunu si boles isceti refudare is archìvios multimediales." + desc_html: "A sa muda at a pònnere is messàgios de custos contos comente invisìbiles a sa gente chi no ddos siat sighende. Sa suspensione at a cantzellare totu su cuntenutu de su contu, elementos multimediales e datos de profilu. Imprea Perunu si boles isceti refudare is archìvios multimediales." noop: Perunu silence: A sa muda - suspend: Suspèndidu + suspend: Suspensione title: Blocu de domìniu nou + obfuscate: Cua su nòmine de domìniu + obfuscate_hint: Cua una parte de su nòmine de domìniu in sa lista si sa visualizatzione de sa lista de domìnios limitados est ativa private_comment: Cummentu privadu - private_comment_hint: Lassa unu cummentu a subra de custa limitatzione de domìniu pro impreu internu de s'iscuadra de moderatzione. + private_comment_hint: Lassa unu cummentu subra de custa limitatzione de domìniu pro impreu internu de s'iscuadra de moderatzione. public_comment: Cummentu pùblicu - public_comment_hint: Lassa unu cummentu pro su pùblicu generale a subra de custa limitatzione de su domìniu, si sa publicatzione de sa lista de limitatziones de domìniu est abilitada. - reject_media: Refuda documentos multimediales - reject_media_hint: Cantzellat documentos multimediales sarvados in locale e refudat iscarrigamentos in su benidore. Non rilevante pro is suspensiones + public_comment_hint: Lassa unu cummentu pro su pùblicu generale subra de custa limitatzione de su domìniu, si sa publicatzione de sa lista de limitatziones de domìniu est abilitada. + reject_media: Refuda elementos multimediales + reject_media_hint: Cantzellat elementos multimediales sarvados in locale e refudat iscarrigamentos in su benidore. Non rilevante pro is suspensiones reject_reports: Refuda informes reject_reports_hint: Iscarta informes chi benint de custu domìniu. Non rilevante pro is suspensiones rejecting_media: refudende documentos multimediales @@ -423,7 +406,7 @@ sc: undo: Iscontza su blocu de domìniu view: Bide su blocu de domìniu email_domain_blocks: - add_new: Agiunghe noa + add_new: Agiunghe nou created_msg: Domìniu de posta eletrònica blocadu delete: Cantzella destroyed_msg: Domìniu de posta eletrònica isblocadu @@ -434,9 +417,18 @@ sc: create: Agiunghe unu domìniu title: Bloca su domìniu de posta eletrònica nou title: Domìnios de posta eletrònica blocados + follow_recommendations: + description_html: "Is cussìgios de sighiduras agiudant a is persones noas a agatare deretu cuntenutu interessante. Si una persone at interagidu cun pagu gente e non podet retzire cussìgios de sighiduras personalizados, custos contos ant a èssere ammustrados. Ant a èssere torrados a carculare dae un'ammisturu de contos cun is pertzentuales de cumpromissu prus artos e su nùmeru prus artu de sighiduras pro un'idioma ispetzìficu." + language: Pro idioma + status: Istadu + suppress: Cantzella su cussìgiu de sighidura + suppressed: Cantzelladu + title: Cussìgios de sighidura + unsuppress: Recùpera su cussìgiu de sighidura instances: by_domain: Domìniu delivery_available: Sa cunsigna est a disponimentu + empty: Perunu domìniu agatadu. known_accounts: one: "%{count} contu connòschidu" other: "%{count} contos connòschidos" @@ -462,7 +454,7 @@ sc: title: Invitos ip_blocks: add_new: Crea una règula - created_msg: As agiuntu una règula IP noa + created_msg: Règula IP noa agiunta delete: Cantzella expires_in: '1209600': 2 chidas @@ -484,7 +476,7 @@ sc: delete: Cantzella description_html: Unu ripetidore de federatzione est unu serbidore intermediàriu chi cuncàmbiat volùmenes mannos de tuts pùblicos intre serbidores chi si connetent e bi pùblicant. Podet agiudare a serbidores minores e medianos a iscobèrrere cuntenutu de su fediversu, in manera chi is utentes locales non tèngiant bisòngiu de sighire a manu àtera gente de serbidores remotos. disable: Disativa - disabled: Disativu + disabled: Disativadu enable: Ativa enable_hint: Si abilitadu, su serbidore tuo at a èssere sutascritu a totu is tuts pùblicos de custu ripetidore e bi at a cumintzare a imbiare totu is tuts pùblicos de custu serbidore. enabled: Ativadu @@ -513,7 +505,9 @@ sc: by_target_domain: Domìniu de su contu signaladu comment: none: Perunu - created_at: Signaladu + created_at: Sinnaladu + forwarded: Torradu a imbiare + forwarded_to: Torradu a imbiare a %{domain} mark_as_resolved: Marca comente a isòrvidu mark_as_unresolved: Marcare comente a non isòrvidu notes: @@ -524,8 +518,8 @@ sc: placeholder: Descrie is atziones chi as pigadu o cale si siat àtera atualizatzione de importu... reopen: Torra a abèrrere s'informe report: 'Informe #%{id}' - reported_account: Contu signaladu - reported_by: Signaladu dae + reported_account: Contu sinnaladu + reported_by: Sinnaladu dae resolved: Isòrvidu resolved_msg: Informe isòrvidu. status: Istadu @@ -533,13 +527,20 @@ sc: unassign: Boga s'assignatzione unresolved: No isòrvidu updated_at: Atualizadu + rules: + add_new: Agiunghe règula + delete: Cantzella + description_html: Mancari su prus nàrgiant chi ant letu e atzetadu is cunditziones de su servìtziu, a su sòlitu is persones non ddu leghent fintzas a cando no essint a campu problemas. Faghe chi siat prus simpre a lèghere is règulas de su serbidore cun un'ograda disponende·ddas isceti in un'elencu puntadu. Chirca de mantènnere onni règula curtza e simpre, ma chirca fintzas de non ddas partzire in medas elementos ispartzinados. + edit: Modìfica sa règula + empty: Peruna règula de serbidore definida ancora. + title: Règulas de su serbidore settings: activity_api_enabled: desc_html: Nùmeru de tuts publicados in locale, utentes ativos e registros noos in perìodos chidajolos title: Pùblica istatìsticas agregadas subra s'atividade de s'utente bootstrap_timeline_accounts: - desc_html: Imprea vìrgulas intre is nòmines de utente. Isceti is contos locales e isblocados ant a funtzionare. Su valore predefinidu cando est bòidu est totu is admins locales. - title: Sighidura predefinida pro persones noas + desc_html: Imprea vìrgulas intre is nòmines de utente. Isceti is contos locales e isblocados ant a funtzionare. Su valore predefinidu cando est bòidu est totu is admins locales + title: Cussìgia custos contos a is persones noas contact_information: email: Indiritzu eletrònicu de impresa username: Nòmine de utente de su cuntatu @@ -556,8 +557,6 @@ sc: users: Pro utentes locales in lìnia domain_blocks_rationale: title: Ammustra sa resone - enable_bootstrap_timeline_accounts: - title: Ativa s sighiduras predefinidas pro is persones noas hero: desc_html: Ammustradu in sa pàgina printzipale. Cussigiadu a su mancu 600x100px. Si no est cunfiguradu, at a èssere ammustradu cussu de su serbidore title: Immàgine de eroe @@ -566,12 +565,12 @@ sc: title: Immàgine de su personàgiu peers_api_enabled: desc_html: Is nòmines de domìniu chi custu serbidore at agatadu in su fediversu - title: Pùblica sa lista de serbidores iscobertos + title: Pùblica sa lista de serbidores iscobertos in s'API preview_sensitive_media: - desc_html: Is antiprimas de ligòngios de àteros sitos web ant a ammustrare una miniadura mancari is mèdios de comunicatzione siant marcados comente a sensìbiles - title: Ammustra mèdios sensìbiles in sas previsualizatziones de OpenGraph + desc_html: Is previsualizatziones de ligòngios de àteros sitos web ant a ammustrare una miniadura fintzas cando is elementos multimediales siant marcados comente a sensìbiles + title: Ammustra elementos multimediales sensìbiles in is previsualizatziones de OpenGraph profile_directory: - desc_html: Permite a is persone de èssere iscobertas + desc_html: Permite a is persones de èssere iscobertas title: Ativa diretòriu de profilos registrations: closed_message: @@ -581,8 +580,11 @@ sc: desc_html: Permite a chie si siat de cantzellare su contu suo title: Aberi s'eliminatzione de su contu min_invite_role: - disabled: Perunu + disabled: Nemos title: Permite invitos de + require_invite_text: + desc_html: Cando is registratziones rechedent s'aprovatzione manuale, faghe chi a incarcare su butone "Pro ite ti boles iscrìere?" siat obligatòriu e no a praghere + title: Rechede a is persones noas chi iscriant una resone prima de aderire registrations_mode: modes: approved: Aprovatzione rechesta pro si registrare @@ -596,7 +598,7 @@ sc: desc_html: Ammustra un'insigna de personale in sa pàgina de utente title: Ammustra insigna de personale site_description: - desc_html: Paràgrafu de introdutzione a s'API. Descrie ite rendet ispatziale custu serbidore de Mastodon e cale si siat àtera cosa de importu. Podes impreare etichetas HTML, mescamente <a> e <em>. + desc_html: Paràgrafu de introdutzione a s'API. Descrie pro ite custu serbidore de Mastodon siat ispetziale e cale si siat àtera cosa de importu. Podes impreare etichetas HTML, mescamente <a> e <em>. title: Descritzione de su serbidore site_description_extended: desc_html: Unu logu adatu pro publicare su còdighe de cumportamentu, règulas, diretivas e àteras caraterìsticas ispetzìficas de su serbidore tuo. Podes impreare etichetas HTML @@ -605,12 +607,9 @@ sc: desc_html: Ammustradu in sa barra laterale e in is meta-etichetas. Descrie ite est Mastodon e pro ite custu serbidore est ispetziale in unu paràgrafu. title: Descritzione curtza de su serbidore site_terms: - desc_html: Podes iscriere sa tua normativa de riservadesa pròpia, cunditziones de servìtziu e àteras normas legales. Podes impreare etichetas HTML - title: Termes de su servìtziu personalizados + desc_html: Podes iscrìere sa normativa de riservadesa tua, cunditziones de servìtziu e àteras normas legales. Podes impreare etichetas HTML + title: Cunditziones de su servìtziu personalizadas site_title: Nòmine de su serbidore - spam_check_enabled: - desc_html: Mastodon podet signalare in automàticu contos chi imbiant messàgios non rechestos in manera repetitiva. Bi podent èssere falsos positivos. - title: Automatzione anti-spam thumbnail: desc_html: Impreadu pro otènnere pre-visualizatziones pro mèdiu de OpenGraph e API. Cussigiadu 1200x630px title: Miniadura de su serbidore @@ -641,13 +640,18 @@ sc: no_status_selected: Perunu istadu est istadu mudadu dae chi non nd'as seletzionadu title: Istados de su contu with_media: Cun elementos multimediales + system_checks: + database_schema_check: + message_html: Ddoe at tràmudas de base de datos in suspesu. Pone·ddas in esecutzione pro ti assegurare chi s'aplicatzione funtzionet comente si tocat + rules_check: + action: Gesti is règulas de su serbidore + message_html: No as cunfiguradu peruna règula de su serbidore. + sidekiq_process_check: + message_html: Perunu protzessu Sidekiq est in esecutzione pro sa coa(s) %{value}. Revisiona is cunfiguratziones de Sidekiq tags: accounts_today: Impreos ùnicos atuales accounts_week: Impreos ùnicos de custa chida breakdown: Detàllios de s'impreu atuale pro orìgine - context: Cuntestu - directory: In su diretòriu - in_directory: "%{count} in su diretòriu" last_active: Ùrtima atividade most_popular: Prus populares most_recent: Prus reghentes @@ -664,17 +668,18 @@ sc: add_new: Agiunghe noa delete: Cantzella edit_preset: Modìfica s'avisu predefinidu + empty: No as cunfiguradu ancora perunu avisu predefinidu. title: Gesti is cunfiguratziones predefinidas de is avisos admin_mailer: new_pending_account: body: Is detàllios de su contu nou sunt a suta. Podes aprovare o refudare custa rechesta. subject: Contu nou de revisionare in %{instance} (%{username}) new_report: - body: "%{reporter} at signaladu %{target}" - body_remote: Calicunu de su domìniu %{domain} at signaladu %{target} + body: "%{reporter} at sinnaladu %{target}" + body_remote: Una persone de su domìniu %{domain} at sinnaladu %{target} subject: Informe nou pro %{instance} (#%{id}) new_trending_tag: - body: 'S''eticheta #%{name} est in tendèntzia oe, ma non est istada revisionada in passadu. No at a èssere ammustrada in pùblicu francu chi ddu permitas; si sarvas formulàriu sena ddu modificare no ddu as a bìdere mai prus.' + body: 'S''eticheta #%{name} est in tendèntzia oe, ma no est istada revisionada in passadu. No at a èssere ammustrada in pùblicu francu chi ddu permitas; si sarvas su formulàriu sena ddu modificare, no ddu as a bìdere mai prus.' subject: Eticheta noa de revisionare in %{instance} (#%{name}) aliases: add_new: Crea unu nomìngiu @@ -685,7 +690,7 @@ sc: remove: Disconnete su nomìngiu appearance: advanced_web_interface: Interfache web avantzada - advanced_web_interface_hint: 'Si impreare totu sa largària de s''ischermu, s''interfache web avantzada ti permitit de cunfigurare diversas colunnas pro bìdere meda prus informatzione in contemporànea: printzipale, notìficas, lìnia de tempus federada e cale si siat nùmeru de listas e etichetas.' + advanced_web_interface_hint: 'Si boles impreare totu sa largària de s''ischermu, s''interfache web avantzada ti permitit de cunfigurare diversas colunnas pro bìdere meda prus informatzione in contemporànea: printzipale, notìficas, lìnia de tempus federada e cale si siat nùmeru de listas e etichetas.' animations_and_accessibility: Animatziones e atzessibilidade confirmation_dialogs: Diàlogos de cunfirmatzione discovery: Iscoberta @@ -750,8 +755,8 @@ sc: confirming: Isetende chi sa posta eletrònica siat cumpletada. functional: Su contu tuo est operativu. pending: Sa dimanda tua est in protzessu de revisione dae su personale nostru. Podet serbire unu pagu de tempus. As a retzire unu messàgiu eletrònicu si sa dimanda est aprovada. - redirecting_to: Su contu tuo est inativu ca in die de oe est torrende a indiritzare a %{acct}. - too_fast: Mòdulu imbiadu tropu a lestru, torra a proare. + redirecting_to: Su contu tuo est inativu pro ite in die de oe est torrende a indiritzare a %{acct}. + too_fast: Formulàriu imbiadu tropu a lestru, torra a proare. trouble_logging_in: Tenes problemas de atzessu? use_security_key: Imprea una crae de seguresa authorize_follow: @@ -760,12 +765,12 @@ sc: error: Faddina in sa chirca de su contu remotu follow: Sighi follow_request: 'As imbiadu una dimanda de sighidura a:' - following: 'Fatu! Immoe ses sighende:' + following: 'Fatu! Immoe ses sighende a:' post_follow: close: O, podes serrare custa ventana. return: Ammustra su profilu de custa persone web: Bae a su situ web - title: Sighi %{acct} + title: Sighi a %{acct} challenge: confirm: Sighi hint_html: "Cussìgiu: No t'amus a torrare a dimandare sa crae in s'ora imbeniente." @@ -777,8 +782,8 @@ sc: invalid_signature: no est una firma Ed25519 vàlida date: formats: - default: "%d %b %Y" - with_month_name: "%d %B %Y" + default: "%d %b, %Y" + with_month_name: "%d %B, %Y" datetime: distance_in_words: about_x_hours: "%{count} o" @@ -823,7 +828,7 @@ sc: '406': Custa pàgina no est a disponimentu in su formadu chi as pregontadu. '410': Sa pàgina chi ses chirchende no esistet prus. '422': - content: Faddina in sa verìfica de seguresa. Ses blochende is boboettos? + content: Faddina in sa verìfica de seguresa. Ses blochende is testimòngios? title: Faddina in sa verìfica de seguresa '429': Tropu rechestas '500': @@ -853,7 +858,7 @@ sc: add_new: Agiunghe noa errors: limit: As giai evidentziadu sa cantidade màssima de etichetas - hint_html: "Ite sunt is etichetas in evidèntzia? Sunt ammustradas in evidèntzia in su profilu pùblicu tuo e permitint a sa gente de navigare is messàgios pùblicos tuos in cussas etichetas ispetzìficas. Sunt un'aina perfeta pro tènnere unu registru de òperas creativas o progetos longos." + hint_html: "Ite sunt is etichetas in evidèntzia? Sunt ammustradas in evidèntzia in su profilu pùblicu tuo e permitint a sa gente de navigare is messàgios pùblicos tuos in cussas etichetas ispetzìficas. Sunt unu traste perfetu pro tènnere unu registru de òperas creativas o progetos longos." filters: contexts: account: Profilos @@ -900,26 +905,28 @@ sc: invalid_token: Is còdighes de autorizatzione de Keybase sunt hash de firmas e depent tènnere 66 caràteres esadetzimales verification_failed: Keybase non reconnoschet custu còdighe de autorizatzione che a firma de s'utente de Keybase %{kb_username}. Torra·bi a proare dae Keybase. wrong_user: Impossìbile creare una proa pro %{proving} cando as fatu s'atzessu che a %{current}. Intra che a %{proving} e torra·bi a proare. - explanation_html: Inoghe podes collegare critograficamente is àteras identidades tuas dae àteras prataformas, che a Keybase. Custu permitit a àteras persones de t'imbiare messàgios tzifrados in cussas prataformas e de tènnere sa seguresa chi sos cuntenutos chi lis mandas benit dae tene. + explanation_html: Inoghe podes collegare critograficamente is àteras identidades tuas dae àteras prataformas, che a Keybase. Custu permitit a àteras persones de t'imbiare messàgios tzifrados in cussas prataformas e de tènnere sa seguresa chi is cuntenutos chi ddis ses imbiende benint dae tene. i_am_html: So %{username} in %{service}. identity: Identidade inactive: Inativu - publicize_checkbox: 'E imbiat custu tut:' + publicize_checkbox: 'E imbia custu tut:' publicize_toot: 'Verificadu! So %{username} in %{service}: %{url}' remove: Boga sa proa dae su contu removed: Proa bogada dae su contu status: Istadu de verìfica - view_proof: Bìdere sa proa + view_proof: Ammustra sa proa imports: + errors: + over_rows_processing_limit: cuntenet prus de %{count} filas modes: merge: Uni merge_long: Mantene is registros chi esistint e agiunghe·nde àteros - overwrite: Subraiscrie + overwrite: Subrascrie overwrite_long: Sostitui is registros atuales cun cussos noos preface: Podes importare datos chi as esportadu dae unu àteru serbidore, che a sa lista de sa gente chi ses sighende o blochende. success: Datos carrigados; ant a èssere protzessados luego types: - blocking: Lista de blocados + blocking: Lista de blocos bookmarks: Sinnalibros domain_blocking: Lista domìnios blocados following: Lista de sighiduras @@ -943,7 +950,7 @@ sc: one: 1 impreu other: "%{count} impreos" max_uses_prompt: Sena lìmite - prompt: Gènera e cumpartzi ligàmenes cun àteras persones pro dare atzessu a custu serbidore + prompt: Gènera e cumpartzi ligàmenes cun àteras persones pro donare atzessu a custu serbidore table: expires_at: Iscadit uses: Impreos @@ -963,7 +970,7 @@ sc: cancelled_msg: Indiritzamentu annulladu. errors: already_moved: est su pròpiu contu a su chi as giai tramudadu - missing_also_known_as: no est unu nomìngiu de custu countu + missing_also_known_as: no est unu nomìngiu de custu contu move_to_self: non podet èssere su contu atuale not_found: no agatadu on_cooldown: Ses in perìodu de pàusa intre una tràmuda e s'àtera @@ -990,9 +997,9 @@ sc: moderation: title: Moderatzione move_handler: - carry_blocks_over_text: Custu utente s'est tramudadu dae %{acct}, chi as blocadu. - carry_mutes_over_text: Custu utente s'est tramudadu dae %{acct}, chi as impostadu a sa muda. - copy_account_note_text: 'Custu utente s''est tramudadu dae %{acct}, custas sunt sas notas antepostas tuas chi li pertocant:' + carry_blocks_over_text: Custa persone s'est tramudada dae %{acct}, chi as blocadu. + carry_mutes_over_text: Custa persone s'est tramudada dae %{acct}, chi as postu a sa muda. + copy_account_note_text: 'Custa persone s''est tramudada dae %{acct}, custas sunt is notas antepostas tuas chi ddi pertocant:' notification_mailer: digest: action: Ammustra totu is notìficas @@ -1022,11 +1029,15 @@ sc: action: Risponde body: "%{name} t'at mentovadu in:" subject: "%{name} t'at mentovadu" - title: Mentovu nou + title: Mèntovu nou + poll: + subject: Su sondàgiu de %{name} est acabadu reblog: body: "%{name} at cumpartzidu s'istadu tuo:" subject: "%{name} at cumpartzidu s'istadu tuo" title: Cumpartzidura noa + status: + subject: "%{name} at publicadu cosa" notifications: email_events: Eventos pro notìficas cun posta eletrònica email_events_hint: 'Seletziona eventos pro is chi boles retzire notìficas:' @@ -1042,13 +1053,13 @@ sc: thousand: m trillion: Bln otp_authentication: - code_hint: Inserta·nche su còdighe generadu dae s'aplicatzione di autenticatzione pro cunfirmare + code_hint: Inserta·nche su còdighe generadu dae s'aplicatzione de autenticatzione pro cunfirmare description_html: Si as a abilitare s'autenticatzione in duas fases impreende un'aplicatzione de autenticatzione, pro s'intrada as a dèpere tènnere in fatu su telèfonu tuo, chi at a ingendrare getones pro ti fàghere intrare. enable: Ativa - instructions_html: "Iscansi custu còdighe QR in s'autenticadore de Google o in un'aplicatzione TOTP simigiante in su telèfonu tuo. Dae como a in antis, cuss'aplicatzione at a ingendrare getones chi as a dèpere insertare pro pòdere fàghere s'atzessu." - manual_instructions: 'Si non podet iscansire su còdighe QR e tenes bisòngiu de dd''insertare manualmente, inoghe ddoe est su còdighe segretu in testu craru:' + instructions_html: "Iscansiona custu còdighe QR in s'autenticadore de Google o in un'àtera aplicatzione TOTP in su telèfonu tuo. Dae immoe, cussa aplicatzione at a ingendrare getones chi as a dèpere insertare pro pòdere fàghere s'atzessu." + manual_instructions: 'Si non podes iscansionare su còdighe QR e tenes bisòngiu de ddu insertare a manu, inoghe ddoe est su còdighe segretu in testu craru:' setup: Cunfigura - wrong_code: Su còdighe insertadu no est vàlidu! S'ora de su serbidore e de su dispositivu sunt curretas? + wrong_code: Su còdighe insertadu no est vàlidu. S'ora de su serbidore e de su dispositivu sunt curretas? pagination: newer: Prus reghente next: Sighi @@ -1172,11 +1183,9 @@ sc: notifications: Notìficas preferences: Preferèntzias profile: Profilu - relationships: Persones chi sighis e chi ti sighint + relationships: Gente chi sighis e sighiduras two_factor_authentication: Autenticatzione de duos fatores webauthn_authentication: Craes de seguresa - spam_check: - spam_detected: Custu est un'informe automàticu. Àliga rilevada. statuses: attached: audio: @@ -1196,7 +1205,7 @@ sc: other: 'cuntenet is etichetas non permìtidas: %{tags}' errors: in_reply_not_found: Ses chirchende de rispòndere a unu tut chi no esistit prus. - language_detection: Rileva sa limba in automàticu + language_detection: Rileva s'idioma in automàticu open_in_web: Aberi in sa web over_character_limit: lìmite de caràteres de %{max} superadu pin_errors: @@ -1216,15 +1225,25 @@ sc: show_newer: Ammustra is prus noos show_older: Ammustra is prus betzos show_thread: Ammustra su tema - sign_in_to_participate: Cumintzat sa sessione pro partetzipare in s'arresonada + sign_in_to_participate: Identìfica·ti pro partetzipare in s'arresonada title: '%{name}: "%{quote}"' visibilities: + direct: Deretu private: Isceti pro chie ti sighit private_long: Ammustra isceti a chie ti sighit public: Pùblicu public_long: Podet èssere bidu dae chie si siat unlisted: Esclùidu de sa lista unlisted_long: Podet èssere bidu dae chie si siat, però non podet èssere ammustradu in lìnias de tempus pùblicas + statuses_cleanup: + min_age: + '1209600': 2 chidas + '15778476': 6 meses + '2629746': 1 mese + '31556952': 1 annu + '5259492': 2 meses + '63113904': 2 annos + '7889238': 3 meses stream_entries: pinned: Tut apicadu reblogged: cumpartzidu @@ -1238,20 +1257,20 @@ sc:
    • Informatziones de base de su contu: Si t'as a registrare in custu serbidore, ti diant pòdere pedire de insertare unu nòmine utente, un'indiritzu de posta eletrònica e una crae de intrada. Dias pòdere insertare fintzas àteras informatziones de profilu, che a unu nòmine de ammustrare e una biografia, e carrigare un'immàgine de profilu e una de cobertedda. Su nòmine utente, cussu ammustradu, sa biografia, s'immàgine de profilu e de cobertedda sunt semper allistados in pùblicu.
    • -
    • Publicatziones, sighidores e àteras informatziones pùblicas: Sa lista de is persones chi sighis est allistada in pùblicu, e sa matessi cosa balet pro is chi ti sighint. Cando imbias unu messàgiu sa data e s'ora benint sarbadas, gasi comente s'aplicatzione dae sa cale as imbiadu su messàgiu. Is messàgios diant pòdere cuntènnere cuntenutos multimediales allongiados, che a immàgines e vìdeos. Is publicatziones pùblicas e no allistadas sunt a disponimentu in abertu. Cando ammustras una publicatzione in su profilu tuo, fintzas cussa est un'informatzione a disponimentu pùblicu. Is publicatziones tuas benint imbiadas a is sighidores tuos, cosa chi a bortas bolet nàrrere chi benint intregadas a serbidores diferentes chi nde sarbant còpias in cue. Cando cantzellas publicatziones, custu acontessimentu benit imbiadu fintzas issu a is sighidores tuos. S'atzione de torrare a cumpartzire o de pònnere in is preferidos un'àtera publicatzione est semper pùblica.
    • -
    • Publicatziones diretas e pro is sighidores ebbia: Totu is publicatziones benint archiviadas e protzessadas in su serbidore. Is publicatziones pro is sighidores ebbia benint intregadas a is sighidores tuos e a is utentes chi ddoe sunt mentovados in intro, e is publicatziones diretas benint intregadas isceti a is sighidores chi ddoe sunt mentovados in intro. In unos cantos casos bolet nàrrere chi benint intregados a serbidores diferentes e chi còpias issoro benint sarvadas in cue. Nois chircamus de limitare s'atzessu a custas publicatziones a is persones autorizadas ebbia, ma àteros serbidores bi diant pòdere non resessere. Pro custa resone est de importu mannu su de revisionare is serbidores a is cales faghent parte is sighidores tuos. Podes impreare un'optzione pro aprovare o refudare in manera automàtica sighidores noos in is cunfiguratziones. Ammenta·ti chi is operadores de su serbidore e cale si siat serbidore chi ddos retzit podent castiare custos messàgios, e chi is retzidores ddos diant pòdere sarvare faghende caturas, copiende·los o torrende·los a cumpartzire in àteras maneras. Non cumpartzas peruna informatzione perigulosa impreende Mastodon.
    • -
    • IP e àteros metadatos: Cando intras in su contu tuo sarvamus s'indiritzu IP dae su cale lu ses faghende, e fintzas su nòmine de s'aplicatzione chi impreas comente navigadore. Totu is sessiones de atzessu abertas sunt a disponimentu pro sa revisione e sa rèvoca in is cunfiguratziones tuas. S'ùrtimu indiritzu IP impreadu benit sarvadu finas a 12 meses. Diamus pòdere archiviare fintzas raportos chi includent is indiritzos IP de totu is rechestas a su serbidore nostru.
    • +
    • Publicatziones, sighidores e àteras informatziones pùblicas: Sa lista de is persones chi sighis est allistada in pùblicu, e sa matessi cosa balet pro is chi ti sighint. Cando imbias unu messàgiu sa data e s'ora benint sarvadas, aici comente s'aplicatzione dae sa cale as imbiadu su messàgiu. Is messàgios diant pòdere cuntènnere cuntenutos multimediales allongiados, che a immàgines e vìdeos. Is publicatziones pùblicas e no allistadas sunt a disponimentu in abertu. Cando ammustras una publicatzione in su profilu tuo, fintzas cussa est un'informatzione a disponimentu pùblicu. Is publicatziones tuas benint imbiadas a is sighidores tuos, cosa chi a bortas bolet nàrrere chi benint intregadas a serbidores diferentes chi nde sarvant còpias in cue. Cando cantzellas publicatziones, custu acuntessimentu benit imbiadu fintzas issu a is persones chi ti sighint. S'atzione de torrare a cumpartzire o de pònnere in is preferidos un'àtera publicatzione est semper pùblica.
    • +
    • Publicatziones diretas e pro chie ti sighit ebbia: Totu is publicatziones benint archiviadas e protzessadas in su serbidore. Is publicatziones pro is sighidores ebbia benint intregadas a chie ti sighit e a is utentes mentovados in intro, e is publicatziones diretas benint intregadas isceti a chie sighit a chi ddoe sunt mentovados in intro. In unos cantos casos bolet nàrrere chi benint intregados a serbidores diferentes e chi còpias issoro benint sarvadas in cue. Nois chircamus de limitare s'atzessu a custas publicatziones a is persones autorizadas ebbia, ma àteros serbidores bi diant pòdere non resessere. Pro custa resone est de importu mannu su de revisionare is serbidores a is cales faghent parte is sighiduras tuas. Podes impreare un'optzione pro aprovare o refudare in manera automàtica sighiduras noas in is cunfiguratziones. Regorda·ti chi is operadores de su serbidore e cale si siat serbidore chi ddos retzit podent castiare custos messàgios, e chi is retzidores ddos diant pòdere sarvare faghende caturas, copiende·los o torrende·los a cumpartzire in àteras maneras. Non cumpartzas peruna informatzione perigulosa impreende Mastodon.
    • +
    • IP e àteros metadatos: Cando intras in su contu tuo sarvamus s'indiritzu IP dae ue ses intrende, e fintzas su nòmine de s'aplicatzione chi impreas comente navigadore. Totu is sessiones de atzessu abertas sunt a disponimentu pro sa revisione e sa rèvoca in is cunfiguratziones tuas. S'ùrtimu indiritzu IP impreadu benit sarvadu finas a 12 meses. Diamus pòdere archiviare fintzas raportos chi includent is indiritzos IP de totu is rechestas a su serbidore nostru.

    Pro ite cosas impreamus is informatziones tuas?

    -

    Totu is informatziones chi collimus dae tene diat pòdere èssere impreadas in is maneras chi sighint:

    +

    Totu is informatziones chi collimus dae tene diant pòdere èssere impreadas in is maneras chi sighint:

      -
    • Pro frunire sa funtzionalidade de base de Mastodon. Podes interagire cun is cuntenutos de is àteras persones, e cumpartzire is tuos, isceti cando ses intradu in su contu tuo. A esèmpiu, podes sighire àteras persones pro castiare is publicatziones cumbinadas issoro in sa lìnia de tempus personalizada printzipale tua.
    • -
    • Pro agiudare sa moderatzione de sa comunidade, a esèmpiu cunfrontende s'indiritzu IP tuo cun àteros giai connotos pro verificare evasiones de blocos o àteras violatziones.
    • +
    • Pro frunire sa funtzionalidade de base de Mastodon. Podes interagire cun is cuntenutos de is àteras persones, e cumpartzire is tuos, isceti cando as fatu s'atzessu in su contu tuo. Pro esèmpiu, podes sighire àteras persones pro castiare is publicatziones cumbinadas issoro in sa lìnia de tempus personalizada printzipale tua.
    • +
    • Pro agiudare sa moderatzione de sa comunidade, pro esèmpiu cunfrontende s'indiritzu IP tuo cun àteros giai connotos pro verificare evasiones de blocos o àteras violatziones.
    • S'indiritzu de posta eletrònica chi as a frunire diat pòdere èssere impreadu pro t'imbiare informatziones, notìficas a pitzu de àteras persones chi ant a interagire cun is cuntenutos tuos o chi t'ant a imbiare messàgios, e pro rispòndere a interrogativos e/o àteras rechestas o preguntas.
    @@ -1259,7 +1278,7 @@ sc:

    Comente amparamus is informatziones tuas?

    -

    Impreamus medidas de seguresa vàrias pro amparare sa seguresa de is informatziones personales tuas cando insertas o imbias is informatziones personales tuas, o cando b'atzedes. In paris a àteras cosas, sa sessione de su navigadore tuo, e fintzas su tràficu intre s'aplicatzione tua e s'API, benint amparados cun SSL, e sa crae tua benit tzifrada impreende un'algoritmu forte a una diretzione. Pro afortiare sa seguresa de s'atzessu a su contu tuo galu de prus podes abilitare s'autenticatzione in duos fatores.

    +

    Impreamus medidas de seguresa vàrias pro amparare sa seguresa de is informatziones personales tuas cando insertas o imbias is informatziones personales tuas, o cando bi atzedes. In paris a àteras cosas, sa sessione de su navigadore tuo, e fintzas su tràficu intre s'aplicatzione tua e s'API, benint amparados cun SSL, e sa crae tua benit tzifrada impreende un'algoritmu forte a una diretzione. Pro afortiare sa seguresa de s'atzessu a su contu tuo ancora de prus podes abilitare s'autenticatzione in duos fatores.


    @@ -1280,35 +1299,35 @@ sc:

    Impreamus is testimòngios?

    -

    Eja. Is testimòngios ("cookies") sunt documentos minores chi unu situ o su frunidore de servìtzios suos tramudant a su discu tèteru de s'elaboradore tuo pro mèdiu de su navigadore web tuo (si bi lu permitis). Custos testimòngios permitint a su situ de reconnòschere su navigadore tuo e, si tenes unu contu registradu, de dd'assotziare cun su contu tuo.

    +

    Eja. Is testimòngios ("cookies") sunt documentos minores chi unu situ o su frunidore de servìtzios suos tramudant a su discu tèteru de s'elaboradore tuo pro mèdiu de su navigadore web tuo (si si ddu permitis). Custos testimòngios permitint a su situ de reconnòschere su navigadore tuo e, si tenes unu contu registradu, de ddu assotziare cun su contu tuo.

    -

    Impreamus is testimòngios pro cumprèndere e sarvare is preferèntzias tuas pro is bìsitas imbenientes.

    +

    Impreamus is testimòngios pro cumprèndere e sarvare is preferèntzias tuas pro is visitas imbenientes.


    -

    Rivelamus carchi informatzione a tertzas partes?

    +

    Rivelamus calicuna informatzione a tertzas partes?

    Non bendimus, cuncambiamus, o tramudamus in àteras maneras is informatziones tuas chi ti diant pòdere individuare in manera personale. Custu no incluit sugetos de tertzas partes fidados chi nos agiudant a amministrare su situ, fàghere is fainas nostras, o a t'agiudare, finas a cando cussos sugetos atzetant de mantènnere cunfidentziales cussas informatziones. Diamus fintzas pòdere frunire is informatziones tuas si amus a èssere cumbintos chi siat apropriadu pro sighire is leges, aplicare is polìticas de su situ nostru, e amparare is deretos, propiedades o seguresas nostros o de àteros.

    -

    Is cuntenutos pùblicos tuos diant pòdere èssere iscarrigados dae àteros serbidores in sa retza. Is publicatziones pùblicas e pro is sighidores ebbia benint intregadas a is serbidores in ue istant is retzidores, si istant in unu serbidore chi no est custu.

    +

    Is cuntenutos pùblicos tuos diant pòdere èssere iscarrigados dae àteros serbidores in sa rete. Is publicatziones pùblicas e pro is sighiduras ebbia benint intregadas a is serbidores in ue istant is retzidores, si istant in unu serbidore chi no est custu.

    Cando autorizas un'aplicatzione a impreare su contu tuo, a segunda de sa mannària de is permissos chi frunis, cussa diat pòdere atzèdere a is informatziones pùblicas de profilu tuas, a sa lista de is persones chi sighis e chi ti sighint, a is listas tuas, a totu is publicatziones tuas e a is referidos tuos. Is aplicatziones non podent mai tènnere atzessu a s'indiritzu de posta eletrònica tuo e a sa crae de intrada tua.


    -

    Impreu de custu situ dae arte de pitzinnos

    +

    Impreu de custu situ dae parte de minores

    Si custu serbidore est in s'UE o in s'ÀEE: Su situ nostru, is produtos nostros e is servìtzios nostros sunt totu cantos pensados pro persones chi tenent a su mancu 16 annos de edade. Si tenes de mancu de 16 annos, in aplicatzione de is rechisitos de su GDPR (General Data Protection Regulation) no imprees custu situ.

    -

    Si custu serbidore est in sos IUA: Su situ nostru, is produtos e is servìtzios suos sunt totu cantos pensados pro persones chi tenent a su mancu 13 annos de edade. Si tenes de mancu de 13 annos, in aplicatzione de su COPPA (Children's Online Privacy Protection Act) no imprees custu situ.

    +

    Si custu serbidore est in is IUA: Su situ nostru, is produtos e is servìtzios suos sunt totu cantos pensados pro persones chi tenent a su mancu 13 annos de edade. Si tenes de mancu de 13 annos, in aplicatzione de su COPPA (Children's Online Privacy Protection Act) no imprees custu situ.

    -

    Is rechisidos de sa lege diant pòdere èssere diferentes si custu serbidore est in suta de un'àtera giurisditzione.

    +

    Is rechisitos de sa lege diant pòdere èssere diferentes si custu serbidore est in suta de un'àtera giurisditzione.


    Modìficas a sa polìtica de riservadesa nostra

    -

    Si amus a isseberare de cambiare sa polìtica de riservadesa nostra amus a publicare is modìficas in custa pàgina.

    +

    Si amus a seberare de cambiare sa polìtica de riservadesa nostra amus a publicare is modìficas in custa pàgina.

    Custu documentu tenet una litzèntzia CC-BY-SA. Est istadu agiornadu s'ùrtima borta su 7 de martzu de su 2018.

    @@ -1335,27 +1354,27 @@ sc: otp: Aplicatzione de autenticatzione recovery_codes: Còdighes de recùperu de còpia de seguridade recovery_codes_regenerated: Còdighes de recùperu torrados a generare - recovery_instructions_html: Si una die as a pèrdere s'atzessu a su telèfonu tuo, as a pòdere impreare unu de is còdighes de recùperu inoghe in suta pro recuperare s'atzessu a su contu tuo. Cunserva is còdighes in manera segura. A esèmpiu, ddos dias pòdere imprentare e archiviare in paris a àteros documentos de importu. + recovery_instructions_html: Si una die as a pèrdere s'atzessu a su telèfonu tuo, as a pòdere impreare unu de is còdighes de recùperu inoghe in suta pro recuperare s'atzessu a su contu tuo. Cunserva is còdighes in manera segura. Pro esèmpiu, ddos dias pòdere imprentare e archiviare in paris a àteros documentos de importu. webauthn: Craes de seguresa user_mailer: backup_ready: - explanation: As pedidu una còpia de seguresa totale de su contu de Mastodon tuo. Como est pronta pro s'iscarrigamentu! + explanation: As pedidu una còpia de seguresa totale de su contu de Mastodon tuo. Immoe est pronta pro s'iscarrigamentu! subject: S'archìviu tuo est prontu pro èssere iscarrigadu title: Collida dae s'archìviu sign_in_token: details: 'Custos sunt is detàllios de su tentativu:' - explanation: 'Amus rilevadu unu tentativu de identificatzione in su contu tuo dae un''indiritzu IP non reconnotu. Si fias tue, inserta su còdighe de seguresa in bàsciu in sa pàgina disafiu de identificatzione:' - further_actions: 'Si no fias tue, càmbia sa crae tua e ativa s''autenticatzione in duos passos in su contu tuo. Ddu podes fàghere inoghe:' + explanation: 'Amus rilevadu unu tentativu de identificatzione in su contu tuo dae un''indiritzu IP non reconnotu. Si fias tue, inserta su còdighe de seguresa in bàsciu in sa pàgina de disafiu de identificatzione:' + further_actions: 'Si non fias tue, càmbia sa crae tua e ativa s''autenticatzione in duos passos in su contu tuo. Ddu podes fàghere inoghe:' subject: Cunfirma su tentativu de identificatzione title: Tentativu de identificatzione warning: explanation: disable: Non podes prus intrare in su contu tuo o dd'impreare in cale si siat àtera manera, ma su profilu e is àteros datos tuos abarrant intatos. sensitive: Is elementos e documentos multimediales carrigados e ligados tuos ant a èssere tratados che a sensìbiles. - silence: Podes ancora impreare so contu tuo, ma isceti is persones chi ti sunt giai sighende ant a bìdere is tuts tuos in custu serbidore, e dias pòdere èssere esclùdidu dae unas cantas listas pùblicas. Nointames custu, is àteros ti diant pòdere galu sighire in manera manuale. - suspend: Non podes prus impreare su contu tuo, e su profilu e àteros datos non sunt prus atzessìbiles. Bi podes galu intrare pro pedire una còpia de seguresa de is datos tuos finas a cando no ant a èssere cantzellados de su totu, ma nd'amus a mantènnere unos cantos pro non ti permìtere de evàdere sa suspensione. + silence: Podes ancora impreare su contu tuo, ma isceti is persones chi ti sunt giai sighende ant a bìdere is tuts tuos in custu serbidore, e dias pòdere èssere esclùdidu dae unas cantas listas pùblicas. Nointames custu, is àteros ti diant pòdere galu sighire in manera manuale. + suspend: Non podes prus impreare su contu tuo, e su profilu e àteros datos non sunt prus atzessìbiles. Bi podes ancora intrare pro pedire una còpia de seguresa de is datos tuos finas a cando no ant a èssere cantzellados de su totu, ma nd'amus a mantènnere unos cantos pro non ti permìtere de evàdere sa suspensione. get_in_touch: Podes rispòndere a custu indiritzu de posta eletrònica pro cuntatare cun su personale de %{instance}. - review_server_policies: Revisionat sas polìticas de su serbidore + review_server_policies: Revisiona sas polìticas de su serbidore statuses: 'In manera cuncreta, pro:' subject: disable: Su contu tuo %{acct} est istadu cungeladu @@ -1371,46 +1390,43 @@ sc: suspend: Contu suspèndidu welcome: edit_profile_action: Cunfigura su profilu - edit_profile_step: Podes personalizare su profilu tuo carrighende un'àvatar o un'intestatzione, cambiende su nòmine visìbile tuo e faghende fintzas àteru. Si boles revisionare is sighidores noos in antis chi tèngiant su permissu de ti sighire podes blocare su contu tuo. - explanation: Inoghe b'ant una paja de impòsitos pro cumintzare + edit_profile_step: Podes personalizare su profilu tuo carrighende un'immàgine de profilu o un'intestatzione, cambiende su nòmine de utente tuo e àteru. Si boles revisionare is sighidores noos in antis chi tèngiant su permissu de ti sighire podes blocare su contu tuo. + explanation: Inoghe ddoe at una paja de impòsitos pro cumintzare final_action: Cumintza a publicare - final_step: 'Cumintza a publicare! Fintzas si no ti sighit nemos is àteros podent bìdere is messàgios pùblicos tuos, pro esèmpiu in sa lìnia de tempus locale e in is etichetas ("hashtags"). Ti dias pòdere bòlere introduire a sa comunidade cun s''eticheta #introductions.' + final_step: 'Cumintza a publicare! Fintzas si no ti sighit nemos àtera gente podet bìdere is messàgios pùblicos tuos, pro esèmpiu in sa lìnia de tempus locale e in is etichetas ("hashtags"). Ti dias pòdere bòlere introduire a sa comunidade cun s''eticheta #introductions.' full_handle: Su nòmine utente intreu tuo - full_handle_hint: Custu est su chi dias nàrrere a is amigos tuos pro chi ti potzant imbiare messàgios o sighire dae un'àteru serbidore. + full_handle_hint: Custu est su chi dias nàrrere a is amistades tuas pro chi ti potzant imbiare messàgios o sighire dae un'àteru serbidore. review_preferences_action: Muda is preferèntzias - review_preferences_step: Ammenta·ti de impostare is preferèntzias tuas, che a is lìteras de posta eletrònicas chi boles retzire, o ite livellu de riservadesa dias bòlere chi siat predefinidu pro is messàgios tuos. Si is immàgines in movimentu non ti infadant podes isseberare de abilitare sa riprodutzione automàtica de is GIF. + review_preferences_step: Regorda·ti de cunfigurare is preferèntzias tuas, comente a cale messàgios de posta eletrònicas boles retzire, o ite livellu de riservadesa dias bòlere chi siat predefinidu pro is messàgios tuos. Si is immàgines in movimentu non ti infadant podes seberare de abilitare sa riprodutzione automàtica de is GIF. subject: Ti donamus su benebènnidu a Mastodon - tip_federated_timeline: Sa lìnia de tempus federada est una vista globale de sa retza de Mastodon. Ma incluit isceti is persones sighidas dae is bighinos tuos, duncas no est totale. + tip_federated_timeline: Sa lìnia de tempus federada est una vista globale de sa retza de Mastodon. Ma includet isceti is persones sighidas dae is bighinos tuos, duncas no est totale. tip_following: Pro more de is cunfiguratziones predefinidas sighis s'amministratzione de su serbidore tuo. Pro agatare àteras persones de interessu, càstia is lìnias de su tempus locale e federada. tip_local_timeline: Sa lìnia de tempus locale est una vista globale de is persones in %{instance}. Custos sunt is bighinos tuos! tip_mobile_webapp: Si su navigadore mòbile tuo t'oferit de agiùnghere Mastodon a s'ischermada printzipale tua podes retzire notìficas push. Funtzionat che a un'aplicatzione nativa in maneras medas! tips: Impòsitos - title: Bene bènnidu a bordu, %{name}! + title: Ti donamus su benebènnidu, %{name}! users: - blocked_email_provider: Custu frunidore de posta eletrònica no est permìtidu follow_limit_reached: Non podes sighire prus de %{limit} persones generic_access_help_html: Tenes problemas a intrare in su contu tuo? Podes cuntatare a %{email} pro retzire agiudu - invalid_email: Custu indiritzu de posta eletrònica no est vàlidu - invalid_email_mx: Custu indiritzu de posta eletrònica paret chi no esistat invalid_otp_token: Còdighe a duas fases non vàlidu invalid_sign_in_token: Còdighe de seguresa non vàlidu otp_lost_help_html: Si as pèrdidu s'atzessu a ambos, podes cuntatare a %{email} - seamless_external_login: Ses intradu pro mèdiu de unu servìtziu esternu, e pro custa resone is impostatziones de sa crae de intrada e de posta eletrònica non sunt a disponimentu. + seamless_external_login: As abertu sa sessione pro mèdiu de unu servìtziu esternu, e pro custa resone is cunfiguratziones de sa crae de intrada e de posta eletrònica non sunt a disponimentu. signed_in_as: 'Sessione aberta comente:' - suspicious_sign_in_confirmation: Paret chi tue non sias giai intradu dae custu dispositivu e non ses intradu dae unu pagu de tempus, duncas ti semus mandende unu còdighe de seguresa a s'indiritzu de posta eletrònica tuo pro cunfirmare chi ses tue. + suspicious_sign_in_confirmation: Paret chi no as mai abertu sa sessione dae custu dispositivu e est dae unu pagu de tempus chi no intras in Mastodon, duncas ti semus imbiende unu còdighe de seguresa a s'indiritzu de posta eletrònica tuo pro cunfirmare chi ses tue. verification: explanation_html: 'Ti podes verificare a sa sola comente mere de is ligòngios in is metadatos de su profilu tuo. Pro ddu fàghere su situ ligadu depet cuntènnere unu ligòngiu chi torret a su profilu de Mastodon tuo. Su ligòngiu in su situ depet tènnere un''atributu rel="me". Su testu cuntenutu in su ligòngiu no est de importu. Custu est un''esèmpiu:' verification: Verìfica webauthn_credentials: add: Agiunghe una crae de seguresa noa create: - error: Ddoe est istadu unu problema cun s'agiunta de sa crae de seguresa tua. Torra a proare. + error: Ddoe at àpidu unu problema cun s'agiunta de sa crae de seguresa tua. Torra a proare. success: Sa crae de seguresa tua est istada agiunta. delete: Cantzella delete_confirmation: Seguru chi boles cantzellare custa crae de seguresa? description_html: Si permites s'autenticatzione cun crae de seguresa, as a tènnere bisòngiu de impreare una de is craes de seguresa tuas pro ti identificare. destroy: - error: Ddoe est istadu unu problema cun sa cantzelladura de sa crae de seguresa tua. Torra a proare. + error: Ddoe at àpidu unu problema cun sa cantzelladura de sa crae de seguresa tua. Torra a proare. success: Sa crae de seguresa tua est istada cantzellada. invalid_credential: Crae de seguresa non vàlida nickname_hint: Inserta su nomìngiu de sa crae de seguresa tua noa diff --git a/config/locales/si.yml b/config/locales/si.yml new file mode 100644 index 0000000000..6fa12abec6 --- /dev/null +++ b/config/locales/si.yml @@ -0,0 +1,387 @@ +--- +si: + about: + about_this: පිලිබඳව + active_count_after: සක්‍රීයයි + active_footnote: මාසික ක්‍රියාකාරී පරිශීලකයින් (මාක්‍රිප) + api: යෙ.ක්‍ර. මු. (API) + apps: ජංගම යෙදුම් + contact: සබඳතාව + contact_missing: සකසා නැත + contact_unavailable: අ/නොවේ + documentation: ප්‍රලේඛනය + get_apps: ජංගම යෙදුමක් උත්සාහ කරන්න + learn_more: තව දැනගන්න + privacy_policy: රහස්‍යතා ප්‍රතිපත්තිය + rules: සේවාදායකයේ නීති + source_code: මූල කේතය + status_count_after: + one: තත්වය + other: තත්වයන් + terms: සේවාවේ කොන්දේසි + unavailable_content_description: + domain: සේවාදායකය + reason: හේතුව + silenced_title: සීමාසහිත සේවාදායක + suspended_title: අත්හිටවූ සේවාදායකයන් + user_count_after: + one: පරිශීලක + other: පරිශීලකයින් + what_is_mastodon: මාස්ටඩන් යනු කුමක්ද? + accounts: + joined: "%{date} එක් වී ඇත" + media: මාධ්‍යය + nothing_here: මෙහි කිසිත් නැත! + roles: + admin: පරිපාලක + bot: ස්වයං ක්‍රමලේඛය + group: සමූහය + admin: + account_moderation_notes: + create: සටහන හැරයන්න + accounts: + add_email_domain_block: වි-තැපැල් වසම අවහිර කරන්න + approve: අනුමත කරන්න + approve_all: සියල්ල අනුමත කරන්න + are_you_sure: ඔබට විශ්වාසද? + by_domain: වසම + change_email: + changed_msg: ගිණුමේ වි-තැපෑල සාර්ථකව වෙනස් කෙරිණි! + current_email: වත්මන් වි-තැපෑල + label: වි-තැපෑල වෙනස් කරන්න + new_email: නව විද්‍යුත් තැපෑල + submit: වි-තැපෑල වෙනස් කරන්න + title: "%{username} සඳහා වි-තැපෑල වෙනස් කරන්න" + confirm: සනාථ කරන්න + confirmed: සනාථ කර ඇත + confirming: සනාථ කරමින් + domain: වසම + edit: සංස්කරණය + email: විද්‍යුත් තැපෑල + email_status: වි-තැපෑලෙහි තත්වය + enabled: සබල කර ඇත + header: ශීර්ෂය + invite_request_text: එක්වීම සඳහා හේතුව + ip: අ.ජා. කෙ. (IP) + joined: එක් වී ඇත + location: + all: සියල්ල + local: ස්ථානීය + remote: දුරස්ථ + title: ස්ථානය + login_status: පිවිසීමේ තත්වය + media_attachments: මාධ්‍ය ඇමුණුම් + moderation: + active: සක්‍රීයයි + all: සියල්ල + silenced: සීමාසහිත + suspended: අත්හිටුවන ලදි + most_recent_ip: වඩා මෑත අ.ජා.කෙ.(IP) + perform_full_suspension: අත්හිටුවන්න + protocol: කෙටුම්පත + public: ප්‍රසිද්ධ + redownload: පැතිකඩ නැවුම්කරන්න + reject: ප්‍රතික්ෂේප + remove_header: ශීර්ෂය ඉවත්කරන්න + reset: නැවත සකසන්න + reset_password: මුරපදය නැවතසකසන්න + role: අවසරයන් + roles: + admin: පරිපාලක + staff: කාර්ය මණ්ඩලය + user: පරිශීලක + search: සොයන්න + security_measures: + only_password: මුරපදය පමණි + sensitive: සංවේදී + silence: සීමාව + silenced: සීමාසහිත + statuses: තත්වයන් + suspended: අත්හිටුවන ලදි + title: ගිණුම් + username: පරිශීලක නාමය + warn: අවවාද + web: වියමන + action_logs: + action_types: + change_email_user: පරිශීලකට වි-තැපෑල වෙනස් කරන්න + create_account_warning: අවවාදයක් සාදන්න + create_announcement: නිවේදනය සාදන්න + create_domain_allow: වසම් ඉඩදීමක් සාදන්න + create_domain_block: වසම් අවහිරයක් සාදන්න + create_ip_block: අ.ජා. කෙ. (IP) නීතියක් සාදන්න + disable_user: පරිශීලක අබල කරන්න + enable_user: පරිශීලක සබල කරන්න + reopen_report: වාර්තාව නැවත විවෘත කරන්න + reset_password_user: මුරපදය නැවතසකසන්න + suspend_account: ගිණුම අත්හිටුවන්න + update_announcement: නිවේදනය යාවත්කාල කරන්න + filter_by_action: ක්‍රියාමාර්ගය අනුව පෙරන්න + filter_by_user: පරිශීලක අනුව පෙරන්න + announcements: + edit: + title: නිවේදනය සංස්කරණය + live: සජීවී + new: + create: නිවේදනය සාදන්න + title: නව නිවේදනය + published_msg: නිවේදනය සාර්ථකව ප්‍රකාශයට පත් කරන ලදි! + title: නිවේදන + custom_emojis: + by_domain: වසම + copy: පිටපත් + create_new_category: නව ප්‍රවර්ගයක් සාදන්න + disable: අබල කරන්න + disabled: අබල කර ඇත + enable: සබල කරන්න + enabled: සබල කර ඇත + list: ලැයිස්තුව + shortcode: කෙටිකේතය + upload: උඩුගත කරන්න + dashboard: + software: මෘදුකාංගය + title: උපකරණ පුවරුව + domain_blocks: + domain: වසම + new: + severity: + noop: කිසිවක් නැත + suspend: අත්හිටුවන්න + private_comment: පුද්ගලික අදහස + public_comment: ප්‍රසිද්ධ අදහස + reject_reports: වාර්තා ප්‍රතික්ෂේප කරන්න + rejecting_media: මාධ්‍ය වාර්තා ප්‍රතික්ෂේප කරමින් + rejecting_reports: වාර්තා ප්‍රතික්ෂේප කරමින් + severity: + suspend: අත්හිටුවන ලදි + show: + undo: පෙරසේ + email_domain_blocks: + domain: වසම + new: + create: වසම එකතු කරන්න + title: අවහිර කළ වි-තැපැල් වසම් + follow_recommendations: + language: භාෂාව සඳහා + status: තත්වය + instances: + back_to_all: සියල්ල + back_to_warning: අවවාදයයි + by_domain: වසම + delivery: + all: සියල්ල + warning: අවවාදයයි + moderation: + all: සියල්ල + private_comment: පුද්ගලික අදහස + public_comment: ප්‍රසිද්ධ අදහස + invites: + filter: + all: සියල්ල + expired: කල් ඉකුත් වී ඇත + title: පෙරහන + title: ඇරයුම් + ip_blocks: + add_new: නීතිය සාදන්න + expires_in: + '1209600': සති 2 + '15778476': මාස 6 + '2629746': මාස 1 + '31556952': අවුරුදු 1 + '86400': දින 1 + '94670856': අවුරුදු 3 + new: + title: නව අ.ජා. කෙ.(IP) නීතියක් සාදන්න + title: අ.ජා. කෙ. (IP) නීති + relays: + disable: අබල කරන්න + disabled: අබල කර ඇත + enable: සබල කරන්න + enabled: සබල කර ඇත + status: තත්වය + reports: + are_you_sure: ඔබට විශ්වාසද? + by_target_domain: වාර්තා කළ ගිණුමෙහි වසම + comment: + none: කිසිවක් නැත + notes: + create: සටහන එකතු කරන්න + reopen: වාර්තාව නැවත විවෘත කරන්න + report: "@%{id} වාර්තා කරන්න" + reported_account: වාර්තා කළ ගිණුම + status: තත්වය + title: වාර්තා + rules: + add_new: නීතිය එකතු කරන්න + edit: නීතිය සංස්කරණය කරන්න + title: සේවාදායකයේ නීති + settings: + contact_information: + email: ව්‍යාපාරික වි-තැපෑල + site_description: + title: සේවාදායකයේ සවිස්තරය + site_short_description: + title: සේවාදායකයේ කෙටි සවිස්තරය + site_title: සේවාදායකයේ නම + title: අඩවියේ සැකසුම් + statuses: + back_to_account: ගිණුම් පිටුවට ආපසු යන්න + media: + title: මාධ්‍යය + no_media: මාධ්‍ය නැත + with_media: මාධ්‍ය සමඟ + title: පරිපාලනය + appearance: + advanced_web_interface: උසස් වියමන අතුරුමුහුණත + localization: + guide_link: https://crowdin.com/project/mastodon + sensitive_content: සංවේදී අන්තර්ගතයකි + application_mailer: + salutation: "%{name}," + auth: + change_password: මුර පදය + login: පිවිසෙන්න + logout: නික්මෙන්න + or_log_in_with: හෝ සමඟ පිවිසෙන්න + security: ආරක්ෂාව + status: + account_status: ගිණුමේ තත්වය + authorize_follow: + post_follow: + close: හෝ ඔබට මෙම කවුළුව වසාදැමිය හැකිය. + return: පරිශීලකගේ පැතිකඩ පෙන්වන්න + web: වියමන ට යන්න + challenge: + confirm: ඉදිරියට + invalid_password: අවලංගු නොවන මුරපදයකි + date: + formats: + default: "%b %d, %Y" + with_month_name: "%B %d, %Y" + datetime: + distance_in_words: + less_than_x_seconds: මේ දැන් + errors: + '400': The request you submitted was invalid or malformed. + '403': You don't have permission to view this page. + '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. + '410': The page you were looking for doesn't exist here anymore. + '422': + '429': Too many requests + '500': + '503': The page could not be served due to a temporary server failure. + exports: + archive_takeout: + date: දිනය + download: ඔබගේ සංරක්ෂිතය බාගන්න + size: ප්‍රමාණය + bookmarks: පොත් යොමු + lists: ලැයිස්තු + storage: මාධ්‍ය ගබඩාව + filters: + contexts: + account: පැතිකඩයන් + notifications: දැනුම්දීම් + thread: සංවාද + edit: + title: පෙරහන සංස්කරණය + index: + title: පෙරහන් + new: + title: නව පෙරහනක් එකතු කරන්න + footer: + developers: සංවර්ධකයින් + more: තව… + resources: සම්පත් + generic: + all: සියල්ල + copy: පිටපත් + save_changes: වෙනස්කම් සුරකින්න + identity_proofs: + active: ක්‍රියාත්මකයි + identity: අනන්‍යතාව + imports: + types: + bookmarks: පොත් යොමු + upload: උඩුගත කරන්න + invites: + expires_in: + '1800': විනාඩි 30 + '21600': හෝරා 6 + '3600': හෝරා 1 + '43200': හෝරා 12 + '604800': සති 1 + '86400': දින 1 + title: මිනිසුන්ට ආරාධනා කරන්න + login_activities: + authentication_methods: + password: මුර පදය + notification_mailer: + mention: + action: පිළිතුර + title: නව සඳැහුම + notifications: + other_settings: වෙනත් දැනුම්දීම් සැකසුම් + number: + human: + decimal_units: + format: "%n%u" + otp_authentication: + enable: සබල කරන්න + pagination: + next: ඊළඟ + truncate: "…" + relationships: + activity: ගිණුමේ ක්‍රියාකාරකම් + status: ගිණුමේ තත්වය + sessions: + browser: අතිරික්සුව + browsers: + alipay: අලිපේ + blackberry: බ්ලැක්බෙරි + chrome: ක්‍රෝම් + edge: මයික්‍රොසොෆ්ට් එඩ්ගේ + electron: ඉලෙක්ට්‍රෝන් + firefox: ෆයර්ෆොක්ස් + generic: නොදන්නා අතිරික්සුවකි + ie: ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් + micro_messenger: මයික්‍රොමැසෙන්ජර් + opera: ඔපෙරා + otter: ඔටර් + qq: කියුකියු අතිරික්සුව + safari: සෆාරි + uc_browser: යූසී අතිරික්සුව + weibo: වෙයිබො + ip: අ.ජා. කෙ. (IP) + platforms: + adobe_air: ඇඩෝබි එයාර් + android: ඇන්ඩ්‍රොයිඩ් + blackberry: බ්ලැක්බෙරි + chrome_os: ක්‍රෝම් ඕඑස් + firefox_os: ෆයර්ෆොක්ස් ඕඑස් + ios: අයිඕඑස් + linux: ලිනක්ස් + mac: මැක්ඕඑස් + windows: වින්ඩෝස් + windows_mobile: වින්ඩෝස් මොබයිල් + windows_phone: වින්ඩෝස් පෝන් + settings: + account: ගිණුම + account_settings: ගිණුමේ සැකසුම් + edit_profile: පැතිකඩ සංස්කරණය + export: දත්ත නිර්යාත + import: ආයාත කරන්න + import_and_export: ආයාත සහ නිර්යාත + notifications: දැනුම්දීම් + profile: පැතිකඩ + statuses: + show_more: තව පෙන්වන්න + title: '%{name}: "%{quote}"' + visibilities: + public: ප්‍රසිද්ධ + stream_entries: + sensitive_content: සංවේදී අන්තර්ගතයකි + two_factor_authentication: + edit: සංස්කරණය + webauthn: ආරක්‍ෂණ යතුරු diff --git a/config/locales/simple_form.af.yml b/config/locales/simple_form.af.yml new file mode 100644 index 0000000000..252f9fd5a2 --- /dev/null +++ b/config/locales/simple_form.af.yml @@ -0,0 +1 @@ +af: diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 63f122b78f..96620ed6cd 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -12,7 +12,14 @@ ar: admin_account_action: include_statuses: سيرى المستخدم أي مِن التبويقات تسببت في إجراء الإشراف أو التحذير send_email_notification: سوف يتلقى المستخدم رسالة تُفسِّر ما حدث على حسابه + text_html: اختياري، يمكنك استخدام بناء التبويق. يمكنك إضافة إعدادات تحذير مسبقة لتوفير الوقت type_html: اختر ما تود إجراؤه على %{acct} + types: + disable: منع المستخدم من استخدام حسابه، ولكن لا تَقم بحذف أو إخفاء محتواه. + none: استخدم هذه لإرسال تحذير للمستخدم، دون تشغيل أو إثارة أي إجراء آخر. + sensitive: إجبار جميع مرفقات الوسائط لهذا المستخدم على أن تكون حساسة. + silence: منع المستخدم من أن يكون قادراً على النشر للعامة، وإخفاء مشاركاته وإشعاراته من الذين لا يُتابعِونه. + suspend: منع أي تفاعل من أو إلى هذا الحساب، وحذف محتوياته، يمكن الرجوع عن هذا القرار في غضون 30 يوماً. warning_preset_id: اختياري. يمكنك إضافة نص مخصص إلى نهاية النموذج announcement: all_day: إن أختير، سيتم عرض تواريخ النطاق الزمني فقط @@ -29,6 +36,7 @@ ar: current_username: يرجى إدخال اسم المستخدم الخاص بالحساب الحالي قصد التأكيد digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة discoverable: سِجل الملفات التعريفية للمستخدمين هو طريقة أخرى لبلوغ جمهور أوسع + discoverable_no_directory: السماح باكتشاف حسابك من قبل الغرباء من خلال التوصيات والميزات الأخرى email: سوف تتلقى رسالة إلكترونية للتأكيد fields: يُمكنك عرض 4 عناصر على شكل جدول في صفحتك التعريفية header: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px @@ -53,6 +61,9 @@ ar: whole_word: إذا كانت الكلمة أو العبارة مكونة من أرقام وحروف فقط سوف يتم تطبيقها فقط عند مطابقة الكلمة ككل domain_allow: domain: سيكون بإمكان هذا النطاق جلب البيانات من هذا الخادم ومعالجة وتخزين البيانات الواردة منه + email_domain_block: + domain: يمكن لهذا أن يكون اسم النطاق الذي يظهر في عنوان البريد الإلكتروني، سجل MX الذي يُقرر هذا النطاق إليه، أو IP الخادم الذي يقرره سجل MX. وسيتم التحقق من ذلك عند تسجيل المستخدم وسيتم رفض التسجيل. + with_dns_records: سوف تُبذل محاولة لحل سجلات DNS الخاصة بالنطاق المعني، كما ستُمنع النتائج featured_tag: name: 'رُبَّما تريد·ين استخدام واحد مِن بين هذه:' form_challenge: @@ -61,8 +72,19 @@ ar: data: ملف CSV تم تصديره مِن خادوم ماستدون آخر invite_request: text: هذا سوف يساعدنا في مراجعة تطبيقك + ip_block: + comment: اختياري. تذكر لماذا قمت بإضافة هذا القانون. + expires_in: عناوين الـIP هي مَورد محدود، يتم في بعض الأحيان مشاركتها وغالباً ما يتم تغير ملكيتها، لهذا السبب، لا يُنصح بحظر الـIP إلى أجل غير مسمى. + ip: أدخل عنوان IPv4 أو IPv6. يمكنك حظر نطاقات كاملة باستخدام بناء الـCIDR. كن حذراً على أن لا تَحظر نفسك! + severities: + no_access: حظر الوصول إلى جميع المصادر + sign_up_requires_approval: التسجيلات الجديدة سوف تتطلب موافقتك + severity: اختر ما سيحدث مع الطلبات من هذا الـIP + rule: + text: صِف قانون أو شرط للمستخدمين على هذا الخادم. حاول أن تُبقيه قصير وبسيط sessions: otp: 'قم بإدخال رمز المصادقة بخطوتين الذي قام بتوليده تطبيق جهازك أو استخدم أحد رموز النفاذ الاحتياطية:' + webauthn: إذا كان مفتاح USB فتأكد من إدخاله، وإذا لزم الأمر، اضعط عليه. tag: name: يمكنك فقط تغيير غلاف الحروف ، على سبيل المثال ، لجعلها أكثر قابلية للقراءة user: @@ -87,6 +109,7 @@ ar: types: disable: تعطيل none: لا تفعل شيئا + sensitive: حساس silence: كتم suspend: علِق warning_preset_id: استخدم نموذج تنبيه @@ -112,6 +135,7 @@ ar: expires_in: تنتهي مدة صلاحيته بعد fields: البيانات الوصفية للصفحة التعريفية header: الرأسية + honeypot: "%{label} (لا تملئ)" inbox_url: عنوان رابط صندوق المُرَحِّل irreversible: إسقاط بدلا من إخفائها locale: لغة الواجهة @@ -131,6 +155,7 @@ ar: setting_default_privacy: خصوصية المنشور setting_default_sensitive: اعتبر الوسائط دائما كمحتوى حساس setting_delete_modal: إظهار مربع حوار للتأكيد قبل حذف أي تبويق + setting_disable_swiping: تعطيل حركات التمرير setting_display_media: عرض الوسائط setting_display_media_default: افتراضي setting_display_media_hide_all: إخفاء الكل @@ -152,6 +177,8 @@ ar: username: اسم المستخدم username_or_email: اسم المستخدم أو كلمة السر whole_word: الكلمة كاملة + email_domain_block: + with_dns_records: تضمين سجلات MX و عناوين IP للنطاق featured_tag: name: الوسم interactions: @@ -163,7 +190,12 @@ ar: invite_request: text: لماذا ترغب في الانضمام؟ ip_block: + comment: تعليق ip: عنوان IP + severities: + no_access: حظر الوصول + sign_up_requires_approval: حد التسجيلات + severity: قانون notification_emails: digest: إرسال ملخصات عبر البريد الإلكتروني favourite: ابعث بريداً إلكترونيًا عندما يُعجَب أحدهم بمنشورك @@ -174,6 +206,8 @@ ar: reblog: ابعث بريداً إلكترونيًا عندما يقوم أحدهم بترقية منشورك report: إرسال رسالة إلكترونية عند تلقّي إبلاغ جديد trending_tag: ابعث رسالة إلكترونية إن كان هناك وسم متداوَل بحاجة إلى مراجعة + rule: + text: قانون tag: listable: اسمح لهذا الوسم بالظهور في البحث وفي دليل الصفحات التعريفية name: الوسم @@ -184,4 +218,7 @@ ar: required: mark: "*" text: مطلوب + title: + sessions: + webauthn: استخدم أحد مفاتيح الأمان الخاصة بك لتسجيل الدخول 'yes': نعم diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index 1a62eb76b3..332f550798 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -37,7 +37,6 @@ ast: announcement: text: Anunciu defaults: - avatar: Avatar bot: Esta cuenta ye d'un robó chosen_languages: Peñera de llingües confirm_new_password: Confirmación de la contraseña nueva @@ -96,6 +95,5 @@ ast: 'no': Non recommended: Aconséyase required: - mark: "*" text: ríquese 'yes': Sí diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 9991bed3df..2a23ea0577 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -9,6 +9,18 @@ bg: imports: data: CSV файл, експортиран от друга инстанция на Mastodon labels: + account: + fields: + value: Съдържание + account_warning_preset: + title: Заглавие + admin_account_action: + type: Действие + types: + disable: Замразяване + sensitive: Деликатно + silence: Ограничение + suspend: Спиране defaults: avatar: Аватар confirm_new_password: Потвърди новата парола diff --git a/config/locales/simple_form.br.yml b/config/locales/simple_form.br.yml index 4cbc173bd3..8c490e9523 100644 --- a/config/locales/simple_form.br.yml +++ b/config/locales/simple_form.br.yml @@ -1,34 +1,64 @@ --- br: simple_form: + hints: + defaults: + avatar: PNG, GIF pe JPG. Brasoc'h eget %{size}. A vo izelaet betek %{dimensions}px + header: PNG, GIF pe JPG. Brasoc'h eget %{size}. A vo izelaet betek %{dimensions}px + password: Implijit 8 lizherennoù d'an neubeutañ + setting_default_sensitive: Ar mediaoù kizidik a zo kuzhet dre ziouer ha gallout a reont bezañ diguzhet dre ur c'hlik + setting_display_media_default: Kuzhat mediaoù aroueziet evel kizidik + form_challenge: + current_password: Emaoc'h o tont-tre ul lec'h diogel labels: account_warning_preset: title: Titl admin_account_action: + type: Ober types: + disable: Skornañ + sensitive: Kizidik suspend: Astalañ announcement: + all_day: Darvoud a-hed an devezh + ends_at: Diwezh an darvoud + starts_at: Deroù an darvoud text: Kemenn defaults: + avatar: Avatar + chosen_languages: Silañ yezhoù + confirm_new_password: Kadarnaat ar ger-tremen nevez + confirm_password: Kadarnaat ar ger-tremen + context: Kadarnaat ar ger-tremen current_password: Ger-tremen a vremañ data: Roadennoù display_name: Anv diskouezet email: Chomlec'h postel + expires_in: Mont war e dermen goude header: Talbenn locale: Yezh ar c'hetal new_password: Ger-tremen nevez password: Ger-tremen + phrase: Ger-alc'hwez pe frazenn setting_display_media_default: Dre ziouer setting_display_media_hide_all: Kuzhat pep tra setting_display_media_show_all: Diskouez pep tra username: Anv + whole_word: Ger a-bezh featured_tag: name: Ger-klik invite: comment: Evezhiadenn + ip_block: + ip: IP + notification_emails: + follow: Heuliañ a ra {name} ac'hanoc'h tag: name: Ger-klik + trendable: Aotren an hashtag-mañ da zont war wel dindan tuadurioù 'no': Ket + recommended: Erbedet required: mark: "*" + text: rekis 'yes': Ya diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index b3692f5bae..e82ac2f73f 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -14,6 +14,12 @@ ca: send_email_notification: L'usuari rebrà una explicació del que ha passat amb el seu compte text_html: Opcional. Pots utilitzar tota la sintaxi. Pots afegir configuracions predefinides d'avís per a estalviar temps type_html: Tria què fer amb %{acct} + types: + disable: Evita que l'usuari faci ús del seu compte però no li esborra o amaga els seus continguts. + none: Fes servir això per a enviar un avís al usuari sense desencadenar cap altre acció. + sensitive: Obliga a marcar tots els fitxers multi mèdia adjunts com a sensibles. + silence: Evita que l'usuari sigui capaç de publicar amb visibilitat publica, amaga els tuts i notificacions de usuaris que no el segueixen. + suspend: Evita qualsevol interacció de o a aquest compte i esborra els seus continguts. Reversible en un termini de 30 dies. warning_preset_id: Opcional. Encara pots afegir text personalitzat al final de la configuració predefinida announcement: all_day: Si es marca, només es mostraran les dates de l'interval de temps @@ -30,6 +36,7 @@ ca: current_username: Per a confirmar, si us plau entra el nom d'usuari del compte actual digest: Només s'envia després d'un llarg període d'inactivitat amb un resum de les mencions que has rebut en la teva absència discoverable: El directori de perfils és una altra manera per quin el teu compte pot assolir una audiència més àmplia + discoverable_no_directory: Permet que el teu compte sigui descobert per estranys grácies a les sugerències i altres característiques email: Se t'enviarà un correu electrònic de confirmació fields: Pots tenir fins a 4 elements que es mostren com a taula al teu perfil header: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px @@ -73,6 +80,8 @@ ca: no_access: Bloqueja l’accés a tots els recursos sign_up_requires_approval: Els nous registres requeriran la teva aprovació severity: Tria què passarà amb les sol·licituds des d’aquesta IP + rule: + text: Descriu una norma o requeriment pels usuaris d'aquest servidor. Intenta fer-la curta i senzilla sessions: otp: 'Introdueix el codi de dos factors generat per el teu telèfon o utilitza un dels teus codis de recuperació:' webauthn: Si és una clau USB assegurat de que està inserida i, si és necessari, toca-ho. @@ -112,7 +121,6 @@ ca: text: Anunci defaults: autofollow: Convida a seguir el teu compte - avatar: Avatar bot: Aquest compte és un bot chosen_languages: Filtrar llengües confirm_new_password: Confirma la contrasenya nova @@ -182,7 +190,6 @@ ca: text: Per què vols unir-te? ip_block: comment: Comentari - ip: IP severities: no_access: Bloquejar l’accés sign_up_requires_approval: Limitar els registres @@ -197,15 +204,15 @@ ca: reblog: Envia un correu electrònic si algú comparteix el teu estat report: Envia un correu electrònic quan s'enviï un nou informe trending_tag: Envia un correu quan una etiqueta sense revisar està en tendència + rule: + text: Norma tag: listable: Permet que aquesta etiqueta aparegui en les cerques i en el directori de perfils name: Etiqueta trendable: Permet que aquesta etiqueta aparegui en les tendències usable: Permet als tuts emprar aquesta etiqueta - 'no': 'No' recommended: Recomanat required: - mark: "*" text: necessari title: sessions: diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index 1d41066d1b..b326f3f559 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -73,6 +73,8 @@ co: no_access: Bluccà l'accessu à tutte e risorse sign_up_requires_approval: E nove dumande d'arregistramente necessitaranu a vostr'appruvazione severity: Sceglie ciò chì si passerà cù e richieste di quest'IP + rule: + text: Discrizzione di una regula o esigenza per l'utilizatori di stu servore. Pruvate di guardalla corta è simplice sessions: otp: 'Entrate u codice d’identificazione à dui fattori nant’à u vostru telefuninu, o unu di i vostri codici di ricuperazione:' webauthn: S'ella hè una chjave USB assicuratevi di brancalla è, s'ellu c'hè unu, appughjà nant'à u buttone. @@ -197,6 +199,8 @@ co: reblog: Mandà un’e-mail quandu qualch’unu sparte i mo statuti report: Mandà un'e-mail quandu c'hè un novu signalamentu trending_tag: Mandà un'e-mail quandu un hashtag micca verificatu hè in e tendenze + rule: + text: Regula tag: listable: Auturizà stu hashtag à esse vistu nant'à l'annuariu di i prufili name: Hashtag diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index d036362471..3ba75acc94 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -7,47 +7,54 @@ cs: account_migration: acct: Zadejte svůj účet, na který se chcete přesunout, ve formátu přezdívka@doména account_warning_preset: - text: Můžete používat syntaxi tootů, jako například URL, hashtagy a zmínky + text: Můžete použít syntax příspěvku, jako jsou URL, hashtagy nebo zmínky title: Nepovinné. Není viditelné pro příjemce admin_account_action: - include_statuses: Uživatel uvidí, které tooty způsobily moderátorskou akci nebo varování + include_statuses: Uživatel uvidí, které příspěvky způsobily moderátorskou akci nebo varování send_email_notification: Uživatel obdrží vysvětlení toho, co se stalo s jeho účtem - text_html: Volitelné. Můžete používat syntaxi tootů. Pro ušetření času si můžete přidat předlohy pro varování + text_html: Volitelné. Můžete používat syntax příspěvků. Pro ušetření času můžete přidat předlohy varování type_html: Vyberte, co chcete s účtem %{acct} udělat + types: + disable: Zabránit uživateli používat svůj účet, ale nemazat ani neskrývat jejich obsah. + none: Toto použijte pro zaslání varování uživateli, bez vyvolání jakékoliv další akce. + sensitive: Vynutit označení všech mediálních příloh tohoto uživatele jako citlivých. + silence: Zamezit uživateli odesílat příspěvky s veřejnou viditelností, schovat jejich příspěvky a notifikace před lidmi, kteří je nesledují. + suspend: Zamezit jakékoliv interakci z nebo do tohoto účtu a smazat jeho obsah. Vratné do 30 dnů. warning_preset_id: Volitelné. Na konec předlohy můžete stále vložit vlastní text announcement: all_day: Po vybrání budou zobrazeny jenom dny z časového období - ends_at: Volitelné. Zveřejněné oznámení bude v uvedený čas skryto. + ends_at: Volitelné. Zveřejněné oznámení bude v uvedený čas skryto scheduled_at: Pro okamžité zveřejnění ponechte prázdné starts_at: Volitelné. Jen pokud je oznámení vázáno na konkrétní časové období - text: Můžete použít stejnou syntax jako pro tooty. Myslete ale na to, že oznámení zabere uživatelům na obrazovce nějaký prostor. + text: Můžete použít syntax příspěvků. Mějte prosím na paměti, kolik prostoru oznámení zabere na obrazovce uživatele defaults: autofollow: Lidé, kteří se zaregistrují na základě pozvánky, vás budou automaticky sledovat avatar: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px - bot: Tento účet provádí hlavně automatizované akce a nemusí být spravován + bot: Signalizovat ostatním, že účet převážně vykonává automatizované akce a nemusí být monitorován context: Jeden či více kontextů, ve kterých má být filtr uplatněn current_password: Z bezpečnostních důvodů prosím zadejte heslo současného účtu current_username: Potvrďte prosím tuto akci zadáním uživatelského jména aktuálního účtu digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste při své nepřítomnosti obdrželi osobní zprávy - discoverable: Adresář profilů je další způsob, jak se může váš účet dostat k širšímu publiku + discoverable: Umožnit objevení vašeho účtu neznámými uživateli skrze doporučení, adresář profilů a další funkce + discoverable_no_directory: Umožnit objevení vašeho účtu neznámými uživateli skrze doporučení a další funkce email: Bude vám poslán potvrzovací e-mail fields: Na profilu můžete mít až 4 položky zobrazené jako tabulka header: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px inbox_url: Zkopírujte URL z hlavní stránky mostu, který chcete použít - irreversible: Filtrované tooty nenávratně zmizí, i pokud bude filtr později odstraněn + irreversible: Filtrované příspěvky nenávratně zmizí, i pokud bude filtr později odstraněn locale: Jazyk uživatelského rozhraní, e-mailů a oznámení push - locked: Vyžaduje, abyste ručně schvaloval/a sledující + locked: Kontrolujte, kdo vás může sledovat pomocí schvalování žádostí o sledování password: Použijte alespoň 8 znaků - phrase: Shoda bude nalezena bez ohledu na velikost písmen v těle tootu či varování o obsahu + phrase: Shoda bude nalezena bez ohledu na velikost písmen v textu příspěvku či varování o obsahu scopes: Která API bude aplikaci povoleno používat. Pokud vyberete rozsah nejvyššího stupně, nebudete je muset vybírat jednotlivě. - setting_aggregate_reblogs: Nezobrazovat nové boosty pro tooty, které byly nedávno boostnuty (ovlivňuje pouze nově přijaté boosty) + setting_aggregate_reblogs: Nezobrazovat nové boosty pro příspěvky, které byly nedávno boostnuty (ovlivňuje pouze nově přijaté boosty) setting_default_sensitive: Citlivá média jsou ve výchozím stavu skryta a mohou být zobrazena kliknutím setting_display_media_default: Skrývat média označená jako citlivá - setting_display_media_hide_all: Vždy skrývat všechna média - setting_display_media_show_all: Vždy zobrazovat média označená jako citlivá - setting_hide_network: Koho sledujete a kdo sleduje vás nebude zobrazeno na vašem profilu - setting_noindex: Ovlivňuje váš veřejný profil a stránky tootů - setting_show_application: Aplikace, kterou používáte k psaní tootů, bude zobrazena v detailním zobrazení vašich tootů + setting_display_media_hide_all: Vždy skrývat média + setting_display_media_show_all: Vždy zobrazovat média + setting_hide_network: Koho sledujete a kdo sleduje vás bude na vašem profilu skryto + setting_noindex: Ovlivňuje váš veřejný profil a stránky příspěvků + setting_show_application: Aplikace, kterou používáte k odeslání příspěvků, bude zobrazena jejich detailním zobrazení setting_use_blurhash: Gradienty jsou založeny na barvách skryté grafiky, ale zakrývají jakékoliv detaily setting_use_pending_items: Aktualizovat časovou osu až po kliknutím namísto automatického rolování kanálu username: Vaše uživatelské jméno bude na serveru %{domain} unikátní @@ -56,7 +63,7 @@ cs: domain: Tato doména bude moci stahovat data z tohoto serveru a příchozí data z ní budou zpracována a uložena email_domain_block: domain: Toto může být název domény v e-mailové adresy, její MX záznam nebo IP adresa odpovídající MX záznamu. Při registraci uživatele dojde k jejich kontrole a registrace bude zamítnuta. - with_dns_records: Dojde k pokusu o zjištění DNS záznamů dané domény a výsledek bude rovněž přidán do seznamu + with_dns_records: Dojde k pokusu o překlad DNS záznamů dané domény a výsledky budou rovněž zablokovány featured_tag: name: 'Nejspíš budete chtít použít jeden z těchto:' form_challenge: @@ -65,12 +72,23 @@ cs: data: Soubor CSV exportovaný z jiného serveru Mastodon invite_request: text: To nám pomůže posoudit vaši žádost + ip_block: + comment: Nepovinné. Poznamenejte si, proč jste přidali toto pravidlo. + expires_in: IP adresy jsou omezeným zdrojem, občas jsou sdílené a často mění majitele. Proto se jejich časově neomezené blokování nedoporučuje. + ip: Zadejte IPv4 nebo IPv6 adresu. Můžete blokovat celé rozsahy použitím CIDR notace. Dejte pozor, ať neodříznete přístup sami sobě! + severities: + no_access: Blokovat přístup ke všem zdrojům + sign_up_requires_approval: Nové registrace budou vyžadovat schválení + severity: Zvolte, jak naložit s požadavky z dané IP + rule: + text: Popište pravidlo nebo požadavek uživatelům tohoto serveru. Snažte se ho držet krátký a jednoduchý sessions: otp: 'Zadejte kód pro dvoufázové ověření vygenerovaný vaší mobilní aplikací, nebo použijte jeden z vašich záložních kódů:' + webauthn: Pokud jde o USB klíč, vložte jej a případně se dotkněte jeho tlačítka. tag: name: Můžete měnit pouze velikost písmen, například kvůli lepší čitelnosti user: - chosen_languages: Po zaškrtnutí budou ve veřejných časových osách zobrazeny pouze tooty ve zvolených jazycích + chosen_languages: Po zaškrtnutí budou ve veřejných časových osách zobrazeny pouze příspěvky ve zvolených jazycích labels: account: fields: @@ -84,13 +102,14 @@ cs: text: Text předlohy title: Nadpis admin_account_action: - include_statuses: Zahrnout v e-mailu nahlášené tooty + include_statuses: Zahrnout v e-mailu nahlášené příspěvky send_email_notification: Informovat uživatele e-mailem text: Vlastní varování type: Akce types: disable: Deaktivovat přihlašování none: Nic nedělat + sensitive: Citlivý silence: Ztišit suspend: Pozastavit účet a nenávratně smazat jeho data warning_preset_id: Použít předlohu pro varování @@ -110,16 +129,17 @@ cs: context: Kontexty filtrů current_password: Současné heslo data: Data - discoverable: Zveřejnit tento účet v adresáři + discoverable: Navrhovat účet ostatním display_name: Zobrazované jméno email: E-mailová adresa expires_in: Vypršet za fields: Metadata profilu header: Záhlaví + honeypot: "%{label} (nevyplňovat)" inbox_url: URL příchozí schránky mostu irreversible: Zahodit místo skrytí locale: Jazyk rozhraní - locked: Uzamknout účet + locked: Vynutit žádosti o sledování max_uses: Maximální počet použití new_password: Nové heslo note: O vás @@ -130,24 +150,25 @@ cs: setting_aggregate_reblogs: Seskupovat boosty v časových osách setting_auto_play_gif: Automaticky přehrávat animace GIF setting_boost_modal: Před boostnutím zobrazovat potvrzovací okno - setting_crop_images: Ořezávat obrázky v nerozbalených tootech na velikost 16x9 + setting_crop_images: Ořezávat obrázky v nerozbalených příspěvcích na 16x9 setting_default_language: Jazyk příspěvků setting_default_privacy: Soukromí příspěvků setting_default_sensitive: Vždy označovat média jako citlivá - setting_delete_modal: Před smazáním tootu zobrazovat potvrzovací okno + setting_delete_modal: Před smazáním příspěvku zobrazovat potvrzovací dialog + setting_disable_swiping: Vypnout gesta přejetí prsty setting_display_media: Zobrazování médií setting_display_media_default: Výchozí setting_display_media_hide_all: Skrýt vše setting_display_media_show_all: Zobrazit vše - setting_expand_spoilers: Vždy rozbalit tooty označené varováními o obsahu + setting_expand_spoilers: Vždy rozbalit příspěvky označené varováními o obsahu setting_hide_network: Skrýt mou síť setting_noindex: Neindexovat svůj profil vyhledávači setting_reduce_motion: Omezit pohyb v animacích - setting_show_application: Zobrazit aplikaci používanou k psaní tootů + setting_show_application: Odhalit aplikaci použitou k odeslání příspěvků setting_system_font_ui: Použít výchozí písmo systému setting_theme: Vzhled stránky - setting_trends: Zobrazit dnešní trendy - setting_unfollow_modal: Ppřed zrušením sledování zobrazovat potvrzovací okno + setting_trends: Zobrazit dnes populární hashtagy + setting_unfollow_modal: Před zrušením sledování zobrazovat potvrzovací okno setting_use_blurhash: Zobrazit pro skrytá média barevné gradienty setting_use_pending_items: Pomalý režim severity: Vážnost @@ -168,24 +189,36 @@ cs: comment: Komentář invite_request: text: Proč se chcete připojit? + ip_block: + comment: Komentář + ip: IP + severities: + no_access: Blokovat přístup + sign_up_requires_approval: Omezit registrace + severity: Pravidlo notification_emails: digest: Posílat e-maily s přehledem - favourite: Poslat e-mail, když si někdo oblíbí váš toot - follow: Poslat e-mail, když vás někdo začne sledovat - follow_request: Poslat e-mail, když vás někdo požádá o sledování - mention: Poslat e-mail, když vás někdo zmíní - pending_account: Poslat e-mail, když je třeba posoudit nový účet - reblog: Poslat e-mail, když někdo boostne váš toot - report: Poslat e-mail, je-li nahlášeno něco nového - trending_tag: Poslat e-mail, když se neschválený hashtag stane populárním + favourite: Někdo si oblíbil váš příspěvek + follow: Někdo vás začal sledovat + follow_request: Někdo požádal o možnost vás sledovat + mention: Někdo vás zmínil + pending_account: Je třeba posoudit nový účet + reblog: Někdo boostnul váš příspěvek + report: Je odesláno nové hlášení + trending_tag: Neposouzený hashtag je populární + rule: + text: Pravidlo tag: - listable: Povolit tento hashtag ve výsledcích vyhledávání a v adresáři profilů + listable: Povolit zobrazení tohoto hashtagu ve vyhledávání a návrzích name: Hashtag - trendable: Povolit tento hashtag v trendech - usable: Povolit používat tento hashtag v tootech + trendable: Povolit zobrazení tohoto hashtagu mezi populárními + usable: Povolit používat tento hashtag v příspěvcích 'no': Ne recommended: Doporučeno required: mark: "*" text: vyžadováno + title: + sessions: + webauthn: K přihlášení použijte jeden z Vašich bezpečnostních klíčů 'yes': Ano diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index cb3f75c1aa..6d7b017463 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -74,7 +74,6 @@ cy: labels: account: fields: - name: Label value: Cynnwys account_alias: acct: Enw'r hen gyfrif @@ -109,7 +108,6 @@ cy: confirm_password: Cadarnhau cyfrinair context: Hidlo cyd-destunau current_password: Cyfrinair presennol - data: Data discoverable: Rhestrwch y cyfrif hwn ar y cyfeiriadur display_name: Enw arddangos email: Cyfeiriad e-bost @@ -186,6 +184,5 @@ cy: 'no': Na recommended: Argymhellwyd required: - mark: "*" text: gofynnol 'yes': Ie diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 1c16c8e372..3492a41b93 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -2,132 +2,188 @@ da: simple_form: hints: + account_alias: + acct: Angiv brugernavn@domain for den konto, hvorfra du vil flytte + account_migration: + acct: Angiv brugernavn@domain for den konto, hvortil du vil flytte account_warning_preset: + text: Du kan bruge indlægssyntaks, såsom URL'er, hashtags og omtaler title: Valgfri. Ikke synlig for modtageren admin_account_action: - type_html: Vælg hvad du vil gøre med %{acct} + include_statuses: Brugeren vil se, hvilke indlæg, som har forårsaget modereringen/advarslen + send_email_notification: Brugeren modtager en forklaring på, hvad der skete med deres konto + text_html: Valgfri. Du kan bruge indlægssyntaks. Du kan tilføje advarsler for a spare tid + type_html: Vælg, hvad du vil gøre med %{acct} + types: + disable: Forhindre brugeren i at bruge sin konto, men slet eller skjul ikke vedkommendes indhold. + none: Brug dette til at sende en advarsel til brugeren uden at udløse nogen anden handling. + sensitive: Gennemtving sensitivmarkering af alle denne brugers medievedhæftninger. + silence: Forhindre brugeren i at kunne skrive offentligt synlige indlæg, skjule deres indlæg og notifikationer fra personer, som ikke følger dem. + suspend: Forhindre enhver interaktion fra eller til denne konto og slet dens indhold. Reversibelt inden for 30 dage. + warning_preset_id: Valgfri. Du kan stadig tilføje tilpasset tekst til slutningen af forvalgene + announcement: + all_day: Hvis markeret, vil kun datoerne for tidsintervallet blive vist + ends_at: Valgfri. En bekendtgørelse vil automatisk blive afpubliceret på dette tidspunkt + scheduled_at: Lad stå tomt for straks at publicere bekendtgørelsen + starts_at: Valgfri. Såfremt din bekendtgørelse er knyttet til et bestemt tidsinterval + text: Du kan bruge markup-formattering i indlæg. Vær opmærksom på den plads, som en bekendtgørelse vil fylde på brugerens skærm defaults: - autofollow: Folk der har oprettet sig gennem invitationen vil automatisk følge dig - avatar: PNG, GIF eller JPG. Højest %{size}. Vil blive skaleret ned til %{dimensions}px - bot: Denne konto udfører hovedsageligt automatiserede handlinger og bliver muligvis ikke overvåget - context: En eller flere sammenhænge hvor filteret skal være gældende - current_username: For at bekræfte, angiv venligst brugernavnet på den aktuelle konto - digest: Sendes kun efter en lang periode med inaktivitet og kun hvis du har modtaget nogle personlige beskeder i dit fravær - email: Du vil få tilsendt en bekræftelses e-mail - fields: Du kan have op til 4 ting vist som en tabel på din profil - header: PNG, GIF eller JPG. Højest %{size}. Vil blive skaleret ned til %{dimensions}px - inbox_url: Kopiere linket fra forsiden af den relay som du ønsker at bruge - irreversible: Filtrerede trut vil forsvinde fulstændigt, selv hvis filteret senere skulle blive fjernet - locale: Sproget på interfacet, emails og push beskeder - locked: Kræver, at du godkender følgere manuelt + autofollow: Personer, som har tilmeldt sig via invitationen, vil automatisk følge dig + avatar: PNG, GIF eller JPG. Maks. %{size}. Auto-nedskaleres til %{dimensions}px + bot: Signalér til andre, at denne konto primært udfører automatiserede handlinger og muligvis ikke monitoreres + context: En eller flere kontekster, hvor filteret skal være gældende + current_password: Angiv af sikkerhedsårsager adgangskoden til den aktuelle konto + current_username: For at bekræfte, angiv brugernavnet for den aktuelle konto + digest: Sendes kun efter en lang inaktivitetsperiode, og kun hvis du har modtaget personlige beskeder i dit fravær + discoverable: Tillad din konto at blive fundet af fremmede via anbefalinger og øvrige funktioner + discoverable_no_directory: Tillad din konto at blive fundet af fremmede via anbefalinger og øvrige funktioner + email: Du tilsendes en bekræftelsese-mail + fields: Du kan have op til 4 elementer vist som en tabel på din profil + header: PNG, GIF eller JPG. Maks. %{size}. Auto-nedskaleres til %{dimensions}px + inbox_url: Kopiér URL'en fra forsiden af den videreformidler, du ønsker at bruge + irreversible: Filtrerede indlæg forsvinder helt, selv hvis filteret senere fjernes + locale: Brugerfladesprog, e-mails og push-notifikationer + locked: Godkend manuelt følgeanmodninger for at styre, hvem der følger dig password: Brug mindst 8 tegn - phrase: Vil blive parret uanset om der er store eller små bogstaver i teksten eller om der er en advarsel om et trut - scopes: Hvilke APIs applikationen vil få adgang til. Hvis du vælger et højtlevel omfang, behøver du ikke vælge enkeltstående. - setting_display_media_default: Skjul medier markeret som følsomt - setting_display_media_hide_all: Skjul altid alle medier + phrase: Matches uanset majuskel-/minuskel-brug i teksten eller indholdsadvarsel på et indlæg + scopes: Hvilke API'er applikationen vil få adgang til. Vælges en højniveaudstrækning, vil granuleringsvalg være unødvendige. + setting_aggregate_reblogs: Vis ikke nye boosts for indlæg boostet for nylig (påvirker kun nyligt modtagne boosts) + setting_default_sensitive: Sensitive medier er som standard skjult og kan afsløres med et klik + setting_display_media_default: Skjul medier markeret som sensitive + setting_display_media_hide_all: Skjul altid medier setting_display_media_show_all: Vis altid medier - setting_hide_network: Hvem du følger og hvem der følger dig vil ikke blive vist på din profil - setting_noindex: Påvirker din offentlige profil og status sider + setting_hide_network: Hvem du følger, og hvem som følger dig, skjules på din profil + setting_noindex: Påvirker din offentlige profil og statussider + setting_show_application: Applikation, hvormed du skrive indlæg, vil fremgå i den detaljerede visning af dine indlæg + setting_use_blurhash: Gradienter er baseret på de skjulte grafikelementers farver, men slører alle detaljer + setting_use_pending_items: Klik for at vise tidslinjeopdateringer i stedet auto-feedrulning username: Dit brugernavn vil være unikt på %{domain} - whole_word: Når nøgle ordet eller udtrykket kun er alfanumerisk, vil det kun blive brugt hvis det passer hele ordet + whole_word: Når nøgleordet/-udtrykket er rent alfanumerisk, bruges det kun, såfremt det matcher hele ordet + domain_allow: + domain: Dette domæne vil kunne hente data, og dermed behandle og gemme indgående data, fra denne server + email_domain_block: + domain: Dette kan være det domænenavn, der vises i e-mailadressen, MX-posten domænet opløser til eller IP'en på den server, som MX-posten opløser til. Disse tjekkes ved brugertilmelding, og tilmeldingen afvises. + with_dns_records: Et forsøg på at løse det givne domænes DNS-poster foretages og resultaterne blokeres ligeledes featured_tag: - name: 'Du kunne måske tænke dig at bruge en af følgende:' + name: 'Du vil formentlig ønske at bruge en af flg.:' form_challenge: - current_password: Du indtræder et sikkert område + current_password: Du bevæger dig ind på et sikkert område imports: - data: CSV fil eksporteret fra en anden Mastodon server + data: CSV-fil eksporteret fra anden Mastodon-server invite_request: text: Dette vil hjælpe os med at gennemgå din ansøgning ip_block: - comment: Valgfri. Husk hvorfor du har tilføjet denne regel. + comment: Valgfri. Husk, hvorfor du tilføjede denne regel. + expires_in: IP-adresser er en begrænset ressource, de deles undertiden og skifter ofte hænder. Af denne grund anbefales ubegrænsede IP-blokke ikke. + ip: Angiv en IPv4- eller IPv6-adresse. Du kan blokere hele intervaller vha. CIDR-syntaksen. Vær forsigtig med ikke at låse dig ude! severities: - no_access: Bloker for adgangen til alle ressourcer + no_access: Blokér adgang til alle ressourcer sign_up_requires_approval: Nye tilmeldinger kræver din godkendelse + severity: Vælg, hvad der vil ske med anmodninger fra denne IP + rule: + text: Beskriv på en kort og enkel form en regel/krav for brugere på denne server sessions: - otp: 'Indtast to-faktor koden der generes af appen af appen på din telefon eller brug en af din genoprettelses koder:' + otp: 'Angiv tofaktorkoden generet af appen på din mobil eller brug en af dine genoprettelses koder:' + webauthn: Er det en USB-nøgle, så sørg for at isætte den og, om nødvendigt, åbne den manuelt. + tag: + name: Du kan kun ændre bogstavtyperne for eksempelvis at gøre det mere læsbart user: - chosen_languages: Når markeret, vil kun trut i de valgte sprog blive vist på offentlige tidslinjer + chosen_languages: Når markeret, vil kun indlæg på de valgte sprog fremgå på offentlige tidslinjer labels: account: fields: name: Etiket value: Indhold + account_alias: + acct: Kaldenavn på den gamle konto + account_migration: + acct: Kaldenavn på den nye konto account_warning_preset: + text: Tilpasset tekst title: Titel admin_account_action: - include_statuses: Inkluder rapporteret toot i email - send_email_notification: Underret brugeren per email + include_statuses: Inkludér anmeldte indlæg i e-mailen + send_email_notification: Advisér brugeren pr. e-mail text: Tilpasset advarsel type: Handling types: - disable: Deaktiver - none: Gør intet - silence: Silence - suspend: Suspendér og slet kontodata uopretteligt - warning_preset_id: Brug en forudindstillet advarsel + disable: Frys + none: Send en advarsel + sensitive: Sensitive + silence: Begrænsning + suspend: Suspendér + warning_preset_id: Brug en forvalgsadvarsel announcement: - all_day: Heldags begivenhed + all_day: Heldagsbegivenhed + ends_at: Slut på begivenhed scheduled_at: Planlæg offentliggørelse + starts_at: Start af begivenhed text: Bekendtgørelse defaults: - autofollow: Inviter til at følge din konto + autofollow: Invitér til at følge din konto avatar: Profilbillede - bot: Dette er en robot konto - chosen_languages: Filtrer sprog - confirm_new_password: Bekræft din nye adgangskode + bot: Dette er en bot-konto + chosen_languages: Filtrér sprog + confirm_new_password: Bekræft ny adgangskode confirm_password: Bekræft adgangskode - context: Filtrer sammenhænge - current_password: Nuværende adgangskode + context: Filtrér kontekster + current_password: Aktuel adgangskode data: Data - discoverable: Vis denne konto i oversigten + discoverable: Foreslå konto til andre display_name: Visningsnavn - email: E-mail adresse - expires_in: Udløber efter - fields: Profil metadata + email: E-mailadresse + expires_in: Udløb efter + fields: Profilmetadata header: Overskrift - inbox_url: Link til relay indbakken - irreversible: Ignorer istedet for at skjule - locale: Sprog på interface - locked: Lås konto - max_uses: Højeste antal benyttelser + honeypot: "%{label} (udfyld ikke)" + inbox_url: URL til videreformidlingsindbakken + irreversible: Fjern istedet for skjul + locale: Grænsefladesprog + locked: Kræv følgeanmodninger + max_uses: Maks. antal afbenyttelser new_password: Ny adgangskode note: Biografi - otp_attempt: To-faktor kode + otp_attempt: Tofaktorkode password: Adgangskode - phrase: Nøgleord eller sætning + phrase: Nøgleord/-sætning setting_advanced_layout: Aktivér avanceret webgrænseflade - setting_auto_play_gif: Afspil automatisk animerede GIFs - setting_boost_modal: Vis bekræftelses dialog før du fremhæver + setting_aggregate_reblogs: Gruppér boosts på tidslinjer + setting_auto_play_gif: Autoafspil animerede GIF'er + setting_boost_modal: Vis bekræftelsesdialog inden boosting + setting_crop_images: Beskær billeder i ikke-ekspanderede indlæg til 16x9 setting_default_language: Sprog for opslag - setting_default_privacy: Privatliv - setting_default_sensitive: Marker altid medier som værende følsomt - setting_delete_modal: Vis bekræftelses dialog før du sletter et trut - setting_display_media: Visning af medier + setting_default_privacy: Fortrolighed for opslag + setting_default_sensitive: Markér altid medier som sensitive + setting_delete_modal: Vis bekræftelsesdialog før et indlæg slettes + setting_disable_swiping: Deaktivér strygebevægelser + setting_display_media: Medivisning setting_display_media_default: Standard setting_display_media_hide_all: Skjul alle setting_display_media_show_all: Vis alle - setting_expand_spoilers: Udvid altid trut der er markeret med indholdsadvarsler - setting_hide_network: Skjul dit netværk - setting_noindex: Frameld dig søgemaskiners indeksering - setting_reduce_motion: Reducer animationers bevægelse - setting_system_font_ui: Brug systemets standard font - setting_theme: Tema for side + setting_expand_spoilers: Ekspandér altid indlæg markeret med indholdsadvarsler + setting_hide_network: Skjul din sociale graf + setting_noindex: Fravælg søgemaskineindeksering + setting_reduce_motion: Reducér animationsbevægelse + setting_show_application: Viser applikation, der bruges til at sende indlæg + setting_system_font_ui: Brug systemets standardskrifttype + setting_theme: Webstedstema setting_trends: Vis dagens tendenser - setting_unfollow_modal: Vis bekræftelses dialog før du stopper med at følge nogen + setting_unfollow_modal: Vis bekræftelsesdialog før ophør med at følge nogen + setting_use_blurhash: Vis farverige gradienter for skjulte medier setting_use_pending_items: Langsom tilstand - severity: Omfang + severity: Alvorlighed sign_in_token_attempt: Sikkerhedskode type: Importtype username: Brugernavn - username_or_email: Brugernavn eller Email + username_or_email: Brugernavn eller e-mail whole_word: Helt ord email_domain_block: - with_dns_records: Inkluder MX-optegnelser og IP'er for domænet + with_dns_records: Inkludér domænets MX-poster og IP'er featured_tag: name: Hashtag interactions: - must_be_follower: Bloker notifikationer fra folk der ikke følger dig - must_be_following: Bloker notifikationer fra folk du ikke følger + must_be_follower: Blokér notifikationer fra ikke-følgere + must_be_following: Blokér notifikationer fra folk du ikke følger must_be_following_dm: Bloker direkte beskeder fra folk du ikke følger invite: comment: Kommentar @@ -137,30 +193,32 @@ da: comment: Kommentar ip: IP severities: - no_access: Bloker adgang + no_access: Blokér adgang sign_up_requires_approval: Begræns tilmeldinger severity: Regel notification_emails: - digest: Send sammendrag via emails - favourite: Send email når nogen favoriserer din status - follow: Send e-mail når nogen følger dig - follow_request: Send email når nogen anmoder om at følge dig - mention: Send e-mail når nogen nævner dig - pending_account: Send en email når en ny konto skal gennemgås - reblog: Send e-mail når nogen fremhæver din status - report: Send email når en ny anmeldelse bliver indsendt - trending_tag: Send en email når et ikke-gennemset hashtag trender + digest: Send resumé e-mails + favourite: Nogen gav dig favoritstatus + follow: Nogen begyndte at følge dig + follow_request: Nogen anmodede om at følge dig + mention: Nogen nævnte dig + pending_account: Ny konto kræver gennemgang + reblog: Nogen boostede din status + report: Ny anmeldelse er indsendt + trending_tag: Et ikke-gennemgået hashtag trender + rule: + text: Regel tag: - listable: Tillad at dette hashtag vises i søgninger og i bruger oversigten + listable: Tillad visning af dette hashtag i søgninger og på profilmappen name: Hashtag - trendable: Tillad at dette hashtag vises under trends - usable: Tillad toots at benytte dette hashtag + trendable: Tillad visning af dette hashtag under trends + usable: Tillad indlæg at benytte dette hashtag 'no': Nej recommended: Anbefalet required: mark: "*" - text: påkrævet + text: krævet title: sessions: - webauthn: Log på ved brug af en af dine sikkerhedskoder + webauthn: Brug en af dine sikkerhedskoder til indlogning 'yes': Ja diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 711dbf5c68..58ffab89a4 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -14,6 +14,12 @@ de: send_email_notification: Benutzer_in wird Bescheid gegeben, was mit dem Konto geschehen ist text_html: Optional. Du kannst Beitragssyntax nutzen. Du kannst Warnungsvorlagen benutzen um Zeit zu sparen type_html: Wähle aus, was du mit %{acct} machen möchtest + types: + disable: Den Benutzer daran hindern, sein Konto zu verwenden, aber seinen Inhalt nicht löschen oder ausblenden. + none: Verwende dies, um eine Warnung an den Benutzer zu senden, ohne eine andere Aktion auszulösen. + sensitive: Erzwinge, dass alle Medienanhänge des Benutzers als NSFW markiert werden. + silence: Verhindern, dass der Benutzer in der Lage ist, mit der öffentlichen Sichtbarkeit zu posten und seine Beiträge und Benachrichtigungen von Personen zu verstecken, die ihm nicht folgen. + suspend: Verhindert jegliche Interaktion von oder zu diesem Konto und löscht dessen Inhalt. Kann innerhalb von 30 Tagen rückgängig gemacht werden. warning_preset_id: Optional. Du kannst immer noch eigenen Text an das Ende der Vorlage hinzufügen announcement: all_day: Wenn aktiviert werden nur die Daten des Zeitraums angezeigt @@ -30,6 +36,7 @@ de: current_username: Um das zu bestätigen, gib den Benutzernamen des aktuellen Kontos ein digest: Wenn du eine lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen zugeschickt, die du in deiner Abwesenheit empfangen hast discoverable: Das Profilverzeichnis ist eine andere Möglichkeit, mit der dein Konto ein größeres Publikum erreichen kann + discoverable_no_directory: Erlaube deinem Konto durch Empfehlungen und andere Funktionen von Fremden entdeckt zu werden email: Du wirst eine Bestätigungs-E-Mail erhalten fields: Du kannst bis zu 4 Elemente auf deinem Profil anzeigen lassen, die als Tabelle dargestellt werden header: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert @@ -73,6 +80,8 @@ de: no_access: Zugriff auf alle Ressourcen blockieren sign_up_requires_approval: Neue Anmeldungen erfordern deine Zustimmung severity: Wähle aus, was mit Anfragen aus dieser IP passiert + rule: + text: Beschreibe eine Regel oder Anforderung für Benutzer auf diesem Server. Versuche es kurz und einfach zu halten sessions: otp: 'Gib die Zwei-Faktor-Authentifizierung von deinem Telefon ein oder benutze einen deiner Wiederherstellungscodes:' webauthn: Wenn es sich um einen USB-Schlüssel handelt, stelle sicher, dass du ihn einsteckst und ihn antippst. @@ -197,6 +206,8 @@ de: reblog: E-Mail senden, wenn jemand meinen Beitrag teilt report: E-Mail senden, wenn ein neuer Bericht vorliegt trending_tag: E-Mail senden, wenn ein ausstehender Hashtag angesagt ist + rule: + text: Regel tag: listable: Erlaube diesem Hashtag im Profilverzeichnis zu erscheinen name: Hashtag diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index d4c8a2da68..375bf65273 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -14,6 +14,12 @@ el: send_email_notification: Ο χρήστης θα λάβει μια εξήγηση του τι συνέβη με τον λογαριασμό του text_html: Προαιρετικό. Μπορείς να χρησιμοποιήσεις συντακτικό ενός τουτ. Μπορείς να ορίσεις προκαθορισμένες προειδοποιήσεις για να γλυτώσεις χρόνο type_html: Διάλεξε τι θα κανείς με τον %{acct} + types: + disable: Αποτρέψτε το χρήστη από τη χρήση του λογαριασμού του, αλλά όχι διαγραφή ή απόκρυψη των περιεχομένων του. + none: Χρησιμοποιήστε αυτό για να στείλετε μια προειδοποίηση στον χρήστη, χωρίς να ενεργοποιήσετε οποιαδήποτε άλλη ενέργεια. + sensitive: Εξαναγκάστε όλα τα συνημμένα πολυμέσα αυτού του χρήστη να επισημαίνονται ως ευαίσθητα. + silence: Αποτρέψτε στο χρήστη να μπορεί να δημοσιεύει δημόσια, να αποκρύπτει τις δημοσιεύσεις και τις ειδοποιήσεις του από άτομα που δεν τις ακολουθούν. + suspend: Αποτρέψτε οποιαδήποτε αλληλεπίδραση από ή προς αυτόν τον λογαριασμό και διαγράψτε τα περιεχόμενά του. Αναστρέψιμη εντός 30 ημερών. warning_preset_id: Προαιρετικό. Μπορείς να προσθέσεις επιπλέον κείμενο μετά το προκαθορισμένο κείμενο announcement: all_day: Όταν είναι επιλεγμένο, θα εμφανίζονται μόνο οι ημερομηνίες εντός της χρονικής διάρκειας @@ -67,10 +73,14 @@ el: text: Αυτό θα μας βοηθήσει να επιθεωρήσουμε την αίτησή σου ip_block: comment: Προαιρετικό. Θυμηθείτε γιατί προσθέσατε αυτόν τον κανόνα. + expires_in: Οι διευθύνσεις IP είναι ένας πεπερασμένος πόρος, μερικές φορές μοιράζονται και συχνά αλλάζουν χέρια. Για το λόγο αυτό, δεν συνιστώνται αόριστοι αποκλεισμοί διευθύνσεων IP. + ip: Εισάγετε μια διεύθυνση IPv4 ή IPv6. Μπορείτε να αποκλείσετε ολόκληρο το εύρος χρησιμοποιώντας τη σύνταξη CIDR. Προσέξτε να μην κλειδώσετε τον εαυτό σας! severities: no_access: Αποκλεισμός πρόσβασης σε όλους τους πόρους sign_up_requires_approval: Νέες εγγραφές θα απαιτούν την έγκριση σας severity: Επιλέξτε τι θα γίνεται με αιτήσεις από αυτήν την διεύθυνση IP + rule: + text: Περιγράψτε έναν κανόνα ή μια απαίτηση για τους χρήστες σε αυτόν τον διακομιστή. Προσπαθήστε να τον κρατήσετε σύντομο και απλό sessions: otp: 'Βάλε τον κωδικό δυο παραγόντων (2FA) από την εφαρμογή του τηλεφώνου σου ή χρησιμοποίησε κάποιον από τους κωδικούς ανάκτησης σου:' webauthn: Αν πρόκειται για ένα κλειδί USB βεβαιωθείτε ότι είναι συνδεδεμένο και αν απαιτείται πατήστε το ελαφρά. @@ -180,7 +190,7 @@ el: text: Γιατί θέλεις να συμμετάσχεις; ip_block: comment: Σχόλιο - ip: IP + ip: Διεύθυνση IP severities: no_access: Αποκλεισμός πρόσβασης sign_up_requires_approval: Περιορισμός εγγραφών @@ -195,6 +205,8 @@ el: reblog: Αποστολή email όταν κάποιος προωθεί τη δημοσίευση σου report: Αποστολή email όταν υποβάλλεται νέα καταγγελία trending_tag: Αποστολή email όταν μια μη-εγκεκριμένη ετικέτα γίνεται δημοφιλής + rule: + text: Κανόνας tag: listable: Εμφάνιση αυτής της ετικέτας στο δημόσιο κατάλογο name: Ετικέτα diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 20c9165602..d6376782d4 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -7,47 +7,54 @@ en: account_migration: acct: Specify the username@domain of the account you want to move to account_warning_preset: - text: You can use toot syntax, such as URLs, hashtags and mentions + text: You can use post syntax, such as URLs, hashtags and mentions title: Optional. Not visible to the recipient admin_account_action: - include_statuses: The user will see which toots have caused the moderation action or warning + include_statuses: The user will see which posts have caused the moderation action or warning send_email_notification: The user will receive an explanation of what happened with their account - text_html: Optional. You can use toot syntax. You can add warning presets to save time + text_html: Optional. You can use post syntax. You can add warning presets to save time type_html: Choose what to do with %{acct} + types: + disable: Prevent the user from using their account, but do not delete or hide their contents. + none: Use this to send a warning to the user, without triggering any other action. + sensitive: Force all this user's media attachments to be flagged as sensitive. + silence: Prevent the user from being able to post with public visibility, hide their posts and notifications from people not following them. + suspend: Prevent any interaction from or to this account and delete its contents. Revertible within 30 days. warning_preset_id: Optional. You can still add custom text to end of the preset announcement: all_day: When checked, only the dates of the time range will be displayed ends_at: Optional. Announcement will be automatically unpublished at this time scheduled_at: Leave blank to publish the announcement immediately starts_at: Optional. In case your announcement is bound to a specific time range - text: You can use toot syntax. Please be mindful of the space the announcement will take up on the user's screen + text: You can use post syntax. Please be mindful of the space the announcement will take up on the user's screen defaults: autofollow: People who sign up through the invite will automatically follow you avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px - bot: This account mainly performs automated actions and might not be monitored + bot: Signal to others that the account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply current_password: For security purposes please enter the password of the current account current_username: To confirm, please enter the username of the current account digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence - discoverable: The profile directory is another way by which your account can reach a wider audience + discoverable: Allow your account to be discovered by strangers through recommendations, profile directory and other features + discoverable_no_directory: Allow your account to be discovered by strangers through recommendations and other features email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use - irreversible: Filtered toots will disappear irreversibly, even if filter is later removed + irreversible: Filtered posts will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications - locked: Requires you to manually approve followers + locked: Manually control who can follow you by approving follow requests password: Use at least 8 characters - phrase: Will be matched regardless of casing in text or content warning of a toot + phrase: Will be matched regardless of casing in text or content warning of a post scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. - setting_aggregate_reblogs: Do not show new boosts for toots that have been recently boosted (only affects newly-received boosts) + setting_aggregate_reblogs: Do not show new boosts for posts that have been recently boosted (only affects newly-received boosts) setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click setting_display_media_default: Hide media marked as sensitive setting_display_media_hide_all: Always hide media setting_display_media_show_all: Always show media - setting_hide_network: Who you follow and who follows you will not be shown on your profile - setting_noindex: Affects your public profile and status pages - setting_show_application: The application you use to toot will be displayed in the detailed view of your toots + setting_hide_network: Who you follow and who follows you will be hidden on your profile + setting_noindex: Affects your public profile and post pages + setting_show_application: The application you use to post will be displayed in the detailed view of your posts setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed username: Your username will be unique on %{domain} @@ -73,13 +80,15 @@ en: no_access: Block access to all resources sign_up_requires_approval: New sign-ups will require your approval severity: Choose what will happen with requests from this IP + rule: + text: Describe a rule or requirement for users on this server. Try to keep it short and simple sessions: otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' webauthn: If it's an USB key be sure to insert it and, if necessary, tap it. tag: name: You can only change the casing of the letters, for example, to make it more readable user: - chosen_languages: When checked, only toots in selected languages will be displayed in public timelines + chosen_languages: When checked, only posts in selected languages will be displayed in public timelines labels: account: fields: @@ -93,7 +102,7 @@ en: text: Preset text title: Title admin_account_action: - include_statuses: Include reported toots in the e-mail + include_statuses: Include reported posts in the e-mail send_email_notification: Notify the user per e-mail text: Custom warning type: Action @@ -120,7 +129,7 @@ en: context: Filter contexts current_password: Current password data: Data - discoverable: List this account on the directory + discoverable: Suggest account to others display_name: Display name email: E-mail address expires_in: Expire after @@ -130,7 +139,7 @@ en: inbox_url: URL of the relay inbox irreversible: Drop instead of hide locale: Interface language - locked: Lock account + locked: Require follow requests max_uses: Max number of uses new_password: New password note: Bio @@ -141,21 +150,21 @@ en: setting_aggregate_reblogs: Group boosts in timelines setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting - setting_crop_images: Crop images in non-expanded toots to 16x9 + setting_crop_images: Crop images in non-expanded posts to 16x9 setting_default_language: Posting language setting_default_privacy: Posting privacy setting_default_sensitive: Always mark media as sensitive - setting_delete_modal: Show confirmation dialog before deleting a toot + setting_delete_modal: Show confirmation dialog before deleting a post setting_disable_swiping: Disable swiping motions setting_display_media: Media display setting_display_media_default: Default setting_display_media_hide_all: Hide all setting_display_media_show_all: Show all - setting_expand_spoilers: Always expand toots marked with content warnings - setting_hide_network: Hide your network + setting_expand_spoilers: Always expand posts marked with content warnings + setting_hide_network: Hide your social graph setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations - setting_show_application: Disclose application used to send toots + setting_show_application: Disclose application used to send posts setting_system_font_ui: Use system's default font setting_theme: Site theme setting_trends: Show today's trends @@ -189,19 +198,21 @@ en: severity: Rule notification_emails: digest: Send digest e-mails - favourite: Someone favourited your status + favourite: Someone favourited your post follow: Someone followed you follow_request: Someone requested to follow you mention: Someone mentioned you pending_account: New account needs review - reblog: Someone boosted your status - report: New report is submitted - trending_tag: An unreviewed hashtag is trending + reblog: Someone boosted your post + report: A new report is submitted + trending_tag: A new trend requires approval + rule: + text: Rule tag: - listable: Allow this hashtag to appear in searches and on the profile directory + listable: Allow this hashtag to appear in searches and suggestions name: Hashtag trendable: Allow this hashtag to appear under trends - usable: Allow toots to use this hashtag + usable: Allow posts to use this hashtag 'no': 'No' recommended: Recommended required: diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 3f399deaed..b00cc46f13 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -8,6 +8,9 @@ eo: send_email_notification: La uzanto ricevos klarigon pri tio, kio okazis al ties konto text_html: Malnepra. Vi povas uzi skribmanierojn de mesaĝoj. Vi povas aldoni avertajn antaŭagordojn por ŝpari tempon type_html: Elektu kion fari kun %{acct} + types: + none: Uzu ĉi tion por sendi averton al la uzanto, sen ekigi alian agon. + suspend: Malhelpu ajnan interagon de aŭ al ĉi tiu konto kaj forigu ĝian enhavon. Returnebla ene de 30 tagoj. warning_preset_id: Malnepra. Vi povas ankoraŭ aldoni propran tekston al la fino de la antaŭagordo defaults: autofollow: Homoj, kiuj registriĝos per la invito aŭtomate sekvos vin @@ -53,7 +56,7 @@ eo: sessions: otp: 'Enmetu la kodon de dufaktora aŭtentigo el via telefono aŭ uzu unu el viaj realiraj kodoj:' user: - chosen_languages: Kiam estas elekto, nur mesaĝoj en elektitaj lingvoj aperos en publikaj tempolinioj + chosen_languages: Kiam estas elekto, nur mesaĝoj en elektitaj lingvoj aperos en publikaj templinioj labels: account: fields: @@ -111,7 +114,7 @@ eo: password: Pasvorto phrase: Vorto aŭ frazo setting_advanced_layout: Ebligi altnivelan retpaĝan interfacon - setting_aggregate_reblogs: Grupigi diskonigojn en tempolinioj + setting_aggregate_reblogs: Grupigi diskonigojn en templinioj setting_auto_play_gif: Aŭtomate ekigi GIF-ojn setting_boost_modal: Montri konfirman fenestron antaŭ ol diskonigi mesaĝon setting_crop_images: Stuci bildojn en negrandigitaj mesaĝoj al 16x9 @@ -167,6 +170,8 @@ eo: reblog: Sendi retmesaĝon kiam iu diskonigas vian mesaĝon report: Nova signalo estas sendita trending_tag: Nekontrolita kradvorto furoras + rule: + text: Regulo tag: name: Kradvorto trendable: Permesi al ĉi tiu kradvorto aperi en furoraĵoj @@ -176,4 +181,7 @@ eo: required: mark: "*" text: bezonata + title: + sessions: + webauthn: Uzi unu el viaj sekurecaj ŝlosiloj por ensaluti 'yes': Jes diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 153c1101d1..bd6dbf98b5 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -7,20 +7,26 @@ es-AR: account_migration: acct: Especificá el nombredeusuario@dominio de la cuenta a la que querés mudarte account_warning_preset: - text: Podés usar sintaxis de toots, como direcciones web, etiquetas y menciones + text: Podés usar sintaxis de mensajes, como direcciones web, etiquetas y menciones title: Opcional. No visible para el destinatario admin_account_action: - include_statuses: El usuario verá qué toots causaron la acción de moderación o advertencia + include_statuses: El usuario verá qué mensajes causaron la acción de moderación o advertencia send_email_notification: El usuario recibirá una explicación de lo que sucedió con su cuenta - text_html: Opcional. Podés usar sintaxis de toots. Podés agregar preajustes de advertencia para ahorrar tiempo + text_html: Opcional. Podés usar sintaxis de mensajes. Podés agregar preajustes de advertencia para ahorrar tiempo type_html: Elegí qué hacer con %{acct} + types: + disable: Evitar que el usuario use su cuenta, pero no elimina ni oculta sus contenidos. + none: Usá esto para enviarle una advertencia al usuario, sin ejecutar ninguna otra acción. + sensitive: Forzar a que todos los adjuntos de medios de este usuario sean marcados como sensibles. + silence: Evitar que el usuario pueda publicar mensajes, ocultando sus publicaciones y notificaciones a cuentas que no lo siguen. + suspend: Evitar cualquier interacción desde o hacia esta cuenta, y eliminar su contenido. Reversible en un plazo de 30 días. warning_preset_id: Opcional. Todavía podés agregar texto personalizado al final del preajuste announcement: all_day: Cuando esté seleccionado, sólo se mostrarán las fechas del rango de tiempo ends_at: Opcional. El anuncio desaparecerá automáticamente en este momento scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente starts_at: Opcional. En caso de que tu anuncio esté vinculado a un rango de tiempo específico - text: Podés usar sintaxis de toots. Por favor, tené en cuenta el espacio que ocupará el anuncio en la pantalla del usuario + text: Podés usar sintaxis de mensajes. Por favor, tené en cuenta el espacio que ocupará el anuncio en la pantalla del usuario defaults: autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente avatar: 'PNG, GIF o JPG. Máximo: %{size}. Será subescalado a %{dimensions} píxeles' @@ -29,25 +35,26 @@ es-AR: current_password: Por razones de seguridad, por favor, ingresá la contraseña de la cuenta actual current_username: Para confirmar, por favor, ingresá el nombre de usuario de la cuenta actual digest: Sólo enviado tras un largo periodo de inactividad, y sólo si recibiste mensajes personales en tu ausencia - discoverable: El directorio del perfil es otra forma en la que tu cuenta puede llegar a un público más amplio + discoverable: Permití que tu cuenta sea descubierta por extraños a través de recomendaciones y otras funciones + discoverable_no_directory: Permití que tu cuenta sea descubierta por extraños a través de recomendaciones y otras funciones email: Se te enviará un correo electrónico de confirmación fields: Podés tener hasta 4 elementos mostrados en una tabla en tu perfil header: 'PNG, GIF o JPG. Máximo: %{size}. Será subescalado a %{dimensions} píxeles' inbox_url: Copiá la dirección web desde la página principal del relé que querés usar - irreversible: Los toots filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado después + irreversible: Los mensajes filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado después locale: El idioma de la interface de usuario, correos electrónicos y notificaciones push - locked: Requiere que manualmente aprobés seguidores + locked: Controlá manualmente quién puede seguirte al aprobar solicitudes de seguimiento password: Usá al menos 8 caracteres - phrase: Se aplicará sin importar las mayúsculas o las advertencias de contenido de un toot + phrase: Se aplicará sin importar las mayúsculas o las advertencias de contenido de un mensaje scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionás el alcance de nivel más alto, no necesitás seleccionar las individuales. - setting_aggregate_reblogs: No mostrar nuevos retoots de los toots que fueron recientemente retooteados (sólo afecta a los retoots recibidos recientemente) + setting_aggregate_reblogs: No mostrar nuevas adhesiones de los mensajes que fueron recientemente adheridos (sólo afecta a las adhesiones recibidas recientemente) setting_default_sensitive: El contenido de medios sensibles está oculto predeterminadamente y puede ser mostrado con un clic setting_display_media_default: Ocultar medios marcados como sensibles setting_display_media_hide_all: Siempre ocultar todos los medios setting_display_media_show_all: Siempre mostrar todos los medios - setting_hide_network: A quiénes seguís y tus seguidores no serán mostrados en tu perfil - setting_noindex: Afecta a tu perfil público y páginas de estado - setting_show_application: La aplicación que usás para tootear se mostrará en la vista detallada de tus toots + setting_hide_network: Las cuentas que seguís y tus seguidores serán ocultados en tu perfil + setting_noindex: Afecta a tu perfil público y páginas de mensajes + setting_show_application: La aplicación que usás para enviar mensajes se mostrará en la vista detallada de tus mensajes setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles setting_use_pending_items: Ocultar actualizaciones de la línea temporal detrás de un clic en lugar de desplazar automáticamente el flujo username: Tu nombre de usuario será único en %{domain} @@ -73,13 +80,15 @@ es-AR: no_access: Bloquear acceso a todos los recursos sign_up_requires_approval: Los nuevos registros requerirán tu aprobación severity: Elegí lo que pasará con las solicitudes desde esta dirección IP + rule: + text: Describí una regla o requisito para los usuarios de este servidor. Intentá hacerla corta y sencilla sessions: otp: 'Ingresá el código de autenticación de dos factores generado por la aplicación en tu dispositivo, o usá uno de tus códigos de recuperación:' webauthn: Si es una llave USB, asegurate de insertarla y, de ser necesario, tocarla. tag: name: Sólo podés cambiar la capitalización de las letras, por ejemplo, para que sea más legible user: - chosen_languages: Cuando esté marcado, sólo se mostrarán los toots en los idiomas seleccionados en las líneas temporales públicas + chosen_languages: Cuando estén marcados, sólo se mostrarán los mensajes en los idiomas seleccionados en las líneas temporales públicas labels: account: fields: @@ -93,7 +102,7 @@ es-AR: text: Texto predefinido title: Título admin_account_action: - include_statuses: Incluir en el correo electrónico a los toots denunciados + include_statuses: Incluir en el correo electrónico los mensajes denunciados send_email_notification: Notificar al usuario por correo electrónico text: Advertencia personalizada type: Acción @@ -120,7 +129,7 @@ es-AR: context: Filtrar contextos current_password: Contraseña actual data: Datos - discoverable: Listar esta cuenta en el directorio + discoverable: Sugerir cuenta a otros display_name: Nombre para mostrar email: Dirección de correo electrónico expires_in: Vence después de @@ -130,7 +139,7 @@ es-AR: inbox_url: Dirección web de la bandeja de entrada del relé irreversible: Dejar en lugar de ocultar locale: Idioma de la interface - locked: Hacer privada esta cuenta + locked: Requerir solicitudes de seguimiento max_uses: Número máximo de usos new_password: Nueva contraseña note: Biografía @@ -138,24 +147,24 @@ es-AR: password: Contraseña phrase: Palabra clave o frase setting_advanced_layout: Habilitar interface web avanzada - setting_aggregate_reblogs: Agrupar retoots en las líneas temporales + setting_aggregate_reblogs: Agrupar adhesiones en las líneas temporales setting_auto_play_gif: Reproducir automáticamente los GIFs animados - setting_boost_modal: Mostrar diálogo de confirmación antes de retootear - setting_crop_images: Recortar imágenes en toots no expandidos a 16x9 - setting_default_language: Idioma de tus toots - setting_default_privacy: Privacidad de toots + setting_boost_modal: Mostrar diálogo de confirmación antes de adherir + setting_crop_images: Recortar imágenes en mensajes no expandidos a 16x9 + setting_default_language: Idioma de tus mensajes + setting_default_privacy: Privacidad de mensajes setting_default_sensitive: Siempre marcar medios como sensibles - setting_delete_modal: Mostrar diálogo de confirmación antes de eliminar un toot + setting_delete_modal: Mostrar diálogo de confirmación antes de eliminar un mensaje setting_disable_swiping: Deshabilitar movimientos de deslizamiento setting_display_media: Visualización de medios setting_display_media_default: Predeterminada setting_display_media_hide_all: Ocultar todo setting_display_media_show_all: Mostrar todo - setting_expand_spoilers: Siempre expandir los toots marcados con advertencias de contenido - setting_hide_network: Ocultar tu red + setting_expand_spoilers: Siempre expandir los mensajes marcados con advertencias de contenido + setting_hide_network: Ocultá tu gráfica social setting_noindex: Excluirse del indexado de motores de búsqueda setting_reduce_motion: Reducir el movimiento de las animaciones - setting_show_application: Mostrar aplicación usada para tootear + setting_show_application: Mostrar aplicación usada para enviar mensajes setting_system_font_ui: Utilizar la tipografía predeterminada del sistema setting_theme: Tema del sitio setting_trends: Mostrar las tendencias de hoy @@ -189,19 +198,21 @@ es-AR: severity: Regla notification_emails: digest: Enviar correos electrónicos compilatorios - favourite: Una cuenta marca tu toot como favorito + favourite: Una cuenta marca tu mensaje como favorito follow: Una cuenta te sigue follow_request: Una cuenta solicita seguirte mention: Una cuenta te menciona pending_account: Una nueva cuenta necesita revisión - reblog: Una cuenta retootea tu toot + reblog: Una cuenta adhiere a tu mensaje report: Se envía una nueva denuncia trending_tag: Una etiqueta no revisada está en tendencia + rule: + text: Regla tag: - listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio de perfiles + listable: Permitir que esta etiqueta aparezca en las búsquedas y en las sugerencias name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias - usable: Permitir a los toots usar esta etiqueta + usable: Permitir a los mensajes usar esta etiqueta 'no': 'No' recommended: Opción recomendada required: diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml new file mode 100644 index 0000000000..dc1bf65e61 --- /dev/null +++ b/config/locales/simple_form.es-MX.yml @@ -0,0 +1,223 @@ +--- +es-MX: + simple_form: + hints: + account_alias: + acct: Especifique el nombre de usuario@dominio de la cuenta desde la cual se desea migrar + account_migration: + acct: Especifique el nombre de usuario@dominio de la cuenta a la cual se desea migrar + account_warning_preset: + text: Puede usar sintaxis de toots, como URLs, hashtags y menciones + title: Opcional. No visible para el destinatario + admin_account_action: + include_statuses: El usuario verá qué toots han causado la acción de moderación o advertencia + send_email_notification: El usuario recibirá una explicación de lo que sucedió con respecto a su cuenta + text_html: Opcional. Puede usar sintaxis de toots. Puede añadir configuraciones predefinidas de advertencia para ahorrar tiempo + type_html: Elige qué hacer con %{acct} + types: + disable: Evitar que el usuario utilice su cuenta, pero no eliminar ni ocultar sus contenidos. + none: Utilizar esto para enviar una advertencia al usuario, sin poner en marcha ninguna otra acción. + sensitive: Forzar que todos los archivos multimedia de este usuario sean marcados como sensibles. + silence: Evitar que el usuario pueda publicar con visibilidad pública, oculta sus mensajes y notificaciones a personas que no lo siguen. + suspend: Evitar cualquier interacción desde o hacia esta cuenta y eliminar su contenido. Reversible en un plazo de 30 días. + warning_preset_id: Opcional. Aún puede añadir texto personalizado al final de la configuración predefinida + announcement: + all_day: Cuando está seleccionado solo se mostrarán las fechas del rango de tiempo + ends_at: Opcional. El anuncio desaparecerá automáticamente en este momento + scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente + starts_at: Opcional. En caso de que su anuncio esté vinculado a un intervalo de tiempo específico + text: Puedes usar la sintaxis toot. Por favor ten en cuenta el espacio que ocupará el anuncio en la pantalla del usuario + defaults: + autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente + avatar: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px + bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada + context: Uno o múltiples contextos en los que debe aplicarse el filtro + current_password: Por razones de seguridad por favor ingrese la contraseña de la cuenta actual + current_username: Para confirmar, por favor ingrese el nombre de usuario de la cuenta actual + digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia + discoverable: El directorio del perfil es otra forma en la que su cuenta puede llegar a un público más amplio + email: Se le enviará un correo de confirmación + fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil + header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px + inbox_url: Copia la URL de la página principal del relés que quieres utilizar + irreversible: Los toots filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado más adelante + locale: El idioma de la interfaz de usuario, correos y notificaciones push + locked: Requiere que manualmente apruebes seguidores y las publicaciones serán mostradas solamente a tus seguidores + password: Utilice al menos 8 caracteres + phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de un toot + scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales. + setting_aggregate_reblogs: No mostrar nuevos retoots para los toots que han sido recientemente retooteados (sólo afecta a los retoots recibidos recientemente) + setting_default_sensitive: El contenido multimedia sensible está oculto por defecto y puede ser mostrado con un click + setting_display_media_default: Ocultar contenido multimedia marcado como sensible + setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia + setting_display_media_show_all: Mostrar siempre contenido multimedia marcado como sensible + setting_hide_network: A quién sigues y quién te sigue no será mostrado en tu perfil + setting_noindex: Afecta a tu perfil público y páginas de estado + setting_show_application: La aplicación que utiliza usted para publicar toots se mostrará en la vista detallada de sus toots + setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles + setting_use_pending_items: Ocultar nuevos estados detrás de un clic en lugar de desplazar automáticamente el feed + username: Tu nombre de usuario será único en %{domain} + whole_word: Cuando la palabra clave o frase es solo alfanumérica, solo será aplicado si concuerda con toda la palabra + domain_allow: + domain: Este dominio podrá obtener datos de este servidor y los datos entrantes serán procesados y archivados + email_domain_block: + domain: Puede ser el nombre de dominio que aparece en la dirección de correo, el registro MX hacia el cual resuelve el dominio, o la IP del servidor hacia el cual resuelve ese registro MX. Esto se comprobará en el momento del alta del usuario y el alta se rechazará. + with_dns_records: Se hará un intento de resolver los registros DNS del dominio dado y los resultados serán también puestos en lista negra + featured_tag: + name: 'Puede que quieras usar uno de estos:' + form_challenge: + current_password: Estás entrando en un área segura + imports: + data: Archivo CSV exportado desde otra instancia de Mastodon + invite_request: + text: Esto nos ayudará a revisar su aplicación + ip_block: + comment: Opcional. Recuerda por qué has añadido esta regla. + expires_in: Las direcciones IP son un recurso finito, a veces se comparten y a menudo cambian de manos. Por esta razón, no se recomiendan bloqueos de IP indefinida. + ip: Introduzca una dirección IPv4 o IPv6. Puede bloquear rangos completos usando la sintaxis CIDR. ¡Tenga cuidado de no quedarse fuera! + severities: + no_access: Bloquear acceso a todos los recursos + sign_up_requires_approval: Nuevos registros requerirán su aprobación + severity: Elegir lo que pasará con las peticiones desde esta IP + rule: + text: Describe una norma o requisito para los usuarios de este servidor. Intenta hacerla corta y sencilla + sessions: + otp: 'Introduce el código de autenticación de dos factores generado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' + webauthn: Si es una tecla USB, asegúrese de insertarla y, si es necesario, púlsela. + tag: + name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible + user: + chosen_languages: Cuando se marca, solo se mostrarán los toots en los idiomas seleccionados en los timelines públicos + labels: + account: + fields: + name: Etiqueta + value: Contenido + account_alias: + acct: Maneja la cuenta antigua + account_migration: + acct: Maneja la cuenta nueva + account_warning_preset: + text: Texto predefinido + title: Título + admin_account_action: + include_statuses: Incluir en el correo electrónico a los toots denunciados + send_email_notification: Notificar al usuario por correo electrónico + text: Aviso personalizado + type: Acción + types: + disable: Deshabilitar + none: No hacer nada + sensitive: Sensible + silence: Silenciar + suspend: Suspender y eliminar de forma irreversible la información de la cuenta + warning_preset_id: Usar un aviso predeterminado + announcement: + all_day: Evento de todo el día + ends_at: Fin del evento + scheduled_at: Programar publicación + starts_at: Comienzo del evento + text: Anuncio + defaults: + autofollow: Invitar a seguir tu cuenta + avatar: Foto de perfil + bot: Esta es una cuenta bot + chosen_languages: Filtrar idiomas + confirm_new_password: Confirmar nueva contraseña + confirm_password: Confirmar contraseña + context: Filtrar contextos + current_password: Contraseña actual + data: Información + discoverable: Listar esta cuenta en el directorio + display_name: Nombre para mostrar + email: Dirección de correo electrónico + expires_in: Expirar tras + fields: Metadatos de perfil + header: Img. cabecera + honeypot: "%{label} (no rellenar)" + inbox_url: URL de la entrada de relés + irreversible: Dejar en lugar de ocultar + locale: Idioma + locked: Hacer privada esta cuenta + max_uses: Máx. número de usos + new_password: Nueva contraseña + note: Biografía + otp_attempt: Código de dos factores + password: Contraseña + phrase: Palabra clave o frase + setting_advanced_layout: Habilitar interfaz web avanzada + setting_aggregate_reblogs: Agrupar retoots en las líneas de tiempo + setting_auto_play_gif: Reproducir automáticamente los GIFs animados + setting_boost_modal: Mostrar ventana de confirmación antes de un Retoot + setting_crop_images: Recortar a 16x9 las imágenes de los toots no expandidos + setting_default_language: Idioma de publicación + setting_default_privacy: Privacidad de publicaciones + setting_default_sensitive: Marcar siempre imágenes como sensibles + setting_delete_modal: Mostrar diálogo de confirmación antes de borrar un toot + setting_disable_swiping: Deshabilitar movimientos de deslizamiento + setting_display_media: Visualización multimedia + setting_display_media_default: Por defecto + setting_display_media_hide_all: Ocultar todo + setting_display_media_show_all: Mostrar todo + setting_expand_spoilers: Siempre expandir los toots marcados con advertencias de contenido + setting_hide_network: Ocultar tu red + setting_noindex: Excluirse del indexado de motores de búsqueda + setting_reduce_motion: Reducir el movimiento de las animaciones + setting_show_application: Mostrar aplicación usada para publicar toots + setting_system_font_ui: Utilizar la tipografía por defecto del sistema + setting_theme: Tema del sitio + setting_trends: Mostrar las tendencias de hoy + setting_unfollow_modal: Mostrar diálogo de confirmación antes de dejar de seguir a alguien + setting_use_blurhash: Mostrar gradientes coloridos para contenido multimedia oculto + setting_use_pending_items: Modo lento + severity: Severidad + sign_in_token_attempt: Código de seguridad + type: Importar tipo + username: Nombre de usuario + username_or_email: Usuario o Email + whole_word: Toda la palabra + email_domain_block: + with_dns_records: Incluye los registros MX y las IP del dominio + featured_tag: + name: Etiqueta + interactions: + must_be_follower: Bloquear notificaciones de personas que no te siguen + must_be_following: Bloquear notificaciones de personas que no sigues + must_be_following_dm: Bloquear mensajes directos de la gente que no sigues + invite: + comment: Comentar + invite_request: + text: "¿Por qué quiere unirse usted?" + ip_block: + comment: Comentario + ip: IP + severities: + no_access: Bloquear acceso + sign_up_requires_approval: Limitar registros + severity: Regla + notification_emails: + digest: Enviar resumen de correos electrónicos + favourite: Enviar correo electrónico cuando alguien de a favorito en su publicación + follow: Enviar correo electrónico cuando alguien te siga + follow_request: Enviar correo electrónico cuando alguien solicita seguirte + mention: Enviar correo electrónico cuando alguien te mencione + pending_account: Enviar correo electrónico cuando una nueva cuenta necesita revisión + reblog: Enviar correo electrónico cuando alguien comparta su publicación + report: Enviar un correo cuando se envía un nuevo informe + trending_tag: Enviar correo electrónico cuando una etiqueta no revisada está de tendencia + rule: + text: Norma + tag: + listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil + name: Etiqueta + trendable: Permitir que esta etiqueta aparezca bajo tendencias + usable: Permitir a los toots usar esta etiqueta + 'no': 'No' + recommended: Recomendado + required: + mark: "*" + text: necesario + title: + sessions: + webauthn: Utilice una de sus claves de seguridad para iniciar sesión + 'yes': Sí diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 5da47d54a8..2865588541 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -7,20 +7,26 @@ es: account_migration: acct: Especifique el nombre de usuario@dominio de la cuenta a la cual se desea migrar account_warning_preset: - text: Puede usar sintaxis de toots, como URLs, hashtags y menciones + text: Puede usar sintaxis de publicaciones, como URLs, hashtags y menciones title: Opcional. No visible para el destinatario admin_account_action: - include_statuses: El usuario verá qué toots han causado la acción de moderación o advertencia + include_statuses: El usuario verá qué publicaciones han causado la acción de moderación o advertencia send_email_notification: El usuario recibirá una explicación de lo que sucedió con respecto a su cuenta - text_html: Opcional. Puede usar sintaxis de toots. Puede añadir configuraciones predefinidas de advertencia para ahorrar tiempo + text_html: Opcional. Puede usar sintaxis de publicaciones. Puede añadir configuraciones predefinidas de advertencia para ahorrar tiempo type_html: Elige qué hacer con %{acct} + types: + disable: Evitar que el usuario utilice su cuenta, pero no eliminar ni ocultar sus contenidos. + none: Utilizar esto para enviar una advertencia al usuario, sin poner en marcha ninguna otra acción. + sensitive: Forzar que todos los archivos multimedia de este usuario sean marcados como sensibles. + silence: Evitar que el usuario pueda publicar con visibilidad pública, oculta sus mensajes y notificaciones a personas que no lo siguen. + suspend: Evitar cualquier interacción desde o hacia esta cuenta y eliminar su contenido. Reversible en un plazo de 30 días. warning_preset_id: Opcional. Aún puede añadir texto personalizado al final de la configuración predefinida announcement: all_day: Cuando está seleccionado solo se mostrarán las fechas del rango de tiempo ends_at: Opcional. El anuncio desaparecerá automáticamente en este momento scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente starts_at: Opcional. En caso de que su anuncio esté vinculado a un intervalo de tiempo específico - text: Puedes usar la sintaxis toot. Por favor ten en cuenta el espacio que ocupará el anuncio en la pantalla del usuario + text: Puedes usar la sintaxis de publicaciones. Por favor ten en cuenta el espacio que ocupará el anuncio en la pantalla del usuario defaults: autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente avatar: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px @@ -29,25 +35,26 @@ es: current_password: Por razones de seguridad por favor ingrese la contraseña de la cuenta actual current_username: Para confirmar, por favor ingrese el nombre de usuario de la cuenta actual digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia - discoverable: El directorio del perfil es otra forma en la que su cuenta puede llegar a un público más amplio + discoverable: Permite que tu cuenta sea encontrada por desconocidos por medio de recomendaciones y otras herramientas + discoverable_no_directory: Permite que tu cuenta sea encontrada por desconocidos por medio de recomendaciones y otras herramientas email: Se le enviará un correo de confirmación fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px inbox_url: Copia la URL de la página principal del relés que quieres utilizar - irreversible: Los toots filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado más adelante + irreversible: Las publicaciones filtradas desaparecerán irreversiblemente, incluso si este filtro es eliminado más adelante locale: El idioma de la interfaz de usuario, correos y notificaciones push locked: Requiere que manualmente apruebes seguidores y las publicaciones serán mostradas solamente a tus seguidores password: Utilice al menos 8 caracteres - phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de un toot + phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de una publicación scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales. - setting_aggregate_reblogs: No mostrar nuevos retoots para los toots que han sido recientemente retooteados (sólo afecta a los retoots recibidos recientemente) + setting_aggregate_reblogs: No mostrar nuevos retoots para las publicaciones que han sido recientemente retooteadas (sólo afecta a los retoots recibidos recientemente) setting_default_sensitive: El contenido multimedia sensible está oculto por defecto y puede ser mostrado con un click setting_display_media_default: Ocultar contenido multimedia marcado como sensible setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia setting_display_media_show_all: Mostrar siempre contenido multimedia marcado como sensible setting_hide_network: A quién sigues y quién te sigue no será mostrado en tu perfil setting_noindex: Afecta a tu perfil público y páginas de estado - setting_show_application: La aplicación que utiliza usted para publicar toots se mostrará en la vista detallada de sus toots + setting_show_application: La aplicación que utiliza usted para publicar publicaciones se mostrará en la vista detallada de sus publicaciones setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles setting_use_pending_items: Ocultar nuevos estados detrás de un clic en lugar de desplazar automáticamente el feed username: Tu nombre de usuario será único en %{domain} @@ -73,13 +80,15 @@ es: no_access: Bloquear acceso a todos los recursos sign_up_requires_approval: Nuevos registros requerirán su aprobación severity: Elegir lo que pasará con las peticiones desde esta IP + rule: + text: Describe una norma o requisito para los usuarios de este servidor. Intenta hacerla corta y sencilla sessions: otp: 'Introduce el código de autenticación de dos factores generado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' webauthn: Si es una tecla USB, asegúrese de insertarla y, si es necesario, púlsela. tag: name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible user: - chosen_languages: Cuando se marca, solo se mostrarán los toots en los idiomas seleccionados en los timelines públicos + chosen_languages: Cuando se marca, solo se mostrarán las publicaciones en los idiomas seleccionados en las líneas de tiempo públicas labels: account: fields: @@ -93,7 +102,7 @@ es: text: Texto predefinido title: Título admin_account_action: - include_statuses: Incluir en el correo electrónico a los toots denunciados + include_statuses: Incluir en el correo electrónico a las publicaciones denunciadas send_email_notification: Notificar al usuario por correo electrónico text: Aviso personalizado type: Acción @@ -120,7 +129,7 @@ es: context: Filtrar contextos current_password: Contraseña actual data: Información - discoverable: Listar esta cuenta en el directorio + discoverable: Sugerir la cuenta a otros display_name: Nombre para mostrar email: Dirección de correo electrónico expires_in: Expirar tras @@ -140,22 +149,22 @@ es: setting_advanced_layout: Habilitar interfaz web avanzada setting_aggregate_reblogs: Agrupar retoots en las líneas de tiempo setting_auto_play_gif: Reproducir automáticamente los GIFs animados - setting_boost_modal: Mostrar ventana de confirmación antes de un Retoot - setting_crop_images: Recortar a 16x9 las imágenes de los toots no expandidos + setting_boost_modal: Mostrar ventana de confirmación antes de retootear + setting_crop_images: Recortar a 16x9 las imágenes de las publicaciones no expandidas setting_default_language: Idioma de publicación setting_default_privacy: Privacidad de publicaciones setting_default_sensitive: Marcar siempre imágenes como sensibles - setting_delete_modal: Mostrar diálogo de confirmación antes de borrar un toot + setting_delete_modal: Mostrar diálogo de confirmación antes de borrar una publicación setting_disable_swiping: Deshabilitar movimientos de deslizamiento setting_display_media: Visualización multimedia setting_display_media_default: Por defecto setting_display_media_hide_all: Ocultar todo setting_display_media_show_all: Mostrar todo - setting_expand_spoilers: Siempre expandir los toots marcados con advertencias de contenido + setting_expand_spoilers: Siempre expandir las publicaciones marcadas con advertencias de contenido setting_hide_network: Ocultar tu red setting_noindex: Excluirse del indexado de motores de búsqueda setting_reduce_motion: Reducir el movimiento de las animaciones - setting_show_application: Mostrar aplicación usada para publicar toots + setting_show_application: Mostrar aplicación usada para publicar publicaciones setting_system_font_ui: Utilizar la tipografía por defecto del sistema setting_theme: Tema del sitio setting_trends: Mostrar las tendencias de hoy @@ -197,11 +206,13 @@ es: reblog: Enviar correo electrónico cuando alguien comparta su publicación report: Enviar un correo cuando se envía un nuevo informe trending_tag: Enviar correo electrónico cuando una etiqueta no revisada está de tendencia + rule: + text: Norma tag: listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias - usable: Permitir a los toots usar esta etiqueta + usable: Permitir a las publicaciones usar esta etiqueta 'no': 'No' recommended: Recomendado required: diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 79934c0b19..7d8957b180 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -185,6 +185,5 @@ et: 'no': Ei recommended: Soovituslik required: - mark: "*" text: kohustuslik 'yes': Jah diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index c3520b0721..68913558f5 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -14,6 +14,12 @@ eu: send_email_notification: Erabiltzaileak bere kontuarekin gertatutakoaren azalpen bat jasoko du text_html: Aukerakoa. Toot sintaxia erabili dezakezu. Abisu aurre-ezarpenak gehitu ditzakezu denbora aurrezteko type_html: Erabaki zer egin %{acct} kontuarekin + types: + disable: Erabiltzaileari bere kontua erabiltzea eragotzi, baina ez ezabatu edo ezkutatu bere edukiak. + none: Erabili hau erabiltzaileari abisu bat bidaltzeko, beste ekintzarik abiarazi gabe. + sensitive: Behartu erabiltzaile honen multimedia eranskin guztiak hunkigarri gisa markatzea. + silence: Eragotzi erabiltzaileak ikusgaitasun publikoarekin argitaratzea, ezkutatu bere bidalketa eta jakinarazpenak jarraitzen ez duten pertsonei. + suspend: Eragotzi kontu honek inolako interakziorik izatea eta ezabatu bere edukiak. Atzera bota daiteke 30 egun igaro aurretik. warning_preset_id: Aukerakoa. Zure testua gehitu dezakezu aurre-ezarpenaren ostean announcement: all_day: Markatutakoan soilik denbora barrutiko datak erakutsiko dira @@ -65,8 +71,19 @@ eu: data: Beste Mastodon zerbitzari batetik esportatutako CSV fitxategia invite_request: text: Honek zure eskaera berrikustean lagunduko digu + ip_block: + comment: Hautazkoa. Gogoratu zergatik gehitu duzun arau hau. + expires_in: IP helbideak baliabide mugatua dira, batzuetan partekatuak dira eta maiz aldatzen dira jabez. Horregatik, ez da gomendatzen IPak mugagabe blokeatzea. + ip: Sartu IPv4 edo IPv6 helbide bat. Tarte osoak blokeatu ditzakezu CIDR sintaxia erabiliz. Kontuz zure burua blokeatu gabe! + severities: + no_access: Blokeatu baliabide guztietarako sarbidea + sign_up_requires_approval: Izen emate berriek zure onarpena beharko dute + severity: Aukeratu zer gertatuko den IP honetatik datozen eskaerekin + rule: + text: Deskribatu zerbitzari honetako erabiltzaileentzako arau edo betekizun bat. Saiatu labur eta sinple idazten sessions: otp: 'Sartu zure telefonoko aplikazioak sortutako bi faktoreetako kodea, edo erabili zure berreskuratze kodeetako bat:' + webauthn: USB gako bat bada, ziurtatu sartu duzula, eta behar izanez gero ukitu ezazu. tag: name: Letrak maiuskula/minuskulara aldatu ditzakezu besterik ez, adibidez irakurterrazago egiteko user: @@ -91,6 +108,7 @@ eu: types: disable: Desaktibatu none: Ez egin ezer + sensitive: Hunkigarria silence: Isiltarazi suspend: Kanporatu eta behin betiko ezabatu kontuko datuak warning_preset_id: Erabili aurre-ezarritako abisu bat @@ -116,6 +134,7 @@ eu: expires_in: Iraungitzea fields: Profilaren metadatuak header: Goiburua + honeypot: "%{label} (ez bete)" inbox_url: Errelearen sarrera ontziaren URLa irreversible: Baztertu ezkutatu ordez locale: Interfazearen hizkuntza @@ -135,6 +154,7 @@ eu: setting_default_privacy: Mezuen pribatutasuna setting_default_sensitive: Beti markatu edukiak hunkigarri gisa setting_delete_modal: Erakutsi baieztapen elkarrizketa-koadroa toot bat ezabatu aurretik + setting_disable_swiping: Desgaitu hatza pasatzeko mugimenduak setting_display_media: Multimedia bistaratzea setting_display_media_default: Lehenetsia setting_display_media_hide_all: Ezkutatu guztia @@ -151,6 +171,7 @@ eu: setting_use_blurhash: Erakutsi gradiente koloretsuak ezkutatutako multimediaren ordez setting_use_pending_items: Modu geldoa severity: Larritasuna + sign_in_token_attempt: Segurtasun kodea type: Inportazio mota username: Erabiltzaile-izena username_or_email: Erabiltzaile-izena edo e-mail helbidea @@ -167,6 +188,13 @@ eu: comment: Iruzkina invite_request: text: Zergatik elkartu nahi duzu? + ip_block: + comment: Iruzkina + ip: IP-a + severities: + no_access: Blokeatu sarbidea + sign_up_requires_approval: Mugatu izen emateak + severity: Araua notification_emails: digest: Bidali laburpenak e-mail bidez favourite: Bidali e-mail bat norbaitek zure mezua gogoko duenean @@ -177,6 +205,8 @@ eu: reblog: Bidali e-mail bat norbaitek zure mezuari bultzada ematen badio report: Bidali e-maila txosten berri bat aurkezten denean trending_tag: Bidali e-mail bat errebisatu gabeko traola bat joeran dagoenean + rule: + text: Araua tag: listable: Baimendu traola hau bilaketetan agertzea eta profilen direktorioan name: Traola @@ -187,4 +217,7 @@ eu: required: mark: "*" text: beharrezkoa + title: + sessions: + webauthn: Erabili zure segurtasun gakoetako bat saioa hasteko 'yes': Bai diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 5960c26105..50e7dd3f2f 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -14,6 +14,12 @@ fa: send_email_notification: توضیحی که کاربر می‌بینید که برای حسابش چه رخ داده است text_html: اختیاری. می‌توانید مثل بوق‌های معمولی بنویسید. می‌توانید برای صرفه‌جویی در زمان هشدارهای ازپیش‌آماده بیفزایید type_html: با حساب %{acct} می‌خواهید چه کار کنید؟‌ + types: + disable: از استفادهٔ کاربر از حسابش جلوگیری می‌کند، ولی محتوایش را حذف یا پنهان نمی‌کند. + none: برای فرستادن هشداری به کاربر، بدون هیچ کنش دیگری استفاده کنید. + sensitive: اجبار همهٔ پیوست‌های رسانه‌ای این کاربر برای نشانه‌گذاری به عنوان حساس. + silence: جلوگیری از توانایی کاربر برای فرستادن با نمایانی عمومی، نهفتن فرسته‌ها و آگاهی‌هایش از افرادی که دنبالش نمی‌کنند. + suspend: جلوگیری از هر برهم‌کنشی از یا به این حساب و حذف محتواهایش. قابل بازگشت در عرض ۳۰ روز. warning_preset_id: اختیاری. همچنان می‌توانید در پایان متن آماده چیزی بیفزایید announcement: all_day: هنگام گزینش، تنها تاریخ‌های بازهٔ زمانی نمایش داده خواهند شد @@ -30,6 +36,7 @@ fa: current_username: برای تأیید، لطفاً نام کاربری حساب فعلی را وارد کنید digest: تنها وقتی فرستاده می‌شود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصی‌ای نوشته شده باشد discoverable: فهرست گزیدهٔ کاربران، راهی دیگر برای رسیدن به مخاطبان گسترده‌تری برای حسابتان است + discoverable_no_directory: اجازه دهید که حساب‌تان از طریق پیشنهادات و سایر قابلیت‌ها، توسط افراد غریبه قابل کشف باشد email: به شما ایمیل تأییدی فرستاده خواهد شد fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد @@ -73,6 +80,8 @@ fa: no_access: انسداد دسترسی به تمامی منابع sign_up_requires_approval: ثبت‌نام‌های جدید، نیازمند تأییدتان خواهند بود severity: بگزنید با درخواست‌ها از این آی‌پی چه شود + rule: + text: قائده یا نیازمندی‌هایی را برای کاربران این کارساز تشریح کنید. سعی کنید آن را ساده و کوتاه نگاه دارید sessions: otp: 'کد تأیید دومرحله‌ای که اپ روی تلفن شما ساخته را وارد کنید یا یکی از کدهای بازیابی را به کار ببرید:' webauthn: اگر کلید USB باشد ، از اتصاڵ آن مطمئن شوید و، اگر لازم باشد، به آن ضربه‌ایی بزنید. @@ -182,7 +191,7 @@ fa: text: چرا می‌خواهید عضو شوید؟ ip_block: comment: توضیح - ip: IP + ip: آی‌پی severities: no_access: بن کردن دسترسی sign_up_requires_approval: محدود کردن ثبت نام‌ها @@ -197,6 +206,8 @@ fa: reblog: وقتی کسی نوشتهٔ شما را بازبوقید ایمیل بفرست report: وقتی گزارش تازه‌ای فرستاده شد ایمیل بفرست trending_tag: وقتی یک برچسب بازبینی‌نشده پرطرفدار شد ایمیل بفرست + rule: + text: قانون tag: listable: بگذارید که این برچسب در جستجوها و در فهرست گزیدهٔ کاربران نمایش داده شود name: برچسب diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 1b4acc9b9b..770c3e9e0d 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -3,16 +3,25 @@ fi: simple_form: hints: account_alias: - acct: Määrittele käyttäjän käyttäjänimi@verkkotunnus mistä haluat siirtyä + acct: Määrittele käyttäjän käyttäjänimi@verkkotunnus, josta haluat siirtyä account_migration: - acct: Määrittele käyttäjän käyttäjänimi@verkkotunnus mihin haluat siirtyä + acct: Määrittele käyttäjän käyttäjänimi@verkkotunnus, johon haluat siirtyä account_warning_preset: title: Vapaaehtoinen. Ei näytetä vastaanottajalle admin_account_action: - include_statuses: Käyttäjä näkee mitkä tuuttaukset johtivat toimenpiteeseen tai varoitukseen + include_statuses: Käyttäjä näkee mitkä viestit johtivat toimenpiteeseen tai varoitukseen send_email_notification: Käyttäjä saa selityksen mitä tapahtui hänen tililleen + text_html: Valinnainen. Voit käyttää julkaisun syntaksia. Voit lisätä varoitusasetuksia säästääksesi aikaa type_html: Valitse mitä teet käyttäjälle %{acct} + types: + disable: Estä käyttäjää käyttämästä tiliään, mutta älä poista tai piilota sen sisältöä. + none: Käytä tätä lähettääksesi varoituksen käyttäjälle käynnistämättä mitään muita toimintoja. + sensitive: Pakota kaikki tämän käyttäjän mediatiedostot arkaluontoisiksi. + silence: Estä käyttäjää pystymästä julkaisemaan julkisessa näkyvyydessä, piilota käyttäjän viestit ja ilmoitukset ihmisiltä, jotka eivät seuraa käyttäjää. + suspend: Estä vuorovaikutus tililtä tai tilille ja poista sen sisältö. Palautettavissa 30 päivän kuluessa. + warning_preset_id: Valinnainen. Voit silti lisätä mukautetun tekstin esiasetuksen loppuun announcement: + all_day: Kun valittu, vain valittu aikaväli näytetään scheduled_at: Jätä tyhjäksi julkaistaksesi ilmoituksen välittömästi defaults: avatar: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px @@ -27,7 +36,7 @@ fi: setting_display_media_hide_all: Piilota aina kaikki media setting_display_media_show_all: Näytä aina arkaluonteiseksi merkitty media setting_noindex: Vaikuttaa julkiseen profiiliisi ja tilasivuihisi - setting_show_application: Tuuttaamiseen käyttämäsi sovellus näkyy tuuttauksiesi yksityiskohtaisessa näkymässä + setting_show_application: Viestittelyyn käyttämäsi sovellus näkyy viestiesi yksityiskohtaisessa näkymässä setting_use_blurhash: Liukuvärit perustuvat piilotettujen kuvien väreihin, mutta sumentavat yksityiskohdat imports: data: Toisesta Mastodon-instanssista tuotu CSV-tiedosto @@ -83,7 +92,7 @@ fi: setting_default_language: Julkaisujen kieli setting_default_privacy: Julkaisun näkyvyys setting_default_sensitive: Merkitse media aina arkaluontoiseksi - setting_delete_modal: Kysy vahvistusta ennen tuuttauksen poistamista + setting_delete_modal: Kysy vahvistusta ennen viestin poistamista setting_display_media: Median näyttäminen setting_display_media_default: Oletus setting_display_media_hide_all: Piilota kaikki @@ -91,7 +100,7 @@ fi: setting_hide_network: Piilota verkkosi setting_noindex: Jättäydy pois hakukoneindeksoinnista setting_reduce_motion: Vähennä animaatioiden liikettä - setting_show_application: Näytä sovellus mistä lähetät tuuttauksia + setting_show_application: Näytä sovellus mistä lähetät viestejä setting_system_font_ui: Käytä järjestelmän oletusfonttia setting_theme: Sivuston teema setting_trends: Näytä päivän trendit @@ -126,10 +135,9 @@ fi: tag: name: Aihetunniste trendable: Salli tämän aihetunnisteen näkyä trendeissä - usable: Salli tuuttauksien käyttää tätä aihetunnistetta + usable: Salli postauksien käyttää tätä aihetunnistetta 'no': Ei recommended: Suositeltu required: - mark: "*" text: pakollinen tieto 'yes': Kyllä diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index e173dc0dc2..419f28cb9d 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -7,20 +7,26 @@ fr: account_migration: acct: Spécifiez l’identifiant@domaine du compte vers lequel vous souhaitez déménager account_warning_preset: - text: Vous pouvez utiliser la syntaxe des pouets, comme les URLs, les hashtags et les mentions + text: Vous pouvez utiliser la syntaxe des messages, comme les URL, les hashtags et les mentions title: Facultatif. Invisible pour le destinataire admin_account_action: - include_statuses: L’utilisateur·rice verra quels sont les pouets qui ont provoqué l’action de modération ou l’avertissement + include_statuses: L’utilisateur verra quels messages sont la source de l’action de modération ou de l’avertissement send_email_notification: L’utilisateur recevra une explication de ce qu’il s’est passé avec son compte - text_html: Optionnel. Vous pouvez utilisez la syntaxe des pouets. Vous pouvez ajouter des présélections d’attention pour économiser du temps + text_html: Optionnel. Vous pouvez utilisez la syntaxe des messages. Vous pouvez ajouter des modèles d’avertissement pour économiser du temps type_html: Choisir que faire avec %{acct} + types: + disable: Empêcher l’utilisateur d’utiliser son compte, mais ne pas supprimer ou masquer son contenu. + none: Utilisez ceci pour envoyer un avertissement à l’utilisateur, sans déclencher aucune autre action. + sensitive: Forcer toutes les pièces jointes de cet utilisateur à être signalées comme sensibles. + silence: Empêcher l’utilisateur de poster avec une visibilité publique, cacher ses messages et ses notifications aux personnes qui ne les suivent pas. + suspend: Empêcher toute interaction depuis ou vers ce compte et supprimer son contenu. Réversible dans les 30 jours. warning_preset_id: Optionnel. Vous pouvez toujours ajouter un texte personnalisé à la fin de la présélection announcement: all_day: Si coché, seules les dates de l’intervalle de temps seront affichées ends_at: Optionnel. L’annonce sera automatiquement dépubliée à ce moment scheduled_at: Laisser vide pour publier l’annonce immédiatement starts_at: Optionnel. Si votre annonce est liée à une période spécifique - text: Vous pouvez utiliser la syntaxe d’un pouet. Veuillez prendre en compte l’espace que l'annonce prendra sur l’écran de l'utilisateur + text: Vous pouvez utiliser la syntaxe des messages. Veuillez prendre en compte l’espace que l'annonce prendra sur l’écran de l'utilisateur defaults: autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement avatar: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px @@ -30,24 +36,25 @@ fr: current_username: Pour confirmer, veuillez saisir le nom d'utilisateur du compte courant digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence discoverable: L’annuaire des profils est une autre façon pour votre compte d’atteindre une plus grande audience + discoverable_no_directory: Permettre à des inconnu·e·s de découvrir votre compte par le biais des recommandations et autres fonctionnalités email: Vous recevrez un courriel de confirmation fields: Vous pouvez avoir jusqu’à 4 éléments affichés en tant que tableau sur votre profil header: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px inbox_url: Copiez l’URL depuis la page d’accueil du relais que vous souhaitez utiliser - irreversible: Les pouets filtrés disparaîtront irrémédiablement, même si le filtre est supprimé plus tard + irreversible: Les messages filtrés disparaîtront pour toujours, même si le filtre est supprimé plus tard locale: La langue de l’interface, des courriels et des notifications - locked: Nécessite que vous approuviez manuellement chaque abonné·e + locked: Nécessite que vous approuviez manuellement chaque abonné password: Utilisez au moins 8 caractères - phrase: Sera filtré sans que la casse ou l’avertissement sur le contenu du pouet soit pris en compte + phrase: Sera filtré peu importe la casse ou l’avertissement de contenu du message scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez une permission générale, vous n’avez pas besoin de sélectionner les permissions plus précises. - setting_aggregate_reblogs: Ne pas afficher de nouveaux partages pour les pouets qui ont été récemment partagés (n’affecte que les partages nouvellement reçus) + setting_aggregate_reblogs: Ne pas afficher les nouveaux partages pour les messages déjà récemment partagés (n’affecte que les partages futurs) setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés d’un simple clic setting_display_media_default: Masquer les médias marqués comme sensibles setting_display_media_hide_all: Toujours masquer les médias setting_display_media_show_all: Toujours montrer les médias setting_hide_network: Ceux que vous suivez et ceux qui vous suivent ne seront pas affichés sur votre profil setting_noindex: Affecte votre profil public ainsi que vos statuts - setting_show_application: Le nom de l’application que vous utilisez afin d’envoyer des pouets sera affiché dans la vue détaillée de ceux-ci + setting_show_application: Le nom de l’application que vous utilisez pour publier sera affichée dans la vue détaillée de vos messages setting_use_blurhash: Les dégradés sont basés sur les couleurs des images cachées mais n’en montrent pas les détails setting_use_pending_items: Cacher les mises à jour des fils d’actualités derrière un clic, au lieu de les afficher automatiquement username: Votre nom d’utilisateur sera unique sur %{domain} @@ -68,18 +75,20 @@ fr: ip_block: comment: Optionnel. Pour ne pas oublier pourquoi vous avez ajouté cette règle. expires_in: Les adresses IP sont une ressource finie, elles sont parfois partagées et changent souvent de mains. Pour cette raison, les blocages d’IP indéfiniment ne sont pas recommandés. - ip: Entrez une adresse IPv4 ou IPv6. Vous pouvez bloquer des plages entières en utilisant la syntaxe CIDR. Faites attention à ne pas vous bloquer vous-même ! + ip: Entrez une adresse IPv4 ou IPv6. Vous pouvez bloquer des plages entières en utilisant la syntaxe CIDR. Faites attention à ne pas vous bloquer vous-même! severities: no_access: Bloquer l’accès à toutes les ressources sign_up_requires_approval: Les nouvelles inscriptions nécessiteront votre approbation severity: Choisir ce qui se passera avec les requêtes de cette adresse IP + rule: + text: Décrivez une règle ou une exigence pour les utilisateurs sur ce serveur. Essayez de la garder courte et simple sessions: otp: 'Entrez le code d’authentification à deux facteurs généré par l’application de votre téléphone ou utilisez un de vos codes de récupération :' webauthn: Si c'est une clé USB, assurez-vous de l'insérer et, si nécessaire, de la tapoter. tag: name: Vous ne pouvez modifier que la casse des lettres, par exemple, pour le rendre plus lisible user: - chosen_languages: Lorsque coché, seuls les pouets dans les langues sélectionnées seront affichés sur les fils publics + chosen_languages: Lorsque coché, seuls les messages dans les langues sélectionnées seront affichés sur les fils publics labels: account: fields: @@ -93,7 +102,7 @@ fr: text: Texte de présélection title: Titre admin_account_action: - include_statuses: Inclure les pouets signalés dans le courriel + include_statuses: Inclure les messages signalés dans le courriel send_email_notification: Notifier l’utilisateur par courriel text: Attention personnalisée type: Action @@ -120,8 +129,8 @@ fr: context: Contextes du filtre current_password: Mot de passe actuel data: Données - discoverable: Inscrire ce compte dans l’annuaire - display_name: Nom public + discoverable: Proposer ce compte aux autres + display_name: Afficher le nom email: Adresse courriel expires_in: Expire après fields: Métadonnées du profil @@ -140,22 +149,22 @@ fr: setting_advanced_layout: Activer l’interface Web avancée setting_aggregate_reblogs: Grouper les partages dans les fils d’actualités setting_auto_play_gif: Lire automatiquement les GIFs animés - setting_boost_modal: Afficher une fenêtre de confirmation avant de partager un pouet - setting_crop_images: Recadrer les images des pouets non-dépliés en 16x9 + setting_boost_modal: Demander confirmation avant de partager un message + setting_crop_images: Recadrer en 16x9 les images des messages qui ne sont pas ouverts en vue détaillée setting_default_language: Langue de publication - setting_default_privacy: Confidentialité des statuts + setting_default_privacy: Confidentialité des messages setting_default_sensitive: Toujours marquer les médias comme sensibles - setting_delete_modal: Afficher une fenêtre de confirmation avant de supprimer un pouet + setting_delete_modal: Demander confirmation avant de supprimer un message setting_disable_swiping: Désactiver les actions par glissement setting_display_media: Affichage des médias setting_display_media_default: Défaut setting_display_media_hide_all: Masquer tout setting_display_media_show_all: Montrer tout - setting_expand_spoilers: Toujours déplier les pouets marqués d’un avertissement sur le contenu + setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu setting_hide_network: Cacher votre réseau setting_noindex: Demander aux moteurs de recherche de ne pas indexer vos informations personnelles setting_reduce_motion: Réduire la vitesse des animations - setting_show_application: Dévoiler le nom de l’application utilisée pour envoyer des pouets + setting_show_application: Dévoiler l’application utilisée pour envoyer les messages setting_system_font_ui: Utiliser la police par défaut du système setting_theme: Thème du site setting_trends: Afficher les tendances du jour @@ -189,19 +198,21 @@ fr: severity: Règle notification_emails: digest: Envoyer des courriels récapitulatifs - favourite: Quelqu’un ajoute mon pouet à ses favoris + favourite: Quelqu’un a ajouté mon message à ses favoris follow: Quelqu’un vient de me suivre follow_request: Quelqu’un demande à me suivre mention: Quelqu’un me mentionne pending_account: Nouveau compte en attente d’approbation - reblog: Quelqu’un partage mon pouet + reblog: Quelqu’un a partagé mon message report: Un nouveau rapport est envoyé trending_tag: Un hashtag non approuvé est dans les tendances + rule: + text: Règle tag: listable: Autoriser ce hashtag à apparaître dans les recherches et dans l’annuaire des profils name: Hashtag trendable: Autoriser ce hashtag à apparaitre dans les tendances - usable: Autoriser les pouets à utiliser ce hashtag + usable: Autoriser les messages à utiliser ce hashtag 'no': Non recommended: Recommandé required: diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml new file mode 100644 index 0000000000..cf124c9678 --- /dev/null +++ b/config/locales/simple_form.gd.yml @@ -0,0 +1,224 @@ +--- +gd: + simple_form: + hints: + account_alias: + acct: Sònraich ainm-cleachdaiche@àrainn dhen chunntas a tha thu airson imrich uaithe + account_migration: + acct: Sònraich ainm-cleachdaiche@àrainn dhen chunntas dhan a tha thu airson imrich + account_warning_preset: + text: "’S urrainn dhut co-chàradh puist a chleachdadh, can URLaichean, tagaichean hais is iomraidhean" + title: Roghainneil. Chan fhaic am faightear seo + admin_account_action: + include_statuses: Chì an cleachdaiche dè na postaichean a dh’adhbharaich gnìomh na maorsainneachd no an rabhadh + send_email_notification: Ghaibh am faightear mìneachadh air dè thachair leis a’ chunntas aca + text_html: Roghainneil. Faodaidh tu co-chàradh puist a chleachdadh. ’S urrainn dhut rabhaidhean ro-shuidhichte a chur ris airson ùine a chaomhnadh + type_html: Tagh dè nì thu le %{acct} + types: + disable: Bac an cleachdaiche o chleachdadh a’ chunntais aca ach na sguab às no falaich an t-susbaint aca. + none: Cleachd seo airson rabhadh a chur dhan chleachdaiche gun ghnìomh eile a ghabhail. + sensitive: Èignich comharra gu bheil e frionasach air a h-uile ceanglachan meadhain a’ chleachdaiche seo. + silence: Bac an cleachdaiche o phostadh le faicsinneachd poblach, falaich na postaichean is brathan aca o na daoine nach eil a’ leantainn air. + suspend: Bac conaltradh sam bith leis a’ chunntas seo agus sguab às an t-susbaint aige. Gabhaidh seo a neo-dhèanamh am broinn 30 latha. + warning_preset_id: Roghainneil. ’S urrainn dhut teacsa gnàthaichte a chur ri deireadh an ro-sheata fhathast + announcement: + all_day: Nuair a bhios cromag ris, cha nochd ach cinn-latha na rainse-ama + ends_at: Roghainneil. Thèid am brath-fios a neo-fhoillseachadh gu fèin-obrachail aig an àm ud + scheduled_at: Fàg seo bàn airson am brath-fios fhoillseachadh sa bhad + starts_at: Roghainnean. Cleachd seo airson am brath-fios a chuingeachadh rè ama shònraichte + text: "’S urrainn dhut co-chàradh puist a chleachdadh. Thoir an aire air am meud a chaitheas am brath-fios air sgrìn an luchd-chleachdaidh" + defaults: + autofollow: Leanaidh na daoine a chlàraicheas leis a cuireadh ort gu fèin-obrachail + avatar: PNG, GIF or JPG. %{size} air a char as motha. Thèid a sgèileadh sìos gu %{dimensions}px + bot: Comharraich do chàch gu bheil an cunntas seo ri gnìomhan fèin-obrachail gu h-àraidh is dh’fhaoidte nach doir duine sam bith sùil air idir + context: Na co-theacsaichean air am bi a’ chriathrag an sàs + current_password: A chùm tèarainteachd, cuir a-steach facal-faire a’ chunntais làithrich + current_username: Airson seo a dhearbhadh, cuir a-steach ainm-cleachdaiche a’ chunntais làithrich + digest: Cha dèid seo a chur ach nuair a bhios tu air ùine mhòr gun ghnìomh a ghabhail agus ma fhuair thu teachdaireachd phearsanta fhad ’s a bha thu air falbh + discoverable: Ceadaich gun lorg coigrich an cunntas agad le taic o mholaidhean is gleusan eile + discoverable_no_directory: Ceadaich gun lorg coigrich an cunntas agad le taic o mholaidhean is gleusan eile + email: Thèid post-d dearbhaidh a chur thugad + fields: Faodaidh tu suas ri 4 nithean a shealltainn mar chlàr air a’ phròifil agad + header: PNG, GIF or JPG. %{size} air a char as motha. Thèid a sgèileadh sìos gu %{dimensions}px + inbox_url: Dèan lethbhreac dhen URL o phrìomh-dhuilleag an ath-sheachadain a bu mhiann leat cleachdadh + irreversible: Thèid postaichean criathraichte a-mach à sealladh gu buan fiù ’s ma bheir thu a’ chriathrag air falbh uaireigin eile + locale: Cànan eadar-aghaidh a’ chleachdaiche, nam post-d ’s nam brathan putaidh + locked: Stiùirich cò dh’fhaodas leantainn ort le gabhail ri iarrtasan leantainn a làimh + password: Cleachd co-dhiù 8 caractaran + phrase: Thèid a mhaidseadh gun aire air litrichean mòra ’s beaga no air rabhadh susbainte puist + scopes: Na APIan a dh’fhaodas an aplacaid inntrigeadh. Ma thaghas tu sgòp air ìre as àirde, cha leig thu leas sgòpaichean fa leth a thaghadh. + setting_aggregate_reblogs: Na seall brosnachaidhean ùra do phostaichean a chaidh a bhrosnachadh o chionn goirid (cha doir seo buaidh ach air brosnachaidhean ùra o seo a-mach) + setting_default_sensitive: Thèid meadhanan frionasach fhalach a ghnàth is gabhaidh an nochdadh le briogadh orra + setting_display_media_default: Falaich meadhanan ris a bheil comharra gu bheil iad frionasach + setting_display_media_hide_all: Falaich na meadhanan an-còmhnaidh + setting_display_media_show_all: Seall na meadhanan an-còmhnaidh + setting_hide_network: Thèid cò a tha thu a’ leantainn orra ’s an luchd-leantainn agad fhèin a chur am falach air a’ phròifil agad + setting_noindex: Bheir seo buaidh air a’ phròifil phoblach ’s air duilleagan nam postaichean agad + setting_show_application: Chithear cò an aplacaid a chleachd thu airson post a sgrìobhadh ann an seallaidhean mionaideach nam postaichean agad + setting_use_blurhash: Tha caiseadan stèidhichte air dathan nan nithean lèirsinneach a chaidh fhalach ach chan fhaicear am mion-fhiosrachadh + setting_use_pending_items: Falaich ùrachaidhean na loidhne-ama air cùlaibh briogaidh seach a bhith a’ sgroladh an inbhir gu fèin-obrachail + username: Bidh ainm-cleachdaiche àraidh agad air %{domain} + whole_word: Mur eil ach litrichean is àireamhan san fhacal-luirg, cha dèid a chur an sàs ach ma bhios e a’ maidseadh an fhacail shlàin + domain_allow: + domain: "’S urrainn dhan àrainn seo dàta fhaighinn on fhrithealaiche seo agus thèid an dàta a thig a-steach uaithe a phròiseasadh ’s a stòradh" + email_domain_block: + domain: Gabhaidh an t-ainm àrainne a nochdas san t-seòladh puist-d a chleachdadh no an clàr MX dhan dèid an àrainn fhuasgladh no IP an fhrithealaiche dhan dèid an clàr MX fuasgladh. Thèid an dearbhadh nuair a chlàraicheas cleachdaiche ùr leinn is thèid an clàradh a dhiùltadh. + with_dns_records: Thèid oidhirp a dhèanamh air fuasgladh clàran DNS na h-àrainne a chaidh a thoirt seachad agus thèid na toraidhean a bhacadh cuideachd + featured_tag: + name: 'Mholamaid fear dhe na tagaichean seo:' + form_challenge: + current_password: Tha thu a’ tighinn a-steach gu raon tèarainte + imports: + data: Faidhle CSV a chaidh às-phortadh o fhrithealaiche Mastodon eile + invite_request: + text: Bidh e nas fhasa dhuinn lèirmheas a dhèanamh air d’ iarrtas + ip_block: + comment: Roghainneil. Cùm an cuimhne carson an do chuir thu an riaghailt seo ris. + expires_in: Tha an uiread de sheòlaidhean IP cuingichte is thèid an co-roinneadh aig amannan agus an gluasad do chuideigin eile gu tric. Air an adhbhar seo, cha mholamaid bacadh IP gun chrìoch. + ip: Cuir a-steach seòladh IPv4 no IPv6. ’S urrainn dhut rainsean gu lèir a bhacadh le co-chàradh CIDR. Thoir an aire nach gluais thu thu fhèin a-mach! + severities: + no_access: Bac inntrigeadh dha na goireasan uile + sign_up_requires_approval: Bidh cleachdaichean air an ùr-chlàradh feumach air d’ aonta + severity: Tagh na thachras le iarrtasan on IP seo + rule: + text: Mìnich riaghailt no riatanas do chleachdaichean an fhrithealaiche seo. Feuch an cùm thu sìmplidh goirid e + sessions: + otp: 'Cuir a-steach an còd dà-cheumnach a ghin aplacaid an fhòn agad no cleachd fear dhe na còdan aisig agad:' + webauthn: Mas e iuchair USB a th’ ann, dèan cinnteach gun cuir thu a-steach e is gun doir thu gnogag air ma bhios feum air sin. + tag: + name: Mar eisimpleir, ’s urrainn dhut measgachadh de litrichean mòra ’s beaga a chleachdadh ach an gabh a leughadh nas fhasa + user: + chosen_languages: Nuair a bhios cromag ris, cha nochd ach postaichean sna cànain a thagh thu air loidhnichean-ama poblach + labels: + account: + fields: + name: Leubail + value: Susbaint + account_alias: + acct: Ainm-cleachdaiche an t-seann-chunntais + account_migration: + acct: Ainm-cleachdaiche a’ chunntais ùir + account_warning_preset: + text: Teacsa ro-shocraichte + title: Tiotal + admin_account_action: + include_statuses: Gabh a-steach na postaichean a chaidh gearan a dhèanamh mun dèidhinn sa phost-d + send_email_notification: Cuir fios gun chleachdaiche air a’ phost-d + text: Rabhadh gnàthaichte + type: Gnìomh + types: + disable: Reòth + none: Cuir rabhadh + sensitive: Frionasach + silence: Crìoch + suspend: Cuir à rèim + warning_preset_id: Cleachd rabhadh ro-shuidhichte + announcement: + all_day: Tachartas fad an latha + ends_at: Deireadh an tachartais + scheduled_at: Cuir foillseachadh air an sgeideal + starts_at: Toiseach an tachartais + text: Brath-fios + defaults: + autofollow: Thoir cuireadh dhaibh airson leantainn air a’ chunntas agad + avatar: Avatar + bot: Seo cunntas bot + chosen_languages: Criathraich na cànain + confirm_new_password: Dearbh am facal-faire ùr + confirm_password: Dearbh am facal-faire + context: Co-theacsaichean na criathraige + current_password: Am facal-faire làithreach + data: Dàta + discoverable: Mol an cunntas do chàch + display_name: Ainm-taisbeanaidh + email: Seòladh puist-d + expires_in: Falbhaidh an ùine air às dèidh + fields: Meata-dàta na pròifile + header: Bann-cinn + honeypot: "%{label} (na lìon seo)" + inbox_url: URL bogsa a-steach an ath-sheachadain + irreversible: Leig seachad seach falach + locale: Cànan na h-eadar-aghaidh + locked: Iarr iarrtasan leantainn + max_uses: An àireamh as motha de chleachdaidhean + new_password: Facal-faire ùr + note: Mu mo dhèidhinn + otp_attempt: Còd dà-cheumnach + password: Facal-faire + phrase: Facal no abairt-luirg + setting_advanced_layout: Cuir an comas an eadar-aghaidh-lìn adhartach + setting_aggregate_reblogs: Buidhnich na brosnachaidhean air an loidhne-ama + setting_auto_play_gif: Cluich GIFs beòthaichte gu fèin-obrachail + setting_boost_modal: Seall còmhradh dearbhaidh mus dèan thu brosnachadh + setting_crop_images: Beàrr na dealbhan sna postaichean gun leudachadh air 16x9 + setting_default_language: Cànan postaidh + setting_default_privacy: Prìobhaideachd postaidh + setting_default_sensitive: Cuir comharra ri meadhanan an-còmhnaidh gu bheil iad frionasach + setting_delete_modal: Seall còmhradh dearbhaidh mus sguab thu às post + setting_disable_swiping: Cuir gluasadan grad-shlaighdidh à comas + setting_display_media: Sealltainn nam meadhanan + setting_display_media_default: Bun-roghainn + setting_display_media_hide_all: Falaich na h-uile + setting_display_media_show_all: Seall na h-uile + setting_expand_spoilers: Leudaich postaichean ris a bheil rabhadh susbainte an-còmhnaidh + setting_hide_network: Falaich an graf sòisealta agad + setting_noindex: Thoir air falbh an ro-aonta air inneacsadh le einnseanan-luirg + setting_reduce_motion: Ìslich an gluasad sna beòthachaidhean + setting_show_application: Foillsich dè an aplacaid a chleachdas tu airson postaichean a chur + setting_system_font_ui: Cleachd cruth-clò bunaiteach an t-siostaim + setting_theme: Ùrlar na làraich + setting_trends: Seall na treandaichean an-diugh + setting_unfollow_modal: Seall còmhradh dearbhaidh mus sguir thu de leantainn air cuideigin + setting_use_blurhash: Seall caiseadan dathte an àite meadhanan falaichte + setting_use_pending_items: Am modh slaodach + severity: Donad + sign_in_token_attempt: Còd-tèarainteachd + type: Seòrsa an ion-phortaidh + username: Ainm-cleachdaiche + username_or_email: Ainm-cleachdaiche no post-d + whole_word: Facal slàn + email_domain_block: + with_dns_records: Gabh a-steach clàran MX agus IPan na h-àrainne + featured_tag: + name: Taga hais + interactions: + must_be_follower: Mùch na brathan nach eil o luchd-leantainn + must_be_following: Mùch na brathan o dhaoine air nach lean thu + must_be_following_dm: Bac teachdaireachdan dìreach o dhaoine air nach lean thu + invite: + comment: Beachd + invite_request: + text: Carson a bu mhiann leat ballrachd fhaighinn? + ip_block: + comment: Beachd + ip: IP + severities: + no_access: Bac inntrigeadh + sign_up_requires_approval: Cuingich clàraidhean ùra + severity: Riaghailt + notification_emails: + digest: Cuir puist-d le geàrr-chunntas + favourite: Is annsa le cuideigin am post agad + follow: Lean cuideigin ort + follow_request: Dh’iarr cuideigin leantainn ort + mention: Thug cuideigin iomradh ort + pending_account: Tha cunntas ùr feumach air lèirmheas + reblog: Bhrosnaich cuideigin am post agad + report: Chaidh gearan ùr a chur a-null + trending_tag: Tha taga hais gun lèirmheas a’ treandadh + rule: + text: Riaghailt + tag: + listable: Leig leis an taga hais seo gun nochd e ann an toraidhean luirg ’s am measg nam molaidhean + name: Taga hais + trendable: Leig leis an taga hais seo gun nochd e am measg nan treandaichean + usable: Leig le postaichean an taga hais seo a chleachdadh + 'no': Chan eil + recommended: Molta + required: + mark: "*" + text: riatanach + title: + sessions: + webauthn: Cleachd tè dhe na h-iuchraichean tèarainteachd agad airson clàradh a-steach + 'yes': Tha diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 799312e338..e10067fd2b 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -7,49 +7,56 @@ gl: account_migration: acct: Indica o usuaria@servidor da conta a cal queres migrar account_warning_preset: - text: Pódeslle dar formato ao toot, como URLs, cancelos e mencións + text: Pódeslle dar formato á publicación, como URLs, cancelos e mencións title: Optativo. Non visible para a correspondente admin_account_action: - include_statuses: A usuaria verá que toots causaron a acción da moderación ou aviso + include_statuses: A usuaria verá que publicacións causaron a acción da moderación ou aviso send_email_notification: A usuaria recibirá unha explicación sobre o que lle aconteceu a súa conta - text_html: Optativo. Podes utilizar formato no toot. Podes engadir avisos preestablecidos para aforrar tempo + text_html: Optativo. Podes utilizar formato na publicación. Podes engadir avisos preestablecidos para aforrar tempo type_html: Escolle que facer con %{acct} + types: + disable: Evitar que a usuaria utilice a súa conta, mais non eliminala ou agochar o seu contido. + none: Utiliza esto para darlle un aviso á usuaria, se activar ningunha outra acción. + sensitive: Forzar que tódolos ficheiros multimedia das usuarias sexan marcadas como sensibles. + silence: Evitar que a usuaria poida publicar toots públicos, agocha os seus toots e notificacións para a xente que non a segue. + suspend: Evita calquera interacción con ou desta conta e elimina os seus contidos. Reversible durante 30 días. warning_preset_id: Optativo. Poderás engadir texto personalizado ao final do preestablecido announcement: all_day: Cando se marca, só serán amosadas as datas do intre de tempo ends_at: Opcional. O anuncio non se publicará de xeito automático neste intre scheduled_at: Déixao baleiro para publicar o anuncio de xeito inmediato starts_at: Opcional. No caso de que o teu anuncio estea vinculado a un intre de tempo específico - text: Podes empregar a sintaxe do toot. Ten en conta o espazo que ocupará o anuncio na pantalla do usuario + text: Podes empregar a sintaxe na publicación. Ten en conta o espazo que ocupará o anuncio na pantalla da usuaria defaults: autofollow: As persoas que se conectaron a través dun convite seguirante automáticamente - avatar: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px - bot: Esta conta realiza principalmente accións automatizadas e podería non estar monitorizada + avatar: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px + bot: Advirte ás usuarias de que esta conta realiza principalmente accións automatizadas e podería non estar monitorizada context: Un ou varios contextos onde se debería aplicar o filtro current_password: Por razóns de seguridade, introduce o contrasinal da conta actual current_username: Para confirmar, introduce o nome de usuaria da conta actual digest: Enviar só tras un longo período de inactividade e só se recibiches algunha mensaxe directa na tua ausencia - discoverable: O directorio de perfil é outro xeito de que a túa conta alcance unha maior audiencia + discoverable: Permite que a túa conta poida ser descuberta por persoas descoñecidas a través de recomendacións e outras ferramentas + discoverable_no_directory: Permitir que a túa conta poida ser descuberta por extrañas a través das recomendacións e outras ferramentas email: Ímosche enviar un correo de confirmación fields: Podes ter ate 4 elementos no teu perfil mostrados como unha táboa header: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px inbox_url: Copiar o URL desde a páxina de inicio do repetidor que queres utilizar - irreversible: Os toots filtrados desaparecerán de xeito irreversible, incluso se despois se elimina o filtro + irreversible: As publicacións filtradas desaparecerán de xeito irreversible, incluso se despois se elimina o filtro locale: O idioma da interface de usuaria, correos e notificacións - locked: Require que ti aceptes as seguidoras de xeito manual + locked: Xestionar manualmente quen pode seguirte aprobando as solicitudes de seguimento password: Utiliza 8 caracteres ao menos - phrase: Concordará independentemente das maiúsculas ou avisos de contido no toot + phrase: Concordará independentemente das maiúsculas ou avisos de contido na publicación scopes: A que APIs terá acceso a aplicación. Se escolles un ámbito de alto nivel, non precisas seleccionar elementos individuais. - setting_aggregate_reblogs: Non mostrar novas promocións de toots que foron promocionados recentemente (só afecta a promocións recén recibidas) + setting_aggregate_reblogs: Non mostrar novas promocións de publicacións que foron promovidas recentemente (só afecta a promocións recén recibidas) setting_default_sensitive: Medios sensibles marcados como ocultos por defecto e móstranse cun click setting_display_media_default: Ocultar medios marcados como sensibles setting_display_media_hide_all: Ocultar sempre os medios setting_display_media_show_all: Mostrar sempre os medios marcados como sensibles setting_hide_network: Non se mostrará no teu perfil quen te segue e a quen estás a seguir setting_noindex: Afecta ao teu perfil público e páxinas de estado - setting_show_application: A aplicación que estás a utilizar para enviar toots mostrarase na vista detallada do toot + setting_show_application: A aplicación que estás a utilizar para enviar publicacións mostrarase na vista detallada da publicación setting_use_blurhash: Os gradientes toman as cores da imaxe oculta pero esborranchando todos os detalles - setting_use_pending_items: Ocultar as actualizacións da liña temporal tras un click no lugar de desprazar automáticamente os comentarios + setting_use_pending_items: Agochar actualizacións da cronoloxía tras un click no lugar de desprazar automáticamente os comentarios username: O teu nome de usuaria será único en %{domain} whole_word: Se a chave ou frase de paso é só alfanumérica, só se aplicará se concorda a palabra completa domain_allow: @@ -73,13 +80,15 @@ gl: no_access: Bloquear acceso a tódolos recursos sign_up_requires_approval: Os novos rexistros requerirán a túa aprobación severity: Escolle que acontecerá coas peticións desde este IP + rule: + text: Describe unha regra ou requerimento para as usuarias deste servidor. Intenta que sexa curta e simple sessions: otp: 'Introduce o código do segundo factor creado pola aplicación do teu móbil ou usa un dos códigos de recuperación:' webauthn: Se é unha chave USB asegúrate de que está conectada e preme o botón. tag: name: Só podes cambiar maiús/minúsculas, por exemplo, mellorar a lexibilidade user: - chosen_languages: Se ten marca, só os toots nos idiomas seleccionados serán mostrados en liñas temporais públicas + chosen_languages: Se ten marca, só as publicacións nos idiomas seleccionados serán mostrados en cronoloxías públicas labels: account: fields: @@ -93,7 +102,7 @@ gl: text: Texto preestablecido title: Título admin_account_action: - include_statuses: Incluír toots denunciados no correo + include_statuses: Incluír no correo as publicacións denunciadas send_email_notification: Notificar a usuaria por correo-e text: Aviso personalizado type: Acción @@ -120,7 +129,7 @@ gl: context: Contextos do filtro current_password: Contrasinal actual data: Datos - discoverable: Incluír esta conta no directorio + discoverable: Suxerir esta conta a outras persoas display_name: Nome mostrado email: Enderezo de email expires_in: Caduca tras @@ -130,7 +139,7 @@ gl: inbox_url: URL da caixa de entrada do repetidor irreversible: Soltar en lugar de agochar locale: Idioma da interface - locked: Protexer conta + locked: Requerir aprobar seguimento max_uses: Número máximo de usos new_password: Novo contrasinal note: Acerca de ti @@ -138,24 +147,24 @@ gl: password: Contrasinal phrase: Palabra chave ou frase setting_advanced_layout: Activar interface web avanzada - setting_aggregate_reblogs: Agrupar promocións nas liñas temporais + setting_aggregate_reblogs: Agrupar promocións nas cronoloxías setting_auto_play_gif: Reprodución automática de GIFs animados setting_boost_modal: Pedir confirmación antes de promocionar - setting_crop_images: Recortar imaxes a 16x9 en toots non despregados + setting_crop_images: Recortar imaxes a 16x9 en publicacións non despregadas setting_default_language: Idioma de publicación setting_default_privacy: Privacidade da publicación setting_default_sensitive: Marcar sempre multimedia como sensible - setting_delete_modal: Solicitar confirmación antes de eliminar unha mensaxe + setting_delete_modal: Solicitar confirmación antes de eliminar unha publicación setting_disable_swiping: Desactivar opcións de desprazamento setting_display_media: Mostrar multimedia setting_display_media_default: Por omisión setting_display_media_hide_all: Ocultar todo setting_display_media_show_all: Mostrar todo - setting_expand_spoilers: Despregar sempre as mensaxes marcadas con avisos de contido + setting_expand_spoilers: Despregar sempre as publicacións marcadas con avisos de contido setting_hide_network: Non mostrar contactos setting_noindex: Pedir non aparecer nas buscas dos motores de busca setting_reduce_motion: Reducir o movemento nas animacións - setting_show_application: Mostrar a aplicación utilizada para tootear + setting_show_application: Mostrar a aplicación utilizada para publicar setting_system_font_ui: Utilizar a tipografía por defecto do sistema setting_theme: Decorado da instancia setting_trends: Mostrar as tendencias de hoxe @@ -197,11 +206,13 @@ gl: reblog: Enviar un correo cando alguén promociona a tua mensaxe report: Enviar un correo cando se envíe unha denuncia trending_tag: Un cancelo ser revisar está sendo tendencia + rule: + text: Regra tag: listable: Permitir que este cancelo apareza en buscas e no directorio de perfil name: Cancelo trendable: Permitir que este cancelo apareza en tendencias - usable: Permitir que os toots utilicen este cancelo + usable: Permitir que as publicacións utilicen este cancelo 'no': Non recommended: Recomendado required: diff --git a/config/locales/simple_form.hr.yml b/config/locales/simple_form.hr.yml index e8ef7bfbba..b45c2f3574 100644 --- a/config/locales/simple_form.hr.yml +++ b/config/locales/simple_form.hr.yml @@ -48,10 +48,7 @@ hr: follow_request: Netko zatraži da Vas prati mention: Netko Vas spomene reblog: Netko boosta Vaš status - tag: - name: Hashtag 'no': Ne required: - mark: "*" text: obavezno 'yes': Da diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index d5e82ecb26..b328ea2670 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -3,24 +3,30 @@ hu: simple_form: hints: account_alias: - acct: Adjad meg annak a fióknak a felhasználóneve@domainjét, ahonnan át szeretnéd mozgatni + acct: Add meg annak a fióknak a felhasználónév@domain párosát, ahonnan át szeretnéd mozgatni account_migration: acct: Add meg a fióknév@domain fiókot, melybe költözni szeretnél account_warning_preset: - text: Használhatod a tülkökben szokásos szintaxist, URL-eket, hashtageket, megemlítéseket + text: Használhatod a bejegyzésekben szokásos szintaxist, URL-eket, hashtageket, megemlítéseket title: Opcionális. Címzett számára nem látható admin_account_action: - include_statuses: A felhasználó látni fogja, melyik tülk okozta a moderációt vagy figyelmeztetést + include_statuses: A felhasználó látni fogja, melyik bejegyzés okozta a moderációs műveletet vagy figyelmeztetést send_email_notification: A felhasználó magyarázatot kap arra, mi történt a fiókjával - text_html: Opcionális. A tülk szintaxis használható. Egyszerűsítés végett létre is hozhatsz figyelmeztetéseket + text_html: Opcionális. A bejegyzések szintaxisa használható. Időmegtakarítás végett létre is hozhatsz figyelmeztetéseket type_html: Megmondhatod, mi legyen vele %{acct} + types: + disable: A felhasználó nem fogja tudni használni a fiókját, de ettől még nem töröljük azt vagy rejtjük el a tartalmait. + none: Ezt használd ahhoz, hogy a felhasználónak figyelmeztetést küldj bármilyen más következmény nélkül. + sensitive: Ennek a felhasználónak minden médiatartalmát jelöljük meg kényesként. + silence: Megakadályozzuk, hogy ez a felhasználó nyilvános láthatóságú bejegyzést tegyen közzé, elrejtjük a bejegyzéseit és a róla szóló értesítéseket azok elől, akik nem közvetlen követői. + suspend: Minden interakciót megakadályozunk ezzel a fiókkal és töröljük a tartalmát. 30 napon belül még visszacsinálható. warning_preset_id: Opcionális. A figyelmeztetés végére saját szöveget is írhatsz announcement: all_day: Bejelölve csak a dátumok számítanak majd a megadott intervallumból ends_at: Opcionális. A közleményt ekkor automatikusan levesszük scheduled_at: Hagyd üresen, hogy a közleményt azonnal közzétegyük starts_at: Opcionális. Akkor használd, ha a közleményed adott időintervallumra vonatkozik - text: Használhatod a tülkök szintaxisát. Ügyelj arra, mennyi helyet foglal el majd a közlemény a felhasználó képernyőjén + text: Használhatod a bejegyzések szintaxisát. Ügyelj arra, hogy mennyi helyet foglal el majd a közlemény a felhasználó képernyőjén defaults: autofollow: Akik meghívón keresztül regisztrálnak, automatikusan követni fognak téged avatar: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre @@ -30,24 +36,25 @@ hu: current_username: A jóváhagyáshoz írd be a jelenlegi fiók felhasználói nevét digest: Csak hosszú távollét esetén küldődik és csak ha személyes üzenetet kaptál távollétedben discoverable: A profil adatbázis egy újabb mód, ahogyan a fiókod szélesebb tömegeket érhet el + discoverable_no_directory: Engedélyezzük, hogy a fiókod idegenek által megtalálható legyen javaslatokon és más funkciókon keresztül email: Kapsz egy megerősítő e-mailt fields: A profilodon legfeljebb 4 bejegyzés szerepelhet táblázatos formában header: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre inbox_url: Másold ki a használandó relé szerver kezdőoldalának URL-jét - irreversible: A kiszűrt tülkök visszafordíthatatlanul eltűnnek, a szűrő későbbi törlése esetén is + irreversible: A kiszűrt bejegyzések visszafordíthatatlanul eltűnnek, a szűrő későbbi törlése esetén is locale: A felhasználói felület, e-mailek, push üzenetek nyelve locked: Egyenként engedélyezned kell a követőidet password: Legalább 8 karakter phrase: Illeszkedni fog kis/nagybetű függetlenül, és tartalom-figyelmeztetések mögött is scopes: Mely API-kat érheti el az alkalmazás. Ha felső szintű hatáskört választasz, nem kell egyesével kiválasztanod az alatta lévőeket. - setting_aggregate_reblogs: Ne mutassunk megtolásokat olyan tülkökhöz, melyeket nemrég toltak meg (csak új megtolásokra lép életbe) - setting_default_sensitive: A szenzitív médiát alapesetben elrejtjük, de egyetlen kattintással előhozható - setting_display_media_default: Szenzitív tartalomként jelölt média elrejtése + setting_aggregate_reblogs: Ne mutassunk megtolásokat olyan bejegyzésekhez, melyeket nemrég toltak meg (csak új megtolásokra lép életbe) + setting_default_sensitive: A kényes médiatartalmat alapesetben elrejtjük, de egyetlen kattintással előhozható + setting_display_media_default: Kényes tartalomnak jelölt média elrejtése setting_display_media_hide_all: Mindig minden média elrejtése setting_display_media_show_all: Mindig mutasd a szenzitív tartalomként jelölt médiát setting_hide_network: Nem látszik majd a profilodon, kik követnek és te kiket követsz - setting_noindex: A nyilvános profilodra és a tülkjeidre vonatkozik - setting_show_application: A tülkök részletes nézetében látszani fog, milyen alkalmazást használtál a tülköléshez + setting_noindex: A nyilvános profilodra és a bejegyzéseidre vonatkozik + setting_show_application: A bejegyzések részletes nézetében látszani fog, milyen alkalmazást használtál a bejegyzés közzétételéhez setting_use_blurhash: A kihomályosítás az eredeti képből történik, de minden részletet elrejt setting_use_pending_items: Idővonal frissítése csak kattintásra automatikus görgetés helyett username: A felhasználói neved egyedi lesz a %{domain} domainen @@ -73,13 +80,15 @@ hu: no_access: Elérés tiltása minden erőforráshoz sign_up_requires_approval: Új regisztrációk csak a jóváhagyásoddal történhetnek majd meg severity: Válaszd ki, mi történjen a kérésekkel erről az IP-ről + rule: + text: Írd le, mi a szabály vagy elvárás ezen a szerveren a felhasználók felé. Próbálj röviden, egyszerűen fogalmazni sessions: otp: 'Add meg a telefonodon generált kétlépcsős azonosító kódodat vagy használd az egyik tartalék bejelentkező kódot:' webauthn: Ha ez egy USB kulcs, ellenőrizd, hogy csatlakoztattad és ha szükséges, aktiváltad is. tag: name: Csak a kis/nagybetűséget változtathatod meg, pl. hogy olvashatóbb legyen user: - chosen_languages: Ha aktív, csak a kiválasztott nyelvű tülkök jelennek majd meg a nyilvános idővonalon + chosen_languages: Ha aktív, csak a kiválasztott nyelvű bejegyzések jelennek majd meg a nyilvános idővonalon labels: account: fields: @@ -93,14 +102,14 @@ hu: text: Figyelmeztető szöveg title: Cím admin_account_action: - include_statuses: Helyezd az e-mailbe a jelentett tülköket + include_statuses: Tedd az e-mailbe a bejelentett bejegyzéseket send_email_notification: Figyelmeztessük a felhasználót e-mailben text: Egyedi figyelmeztetés type: Művelet types: disable: Letiltás none: Ne csinálj semmit - sensitive: Szenzitív + sensitive: Kényes silence: Elnémítás suspend: Fiók felfüggesztése, adatok törlése visszaállíthatatlanul warning_preset_id: Figyelmeztetés használata @@ -141,21 +150,21 @@ hu: setting_aggregate_reblogs: Megtolások csoportosítása az idővonalakon setting_auto_play_gif: GIF-ek automatikus lejátszása setting_boost_modal: Megerősítés kérése megtolás előtt - setting_crop_images: Képek 16x9-re vágása nem kinyitott tülköknél - setting_default_language: Tülkölés nyelve - setting_default_privacy: Tülkök alapértelmezett láthatósága - setting_default_sensitive: Minden médiafájl megjelölése szenzitívként - setting_delete_modal: Megerősítés kérése tülk törlése előtt + setting_crop_images: Képek 16x9-re vágása nem kinyitott bejegyzéseknél + setting_default_language: Bejegyzések nyelve + setting_default_privacy: Bejegyzések láthatósága + setting_default_sensitive: Minden médiafájl megjelölése kényesként + setting_delete_modal: Megerősítés kérése bejegyzés törlése előtt setting_disable_swiping: Elhúzás művelet kikapcsolása setting_display_media: Média megjelenítése setting_display_media_default: Alapértelmezés setting_display_media_hide_all: Mindent elrejt setting_display_media_show_all: Mindent mutat - setting_expand_spoilers: Tartalom figyelmeztetéssel ellátott tülkök automatikus kinyitása + setting_expand_spoilers: Tartalom figyelmeztetéssel ellátott bejegyzések automatikus kinyitása setting_hide_network: Hálózatod elrejtése - setting_noindex: Megtiltom a keresőmotoroknak, hogy indexeljék a tülkjeimet + setting_noindex: Megtiltom a keresőmotoroknak, hogy indexeljék a tartalmaimat setting_reduce_motion: Animációk mozgásának csökkentése - setting_show_application: A tülkölésre használt alkalmazás feltüntetése + setting_show_application: Bejegyzések küldésére használt alkalmazás feltüntetése setting_system_font_ui: Rendszer betűtípusának használata setting_theme: Megjelenítési sablon setting_trends: Mai trend mutatása @@ -189,19 +198,21 @@ hu: severity: Szabály notification_emails: digest: Összevont e-mailek küldése - favourite: E-mail küldése, amikor valaki kedvencnek jelöli a tülködet + favourite: Valaki kedvencnek jelölte a bejegyzésedet follow: E-mail küldése, amikor valaki követni kezd téged follow_request: E-mail küldése, amikor valaki követni szeretne téged mention: E-mail küldése, amikor valaki megemlít téged pending_account: E-mail küldése, ha új fiókot kell engedélyezni - reblog: E-mail küldése, amikor valaki megtolja a tülködet + reblog: Valaki megtolta a bejegyzésedet report: E-mail küldése, ha új bejelentés érkezett trending_tag: E-mail küldése, ha egy még nem látott hashtag trendi lett + rule: + text: Szabály tag: listable: A hashtag megjelenhet a profiladatbázisban name: Hashtag trendable: A hashtag megjelenhet a trendek között - usable: Tülkök használhatják ezt a hashtaget + usable: Bejegyzések használhatják ezt a hashtaget 'no': Nem recommended: Ajánlott required: diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index ff4bfcaab7..d468032ab4 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -7,12 +7,12 @@ hy: account_migration: acct: նշէք նոր հաշուի օգտանուն@տիրոյթը account_warning_preset: - text: կարող էք օգտագործել թթելու ձեւերն, ինչպիսին էն URL֊ներ, պիտակներ եւ նշումներ + text: Գրառումներում կարող էք օգտագործել URL֊ներ, պիտակներ եւ նշումներ title: պարտադիր չէ։ չի երեւալու ստացողին։ admin_account_action: - include_statuses: օգտատէրը տեսնելու ա որ թթերն են առաջացրել մոդերացիայի գործողութիւն կամ զգուշացում։ + include_statuses: Օգտատէրը կը տեսնի, թե որ գրառումներն են առաջացրել մոդերացիայի գործողութիւն կամ զգուշացում։ send_email_notification: օգտատէրը կը ստանայ բացատրութիւն այն մասին թէ ինչ է պատահել իրենց հաշուի հետ։ - text_html: Պայմանական․ Դու կարող ես օգտագործել Թութի շարադասութիւնը։ Կարող ես օգտագործել աւելացնել զգուշացնող նախադիրներ ժամանակ խնայելու համար + text_html: Պայմանական․ Դու կարող ես օգտագործել գրառման շարադասութիւնը։ Կարող ես օգտագործել աւելացնել զգուշացնող նախդիրներ ժամանակ խնայելու համար type_html: Ընտրիր ինչ անել %{acct}ի հետ։ warning_preset_id: Պայմանական․ Կարող ես աւելացնել տեքստ նախդիրի վերջում announcement: @@ -20,7 +20,7 @@ hy: ends_at: Պայմանական․ Յայտարարութիւնն աւտօմատ կը հանուի այս ժամին scheduled_at: Եթէ դատարկ թողնես յայտարարութիւնը միանգամից կը հրապարակուի starts_at: Պայմանական․ այն դէպքում, երբ յայտարարութիւնդ սահմանափակուած է յստակ ժամանակացոյցով - text: Կարող ես օգտագործել թթի շարադասութիւնը։ Խնդրում ենք, եղիր խելամիտ յայտարարութեան տարածքն օգտագործելիս, այն յայտնուելու է օգտատիրոջ էկրանին + text: Կարող ես օգտագործել գրառման առանձնայատկութիւնը։ Խնդրում ենք, լինել խելամիտ յայտարարութեան տարածքն օգտագործելիս, այն յայտնուելու է օգտատիրոջ էկրանին defaults: autofollow: Հրաւէրի միջոցով գրանցուող մարդիկ կը հետեւեն քեզ avatar: PNG, GIF կամ JPG։ Առաւելագոյնը՝ %{size}։ Կը փոքրացուի մինչեւ %{dimensions} @@ -34,20 +34,20 @@ hy: fields: Կարող ես ունենալ մինչեւ 4 կէտ հաշուիդ աղիւսակում ցուցադրելու header: PNG, GIF կամ JPG։ Առաւելագոյնը՝ %{size}։ Կը փոքրացուի մինչեւ %{dimensions} inbox_url: Պատճէնիր URL այն շերտի դիմերեսից, որը ցանկանում ես օգտագործել - irreversible: Զտուած թթերը կորչելու են անդառնալիօրէն, նոյնիսկ եթէ զտիչը յետոյ հեռացնես + irreversible: Զտուած գրառումները կորչելու են անդառնալիօրէն, նոյնիսկ եթէ զտիչը յետոյ հեռացնես locale: Ինտերֆեյսի լեզուն, էլ. նամակները եւ push ծանուցումները locked: Անհրաժեշտ կը լինի ձեռքով հաստատել հետեւորդներին password: Օգտագործիր առնուազն 8 նիշ - phrase: Կը համընկնի անկախ տեքստի ձեւից կամ թթի զգուշացնող բովանդակութիւնից + phrase: Կը համընկնի անկախ տեքստի ձեւից կամ զգուշացնող բովանդակութիւնից scopes: Որ API֊ին յաւելուածն ունի հասանելիութիւն։ Եթէ ընտրել ես բարձր մակարդակի դաշտ, ապա անհատական ընտրելու կարիք չկայ։ - setting_aggregate_reblogs: Չցուցադրել տարածումներն այն թթերի համար, որոնք քիչ առաջ արդէն տարածուել են(վերաբերում է միայն վերջին տարածումներին) + setting_aggregate_reblogs: Չցուցադրել տարածումներն այն գրառումների համար, որոնք քիչ առաջ արդէն տարածուել են (վերաբերում է միայն վերջին տարածումներին) setting_default_sensitive: Կասկածելի բովանդակութիւնը լռելեայն փակ է եւ կարող է բացուել սեղմելով setting_display_media_default: Թաքցնել կասկածելի բովանդակութիւնը setting_display_media_hide_all: Երբեք մեդիա ցոյց չտալ setting_display_media_show_all: Մեդիա միշտ ցոյց տալ setting_hide_network: Ուրիշները չեն կարողանայ տեսնել ձեզ հետեւողներին եւ թե ում էք հետեւում դուք setting_noindex: Ազդում է քո հրապարակային հաշուի եւ գրառումների էջի վրայ - setting_show_application: Թութ մանրամասներում կերեւայ թէ որ ծրագրով ես հրապարակել այն + setting_show_application: Գրառման մանրամասներում կերեւայ թէ որ ծրագրով ես հրապարակել այն setting_use_blurhash: Կտորները հիմնուում են թաքցուած վիզուալի վրայ՝ խամրեցնելով դետալները setting_use_pending_items: Թաքցնել հոսքի թարմացումները կտտոի ետեւում՝ աւտօմատ թարմացուող հոսքի փոխարէն username: Քո օգտանունը պէտք է եզակի լինի %{domain}-ում։ @@ -79,7 +79,7 @@ hy: tag: name: Կարող ես միայն փոխել տառերի ձեւը, օրինակ, այն աւելի ընթեռնելի դարձնելու համար user: - chosen_languages: Նշուած ժամանակ հոսքում կերեւայ միայն ընտրուած լեզուով թութերը + chosen_languages: Նշուած ժամանակ, հոսքում կերեւայ միայն ընտրուած լեզուով գրառումները labels: account: fields: @@ -93,7 +93,7 @@ hy: text: Նախադրուած տեքստ title: Վերնագիր admin_account_action: - include_statuses: Ներառել բողոքարկուած թթերը իմակում + include_statuses: Ներառել բողոքարկուած գրառումները իմակում send_email_notification: Տեղեկացնել օգտատիրոջը իմակի միջոցով text: Նախազգուշացում type: Գործողություն @@ -141,7 +141,7 @@ hy: setting_aggregate_reblogs: Տարծածները խմբաւորել հոսքում setting_auto_play_gif: Աւտոմատ մեկնարկել GIFs անիմացիաները setting_boost_modal: Ցուցադրել հաստատման պատուհանը տարածելուց առաջ - setting_crop_images: Ցոյց տալ թութի նկարը 16x9 համամասնութեամբ + setting_crop_images: Ցոյց տալ գրառման նկարը 16x9 համամասնութեամբ setting_default_language: Հրապարակման լեզու setting_default_privacy: Հրապարակման գաղտնիութիւն setting_default_sensitive: Միշտ նշել մեդիան որպէս դիւրազգաց @@ -151,11 +151,11 @@ hy: setting_display_media_default: Լռելեայն setting_display_media_hide_all: Թաքցնել բոլորը setting_display_media_show_all: Ցուցադրել բոլորը - setting_expand_spoilers: Միշտ բացել բովանդակութեան զգուշացմամբ թթերը + setting_expand_spoilers: Միշտ բացել բովանդակութեան զգուշացմամբ գրառումները setting_hide_network: Թաքցնել ցանցդ setting_noindex: Խուսափել որոնողական համակարգերի ինդէքսաւորումից setting_reduce_motion: Կրճատել անիմացիաների շարժումը - setting_show_application: Բացայայտել յաւելուած, որն օգտագործուում է թթելու համար + setting_show_application: Բացայայտել գրառման համար օգտագործուած յաւելուածը setting_system_font_ui: Օգտագործել համակարգի լռելեայն տառատեսակը setting_theme: Կայքի թեման setting_trends: Ցուցադրել օրուայ թրենդները @@ -194,14 +194,16 @@ hy: follow_request: Որեւէ մէկը քեզ հետեւելու հայց է ուղարկել mention: Որեւէ մեկը նշեց քեզ pending_account: Վերանայման կարիք ունեցող նոր հաշիւ - reblog: Ինչ֊որ մէկը թութդ տարածեց + reblog: Ինչ֊որ մէկը գրառումդ տարածեց report: Նոր բողոք է ուղարկուել trending_tag: Չվերանայուած պիտակը թրենդի մէջ է + rule: + text: Կանոն tag: listable: Թոյլատրել, որ այս պիտակը յայտնուի որոնումների եւ հաշուի մատեանում name: Պիտակ trendable: Թոյլատրել, որ այս պիտակը յայտնուի թրենդներում - usable: Թոյլատրել թթերին օգտագործել այս պիտակը + usable: Թոյլատրել գրառումներին օգտագործել այս պիտակը 'no': Ոչ recommended: Խորհուրդ է տրվում required: diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 4b469cd936..8d870dc619 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -14,6 +14,12 @@ id: send_email_notification: Pengguna akan menerima penjelasan tentang apa yang terjadi pada akun mereka text_html: Opsional. Anda dapat memakai sintaks toot. Anda dapat menambahkan preset peringatan untuk hemat waktu type_html: Pilih apa yang perlu dilakukan dengan %{acct} + types: + disable: Cegah pengguna menggunakan akun mereka, tetapi jangan menghapus atau menyembunyikan konten mereka. + none: Gunakan ini untuk mengirim peringatan kepada pengguna, tanpa memicu tindakan lainnya. + sensitive: Paksa semua lampiran media pengguna sebagai sensitif. + silence: Cegah pengguna agar tidak dapat memposting dengan visibilitas publik, sembunyikan postingan dan notifikasi mereka dari orang yang tidak mengikuti mereka. + suspend: Cegah interaksi apapun dari/ke akun ini dan hapus kontennya. Dapat dikembalikan selama 30 hari. warning_preset_id: Opsional. Anda tetap dapat menambahkan teks kustom pada akhir preset announcement: all_day: Saat dicentang, hanya tanggal dalam rentang waktu tertentu yang akan ditampilkan @@ -30,12 +36,13 @@ id: current_username: Untuk konfirmasi, mohon masukkan nama pengguna akun ini digest: Hanya kirim setelah lama tidak aktif dan hanya jika Anda menerima pesan personal atas absensi Anda discoverable: Direktori profil adalah cara lain agar akun Anda menyentuh audiens yang lebih luas - email: Anda akan dikirimi surel konfirmasi + discoverable_no_directory: Izinkan akun Anda ditemukan orang lain lewat rekomendasi dan fitur lain + email: Anda akan dikirimi email konfirmasi fields: Anda bisa memiliki hingga 4 item utk ditampilkan sebagai tabel di profil Anda header: PNG, GIF atau JPG. Maksimal %{size}. Ukuran dikecilkan menjadi %{dimensions}px inbox_url: Salin URL dari halaman depan relai yang ingin Anda pakai irreversible: Toot tersaring akan hilang permanen bahkan jika saringan dihapus kemudian - locale: Bahasa antar muka pengguna, surel, dan notifikasi dorong + locale: Bahasa antar muka pengguna, email, dan notifikasi dorong locked: Anda harus menerima permintaan pengikut secara manual dan setting privasi postingan akan diubah khusus untuk pengikut password: Gunakan minimal 8 karakter phrase: Akan dicocokkan terlepas dari luaran dalam teks atau peringatan konten dari toot @@ -55,7 +62,7 @@ id: domain_allow: domain: Domain ini dapat mengambil data dari server ini dan data yang diterima akan diproses dan disimpan email_domain_block: - domain: Ini bisa nama domain yang muncul di alamat surel, data MX yang sedang diselesaikan oleh domain, atau IP server yang dipecahkan oleh data MX. Mereka akan dicek saat pendaftaran pengguna dan pendaftaran akan ditolak. + domain: Ini bisa nama domain yang muncul di alamat email, data MX yang sedang diselesaikan oleh domain, atau IP server yang dipecahkan oleh data MX. Mereka akan dicek saat pendaftaran pengguna dan pendaftaran akan ditolak. with_dns_records: Usaha untuk menyelesaikan data DNS domain yang diberikan akan dilakukan dan hasilnya akan masuk daftar hitam featured_tag: name: 'Anda mungkin ingin pakai salah satu dari ini:' @@ -73,6 +80,8 @@ id: no_access: Blokir akses ke seluruh sumber daya sign_up_requires_approval: Pendaftaran baru memerlukan persetujuan Anda severity: Pilih apa yang akan dilakukan dengan permintaan dari IP ini + rule: + text: Jelaskan aturan atau persyaratan untuk pengguna di server ini. Buatlah pendek dan sederhana sessions: otp: Masukkan kode dua-faktor dari handphone atau gunakan kode pemulihan anda. webauthn: Jika ini kunci USB pastikan dalam keadaan tercolok dan, jika perlu, ketuk. @@ -93,8 +102,8 @@ id: text: Teks preset title: Judul admin_account_action: - include_statuses: Sertakan toot terlapor pada surel - send_email_notification: Beritahu pengguna per surel + include_statuses: Sertakan kiriman yang dilaporkan pada email + send_email_notification: Beri tahu pengguna per email text: Peringatan kustom type: Aksi types: @@ -166,7 +175,7 @@ id: sign_in_token_attempt: Kode keamanan type: Tipe impor username: Nama pengguna - username_or_email: Nama pengguna atau Surel + username_or_email: Nama pengguna atau Email whole_word: Seluruh kata email_domain_block: with_dns_records: Termasuk data MX dan IP domain @@ -193,10 +202,12 @@ id: follow: Kirim email saat seseorang mengikuti anda follow_request: Kirim email saat seseorang meminta untuk mengikuti anda mention: Kirim email saat seseorang menyebut anda - pending_account: Kirim surel ketika akun baru perlu ditinjau + pending_account: Kirim email ketika akun baru perlu ditinjau reblog: Kirim email saat seseorang mem-boost status anda - report: Kirim surel ketika laporan baru dikirim - trending_tag: Kirim surel ketika tagar tak tertinjau jadi tren + report: Kirim email ketika laporan baru dikirim + trending_tag: Kirim email ketika tagar tak tertinjau jadi tren + rule: + text: Aturan tag: listable: Izinkan tagar ini muncul di penelusuran dan di direktori profil name: Tagar diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 53e34f00cb..c10fe28b1c 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -14,6 +14,12 @@ is: send_email_notification: Notandinn mun fá útskýringar á því hvað gerðist með notandaaðganginn hans text_html: Valfrjálst. Þú getur notað sömu skilgreiningar og fyrir tíst. Þú getur bætt inn forstilltum aðvörunum til að spara tíma type_html: Veldu hvað eigi að gera við %{acct} + types: + disable: Koma í veg fyrir að notandinn noti aðganginn sinn, en ekki eyða eða fela efnið þeirra. + none: Nota þetta til að senda aðvörun til notandans, án þess að setja neina aðra aðgerð í gang. + sensitive: Þvinga fram að öll myndefnisviðhengi þessa notanda verði flögguð sem viðkvæmt efni. + silence: Koma í veg fyrir að notandinn geti birt færslur opinberlega, fela færslur þeirra og tilkynningar fyrir fólki sem ekki er að fylgjast með notandanum. + suspend: Koma í veg fyrir öll samskipti til eða frá þessum aðgangi og eyða öllu efni hans. Afturkallanlegt innan 30 daga. warning_preset_id: Valkvætt. Þú getur ennþá bætt sérsniðnum texta við enda forstillinga announcement: all_day: Þegar merkt er við þetta, munu einungis birtast dagsetningar tímarammans @@ -30,6 +36,7 @@ is: current_username: Til að staðfesta skaltu setja inn notandanafnið fyrir þennan notandaaðgang digest: Er aðeins sent eftir lengri tímabil án virkni og þá aðeins ef þú hefur fengið persónuleg skilaboð á meðan þú hefur ekki verið á línunni discoverable: Persónusniðamappan er önnur leið til að láta notandaaðganginn þinn ná til fleiri lesenda + discoverable_no_directory: Gerðu öðrum kleift að finna aðganginn þinn í gegnum meðmæli og annað slíkt email: Þú munt fá sendan staðfestingarpóst fields: Þú getur birt allt að 4 atriði sem töflu á notandasniðinu þínu header: PNG, GIF eða JPG. Mest %{size}. Verður smækkað í %{dimensions}px @@ -73,6 +80,8 @@ is: no_access: Loka á aðgang að öllum tilföngum sign_up_requires_approval: Nýskráningar munu þurfa samþykki þitt severity: Veldu hvað munir gerast við beiðnir frá þessu IP-vistfangi + rule: + text: Lýstu reglum eða kröfum sem gerðar eru til notenda á þessum netþjóni. Reyndu að hafa þetta skýrt og skorinort sessions: otp: 'Settu inn tveggja-þátta kóðann sem farsímaforritið útbjó eða notaðu einn af endurheimtukóðunum þínum:' webauthn: Ef þetta er USB-lykill, gakktu úr skugga um að honum sé stungið í samband og ef þörf þykir að ýta á hann. @@ -197,6 +206,8 @@ is: reblog: Einhver endurbirti stöðufærslu þína report: Ný kæra hefur verið send inn trending_tag: Óyfirfarið myllumerki er í umræðunni + rule: + text: Regla tag: listable: Leyfa þessu myllumerki að birtast í leitum og í persónusniðamöppunni name: Myllumerki diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 82f12861f4..147a5eea4a 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -14,6 +14,12 @@ it: send_email_notification: L'utente riceverà una spiegazione di ciò che è successo con suo account text_html: Opzionale. Puoi usare la sintassi dei toot. Puoi aggiungere avvisi preimpostati per risparmiare tempo type_html: Decidi cosa fare con %{acct} + types: + disable: Impedisce all'utente di utilizzare il suo account, ma non elimina o nasconde i suoi contenuti. + none: Usa questo per inviare un avviso all'utente, senza eseguire altre azioni. + sensitive: Forza tutti gli allegati multimediali di questo utente ad essere contrassegnati come sensibili. + silence: Impedisce all'utente di poter pubblicare con visibilità pubblica, nasconde i suoi post e notifiche a persone che non lo seguono. + suspend: Impedisce qualsiasi interazione da o per questo account ed elimina i suoi contenuti. Annullabile entro 30 giorni. warning_preset_id: Opzionale. Puoi aggiungere un testo personalizzato alla fine di quello preimpostato announcement: all_day: Se selezionato, verranno visualizzate solo le date dell'intervallo di tempo @@ -30,6 +36,7 @@ it: current_username: Per confermare, inserisci il nome utente dell'account attuale digest: Inviata solo dopo un lungo periodo di inattività e solo se hai ricevuto qualche messaggio personale in tua assenza discoverable: La directory dei profili è un altro modo in cui il tuo account può raggiungere un pubblico più ampio + discoverable_no_directory: Consenti al tuo profilo di esser scoperto da sconosciuti tramite consigli e altre funzionalità email: Ti manderemo una email di conferma fields: Puoi avere fino a 4 voci visualizzate come una tabella sul tuo profilo header: PNG, GIF o JPG. Al massimo %{size}. Verranno scalate a %{dimensions}px @@ -73,6 +80,8 @@ it: no_access: Blocca l'accesso a tutte le risorse sign_up_requires_approval: Le nuove iscrizioni richiederanno la tua approvazione severity: Scegli cosa accadrà con le richieste da questo IP + rule: + text: Descrivi una regola o un requisito per gli utenti su questo server. Prova a mantenerla breve e semplice sessions: otp: 'Inserisci il codice a due fattori generato dall''app del tuo telefono o usa uno dei codici di recupero:' webauthn: Se si tratta di una chiavetta USB assicurati di inserirla e, se necessario, toccarla. @@ -119,7 +128,7 @@ it: confirm_password: Conferma password context: Contesti del filtro current_password: Password corrente - data: Data + data: Dati discoverable: Inserisci questo account nella directory display_name: Nome visualizzato email: Indirizzo email @@ -197,6 +206,8 @@ it: reblog: Invia email quando qualcuno condivide un tuo toot report: Manda una mail quando viene inviato un nuovo rapporto trending_tag: Invia e-mail quando un hashtag non controllato è in tendenza + rule: + text: Regola tag: listable: Permetti a questo hashtag di apparire nella directory dei profili name: Hashtag diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index abe986acd4..4c4133bafe 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -10,17 +10,23 @@ ja: text: URL、ハッシュタグ、メンションなど、投稿に用いる構文が使用できます title: オプションです。受信者には表示されません。 admin_account_action: - include_statuses: ユーザーは取られた制限や警告の原因となったトゥートを確認できるようになります + include_statuses: ユーザーは取られた制限や警告の原因となった投稿を確認できるようになります send_email_notification: ユーザーは自分のアカウントに何が起こったのか説明を受け取ります text_html: オプションです。投稿に用いる構文を使うことができます。簡略化のためプリセット警告文を追加することができます type_html: "%{acct}さんに対し、何を行うか選択してください" + types: + disable: ユーザーが自分のアカウントを使用できないようにします。コンテンツを削除したり非表示にすることはありません。 + none: これを使用すると、他の操作をせずにユーザーに警告を送信できます。 + sensitive: このユーザーが添付したメディアを強制的に閲覧注意にする + silence: ユーザーが公開投稿できないようにし、フォローしていない人に投稿や通知が表示されないようにする。 + suspend: このアカウントとのやりとりを止め、コンテンツを削除します。30日以内は取消可能です。 warning_preset_id: オプションです。プリセット警告文の末尾に任意の文字列を追加することができます announcement: all_day: 有効化すると、対象期間の箇所に日付だけが表示されます ends_at: オプションです。指定すると、お知らせの掲載はその日時で自動的に終了します scheduled_at: お知らせを今すぐ掲載する場合は空欄にしてください starts_at: オプションです。お知らせしたい事柄の期間が決まっている場合に使用します - text: トゥートと同じ構文を使用できます。アナウンスが占める画面のスペースに注意してください + text: 投稿と同じ構文を使用できます。アナウンスが占める画面のスペースに注意してください defaults: autofollow: 招待から登録した人が自動的にあなたをフォローするようになります avatar: "%{size}までのPNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます" @@ -34,20 +40,20 @@ ja: fields: プロフィールに表として4つまでの項目を表示することができます header: "%{size}までのPNG、GIF、JPGが利用可能です。 %{dimensions}pxまで縮小されます" inbox_url: 使用したいリレーサーバーのトップページからURLをコピーします - irreversible: フィルターが後で削除されても、除外されたトゥートは元に戻せなくなります + irreversible: フィルターが後で削除されても、除外された投稿は元に戻せなくなります locale: ユーザーインターフェース、メールやプッシュ通知の言語 locked: フォロワーを手動で承認する必要があります password: 少なくとも8文字は入力してください - phrase: トゥートの大文字小文字や閲覧注意に関係なく一致 + phrase: 投稿内容の大文字小文字や閲覧注意に関係なく一致 scopes: アプリの API に許可するアクセス権を選択してください。最上位のスコープを選択する場合、個々のスコープを選択する必要はありません。 - setting_aggregate_reblogs: 最近ブーストされたトゥートが新たにブーストされても表示しません (設定後受信したものにのみ影響) + setting_aggregate_reblogs: 最近ブーストされた投稿が新たにブーストされても表示しません (設定後受信したものにのみ影響) setting_default_sensitive: 閲覧注意状態のメディアはデフォルトでは内容が伏せられ、クリックして初めて閲覧できるようになります setting_display_media_default: 閲覧注意としてマークされたメディアは隠す setting_display_media_hide_all: メディアを常に隠す setting_display_media_show_all: メディアを常に表示する setting_hide_network: フォローとフォロワーの情報がプロフィールページで見られないようにします setting_noindex: 公開プロフィールおよび各投稿ページに影響します - setting_show_application: トゥートするのに使用したアプリがトゥートの詳細ビューに表示されるようになります + setting_show_application: 投稿するのに使用したアプリが投稿の詳細ビューに表示されるようになります setting_use_blurhash: ぼかしはメディアの色を元に生成されますが、細部は見えにくくなっています setting_use_pending_items: 新着があってもタイムラインを自動的にスクロールしないようにします username: あなたのユーザー名は %{domain} の中で重複していない必要があります @@ -73,13 +79,15 @@ ja: no_access: すべてのリソースへのアクセスをブロックします sign_up_requires_approval: 承認するまで新規登録が完了しなくなります severity: このIPに対する措置を選択してください + rule: + text: ユーザーのためのルールや要件を記述してください。短くシンプルにしてください。 sessions: otp: '携帯電話のアプリで生成された二段階認証コードを入力するか、リカバリーコードを使用してください:' webauthn: USBキーの場合は、必ず挿入し、必要に応じてタップしてください。 tag: name: 視認性向上などのためにアルファベット大文字小文字の変更のみ行うことができます user: - chosen_languages: 選択すると、選択した言語のトゥートのみが公開タイムラインに表示されるようになります + chosen_languages: 選択すると、選択した言語の投稿のみが公開タイムラインに表示されるようになります labels: account: fields: @@ -93,7 +101,7 @@ ja: text: プリセット警告文 title: タイトル admin_account_action: - include_statuses: 通報されたトゥートをメールに含める + include_statuses: 通報された投稿をメールに含める send_email_notification: メールでユーザーに通知 text: カスタム警告文 type: アクション @@ -141,17 +149,17 @@ ja: setting_aggregate_reblogs: ブーストをまとめる setting_auto_play_gif: アニメーションGIFを自動再生する setting_boost_modal: ブーストする前に確認ダイアログを表示する - setting_crop_images: トゥート詳細以外では画像を16:9に切り抜く + setting_crop_images: 投稿の詳細以外では画像を16:9に切り抜く setting_default_language: 投稿する言語 setting_default_privacy: 投稿の公開範囲 setting_default_sensitive: メディアを常に閲覧注意としてマークする - setting_delete_modal: トゥートを削除する前に確認ダイアログを表示する + setting_delete_modal: 投稿を削除する前に確認ダイアログを表示する setting_disable_swiping: スワイプでの切り替えを無効にする setting_display_media: メディアの表示 setting_display_media_default: 標準 setting_display_media_hide_all: 非表示 setting_display_media_show_all: 表示 - setting_expand_spoilers: 閲覧注意としてマークされたトゥートを常に展開する + setting_expand_spoilers: 閲覧注意としてマークされた投稿を常に展開する setting_hide_network: 繋がりを隠す setting_noindex: 検索エンジンによるインデックスを拒否する setting_reduce_motion: アニメーションの動きを減らす @@ -194,14 +202,16 @@ ja: follow_request: フォローリクエストを受けた時 mention: 返信が来た時 pending_account: 新しいアカウントの承認が必要な時 - reblog: トゥートがブーストされた時 + reblog: 投稿がブーストされた時 report: 通報を受けた時 trending_tag: 未審査のハッシュタグが人気の時 + rule: + text: ルール tag: listable: 検索とディレクトリへの使用を許可する name: ハッシュタグ trendable: トレンドへの表示を許可する - usable: トゥートへの使用を許可する + usable: 投稿への使用を許可する 'no': いいえ recommended: おすすめ required: diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index bbc23ed512..4327fcc8ef 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -78,6 +78,7 @@ kab: setting_theme: Asental n wesmel setting_use_pending_items: Askar aleγwayan sign_in_token_attempt: Tangalt n tɣellist + type: Anaw n uktar username: Isem n useqdac username_or_email: Isem n useqdac neγ imal whole_word: Awal akk @@ -96,11 +97,12 @@ kab: notification_emails: mention: Yuder-ik·em-id walbɛaḍ reblog: Yella win yesselhan adda-dik·im + rule: + text: Alugen tag: name: Ahacṭag 'no': Ala recommended: Yettuwelleh required: - mark: "*" text: ilaq 'yes': Ih diff --git a/config/locales/simple_form.kk.yml b/config/locales/simple_form.kk.yml index 544c684a62..63fe3d460f 100644 --- a/config/locales/simple_form.kk.yml +++ b/config/locales/simple_form.kk.yml @@ -2,79 +2,16 @@ kk: simple_form: hints: - account_alias: - acct: Specify the username@domain of the account you want to move from - account_migration: - acct: Specify the username@domain of the account you want to move to - account_warning_preset: - text: You can use toot syntax, such as URLs, hashtags and mentions - admin_account_action: - include_statuses: The user will see which toots have caused the moderation action or warning - send_email_notification: The user will receive an explanation of what happened with their account - text_html: Optional. You can use toot syntax. You can add warning presets to save time - type_html: Choose what to do with %{acct} - warning_preset_id: Optional. You can still add custom text to end of the preset defaults: - autofollow: People who sign up through the invite will automatically follow you - avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px - bot: This account mainly performs automated actions and might not be monitored - context: One or multiple contexts where the filter should apply - current_password: For security purposes please enter the password of the current account - current_username: To confirm, please enter the username of the current account - digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence - discoverable: The profile directory is another way by which your account can reach a wider audience - email: You will be sent a confirmation e-mail - fields: You can have up to 4 items displayed as a table on your profile - header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px - inbox_url: Copy the URL from the frontpage of the relay you want to use - irreversible: Filtered toots will disappear irreversibly, even if filter is later removed - locale: The language of the user interface, e-mails and push notifications - locked: Requires you to manually approve followers - password: Use at least 8 characters - phrase: Will be matched regardless of casing in text or content warning of a toot - scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. - setting_aggregate_reblogs: Do not show new boosts for toots that have been recently boosted (only affects newly-received boosts) - setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click - setting_display_media_default: Hide media marked as sensitive setting_display_media_hide_all: Always hide all media setting_display_media_show_all: Always show media marked as sensitive - setting_hide_network: Who you follow and who follows you will not be shown on your profile - setting_noindex: Affects your public profile and status pages - setting_show_application: The application you use to toot will be displayed in the detailed view of your toots - setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details - setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed - username: Your username will be unique on %{domain} - whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word - domain_allow: - domain: This domain will be able to fetch data from this server and incoming data from it will be processed and stored - featured_tag: - name: 'You might want to use one of these:' - form_challenge: - current_password: You are entering a secure area - imports: - data: CSV file exported from another Mastodon server - invite_request: - text: This will help us review your application - sessions: - otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' - tag: - name: You can only change the casing of the letters, for example, to make it more readable - user: - chosen_languages: When checked, only toots in selected languages will be displayed in public timelines labels: account: fields: - name: Label value: Мазмұн - account_alias: - acct: Handle of the old account - account_migration: - acct: Handle of the new account account_warning_preset: text: Алдын ала белгіленген мәтін admin_account_action: - include_statuses: Include reported toots in the e-mail - send_email_notification: Notify the user per e-mail text: Жеке ескерту type: Әрекет types: @@ -82,7 +19,6 @@ kk: none: Ештеңе істемеу silence: Үнсіз suspend: Suspend and irreversibly delete account data - warning_preset_id: Use a warning preset defaults: autofollow: Жазылуға шақыру avatar: Аватар @@ -99,8 +35,6 @@ kk: expires_in: Аяқталу мерзімі fields: Профиль метадатасы header: Басы - inbox_url: URL of the relay inbox - irreversible: Drop instead of hide locale: Интерфейс тілі locked: Аккаунтты құлыптау max_uses: Максимум қолданушы саны @@ -110,7 +44,6 @@ kk: password: Құпиясөз phrase: Кілтсөз немесе фраза setting_advanced_layout: Кеңейтілген веб-интерфейс қосу - setting_aggregate_reblogs: Group boosts in timelines setting_auto_play_gif: GIF анимацияларды бірден қосу setting_boost_modal: Бөлісу алдында растау диалогын көрсету setting_crop_images: Кеңейтілмеген жазбаларда суреттерді 16х9 көлеміне кес @@ -124,12 +57,8 @@ kk: setting_display_media_show_all: Бәрін көрсет setting_expand_spoilers: Мазмұн ескертуімен белгіленген жазбаларды кеңейту setting_hide_network: Желіні жасыру - setting_noindex: Opt-out of search engine indexing - setting_reduce_motion: Reduce motion in animations - setting_show_application: Disclose application used to send toots setting_system_font_ui: Жүйенің әдепкі қарпі setting_theme: Сайт темасы - setting_trends: Show today's trends setting_unfollow_modal: Анфоллоудан бұрын растау диалогын көрсету setting_use_blurhash: Жасырын медиаға арналған түрлі-түсті градиенттерді көрсетіңіз setting_use_pending_items: Баяу режим @@ -166,6 +95,5 @@ kk: 'no': Жоқ recommended: Рекоменделген required: - mark: "*" text: міндетті 'yes': Иә diff --git a/config/locales/simple_form.kmr.yml b/config/locales/simple_form.kmr.yml new file mode 100644 index 0000000000..015dfcbf48 --- /dev/null +++ b/config/locales/simple_form.kmr.yml @@ -0,0 +1,226 @@ +--- +kmr: + simple_form: + hints: + account_alias: + acct: Ajimêrê ku tu dixwazî bar bikî navê bikarhêner@domain diyar bike + account_migration: + acct: Ajimêrê ku tu dixwazî bar bikî navê bikarhêner@domain diyar bike + account_warning_preset: + text: Tu dikarî wek URLyan, hashtagan û şîroveyan, tootê ristesazî jî bikarbînî + title: Bi dilê xwe ye. Ji wergir re nay xûyakirin + admin_account_action: + include_statuses: Bikarhênerê bibîne kîjan toot dibin sedemê çalakî an jî agahdarî + send_email_notification: Bikarhêner dê ravekirinê tiştê ku bi ajimêra wan re qewimî bistîne + text_html: Bi dili xwe ye. Tu dikarî hevoksazî ye toot bikarbînî. Tu dikarî pêşsazîyên hişyariyê lê zêde bikî ji bo ku demê derbas nekî + type_html: Hilbijêre ka tu yê çi bikî bi %{acct} re + types: + disable: Nehêle bila bikarhêner ajimêrê xwe bikar bîne lê naverokan jê nebe an jî veneşêre. + none: Ji bo ku tu hişyariyekê ji bikarhêner re bişînî vê bi kar bîne, bêyî ku çalakiyeke din dest lê neda. + sensitive: Neçar bihêle ku ev bikarhêner hemû pêvekên medyayê hestiyar nîşan bike. + silence: Pêşî li bikarhêneran bigire ku bikarhêner bi herkesî ra xûyabarî neşîne, post û agahdarîyên xwe ji mirovên ku wan naşopîne veşêre. + suspend: Pêşîya hevbandorîya vî ajimêrê bigire û naveroka wê jê bibe. Di nava 30 rojan de tê vegerandin. + warning_preset_id: Bi dilê xwe ye. Tu hîn jî dikarî dawîya pêşsazkirî de nivîsek teybet li zêde bikî + announcement: + all_day: Dema were nîşankirin, tenê dîrokên navbera demê dê werin nîşan kirin + ends_at: Bi dilê xwe ye. Daxuyanî di vê demê de bi xweberî ji weşanê de rabe + scheduled_at: Vala bihêle ku yekcar daxûyanî were weşandin + starts_at: Bi dilê xwe ye. Heke daxûyanî ya te di demeke diyar ve girêdayî be + text: Tu dikarî hevoksazî yên toot bikarbînî. Ji kerema xwe cihê ku ev daxuyanî li ser dîmenderê bikarhêner bigire baldar be + defaults: + autofollow: Mirovên ku bi rêya vexwendinê xwe tomar kirine ew ên bi xweberî te bişopînin + avatar: PNG, GIF an jî JPG. Herî zêde %{size} dê ber bi %{dimensions}px ve were kêmkirin + bot: Ji yên din re nîşan bike ku ajimêr bi piranî kiryarên xweberî dike û dibe ku neyê çavdêrî kirin + context: Yek an jî zêdetir girêdan divê parzûn were sepandin + current_password: Ji bo ewlehiyê ji kerema xwe şîfreya ajimêrê xwe niha têkevin + current_username: Ji bo piştrastkirinê, ji kerema xwe navê bikarhêner ya ajimêrê niha binvîse + digest: Tenê piştî demek dirêj neçalakiyê de û tenê di nebûna te da peyamên teybetî standî be tê şandin + discoverable: Mafê biden ku ajimêra te bi pêşniyar, peldanka profîlê û taybetmendiyên din ji aliyê bîyaniyan ve bê vedîtin + discoverable_no_directory: Mafê biden ku ajimêra te bi pêşniyar û taybetmendiyên din ji aliyê bîyaniyan ve bê vedîtin + email: Ji te re e-name ya pejirandinê were + fields: Tu dikarî heya 4 hêmanan wekî tabloyek li ser profîla xwe nîşan bidî + header: PNG, GIF an jî JPG. Herî zêde %{size} ber bi %{dimensions}px ve were kêmkirin + inbox_url: URLyê di rûpela pêşî de guhêrkerê ku tu dixwazî bi kar bînî jê bigire + irreversible: Tootên parzûnkirî êdî bê veger wenda bibe, heger parzûn paşê were rakirin jî nabe + locale: Zimanê navrûyê bikarhêner, agahdarîyên e-name û pêl kirin + locked: Bi destan daxwazên şopê hilbijêrîne da ku kî bikaribe te bişopîne + password: Herî kêm 8 karakter bikar bîne + phrase: Ji rewşa nivîsê tîpên girdek/hûrdek an jî ji hişyariya naveroka ya şandiyê wek serbixwe wê were hevbeş kirin + scopes: |- + Sepana ku dê kîjan maf bide bigihije APIyan. + Ger te asteke jor hilbijartibe, ne pêwîste ku tu yên berfirehî a kesane hilbijêrî. + setting_aggregate_reblogs: Bilindkirinên ku nû hatine weşan ji şandiyên di dema dawî de nîşan nede (tenê li ser bilindkirinên nû wergirtî bandor dike) + setting_default_sensitive: Medyaya hestiyar berdestî ve tê veşartin û bi tikandin dikare were eşkere kirin + setting_display_media_default: Medyaya wekî hestyarî hatiye nîşankirî ye veşêre + setting_display_media_hide_all: Medyayê tim veşêre + setting_display_media_show_all: Medyayê tim nîşan bike + setting_hide_network: Kesên ku te dişopîne û kesên tu dişopînî ev ên profîla te de were veşartin + setting_noindex: Bandor li hemî profîla te û tootên rûpela te dike + setting_show_application: Navê sepana ku tu ji bo şandinê wê bi kar tîne dê di dîtinê berferh ên di şandiyên te de were xuyakirin + setting_use_blurhash: Gradyen xwe bi rengên dîtbarîyên veşartî ve radigire, lê belê hûrgilîyan diveşêre + setting_use_pending_items: Li şûna ku herkê wek bixweber bizivirînî nûvekirina demnameyê li paş tikandinekî veşêre + username: Navê te yê bikarhênerî li ser %{domain} de bêhempa be + whole_word: Dema peyvkilîd an jî hevok bi tenê alfahejmarî çêbe, bi tenê hemû bêjeyê re li hev bike wê pêk bê + domain_allow: + domain: Ev navê navperê, ji vê rajekarê wê daneyan bistîne û daneyên ku jê bê wê were sazkirin û veşartin + email_domain_block: + domain: Ev navê qada yê ku di navnîşana e-maîlê da xuya dibe, tomara MXê ya ku qada vê çareser dike an jî iPya rajekara ku MX tomar dike. Ev ên bi tomarê bikarhêneran bên kontrolkirin û tomarê were redkirin. + with_dns_records: Hewl tê dayîn ku tomarên DNSê yên li qada jê re hatine dayîn were çareserkirin û encamên wê jî were astengkirin + featured_tag: + name: 'Belkî tu yekê bi kar bînî çi van:' + form_challenge: + current_password: Tu dikevî qadeke ewledar + imports: + data: Pelê CSV-ê ji rajekareke din a Mastodon hate derxistin + invite_request: + text: Ev ê alikariya me bikê bo nirxandina sepanê te + ip_block: + comment: Bi dilê xwe ye. Ji bîr neke te çima ev bîranînê lê zêde kiriye. + expires_in: Navnîşanên IPyan çavkaniyên bi sînor in, carinan dihê parvekirin lê pirî caran dest diguherîne. Ji bo vê blokên IP ên nediyar nayê pêşniyarkirin. + ip: Têkeve navnîşana IPv4 an jî IPv6'yek. Tu dikarî bi hevoksazî ya CIDR re hemî valahîyan asteng bikî. Hay ji xwe hebe ku xwe derve nehêle! + severities: + no_access: Gihîştina hemî çavkaniyan asteng bike + sign_up_requires_approval: Tomarkirinên nû de pejirandina te pêwîste + severity: Daxwazên ku ji vê IPyê tên dê çi bibe hilbijêre + rule: + text: Ji bo bikarhênerên li ser vê rajekarê rêzikek an jî pêdivîyê pênase bike. Hewl bide ku rêzikê kin û xwerû bigire + sessions: + otp: 'Koda du-gavî a telefona xwe têkevê an jî yek ji wan kodên xilaskirinê têkevê:' + webauthn: Heke kilîta USB-yê be, jê ewle be ku wê têxinê û heke pêdivî be, pê li wê bike. + tag: + name: Tîpan, mînak ji bo ku bêhtir paknivîs bibe, tenê rewşa tîpên girdek/hûrdek dikarî biguherînî + user: + chosen_languages: Dema were nîşankirin, tenê parvekirinên bi zimanên hilbijartî dê di rêzikên giştî de werin nîşandan + labels: + account: + fields: + name: Nîşan + value: Naverok + account_alias: + acct: Destika ajimêrê te yê kevn + account_migration: + acct: Destika ajimêrê te yê nû + account_warning_preset: + text: Nivîsa pêşsazkirî + title: Sernav + admin_account_action: + include_statuses: Şandiyên hatine ragihandinê jî têxe nav e-name yê + send_email_notification: Bikarhênerê bi e-name yê agahdar bike + text: Agahdarî ya kesane + type: Çalakî + types: + disable: Qerisî ye + none: Hişyariyek bişîne + sensitive: Hestiyar + silence: Bi sînor bike + suspend: Hatiye rawestandin + warning_preset_id: Hişyariyeke pêşsazkirî bi kar bîne + announcement: + all_day: Çalakiya tevahiya rojê + ends_at: Dawiya bûyerê + scheduled_at: Weşanê demsaz bike + starts_at: Destpêka bûyerê + text: Daxuyanî + defaults: + autofollow: Ji bo şopandina ajimêra xwe vexwîne + avatar: Wêne + bot: Ev ajimêrekî bot e + chosen_languages: Parzûnê zimanan + confirm_new_password: Peborîna nû bipejirîne + confirm_password: Peborîn bipejirîne + context: Parzûnê naverokan + current_password: Pêborîna heyî + data: Dane + discoverable: Ji yên din re ajimêrê pêşniyar bike + display_name: Navê nîşandanê + email: Navnîşana E-nameyê + expires_in: Dîroka xilasbûyînê + fields: Profîla daneyên meta + header: Jormalper + honeypot: "%{label} (tijî neke)" + inbox_url: URLya guhêzkera wergirtî + irreversible: Li şûna veşartinê jê bibe + locale: Zimanê navrûyê + locked: Ajimêr qefl bike + max_uses: Hejmara bikaranîna herî zêde + new_password: Pêborîna nû + note: Jiyanname + otp_attempt: Koda du faktoran + password: Pêborîn + phrase: Peyvkilîd an jî hevok + setting_advanced_layout: Navrûya tevnê yê pêşketî çalak bike + setting_aggregate_reblogs: Di demnameyê de tootên bilindkirî kom bike + setting_auto_play_gif: GIF ên livok bi xweber bilîzine + setting_boost_modal: Gotûbêja pejirandinê nîşan bide berî ku şandî werê bilindkirin + setting_crop_images: Wêneyên di nav şandiyên ku nehatine berfireh kirin wek 16×9 jê bike + setting_default_language: Zimanê weşanê + setting_default_privacy: Ewlehiya weşanê + setting_default_sensitive: Her dem medya wek hestyar bide nîşan + setting_delete_modal: Berî ku peyamek were jêbirin, gotûbêja pejirandinê nîşan bide + setting_disable_swiping: Tevgerên dişiqite ne çalak bike + setting_display_media: Nîşandana medyayê + setting_display_media_default: Berdest + setting_display_media_hide_all: Hemûyan veşêre + setting_display_media_show_all: Hemûyan nîşan bide + setting_expand_spoilers: Şandîyên ku bi agahdarîyên naverokê va hatine nîşankirin her dem berfireh bike + setting_hide_network: Grafîka xwe ya civakî veşêre + setting_noindex: Bes e nexe di nav rêzên lêgerîna gerokan + setting_reduce_motion: Lîstikên livoka kêm bike + setting_show_application: Sepana ku ji bo şandina toot'a tê bikaranîn diyar bike + setting_system_font_ui: Curenivîsa berdest a pergalê bi kar bîne + setting_theme: Rûkarê malperê + setting_trends: Rojeva îro nîşan bide + setting_unfollow_modal: Gotûbêja pejirandinê nîşan bide berî ku dev ji şopa kesekî tê berdan + setting_use_blurhash: Ji bo medyaya veşartî de gradyanên rengîn nîşan bike + setting_use_pending_items: Awayê hêdî + severity: Asta girîngiyê + sign_in_token_attempt: Koda ewlehiyê + type: Cureya têxistinê + username: Navê bikarhêneriyê + username_or_email: Navê bikarhêner an jî e-name + whole_word: Hemû peyv + email_domain_block: + with_dns_records: Tomarên MX û IP yên hundirê navper lê zêde bike + featured_tag: + name: Hashtag + interactions: + must_be_follower: Danezanên ji kesên ku ne şopînerên min tên asteng bike + must_be_following: Agahdariyan asteng bike ji kesên ku tu wan naşopînî + must_be_following_dm: Peyamên rasterast asteng bike ji kesên ku tu wan naşopînî + invite: + comment: Şîrove + invite_request: + text: Tu çima dixwazî beşdar bibî? + ip_block: + comment: Şîrove + ip: IP + severities: + no_access: Gihîştinê asteng bike + sign_up_requires_approval: Tomaran sînordar bike + severity: Rêbaz + notification_emails: + digest: Kurte e-name bişîne + favourite: Kesekî şandiya te hez kir + follow: Kesekî te şopand + follow_request: Kesekî daxwaz kir bo şopandina te + mention: Kesekî qale te kir + pending_account: Pewîste ku ajimêra nû bihê lêkolînkirin + reblog: Kesekî şandiya te bilind kir + report: Ragihandinek nû hate şandin + trending_tag: Hashtageke nenirxandî bûye rojev + rule: + text: Rêbaz + tag: + listable: Bihêle ku ev hashtag werê xuyakirin di lêgerîn û pêşniyaran de + name: Hashtag + trendable: Bihêle ku ev hashtag werê xuyakirin di bin rojevê de + usable: Bihêle ku şandî ev hashtag bi kar bînin + 'no': Na + recommended: Pêşniyarkirî + required: + mark: "*" + text: pêdivî ye + title: + sessions: + webauthn: Yek ji kilîtên ewlehiyê yên xwe bi kar bîne bo têketinê + 'yes': Erê diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 5c47a99c44..106b36121e 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -7,47 +7,54 @@ ko: account_migration: acct: 이동하고자 하는 목적지 계정의 사용자이름@도메인을 설정하세요 account_warning_preset: - text: URL, 해시태그, 멘션과 같은 툿 문법을 사용할 수 있습니다 + text: URL, 해시태그, 멘션과 같은 게시물 문법을 사용할 수 있습니다 title: 선택사항. 수신자에게는 보이지 않습니다 admin_account_action: - include_statuses: 사용자는 어떤 툿에 대해 경고나 조치가 취해졌는지 볼 수 있게 됩니다 + include_statuses: 사용자는 어떤 게시물에 대해 경고나 조치가 취해졌는지 볼 수 있게 됩니다 send_email_notification: 유저는 어떤 일이 일어났는 지에 대한 설명을 받게 됩니다 - text_html: 선택사항. 툿 문법을 사용할 수 있습니다. 경고 틀을 추가하여 시간을 절약할 수 있습니다 + text_html: 선택사항. 게시물 문법을 사용할 수 있습니다. 경고 틀을 추가하여 시간을 절약할 수 있습니다 type_html: "%{acct}에 대해 취할 행동 선택" + types: + disable: 사용자가 계정을 사용하는 것을 막지만, 그들의 게시물을 삭제하거나 숨기지는 않습니다. + none: 이것을 사용해서 어떤 동작도 하지 않고, 사용자에게 경고를 보냅니다. + sensitive: 이 사용자의 모든 미디어 첨부를 민감함으로 강제 설정합니다. + silence: 이 사용자가 공개 설정으로 게시물을 작성할 수 없도록 하고, 그를 팔로우 하지 않는 사람에게는 이 사용자의 게시물과 알림을 숨깁니다. + suspend: 이 계정과의 모든 상호작용을 막고 모든 내용을 삭제합니다. 30일 이내에 되돌리기가 가능합니다. warning_preset_id: 선택사항. 틀의 마지막에 임의의 텍스트를 추가 할 수 있습니다 announcement: all_day: 체크 되었을 경우, 그 시간에 속한 날짜들에만 표시됩니다 ends_at: 옵션입니다. 공지사항이 이 시간에 자동으로 발행 중지 됩니다 scheduled_at: 공백으로 두면 공지사항이 곧바로 발행 됩니다 starts_at: 공지사항이 특정한 시간에 종속 될 때를 위한 옵션입니다 - text: 툿 문법을 사용할 수 있습니다. 공지사항은 사용자의 화면 상단 공간을 차지한다는 것을 명심하세요 + text: 게시물 문법을 사용할 수 있습니다. 공지사항은 사용자의 화면 상단 공간을 차지한다는 것을 명심하세요 defaults: autofollow: 이 초대를 통해 가입하는 사람은 당신을 자동으로 팔로우 하게 됩니다 avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨 - bot: 사람들에게 계정이 사람이 아님을 알립니다 + bot: 이 계정이 대부분 자동으로 작업을 수행하고 잘 확인하지 않는다는 것을 알립니다. context: 필터를 적용 할 한 개 이상의 컨텍스트 current_password: 보안을 위해 현재 계정의 암호를 입력해주세요 current_username: 확인을 위해, 현재 계정의 사용자명을 입력해주세요 digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기 - discoverable: 프로필 책자는 내 계정이 더 많은 관심을 갖게 할 수 있는 다른 방법입니다 + discoverable: 당신의 계정을 추천과 기타 기능들에 의해 다른 사람들이 발견할 수 있게 허용합니다 + discoverable_no_directory: 당신의 계정을 추천과 기타 기능들에 의해 다른 사람들이 발견할 수 있도록 허용합니다 email: 당신은 확인 메일을 받게 됩니다 fields: 당신의 프로파일에 최대 4개까지 표 형식으로 나타낼 수 있습니다 header: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨 inbox_url: 사용 할 릴레이 서버의 프론트페이지에서 URL을 복사합니다 - irreversible: 필터링 된 툿은 나중에 필터가 사라지더라도 돌아오지 않게 됩니다 + irreversible: 필터링 된 게시물은 나중에 필터가 사라지더라도 돌아오지 않게 됩니다 locale: 유저 인터페이스, 이메일, 푸시 알림 언어 - locked: 수동으로 팔로워를 승인하고, 기본 툿 프라이버시 설정을 팔로워 전용으로 변경 + locked: 팔로우 요청을 승인함으로써 누가 당신을 팔로우 할 수 있는지를 수동으로 제어합니다. password: 최소 8글자 - phrase: 툿 내용이나 CW 내용 안에서 대소문자 구분 없이 매칭 됩니다 + phrase: 게시물 내용이나 열람주의 내용 안에서 대소문자 구분 없이 매칭 됩니다 scopes: 애플리케이션에 허용할 API들입니다. 최상위 스코프를 선택하면 개별적인 것은 선택하지 않아도 됩니다. - setting_aggregate_reblogs: 내가 부스트 했던 툿은 새로 부스트 되어도 보여주지 않습니다 + setting_aggregate_reblogs: 최근에 부스트 됐던 게시물은 새로 부스트 되어도 보여주지 않기 (새로 받은 부스트에만 적용됩니다) setting_default_sensitive: 민감한 미디어는 기본적으로 가려져 있으며 클릭해서 볼 수 있습니다 setting_display_media_default: 민감함으로 설정 된 미디어 가리기 setting_display_media_hide_all: 항상 모든 미디어를 가리기 setting_display_media_show_all: 민감함으로 설정 된 미디어를 항상 보이기 - setting_hide_network: 나를 팔로우 하는 사람들과 내가 팔로우 하는 사람들이 내 프로필에 표시되지 않게 합니다 - setting_noindex: 공개 프로필 및 각 툿페이지에 영향을 미칩니다 - setting_show_application: 당신이 툿을 작성하는데에 사용한 앱이 툿의 상세정보에 표시 됩니다 + setting_hide_network: 나를 팔로우 하는 사람들과 내가 팔로우 하는 사람들을 내 프로필에서 숨깁니다 + setting_noindex: 공개 프로필 및 각 게시물 페이지에 영향을 미칩니다 + setting_show_application: 당신이 게시물을 작성하는데에 사용한 앱이 게시물의 상세정보에 표시 됩니다 setting_use_blurhash: 그라디언트는 숨겨진 내용의 색상을 기반으로 하지만 상세 내용은 보이지 않게 합니다 setting_use_pending_items: 타임라인의 새 게시물을 자동으로 보여 주는 대신, 클릭해서 나타내도록 합니다 username: 당신의 유저네임은 %{domain} 안에서 유일해야 합니다 @@ -73,13 +80,15 @@ ko: no_access: 모든 자원에 대한 접근 차단 sign_up_requires_approval: 새 가입이 승인을 필요로 하도록 합니다 severity: 해당 IP로부터의 요청에 대해 무엇이 일어나게 할 지 고르세요 + rule: + text: 이 서버 사용자들이 지켜야 할 규칙과 요구사항을 설명해주세요. 짧고 간단하게 작성해주세요 sessions: otp: '휴대전화에서 생성 된 2단계 인증 코드를 입력하거나, 복구 코드 중 하나를 사용하세요:' webauthn: USB 키라면 삽입했는지 확인하고, 필요하다면 누르세요. tag: name: 읽기 쉽게하기 위한 글자의 대소문자만 변경할 수 있습니다. user: - chosen_languages: 체크하면, 선택 된 언어들만 공개 타임라인에 보여집니다 + chosen_languages: 체크하면, 선택 된 언어로 작성된 게시물들만 공개 타임라인에 보여집니다 labels: account: fields: @@ -93,7 +102,7 @@ ko: text: 프리셋 텍스트 title: 제목 admin_account_action: - include_statuses: 신고된 툿을 이메일에 포함 + include_statuses: 신고된 게시물을 이메일에 포함 send_email_notification: 이메일로 유저에게 알리기 text: 커스텀 경고 type: 조치 @@ -120,7 +129,7 @@ ko: context: 필터 컨텍스트 current_password: 현재 암호 입력 data: 데이터 - discoverable: 이 계정을 책자에서 찾을 수 있도록 합니다 + discoverable: 계정을 다른 사람들에게 추천하기 display_name: 표시되는 이름 email: 이메일 주소 expires_in: 만료시각 @@ -130,7 +139,7 @@ ko: inbox_url: 릴레이 서버의 inbox URL irreversible: 숨기는 대신 삭제 locale: 인터페이스 언어 - locked: 계정 잠금 + locked: 팔로우 요청 필요 max_uses: 사용 횟수 제한 new_password: 새로운 암호 입력 note: 자기소개 @@ -141,18 +150,18 @@ ko: setting_aggregate_reblogs: 타임라인의 부스트를 그룹화 setting_auto_play_gif: 애니메이션 GIF를 자동 재생 setting_boost_modal: 부스트 전 확인 창을 표시 - setting_crop_images: 확장되지 않은 툿의 이미지를 16x9로 자르기 + setting_crop_images: 확장되지 않은 게시물의 이미지를 16x9로 자르기 setting_default_language: 게시물 언어 - setting_default_privacy: 툿 프라이버시 + setting_default_privacy: 게시물 프라이버시 setting_default_sensitive: 미디어를 언제나 민감한 컨텐츠로 설정 - setting_delete_modal: 툿 삭제 전 확인 창을 표시 + setting_delete_modal: 게시물 삭제 전 확인 창을 표시 setting_disable_swiping: 스와이프 모션 비활성화 setting_display_media: 미디어 표시 setting_display_media_default: 기본 setting_display_media_hide_all: 모두 가리기 setting_display_media_show_all: 모두 보이기 setting_expand_spoilers: 열람주의 툿을 항상 펼치기 - setting_hide_network: 내 네트워크 숨기기 + setting_hide_network: 내 인맥 숨기기 setting_noindex: 검색엔진의 인덱싱을 거절 setting_reduce_motion: 애니메이션 줄이기 setting_show_application: 툿 작성에 사용한 앱을 공개 @@ -197,11 +206,13 @@ ko: reblog: 누군가 내 툿을 부스트 했을 때 이메일 보내기 report: 새 신고 등록시 이메일로 알리기 trending_tag: 리뷰 되지 않은 해시태그가 유행할 때 이메일 보내기 + rule: + text: 규칙 tag: - listable: 이 해시태그가 프로필 책자에 보여지도록 허용 + listable: 이 해시태그가 검색과 추천에 보여지도록 허용 name: 해시태그 trendable: 이 해시태그가 유행에 보여지도록 허용 - usable: 이 해시태그를 툿에 사용 가능하도록 허용 + usable: 이 해시태그를 게시물에 사용 가능하도록 허용 'no': 아니오 recommended: 추천함 required: diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index 8ff8a5a46c..0a6cbc703e 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -181,7 +181,6 @@ ku: text: بۆچی دەتەوێت بەشدار بیت? ip_block: comment: بۆچوون - ip: IP severities: no_access: بلۆککردنی ده‌ستپێگه‌یشتن sign_up_requires_approval: سنووردارکردنی چوونەناو @@ -204,7 +203,6 @@ ku: 'no': نە recommended: پێشنیارکراوە required: - mark: "*" text: پێویستە title: sessions: diff --git a/config/locales/simple_form.kw.yml b/config/locales/simple_form.kw.yml new file mode 100644 index 0000000000..b2cfc12ff1 --- /dev/null +++ b/config/locales/simple_form.kw.yml @@ -0,0 +1 @@ +kw: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 1be0eabc09..36695fa3c3 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -1 +1,224 @@ +--- lv: + simple_form: + hints: + account_alias: + acct: Norādi konta lietotājvārdu@domēnu, no kura vēlies pārvākties + account_migration: + acct: Norādi konta lietotājvārdu@domēnu, uz kuru vēlies pārvākties + account_warning_preset: + text: Vari izmantot ziņu sintaksi, piemēram, URL, atsauces un pieminējumus + title: Neobligāts. Saņēmējam nav redzams + admin_account_action: + include_statuses: Lietotājs redzēs, kuras ziņas izraisījušas moderācijas darbību vai brīdinājumu + send_email_notification: Lietotājs saņems paskaidrojumu par to, kas notika ar viņa kontu + text_html: Neobligāts. Tu vari lietot ziņu sintaksi. Lai ietaupītu laiku, tu vari pievienot brīdinājuma sākotnējos iestatījumus + type_html: Izvēlies, ko darīt ar %{acct} + types: + disable: Neļauj lietotājam izmantot savu kontu, bet neizdzēs vai neslēp tā saturu. + none: Izmanto šo, lai nosūtītu lietotājam brīdinājumu, neradot nekādas citas darbības. + sensitive: Piespiest visus šī lietotāja multivides pielikumus atzīmēt kā sensitīvus. + silence: Neļauj lietotājam publicēt ziņas publiski redzamā veidā, paslēp viņu ziņas un paziņojumus no cilvēkiem, kuri viņiem neseko. + suspend: Novērst jebkādu mijiedarbību ar šo kontu vai ar to un dzēst tā saturu. Atgriežams 30 dienu laikā. + warning_preset_id: Neobligāts. Tu joprojām vari pievienot pielāgotu tekstu sākotnējās iestatīšanas beigās + announcement: + all_day: Atzīmējot šo opciju, tiks parādīti tikai laika diapazona datumi + ends_at: Neobligāts. Paziņojums šoreiz tiks automātiski atcelts + scheduled_at: Lai nekavējoties publicētu paziņojumu, atstāj tukšu + starts_at: Neobligāts. Ja tavs paziņojums ir saistīts ar noteiktu laika diapazonu + text: Varari izmantot ziņu sintaksi. Lūdzu, apdomā lauku, ko paziņojums aizņems lietotāja ekrānā + defaults: + autofollow: Cilvēki, kuri reģistrējas, izmantojot uzaicinājumu, automātiski sekos tev + avatar: PNG, GIF vai JPG. Ne vairāk kā %{size}. Tiks samazināts līdz %{dimensions} px + bot: Paziņo citiem, ka kontā galvenokārt tiek veiktas automatizētas darbības un tas var netikt uzraudzīts + context: Viens vai vairāki konteksti, kur jāpiemēro filtrs + current_password: Drošības nolūkos, lūdzu, ievadi pašreizējā konta paroli + current_username: Lai apstiprinātu, lūdzu, ievadi pašreizējā konta paroli + digest: Sūta tikai pēc ilgstošas neaktivitātes un tikai tad, ja savas prombūtnes laikā neesi saņēmis personiskas ziņas + discoverable: Ļauj svešiniekiem atklāt savu kontu caur ieteikumiem, profila direktoriju un citām iespējām + discoverable_no_directory: Ļauj svešiniekiem atklāt savu kontu caur ieteikumiem un citām iespējām + email: Tev tiks nosūtīts apstiprinājuma e-pasts + fields: Savā profilā kā tabulu vari parādīt līdz 4 vienumiem + header: PNG, GIF vai JPG. Ne vairāk kā %{size}. Tiks samazināts līdz %{dimensions}px + inbox_url: Nokopē URL no tā releja sākumlapas, kuru vēlies izmantot + irreversible: Filtrētās ziņas neatgriezeniski pazudīs, pat ja filtrs vēlāk tiks noņemts + locale: Lietotāja saskarnes, e-pasta ziņojumu un push paziņojumu valoda + locked: Manuāli kontrolē, kas var tev sekot, apstiprinot sekošanas pieprasījumus + password: Izmanto vismaz 8 rakstzīmes + phrase: Tiks saskaņots neatkarīgi no ziņas teksta reģistra vai satura brīdinājuma + scopes: Kuriem API lietojumprogrammai būs atļauta piekļuve. Ja izvēlies augstākā līmeņa tvērumu, tev nav jāatlasa atsevišķi vienumi. + setting_aggregate_reblogs: Nerādīt jaunus palielinājumus ziņām, kas nesen tika palielinātas (ietekmē tikai nesen saņemtos palielinājumus) + setting_default_sensitive: Sensitīvi mediji pēc noklusējuma ir paslēpti, un tos var atklāt, noklikšķinot + setting_display_media_default: Paslēpt mediju, kas atzīmēts kā sensitīvs + setting_display_media_hide_all: Vienmēr slēpt medijus + setting_display_media_show_all: Vienmēr rādīt medijus + setting_hide_network: Kam tu seko un kurš seko tev, tavā profilā tiks paslēps + setting_noindex: Ietekmē tavu publisko profilu un ziņu lapas + setting_show_application: Lietojumprogramma, ko tu izmanto publicēšanai, tiks parādīta tavu ziņu detalizētajā skatā + setting_use_blurhash: Gradientu pamatā ir paslēpto vizuālo attēlu krāsas, bet neskaidras visas detaļas + setting_use_pending_items: Paslēpt laika skalas atjauninājumus aiz klikšķa, nevis automātiski ritini plūsmu + username: Tavs lietotājvārds %{domain} būs unikāls + whole_word: Ja atslēgvārds vai frāze ir tikai burtciparu, tas tiks lietots tikai tad, ja tas atbilst visam vārdam + domain_allow: + domain: Šis domēns varēs izgūt datus no šī servera, un no tā ienākošie dati tiks apstrādāti un saglabāti + email_domain_block: + domain: Tas var būt domēna nosaukums, kas redzams e-pasta adresē, MX ieraksts, kuru domēns atrisina, vai servera IP, uz kuru tiek atrisināts MX ieraksts. Tie tiks pārbaudīti, reģistrējoties lietotājam, un reģistrācija tiks noraidīta. + with_dns_records: Tiks mēģināts atrisināt dotā domēna DNS ierakstus, un rezultāti arī tiks bloķēti + featured_tag: + name: 'Iespējams, vēlēsies izmantot kādu no šīm:' + form_challenge: + current_password: Tu ieej drošā zonā + imports: + data: CSV fails, eksportēts no cita Mastodon servera + invite_request: + text: Tas palīdzēs mums pārskatīt tavu lietojumprogrammu + ip_block: + comment: Neobligāts. Atceries, kādēļ tu pievienoji šo nosacījumu. + expires_in: IP adreses ir ierobežots resurss, tās dažreiz tiek koplietotas un bieži maina turētāju. Šī iemesla dēļ nedefinēti IP bloki nav ieteicami. + ip: Ievadi IPv4 vai IPv6 adresi. Izmantojot CIDR sintaksi, tu vari bloķēt visus diapazonus. Esi piesardzīgs un neizslēdz pats sevi! + severities: + no_access: Bloķēt piekļuvi visiem resursiem + sign_up_requires_approval: Jaunām reģistrācijām būs nepieciešams tavs apstiprinājums + severity: Izvēlies, kas notiks ar pieprasījumiem no šīs IP adreses + rule: + text: Apraksti nosacījumus vai prasības šī servera lietotājiem. Centies, lai tas būtu īss un vienkāršs + sessions: + otp: 'Ievadi divfaktoru kodu, ko ģenerējusi tava tālruņa lietotne, vai izmanto kādu no atkopšanas kodiem:' + webauthn: Ja tā ir USB atslēga, noteikti ievieto to un, ja nepieciešams, pieskaries tai. + tag: + name: Tu vari mainīt tikai burtu lielumu, piemēram, lai tie būtu vieglāk lasāmi + user: + chosen_languages: Ja ieķeksēts, publiskos laika grafikos tiks parādītas tikai ziņas noteiktajās valodās + labels: + account: + fields: + name: Marķējums + value: Saturs + account_alias: + acct: Vecā konta rokturis + account_migration: + acct: Jaunā konta rokturis + account_warning_preset: + text: Iestatītais teksts + title: Virsraksts + admin_account_action: + include_statuses: Iekļaut ziņotās ziņas e-pastā + send_email_notification: Paziņot lietotājam pa e-pastu + text: Pielāgots brīdinājums + type: Darbība + types: + disable: Iesaldēt + none: Nosūtīt brīdinājumu + sensitive: Sensitīvs + silence: Ierobežot + suspend: Apturēt + warning_preset_id: Lietot iepriekš iestatītus brīdinājumus + announcement: + all_day: Visas dienas pasākums + ends_at: Pasākuma noslēgums + scheduled_at: Ieplānot publikāciju + starts_at: Pasākuma sākums + text: Paziņojums + defaults: + autofollow: Uzaicini sekot tavam kontam + avatar: Avatars + bot: Šis ir bot konts + chosen_languages: Filtrēt valodas + confirm_new_password: Apstiprināt jauno paroli + confirm_password: Apstiprināt paroli + context: Filtrēt kontekstus + current_password: Pašreizējā parole + data: Dati + discoverable: Ieteikt kontu citiem + display_name: Parādāmais vārds + email: E-pasta adrese + expires_in: Beidzas pēc + fields: Profila metadati + header: Galvene + honeypot: "%{label} (neaizpildi)" + inbox_url: URL vai releja pastkaste + irreversible: Nomest, nevis paslēpt + locale: Interfeisa valoda + locked: Pieprasīt sekotāju pieprasījumus + max_uses: Maksimālais lietojumu skaits + new_password: Jauna parole + note: Par sevi + otp_attempt: Divfaktoru kods + password: Parole + phrase: Atslēgvārds vai frāze + setting_advanced_layout: Iespējot paplašināto web interfeisu + setting_aggregate_reblogs: Grupēt paaugstinājumus ziņu lentās + setting_auto_play_gif: Automātiski atskaņot animētos GIF + setting_boost_modal: Parādīt apstiprinājuma dialogu pirms paaugstināšanas + setting_crop_images: Apgrieziet attēlus neizvērstajās ziņās līdz 16x9 + setting_default_language: Publicēšanas valoda + setting_default_privacy: Publicēšanas privātums + setting_default_sensitive: Atļaut atzīmēt medijus kā sensitīvus + setting_delete_modal: Parādīt apstiprinājuma dialogu pirms ziņas dzēšanas + setting_disable_swiping: Atspējot vilkšanas kustības + setting_display_media: Mediju bibliotēka + setting_display_media_default: Noklusējums + setting_display_media_hide_all: Paslēpt visu + setting_display_media_show_all: Parādīt visu + setting_expand_spoilers: Vienmēr izvērst ziņas, kas apzīmētas ar brīdinājumiem par saturu + setting_hide_network: Slēpt savu sociālo diagrammu + setting_noindex: Atteikties no meklētājprogrammu indeksēšanas + setting_reduce_motion: Ierobežot kustību animācijās + setting_show_application: Atklāt lietojumprogrammu, ko izmanto ziņu nosūtīšanai + setting_system_font_ui: Lietot sistēmas noklusējuma fontu + setting_theme: Vietnes motīvs + setting_trends: Parādīt šodienas tendences + setting_unfollow_modal: Parādīt apstiprinājuma dialogu pirms atsekoties no kāda + setting_use_blurhash: Rādīt krāsainos gradientus slēptajiem medijiem + setting_use_pending_items: Lēnais režīms + severity: Smagums + sign_in_token_attempt: Drošības kods + type: Importa veids + username: Lietotājvārds + username_or_email: Lietotājvārds vai e-pasts + whole_word: Pilns vārds + email_domain_block: + with_dns_records: Ietvert domēna MX ierakstus un IP adreses + featured_tag: + name: Tēmturis + interactions: + must_be_follower: Bloķēt paziņojumus no ne-sekotājiem + must_be_following: Bloķēt paziņojumus no cilvēkiem, kuriem tu neseko + must_be_following_dm: Bloķēt tiešos ziņojumus no cilvēkiem, kuriem tu neseko + invite: + comment: Komentēt + invite_request: + text: Kāpēc tu vēlies pievienoties? + ip_block: + comment: Komentēt + ip: IP + severities: + no_access: Bloķēt piekļuvi + sign_up_requires_approval: Ierobežot reģistrēšanos + severity: Noteikumi + notification_emails: + digest: Sūtīt kopsavilkumu e-pastus + favourite: Kāds izcēla tavu ziņu + follow: Kāds uzsāka tev sekot + follow_request: Kāds vēlas tev sekot + mention: Kāds pieminēja tevi + pending_account: Jāpārskata jaunu kontu + reblog: Kāds paaugstināja tavu ziņu + report: Tika iesniegts jauns ziņojums + trending_tag: Kļūst populārs nepārskatīts tēmturis + rule: + text: Noteikumi + tag: + listable: Atļaut šim tēmturim parādīties meklējumos un ieteikumos + name: Tēmturis + trendable: Atļaut šim tēmturim parādīties zem tendencēm + usable: Atļaut lietot ziņās šo tēmturi + 'no': Nē + recommended: Ieteicams + required: + mark: "*" + text: nepieciešams + title: + sessions: + webauthn: Lai pierakstītos, izmanto vienu no savām drošības atslēgām + 'yes': Jā diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 8abc9448cd..4fdcb70f0d 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -12,8 +12,14 @@ nl: admin_account_action: include_statuses: De gebruiker ziet welke toots verantwoordelijk zijn voor de moderatieactie of waarschuwing send_email_notification: De gebruiker ontvangt een uitleg over wat er met hun account is gebeurd - text_html: Optioneel. Je kunt voor toots specifieke tekst gebruiken. Om tijd te besparen kun je voorinstellingen van waarschuwingen toevoegen + text_html: Optioneel. Je kunt voor toots specifieke tekst gebruiken. Om tijd te besparen kun je presets voor waarschuwingen toevoegen type_html: Kies wat er met %{acct} moet gebeuren + types: + disable: Voorkom dat de gebruiker hun account gebruikt, maar verwijder of verberg de inhoud niet. + none: Gebruik dit om een waarschuwing naar de gebruiker te sturen, zonder dat nog een andere actie wordt uitgevoerd. + sensitive: Forceer dat alle mediabijlagen van deze gebruiker als gevoelig worden gemarkeerd. + silence: Voorkom dat de gebruiker openbare toots kan versturen, verberg hun toots en meldingen voor mensen die hen niet volgen. + suspend: Alle interacties van en met dit account blokkeren en de inhoud verwijderen. Dit kan binnen dertig dagen worden teruggedraaid. warning_preset_id: Optioneel. Je kunt nog steeds handmatig tekst toevoegen aan het eind van de voorinstelling announcement: all_day: Wanneer dit is aangevinkt worden alleen de datums binnen het tijdvak getoond @@ -24,7 +30,7 @@ nl: defaults: autofollow: Mensen die zich via de uitnodiging hebben geregistreerd, volgen jou automatisch avatar: PNG, GIF of JPG. Maximaal %{size}. Wordt teruggeschaald naar %{dimensions}px - bot: Dit is een geautomatiseerd account en wordt mogelijk niet gemonitord + bot: Signaal naar andere gebruikers toe dat dit account hoofdzakelijk geautomatiseerde berichten stuurt en mogelijk niet wordt gemonitord context: Een of meerdere locaties waar de filter actief moet zijn current_password: Voer voor veiligheidsredenen het wachtwoord van je huidige account in current_username: Voer ter bevestiging de gebruikersnaam van je huidige account in @@ -36,9 +42,9 @@ nl: inbox_url: Kopieer de URL van de voorpagina van de relayserver die je wil gebruiken irreversible: Gefilterde toots verdwijnen onomkeerbaar, zelfs als de filter later wordt verwijderd locale: De taal van de gebruikersomgeving, e-mails en pushmeldingen - locked: Vereist dat je handmatig volgers moet accepteren + locked: Door het goedkeuren van volgers handmatig bepalen wie jou mag volgen password: Gebruik tenminste 8 tekens - phrase: Komt overeen ongeacht hoofd-/kleine letters of tekstwaarschuwingen + phrase: Komt overeen ongeacht hoofd-/kleine letters of een inhoudswaarschuwing scopes: Tot welke API's heeft de toepassing toegang. Wanneer je een toestemming van het bovenste niveau kiest, hoef je geen individuele toestemmingen meer te kiezen. setting_aggregate_reblogs: Geen nieuwe boosts tonen voor toots die recentelijk nog zijn geboost (heeft alleen effect op nieuw ontvangen boosts) setting_default_sensitive: Gevoelige media wordt standaard verborgen en kan met één klik worden getoond @@ -67,10 +73,17 @@ nl: text: Dit helpt ons om jouw aanvraag te beoordelen ip_block: comment: Optioneel. Vergeet niet te onthouden waarom je deze regel hebt toegevoegd. + expires_in: Het aantal IP-adressen zijn beperkt. Ze worden soms gedeeld en wisselen vaak van eigenaar. Om deze reden worden onbeperkte IP-blokkades niet aanbevolen. + ip: Voer een IPv4- of IPv6-adres in. Je kunt hele reeksen blokkeren met de CIDR-methode. Pas op dat je jezelf niet buitensluit! severities: + no_access: Toegang tot de hele server blokkeren sign_up_requires_approval: Nieuwe registraties vereisen jouw goedkeuring + severity: Kies wat er moet gebeuren met aanvragen van dit IP-adres + rule: + text: Omschrijf een regel of vereiste voor gebruikers op deze server. Probeer het kort en simpel te houden sessions: - otp: 'Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes:' + otp: 'Voer de tweestaps-toegangscode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes:' + webauthn: Wanneer het een USB-sleutel is, zorg er dan voor dat je deze in de computer steekt en, wanneer nodig, activeert. tag: name: Je kunt elk woord met een hoofdletter beginnen, om zo bijvoorbeeld de tekst leesbaarder te maken user: @@ -85,7 +98,7 @@ nl: account_migration: acct: Mastodonadres van het nieuwe account account_warning_preset: - text: Tekst van voorinstelling + text: Tekst van preset title: Titel admin_account_action: include_statuses: Gerapporteerde toots aan de e-mail toevoegen @@ -115,7 +128,7 @@ nl: context: Filterlocaties current_password: Huidig wachtwoord data: Gegevens - discoverable: Dit account in de gebruikersgids tonen + discoverable: Dit account laten aanbevelen en in de gebruikersgids tonen display_name: Weergavenaam email: E-mailadres expires_in: Vervalt na @@ -125,18 +138,18 @@ nl: inbox_url: Inbox-URL van de relayserver irreversible: Verwijderen in plaats van verbergen locale: Taal van de gebruikersomgeving - locked: Maak account besloten + locked: Volgverzoek vereisen max_uses: Max. aantal keer te gebruiken new_password: Nieuwe wachtwoord note: Bio - otp_attempt: Tweestaps-aanmeldcode + otp_attempt: Tweestaps-toegangscode password: Wachtwoord phrase: Trefwoord of zinsdeel setting_advanced_layout: Geavanceerde webomgeving inschakelen setting_aggregate_reblogs: Boosts in tijdlijnen groeperen setting_auto_play_gif: Speel geanimeerde GIF's automatisch af setting_boost_modal: Vraag voor het boosten van een toot een bevestiging - setting_crop_images: Afbeeldingen tot 16x9 besnijden in niet uitgebreide toots + setting_crop_images: Afbeeldingen bijsnijden tot 16x9 in toots op tijdlijnen setting_default_language: Taal van jouw toots setting_default_privacy: Standaardzichtbaarheid van jouw toots setting_default_sensitive: Media altijd als gevoelig markeren @@ -146,7 +159,7 @@ nl: setting_display_media_default: Standaard setting_display_media_hide_all: Alles verbergen setting_display_media_show_all: Alles tonen - setting_expand_spoilers: Altijd toots met tekstwaarschuwingen uitklappen + setting_expand_spoilers: Altijd toots met inhoudswaarschuwingen uitklappen setting_hide_network: Jouw volgers en wie je volgt verbergen setting_noindex: Jouw toots niet door zoekmachines laten indexeren setting_reduce_motion: Langzamere animaties @@ -192,8 +205,10 @@ nl: reblog: Wanneer iemand jouw toot heeft geboost report: Bij het indienen van een nieuwe rapportage trending_tag: Wanneer een nog niet beoordeelde hashtag trending is + rule: + text: Regel tag: - listable: Toestaan dat deze hashtag in zoekopdrachten en in de gebruikersgids te zien valt + listable: Toestaan dat deze hashtag in zoekopdrachten en aanbevelingen te zien valt name: Hashtag trendable: Toestaan dat deze hashtag onder trends te zien valt usable: Toestaan dat deze hashtag in toots gebruikt mag worden diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index f4a62ac078..97ce174152 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -14,6 +14,12 @@ nn: send_email_notification: Brukaren får ei forklåring av kva som har hendt med kontoen sin text_html: Valfritt. Du kan bruka tut-syntaks. Du kan leggja til åtvaringsførehandsinnstillingar for å spara tid type_html: Vel det du vil gjera med %{acct} + types: + disable: Forhindre brukeren å bruke kontoen sin, men ikke slett eller skjule innholdet deres. + none: Bruk dette for å sende en advarsel til brukeren uten å utløse noen andre handlinger. + sensitive: Tving alle denne brukerens medievedlegg til å bli markert som følsom. + silence: Hindre brukeren i å kunne skrive offentlig synlighet, skjule sine innlegg og varsler for personer som ikke kan følge dem. + suspend: Forhindre interaksjon fra eller til denne kontoen og slett innholdet der. Reversibel innen 30 dager. warning_preset_id: Valfritt. Du kan leggja inn eigen tekst på enden av føreoppsettet announcement: all_day: Når merka, vil berre datoane til tidsramma synast @@ -66,8 +72,15 @@ nn: invite_request: text: Dette kjem til å hjelpa oss med å gå gjennom søknaden din ip_block: + comment: Valgfritt. Husk hvorfor du la til denne regelen. + expires_in: IP-adressene er en helt begrenset ressurs, de deles og endres ofte hender. Ubestemte IP-blokker anbefales ikke. + ip: Skriv inn en IPv4 eller IPv6-adresse. Du kan blokkere alle områder ved å bruke CIDR-syntaksen. Pass på å ikke låse deg selv! severities: no_access: Blokker tilgang til alle ressurser + sign_up_requires_approval: Nye registreringer vil kreve din godkjenning + severity: Velg hva som vil skje med forespørsler fra denne IP + rule: + text: Beskriv en regel eller krav til brukere på denne serveren. Prøv å holde den kort og enkelt sessions: otp: Angi tofaktorkoden fra din telefon eller bruk en av dine gjenopprettingskoder. tag: @@ -94,6 +107,7 @@ nn: types: disable: Slå av innlogging none: Gjer inkje + sensitive: Sensitiv silence: Togn suspend: Utvis og slett kontodata for godt warning_preset_id: Bruk åtvaringsoppsett @@ -119,6 +133,7 @@ nn: expires_in: Vert ugyldig etter fields: Profilmetadata header: Overskrift + honeypot: "%{label} (ikke fyll ut)" inbox_url: URL-addressen til overgangsinnboksen irreversible: Forkast i staden for å gøyma locale: Språk @@ -189,6 +204,8 @@ nn: reblog: Send e-post når nokon framhevar statusen din report: Send e-post når nokon rapporterer noko trending_tag: Ein emneknagg som ikkje er sett igjennom er på veg opp + rule: + text: Regler tag: listable: Tillat denne emneknaggen å synast i søk og i profilmappa name: Emneknagg diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index cdf3d61e84..7897779369 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -14,6 +14,12 @@ send_email_notification: Brukeren vil motta en forklaring på hva som har skjedd med deres bruker text_html: Valgfritt. Du kan bruke tut syntaks. Du kan legge til advarsels-forhåndsinnstillinger for å spare tid type_html: Velg hva du vil gjøre med %{acct} + types: + disable: Forhindre brukeren å bruke kontoen sin, men ikke slett eller skjule innholdet deres. + none: Bruk dette for å sende en advarsel til brukeren uten å utløse noen andre handlinger. + sensitive: Tving alle denne brukerens medievedlegg til å bli markert som følsom. + silence: Hindre brukeren i å kunne skrive offentlig synlighet, skjule sine innlegg og varsler for personer som ikke kan følge dem. + suspend: Forhindre interaksjon fra eller til denne kontoen og slett innholdet der. Reversibel innen 30 dager. warning_preset_id: Valgfritt. Du kan fortsatt legge til tilpasset tekst til slutten av forhåndsinnstillingen announcement: all_day: Hvis noen av dem er valgt, vil kun datoene av tidsrammen bli vist @@ -66,8 +72,15 @@ invite_request: text: Dette vil hjelpe oss med å gjennomgå din søknad ip_block: + comment: Valgfritt. Husk hvorfor du la til denne regelen. + expires_in: IP-adressene er en helt begrenset ressurs, de deles og endres ofte hender. Ubestemte IP-blokker anbefales ikke. + ip: Skriv inn en IPv4 eller IPv6-adresse. Du kan blokkere alle områder ved å bruke CIDR-syntaksen. Pass på å ikke låse deg selv! severities: no_access: Blokker tilgang til alle ressurser + sign_up_requires_approval: Nye registreringer vil kreve din godkjenning + severity: Velg hva som vil skje med forespørsler fra denne IP + rule: + text: Beskriv en regel eller krav til brukere på denne serveren. Prøv å holde den kort og enkelt sessions: otp: Angi tofaktorkoden fra din telefon eller bruk en av dine gjenopprettingskoder. tag: @@ -94,6 +107,7 @@ types: disable: Deaktiver pålogging none: Ikke gjør noe + sensitive: Sensitiv silence: Stilne suspend: Suspender og ugjenkallelig slett brukerdata warning_preset_id: Bruk en advarsels-forhåndsinnstilling @@ -119,6 +133,7 @@ expires_in: Utløper etter fields: Profilmetadata header: Overskrift + honeypot: "%{label} (ikke fyll ut)" inbox_url: URL til overgangsinnboksen irreversible: Forkast i stedet for å skjule locale: Språk @@ -189,6 +204,8 @@ reblog: Send e-post når noen fremhever din status report: Ny rapport er sendt inn trending_tag: En ugjennomgått emneknagg trender + rule: + text: Regler tag: listable: Tillat denne emneknaggen å vises i søk og på profilmappen name: Emneknagg diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 79c621ee24..e2520da3fa 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -133,7 +133,7 @@ oc: locked: Far venir lo compte privat max_uses: Limit d’utilizacions new_password: Nòu senhal - note: Bio + note: Biografia otp_attempt: Còdi Two-factor password: Senhal phrase: Senhal o frasa @@ -197,6 +197,8 @@ oc: reblog: Enviar un corrièl quand qualqu’un tòrna partejar vòstre estatut report: Enviar un corrièl pels nòus senhalaments trending_tag: Enviar un corrièl quand una etiqueta pas repassada es en tendéncia + rule: + text: Règla tag: listable: Permetre a aquesta etiqueta d’aparéisser a las recèrcas e a l’annuari de perfils name: Etiqueta diff --git a/config/locales/simple_form.pa.yml b/config/locales/simple_form.pa.yml new file mode 100644 index 0000000000..bb8a6c834d --- /dev/null +++ b/config/locales/simple_form.pa.yml @@ -0,0 +1 @@ +pa: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 6fc33ab08a..a82bbb8da1 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -14,6 +14,12 @@ pl: send_email_notification: Użytkownik otrzyma informację, co stało się z jego kontem text_html: Możesz używać składni której używasz we wpisach. Możesz dodać szablon ostrzeżenia aby zaoszczędzić czas type_html: Wybierz co chcesz zrobić z %{acct} + types: + disable: Nie pozwalaj użytkownikowi na korzystanie ze swojego konta, ale nie usuwaj ani nie ukrywaj jego zawartości. + none: Użyj tego, aby wysłać użytkownikowi ostrzeżenie, nie wywołując żadnego innego działania. + sensitive: Wymuś oznaczanie wszystkich załączników multimedialnych tego użytkownika jako wrażliwe. + silence: Zablokuj użytkownikowi możliwość publikowania z widocznością publiczną, ukrywaj jego wpisy i powiadomienia przed osobami, które go nie obserwują. + suspend: Zapobiegaj wszelkim interakcjom z tym kontem i usuń jego zawartość. Odwracalne w ciągu 30 dni. warning_preset_id: Nieobowiązkowe. Możesz dodać niestandardowy tekst do końcowki szablonu announcement: all_day: Jeżeli zaznaczone, tylko daty z przedziału czasu będą wyświetlane @@ -30,6 +36,7 @@ pl: current_username: Aby potwierdzić, wprowadź nazwę użytkownika obecnego konta digest: Wysyłane tylko po długiej nieaktywności, jeżeli w tym czasie otrzymaleś jakąś wiadomość bezpośrednią discoverable: Katalog profilu jest jednym ze sposobów, dzięki którym Twoje konto dotrze do szerszego grona + discoverable_no_directory: Pozwól na odkrywanie Twojego konta przez nieznajomych poprzez rekomendacje i inne funkcje email: Otrzymasz e-mail potwierdzający fields: Możesz ustawić maksymalnie 4 niestandardowe pola wyświetlane jako tabela na Twoim profilu header: PNG, GIF lub JPG. Maksymalnie %{size}. Zostanie zmniejszony do %{dimensions}px @@ -73,6 +80,8 @@ pl: no_access: Zablokuj dostęp do wszystkich zasobów sign_up_requires_approval: Nowe rejestracje będą wymagać twojej zgody severity: Wybierz co ma się stać z żadaniami z tego adresu IP + rule: + text: Opisz wymóg lub regułę dla użytkowników na tym serwerze. Postaraj się, aby była krótka i prosta sessions: otp: 'Wprowadź kod weryfikacji dwuetapowej z telefonu lub wykorzystaj jeden z kodów zapasowych:' webauthn: Jeżeli jest to klucz USB, upewnij się, że go włożyłeś i, jeśli to konieczne, naciśnij go. @@ -197,6 +206,8 @@ pl: reblog: Powiadamiaj mnie e-mailem, gdy ktoś podbije mój wpis report: Powiadamiaj mnie e-mailem, gdy zostanie utworzone nowe zgłoszenie trending_tag: Nieprzejrzany hashtag jest na czasie + rule: + text: Zasada tag: listable: Pozwól, aby ten hashtag pojawiał się w wynikach wyszukiwania i katalogu profilów name: Hashtag diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 574a3e3dc9..b1bb020dd4 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -3,24 +3,30 @@ pt-BR: simple_form: hints: account_alias: - acct: Especifique o usuário@domínio da conta da qual você deseja se mudar + acct: Especifique o usuário@domínio de onde veio account_migration: - acct: Especifique o usuário@domínio da conta para a qual você deseja se mudar + acct: Especifique o usuário@domínio para onde vai account_warning_preset: text: Você pode usar a sintaxe do toot, como links, hashtags e menções title: Opcional. Não visível para o destinatário admin_account_action: - include_statuses: O usuário verá quais toots causaram o aviso ou ação da moderação + include_statuses: O usuário verá quais toots causaram a advertência ou ação da moderação send_email_notification: O usuário receberá uma explicação do que aconteceu com a própria conta - text_html: Opcional. Você pode usar a sintaxe do toot e também pode adicionar avisos pré-definidos para poupar tempo + text_html: Opcional. Você pode usar a sintaxe do toot ou pode poupar tempo adicionando advertências pré-definidas type_html: Decida o que fazer com %{acct} - warning_preset_id: Opcional. Você ainda pode adicionar texto personalizado no final do aviso pré-definido + types: + disable: Impede o usuário de usar a conta, porém sem excluí-la ou suspendê-la. + none: Use isto para enviar uma advertência ao usuário, sem nenhuma outra ação. + sensitive: Marca todas as mídias do usuário como sensível. + silence: Impede o usuário de tootar publicamente, e oculta toots e notificações dos que não o seguem. + suspend: Impede interações e exclui conteúdo da conta. Reversível apenas dentro de 30 dias. + warning_preset_id: Opcional. Você pode adicionar texto personalizado no final da advertência pré-definida announcement: all_day: Quando marcada, apenas as datas do período serão mostradas - ends_at: Opcional. O anúncio será automaticamente não publicado no momento - scheduled_at: Deixe em branco para publicar o anúncio imediatamente - starts_at: Opcional. Caso seu anúncio esteja vinculado a um período específico - text: Você pode usar a sintaxe toot. Esteja ciente do espaço que o anúncio ocupará na tela do usuário + ends_at: Opcional. O comunicado sairá do ar automaticamente + scheduled_at: Deixe em branco para publicar o comunicado agora + starts_at: Opcional. Caso o comunicado esteja vinculado a um período específico + text: Você pode usar a sintaxe do toot. Considere o espaço que o comunicado ocupará na tela do usuário defaults: autofollow: Pessoas que criarem conta através de seu convite te seguirão automaticamente avatar: PNG, GIF or JPG. Arquivos de até %{size}. Serão redimensionados para %{dimensions}px @@ -38,7 +44,7 @@ pt-BR: locale: O idioma da interface do usuário, e-mails e notificações locked: Requer aprovação manual de seguidores password: Use pelo menos 8 caracteres - phrase: Corresponderá independente de maiúsculas ou minúsculas, no texto ou no aviso de conteúdo de um toot + phrase: Corresponderá independente de maiúsculas ou minúsculas, no texto ou no Aviso de Conteúdo de um toot scopes: Quais APIs o aplicativo vai ter permissão de acessar. Se você selecionar uma autorização de alto nível, você não precisa selecionar individualmente os outros. setting_aggregate_reblogs: Não mostra novos boosts para toots que receberam boost recentemente (afeta somente os boosts mais recentes) setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique @@ -73,6 +79,8 @@ pt-BR: no_access: Bloquear o acesso a todos os recursos sign_up_requires_approval: Novos registros exigirão sua aprovação severity: Escolha o que acontecerá com as solicitações deste IP + rule: + text: Descreva uma regra ou requisito para os usuários neste servidor. Tente mantê-la curta e simples. sessions: otp: 'Digite o código de dois fatores gerado pelo aplicativo no seu celular ou use um dos códigos de recuperação:' webauthn: Se for uma chave USB tenha certeza de inseri-la e, se necessário, tocar nela. @@ -90,30 +98,30 @@ pt-BR: account_migration: acct: Nome de usuário da nova conta account_warning_preset: - text: Aviso pré-definido + text: Advertência pré-definida title: Título admin_account_action: include_statuses: Incluir toots denunciados no e-mail send_email_notification: Notificar o usuário por e-mail - text: Aviso personalizado + text: Advertência personalizada type: Ação types: disable: Congelar none: Não fazer nada sensitive: Sensível - silence: Silenciar - suspend: Banir e excluir irreversivelmente dados da conta - warning_preset_id: Usar um aviso pré-definido + silence: Suspender + suspend: Banir e excluir conta + warning_preset_id: Usar advertência pré-definida announcement: all_day: Evento o dia inteiro ends_at: Fim do evento scheduled_at: Agendar publicação starts_at: Início do evento - text: Anúncio + text: Comunicados defaults: autofollow: Convite para seguir a sua conta avatar: Imagem de perfil - bot: Esta é uma conta-robô + bot: Robô chosen_languages: Filtro de idiomas confirm_new_password: Confirmar nova senha confirm_password: Confirmar senha @@ -122,16 +130,16 @@ pt-BR: data: Dados discoverable: Mostrar conta no diretório de perfis display_name: Nome de exibição - email: Endereço de e-mail + email: E-mail expires_in: Expira em fields: Metadados do perfil - header: Cabeçalho + header: Capa honeypot: "%{label} (não preencher)" inbox_url: Link da caixa de entrada do repetidor irreversible: Ignorar ao invés de ocultar locale: Idioma da interface - locked: Trancar conta - max_uses: Número máximo de usos + locked: Trancar perfil + max_uses: Limite de uso new_password: Nova senha note: Biografia otp_attempt: Código de autenticação de dois fatores @@ -160,7 +168,7 @@ pt-BR: setting_theme: Tema do site setting_trends: Mostrar em alta hoje setting_unfollow_modal: Solicitar confirmação antes de deixar de seguir alguém - setting_use_blurhash: Mostrar blur em mídias ocultas + setting_use_blurhash: Mostrar blur em mídias sensíveis setting_use_pending_items: Modo lento severity: Gravidade sign_in_token_attempt: Código de segurança @@ -174,8 +182,8 @@ pt-BR: name: Hashtag interactions: must_be_follower: Bloquear notificações de não-seguidores - must_be_following: Bloquear notificações de pessoas que você não segue - must_be_following_dm: Bloquear mensagens diretas de pessoas que você não segue + must_be_following: Bloquear notificações de não-seguidos + must_be_following_dm: Bloquear toots diretos de não-seguidos invite: comment: Comentário invite_request: @@ -185,20 +193,22 @@ pt-BR: ip: IP severities: no_access: Bloquear acesso - sign_up_requires_approval: Limitar registros + sign_up_requires_approval: Limitar novas contas severity: Regra notification_emails: digest: Enviar e-mails de resumo - favourite: Enviar e-mail quando alguém favoritar seus toots + favourite: Enviar e-mail quando alguém favoritar teus toots follow: Enviar e-mail quando alguém te seguir - follow_request: Enviar e-mail quando alguém solicitar ser seu seguidor + follow_request: Enviar e-mail quando alguém quiser te seguir mention: Enviar e-mail quando alguém te mencionar - pending_account: Enviar e-mail quando uma nova conta precisar ser revisada - reblog: Enviar e-mail quando alguém der boost nos seus toots + pending_account: Enviar e-mail quando uma nova conta precisa ser revisada + reblog: Enviar e-mail quando alguém der boost nos teus toots report: Enviar e-mail quando uma nova denúncia for enviada - trending_tag: Uma hashtag não-revisada está em alta + trending_tag: Enviar e-mail quando uma hashtag não-revisada está em alta + rule: + text: Regra tag: - listable: Permitir que esta hashtag apareça em pesquisas e no diretório de perfis + listable: Permitir que esta hashtag apareça em pesquisas e sugestões name: Hashtag trendable: Permitir que esta hashtag fique em alta usable: Permitir que toots usem esta hashtag diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 869ecaddcc..9519ee35aa 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -12,8 +12,14 @@ pt-PT: admin_account_action: include_statuses: O utilizador verá quais toots causaram a ação de moderação ou aviso send_email_notification: O utilizador receberá uma explicação sobre o que aconteceu com a sua conta - text_html: Opcional. Tu podes usar sintaxe de escrita. Tu podes adicionar predefinições de aviso para poupar tempo + text_html: Opcional. Pode utilizar sintaxe de escrita. Pode adicionar avisos predefinidos para poupar tempo type_html: Escolhe o que fazer com %{acct} + types: + disable: Impede o utilizador de usar a sua conta, mas não elimina ou oculta o seu conteúdo. + none: Use isto para enviar um aviso ao utilizador, sem acionar nenhuma outra ação. + sensitive: Força todos os anexos de media deste utilizador a serem sinalizados como sensíveis. + silence: Impede que o utilizador seja capaz de publicar com visibilidade pública, ocultando as suas publicações e notificações de pessoas que não o seguem. + suspend: Evita qualquer interação de ou para esta conta e elimina o seu conteúdo. Reversível num período de 30 dias. warning_preset_id: Opcional. Tu ainda podes adicionar texto personalizado no fim do predefinido announcement: all_day: Quando marcado, apenas as datas do intervalo de tempo serão exibidas @@ -24,14 +30,15 @@ pt-PT: defaults: autofollow: As pessoas que aderem através do convite seguir-te-ão automaticamente avatar: PNG, GIF or JPG. Arquivos até %{size}. Vão ser reduzidos para %{dimensions}px - bot: Esta conta executa essencialmente acções automáticas e pode não poder ser monitorizada + bot: Esta conta executa essencialmente ações automatizadas e pode não ser monitorizada context: Um ou múltiplos contextos nos quais o filtro deve ser aplicado - current_password: Para fins de segurança, por favor, digite a senha da conta atual + current_password: Para fins de segurança, por favor, introduza a palavra-passe da conta atual current_username: Para confirmar, por favor, introduza o nome de utilizador da conta atual digest: Enviado após um longo período de inatividade e apenas se foste mencionado na tua ausência discoverable: O diretório de perfis é outra maneira da sua conta alcançar um público mais vasto + discoverable_no_directory: Permitir que a sua conta seja descoberta por estranhos através de recomendações e outras funções email: Será enviado um e-mail de confirmação - fields: Podes ter até 4 itens expostos, em forma de tabela, no teu perfil + fields: Pode ter até 4 itens expostos, em forma de tabela, no seu perfil header: PNG, GIF or JPG. Arquivos até %{size}. Vão ser reduzidos para %{dimensions}px inbox_url: Copia a URL da página inicial do repetidor que queres usar irreversible: Publicações filtradas irão desaparecer irremediavelmente, mesmo que o filtro seja removido posteriormente @@ -55,8 +62,8 @@ pt-PT: domain_allow: domain: Este domínio será capaz de obter dados desta instância e os dados dele recebidos serão processados e armazenados email_domain_block: - domain: Este pode ser o nome de domínio que aparece no endereço de email, o registro MX para o qual o domínio resolve, ou o IP do servidor para o qual o registro MX resolve. Estes serão verificados no momento da inscrição do utilizador e a inscrição será rejeitada. - with_dns_records: Será feita uma tentativa de resolver os registros DNS do domínio em questão e os resultados também serão colocados na lista negra + domain: Este pode ser o nome de domínio que aparece no endereço de e-mail, o registo MX para o qual o domínio resolve, ou o IP do servidor para o qual o registo MX resolve. Estes serão verificados no momento da inscrição do utilizador e a inscrição será rejeitada. + with_dns_records: Será feita uma tentativa de resolver os registos DNS do domínio em questão e os resultados também serão colocados na lista negra featured_tag: name: 'Poderás querer usar um destes:' form_challenge: @@ -73,8 +80,10 @@ pt-PT: no_access: Bloquear o acesso a todos os recursos sign_up_requires_approval: Novas inscrições requererão a sua aprovação severity: Escolha o que acontecerá com as solicitações deste IP + rule: + text: Descreva uma regra ou requisito para os utilizadores nesta instância. Tente mantê-la curta e simples sessions: - otp: 'Insere o código de autenticação em dois passos gerado pelo teu telemóvel ou usa um dos teus códigos de recuperação:' + otp: 'Insira o código de autenticação em duas etapas gerado pelo seu telemóvel ou use um dos seus códigos de recuperação:' webauthn: Se for uma chave USB tenha certeza de inseri-la e, se necessário, toque nela. tag: name: Só pode alterar a capitalização das letras, por exemplo, para torná-las mais legíveis @@ -98,7 +107,7 @@ pt-PT: text: Aviso personalizado type: Acção types: - disable: Desactivar + disable: Congelar none: Não fazer algo sensitive: Sensível silence: Silenciar @@ -120,11 +129,11 @@ pt-PT: context: Filtrar contextos current_password: Palavra-passe actual data: Dados - discoverable: Listar esta conta no directório + discoverable: Permitir sugerir esta conta a outros display_name: Nome Público email: Endereço de e-mail expires_in: Expira em - fields: Meta-dados de perfil + fields: Metadados de perfil header: Cabeçalho honeypot: "%{label} (não preencher)" inbox_url: URL da caixa de entrada do repetidor @@ -134,7 +143,7 @@ pt-PT: max_uses: Número máximo de utilizações new_password: Nova palavra-passe note: Biografia - otp_attempt: Código de autenticação em dois passos + otp_attempt: Código de autenticação em duas etapas password: Palavra-passe phrase: Palavra ou expressão-chave setting_advanced_layout: Ativar interface web avançada @@ -146,7 +155,7 @@ pt-PT: setting_default_privacy: Privacidade da publicação setting_default_sensitive: Sempre marcar media como sensível setting_delete_modal: Solicitar confirmação antes de eliminar uma publicação - setting_disable_swiping: Desactivar os movimentos de deslize + setting_disable_swiping: Desativar os movimentos de deslize setting_display_media: Visualização de media setting_display_media_default: Pré-definição setting_display_media_hide_all: Esconder todos @@ -169,13 +178,13 @@ pt-PT: username_or_email: Nome de utilizador ou e-mail whole_word: Palavra completa email_domain_block: - with_dns_records: Incluir registros MX e IPs do domínio + with_dns_records: Incluir registos MX e IPs do domínio featured_tag: name: Hashtag interactions: must_be_follower: Bloquear notificações de não-seguidores must_be_following: Bloquear notificações de pessoas que não segues - must_be_following_dm: Bloquear mensagens directas de pessoas que tu não segues + must_be_following_dm: Bloquear mensagens diretas de pessoas que não segue invite: comment: Comentário invite_request: @@ -189,14 +198,16 @@ pt-PT: severity: Regra notification_emails: digest: Enviar e-mails de resumo - favourite: Enviar e-mail quando alguém adiciona uma publicação tua aos favoritos - follow: Enviar e-mail quando alguém te segue - follow_request: Enviar e-mail quando alguém solicita ser teu seguidor - mention: Enviar e-mail quando alguém te menciona - pending_account: Enviar e-mail quando uma nova conta aguarda aprovação - reblog: Enviar e-mail quando alguém partilha uma publicação tua - report: Enviar um e-mail quando um novo relatório é submetido - trending_tag: Enviar e-mail quando uma hashtag não aprovada anteriormente estiver em destaque + favourite: Quando alguém adiciona uma publicação sua aos favoritos + follow: Quando alguém começar a segui-lo + follow_request: Quando alguém solicitar ser seu seguidor + mention: Quando alguém o mencionar + pending_account: Quando uma nova conta aguarda aprovação + reblog: Quando alguém partilhar uma publicação sua + report: Quando um novo relatório é submetido + trending_tag: Quando uma hashtag não aprovada anteriormente estiver em destaque + rule: + text: Regra tag: listable: Permitir que esta hashtag apareça em pesquisas e no diretório de perfis name: Hashtag diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index aa0b077082..8d30c27468 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -157,8 +157,6 @@ ro: whole_word: Cuvânt întreg email_domain_block: with_dns_records: Include înregistrările MX și IP-urile domeniului - featured_tag: - name: Hashtag interactions: must_be_follower: Blochează notificările de la persoane care nu te urmăresc must_be_following: Blochează notificările de la persoane pe care nu le urmărești @@ -179,12 +177,10 @@ ro: trending_tag: Un hashtag nerevizuit este în tendință tag: listable: Permite acestui hashtag să apară în căutări și în directorul de profil - name: Hashtag trendable: Permite acestui hashtag să apară sub tendințe usable: Permite postărilor să folosească acest hashtag 'no': Nu recommended: Recomandat required: - mark: "*" text: obligatoriu 'yes': Da diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 5baa9d46e8..356f9f2b9e 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -14,6 +14,12 @@ ru: send_email_notification: Пользователь получит сообщение о том, что случилось с его/её учётной записью text_html: Необязательно. Вы можете использовать синтаксис постов. Для экономии времени, добавьте шаблоны предупреждений type_html: Выберите применяемое к %{acct} действие + types: + disable: Запретить пользователю использование своей учётной записи, без удаления или скрытия контента. + none: Отправить пользователю предупреждение, не принимая иных действий. + sensitive: Принудительно отметить опубликованное пользователем содержимое как «деликатного характера». + silence: Запретить пользователю публиковать посты с открытой видимостью, а также скрыть все прошлые посты и уведомления от людей, не читающих этого пользователя. + suspend: Предотвратить любое взаимодействие с этой учётной записью, удалив всё содержимое опубликованное с неё. Это действие можно отменить в течение 30 дней. warning_preset_id: Необязательно. Вы можете добавить собственный текст в конце шаблона announcement: all_day: Если выбрано, часы начала и завершения будут скрыты @@ -30,6 +36,7 @@ ru: current_username: Для подтверждения, пожалуйста, введите имя пользователя текущей учётной записи digest: Если вы долго не заглядывали, отправим вам дайджест событий, которые происходили в период вашего отсутствия. discoverable: Каталог профилей это один из способов получить охват вашего профиля более обширной аудиторией. + discoverable_no_directory: Разрешить сторонним людям находить ваш профиль через рекомендации и прочие функции email: Вам будет отправлено электронное письмо с подтверждением. fields: В профиле можно отобразить до 4 пунктов в виде таблицы. header: Поддерживается PNG, GIF и JPG. Максимальный размер — %{size}. Будет уменьшена до %{dimensions}px. @@ -41,12 +48,12 @@ ru: phrase: Будет сопоставлено независимо от присутствия в тексте или предупреждения о содержании поста scopes: Какие API приложению будет позволено использовать. Если вы выберете самый верхний, нижестоящие будут выбраны автоматически. setting_aggregate_reblogs: Не показывать новые продвижения постов, которые уже были недавно продвинуты (относится только к новым продвижениям). - setting_default_sensitive: Деликатные медиафайлы скрыты по умолчанию и могут быть показаны по нажатию на них. - setting_display_media_default: Скрывать деликатные медиафайлы + setting_default_sensitive: Медиафайлы «деликатного характера» скрыты по умолчанию и могут быть показаны по нажатию на них. + setting_display_media_default: Скрывать файлы «деликатного характера» setting_display_media_hide_all: Всегда скрывать любые медиафайлы - setting_display_media_show_all: Всегда показывать деликатные медиафайлы + setting_display_media_show_all: Всегда показывать любые медиафайлы setting_hide_network: Другие не смогут видеть ни ваши подписки, ни ваших подписчиков. - setting_noindex: Ваш публичный профиль и страницы постов будут скрыты из поисковых движков. + setting_noindex: Ваш публичный профиль и публикации будут скрыты от поисковых систем. setting_show_application: При просмотре поста будет видно из какого приложения он отправлен. setting_use_blurhash: Градиенты основаны на цветах скрытых медиа, но скрывают любые детали. setting_use_pending_items: Показывать обновления в ленте только после клика вместо автоматической прокрутки. @@ -60,7 +67,7 @@ ru: featured_tag: name: 'Возможно, вы захотите добавить что-то из этого:' form_challenge: - current_password: Вы входите в зону безопасности + current_password: Вы переходите к настройкам безопасности imports: data: Файл CSV, экспортированный с другого узла Mastodon. invite_request: @@ -73,6 +80,8 @@ ru: no_access: Заблокировать доступ ко всем ресурсам sign_up_requires_approval: Новые регистрации потребуют вашего одобрения severity: Выберите, что будет происходить с запросами с этого IP + rule: + text: Опишите правило или требование для пользователей на этом сервере. Постарайтесь сделать его коротким и простым sessions: otp: 'Введите код двухфакторной аутентификации, сгенерированный в мобильном приложении, или используйте один из ваших кодов восстановления:' webauthn: Если это ключ USB, не забудьте его вставить и, при необходимости, нажмите на него. @@ -100,7 +109,7 @@ ru: types: disable: Заморозить none: Ничего не делать - sensitive: Деликатный + sensitive: Отметить как «деликатного характера» silence: Скрыть suspend: Заблокировать и безвозвратно удалить все данные учётной записи warning_preset_id: Использовать шаблон @@ -124,7 +133,7 @@ ru: display_name: Отображаемое имя email: Адрес e-mail expires_in: Истекает через - fields: Метаданные профиля + fields: Таблица деталей header: Шапка honeypot: "%{label} (не заполнять)" inbox_url: URL для входящих от ретрансляторов @@ -139,12 +148,12 @@ ru: phrase: Слово или фраза setting_advanced_layout: Включить многоколоночный интерфейс setting_aggregate_reblogs: Группировать продвижения в лентах - setting_auto_play_gif: Автоматически проигрывать анимированные GIF + setting_auto_play_gif: Автоматически проигрывать GIF анимации setting_boost_modal: Всегда спрашивать перед продвижением setting_crop_images: Кадрировать изображения в нераскрытых постах до 16:9 - setting_default_language: Язык отправляемых постов + setting_default_language: Язык публикуемых постов setting_default_privacy: Видимость постов - setting_default_sensitive: Всегда отмечать медиафайлы как деликатные + setting_default_sensitive: Всегда отмечать медиафайлы как «деликатного характера» setting_delete_modal: Всегда спрашивать перед удалении поста setting_disable_swiping: Отключить анимацию смахивания setting_display_media: Отображение медиафайлов @@ -160,7 +169,7 @@ ru: setting_theme: Тема сайта setting_trends: Показывать сегодняшние тренды setting_unfollow_modal: Всегда спрашивать перед отпиской от учётной записи - setting_use_blurhash: Показать цветные градиенты для скрытых медиа + setting_use_blurhash: Показать цветные градиенты для скрытых медиафайлов setting_use_pending_items: Медленный режим severity: Накладываемые ограничения sign_in_token_attempt: Код безопасности @@ -197,6 +206,8 @@ ru: reblog: Ваш пост продвинули report: Поступила новая жалоба trending_tag: Актуальный хэштег требует проверки + rule: + text: Правило tag: listable: Разрешить показ хэштега в поиске или в каталоге профилей name: Хэштег diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml index 99d5ab4294..f241933479 100644 --- a/config/locales/simple_form.sc.yml +++ b/config/locales/simple_form.sc.yml @@ -5,41 +5,47 @@ sc: account_alias: acct: Dislinda su nòmineutente@domìniu de su contu dae su cale ti boles mòere account_migration: - acct: Dislinda su nòmineutente@domìniu de su contu cara a su cale ti boles mòere + acct: Dislinda su nòmineutente@domìniu de su contu conca a su cale ti boles mòere account_warning_preset: - text: Podes impreare sa sintassi de is tuts, che a is URL, is etichetas e is mentovos + text: Podes impreare sintassi in is tuts, che a URL, etichetas e mentovos title: Optzionale. Invisìbile a s'àtera persone admin_account_action: include_statuses: S'utente at a bìdere is tuts chi ant causadu s'atzione o s'avisu de moderatzione send_email_notification: S'utente at a retzire un'ispiegatzione de su chi siat sutzèdidu in su contu suo - text_html: Optzionale. Podes impreare sa sintassi de is tuts. Podes agiùnghere avisos pre-impostados pro risparmiare tempus - type_html: Sèbera ite fàghere cun %{acct} + text_html: Optzionale. Podes impreare sintassi in is tuts. Podes agiùnghere avisos predefinidos pro istraviare tempus + type_html: Sèbera ite si depet fàghere cun %{acct} + types: + disable: Impedi a s'utente de impreare su contu suo, ma non de cantzellare o cuare is cuntenutos. + none: Imprea custu pro imbiare un'avisu a s'utente, sena pedire peruna àtera atzione. + sensitive: Custringhe totu is alligongiados multimediales de custu utente a èssere marcados comente sensìbiles. + silence: Impedi a s'utente de publicare messàgios cun visibilidade pùblica, e de cuare messàgios e notìficas a persones chi non ddos sighint. + suspend: Impedi cale si siat cuntatu dae o cun custu contu e cantzella is cuntenutos. Si podet annullare intro de 30 dies. warning_preset_id: Optzionale. Podes ancora agiùnghere testu personalizadu a s'acabu de cussu predefinidu announcement: all_day: Si est marcadu, ant a èssere ammustradas isceti is datas de s'intervallu de tempus ends_at: Optzionale. S'annùntziu at a acabbare de abarrare publicadu in custu momentu scheduled_at: Lassa bòidu pro publicare s'annùntziu immediatamente starts_at: Optzionale. S'in casu chi s'annùntziu tuo siat ligadu a un'intervallu de tempus ispetzìficu - text: Podes impreare sa sintassi de is tuts. Dae cara a su tretu chi s'annùntziu at a pigare in s'ischermu de s'utente + text: Podes impreare sintassi in is tuts. Dae cara a su tretu chi s'annùntziu at a pigare in s'ischermu de s'utente defaults: autofollow: Is persones chi s'ant a registrare pro mèdiu de s'invitu t'ant a sighire in manera automàtica avatar: PNG, GIF o JPG. Màssimu %{size}. Ant a èssere iscaladas a %{dimensions}px - bot: Custu contu faghet pro su prus atziones automatizadas e diat pòdere no èssere monitoradu + bot: Sinnala a àtere chi custu contu faghet pro su prus atziones automatizadas e diat pòdere no èssere monitoradu context: Unu o prus cuntestos in ue su filtru si diat dèpere aplicare current_password: Pro chistiones de seguresa inserta sa crae de intrada de su contu atuale current_username: Pro cunfirmare inserta su nòmine utente de su contu atuale - digest: Imbiadu isceti a pustis de unu perìodu longu de inatividade, e isceti si as retzidu carchi messàgiu personale cando non bi fias - discoverable: Sa cartella de is profilos est un'àtera manera pro fàghere otènnere unu pùblicu prus mannu a su contu tuo - email: T'amus a mandare unu messàgiu eletrònicu de cunfirma + digest: Imbiadu isceti a pustis de unu perìodu longu de inatividade, e isceti si as retzidu calicunu messàgiu personale cando non bi fias + discoverable: Permite chi su contu tuo potzat èssere iscobertu dae persones disconnotas pro mèdiu de cussìgios e àteras optziones + email: As a retzire unu messàgiu eletrònicu de cunfirma fields: Podes tènnere finas a 4 elementos ammustrados in una tabella in su profilu tuo header: PNG, GIF o JPG. Màssimu %{size}. Ant a èssere iscaladas a %{dimensions}px inbox_url: Còpia s'URL dae sa pàgina printzipale de su ripetidore chi boles impreare irreversible: Is tuts filtrados ant a isparèssere in manera irreversìbile, fintzas si prus a tardu s'at a bogare su filtru - locale: Sa limba de s'interfache de s'utente, de is lìteras de posta eletrònica e de is notìficas push - locked: Tenet bisòngiu chi aproves a manu is sighiduras + locale: S'idioma de s'interfache de s'utente, de is messàgios de posta eletrònica e de is notìficas push + locked: Gesti a manu chie ti podet sighire aprovende a manu is sighiduras password: Imprea a su mancu 8 caràteres - phrase: Su cunfrontu s'at a fàghere chena pigare in cunsideru si su testu de sa publicatzione est minùsculu o majùsculu o si tenet un'avisu de cuntenutu - scopes: A ite API s'aplicatzione at a pòdere atzèdere. Si seletziones un'àmbitu de livellu artu no tenes bisòngiu de nde seletzionare de sìngulos. + phrase: At a cuncordare sena cunsiderare is minùsculas e is majùsculas o is avisos de cuntenutu + scopes: A ite API s'aplicatzione at a pòdere atzèdere. Si seletzionas un'àmbitu de su livellu prus artu, non serbit a nde seletzionare de sìngulos. setting_aggregate_reblogs: No ammustres cumpartziduras noas pro tuts chi sunt istados cumpartzidos dae pagu (tenet efetu isceti pro is cumpartziduras retzidas noas) setting_default_sensitive: Is elementos multimediales sensìbiles benint cuados dae is cunfiguratziones predefinidas e si podent rivelare cun un'incarcu setting_display_media_default: Cua elementos multimediales marcados comente sensìbiles @@ -48,14 +54,14 @@ sc: setting_hide_network: Sa gente chi sighis o chi ti sighit no at a èssere ammustrada in su profilu tuo setting_noindex: Tenet efetu in su profilu pùblicu tuo e in is pàginas de is istados setting_show_application: S'aplicatzione chi impreas pro publicare tuts at a èssere ammustrada in sa visualizatzione de detàlliu de is tuts - setting_use_blurhash: Is gradientes sunt basados in subra de is colores de is immàgines cuadas ma imbelant totu is minujas + setting_use_blurhash: Is gradientes sunt basados in subra de is colores de is immàgines cuadas ma imbelant totu is detàllios setting_use_pending_items: Cua is atualizatziones in segus de un'incarcu imbetzes de iscùrrere in automàticu su flussu de publicatziones username: Su nòmine de utente tuo at a èssere ùnicu in %{domain} - whole_word: Cando sa paràula o sa fràsia crae est alfanumèrica ebbia s'at a aplicare isceti si currispondet a sa paràula intrea + whole_word: Cando sa crae (faeddu o fràsia) siat isceti alfanumèrica, s'at a aplicare isceti si currispondet a su faeddu intreu domain_allow: domain: Custu domìniu at a pòdere recuperare datos dae custu serbidore e is datos in intrada dae cue ant a èssere protzessados e archiviados email_domain_block: - domain: Custu podet èssere su nòmine de domìniu chi benit ammustradu in s'indiritzu de posta eletrònica, in su registru MX in ue si risolvet su domìniu o s'IP de su serbidore in ue si risolvet su registru MX. Custos ant a èssere verificados a pustis de sa registratzione e sa registratzione at a èssere refudada. + domain: Custu podet èssere su nòmine de domìniu chi benit ammustradu in s'indiritzu de posta eletrònica, in su registru MX in ue si risolvet su domìniu o s'IP de su serbidore in ue si risolvet su registru MX. Ant a èssere verificados cun sa registratzione de s'utente e sa registratzione at a èssere refudada. with_dns_records: S'at a fàghere unu tentativu de risòlvere is registros DNS de su domìniu e fintzas is risultados ant a èssere blocados featured_tag: name: 'Forsis boles impreare unu de custos:' @@ -64,22 +70,24 @@ sc: imports: data: Archìviu CSV esportadu dae un'àteru serbidore de Mastodon invite_request: - text: Custu si at a agiudare a revisionare sa dimanda tua + text: Custu at a agiudare a revisionare sa dimanda tua ip_block: comment: Optzionale. Regorda pro ite as agiuntu custa règula. - expires_in: Is indiritzos IP sunt una risursa limitada, fatu-fatu benint cumpartzidos e podent mudare de mere. Pro custa resone is blocos indefinidos de indiritzos IP non sunt racumandados. + expires_in: Is indiritzos IP sunt una risursa limitada, fatu-fatu benint cumpartzidos e podent mudare de mere. Pro custa resone is blocos indefinidos de indiritzos IP non sunt cussigiados. ip: Inserta un'indiritzu IPv4 o IPv6. Podes blocare intervallos intreos impreende sa sintassi CIDR. Dae cara e non ti bloches a sa sola! severities: no_access: Bloca s'atzessu a totu is resursas sign_up_requires_approval: As a dèpere aprovare is iscritziones noas severity: Sèbera ite at a sutzèdere cun is rechestas de custa IP + rule: + text: Descrie una règula o unu rechisitu pro utentes de custu serbidore. Chirca de dda fàghere curtza e simpre sessions: otp: 'Inserta su còdighe de atzessu in duos passos generadu dae s''aplicatzione mòbile tua o imprea unu de custos còdighes de recùperu:' - webauthn: Si est una crae USB assegura·ti de l'insertare e, si serbit, de la tocare. + webauthn: Si est unu dispositivu USB, assegura·ti de ddu insertare e, si serbit, toca inoghe. tag: - name: Podes isceti cambiare su minùsculu/maiùsculu de is lìteras, a esèmpiu, pro fàghere in manera chi siant prus fàtziles de lèghere + name: Podes isceti cambiare sa minùscula/maiùscula de is lìteras, pro esèmpiu, pro fàghere in manera chi siant prus fàtziles de lèghere user: - chosen_languages: Cando est incarcadu, isceti is tuts in is limbas ischertadas ant a èssere ammustrados in is lìnias de tempus pùblicas + chosen_languages: Cando est ativadu, isceti is tuts in is idiomas seberados ant a èssere ammustrados in is lìnias de tempus pùblicas labels: account: fields: @@ -98,7 +106,7 @@ sc: text: Avisu personalizadu type: Atzione types: - disable: Disativa + disable: Cungela none: Imbia un'avisu sensitive: Sensìbile silence: A sa muda @@ -114,13 +122,13 @@ sc: autofollow: Invita a sighire su contu tuo avatar: Immàgine de profilu bot: Custu contu est unu bot - chosen_languages: Filtra limbas + chosen_languages: Filtra idiomas confirm_new_password: Cunfirma sa crae noa confirm_password: Cunfirma sa crae context: Filtra cuntestos current_password: Crae atuale data: Data - discoverable: Ammustra custu contu in su diretòriu + discoverable: Cussìgia custu contu a àtere display_name: Nòmine visìbile email: Indiritzu de posta eletrònica expires_in: Iscadit a pustis de @@ -129,24 +137,24 @@ sc: honeypot: "%{label} (non compiles)" inbox_url: URL de sa cartella de intrada de su ripetidore irreversible: Cantzella imbetzes de cuare - locale: Limba de s'interfache - locked: Bloca su contu + locale: Idioma de s'interfache + locked: Rechede rechestas de sighidura max_uses: Nùmeru màssimu de impreos new_password: Crae noa note: Biografia otp_attempt: Còdighe in duos fatores password: Crae - phrase: Paràula o fràsia crae - setting_advanced_layout: Abìlita s'interfache web avantzada + phrase: Crae (faeddu o fràsia) + setting_advanced_layout: Ativa s'interfache web avantzada setting_aggregate_reblogs: Agrupa is cumpartziduras in is lìnias de tempus - setting_auto_play_gif: Riprodui is GIFs animadas in manera automàtica - setting_boost_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de cumpartzire - setting_crop_images: Retàllia is immàgines in is tuts no ismanniados a 16x9 - setting_default_language: Limba de publicatzione - setting_default_privacy: Riservadesa de publicatzione + setting_auto_play_gif: Riprodui is GIF animadas in automàticu + setting_boost_modal: Ammustra unu diàlogu de cunfirma in antis de cumpartzire + setting_crop_images: Retàllia a 16x9 is immàgines de is tuts no ismanniados + setting_default_language: Idioma de publicatzione + setting_default_privacy: Riservadesa de is publicatziones setting_default_sensitive: Marca semper is elementos multimediales comente sensìbiles - setting_delete_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de cantzellare unu tut - setting_disable_swiping: Disabìlita is movimentos de trisinadura + setting_delete_modal: Ammustra unu diàlogu de cunfirma in antis de cantzellare unu tut + setting_disable_swiping: Disativa animatziones setting_display_media: Visualizatzione de is elementos multimediales setting_display_media_default: Predefinida setting_display_media_hide_all: Cua totu @@ -156,10 +164,10 @@ sc: setting_noindex: Pedi de non ti fàghere inditzizare dae is motores de chirca setting_reduce_motion: Mìnima su movimentu in is animatziones setting_show_application: Rivela s'aplicatzione impreada pro imbiare tuts - setting_system_font_ui: Imprea su caràtere predefinidu de su sistema + setting_system_font_ui: Imprea sa tipografia predefinida de su sistema setting_theme: Tema de su situ setting_trends: Ammustra is tendèntzias de oe - setting_unfollow_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de acabbare de sighire a calicunu + setting_unfollow_modal: Ammustra unu diàlogu de cunfirma in antis de acabbare de sighire una persone setting_use_blurhash: Ammustra gradientes colorados pro is elementos multimediales cuados setting_use_pending_items: Modalidade lenta severity: Severidade @@ -167,19 +175,19 @@ sc: type: Casta de importatzione username: Nòmine utente username_or_email: Nòmine utente o indiritzu de posta eletrònica - whole_word: Paràula intrea + whole_word: Faeddu intreu email_domain_block: with_dns_records: Include registros MX e indiritzos IP de su domìniu featured_tag: name: Eticheta interactions: must_be_follower: Bloca is notìficas dae chie non ti sighit - must_be_following: Bloca is notìficas dae persones chi non sighis - must_be_following_dm: Bloca is messàgios diretos dae persones chi non sighis + must_be_following: Bloca is notìficas dae gente chi non sighis + must_be_following_dm: Bloca is messàgios diretos dae gente chi non sighis invite: comment: Cummenta invite_request: - text: Proite ti cheres iscrìere? + text: Pro ite boles aderire? ip_block: comment: Cummentu ip: IP @@ -189,24 +197,26 @@ sc: severity: Règula notification_emails: digest: Imbia lìteras eletrònicas de resumu - favourite: Calicunu at postu s'istadu tuo in is preferidos suos - follow: Calicunu at incumentzadu a ti sighire - follow_request: Calicunu at pedidu de ti sighire - mention: Calicunu t'at mentovadu - pending_account: Unu contu nou bisòngiat de una revisione - reblog: Calicunu at cumpartzidu s'istadu tuo - report: Est istadu imbiadu unu raportu nou + favourite: Una persone at postu s'istadu tuo in is preferidos suos + follow: Una persone t'at incumentzadu a sighire + follow_request: Una persone at pedidu de ti sighire + mention: Una persone t'at mentovadu + pending_account: Unu contu nou tenet bisòngiu de una revisione + reblog: Una persone at cumpartzidu s'istadu tuo + report: Imbiu de un'informe nou trending_tag: Un'eticheta non revisionada est in tendèntzia + rule: + text: Règula tag: - listable: Permite a cust'eticheta de apàrrere in is chircas e in sa cartella de is profilos + listable: Permite a custa eticheta de apàrrere in is chircas e in sa cartella de is profilos name: Eticheta - trendable: Permite a cust'eticheta de apàrrere in is tendèntzias - usable: Permite a is tuts de impreare cust'eticheta + trendable: Permite a custa eticheta de apàrrere in is tendèntzias + usable: Permite a is tuts de impreare custa eticheta 'no': Nono - recommended: Racumandadu + recommended: Cussigiadu required: mark: "*" - text: netzessàriu + text: obligatòriu title: sessions: webauthn: Imprea una de is craes de seguresa tuas pro intrare diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml new file mode 100644 index 0000000000..9f2e0ee312 --- /dev/null +++ b/config/locales/simple_form.si.yml @@ -0,0 +1,38 @@ +--- +si: + simple_form: + labels: + admin_account_action: + type: ක්‍රියාමාර්ගය + types: + sensitive: සංවේදීතාව + suspend: අත්හිටුවන්න + defaults: + bot: මෙය ස්වයං ක්‍රමලේඛගත ගිණුමකි + confirm_new_password: නව මුර පදය තහවුරු කරන්න + confirm_password: මුරපදය තහවුරු කරන්න + data: දත්ත + email: වි-තැපැල් ලිපිනය + new_password: නව මුරපදය + password: මුර පදය + setting_display_media_hide_all: සියල්ල සඟවන්න + setting_display_media_show_all: සියල්ල පෙන්වන්න + setting_hide_network: ඔබගේ ජාලය සඟවන්න + setting_theme: අඩවියේ තේමාව + sign_in_token_attempt: ආරක්‍ෂණ කේතය + username: පරිශීලක නාමය + username_or_email: පරිශීලක නාමය හෝ වි-තැපෑල + whole_word: සමස්ත වචනය + invite: + comment: අදහස + ip_block: + comment: අදහස + ip: අ.ජා. කෙ. (IP) + severities: + no_access: ප්‍රවේශය අවහිර කරන්න + severity: නීතිය + recommended: නිර්දේශිත + required: + mark: "*" + text: අවශ්‍යයි + 'yes': ඔව් diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 9e03d72548..01995011e2 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -35,9 +35,9 @@ sk: scopes: Ktoré API budú povolené aplikácii pre prístup. Ak vyberieš vrcholný stupeň, nemusíš už potom vyberať po jednom. setting_aggregate_reblogs: Nezobrazuj nové vyzdvihnutia pre príspevky, ktoré už boli len nedávno povýšené (týka sa iba nanovo získaných povýšení) setting_default_sensitive: Chúlostivé médiá sú štandardne ukryté, a môžu byť zobrazené kliknutím - setting_display_media_default: Ukry médiá označené ako citlivé + setting_display_media_default: Ukry médiá označené ako chúlostivé setting_display_media_hide_all: Vždy ukry všetky médiá - setting_display_media_show_all: Stále zobrazuj médiá označené ako citlivé + setting_display_media_show_all: Vždy zobrazuj médiá setting_hide_network: Koho následuješ, a kto následuje teba, nebude zobrazené na tvojom profile setting_noindex: Ovplyvňuje verejný profil a stránky s príspevkami setting_show_application: Aplikácia, ktorú používaš na písanie príspevkov, bude zobrazená v podrobnom náhľade jednotlivých tvojích príspevkov @@ -172,6 +172,5 @@ sk: 'no': Nie recommended: Odporúčané required: - mark: "*" text: povinné 'yes': Áno diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 771edf3837..20a07eccb2 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -88,7 +88,6 @@ sl: locked: Zaklenjen račun max_uses: Največje število uporabnikov new_password: Novo geslo - note: Bio otp_attempt: Dvofaktorska koda password: Geslo phrase: Ključna beseda ali fraza @@ -139,6 +138,5 @@ sl: 'no': Ne recommended: Priporočeno required: - mark: "*" text: zahtevano 'yes': Da diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 18211e69ea..80bab0e040 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -8,17 +8,23 @@ sq: acct: Specifikoni emrinepërdoruesit@përkatësi të llogarisë ku doni të lëvizet account_warning_preset: text: Mund të përdorni elementë sintakse mesazhesh, bie fjala, URL, hashtagë dhe përmendje - title: Opsionale. Jo i dukshëm për marrësin + title: Opsional. Jo i dukshëm për marrësin admin_account_action: include_statuses: Përdoruesi do të shohë cilët mesazhe kanë shkaktuar veprimin e moderimit ose sinjalizimin send_email_notification: Përdoruesi do të marrë një shpjegim mbi çfarë ndodhi me llogarinë e tij text_html: Opsionale. Mund të përdorni sintaksë mesazhesh. Për të kursyer kohë, mund të shtoni paracaktime sinjalizimesh type_html: Zgjidhni ç’të bëhet me %{acct} + types: + disable: Pengoji përdoruesit përdorimin e llogarisë së tij, por mos fshi apo fshih lëndën e tij. + none: Përdoreni këtë për t’i dërguar përdoruesit një sinjalizim, pa u kryer ndonjë veprim tjetër. + sensitive: Vëru krejt bashkëngjitjeve media të këtij përdoruesi shenjë si rezervat. + silence: Pengoji përdoruesit të qenët i aftë të postojë publikisht, fshihja postimet dhe njoftimet e tij personave që nuk i ndjekin ato. + suspend: Pengo çfarëdo ndërveprimi nga ose për te kjo llogari dhe fshi lëndën e saj. E prapësueshme brenda 30 ditësh. warning_preset_id: Opsionale. Mundeni sërish të shtoni tekst vetjak në fund të paracaktimit announcement: all_day: Nëse i vihet shenjë, do të shfaqen vetëm datat e intervalit kohor ends_at: Opsionale. Lajmërimi do të hiqet nga botimi në këtë kohë - scheduled_at: Lëreni të zbrazët që lajmërimi të botohet menjëherë + scheduled_at: Që lajmërimi të botohet menjëherë, lëreni të zbrazët starts_at: Opsionale. Në rast se lajmërimi juaj është i lidhur me një interval kohor të caktuar text: Mund të përdorni sintaksë mesazhesh. Ju lutemi, mos harroni që hapësira e lajmërimit do të hajë vend në ekranin e përdoruesit defaults: @@ -28,8 +34,9 @@ sq: context: Një ose disa kontekste kur duhet të zbatohet filtri current_password: Për qëllime sigurie, ju lutemi, jepni fjalëkalimin e llogarisë së tanishme current_username: Që ta ripohoni, ju lutemi, jepni emrin e përdoruesit të llogarisë së tanishme - digest: I dërguar vetëm pas një periudhe të gjatë pasiviteti dhe vetëm nëse keni marrë ndonjë mesazh personal gjatë mungesës suaj + digest: I dërguar vetëm pas një periudhe të gjatë pasiviteti dhe vetëm nëse keni marrë ndonjë mesazh personal gjatë mungesës tuaj discoverable: Drejtoria e profileve është një rrugë tjetër përmes së cilës llogaria juaj mund të mbërrijë te një publik më i gjerë + discoverable_no_directory: Lejojeni llogarinë tuaj të zbulohet nga të panjohur përmes rekomandimesh dhe veçorish të tjera email: Do t’ju dërgohet një email ripohimi fields: Te profili juaj mund të keni deri në 4 objekte të shfaqur si tabelë header: PNG, GIF ose JPG. E shumta %{size}. Do të ripërmasohet në %{dimensions}px @@ -39,7 +46,7 @@ sq: locked: Lyp që ju të miratoni dorazi ndjekësit password: Përdorni të paktën 8 shenja phrase: Do të kërkohet përputhje pavarësish se teksti ose sinjalizimi mbi lëndën e një mesazhi është shkruar me të mëdha apo me të vogla - scopes: Cilat API do të lejohet të përdorë aplikacioni. Nëse përzgjidhni një shkallë të epërme, nuk ju duhet të përzgjidhni individualet një nga një. + scopes: Cilat API do të lejohen të përdorin aplikacioni. Nëse përzgjidhni një shkallë të epërme, nuk ju duhet të përzgjidhni individualet një nga një. setting_aggregate_reblogs: Mos shfaq përforcime të reja për mesazhe që janë përforcuar tani së fundi (prek vetëm përforcime të marra rishtas) setting_default_sensitive: Media rezervat fshihet, si parazgjedhje, dhe mund të shfaqet me një klikim setting_display_media_default: Fshih media me shenjën rezervat @@ -48,7 +55,7 @@ sq: setting_hide_network: Cilët ndiqni dhe cilët ju ndjekin nuk do të shfaqen në profilin tuaj setting_noindex: Prek faqet e profilit tuaj publik dhe gjendjeve setting_show_application: Aplikacioni që përdorni për mesazhe do të shfaqet te pamja e hollësishme për mesazhet tuaj - setting_use_blurhash: Gradientët bazohen në ngjyrat e elementëve pamorë të fshehur, por fshehin çfarëdo hollësie + setting_use_blurhash: Gradientët bazohen në ngjyrat e elementëve pamorë të fshehur, por eerësojnë çfarëdo hollësie setting_use_pending_items: Fshihi përditësimet e rrjedhës kohore pas një klikimi, në vend të rrëshqitjes automatike nëpër prurje username: Emri juaj i përdoruesit do të jetë unik në %{domain} whole_word: Kur fjalëkyçi ose fraza është vetëm numerike, do të aplikohet vetëm nëse përputhet me krejt fjalën @@ -67,12 +74,14 @@ sq: text: Kjo do të na ndihmojë të shqyrtojmë aplikimin tuaj ip_block: comment: Opsionale. Mbani mend pse e shtuat këtë rregull. - expires_in: Adresat IP janë një burim i kufizuar, shpesh janë të përbashkëta dh ndryshojnë zot shpesh. Për këtë arsye, nuk rekomandohem blloqe IP të pafund. + expires_in: Adresat IP janë një burim i kufizuar, shpesh janë të përbashkëta dhe ndryshojnë zot shpesh. Për këtë arsye, nuk rekomandohen blloqe IP të pafund. ip: Jepni një adresë IPv4 ose IPv6. Duke përdorur sintaksën CIDR, mund të bllokoni intervale të tëra. Hapni sytë mos lini veten jashtë! severities: no_access: Blloko hyrje në krejt burimet sign_up_requires_approval: Regjistrime të reja do të duan miratimin tuaj severity: Zgjidhni ç’do të ndodhë me kërkesa nga kjo IP + rule: + text: Përshkruani një rregull ose një domosdoshmëri për përdoruesit në këtë shërbyes. Përpiquni të jetë i shkurtër dhe i thjeshtë sessions: otp: 'Jepni kodin dyfaktorësh të prodhuar nga aplikacioni i telefonit tuaj ose përdorni një nga kodet tuaj të rikthimeve:' webauthn: Nëse është një diskth USB, sigurohuni se e keni futur dhe, në qoftë e nevojshme, prekeni. @@ -98,11 +107,11 @@ sq: text: Sinjalizim vetjak type: Veprim types: - disable: Çaktivizo hyrjen - none: Mos bëj gjë + disable: Ngrije + none: Dërgo një sinjalizim sensitive: Rezervat - silence: Heshtje - suspend: Pezulloje dhe fshi në mënyrë të pakthyeshme të dhënat e llogarisë + silence: Kufizoje + suspend: Pezulloje warning_preset_id: Përdor një sinjalizim të paracaktuar announcement: all_day: Akt gjatë gjithë ditës @@ -120,7 +129,7 @@ sq: context: Filtroni kontekste current_password: Fjalëkalimi i tanishëm data: Të dhëna - discoverable: Shfaqe këtë llogari te drejtoria + discoverable: Sugjerojuni llogari të tjerëve display_name: Emër në ekran email: Adresë email expires_in: Skadon pas @@ -134,7 +143,7 @@ sq: max_uses: Numër maksimum përdorimesh new_password: Fjalëkalim i ri note: Jetëshkrim - otp_attempt: Kod mirëfilltësimi dyfaktorësh + otp_attempt: Kod dyfaktorëshi password: Fjalëkalim phrase: Fjalëkyç ose frazë setting_advanced_layout: Aktivizo ndërfaqe web të thelluar @@ -153,7 +162,7 @@ sq: setting_display_media_show_all: Shfaqi krejt setting_expand_spoilers: Mesazhet me sinjalizime mbi lëndën, zgjeroji përherë setting_hide_network: Fshiheni rrjetin tuaj - setting_noindex: Përfundim i indeksimit nga motor kërkimesh + setting_noindex: Zgjidhni lënien jashtë nga indeksim prej motorësh kërkimi setting_reduce_motion: Zvogëlo lëvizjen në animacione setting_show_application: Tregoje aplikacionin e përdorur për të dërguar mesazhe setting_system_font_ui: Përdor shkronja parazgjedhje të sistemit @@ -162,7 +171,7 @@ sq: setting_unfollow_modal: Shfaq dialog ripohimi përpara heqjes së ndjekjes për dikë setting_use_blurhash: Shfaq gradientë ngjyrash për media të fshehura setting_use_pending_items: Mënyra ngadalë - severity: Rreptësi + severity: Rëndësi sign_in_token_attempt: Kod sigurie type: Lloj importimi username: Emër përdoruesi @@ -174,8 +183,8 @@ sq: name: Hashtag interactions: must_be_follower: Blloko njoftime nga jo-ndjekës - must_be_following: Blloko njoftime nga persona që nuk i ndiqni - must_be_following_dm: Blloko mesazhe të drejtpërdrejtë nga persona që nuk i ndiqni + must_be_following: Blloko njoftime nga persona që s’i ndiqni + must_be_following_dm: Blloko mesazhe të drejtpërdrejtë nga persona që s’i ndiqni invite: comment: Komentoni invite_request: @@ -197,6 +206,8 @@ sq: reblog: Dikush përforcoi gjendjen tuaj report: Parashtrohet raportim i ri trending_tag: Një hashtag i pashqyrtuar zë e bëhet popullor + rule: + text: Rregull tag: listable: Lejoje këtë hashtag të shfaqet në kërkime dhe në drejtori profilesh name: Hashtag diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 6901b842c1..4210b0a990 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -16,7 +16,7 @@ sr: context: Један или више контекста у којима треба да се примени филтер digest: Послато после дужег периода неактивности са прегледом свих битних ствари које сте добили док сте били одсутни email: Биће вам послата е-пошта са потврдом - fields: Можете имати до 4 ставке приказане као табела на вашем профилу + fields: Можете имати до 4 ставке приказане као табела на вашем налогу header: PNG, GIF или JPG. Највише %{size}. Биће смањена на %{dimensions}px inbox_url: Копирајте URL са насловне стране релеја који желите користити irreversible: Филтриранe трубе ће нестати неповратно, чак и ако је филтер касније уклоњен @@ -29,8 +29,8 @@ sr: setting_display_media_default: Сакриј медије означене као осетљиве setting_display_media_hide_all: Увек сакриј све медије setting_display_media_show_all: Увек прикажи медије означене као осетљиве - setting_hide_network: Кога пратите и ко вас прати неће бити приказано на вашем профилу - setting_noindex: Утиче на Ваш јавни профил и статусне стране + setting_hide_network: Кога пратите и ко вас прати неће бити приказано на вашем налогу + setting_noindex: Утиче на Ваш јавни налог и статусне стране username: Ваш надимак ће бити јединствен на %{domain} whole_word: Када је кључна реч или фраза искључиво алфанумеричка, биће примењена само ако се подудара са целом речи imports: @@ -70,7 +70,7 @@ sr: display_name: Име за приказ email: Адреса е-поште expires_in: Истиче након - fields: Профилирај метаподатке + fields: Метаподаци налога header: Заглавље inbox_url: URL од релејног пријемног сандучета irreversible: Испустити уместо сакрити diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 8500f109ec..12ddc9547f 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -14,16 +14,20 @@ sv: send_email_notification: Användaren kommer att få en förklaring av vad som hände med sitt konto text_html: Extra. Du kan använda toot syntax. Du kan lägga till förvalda varningar för att spara tid type_html: Välj vad du vill göra med %{acct} + types: + disable: Förhindra användaren från att använda sitt konto, men ta inte bort eller dölj innehållet. warning_preset_id: Extra. Du kan lägga till valfri text i slutet av förinställningen announcement: all_day: När det är markerat visas endast datum för tidsintervallet ends_at: Frivillig. Meddelandet kommer automatiskt att publiceras just nu scheduled_at: Lämna tomt för att publicera meddelandet omedelbart + starts_at: Valfritt. Om ditt meddelande är bundet till ett visst tidsintervall defaults: autofollow: Användarkonton som skapas genom din inbjudan kommer automatiskt följa dig avatar: PNG, GIF eller JPG. Högst %{size}. Kommer att skalas ner till %{dimensions}px bot: Detta konto utför huvudsakligen automatiserade åtgärder och kanske inte övervakas digest: Skickas endast efter en lång period av inaktivitet och endast om du har fått några personliga meddelanden i din frånvaro + discoverable_no_directory: Tillåt att ditt konto kan ses genom rekommendationer och andra funktioner email: Du kommer att få ett bekräftelsemeddelande via e-post fields: Du kan ha upp till 4 objekt visade som en tabell på din profil header: PNG, GIF eller JPG. Högst %{size}. Kommer att skalas ner till %{dimensions}px @@ -41,6 +45,8 @@ sv: name: 'Du kan vilja använda en av dessa:' imports: data: CSV-fil som exporteras från en annan Mastodon-instans + rule: + text: Beskriv en kort och enkel regel för användare på denna server sessions: otp: 'Ange tvåfaktorkoden genererad från din telefonapp eller använd någon av dina återställningskoder:' user: @@ -50,16 +56,31 @@ sv: fields: name: Etikett value: Innehåll + account_alias: + acct: Namnet på det gamla kontot + account_migration: + acct: Namnet på det nya kontot account_warning_preset: title: Rubrik admin_account_action: + send_email_notification: Meddela användaren via e-post text: Anpassad varning + type: Åtgärd types: disable: Inaktivera inloggning none: Gör ingenting + sensitive: Känslig silence: Tysta + suspend: Stäng av + announcement: + all_day: Heldagsevenemang + ends_at: Evenemangets slut + scheduled_at: Schemalägg publicering + starts_at: Evenemangets början + text: Kungörelse defaults: autofollow: Bjud in till att följa ditt konto + avatar: Profilbild bot: Detta är ett botkonto chosen_languages: Filtrera språk confirm_new_password: Bekräfta nytt lösenord @@ -74,6 +95,8 @@ sv: fields: Profil-metadata header: Bakgrundsbild honeypot: "%{label} (fyll inte i)" + inbox_url: URL för reläinkorg + irreversible: Släng istället för att dölja locale: Språk locked: Lås konto max_uses: Högst antal användningar @@ -83,8 +106,10 @@ sv: password: Lösenord phrase: Nyckelord eller fras setting_advanced_layout: Aktivera avancerat webbgränssnitt + setting_aggregate_reblogs: Gruppera knuffar i tidslinjer setting_auto_play_gif: Spela upp animerade GIF-bilder automatiskt setting_boost_modal: Visa bekräftelsedialog innan du knuffar + setting_crop_images: Beskär bilder i icke-utökade tutningar till 16x9 setting_default_language: Språk setting_default_privacy: Postintegritet setting_default_sensitive: Markera alltid media som känsligt @@ -94,17 +119,27 @@ sv: setting_display_media_default: Standard setting_display_media_hide_all: Dölj alla setting_display_media_show_all: Visa alla + setting_expand_spoilers: Utöka alltid tutningar markerade med innehållsvarningar setting_hide_network: Göm ditt nätverk setting_noindex: Uteslutning av sökmotorindexering setting_reduce_motion: Minska rörelser i animationer + setting_show_application: Visa programmet som används för att skicka tutningar setting_system_font_ui: Använd systemets standardfont setting_theme: Sidans tema setting_trends: Visa dagens trender setting_unfollow_modal: Visa bekräftelse innan du slutar följa någon + setting_use_blurhash: Visa färgglada gradienter för dold media + setting_use_pending_items: Långsamt läge severity: Strikthet + sign_in_token_attempt: Säkerhetskod type: Importtyp username: Användarnamn username_or_email: Användarnamn eller e-mail + whole_word: Hela ord + email_domain_block: + with_dns_records: Inkludera MX-poster och IP-adresser för domänen + featured_tag: + name: Hashtag interactions: must_be_follower: Blockera aviseringar från icke-följare must_be_following: Blockera aviseringar från personer du inte följer @@ -113,16 +148,36 @@ sv: comment: Kommentar invite_request: text: Varför vill du gå med? + ip_block: + comment: Kommentar + ip: IP + severities: + no_access: Blockera åtkomst + sign_up_requires_approval: Begränsa registreringar + severity: Regel notification_emails: digest: Skicka sammandrag via e-post favourite: Skicka e-post när någon favoriserar din status follow: Skicka e-post när någon följer dig follow_request: Skicka e-post när någon begär att följa dig mention: Skicka e-post när någon nämner dig + pending_account: Nytt konto behöver granskas reblog: Skicka e-post när någon knuffar din status + report: Ny rapport har skickats + trending_tag: En ogranskad hashtag trendar + rule: + text: Regel + tag: + listable: Tillåt att denna hashtag visas i sökningar och förslag + name: Hashtag + trendable: Tillåt att denna hashtag visas under trender + usable: Tillåt tutningar att använda denna hashtag 'no': Nej recommended: Rekommenderad required: mark: "*" text: obligatorisk + title: + sessions: + webauthn: Använd en av dina säkerhetsnycklar för att logga in 'yes': Ja diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 23add1d455..8311e1d121 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -8,46 +8,53 @@ th: acct: ระบุ username@domain ของบัญชีที่คุณต้องการย้ายไป account_warning_preset: text: คุณสามารถใช้ไวยากรณ์โพสต์ เช่น URL, แฮชแท็ก และการกล่าวถึง - title: ตัวเลือกเพิ่มเติม ไม่ปรากฏแก่ผู้รับ + title: ไม่จำเป็น ไม่ปรากฏแก่ผู้รับ admin_account_action: include_statuses: ผู้ใช้จะเห็นว่าโพสต์ใดก่อให้เกิดการกระทำการควบคุมหรือคำเตือน send_email_notification: ผู้ใช้จะได้รับคำอธิบายว่าเกิดอะไรขึ้นกับบัญชีของเขา - text_html: ตัวเลือกเพิ่มเติม คุณสามารถใช้ไวยากรณ์โพสต์ คุณสามารถ เพิ่มคำเตือนที่ตั้งไว้ล่วงหน้า เพื่อประหยัดเวลา + text_html: ไม่จำเป็น คุณสามารถใช้ไวยากรณ์โพสต์ คุณสามารถ เพิ่มคำเตือนที่ตั้งไว้ล่วงหน้า เพื่อประหยัดเวลา type_html: เลือกสิ่งที่จะทำกับ %{acct} - warning_preset_id: ตัวเลือกเพิ่มเติม คุณยังสามารถเพิ่มข้อความที่กำหนดเองที่จุดสิ้นสุดของค่าที่ตั้งไว้ล่วงหน้า + types: + disable: ป้องกันไม่ให้ผู้ใช้ใช้บัญชีของเขา แต่ไม่ลบหรือซ่อนเนื้อหาของเขา + none: ใช้สิ่งนี้เพื่อส่งคำเตือนไปยังผู้ใช้ โดยไม่ทริกเกอร์การกระทำอื่นใด + sensitive: บังคับให้ทำเครื่องหมายไฟล์แนบสื่อของผู้ใช้นี้ทั้งหมดว่าละเอียดอ่อน + silence: ป้องกันไม่ให้ผู้ใช้สามารถโพสต์โดยมีการมองเห็นเป็นสาธารณะ ซ่อนโพสต์และการแจ้งเตือนของเขาจากผู้คนที่ไม่ได้กำลังติดตามผู้ใช้ + suspend: ป้องกันไม่ให้มีการโต้ตอบใด ๆ จากหรือไปยังบัญชีนี้และลบเนื้อหาของบัญชี แปลงกลับได้ภายใน 30 วัน + warning_preset_id: ไม่จำเป็น คุณยังสามารถเพิ่มข้อความที่กำหนดเองที่จุดสิ้นสุดของค่าที่ตั้งไว้ล่วงหน้า announcement: all_day: เมื่อกาเครื่องหมาย จะแสดงเฉพาะวันที่ของช่วงเวลาเท่านั้น - ends_at: ตัวเลือกเพิ่มเติม จะเลิกเผยแพร่ประกาศที่เวลานี้โดยอัตโนมัติ + ends_at: ไม่จำเป็น จะเลิกเผยแพร่ประกาศที่เวลานี้โดยอัตโนมัติ scheduled_at: เว้นว่างไว้เพื่อเผยแพร่ประกาศทันที - starts_at: ตัวเลือกเพิ่มเติม ในกรณีที่ประกาศของคุณผูกไว้กับช่วงเวลาที่เจาะจง + starts_at: ไม่จำเป็น ในกรณีที่ประกาศของคุณผูกไว้กับช่วงเวลาที่เจาะจง text: คุณสามารถใช้ไวยากรณ์โพสต์ โปรดระวังพื้นที่ที่ประกาศจะใช้ในหน้าจอของผู้ใช้ defaults: autofollow: ผู้คนที่ลงทะเบียนผ่านคำเชิญจะติดตามคุณโดยอัตโนมัติ avatar: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px - bot: บัญชีนี้ทำการกระทำแบบอัตโนมัติเป็นหลักและอาจไม่ได้รับการสังเกตการณ์ + bot: ส่งสัญญาณให้ผู้อื่นว่าบัญชีทำการกระทำแบบอัตโนมัติเป็นหลักและอาจไม่ได้รับการสังเกตการณ์ context: บริบทจำนวนหนึ่งหรือมากกว่าที่ตัวกรองควรใช้ current_password: เพื่อวัตถุประสงค์ด้านความปลอดภัย โปรดป้อนรหัสผ่านของบัญชีปัจจุบัน current_username: เพื่อยืนยัน โปรดป้อนชื่อผู้ใช้ของบัญชีปัจจุบัน digest: ส่งเฉพาะหลังจากไม่มีการใช้งานเป็นเวลานานและในกรณีที่คุณได้รับข้อความส่วนบุคคลใด ๆ เมื่อคุณไม่อยู่เท่านั้น - discoverable: ไดเรกทอรีโปรไฟล์เป็นอีกวิธีหนึ่งที่ทำให้บัญชีของคุณสามารถเข้าถึงผู้ชมได้กว้างขึ้น + discoverable: อนุญาตให้คนแปลกหน้าค้นพบบัญชีของคุณได้ผ่านคำแนะนำและคุณลักษณะอื่น ๆ + discoverable_no_directory: อนุญาตให้คนแปลกหน้าค้นพบบัญชีของคุณได้ผ่านคำแนะนำและคุณลักษณะอื่น ๆ email: คุณจะได้รับอีเมลยืนยัน fields: คุณสามารถมีได้มากถึง 4 รายการแสดงเป็นตารางในโปรไฟล์ของคุณ header: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px inbox_url: คัดลอก URL จากหน้าแรกของรีเลย์ที่คุณต้องการใช้ irreversible: โพสต์ที่กรองจะหายไปอย่างถาวร แม้ว่าจะเอาตัวกรองออกในภายหลัง locale: ภาษาของส่วนติดต่อผู้ใช้, อีเมล และการแจ้งเตือนแบบผลัก - locked: คุณต้องอนุมัติผู้ติดตามด้วยตนเอง + locked: ควบคุมผู้ที่สามารถติดตามคุณด้วยตนเองได้โดยอนุมัติคำขอติดตาม password: ใช้อย่างน้อย 8 ตัวอักษร phrase: จะถูกจับคู่โดยไม่คำนึงถึงตัวพิมพ์ใหญ่เล็กในข้อความหรือคำเตือนเนื้อหาของโพสต์ scopes: API ใดที่แอปพลิเคชันจะได้รับอนุญาตให้เข้าถึง หากคุณเลือกขอบเขตระดับบนสุด คุณไม่จำเป็นต้องเลือกแต่ละขอบเขต setting_aggregate_reblogs: ไม่แสดงการดันใหม่สำหรับโพสต์ที่เพิ่งดัน (มีผลต่อการดันที่ได้รับใหม่เท่านั้น) - setting_default_sensitive: ซ่อนสื่อที่ละเอียดอ่อนโดยค่าเริ่มต้นและสามารถเปิดเผยได้ด้วยการคลิก - setting_display_media_default: ซ่อนสื่อที่ถูกทำเครื่องหมายว่าละเอียดอ่อน + setting_default_sensitive: ซ่อนสื่อที่ละเอียดอ่อนเป็นค่าเริ่มต้นและสามารถเปิดเผยได้ด้วยการคลิก + setting_display_media_default: ซ่อนสื่อที่มีการทำเครื่องหมายว่าละเอียดอ่อน setting_display_media_hide_all: ซ่อนสื่อเสมอ setting_display_media_show_all: แสดงสื่อเสมอ - setting_hide_network: จะไม่แสดงผู้ที่คุณติดตามและผู้ที่ติดตามคุณในโปรไฟล์ของคุณ - setting_noindex: มีผลต่อโปรไฟล์สาธารณะและหน้าสถานะของคุณ - setting_show_application: จะแสดงแอปพลิเคชันที่คุณใช้เพื่อโพสต์ในมุมมองโดยละเอียดของโพสต์ของคุณ + setting_hide_network: จะซ่อนผู้ที่คุณติดตามและผู้ที่ติดตามคุณในโปรไฟล์ของคุณ + setting_noindex: มีผลต่อโปรไฟล์สาธารณะและหน้าโพสต์ของคุณ + setting_show_application: จะแสดงแอปพลิเคชันที่คุณใช้ในการโพสต์ในมุมมองโดยละเอียดของโพสต์ของคุณ setting_use_blurhash: การไล่ระดับสีอิงตามสีของภาพที่ซ่อนอยู่แต่ทำให้รายละเอียดใด ๆ คลุมเครือ setting_use_pending_items: ซ่อนการอัปเดตเส้นเวลาไว้หลังการคลิกแทนที่จะเลื่อนฟีดโดยอัตโนมัติ username: ชื่อผู้ใช้ของคุณจะไม่ซ้ำกันใน %{domain} @@ -65,8 +72,11 @@ th: invite_request: text: นี่จะช่วยให้เราตรวจทานใบสมัครของคุณ ip_block: + comment: ไม่จำเป็น จดจำเหตุผลที่คุณเพิ่มกฎนี้ severities: no_access: ปิดกั้นการเข้าถึงทรัพยากรทั้งหมด + sign_up_requires_approval: การลงทะเบียนใหม่จะต้องมีการอนุมัติของคุณ + severity: เลือกสิ่งที่จะเกิดขึ้นกับคำขอจาก IP นี้ sessions: otp: 'ป้อนรหัสสองปัจจัยที่สร้างโดยแอปในโทรศัพท์ของคุณหรือใช้หนึ่งในรหัสกู้คืนของคุณ:' tag: @@ -113,7 +123,7 @@ th: context: บริบทตัวกรอง current_password: รหัสผ่านปัจจุบัน data: ข้อมูล - discoverable: แสดงรายการบัญชีนี้ในไดเรกทอรี + discoverable: แนะนำบัญชีให้ผู้อื่น display_name: ชื่อที่แสดง email: ที่อยู่อีเมล expires_in: หมดอายุหลังจาก @@ -122,7 +132,7 @@ th: inbox_url: URL กล่องขาเข้าแบบรีเลย์ irreversible: ลบแทนที่จะซ่อน locale: ภาษาส่วนติดต่อ - locked: ล็อคบัญชี + locked: ต้องมีคำขอติดตาม max_uses: จำนวนการใช้งานสูงสุด new_password: รหัสผ่านใหม่ note: ชีวประวัติ @@ -143,8 +153,8 @@ th: setting_display_media_default: ค่าเริ่มต้น setting_display_media_hide_all: ซ่อนทั้งหมด setting_display_media_show_all: แสดงทั้งหมด - setting_expand_spoilers: ขยายโพสต์ที่ทำเครื่องหมายด้วยคำเตือนเนื้อหาเสมอ - setting_hide_network: ซ่อนเครือข่ายของคุณ + setting_expand_spoilers: ขยายโพสต์ที่มีการทำเครื่องหมายด้วยคำเตือนเนื้อหาเสมอ + setting_hide_network: ซ่อนกราฟทางสังคมของคุณ setting_noindex: เลือกไม่รับการทำดัชนีโดยเครื่องมือค้นหา setting_reduce_motion: ลดการเคลื่อนไหวในภาพเคลื่อนไหว setting_show_application: เปิดเผยแอปพลิเคชันที่ใช้ในการส่งโพสต์ @@ -181,16 +191,18 @@ th: severity: กฎ notification_emails: digest: ส่งอีเมลสรุป - favourite: ใครสักคนได้ชื่นชอบสถานะของคุณ + favourite: ใครสักคนได้ชื่นชอบโพสต์ของคุณ follow: ใครสักคนได้ติดตามคุณ follow_request: ใครสักคนได้ขอติดตามคุณ mention: ใครสักคนได้กล่าวถึงคุณ pending_account: บัญชีใหม่ต้องมีการตรวจทาน - reblog: ใครสักคนได้ดันสถานะของคุณ + reblog: ใครสักคนได้ดันโพสต์ของคุณ report: มีการส่งรายงานใหม่ trending_tag: แฮชแท็กที่ยังไม่ได้ตรวจทานกำลังนิยม + rule: + text: กฎ tag: - listable: อนุญาตให้แฮชแท็กนี้ปรากฏในการค้นหาและในไดเรกทอรีโปรไฟล์ + listable: อนุญาตให้แฮชแท็กนี้ปรากฏในการค้นหาและข้อเสนอแนะ name: แฮชแท็ก trendable: อนุญาตให้แฮชแท็กนี้ปรากฏภายใต้แนวโน้ม usable: อนุญาตให้โพสต์ใช้แฮชแท็กนี้ @@ -198,5 +210,8 @@ th: recommended: แนะนำ required: mark: "*" - text: ต้องระบุ + text: จำเป็น + title: + sessions: + webauthn: ใช้หนึ่งในกุญแจความปลอดภัยของคุณเพื่อลงชื่อเข้า 'yes': ใช่ diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 39ae58dc2e..88c96896c6 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -14,6 +14,12 @@ tr: send_email_notification: Kullanıcı, hesabına ne olduğuna dair bir açıklama alacak text_html: İsteğe bağlı. Toot sözdizimleri kullanabilirsiniz. Zamandan kazanmak için uyarı ön-ayarları ekleyebilirsiniz type_html: "%{acct} ile ne yapılacağını seçin" + types: + disable: Kullanıcının hesabını kullanmasını engelle ama içeriklerini silme veya gizleme. + none: Bunu, başka bir eylem tetiklemeden kullanıcıya bir uyarı göndermek için kullan. + sensitive: Bu kullanıcının tüm medya eklerini hassas olarak işaretlemeye zorla. + silence: Kullanıcının herkese açık şekilde gönderimde bulunmasını engelle, gönderilerini ve bildirimlerini onları takip etmeyen kişilerden gizle. + suspend: Bu hesaptan herhangi bir etkileşimi engelle ve içeriğini sil. 30 gün içerisinde geri alınabilir. warning_preset_id: İsteğe bağlı. Hazır ayarın sonuna hala özel metin ekleyebilirsiniz announcement: all_day: İşaretlendiğinde, yalnızca zaman aralığındaki tarihler görüntülenir @@ -30,7 +36,8 @@ tr: current_username: Onaylamak için lütfen şu anki hesabın kullanıcı adını girin digest: Sadece uzun bir süre hareketsiz kaldıktan sonra ve yalnızca yokluğunuzda herhangi bir kişisel mesaj aldıysanız gönderilir discoverable: Profil dizini, hesabınızın daha geniş bir kitleye ulaşmasının başka bir yoludur - email: Onay e-postası gönderilecek + discoverable_no_directory: Hesabınızın, öneriler ve diğer özellikler aracılığıyla yabancılar tarafından keşfedilmesine izin verin + email: Onay e-postası gönderilir fields: Profilinizde tablo olarak görüntülenen en fazla 4 ögeye sahip olabilirsiniz header: PNG, GIF ya da JPG. En fazla %{size}. %{dimensions}px boyutuna küçültülecek inbox_url: Kullanmak istediğiniz aktarıcının ön sayfasından URL'yi kopyalayın @@ -73,6 +80,8 @@ tr: no_access: Tüm kaynaklara erişimi engelle sign_up_requires_approval: Yeni kayıt onayınızı gerektirir severity: Bu IP'den gelen isteklere ne olacağını seçin + rule: + text: Bu sunucu üzerindeki kullanıcılar için bir kural veya gereksinimi tanımlayın. Kuralı kısa ve yalın tutmaya çalışın sessions: otp: Telefonunuzdaki two-factor kodunuzu giriniz veya kurtarma kodlarınızdan birini giriniz. webauthn: Bir USB anahtarıysa, taktığınızdan ve gerekirse üzerine tıkladığınızdan emin olun. @@ -101,7 +110,7 @@ tr: disable: Dondur none: Hiç birşey sensitive: Hassas - silence: Limit + silence: Sınırla suspend: Hesap verilerini askıya alın ve geri alınamaz şekilde silin warning_preset_id: Bir uyarı ön ayarı kullan announcement: @@ -138,7 +147,7 @@ tr: password: Şifre phrase: Anahtar kelime veya kelime öbeği setting_advanced_layout: Gelişmiş web arayüzünü etkinleştir - setting_aggregate_reblogs: Zaman çizelgesinde grup boostları + setting_aggregate_reblogs: Zaman çizelgesindeki boostları grupla setting_auto_play_gif: Hareketli GIF'leri otomatik oynat setting_boost_modal: Boostlamadan önce onay iletişim kutusu göster setting_crop_images: Genişletilmemiş tootlardaki resimleri 16x9 olarak kırp @@ -152,7 +161,7 @@ tr: setting_display_media_hide_all: Tümünü gizle setting_display_media_show_all: Tümünü göster setting_expand_spoilers: İçerik uyarılarıyla işaretli tootları her zaman genişlet - setting_hide_network: Ağınızı gizleyin + setting_hide_network: Sosyal grafiğini gizle setting_noindex: Arama motoru dizinine eklemeyi iptal et setting_reduce_motion: Animasyonlarda hareketi azalt setting_show_application: Tootları göndermek için kullanılan uygulamayı belirt @@ -189,14 +198,16 @@ tr: severity: Kural notification_emails: digest: Özet e-postaları gönder - favourite: Birisi durumunuzu beğendi + favourite: Birisi gönderinizi beğendi follow: Biri seni takip etti follow_request: Biri seni takip etmek istedi - mention: Biri senden bahsetti + mention: Birisi senden bahsetti pending_account: Yeni hesabın incelenmesi gerekiyor - reblog: Biri durumunuzu boostladı + reblog: Birisi gönderini boostladı report: Yeni rapor gönderildi trending_tag: İncelenmemiş bir etiket gündem oluyor + rule: + text: Kural tag: listable: Bu etiketin aramalarda ve profil dizininde görünmesine izin ver name: Etiket diff --git a/config/locales/simple_form.tt.yml b/config/locales/simple_form.tt.yml index 5eab4abff9..1b1d034b34 100644 --- a/config/locales/simple_form.tt.yml +++ b/config/locales/simple_form.tt.yml @@ -1 +1,28 @@ +--- tt: + simple_form: + labels: + account_warning_preset: + title: Исем + admin_account_action: + type: Ğämäl + types: + sensitive: Sizmäle + suspend: Искә алмау + defaults: + avatar: Аватар + data: Мәгълүмат + email: Почта адресы + header: Башлам + password: Парол + setting_display_media_default: Töpcay + username: Кулланучы исеме + invite: + comment: Аңлатма + ip_block: + comment: Аңлатма + ip: ІР + 'no': Юк + required: + mark: "*" + 'yes': Әйе diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index adfc07a095..2ff7bd0b3e 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -3,17 +3,23 @@ uk: simple_form: hints: account_alias: - acct: Вкажіть ім'я користувача@домен облікового запису, з якої ви хочете переміститися + acct: Вкажіть ім'я користувача@домен облікового запису, з якого ви хочете здійснити перенесення account_migration: - acct: Вкажіть ім'я користувача@домен облікового запису, на яку ви хочете переміститися + acct: Вкажіть ім'я користувача@домен облікового запису, на який ви хочете здійснити перенесення account_warning_preset: text: Ви можете використовувати синтаксис дмухів, наприклад URLи, хештеґи та згадки title: Необов'язково. Не відображається отримувачу admin_account_action: include_statuses: Користувач побачить, які дмухи призвели до адміністративних дій або попереджень send_email_notification: Користувач отримає роз'яснення, що сталося з його обліковим записом - text_html: Необов'язково. Ви можете використовувати синтакс дмухів. Ви можете додати шаблони попереджень, щоб заощадити час + text_html: Необов'язково. Ви можете використовувати синтаксис дмухів. Ви можете додати шаблони попереджень, щоб заощадити час type_html: Оберіть, що робити з %{acct} + types: + disable: Не давати користувачеві можливість використовувати свій обліковий запис, але не видаляти і не приховувати його вміст. + none: Використовуйте це, щоб надіслати попередження користувачеві без подальших дій. + sensitive: Примусово позначати всі медіа файли цього користувача делікатними. + silence: Заборонити користувачеві розміщувати загальнодоступні повідомлення, приховувати їхні повідомлення та повідомлення від людей, які не слідкують за ними. + suspend: Заборонити взаємодію з цим обліковим записом та видалити його вміст. Можна скасувати впродовж 30 днів. warning_preset_id: Необов'язково. Ви можете ще додати будь-який текст до кінця шаблону announcement: all_day: Якщо вибрано, відображаються лише дати діапазону часу @@ -30,6 +36,7 @@ uk: current_username: Для підтвердження, будь ласка, введіть ім'я користувача поточного облікового запису digest: Буде послано тільки після довгого періоду неактивності, та тільки якщо ви отримаєте персональне повідомлення у цей період discoverable: Ще один шлях, за яким про вас можуть дізнатися користувачі — каталог профілів + discoverable_no_directory: Дозволити знаходити ваш обліковий запис стороннім людям за допомогою рекомендацій та інших можливостей email: Вам надійде електронний лист з підтвердженням fields: До 4 елементів може бути відображено як таблиця у вашому профілі header: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px @@ -51,7 +58,7 @@ uk: setting_use_blurhash: Градієнти, що базуються на кольорах прихованих медіа, але роблять нерозрізненними будь-які деталі setting_use_pending_items: Не додавати нові повідомлення до стрічок миттєво. Показувати їх тільки після додаткового клацання. username: Ваше ім'я користувача буде унікальним у %{domain} - whole_word: Якщо пошукове слово або фраза містить тільки літери та цифри, воно має співпадати цілком + whole_word: Якщо пошукове слово або фраза містить лише літери та цифри, воно має збігатися цілком domain_allow: domain: Цей домен зможе отримувати дані з цього серверу. Вхідні дані будуть оброблені та збережені email_domain_block: @@ -65,6 +72,16 @@ uk: data: Файл CSV, експортований з іншого сервера Mastodon invite_request: text: Це допоможе нам розглянути вашу заяву + ip_block: + comment: Необов'язково. Нагадування, чому ви додали це правило. + expires_in: IP-адреси є вичерпним ресурсом, іноді ними користуються спільно й вони часто змінюють власників. Тому безтермінові блокування IP не рекомендовані. + ip: Введіть адресу IPv4 або IPv6. Ви можете блокувати цілі діапазони, використовуючи синтаксис CIDR. Будьте обережні, щоб не заблокувати себе! + severities: + no_access: Заблокувати доступ до всіх ресурсів + sign_up_requires_approval: Нові реєстрації потребуватимуть затвердження вами + severity: Виберіть, що буде відбуватися з запитами з цієї IP + rule: + text: Опис правила або вимоги для користувачів на цьому сервері. Спробуйте зробити його коротким і простим sessions: otp: Введите код двухфакторной аутентификации или используйте один из Ваших кодов восстановления. webauthn: Якщо це USB ключ, вставте його і, якщо необхідно, натисніть на нього. @@ -92,6 +109,7 @@ uk: types: disable: Вимкнути none: Нічого не робити + sensitive: Делікатне silence: Глушення suspend: Призупинити та незворотньо видалити дані облікового запису warning_preset_id: Використати шаблон попередження @@ -117,6 +135,7 @@ uk: expires_in: Закінчується після fields: Метадані профіля header: Заголовок + honeypot: "%{label} (не заповнюйте)" inbox_url: URL поштової скриньки ретранслятора irreversible: Видалити назавжди, а не просто сховати locale: Мова @@ -136,6 +155,7 @@ uk: setting_default_privacy: Видимість постів setting_default_sensitive: Позначити медіа як дражливе setting_delete_modal: Показувати діалог підтвердження під час видалення дмуху + setting_disable_swiping: Вимкнути рух проведення setting_display_media: Відображення медіа setting_display_media_default: За промовчанням setting_display_media_hide_all: Сховати всі @@ -169,6 +189,13 @@ uk: comment: Коментар invite_request: text: Чому ви хочете приєднатися? + ip_block: + comment: Коментар + ip: IP + severities: + no_access: Заборонити доступ + sign_up_requires_approval: Обмеження реєстрації + severity: Правило notification_emails: digest: Надсилати дайджест електронною поштою favourite: Надсилати листа, коли комусь подобається Ваш статус @@ -179,6 +206,8 @@ uk: reblog: Надсилати листа, коли хтось передмухує Ваш статус report: Надсилати електронного листа, коли з'являється нова скарга trending_tag: Надсилати електронного листа, коли нерозглянутий хештеґ стає популярним + rule: + text: Правило tag: listable: Дозволити появу цього хештеґа у каталозі профілів name: Хештеґ diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index dfe1ae36e5..d85de10eaa 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -14,6 +14,12 @@ vi: send_email_notification: Người dùng sẽ nhận được lời giải thích về những gì xảy ra với tài khoản của họ text_html: Tùy chọn. Bạn nên dùng cảnh cáo cài sẵn để tiết kiệm thời gian type_html: Chọn làm gì với %{acct} + types: + disable: Cấm người này tiếp tục đăng nhập, nhưng không xóa hoặc ẩn tút của họ. + none: Sử dụng để gửi cảnh cáo tới tài khoản này, không áp đặt trừng phạt. + sensitive: Mọi tập tin của tài khoản này tải lên đều sẽ bị gắn nhãn nhạy cảm. + silence: Cấm tài khoản này đăng tút công khai, ẩn tút của họ hiện ra với những người chưa theo dõi họ. + suspend: Vô hiệu hóa mọi hoạt động của tài khoản này và xóa sạch dữ liệu. Có thể mở lại trong vòng 30 ngày. warning_preset_id: Tùy chọn. Bạn vẫn có thể thêm ghi chú riêng announcement: all_day: Chỉ có khoảng thời gian được đánh dấu mới hiển thị @@ -24,12 +30,13 @@ vi: defaults: autofollow: Những người đăng ký sẽ tự động theo dõi bạn avatar: PNG, GIF hoặc JPG. Kích cỡ tối đa %{size}. Sẽ bị nén xuống %{dimensions}px - bot: Tài khoản này tự động thực hiện các hành động và không cần thiết theo dõi + bot: Tài khoản này tự động thực hiện các hành động và không được quản lý bởi người thật context: Chọn một hoặc nhiều nơi mà bộ lọc sẽ áp dụng current_password: Vì mục đích bảo mật, vui lòng nhập mật khẩu của tài khoản hiện tại current_username: Để xác nhận, vui lòng nhập tên người dùng của tài khoản hiện tại digest: Chỉ gửi sau một thời gian dài không hoạt động hoặc khi bạn nhận được tin nhắn (trong thời gian vắng mặt) - discoverable: Mọi người sẽ có thể tìm thấy bạn dễ dàng hơn + discoverable: Cho phép tài khoản của bạn xuất hiện trong gợi ý theo dõi và những tính năng khác + discoverable_no_directory: Cho phép mọi người tìm thấy tài khoản của bạn thông qua gợi ý theo dõi và các tính năng khác email: Bạn sẽ được gửi một email xác nhận fields: Được phép tạo tối đa 4 mục trên trang cá nhân của bạn header: PNG, GIF hoặc JPG. Kích cỡ tối đa %{size}. Sẽ bị nén xuống %{dimensions}px @@ -41,7 +48,7 @@ vi: phrase: Sẽ được hiện thị trong văn bản hoặc cảnh báo nội dung của một tút scopes: API nào ứng dụng sẽ được phép truy cập. Nếu bạn chọn quyền hạn cấp cao nhất, bạn không cần chọn từng phạm vi. setting_aggregate_reblogs: Nếu một tút đã được chia sẻ thì những lượt chia sẻ sau sẽ không hiển thị trên bảng tin nữa - setting_default_sensitive: Nội dung nhạy cảm mặc định là ẩn và chỉ hiển thị nếu nhấn vào + setting_default_sensitive: Mặc định là nội dung nhạy cảm và chỉ hiển thị nếu nhấn vào setting_display_media_default: Làm mờ những thứ được đánh dấu là nhạy cảm setting_display_media_hide_all: Không hiển thị setting_display_media_show_all: Luôn luôn hiển thị @@ -49,7 +56,7 @@ vi: setting_noindex: Ảnh hưởng đến trang cá nhân và tút của bạn setting_show_application: Tên ứng dụng bạn dùng để đăng tút sẽ hiện trong chi tiết bài đăng setting_use_blurhash: Lớp phủ mờ dựa trên màu sắc của hình ảnh nhạy cảm - setting_use_pending_items: Dồn lại toàn bộ tút mới và chỉ hiển thị khi nào nhấp chuột vào + setting_use_pending_items: Dồn lại toàn bộ tút mới và chỉ hiển thị khi nhấp chuột vào username: Tên người dùng của bạn sẽ là duy nhất trên %{domain} whole_word: Khi từ khóa hoặc cụm từ là chữ và số, nó sẽ chỉ hiện ra những từ chính xác như vậy domain_allow: @@ -73,13 +80,15 @@ vi: no_access: Chặn truy cập từ tất cả IP này sign_up_requires_approval: Bạn sẽ phê duyệt những đăng ký mới từ IP này severity: Chọn hành động nếu nhận được yêu cầu từ IP này + rule: + text: Mô tả một quy tắc bắt buộc trên máy chủ này. Nên để ngắn và đơn giản. sessions: otp: 'Nhập mã xác thực hai bước được tạo bởi ứng dụng điện thoại của bạn hoặc dùng một trong các mã khôi phục của bạn:' webauthn: Nếu đây là USB key, hãy cắm vào và thử xoay chiều. tag: name: Bạn có thể thay đổi cách viết hoa các chữ cái để giúp nó dễ đọc hơn user: - chosen_languages: Chỉ những tút viết bằng các ngôn ngữ được chọn sẽ hiển thị trên bảng tin + chosen_languages: Chỉ hiển thị những tút viết bằng các ngôn ngữ được chọn sau labels: account: fields: @@ -99,11 +108,11 @@ vi: type: Hành động types: disable: Tạm khóa - none: Cấm upload + none: Cảnh cáo sensitive: Nhạy cảm silence: Tạm ẩn suspend: Vô hiệu hóa - warning_preset_id: Dùng cảnh cáo cài sẵn + warning_preset_id: Dùng mẫu có sẵn announcement: all_day: Sự kiện diễn ra hằng ngày ends_at: Kết thúc sự kiện @@ -116,7 +125,7 @@ vi: bot: Đây là tài khoản Bot chosen_languages: Chọn ngôn ngữ confirm_new_password: Xác nhận mật khẩu mới - confirm_password: Xác nhận mật khẩu + confirm_password: Nhập lại mật khẩu context: Áp dụng current_password: Mật khẩu hiện tại data: Dữ liệu @@ -137,14 +146,14 @@ vi: otp_attempt: Xác thực hai bước password: Mật khẩu phrase: Từ khóa hoặc cụm từ - setting_advanced_layout: Kích hoạt giao diện nhiều cột - setting_aggregate_reblogs: Không hiện lượt chia sẻ trùng + setting_advanced_layout: Bật giao diện nhiều cột + setting_aggregate_reblogs: Không hiện lượt chia sẻ trùng lặp setting_auto_play_gif: Tự động phát ảnh GIF setting_boost_modal: Yêu cầu xác nhận trước khi chia sẻ tút setting_crop_images: Hiển thị ảnh theo tỉ lệ 16x9 setting_default_language: Ngôn ngữ đăng setting_default_privacy: Kiểu đăng - setting_default_sensitive: Luôn đánh dấu ảnh/video là nội dung nhạy cảm + setting_default_sensitive: Ảnh/video là nội dung nhạy cảm setting_delete_modal: Yêu cầu xác nhận trước khi xóa tút setting_disable_swiping: Vô hiệu hóa vuốt màn hình setting_display_media: Nội dung nhạy cảm @@ -152,7 +161,7 @@ vi: setting_display_media_hide_all: Ẩn toàn bộ setting_display_media_show_all: Hiện toàn bộ setting_expand_spoilers: Luôn hiển thị đầy đủ nội dung tút - setting_hide_network: Ẩn kết nối của bạn + setting_hide_network: Ẩn quan hệ của bạn setting_noindex: Không xuất hiện trong công cụ tìm kiếm setting_reduce_motion: Giảm chuyển động ảnh GIF setting_show_application: Hiện ứng dụng đã dùng để đăng tút @@ -179,7 +188,7 @@ vi: invite: comment: Bình luận invite_request: - text: Tại sao bạn muốn tham gia? + text: Vì sao bạn muốn tham gia? ip_block: comment: Mô tả ip: IP @@ -195,15 +204,17 @@ vi: mention: Ai đó nhắc đến bạn pending_account: Tài khoản mới cần phê duyệt reblog: Ai đó chia sẻ tút của bạn - report: Ai đó gửi báo cáo kiểm duyệt + report: Ai đó gửi báo cáo trending_tag: Một hashtag chưa được phê duyệt đang là xu hướng + rule: + text: Quy tắc tag: - listable: Cho phép hashtag này xuất hiện trong tìm kiếm và trên tiểu sử cá nhân + listable: Cho phép hashtag này xuất hiện trong tìm kiếm và đề xuất name: Hashtag trendable: Cho phép hashtag này xuất hiện trong xu hướng usable: Cho phép dùng hashtag này trong tút 'no': Tắt - recommended: Khuyến nghị + recommended: Đề xuất required: mark: "*" text: yêu cầu diff --git a/config/locales/simple_form.zgh.yml b/config/locales/simple_form.zgh.yml index ed9ea90f82..1d55f34b52 100644 --- a/config/locales/simple_form.zgh.yml +++ b/config/locales/simple_form.zgh.yml @@ -36,6 +36,4 @@ zgh: tag: name: ⵀⴰⵛⵟⴰⴳ 'no': ⵓⵀⵓ - required: - mark: "*" 'yes': ⵢⴰⵀ diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 35222c076d..b578b331cf 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -3,24 +3,30 @@ zh-CN: simple_form: hints: account_alias: - acct: 指定您想要迁移过来的帐号的 用户名@站点域名 + acct: 指定你想要迁移过来的原帐号:用户名@站点域名 account_migration: - acct: 指定你想迁移过去的帐号的 用户名@站点域名 + acct: 指定你想迁移过去的目标帐号:用户名@站点域名 account_warning_preset: text: 你可以使用嘟文格式,例如加入 URL、话题标签和“@” title: 可选。对接收者不可见 admin_account_action: include_statuses: 用户将会看到哪些嘟文导致了审核行为或警告 - send_email_notification: 用户将收到对其账号上发生的事的解释 + send_email_notification: 用户将收到关于其账号异动的解释 text_html: 可选。你可以使用嘟文格式。你可以预置警告以节省时间 type_html: 用%{acct}选择做什么 + types: + disable: 禁止用户使用账户,但不会删除或隐藏账户内容。 + none: 用它来向用户发送警告,不会触发其他操作。 + sensitive: 强制将此用户的所有媒体文件标记为敏感内容。 + silence: 阻止用户发送公开嘟文,除了关注者以外,其他人都无法看到他的嘟文和通知。 + suspend: 阻止此账户的任何交互并删除其内容。30天内可以撤销操作。 warning_preset_id: 可选。你可以在预置文本末尾添加自定义文本 announcement: all_day: 如果选中,只有该时间段内的日期会显示。 ends_at: 可选。公告会在该时间点自动取消发布 scheduled_at: 留空的话,公告会立即发布。 starts_at: 可选。你可以让你的公告只在特定时间段显示。 - text: 你可以使用嘟文格式。但是请注意不要让公告占据太多用户屏幕上的空间。 + text: 你可以使用嘟文格式。但请注意不要让公告占据用户太多屏幕空间。 defaults: autofollow: 通过邀请链接注册的用户将会自动关注你 avatar: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px @@ -29,7 +35,8 @@ zh-CN: current_password: 为了安全起见,请输入当前账号的密码 current_username: 请输入当前账号的用户名以确认 digest: 仅在你长时间未登录,且收到了私信时发送 - discoverable: 用户目录能够让您的帐号广为人知 + discoverable: 用户目录能够让你的帐号广为人知 + discoverable_no_directory: 允许别人通过推荐和其他途径发现你的账户 email: 我们会向你发送一封确认邮件 fields: 这将会在个人资料页上以表格的形式展示,最多 4 个项目 header: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px @@ -38,46 +45,48 @@ zh-CN: locale: 用户界面、电子邮件和推送通知中使用的语言 locked: 你需要手动审核所有关注请求 password: 至少需要8个字符 - phrase: 匹配将无视大小写和嘟文的内容警告 - scopes: 哪些 API 被允许使用。如果你选中了更高一级的范围,就不能单个选中了。 - setting_aggregate_reblogs: 请不要显示最近已经被转嘟过的转嘟(只会影响新收到的转嘟) + phrase: 匹配将忽略嘟文或内容警告里的字母大小写 + scopes: 哪些 API 被允许使用。如果你勾选了更高一级的范围,就不用单独选中子项目了。 + setting_aggregate_reblogs: 不显示最近已经被转嘟过的嘟文(只会影响新收到的转嘟) setting_default_sensitive: 敏感内容默认隐藏,并在点击后显示 setting_display_media_default: 隐藏被标记为敏感内容的媒体 - setting_display_media_hide_all: 总是隐藏所有媒体 - setting_display_media_show_all: 总是显示被标记为敏感内容的媒体 - setting_hide_network: 你关注的人和关注你的人将不会在你的个人资料页上展示 + setting_display_media_hide_all: 隐藏所有媒体 + setting_display_media_show_all: 显示所有的媒体 + setting_hide_network: 你的关注者和你关注的人将不会在你的个人资料页上展示 setting_noindex: 此设置会影响到你的公开个人资料以及嘟文页面 setting_show_application: 你用来发表嘟文的应用程序将会在你嘟文的详细内容中显示 setting_use_blurhash: 渐变是基于模糊后的隐藏内容生成的 setting_use_pending_items: 关闭自动滚动更新,时间轴会在点击后更新 - username: 你的用户名在 %{domain} 上是独特的 - whole_word: 如果关键词只包含字母和数字,就只会在整个词被匹配时才会套用 + username: 你的用户名在 %{domain} 上是唯一的 + whole_word: 如果关键词只包含字母和数字,将只在词语完全匹配时才会应用 domain_allow: - domain: 该站点将能够从该服务器上拉取数据,并且从那里发过来的数据也会被处理和存储。 + domain: 该站点将能够从该服务器上拉取数据,并处理和存储收到的数据。 email_domain_block: domain: 这里可以是邮箱地址中的域名部分、域名解析到的 MX 记录,或者 MX 记录解析到的域名。这些检查会在用户注册时进行,如果邮箱域名被封禁,那么注册会被拒绝。 with_dns_records: Mastodon 会尝试解析所给域名的 DNS 记录,然后把解析结果一并封禁 featured_tag: name: 你可能想要使用以下之一: form_challenge: - current_password: 您正在进入安全区域 + current_password: 你正在进入安全区域 imports: data: 从其他 Mastodon 服务器导出的 CSV 文件 invite_request: text: 这会有助于我们处理你的申请 ip_block: - comment: 可选。请记住为什么您添加了此规则。 + comment: 可选。请记住为什么你添加了此规则。 expires_in: IP 地址是一种有限的资源,它们有时是共享的,并且常常变化。因此,不推荐无限期的 IP 封禁。 - ip: 输入 IPv4 或 IPv6 地址。您可以使用 CIDR 语法屏蔽整个范围。小心不要屏蔽自己! + ip: 输入 IPv4 或 IPv6 地址。你可以使用 CIDR 语法屏蔽 IP 段。小心不要屏蔽自己! severities: no_access: 阻止访问所有资源 - sign_up_requires_approval: 新的注册需要您的批准 + sign_up_requires_approval: 新注册需要你的批准 severity: 选择如何处理来自此 IP 的请求。 + rule: + text: 描述这个服务器上的用户规则或要求。尽量确保简洁、清晰易懂 sessions: otp: 输入你手机应用上生成的双重认证码,或者任意一个恢复代码: webauthn: 如果是 USB 密钥,请确保将其插入,如有必要,请点击它。 tag: - name: 您只能改变字母的大小写,让它更易读 + name: 你只能改变字母的大小写,让它更易读 user: chosen_languages: 仅选中语言的嘟文会出现在公共时间轴上(全不选则显示所有语言的嘟文) labels: @@ -98,10 +107,10 @@ zh-CN: text: 内容警告 type: 动作 types: - disable: 禁用 + disable: 冻结 none: 忽略 sensitive: 敏感内容 - silence: 静音 + silence: 隐藏 suspend: 停用并永久删除账号数据 warning_preset_id: 使用预置警告 announcement: @@ -137,7 +146,7 @@ zh-CN: otp_attempt: 双重认证代码 password: 密码 phrase: 关键词 - setting_advanced_layout: 启用高级 web 界面 + setting_advanced_layout: 启用高级 Web 界面 setting_aggregate_reblogs: 在时间轴中合并转嘟 setting_auto_play_gif: 自动播放 GIF 动画 setting_boost_modal: 在转嘟前询问我 @@ -197,6 +206,8 @@ zh-CN: reblog: 当有用户转嘟了我的嘟文时,发送电子邮件提醒我 report: 在提交新举报时,发送电子邮件提醒我 trending_tag: 当未经审核的话题成为当前热门时发邮件提醒 + rule: + text: 规则 tag: listable: 允许这个话题标签在用户目录中显示 name: 话题标签 @@ -209,5 +220,5 @@ zh-CN: text: 必填 title: sessions: - webauthn: 使用您的安全密钥登录 + webauthn: 使用你的安全密钥登录 'yes': 是 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index eaed6e32b9..2f65e52133 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -14,6 +14,12 @@ zh-HK: send_email_notification: 使用者將收到帳戶發生之事情的解釋 text_html: 選用。你能使用 toot 語法。你可 新增警告預設 來節省時間 type_html: 設定要使用 %{acct} 做的事 + types: + disable: 禁止該使用者使用他們的帳號,但是不刪除或隱藏他們的內容。 + none: 用這個來警告該使用者,而不進行其他操作。 + sensitive: 強制標記此用戶的所有媒體附件為敏感內容。 + silence: 禁止該使用者發表公開嘟文,沒有跟隨他們的帳號不會看到來自該用戶的嘟文和通知。 + suspend: 禁止該帳號的所有互動並刪除其內容。此操作在三十日內可以被復原。 warning_preset_id: 選用。你仍可在預設訊息的結尾加入自訂文字 announcement: all_day: 勾選後,只會顯示出時間範圍中的日期部分 @@ -30,6 +36,7 @@ zh-HK: current_username: 請輸入目前帳戶的使用者名稱以確認 digest: 僅在你長時間未登錄,且收到了私信時發送 discoverable: 個人資料目錄可以讓你的帳號更廣為人知 + discoverable_no_directory: 允許他人通過推薦與其他功能探索你的賬號 email: 你將收到一封確認電郵 fields: 個人資料頁可顯示多至 4 個項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px @@ -73,6 +80,8 @@ zh-HK: no_access: 封鎖所有資源存取 sign_up_requires_approval: 新登記申請正等候你審批 severity: 請設定伺服器將如何處理來自這個 IP 位址的請求 + rule: + text: 請描述在此伺服器上用戶需要遵守的規則或要求。請盡量保持簡短易明。 sessions: otp: 輸入你手機上生成的雙重認證碼,或者任意一個恢復代碼: webauthn: 如果它是 USB 安全鑰匙的話,請先插入電腦。如鑰匙設計有需要,請按鍵啟用。 @@ -197,6 +206,8 @@ zh-HK: reblog: 當有人轉推你的文章時 report: 收到新檢舉時 trending_tag: 當未審核的標籤成為當前熱門時 + rule: + text: 規則 tag: listable: 允許此主題標籤在搜尋及個人檔案目錄中顯示 name: 主題標籤 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 000ec529b0..8b4440013d 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -8,14 +8,25 @@ zh-TW: acct: 指定欲移動至之帳戶的 使用者名稱@站台 account_warning_preset: text: 您可使用嘟文語法,例如網址、「#」標籤和提及功能 + title: 可選。不會向收件者顯示 admin_account_action: + include_statuses: 使用者可看到導致檢舉或警告的嘟文 send_email_notification: 使用者將收到帳戶發生之事情的解釋 text_html: 選用。您能使用嘟文語法。您可 新增警告預設 來節省時間 type_html: 設定要使用 %{acct} 做的事 + types: + disable: 禁止該使用者使用他們的帳戶,但是不刪除或隱藏他們的內容。 + none: 使用這個寄送警告給該使用者,而不進行其他動作。 + sensitive: 強制標記此使用者所有媒體為敏感內容。 + silence: 禁止該使用者發公開嘟文,從無跟隨他們的帳戶中隱藏嘟文和通知。 + suspend: 禁止所有對該帳戶任何互動,並且刪除其內容。三十日內可以撤回。 warning_preset_id: 選用。您仍可在預設的結尾新增自訂文字 announcement: all_day: 核取後,只會顯示出時間範圍中的日期部分 + ends_at: 可選的,公告會在該時間點自動取消發布 scheduled_at: 空白則立即發布公告 + starts_at: 可選的,讓公告在特定時間範圍內顯示 + text: 您可以使用嘟文語法,但請小心別讓公告太鴨霸而佔據使用者的整個版面。 defaults: autofollow: 通過邀請網址註冊的使用者將自動關注你 avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會等比例縮減成 %{dimensions} 像素 @@ -25,6 +36,7 @@ zh-TW: current_username: 請輸入目前帳戶的使用者名稱以確認 digest: 僅在你長時間未登入且在未登入期間收到私訊時傳送 discoverable: 加入個人資料目錄能接觸更多閱聽眾 + discoverable_no_directory: 允許陌生人透過推薦與其他功能探索您的帳號 email: 您將收到一封確認電子郵件 fields: 您可在個人資料上有至多 4 個以表格形式顯示的項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會按比例縮小成 %{dimensions} 像素 @@ -43,8 +55,15 @@ zh-TW: setting_hide_network: 你關注的人與關注你的人將不會在你的個人資料頁上顯示 setting_noindex: 會影響您的公開個人資料與嘟文頁面 setting_show_application: 您用來發嘟文的應用程式將會在您嘟文的詳細檢視顯示 + setting_use_blurhash: 漸層圖樣是基於隱藏媒體內容顏色產生,所有細節會變得模糊 + setting_use_pending_items: 關閉自動捲動更新,時間軸只會在點擊後更新 username: 您的使用者名稱將在 %{domain} 是獨一無二的 whole_word: 如果關鍵字或詞組僅有字母與數字,則其將只在符合整個單字的時候才會套用 + domain_allow: + domain: 此域名將能夠攫取本站資料,而自域名該發出的資料也會於本站處理和留存。 + email_domain_block: + domain: 這裡可以是電子郵件地址中的域名、域名解析到的 MX 記錄、或 MX 記錄解析到的伺服器 IP 地址。新使用者註冊時會比對上述資料,如果相符時將拒絕相關註冊。 + with_dns_records: Mastodon 會嘗試解析所給域名的 DNS 記錄,解析結果一致者將一併封鎖 featured_tag: name: 您可能想使用其中一個: form_challenge: @@ -53,8 +72,19 @@ zh-TW: data: 從其他 Mastodon 伺服器匯出的 CSV 檔案 invite_request: text: 這會協助我們審核您的應用程式 + ip_block: + comment: 可選的,但請記得您為何添加這項規則。 + expires_in: IP 位址是經常共用或轉手的有限資源,不建議無限期地封鎖特定 IP 位址。 + ip: 請輸入 IPv4 或 IPv6 位址,亦可以用 CIDR 語法以封鎖整個 IP 區段。小心不要把自己給一併封鎖掉囉! + severities: + no_access: 封鎖對所有資源存取 + sign_up_requires_approval: 新註冊申請需要先經過您的審核 + severity: 請選擇將如何處理來自這個 IP 位址的請求 + rule: + text: 說明使用者在此伺服器上需遵守的規則或條款。試著維持各項條款簡短而明瞭。 sessions: otp: 請輸入產生自您手機 App 的兩步驟驗證碼,或輸入其中一個復原代碼: + webauthn: 如果它是 USB 安全金鑰的話,請確認已正確插入,如有需要請觸擊。 tag: name: 您只能變更大小寫,例如,以使其更易讀。 user: @@ -64,6 +94,10 @@ zh-TW: fields: name: 標籤 value: 內容 + account_alias: + acct: 舊帳號名稱 + account_migration: + acct: 新帳號名稱 account_warning_preset: text: 預設文字 title: 標題 @@ -88,7 +122,7 @@ zh-TW: defaults: autofollow: 邀請別人關注你的帳戶 avatar: 大頭貼 - bot: 此帳號是台機器人 + bot: 此帳戶是台機器人 chosen_languages: 過濾語言 confirm_new_password: 確認新密碼 confirm_password: 確認密碼 @@ -97,14 +131,15 @@ zh-TW: data: 資料 discoverable: 在目錄列出此帳戶 display_name: 顯示名稱 - email: 電子信箱位址 + email: 電子信箱地址 expires_in: 失效時間 fields: 個人資料中繼資料 header: 頁面頂端 + honeypot: "%{label} (請勿填寫)" inbox_url: 中繼收件匣的 URL irreversible: 放棄而非隱藏 locale: 介面語言 - locked: 鎖定帳號 + locked: 鎖定帳戶 max_uses: 最大使用次數 new_password: 新密碼 note: 簡介 @@ -115,10 +150,12 @@ zh-TW: setting_aggregate_reblogs: 時間軸中的群組轉嘟 setting_auto_play_gif: 自動播放 GIF 動畫 setting_boost_modal: 在轉嘟前先詢問我 + setting_crop_images: 將未展開嘟文中的圖片裁剪至 16x9 setting_default_language: 嘟文語言 setting_default_privacy: 嘟文可見範圍 setting_default_sensitive: 總是將媒體標記為敏感內容 setting_delete_modal: 刪除嘟文前先詢問我 + setting_disable_swiping: 停用滑動手勢 setting_display_media: 媒體顯示 setting_display_media_default: 預設 setting_display_media_hide_all: 全部隱藏 @@ -132,12 +169,16 @@ zh-TW: setting_theme: 站點主題 setting_trends: 顯示本日趨勢 setting_unfollow_modal: 取消關注某人前先詢問我 + setting_use_blurhash: 將隱藏媒體以彩色漸變圖樣表示 setting_use_pending_items: 限速模式 severity: 優先級 + sign_in_token_attempt: 安全代碼 type: 匯入類型 username: 使用者名稱 - username_or_email: 使用者名稱或電子信箱位址 + username_or_email: 使用者名稱或電子信箱地址 whole_word: 整個詞彙 + email_domain_block: + with_dns_records: 包括網域的 MX 記錄和 IP 位址 featured_tag: name: "「#」標籤" interactions: @@ -164,6 +205,9 @@ zh-TW: pending_account: 需要審核的新帳戶 reblog: 當有使用者轉嘟你的嘟文時,傳送電子信件通知 report: 當提交新檢舉時傳送電子郵件 + trending_tag: 未經審核的標籤正在炎上中 + rule: + text: 規則 tag: listable: 允許此主題標籤在搜尋及個人檔案目錄中顯示 name: 主題標籤 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index bc214a4444..0be6d3bfae 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -7,7 +7,6 @@ sk: active_count_after: aktívni active_footnote: Mesačne aktívnych užívateľov (MAU) administered_by: 'Správcom je:' - api: API apps: Aplikácie apps_platforms: Užívaj Mastodon z iOSu, Androidu, a iných platforiem browse_directory: Prehľadávaj databázu profilov, a filtruj podľa záujmov @@ -26,6 +25,7 @@ sk: Je využívaný pre potreby federovania a nemal by byť blokovaný, pokiaľ nechceš zablokovať celý server, čo ide lepšie dosiahnúť cez blokovanie domény. learn_more: Zisti viac privacy_policy: Zásady súkromia + rules: Serverové pravidlá see_whats_happening: Pozoruj, čo sa deje server_stats: 'Serverové štatistiky:' source_code: Zdrojový kód @@ -39,12 +39,13 @@ sk: terms: Podmienky užitia unavailable_content: Nedostupný obsah unavailable_content_description: - domain: Server reason: 'Dôvod:' rejecting_media: 'Mediálne súbory z týchto serverov nebudú spracované, alebo ukladané, a nebudú z nich zobrazované žiadne náhľady, vyžadujúc ručné prekliknutie priamo až k pôvodnému súboru:' rejecting_media_title: Triedené médiá silenced: 'Príspevky z týchto serverov budú skryté z verejných osí a z konverzácií, a nebudú vytvorené žiadné oboznámena ohľadom aktivity ich užívateľov, pokiaľ ich nenásleduješ:' silenced_title: Utíšené servery + suspended: 'Z týchto serverov nebudú spracovávané, ukladané, alebo vymieňané žiadne dáta, čo urobí nemožnou akúkoľvek interakciu, alebo komunikáciu s užívateľmi z týchto serverov:' + suspended_title: Vylúčené servery unavailable_content_html: Vo všeobecnosti, Mastodon ti dovoľuje vidieť obsah, a komunikovať s užívateľmi akéhokoľvek iného serveru v rámci fediversa. Toto sú výnimky, ktoré boli vytvorené na tomto konkrétnom serveri. user_count_after: few: užívateľov @@ -83,10 +84,8 @@ sk: other: Príspevkov posts_tab_heading: Príspevky posts_with_replies: Príspevky s odpoveďami - reserved_username: Prihlasovacie meno je vyhradené roles: admin: Správca - bot: Bot group: Skupina moderator: Moderátor unavailable: Profil nieje dostupný @@ -117,6 +116,7 @@ sk: confirm: Potvrď confirmed: Potvrdený confirming: Potvrdzujúci + delete: Vymaž dáta deleted: Vymazané demote: Degraduj disable: Zablokuj @@ -125,7 +125,6 @@ sk: display_name: Ukáž meno domain: Doména edit: Uprav - email: Email email_status: Stav emailu enable: Povoľ enabled: Povolený @@ -133,6 +132,7 @@ sk: follows: Sledovania header: Záhlavie inbox_url: URL adresa prijatých správ + invite_request_text: Dôvody pre prijatie invited_by: Pozvaný/á užívateľom ip: IP adresa joined: Pridal/a sa @@ -184,6 +184,10 @@ sk: search: Hľadaj search_same_email_domain: Iní užívatelia s tou istou emailovou doménou search_same_ip: Ostatní užívatelia s rovnakou IP adresou + security_measures: + only_password: Iba heslo + password_and_2fa: Heslo a dvoj-faktorové overovanie + sensitized: Označený ako chúlostivý shared_inbox_url: URL zdieľanej schránky show: created_reports: Vytvorené hlásenia @@ -200,8 +204,8 @@ sk: undo_suspension: Zruš blokovanie unsubscribe: Prestaň odoberať username: Prezývka + view_domain: Ukáž súhrn pre doménu warn: Varuj - web: Web whitelisted: Na bielej listine action_logs: action_types: @@ -211,54 +215,39 @@ sk: create_account_warning: Vytvor výstrahu create_announcement: Vytvor oboznámenie create_domain_allow: Vytvor povolenie pre doménu - create_domain_block: Vytvor doménovú blokádu + create_domain_block: Vytvor zákaz domény + create_email_domain_block: Vytvor zákaz emailovej domény + create_ip_block: Vytvor IP pravidlo demote_user: Zniž užívateľskú rolu destroy_announcement: Vymaž oboznámenie destroy_domain_allow: Zmaž povolenie pre doménu destroy_domain_block: Zruš blokovanie domény + destroy_ip_block: Vymaž IP pravidlo destroy_status: Vymaž príspevok + destroy_unavailable_domain: Vymaž nedostupnú doménu disable_2fa_user: Vypni dvoj-faktorové overovanie + disable_custom_emoji: Vypni vlastné emotikony disable_user: Deaktivuj užívateľa + enable_custom_emoji: Povoľ vlastné emotikony enable_user: Povoľ užívateľa + promote_user: Povýš užívateľskú rolu remove_avatar_user: Vymaž avatar reopen_report: Znovu otvor hlásenie reset_password_user: Obnov heslo + resolve_report: Vyrieš nahlásený problém + sensitive_account: Vynúť všetky médiá na účte ako chúlostivé silence_account: Utíš účet suspend_account: Vylúč účet + unsilence_account: Zvráť obmedzenie účtu + unsuspend_account: Odblokuj účet + update_announcement: Aktualizuj oboznámenie + update_domain_block: Aktualizuj zákaz domény update_status: Aktualizuj stav actions: - assigned_to_self_report: "%{name} pridelil/a hlásenie užívateľa %{target} sebe" - change_email_user: "%{name} zmenil/a emailovú adresu užívateľa %{target}" - confirm_user: "%{name} potvrdil emailovú adresu používateľa %{target}" - create_account_warning: "%{name} poslal/a varovanie užívateľovi %{target}" - create_custom_emoji: "%{name} nahral nový emoji %{target}" - create_domain_allow: "%{name} pridal/a doménu %{target} na zoznam povolených" - create_domain_block: "%{name} zablokoval doménu %{target}" - create_email_domain_block: "%{name} pridal e-mailovú doménu %{target} na zoznam zakázaných" - demote_user: "%{name} degradoval používateľa %{target}" - destroy_custom_emoji: "%{name} zničil/a %{target} emoji" - destroy_domain_allow: "%{name} odstránil/a doménu %{target} zo zoznamu povolených" - destroy_domain_block: "%{name} povolil doménu %{target}" - destroy_email_domain_block: "%{name} pridal e-mailovú doménu %{target} na zoznam povolených" - destroy_status: "%{name} zmazal status %{target}" - disable_2fa_user: "%{name} vypol požiadavku 2FA pre používateľa %{target}" - disable_custom_emoji: "%{name} zakázal emoji %{target}" - disable_user: "%{name} zakázal prihlásenie pre používateľa %{target}" - enable_custom_emoji: "%{name} povolil emoji %{target}" - enable_user: "%{name} povolil prihlásenie pre používateľa %{target}" - memorialize_account: "%{name} zmenil účet %{target} na pamätnú stránku" - promote_user: "%{name} vyzdvihli užívateľa %{target}" - remove_avatar_user: "%{name} odstránil/a %{target}ov avatár" - reopen_report: "%{name} znovu otvoril/a hlásenie užívateľa %{target}" - reset_password_user: "%{name} resetoval/a heslo pre používateľa %{target}" - resolve_report: "%{name} vyriešili nahlásenie užívateľa %{target}" - silence_account: "%{name} utíšil/a účet %{target}" - suspend_account: "%{name} zablokoval/a účet používateľa %{target}" - unassigned_report: "%{name} odobral/a report od %{target}" - unsilence_account: "%{name} zrušil/a stíšenie účtu používateľa %{target}" - unsuspend_account: "%{name} zrušil/a blokovanie účtu používateľa %{target}" - update_custom_emoji: "%{name} aktualizoval/a emoji %{target}" - update_status: "%{name} aktualizoval/a status pre %{target}" + assigned_to_self_report_html: "%{name} pridelil/a hlásenie užívateľa %{target} sebe" + change_email_user_html: "%{name} zmenil/a emailovú adresu užívateľa %{target}" + confirm_user_html: "%{name} potvrdil/a emailovú adresu používateľa %{target}" + create_account_warning_html: "%{name} poslal/a upozornenie užívateľovi %{target}" deleted_status: "(zmazaný príspevok)" filter_by_action: Filtruj podľa úkonu filter_by_user: Trieď podľa užívateľa @@ -272,6 +261,7 @@ sk: new: create: Vytvor oznam title: Nové oznámenie + publish: Zverejni published_msg: Oboznámenie úspešne zverejnené! scheduled_for: Načasované na %{time} scheduled_msg: Oboznámenie bolo naplánované na zverejnenie! @@ -309,33 +299,9 @@ sk: updated_msg: Emoji bolo úspešne aktualizované! upload: Nahraj dashboard: - authorized_fetch_mode: Autorizovaný režim - backlog: odložené aktivity - config: Nastavenia - feature_deletions: Vymazanie účtov - feature_invites: Pozvánky - feature_profile_directory: Katalóg profilov - feature_registrations: Registrácie - feature_relay: Federovací mostík - feature_spam_check: Proti spamu - feature_timeline_preview: Náhľad časovej osi - features: Vymoženosti - hidden_service: Federácia so skrytými službami - open_reports: otvorené hlásenia - pending_tags: haštagy čakajúce na posúdenie - pending_users: užívatelia čakajúci na posúdenie - recent_users: Nedávni užívatelia - search: Celofrázové vyhľadávanie - single_user_mode: Jednouživateľské rozhranie software: Softvér space: Využitie miesta title: Spravovacie rozhranie - total_users: užívateľov celkovo - trends: Trendy - week_interactions: Tohto-týždňové interakcie - week_users_active: aktívni tento týždeň - week_users_new: užívateľov počas tohto týždňa - whitelist_mode: Režim povolených domain_allows: add_new: Povolená doména created_msg: Doména bola úspešne povolená @@ -357,6 +323,7 @@ sk: silence: Stíš suspend: Vylúč title: Nové blokovanie domény + obfuscate: Zatemniť názov domény private_comment: Súkromný komentár private_comment_hint: Odôvodni toto doménové obmedzenie, pre vnútorné vyrozumenie moderátorov. public_comment: Verejný komentár @@ -394,8 +361,22 @@ sk: create: Pridaj doménu title: Nový email na zablokovanie title: Blokované emailové adresy + follow_recommendations: + description_html: "Odporúčania na sledovanie pomáhaju novým užívateľom rýchlo nájsť zaujímavý obsah. Ak užívateľ zatiaľ nedostatočne interagoval s ostatnými aby si vyformoval personalizované odporúčania na sledovanie, tak mu budú odporúčané tieto účty. Sú prepočítavané na dennej báze z mixu účtov s nedávnym najvyšším záujmom a najvyšším počtom lokálnych sledujúcich pre daný jazyk." + language: Pre jazyk + status: Stav + suppress: Utlmiť oporúčanie na sledovanie + suppressed: Utlmené + title: Odporáčania na sledovanie + unsuppress: Obnoviť odporúčanie na sledovanie instances: + back_to_all: Všetko + back_to_limited: Obmedzené + back_to_warning: Upozornenie by_domain: Doména + delivery: + all: Všetko + warning: Upozornenie delivery_available: Je v dosahu doručovania known_accounts: few: "%{count} známych účtov" @@ -422,6 +403,18 @@ sk: expired: Vypršalo title: Filtruj title: Pozvánky + ip_blocks: + add_new: Vytvor pravidlo + delete: Vymaž + expires_in: + '1209600': 2 týždne + '15778476': 6 mesiacov + '2629746': 1 mesiac + '31556952': 1 rok + '86400': 1 deň + '94670856': 3 roky + new: + title: Vytvor nové IP pravidlo pending_accounts: title: Čakajúcich účtov (%{count}) relationships: @@ -484,7 +477,7 @@ sk: desc_html: Sčítanie miestne uverejnených príspevkov, aktívnych užívateľov, a nových registrácii, v týždenných intervaloch title: Vydať hromadné štatistiky o užívateľskej aktivite bootstrap_timeline_accounts: - desc_html: Ak je prezývok viacero, každú oddeľ čiarkou. Je možné zadať iba miestne, odomknuté účty. Pokiaľ necháš prázdne, je to pre všetkých miestnych správcov. + desc_html: Ak je prezývok viacero, každú oddeľ čiarkou. Tieto účty budú zobrazené v odporúčaniach na sledovanie title: Štandardní následovníci nových užívateľov contact_information: email: Pracovný email @@ -502,8 +495,6 @@ sk: users: Prihláseným, miestnym užívateľom domain_blocks_rationale: title: Ukáž zdôvodnenie - enable_bootstrap_timeline_accounts: - title: Novým užívateľom povoľ východiskové následovania hero: desc_html: Zobrazuje sa na hlavnej stránke. Doporučené je rozlišenie aspoň 600x100px. Pokiaľ nič nieje dodané, bude nastavený základný orázok serveru. title: Obrázok hrdinu @@ -514,7 +505,7 @@ sk: desc_html: Domény, na ktoré tento server už v rámci fediversa natrafil title: Zverejni zoznam objavených serverov preview_sensitive_media: - desc_html: Náhľad odkazov z iných serverov, bude zobrazený aj vtedy, keď sú médiá označené ako citlivé + desc_html: Náhľad odkazov z iných serverov, bude zobrazený aj vtedy, keď sú médiá označené ako chúlostivé title: Ukazuj aj chúlostivé médiá v náhľadoch OpenGraph profile_directory: desc_html: Povoľ užívateľom, aby mohli byť nájdení @@ -554,9 +545,6 @@ sk: desc_html: Môžeš si napísať svoje vlastné pravidla o súkromí, prevádzke, alebo aj iné legality. Môžeš tu používať HTML kód title: Vlastné pravidlá prevádzky site_title: Názov servera - spam_check_enabled: - desc_html: Mastodon môže sám stíšiť, a nahlásiť účty v závislosti od rozpoznania parametrov ako napríklad opakované rozosielanie nevyžiadanej komunikácie. Môže dôjsť aj k nesprávnej identifikácii. - title: Proti spamu thumbnail: desc_html: Používané pre náhľady cez OpenGraph a API. Doporučuje sa rozlišenie 1200x630px title: Miniatúra servera @@ -587,13 +575,14 @@ sk: no_status_selected: Žiadne príspevky neboli zmenené, keďže si žiadne nemal/a zvolené title: Príspevky na účte with_media: S médiami + system_checks: + rules_check: + action: Spravuj serverové pravidlá + message_html: Neurčil/a si žiadne serverové pravidlá. tags: accounts_today: Jedinečných užívateľov za dnešok accounts_week: Jedinečných užívateľov tento týždeň breakdown: Rozpis dnešného využitia podľa zdroja - context: Súvis - directory: V zozname - in_directory: "%{count} v zozname" last_active: Naposledy aktívny most_popular: Najpopulárnejšie most_recent: Najnovšie @@ -639,7 +628,6 @@ sk: toot_layout: Rozloženie príspevkov application_mailer: notification_preferences: Zmeň emailové voľby - salutation: "%{name}," settings: 'Zmeň emailové voľby: %{link}' view: 'Zobraziť:' view_profile: Zobraz profil @@ -688,6 +676,7 @@ sk: pending: Tvoja žiadosť čaká na schvílenie od nášho týmu. Môže to chviľu potrvať. Ak bude tvoja žiadosť schválená, dostaneš o tom email. redirecting_to: Tvoj účet je neaktívny, lebo v súčasnosti presmerováva na %{acct}. trouble_logging_in: Problém s prihlásením? + use_security_key: Použi bezpečnostný kľúč authorize_follow: already_following: Tento účet už následuješ error: Naneštastie nastala chyba pri hľadaní vzdialeného účtu @@ -768,7 +757,7 @@ sk: request: Vyžiadaj si tvoj archív size: Veľkosť blocks: Blokujete - csv: CSV + bookmarks: Záložky domain_blocks: Blokované domény lists: Zoznamy mutes: Stíšil/a si @@ -833,9 +822,13 @@ sk: inactive: Neaktívne publicize_checkbox: 'A poslať toto:' publicize_toot: 'Je to dokázané! Na %{service} som %{username}: %{url}' + remove: Odstrániť z účtu dôkaz + removed: Dôkaz z účtu úspešne odstránený status: Stav overenia view_proof: Ukáž overenie imports: + errors: + over_rows_processing_limit: obsahuje viac než %{count} riadkov modes: merge: Spoj dohromady merge_long: Ponechaj existujúce záznamy a pridaj k nim nové @@ -845,6 +838,7 @@ sk: success: Tvoje dáta boli nahraté úspešne, a teraz budú spracované v danom čase types: blocking: Zoznam blokovaných + bookmarks: Záložky domain_blocking: Zoznam blokovaných domén following: Zoznam sledovaných muting: Zoznam ignorovaných @@ -877,6 +871,12 @@ sk: lists: errors: limit: Dosiahli ste maximálny možný počet zoznamov + login_activities: + authentication_methods: + password: heslom + sign_in_token: emailovým bezpečtnostným kódom + webauthn: bezpečnostnými kľúčmi + title: História overení media_attachments: validations: images_and_video: K príspevku ktorý už obsahuje obrázky nemôžeš priložiť video @@ -900,6 +900,7 @@ sk: on_cooldown: Účet si si presunul/a len nedávno. Táto vymoženosť bude znovu sprístupnená za %{count} dní. past_migrations: Predošlé presuny proceed_with_move: Presuň sledovateľov + redirected_msg: Tvoj účet teraz presmerováva na %{acct}. redirecting_to: Tvoj účet presmerováva na %{acct}. set_redirect: Nastav presmerovanie warning: @@ -913,6 +914,9 @@ sk: redirect: Tvoj súčastný účet bude aktualizovaný s oznamom o presunutí a bude vylúčený z vyhľadávania moderation: title: Moderovanie + move_handler: + carry_blocks_over_text: Tento užívateľ sa presunul z účtu %{acct}, ktorý si mal/a zablokovaný. + carry_mutes_over_text: Tento užívateľ sa presunul z účtu %{acct}, ktorý si mal/a stíšený. notification_mailer: digest: action: Zobraziť všetky notifikácie @@ -947,10 +951,14 @@ sk: body: "%{name} ťa spomenul/a v:" subject: Bol/a si spomenutý/á užívateľom %{name} title: Novo spomenutý/á + poll: + subject: Anketa od %{name} skončila reblog: body: 'Tvoj príspevok bol vyzdvihnutý užívateľom %{name}:' subject: "%{name} vyzdvihli tvoj príspevok" title: Novo vyzdvyhnuté + status: + subject: "%{name} práve prispel/a" notifications: email_events: Udalosti oznamované emailom email_events_hint: 'Vyber si udalosti, pre ktoré chceš dostávať oboznámenia:' @@ -982,6 +990,7 @@ sk: relationships: activity: Aktivita účtu dormant: Spiace + follow_selected_followers: Následuj označených sledovatelov followers: Následovatelia following: Následovaní invited: Pozvaný/á @@ -1064,8 +1073,6 @@ sk: profile: Profil relationships: Sledovania a následovatelia two_factor_authentication: Dvojfázové overenie - spam_check: - spam_detected: Toto je automatizované hlásenie. Bol odhalený spam. statuses: attached: description: 'Priložené: %{attached}' @@ -1074,11 +1081,6 @@ sk: many: "%{count} obrázkov" one: "%{count} obrázok" other: "%{count} obrázky" - video: - few: "%{count} videí" - many: "%{count} videí" - one: "%{count} video" - other: "%{count} videá" boosted_from_html: Vyzdvihnuté od %{acct_link} content_warning: 'Varovanie o obsahu: %{warning}' disallowed_hashtags: @@ -1121,7 +1123,7 @@ sk: unlisted_long: Všetci môžu vidieť, ale nieje zaradené do verejnej osi stream_entries: pinned: Pripnutý príspevok - reblogged: vyzdvihnutý + reblogged: vyzdvihli sensitive_content: Senzitívny obsah tags: does_not_match_previous_name: nezhoduje sa s predošlým názvom @@ -1133,7 +1135,7 @@ sk:
    • Základné informácie o účte: Ak sa na tomto serveri zaregistruješ, budeš môcť byť požiadaný/á zadať prezývku, emailovú adresu a heslo. Budeš tiež môcť zadať aj ďalšie profilové údaje, ako napríklad meno a životopis, a nahrať profilovú fotku aj obrázok v záhlaví. Tvoja prezývka, meno, životopis, profilová fotka a obrázok v záhlaví sú vždy zobrazené verejne.
    • Príspevky, sledovania a iné verejné informácie: - Zoznam ľudí, ktorých sleduješ je zobrazený verejne, a to isté platí aj pre zoznam tvojích následovateľov. Keď pošleš správu, ukladá sa jej dátum a čas, ale aj z akej aplikácie bola poslaná. Správy môžu obsahovať mediálne prílohy, ako obrázky a videá. Verejné, a nezaradené príspevky sú verejne prístupné. Keď si pripneš príspevok na svoj profil, toto je tiež verejne dostupnou informáciou. Tvoje príspevky sú takisto doručené tvojím sledovateľom, a to aj v rámci iných serverov, kde je potom uložená kópia tvojho príspevku. Ak vymažeš príspevok, táto akcia bude takisto doručená tvojím sledovateľom. Vyzdvihnutie, alebo obľúbenie iného príspevku je vždy verejne viditeľné.
    • + Zoznam ľudí, ktorých sleduješ je zobrazený verejne, a to isté platí aj pre zoznam tvojích nasledovateľov. Keď pošleš správu, ukladá sa jej dátum a čas, ale aj z akej aplikácie bola poslaná. Správy môžu obsahovať mediálne prílohy, ako obrázky a videá. Verejné, a nezaradené príspevky sú verejne prístupné. Keď si pripneš príspevok na svoj profil, toto je tiež verejne dostupnou informáciou. Tvoje príspevky sú takisto doručené tvojím sledovateľom, a to aj v rámci iných serverov, kde je potom uložená kópia tvojho príspevku. Ak vymažeš príspevok, táto akcia bude takisto doručená tvojím sledovateľom. Vyzdvihnutie, alebo obľúbenie iného príspevku je vždy verejne viditeľné.
    • Priame príspevky, a príspevky určené iba pre sledovateľov: Všetky príspevky sú uložené a spracované na serveri. Príspevky iba pre sledovateľov sú doručené tvojím sledovateľom a užívateľom ktorí sú v nich spomenutí, pričom priame príspevky sú doručené iba tím užívateľom ktorí sú v nich spomenutí. V niektorých prípadoch to môže znamenať, že tieto príspevkz sú doručené aj v rámci iných serverov, a kópie príspevkov sú na nich uložené. V dobrej viere robíme všetko preto, aby bol prístup k tímto príspevkom vymedzený iba pre oprávnených používateľov, ale môže sa stať, že iné servery v tomto ohľade zlyhajú. Preto je dôležité prezrieť si a zhodnotiť, na aké servery patria tvoji následovatelia. V nastaveniach si môžeš zapnúť voľbu ručne povoľovať a odmietať nových následovateľov. @@ -1148,7 +1150,7 @@ sk:

      Hociktorá z informácií, ktoré sú o tebe zozbierané, môže byť použité následujúcimi spôsobmi:

        -
      • Pre zabezpečenie základného fungovania Mastodonu. Narábať s užívateľským obsahom iných, ako aj prispievať svoj vlastný obsah, možeš len keď si prihlásený/á. Môžeš napríklad následovať iných ľudí, aby si potom videl/a ich príspevky v rámci svojej osobne prispôsobenej domácej osi.
      • +
      • Pre zabezpečenie základného fungovania Mastodonu. Narábať s užívateľským obsahom iných, ako aj prispievať svoj vlastný obsah, možeš len keď si prihlásený/á. Môžeš napríklad nasledovať iných ľudí, aby si potom videl/a ich príspevky v rámci svojej osobne prispôsobenej domácej osi.
      • Pre lepšie moderovanie komunity sa napríklad môže tvoja IP adresa porovnať s ostatnými už známimi adresami, aby bolo možné zistiť, či nedochádza napríklad k obchádzaniu pravidiel vylúčenia, aleb k iným porušeniam zásad.
      • Emailová adresa, ktorú poskytneš, môže byť použitá na zasielanie informácií, oboznámení keď ostatní užívatelia interaktujú s tvojím obsahom, alebo na posielanie správ, odpovedí na otázky a iné požiadavky.
      @@ -1214,11 +1216,11 @@ sk: title: Vitaj na palube, %{name}! users: follow_limit_reached: Nemôžeš následovať viac ako %{limit} ľudí - invalid_email: Emailová adresa je neplatná invalid_otp_token: Neplatný kód pre dvojfaktorovú autentikáciu otp_lost_help_html: Pokiaľ si stratil/a prístup k obom, môžeš dať vedieť %{email} seamless_external_login: Si prihlásená/ý cez externú službu, takže nastavenia hesla a emailu ti niesú prístupné. signed_in_as: 'Prihlásená/ý ako:' + suspicious_sign_in_confirmation: Vyzerá to, že si sa predtým z tohto zariadenia ešte neprihlasoval/a, takže ti na tvoju emailovú adresu pošleme bezpečnostný kód, aby sa potvrdilo, že si to ty. verification: explanation_html: 'Môžeš sa overiť ako majiteľ odkazov v metadátach tvojho profilu. Na to ale musí odkazovaná stránka obsahovať odkaz späť na tvoj Mastodon profil. Tento spätný odkaz musí mať prívlastok rel="me". Na texte odkazu nezáleží. Tu je príklad:' verification: Overenie diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 91466c9c24..05420b18cf 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -7,7 +7,6 @@ sl: active_count_after: dejaven active_footnote: Aktivni mesečni uporabniki (AMU) administered_by: 'Upravlja:' - api: API apps: Mobilne aplikacije apps_platforms: Uporabljajte Mastodon iz iOS, Android ali iz drugih platform browse_directory: Brskajte po imeniku profilov in filtriranje po interesih @@ -71,11 +70,9 @@ sl: two: Tuta posts_tab_heading: Tuti posts_with_replies: Tuti in odgovori - reserved_username: Uporabniško ime je zasedeno roles: admin: Skrbnik bot: Robot - moderator: Mod unavailable: Profil ni na voljo unfollow: Prenehaj slediti admin: @@ -120,7 +117,6 @@ sl: header: Glava inbox_url: URL mape "Prejeto" invited_by: Povabljen od - ip: IP joined: Pridružil location: all: Vse @@ -164,7 +160,6 @@ sl: role: Dovoljenja roles: admin: Skrbnik - moderator: Moderator staff: Osebje user: Uporabnik search: Iskanje @@ -188,37 +183,6 @@ sl: web: Splet whitelisted: Na belem seznamu action_logs: - actions: - assigned_to_self_report: "%{name} je prijavil %{target} sebi" - change_email_user: "%{name} je spremenil naslov e-pošte uporabnika %{target}" - confirm_user: "%{name} je potrdil naslov e-pošte uporabnika %{target}" - create_account_warning: "%{name} je poslal opozorilo %{target}" - create_custom_emoji: "%{name} je posodobil emotikone %{target}" - create_domain_block: "%{name} je blokiral domeno %{target}" - create_email_domain_block: "%{name} je dal na črni seznam e-pošto domene %{target}" - demote_user: "%{name} je degradiral uporabnika %{target}" - destroy_custom_emoji: "%{name} je uničil emotikone %{target}" - destroy_domain_block: "%{name} je odblokiral domeno %{target}" - destroy_email_domain_block: "%{name} je dal na beli seznam e-pošto domene %{target}" - destroy_status: "%{name} je odstranil stanje od %{target}" - disable_2fa_user: "%{name} je onemogočil dvofaktorsko zahtevo za uporabnika %{target}" - disable_custom_emoji: "%{name} je onemogočil emotikone %{target}" - disable_user: "%{name} je onemogočil prijavo za uporabnika %{target}" - enable_custom_emoji: "%{name} je omogočil emotikone %{target}" - enable_user: "%{name} je omogočil prijavo za uporabnika %{target}" - memorialize_account: "%{name} je spremenil račun od %{target} v stran spominov" - promote_user: "%{name} je promoviral uporabnika %{target}" - remove_avatar_user: "%{name} je odstranil podobo od %{target}" - reopen_report: "%{name} je ponovno odprl prijavo %{target}" - reset_password_user: "%{name} je ponastavil geslo od uporabnika %{target}" - resolve_report: "%{name} je razrešil prijavo %{target}" - silence_account: "%{name} je utišal račun od %{target}" - suspend_account: "%{name} je suspendiral račun od %{target}" - unassigned_report: "%{name} je nedodeljeno prijavil %{target}" - unsilence_account: "%{name} je preklical utišanje računa od %{target}" - unsuspend_account: "%{name} je aktiviral račun od %{target}" - update_custom_emoji: "%{name} je posodobil emotikone %{target}" - update_status: "%{name} je posodobil stanje od %{target}" deleted_status: "(izbrisano stanje)" title: Dnevnik revizije custom_emojis: @@ -247,29 +211,9 @@ sl: updated_msg: Emotikon je uspešno posodobljen! upload: Pošlji dashboard: - backlog: zaostala opravila - config: Nastavitve - feature_deletions: Brisanje računov - feature_invites: Povezave povabil - feature_profile_directory: Imenik profilov - feature_registrations: Registracije - feature_relay: Rele federacije - feature_spam_check: Anti-spam - feature_timeline_preview: Predogled časovnice - features: Zmožnosti - hidden_service: Federacija s skritimi storitvami - open_reports: odprte prijave - recent_users: Nedavni uporabniki - search: Iskanje po celotnem besedilu - single_user_mode: Način enega uporabnika software: Programska oprema space: Uporaba prostora title: Nadzorna plošča - total_users: skupaj uporabnikov - trends: Trendi - week_interactions: interakcije ta teden - week_users_active: aktivni ta teden - week_users_new: uporabniki ta teden domain_allows: add_new: Dodaj domeno na beli seznam created_msg: Domena je bila uspešno dodana na beli seznam @@ -345,7 +289,6 @@ sl: all: Vse available: Razpoložljivo expired: Potekel - title: Filter title: Povabila pending_accounts: title: "(%{count}) računov na čakanju" @@ -457,9 +400,6 @@ sl: desc_html: Lahko napišete svojo pravilnik o zasebnosti, pogoje storitve ali druge pravne dokumente. Lahko uporabite oznake HTML title: Pogoji storitve po meri site_title: Ime strežnika - spam_check_enabled: - desc_html: Mastodon lahko samodejno utiša in samodejno prijavi račune, ki temeljijo na ukrepih, kot je odkrivanje računov, ki pošiljajo ponavljajoča se neželena sporočila. Lahko pride do zmot. - title: Anti-spam thumbnail: desc_html: Uporablja se za predogled prek OpenGrapha in API-ja. Priporočamo 1200x630px title: Sličica strežnika @@ -504,7 +444,6 @@ sl: sensitive_content: Občutljiva vsebina application_mailer: notification_preferences: Spremenite e-poštne nastavitve - salutation: "%{name}," settings: 'Spremenite e-poštne nastavitve: %{link}' view: 'Pogled:' view_profile: Ogled profila @@ -532,9 +471,6 @@ sl: migrate_account: Premakni se na drug račun migrate_account_html: Če želite ta račun preusmeriti na drugega, ga lahko nastavite tukaj. or_log_in_with: Ali se prijavite z - providers: - cas: CAS - saml: SAML register: Vpis registration_closed: "%{instance} ne sprejema novih članov" resend_confirmation: Ponovno pošlji navodila za potrditev @@ -563,18 +499,8 @@ sl: title: Sledi %{acct} datetime: distance_in_words: - about_x_hours: "%{count}h" - about_x_months: "%{count}mo" - about_x_years: "%{count}y" - almost_x_years: "%{count}y" half_a_minute: Pravkar - less_than_x_minutes: "%{count}m" less_than_x_seconds: Pravkar - over_x_years: "%{count}y" - x_days: "%{count}d" - x_minutes: "%{count}m" - x_months: "%{count}mo" - x_seconds: "%{count}s" deletes: confirm_password: Vnesite svoje trenutno geslo, da potrdite svojo identiteto proceed: Izbriši račun @@ -610,7 +536,6 @@ sl: request: Zahtevajte svoj arhiv size: Velikost blocks: Blokirate - csv: CSV domain_blocks: Bloki domene lists: Seznami mutes: Utišate @@ -758,22 +683,11 @@ sl: body: "%{name} je spodbudil/a vaše stanje:" subject: "%{name} je spodbudil/a vaše stanje" title: Nova spodbuda - number: - human: - decimal_units: - format: "%n%u" - units: - billion: B - million: M - quadrillion: Q - thousand: K - trillion: T pagination: newer: Novejše next: Naprej older: Starejše prev: Nazaj - truncate: "…" polls: errors: already_voted: Na tej anketi ste že glasovali @@ -826,40 +740,16 @@ sl: activity: Zadnja dejavnost browser: Brskalnik browsers: - alipay: Alipay blackberry: BlackBerry - chrome: Chrome - edge: Microsoft Edge - electron: Electron - firefox: Firefox generic: Neznan brskalnik - ie: Internet Explorer - micro_messenger: MicroMessenger - nokia: Nokia S40 Ovi Browser - opera: Opera - otter: Otter - phantom_js: PhantomJS - qq: QQ Browser - safari: Safari uc_browser: UC Browser - weibo: Weibo current_session: Trenutna seja description: "%{browser} na %{platform}" explanation: To so spletni brskalniki, ki so trenutno prijavljeni v vaš Mastodon račun. - ip: IP platforms: - adobe_air: Adobe Air - android: Android blackberry: BlackBerry - chrome_os: ChromeOS - firefox_os: Firefox OS - ios: iOS - linux: Linux mac: Mac other: neznana platforma - windows: Windows - windows_mobile: Windows Mobile - windows_phone: Windows Phone revoke: Prekliči revoke_success: Seja je bila uspešno preklicana title: Seje @@ -920,7 +810,6 @@ sl: vote: Glasuj show_more: Pokaži več sign_in_to_participate: Prijavite se, če želite sodelovati v pogovoru - title: '%{name}: "%{quote}"' visibilities: private: Samo sledilci private_long: Prikaži samo sledilcem @@ -1019,10 +908,6 @@ sl: contrast: Mastodon (Visok kontrast) default: Mastodon (Temna) mastodon-light: Mastodon (Svetla) - time: - formats: - default: "%b %d, %Y, %H:%M" - month: "%b %Y" two_factor_authentication: disable: Onemogoči enabled: Dvofaktorsko preverjanje pristnosti je omogočeno @@ -1072,7 +957,6 @@ sl: title: Dobrodošli, %{name}! users: follow_limit_reached: Ne morete spremljati več kot %{limit} ljudi - invalid_email: E-poštni naslov je napačen invalid_otp_token: Neveljavna dvofaktorska koda otp_lost_help_html: Če ste izgubili dostop do obeh, stopite v stik z %{email} seamless_external_login: Prijavljeni ste prek zunanje storitve, tako da nastavitve gesla in e-pošte niso na voljo. diff --git a/config/locales/sq.yml b/config/locales/sq.yml index e841ab6905..5c7e9c3fee 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1,11 +1,11 @@ --- sq: about: - about_hashtag_html: Këto janë mesazhe publike të etiketuar me #%{hashtag}. Mundeni të ndërveproni me ta, nëse keni një llogari kudo qoftë në fedivers. + about_hashtag_html: Këto janë mesazhe publike të etiketuara me #%{hashtag}. Mundeni të ndërveproni me ta, nëse keni një llogari kudo qoftë në fedivers. about_mastodon_html: 'Rrjeti shoqëror i së ardhmes: Pa reklama, pa survejim nga korporata, konceptim etik dhe decentralizim! Jini zot i të dhënave tuaja, me Mastodon-in!' about_this: Mbi active_count_after: aktive - active_footnote: Përdorues Aktivë Mujor (PAM) + active_footnote: Përdorues Aktivë Mujorë (PAM) administered_by: 'Administruar nga:' api: API apps: Aplikacione për celular @@ -26,12 +26,14 @@ sq: Përdoret për qëllime federimi dhe s’duhet bllokuar, veç në daçi të bllokoni krejt instancën, me ç’rast do të duhej të përdornit bllokim përkatësie. learn_more: Mësoni më tepër privacy_policy: Rregulla privatësie + rules: Rregulla shërbyesi + rules_html: 'Më poshtë keni një përmbledhje të rregullave që duhet të ndiqni, nëse doni të keni një llogari në këtë shërbyes Mastodon:' see_whats_happening: Shihni ç'ndodh server_stats: 'Statistika shërbyesi:' source_code: Kod burim status_count_after: - one: gjendje - other: gjendje + one: mesazh + other: mesazhe status_count_before: Që kanë krijuar tagline: Ndiqni shokë dhe zbuloni të rinj terms: Kushte shërbimi @@ -41,7 +43,7 @@ sq: reason: Arsye rejecting_media: 'Kartelat media prej këtyre shërbyesve s’do të përpunohen apo depozitohen, dhe s’do të shfaqet ndonjë miniaturë, duke kërkuar kështu doemos klikim dorazi te kartela origjinale:' rejecting_media_title: Media e filtruar - silenced: 'Postimet prej këtyre shërbyesve do të fshihen në rrjedha kohore dhe biseda publike, dhe prej ndërveprimeve të përdoruesve të tyre s’do të prodhohen njoftime, veç në i ndjekshi:' + silenced: 'Postimet prej këtyre shërbyesve do të jenë të fshehura në rrjedha kohore dhe biseda publike, dhe prej ndërveprimeve të përdoruesve të tyre s’do të prodhohen njoftime, veç në i ndjekshi:' silenced_title: Shërbyes të heshtuar suspended: 'S’do të përpunohen, depozitohen apo shkëmbehen të dhëna prej këtyre shërbyesve, duke e bërë të pamundur çfarëdo ndërveprimi apo komunikimi me përdorues prej këtyre shërbyesve:' suspended_title: Shërbyes të pezulluar @@ -78,7 +80,6 @@ sq: other: Mesazhe posts_tab_heading: Mesazhe posts_with_replies: Mesazhe dhe përgjigje - reserved_username: Emri i përdoruesit është i ruajtur për dikë roles: admin: Përgjegjës bot: Robot @@ -96,7 +97,7 @@ sq: delete: Fshije destroyed_msg: Shënimi i moderimit u asgjësua me sukses! accounts: - add_email_domain_block: Vëre përkatësinë email në listë bllokimesh + add_email_domain_block: Blloko përkatësi email approve: Miratojeni approve_all: Miratojini krejt approved_msg: U miratua me sukses aplikimi për regjistrim të %{username} @@ -118,6 +119,7 @@ sq: demote: Zhgradoje destroyed_msg: Të dhënat e %{username} tani janë vënë në radhë për fshirje të menjëhershme disable: Çaktivizoje + disable_sign_in_token_auth: Çaktivizo mirëfilltësim me token email-i disable_two_factor_authentication: Çaktivizoni 2FA-në disabled: E çaktivizuar display_name: Emër në ekran @@ -125,7 +127,8 @@ sq: edit: Përpunojeni email: Email email_status: Gjendje email-i - enable: Aktivizoje + enable: Shkrije + enable_sign_in_token_auth: Aktivizo mirëfilltësim me token email-i enabled: E aktivizuar enabled_msg: U hoq me sukses ngrirja për llogarinë e %{username} followers: Ndjekës @@ -173,7 +176,7 @@ sq: remove_avatar: Hiqe avatarin remove_header: Hiqe kryen removed_avatar_msg: U hoq me sukses figura e avatarit të %{username} - removed_header_msg: U hoq me sukses figura e kreut për %{username} + removed_header_msg: U hoq me sukses figura e kryes për %{username} resend_confirmation: already_confirmed: Ky përdorues është i ripohuar tashmë send: Ridërgo email ripohimi @@ -190,6 +193,10 @@ sq: search: Kërkoni search_same_email_domain: Të tjerë përdorues me të njëjtën përkatësi email-i search_same_ip: Të tjerë përdorues me të njëjtën IP + security_measures: + only_password: Vetëm fjalëkalim + password_and_2fa: Fjalëkalim dhe 2FA + password_and_sign_in_token: Fjalëkalim dhe token email-i sensitive: Rezervat sensitized: iu vu shenjë si rezervat shared_inbox_url: URL kutie të përbashkët mesazhesh @@ -223,12 +230,13 @@ sq: change_email_user: Ndrysho Email për Përdoruesin confirm_user: Ripohoje Përdoruesin create_account_warning: Krijo Sinjalizim - create_announcement: Krijo Lajmërim + create_announcement: Krijoni Lajmërim create_custom_emoji: Krijo Emotikon Vetjak create_domain_allow: Krijo Lejim Përkatësie create_domain_block: Krijo Bllokim Përkatësie create_email_domain_block: Krijo Bllokim Përkatësie Email-esh create_ip_block: Krijoni Rregull IP + create_unavailable_domain: Krijo Përkatësi të Papërdorshme demote_user: Zhgradoje Përdoruesin destroy_announcement: Fshije Lajmërimin destroy_custom_emoji: Fshi Emotikon Vetjak @@ -237,10 +245,13 @@ sq: destroy_email_domain_block: Fshi bllokim përkatësie email-esh destroy_ip_block: Fshini Rregull IP destroy_status: Fshi Gjendje + destroy_unavailable_domain: Fshi Përkatësi të Papërdorshme disable_2fa_user: Çaktivizo 2FA-në disable_custom_emoji: Çaktivizo Emotikon Vetjak + disable_sign_in_token_auth_user: Çaktivizo Mirëfilltësim me Token Email-i për Përdoruesin disable_user: Çaktivizo Përdorues enable_custom_emoji: Aktivizo Emotikon Vetjak + enable_sign_in_token_auth_user: Aktivizo Mirëfilltësim me Token Email-i për Përdoruesin enable_user: Aktivizo Përdorues memorialize_account: Bëje Llogari Përkujtimore promote_user: Promovojeni Përdoruesin @@ -256,50 +267,54 @@ sq: unsilence_account: Hiqe Heshtimin e Llogarisë unsuspend_account: Hiqe Pezullimin e Llogarisë update_announcement: Përditëso Lajmërimin - update_custom_emoji: Përditëso Emotikon Vetjak + update_custom_emoji: Përditëso Emoxhi Vetjake update_domain_block: Përditëso Bllok Përkatësish update_status: Përditëso Gjendjen actions: - assigned_to_self_report: "%{name} ia kaloi raportimin %{target} në ngarkim vetvetes" - change_email_user: "%{name} ndryshoi adresën email të përdoruesit %{target}" - confirm_user: "%{name} ripohoi adresën email të përdoruesit %{target}" - create_account_warning: "%{name} dërgoi një sinjalizim për %{target}" - create_announcement: "%{name} krijoi lajmërim të ri për %{target}" - create_custom_emoji: "%{name} ngarkoi emotikon të ri %{target}" - create_domain_allow: "%{name} kaloi në listë lejimesh përkatësinë %{target}" - create_domain_block: "%{name} bllokoi përkatësinë %{target}" - create_email_domain_block: "%{name} shtoi në listë bllokimesh përkatësinë %{target}" - create_ip_block: "%{name} krijoi rregull për IP-në %{target}" - demote_user: "%{name} zhgradoi përdoruesin %{target}" - destroy_announcement: "%{name} fshiu lajmërimin për %{target}" - destroy_custom_emoji: "%{name} asgjësoi emotikonin %{target}" - destroy_domain_allow: "%{name} hoqi përkatësinë %{target} nga listë lejimesh" - destroy_domain_block: "%{name} zhbllokoi përkatësinë %{target}" - destroy_email_domain_block: "%{name} e shtoi në listë lejimesh përkatësinë %{target}" - destroy_ip_block: "%{name} fshiu rregull për IP-në %{target}" - destroy_status: "%{name} hoqi gjendje nga %{target}" - disable_2fa_user: "%{name} çaktivizoi domosdoshmëritë për dyfaktorësh për përdoruesin %{target}" - disable_custom_emoji: "%{name} çaktivizoi emotikonin %{target}" - disable_user: "%{name} çaktivizoi hyrje për përdoruesin %{target}" - enable_custom_emoji: "%{name} aktivizoi emotikonin %{target}" - enable_user: "%{name} aktivizoi hyrje për përdoruesin %{target}" - memorialize_account: "%{name} e shndërroi llogarinë e %{target} në një faqe përkujtimore" - promote_user: "%{name} gradoi përdoruesin %{target}" - remove_avatar_user: "%{name} hoqi avatarin e %{target}" - reopen_report: "%{name} rihapi raportimin %{target}" - reset_password_user: "%{name} ricaktoi fjalëkalimi për përdoruesin %{target}" - resolve_report: "%{name} zgjidhi raportimin %{target}" - sensitive_account: "%{name} i vuri shenjë si rezervat medias në %{target}" - silence_account: "%{name} heshtoi llogarinë e %{target}" - suspend_account: "%{name} pezulloi llogarinë e %{target}" - unassigned_report: "%{name} rihapi raportimin %{target}" - unsensitive_account: "%{name} ia hoqi shenjën si rezervat medias në %{target}" - unsilence_account: "%{name} hoqi heshtimin për llogarinë %{target}" - unsuspend_account: "%{name} hoqi pezullimin për llogarinë e %{target}" - update_announcement: "%{name} përditësoi lajmërimin %{target}" - update_custom_emoji: "%{name} përditësoi emotikonin %{target}" - update_domain_block: "%{name} përditësoi bllok përkatësish për %{target}" - update_status: "%{name} përditësoi gjendjen me %{target}" + assigned_to_self_report_html: "%{name} ia kaloi raportimin %{target} në ngarkim vetvetes" + change_email_user_html: "%{name} ndryshoi adresën email të përdoruesit %{target}" + confirm_user_html: "%{name} ripohoi adresën email të përdoruesit %{target}" + create_account_warning_html: "%{name} dërgoi një sinjalizim për %{target}" + create_announcement_html: "%{name} krijoi lajmërim të ri për %{target}" + create_custom_emoji_html: "%{name} ngarkoi emoxhi të ri %{target}" + create_domain_allow_html: "%{name} lejoi federim me përkatësinë %{target}" + create_domain_block_html: "%{name} bllokoi përkatësinë %{target}" + create_email_domain_block_html: "%{name} bllokoi përkatësinë email %{target}" + create_ip_block_html: "%{name} krijoi rregull për IP-në %{target}" + create_unavailable_domain_html: "%{name} ndali dërgimin drejt përkatësisë %{target}" + demote_user_html: "%{name} zhgradoi përdoruesin %{target}" + destroy_announcement_html: "%{name} fshiu lajmërimin për %{target}" + destroy_custom_emoji_html: "%{name} asgjësoi emoxhin %{target}" + destroy_domain_allow_html: "%{name} hoqi lejimin për federim me %{target}" + destroy_domain_block_html: "%{name} zhbllokoi përkatësinë %{target}" + destroy_email_domain_block_html: "%{name} hoqi bllokimin për përkatësinë email %{target}" + destroy_ip_block_html: "%{name} fshiu rregull për IP-në %{target}" + destroy_status_html: "%{name} hoqi gjendje nga %{target}" + destroy_unavailable_domain_html: "%{name} rinisi dërgimin drejt përkatësisë %{target}" + disable_2fa_user_html: "%{name} çaktivizoi domosdoshmërinë për dyfaktorësh për përdoruesin %{target}" + disable_custom_emoji_html: "%{name} çaktivizoi emoxhin %{target}" + disable_sign_in_token_auth_user_html: "%{name} çaktivizo mirëfilltësim me token email-i për %{target}" + disable_user_html: "%{name} çaktivizoi hyrje për përdoruesin %{target}" + enable_custom_emoji_html: "%{name} aktivizoi emoxhin %{target}" + enable_sign_in_token_auth_user_html: "%{name} aktivizo mirëfilltësim me token email-i përdoruesi për %{target}" + enable_user_html: "%{name} aktivizoi hyrje për përdoruesin %{target}" + memorialize_account_html: "%{name} e shndërroi llogarinë e %{target} në një faqe përkujtimore" + promote_user_html: "%{name} gradoi përdoruesin %{target}" + remove_avatar_user_html: "%{name} hoqi avatarin e %{target}" + reopen_report_html: "%{name} rihapi raportimin %{target}" + reset_password_user_html: "%{name} ricaktoi fjalëkalimi për përdoruesin %{target}" + resolve_report_html: "%{name} zgjidhi raportimin %{target}" + sensitive_account_html: "%{name} i vuri shenjë si rezervat medias në %{target}" + silence_account_html: "%{name} heshtoi llogarinë e %{target}" + suspend_account_html: "%{name} pezulloi llogarinë e %{target}" + unassigned_report_html: "%{name} rihapi raportimin %{target}" + unsensitive_account_html: "%{name} ia hoqi shenjën si rezervat medias në %{target}" + unsilence_account_html: "%{name} hoqi heshtimin për llogarinë %{target}" + unsuspend_account_html: "%{name} hoqi pezullimin për llogarinë e %{target}" + update_announcement_html: "%{name} përditësoi lajmërimin %{target}" + update_custom_emoji_html: "%{name} përditësoi emoxhin %{target}" + update_domain_block_html: "%{name} përditësoi bllokimin e përkatësish për %{target}" + update_status_html: "%{name} përditësoi gjendjen me %{target}" deleted_status: "(fshiu gjendjen)" empty: S’u gjetën regjistra. filter_by_action: Filtroji sipas veprimit @@ -314,73 +329,61 @@ sq: new: create: Krijoni lajmërim title: Lajmërim i ri + publish: Publikoje published_msg: Lajmërimi u botua me sukses! scheduled_for: Vënë në plan për më %{time} scheduled_msg: Lajmërimi u vu në plan për botim! title: Lajmërime + unpublish: Hiqi publikimin unpublished_msg: Lajmërimi u botua me sukses! updated_msg: Lajmërimi u përditësua me sukses! custom_emojis: assign_category: Caktojini kategori by_domain: Përkatësi - copied_msg: Kopja vendore e emotikonëve u krijua me sukses + copied_msg: Kopja vendore e emoji-ve u krijua me sukses copy: Kopjoje - copy_failed_msg: S’u bë dot një kopje vendore e emotikonëve + copy_failed_msg: S’u bë dot një kopje vendore e emoji-ve create_new_category: Krijo kategori të re - created_msg: Emotikoni u krijua me sukses! + created_msg: Emoji u krijua me sukses! delete: Fshije - destroyed_msg: Emotikoni u asgjësua me sukses! + destroyed_msg: Emojo u asgjësuan me sukses! disable: Çaktivizoje disabled: I çaktivizuar - disabled_msg: Ai emotikon u çaktivizua me sukses + disabled_msg: Ai emoxhi u çaktivizua me sukses emoji: Emotikon enable: Aktivizoje enabled: I aktivizuar - enabled_msg: Ai emotikon u aktivizua me sukses + enabled_msg: Ai emoxhi u aktivizua me sukses image_hint: PNG deri 50KB list: Vëre në listë listed: Në listë new: - title: Shtoni emotikon të ri vetjak + title: Shtoni emoxhi të ri vetjak not_permitted: S’keni leje të kryeni këtë veprim overwrite: Mbishkruaje shortcode: Kod i shkurtër shortcode_hint: Të paktën 2 shenja, vetëm shenja alfanumerike dhe nënvija - title: Emotikone vetjake + title: Emoxhi vetjake uncategorized: I pakategorizuar unlist: Hiqe nga lista unlisted: Hequr prej liste - update_failed_msg: S’u përditësua dot ai emotikon - updated_msg: Emotikoni u përditësua me sukses! + update_failed_msg: S’u përditësua dot ai emoxhi + updated_msg: Emoji u përditësua me sukses! upload: Ngarkoje dashboard: - authorized_fetch_mode: Mënyrë e sigurt - backlog: punë të prapambetura - config: Formësim - feature_deletions: Fshirje llogarish - feature_invites: Lidhje ftesash - feature_profile_directory: Drejtori profilesh - feature_registrations: Regjistrime - feature_relay: Rele federimi - feature_spam_check: Anti-spam - feature_timeline_preview: Paraparje rrjedhjeje kohore - features: Veçori - hidden_service: Federim me shërbime të fshehura - open_reports: raportime të hapur - pending_tags: hashtag-ë në pritje të shqyrtimit - pending_users: përdorues në pritje për rishikim - recent_users: Përdorues së fundi - search: Kërko tekstin e plotë - single_user_mode: Mënyrë me përdorues të vetëm + active_users: përdorues aktivë + interactions: ndërveprime + media_storage: Depozitë media + new_users: përdorues të rinj + opened_reports: raportime të hapur + resolved_reports: raportime të zgjidhur software: Software + sources: Burime regjistrimi space: Përdorim hapësire title: Pult - total_users: përdorues gjithsej - trends: Tendenca - week_interactions: ndërveprime këtë javë - week_users_active: aktivë këtë javë - week_users_new: përdorues këtë javë - whitelist_mode: Mënyrë liste lejimesh + top_languages: Gjuhët aktive kryesuese + top_servers: Shërbyesit aktivë kryesues + website: Sajt domain_allows: add_new: Shtoje përkatësinë në listë lejimesh created_msg: Përkatësia u shtua me sukses në listë lejimesh @@ -440,9 +443,34 @@ sq: create: Shtoni përkatësi title: Zë i ri email në listë bllokimesh title: Listë bllokimesh email-esh + follow_recommendations: + description_html: "Rekomandimet për ndjekje ndihmojnë përdoruesit e rinj të gjejnë shpejt lëndë me interes. Kur një përdorues nuk ka ndërvepruar mjaftueshëm me të tjerët, që të formohen rekomandime të personalizuara ndjekjeje, rekomandohen këto llogari. Ato përzgjidhen çdo ditë, prej një përzierje llogarish me shkallën më të lartë të angazhimit dhe numrin më të lartë të ndjekësve vendorë për një gjuhë të dhënë." + language: Për gjuhën + status: Gjendje + suppress: Mos shfaq rekomandime ndjekjeje + suppressed: Të heshtuara + title: Rekomandime ndjekjeje + unsuppress: Rikthe rekomandime ndjekjeje instances: + back_to_all: Krejt + back_to_limited: E kufizuar + back_to_warning: Kujdes by_domain: Përkatësi + delivery: + all: Krejt + clear: Spastro gabime dërgimi + restart: Rinis dërgimin + stop: Ndale dërgimin + title: Dërgim + unavailable: Jo i passhëm + unavailable_message: Dërgim jo i passhëm + warning: Kujdes + warning_message: + one: Dështim dërgimi %{count} ditë + other: Dështim dërgimi %{count} ditë delivery_available: Ka shpërndarje të mundshme + delivery_error_days: Ditë gabimi dështimi + delivery_error_hint: Nëse dërgimi s’është i mundshëm për %{count} ditë, do t’i vihet shenjë automatikisht si i padërgueshëm. empty: S’u gjetën përkatësi. known_accounts: one: "%{count} llogari e njohur" @@ -538,17 +566,25 @@ sq: resolved: I zgjidhur resolved_msg: Raportimi u zgjidh me sukses! status: Gjendje + target_origin: Origjinë e llogarisë së raportuar title: Raportime unassign: Hiqja unresolved: Të pazgjidhur updated_at: U përditësua më + rules: + add_new: Shtoni rregull + delete: Fshije + description_html: Edhe pse shumica pretendon se kanë lexuar dhe pajtohen me kushtet e shërbimit, zakonisht njerëzit nuk e lexojnë nga fillimi në fund, deri kur del një problem. Bëjeni më të lehtë parjen e rregullave të shërbyesit tuaj me një vështim, duke i dhënë në një listë të thjeshtë me pika. Përpiquni që rregullat të jenë secili të shkurtër dhe të thjeshtë, por as mos u përpiqni t’i ndani në shumë zëra të veçantë. + edit: Përpunoni rregull + empty: S’janë përcaktuar ende rregulla shërbyesi. + title: Rregulla shërbyesi settings: activity_api_enabled: - desc_html: Numër gjendjesh të postuara lokalisht, përdorues aktivë, dhe regjistrime të reja në kosha javorë - title: Botoni statistika përmbledhëse mbi veprimtarinë e përdoruesve + desc_html: Numër postimesh të postuara lokalisht, përdorues aktivë, dhe regjistrime të reja në kosha javorë + title: Botoni statistika përmbledhëse mbi veprimtarinë e përdoruesve te API bootstrap_timeline_accounts: - desc_html: Emrat e përdoruesve ndajini prej njëri-tjetrit me presje. Do të funksionojë vetëm për llogari vendore dhe të pakyçura. Si parazgjedhje, kur lihet e zbrazët, është krejt përgjegjësit vendorë. - title: Ndjekje parazgjedhje për përdorues të rinj + desc_html: Emrat e përdoruesve ndajini prej njëri-tjetrit me presje. Për këto llogari do të garantohet shfaqja te rekomandime ndjekjeje + title: Rekomandoji këto llogari për përdorues të rinj contact_information: email: Email biznesi username: Emër përdoruesi kontakti @@ -565,9 +601,6 @@ sq: users: Për përdorues vendorë që kanë bërë hyrjen domain_blocks_rationale: title: Shfaq arsye - enable_bootstrap_timeline_accounts: - desc_html: Bëj që përdoruesit e rinj automatikisht të ndjekin llogaritë e formësuara, që prurja e tyre bazë të mos nisë e zbrazët - title: Aktivizo ndjekje parazgjedhje për përdorues të rinj hero: desc_html: E shfaqur në faqen ballore. Këshillohet të paktën 600x100px. Kur nuk caktohet gjë, përdoret miniaturë e shërbyesit title: Figurë heroi @@ -603,7 +636,7 @@ sq: open: Mund të regjistrohet gjithkush title: Mënyrë regjistrimi show_known_fediverse_at_about_page: - desc_html: Kur përdoret, do të shfaqë mesazhe prej krejt fediversit të njohur, si paraparje. Përndryshe do të shfaqë vetëm mesazhe vendore. + desc_html: Kur përdoret, do të shfaqë mesazhe prej krejt fediversit të njohur, si paraparje. Përndryshe do të shfaqë vetëm mesazhe vendore title: Përfshi lëndë të federuar në faqe rrjedhe publike kohore të pamirëfilltësuar show_staff_badge: desc_html: Shfaq një stemë stafi në faqen e një përdoruesi @@ -621,9 +654,6 @@ sq: desc_html: Mund të shkruani rregullat tuaja të privatësisë, kushtet e shërbimit ose gjëra të tjera ligjore. Mund të përdorni etiketa HTML title: Kushte vetjake shërbimi site_title: Emër shërbyesi - spam_check_enabled: - desc_html: Mastodon-i mund të bëjë raportime automatike për llogari që dërgojnë në mënyrë të përsëritur mesazhe të padëshiruar. Në to mund të ketë edhe alarme të rremë. - title: Automatizim anti-spami thumbnail: desc_html: I përdorur për paraparje përmes OpenGraph-it dhe API-t. Këshillohet 1200x630px title: Miniaturë shërbyesi @@ -654,18 +684,23 @@ sq: no_status_selected: S’u ndryshua ndonjë gjendje, ngaqë s’u përzgjodh ndonjë e tillë title: Gjendje llogarish with_media: Me media + system_checks: + database_schema_check: + message_html: Ka migrime bazash të dhënash pezull. Ju lutemi, kryejini, për të qenë të sigurt se aplikacioni sillet siç priteet + rules_check: + action: Administroni rregulla shërbyesi + message_html: S’keni përcaktuar ndonjë rregull shërbyesi. + sidekiq_process_check: + message_html: S’ka proces Sidekiq në punë për %{value} radhë. Ju lutemi, shqyrtoni formësimin tuaj për Sidekiq-un tags: accounts_today: Përdorime unike sot accounts_week: Përdorime unike këtë javë breakdown: Përdorimi sot, analizuar sipas burimesh - context: Kontekst - directory: Në drejtori - in_directory: "%{count} në drejtori" last_active: Aktive së fundi më most_popular: Më populloret most_recent: Më të rejat name: Hashtag - review: Gjendja e rishikimit + review: Gjendje rishikimi reviewed: E shqyrtuar title: Hashtag-ë trending_right_now: Popullore mu tani @@ -677,6 +712,7 @@ sq: add_new: Shtoni të ri delete: Fshije edit_preset: Përpunoni sinjalizim të paracaktuar + empty: S’keni përcaktuar ende sinjalizime të gatshme. title: Administroni sinjalizime të paracaktuara admin_mailer: new_pending_account: @@ -790,7 +826,7 @@ sq: invalid_signature: s’është nënshkrim Ed25519 i vlefshëm date: formats: - default: "%b %d, %Y" + default: "%d %b, %Y" with_month_name: "%d %B, %Y" datetime: distance_in_words: @@ -861,7 +897,7 @@ sq: domain_blocks: Bllokime përkatësish lists: Lista mutes: Heshtoni - storage: Depozitim për media + storage: Depozitë media featured_tags: add_new: Shtoni të re errors: @@ -966,6 +1002,17 @@ sq: lists: errors: limit: Keni mbërritur në numrin maksimum të sasisë së listave + login_activities: + authentication_methods: + otp: aplikacion mirëfilltësimi dyfaktorësh + password: fjalëkalim + sign_in_token: kod sigurie përmes email-i + webauthn: kyçe sigurie + description_html: Nëse shihni veprimtari që nuk e njihni, shihni mundësinë e ndryshimit të fjalëkalimit tuaj dhe të aktivizimit të mirëfilltësimit dyfaktorësh. + empty: S’ka historik mirëfilltësimesh + failed_sign_in_html: Dështoi përpjekje hyrjeje me %{method} nga %{ip} (%{browser}) + successful_sign_in_html: Hyrje e suksesshme me %{method} nga %{ip} (%{browser}) + title: Historik mirëfilltësimesh media_attachments: validations: images_and_video: S’mund të bashkëngjitet video te një gjendje që përmban figura tashmë @@ -1038,10 +1085,14 @@ sq: body: 'U përmendët nga %{name} në:' subject: U përmendët nga %{name} title: Përmendje e re + poll: + subject: Përfundoi një pyetësor nga %{name} reblog: body: 'Gjendja juaj u përforcua nga %{name}:' subject: "%{name} përforcoi gjendjen tuaj" title: Përforcim i ri + status: + subject: "%{name} sapo postoi" notifications: email_events: Akte për njoftim me email email_events_hint: 'Përzgjidhni akte për të cilët doni të merrni njoftime:' @@ -1150,7 +1201,7 @@ sq: weibo: Weibo current_session: Sesioni i tanishëm description: "%{browser} në %{platform}" - explanation: Këta janë shfletuesit e futur në këtë çast te llogaria juaj Mastodon. + explanation: Këta janë shfletuesit e përdorur tani për hyrje te llogaria juaj Mastodon. ip: IP platforms: adobe_air: Adobe Air @@ -1168,6 +1219,7 @@ sq: revoke: Shfuqizoje revoke_success: Sesioni u shfuqizua me sukses title: Sesione + view_authentication_history: Shihni historik mirëfilltësimesh të llogarisë tuaj settings: account: Llogari account_settings: Rregullime llogarie @@ -1188,10 +1240,9 @@ sq: preferences: Parapëlqime profile: Profil relationships: Ndjekje dhe ndjekës + statuses_cleanup: Fshirje e automatizuar postimesh two_factor_authentication: Mirëfilltësim Dyfaktorësh webauthn_authentication: Kyçe sigurie - spam_check: - spam_detected: Ky është një raportim i automatizuar. Është pikasur mesazh i padëshiruar. statuses: attached: audio: @@ -1234,12 +1285,47 @@ sq: sign_in_to_participate: Bëni hyrjen, që të merrni pjesë te biseda title: '%{name}: "%{quote}"' visibilities: + direct: I drejtpërdrejtë private: Vetëm ndjekësve private_long: Shfaqua vetëm ndjekësve public: Publike public_long: Mund ta shohë kushdo unlisted: Jo në listë unlisted_long: Mund ta shohë gjithkush, por s’gjendet në rrjedha publike kohore + statuses_cleanup: + enabled: Fshi automatikisht postime të vjetra + enabled_hint: Fshin automatikisht postimet tuaja, pasi mbërrijnë një prag të caktuar moshe, hiq rastin kur ka përputhje me një nga përjashtimet më poshtë + exceptions: Përjashtime + explanation: Ngaqë fshirja e postimeve është një veprim i shtrenjtë, kjo bëhet ngadalë, gjatë kohës kur shërbyesi s’është i zënë. Për këtë arsye, postimet tuaja mund të fshihen pas ca kohësh pasi të ketë mbërritur pragun e moshës për to. + ignore_favs: Shpërfilli të parapëlqyerit + ignore_reblogs: Shpërfilli përforcimet + interaction_exceptions: Përjashtime bazuar në ndërveprime + interaction_exceptions_explanation: Kini parasysh se nuk ka garanci se postimet do të fshihen, nëse kalojnë nën pragun për të parapëlqyerat ose përforcimet, pasi kanë kaluar një herë në to. + keep_direct: Mbaj mesazhet e drejtpërdrejtë + keep_direct_hint: S’fshihet ndonjë nga mesazhet tuaj të drejtpërdrejtë + keep_media: Mbaj postime me bashkëngjitje media + keep_media_hint: S’fshihet ndonjë nga postimet tuaj që kanë bashkëngjitje media + keep_pinned: Mbaj postimet e fiksuara + keep_pinned_hint: S’fshihet ndonjë nga postimet tuaj të fiksuara + keep_polls: Mbaj pyetësorë + keep_polls_hint: S’fshihet ndonjë nga pyetësorët tuaj + keep_self_bookmark: Mbaj postime që keni faqeruajtur + keep_self_bookmark_hint: S’fshihen postimet tuaja, nëse i keni faqeruajtur + keep_self_fav: Mbaji postimet që keni parapëlqyer + keep_self_fav_hint: Nuk fshihen postimet tuaja, nëse i keni parapëlqyer + min_age: + '1209600': 2 javë + '15778476': 6 muaj + '2629746': 1 muaj + '31556952': 1 vit + '5259492': 2 muaj + '63113904': 2 vjet + '7889238': 3 muaj + min_age_label: Prag moshe + min_favs: Mbaji postimet e parapëlqyera më shumë se + min_favs_hint: Nuk fshihet ndonjë nga postimet tuaja që kanë marrë më shumë se sa ky numër parapëlqimesh. Lëreni të zbrazët për të fshirë postimet, pavarësisht të numrit të parapëlqimeve për to + min_reblogs: Mbaji postimet e përforcuara më shumë se + min_reblogs_hint: Nuk fshihet ndonjë nga postimet tuaja që kanë marrë më shumë se sa ky numër përforcimesh. Lëreni të zbrazët për të fshirë postimet, pavarësisht të numrit të përforcimeve për to stream_entries: pinned: Mesazh i fiksuar reblogged: të përforcuara @@ -1385,7 +1471,7 @@ sq: silence: Llogari e kufizuar suspend: Llogari e pezulluar welcome: - edit_profile_action: Rregullim profili + edit_profile_action: Ujdisje profili edit_profile_step: Profilin mund ta personalizoni duke ngarkuar një avatar, figurë kryesh, duke ndryshuar emrin tuaj në ekran, etj. Nëse dëshironi të shqyrtoni ndjekës të rinj, përpara se të jenë lejuar t’ju ndjekin, mund të kyçni llogarinë tuaj. explanation: Ja disa ndihmëza, sa për t’ia filluar final_action: Filloni të postoni @@ -1402,14 +1488,11 @@ sq: tips: Ndihmëza title: Mirë se vini, %{name}! users: - blocked_email_provider: Ky furnizues shërbimi email nuk lejohet follow_limit_reached: S’mund të ndiqni më tepër se %{limit} persona generic_access_help_html: Problem me hyrjen në llogarinë tuaj? Për asistencë mund të lidheni me %{email} - invalid_email: Adresa email është e pavlefshme - invalid_email_mx: Adresa email s’duket se ekziston invalid_otp_token: Kod dyfaktorësh i pavlefshëm invalid_sign_in_token: Kod sigurie i pavlefshëm - otp_lost_help_html: Nëse humbi hyrjen te të dy, mund të lidheni me %{email} + otp_lost_help_html: Nëse humbët hyrjen te të dy, mund të lidheni me %{email} seamless_external_login: Jeni futur përmes një shërbimi të jashtëm, ndaj s’ka rregullime fjalëkalimi dhe email. signed_in_as: 'I futur si:' suspicious_sign_in_confirmation: Duket se s’keni hyrë më parë nga kjo pajisje, dhe se keni kohë pa bërë hyrje, ndaj po ju dërgojmë një kod sigurie te adresa juaj email, që të ripohoni se jeni ju. @@ -1417,7 +1500,7 @@ sq: explanation_html: 'Mundeni të verifikoni veten si i zoti i lidhjeve te tejtëdhënat e profilit tuaj. Për këtë, sajti i lidhur duhet të përmbajë një lidhje për te profili juaj Mastodon. Lidhje për te ajo duhet të ketë një atribut rel="me". Lënda tekst e lidhjes nuk ngre peshë. Ja një shembull:' verification: Verifikim webauthn_credentials: - add: Shton kyç të ri sigurie + add: Shtoni kyç të ri sigurie create: error: Pati një problem me shtimin e kyçeve tuaj të sigurisë. Ju lutemi, riprovoni. success: Kyçi juaj i sigurisë u shtua me sukses. diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index da8eda86f4..e762126ad5 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -19,7 +19,6 @@ sr-Latn: people_followed_by: Ljudi koje %{name} prati people_who_follow: Ljudi koji prate %{name} posts_with_replies: Tutovi i odgovori - reserved_username: Korisničko ime je rezervisano roles: admin: Administrator moderator: Moderator @@ -98,30 +97,6 @@ sr-Latn: username: Korisničko ime web: Veb action_logs: - actions: - confirm_user: "%{name} je potvrdio adresu e-pošte korisnika %{target}" - create_custom_emoji: "%{name} je otpremio novi emotikon %{target}" - create_domain_block: "%{name} je blokirao domen %{target}" - create_email_domain_block: "%{name} je stavio na crnu listu domen e-pošte %{target}" - demote_user: "%{name} je ražalovao korisnika %{target}" - destroy_domain_block: "%{name} je odblokirao domen %{target}" - destroy_email_domain_block: "%{name} je stavio na belu listu domen e-pošte %{target}" - destroy_status: "%{name} je uklonio status korisnika %{target}" - disable_2fa_user: "%{name} je isključio obaveznu dvofaktorsku identifikaciju za korisnika %{target}" - disable_custom_emoji: "%{name} je onemogućio emotikon %{target}" - disable_user: "%{name} je onemogućio prijavljivanje korisniku %{target}" - enable_custom_emoji: "%{name} je omogućio emotikon %{target}" - enable_user: "%{name} je omogućio prijavljivanje za korisnika %{target}" - memorialize_account: "%{name} je pretvorio stranu naloga %{target} kao in memoriam stranu" - promote_user: "%{name} je unapredio korisnika %{target}" - reset_password_user: "%{name} je resetovao lozinku korisniku %{target}" - resolve_report: "%{name} je odbacio prijavu %{target}" - silence_account: "%{name} je ućutkao nalog %{target}" - suspend_account: "%{name} je suspendovao nalog %{target}" - unsilence_account: "%{name} je ukinuo ćutanje nalogu %{target}" - unsuspend_account: "%{name} je ukinuo suspenziju nalogu %{target}" - update_custom_emoji: "%{name} je izmenio emotikon %{target}" - update_status: "%{name} je izmenio status korisnika %{target}" title: Zapisnik custom_emojis: by_domain: Domen @@ -481,6 +456,5 @@ sr-Latn: recovery_codes_regenerated: Kodovi za oporavak uspešno regenerisani recovery_instructions_html: Ako ikada izgubite pristup telefonu, možete iskoristiti kodove za oporavak date ispod da povratite pristup nalogu. Držite kodove za oporavak na sigurnom. Na primer, odštampajte ih i čuvajte ih sa ostalim važnim dokumentima. users: - invalid_email: Adresa e-pošte nije ispravna invalid_otp_token: Neispravni dvofaktorski kod signed_in_as: 'Prijavljen kao:' diff --git a/config/locales/sr.yml b/config/locales/sr.yml index e26682891c..b6c92976ac 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -6,6 +6,7 @@ sr: about_this: О инстанци administered_by: 'Администрирано од стране:' apps: Мобилне апликације + browse_directory: Прегледајте директоријум налога и филтрирајте према интересовањима contact: Контакт contact_missing: Није постављено documentation: Документација @@ -50,11 +51,11 @@ sr: other: Трубе posts_tab_heading: Трубе posts_with_replies: Трубе и одговори - reserved_username: Корисничко име је резервисано roles: admin: Администратор bot: Бот moderator: Модератор + unavailable: Налог је недоступан unfollow: Отпрати admin: account_actions: @@ -121,7 +122,7 @@ sr: protocol: Протокол public: Јавно push_subscription_expires: PuSH претплата истиче - redownload: Освежи профил + redownload: Освежи налог remove_avatar: Уклони аватар remove_header: Одстрани заглавље resend_confirmation: @@ -156,37 +157,6 @@ sr: warn: Упозори web: Веб action_logs: - actions: - assigned_to_self_report: "%{name} је доделио/ла извештај %{target} себи" - change_email_user: "%{name} је променио/ла адресу Е-поште коисника/це %{target}" - confirm_user: "%{name} је потврдио адресу е-поште корисника %{target}" - create_account_warning: "%{name} је послао пријаву %{target}" - create_custom_emoji: "%{name} је отпремио нови емоџи %{target}" - create_domain_block: "%{name} је блокирао домен %{target}" - create_email_domain_block: "%{name} је ставио на црну листу домен е-поште %{target}" - demote_user: "%{name} је ражаловао корисника %{target}" - destroy_custom_emoji: "%{name} је уништио емоџи %{target}" - destroy_domain_block: "%{name} је одблокирао домен %{target}" - destroy_email_domain_block: "%{name} је ставио на белу листу домен е-поште %{target}" - destroy_status: "%{name} је уклонио статус корисника %{target}" - disable_2fa_user: "%{name} је искључио обавезну двофакторску идентификацију за корисника %{target}" - disable_custom_emoji: "%{name} је онемогућио емотикон %{target}" - disable_user: "%{name} је онемогућио пријављивање кориснику %{target}" - enable_custom_emoji: "%{name} је омогућио емотикон %{target}" - enable_user: "%{name} је омогућио пријављивање за корисника %{target}" - memorialize_account: "%{name} је претворио страну налога %{target} као in memoriam страну" - promote_user: "%{name} је унапредио корисника %{target}" - remove_avatar_user: "%{name} је уклонио/ла %{target}'s аватар" - reopen_report: "%{name} је поново отворио/ла извештај %{target}" - reset_password_user: "%{name} је ресетовао лозинку кориснику %{target}" - resolve_report: "%{name} је одбацио пријаву %{target}" - silence_account: "%{name} је ућуткао налог %{target}" - suspend_account: "%{name} је суспендовао налог %{target}" - unassigned_report: "%{name} недодељен извештај %{target}" - unsilence_account: "%{name} је укинуо ћутање налогу %{target}" - unsuspend_account: "%{name} је укинуо суспензију налогу %{target}" - update_custom_emoji: "%{name} је изменио емотикон %{target}" - update_status: "%{name} је изменио статус корисника %{target}" deleted_status: "(обрисан статус)" title: Записник custom_emojis: @@ -215,27 +185,9 @@ sr: updated_msg: Емоџи успешно ажуриран! upload: Отпреми dashboard: - backlog: Позадински записи - config: Конфигурација - feature_deletions: Брисање налога - feature_invites: Позивнице - feature_profile_directory: Фасцикла профила - feature_registrations: Регистрација - feature_relay: Федеративни релеј - features: Карактеристике - hidden_service: Федерација са скривеним услугама - open_reports: отворене пријаве - recent_users: Недавни корисници - search: Потпуна претрага текста - single_user_mode: Појединачни корисник software: Софтвер space: Коришћење простора title: Командна табла - total_users: укупан број корисника - trends: Трендови - week_interactions: интеракције ове недеље - week_users_active: активно ове недеље - week_users_new: корисника ове недеље domain_blocks: add_new: Додај нови блок домена created_msg: Блокирање домена се обрађује @@ -245,7 +197,7 @@ sr: create: Направи блокаду hint: Блокирање домена неће спречити прављење налога у бази, али ће ретроактивно и аутоматски применити одређене модераторске методе над тим налозима. severity: - desc_html: "Ућуткавање ће све статусе овог налога учинити невидљивим за све, осим за оне који већ прате налог. Суспензија ће уклонити сав садржај налога, сву мултимедију, и профилне податке. Користите Ништа само ако желите да одбаците мултимедијалне фајлове." + desc_html: "Ућуткавање ће све статусе овог налога учинити невидљивим за све, осим за оне који их већ прате. Суспензија ће уклонити сав садржај налога, сву мултимедију и податке налога. Користите Ништа само ако желите да одбаците мултимедијалне фајлове." noop: Ништа silence: Ућуткавање suspend: Суспензија @@ -375,7 +327,7 @@ sr: title: Покажи осетљив медиј у ОпенГраф прегледу profile_directory: desc_html: Дозволи корисницима да буду откривени - title: Омогући профил фасцикле + title: Омогући директоријум налога registrations: closed_message: desc_html: Приказује се на главној страни када је инстанца затворена за регистрације. Можете користити HTML тагове @@ -442,7 +394,7 @@ sr: notification_preferences: Промени преференце Е-поште settings: 'Промени подешавања е-поште: %{link}' view: 'Погледај:' - view_profile: Погледај профил + view_profile: Погледај налог view_status: Погледај статус applications: created: Апликација успешно направљена @@ -480,7 +432,7 @@ sr: following: 'Сјајно! Сада пратите:' post_follow: close: Или можете затворити овај прозор. - return: Врати се на профил овог корисника + return: Врати се на налог овог корисника web: Иди на веб title: Запрати %{acct} datetime: @@ -498,7 +450,7 @@ sr: proceed: Обриши налог success_msg: Ваш налог је успешно обрисан directories: - directory: Профил фасцикле + directory: Директоријум налога explanation: Откријте кориснике на основу њихових интереса explore_mastodon: Истражи %{title} errors: @@ -635,6 +587,8 @@ sr: body: "%{name} Вам је подржао/ла статус:" subject: "%{name} је подржао/ла Ваш статус" title: Нова подршка + notifications: + email_events_hint: 'Изаберите дешавања за која желите да примате обавештења:' pagination: newer: Новије next: Следеће @@ -705,12 +659,14 @@ sr: back: Назад на Мастодон delete: Брисање налога development: Развој - edit_profile: Измена профила + edit_profile: Измена налога export: Извоз података import: Увоз migrate: Пребацивање налога notifications: Обавештења preferences: Подешавања + profile: Налог + relationships: Праћења и пратиоци two_factor_authentication: Двофакторска идентификација statuses: attached: @@ -787,8 +743,8 @@ sr: silence: Налог ограничен suspend: Налог суспендован welcome: - edit_profile_action: Подеси профил - edit_profile_step: Профил можете прилагодити постављањем аватара, заглавља, променом имена и још много тога. Ако желите да прегледате нове пратиоце пре него што буду дозвољени да вас прате, можете закључати свој налог. + edit_profile_action: Подеси налог + edit_profile_step: Налог можете прилагодити постављањем аватара, заглавља, променом имена и још много тога. Ако желите да прегледате нове пратиоце пре него што буду дозвољени да вас прате, можете закључати свој налог. explanation: Ево неколико савета за почетак final_action: Почните објављивати final_step: 'Почните објављивати! Чак и без пратиоца ваше јавне поруке ће бити виђене од стране других, нпр. на локалној јавног линији и у тараба за означавање. Можда бисте желели да се представите у #увод тараби за означавање.' @@ -805,11 +761,10 @@ sr: title: Добродошли, %{name}! users: follow_limit_reached: Не можете пратити више од %{limit} људи - invalid_email: Адреса Е-поште није исправна invalid_otp_token: Неисправни двофакторски код otp_lost_help_html: Ако изгубите приступ за оба, можете ступити у контакт са %{email} seamless_external_login: Пријављени сте путем спољашње услуге, тако да лозинка и подешавања Е-поште нису доступни. signed_in_as: 'Пријављен/а као:' verification: - explanation_html: 'Можете извршити проверу да сте Ви власник веза у Вашем профилу. Да би то радило, повезани веб сајт мора да садржи везу назад ка Вашем Мастодон профилу. Веза назад мора да има rel="me" атрибут. Текстуелни садржај везе није битан. Ево примера:' + explanation_html: 'Можете извршити проверу да сте Ви власник веза на Вашем налогу. Да би то радило, повезани веб сајт мора да садржи везу назад ка Вашем Мастодон налогу. Веза назад мора да има rel="me" атрибут. Текстуелни садржај везе није битан. Ево примера:' verification: Провера diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 36154b49b4..44c7948338 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -21,14 +21,17 @@ sv: federation_hint_html: Med ett konto på %{instance} kommer du att kunna följa personer på alla Mastodon-servers och mer än så. get_apps: Prova en mobilapp hosted_on: Mastodon-värd på %{domain} - instance_actor_flash: 'Detta konto är en virtuell agent som används för att representera servern själv och inte någon individuell användare. Det används av sammanslutningsskäl och ska inte blockeras såvitt du inte vill blockera hela instansen, och för detta fall ska domänblockering användas. - -' + instance_actor_flash: "Detta konto är en virtuell agent som används för att representera servern själv och inte någon individuell användare. Det används av sammanslutningsskäl och ska inte blockeras såvitt du inte vill blockera hela instansen, och för detta fall ska domänblockering användas. \n" learn_more: Lär dig mer privacy_policy: Integritetspolicy + rules: Serverns regler + rules_html: 'Nedan en sammanfattning av kontoreglerna för denna Mastodonserver:' see_whats_happening: Se vad som händer server_stats: 'Serverstatistik:' source_code: Källkod + status_count_after: + one: status + other: statusar status_count_before: Som skapat tagline: Följ vänner och upptäck nya terms: Användarvillkor @@ -69,9 +72,11 @@ sv: people_who_follow: Personer som följer %{name} pin_errors: following: Du måste vara följare av den person du vill godkänna - posts_tab_heading: Toots + posts: + one: Tuta + other: Tutor + posts_tab_heading: Tutor posts_with_replies: Toots med svar - reserved_username: Användarnamnet är reserverat roles: admin: Administratör bot: Robot @@ -86,7 +91,7 @@ sv: account_moderation_notes: create: Lämna kommentar created_msg: Modereringsnotering skapad utan problem! - delete: Ta bort + delete: Radera destroyed_msg: Modereringsnotering borttagen utan problem! accounts: add_email_domain_block: Blockera e-postdomän @@ -105,6 +110,7 @@ sv: confirm: Bekräfta confirmed: Bekräftad confirming: Bekräftande + delete: Radera data deleted: Raderad demote: Degradera disable: inaktivera @@ -121,6 +127,7 @@ sv: follows: Följs header: Rubrik inbox_url: Inkorgs URL + invite_request_text: Anledningar att gå med invited_by: Inbjuden av ip: IP-adress joined: Gick med @@ -151,7 +158,7 @@ sv: protocol: Protokoll public: Offentlig push_subscription_expires: PuSH-prenumerationen löper ut - redownload: Uppdatera avatar + redownload: Uppdatera profil reject: Förkasta reject_all: Förkasta allt / Avvisa alla remove_avatar: Ta bort avatar @@ -172,6 +179,11 @@ sv: search: Sök search_same_email_domain: Andra användare med samma e-postdomän search_same_ip: Annan användare med samma IP-adress + security_measures: + only_password: Endast lösenord + password_and_2fa: Lösenord och 2FA + sensitive: Känsligt + sensitized: markerad som känsligt shared_inbox_url: Delad inkorg URL show: created_reports: Anmälningar som skapats av det här kontot @@ -188,6 +200,7 @@ sv: undo_suspension: Ångra avstängning unsubscribe: Avsluta prenumeration username: Användarnamn + view_domain: Visa sammanfattning för domän warn: Varna web: Webb whitelisted: Vitlistad @@ -201,11 +214,16 @@ sv: create_custom_emoji: Skapa egen emoji create_domain_allow: Skapa tillåten domän create_domain_block: Skapa blockerad domän + create_ip_block: Skapa IP-regel + create_unavailable_domain: Skapa otillgänglig domän + demote_user: Degradera användare destroy_announcement: Ta bort anslag - destroy_custom_emoji: Ta bort egen emoji + destroy_custom_emoji: Radera egen emoji destroy_domain_allow: Ta bort tillåten domän destroy_domain_block: Ta bort blockerad domän + destroy_ip_block: Radera IP-regel destroy_status: Ta bort status + destroy_unavailable_domain: Ta bort otillgänglig domän disable_2fa_user: Inaktivera 2FA disable_custom_emoji: Inaktivera egna emojis disable_user: Inaktivera användare @@ -214,8 +232,10 @@ sv: memorialize_account: Minnesmärk konto promote_user: Befordra användare remove_avatar_user: Ta bort avatar + reopen_report: Öppna rapporten igen reset_password_user: Återställ lösenord resolve_report: Lös rapport + sensitive_account: Markera mediet i ditt konto som känsligt silence_account: Tysta konto suspend_account: Stäng av konto unsuspend_account: Återaktivera konto @@ -224,48 +244,56 @@ sv: update_domain_block: Uppdatera blockerad domän update_status: Uppdatera status actions: - assigned_to_self_report: "%{name} tilldelade anmälan %{target} till sig själv" - change_email_user: "%{name} bytte e-postadress för användare %{target}" - confirm_user: "%{name} bekräftade e-postadress för användare %{target}" - create_account_warning: "%{name} sände en varning till %{target}" - create_announcement: "%{name} skapade nytt meddelande %{target}" - create_custom_emoji: "%{name} laddade upp ny emoji %{target}" - create_domain_allow: "%{name} vitlistade domän %{target}" - create_domain_block: "%{name} blockerade domän %{target}" - create_email_domain_block: "%{name} svartlistade e-postdomän %{target}" - demote_user: "%{name} degraderade användare %{target}" - destroy_announcement: "%{name} raderade meddelanden %{target}" - destroy_custom_emoji: "%{name} förstörde emoji %{target}" - destroy_domain_allow: "%{name} raderade domän %{target} från vitlistan" - destroy_domain_block: "%{name} avblockerade domän %{target}" - destroy_email_domain_block: "%{name} vitlistade e-postdomän %{target}" - destroy_status: "%{name} tog bort status av %{target}" - disable_2fa_user: "%{name} inaktiverade tvåfaktorsautentiseringskrav för användare %{target}" - disable_custom_emoji: "%{name} inaktiverade emoji %{target}" - disable_user: "%{name} inaktiverade inloggning för användare %{target}" - enable_custom_emoji: "%{name} aktiverade emoji %{target}" - enable_user: "%{name} aktiverade inloggning för användare %{target}" - memorialize_account: "%{name} omvandlade %{target}s konto till en memoriam-sida" - promote_user: "%{name} flyttade upp användare %{target}" - remove_avatar_user: "%{name} tog bort %{target}s avatar" - reopen_report: "%{name} återupptog anmälan %{target}" - reset_password_user: "%{name} återställde lösenord för användaren %{target}" - resolve_report: "%{name} löste anmälan %{target}" - silence_account: "%{name} tystade ner %{target}s konto" - suspend_account: "%{name} suspenderade %{target}s konto" - unassigned_report: "%{name} otilldelade anmälan %{target}" - unsilence_account: "%{name} återljudade %{target}s konto" - unsuspend_account: "%{name} aktiverade %{target}s konto" - update_custom_emoji: "%{name} uppdaterade emoji %{target}" - update_domain_block: "%{name} uppdaterade blockerad domän för %{target}" - update_status: "%{name} uppdaterade status för %{target}" + create_account_warning_html: "%{name} skickade en varning till %{target}" + create_announcement_html: "%{name} skapade tillkännagivande %{target}" + create_custom_emoji_html: "%{name} laddade upp ny emoji %{target}" + destroy_custom_emoji_html: "%{name} förstörde emoji %{target}" + destroy_domain_block_html: "%{name} avblockerade domänen %{target}" + destroy_email_domain_block_html: "%{name} avblockerade e-postdomän %{target}" + destroy_ip_block_html: "%{name} tog bort regel för IP %{target}" + destroy_status_html: "%{name} tog bort inlägget av %{target}" + disable_custom_emoji_html: "%{name} inaktiverade emoji %{target}" + disable_user_html: "%{name} stängde av inloggning för användaren %{target}" + enable_custom_emoji_html: "%{name} aktiverade emoji %{target}" + enable_user_html: "%{name} aktiverade inloggning för användaren %{target}" + memorialize_account_html: "%{name} gjorde %{target}'s konto till en minnessida" + promote_user_html: "%{name} befordrade användaren %{target}" + remove_avatar_user_html: "%{name} tog bort %{target}'s avatar" + reopen_report_html: "%{name} öppnade rapporten igen %{target}" + reset_password_user_html: "%{name} återställ användarens lösenord %{target}" + resolve_report_html: "%{name} löste rapporten %{target}" + sensitive_account_html: "%{name} markerade %{target}'s media som känsligt" + silence_account_html: "%{name} begränsade %{target}'s konto" + suspend_account_html: "%{name} stängde av %{target}'s konto" + unsensitive_account_html: "%{name} avmarkerade %{target}'s media som känsligt" + unsuspend_account_html: "%{name} tog bort avstängningen av %{target}'s konto" + update_announcement_html: "%{name} uppdaterade tillkännagivandet %{target}" + update_custom_emoji_html: "%{name} uppdaterade emoji %{target}" + update_domain_block_html: "%{name} uppdaterade domän-block för %{target}" + update_status_html: "%{name} uppdaterade inlägget av %{target}" deleted_status: "(raderad status)" empty: Inga loggar hittades. + filter_by_action: Filtrera efter åtgärd + filter_by_user: Filtrera efter användare title: Revisionslogg announcements: + destroyed_msg: Borttagning av tillkännagivandet lyckades! + edit: + title: Redigera tillkännagivande + empty: Inga tillkännagivanden hittades. + live: Direkt + new: + create: Skapa tillkännagivande + title: Nytt tillkännagivande + publish: Publicera + published_msg: Publiceringen av tillkännagivandet lyckades! scheduled_for: Schemalagd för %{time} + scheduled_msg: Tillkännagivandet schemalades för publicering! + title: Tillkännagivanden + unpublish: Avpublicera + updated_msg: Uppdatering av tillkännagivandet lyckades! custom_emojis: - assign_category: Ange kategori + assign_category: Tilldela kategori by_domain: Domän copied_msg: Skapade en lokal kopia av emoji utan problem copy: Kopia @@ -298,33 +326,9 @@ sv: updated_msg: Emoji uppdaterades utan problem! upload: Ladda upp dashboard: - authorized_fetch_mode: Säkert läge - backlog: återstående jobb - config: Konfiguration - feature_deletions: Kontoraderingar - feature_invites: Inbjudningslänkar - feature_profile_directory: Profilkatalog - feature_registrations: Registreringar - feature_relay: Förbundsmöte - feature_spam_check: Anti-skräp - feature_timeline_preview: Förhandsgranskning av tidslinje - features: Funktioner - hidden_service: Sammanslutning med gömda tjänster - open_reports: öppna rapporter - pending_tags: hashtags som inväntar granskning - pending_users: användare som inväntar granskning - recent_users: Senaste användare - search: Fulltextsökning - single_user_mode: Enanvändarläge software: Programvara space: Utrymmesutnyttjande / Utrymmesanvändning title: Kontrollpanel - total_users: totalt antal användare - trends: Trender - week_interactions: kommunikation denna vecka / interaktioner denna vecka - week_users_active: aktiv(a) denna vecka - week_users_new: användare denna vecka - whitelist_mode: Vitlisteläge domain_allows: add_new: Vitlistedomän created_msg: Domänen har vitlistats @@ -353,6 +357,10 @@ sv: public_comment: Offentlig kommentar reject_media: Avvisa mediafiler reject_media_hint: Raderar lokalt lagrade mediefiler och förhindrar möjligheten att ladda ner något i framtiden. Irrelevant för suspensioner + reject_reports: Avvisa rapporter + reject_reports_hint: Ignorera alla rapporter som kommer från den här domänen. Gäller inte för avstängningar + rejecting_media: avvisar media-filer + rejecting_reports: avvisar rapporter severity: silence: tystad suspend: avstängd @@ -366,6 +374,7 @@ sv: title: Ångra domänblockering för %{domain} undo: Ångra undo: Ångra + view: Visa domänblock email_domain_blocks: add_new: Lägg till ny created_msg: E-postdomän har lagts till i domänblockslistan utan problem @@ -378,9 +387,29 @@ sv: create: Skapa domän title: Ny E-postdomänblocklistningsinmatning title: E-postdomänblock + follow_recommendations: + language: För språket + status: Status + title: Följ rekommendationer instances: + back_to_all: Alla + back_to_limited: Begränsat + back_to_warning: Varning by_domain: Domän + delivery: + all: Alla + clear: Rensa leverans-fel + restart: Starta om leverans + stop: Stoppa leverans + title: Leverans + unavailable: Ej tillgänglig + unavailable_message: Leverans otillgängligt + warning: Varning + delivery_available: Leverans är tillgängligt empty: Inga domäner hittades. + known_accounts: + one: "%{count} känt konto" + other: "%{count} kända konton" moderation: all: Alla limited: Begränsad @@ -391,6 +420,8 @@ sv: total_blocked_by_us: Blockerad av oss total_followed_by_them: Följs av dem total_followed_by_us: Följs av oss + total_reported: Rapporter om dem + total_storage: Media-bilagor invites: deactivate_all: Inaktivera alla filter: @@ -399,9 +430,27 @@ sv: expired: Utgångna title: Filtrera title: Inbjudningar + ip_blocks: + add_new: Skapa regel + created_msg: Ny IP-regel lades framgångsrikt till + delete: Radera + expires_in: + '1209600': 2 veckor + '15778476': 6 månader + '2629746': 1 månad + '31556952': 1 år + '86400': 1 dag + '94670856': 3 år + new: + title: Skapa ny IP-regel + no_ip_block_selected: Inga IP-regler ändrades då inga var valda + title: IP-regler pending_accounts: title: Väntande konton (%{count}) + relationships: + title: "%{acct}'s relationer" relays: + add_new: Lägg till nytt relä delete: Radera disable: Inaktivera disabled: Inaktiverad @@ -409,11 +458,20 @@ sv: enable_hint: När den är aktiverad kommer din server att prenumerera på alla publika toots från detta relay, och kommer att börja skicka serverns publika toots till den. enabled: Aktivera save_and_enable: Spara och aktivera + setup: Konfigurera en relä-anslutning status: Status + title: Relä report_notes: created_msg: Anmälningsanteckning har skapats! destroyed_msg: Anmälningsanteckning har raderats! reports: + account: + notes: + one: "%{count} anteckning" + other: "%{count} anteckningar" + reports: + one: "%{count} rapport" + other: "%{count} rapporter" action_taken_by: Åtgärder vidtagna av are_you_sure: Är du säker? assign_to_self: Tilldela till mig @@ -439,10 +497,16 @@ sv: resolved: Löst resolved_msg: Anmälan har lösts framgångsrikt! status: Status + target_origin: Ursprung för anmält konto title: Anmälningar unassign: Otilldela unresolved: Olösta updated_at: Uppdaterad + rules: + add_new: Lägg till regel + delete: Radera + edit: Ändra regel + title: Serverns regler settings: activity_api_enabled: desc_html: Räkning av lokalt postade statusar, aktiva användare och nyregistreringar per vecka @@ -466,8 +530,6 @@ sv: users: För inloggade lokala användare domain_blocks_rationale: title: Visa motiv - enable_bootstrap_timeline_accounts: - title: Aktivera standard följer för nya användare hero: desc_html: Visas på framsidan. Minst 600x100px rekommenderas. Om inte angiven faller den tillbaka på instansens miniatyrbild title: Hjältebild @@ -476,12 +538,17 @@ sv: peers_api_enabled: desc_html: Domännamn denna instans har påträffat i fediverse title: Publicera lista över upptäckta instanser + preview_sensitive_media: + title: Visa känsligt media i OpenGraph-förhandsvisningar + profile_directory: + desc_html: Tillåt användare att upptäckas + title: Aktivera profil-mapp registrations: closed_message: desc_html: Visas på framsidan när registreringen är stängd. Du kan använda HTML-taggar title: Stängt registreringsmeddelande deletion: - desc_html: Tillåt alla att ta bort sitt konto + desc_html: Tillåt vem som helst att radera sitt konto title: Öppen kontoradering min_invite_role: disabled: Ingen @@ -489,6 +556,12 @@ sv: require_invite_text: desc_html: När nyregistrering kräver manuellt godkännande, gör det obligatoriskt att fylla i text i fältet "Varför vill du gå med?" title: Kräv att nya användare fyller i en inbjudningsförfrågan + registrations_mode: + modes: + approved: Godkännande krävs för registrering + none: Ingen kan registrera + open: Alla kan registrera + title: Registreringsläge show_known_fediverse_at_about_page: desc_html: När den växlas, kommer toots från hela fediverse visas på förhandsvisning. Annars visas bara lokala toots. title: Visa det kända fediverse på tidslinjens förhandsgranskning @@ -501,6 +574,8 @@ sv: site_description_extended: desc_html: Ett bra ställe för din uppförandekod, regler, riktlinjer och andra saker som stämmer med din instans. Du kan använda HTML-taggar title: Egentillverkad utökad information + site_short_description: + title: Kort beskrivning av servern site_terms: desc_html: Du kan skriva din egen integritetspolicy, användarvillkor eller andra regler. Du kan använda HTML-taggar title: Egentillverkad villkor för tjänster @@ -512,6 +587,8 @@ sv: desc_html: Visa offentlig tidslinje på landingsidan title: Förhandsgranska tidslinje title: Sidans inställningar + trends: + title: Trendande hashtaggar site_uploads: delete: Radera uppladdad fil statuses: @@ -522,13 +599,27 @@ sv: nsfw_on: Markera som känslig deleted: Raderad failed_to_execute: Misslyckades att utföra + media: + title: Media no_media: Ingen media title: Kontostatus with_media: med media + system_checks: + rules_check: + action: Hantera serverregler + message_html: Du har inte definierat några serverregler. tags: accounts_today: Unika användare idag accounts_week: Unika användare den här veckan last_active: Senast aktiv + most_popular: Mest populära + most_recent: Nyligen skapade + name: Hashtag + reviewed: Granskad + title: Hashtaggar + trending_right_now: Trenderar just nu + unreviewed: Ej granskad + title: Administration warning_presets: add_new: Lägg till ny delete: Radera @@ -546,10 +637,12 @@ sv: discovery: Upptäck localization: body: Mastodon översätts av volontärer. + guide_link: https://crowdin.com/project/mastodon guide_link_text: Alla kan bidra. sensitive_content: Känsligt innehåll application_mailer: notification_preferences: Ändra e-postinställningar + salutation: "%{name}," settings: 'Ändra e-postinställningar: %{link}' view: 'Granska:' view_profile: Visa profil @@ -563,12 +656,19 @@ sv: warning: Var mycket försiktig med denna data. Dela aldrig den med någon! your_token: Din access token auth: + apply_for_account: Be om en inbjudan change_password: Lösenord - delete_account: Ta bort konto + checkbox_agreement_html: Jag accepterar serverreglerna och villkoren för användning + delete_account: Radera konto delete_account_html: Om du vill radera ditt konto kan du fortsätta här. Du kommer att bli ombedd att bekräfta. + description: + prefix_invited_by_user: "@%{name} bjuder in dig att gå med i en Mastodon-server!" + prefix_sign_up: Registrera dig på Mastodon idag! didnt_get_confirmation: Fick du inte instruktioner om bekräftelse? + dont_have_your_security_key: Har du inte din säkerhetsnyckel? forgot_password: Glömt ditt lösenord? invalid_reset_password_token: Lösenordsåterställningstoken är ogiltig eller utgått. Vänligen be om en ny. + link_to_otp: Ange en tvåfaktor-kod från din telefon eller en återställningskod login: Logga in logout: Logga ut migrate_account: Flytta till ett annat konto @@ -578,6 +678,7 @@ sv: cas: CAS saml: SAML register: Registrera + registration_closed: "%{instance} accepterar inte nya medlemmar" resend_confirmation: Skicka instruktionerna om bekräftelse igen reset_password: Återställ lösenord security: Säkerhet @@ -588,6 +689,8 @@ sv: account_status: Kontostatus redirecting_to: Ditt konto är inaktivt eftersom det för närvarande dirigeras om till %{acct}. too_fast: Formuläret har skickats för snabbt, försök igen. + trouble_logging_in: Har du problem med att logga in? + use_security_key: Använd säkerhetsnyckel authorize_follow: already_following: Du följer redan detta konto already_requested: Du har redan skickat en vänförfrågan till det kontot @@ -602,12 +705,17 @@ sv: title: Följ %{acct} challenge: confirm: Fortsätt + hint_html: "Tips: Vi frågar dig inte efter ditt lösenord igen under nästkommande timme." invalid_password: Ogiltigt lösenord prompt: Bekräfta lösenord för att fortsätta crypto: errors: invalid_key: är inte en giltig Ed25519 eller Curve25519 nyckel invalid_signature: är inte en giltig Ed25519 signatur + date: + formats: + default: "%b %d, %Y" + with_month_name: "%B %d, %Y" datetime: distance_in_words: about_x_hours: "%{count}tim" @@ -618,22 +726,32 @@ sv: less_than_x_minutes: "%{count}min" less_than_x_seconds: Just nu over_x_years: "%{count}år" + x_days: "%{count}d" x_minutes: "%{count}min" x_months: "%{count}mån" x_seconds: "%{count}sek" deletes: + challenge_not_passed: Informationen som du angav var inte korrekt confirm_password: Ange ditt lösenord för att verifiera din identitet - proceed: Ta bort konto + confirm_username: Fyll i ditt användarnamn för att bekräfta proceduren + proceed: Radera konto success_msg: Ditt konto har raderats warning: + email_change_html: Du kan ändra din e-postadress utan att radera ditt konto irreversible: Du kan inte återställa eller återaktivera ditt konto + username_available: Ditt användarnamn kommer att bli tillgängligt igen + username_unavailable: Ditt användarnamn kommer att fortsätta vara otillgängligt + directories: + directory: Profil-mapp + explanation: Upptäck användare baserat på deras intressen + explore_mastodon: Utforska %{title} domain_validator: invalid_domain: är inte ett giltigt domännamn errors: '400': The request you submitted was invalid or malformed. '403': Du har inte behörighet att visa den här sidan. '404': Sidan du letade efter existerar inte. - '406': This page is not available in the requested format. + '406': Den här sidan är inte tillgänglig i det förfrågade formatet. '410': Sidan du letade efter existerar inte längre. '422': content: Säkerhetsverifiering misslyckades Blockerar du cookies? @@ -644,6 +762,8 @@ sv: title: Den här sidan är inte korrekt '503': The page could not be served due to a temporary server failure. noscript_html: För att använda Mastodon webbapplikationen, vänligen aktivera JavaScript. Alternativt kan du prova en av inhemska appar för Mastodon för din plattform. + existing_username_validator: + not_found_multiple: kunde inte hitta %{usernames} exports: archive_takeout: date: Datum @@ -655,6 +775,7 @@ sv: blocks: Du blockerar bookmarks: Bokmärken csv: CSV + domain_blocks: Domän-blockeringar lists: Listor mutes: Du tystar storage: Medialagring @@ -662,7 +783,10 @@ sv: add_new: Lägg till ny filters: contexts: + account: Profiler + home: Hem och listor notifications: Aviseringar + public: Publika tidslinjer thread: Konversationer edit: title: Redigera filter @@ -675,19 +799,37 @@ sv: footer: developers: Utvecklare more: Mer… + resources: Resurser + trending_now: Trendar nu generic: all: Alla changes_saved_msg: Ändringar sparades framgångsrikt! + copy: Kopiera + delete: Radera + order_by: Sortera efter save_changes: Spara ändringar validation_errors: one: Något är inte riktigt rätt ännu! Kontrollera felet nedan other: Något är inte riktigt rätt ännu! Kontrollera dom %{count} felen nedan identity_proofs: active: Aktiv + authorize: Ja, autentisera + authorize_connection_prompt: Autentisera den här kryptografiska anslutningen? + errors: + failed: Den kryptografiska anslutningen misslyckades. Vänligen försök igen från %{provider}. + i_am_html: Jag är %{username} på %{service}. + identity: Identitet inactive: Inaktiv + publicize_checkbox: 'Och tuta det här:' + publicize_toot: 'Det är bevisat! Jag är %{username} på %{service}: %{url}' + remove: Ta bort bevis från konto + status: Bekräftelse-status + view_proof: Visa bevis imports: errors: over_rows_processing_limit: innehåller fler än %{count} rader + modes: + overwrite: Skriv över preface: Du kan importera data som du exporterat från en annan instans, till exempel en lista över personer du följer eller blockerar. success: Dina uppgifter har laddats upp och kommer nu att behandlas snarast types: @@ -722,17 +864,45 @@ sv: lists: errors: limit: Du har nått det maximala antalet listor + login_activities: + authentication_methods: + password: lösenord + webauthn: säkerhetsnycklar + description_html: Om du ser aktivitet som du inte känner igen, överväg att byta ditt lösenord och aktivera tvåfaktor-autentisering. media_attachments: validations: images_and_video: Det går inte att bifoga en video till en status som redan innehåller bilder too_many: Det går inte att bifoga mer än 4 filer migrations: acct: användarnamn@domän av det nya kontot + cancel: Avbryt omdirigering cancel_explanation: Avstängning av omdirigeringen kommer att återaktivera ditt nuvarande konto, men kommer inte att återskapa följare som har flyttats till det kontot. + errors: + already_moved: är samma konto som du redan har flyttat till + missing_also_known_as: är inte ett alias för det här kontot + move_to_self: kan inte vara nuvarande konto + not_found: kunde inte hittas + on_cooldown: Du är på nerkylning incoming_migrations: Flyttar från ett annat konto + incoming_migrations_html: För att flytta från ett annat konto till det här så behöver du först skapa ett konto-alias. + moved_msg: Ditt konto omdirigerar nu till %{acct} och dina följare flyttas över. + not_redirecting: Ditt konto omdirigerar inte till något annat konto för tillfället. + on_cooldown: Du har nyss migrerat ditt konto. Den här funktionen kommer att vara tillgänglig igen om %{count} dagar. + past_migrations: Föregående migreringar + proceed_with_move: Flytta följare redirected_msg: Ditt konto dirigeras om till %{acct}. + redirecting_to: Ditt konto omdirigerar till %{acct}. + set_redirect: Konfigurera omdirigering + warning: + before: 'Vänligen läs dessa anteckningar noggrant innan du fortsätter:' + followers: Den här åtgärden kommer att flytta alla följare från det nuvarande kontot till det nya kontot + other_data: Ingen annan data kommer att flyttas automatiskt moderation: title: Moderera + move_handler: + carry_blocks_over_text: Den här användaren flyttades från %{acct} som du hade blockerat. + carry_mutes_over_text: Den här användaren flyttade från %{acct} som du hade tystat. + copy_account_note_text: 'Den här användaren flyttade från %{acct}, här var dina föregående anteckningar om dem:' notification_mailer: digest: action: Visa alla aviseringar @@ -763,39 +933,90 @@ sv: body: 'Du nämndes av %{name} in:' subject: Du nämndes av %{name} title: Ny omnämning + poll: + subject: En undersökning av %{name} har avslutats reblog: body: 'Din status knuffades av %{name}:' subject: "%{name} knuffade din status" title: Ny knuff + status: + subject: "%{name} publicerade nyss" notifications: + email_events: Händelser för e-postaviseringar + email_events_hint: 'Välj händelser som du vill ta emot aviseringar för:' other_settings: Andra aviseringsinställningar + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T + otp_authentication: + enable: Aktivera + setup: Konfigurera pagination: newer: Nyare next: Nästa older: Äldre prev: Tidigare + truncate: "…" polls: errors: + already_voted: Du har redan röstat på den här undersökningen + duration_too_long: är för långt in i framtiden + duration_too_short: är för tidigt + expired: Undersökningen har redan avslutats invalid_choice: Det valda röstalternativet finns inte + too_few_options: måste ha mer än ett objekt + too_many_options: kan inte innehålla mer än %{max} objekt preferences: other: Annat + public_timelines: Publika tidslinjer + reactions: + errors: + unrecognized_emoji: är inte en igenkänd emoji relationships: activity: Kontoaktivitet + dormant: Vilande follow_selected_followers: Följ valda personer followers: Följare following: Följer + invited: Inbjuden last_active: Senast aktiv + most_recent: Senaste + moved: Flyttad + mutual: Ömsesidig + primary: Primära + relationship: Samband + remove_selected_domains: Ta bort alla följare från de valda domänerna + remove_selected_followers: Ta bort valda följare + remove_selected_follows: Sluta följ valda användare status: Kontostatus remote_follow: acct: Ange ditt användarnamn@domän du vill följa från missing_resource: Det gick inte att hitta den begärda omdirigeringsadressen för ditt konto + no_account_html: Har du inget konto? Du kan registrera dig här proceed: Fortsätt för att följa prompt: 'Du kommer att följa:' reason_html: "Varför är det här steget nödvändigt? %{instance} är kanske inte den server du är registrerad vid, så vi behöver dirigera dig till din hemserver först." + remote_interaction: + favourite: + proceed: Fortsätt till favorit + prompt: 'Du vill favorit-markera det här inlägget:' + reply: + proceed: Fortsätt till svar + prompt: 'Du vill svara på det här inlägget:' sessions: activity: Senaste aktivitet browser: Webbläsare browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome edge: Microsoft Edge electron: Electron firefox: Firefox @@ -806,6 +1027,8 @@ sv: otter: Otter phantom_js: PhantomJS safari: Safari + uc_browser: UCBrowser + weibo: Weibo current_session: Nuvarande session description: "%{browser} på %{platform}" explanation: Detta är inloggade webbläsare på Mastodon just nu. @@ -814,13 +1037,15 @@ sv: adobe_air: Adobe Air android: Android blackberry: Blackberry - chrome_os: ChromeOS + chrome_os: Chrome OS firefox_os: Firefox OS ios: iOS linux: Linux mac: Mac other: okänd plattform windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: Återkalla revoke_success: Sessionen återkallas framgångsrikt title: Sessioner @@ -835,21 +1060,29 @@ sv: development: Utveckling edit_profile: Redigera profil export: Exportera data + identity_proofs: Identifiera bevisen + import: Importera import_and_export: Import och export migrate: Kontoflytt notifications: Aviseringar preferences: Inställningar profile: Profil relationships: Följer och följare + statuses_cleanup: Automatisk borttagning av inlägg two_factor_authentication: Tvåfaktorsautentisering - spam_check: - spam_detected: Det här är en automatisk rapport. Spam har upptäckts. + webauthn_authentication: Säkerhetsnycklar statuses: attached: + audio: + one: "%{count} ljud" + other: "%{count} ljud" description: 'Bifogad: %{attached}' image: one: "%{count} bild" other: "%{count} bilder" + video: + one: "%{count} video" + other: "%{count} videor" boosted_from_html: Boosted från %{acct_link} content_warning: 'Innehållsvarning: %{warning}' disallowed_hashtags: @@ -865,19 +1098,58 @@ sv: ownership: Någon annans toot kan inte fästas private: Icke-offentliga toot kan inte fästas reblog: Knuffar kan inte fästas + poll: + total_people: + one: "%{count} person" + other: "%{count} personer" + total_votes: + one: "%{count} röst" + other: "%{count} röster" + vote: Rösta show_more: Visa mer + show_newer: Visa nyare + show_older: Visa äldre show_thread: Visa tråd + sign_in_to_participate: Logga in för att delta i konversationen + title: '%{name}: "%{quote}"' visibilities: + direct: Direkt private: Endast följare private_long: Visa endast till följare public: Offentlig public_long: Alla kan se unlisted: Olistade unlisted_long: Alla kan se, men listas inte på offentliga tidslinjer + statuses_cleanup: + enabled: Ta automatiskt bort gamla inlägg + exceptions: Undantag + ignore_favs: Bortse från favoriter + keep_direct: Behåll direktmeddelanden + keep_direct_hint: Tar inte bort någon av dina direktmeddelanden + keep_media: Behåll inlägg med media-bilagor + keep_media_hint: Tar inte bort någon av dina inlägg som har media-bilagor + keep_pinned: Behåll fästade inlägg + keep_pinned_hint: Tar inte bort någon av dina fästade inlägg + keep_polls: Behåll undersökningar + keep_polls_hint: Tar inte bort någon av dina undersökningar + keep_self_bookmark: Behåller inlägg som du har bokmärkt + keep_self_bookmark_hint: Tar inte bort dina egna inlägg om du har bokmärkt dem + keep_self_fav: Behåll inlägg som du har favorit-märkt + min_age: + '1209600': 2 veckor + '15778476': 6 månader + '2629746': 1 månad + '31556952': 1 år + '5259492': 2 månader + '63113904': 2 år + '7889238': 3 månader + min_age_label: Åldersgräns stream_entries: pinned: Fäst toot reblogged: boostad sensitive_content: Känsligt innehåll + tags: + does_not_match_previous_name: matchar inte det föregående namnet terms: body_html: |

      Integritetspolicy

      @@ -965,20 +1237,46 @@ sv: contrast: Hög kontrast default: Mastodon mastodon-light: Mastodon (ljust) + time: + formats: + default: "%b %d, %Y, %H:%M" + month: "%b %Y" two_factor_authentication: + add: Lägg till disable: Inaktivera + edit: Redigera enabled: Tvåfaktorsautentisering är aktiverad enabled_success: Tvåfaktorsautentisering aktiverad generate_recovery_codes: Generera återställningskoder lost_recovery_codes: Återställningskoder tillåter dig att få tillgång till ditt konto om du förlorar din telefon. Om du har förlorat dina återställningskoder kan du regenerera dem här. Dina gamla återställningskoder kommer att ogiltigförklaras. + methods: Två-faktormetoder + otp: Autentiseringsapp recovery_codes: Backup återställningskod recovery_codes_regenerated: Återställningskoder genererades på nytt recovery_instructions_html: Om du någonsin tappar åtkomst till din telefon kan du använda någon av återställningskoderna nedan för att återställa åtkomst till ditt konto. Håll återställningskoderna säkra . Du kan till exempel skriva ut dem och lagra dem med andra viktiga dokument. + webauthn: Säkerhetsnycklar user_mailer: backup_ready: explanation: Du begärde en fullständig säkerhetskopiering av ditt Mastodon-konto. Det är nu klart för nedladdning! subject: Ditt arkiv är klart för nedladdning title: Arkivuttagning + sign_in_token: + details: 'Här är detaljerna för försöket:' + further_actions: 'Om det inte var du, vänligen ändra ditt lösenord och aktivera tvåfaktor-autentisering i ditt konto. Du kan göra det här:' + title: Inloggningsförsök + warning: + statuses: 'Specifikt för:' + subject: + disable: Ditt konto %{acct} har blivit fruset + none: Varning för %{acct} + silence: Ditt konto %{acct} har blivit begränsat + suspend: Ditt konto %{acct} har stängts av + title: + disable: Kontot fruset + none: Varning + sensitive: Ditt media har blivit markerat som känsligt + silence: Kontot begränsat + suspend: Kontot avstängt welcome: edit_profile_action: Profilinställning edit_profile_step: Du kan anpassa din profil genom att ladda upp en avatar, bakgrundsbild, ändra ditt visningsnamn och mer. Om du vill granska nya följare innan de får följa dig kan du låsa ditt konto. @@ -994,12 +1292,22 @@ sv: tip_following: Du följer din servers administratör(er) som standard. För att hitta fler intressanta personer, kolla de lokala och förenade tidslinjerna. tip_local_timeline: Den lokala tidslinjen är en störtflodsvy av personer på %{instance}. Det här är dina närmaste grannar! tip_mobile_webapp: Om din mobila webbläsare erbjuder dig att lägga till Mastodon på din hemskärm kan du få push-aviseringar. Det fungerar som en inbyggd app på många sätt! + tips: Tips title: Välkommen ombord, %{name}! users: - blocked_email_provider: Denna e-postleverantör är inte tillåten - invalid_email: E-postadressen är ogiltig - invalid_email_mx: E-postadressen verkar inte finnas + follow_limit_reached: Du kan inte följa fler än %{limit} personer + generic_access_help_html: Har du problem med att komma åt ditt konto? Du kan komma i kontakt med %{email} för assistans invalid_otp_token: Ogiltig tvåfaktorskod + invalid_sign_in_token: Ogiltig säkerhetskod otp_lost_help_html: Om du förlorat åtkomst till båda kan du komma i kontakt med %{email} seamless_external_login: Du är inloggad via en extern tjänst, så lösenord och e-postinställningar är inte tillgängliga. signed_in_as: 'Inloggad som:' + verification: + verification: Bekräftelse + webauthn_credentials: + add: Lägg till ny säkerhetsnyckel + delete: Radera + delete_confirmation: Är du säker på att du vill ta bort denna säkerhetsnyckel? + destroy: + success: Din säkerhetsnyckel har raderats. + not_enabled: Du har inte aktiverat WebAuthn än diff --git a/config/locales/ta.yml b/config/locales/ta.yml index 18a2077150..b6c407388d 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -63,7 +63,6 @@ ta: following: தாங்கள் அங்கீகரிக்க விரும்பும் நபரை தாங்கள் ஏற்கனவே பின்தொடரந்து கொண்டு இருக்க வேண்டும் posts_tab_heading: பிளிறல்கள் posts_with_replies: பிளிறல்கள் மற்றும் மறுமொழிகள் - reserved_username: பயனர்பெயர் முன்பதிவு செய்யப்பட்டுள்ளது roles: admin: நிர்வாகி bot: பொறி @@ -202,10 +201,6 @@ ta: update_announcement: அறிவிப்பைப் புதுப்பி update_custom_emoji: தனிப்பயனான எமோஜியைப் புதுப்பி update_status: பதிவைப் புதுப்பி - actions: - create_announcement: "%{name} %{target} என்றொரு புதிய அறிவிப்பை உருவாக்கியிருக்கிறார்" - destroy_announcement: "%{name} %{target} அறிவிப்பை நீக்கிவிட்டார்" - update_announcement: "%{name} %{target} அறிவிப்பைப் புதுப்பித்துள்ளார்" empty: குறிப்புகள் எவையும் காணப்படவில்லை. filter_by_action: செயலின் அடிப்படையில் வடிகட்டு filter_by_user: பயனரின் அடிப்படையில் வடிகட்டு @@ -230,12 +225,6 @@ ta: unlist: பட்டியலில் இருந்து அகற்றுக unlisted: பட்டியலிடப்படாத upload: பதிவேற்றம் - dashboard: - feature_registrations: பதிவுகள் - features: அம்சங்கள் - recent_users: அண்மை பயனாளர்கள் - total_users: மொத்த பயனாளர் தொகை - trends: போக்குகள் domain_blocks: new: severity: @@ -280,9 +269,6 @@ ta: errors: invalid_key: ஒரு முறையான Ed25519 அல்லது Curve25519 key அல்ல invalid_signature: ஒரு முறையான Ed25519 அடையாளம் அல்ல - date: - formats: - default: "%b %d, %Y" errors: '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. diff --git a/config/locales/tai.yml b/config/locales/tai.yml index 3b22e9999b..f7451a9069 100644 --- a/config/locales/tai.yml +++ b/config/locales/tai.yml @@ -1,5 +1,10 @@ --- tai: + about: + see_whats_happening: Khòaⁿ hoat-seng siáⁿ-mih tāi-chì + unavailable_content_description: + reason: Lí-iû + what_is_mastodon: Siáⁿ-mih sī Mastodon? errors: '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. diff --git a/config/locales/te.yml b/config/locales/te.yml index 0028ac3253..2030f02b7f 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -47,7 +47,6 @@ te: other: టూట్లు posts_tab_heading: టూట్లు posts_with_replies: టూట్లు మరియు ప్రత్యుత్తరాలు - reserved_username: ఈ username రిజర్వ్ చేయబడింది roles: admin: నిర్వాహకులు bot: బోట్ diff --git a/config/locales/th.yml b/config/locales/th.yml index 63ce98d4ba..8ef8cfda43 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1,11 +1,11 @@ --- th: about: - about_hashtag_html: มีการแท็กโพสต์สาธารณะเหล่านี้ด้วย #%{hashtag} คุณสามารถโต้ตอบกับโพสต์หากคุณมีบัญชีที่ใดก็ตามในเฟดิเวิร์ส - about_mastodon_html: 'เครือข่ายสังคมแห่งอนาคต: ไม่มีโฆษณา, ไม่มีการสอดแนมโดยองค์กร, การออกแบบตามหลักจริยธรรม และการกระจายศูนย์! เป็นเจ้าของข้อมูลของคุณด้วย Mastodon!' + about_hashtag_html: มีการแท็กโพสต์สาธารณะเหล่านี้ด้วย #%{hashtag} คุณสามารถโต้ตอบกับโพสต์ได้หากคุณมีบัญชีที่ใดก็ตามในเฟดิเวิร์ส + about_mastodon_html: 'เครือข่ายสังคมแห่งอนาคต: ไม่มีโฆษณา ไม่มีการสอดแนมโดยองค์กร การออกแบบตามหลักจริยธรรม และการกระจายศูนย์! เป็นเจ้าของข้อมูลของคุณด้วย Mastodon!' about_this: เกี่ยวกับ active_count_after: ใช้งานอยู่ - active_footnote: ผู้ใช้งานรายเดือน (MAU) + active_footnote: ผู้ใช้ที่ใช้งานอยู่รายเดือน (MAU) administered_by: 'ดูแลโดย:' api: API apps: แอปมือถือ @@ -23,12 +23,13 @@ th: hosted_on: Mastodon ที่โฮสต์ที่ %{domain} learn_more: เรียนรู้เพิ่มเติม privacy_policy: นโยบายความเป็นส่วนตัว + rules: กฎของเซิร์ฟเวอร์ see_whats_happening: ดูสิ่งที่กำลังเกิดขึ้น server_stats: 'สถิติเซิร์ฟเวอร์:' source_code: โค้ดต้นฉบับ status_count_after: - other: สถานะ - status_count_before: ผู้สร้าง + other: โพสต์ + status_count_before: ผู้เผยแพร่ tagline: ติดตามเพื่อน ๆ และค้นพบเพื่อนใหม่ ๆ terms: เงื่อนไขการให้บริการ unavailable_content: เซิร์ฟเวอร์ที่มีการควบคุม @@ -38,7 +39,7 @@ th: rejecting_media: 'จะไม่ประมวลผลหรือจัดเก็บไฟล์สื่อจากเซิร์ฟเวอร์เหล่านี้ และจะไม่แสดงภาพขนาดย่อ ต้องมีการคลิกไปยังไฟล์ต้นฉบับด้วยตนเอง:' rejecting_media_title: สื่อที่กรองอยู่ silenced: 'จะซ่อนโพสต์จากเซิร์ฟเวอร์เหล่านี้ในเส้นเวลาสาธารณะและการสนทนา และจะไม่สร้างการแจ้งเตือนจากการโต้ตอบของผู้ใช้ เว้นแต่คุณกำลังติดตามผู้ใช้:' - silenced_title: เซิร์ฟเวอร์ที่เงียบอยู่ + silenced_title: เซิร์ฟเวอร์ที่จำกัดอยู่ suspended: 'จะไม่ประมวลผล จัดเก็บ หรือแลกเปลี่ยนข้อมูลจากเซิร์ฟเวอร์เหล่านี้ ทำให้การโต้ตอบหรือการสื่อสารใด ๆ กับผู้ใช้จากเซิร์ฟเวอร์เหล่านี้เป็นไปไม่ได้:' suspended_title: เซิร์ฟเวอร์ที่ระงับอยู่ user_count_after: @@ -65,13 +66,12 @@ th: other: โพสต์ posts_tab_heading: โพสต์ posts_with_replies: โพสต์และการตอบกลับ - reserved_username: ชื่อผู้ใช้ถูกสงวนไว้ roles: admin: ผู้ดูแล bot: บอต group: กลุ่ม moderator: ผู้ควบคุม - unavailable: ไม่มีโปรไฟล์ + unavailable: โปรไฟล์ไม่พร้อมใช้งาน unfollow: เลิกติดตาม admin: account_actions: @@ -86,6 +86,7 @@ th: add_email_domain_block: ปิดกั้นโดเมนอีเมล approve: อนุมัติ approve_all: อนุมัติทั้งหมด + approved_msg: อนุมัติใบสมัครลงทะเบียนของ %{username} สำเร็จ are_you_sure: คุณแน่ใจหรือไม่? avatar: ภาพประจำตัว by_domain: โดเมน @@ -103,6 +104,7 @@ th: deleted: ลบแล้ว demote: ลดขั้น disable: อายัด + disable_sign_in_token_auth: ปิดใช้งานการรับรองความถูกต้องด้วยโทเคนอีเมล disable_two_factor_authentication: ปิดใช้งาน 2FA disabled: อายัดอยู่ display_name: ชื่อที่แสดง @@ -111,7 +113,9 @@ th: email: อีเมล email_status: สถานะอีเมล enable: เลิกอายัด + enable_sign_in_token_auth: เปิดใช้งานการรับรองความถูกต้องด้วยโทเคนอีเมล enabled: เปิดใช้งานอยู่ + enabled_msg: เลิกอายัดบัญชีของ %{username} สำเร็จ followers: ผู้ติดตาม follows: การติดตาม header: ส่วนหัว @@ -128,18 +132,19 @@ th: login_status: สถานะการเข้าสู่ระบบ media_attachments: ไฟล์แนบสื่อ memorialize: เปลี่ยนเป็นอนุสรณ์ + memorialized: เป็นอนุสรณ์แล้ว memorialized_msg: เปลี่ยน %{username} เป็นบัญชีอนุสรณ์สำเร็จ moderation: active: ใช้งานอยู่ all: ทั้งหมด pending: รอดำเนินการ - silenced: เงียบอยู่ + silenced: จำกัดอยู่ suspended: ระงับอยู่ title: การควบคุม moderation_notes: หมายเหตุการควบคุม most_recent_activity: กิจกรรมล่าสุด most_recent_ip: IP ล่าสุด - no_limits_imposed: ไม่มีขีดจำกัดที่กำหนด + no_limits_imposed: ไม่ได้กำหนดขีดจำกัด not_subscribed: ไม่ได้บอกรับ pending: การตรวจทานที่รอดำเนินการ perform_full_suspension: ระงับ @@ -148,15 +153,17 @@ th: public: สาธารณะ push_subscription_expires: การบอกรับ PuSH หมดอายุเมื่อ redownload: รีเฟรชโปรไฟล์ + redownloaded_msg: รีเฟรชโปรไฟล์ของ %{username} จากจุดเริ่มต้นสำเร็จ reject: ปฏิเสธ reject_all: ปฏิเสธทั้งหมด + rejected_msg: ปฏิเสธใบสมัครลงทะเบียนของ %{username} สำเร็จ remove_avatar: เอาภาพประจำตัวออก remove_header: เอาส่วนหัวออก removed_avatar_msg: เอาภาพประจำตัวของ %{username} ออกสำเร็จ removed_header_msg: เอาภาพส่วนหัวของ %{username} ออกสำเร็จ resend_confirmation: already_confirmed: ผู้ใช้นี้ได้รับการยืนยันอยู่แล้ว - send: ส่งอีเมลยืนยันอีกครั้ง + send: ส่งอีเมลยืนยันใหม่ success: ส่งอีเมลยืนยันสำเร็จ! reset_password: ตั้งรหัสผ่านใหม่ resubscribe: บอกรับใหม่ @@ -169,23 +176,32 @@ th: search: ค้นหา search_same_email_domain: ผู้ใช้อื่น ๆ ที่มีโดเมนอีเมลเดียวกัน search_same_ip: ผู้ใช้อื่น ๆ ที่มี IP เดียวกัน + security_measures: + only_password: รหัสผ่านเท่านั้น + password_and_2fa: รหัสผ่านและ 2FA + password_and_sign_in_token: รหัสผ่านและโทเคนอีเมล + sensitive: บังคับให้ละเอียดอ่อน + sensitized: ทำเครื่องหมายว่าละเอียดอ่อนแล้ว shared_inbox_url: URL กล่องขาเข้าที่แบ่งปัน show: created_reports: รายงานที่สร้าง targeted_reports: รายงานโดยผู้อื่น silence: จำกัด silenced: จำกัดอยู่ - statuses: สถานะ + statuses: โพสต์ subscribe: บอกรับ suspended: ระงับอยู่ time_in_queue: กำลังรออยู่ในคิว %{time} title: บัญชี unconfirmed_email: อีเมลที่ยังไม่ได้ยืนยัน - undo_silenced: เลิกทำการทำให้เงียบ + undo_sensitized: เลิกทำการบังคับให้ละเอียดอ่อน + undo_silenced: เลิกทำการจำกัด undo_suspension: เลิกทำการระงับ + unsilenced_msg: เลิกจำกัดบัญชีของ %{username} สำเร็จ unsubscribe: เลิกบอกรับ unsuspended_msg: เลิกระงับบัญชีของ %{username} สำเร็จ username: ชื่อผู้ใช้ + view_domain: ดูข้อมูลสรุปสำหรับโดเมน warn: เตือน web: เว็บ whitelisted: อนุญาตการติดต่อกับภายนอกแล้ว @@ -201,6 +217,7 @@ th: create_domain_block: สร้างการปิดกั้นโดเมน create_email_domain_block: สร้างการปิดกั้นโดเมนอีเมล create_ip_block: สร้างกฎ IP + create_unavailable_domain: สร้างโดเมนที่ไม่พร้อมใช้งาน demote_user: ลดขั้นผู้ใช้ destroy_announcement: ลบประกาศ destroy_custom_emoji: ลบอีโมจิที่กำหนดเอง @@ -208,11 +225,14 @@ th: destroy_domain_block: ลบการปิดกั้นโดเมน destroy_email_domain_block: ลบการปิดกั้นโดเมนอีเมล destroy_ip_block: ลบกฎ IP - destroy_status: ลบสถานะ + destroy_status: ลบโพสต์ + destroy_unavailable_domain: ลบโดเมนที่ไม่พร้อมใช้งาน disable_2fa_user: ปิดใช้งาน 2FA disable_custom_emoji: ปิดใช้งานอีโมจิที่กำหนดเอง + disable_sign_in_token_auth_user: ปิดใช้งานการรับรองความถูกต้องด้วยโทเคนอีเมลสำหรับผู้ใช้ disable_user: ปิดใช้งานผู้ใช้ enable_custom_emoji: เปิดใช้งานอีโมจิที่กำหนดเอง + enable_sign_in_token_auth_user: เปิดใช้งานการรับรองความถูกต้องด้วยโทเคนอีเมลสำหรับผู้ใช้ enable_user: เปิดใช้งานผู้ใช้ memorialize_account: ทำให้บัญชีเป็นอนุสรณ์ promote_user: เลื่อนขั้นผู้ใช้ @@ -220,59 +240,62 @@ th: reopen_report: เปิดรายงานใหม่ reset_password_user: ตั้งรหัสผ่านใหม่ resolve_report: แก้ปัญหารายงาน - sensitive_account: ทำเครื่องหมายสื่อในบัญชีของคุณว่าละเอียดอ่อน - silence_account: ทำให้บัญชีเงียบ + sensitive_account: บังคับให้บัญชีละเอียดอ่อน + silence_account: จำกัดบัญชี suspend_account: ระงับบัญชี unassigned_report: เลิกมอบหมายรายงาน - unsensitive_account: เลิกทำเครื่องหมายสื่อในบัญชีของคุณว่าละเอียดอ่อน - unsilence_account: เลิกทำให้บัญชีเงียบ + unsensitive_account: เลิกทำการบังคับให้บัญชีละเอียดอ่อน + unsilence_account: เลิกทำการจำกัดบัญชี unsuspend_account: เลิกระงับบัญชี update_announcement: อัปเดตประกาศ update_custom_emoji: อัปเดตอีโมจิที่กำหนดเอง update_domain_block: อัปเดตการปิดกั้นโดเมน - update_status: อัปเดตสถานะ + update_status: อัปเดตโพสต์ actions: - assigned_to_self_report: "%{name} ได้มอบหมายรายงาน %{target} ให้กับตนเอง" - change_email_user: "%{name} ได้เปลี่ยนที่อยู่อีเมลของผู้ใช้ %{target}" - confirm_user: "%{name} ได้ยืนยันที่อยู่อีเมลของผู้ใช้ %{target}" - create_account_warning: "%{name} ได้ส่งคำเตือนไปยัง %{target}" - create_announcement: "%{name} ได้สร้างประกาศใหม่ %{target}" - create_custom_emoji: "%{name} ได้อัปโหลดอีโมจิใหม่ %{target}" - create_domain_allow: "%{name} ได้อนุญาตการติดต่อกับภายนอกกับโดเมน %{target}" - create_domain_block: "%{name} ได้ปิดกั้นโดเมน %{target}" - create_email_domain_block: "%{name} ได้ปิดกั้นโดเมนอีเมล %{target}" - create_ip_block: "%{name} ได้สร้างกฎสำหรับ IP %{target}" - demote_user: "%{name} ได้ลดขั้นผู้ใช้ %{target}" - destroy_announcement: "%{name} ได้ลบประกาศ %{target}" - destroy_custom_emoji: "%{name} ได้ทำลายอีโมจิ %{target}" - destroy_domain_allow: "%{name} ได้ไม่อนุญาตการติดต่อกับภายนอกกับโดเมน %{target}" - destroy_domain_block: "%{name} ได้เลิกปิดกั้นโดเมน %{target}" - destroy_email_domain_block: "%{name} ได้เลิกปิดกั้นโดเมนอีเมล %{target}" - destroy_ip_block: "%{name} ได้ลบกฎสำหรับ IP %{target}" - destroy_status: "%{name} ได้เอาสถานะโดย %{target} ออก" - disable_2fa_user: "%{name} ได้ปิดใช้งานความต้องการสองปัจจัยสำหรับผู้ใช้ %{target}" - disable_custom_emoji: "%{name} ได้ปิดใช้งานอีโมจิ %{target}" - disable_user: "%{name} ได้ปิดใช้งานการเข้าสู่ระบบสำหรับผู้ใช้ %{target}" - enable_custom_emoji: "%{name} ได้เปิดใช้งานอีโมจิ %{target}" - enable_user: "%{name} ได้เปิดใช้งานการเข้าสู่ระบบสำหรับผู้ใช้ %{target}" - memorialize_account: "%{name} ได้เปลี่ยนบัญชีของ %{target} เป็นหน้าอนุสรณ์" - promote_user: "%{name} ได้เลื่อนขั้นผู้ใช้ %{target}" - remove_avatar_user: "%{name} ได้เอาภาพประจำตัวของ %{target} ออก" - reopen_report: "%{name} ได้เปิดรายงาน %{target} ใหม่" - reset_password_user: "%{name} ได้ตั้งรหัสผ่านของผู้ใช้ %{target} ใหม่" - resolve_report: "%{name} ได้แก้ปัญหารายงาน %{target}" - sensitive_account: "%{name} ได้ทำเครื่องหมายสื่อของ %{target} ว่าละเอียดอ่อน" - silence_account: "%{name} ได้ทำให้บัญชีของ %{target} เงียบ" - suspend_account: "%{name} ได้ระงับบัญชีของ %{target}" - unassigned_report: "%{name} ได้เลิกมอบหมายรายงาน %{target}" - unsensitive_account: "%{name} ได้เลิกทำเครื่องหมายสื่อของ %{target} ว่าละเอียดอ่อน" - unsilence_account: "%{name} ได้เลิกทำให้บัญชีของ %{target} เงียบ" - unsuspend_account: "%{name} ได้เลิกระงับบัญชีของ %{target}" - update_announcement: "%{name} ได้อัปเดตประกาศ %{target}" - update_custom_emoji: "%{name} ได้อัปเดตอีโมจิ %{target}" - update_domain_block: "%{name} ได้อัปเดตการปิดกั้นโดเมนสำหรับ %{target}" - update_status: "%{name} ได้อัปเดตสถานะโดย %{target}" - deleted_status: "(สถานะที่ลบแล้ว)" + assigned_to_self_report_html: "%{name} ได้มอบหมายรายงาน %{target} ให้กับตนเอง" + change_email_user_html: "%{name} ได้เปลี่ยนที่อยู่อีเมลของผู้ใช้ %{target}" + confirm_user_html: "%{name} ได้ยืนยันที่อยู่อีเมลของผู้ใช้ %{target}" + create_account_warning_html: "%{name} ได้ส่งคำเตือนไปยัง %{target}" + create_announcement_html: "%{name} ได้สร้างประกาศใหม่ %{target}" + create_custom_emoji_html: "%{name} ได้อัปโหลดอีโมจิใหม่ %{target}" + create_domain_allow_html: "%{name} ได้อนุญาตการติดต่อกับภายนอกกับโดเมน %{target}" + create_domain_block_html: "%{name} ได้ปิดกั้นโดเมน %{target}" + create_email_domain_block_html: "%{name} ได้ปิดกั้นโดเมนอีเมล %{target}" + create_ip_block_html: "%{name} ได้สร้างกฎสำหรับ IP %{target}" + create_unavailable_domain_html: "%{name} ได้หยุดการจัดส่งไปยังโดเมน %{target}" + demote_user_html: "%{name} ได้ลดขั้นผู้ใช้ %{target}" + destroy_announcement_html: "%{name} ได้ลบประกาศ %{target}" + destroy_custom_emoji_html: "%{name} ได้ทำลายอีโมจิ %{target}" + destroy_domain_allow_html: "%{name} ได้ไม่อนุญาตการติดต่อกับภายนอกกับโดเมน %{target}" + destroy_domain_block_html: "%{name} ได้เลิกปิดกั้นโดเมน %{target}" + destroy_email_domain_block_html: "%{name} ได้เลิกปิดกั้นโดเมนอีเมล %{target}" + destroy_ip_block_html: "%{name} ได้ลบกฎสำหรับ IP %{target}" + destroy_status_html: "%{name} ได้เอาโพสต์โดย %{target} ออก" + disable_2fa_user_html: "%{name} ได้ปิดใช้งานความต้องการสองปัจจัยสำหรับผู้ใช้ %{target}" + disable_custom_emoji_html: "%{name} ได้ปิดใช้งานอีโมจิ %{target}" + disable_sign_in_token_auth_user_html: "%{name} ได้ปิดใช้งานการรับรองความถูกต้องด้วยโทเคนอีเมลสำหรับ %{target}" + disable_user_html: "%{name} ได้ปิดใช้งานการเข้าสู่ระบบสำหรับผู้ใช้ %{target}" + enable_custom_emoji_html: "%{name} ได้เปิดใช้งานอีโมจิ %{target}" + enable_sign_in_token_auth_user_html: "%{name} ได้เปิดใช้งานการรับรองความถูกต้องด้วยโทเคนอีเมลสำหรับ %{target}" + enable_user_html: "%{name} ได้เปิดใช้งานการเข้าสู่ระบบสำหรับผู้ใช้ %{target}" + memorialize_account_html: "%{name} ได้เปลี่ยนบัญชีของ %{target} เป็นหน้าอนุสรณ์" + promote_user_html: "%{name} ได้เลื่อนขั้นผู้ใช้ %{target}" + remove_avatar_user_html: "%{name} ได้เอาภาพประจำตัวของ %{target} ออก" + reopen_report_html: "%{name} ได้เปิดรายงาน %{target} ใหม่" + reset_password_user_html: "%{name} ได้ตั้งรหัสผ่านของผู้ใช้ %{target} ใหม่" + resolve_report_html: "%{name} ได้แก้ปัญหารายงาน %{target}" + sensitive_account_html: "%{name} ได้ทำเครื่องหมายสื่อของ %{target} ว่าละเอียดอ่อน" + silence_account_html: "%{name} ได้จำกัดบัญชีของ %{target}" + suspend_account_html: "%{name} ได้ระงับบัญชีของ %{target}" + unassigned_report_html: "%{name} ได้เลิกมอบหมายรายงาน %{target}" + unsensitive_account_html: "%{name} ได้เลิกทำเครื่องหมายสื่อของ %{target} ว่าละเอียดอ่อน" + unsilence_account_html: "%{name} ได้เลิกจำกัดบัญชีของ %{target}" + unsuspend_account_html: "%{name} ได้เลิกระงับบัญชีของ %{target}" + update_announcement_html: "%{name} ได้อัปเดตประกาศ %{target}" + update_custom_emoji_html: "%{name} ได้อัปเดตอีโมจิ %{target}" + update_domain_block_html: "%{name} ได้อัปเดตการปิดกั้นโดเมนสำหรับ %{target}" + update_status_html: "%{name} ได้อัปเดตโพสต์โดย %{target}" + deleted_status: "(โพสต์ที่ลบแล้ว)" empty: ไม่พบรายการบันทึก filter_by_action: กรองตามการกระทำ filter_by_user: กรองตามผู้ใช้ @@ -286,10 +309,12 @@ th: new: create: สร้างประกาศ title: ประกาศใหม่ + publish: เผยแพร่ published_msg: เผยแพร่ประกาศสำเร็จ! scheduled_for: จัดกำหนดไว้สำหรับ %{time} scheduled_msg: จัดกำหนดการเผยแพร่ประกาศแล้ว! title: ประกาศ + unpublish: เลิกเผยแพร่ unpublished_msg: เลิกเผยแพร่ประกาศสำเร็จ! updated_msg: อัปเดตประกาศสำเร็จ! custom_emojis: @@ -317,6 +342,7 @@ th: not_permitted: คุณไม่ได้รับอนุญาตให้ทำการกระทำนี้ overwrite: เขียนทับ shortcode: รหัสย่อ + shortcode_hint: อย่างน้อย 2 ตัวอักษร เฉพาะตัวอักษรและตัวเลขและขีดล่างเท่านั้น title: อีโมจิที่กำหนดเอง uncategorized: ไม่มีหมวดหมู่ unlist: เลิกแสดงรายการ @@ -325,33 +351,9 @@ th: updated_msg: อัปเดตอีโมจิสำเร็จ! upload: อัปโหลด dashboard: - authorized_fetch_mode: โหมดปลอดภัย - backlog: งานคงค้าง - config: การกำหนดค่า - feature_deletions: การลบบัญชี - feature_invites: ลิงก์เชิญ - feature_profile_directory: ไดเรกทอรีโปรไฟล์ - feature_registrations: การลงทะเบียน - feature_relay: รีเลย์การติดต่อกับภายนอก - feature_spam_check: การป้องกันสแปม - feature_timeline_preview: ตัวอย่างเส้นเวลา - features: คุณลักษณะ - hidden_service: การติดต่อกับภายนอกกับบริการที่ซ่อนอยู่ - open_reports: รายงานที่เปิด - pending_tags: แฮชแท็กที่กำลังรอการตรวจทาน - pending_users: ผู้ใช้ที่กำลังรอการตรวจทาน - recent_users: ผู้ใช้ล่าสุด - search: การค้นหาข้อความแบบเต็ม - single_user_mode: โหมดผู้ใช้เดี่ยว software: ซอฟต์แวร์ space: การใช้พื้นที่ title: แดชบอร์ด - total_users: ผู้ใช้ทั้งหมด - trends: แนวโน้ม - week_interactions: การโต้ตอบในสัปดาห์นี้ - week_users_active: ใช้งานอยู่ในสัปดาห์นี้ - week_users_new: ผู้ใช้ในสัปดาห์นี้ - whitelist_mode: โหมดการติดต่อกับภายนอกแบบจำกัด domain_allows: add_new: อนุญาตการติดต่อกับภายนอกกับโดเมน created_msg: อนุญาตการติดต่อกับภายนอกกับโดเมนสำเร็จ @@ -377,17 +379,18 @@ th: reject_media: ปฏิเสธไฟล์สื่อ reject_media_hint: เอาไฟล์สื่อที่จัดเก็บไว้ในเซิร์ฟเวอร์ออกและปฏิเสธที่จะดาวน์โหลดไฟล์ใด ๆ ในอนาคต ไม่เกี่ยวข้องกับการระงับ reject_reports: ปฏิเสธรายงาน + reject_reports_hint: เพิกเฉยรายงานทั้งหมดที่มาจากโดเมนนี้ ไม่เกี่ยวข้องกับการระงับ rejecting_media: กำลังปฏิเสธไฟล์สื่อ rejecting_reports: กำลังปฏิเสธรายงาน severity: - silence: เงียบอยู่ + silence: จำกัดอยู่ suspend: ระงับอยู่ show: affected_accounts: other: มีผลต่อ %{count} บัญชีในฐานข้อมูล retroactive: - silence: เลิกทำให้บัญชีที่มีอยู่ทั้งหมดจากโดเมนนี้เงียบ - suspend: เลิกระงับบัญชีที่มีอยู่ทั้งหมดจากโดเมนนี้ + silence: เลิกทำการจำกัดบัญชีที่มีผลที่มีอยู่จากโดเมนนี้ + suspend: เลิกระงับบัญชีที่มีผลที่มีอยู่จากโดเมนนี้ title: เลิกทำการปิดกั้นโดเมนสำหรับ %{domain} undo: เลิกทำ undo: เลิกทำการปิดกั้นโดเมน @@ -404,8 +407,29 @@ th: create: เพิ่มโดเมน title: ปิดกั้นโดเมนอีเมลใหม่ title: โดเมนอีเมลที่ปิดกั้นอยู่ + follow_recommendations: + language: สำหรับภาษา + status: สถานะ + suppress: ระงับคำแนะนำการติดตาม + suppressed: ระงับอยู่ + title: คำแนะนำการติดตาม + unsuppress: คืนค่าคำแนะนำการติดตาม instances: + back_to_all: ทั้งหมด + back_to_limited: จำกัดอยู่ + back_to_warning: คำเตือน by_domain: โดเมน + delivery: + all: ทั้งหมด + clear: ล้างข้อผิดพลาดการจัดส่ง + restart: เริ่มการจัดส่งใหม่ + stop: หยุดการจัดส่ง + title: การจัดส่ง + unavailable: ไม่พร้อมใช้งาน + unavailable_message: การจัดส่งไม่พร้อมใช้งาน + warning: คำเตือน + delivery_available: มีการจัดส่ง + delivery_error_days: วันที่มีข้อผิดพลาดการจัดส่ง empty: ไม่พบโดเมน known_accounts: other: "%{count} บัญชีที่รู้จัก" @@ -453,10 +477,12 @@ th: disable: ปิดใช้งาน disabled: ปิดใช้งานอยู่ enable: เปิดใช้งาน + enable_hint: เมื่อเปิดใช้งาน เซิร์ฟเวอร์ของคุณจะบอกรับโพสต์สาธารณะทั้งหมดจากรีเลย์นี้ และจะเริ่มส่งโพสต์สาธารณะของเซิร์ฟเวอร์นี้ไปยังรีเลย์ enabled: เปิดใช้งานอยู่ inbox_url: URL รีเลย์ pending: กำลังรอการอนุมัติของรีเลย์ save_and_enable: บันทึกแล้วเปิดใช้งาน + setup: ตั้งค่าการเชื่อมต่อแบบรีเลย์ status: สถานะ title: รีเลย์ report_notes: @@ -491,13 +517,23 @@ th: resolved: แก้ปัญหาแล้ว resolved_msg: แก้ปัญหารายงานสำเร็จ! status: สถานะ + target_origin: จุดเริ่มต้นของบัญชีที่ได้รับการรายงาน title: รายงาน unassign: เลิกมอบหมาย unresolved: ยังไม่ได้แก้ปัญหา updated_at: อัปเดตเมื่อ + rules: + add_new: เพิ่มกฎ + delete: ลบ + edit: แก้ไขกฎ + empty: ยังไม่ได้กำหนดกฎของเซิร์ฟเวอร์ + title: กฎของเซิร์ฟเวอร์ settings: + activity_api_enabled: + desc_html: จำนวนโพสต์ที่เผยแพร่ในเซิร์ฟเวอร์, ผู้ใช้ที่ใช้งานอยู่ และการลงทะเบียนใหม่ในบักเก็ตรายสัปดาห์ + title: เผยแพร่สถิติรวมเกี่ยวกับกิจกรรมผู้ใช้ใน API bootstrap_timeline_accounts: - title: การติดตามเริ่มต้นสำหรับผู้ใช้ใหม่ + title: แนะนำบัญชีเหล่านี้ให้กับผู้ใช้ใหม่ contact_information: email: อีเมลธุรกิจ username: ชื่อผู้ใช้ในการติดต่อ @@ -506,6 +542,7 @@ th: title: CSS ที่กำหนดเอง default_noindex: desc_html: มีผลต่อผู้ใช้ทั้งหมดที่ไม่ได้เปลี่ยนการตั้งค่านี้ด้วยตนเอง + title: เลือกให้ผู้ใช้ไม่รับการทำดัชนีโดยเครื่องมือค้นหาเป็นค่าเริ่มต้น domain_blocks: all: ให้กับทุกคน disabled: ให้กับไม่มีใคร @@ -513,8 +550,6 @@ th: users: ให้กับผู้ใช้ในเซิร์ฟเวอร์ที่เข้าสู่ระบบ domain_blocks_rationale: title: แสดงคำชี้แจงเหตุผล - enable_bootstrap_timeline_accounts: - title: เปิดใช้งานการติดตามเริ่มต้นสำหรับผู้ใช้ใหม่ hero: desc_html: แสดงในหน้าแรก อย่างน้อย 600x100px ที่แนะนำ เมื่อไม่ได้ตั้ง กลับไปใช้ภาพขนาดย่อเซิร์ฟเวอร์ title: ภาพแบนเนอร์หลัก @@ -523,9 +558,10 @@ th: title: ภาพมาสคอต peers_api_enabled: desc_html: ชื่อโดเมนที่เซิร์ฟเวอร์นี้ได้พบในเฟดิเวิร์ส - title: เผยแพร่รายการเซิร์ฟเวอร์ที่ค้นพบ + title: เผยแพร่รายการเซิร์ฟเวอร์ที่ค้นพบใน API preview_sensitive_media: - title: แสดงสื่อที่ละเอียดอ่อนในตัวอย่าง OpenGraph + desc_html: การแสดงตัวอย่างลิงก์ในเว็บไซต์อื่น ๆ จะแสดงภาพขนาดย่อแม้ว่าจะมีการทำเครื่องหมายสื่อว่าละเอียดอ่อน + title: แสดงสื่อที่ละเอียดอ่อนในการแสดงตัวอย่าง OpenGraph profile_directory: desc_html: อนุญาตให้ผู้ใช้สามารถค้นพบได้ title: เปิดใช้งานไดเรกทอรีโปรไฟล์ @@ -539,12 +575,17 @@ th: min_invite_role: disabled: ไม่มีใคร title: อนุญาตคำเชิญโดย + require_invite_text: + title: ต้องให้ผู้ใช้ใหม่ป้อนเหตุผลที่จะเข้าร่วม registrations_mode: modes: approved: ต้องมีการอนุมัติสำหรับการลงทะเบียน none: ไม่มีใครสามารถลงทะเบียน open: ใครก็ตามสามารถลงทะเบียน title: โหมดการลงทะเบียน + show_known_fediverse_at_about_page: + desc_html: เมื่อปิดใช้งาน จำกัดเส้นเวลาสาธารณะที่เชื่อมโยงจากหน้าเริ่มต้นให้แสดงเฉพาะเนื้อหาในเซิร์ฟเวอร์เท่านั้น + title: รวมเนื้อหาที่ติดต่อกับภายนอกไว้ในหน้าเส้นเวลาสาธารณะที่ไม่ได้รับรองความถูกต้อง show_staff_badge: desc_html: แสดงป้ายพนักงานในหน้าผู้ใช้ title: แสดงป้ายพนักงาน @@ -555,13 +596,14 @@ th: desc_html: สถานที่ที่ดีสำหรับแนวทางปฏิบัติ, กฎ, หลักเกณฑ์ และสิ่งอื่น ๆ ของคุณที่ทำให้เซิร์ฟเวอร์ของคุณแตกต่าง คุณสามารถใช้แท็ก HTML title: ข้อมูลแบบขยายที่กำหนดเอง site_short_description: + desc_html: แสดงในแถบข้างและแท็กเมตา อธิบายว่า Mastodon คืออะไรและสิ่งที่ทำให้เซิร์ฟเวอร์นี้พิเศษในย่อหน้าเดียว title: คำอธิบายเซิร์ฟเวอร์แบบสั้น site_terms: desc_html: คุณสามารถเขียนนโยบายความเป็นส่วนตัว, เงื่อนไขการให้บริการ หรือภาษากฎหมายอื่น ๆ ของคุณเอง คุณสามารถใช้แท็ก HTML title: เงื่อนไขการให้บริการที่กำหนดเอง site_title: ชื่อเซิร์ฟเวอร์ thumbnail: - desc_html: ใช้สำหรับตัวอย่างผ่าน OpenGraph และ API 1200x630px ที่แนะนำ + desc_html: ใช้สำหรับการแสดงตัวอย่างผ่าน OpenGraph และ API 1200x630px ที่แนะนำ title: ภาพขนาดย่อเซิร์ฟเวอร์ timeline_preview: desc_html: แสดงลิงก์ไปยังเส้นเวลาสาธารณะในหน้าเริ่มต้นและอนุญาตการเข้าถึง API ไปยังเส้นเวลาสาธารณะโดยไม่มีการรับรองความถูกต้อง @@ -569,7 +611,9 @@ th: title: การตั้งค่าไซต์ trendable_by_default: desc_html: มีผลต่อแฮชแท็กที่ไม่ได้ไม่อนุญาตก่อนหน้านี้ + title: อนุญาตให้แฮชแท็กขึ้นแนวโน้มโดยไม่มีการตรวจทานล่วงหน้า trends: + desc_html: แสดงแฮชแท็กที่ตรวจทานแล้วก่อนหน้านี้ที่กำลังนิยมเป็นสาธารณะ title: แฮชแท็กที่กำลังนิยม site_uploads: delete: ลบไฟล์ที่อัปโหลด @@ -581,18 +625,25 @@ th: nsfw_off: ทำเครื่องหมายว่าไม่ละเอียดอ่อน nsfw_on: ทำเครื่องหมายว่าละเอียดอ่อน deleted: ลบแล้ว + failed_to_execute: ไม่สามารถปฏิบัติการ media: title: สื่อ no_media: ไม่มีสื่อ - title: สถานะบัญชี + title: โพสต์ของบัญชี with_media: มีสื่อ + system_checks: + rules_check: + action: จัดการกฎของเซิร์ฟเวอร์ + message_html: คุณไม่ได้กำหนดกฎของเซิร์ฟเวอร์ใด ๆ + sidekiq_process_check: + message_html: ไม่มีกระบวนการ Sidekiq ที่กำลังทำงานสำหรับคิว %{value} โปรดตรวจทานการกำหนดค่า Sidekiq ของคุณ tags: - context: บริบท - directory: ในไดเรกทอรี - in_directory: "%{count} ในไดเรกทอรี" + accounts_today: การใช้งานที่ไม่ซ้ำกันในวันนี้ + accounts_week: การใช้งานที่ไม่ซ้ำกันในสัปดาห์นี้ + breakdown: การแบ่งการใช้งานของวันนี้ตามแหล่งที่มา last_active: ใช้งานล่าสุด most_popular: ยอดนิยม - most_recent: ล่าสุด + most_recent: สร้างล่าสุด name: แฮชแท็ก review: สถานะการตรวจทาน reviewed: ตรวจทานแล้ว @@ -606,6 +657,7 @@ th: add_new: เพิ่มใหม่ delete: ลบ edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า + empty: คุณยังไม่ได้กำหนดคำเตือนที่ตั้งไว้ล่วงหน้าใด ๆ title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า admin_mailer: new_pending_account: @@ -632,10 +684,11 @@ th: toot_layout: เค้าโครงโพสต์ application_mailer: notification_preferences: เปลี่ยนการกำหนดลักษณะอีเมล + salutation: "%{name}," settings: 'เปลี่ยนการกำหนดลักษณะอีเมล: %{link}' view: 'มุมมอง:' view_profile: ดูโปรไฟล์ - view_status: ดูสถานะ + view_status: ดูโพสต์ applications: created: สร้างแอปพลิเคชันสำเร็จ destroyed: ลบแอปพลิเคชันสำเร็จ @@ -646,13 +699,14 @@ th: auth: apply_for_account: ขอคำเชิญ change_password: รหัสผ่าน - checkbox_agreement_html: ฉันยอมรับ กฎของเซิร์ฟเวอร์ และ เงื่อนไขการให้บริการ - checkbox_agreement_without_rules_html: ฉันยอมรับ เงื่อนไขการให้บริการ + checkbox_agreement_html: ฉันเห็นด้วยกับ กฎของเซิร์ฟเวอร์ และ เงื่อนไขการให้บริการ + checkbox_agreement_without_rules_html: ฉันเห็นด้วยกับ เงื่อนไขการให้บริการ delete_account: ลบบัญชี delete_account_html: หากคุณต้องการลบบัญชีของคุณ คุณสามารถ ดำเนินการต่อที่นี่ คุณจะได้รับการถามเพื่อการยืนยัน description: prefix_invited_by_user: "@%{name} เชิญคุณเข้าร่วมเซิร์ฟเวอร์ Mastodon นี้!" prefix_sign_up: ลงทะเบียนใน Mastodon วันนี้! + suffix: เมื่อมีบัญชี คุณจะสามารถติดตามผู้คน โพสต์การอัปเดต และแลกเปลี่ยนข้อความกับผู้ใช้จากเซิร์ฟเวอร์ Mastodon และอื่น ๆ! didnt_get_confirmation: ไม่ได้รับคำแนะนำการยืนยัน? dont_have_your_security_key: ไม่มีกุญแจความปลอดภัยของคุณ? forgot_password: ลืมรหัสผ่านของคุณ? @@ -675,11 +729,12 @@ th: set_new_password: ตั้งรหัสผ่านใหม่ setup: email_below_hint_html: หากที่อยู่อีเมลด้านล่างไม่ถูกต้อง คุณสามารถเปลี่ยนที่อยู่อีเมลที่นี่และรับอีเมลยืนยันใหม่ - email_settings_hint_html: ส่งอีเมลยืนยันไปยัง %{email} แล้ว หากที่อยู่อีเมลนั้นไม่ถูกต้อง คุณสามารถเปลี่ยนที่อยู่อีเมลในการตั้งค่าบัญชี + email_settings_hint_html: ส่งอีเมลยืนยันไปยัง %{email} แล้ว หากที่อยู่อีเมลนั้นไม่ถูกต้อง คุณสามารถเปลี่ยนที่อยู่อีเมลได้ในการตั้งค่าบัญชี status: account_status: สถานะบัญชี confirming: กำลังรอการยืนยันอีเมลให้เสร็จสมบูรณ์ functional: บัญชีของคุณทำงานได้อย่างเต็มที่ + too_fast: ส่งแบบฟอร์มเร็วเกินไป ลองอีกครั้ง trouble_logging_in: มีปัญหาในการเข้าสู่ระบบ? use_security_key: ใช้กุญแจความปลอดภัย authorize_follow: @@ -726,9 +781,11 @@ th: proceed: ลบบัญชี success_msg: ลบบัญชีของคุณสำเร็จ warning: + caches: เนื้อหาที่ได้รับการแคชโดยเซิร์ฟเวอร์อื่น ๆ อาจยังคงอยู่ data_removal: จะเอาโพสต์และข้อมูลอื่น ๆ ของคุณออกโดยถาวร - email_change_html: คุณสามารถ เปลี่ยนที่อยู่อีเมลของคุณ โดยไม่ต้องลบบัญชีของคุณ + email_change_html: คุณสามารถ เปลี่ยนที่อยู่อีเมลของคุณ ได้โดยไม่ต้องลบบัญชีของคุณ email_reconfirmation_html: หากคุณไม่ได้รับอีเมลยืนยัน คุณสามารถ ขออีเมลอีกครั้ง + irreversible: คุณจะไม่สามารถคืนค่าหรือเปิดใช้งานบัญชีของคุณใหม่ more_details_html: สำหรับรายละเอียดเพิ่มเติม ดู นโยบายความเป็นส่วนตัว username_available: ชื่อผู้ใช้ของคุณจะพร้อมใช้งานอีกครั้ง username_unavailable: ชื่อผู้ใช้ของคุณจะยังคงไม่พร้อมใช้งาน @@ -739,7 +796,7 @@ th: domain_validator: invalid_domain: ไม่ใช่ชื่อโดเมนที่ถูกต้อง errors: - '400': The request you submitted was invalid or malformed. + '400': คำขอที่คุณได้ส่งไม่ถูกต้องหรือผิดรูปแบบ '403': คุณไม่มีสิทธิอนุญาตเพื่อดูหน้านี้ '404': หน้าที่คุณกำลังมองหาไม่ได้อยู่ที่นี่ '406': This page is not available in the requested format. @@ -759,6 +816,8 @@ th: archive_takeout: date: วันที่ download: ดาวน์โหลดการเก็บถาวรของคุณ + hint_html: คุณสามารถขอการเก็บถาวรของ โพสต์และสื่อที่อัปโหลด ของคุณ ข้อมูลที่ส่งออกจะอยู่ในรูปแบบ ActivityPub อ่านได้โดยซอฟต์แวร์ใด ๆ ที่ตรงตามมาตรฐาน คุณสามารถขอการเก็บถาวรได้ทุก 7 วัน + in_progress: กำลังคอมไพล์การเก็บถาวรของคุณ... request: ขอการเก็บถาวรของคุณ size: ขนาด blocks: คุณปิดกั้น @@ -802,6 +861,9 @@ th: identity_proofs: active: ใช้งานอยู่ authorize: ใช่ อนุญาต + authorize_connection_prompt: อนุญาตการเชื่อมต่อการเข้ารหัสนี้? + errors: + failed: การเชื่อมต่อการเข้ารหัสล้มเหลว โปรดลองอีกครั้งจาก %{provider} i_am_html: ฉันคือ %{username} ใน %{service} identity: ตัวตน inactive: ไม่ได้ใช้งาน @@ -819,6 +881,7 @@ th: merge_long: เก็บระเบียนที่มีอยู่และเพิ่มระเบียนใหม่ overwrite: เขียนทับ overwrite_long: แทนที่ระเบียนปัจจุบันด้วยระเบียนใหม่ + preface: คุณสามารถนำเข้าข้อมูลที่คุณได้ส่งออกจากเซิร์ฟเวอร์อื่น เช่น รายการผู้คนที่คุณกำลังติดตามหรือกำลังปิดกั้น types: blocking: รายการปิดกั้น bookmarks: ที่คั่นหน้า @@ -848,9 +911,21 @@ th: expires_at: หมดอายุเมื่อ uses: การใช้ title: เชิญผู้คน + login_activities: + authentication_methods: + otp: แอปการรับรองความถูกต้องด้วยสองปัจจัย + password: รหัสผ่าน + sign_in_token: รหัสความปลอดภัยอีเมล + webauthn: กุญแจความปลอดภัย + description_html: หากคุณเห็นกิจกรรมที่คุณไม่รู้จัก พิจารณาเปลี่ยนรหัสผ่านของคุณและเปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัย + empty: ไม่มีประวัติการรับรองความถูกต้อง + failed_sign_in_html: ความพยายามลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) ล้มเหลว + successful_sign_in_html: ลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) สำเร็จ + title: ประวัติการรับรองความถูกต้อง media_attachments: validations: - images_and_video: ไม่สามารถแนบวิดีโอกับสถานะที่มีภาพอยู่แล้ว + images_and_video: ไม่สามารถแนบวิดีโอกับโพสต์ที่มีภาพอยู่แล้ว + not_ready: ไม่สามารถแนบไฟล์ที่ยังประมวลผลไม่เสร็จ ลองอีกครั้งในอีกสักครู่! too_many: ไม่สามารถแนบมากกว่า 4 ไฟล์ migrations: acct: ย้ายไปยัง @@ -860,8 +935,12 @@ th: missing_also_known_as: ไม่ใช่นามแฝงของบัญชีนี้ move_to_self: ไม่สามารถเป็นบัญชีปัจจุบัน not_found: ไม่พบ + on_cooldown: คุณอยู่ในช่วงพัก followers_count: ผู้ติดตาม ณ เวลาที่ย้าย incoming_migrations: การย้ายจากบัญชีอื่น + incoming_migrations_html: เพื่อย้ายจากบัญชีอื่นไปยังบัญชีนี้ ก่อนอื่นคุณจำเป็นต้อง สร้างนามแฝงบัญชี + on_cooldown: คุณเพิ่งโยกย้ายบัญชีของคุณ ฟังก์ชันนี้จะพร้อมใช้งานอีกครั้งในอีก %{count} วัน + past_migrations: การโยกย้ายที่ผ่านมา proceed_with_move: ย้ายผู้ติดตาม redirected_msg: บัญชีของคุณกำลังเปลี่ยนเส้นทางไปยัง %{acct} redirecting_to: บัญชีของคุณกำลังเปลี่ยนเส้นทางไปยัง %{acct} @@ -884,8 +963,8 @@ th: other: "%{count} การแจ้งเตือนใหม่นับตั้งแต่การเยี่ยมชมล่าสุดของคุณ \U0001F418" title: เมื่อคุณไม่อยู่... favourite: - body: 'สถานะของคุณได้รับการชื่นชอบโดย %{name}:' - subject: "%{name} ได้ชื่นชอบสถานะของคุณ" + body: 'โพสต์ของคุณได้รับการชื่นชอบโดย %{name}:' + subject: "%{name} ได้ชื่นชอบโพสต์ของคุณ" title: รายการโปรดใหม่ follow: body: "%{name} กำลังติดตามคุณ!" @@ -902,16 +981,30 @@ th: subject: คุณได้รับการกล่าวถึงโดย %{name} title: การกล่าวถึงใหม่ reblog: - body: 'สถานะของคุณได้รับการดันโดย %{name}:' - subject: "%{name} ได้ดันสถานะของคุณ" + body: 'โพสต์ของคุณได้รับการดันโดย %{name}:' + subject: "%{name} ได้ดันโพสต์ของคุณ" title: การดันใหม่ + status: + subject: "%{name} เพิ่งโพสต์" notifications: email_events: เหตุการณ์สำหรับการแจ้งเตือนอีเมล email_events_hint: 'เลือกเหตุการณ์ที่คุณต้องการรับการแจ้งเตือน:' other_settings: การตั้งค่าการแจ้งเตือนอื่น ๆ + number: + human: + decimal_units: + format: "%n %u" + units: + billion: พันล้าน + million: ล้าน + quadrillion: พันล้านล้าน + thousand: พัน + trillion: ล้านล้าน otp_authentication: code_hint: ป้อนรหัสที่สร้างโดยแอปตัวรับรองความถูกต้องของคุณเพื่อยืนยัน enable: เปิดใช้งาน + manual_instructions: 'หากคุณไม่สามารถสแกนรหัส QR และจำเป็นต้องป้อนรหัสด้วยตนเอง นี่คือรหัสลับแบบข้อความธรรมดา:' + setup: ตั้งค่า wrong_code: รหัสที่ป้อนไม่ถูกต้อง! เวลาเซิร์ฟเวอร์และเวลาอุปกรณ์ถูกต้องหรือไม่? pagination: newer: ใหม่กว่า @@ -923,6 +1016,8 @@ th: errors: already_voted: คุณได้ลงคะแนนในการสำรวจความคิดเห็นนี้ไปแล้ว duplicate_options: มีรายการที่ซ้ำกัน + duration_too_long: อยู่ไกลเกินไปในอนาคต + duration_too_short: อยู่เร็วเกินไป expired: การสำรวจความคิดเห็นได้สิ้นสุดไปแล้ว invalid_choice: ไม่มีตัวเลือกการลงคะแนนที่เลือกอยู่ too_few_options: ต้องมีมากกว่าหนึ่งรายการ @@ -973,7 +1068,6 @@ th: browser: เบราว์เซอร์ browsers: alipay: Alipay - blackberry: Blackberry chrome: Chrome edge: Microsoft Edge electron: Electron @@ -981,21 +1075,20 @@ th: generic: เบราว์เซอร์ที่ไม่รู้จัก ie: Internet Explorer micro_messenger: MicroMessenger - nokia: Nokia S40 Ovi Browser + nokia: เบราว์เซอร์ Nokia S40 Ovi opera: Opera otter: Otter phantom_js: PhantomJS - qq: QQ Browser + qq: เบราว์เซอร์ QQ safari: Safari - uc_browser: UCBrowser weibo: Weibo current_session: เซสชันปัจจุบัน + description: "%{browser} ใน %{platform}" ip: IP platforms: adobe_air: Adobe Air android: Android - blackberry: Blackberry - chrome_os: ChromeOS + chrome_os: Chrome OS firefox_os: Firefox OS ios: iOS linux: Linux @@ -1007,6 +1100,7 @@ th: revoke: เพิกถอน revoke_success: เพิกถอนเซสชันสำเร็จ title: เซสชัน + view_authentication_history: ดูประวัติการรับรองความถูกต้องบัญชีของคุณ settings: account: บัญชี account_settings: การตั้งค่าบัญชี @@ -1027,10 +1121,9 @@ th: preferences: การกำหนดลักษณะ profile: โปรไฟล์ relationships: การติดตามและผู้ติดตาม + statuses_cleanup: การลบโพสต์แบบอัตโนมัติ two_factor_authentication: การรับรองความถูกต้องด้วยสองปัจจัย webauthn_authentication: กุญแจความปลอดภัย - spam_check: - spam_detected: นี่คือรายงานแบบอัตโนมัติ ตรวจพบสแปม statuses: attached: audio: @@ -1063,14 +1156,42 @@ th: sign_in_to_participate: ลงชื่อเข้าเพื่อเข้าร่วมการสนทนา title: '%{name}: "%{quote}"' visibilities: + direct: โดยตรง private: ผู้ติดตามเท่านั้น private_long: แสดงแก่ผู้ติดตามเท่านั้น public: สาธารณะ public_long: ทุกคนสามารถเห็น unlisted: ไม่อยู่ในรายการ unlisted_long: ทุกคนสามารถเห็น แต่ไม่แสดงรายการในเส้นเวลาสาธารณะ + statuses_cleanup: + enabled: ลบโพสต์เก่าโดยอัตโนมัติ + exceptions: ข้อยกเว้น + ignore_favs: เพิกเฉยรายการโปรด + ignore_reblogs: เพิกเฉยการดัน + interaction_exceptions: ข้อยกเว้นตามการโต้ตอบ + keep_direct: เก็บข้อความโดยตรง + keep_direct_hint: ไม่ลบข้อความโดยตรงใดก็ตามของคุณ + keep_media: เก็บโพสต์ที่มีไฟล์แนบสื่อ + keep_media_hint: ไม่ลบโพสต์ที่มีไฟล์แนบสื่อใดก็ตามของคุณ + keep_pinned: เก็บโพสต์ที่ปักหมุด + keep_pinned_hint: ไม่ลบโพสต์ที่ปักหมุดใดก็ตามของคุณ + keep_polls: เก็บการสำรวจความคิดเห็น + keep_polls_hint: ไม่ลบการสำรวจความคิดเห็นใดก็ตามของคุณ + keep_self_bookmark: เก็บโพสต์ที่คุณได้เพิ่มที่คั่นหน้า + keep_self_bookmark_hint: ไม่ลบโพสต์ของคุณเองหากคุณได้เพิ่มที่คั่นหน้าโพสต์ไว้ + keep_self_fav: เก็บโพสต์ที่คุณได้ชื่นชอบ + keep_self_fav_hint: ไม่ลบโพสต์ของคุณเองหากคุณได้ชื่นชอบโพสต์ไว้ + min_age: + '1209600': 2 สัปดาห์ + '15778476': 6 เดือน + '2629746': 1 เดือน + '31556952': 1 ปี + '5259492': 2 เดือน + '63113904': 2 ปี + '7889238': 3 เดือน stream_entries: pinned: โพสต์ที่ปักหมุด + reblogged: ดันแล้ว sensitive_content: เนื้อหาที่ละเอียดอ่อน tags: does_not_match_previous_name: ไม่ตรงกับชื่อก่อนหน้า @@ -1098,6 +1219,8 @@ th: recovery_codes_regenerated: สร้างรหัสกู้คืนใหม่สำเร็จ webauthn: กุญแจความปลอดภัย user_mailer: + backup_ready: + subject: การเก็บถาวรของคุณพร้อมสำหรับการดาวน์โหลดแล้ว sign_in_token: details: 'นี่คือรายละเอียดของความพยายาม:' explanation: 'เราตรวจพบความพยายามลงชื่อเข้าบัญชีของคุณจากที่อยู่ IP ที่ไม่รู้จัก หากนี่คือคุณ โปรดป้อนรหัสความปลอดภัยด้านล่างในหน้าตรวจสอบการลงชื่อเข้า:' @@ -1105,25 +1228,37 @@ th: subject: โปรดยืนยันการลงชื่อเข้าที่พยายาม title: ความพยายามลงชื่อเข้า warning: + get_in_touch: คุณสามารถตอบกลับอีเมลนี้เพื่อติดต่อกับพนักงานของ %{instance} review_server_policies: ตรวจทานนโยบายของเซิร์ฟเวอร์ + statuses: 'โดยเฉพาะสำหรับ:' subject: + disable: บัญชีของคุณ %{acct} ถูกอายัด none: คำเตือนสำหรับ %{acct} + silence: บัญชีของคุณ %{acct} ถูกจำกัด + suspend: บัญชีของคุณ %{acct} ถูกระงับ title: + disable: อายัดบัญชีอยู่ none: คำเตือน + sensitive: มีการทำเครื่องหมายสื่อของคุณว่าละเอียดอ่อน silence: จำกัดบัญชีอยู่ suspend: ระงับบัญชีอยู่ welcome: + edit_profile_action: ตั้งค่าโปรไฟล์ + final_action: เริ่มโพสต์ + final_step: 'เริ่มโพสต์! แม้ว่าไม่มีผู้ติดตาม โพสต์สาธารณะของคุณอาจเห็นโดยผู้อื่น ตัวอย่างเช่น ในเส้นเวลาในเซิร์ฟเวอร์และในแฮชแท็ก คุณอาจต้องการแนะนำตัวเองในแฮชแท็ก #introductions' + full_handle: นามเต็มของคุณ + full_handle_hint: นี่คือสิ่งที่คุณจะบอกเพื่อน ๆ ของคุณ เพื่อให้เขาสามารถส่งข้อความหรือติดตามคุณจากเซิร์ฟเวอร์อื่น review_preferences_action: เปลี่ยนการกำหนดลักษณะ subject: ยินดีต้อนรับสู่ Mastodon + tip_following: คุณติดตามผู้ดูแลเซิร์ฟเวอร์ของคุณเป็นค่าเริ่มต้น เพื่อค้นหาผู้คนที่น่าสนใจเพิ่มเติม ตรวจสอบเส้นเวลาในเซิร์ฟเวอร์และที่ติดต่อกับภายนอก tips: เคล็ดลับ title: ยินดีต้อนรับ %{name}! users: - blocked_email_provider: ไม่อนุญาตผู้ให้บริการอีเมลนี้ follow_limit_reached: คุณไม่สามารถติดตามมากกว่า %{limit} คน - invalid_email: ที่อยู่อีเมลไม่ถูกต้อง - invalid_email_mx: ดูเหมือนว่าไม่มีที่อยู่อีเมลอยู่ + generic_access_help_html: มีปัญหาในการเข้าถึงบัญชีของคุณ? คุณสามารถติดต่อ %{email} สำหรับความช่วยเหลือ invalid_otp_token: รหัสสองปัจจัยไม่ถูกต้อง invalid_sign_in_token: รหัสความปลอดภัยไม่ถูกต้อง + otp_lost_help_html: หากคุณสูญเสียการเข้าถึงทั้งสองอย่าง คุณสามารถติดต่อ %{email} seamless_external_login: คุณได้เข้าสู่ระบบผ่านบริการภายนอก ดังนั้นจึงไม่มีการตั้งค่ารหัสผ่านและอีเมล signed_in_as: 'ลงชื่อเข้าเป็น:' verification: @@ -1135,10 +1270,12 @@ th: success: เพิ่มกุญแจความปลอดภัยของคุณสำเร็จ delete: ลบ delete_confirmation: คุณแน่ใจหรือไม่ว่าต้องการลบกุญแจความปลอดภัยนี้? + description_html: หากคุณเปิดใช้งาน การรับรองความถูกต้องด้วยกุญแจความปลอดภัย การเข้าสู่ระบบจะต้องการให้คุณใช้หนึ่งในกุญแจความปลอดภัยของคุณ destroy: error: มีปัญหาในการลบกุญแจความปลอดภัยของคุณ โปรดลองอีกครั้ง success: ลบกุญแจความปลอดภัยของคุณสำเร็จ invalid_credential: กุญแจความปลอดภัยไม่ถูกต้อง + nickname_hint: ป้อนชื่อเล่นของกุญแจความปลอดภัยใหม่ของคุณ not_enabled: คุณยังไม่ได้เปิดใช้งาน WebAuthn not_supported: เบราว์เซอร์นี้ไม่รองรับกุญแจความปลอดภัย otp_required: เพื่อใช้กุญแจความปลอดภัย โปรดเปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยก่อน diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 62247bf56a..f78550a19a 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -26,6 +26,8 @@ tr: Federasyon amaçlı kullanılır ve tüm yansıyı engellemek istemediğiniz sürece engellenmemelidir; bu durumda bir etki alanı bloğu kullanmanız gerekir. learn_more: Daha fazla bilgi edinin privacy_policy: Gizlilik politikası + rules: Sunucu kuralları + rules_html: 'Aşağıda, bu Mastodon sunucusu üzerinde bir hesap açmak istiyorsanız uymanız gereken kuralların bir özeti var:' see_whats_happening: Neler olduğunu görün server_stats: 'Sunucu istatistikleri:' source_code: Kaynak kodu @@ -60,6 +62,7 @@ tr: one: Takipçi other: Takipçi following: Takip edilenler + instance_actor_flash: Bu hesap, herhangi bir bireysel kullanıcı değil, sunucunun kendisini temsil etmek için kullanılan sanal bir aktördür. Birleştirme amacıyla kullanılmaktadır ve askıya alınmamalıdır. joined: "%{date} tarihinde katıldı" last_active: son etkinlik link_verified_on: Bu bağlantının mülkiyeti %{date} tarihinde kontrol edildi @@ -73,11 +76,10 @@ tr: pin_errors: following: Onaylamak istediğiniz kişiyi zaten takip ediyor olmalısınız posts: - one: Toot + one: Gönderi other: Toot posts_tab_heading: Tootlar posts_with_replies: Tootlar ve yanıtlar - reserved_username: Kullanıcı adı rezerve edildi roles: admin: Yönetici bot: Bot @@ -117,6 +119,7 @@ tr: demote: Düşür destroyed_msg: "%{username} verilerinin hemen silinmesi için kuyruğa alındı" disable: Devre dışı + disable_sign_in_token_auth: E-posta token doğrulamayı devre dışı bırak disable_two_factor_authentication: 2AD kapat disabled: Kapalı display_name: Görünen isim @@ -125,12 +128,14 @@ tr: email: E-posta email_status: E-posta durumu enable: Etkinleştir + enable_sign_in_token_auth: E-posta token doğrulamayı etkinleştir enabled: Etkin enabled_msg: "%{username} hesabı başarıyla çözüldü" followers: Takipçiler follows: Takip edilen header: Üstbilgi inbox_url: Gelen kutusu bağlantısı + invite_request_text: Katılma gerekçeleri invited_by: Tarafından davet edildi ip: IP joined: Katıldı @@ -188,8 +193,12 @@ tr: search: Ara search_same_email_domain: Aynı e-posta alan adına sahip diğer kullanıcılar search_same_ip: Aynı IP adresine sahip diğer kullanıcılar + security_measures: + only_password: Sadece parola + password_and_2fa: Parola ve İki aşamalı doğrulama + password_and_sign_in_token: Parola ve e-posta tokeni sensitive: Hassas - sensitized: hassas olarak işaretlendi + sensitized: Hassas olarak işaretlendi shared_inbox_url: Paylaşılan gelen kutusu bağlantısı show: created_reports: Yapılan şikayetler @@ -227,6 +236,7 @@ tr: create_domain_block: Engellenen Alan Adı Oluştur create_email_domain_block: E-Posta Alan Adı Engeli Oluştur create_ip_block: IP kuralı oluştur + create_unavailable_domain: Mevcut Olmayan Alan Adı Oluştur demote_user: Kullanıcıyı Düşür destroy_announcement: Duyuru Sil destroy_custom_emoji: Özel İfadeyi Sil @@ -235,10 +245,13 @@ tr: destroy_email_domain_block: E-posta alan adı engelini sil destroy_ip_block: IP kuralını sil destroy_status: Durumu Sil + destroy_unavailable_domain: Mevcut Olmayan Alan Adı Sil disable_2fa_user: 2AD Kapat disable_custom_emoji: Özel İfadeyi Devre Dışı Bırak + disable_sign_in_token_auth_user: Kullanıcı için E-posta Token Doğrulamayı devre dışı bırak disable_user: Kullanıcıyı Devre Dışı Bırak enable_custom_emoji: Özel İfadeyi Etkinleştir + enable_sign_in_token_auth_user: Kullanıcı için E-posta Token Doğrulamayı etkinleştir enable_user: Kullanıcıyı Etkinleştir memorialize_account: Hesabı Anıtlaştır promote_user: Kullanıcıyı Yükselt @@ -258,46 +271,50 @@ tr: update_domain_block: Engellenen Alan Adını Güncelle update_status: Durumu Güncelle actions: - assigned_to_self_report: "%{name} kendilerine %{target} adlı raporu verdi" - change_email_user: "%{name}, %{target} kullanıcısının e-posta adresini değiştirdi" - confirm_user: "%{name} %{target} kullanıcısının e-posta adresini onayladı" - create_account_warning: "%{name} %{target} 'a bir uyarı gönderdi" - create_announcement: "%{name}, yeni %{target} duyurusunu oluşturdu" - create_custom_emoji: "%{name} yeni ifade yükledi %{target}" - create_domain_allow: "%{target} alan adı, %{name} tarafından beyaz listeye alındı" - create_domain_block: "%{target} alanı, %{name} tarafından engellendi" - create_email_domain_block: "%{target} e-posta alanı, %{name} tarafından kara listeye alınmış" - create_ip_block: "%{name}, IP %{target} için kural oluşturdu" - demote_user: "%{name} %{target} kullanıcısını düşürdü" - destroy_announcement: "%{name}, %{target} duyurusunu sildi" - destroy_custom_emoji: "%{target} emoji, %{name} tarafından kaldırıldı" - destroy_domain_allow: "%{target} alan adı, %{name} tarafından beyaz listeden çıkartıldı" - destroy_domain_block: "%{target} alan adının engeli %{name} tarafından kaldırıldı" - destroy_email_domain_block: "%{target} e-posta sunucusu, %{name} tarafından beyaz listeye alındı" - destroy_ip_block: "%{name}, IP %{target} için kuralı sildi" - destroy_status: "%{name}, %{target} kullanıcısının durumunu kaldırdı" - disable_2fa_user: "%{name}, %{target} kullanıcısı için iki adım gereksinimini kapattı" - disable_custom_emoji: "%{target} emoji, %{name} tarafından devre dışı bırakıldı" - disable_user: "%{name} %{target} kullanıcısı için oturum açmayı devre dışı bıraktı" - enable_custom_emoji: "%{name} %{target} için emojiyi etkinleştirdi" - enable_user: "%{name} %{target} için oturum açmayı etkinleştirdi" - memorialize_account: "%{name}, %{target} kişisinin hesabını anıt sayfasına dönüştürdü" - promote_user: "%{name} %{target} kullanıcısını yükseltti" - remove_avatar_user: "%{name} %{target}'in avatarını kaldırdı" - reopen_report: "%{name} %{target} şikayetini yeniden açtı" - reset_password_user: "%{name} %{target} kullanıcısının parolasını resetledi" - resolve_report: "%{name} %{target} şikayetini çözdü" - sensitive_account: "%{name}, %{target} kişisinin medyasını hassas olarak işaretledi" - silence_account: "%{name} %{target}'in hesabını susturdu" - suspend_account: "%{name} %{target}'in hesabını uzaklaştırdı" - unassigned_report: "%{name} %{target} şikayetinin atamasını geri aldı" - unsensitive_account: "%{name}, %{target} kişisinin medyasını hassas olarak işaretlemedi" - unsilence_account: "%{name} %{target}'in hesabının susturmasını kaldırdı" - unsuspend_account: "%{name} %{target}'in hesabının uzaklaştırmasını kaldırdı" - update_announcement: "%{name}, %{target} duyurusunu güncelledi" - update_custom_emoji: "%{name} %{target} emojiyi güncelledi" - update_domain_block: "%{name}, %{target} için alan adı engelini güncelledi" - update_status: "%{name}, %{target} kullanıcısının durumunu güncelledi" + assigned_to_self_report_html: "%{name} kendilerine %{target} adlı raporu verdi" + change_email_user_html: "%{name}, %{target} kullanıcısının e-posta adresini değiştirdi" + confirm_user_html: "%{name} %{target} kullanıcısının e-posta adresini onayladı" + create_account_warning_html: "%{name} %{target} 'a bir uyarı gönderdi" + create_announcement_html: "%{name}, yeni %{target} duyurusunu oluşturdu" + create_custom_emoji_html: "%{name} yeni %{target} ifadesini yükledi" + create_domain_allow_html: "%{name}, %{target} alan adıyla birliğe izin verdi" + create_domain_block_html: "%{name}, %{target} alan adını engelledi" + create_email_domain_block_html: "%{name}, %{target} e-posta alan adını engelledi" + create_ip_block_html: "%{name}, %{target} IP adresi için kural oluşturdu" + create_unavailable_domain_html: "%{name}, %{target} alan adına teslimatı durdurdu" + demote_user_html: "%{name}, %{target} kullanıcısını düşürdü" + destroy_announcement_html: "%{name}, %{target} duyurusunu sildi" + destroy_custom_emoji_html: "%{name}, %{target} emojisini yok etti" + destroy_domain_allow_html: "%{name}, %{target} alan adıyla birlik iznini kaldırdı" + destroy_domain_block_html: "%{name}, %{target} alan adı engelini kaldırdı" + destroy_email_domain_block_html: "%{name}, %{target} e-posta alan adı engelini kaldırdı" + destroy_ip_block_html: "%{name}, %{target} IP adresi kuralını sildi" + destroy_status_html: "%{name}, %{target} kullanıcısının gönderisini kaldırdı" + destroy_unavailable_domain_html: "%{name}, %{target} alan adına teslimatı sürdürdü" + disable_2fa_user_html: "%{name}, %{target} kullanıcısının iki aşamalı doğrulama gereksinimini kapattı" + disable_custom_emoji_html: "%{name}, %{target} emojisini devre dışı bıraktı" + disable_sign_in_token_auth_user_html: "%{name}, %{target} için e-posta token doğrulamayı devre dışı bıraktı" + disable_user_html: "%{name}, %{target} kullanıcısı için oturum açmayı devre dışı bıraktı" + enable_custom_emoji_html: "%{name}, %{target} emojisini etkinleştirdi" + enable_sign_in_token_auth_user_html: "%{name}, %{target} için e-posta token doğrulamayı etkinleştirdi" + enable_user_html: "%{name}, %{target} kullanıcısı için oturum açmayı etkinleştirdi" + memorialize_account_html: "%{name}, %{target} kullanıcısının hesabını bir anıt sayfaya dönüştürdü" + promote_user_html: "%{name}, %{target} kullanıcısını yükseltti" + remove_avatar_user_html: "%{name}, %{target} kullanıcısının avatarını kaldırdı" + reopen_report_html: "%{name}, %{target} şikayetini yeniden açtı" + reset_password_user_html: "%{name}, %{target} kullanıcısının parolasını sıfırladı" + resolve_report_html: "%{name}, %{target} şikayetini çözdü" + sensitive_account_html: "%{name}, %{target} kullanıcısının medyasını hassas olarak işaretledi" + silence_account_html: "%{name}, %{target} kullanıcısının hesabını sessize aldı" + suspend_account_html: "%{name}, %{target} kullanıcısının hesabını askıya aldı" + unassigned_report_html: "%{name}, %{target} şikayetinin atamasını kaldırdı" + unsensitive_account_html: "%{name}, %{target} kullanıcısının medyasının hassas işaretini kaldırdı" + unsilence_account_html: "%{name}, %{target} kullanıcısının hesabının sessizliğini kaldırdı" + unsuspend_account_html: "%{name}, %{target} kullanıcısının hesabının askı durumunu kaldırdı" + update_announcement_html: "%{name}, %{target} duyurusunu güncelledi" + update_custom_emoji_html: "%{name}, %{target} emojisini güncelledi" + update_domain_block_html: "%{name}, %{target} alan adının engelini güncelledi" + update_status_html: "%{name}, %{target} kullanıcısının gönderisini güncelledi" deleted_status: "(silinmiş durum)" empty: Kayıt bulunamadı. filter_by_action: Eyleme göre filtre @@ -312,10 +329,12 @@ tr: new: create: Duyuru oluştur title: Yeni duyuru + publish: Yayınla published_msg: Duyuru başarıyla yayınlandı! scheduled_for: "%{time} için zamanlandı" scheduled_msg: Duyuru yayınlanmak üzere zamanlandı! title: Duyurular + unpublish: Yayından kaldır unpublished_msg: Duyuru başarıyla yayından kaldırıldı! updated_msg: Duyuru başarıyla güncellendi! custom_emojis: @@ -352,33 +371,28 @@ tr: updated_msg: Emoji başarıyla güncellendi! upload: Yükle dashboard: - authorized_fetch_mode: Güvenli mod - backlog: bekleyen işler - config: Yapılandırma - feature_deletions: Hesap silme - feature_invites: Davet bağlantıları - feature_profile_directory: Profil Dizini - feature_registrations: Kayıtlar - feature_relay: Federasyon aktarıcısı - feature_spam_check: Anti-spam - feature_timeline_preview: Zaman çizelgesi önizlemesi - features: Özellikler - hidden_service: Gizli servislere sahip federasyon - open_reports: raporları aç - pending_tags: inceleme için bekleyen hashtag'ler - pending_users: inceleme için bekleyen kullanıcılar - recent_users: Son kullanıcılar - search: Tam metin araması - single_user_mode: Tek kullanıcı modu + active_users: aktif kullanıcılar + interactions: etkileşimler + media_storage: Medya deposu + new_users: yeni kullanıcılar + opened_reports: açılan bildirimler + pending_reports_html: + one: "1 bekleyen bildirim" + other: "%{count} bekleyen bildirim" + pending_tags_html: + one: "1 bekleyen etiket" + other: "%{count} bekleyen etiket" + pending_users_html: + one: "1 bekleyen kullanıcı" + other: "%{count} bekleyen kullanıcı" + resolved_reports: çözülmüş bildirimler software: Yazılım + sources: Kayıt kaynakları space: Alan kullanımı title: Kontrol Paneli - total_users: toplam kullanıcı - trends: Gündemler - week_interactions: bu haftaki etkileşimler - week_users_active: bu hafta aktif - week_users_new: bu hafta kullanıcılar - whitelist_mode: Beyaz liste modu + top_languages: En aktif diller + top_servers: En aktif sunucular + website: Web sitesi domain_allows: add_new: Alan adını beyaz listeye al created_msg: Alan adı başarıyla beyaz listeye alındı @@ -400,6 +414,8 @@ tr: silence: Sustur suspend: Uzaklaştır title: Yeni domain bloğu + obfuscate: Alan adını gizle + obfuscate_hint: Alan adı kısıtlamaları listelerinin duyurulması etkinleştirilmişse alan adını listede kısmen gizle private_comment: Özel yorum private_comment_hint: Denetleyiciler tarafından dahili kullanım için bu alan adı sınırlaması hakkında yorum. public_comment: Genel yorum @@ -436,9 +452,34 @@ tr: create: Alan adı ekle title: Yeni e-posta kara liste girişi title: E-posta kara listesi + follow_recommendations: + description_html: "Takip önerileri yeni kullanıcıların hızlı bir şekilde ilginç içerik bulmalarını sağlar. Eğer bir kullanıcı, kişisel takip önerileri almaya yetecek kadar başkalarıyla etkileşime girmediğinde, onun yerine bu hesaplar önerilir. Bu öneriler, verili bir dil için en yüksek takipçi sayısına ve en yüksek güncel meşguliyete sahip hesapların bir karışımdan günlük olarak hesaplanıyorlar." + language: Dil için + status: Durum + suppress: Takip önerisini baskıla + suppressed: Baskılandı + title: Takip önerileri + unsuppress: Takip önerisini geri getir instances: + back_to_all: Tümü + back_to_limited: Sınırlı + back_to_warning: Uyarı by_domain: Alan adı + delivery: + all: Tümü + clear: Teslimat hatalarını temizle + restart: Teslimatı yeniden başlat + stop: Teslimatı durdur + title: Teslimat + unavailable: Mevcut Değil + unavailable_message: Teslimat mevcut değil + warning: Uyarı + warning_message: + one: Teslimat %{count} gündür başarısız + other: Teslimat %{count} gündür başarısız delivery_available: Teslimat mevcut + delivery_error_days: Teslimat hatası günleri + delivery_error_hint: Eğer teslimat %{count} gün boyunca mümkün olmazsa, otomatik olarak teslim edilemiyor olarak işaretlenecek. empty: Alan adı bulunamadı. known_accounts: one: "%{count} bilinen hesap" @@ -517,6 +558,8 @@ tr: comment: none: Yok created_at: Şikayet edildi + forwarded: İletildi + forwarded_to: "%{domain}'e iletildi" mark_as_resolved: Giderildi olarak işaretle mark_as_unresolved: Çözümlenmemiş olarak işaretle notes: @@ -532,10 +575,18 @@ tr: resolved: Giderildi resolved_msg: Şikayet başarıyla çözümlendi! status: Durum + target_origin: Şikayet edilen hesabın kökeni title: Şikayetler unassign: Atamayı geri al unresolved: Giderilmedi updated_at: Güncellendi + rules: + add_new: Kural ekle + delete: Sil + description_html: Her ne kadar çoğu hizmet kullanım şartlarını okuyup kabul ettiğini söylese de, insanlar onu ancak bir sorun çıktığında gözden geçiriyorlar. Sunucunuzun kurallarını bir bakışta kolayca görülecek şekilde düz bir madde listesi şeklinde sunun. Tekil kuralları kısa ve yalın tutmaya çalışan ama onları çok sayıda maddeye bölmemeye de çalışın. + edit: Kuralı düzenle + empty: Henüz bir sunucu kuralı tanımlanmadı. + title: Sunucu kuralları settings: activity_api_enabled: desc_html: Yerel olarak yayınlanan durumların, aktif kullanıcıların, ve haftalık kovalardaki yeni kayıtların sayısı @@ -559,8 +610,6 @@ tr: users: Oturum açan yerel kullanıcılara domain_blocks_rationale: title: Gerekçeyi göster - enable_bootstrap_timeline_accounts: - title: Yeni kullanıcılar için varsayılan takipleri etkinleştir hero: desc_html: Önsayfada görüntülenir. En az 600x100px önerilir. Ayarlanmadığında, sunucu küçük resmi kullanılır title: Kahraman görseli @@ -586,6 +635,9 @@ tr: min_invite_role: disabled: Hiç kimse title: tarafından yapılan davetlere izin ver + require_invite_text: + desc_html: Kayıtlar elle doğrulama gerektiriyorsa, "Neden katılmak istiyorsunuz?" metin girdisini isteğe bağlı yerine zorunlu yapın + title: Yeni kullanıcıların katılmak için bir gerekçe sunmasını gerektir registrations_mode: modes: approved: Kayıt için onay gerekli @@ -611,9 +663,6 @@ tr: desc_html: Kendi gizlilik politikanızı, hizmet şartlarınızı ya da diğer hukuki metinlerinizi yazabilirsiniz. HTML etiketleri kullanabilirsiniz title: Özel hizmet şartları site_title: Site başlığı - spam_check_enabled: - desc_html: Mastodon, tekrar eden istenmeyen mesajlar gönderen hesapları otomatik olarak susturabilir ve şikayet edebilir. Yanlışlar olabilir. - title: Anti-spam otomasyonu thumbnail: desc_html: OpenGraph ve API ile ön izlemeler için kullanılır. 1200x630px tavsiye edilir title: Sunucu küçük resmi @@ -644,13 +693,18 @@ tr: no_status_selected: Hiçbiri seçilmediğinden hiçbir durum değiştirilmedi title: Hesap durumları with_media: Medya ile + system_checks: + database_schema_check: + message_html: Beklemede olan veritabanı güncellemeleri mevcut. Uygulamanın beklenildiği gibi çalışması için lütfen onları çalıştırın + rules_check: + action: Sunucu kurallarını yönet + message_html: Herhangi bir sunucu kuralı belirlemediniz. + sidekiq_process_check: + message_html: "%{value} kuyruk(lar)ı için herhangi bir Sidekiq süreci çalışmıyor. Lütfen Sidekiq yapılandırmanızı gözden geçirin" tags: accounts_today: Bugünkü eşsiz kullanımlar accounts_week: Bu haftaki eşsiz kullanımlar breakdown: Bugünkü kullanımın kaynağa göre dağılımı - context: İçerik - directory: Dizinde - in_directory: Dizinde %{count} last_active: Son etkinlik most_popular: En popüler most_recent: En yeni @@ -667,6 +721,7 @@ tr: add_new: Yeni ekle delete: Sil edit_preset: Uyarı ön-ayarını düzenle + empty: Henüz önceden ayarlanmış bir uyarı tanımlanmadı. title: Uyarı ön-ayarlarını yönet admin_mailer: new_pending_account: @@ -719,7 +774,7 @@ tr: checkbox_agreement_html: Sunucu kurallarını ve hizmet şartlarını kabul ediyorum checkbox_agreement_without_rules_html: Hizmet şartlarını kabul ediyorum delete_account: Hesabı sil - delete_account_html: Hesabınızı silmek isterseniz, buradan devam edebilirsiniz . Onaylamanız istenecektir. + delete_account_html: Hesabını silmek istersen, buradan devam edebilirsin. Onay istenir. description: prefix_invited_by_user: "@%{name} sizi bu Mastodon sunucusuna katılmaya davet ediyor!" prefix_sign_up: Bugün Mastodon'a kaydolun! @@ -733,7 +788,7 @@ tr: login: Oturum aç logout: Oturumu kapat migrate_account: Farklı bir hesaba taşıyın - migrate_account_html: Bu hesabı başka bir hesaba yönlendirmek istiyorsanız, buradan yapılandırabilirsiniz. + migrate_account_html: Bu hesabı başka bir hesaba yönlendirmek istiyorsan, buradan yapılandırabilirsin. or_log_in_with: 'Veya şununla oturum açın:' providers: cas: CAS @@ -914,6 +969,8 @@ tr: status: Doğrulama durumu view_proof: Kanıtı görüntüle imports: + errors: + over_rows_processing_limit: "%{count} satırdan fazlasını içeriyor" modes: merge: Birleştir merge_long: Mevcut kayıtları sakla ve yenileri ekle @@ -954,6 +1011,17 @@ tr: lists: errors: limit: En yüksek liste sayısına ulaştınız + login_activities: + authentication_methods: + otp: iki aşamalı kimlik doğrulama uygulaması + password: parola + sign_in_token: e-posta güvenlik kodu + webauthn: güvenlik anahtarları + description_html: Eğer tanımadığınız bir faaliyet görüyorsanız, parolanızı değiştirmeyi ve iki aşamalı kimlik doğrulamayı etkinleştirmeyi düşünün. + empty: Kimlik doğrulama geçmişi yok + failed_sign_in_html: "%{method} yöntemiyle %{ip} (%{browser}) adresinden başarısız oturum açma girişimi" + successful_sign_in_html: "%{method} yöntemiyle %{ip} (%{browser}) adresinden başarılı oturum açma" + title: Kimlik doğrulama geçmişi media_attachments: validations: images_and_video: Zaten resim içeren bir duruma video eklenemez @@ -1026,10 +1094,14 @@ tr: body: "%{name} senden bahsetti:" subject: "%{name} senden bahsetti" title: Yeni bahsetme + poll: + subject: Anket %{name} tarafından sonlandırıldı reblog: body: "%{name} durumunuzu boostladı:" subject: "%{name} durumunuzu boostladı" title: Yeni boost + status: + subject: "%{name} az önce gönderdi" notifications: email_events: E-posta bildirimi gönderilecek etkinlikler email_events_hint: 'Bildirim almak istediğiniz olayları seçin:' @@ -1156,6 +1228,7 @@ tr: revoke: İptal Et revoke_success: Oturum başarıyla iptal edildi title: Oturumlar + view_authentication_history: Hesabınızın kimlik doğrulama geçmişini görüntüle settings: account: Hesap account_settings: Hesap ayarları @@ -1176,10 +1249,9 @@ tr: preferences: Tercihler profile: Profil relationships: Takip edilenler ve takipçiler + statuses_cleanup: Otomatik gönderi silme two_factor_authentication: İki adımlı doğrulama webauthn_authentication: Güvenlik anahtarları - spam_check: - spam_detected: Bu otomatik bir şikayettir. Spam tespit edildi. statuses: attached: audio: @@ -1222,12 +1294,47 @@ tr: sign_in_to_participate: Sohbete katılmak için oturum açın title: '%{name}: "%{quote}"' visibilities: + direct: Doğrudan private: Sadece takipçiler private_long: Sadece takipçilerime gönder public: Herkese açık public_long: Herkese açık zaman tüneline gönder unlisted: Listelenmemiş unlisted_long: Herkes görebilir fakat herkese açık zaman tünellerinde listelenmez + statuses_cleanup: + enabled: Eski gönderileri otomatik olarak sil + enabled_hint: Belirli bir zaman eşiğine ulaşan eski gönderilerinizi, aşağıdaki istisnalara uymadıkları sürece otomatik olarak siler + exceptions: İstisnalar + explanation: Gönderi silme maliyetli bir iş olduğu için, sunucu çok yoğun olmadığında yavaş yavaş yapılmaktadır. Bu nedenle, gönderilerinizin zaman eşiği geldiğinde silinmesi belirli bir süre alabilir. + ignore_favs: Beğenileri yoksay + ignore_reblogs: Teşvikleri yoksay + interaction_exceptions: Etkileşimlere dayalı istisnalar + interaction_exceptions_explanation: Bir kere değerlendirmeye alındıktan sonra, belirtilen beğeni veya teşvik eşiğinin altında düşünce gönderilerin silinmesinin bir güvencesi yok. + keep_direct: Doğrudan iletileri sakla + keep_direct_hint: Herhangi bir doğrudan iletinizi silmez + keep_media: Görüntü eki olan gönderileri sakla + keep_media_hint: Herhangi bir medya eki olan gönderinizi silmez + keep_pinned: Sabitlenmiş gönderileri sakla + keep_pinned_hint: Herhangi bir sabitlenmiş gönderinizi silmez + keep_polls: Anketleri sakla + keep_polls_hint: Herhangi bir anketinizi silmez + keep_self_bookmark: Yer imi olarak eklenmiş gönderileri sakla + keep_self_bookmark_hint: Herhangi bir yer imi olarak eklenmiş gönderinizi silmez + keep_self_fav: Beğendiğiniz gönderileri sakla + keep_self_fav_hint: Kendi gönderilerinizi beğenmişseniz silmez + min_age: + '1209600': 2 hafta + '15778476': 6 ay + '2629746': 1 ay + '31556952': 1 yıl + '5259492': 2 ay + '63113904': 2 yıl + '7889238': 3 ay + min_age_label: Zaman eşiği + min_favs: Şundan daha fazla beğenilen gönderileri sakla + min_favs_hint: Bu belirtilenden daha fazla beğeni alan gönderilerinizin herhangi birini silmez. Beğeni sayısından bağımsız olarak gönderilerin silinmesi için burayı boş bırakın + min_reblogs: Şundan daha fazla teşvik edilen gönderileri sakla + min_reblogs_hint: Bu belirtilenden daha fazla teşvik edilen gönderilerinizin herhangi birini silmez. Teşvik sayısından bağımsız olarak gönderilerin silinmesi için burayı boş bırakın stream_entries: pinned: Sabitlenmiş toot reblogged: boostladı @@ -1390,11 +1497,8 @@ tr: tips: İpuçları title: Gemiye hoşgeldin, %{name}! users: - blocked_email_provider: Bu e-posta sağlayıcısına izin verilmiyor follow_limit_reached: "%{limit} kişiden daha fazlasını takip edemezsiniz" generic_access_help_html: Hesabınıza erişirken sorun mu yaşıyorsunuz? Yardım için %{email} ile iletişime geçebilirsiniz - invalid_email: E-posta adresi geçersiz - invalid_email_mx: E-posta adresi mevcut görünmüyor invalid_otp_token: Geçersiz iki adımlı doğrulama kodu invalid_sign_in_token: Geçersiz güvenlik kodu otp_lost_help_html: Her ikisine de erişiminizi kaybettiyseniz, %{email} ile irtibata geçebilirsiniz diff --git a/config/locales/tt.yml b/config/locales/tt.yml index e35b5da21c..b9fc1b868d 100644 --- a/config/locales/tt.yml +++ b/config/locales/tt.yml @@ -1,5 +1,144 @@ --- tt: + about: + about_this: Хакында + api: API + contact_unavailable: Юк + privacy_policy: Хосусыйлык сәясәте + unavailable_content_description: + domain: Сервер + user_count_after: + other: кулланучы + accounts: + follow: Языл + following: Язылгансыз + media: Медиа + never_active: Беркайчан да + roles: + admin: Админ + bot: Бот + group: Törkem + unfollow: Язылынмау + admin: + account_moderation_notes: + delete: Бетерү + accounts: + avatar: Аватар + by_domain: Домен + change_email: + label: Emailны үзгәртү + submit: Emailны үзгәртү + confirm: Раслау + deleted: Бетерелде + domain: Домен + edit: Үзгәртү + email: Эл. почта + header: Башлам + ip: ІР + location: + all: Бөтенесе + local: Җирле + title: Урын + moderation: + all: Бөтенесе + perform_full_suspension: Искә алмау + reset: Ташлату + role: Рөхсәтләр + roles: + user: Кулланучы + search: Эзләү + sensitive: Sizmäle + username: Кулланучы исеме + web: Веб + custom_emojis: + by_domain: Домен + copy: Күчереп алу + delete: Бетерү + disable: Cүндерү + disabled: Cүндерелгән + enable: Кабызу + list: Исемлек + upload: Йөкләү + domain_blocks: + domain: Домен + new: + severity: + noop: Бернинди дә + suspend: Искә алмау + show: + undo: Кире алу + email_domain_blocks: + delete: Бетерү + domain: Домен + instances: + by_domain: Домен + moderation: + all: Бөтенесе + invites: + filter: + all: Бөтенесе + expired: Гамәлдән чыкты + title: Sözgeç + ip_blocks: + delete: Бетерү + expires_in: + '1209600': 2 атна + '15778476': 6 months + '2629746': 1 ай + '31556952': 1 ел + '86400': 1 көн + '94670856': 3 ел + relays: + delete: Бетерү + disable: Cүндерү + disabled: Cүндерелгән + enable: Кабызу + status: Халәт + reports: + comment: + none: Бернинди дә + notes: + create: Язу кушу + delete: Бетерү + status: Халәт + updated_at: Яңартылды + statuses: + batch: + delete: Бетерү + deleted: Бетерелде + media: + title: Медиа + warning_presets: + delete: Бетерү + application_mailer: + salutation: "%{name}," + auth: + change_password: Парол + login: Керү + providers: + cas: САS + saml: SАML + register: Теркәлү + security: Хәвефсезлек + authorize_follow: + follow: Язылу + challenge: + confirm: Дәвам итү + date: + formats: + default: "%d %b %Y" + with_month_name: "%d %B %Y" + datetime: + distance_in_words: + about_x_hours: "%{count}сәг" + about_x_months: "%{count}ай" + half_a_minute: Хәзер генә + less_than_x_minutes: "%{count}м" + less_than_x_seconds: Хәзер генә + x_days: "%{count}к" + x_minutes: "%{count}м" + x_months: "%{count}ай" + x_seconds: "%{count}сек" errors: '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. @@ -10,3 +149,107 @@ tt: '429': Too many requests '500': '503': The page could not be served due to a temporary server failure. + exports: + archive_takeout: + date: Көне + size: Olılıq + bookmarks: Кыстыргычлар + csv: СSV + filters: + contexts: + thread: Әңгәмәләр + index: + delete: Бетерү + title: Сөзгечләр + footer: + more: Тагы… + generic: + all: Бөтенесе + copy: Күчереп алу + delete: Бетерү + imports: + types: + bookmarks: Кыстыргычлар + upload: Йөкләү + invites: + expired: Гамәлдән чыкты + expires_in: + '1800': 30 минут + '21600': 6 сәгать + '3600': 1 сәгать + '43200': 12 сәгать + '604800': 1 атна + '86400': 1 көн + expires_in_prompt: Беркайчан да + number: + human: + decimal_units: + format: "%n%u" + otp_authentication: + enable: Кабызу + pagination: + next: Киләсе + prev: Алдыгы + truncate: "…" + preferences: + other: Башка + relationships: + following: Язылгансыз + sessions: + browser: Браузер + browsers: + alipay: Аlipay + blackberry: Blаckberry + chrome: Chrоme + edge: Microsоft Edge + electron: Electrоn + firefox: Firеfox + ie: Internet Explоrer + micro_messenger: MicroMеssenger + nokia: Nokia S40 Ovi Brоwser + opera: Opеra + otter: Ottеr + phantom_js: PhаntomJS + qq: QQ Brоwser + safari: Safаri + uc_browser: UCBrоwser + weibo: Weibо + description: "%{browser} - %{platform}" + ip: ІР + platforms: + adobe_air: Adobе Air + android: Andrоid + chrome_os: ChromеOS + firefox_os: Firеfox OS + ios: iОS + linux: Lіnux + mac: macOS + windows: Windоws + windows_mobile: Windows Mоbile + windows_phone: Windоws Phone + settings: + account: Хисап язмасы + appearance: Küreneş + development: Эшләнмә + edit_profile: Профильны үзгәртү + import: Импортлау + preferences: Caylaw + profile: Профиль + statuses: + attached: + video: + other: "%{count} видео" + title: '%{name}: "%{quote}"' + time: + formats: + default: "%d %b %Y, %H:%M" + month: "%b %Y" + two_factor_authentication: + add: Өстәү + edit: Үзгәртү + user_mailer: + warning: + title: + none: Игътибар + webauthn_credentials: + delete: Бетерү diff --git a/config/locales/uk.yml b/config/locales/uk.yml index dee947dc68..f4e60f9218 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -21,11 +21,11 @@ uk: federation_hint_html: З обліковим записом на %{instance} ви зможете слідкувати за людьми на будь-якому сервері Mastodon та поза ним. get_apps: Спробуйте мобільний додаток hosted_on: Mastodon розміщено на %{domain} - instance_actor_flash: 'Цей обліковий запис є віртуальною особою, яка використовується для представлення самого сервера, а не певного користувача. Він використовується для потреб федерації і не повинен бути заблокований, якщо тільки ви не хочете заблокувати весь сервер, у цьому випадку ви повинні скористатися блокуванням домену. - -' + instance_actor_flash: "Цей обліковий запис є віртуальною особою, яка використовується для представлення самого сервера, а не певного користувача. Він використовується для потреб федерації і не повинен бути заблокований, якщо тільки ви не хочете заблокувати весь сервер, у цьому випадку ви повинні скористатися блокуванням домену. \n" learn_more: Дізнатися більше privacy_policy: Політика приватності + rules: Правила сервера + rules_html: 'Внизу наведено підсумок правил, яких ви повинні дотримуватися, якщо хочете мати обліковий запис на цьому сервері Mastodon:' see_whats_happening: Погляньте, що відбувається server_stats: 'Статистика серверу:' source_code: Вихідний код @@ -66,6 +66,7 @@ uk: one: Підписник other: Підписників following: Підписаний(-а) + instance_actor_flash: Цей обліковий запис є віртуальним персонажем, який використовується для показу самого сервера, а не будь-якого окремого користувача. Він використовується з метою федералізації і не повинен бути зупинений. joined: Приєднався %{date} last_active: остання активність link_verified_on: Права власності на це посилання були перевірені %{date} @@ -85,7 +86,6 @@ uk: other: Дмухів posts_tab_heading: Дмухи posts_with_replies: Дмухи та відповіді - reserved_username: Це ім'я користувача зарезервоване roles: admin: Адміністратор bot: Бот @@ -106,6 +106,7 @@ uk: add_email_domain_block: Додати поштовий домен до чорного списку approve: Схвалити approve_all: Схвалити всіх + approved_msg: Заявку на реєстрацію %{username} затверджено are_you_sure: Ви впевнені? avatar: Аватар by_domain: Домен @@ -119,9 +120,12 @@ uk: confirm: Зберегти confirmed: Збережено confirming: Зберігається + delete: Видалити дані deleted: Видалено demote: Усунути + destroyed_msg: Дані %{username} тепер в черзі на негайне видалення disable: Вимкнути + disable_sign_in_token_auth: Вимкнути автентифікацію за допомогою е-пошти disable_two_factor_authentication: Вимкнути двофакторну авторизацію disabled: Вимкнено display_name: Відображуване ім'я @@ -130,11 +134,14 @@ uk: email: Електронна пошта email_status: Статус електронної пошти enable: Увімкнути + enable_sign_in_token_auth: Увімкнути автентифікацію за допомогою е-пошти enabled: Увімкнено + enabled_msg: Обліковий запис %{username} успішно розморожено followers: Підписники follows: Підписки header: Заголовок inbox_url: URL вхідних повідомлень + invite_request_text: Причини приєднатися invited_by: 'Запросив:' ip: IP joined: Приєднався @@ -146,6 +153,8 @@ uk: login_status: Статус авторизації media_attachments: Мультимедійні вкладення memorialize: Зробити пам'ятником + memorialized: Перетворено на пам'ятник + memorialized_msg: "%{username} успішно перетворено на пам'ятний обліковий запис" moderation: active: Активний all: Усі @@ -166,10 +175,14 @@ uk: public: Публічний push_subscription_expires: Підписка PuSH спливає redownload: Оновити аватар + redownloaded_msg: Профіль %{username} оновлено з джерела походження reject: Відхилити reject_all: Відхилити усе + rejected_msg: Заявку на реєстрацію %{username} відхилено remove_avatar: Видалити аватар remove_header: Видалити заголовок + removed_avatar_msg: Зображення користувача %{username} вилучено + removed_header_msg: Зображення обкладинки %{username} вилучено resend_confirmation: already_confirmed: Цей користувач уже підтверджений send: Надіслати електронний лист-підтвердження ще раз @@ -186,6 +199,12 @@ uk: search: Пошук search_same_email_domain: Інші користувачі з тим самим поштовим доменом search_same_ip: Інші користувачі з тим самим IP + security_measures: + only_password: Лише пароль + password_and_2fa: Пароль та 2FA + password_and_sign_in_token: Пароль та токен з е-пошти + sensitive: Делікатне + sensitized: позначено делікатним shared_inbox_url: URL спільного вхідного кошика show: created_reports: Скарги, створені цим акаунтом @@ -195,13 +214,19 @@ uk: statuses: Статуси subscribe: Підписатися suspended: Призупинені + suspension_irreversible: Дані цього облікового запису безповоротно видалено. Ви можете розблокувати обліковий запис, щоб могти ним користуватися, але будь-які його дані не відновляться. + suspension_reversible_hint_html: Обліковий запис заблоковано, а дані буде повністю вилучено %{date}. До цього часу обліковий запис можна відновити без будь-яких негативних наслідків. Якщо ви бажаєте вилучити всі дані облікового запису негайно, ви можете зробити це внизу. time_in_queue: Очікує в черзі %{time} title: Облікові записи unconfirmed_email: Непідтверджена адреса електронної пошти + undo_sensitized: Скасувати позначення делікатним undo_silenced: Зняти глушення undo_suspension: Зняти призупинення + unsilenced_msg: Успішно знято обмеження з облікового запису %{username} unsubscribe: Відписатися + unsuspended_msg: Обліковий запис %{username} успішно розблоковано username: Ім'я користувача + view_domain: Переглянути резюме для домену warn: Попередження web: Веб whitelisted: У білому списку @@ -216,17 +241,23 @@ uk: create_domain_allow: Створити дозвіл на домен create_domain_block: Створити блокування домену create_email_domain_block: Створити блокування поштового домену + create_ip_block: Створити правило IP + create_unavailable_domain: Створити недоступний домен demote_user: Понизити користувача destroy_announcement: Видалити оголошення destroy_custom_emoji: Видалити користувацьке емодзі destroy_domain_allow: Видалити дозвіл на домен destroy_domain_block: Видалити блокування домену destroy_email_domain_block: Видалити блокування поштового домену + destroy_ip_block: Видалити правило IP destroy_status: Видалити пост + destroy_unavailable_domain: Видалити недоступний домен disable_2fa_user: Вимкнути 2FA disable_custom_emoji: Вимкнути користувацькі емодзі + disable_sign_in_token_auth_user: Вимкнути автентифікацію за допомогою е-пошти для користувача disable_user: Відключити користувача enable_custom_emoji: Увімкнути користувацькі емодзі + enable_sign_in_token_auth_user: Увімкнути автентифікацію за допомогою е-пошти для користувача enable_user: Активувати користувача memorialize_account: Зробити обліковий запис меморіалом promote_user: Підвищити користувача @@ -234,50 +265,62 @@ uk: reopen_report: Перевідкрити скаргу reset_password_user: Скинути пароль resolve_report: Розв'язати скаргу + sensitive_account: Позначити делікатним медіа вашого облікового запису silence_account: Заглушити обліковий запис suspend_account: Призупинити обліковий запис unassigned_report: Видалити скаргу + unsensitive_account: Прибрати позначку "делікатне" з медіа вашого облікового запису unsilence_account: Розглушити обліковий запис unsuspend_account: Розморозити обліковий запис update_announcement: Оновити оголошення update_custom_emoji: Оновити користувацькі емодзі + update_domain_block: Оновити блокування домену update_status: Оновити статус actions: - assigned_to_self_report: "%{name} призначив(-ла) скаргу %{target} на себе" - change_email_user: "%{name} змінив(-ла) поштову адресу користувача %{target}" - confirm_user: "%{name} підтвердив(-ла) статус поштової адреси користувача %{target}" - create_account_warning: "%{name} надіслав попередження до %{target}" - create_announcement: "%{name} створив нове оголошення %{target}" - create_custom_emoji: "%{name} вивантажив(-ла) нове емодзі %{target}" - create_domain_allow: "%{name} додав(-ла) домен %{target} до білого списку" - create_domain_block: "%{name} заблокував(-ла) домен %{target}" - create_email_domain_block: "%{name} додав(-ла) поштовий домен %{target} до чорного списку" - demote_user: "%{name} понизив(-ла) %{target}" - destroy_announcement: "%{name} видалив оголошення %{target}" - destroy_custom_emoji: "%{name} знищив(-ла) емодзі %{target}" - destroy_domain_allow: "%{name} видалив(-ла) домен %{target} з білого списку" - destroy_domain_block: "%{name} розблокував(-ла) домен %{target}" - destroy_email_domain_block: "%{name} додав(-ла) поштовий домен %{target} до білого списку" - destroy_status: "%{name} видалив(-ла) статус користувача %{target}" - disable_2fa_user: "%{name} вимкнув(-ла) двофакторну авторизацію для користувача %{target}" - disable_custom_emoji: "%{name} вимкнув(-ла) емодзі %{target}" - disable_user: "%{name} заборонив(-ла) авторизацію користувачу %{target}" - enable_custom_emoji: "%{name} увімкнув(-ла) емодзі %{target}" - enable_user: "%{name} увімкнув(-ла) авторизацію користувачу %{target}" - memorialize_account: "%{name} перетворив(-ла) обліковий запис %{target} на сторінку пам'яті" - promote_user: "%{name} підвищив(-ла) користувача %{target}" - remove_avatar_user: "%{name} прибрав(-ла) аватар користувача %{target}" - reopen_report: "%{name} перевідкрив(-ла) скаргу %{target}" - reset_password_user: "%{name} скинув(-ла) пароль користувача %{target}" - resolve_report: "%{name} розв'язав(-ла) скаргу %{target}" - silence_account: "%{name} заглушив(-ла) обліковий запис %{target}" - suspend_account: "%{name} заморозив(-ла) обліковий запис %{target}" - unassigned_report: "%{name} зняв(-ла) призначення скарги %{target}" - unsilence_account: "%{name} розглушив(-ла) обліковий запис %{target}" - unsuspend_account: "%{name} розморозив(-ла) обліковий запис %{target}" - update_announcement: "%{name} оновив оголошення %{target}" - update_custom_emoji: "%{name} оновив(-ла) емодзі %{target}" - update_status: "%{name} змінив(-ла) статус користуача %{target}" + assigned_to_self_report_html: "%{name} створює скаргу %{target} на себе" + change_email_user_html: "%{name} змінює поштову адресу користувача %{target}" + confirm_user_html: "%{name} підтверджує стан поштової адреси користувача %{target}" + create_account_warning_html: "%{name} надсилає попередження до %{target}" + create_announcement_html: "%{name} створює нове оголошення %{target}" + create_custom_emoji_html: "%{name} завантажує нові емодзі %{target}" + create_domain_allow_html: "%{name} дозволяє федерацію з доменом %{target}" + create_domain_block_html: "%{name} блокує домен %{target}" + create_email_domain_block_html: "%{name} блокує домен електронної пошти %{target}" + create_ip_block_html: "%{name} створює правило для IP %{target}" + create_unavailable_domain_html: "%{name} зупиняє доставляння на домен %{target}" + demote_user_html: "%{name} понижує користувача %{target}" + destroy_announcement_html: "%{name} видаляє оголошення %{target}" + destroy_custom_emoji_html: "%{name} знищує емодзі %{target}" + destroy_domain_allow_html: "%{name} скасовує федерацію з доменом %{target}" + destroy_domain_block_html: "%{name} розблокує домен %{target}" + destroy_email_domain_block_html: "%{name} розблоковує домен електронної пошти %{target}" + destroy_ip_block_html: "%{name} видаляє правило для IP %{target}" + destroy_status_html: "%{name} видаляє статус %{target}" + destroy_unavailable_domain_html: "%{name} відновлює доставляння на домен %{target}" + disable_2fa_user_html: "%{name} вимикає двоетапну перевірку для користувача %{target}" + disable_custom_emoji_html: "%{name} вимикає емодзі %{target}" + disable_sign_in_token_auth_user_html: "%{name} вимикає автентифікацію через е-пошту для %{target}" + disable_user_html: "%{name} вимикає вхід для користувача %{target}" + enable_custom_emoji_html: "%{name} вмикає емодзі %{target}" + enable_sign_in_token_auth_user_html: "%{name} вмикає автентифікацію через е-пошту для %{target}" + enable_user_html: "%{name} вмикає вхід для користувача %{target}" + memorialize_account_html: "%{name} перетворює обліковий запис %{target} на сторінку пам'яті" + promote_user_html: "%{name} підвищує користувача %{target}" + remove_avatar_user_html: "%{name} прибирає аватар %{target}" + reopen_report_html: "%{name} знову відкриває звіт %{target}" + reset_password_user_html: "%{name} скидає пароль користувача %{target}" + resolve_report_html: "%{name} розв'язує скаргу %{target}" + sensitive_account_html: "%{name} позначає медіа від %{target} делікатним" + silence_account_html: "%{name} приглушує обліковий запис %{target}" + suspend_account_html: "%{name} заморожує обліковий запис %{target}" + unassigned_report_html: "%{name} прибирає призначення скарги %{target}" + unsensitive_account_html: '%{name} прибирає позначку "делікатне" з медіа від %{target}' + unsilence_account_html: "%{name} розглушує обліковий запис %{target}" + unsuspend_account_html: "%{name} розморожує обліковий запис %{target}" + update_announcement_html: "%{name} оновлює оголошення %{target}" + update_custom_emoji_html: "%{name} оновлює емодзі %{target}" + update_domain_block_html: "%{name} оновлює блокування домену для %{target}" + update_status_html: "%{name} змінює статус користувача %{target}" deleted_status: "(видалений статус)" empty: Не знайдено жодного журналу. filter_by_action: Фільтрувати за дією @@ -292,10 +335,12 @@ uk: new: create: Створити оголошення title: Нове оголошення + publish: Опублікувати published_msg: Оголошення успішно опубліковано! scheduled_for: Заплановано на %{time} scheduled_msg: Оголошення додано в чергу публікації! title: Оголошення + unpublish: Скасувати публікацію unpublished_msg: Оголошення успішно приховано! updated_msg: Оголошення успішно оновлено! custom_emojis: @@ -332,33 +377,34 @@ uk: updated_msg: Емодзі успішно оновлене! upload: Вивантажити dashboard: - authorized_fetch_mode: Безпечний режим - backlog: відкладені завдання - config: Налаштування - feature_deletions: Видалення облікових записів - feature_invites: Посилання-запрошення - feature_profile_directory: Каталог профілів - feature_registrations: Реєстрації - feature_relay: Ретранслятор дмухів між серверами - feature_spam_check: Анти-спам - feature_timeline_preview: Передпоказ стрічки - features: Можливості - hidden_service: Федерація з прихованими сервісами - open_reports: відкриті скарги - pending_tags: хештеги, що очікують на перегляд - pending_users: користувачі, що очікують на перегляд - recent_users: Останні користувачі - search: Повнотекстовий пошук - single_user_mode: Режим одного користувача + active_users: активні користувачі + interactions: взаємодії + media_storage: Медіасховище + new_users: нові користувачі + opened_reports: звітів відкрито + pending_reports_html: + few: "%{count} звіти у черзі" + many: "%{count} звітів у черзі" + one: "1 звіт у черзі" + other: "%{count} звіти у черзі" + pending_tags_html: + few: "%{count} хештеґи у черзі" + many: "%{count} хештеґів у черзі" + one: "1 хештеґ у черзі" + other: "%{count} хештеґи у черзі" + pending_users_html: + few: "%{count} користувачі у черзі" + many: "%{count} користувачів у черзі" + one: "1 користувач у черзі" + other: "%{count} користувача у черзі" + resolved_reports: розв'язані звіти software: Програмне забезпечення + sources: Джерела реєстрації space: Використання дискового простору title: Приборна панель - total_users: користувачів загалом - trends: Тренди - week_interactions: дій за цей тиждень - week_users_active: активно протягом тижня - week_users_new: користувачів цього тижня - whitelist_mode: Режим білого списку + top_languages: Найактивніші мови + top_servers: Найактивніші сервери + website: Вебсайт domain_allows: add_new: Додати домен до білого списку created_msg: Домен було успішно додано до білого списку @@ -380,6 +426,8 @@ uk: silence: Глушення suspend: Блокування title: Нове блокування домену + obfuscate: Сховати назву домена + obfuscate_hint: Частково приховувати доменне ім'я в списку, якщо ввімкнено показ списку обмежень домену private_comment: Приватний коментар private_comment_hint: Прокоментуйте обмеження для цього домену, а модератори прочитають. public_comment: Публічний коментар @@ -418,9 +466,37 @@ uk: create: Додати домен title: Нове блокування поштового домену title: Чорний список поштових доменів + follow_recommendations: + description_html: "Слідувати рекомендаціям та допомогти новим користувачам швидко знайти цікавий вміст. Коли користувачі не взаємодіяли з іншими людьми достатньо, щоб сформувати персоналізовані рекомендації, радимо замість цього вказувати ці облікові записи. Вони щоденно переобчислюються з масиву облікових записів з найбільшою кількістю недавніх взаємодій і найбільшою кількістю місцевих підписників розраховується для цієї мови." + language: Для мови + status: Стан + suppress: Приховати поради щодо підписок + suppressed: Приховати + title: Поради щодо підписок + unsuppress: Відновити поради щодо підписок instances: + back_to_all: Усі + back_to_limited: Обмежені + back_to_warning: Попередження by_domain: Домен + delivery: + all: Усі + clear: Очистити помилки доставляння + restart: Перезапустити доставляння + stop: Припинити доставляння + title: Доставляння + unavailable: Недоступно + unavailable_message: Доставлення недоступне + warning: Попередження + warning_message: + few: Збій доставляння %{count} дні + many: Збій доставляння %{count} днів + one: Збій доставляння %{count} день + other: Збій доставляння %{count} днів delivery_available: Доставлення доступне + delivery_error_days: Днів помилок доставляння + delivery_error_hint: Якщо доставляння неможливе впродовж %{count} днів, воно автоматично позначиться недоставленим. + empty: Доменів не знайдено. known_accounts: few: "%{count} відомих облікових записів" many: "%{count} відомих облікових записів" @@ -446,6 +522,21 @@ uk: expired: Просрочено title: Фільтр title: Запрошення + ip_blocks: + add_new: Створити правило + created_msg: Нове правило IP успішно додано + delete: Видалити + expires_in: + '1209600': 2 тижні + '15778476': 6 місяців + '2629746': 1 місяць + '31556952': 1 рік + '86400': 1 день + '94670856': 3 роки + new: + title: Створити нове правило IP + no_ip_block_selected: Жодних правил IP не було змінено, оскільки жодного не було вибрано + title: Правила IP pending_accounts: title: Облікові записи у черзі (%{count}) relationships: @@ -489,6 +580,8 @@ uk: comment: none: Немає created_at: Створено + forwarded: Переслано + forwarded_to: Переслано до %{domain} mark_as_resolved: Відмітити як вирішену mark_as_unresolved: Відмітити як невирішену notes: @@ -504,10 +597,18 @@ uk: resolved: Вирішено resolved_msg: Скаргу успішно вирішено! status: Статус + target_origin: Походження облікового запису, на який скаржаться title: Скарги unassign: Зняти призначення unresolved: Невирішені updated_at: Оновлені + rules: + add_new: Додати правило + delete: Видалити + description_html: Хоча більшість заявляє про прочитання та погодження з умовами обслуговування, як правило, люди не читають їх до появи проблеми. Спростіть перегляд правил вашого сервера, зробивши їх у вигляді маркованого списку. Спробуйте створити короткі та просі правила, але не розділяйте їх на багато окремих частин. + edit: Змінити правило + empty: Жодних правил сервера ще не визначено. + title: Правила сервера settings: activity_api_enabled: desc_html: Кількість локальних постів, активних та нових користувачів у тижневих розрізах @@ -531,8 +632,6 @@ uk: users: Для авторизованих локальних користувачів domain_blocks_rationale: title: Обґрунтування - enable_bootstrap_timeline_accounts: - title: Увімкнути підписки за замовчуванням для нових користувачів hero: desc_html: Відображається на головній сторінці. Рекомендовано як мінімум 600x100 пікселів. Якщо не вказано, буде використано передпоказ інстанції title: Банер інстанції @@ -558,6 +657,9 @@ uk: min_invite_role: disabled: Ніхто title: Дозволити запрошення від + require_invite_text: + desc_html: Якщо реєстрація вимагає власноручного затвердження, зробіть текстове поле «Чому ви хочете приєднатися?» обов'язковим, а не додатковим + title: Вимагати повідомлення причини приєднання від нових користувачів registrations_mode: modes: approved: Для входу потрібне схвалення @@ -585,9 +687,6 @@ uk: Можете використовувати HTML теги title: Особливі умови використання site_title: Назва сайту - spam_check_enabled: - desc_html: Mastodon може автоматично глушити та автоматично звітувати про облікові записи, які надсилають повторні небажані повідомлення. Можливі хибно-позитивні спрацьовування. - title: Автоматизація антиспаму thumbnail: desc_html: Використовується для передпоказів через OpenGraph та API. Бажано розміром 1200х640 пікселів title: Мініатюра інстанції @@ -618,13 +717,18 @@ uk: no_status_selected: Жодного статуса не було змінено, оскільки жодного не було вибрано title: Статуси облікових записів with_media: З медіа + system_checks: + database_schema_check: + message_html: Існують відкладені перенесення бази даних. Запустіть їх, щоб забезпечити очікувану роботу програми + rules_check: + action: Керування правилами сервера + message_html: Ви не визначили будь-які правила сервера. + sidekiq_process_check: + message_html: Не працює процес Sidekiq для %{value} черги. Перегляньте конфігурації вашого Sidekiq tags: accounts_today: Унікальних використань за сьогодні accounts_week: Унікальних використань за тиждень breakdown: Аналіз використання за сьогодні за джерелом - context: Контекст - directory: У каталозі - in_directory: "%{count} у каталозі" last_active: За активністю most_popular: За популярністю most_recent: За часом створення @@ -641,6 +745,7 @@ uk: add_new: Додати новий delete: Видалити edit_preset: Редагувати шаблон попередження + empty: Ви ще не визначили жодних попереджень. title: Управління шаблонами попереджень admin_mailer: new_pending_account: @@ -728,6 +833,7 @@ uk: functional: Ваш обліковий запис повністю робочій. pending: Ваша заява очікує на розгляд нашим персоналом. Це може зайняти деякий час. Ви отримаєте електронний лист, якщо ваша заява буде схвалена. redirecting_to: Ваш обліковий запис наразі неактивний, тому що він перенаправлений до %{acct}. + too_fast: Форму подано занадто швидко, спробуйте ще раз. trouble_logging_in: Проблема під час входу? use_security_key: Використовувати ключ безпеки authorize_follow: @@ -819,6 +925,7 @@ uk: request: Зробити запит на архів size: Розмір blocks: Список блокувань + bookmarks: Закладки csv: CSV domain_blocks: Блокування доменів lists: Списки @@ -888,6 +995,8 @@ uk: status: Стан перевірки view_proof: Переглянути доказ imports: + errors: + over_rows_processing_limit: містить більше ніж %{count} рядків modes: merge: Злиття merge_long: Зберегти існуючі записи та додати нові @@ -897,6 +1006,7 @@ uk: success: Ваші дані були успішно загружені та будуть оброблені в найближчий момент types: blocking: Список блокувань + bookmarks: Закладки domain_blocking: Список заблокованих сайтів following: Підписки muting: Список глушення @@ -929,6 +1039,17 @@ uk: lists: errors: limit: Ви досягли максимальної кількості списків + login_activities: + authentication_methods: + otp: застосунок двофакторної автентифікації + password: пароль + sign_in_token: код безпеки е-поштою + webauthn: ключі безпеки + description_html: Якщо ви помітили невідомі вам дії, тоді подумайте про зміну свого пароля та можливість увімкнення двофакторної автентифікації. + empty: Немає історії входів + failed_sign_in_html: Не вдалося увійти з %{method} з %{ip} (%{browser}) + successful_sign_in_html: Успішний вхід з %{method} з %{ip} (%{browser}) + title: Історія входів media_attachments: validations: images_and_video: Не можна додати відео до статусу з зображеннями @@ -1005,10 +1126,14 @@ uk: body: 'Вас згадав(-ла) %{name} в:' subject: Вас згадав(-ла) %{name} title: Нова згадка + poll: + subject: Опитування від %{name} завершено reblog: body: 'Ваш статус було передмухнуто %{name}:' subject: "%{name} передмухнув(-ла) ваш статус" title: Нове передмухування + status: + subject: "%{name} щойно опубліковано" notifications: email_events: Події, про які сповіщати електронною поштою email_events_hint: 'Оберіть події, про які ви хочете отримувати сповіщення:' @@ -1059,6 +1184,7 @@ uk: relationships: activity: Діяльність облікового запису dormant: Неактивні + follow_selected_followers: Стежити за вибраними підписниками followers: Підписники following: Підписник(-ця) invited: Запрошені @@ -1134,6 +1260,7 @@ uk: revoke: Закінчити revoke_success: Сесія успішно закінчена title: Сесії + view_authentication_history: Переглянути історію входів вашого облікового запису settings: account: Обліковий запис account_settings: Налаштування облікового запису @@ -1154,10 +1281,9 @@ uk: preferences: Налаштування profile: Профіль relationships: Підписки та підписники + statuses_cleanup: Автовидалення допису two_factor_authentication: Двофакторна авторизація webauthn_authentication: Ключі безпеки - spam_check: - spam_detected: Це автоматична скарга. Було виявлено спам. statuses: attached: audio: @@ -1206,16 +1332,53 @@ uk: other: "%{count} голоси" vote: Проголосувати show_more: Розгорнути + show_newer: Показати новіші + show_older: Показати давніші show_thread: Відкрити обговорення sign_in_to_participate: Увійдіть, щоб брати участь у бесіді title: '%{name}: "%{quote}"' visibilities: + direct: Особисто private: Для підписників private_long: Показувати тільки підписникам public: Для всіх public_long: Показувати всім unlisted: Приховувати зі стрічок unlisted_long: Показувати всім, але не відображати в публічних стрічках + statuses_cleanup: + enabled: Автовидалення давніх дописів + enabled_hint: Автоматично видаляє ваші дописи після досягнення вказаного вікового порогу, якщо вони не є одним з наведених винятків + exceptions: Винятки + explanation: Оскільки видалення дописів є складною операцією, то це відбувається повільно, коли сервер не дуже завантажено. З цієї причини ваші дописи можуть бути видалені через деякий час після досягнення вікового порогу. + ignore_favs: Ігнорувати обране + ignore_reblogs: Ігнорувати передмухнуті + interaction_exceptions: Винятки базуються на взаємодії + interaction_exceptions_explanation: Зверніть увагу, що немає гарантії, щоб дописи були видалені, якщо вони йдуть нижче улюблених або підсилювачів після того, як вони перейшли за них. + keep_direct: Зберігати приватні повідомлення + keep_direct_hint: Не видаляти ваших особистих повідомлень + keep_media: Зберігати повідомлення з вкладеними мультимедійними файлами + keep_media_hint: Не видаляти ваших дописів, у яких є вкладення медіа + keep_pinned: Зберігати закріплені дописи + keep_pinned_hint: Не вилучати прикріплені дописи + keep_polls: Залишити опитування + keep_polls_hint: Не видаляти опитувань + keep_self_bookmark: Не зберігати дописи, які ви додали до закладок + keep_self_bookmark_hint: Не видаляти ваші власні дописи, якщо ви їх додали до закладок + keep_self_fav: Залишати обрані дописи + keep_self_fav_hint: Не видаляти ваші власні дописи, якщо ви їх додали до обраних + min_age: + '1209600': 2 тижні + '15778476': 6 місяців + '2629746': 1 місяць + '31556952': 1 рік + '5259492': 2 місяці + '63113904': 2 роки + '7889238': 3 місяці + min_age_label: Поріг давності + min_favs: Залишати дописи в обраному більше ніж + min_favs_hint: Не видаляти ваших дописів, що отримали більше вказаної кількості додавання до закладок. Залиште порожнім, щоб видаляти дописи незалежно від кількості їхнього додавання до обраних + min_reblogs: Залишати дописи передмухнуті більше ніж + min_reblogs_hint: Не видаляти ваших дописів, що були передмухнуті більш ніж вказану кількість разів. Залиште порожнім, щоб видаляти дописи, попри кількість їхніх передмухів stream_entries: pinned: Закріплений пост reblogged: передмухнув(-ла) @@ -1262,6 +1425,7 @@ uk: warning: explanation: disable: Поки ваш обліковий запис заморожений, його дані залишаються незмінними. Проте ви не зможете виконувати будь-які дії над обліковим записом, доки його не буде розблоковано. + sensitive: Ваші завантажені медіа-файли та пов'язані медіа вважатимуться делікатними. silence: Поки ваш обліковий запис обмежено, ваші дмухи на цьому сервері бачитимуть лише ті люди, які вже слідкують за вами, а вас може бути виключено з різних публічних списків. Тим не менш, інші можуть слідкувати за вами вручну. suspend: Ваш обліковий запис було призупинено, а всі ваші дмухи і вивантажені медіафайли - безповоротно видалено з цього сервера та серверів, де ви мали послідовників. get_in_touch: Ви можете відповісти на цей електронний лист, щоб зконтактувати з працівниками %{instance}. @@ -1270,11 +1434,13 @@ uk: subject: disable: Ваш обліковий запис %{acct} було заморожено none: Попередження для %{acct} + sensitive: Ваш обліковий запис %{acct} надсилав медіа позначені делікатними silence: Ваш обліковий запис %{acct} було обмежено suspend: Ваш обліковий запис %{acct} було призупинено title: disable: Обліковий запис заморожено none: Попередження + sensitive: Ваші медіа позначено делікатними silence: Ообліковий запис обмежено suspend: Обліковий запис призупинено welcome: @@ -1295,11 +1461,8 @@ uk: tips: Поради title: Ласкаво просимо, %{name}! users: - blocked_email_provider: Цей поштовий провайдер не дозволений follow_limit_reached: Не можна слідкувати більш ніж за %{limit} людей generic_access_help_html: Не вдається отримати доступ до облікового запису? Ви можете зв'язатися з %{email} для допомоги - invalid_email: Введена адреса e-mail неправильна - invalid_email_mx: Вказана електронна адреса не існує invalid_otp_token: Введено неправильний код invalid_sign_in_token: Хибний код безпеки otp_lost_help_html: Якщо ви втратили доступ до обох, ви можете отримати доступ з %{email} diff --git a/config/locales/vi.yml b/config/locales/vi.yml index e11c9f3085..01caf1ab0e 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -10,24 +10,24 @@ vi: api: API apps: Ứng dụng di động apps_platforms: Lướt Mastodon trên iOS, Android và các nền tảng khác - browse_directory: Tìm những người cùng chung sở thích + browse_directory: Bạn bè từ khắp mọi nơi trên thế giới browse_local_posts: Xem những gì đang xảy ra - browse_public_posts: Xem thử những tút công khai trên mạng Mastodon + browse_public_posts: Đọc thử những tút công khai trên Mastodon contact: Liên lạc contact_missing: Chưa thiết lập contact_unavailable: N/A discover_users: Thành viên documentation: Tài liệu - federation_hint_html: Đăng ký tài khoản %{instance} là bạn có thể giao tiếp với mọi người trên bất kỳ máy chủ Mastodon nào và còn hơn thế nữa. + federation_hint_html: Đăng ký tài khoản %{instance} là bạn có thể giao tiếp với bất cứ ai trên bất kỳ máy chủ Mastodon nào và còn hơn thế nữa. get_apps: Ứng dụng di động hosted_on: "%{domain} vận hành nhờ Mastodon" - instance_actor_flash: 'Đây là một tài khoản ảo được sử dụng để đại diện cho máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên chặn trừ khi bạn muốn chặn toàn bộ máy chủ. - -' + instance_actor_flash: Đây là một tài khoản ảo được sử dụng để đại diện cho máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên chặn trừ khi bạn muốn chặn toàn bộ máy chủ. learn_more: Tìm hiểu privacy_policy: Chính sách bảo mật + rules: Quy tắc máy chủ + rules_html: 'Bên dưới là những quy tắc của máy chủ Mastodon này, bạn phải đọc kỹ trước khi đăng ký:' see_whats_happening: Dòng thời gian - server_stats: 'Cộng đồng:' + server_stats: 'Thống kê:' source_code: Mã nguồn status_count_after: other: tút @@ -41,17 +41,17 @@ vi: rejecting_media: 'Ảnh và video từ những máy chủ sau sẽ không được xử lý, lưu trữ và hiển thị hình thu nhỏ. Bắt buộc nhấp thủ công vào tệp gốc để xem:' rejecting_media_title: Ảnh và video silenced: 'Tút từ những máy chủ sau sẽ bị ẩn trên bảng tin, trong tin nhắn và không có thông báo nào được tạo từ các tương tác của người dùng của họ, trừ khi bạn có theo dõi người dùng của họ:' - silenced_title: Những máy chủ bị ẩn + silenced_title: Những máy chủ bị hạn chế suspended: 'Những máy chủ sau sẽ không được xử lý, lưu trữ hoặc trao đổi nội dung. Mọi tương tác hoặc giao tiếp với người dùng từ các máy chủ này đều bị cấm:' suspended_title: Những máy chủ bị vô hiệu hóa - unavailable_content_html: Mastodon cho phép bạn xem nội dung và tương tác với người dùng từ bất kỳ máy chủ nào khác trong mạng liên hợp. Còn máy chủ này có những ngoại lệ riêng. + unavailable_content_html: Mastodon cho phép bạn tương tác nội dung và giao tiếp với người dùng từ bất kỳ máy chủ nào khác trong mạng liên hợp. Còn máy chủ này có những ngoại lệ riêng. user_count_after: other: người dùng user_count_before: Nhà của what_is_mastodon: Mastodon là gì? accounts: - choices_html: "%{name} vinh danh:" - endorsements_hint: Bạn có thể vinh danh những người bạn theo dõi và họ sẽ hiển thị ở giao diện web. + choices_html: "%{name} tôn vinh:" + endorsements_hint: Bạn có thể tôn vinh những người bạn theo dõi và họ sẽ hiển thị ở giao diện web. featured_tags_hint: Bạn có thể cho biết những hashtag thường dùng ở đây. follow: Theo dõi followers: @@ -61,20 +61,19 @@ vi: joined: Đã tham gia %{date} last_active: online link_verified_on: Liên kết này đã được xác thực quyền sở hữu vào %{date} - media: Bộ sưu tập - moved_html: "%{name} đã dời sang %{new_profile_link}:" + media: Media + moved_html: "%{name} đã đổi thành %{new_profile_link}:" network_hidden: Dữ liệu đã bị ẩn never_active: Chưa có nothing_here: Trống trơn! people_followed_by: Những người %{name} theo dõi people_who_follow: Những người theo dõi %{name} pin_errors: - following: Để vinh danh người nào đó, bạn phải theo dõi họ trước + following: Để tôn vinh người nào đó, bạn phải theo dõi họ trước posts: other: Tút posts_tab_heading: Tút - posts_with_replies: Tương tác - reserved_username: Tên này đã sử dụng rồi + posts_with_replies: Trả lời roles: admin: Quản trị viên bot: Tài khoản Bot @@ -87,10 +86,10 @@ vi: action: Thực hiện hành động title: Áp đặt kiểm duyệt với %{acct} account_moderation_notes: - create: Gửi tin nhắn kiểm duyệt - created_msg: Gửi tin nhắn kiểm duyệt thành công! + create: Thêm ghi chú + created_msg: Thêm ghi chú kiểm duyệt thành công! delete: Xóa bỏ - destroyed_msg: Đã ghi chú kiểm duyệt xong! + destroyed_msg: Đã xóa ghi chú kiểm duyệt! accounts: add_email_domain_block: Chặn tên miền email approve: Phê duyệt @@ -114,14 +113,16 @@ vi: demote: Xóa chức vụ destroyed_msg: Dữ liệu %{username} sẽ được lên lịch xóa ngay bây giờ disable: Tạm khóa + disable_sign_in_token_auth: Tắt xác thực bằng email disable_two_factor_authentication: Vô hiệu hóa xác thực hai bước disabled: Đã vô hiệu hóa display_name: Tên hiển thị domain: Máy chủ edit: Chỉnh sửa email: Email - email_status: Trạng thái email + email_status: Trạng thái enable: Mở lại + enable_sign_in_token_auth: Bật xác thực bằng email enabled: Đã duyệt enabled_msg: Đã kích hoạt lại tài khoản %{username} thành công followers: Người theo dõi @@ -146,7 +147,7 @@ vi: active: Hoạt động all: Toàn bộ pending: Chờ xử lý - silenced: Tạm ẩn + silenced: Hạn chế suspended: Vô hiệu hóa title: Trạng thái moderation_notes: Nhật ký kiểm duyệt @@ -181,121 +182,133 @@ vi: roles: admin: Quản trị viên moderator: Kiểm duyệt viên - staff: Đội ngũ quản lý + staff: Nhân viên user: Người dùng search: Tìm kiếm search_same_email_domain: Tra cứu email search_same_ip: Tra cứu IP + security_measures: + only_password: Chỉ mật khẩu + password_and_2fa: Mật khẩu và 2FA + password_and_sign_in_token: Mật khẩu và email sensitive: Nhạy cảm - sensitized: đánh dấu nhạy cảm + sensitized: Đánh dấu nhạy cảm shared_inbox_url: Hộp thư của máy chủ người này show: created_reports: Lượt báo cáo targeted_reports: Báo cáo bởi người khác silence: Ẩn - silenced: Đã ẩn + silenced: Hạn chế statuses: Tút subscribe: Đăng ký - suspended: Đã vô hiệu hóa + suspended: Vô hiệu hóa suspension_irreversible: Toàn bộ dữ liệu của người dùng này sẽ bị xóa hết. Bạn vẫn có thể ngừng vô hiệu hóa nhưng dữ liệu sẽ không thể phục hồi. suspension_reversible_hint_html: Mọi dữ liệu của người này sẽ bị xóa sạch vào %{date}. Trước thời hạn này, dữ liệu vẫn có thể phục hồi. Nếu bạn muốn xóa dữ liệu của người này ngay lập tức, hãy tiếp tục. time_in_queue: Đang chờ cách đây %{time} title: Tài khoản unconfirmed_email: Email chưa được xác thực undo_sensitized: Đánh dấu bình thường - undo_silenced: Bỏ ẩn + undo_silenced: Bỏ hạn chế undo_suspension: Bỏ vô hiệu hóa - unsilenced_msg: Bỏ ẩn %{username} thành công + unsilenced_msg: Bỏ hạn chế %{username} thành công unsubscribe: Hủy đăng ký unsuspended_msg: Đã kích hoạt lại %{username} thành công username: Tài khoản view_domain: Xem mô tả tài khoản này - warn: Cấm upload + warn: Cảnh cáo web: Web whitelisted: Danh sách trắng action_logs: action_types: assigned_to_self_report: Tự xử lý báo cáo change_email_user: Đổi email - confirm_user: Xác nhận người dùng - create_account_warning: Gửi cảnh cáo - create_announcement: Tạo thông báo - create_custom_emoji: Tạo Emoji mới - create_domain_allow: Cho phép máy chủ - create_domain_block: Chặn máy chủ - create_email_domain_block: Chặn tên miền email - create_ip_block: Chặn IP + confirm_user: Xác thực + create_account_warning: Cảnh cáo + create_announcement: Tạo thông báo mới + create_custom_emoji: Tạo emoji mới + create_domain_allow: Tạo cho phép máy chủ mới + create_domain_block: Tạo chặn máy chủ mới + create_email_domain_block: Tạo chặn tên miền email mới + create_ip_block: Tạo chặn IP mới + create_unavailable_domain: Tạo máy chủ không khả dụng demote_user: Xóa chức vụ destroy_announcement: Xóa thông báo - destroy_custom_emoji: Xóa Emoji - destroy_domain_allow: Bỏ máy chủ cho phép - destroy_domain_block: Bỏ chặn máy chủ - destroy_email_domain_block: Bỏ chặn email - destroy_ip_block: Bỏ chặn IP + destroy_custom_emoji: Xóa emoji + destroy_domain_allow: Xóa máy chủ cho phép + destroy_domain_block: Xóa máy chủ đã chặn + destroy_email_domain_block: Xóa tên miền email đã chặn + destroy_ip_block: Xóa IP đã chặn destroy_status: Xóa tút - disable_2fa_user: Xóa xác thực hai bước - disable_custom_emoji: Vô hiệu hóa Emoji + destroy_unavailable_domain: Xóa máy chủ không khả dụng + disable_2fa_user: Vô hiệu hóa 2FA + disable_custom_emoji: Vô hiệu hóa emoji + disable_sign_in_token_auth_user: Tắt xác thực bằng email cho người dùng disable_user: Tạm khóa người dùng - enable_custom_emoji: Cho phép Emoji - enable_user: Mở khóa - memorialize_account: Tài khoản tưởng niệm + enable_custom_emoji: Kích hoạt Emoji + enable_sign_in_token_auth_user: Bật xác thực bằng email cho người dùng + enable_user: Kích hoạt lại người dùng + memorialize_account: Đánh dấu tưởng niệm promote_user: Chỉ định chức vụ remove_avatar_user: Xóa ảnh đại diện reopen_report: Mở lại báo cáo reset_password_user: Đặt lại mật khẩu resolve_report: Xử lý báo cáo - sensitive_account: Đánh dấu nhạy cảm cho tài khoản - silence_account: Ẩn - suspend_account: Vô hiệu hóa + sensitive_account: Đánh dấu nhạy cảm + silence_account: Đánh dấu hạn chế + suspend_account: Đánh dấu vô hiệu hóa unassigned_report: Báo cáo chưa xử lý - unsensitive_account: Đánh dấu bình thường - unsilence_account: Bỏ ẩn + unsensitive_account: Bỏ nhạy cảm + unsilence_account: Bỏ hạn chế unsuspend_account: Bỏ vô hiệu hóa update_announcement: Cập nhật thông báo update_custom_emoji: Cập nhật Emoji mới update_domain_block: Cập nhật máy chủ chặn update_status: Cập nhật tút actions: - assigned_to_self_report: "%{name} tự xử lý báo cáo %{target}" - change_email_user: "%{name} đã thay đổi địa chỉ email cho %{target}" - confirm_user: "%{name} xác nhận địa chỉ email của người dùng %{target}" - create_account_warning: "%{name} đã gửi cảnh cáo %{target}" - create_announcement: "%{name} tạo thông báo mới %{target}" - create_custom_emoji: "%{name} đã tải lên biểu tượng cảm xúc mới %{target}" - create_domain_allow: "%{name} kích hoạt liên hợp với %{target}" - create_domain_block: "%{name} chặn máy chủ %{target}" - create_email_domain_block: "%{name} chặn tên miền email %{target}" - create_ip_block: "%{name} đã chặn IP %{target}" - demote_user: "%{name} đã xóa chức vụ %{target}" - destroy_announcement: "%{name} xóa thông báo %{target}" - destroy_custom_emoji: "%{name} đã xóa emoji %{target}" - destroy_domain_allow: "%{name} đã xóa tên miền %{target} khỏi danh sách trắng" - destroy_domain_block: "%{name} bỏ chặn máy chủ %{target}" - destroy_email_domain_block: "%{name} bỏ chặn tên miền email %{target}" - destroy_ip_block: "%{name} bỏ chặn IP %{target}" - destroy_status: "%{name} đã xóa tút của %{target}" - disable_2fa_user: "%{name} đã vô hiệu hóa xác thực hai bước của %{target}" - disable_custom_emoji: "%{name} đã ẩn emoji %{target}" - disable_user: "%{name} vô hiệu hóa đăng nhập %{target}" - enable_custom_emoji: "%{name} cho phép Emoji %{target}" - enable_user: "%{name} mở khóa cho người dùng %{target}" - memorialize_account: "%{name} đã biến tài khoản %{target} thành một trang tưởng niệm" - promote_user: "%{name} đã chỉ định chức vụ cho %{target}" - remove_avatar_user: "%{name} đã xóa ảnh đại diện của %{target}" - reopen_report: "%{name} mở lại báo cáo %{target}" - reset_password_user: "%{name} đặt lại mật khẩu của người dùng %{target}" - resolve_report: "%{name} đã giải quyết báo cáo %{target}" - sensitive_account: "%{name} đánh dấu nội dung của %{target} là nhạy cảm" - silence_account: "%{name} đã ẩn %{target}" - suspend_account: "%{name} đã vô hiệu hóa %{target}" - unassigned_report: "%{name} báo cáo chưa được chỉ định %{target}" - unsensitive_account: "%{name} đánh dấu nội dung của %{target} là bình thường" - unsilence_account: "%{name} đã bỏ ẩn %{target}" - unsuspend_account: "%{name} đã ngừng vô hiệu hóa %{target}" - update_announcement: "%{name} cập nhật thông báo cho %{target}" - update_custom_emoji: "%{name} đã cập nhật biểu tượng cảm xúc %{target}" - update_domain_block: "%{name} cập nhật chặn máy chủ %{target}" - update_status: "%{name} cập nhật tút của %{target}" + assigned_to_self_report_html: "%{name} tự xử lý báo cáo %{target}" + change_email_user_html: "%{name} đã thay đổi địa chỉ email cho %{target}" + confirm_user_html: "%{name} xác nhận địa chỉ email của người dùng %{target}" + create_account_warning_html: "%{name} đã gửi cảnh cáo %{target}" + create_announcement_html: "%{name} tạo thông báo mới %{target}" + create_custom_emoji_html: "%{name} đã tải lên biểu tượng cảm xúc mới %{target}" + create_domain_allow_html: "%{name} kích hoạt liên hợp với %{target}" + create_domain_block_html: "%{name} chặn máy chủ %{target}" + create_email_domain_block_html: "%{name} chặn tên miền email %{target}" + create_ip_block_html: "%{name} đã chặn IP %{target}" + create_unavailable_domain_html: "%{name} ngưng phân phối với máy chủ %{target}" + demote_user_html: "%{name} đã xóa chức vụ %{target}" + destroy_announcement_html: "%{name} xóa thông báo %{target}" + destroy_custom_emoji_html: "%{name} đã xóa emoji %{target}" + destroy_domain_allow_html: "%{name} đã ngừng liên hợp với %{target}" + destroy_domain_block_html: "%{name} bỏ chặn tên miền email %{target}" + destroy_email_domain_block_html: "%{name} bỏ chặn tên miền email %{target}" + destroy_ip_block_html: "%{name} bỏ chặn IP %{target}" + destroy_status_html: "%{name} đã xóa tút của %{target}" + destroy_unavailable_domain_html: "%{name} tiếp tục phân phối với máy chủ %{target}" + disable_2fa_user_html: "%{name} đã vô hiệu hóa xác thực hai bước của %{target}" + disable_custom_emoji_html: "%{name} đã ẩn emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} tắt xác thực email của %{target}" + disable_user_html: "%{name} vô hiệu hóa đăng nhập %{target}" + enable_custom_emoji_html: "%{name} cho phép Emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} bật xác thực email của %{target}" + enable_user_html: "%{name} mở khóa cho người dùng %{target}" + memorialize_account_html: "%{name} đã biến tài khoản %{target} thành một trang tưởng niệm" + promote_user_html: "%{name} chỉ định chức vụ cho %{target}" + remove_avatar_user_html: "%{name} đã xóa ảnh đại diện của %{target}" + reopen_report_html: "%{name} mở lại báo cáo %{target}" + reset_password_user_html: "%{name} đặt lại mật khẩu của người dùng %{target}" + resolve_report_html: "%{name} đã xử lý báo cáo %{target}" + sensitive_account_html: "%{name} đánh dấu nội dung của %{target} là nhạy cảm" + silence_account_html: "%{name} đã ẩn %{target}" + suspend_account_html: "%{name} đã vô hiệu hóa %{target}" + unassigned_report_html: "%{name} đã xử lý báo cáo %{target} chưa xử lí" + unsensitive_account_html: "%{name} đánh dấu nội dung của %{target} là bình thường" + unsilence_account_html: "%{name} đã bỏ ẩn %{target}" + unsuspend_account_html: "%{name} đã ngừng vô hiệu hóa %{target}" + update_announcement_html: "%{name} cập nhật thông báo %{target}" + update_custom_emoji_html: "%{name} đã cập nhật emoji %{target}" + update_domain_block_html: "%{name} cập nhật chặn máy chủ %{target}" + update_status_html: "%{name} cập nhật tút của %{target}" deleted_status: "(tút đã xóa)" empty: Không tìm thấy bản ghi. filter_by_action: Lọc theo hành động @@ -310,10 +323,12 @@ vi: new: create: Tạo thông báo title: Tạo thông báo mới + publish: Đăng published_msg: Truyền đi thông báo thành công! scheduled_for: Đã lên lịch %{time} scheduled_msg: Thông báo đã lên lịch! title: Thông báo + unpublish: Hủy đăng unpublished_msg: Xóa bỏ thông báo thành xong! updated_msg: Cập nhật thông báo thành công! custom_emojis: @@ -350,33 +365,9 @@ vi: updated_msg: Cập nhật thành công Emoji! upload: Tải lên dashboard: - authorized_fetch_mode: Xác thực cao cấp - backlog: công việc tồn đọng - config: Thiết lập - feature_deletions: Xóa tài khoản - feature_invites: Mời đăng ký - feature_profile_directory: Danh sách thành viên - feature_registrations: Đăng ký - feature_relay: Mạng liên hợp - feature_spam_check: Chống thư rác - feature_timeline_preview: Xem trước bảng tin - features: Tính năng - hidden_service: Liên kết với các dịch vụ ẩn - open_reports: báo cáo - pending_tags: hashtag chờ duyệt - pending_users: người dùng chờ duyệt - recent_users: Người dùng mới nhất - search: Tìm kiếm nội dung - single_user_mode: Máy chủ chỉ có 1 người software: Phần mềm space: Dung lượng lưu trữ title: Thống kê - total_users: tổng số người dùng - trends: Xu hướng - week_interactions: tương tác trong tuần này - week_users_active: hoạt động trong tuần này - week_users_new: đăng ký mới trong tuần - whitelist_mode: Giới hạn mạng liên hợp domain_allows: add_new: Cho phép liên hợp với máy chủ created_msg: Máy chủ đã được kích hoạt liên hợp thành công @@ -393,7 +384,7 @@ vi: create: Tạo chặn hint: Chặn máy chủ sẽ không ngăn việc hiển thị tút của máy chủ đó trong cơ sở dữ liệu, nhưng sẽ khiến tự động áp dụng các phương pháp kiểm duyệt cụ thể trên các tài khoản đó. severity: - desc_html: "Ẩn sẽ làm cho bài đăng của tài khoản trở nên vô hình đối với bất kỳ ai không theo dõi họ. Vô hiệu hóa sẽ xóa tất cả nội dung, phương tiện và dữ liệu khác của tài khoản. Dùng Cấm upload nếu bạn chỉ muốn cấm tải lên ảnh và video." + desc_html: "Ẩn sẽ làm cho bài đăng của tài khoản trở nên vô hình đối với bất kỳ ai không theo dõi họ. Vô hiệu hóa sẽ xóa tất cả nội dung, phương tiện và dữ liệu khác của tài khoản. Dùng Cảnh cáo nếu bạn chỉ muốn cấm tải lên ảnh và video." noop: Không hoạt động silence: Ẩn suspend: Vô hiệu hóa @@ -411,13 +402,13 @@ vi: rejecting_media: từ chối các tập tin phương tiện truyền thông rejecting_reports: từ chối báo cáo severity: - silence: bị ẩn + silence: bị hạn chế suspend: bị vô hiệu hóa show: affected_accounts: other: "%{count} tài khoản trong cơ sở dữ liệu bị ảnh hưởng" retroactive: - silence: Những tài khoản bị ẩn ở máy chủ này + silence: Bỏ hạn chế những tài khoản ở máy chủ này suspend: Ngưng vô hiệu hóa các tài khoản ở máy chủ này title: Hủy chặn máy chủ %{domain} undo: Hủy bỏ @@ -435,9 +426,33 @@ vi: create: Thêm địa chỉ title: Chặn tên miền email mới title: Tên miền email đã chặn + follow_recommendations: + description_html: "Gợi ý theo dõi là cách giúp những người dùng mới nhanh chóng tìm thấy những nội dung thú vị. Khi một người dùng chưa đủ tương tác với những người khác để hình thành các đề xuất theo dõi được cá nhân hóa, thì những tài khoản này sẽ được đề xuất. Nó bao gồm các tài khoản có số lượt tương tác gần đây cao nhất và số lượng người theo dõi cao nhất cho một ngôn ngữ nhất định trong máy chủ." + language: Theo ngôn ngữ + status: Trạng thái + suppress: Tắt gợi ý theo dõi + suppressed: Đã tắt + title: Gợi ý theo dõi + unsuppress: Mở lại gợi ý theo dõi instances: + back_to_all: Toàn bộ + back_to_limited: Hạn chế + back_to_warning: Cảnh báo by_domain: Máy chủ + delivery: + all: Toàn bộ + clear: Xóa phân phối lỗi + restart: Khởi động lại phân phối + stop: Ngưng phân phối + title: Phân phối + unavailable: Không khả dụng + unavailable_message: Không thể phân phối + warning: Cảnh báo + warning_message: + other: Phân phối thất bại %{count} ngày delivery_available: Cho phép liên kết + delivery_error_days: Ngày lỗi phân phối + delivery_error_hint: Nếu không thể phân phối sau %{count} ngày, nó sẽ tự dộng đánh dấu là không thể phân phối. empty: Không có máy chủ nào. known_accounts: other: "%{count} tài khoản đã biết" @@ -452,7 +467,7 @@ vi: total_followed_by_them: Được họ theo dõi total_followed_by_us: Được quản trị viên theo dõi total_reported: Toàn bộ báo cáo - total_storage: Ảnh và video + total_storage: Media invites: deactivate_all: Vô hiệu hóa tất cả filter: @@ -497,8 +512,8 @@ vi: status: Trạng thái hiện tại title: Mạng liên hợp report_notes: - created_msg: Ghi chú kiểm duyệt đã tạo xong! - destroyed_msg: Đã xóa báo cáo kiểm duyệt! + created_msg: Đã thêm ghi chú kiểm duyệt! + destroyed_msg: Đã xóa ghi chú kiểm duyệt! reports: account: notes: @@ -515,11 +530,11 @@ vi: created_at: Báo cáo lúc forwarded: Chuyển tiếp forwarded_to: Chuyển tiếp tới %{domain} - mark_as_resolved: Đánh dấu là đã giải quyết - mark_as_unresolved: Đánh dấu là chưa giải quyết + mark_as_resolved: Đã xử lý xong! + mark_as_unresolved: Mở lại notes: - create: Bổ sung ghi chú - create_and_resolve: Xử lý kiểm duyệt + create: Ghi chú + create_and_resolve: Xử lý create_and_unresolve: Mở lại kèm ghi chú mới delete: Xóa bỏ placeholder: Mô tả vi phạm của người này, mức độ xử lý và những cập nhật liên quan khác... @@ -528,18 +543,26 @@ vi: reported_account: Tài khoản bị báo cáo reported_by: Báo cáo bởi resolved: Đã xử lý xong - resolved_msg: Đã giải quyết báo cáo xong! + resolved_msg: Đã xử lý báo cáo xong! status: Trạng thái + target_origin: Nguồn đã báo cáo người dùng title: Báo cáo unassign: Bỏ qua unresolved: Chờ xử lý updated_at: Cập nhật lúc + rules: + add_new: Thêm quy tắc + delete: Xóa bỏ + description_html: Mặc dù được yêu cầu chấp nhận điều khoản dịch vụ khi đăng ký, nhưng người dùng thường không đọc cho đến khi vấn đề gì đó xảy ra. Hãy làm điều này rõ ràng hơn bằng cách liệt kê quy tắc máy chủ theo gạch đầu dòng. Cố gắng viết ngắn và đơn giản, nhưng đừng tách ra quá nhiều mục. + edit: Sửa quy tắc + empty: Chưa có quy tắc máy chủ. + title: Quy tắc máy chủ settings: activity_api_enabled: desc_html: Thu thập số lượng tút được đăng, người dùng hoạt động và người dùng đăng ký mới hàng tuần - title: Công khai số liệu thống kê về hoạt động người dùng + title: Công khai số liệu thống kê về hoạt động người dùng trong API bootstrap_timeline_accounts: - desc_html: Tách tên người dùng bằng dấu phẩy. Chỉ có hiệu lực với các tài khoản công khai thuộc máy chủ. Mặc định khi trống là tất cả quản trị viên. + desc_html: Tách tên người dùng bằng dấu phẩy. Những người dùng này sẽ xuất hiện trong mục gợi ý theo dõi title: Gợi ý theo dõi cho người dùng mới contact_information: email: Email liên hệ @@ -557,9 +580,6 @@ vi: users: Để đăng nhập người dùng cục bộ domain_blocks_rationale: title: Hiển thị lý do - enable_bootstrap_timeline_accounts: - desc_html: Thiết lập người mới đăng ký sẽ tự động theo dõi những tài khoản cho trước nhằm tránh việc bảng tin trống - title: Gợi ý theo dõi cho người dùng mới hero: desc_html: Hiển thị trên trang chủ. Kích cỡ tối thiểu 600x100px. Mặc định dùng hình thu nhỏ của máy chủ title: Hình ảnh giới thiệu @@ -568,7 +588,7 @@ vi: title: Logo máy chủ peers_api_enabled: desc_html: Tên miền mà máy chủ này đã kết giao trong mạng liên hợp - title: Danh sách công khai các máy chủ được phát hiện + title: Công khai danh sách những máy chủ đã khám phá trong API preview_sensitive_media: desc_html: Liên kết xem trước trên các trang web khác sẽ hiển thị hình thu nhỏ ngay cả khi phương tiện được đánh dấu là nhạy cảm title: Hiển thị phương tiện nhạy cảm trong bản xem trước OpenGraph @@ -613,9 +633,6 @@ vi: desc_html: Bạn có thể viết điều khoản dịch vụ, quyền riêng tư hoặc các vấn đề pháp lý khác. Dùng thẻ HTML title: Điều khoản dịch vụ tùy chỉnh site_title: Tên máy chủ - spam_check_enabled: - desc_html: Mastodon có thể tự động báo cáo các tài khoản gửi tin nhắn không mong muốn lặp đi lặp lại. Có thể có dương tính giả. - title: Tự động chống thư rác thumbnail: desc_html: Bản xem trước thông qua OpenGraph và API. Khuyến nghị 1200x630px title: Hình thu nhỏ của máy chủ @@ -628,7 +645,7 @@ vi: title: Cho phép hashtags theo xu hướng mà không cần xem xét trước trends: desc_html: Hiển thị công khai các hashtag được xem xét trước đây hiện đang là xu hướng - title: Xu hướng hashtags + title: Hashtag xu hướng site_uploads: delete: Xóa tập tin đã tải lên destroyed_msg: Đã xóa tập tin tải lên thành công! @@ -641,18 +658,23 @@ vi: deleted: Đã xóa failed_to_execute: Không thể thực thi media: - title: Bộ sưu tập + title: Media no_media: Toàn bộ no_status_selected: Bạn chưa chọn bất kỳ tút nào title: Toàn bộ tút - with_media: Có ảnh hoặc video + with_media: Có media + system_checks: + database_schema_check: + message_html: Có cơ sở dữ liệu đang chờ xử lý. Xin khởi động nó để ứng dụng có thể hoạt động một cách ổn định nhất + rules_check: + action: Sửa quy tắc máy chủ + message_html: Bạn chưa cập nhật quy tắc máy chủ. + sidekiq_process_check: + message_html: Sidekiq không hoạt động khi truy vấn %{value}. Hãy kiểm tra lại cấu hình Sidekiq tags: accounts_today: Sử dụng hôm nay accounts_week: Sử dụng trong tuần breakdown: Thống kê số lượt dùng hôm nay - context: Bối cảnh - directory: Có trên tiểu sử - in_directory: "%{count} có trên tiểu sử" last_active: Hôm nay most_popular: Phổ biến nhất most_recent: Gần đây @@ -668,8 +690,9 @@ vi: warning_presets: add_new: Thêm mới delete: Xóa bỏ - edit_preset: Chỉnh sửa cảnh báo cài sẵn - title: Quản lý cảnh báo cài sẵn + edit_preset: Sửa mẫu có sẵn + empty: Bạn chưa thêm mẫu có sẵn nào cả. + title: Quản lý mẫu cảnh cáo admin_mailer: new_pending_account: body: Thông tin chi tiết của tài khoản mới ở phía dưới. Bạn có thể phê duyệt hoặc từ chối người này. @@ -684,7 +707,7 @@ vi: aliases: add_new: Kết nối tài khoản created_msg: Tạo thành công một tên hiển thị mới. Bây giờ bạn có thể bắt đầu di chuyển từ tài khoản cũ. - deleted_msg: Xóa thành công tên hiển thị. Chuyển từ tài khoản này sang tài khoản này sẽ không còn có thể. + deleted_msg: Xóa thành công kết nối tài khoản. Bạn sẽ không thể chuyển từ tài khoản đó sang tài khoản này được. empty: Bạn không có tài khoản cũ nào. hint_html: Nếu bạn muốn chuyển từ máy chủ khác sang máy chủ này, bắt buộc bạn phải tạo tên người dùng mới thì mới có thể tiến hành chuyển được người theo dõi. Hành động này không ảnh hưởng gì và có thể đảo ngược. Việc di chuyển tài khoản được bắt đầu từ tài khoản cũ. remove: Bỏ liên kết bí danh @@ -696,7 +719,7 @@ vi: discovery: Khám phá localization: body: Mastodon Tiếng Việt được dịch bởi Hồ Nhất Duy. - guide_link: https://mas.to/@duy + guide_link: https://crowdin.com/project/mastodon guide_link_text: Đây là trang cá nhân của anh ấy. sensitive_content: Nội dung nhạy cảm toot_layout: Tút @@ -765,11 +788,11 @@ vi: error: Rất tiếc, đã xảy ra lỗi khi tìm kiếm tài khoản từ nơi khác follow: Theo dõi follow_request: Bạn đã gửi yêu cầu theo dõi tới - following: Chúc mừng! Bạn đã trở thành người theo dõi của + following: Chúc mừng! Bạn đã trở thành người theo dõi post_follow: - close: Bạn có muốn đóng cửa sổ này? - return: Hiện trên trang cá nhân - web: Truy cập web + close: Bạn có thể đóng cửa sổ này rồi. + return: Xem trang cá nhân + web: Mở trong Mastodon title: Theo dõi %{acct} challenge: confirm: Tiếp tục @@ -786,17 +809,17 @@ vi: with_month_name: "%B %d, %Y" datetime: distance_in_words: - about_x_hours: "%{count}h" - about_x_months: "%{count}th" - about_x_years: "%{count}y" - almost_x_years: "%{count}y" + about_x_hours: "%{count} giờ" + about_x_months: "%{count} tháng" + about_x_years: "%{count} năm" + almost_x_years: "%{count} năm" half_a_minute: Vừa xong - less_than_x_minutes: "%{count}p" + less_than_x_minutes: "%{count} phút" less_than_x_seconds: Vừa xong - over_x_years: "%{count}y" - x_days: "%{count}d" - x_minutes: "%{count}p" - x_months: "%{count}th" + over_x_years: "%{count} năm" + x_days: "%{count} ngày" + x_minutes: "%{count} phút" + x_months: "%{count} tháng" x_seconds: "%{count}s" deletes: challenge_not_passed: Thông tin bạn nhập không chính xác @@ -812,12 +835,12 @@ vi: email_contact_html: Nếu vẫn không nhận được, bạn có thể liên hệ %{email} để được giúp đỡ email_reconfirmation_html: Nếu bạn không nhận được email xác nhận, hãy thử yêu cầu lại irreversible: Bạn sẽ không thể khôi phục hoặc kích hoạt lại tài khoản của mình - more_details_html: Để biết thêm chi tiết, xem chính sách bảo mật. + more_details_html: Đọc chính sách bảo mật để biết thêm chi tiết. username_available: Tên người dùng của bạn sẽ có thể đăng ký lại username_unavailable: Tên người dùng của bạn sẽ không thể đăng ký mới directories: directory: Khám phá - explanation: Tìm và theo dõi những người cùng sở thích + explanation: Tìm những người chung sở thích explore_mastodon: Thành viên %{title} domain_validator: invalid_domain: không phải là một tên miền hợp lệ @@ -848,7 +871,7 @@ vi: request: Tải về dữ liệu của bạn size: Dung lượng blocks: Người bạn chặn - bookmarks: Đã lưu + bookmarks: Tút đã lưu csv: CSV domain_blocks: Máy chủ bạn chặn lists: Danh sách @@ -858,7 +881,7 @@ vi: add_new: Thêm mới errors: limit: Bạn đã đạt tới số lượng hashtag tối đa - hint_html: "Hashtags thường dùng là gì? Chúng là những hashtag sẽ được hiển thị nổi bật trên trang cá nhân của bạn, cho phép mọi người tìm kiếm các bài đăng công khai của bạn có chứa các hashtag đó. Tính năng này có thể dùng để đánh dấu chuỗi tác phẩm sáng tạo hoặc dự án dài hạn." + hint_html: "Hashtag thường dùng là gì? Chúng là những hashtag sẽ được hiển thị nổi bật trên trang cá nhân của bạn, cho phép mọi người tìm kiếm các bài đăng công khai của bạn có chứa các hashtag đó. Tính năng này có thể dùng để đánh dấu chuỗi tác phẩm sáng tạo hoặc dự án dài hạn." filters: contexts: account: Trang cá nhân @@ -926,7 +949,7 @@ vi: success: Dữ liệu của bạn đã được tải lên thành công và hiện đang xử lý types: blocking: Danh sách chặn - bookmarks: Đã lưu + bookmarks: Tút đã lưu domain_blocking: Danh sách máy chủ đã chặn following: Danh sách người theo dõi muting: Danh sách người đã ẩn @@ -956,6 +979,17 @@ vi: lists: errors: limit: Bạn đã đạt đến số lượng danh sách tối đa + login_activities: + authentication_methods: + otp: xác thực 2 bước + password: mật khẩu + sign_in_token: mã an toàn email + webauthn: khóa bảo mật + description_html: Nếu có lần đăng nhập đáng ngờ, hãy đổi ngay mật khẩu và bật xác thực hai bước. + empty: Không có lịch sử đăng nhập + failed_sign_in_html: Đăng nhập thất bại bằng %{method} từ %{ip} (%{browser}) + successful_sign_in_html: Đăng nhập thành công bằng %{method} từ %{ip} (%{browser}) + title: Lịch sử đăng nhập media_attachments: validations: images_and_video: Không thể đính kèm video vào tút đã chứa hình ảnh @@ -967,14 +1001,14 @@ vi: cancel_explanation: Hủy chuyển hướng sẽ kích hoạt lại tài khoản hiện tại của bạn, nhưng sẽ không chuyển được những người theo dõi ở tài khoản mới. cancelled_msg: Đã hủy chuyển hướng xong. errors: - already_moved: là tài khoản bạn đã dời sang rồi - missing_also_known_as: không phải tham chiếu của tài khoản này + already_moved: là tài khoản bạn đã chuyển sang rồi + missing_also_known_as: chưa kết nối với tài khoản này move_to_self: không thể là tài khoản hiện tại not_found: không thể tìm thấy on_cooldown: Bạn đang trong thời gian chiêu hồi followers_count: Số người theo dõi tại thời điểm chuyển hướng incoming_migrations: Chuyển từ một tài khoản khác - incoming_migrations_html: Để chuyển từ tài khoản khác sang tài khoản này, trước tiên bạn cần tạo tham chiếu tài khoản. + incoming_migrations_html: Để chuyển từ tài khoản khác sang tài khoản này, trước tiên bạn cần kết nối tài khoản. moved_msg: Tài khoản của bạn hiện đang chuyển hướng đến %{acct} và những người theo dõi bạn cũng sẽ được chuyển đi. not_redirecting: Tài khoản của bạn hiện không chuyển hướng đến bất kỳ tài khoản nào khác. on_cooldown: Bạn vừa mới chuyển tài khoản của bạn đi nơi khác. Chỉ có thể sử dụng tiếp tính năng này sau %{count} ngày. @@ -1026,10 +1060,14 @@ vi: body: 'Bạn vừa được nhắc đến bởi %{name} trong:' subject: Bạn vừa được nhắc đến bởi %{name} title: Lượt nhắc mới + poll: + subject: Cuộc bình chọn của %{name} kết thúc reblog: body: Tút của bạn vừa được chia sẻ bởi %{name} subject: "%{name} vừa chia sẻ tút của bạn" title: Lượt chia sẻ mới + status: + subject: Bài đăng mới từ %{name} notifications: email_events: Email email_events_hint: 'Chọn những hoạt động sẽ gửi thông báo qua email:' @@ -1071,15 +1109,15 @@ vi: too_many_options: tối đa %{max} lựa chọn preferences: other: Khác - posting_defaults: Trạng thái tút mặc định - public_timelines: Bảng tin công khai + posting_defaults: Mặc định cho tút + public_timelines: Bảng tin máy chủ reactions: errors: limit_reached: Bạn không nên thao tác liên tục unrecognized_emoji: không phải là emoji relationships: - activity: Hoạt động tài khoản - dormant: Chưa tương tác + activity: Tương tác + dormant: Chưa follow_selected_followers: Theo dõi những người đã chọn followers: Người theo dõi following: Đang theo dõi @@ -1089,7 +1127,7 @@ vi: moved: Đã xóa mutual: Đồng thời primary: Bình thường - relationship: Mối quan hệ + relationship: Quan hệ remove_selected_domains: Xóa hết người theo dõi từ các máy chủ đã chọn remove_selected_followers: Xóa những người theo dõi đã chọn remove_selected_follows: Ngưng theo dõi những người đã chọn @@ -1112,7 +1150,7 @@ vi: proceed: Tiếp tục trả lời prompt: Bạn có muốn trả lời tút này? scheduled_statuses: - over_daily_limit: Bạn đã vượt quá giới hạn của các tút được lên lịch %{limit} cho ngày hôm đó + over_daily_limit: Bạn đã vượt qua giới hạn được lên lịch đăng tút %{limit} hôm nay over_total_limit: Bạn đã vượt quá giới hạn %{limit} của các tút được lên lịch too_soon: Ngày lên lịch phải trong tương lai sessions: @@ -1122,7 +1160,7 @@ vi: alipay: Alipay blackberry: Blackberry chrome: Chrome - edge: Microsoft Edge + edge: Edge electron: Electron firefox: Firefox generic: Trình duyệt khác @@ -1144,7 +1182,7 @@ vi: adobe_air: Adobe Air android: Android blackberry: Blackberry - chrome_os: ChromeOS + chrome_os: Chrome OS firefox_os: Hệ điều hành Firefox ios: iOS linux: Linux @@ -1156,6 +1194,7 @@ vi: revoke: Gỡ revoke_success: Gỡ phiên thành công title: Phiên + view_authentication_history: Xem lại lịch sử đăng nhập tài khoản của bạn settings: account: Bảo mật account_settings: Cài đặt tài khoản @@ -1165,9 +1204,9 @@ vi: back: Quay lại Mastodon delete: Xóa tài khoản development: Lập trình - edit_profile: Cá nhân hóa + edit_profile: Trang cá nhân export: Xuất dữ liệu - featured_tags: Hashtags thường dùng + featured_tags: Hashtag thường dùng identity_proofs: Bằng chứng nhận dạng import: Nhập dữ liệu import_and_export: Dữ liệu @@ -1175,11 +1214,10 @@ vi: notifications: Thông báo preferences: Chung profile: Trang cá nhân - relationships: Lượt theo dõi + relationships: Quan hệ + statuses_cleanup: Tự động xóa tút cũ two_factor_authentication: Xác thực hai bước webauthn_authentication: Khóa bảo mật - spam_check: - spam_detected: Đây là một báo cáo tự động. Đã phát hiện thư rác. statuses: attached: audio: @@ -1196,7 +1234,7 @@ vi: errors: in_reply_not_found: Bạn đang trả lời một tút không còn tồn tại. language_detection: Tự động phát hiện ngôn ngữ - open_in_web: Xem trong Mastodon + open_in_web: Xem trong web over_character_limit: vượt quá giới hạn %{max} ký tự pin_errors: limit: Bạn đã ghim quá số lượng tút cho phép @@ -1205,23 +1243,58 @@ vi: reblog: Không thể ghim chia sẻ poll: total_people: - other: "%{count} người" + other: "%{count} người bình chọn" total_votes: - other: "%{count} người" + other: "%{count} người bình chọn" vote: Bình chọn show_more: Đọc thêm show_newer: Mới hơn show_older: Cũ hơn - show_thread: Toàn bộ chủ đề - sign_in_to_participate: Đăng nhập để trả lời chủ đề này + show_thread: Toàn chủ đề + sign_in_to_participate: Đăng nhập để trả lời tút này title: '%{name}: "%{quote}"' visibilities: - private: Người theo dõi - private_long: Chỉ người theo dõi mới xem được tút + direct: Nhắn tin + private: Riêng tư + private_long: Chỉ người theo dõi mới được xem public: Công khai public_long: Ai cũng có thể thấy - unlisted: Riêng tư + unlisted: Hạn chế unlisted_long: Không hiện trên bảng tin máy chủ + statuses_cleanup: + enabled: Tự động xóa những tút cũ + enabled_hint: Tự động xóa các tút của bạn khi chúng tới thời điểm nhất định, trừ những trường hợp ngoại lệ bên dưới + exceptions: Ngoại trừ + explanation: Việc xóa tút rất tốn thời gian vì tút của bạn sẽ tăng dần theo năm tháng. Bởi lý do này, bạn nên xóa những tút cũ khi chúng đã đạt tới thời điểm nhất định. + ignore_favs: Bỏ qua số luợt thích + ignore_reblogs: Bỏ qua số lượt chia sẻ + interaction_exceptions: Ngoại lệ dựa trên tương tác + interaction_exceptions_explanation: Lưu ý rằng không có gì đảm bảo rằng các bài đăng sẽ bị xóa nếu chúng xuống dưới ngưỡng mức yêu thích hoặc chia sẻ sau khi đã từng vượt qua. + keep_direct: Giữ lại tin nhắn + keep_direct_hint: Không xóa tin nhắn của bạn + keep_media: Giữ lại những tút có đính kèm media + keep_media_hint: Không xóa những tút có đính kèm media của bạn + keep_pinned: Giữ lại những tút đã ghim + keep_pinned_hint: Không xóa những tút đã ghim của bạn + keep_polls: Giữ lại những cuộc bình chọn + keep_polls_hint: Không xóa những tút dạng bình chọn + keep_self_bookmark: Giữ lại những tút đã lưu + keep_self_bookmark_hint: Không xóa những tút của bạn nếu bạn có lưu chúng + keep_self_fav: Giữ lại những tút yêu thích + keep_self_fav_hint: Không xóa những tút của bạn nếu bạn có thích chúng + min_age: + '1209600': 2 tuần + '15778476': 6 tháng + '2629746': 1 tháng + '31556952': 1 năm + '5259492': 2 tháng + '63113904': 2 năm + '7889238': 3 tháng + min_age_label: Thời điểm + min_favs: Giữ những tút yêu thích lâu hơn + min_favs_hint: Những tút có lượt thích nhiều hơn số này sẽ không bị xóa. Để trống nếu bạn muốn xóa hết + min_reblogs: Giữ những tút đã chia sẻ lâu hơn + min_reblogs_hint: Những tút có lượt chia sẻ nhiều hơn số này sẽ không bị xóa. Để trống nếu bạn muốn xóa hết stream_entries: pinned: Tút được ghim reblogged: chia sẻ @@ -1234,9 +1307,9 @@ vi:

      Chúng tôi thu thập những thông tin gì?

        -
      • Thông tin tài khoản cơ bản: Nếu bạn đăng ký trên máy chủ này, bạn phải cung cấp tên người dùng, địa chỉ email và mật khẩu. Bạn cũng có thể tùy chọn bổ sung tên hiển thị, mô tả, ảnh đại diện, ảnh bìa. Tên người dùng, tên hiển thị, mô tả, ảnh hồ sơ và ảnh bìa luôn được hiển thị công khai.
      • +
      • Thông tin tài khoản cơ bản: Nếu bạn đăng ký trên máy chủ này, bạn phải cung cấp tên người dùng, địa chỉ email và mật khẩu. Bạn cũng có thể tùy chọn bổ sung tên hiển thị, tiểu sử, ảnh đại diện, ảnh bìa. Tên người dùng, tên hiển thị, tiểu sử, ảnh hồ sơ và ảnh bìa luôn được hiển thị công khai.
      • Tút, lượt theo dõi và nội dung công khai khác: Danh sách những người bạn theo dõi được liệt kê công khai, cũng tương tự như danh sách những người theo dõi bạn. Khi bạn đăng tút, ngày giờ và ứng dụng sử dụng được lưu trữ. Tút có thể chứa tệp đính kèm hình ảnh và video. Tút công khai và tút mở sẽ hiển thị công khai. Khi bạn đăng một tút trên trang cá nhân của bạn, đó là nội dung công khai. Tút của bạn sẽ gửi đến những người theo dõi của bạn, đồng nghĩa với việc sẽ có các bản sao được lưu trữ ở máy chủ của họ. Khi bạn xóa bài viết, bản sao từ những người theo dõi của bạn cũng bị xóa theo. Hành động chia sẻ hoặc thích một tút luôn luôn là công khai.
      • -
      • Tin nhắn và tút dành cho người theo dõi: Tất cả tút được lưu trữ và xử lý trên máy chủ. Các tút dành cho người theo dõi được gửi đến những người theo dõi và những người được gắn thẻ trong tút. Còn các tin nhắn chỉ được gửi đến cho người nhận. Điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và có các bản sao được lưu trữ ở đó. Chúng tôi đề nghị chỉ cho những người được ủy quyền truy cập vào đó, nhưng không phải máy chủ nào cũng làm như vậy. Do đó, điều quan trọng là phải xem xét kỹ máy chủ của người theo dõi của bạn. Bạn có thể thiết lập tự mình phê duyệt và từ chối người theo dõi mới trong cài đặt. Xin lưu ý rằng quản trị viên máy chủ của bạn và bất kỳ máy chủ của người nhận nào cũng có thể xem các tin nhắn. Người nhận tin nhắn có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. Không nên chia sẻ bất kỳ thông tin rủi ro nào trên Mastodon.
      • +
      • Tin nhắn và tút dành cho người theo dõi: Toàn bộ tút được lưu trữ và xử lý trên máy chủ. Các tút dành cho người theo dõi được gửi đến những người theo dõi và những người được gắn thẻ trong tút. Còn các tin nhắn chỉ được gửi đến cho người nhận. Điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và có các bản sao được lưu trữ ở đó. Chúng tôi đề nghị chỉ cho những người được ủy quyền truy cập vào đó, nhưng không phải máy chủ nào cũng làm như vậy. Do đó, điều quan trọng là phải xem xét kỹ máy chủ của người theo dõi của bạn. Bạn có thể thiết lập tự mình phê duyệt và từ chối người theo dõi mới trong cài đặt. Xin lưu ý rằng quản trị viên máy chủ của bạn và bất kỳ máy chủ của người nhận nào cũng có thể xem các tin nhắn. Người nhận tin nhắn có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. Không nên chia sẻ bất kỳ thông tin rủi ro nào trên Mastodon.
      • Địa chỉ IP và siêu dữ liệu khác: Khi bạn đăng nhập, chúng tôi ghi nhớ địa chỉ IP đăng nhập cũng như tên trình duyệt của bạn. Tất cả các phiên đăng nhập sẽ để bạn xem xét và hủy bỏ trong phần cài đặt. Địa chỉ IP sử dụng được lưu trữ tối đa 12 tháng. Chúng tôi cũng có thể giữ lại nhật ký máy chủ bao gồm địa chỉ IP của những lượt đăng ký tài khoản trên máy chủ của chúng tôi.

      Chúng tôi sử dụng thông tin của bạn để làm gì?

      @@ -1256,12 +1329,12 @@ vi:
    • Giữ lại nhật ký máy chủ chứa địa chỉ IP của tất cả các yêu cầu đến máy chủ này, cho đến khi các nhật ký đó bị xóa đi trong vòng 90 ngày.
    • Giữ lại các địa chỉ IP được liên kết với người dùng đã đăng ký trong vòng 12 tháng.
    -

    Bạn có thể tải xuống một bản sao lưu trữ nội dung của bạn, bao gồm các tút, tệp đính kèm phương tiện, ảnh đại diện và ảnh bìa.

    +

    Bạn có thể tải xuống một bản sao lưu trữ nội dung của bạn, bao gồm các tút, tập tin đính kèm, ảnh đại diện và ảnh bìa.

    Bạn có thể xóa tài khoản của mình bất cứ lúc nào.


    Chúng tôi có sử dụng cookie không?

    Có. Cookie là các tệp nhỏ mà một trang web hoặc nhà cung cấp dịch vụ internet chuyển vào ổ cứng máy tính của bạn thông qua trình duyệt Web (nếu bạn cho phép). Những cookie này cho phép trang web nhận ra trình duyệt của bạn và nếu bạn có tài khoản đã đăng ký, nó sẽ liên kết với tài khoản đã đăng ký của bạn.

    -

    Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tương lai.

    +

    Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tiếp theo.


    Chúng tôi có tiết lộ bất cứ thông tin nào ra ngoài không?

    Chúng tôi không bán, trao đổi hoặc chuyển nhượng thông tin nhận dạng cá nhân của bạn cho bên thứ ba. Trừ khi bên thứ ba đó đang hỗ trợ chúng tôi điều hành Mastodon, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn nếu việc công bố là để tuân thủ luật pháp, thực thi quy tắc máy chủ của chúng tôi hoặc bảo vệ quyền, tài sản hợp pháp hoặc sự an toàn của chúng tôi hoặc bất kỳ ai.

    @@ -1269,15 +1342,15 @@ vi:

    Nếu bạn cho phép một ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin trang cá nhân, danh sách người theo dõi, danh sách của bạn, tất cả tút và lượt thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn.


    Cấm trẻ em sử dụng

    -

    Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 16 tuổi. Nếu bạn dưới 16 tuổi, theo yêu cầu của GDPR (Quy định bảo vệ dữ liệu chung) thì không được sử dụng trang web này.

    -

    Nếu máy chủ này ở Hoa Kỳ: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 13 tuổi. Nếu bạn dưới 13 tuổi, theo yêu cầu của COPPA (Đạo luật bảo vệ quyền riêng tư trực tuyến của trẻ em) thì không được sử dụng trang web này.

    +

    Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều dành cho những người trên 16 tuổi. Nếu bạn dưới 16 tuổi, xét theo GDPR (Quy định bảo vệ dữ liệu chung) thì không được sử dụng trang web này.

    +

    Nếu máy chủ này ở Hoa Kỳ: Trang web của chúng tôi, các sản phẩm và dịch vụ đều dành cho những người trên 13 tuổi. Nếu bạn dưới 13 tuổi, xét theo COPPA (Đạo luật bảo vệ quyền riêng tư trực tuyến của trẻ em) thì không được sử dụng trang web này.

    Quy định pháp luật có thể khác biệt nếu máy chủ này ở khu vực địa lý khác.


    Cập nhật thay đổi

    Nếu có thay đổi chính sách bảo mật, chúng tôi sẽ đăng những thay đổi đó ở mục này.

    Tài liệu này phát hành dưới hình thức CC-BY-SA và được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018.

    Chỉnh sửa và hoàn thiện từ Discourse.

    - title: "%{instance} Điều khoản dịch vụ và chính sách bảo mật" + title: Quy tắc của %{instance} themes: contrast: Mastodon (Độ tương phản cao) default: Mastodon (Tối) @@ -1325,13 +1398,13 @@ vi: disable: Tài khoản %{acct} của bạn đã bị vô hiệu hóa none: Cảnh báo cho %{acct} sensitive: Ảnh và video tải lên của %{acct} sẽ bị đánh dấu là nhạy cảm - silence: Tài khoản %{acct} của bạn đã bị tạm ẩn + silence: Tài khoản %{acct} của bạn đã bị hạn chế suspend: Tài khoản %{acct} của bạn đã bị vô hiệu hóa title: disable: Tài khoản bị đóng băng none: Cảnh báo sensitive: Ảnh và video của bạn sẽ bị đánh dấu nhạy cảm - silence: Tài khoản bị tạm ẩn + silence: Tài khoản bị hạn chế suspend: Toài khoản bị vô hiệu hóa welcome: edit_profile_action: Cài đặt trang cá nhân @@ -1340,7 +1413,7 @@ vi: final_action: Viết tút mới final_step: 'Viết tút mới! Ngay cả khi chưa có người theo dõi, người khác vẫn có thể xem tút công khai của bạn trên bảng tin máy chủ và trong hashtag. Hãy giới thiệu bản thân với hashtag #introduction.' full_handle: Tên đầy đủ của bạn - full_handle_hint: Đây cũng là địa chỉ được dùng để tương tác với tất cả mọi người. + full_handle_hint: Đây cũng là địa chỉ được dùng để giao tiếp với tất cả mọi người. review_preferences_action: Tùy chỉnh giao diện review_preferences_step: Tùy chỉnh mọi thứ! Chẳng hạn như chọn loại email nào bạn muốn nhận hoặc trạng thái đăng tút mặc định mà bạn muốn dùng. Hãy tắt tự động phát GIF nếu bạn dễ bị chóng mặt. subject: Chào mừng đến với Mastodon @@ -1351,11 +1424,8 @@ vi: tips: Mẹo title: Xin chào %{name}! users: - blocked_email_provider: Dịch vụ email này đã bị cấm follow_limit_reached: Bạn chỉ có thể theo dõi tối đa %{limit} người generic_access_help_html: Gặp trục trặc với tài khoản? Liên hệ %{email} để được trợ giúp - invalid_email: Địa chỉ email không hợp lệ - invalid_email_mx: Địa chỉ email không tồn tại invalid_otp_token: Mã xác thực hai bước không hợp lệ invalid_sign_in_token: Mã an toàn không hợp lệ otp_lost_help_html: Nếu bạn mất quyền truy cập vào cả hai, bạn có thể đăng nhập bằng %{email} @@ -1363,7 +1433,7 @@ vi: signed_in_as: 'Đăng nhập với tư cách là:' suspicious_sign_in_confirmation: Đây là lần đầu tiên bạn đăng nhập trên thiết bị này. Vì vậy, chúng tôi sẽ gửi một mã an toàn đến email của bạn để xác thực danh tính. verification: - explanation_html: 'Bạn có thể xác minh mình là chủ sở hữu của các trang web ở đầu trang cá nhân của bạn. Để xác minh, trang web phải chèn mã rel="me". Nội dung văn bản của liên kết không quan trọng. Đây là một ví dụ:' + explanation_html: 'Bạn có thể xác minh mình là chủ sở hữu của các trang web ở đầu trang cá nhân của bạn. Để xác minh, trang web phải chèn mã rel="me". Văn bản thay thế cho liên kết không quan trọng. Đây là một ví dụ:' verification: Xác minh webauthn_credentials: add: Thêm khóa bảo mật mới @@ -1371,7 +1441,7 @@ vi: error: Có vấn đề khi thêm khóa bảo mật. Xin thử lại. success: Đã thêm khóa bảo mật mới thành công. delete: Xóa - delete_confirmation: Bạn có chắc chắn muốn xóa khóa bảo mật này? + delete_confirmation: Bạn thật sự muốn xóa khóa bảo mật này? description_html: Nếu bạn kích hoạt khóa bảo mật, bạn sẽ cần dùng một trong những khóa bảo mật đó mỗi khi đăng nhập. destroy: error: Có vấn đề khi xóa khóa bảo mật. Xin thử lại. diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml index 0123836ecf..5893d0c8a7 100644 --- a/config/locales/zgh.yml +++ b/config/locales/zgh.yml @@ -2,7 +2,6 @@ zgh: about: about_this: ⵖⴼ - api: API contact: ⴰⵎⵢⴰⵡⴰⴹ learn_more: ⵙⵙⵏ ⵓⴳⴳⴰⵔ status_count_after: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 25e6869557..5fefb96f9e 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -4,7 +4,7 @@ zh-CN: about_hashtag_html: 这里展示的是带有话题标签 #%{hashtag} 的公开嘟文。如果你想与他们互动,你需要在任意一个 Mastodon 站点或与其兼容的网站上拥有一个帐户。 about_mastodon_html: Mastodon 是一个建立在开放式网络协议和自由、开源软件之上的社交网络,有着类似于电子邮件的分布式设计。 about_this: 关于本站 - active_count_after: 活跃 + active_count_after: 活跃用户 active_footnote: 每月活跃用户 administered_by: 本站管理员: api: API @@ -18,17 +18,17 @@ zh-CN: contact_unavailable: 未公开 discover_users: 发现用户 documentation: 文档 - federation_hint_html: 在%{instance} 上拥有账号后,你可以关注任何 Mastodon 服务器或其他服务器上的人。 + federation_hint_html: 在 %{instance} 上拥有账号后,你可以关注任何兼容Mastodon的服务器上的人。 get_apps: 尝试移动应用 hosted_on: 一个在 %{domain} 上运行的 Mastodon 实例 - instance_actor_flash: '这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。 - -' + instance_actor_flash: "这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。 \n" learn_more: 了解详情 privacy_policy: 隐私政策 + rules: 服务器规则 + rules_html: 如果你想要在此Mastodon服务器上拥有一个账户,你必须遵守相应的规则,摘要如下: see_whats_happening: 看一看现在在发生什么 server_stats: 服务器统计数据: - source_code: 源代码 + source_code: 源码 status_count_after: other: 条嘟文 status_count_before: 他们共嘟出了 @@ -51,8 +51,8 @@ zh-CN: what_is_mastodon: Mastodon 是什么? accounts: choices_html: "%{name} 的推荐:" - endorsements_hint: 您可以在web界面上推荐你关注的人,他们会出现在这里。 - featured_tags_hint: 您可以精选一些话题标签展示在这里。 + endorsements_hint: 你可以在web界面上推荐你关注的人,他们会显示在这里。 + featured_tags_hint: 你可以精选一些话题标签展示在这里。 follow: 关注 followers: other: 关注者 @@ -69,16 +69,15 @@ zh-CN: people_followed_by: "%{name} 关注的人" people_who_follow: 关注 %{name} 的人 pin_errors: - following: 您必须关注您要推荐的人 + following: 你必须关注你要推荐的人 posts: other: 嘟文 posts_tab_heading: 嘟文 posts_with_replies: 嘟文和回复 - reserved_username: 此用户名已被保留 roles: admin: 管理员 bot: 机器人 - group: 群组 + group: 组 moderator: 监察员 unavailable: 个人资料不可用 unfollow: 取消关注 @@ -94,18 +93,18 @@ zh-CN: accounts: add_email_domain_block: 封禁电子邮箱域名 approve: 批准 - approve_all: 批准全部 + approve_all: 全部批准 approved_msg: 成功批准 %{username} 的注册申请 are_you_sure: 你确定吗? avatar: 头像 by_domain: 域名 change_email: - changed_msg: 帐户电子邮件地址更改成功! - current_email: 当前的电子邮件地址 - label: 更改电子邮件地址 - new_email: 新的电子邮件地址 + changed_msg: 已成功更改账号的电子邮箱! + current_email: 当前的电子邮箱 + label: 更改电子邮箱 + new_email: 新的电子邮箱 submit: 更改电子邮件地址 - title: 为 %{username} 更改电子邮件地址 + title: 为 %{username} 更改电子邮箱 confirm: 确认 confirmed: 已确认 confirming: 确认中 @@ -113,17 +112,19 @@ zh-CN: deleted: 已删除 demote: 降任 destroyed_msg: "%{username} 的数据已进入等待队列,即将被删除" - disable: 停用 + disable: 冻结 + disable_sign_in_token_auth: 禁用电子邮件令牌认证 disable_two_factor_authentication: 停用双重认证 - disabled: 已停用 + disabled: 已冻结 display_name: 昵称 domain: 域名 edit: 编辑 email: 电子邮件地址 email_status: 电子邮件地址状态 - enable: 启用 + enable: 解冻 + enable_sign_in_token_auth: 启用电子邮件令牌认证 enabled: 已启用 - enabled_msg: 成功启用 %{username} 的帐号 + enabled_msg: 成功解冻 %{username} 的帐号 followers: 关注者 follows: 正在关注 header: 个人资料页横幅图片 @@ -186,6 +187,10 @@ zh-CN: search: 搜索 search_same_email_domain: 其他具有相同电子邮箱域名的用户 search_same_ip: 具有相同IP的其他用户 + security_measures: + only_password: 仅密码 + password_and_2fa: 密码和双重认证 + password_and_sign_in_token: 密码和电子邮件令牌 sensitive: 敏感内容 sensitized: 已标记为敏感内容 shared_inbox_url: 公用收件箱(Shared Inbox)URL @@ -197,8 +202,8 @@ zh-CN: statuses: 嘟文 subscribe: 订阅 suspended: 已封禁 - suspension_irreversible: 该帐号的数据已被不可逆转地删除。您可以取消暂停该帐号以使其可用,但它不会恢复以前拥有的任何数据。 - suspension_reversible_hint_html: 帐号已封禁,数据将在 %{date} 完全删除。 在此之前,帐号仍可恢复,并且没有任何不良影响。 如果您想立即移除该帐号的所有数据,可以在下面进行。 + suspension_irreversible: 该帐号的数据已被不可逆转地删除。你可以取消暂停该帐号以使其可用,但它不会恢复以前拥有的任何数据。 + suspension_reversible_hint_html: 帐号已封禁,数据将在 %{date} 完全删除。 在此之前,帐号仍可恢复,并且没有任何不良影响。 如果你想立即移除该帐号的所有数据,可以在下面进行。 time_in_queue: 已经等待了 %{time} title: 用户 unconfirmed_email: 待验证的电子邮件地址 @@ -225,6 +230,7 @@ zh-CN: create_domain_block: 封禁新域名 create_email_domain_block: 封禁电子邮箱域名 create_ip_block: 新建 IP 规则 + create_unavailable_domain: 创建不可用域名 demote_user: 给用户降职 destroy_announcement: 删除公告 destroy_custom_emoji: 删除自定义表情符号 @@ -233,10 +239,13 @@ zh-CN: destroy_email_domain_block: 解除电子邮箱域名封禁 destroy_ip_block: 删除 IP 规则 destroy_status: 删除嘟文 - disable_2fa_user: 禁用双重认证 + destroy_unavailable_domain: 删除不可用域名 + disable_2fa_user: 停用双重认证 disable_custom_emoji: 禁用自定义表情符号 + disable_sign_in_token_auth_user: 为用户禁用电子邮件令牌认证 disable_user: 禁用用户 enable_custom_emoji: 启用自定义表情符号 + enable_sign_in_token_auth_user: 为用户启用电子邮件令牌认证 enable_user: 启用用户 memorialize_account: 将账户设为追悼模式 promote_user: 给用户升任 @@ -256,46 +265,50 @@ zh-CN: update_domain_block: 更新域名屏蔽 update_status: 更新嘟文 actions: - assigned_to_self_report: "%{name} 接管了举报 %{target}" - change_email_user: "%{name} 更改了用户 %{target} 的电子邮件地址" - confirm_user: "%{name} 确认了用户 %{target} 的电子邮件地址" - create_account_warning: "%{name} 向 %{target} 发送了警告" - create_announcement: "%{name} 创建了新公告 %{target}" - create_custom_emoji: "%{name} 添加了新的自定义表情 %{target}" - create_domain_allow: "%{name} 允许了和域名 %{target} 的跨站交互" - create_domain_block: "%{name} 屏蔽了域名 %{target}" - create_email_domain_block: "%{name} 屏蔽了电子邮件域名 %{target}" - create_ip_block: "%{name} 为 IP %{target} 创建了规则" - demote_user: "%{name} 对用户 %{target} 进行了降任操作" - destroy_announcement: "%{name} 删除了公告 %{target}" - destroy_custom_emoji: "%{name} 销毁了自定义表情 %{target}" - destroy_domain_allow: "%{name} 拒绝了和 %{target} 跨站交互" - destroy_domain_block: "%{name} 解除了对域名 %{target} 的屏蔽" - destroy_email_domain_block: "%{name} 解除了对电子邮件域名 %{target} 的屏蔽" - destroy_ip_block: "%{name} 删除了 IP %{target} 的规则" - destroy_status: "%{name} 删除了 %{target} 的嘟文" - disable_2fa_user: "%{name} 停用了用户 %{target} 的双重认证" - disable_custom_emoji: "%{name} 停用了自定义表情 %{target}" - disable_user: "%{name} 将用户 %{target} 设置为禁止登录" - enable_custom_emoji: "%{name} 启用了自定义表情 %{target}" - enable_user: "%{name} 将用户 %{target} 设置为允许登录" - memorialize_account: "%{name} 将 %{target} 设置为追悼帐户" - promote_user: "%{name} 对用户 %{target} 进行了升任操作" - remove_avatar_user: "%{name} 删除了 %{target} 的头像" - reopen_report: "%{name} 重开了举报 %{target}" - reset_password_user: "%{name} 重置了用户 %{target} 的密码" - resolve_report: "%{name} 处理了举报 %{target}" - sensitive_account: "%{name} 将 %{target} 的媒体标记为敏感内容" - silence_account: "%{name} 隐藏了用户 %{target}" - suspend_account: "%{name} 封禁了用户 %{target}" - unassigned_report: "%{name} 放弃了举报 %{target} 的接管" - unsensitive_account: "%{name} 去除了 %{target} 媒体的敏感内容标记" - unsilence_account: "%{name} 解除了用户 %{target} 的隐藏状态" - unsuspend_account: "%{name} 解除了用户 %{target} 的封禁状态" - update_announcement: "%{name} 更新了公告 %{target}" - update_custom_emoji: "%{name} 更新了自定义表情 %{target}" - update_domain_block: "%{name} 更新了对 %{target} 的域名屏蔽" - update_status: "%{name} 刷新了 %{target} 的嘟文" + assigned_to_self_report_html: "%{name} 接管了举报 %{target}" + change_email_user_html: "%{name} 更改了用户 %{target} 的电子邮件地址" + confirm_user_html: "%{name} 确认了用户 %{target} 的电子邮件地址" + create_account_warning_html: "%{name} 向 %{target} 发送了警告" + create_announcement_html: "%{name} 创建了新公告 %{target}" + create_custom_emoji_html: "%{name} 添加了新的自定义表情 %{target}" + create_domain_allow_html: "%{name} 允许了和域名 %{target} 的跨站交互" + create_domain_block_html: "%{name} 屏蔽了域名 %{target}" + create_email_domain_block_html: "%{name} 屏蔽了电子邮件域名 %{target}" + create_ip_block_html: "%{name} 为 IP %{target} 创建了规则" + create_unavailable_domain_html: "%{name} 停止了向域名 %{target} 的投递" + demote_user_html: "%{name} 对用户 %{target} 进行了降任操作" + destroy_announcement_html: "%{name} 删除了公告 %{target}" + destroy_custom_emoji_html: "%{name} 销毁了自定义表情 %{target}" + destroy_domain_allow_html: "%{name} 拒绝了和 %{target} 跨站交互" + destroy_domain_block_html: "%{name} 解除了对域名 %{target} 的屏蔽" + destroy_email_domain_block_html: "%{name} 解除了对电子邮件域名 %{target} 的屏蔽" + destroy_ip_block_html: "%{name} 删除了 IP %{target} 的规则" + destroy_status_html: "%{name} 删除了 %{target} 的嘟文" + destroy_unavailable_domain_html: "%{name} 恢复了向域名 %{target} 的投递" + disable_2fa_user_html: "%{name} 停用了用户 %{target} 的双重认证" + disable_custom_emoji_html: "%{name} 停用了自定义表情 %{target}" + disable_sign_in_token_auth_user_html: "%{name} 已为 %{target} 禁用电子邮件令牌认证" + disable_user_html: "%{name} 将用户 %{target} 设置为禁止登录" + enable_custom_emoji_html: "%{name} 启用了自定义表情 %{target}" + enable_sign_in_token_auth_user_html: "%{name} 已为 %{target} 启用电子邮件令牌认证" + enable_user_html: "%{name} 将用户 %{target} 设置为允许登录" + memorialize_account_html: "%{name} 将 %{target} 设置为追悼帐户" + promote_user_html: "%{name} 对用户 %{target} 进行了升任操作" + remove_avatar_user_html: "%{name} 删除了 %{target} 的头像" + reopen_report_html: "%{name} 重开了举报 %{target}" + reset_password_user_html: "%{name} 重置了用户 %{target} 的密码" + resolve_report_html: "%{name} 处理了举报 %{target}" + sensitive_account_html: "%{name} 将 %{target} 的媒体标记为敏感内容" + silence_account_html: "%{name} 隐藏了用户 %{target}" + suspend_account_html: "%{name} 封禁了用户 %{target}" + unassigned_report_html: "%{name} 放弃接管举报 %{target}" + unsensitive_account_html: "%{name} 去除了 %{target} 的媒体的敏感内容标记" + unsilence_account_html: "%{name} 解除了用户 %{target} 的隐藏状态" + unsuspend_account_html: "%{name} 解除了用户 %{target} 的封禁状态" + update_announcement_html: "%{name} 更新了公告 %{target}" + update_custom_emoji_html: "%{name} 更新了自定义表情 %{target}" + update_domain_block_html: "%{name} 更新了对 %{target} 的域名屏蔽" + update_status_html: "%{name} 刷新了 %{target} 的嘟文" deleted_status: "(嘟文已删除)" empty: 没有找到日志 filter_by_action: 根据行为过滤 @@ -310,10 +323,12 @@ zh-CN: new: create: 创建公告 title: 新公告 + publish: 发布 published_msg: 公告已发布! scheduled_for: 定时在 %{time} scheduled_msg: 定时公告已创建! title: 公告 + unpublish: 取消发布 unpublished_msg: 公告已取消发布! updated_msg: 公告已成功更新! custom_emojis: @@ -338,7 +353,7 @@ zh-CN: listed: 已显示 new: title: 添加新的自定义表情 - not_permitted: 您没有权限进行此操作 + not_permitted: 你没有权限进行此操作 overwrite: 覆盖 shortcode: 短代码 shortcode_hint: 至少 2 个字符,只能使用字母、数字和下划线 @@ -350,33 +365,9 @@ zh-CN: updated_msg: 表情更新成功! upload: 上传新表情 dashboard: - authorized_fetch_mode: 安全模式 - backlog: 未处理任务数 - config: 服务器配置 - feature_deletions: 帐户删除 - feature_invites: 邀请链接 - feature_profile_directory: 用户目录 - feature_registrations: 公开注册 - feature_relay: 联邦中继站 - feature_spam_check: 反垃圾 - feature_timeline_preview: 时间轴预览 - features: 功能 - hidden_service: 匿名服务连通性 - open_reports: 待处理举报数 - pending_tags: 等待审核的标签 - pending_users: 等待审核的用户 - recent_users: 新用户 - search: 全文搜索 - single_user_mode: 单用户模式 software: 软件 space: 存储使用情况 title: 信息面板 - total_users: 总用户数 - trends: 趋势 - week_interactions: 本周互动数 - week_users_active: 本周活跃用户数 - week_users_new: 本周新用户数 - whitelist_mode: 限联模式 domain_allows: add_new: 允许和域名跨站交互 created_msg: 域名已被允许跨站交互 @@ -388,15 +379,15 @@ zh-CN: destroyed_msg: 域名屏蔽已撤销 domain: 域名 edit: 编辑域名屏蔽 - existing_domain_block_html: 您已经对 %{name} 施加了更严格的限制,您需要先 解封。 + existing_domain_block_html: 你已经对 %{name} 施加了更严格的限制,你需要先 解封。 new: create: 添加屏蔽 hint: 域名屏蔽不会阻止该域名下的帐户进入本站的数据库,但是会对来自这个域名的帐户自动进行预先设置的管理操作。 severity: - desc_html: 选择自动隐藏会将该域名下帐户发送的嘟文设置为仅关注者可见;选择自动封禁会将该域名下帐户发送的嘟文、媒体文件以及个人资料数据从本实例上删除;如果你只是想拒绝接收来自该域名的任何媒体文件,请选择。 + desc_html: 选择隐藏会将该域名下帐户发送的嘟文设置为仅关注者可见;选择封禁会将该域名下帐户发送的嘟文、媒体文件以及个人资料数据从本实例上删除;如果你只是想拒绝接收来自该域名的任何媒体文件,请选择。 noop: 无 - silence: 自动隐藏 - suspend: 自动封禁 + silence: 隐藏 + suspend: 封禁 title: 新增域名屏蔽 obfuscate: 混淆域名 obfuscate_hint: 如果启用了域名列表公开限制,就部分混淆列表中的域名 @@ -435,9 +426,33 @@ zh-CN: create: 添加域名 title: 添加电子邮件域名屏蔽 title: 电子邮件域名屏蔽 + follow_recommendations: + description_html: "“关注推荐”可帮助新用户快速找到有趣的内容。 当用户与他人的互动不足以形成个性化的建议时,就会推荐关注这些账户。推荐会每日更新,基于选定语言的近期最高互动数和最多本站关注者数综合评估得出。" + language: 选择语言 + status: 嘟文 + suppress: 禁用推荐关注 + suppressed: 已禁用 + title: 关注推荐 + unsuppress: 恢复推荐关注 instances: + back_to_all: 全部 + back_to_limited: 受限 + back_to_warning: 警告 by_domain: 域名 + delivery: + all: 全部 + clear: 清理投递错误 + restart: 重新投递 + stop: 停止投递 + title: 投递 + unavailable: 不可用 + unavailable_message: 投递不可用 + warning: 警告 + warning_message: + other: 投递已失败 %{count} 天 delivery_available: 可投递 + delivery_error_days: 投递错误天数 + delivery_error_hint: 如果投递已不可用 %{count} 天,它将被自动标记为无法投递。 empty: 暂无域名。 known_accounts: other: "%{count} 个已知帐户" @@ -530,10 +545,18 @@ zh-CN: resolved: 已处理 resolved_msg: 举报处理成功! status: 状态 + target_origin: 被举报账号的来源 title: 举报 unassign: 取消接管 unresolved: 未处理 updated_at: 更新时间 + rules: + add_new: 添加规则 + delete: 删除 + description_html: 虽然大多数人都声称已经阅读并同意服务条款,但通常人们只有在出现问题后才会阅读。所以写一个简单的要点列表吧,能让大家一目了然。试着让每条规则尽量简单明了,但也别分出太多条目来。 + edit: 编辑规则 + empty: 尚未定义服务器规则。 + title: 实例规则 settings: activity_api_enabled: desc_html: 本站一周内的嘟文数、活跃用户数以及新用户数 @@ -557,9 +580,6 @@ zh-CN: users: 对本地已登录用户 domain_blocks_rationale: title: 显示理由 - enable_bootstrap_timeline_accounts: - desc_html: 让新用户自动关注指定用户,这样,他们的主页时间线就不会在一开始的时候空空荡荡 - title: 开启新用户默认关注功能 hero: desc_html: 将用于在首页展示。推荐使用分辨率 600×100px 以上的图片。如未设置,将默认使用本站缩略图。 title: 主题图片 @@ -613,9 +633,6 @@ zh-CN: desc_html: 可以填写自己的隐私权政策、使用条款或其他法律文本。可以使用 HTML 标签 title: 自定义使用条款 site_title: 本站名称 - spam_check_enabled: - desc_html: Mastodon可以自动隐藏和举报重复发送垃圾消息的帐号。但是本功能有可能误伤无辜。 - title: 自动反垃圾 thumbnail: desc_html: 用于在 OpenGraph 和 API 中显示预览图。推荐分辨率 1200×630px title: 本站缩略图 @@ -646,13 +663,18 @@ zh-CN: no_status_selected: 因为没有嘟文被选中,所以没有更改 title: 帐户嘟文 with_media: 含有媒体文件 + system_checks: + database_schema_check: + message_html: 有待处理的数据库迁移。请运行它们以确保应用程序正常运行。 + rules_check: + action: 管理服务器规则 + message_html: 你没有定义任何服务器规则。 + sidekiq_process_check: + message_html: "%{value} 队列未运行任何 Sidekiq 进程。请检查你的 Sidekiq 配置" tags: accounts_today: 今日活跃用户 accounts_week: 本周活跃用户 breakdown: 按来源分类今天的使用情况 - context: 上下文 - directory: 在目录中 - in_directory: 目录中 %{count} 条 last_active: 最近活动 most_popular: 最热门的 most_recent: 最近的 @@ -669,10 +691,11 @@ zh-CN: add_new: 添加新条目 delete: 删除 edit_preset: 编辑预置警告 + empty: 你尚未定义任何警告预设。 title: 管理预设警告 admin_mailer: new_pending_account: - body: 新帐户的详细信息如下。您可以批准或拒绝此申请。 + body: 新帐户的详细信息如下。你可以批准或拒绝此申请。 subject: 在 %{instance} 上有新帐号 ( %{username}) 需要审核 new_report: body: "%{reporter} 举报了用户 %{target}" @@ -683,13 +706,13 @@ zh-CN: subject: 在 %{instance} 有新话题 (#%{name}) 待审核 aliases: add_new: 创建别名 - created_msg: 成功创建了一个新别名。您现在可以从旧账户开始迁移了。 + created_msg: 成功创建了一个新别名。你现在可以从旧账户开始迁移了。 deleted_msg: 成功移除别名。已经无法从该帐户移动到此帐户了。 empty: 你没有设置别名 hint_html: 如果你想把另一个帐号迁移到这里,你可以先在这里创建一个别名。如果你想把关注者迁移过来,这一步是必须的。设置别名的操作时无害而且可以恢复的帐号迁移的操作会从旧帐号开始。 remove: 取消关联别名 appearance: - advanced_web_interface: 高级 web 界面 + advanced_web_interface: 高级 Web 界面 advanced_web_interface_hint: 如果你想使用整个屏幕宽度,高级 web 界面允许您配置多个不同的栏目,可以同时看到更多的信息:主页、通知、跨站时间轴、任意数量的列表和话题标签。 animations_and_accessibility: 动画和访问选项 confirmation_dialogs: 确认对话框 @@ -723,15 +746,15 @@ zh-CN: delete_account: 删除帐户 delete_account_html: 如果你想删除你的帐户,请点击这里继续。你需要确认你的操作。 description: - prefix_invited_by_user: "@%{name} 邀请您加入这个Mastodon服务器!" + prefix_invited_by_user: "@%{name} 邀请你加入这个Mastodon服务器!" prefix_sign_up: 现在就注册 Mastodon! suffix: 注册一个帐号,你就可以关注别人、发布嘟文、并和其它任何Mastodon服务器上的用户交流,而且还有其它更多功能! didnt_get_confirmation: 没有收到确认邮件? - dont_have_your_security_key: 没有您的安全密钥? + dont_have_your_security_key: 没有你的安全密钥? forgot_password: 忘记密码? invalid_reset_password_token: 密码重置令牌无效或已过期。请重新发起重置密码请求。 link_to_otp: 输入从手机中获得的两步验证代码或恢复代码 - link_to_webauth: 使用您的安全密钥设备 + link_to_webauth: 使用你的安全密钥设备 login: 登录 logout: 登出 migrate_account: 迁移到另一个帐户 @@ -753,9 +776,9 @@ zh-CN: status: account_status: 帐户状态 confirming: 等待电子邮件确认完成。 - functional: 您的帐号可以正常使用了。 - pending: 工作人员正在审核您的申请。这需要花点时间。在申请被批准后,您将收到一封电子邮件。 - redirecting_to: 您的帐户无效,因为它已被设置为跳转到 %{acct} + functional: 你的帐号可以正常使用了。 + pending: 工作人员正在审核你的申请。这需要花点时间。在申请被批准后,你将收到一封电子邮件。 + redirecting_to: 你的帐户无效,因为它已被设置为跳转到 %{acct} too_fast: 表单提交过快,请重试。 trouble_logging_in: 登录有问题? use_security_key: 使用安全密钥 @@ -773,7 +796,7 @@ zh-CN: title: 关注 %{acct} challenge: confirm: 继续 - hint_html: "注意:接下来一小时内我们不会再次要求您输入密码。" + hint_html: "注意:接下来一小时内我们不会再次要求你输入密码。" invalid_password: 无效密码 prompt: 确认密码以继续 crypto: @@ -799,22 +822,22 @@ zh-CN: x_months: "%{count}个月" x_seconds: "%{count}秒" deletes: - challenge_not_passed: 您输入的信息不正确 + challenge_not_passed: 你输入的信息不正确 confirm_password: 输入你当前的密码来验证身份 - confirm_username: 输入您的用户名以继续 + confirm_username: 输入你的用户名以继续 proceed: 删除帐户 success_msg: 你的帐户已经成功删除 warning: before: 在删除前,请仔细阅读下列说明: caches: 已被其他服务器缓存的内容可能还会保留 - data_removal: 您的嘟文和其他数据将被永久删除 - email_change_html: 您可以 更换邮箱地址 无需删除账号 + data_removal: 你的嘟文和其他数据将被永久删除 + email_change_html: 你可以 更换邮箱地址 无需删除账号 email_contact_html: 如果它还没送到,你可以发邮件给 %{email} 寻求帮助。 - email_reconfirmation_html: 如果您没有收到确认邮件,请点击 重新发送 。 - irreversible: 您将无法恢复或重新激活您的帐户 + email_reconfirmation_html: 如果你没有收到确认邮件,请点击 重新发送 。 + irreversible: 你将无法恢复或重新激活你的帐户 more_details_html: 更多细节,请查看 隐私政策 。 - username_available: 您的用户名现在又可以使用了 - username_unavailable: 您的用户名仍将无法使用 + username_available: 你的用户名现在又可以使用了 + username_unavailable: 你的用户名仍将无法使用 directories: directory: 用户目录 explanation: 根据兴趣发现用户 @@ -822,7 +845,7 @@ zh-CN: domain_validator: invalid_domain: 不是一个有效的域名 errors: - '400': 您提交的请求无效或格式不正确。 + '400': 你提交的请求无效或格式不正确。 '403': 你没有访问这个页面的权限。 '404': 无法找到你所要访问的页面。 '406': 页面无法处理请求。 @@ -852,13 +875,13 @@ zh-CN: csv: CSV domain_blocks: 域名屏蔽 lists: 列表 - mutes: 隐藏的用户 + mutes: 你隐藏的用户 storage: 媒体文件存储 featured_tags: add_new: 添加新条目 errors: limit: 你所推荐的话题标签数已达上限 - hint_html: "什么是精选话题标签? 它们被显示在您的公开个人资料中的突出位置,人们可以在这些标签下浏览您的公共嘟文。 它们是跟踪创作或长期项目的进度的重要工具。" + hint_html: "什么是精选话题标签? 它们被显示在你的公开个人资料中的突出位置,人们可以在这些标签下浏览你的公共嘟文。 它们是跟踪创作或长期项目的进度的重要工具。" filters: contexts: account: 个人资料 @@ -873,7 +896,7 @@ zh-CN: invalid_irreversible: 此功能只适用于主页时间轴或通知 index: delete: 删除 - empty: 您没有过滤器。 + empty: 你没有过滤器。 title: 过滤器 new: title: 添加新的过滤器 @@ -956,6 +979,17 @@ zh-CN: lists: errors: limit: 你所建立的列表数量已经达到上限 + login_activities: + authentication_methods: + otp: 双因素认证应用 + password: 密码 + sign_in_token: 电子邮件安全代码 + webauthn: 安全密钥 + description_html: 如有您无法识别的活动,请考虑更改密码并启用双因素认证。 + empty: 没有可用的认证记录 + failed_sign_in_html: 失败的 %{method} 登录尝试,来自 %{ip} (%{browser}) + successful_sign_in_html: 通过 %{method} 成功登录,来自 %{ip} (%{browser}) + title: 认证历史 media_attachments: validations: images_and_video: 无法在嘟文中同时插入视频和图片 @@ -964,34 +998,34 @@ zh-CN: migrations: acct: 新帐户的 用户名@域名 cancel: 取消跳转 - cancel_explanation: 取消跳转将会重新激活您当前的帐号,但是已经迁移到新账号的关注者不会回来。 + cancel_explanation: 取消跳转将会重新激活你当前的帐号,但是已经迁移到新账号的关注者不会回来。 cancelled_msg: 成功取消跳转 errors: - already_moved: 和您已经迁移过的帐号相同 + already_moved: 和你已经迁移过的帐号相同 missing_also_known_as: 没有引用此帐号 move_to_self: 不能是当前帐户 not_found: 找不到 - on_cooldown: 您正处于冷却状态 + on_cooldown: 你正处于冷却状态 followers_count: 迁移时的关注者 incoming_migrations: 从其它帐号迁移 - incoming_migrations_html: 要把另一个帐号移动到本帐号,首先您需要 创建一个帐号别名 。 - moved_msg: 您的帐号现在会跳转到%{acct} ,同时关注者也会迁移过去 。 - not_redirecting: 您的帐号当前未跳转到其它帐户。 - on_cooldown: 您最近已经迁移过您的帐号。此功能将在%{count} 天后再次可用。 + incoming_migrations_html: 要把另一个帐号移动到本帐号,首先你需要 创建一个帐号别名 。 + moved_msg: 你的帐号现在会跳转到%{acct} ,同时关注者也会迁移过去 。 + not_redirecting: 你的帐号当前未跳转到其它帐户。 + on_cooldown: 你最近已经迁移过你的帐号。此功能将在%{count} 天后再次可用。 past_migrations: 迁移记录 proceed_with_move: 移动关注者 - redirected_msg: 您的账号现在会跳转至 %{acct} - redirecting_to: 您的帐户被跳转到了 %{acct}。 + redirected_msg: 你的账号现在会跳转至 %{acct} + redirecting_to: 你的帐户被跳转到了 %{acct}。 set_redirect: 设置跳转 warning: backreference_required: 新账号必须先引用现在这个帐号 before: 在继续前,请仔细阅读下列说明: - cooldown: 移动后会有一个冷却期,在此期间您将无法再次移动 - disabled_account: 此后,您的当前帐户将无法使用。但是,您仍然有权导出数据或者重新激活。 + cooldown: 移动后会有一个冷却期,在此期间你将无法再次移动 + disabled_account: 此后,你的当前帐户将无法使用。但是,你仍然有权导出数据或者重新激活。 followers: 这步操作将把所有关注者从当前账户移动到新账户 only_redirect_html: 或者,你可以只在你的帐号资料上设置一个跳转。 other_data: 不会自动移动其它数据 - redirect: 在收到一个跳转通知后,您当前的帐号资料将会更新,并被排除在搜索范围外 + redirect: 在收到一个跳转通知后,你当前的帐号资料将会更新,并被排除在搜索范围外 moderation: title: 运营 move_handler: @@ -1026,10 +1060,14 @@ zh-CN: body: "%{name} 在嘟文中提到了你:" subject: "%{name} 提到了你" title: 新的提及 + poll: + subject: "%{name} 创建的一个投票已经结束" reblog: body: 你的嘟文被 %{name} 转嘟了: subject: "%{name} 转嘟了你的嘟文" title: 新的转嘟 + status: + subject: "%{name} 刚刚发嘟" notifications: email_events: 电子邮件通知事件 email_events_hint: 选择你想要收到通知的事件: @@ -1046,7 +1084,7 @@ zh-CN: trillion: T otp_authentication: code_hint: 输入认证应用生成的代码以确认操作 - description_html: 如果您使用身份验证应用启用了 双重身份验证, 登录将需要用到您的手机,它将生成您需要的令牌。 + description_html: 如果你使用身份验证应用启用了 双重身份验证, 登录将需要用到你的手机,它将生成你需要的令牌。 enable: 启用 instructions_html: "请使用 Google 身份验证器或其他的TOTP双重认证手机应用扫描此处的二维码。启用双重认证后,在登录时,你需要输入该应用生成的代码。" manual_instructions: 如果你无法扫描二维码,请手动输入下列文本: @@ -1100,20 +1138,20 @@ zh-CN: no_account_html: 还没有帐号?你可以注册一个 proceed: 确认关注 prompt: 你正准备关注: - reason_html: "为什么需要这个步骤? %{instance} 可能不是您所注册的服务器,所以我们需要先跳转到您所在的服务器。" + reason_html: "为什么需要这个步骤? %{instance} 可能不是你所注册的服务器,所以我们需要先跳转到你所在的服务器。" remote_interaction: favourite: proceed: 确认标记为喜欢 - prompt: 您想要标记此嘟文为喜欢: + prompt: 你想要标记此嘟文为喜欢: reblog: proceed: 确认转嘟 - prompt: 您想要转嘟此条: + prompt: 你想要转嘟此条: reply: proceed: 确认回复 - prompt: 您想要回复此嘟文: + prompt: 你想要回复此嘟文: scheduled_statuses: - over_daily_limit: 您已超出每日定时嘟文的上限(%{limit} 条) - over_total_limit: 您已超出定时嘟文的上限(%{limit} 条) + over_daily_limit: 你已超出每日定时嘟文的上限(%{limit} 条) + over_total_limit: 你已超出定时嘟文的上限(%{limit} 条) too_soon: 所定的时间必须在未来 sessions: activity: 最后一次活跃的时间 @@ -1144,7 +1182,7 @@ zh-CN: adobe_air: Adobe Air android: Android blackberry: 黑莓 - chrome_os: ChromeOS + chrome_os: Chrome OS firefox_os: Firefox OS ios: iOS linux: Linux @@ -1156,6 +1194,7 @@ zh-CN: revoke: 注销 revoke_success: 会话注销成功 title: 会话 + view_authentication_history: 查看账户的认证历史 settings: account: 帐号 account_settings: 帐户设置 @@ -1176,10 +1215,9 @@ zh-CN: preferences: 首选项 profile: 个人资料 relationships: 关注管理 + statuses_cleanup: 自动删除嘟文 two_factor_authentication: 双重认证 webauthn_authentication: 安全密钥 - spam_check: - spam_detected: 这是一个自动报告。已检测到垃圾信息。 statuses: attached: audio: @@ -1216,12 +1254,47 @@ zh-CN: sign_in_to_participate: 登录以加入对话 title: "%{name}:“%{quote}”" visibilities: + direct: 私信 private: 仅关注者 private_long: 只有关注你的用户能看到 public: 公开 public_long: 所有人可见,并会出现在公共时间轴上 unlisted: 不公开 unlisted_long: 所有人可见,但不会出现在公共时间轴上 + statuses_cleanup: + enabled: 自动删除旧嘟文 + enabled_hint: 当您的嘟文达到指定的过期时间后自动删除,除非它们与下面的例外之一相匹配 + exceptions: 例外 + explanation: 因为删除帖子是一个昂贵的操作,所以这个操作会随着时间的推移而缓慢地完成,当服务器没有其他忙碌的时候。 为此原因,您的帖子可能会在达到年龄界限后被删除。 + ignore_favs: 取消喜欢 + ignore_reblogs: 忽略转嘟 + interaction_exceptions: 基于互动的例外 + interaction_exceptions_explanation: 请注意,如果嘟文超出转嘟和喜欢的阈值之后,又降到阈值以下,不能保证会被删除。 + keep_direct: 保留私信 + keep_direct_hint: 没有删除你的任何私信 + keep_media: 保留带媒体附件的嘟文 + keep_media_hint: 没有删除任何包含媒体附件的嘟文 + keep_pinned: 保留置顶嘟文 + keep_pinned_hint: 没有删除你的任何置顶嘟文 + keep_polls: 保留投票 + keep_polls_hint: 没有删除你的任何投票 + keep_self_bookmark: 保存被你加入书签的嘟文 + keep_self_bookmark_hint: 如果你已将自己的嘟文添加书签,就不会删除这些嘟文 + keep_self_fav: 保留你喜欢的嘟文 + keep_self_fav_hint: 如果你喜欢了自己的嘟文,则不会删除这些嘟文 + min_age: + '1209600': 2周 + '15778476': 6个月 + '2629746': 1个月 + '31556952': 1年 + '5259492': 2个月 + '63113904': 两年 + '7889238': 3个月 + min_age_label: 过期阈值 + min_favs: 保留如下嘟文:喜欢数超过 + min_favs_hint: 喜欢数超过该阈值的的嘟文不被删除。如果留空,则无视喜欢数,直接删除。 + min_reblogs: 保留如下嘟文:转嘟属超过 + min_reblogs_hint: 转嘟数超过该阈值的的嘟文不被删除。如果留空,则无视被转嘟的数量,直接删除。 stream_entries: pinned: 置顶嘟文 reblogged: 转嘟 @@ -1234,29 +1307,29 @@ zh-CN:

    我们收集什么信息?

      -
    • 基本帐户信息:如果您在此服务器上注册,可能会要求您输入用户名,电子邮件地址和密码。 您还可以输入其他个人资料信息,例如显示名称和传记,并上传个人资料照片和标题图像。 用户名,显示名称,传记,个人资料图片和标题图片始终公开列出。
    • -
    • 帖子,关注和其他公共信息: 您关注的人员列表会公开列出,您的粉丝也是如此。 提交邮件时,会存储日期和时间以及您提交邮件的应用程序。 消息可能包含媒体附件,例如图片和视频。 公开和非上市帖子可公开获取。 当您在个人资料中添加帖子时,这也是公开信息。 您的帖子会发送给您的关注者,在某些情况下,这意味着他们会将其发送到不同的服务器,并将副本存储在那里。 当您删除帖子时,同样会将其发送给您的关注者。 重新记录或赞成其他职位的行为始终是公开的。
    • -
    • 直接和关注者的帖子: 所有帖子都在服务器上存储和处理。 仅限关注者的帖子会发送给您的关注者和用户,并且直接帖子仅会发送给他们中提到的用户。 在某些情况下,这意味着它们被传送到不同的服务器并且副本存储在那里。 我们善意努力限制只有授权人员访问这些帖子,但其他服务器可能无法这样做。 因此,查看您的关注者所属的服务器非常重要。 您可以在设置中切换选项以手动批准和拒绝新关注者。 请记住,服务器和任何接收服务器的操作员可能会查看此类消息, 并且收件人可以截图,复制或以其他方式重新共享它们。 不要在 Mastodon 上分享任何危险信息。
    • -
    • IP和其他元数据: 登录时,我们会记录您登录的IP地址以及浏览器应用程序的名称。 所有登录的会话都可供您在设置中查看和撤销。 使用的最新IP地址最长可存储12个月。 我们还可以保留服务器日志,其中包括我们服务器的每个请求的IP地址。
    • +
    • 基本帐户信息:如果你在此服务器上注册,可能会要求你输入用户名,电子邮件地址和密码。 你还可以输入其他个人资料信息,例如显示名称和传记,并上传个人资料照片和标题图像。 用户名,显示名称,传记,个人资料图片和标题图片始终公开列出。
    • +
    • 帖子,关注和其他公共信息: 你关注的人员列表会公开列出,你的粉丝也是如此。 提交邮件时,会存储日期和时间以及你提交邮件的应用程序。 消息可能包含媒体附件,例如图片和视频。 公开和非上市帖子可公开获取。 当你在个人资料中添加帖子时,这也是公开信息。 你的帖子会发送给你的关注者,在某些情况下,这意味着他们会将其发送到不同的服务器,并将副本存储在那里。 当你删除帖子时,同样会将其发送给你的关注者。 重新记录或赞成其他职位的行为始终是公开的。
    • +
    • 直接和关注者的帖子: 所有帖子都在服务器上存储和处理。 仅限关注者的帖子会发送给你的关注者和用户,并且直接帖子仅会发送给他们中提到的用户。 在某些情况下,这意味着它们被传送到不同的服务器并且副本存储在那里。 我们善意努力限制只有授权人员访问这些帖子,但其他服务器可能无法这样做。 因此,查看你的关注者所属的服务器非常重要。 你可以在设置中切换选项以手动批准和拒绝新关注者。 请记住,服务器和任何接收服务器的操作员可能会查看此类消息, 并且收件人可以截图,复制或以其他方式重新共享它们。 不要在 Mastodon 上分享任何危险信息。
    • +
    • IP和其他元数据: 登录时,我们会记录你登录的IP地址以及浏览器应用程序的名称。 所有登录的会话都可供你在设置中查看和撤销。 使用的最新IP地址最长可存储12个月。 我们还可以保留服务器日志,其中包括我们服务器的每个请求的IP地址。

    -

    我们将您的信息用于什么?

    +

    我们将你的信息用于什么?

    -

    我们向您收集的任何信息均可通过以下方式使用:

    +

    我们向你收集的任何信息均可通过以下方式使用:

      -
    • 提供Mastodon的核心功能。 您只能在登录时与其他人的内容进行互动并发布您自己的内容。例如,您可以关注其他人在您自己的个性化家庭时间轴中查看他们的组合帖子。
    • -
    • 为了帮助社区适度,例如将您的IP地址与其他已知的IP地址进行比较,以确定禁止逃税或其他违规行为。
    • -
    • 您提供的电子邮件地址可能用于向您发送信息,有关其他人与您的内容交互或向您发送消息的通知,以及回复查询和/或其他请求或问题。
    • +
    • 提供Mastodon的核心功能。 你只能在登录时与其他人的内容进行互动并发布你自己的内容。例如,你可以关注其他人在你自己的个性化家庭时间轴中查看他们的组合帖子。
    • +
    • 为了帮助社区适度,例如将你的IP地址与其他已知的IP地址进行比较,以确定禁止逃税或其他违规行为。
    • +
    • 你提供的电子邮件地址可能用于向你发送信息,有关其他人与你的内容交互或向你发送消息的通知,以及回复查询和/或其他请求或问题。

    -

    我们如何保护您的信息?

    +

    我们如何保护你的信息?

    -

    当您输入,提交或访问您的个人信息时,我们会实施各种安全措施以维护您的个人信息的安全。 除此之外,您的浏览器会话以及应用程序和API之间的流量都使用SSL进行保护,您的密码使用强大的单向算法进行哈希处理。 您可以启用双因素身份验证,以进一步保护对您帐户的访问。

    +

    当你输入,提交或访问你的个人信息时,我们会实施各种安全措施以维护你的个人信息的安全。 除此之外,你的浏览器会话以及应用程序和API之间的流量都使用SSL进行保护,你的密码使用强大的单向算法进行哈希处理。 你可以启用双因素身份验证,以进一步保护对你帐户的访问。


    @@ -1269,35 +1342,35 @@ zh-CN:
  • 保留与注册用户关联的IP地址不超过12个月。
-

您可以请求并下载我们内容的存档,包括您的帖子,媒体附件,个人资料图片和标题图片。

+

你可以请求并下载我们内容的存档,包括你的帖子,媒体附件,个人资料图片和标题图片。

-

您可以随时不可逆转地删除您的帐户。

+

你可以随时不可逆转地删除你的帐户。


我们使用 cookies 吗?

-

是。 Cookie是网站或其服务提供商通过Web浏览器传输到计算机硬盘的小文件(如果允许)。 这些cookie使网站能够识别您的浏览器,如果您有注册帐户,则将其与您的注册帐户相关联。

+

是。 Cookie是网站或其服务提供商通过Web浏览器传输到计算机硬盘的小文件(如果允许)。 这些cookie使网站能够识别你的浏览器,如果你有注册帐户,则将其与你的注册帐户相关联。

-

我们使用Cookie来了解并保存您对未来访问的偏好。

+

我们使用Cookie来了解并保存你对未来访问的偏好。


我们是否透露任何信息给其他方?

-

我们不会将您的个人身份信息出售,交易或以其他方式转让给外方。 这不包括协助我们操作我们的网站,开展业务或为您服务的受信任的第三方,只要这些方同意保密这些信息。 当我们认为发布适合遵守法律,执行我们的网站政策或保护我们或他人的权利,财产或安全时,我们也可能会发布您的信息。

+

我们不会将你的个人身份信息出售,交易或以其他方式转让给外方。 这不包括协助我们操作我们的网站,开展业务或为你服务的受信任的第三方,只要这些方同意保密这些信息。 当我们认为发布适合遵守法律,执行我们的网站政策或保护我们或他人的权利,财产或安全时,我们也可能会发布你的信息。

-

您的公共内容可能会被网络中的其他服务器下载。 您的公开帖子和关注者帖子会发送到关注者所在的服务器,并且直接邮件会传递到收件人的服务器,只要这些关注者或收件人位于与此不同的服务器上。

+

你的公共内容可能会被网络中的其他服务器下载。 你的公开帖子和关注者帖子会发送到关注者所在的服务器,并且直接邮件会传递到收件人的服务器,只要这些关注者或收件人位于与此不同的服务器上。

-

当您授权应用程序使用您的帐户时,根据您批准的权限范围,它可能会访问您的公开个人资料信息,以下列表,您的关注者,您的列表,所有帖子和您的收藏夹。 应用程序永远不能访问您的电子邮件地址或密码。

+

当你授权应用程序使用你的帐户时,根据你批准的权限范围,它可能会访问你的公开个人资料信息,以下列表,你的关注者,你的列表,所有帖子和你的收藏夹。 应用程序永远不能访问你的电子邮件地址或密码。


儿童使用网站

-

如果此服务器位于欧盟或欧洲经济区:我们的网站,产品和服务都是针对至少16岁的人。 如果您未满16岁,则符合GDPR的要求(General Data Protection Regulation) 不要使用这个网站。

+

如果此服务器位于欧盟或欧洲经济区:我们的网站,产品和服务都是针对至少16岁的人。 如果你未满16岁,则符合GDPR的要求(General Data Protection Regulation) 不要使用这个网站。

-

如果此服务器位于美国:我们的网站,产品和服务均面向至少13岁的人。 如果您未满13岁,则符合COPPA的要求 (Children's Online Privacy Protection Act) 不要使用这个网站。

+

如果此服务器位于美国:我们的网站,产品和服务均面向至少13岁的人。 如果你未满13岁,则符合COPPA的要求 (Children's Online Privacy Protection Act) 不要使用这个网站。

如果此服务器位于另一个辖区,则法律要求可能不同。

@@ -1321,7 +1394,7 @@ zh-CN: month: "%Y年%m月" two_factor_authentication: add: 添加 - disable: 停用 + disable: 停用双重认证 disabled_success: 双重身份验证成功禁用 edit: 编辑 enabled: 双重认证已启用 @@ -1347,24 +1420,24 @@ zh-CN: title: 登录请求 warning: explanation: - disable: 虽然您的帐户被冻结,您的帐户数据仍然完整;但是您无法在解锁前执行任何操作。 + disable: 虽然你的帐户被冻结,你的帐户数据仍然完整;但是你无法在解锁前执行任何操作。 sensitive: 你上传的媒体文件和媒体链接将被视作敏感内容。 - silence: 当您的帐户受限时,只有已经关注过你的人才会这台服务器上看到你的嘟文,并且您会被排除在各种公共列表之外。但是,其他人仍然可以手动关注你。 - suspend: 您的帐户已被封禁,所有的嘟文和您上传的媒体文件都已经从该服务器和您的关注者的服务器上删除并且不可恢复。 - get_in_touch: 您可回复该邮件以联系 %{instance} 的工作人员。 + silence: 当你的帐户被隐藏时,只有已经关注你的人才会这台服务器上看到你的嘟文,并且你会被排除在各种公共列表之外。但是,其他人仍然可以手动关注你。 + suspend: 你的帐户已被封禁,所有的嘟文和你上传的媒体文件都已经从该服务器和你的关注者的服务器上删除并且不可恢复。 + get_in_touch: 你可回复该邮件以联系 %{instance} 的工作人员。 review_server_policies: 查看服务器政策 statuses: 具体来说,适用于: subject: - disable: 您的帐户 %{acct} 已被冻结 + disable: 你的帐户 %{acct} 已被冻结 none: 对 %{acct} 的警告 sensitive: 你的帐号 %{acct} 所发布的媒体已被标记为敏感内容 - silence: 您的帐户 %{acct} 已经受限 - suspend: 您的帐户 %{acct} 已被封禁。 + silence: 你的帐户 %{acct} 已被隐藏 + suspend: 你的帐户 %{acct} 已被封禁。 title: disable: 账号已冻结 none: 警示 sensitive: 你的媒体被标记为敏感内容 - silence: 帐户受限 + silence: 帐户被隐藏 suspend: 账号被封禁 welcome: edit_profile_action: 设置个人资料 @@ -1384,11 +1457,8 @@ zh-CN: tips: 小贴士 title: "%{name},欢迎你的加入!" users: - blocked_email_provider: 您不能使用来自此提供商的邮箱 - follow_limit_reached: 您不能关注超过 %{limit} 个人 + follow_limit_reached: 你不能关注超过 %{limit} 个人 generic_access_help_html: 登录账号出现问题?你可以向 %{email} 寻求帮助 - invalid_email: 输入的电子邮件地址无效 - invalid_email_mx: 用戶邮箱似乎不存在 invalid_otp_token: 输入的双重认证代码无效 invalid_sign_in_token: 无效安全码 otp_lost_help_html: 如果你不慎丢失了所有的代码,请联系 %{email} 寻求帮助 @@ -1396,22 +1466,22 @@ zh-CN: signed_in_as: 当前登录的帐户: suspicious_sign_in_confirmation: 你似乎没有在这台设备上登录过,并且你也有很久没有登录过了,所以我们给你的电子邮箱发了封邮件,想确认一下确实是你。 verification: - explanation_html: 您可以 验证自己是个人资料元数据中的某个链接的所有者。 为此,被链接网站必须包含一个到您的 Mastodon 主页的链接。链接中 必须 包括 rel="me" 属性。链接的文本内容可以随意填写。例如: + explanation_html: 你可以 验证自己是个人资料元数据中的某个链接的所有者。 为此,被链接网站必须包含一个到你的 Mastodon 主页的链接。链接中 必须 包括 rel="me" 属性。链接的文本内容可以随意填写。例如: verification: 验证 webauthn_credentials: add: 添加新的安全密钥 create: - error: 添加您的安全密钥时出错。请重试。 - success: 您的安全密钥已成功添加。 + error: 添加你的安全密钥时出错。请重试。 + success: 你的安全密钥已成功添加。 delete: 删除 - delete_confirmation: 您确认要删除这个安全密钥吗? - description_html: 如果您启用 安全密钥身份验证,登录将需要您使用您的安全密钥。 + delete_confirmation: 你确认要删除这个安全密钥吗? + description_html: 如果你启用 安全密钥身份验证,登录将需要你使用你的安全密钥。 destroy: - error: 删除您的安全密钥时出错。请重试。 - success: 您的安全密钥已成功删除。 + error: 删除你的安全密钥时出错。请重试。 + success: 你的安全密钥已成功删除。 invalid_credential: 无效的安全密钥 - nickname_hint: 输入您新安全密钥的昵称 - not_enabled: 您尚未启用 WebAuthn + nickname_hint: 输入你的新安全密钥的昵称 + not_enabled: 你尚未启用WebAuthn not_supported: 此浏览器不支持安全密钥 otp_required: 要使用安全密钥,请先启用两步验证。 registered_on: 注册于 %{date} diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 9fcee79f11..185b88b511 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -2,8 +2,8 @@ zh-HK: about: about_hashtag_html: 這些是包含「#%{hashtag}」標籤的公開文章。只要你是任何聯盟網站的用戶,便可以與他們互動。 - about_mastodon_html: Mastodon(萬象)是屬於未來的社交網絡︰無廣告煩擾、無企業監控、設計講道義、分散無大台!立即重奪個人資料的控制權,使用 Mastodon 吧! - about_this: 關於本服務站 + about_mastodon_html: Mastodon(萬象)是屬於未來的社交網路︰無廣告煩擾、無企業監控、設計講道義、分散無大台!立即重奪個人資料的控制權,使用 Mastodon 吧! + about_this: 關於本伺服器 active_count_after: 活躍 active_footnote: 每月活躍使用者 (MAU) administered_by: 管理者: @@ -26,6 +26,8 @@ zh-HK: 此帳戶是為聯盟協定而設。除非你想封鎖整個伺服器的話,否則請不要封鎖這個帳戶。如果你想封鎖伺服器,請使用網域封鎖以達到相同效果。 learn_more: 了解更多 privacy_policy: 隱私權政策 + rules: 系統規則 + rules_html: 如果你想要在本站開一個新帳戶,以下是你需要遵守的規則: see_whats_happening: 看看發生什麼事 server_stats: 伺服器統計: source_code: 源代碼 @@ -74,7 +76,6 @@ zh-HK: other: 文章 posts_tab_heading: 文章 posts_with_replies: 包含回覆的文章 - reserved_username: 這個使用者名稱已被保留 roles: admin: 管理員 bot: 機械人 @@ -114,6 +115,7 @@ zh-HK: demote: 降權 destroyed_msg: 即將刪除 %{username} 的數據 disable: 停用 + disable_sign_in_token_auth: 停用 e-mail 驗證碼 disable_two_factor_authentication: 關閉雙重認證 disabled: 已凍結 display_name: 顯示名稱 @@ -122,6 +124,7 @@ zh-HK: email: 電郵地址 email_status: 電郵狀態 enable: 解除凍結 + enable_sign_in_token_auth: 啟用 e-mail 驗證碼 enabled: 已啟用 enabled_msg: 成功解除 %{username} 帳號的凍結 followers: 關注者 @@ -186,6 +189,10 @@ zh-HK: search: 搜尋 search_same_email_domain: 其他有相同電郵網域的使用者 search_same_ip: 其他有相同 IP 位址的使用者 + security_measures: + only_password: 僅密碼 + password_and_2fa: 密碼和兩步認證 + password_and_sign_in_token: 密碼與 e-mail 驗證碼 sensitive: 敏感内容 sensitized: 已標記為敏感內容 shared_inbox_url: 公共收件箱(Shared Inbox)URL @@ -225,6 +232,7 @@ zh-HK: create_domain_block: 封鎖域名 create_email_domain_block: 封鎖電郵域名 create_ip_block: 新增IP規則 + create_unavailable_domain: 創建無效域名 demote_user: 將帳號降級 destroy_announcement: 刪除公告 destroy_custom_emoji: 刪除自定的 Emoji 表情符號 @@ -233,10 +241,13 @@ zh-HK: destroy_email_domain_block: 刪除已封鎖的電郵城名 destroy_ip_block: 刪除 IP 規則 destroy_status: 刪除文章 + destroy_unavailable_domain: 刪除無效域名 disable_2fa_user: 停用兩步驟驗證 disable_custom_emoji: 停用自定的 Emoji 表情符號 + disable_sign_in_token_auth_user: 停用該使用者之 e-mail 驗證碼 disable_user: 停用帳號 enable_custom_emoji: 啟用自定的 Emoji 表情符號 + enable_sign_in_token_auth_user: 啟用該使用者之 e-mail 驗證碼 enable_user: 啟用帳號 memorialize_account: 把帳號設定為悼念帳號 promote_user: 提升帳號權限 @@ -256,46 +267,50 @@ zh-HK: update_domain_block: 更新域名阻隔 update_status: 更新文章 actions: - assigned_to_self_report: "%{name} 指派了 %{target} 的舉報給自己" - change_email_user: "%{name} 改變了使用者 %{target} 的電郵地址" - confirm_user: "%{name} 確認了使用者 %{target} 的電郵地址" - create_account_warning: "%{name} 已警告了 %{target}" - create_announcement: "%{name} 新增了公告 %{target}" - create_custom_emoji: "%{name} 加入了新的 Emoji %{target}" - create_domain_allow: "%{name} 和 %{target} 網域結盟了" - create_domain_block: "%{name} 封鎖了網域 %{target}" - create_email_domain_block: "%{name} 封鎖了電郵網域 %{target}" - create_ip_block: "%{name} 已經設定了針對 IP %{target} 的規則" - demote_user: "%{name} 把使用者 %{target} 降權" - destroy_announcement: "%{name} 刪除了公告 %{target}" - destroy_custom_emoji: "%{name} 刪除了 Emoji %{target}" - destroy_domain_allow: "%{name} 禁止了與 %{target} 網域進行訊息聯網" - destroy_domain_block: "%{name} 取消了對網域 %{target} 的封鎖" - destroy_email_domain_block: "%{name} 取消了對電郵網域 %{target} 的封鎖" - destroy_ip_block: "%{name} 已經刪除了 IP %{target} 的規則" - destroy_status: "%{name} 刪除了 %{target} 的文章" - disable_2fa_user: "%{name} 停用了使用者 %{target} 的雙重認證" - disable_custom_emoji: "%{name} 停用了 Emoji %{target}" - disable_user: "%{name} 把使用者 %{target} 設定為禁止登入" - enable_custom_emoji: "%{name} 啟用了 Emoji %{target}" - enable_user: "%{name} 把使用者 %{target} 設定為允許登入" - memorialize_account: "%{name} 把 %{target} 設定為追悼帳戶" - promote_user: "%{name} 對提升了使用者 %{target} 的權限" - remove_avatar_user: "%{name} 取消了 %{target} 的頭像" - reopen_report: "%{name} 重開 %{target} 的舉報個案" - reset_password_user: "%{name} 重設了使用者 %{target} 的密碼" - resolve_report: "%{name} 處理了 %{target} 的舉報個案" - sensitive_account: "%{name} 將 %{target} 的媒體檔案列為敏感" - silence_account: "%{name} 靜音了帳號 %{target}" - suspend_account: "%{name} 將帳號 %{target} 停權" - unassigned_report: "%{name} 取消指派 %{target} 的舉報" - unsensitive_account: "%{name} 取消將 %{target} 的媒體檔案的設為敏感" - unsilence_account: "%{name} 取消了用戶 %{target} 的靜音狀態" - unsuspend_account: "%{name} 取消了帳號 %{target} 的停權狀態" - update_announcement: "%{name} 更新了公告 %{target}" - update_custom_emoji: "%{name} 更新了 Emoji 表情符號 %{target}" - update_domain_block: "%{name} 更新了對 %{target} 的域名阻隔" - update_status: "%{name} 更新了 %{target} 的文章" + assigned_to_self_report_html: "%{name} 指派了 %{target} 的檢舉給自己" + change_email_user_html: "%{name} 更改了使用者 %{target} 的 e-mail 地址" + confirm_user_html: "%{name} 已確認使用者 %{target} 的 e-mail 地址" + create_account_warning_html: "%{name} 已警告了 %{target}" + create_announcement_html: "%{name} 新增了公告 %{target}" + create_custom_emoji_html: "%{name} 加入了新的 Emoji %{target}" + create_domain_allow_html: "%{name} 允許網域 %{target} 加入聯邦宇宙" + create_domain_block_html: "%{name} 封鎖了網域 %{target}" + create_email_domain_block_html: "%{name} 封鎖了 e-mail 網域 %{target}" + create_ip_block_html: "%{name} 已經設定了針對 IP %{target} 的規則" + create_unavailable_domain_html: "%{name} 停止了對網域 %{target} 的更新通知" + demote_user_html: "%{name} 降權了 %{target}" + destroy_announcement_html: "%{name} 刪除了公告 %{target}" + destroy_custom_emoji_html: "%{name} 刪除了 Emoji %{target}" + destroy_domain_allow_html: "%{name} 禁止網域 %{target} 加入聯邦宇宙" + destroy_domain_block_html: "%{name} 封鎖了網域 %{target}" + destroy_email_domain_block_html: "%{name} 解除封鎖 e-mail 網域 %{target}" + destroy_ip_block_html: "%{name} 已經刪除了 IP %{target} 的規則" + destroy_status_html: "%{name} 刪除了 %{target} 的嘟文" + destroy_unavailable_domain_html: "%{name} 恢復了對網域 %{target} 的更新通知" + disable_2fa_user_html: "%{name} 停用了使用者 %{target} 的雙重認證" + disable_custom_emoji_html: "%{name} 停用了 Emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} 停用了使用者 %{target} 的 e-mail 驗證碼" + disable_user_html: "%{name} 把使用者 %{target} 設定為禁止登入" + enable_custom_emoji_html: "%{name} 啟用了 Emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} 啟用了使用者 %{target} 的 e-mail 驗證碼" + enable_user_html: "%{name} 把使用者 %{target} 設定為允許登入" + memorialize_account_html: "%{name} 把 %{target} 設定為追悼帳號" + promote_user_html: "%{name} 提升了使用者 %{target} 的權限" + remove_avatar_user_html: "%{name} 移除了 %{target} 的大頭貼" + reopen_report_html: "%{name} 重新開啟 %{target} 的檢舉案例" + reset_password_user_html: "%{name} 重設了使用者 %{target} 的密碼" + resolve_report_html: "%{name} 處理了 %{target} 的檢舉案例" + sensitive_account_html: "%{name} 將 %{target} 的媒體標記為敏感內容" + silence_account_html: "%{name} 限制了帳號 %{target}" + suspend_account_html: "%{name} 將帳號 %{target} 停權" + unassigned_report_html: "%{name} 取消指派 %{target} 的檢舉" + unsensitive_account_html: "%{name} 將 %{target} 的媒體取消標記為敏感內容" + unsilence_account_html: "%{name} 取消了用戶 %{target} 的限制狀態" + unsuspend_account_html: "%{name} 將帳號 %{target} 解除停權" + update_announcement_html: "%{name} 更新了公告 %{target}" + update_custom_emoji_html: "%{name} 更新了 Emoji 表情符號 %{target}" + update_domain_block_html: "%{name} 更新了對 %{target} 的網域封鎖" + update_status_html: "%{name} 更新了 %{target} 的嘟文" deleted_status: "(已刪除文章)" empty: 找不到任何日誌。 filter_by_action: 按動作篩選 @@ -310,10 +325,12 @@ zh-HK: new: create: 建立公告 title: 新增公告 + publish: 已發佈 published_msg: 成功發布公告! scheduled_for: 排定 %{time} scheduled_msg: 公告已排程! title: 公告 + unpublish: 未發佈 unpublished_msg: 成功取消發布公告! updated_msg: 成功更新公告! custom_emojis: @@ -350,33 +367,9 @@ zh-HK: updated_msg: 已更新表情符號 upload: 上傳新的表情符號 dashboard: - authorized_fetch_mode: 安全模式 - backlog: 未處理工作數 - config: 設定 - feature_deletions: 刪除帳號功能 - feature_invites: 邀請連結 - feature_profile_directory: 個人資料目錄 - feature_registrations: 註冊 - feature_relay: 聯網中繼站 - feature_spam_check: 防垃圾訊息 - feature_timeline_preview: 時間軸預覽 - features: 功能 - hidden_service: 與隱密服務互連 - open_reports: 未處理的舉報個案數 - pending_tags: 等待審核的主題標籤 - pending_users: 等待審核的使用者 - recent_users: 最近加入的使用者 - search: 全文搜尋 - single_user_mode: 單一使用者模式 software: 軟件 space: 儲存空間用量 title: 儀表板 - total_users: 總使用者數 - trends: 近期流行 - week_interactions: 本週互動次數 - week_users_active: 本週活躍使用者數 - week_users_new: 本週新使用者數 - whitelist_mode: 白名單模式 domain_allows: add_new: 將網域加入白名單 created_msg: 網域已成功加入白名單 @@ -435,9 +428,33 @@ zh-HK: create: 新增網域 title: 新增電郵網域阻隔 title: 電郵網域阻隔 + follow_recommendations: + description_html: "跟隨建議幫助新使用者快速找到有趣內容。 當使用者尚未和其他帳號足夠多的互動以產生個人化建議時,以下帳號將被推荐。這些是一句指定語言的近期參與度和本地粉絲數最高之帳戶組合每日重新計算。" + language: 按語言 + status: 狀態 + suppress: 隱藏跟隨建議 + suppressed: 已隱藏 + title: 跟隨建議 + unsuppress: 還原跟隨建議 instances: + back_to_all: 全部 + back_to_limited: 已靜音 + back_to_warning: 警告 by_domain: 域名 + delivery: + all: 全部 + clear: 清除遞送錯誤 + restart: 重新啟動遞送 + stop: 停止遞送 + title: 遞送 + unavailable: 離線 + unavailable_message: 無法遞送 + warning: 警告 + warning_message: + other: 遞送失敗 %{count} 天 delivery_available: 可傳送 + delivery_error_days: 遞送失敗天數 + delivery_error_hint: 若 %{count} 天皆無法達成遞送,將會被自動標記為離線。 empty: 找不到域名。 known_accounts: other: "%{count} 已知的帳號" @@ -530,10 +547,18 @@ zh-HK: resolved: 已處理 resolved_msg: 舉報個案已被處理! status: 狀態 + target_origin: 被檢舉帳號來源 title: 舉報 unassign: 取消指派 unresolved: 未處理 updated_at: 更新 + rules: + add_new: 新增規則 + delete: 刪除 + description_html: 通常大部份宣稱已經閱讀並同意服務條款的人,在出現事故之前都沒有仔細閱讀條款內文。為了讓人方便閱讀服務條款,請以條列的形式將伺服器規則盡可能地寫得簡短一點。嘗試把每一項規則寫得簡短易明,但又不要把它們拆得過份瑣碎。 + edit: 編輯規則 + empty: 尚未定義伺服器規則 + title: 伺服器守則 settings: activity_api_enabled: desc_html: 本站的文章數量、活躍使用者數量、及每週新註冊使用者數量 @@ -557,9 +582,6 @@ zh-HK: users: 所有已登入的帳號 domain_blocks_rationale: title: 顯示原因予 - enable_bootstrap_timeline_accounts: - desc_html: 自動為新用戶追隨預設的帳號,為他們的首頁動態增加一點色彩 - title: 啟用「新使用者預設關注」功能 hero: desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會默認為服務站縮圖 title: 主題圖片 @@ -607,15 +629,12 @@ zh-HK: desc_html: 本站詳細資訊頁的內文
你可以在此使用 HTML title: 本站詳細資訊 site_short_description: - desc_html: "顯示在側邊欄和網頁標籤(meta tags)。以一句話描述Mastodon是甚麼,有甚麼令這個伺服器脫\U000294D9而出。" + desc_html: 顯示在側邊欄和網頁標籤(meta tags)。以一句話描述Mastodon是甚麼,有甚麼令這個伺服器脫\U000294D9而出。 title: 伺服器短描述 site_terms: desc_html: 可以填寫自己的隱私權政策、使用條款或其他法律文本。可以使用 HTML 標籤 title: 自訂使用條款 site_title: 本站名稱 - spam_check_enabled: - desc_html: Mastodon可以自動舉報產生重複的垃圾內容的帳號,不過未必準確。 - title: 自動防廣告訊息 thumbnail: desc_html: 用於在 OpenGraph 和 API 中顯示預覽圖。推薦大小 1200×630px title: 本站縮圖 @@ -646,13 +665,18 @@ zh-HK: no_status_selected: 因未選擇嘟文而未變更。 title: 帳戶文章 with_media: 含有媒體檔案 + system_checks: + database_schema_check: + message_html: 有待處理的資料庫轉移 (database migration) 。請執行以確保應用程式行為合乎預期 + rules_check: + action: 管理伺服器規則 + message_html: 您尚未定義任何伺服器規則 + sidekiq_process_check: + message_html: 沒有 %{value} 佇列的 Sidekiq 處理程序。請檢查 Sidekiq 設定檔案 tags: accounts_today: 今日特殊使用 accounts_week: 今週特殊使用 breakdown: 根據來源剖析是日用量 - context: 上下文 - directory: 在目錄中 - in_directory: 目錄中有 %{count} 個 last_active: 上次活躍 most_popular: 最熱門 most_recent: 最近 @@ -669,6 +693,7 @@ zh-HK: add_new: 新增 delete: 刪除 edit_preset: 設定警告預設 + empty: 您尚未定義任何預設警告 title: 管理警告預設 admin_mailer: new_pending_account: @@ -783,7 +808,7 @@ zh-HK: date: formats: default: "%Y年%b月%d日" - with_month_name: "%B %d, %Y" + with_month_name: "%Y年%B月%d日" datetime: distance_in_words: about_x_hours: "%{count}小時前" @@ -956,6 +981,17 @@ zh-HK: lists: errors: limit: 你所建立的列表數量已經達到上限 + login_activities: + authentication_methods: + otp: 兩步認證軟體 + password: 密碼 + sign_in_token: 電子郵件安全碼 + webauthn: 安全密鑰 + description_html: 若發現有無法辨識的帳號動態,請考慮更改密碼以及啟用雙重階段驗證。 + empty: 沒有驗證歷史 + failed_sign_in_html: 以 %{method} 從 %{ip} (%{browser}) 登入失敗 + successful_sign_in_html: 以 %{method} 從 %{ip} (%{browser}) 成功登入 + title: 驗證操作歷史 media_attachments: validations: images_and_video: 不能在已有圖片的文章上加入影片 @@ -1026,10 +1062,14 @@ zh-HK: body: "%{name} 在文章中提及你︰" subject: "%{name} 在文章中提及你" title: 新的提及 + poll: + subject: "%{name} 發起的投票已截止" reblog: body: 你的文章被 %{name} 轉推: subject: "%{name} 轉推了你的文章" title: 新的轉推 + status: + subject: "%{name} 剛發表了文章" notifications: email_events: 電郵通知活動 email_events_hint: 選擇你想接收通知的活動: @@ -1156,6 +1196,7 @@ zh-HK: revoke: 取消 revoke_success: 作業階段成功取消 title: 作業階段 + view_authentication_history: 檢視帳號驗證紀錄 settings: account: 帳戶 account_settings: 帳戶設定 @@ -1176,10 +1217,9 @@ zh-HK: preferences: 偏好設定 profile: 個人資料 relationships: 關注及追隨者 + statuses_cleanup: 自動嘟文刪除 two_factor_authentication: 雙重認證 webauthn_authentication: 安全鑰匙 - spam_check: - spam_detected: 此為系統的自動報告:已發現垃圾訊息。 statuses: attached: audio: @@ -1216,12 +1256,47 @@ zh-HK: sign_in_to_participate: 登入以加入討論 title: "%{name}:「%{quote}」" visibilities: + direct: 私人訊息 private: 關注者觀看 private_long: 只有關注你的人能看到 public: 公開 public_long: 所有人都能看到 unlisted: 公開,但不在公共時間軸顯示 unlisted_long: 所有人都能看到,但不在公共時間軸(本站時間軸、跨站時間軸)顯示 + statuses_cleanup: + enabled: 自動刪除舊嘟文 + enabled_hint: 當您的嘟文達到指定的時間門檻後,自動刪除嘟文,除非他們符合其中以下例外條件之一 + exceptions: 例外 + explanation: 由於刪除嘟文對伺服器而言是相當耗費資源的操作,將僅於伺服器不繁忙時慢慢執行。由此緣故,您的嘟文將可能超過設定之時間門檻一會兒後才被刪除。 + ignore_favs: 忽略最愛 + ignore_reblogs: 忽略轉嘟 + interaction_exceptions: 根據互動的例外 + interaction_exceptions_explanation: 請注意嘟文是無法保證被刪除的,如果在一次處理過後嘟文低於最愛或轉嘟的門檻。 + keep_direct: 保留私訊 + keep_direct_hint: 不會刪除任何您的私訊 + keep_media: 保留包含媒體內容的嘟文 + keep_media_hint: 不會刪除您包含媒體內容的嘟文 + keep_pinned: 保留釘選嘟文 + keep_pinned_hint: 不會刪除您的釘選嘟文 + keep_polls: 保留投票 + keep_polls_hint: 不會刪除您的投票 + keep_self_bookmark: 保留您已標記為書簽之嘟文 + keep_self_bookmark_hint: 不會刪除您已標記為書簽之嘟文 + keep_self_fav: 保留您已標記為最愛之嘟文 + keep_self_fav_hint: 不會刪除您已標記為最愛之嘟文 + min_age: + '1209600': 2 週 + '15778476': 6 個月 + '2629746': 1 個月 + '31556952': 1 年 + '5259492': 2 個月 + '63113904': 2 年 + '7889238': 3 個月 + min_age_label: 按時間篩選 + min_favs: 保留超過嘟文最愛門檻 + min_favs_hint: 如果您嘟文已收到超過最愛門檻則不會刪除。留白表示不論最愛數量皆刪除嘟文。 + min_reblogs: 保留超過嘟文轉嘟門檻 + min_reblogs_hint: 如果您嘟文已收到超過轉嘟門檻則不會刪除。留白表示不論轉嘟數量皆刪除嘟文。 stream_entries: pinned: 置頂文章 reblogged: 轉推 @@ -1384,11 +1459,8 @@ zh-HK: tips: 小貼士 title: 歡迎 %{name} 加入! users: - blocked_email_provider: 此電郵提供商並不被允許 follow_limit_reached: 你不能關注多於%{limit} 人 generic_access_help_html: 不能登入?你可以寄電郵至 %{email} 尋求協助 - invalid_email: 電郵地址格式不正確 - invalid_email_mx: 此電郵地址不存在 invalid_otp_token: 雙重認證碼不正確 invalid_sign_in_token: 無效的安全碼 otp_lost_help_html: 如果這兩者你均無法登入,你可以聯繫 %{email} diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index da340a1bc3..b2cfeafac1 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -21,11 +21,11 @@ zh-TW: federation_hint_html: 你只需要擁有 %{instance} 的帳戶,就可以追蹤隨便一台 Mastodon 伺服器上的人等等。 get_apps: 嘗試行動應用程式 hosted_on: 在 %{domain} 運作的 Mastodon 站點 - instance_actor_flash: '這個帳戶是個用來代表伺服器自已的虛擬角色,而不是實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。 - -' + instance_actor_flash: "這個帳戶是個用來代表伺服器自已的虛擬角色,而不是實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。 \n" learn_more: 了解詳細 privacy_policy: 隱私權政策 + rules: 伺服器規則 + rules_html: 以下是您若想在此 Mastodon 伺服器建立帳戶必須遵守的規則總結: see_whats_happening: 看看發生什麼事 server_stats: 伺服器統計: source_code: 原始碼 @@ -57,7 +57,7 @@ zh-TW: followers: other: 關注者 following: 正在關注 - instance_actor_flash: 這個帳號是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。 + instance_actor_flash: 這個帳戶是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。 joined: 加入於 %{date} last_active: 上次活躍時間 link_verified_on: 此連結的所有權已在 %{date} 檢查過 @@ -74,7 +74,6 @@ zh-TW: other: 嘟文 posts_tab_heading: 嘟文 posts_with_replies: 嘟文與回覆 - reserved_username: 此使用者名稱已被保留 roles: admin: 管理員 bot: 機器人 @@ -100,12 +99,12 @@ zh-TW: avatar: 頭像 by_domain: 站點 change_email: - changed_msg: 已成功變更帳戶電子信箱位址! - current_email: 目前的電子信箱位址 - label: 變更電子信箱位址 - new_email: 新的電子信箱位址 - submit: 變更電子信箱位址 - title: 為 %{username} 變更電子信箱位址 + changed_msg: 已成功變更帳戶電子信箱地址! + current_email: 目前的電子信箱地址 + label: 變更電子信箱地址 + new_email: 新的電子信箱地址 + submit: 變更電子信箱地址 + title: 為 %{username} 變更電子信箱地址 confirm: 確定 confirmed: 已確定 confirming: 確定 @@ -114,14 +113,16 @@ zh-TW: demote: 降級 destroyed_msg: 即將刪除 %{username} 的數據 disable: 停用 + disable_sign_in_token_auth: 停用電子信箱 token 驗證 disable_two_factor_authentication: 停用兩階段認證 disabled: 已停用 display_name: 暱稱 domain: 站點 edit: 編輯 - email: 電子信箱位址 + email: 電子信箱地址 email_status: 電子信箱狀態 enable: 啟用 + enable_sign_in_token_auth: 啟用電子信箱 token 驗證 enabled: 已啟用 enabled_msg: 成功解除 %{username} 帳戶的凍結 followers: 關注者 @@ -141,7 +142,7 @@ zh-TW: media_attachments: 多媒體附件 memorialize: 設定為追悼帳戶 memorialized: 被悼念的 - memorialized_msg: 成功將%{username} 的帳號變為紀念帳號 + memorialized_msg: 成功將%{username} 的帳戶變為紀念帳戶 moderation: active: 活躍 all: 全部 @@ -152,7 +153,7 @@ zh-TW: moderation_notes: 管理備忘 most_recent_activity: 最近活動 most_recent_ip: 最近 IP 位址 - no_account_selected: 未選取任何帳號,因此未變更 + no_account_selected: 未選取任何帳戶,因此未變更 no_limits_imposed: 未受限制 not_subscribed: 未訂閱 pending: 等待審核中 @@ -165,7 +166,7 @@ zh-TW: redownloaded_msg: 成功重新載入%{username} 的個人資料頁面 reject: 拒絕 reject_all: 全部拒絕 - rejected_msg: 成功拒絕了%{username} 的新帳號申請 + rejected_msg: 成功拒絕了%{username} 的新帳戶申請 remove_avatar: 取消頭像 remove_header: 移除開頭 removed_avatar_msg: 成功刪除了 %{username} 的頭像 @@ -186,6 +187,10 @@ zh-TW: search: 搜尋 search_same_email_domain: 其他有同個電子郵件網域的使用者 search_same_ip: 其他有同個 IP 的使用者 + security_measures: + only_password: 僅使用密碼 + password_and_2fa: 密碼及二重因素驗證 + password_and_sign_in_token: 密碼及電子信箱 token 驗證 sensitive: 敏感内容 sensitized: 已標記為敏感內容 shared_inbox_url: 共享收件箱網址 @@ -201,7 +206,7 @@ zh-TW: suspension_reversible_hint_html: 這個帳戶已被暫停,所有數據將會在 %{date} 被刪除。在此之前,您可以完全回復您的帳戶。如果您想即時刪除這個帳戶的數據,您可以在下面進行操作。 time_in_queue: 正在佇列等待 %{time} title: 帳戶 - unconfirmed_email: 未確認的電子信箱位址 + unconfirmed_email: 未確認的電子信箱地址 undo_sensitized: 取消敏感狀態 undo_silenced: 取消靜音 undo_suspension: 取消停權 @@ -216,7 +221,7 @@ zh-TW: action_logs: action_types: assigned_to_self_report: 指派回報 - change_email_user: 變更使用者的電子信箱位址 + change_email_user: 變更使用者的電子信箱地址 confirm_user: 確認使用者 create_account_warning: 建立警告 create_announcement: 建立公告 @@ -225,6 +230,7 @@ zh-TW: create_domain_block: 建立阻擋網域 create_email_domain_block: 封鎖電子郵件站台 create_ip_block: 新增IP規則 + create_unavailable_domain: 新增無法存取的網域 demote_user: 把用戶降級 destroy_announcement: 刪除公告 destroy_custom_emoji: 刪除自訂顏文字 @@ -233,22 +239,25 @@ zh-TW: destroy_email_domain_block: 刪除阻擋電郵網域 destroy_ip_block: 刪除 IP 規則 destroy_status: 刪除狀態 + destroy_unavailable_domain: 刪除無法存取的網域 disable_2fa_user: 停用兩階段認證 disable_custom_emoji: 停用自訂顏文字 + disable_sign_in_token_auth_user: 停用使用者電子信箱 token 驗證 disable_user: 停用帳戶 enable_custom_emoji: 啓用自訂顏文字 + enable_sign_in_token_auth_user: 啟用使用者電子信箱 token 驗證 enable_user: 啓用帳戶 - memorialize_account: 設定成紀念帳號 + memorialize_account: 設定成紀念帳戶 promote_user: 把用戶升級 remove_avatar_user: 刪除大頭貼 reopen_report: 重開舉報 reset_password_user: 重設密碼 resolve_report: 消除舉報 - sensitive_account: 把您的帳號的媒體標記為敏感內容 + sensitive_account: 把您的帳戶的媒體標記為敏感內容 silence_account: 靜音用戶 suspend_account: 暫停用戶 unassigned_report: 取消指派舉報 - unsensitive_account: 取消把您的帳號的媒體設定為敏感內容 + unsensitive_account: 取消把您的帳戶的媒體設定為敏感內容 unsilence_account: 取消用戶的靜音狀態 unsuspend_account: 取消用戶的暫停狀態 update_announcement: 更新公告 @@ -256,46 +265,50 @@ zh-TW: update_domain_block: 更新封鎖網域 update_status: 更新狀態 actions: - assigned_to_self_report: "%{name} 接受了檢舉 %{target}" - change_email_user: "%{name} 變更了使用者 %{target} 的電子信箱位址" - confirm_user: "%{name} 確認了使用者 %{target} 的電子信箱位址" - create_account_warning: "%{name} 已對 %{target} 送出警告" - create_announcement: "%{name} 建立了新公告 %{target}" - create_custom_emoji: "%{name} 加入自訂表情符號 %{target}" - create_domain_allow: "%{name} 將 %{target} 網域加入黑名單了" - create_domain_block: "%{name} 封鎖了站點 %{target}" - create_email_domain_block: "%{name} 封鎖了電子信箱網域 %{target}" - create_ip_block: "%{name} 已經設定了IP %{target} 的規則" - demote_user: "%{name} 把使用者 %{target} 降級" - destroy_announcement: "%{name} 刪除了公告 %{target}" - destroy_custom_emoji: "%{name} 破壞了 %{target} 表情符號" - destroy_domain_allow: "%{name} 從白名單中移除了 %{target} 網域" - destroy_domain_block: "%{name} 取消了對站點 %{target} 的封鎖" - destroy_email_domain_block: "%{name} 取消了對電子信箱網域 %{target} 的封鎖" - destroy_ip_block: "%{name} 已經刪除了 IP %{target} 的規則" - destroy_status: "%{name} 刪除了 %{target} 的嘟文" - disable_2fa_user: "%{name} 停用了使用者 %{target} 的兩階段認證" - disable_custom_emoji: "%{name} 停用了自訂表情符號 %{target}" - disable_user: "%{name} 將使用者 %{target} 設定為禁止登入" - enable_custom_emoji: "%{name} 啟用了自訂表情符號 %{target}" - enable_user: "%{name} 將使用者 %{target} 設定為允許登入" - memorialize_account: "%{name} 將 %{target} 設定為追悼帳戶" - promote_user: "%{name} 對使用者 %{target} 進行了晉級操作" - remove_avatar_user: "%{name} 移除了 %{target} 的頭像" - reopen_report: "%{name} 重新開啟 %{target} 的檢舉" - reset_password_user: "%{name} 重新設定了使用者 %{target} 的密碼" - resolve_report: "%{name} 處理了 %{target} 的檢舉" - sensitive_account: "%{name} 將 %{target} 的媒體檔案標記為敏感內容" - silence_account: "%{name} 靜音了使用者 %{target}" - suspend_account: "%{name} 停權了使用者 %{target}" - unassigned_report: "%{name} 取消指派 %{target} 的檢舉" - unsensitive_account: "%{name} 將 %{target} 的媒體檔案的敏感狀態取消" - unsilence_account: "%{name} 取消了使用者 %{target} 的靜音狀態" - unsuspend_account: "%{name} 取消了使用者 %{target} 的停權狀態" - update_announcement: "%{name} 更新了公告 %{target}" - update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}" - update_domain_block: "%{name} 更新封鎖網域 %{target}" - update_status: "%{name} 重整了 %{target} 的嘟文" + assigned_to_self_report_html: "%{name} 將報告 %{target} 指派給自己" + change_email_user_html: "%{name} 變更了使用者 %{target} 的電子信箱地址" + confirm_user_html: "%{name} 確認了使用者 %{target} 的電子信箱位址" + create_account_warning_html: "%{name} 已對 %{target} 送出警告" + create_announcement_html: "%{name} 新增了公告 %{target}" + create_custom_emoji_html: "%{name} 上傳了新自訂表情符號 %{target}" + create_domain_allow_html: "%{name} 允許 %{target} 網域加入站點聯盟" + create_domain_block_html: "%{name} 封鎖了網域 %{target}" + create_email_domain_block_html: "%{name} 封鎖了電子信箱網域 %{target}" + create_ip_block_html: "%{name} 已經設定了IP %{target} 的規則" + create_unavailable_domain_html: "%{name} 停止發送至網域 %{target}" + demote_user_html: "%{name} 將使用者 %{target} 降級" + destroy_announcement_html: "%{name} 刪除了公告 %{target}" + destroy_custom_emoji_html: "%{name} 停用了自訂表情符號 %{target}" + destroy_domain_allow_html: "%{name} 不允許與網域 %{target} 加入站點聯盟" + destroy_domain_block_html: "%{name} 取消了對網域 %{target} 的封鎖" + destroy_email_domain_block_html: "%{name} 取消了對電子信箱網域 %{target} 的封鎖" + destroy_ip_block_html: "%{name} 刪除了 IP %{target} 的規則" + destroy_status_html: "%{name} 刪除了 %{target} 的嘟文" + destroy_unavailable_domain_html: "%{name} 恢復了對網域 %{target} 的發送" + disable_2fa_user_html: "%{name} 停用了使用者 %{target} 的兩階段認證" + disable_custom_emoji_html: "%{name} 停用了自訂表情符號 %{target}" + disable_sign_in_token_auth_user_html: "%{name} 停用了 %{target} 之使用者電子信箱 token 驗證" + disable_user_html: "%{name} 將使用者 %{target} 設定為禁止登入" + enable_custom_emoji_html: "%{name} 啟用了自訂表情符號 %{target}" + enable_sign_in_token_auth_user_html: "%{name} 啟用了 %{target} 之使用者電子信箱 token 驗證" + enable_user_html: "%{name} 將使用者 %{target} 設定為允許登入" + memorialize_account_html: "%{name} 將 %{target} 設定為追悼帳戶" + promote_user_html: "%{name} 對使用者 %{target} 進行了晉級操作" + remove_avatar_user_html: "%{name} 移除了 %{target} 的大頭貼" + reopen_report_html: "%{name} 重新開啟 %{target} 的檢舉" + reset_password_user_html: "%{name} 重新設定了使用者 %{target} 的密碼" + resolve_report_html: "%{name} 處理了 %{target} 的檢舉" + sensitive_account_html: "%{name} 將 %{target} 的媒體檔案標記為敏感內容" + silence_account_html: "%{name} 靜音了使用者 %{target}" + suspend_account_html: "%{name} 停權了使用者 %{target}" + unassigned_report_html: "%{name} 取消指派 %{target} 的檢舉" + unsensitive_account_html: "%{name} 將 %{target} 的媒體檔案的敏感狀態取消" + unsilence_account_html: "%{name} 取消了使用者 %{target} 的靜音狀態" + unsuspend_account_html: "%{name} 取消了使用者 %{target} 的停權狀態" + update_announcement_html: "%{name} 更新了公告 %{target}" + update_custom_emoji_html: "%{name} 更新了自訂表情符號 %{target}" + update_domain_block_html: "%{name} 更新了 %{target} 之網域封鎖" + update_status_html: "%{name} 更新了 %{target} 的嘟文" deleted_status: "(已刪除嘟文)" empty: 找不到 log filter_by_action: 按動作篩選 @@ -310,10 +323,12 @@ zh-TW: new: create: 建立公告 title: 新增公告 + publish: 發佈 published_msg: 成功發布公告! scheduled_for: 排定 %{time} scheduled_msg: 公告已排定公開! title: 公告 + unpublish: 取消發佈 unpublished_msg: 成功取消發布公告! updated_msg: 成功更新公告! custom_emojis: @@ -350,33 +365,25 @@ zh-TW: updated_msg: 已更新表情符號! upload: 上傳新的表情符號 dashboard: - authorized_fetch_mode: 安全模式 - backlog: 未處理工作數 - config: 設定 - feature_deletions: 帳戶刪除 - feature_invites: 邀請連結 - feature_profile_directory: 個人資料目錄 - feature_registrations: 註冊 - feature_relay: 聯邦中繼站 - feature_spam_check: 防垃圾訊息 - feature_timeline_preview: 時間軸預覽 - features: 功能 - hidden_service: 與隱密服務互連 - open_reports: 待處理檢舉數 - pending_tags: 等待審核的主題標籤 - pending_users: 等待審核的使用者 - recent_users: 最近加入的使用者 - search: 全文搜尋 - single_user_mode: 單一使用者模式 + active_users: 活躍使用者 + interactions: 互動 + media_storage: 媒體儲存空間 + new_users: 新使用者 + opened_reports: 開啟的報告 + pending_reports_html: + other: "%{count} 份待處理報告" + pending_tags_html: + other: "%{count} 個待處理主題標籤" + pending_users_html: + other: "%{count} 位待處理使用者" + resolved_reports: 解決的報告 software: 軟體 + sources: 註冊來源 space: 儲存空間用量 title: 儀表板 - total_users: 總使用者數 - trends: 趨勢 - week_interactions: 本週互動次數 - week_users_active: 本週活躍使用者數 - week_users_new: 本週新使用者數 - whitelist_mode: 白名單模式 + top_languages: 最活躍語言 + top_servers: 最活躍伺服器 + website: 網站 domain_allows: add_new: 將網域加入白名單 created_msg: 網域已成功加入白名單 @@ -435,9 +442,35 @@ zh-TW: create: 新增站點 title: 新增電子信箱黑名單項目 title: 電子信箱黑名單 + follow_recommendations: + description_html: |- + 跟隨建議幫助新使用者們快速找到有趣的內容. 當使用者沒有與其他帳號有足夠多的互動以建立個人化跟隨建議時,這些帳號將會被推荐。這些帳號將基於某選定語言之高互動和高本地跟隨者數量帳號而 + 每日重新更新。 + language: 對於語言 + status: 狀態 + suppress: 取消跟隨建議 + suppressed: 取消 + title: 跟隨建議 + unsuppress: 回復跟隨建議 instances: + back_to_all: 所有 + back_to_limited: 受限制的 + back_to_warning: 警告 by_domain: 站台 + delivery: + all: 所有 + clear: 清除遞送錯誤 + restart: 重新啟動遞送 + stop: 停止遞送 + title: 遞送 + unavailable: 無法使用 + unavailable_message: 無法使用遞送 + warning: 警告 + warning_message: + other: 遞送失敗 %{count} 天 delivery_available: 可傳送 + delivery_error_days: 遞送失敗天數 + delivery_error_hint: 若 %{count} 日皆無法遞送 ,則會自動標記無法遞送。 empty: 找不到網域 known_accounts: other: "%{count} 已知的帳戶" @@ -509,7 +542,7 @@ zh-TW: are_you_sure: 你確定嗎? assign_to_self: 指派給自己 assigned: 指派負責人 - by_target_domain: 檢舉帳號之網域 + by_target_domain: 檢舉帳戶之網域 comment: none: 無 created_at: 日期 @@ -530,10 +563,18 @@ zh-TW: resolved: 已解決 resolved_msg: 檢舉已處理! status: 嘟文 + target_origin: 檢舉帳戶之來源 title: 檢舉 unassign: 取消指派 unresolved: 未解決 updated_at: 更新 + rules: + add_new: 新增規則 + delete: 刪除 + description_html: 雖然大多數人皆宣稱已閱讀並同意服務條款,通常直到某些問題發生時人們從未讀過。以透過提供條列式規則的方式讓您的伺服器規則可以一目了然。試著維持各項條款簡短而明瞭,但也試著不要將條款切割為許多分開的項目。 + edit: 編輯規則 + empty: 未曾定義任何伺服器規則 + title: 伺服器規則 settings: activity_api_enabled: desc_html: 本站使用者發佈的嘟文數量,以及本站的活躍使用者與一週內新使用者數量 @@ -542,7 +583,7 @@ zh-TW: desc_html: 以半形逗號分隔多個使用者名。只能加入來自本站且未開啟保護的帳戶。如果留空,則預設關注本站所有管理員。 title: 新使用者預設關注 contact_information: - email: 用於聯絡的公開電子信箱位址 + email: 用於聯絡的公開電子信箱地址 username: 請輸入使用者名稱 custom_css: desc_html: 透過於每個頁面都載入的 CSS 調整外觀 @@ -557,9 +598,6 @@ zh-TW: users: 套用至所有登入的本機使用者 domain_blocks_rationale: title: 顯示解釋原因 - enable_bootstrap_timeline_accounts: - desc_html: 使新使用者自動跟隨設定之帳號,所以他們的首頁動態一開始不會空白 - title: 啟用新使用者的預設追蹤 hero: desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會重設回伺服器預覽圖 title: 主題圖片 @@ -586,6 +624,7 @@ zh-TW: disabled: 沒有人 title: 允許發送邀請的身份 require_invite_text: + desc_html: 如果已設定為手動審核註冊,請將「加入原因」設定為必填項目。 title: 要求新使用者填申請書以索取邀請 registrations_mode: modes: @@ -606,13 +645,12 @@ zh-TW: desc_html: 可放置行為準則、規定以及其他此伺服器特有的內容。可使用 HTML 標籤 title: 本站詳細資訊 site_short_description: + desc_html: 顯示在側邊欄和網頁標籤 (meta tags)。以一段話描述 Mastodon 是甚麼,以及這個伺服器的特色。 title: 伺服器短描述 site_terms: desc_html: 可以填寫自己的隱私權政策、使用條款或其他法律文本。可以使用 HTML 標籤 title: 自訂使用條款 site_title: 伺服器名稱 - spam_check_enabled: - title: 自動防廣告訊息 thumbnail: desc_html: 用於在 OpenGraph 和 API 中顯示預覽圖。推薦大小 1200×630px title: 伺服器縮圖 @@ -621,8 +659,10 @@ zh-TW: title: 時間軸預覽 title: 網站設定 trendable_by_default: + desc_html: 影響此前並未被禁用的標籤 title: 允許熱門的主題標籤直接顯示於趨勢區,不需經過審核 trends: + desc_html: 公開目前炎上的已審核標籤 title: 趨勢主題標籤 site_uploads: delete: 刪除上傳的檔案 @@ -641,16 +681,22 @@ zh-TW: no_status_selected: 因未選擇嘟文而未變更。 title: 帳戶嘟文 with_media: 含有媒體檔案 + system_checks: + database_schema_check: + message_html: 有挂起的数据库迁移,请运行它们以确保应用程序按照预期运行。 + rules_check: + action: 管理服务器规则 + message_html: 你没有定义任何服务器规则。 + sidekiq_process_check: + message_html: 没有队列 %{value} 的Sidekiq进程,请检查你的Sidekiq配置 tags: accounts_today: 本日不重複使用者數 accounts_week: 本週不重複使用者數 - context: 上下文 - directory: 在目錄中 - in_directory: 目錄中有 %{count} 個 + breakdown: 根據來源分類本日使用情況 last_active: 上次活躍 most_popular: 最熱門 most_recent: 最近 - name: Hashtag + name: 主題標籤 review: 審核嘟文 reviewed: 已審核 title: 主題標籤 @@ -662,15 +708,32 @@ zh-TW: warning_presets: add_new: 新增 delete: 刪除 + edit_preset: 編輯預設警告 + empty: 您未曾定義任何預設警告 + title: 管理預設警告 admin_mailer: + new_pending_account: + body: 以下是新帳戶的詳細資訊。您可以同意或拒絕這項申請。 + subject: "%{instance} 上有新帳戶 (%{username}) 待審核" new_report: body: "%{reporter} 檢舉了使用者 %{target}" body_remote: 來自 %{domain} 的使用者檢舉了使用者 %{target} subject: 來自 %{instance} 的使用者檢舉(#%{id}) + new_trending_tag: + body: '尚未通過審核的主題標籤 #%{name} 今天有炎上趨勢。這個標籤在你開綠燈之前不會公開顯示,你也可以選擇無視它以遭蒙蔽雙眼。' + subject: "%{instance} 上有待審核的主題標籤 (#%{name})" + aliases: + add_new: 建立別名 + created_msg: 成功建立別名。您可以自舊帳戶開始轉移。 + deleted_msg: 成功移除別名。您將無法再由舊帳戶轉移到目前的帳戶。 + empty: 您目前沒有任何別名。 + hint_html: 如果想由其他帳戶轉移到此帳戶,您可以在此處建立別名,稍後系統將容許您把關注者由舊帳戶轉移至此。此項作業是無害且可復原的帳戶的遷移程序需要在舊帳戶啟動。 + remove: 取消連結別名 appearance: advanced_web_interface: 進階網頁介面 advanced_web_interface_hint: 進階網頁界面可讓您配置許多不同的欄位來善用多餘的螢幕空間,依需要同時查看盡可能多的資訊如:首頁、通知、站點聯邦時間軸、任意數量的列表和主題標籤。 animations_and_accessibility: 動畫與可用性 + confirmation_dialogs: 確認對話框 discovery: 探索 localization: body: Mastodon 是由志願者翻譯的。 @@ -696,13 +759,19 @@ zh-TW: auth: apply_for_account: 索取註冊邀請 change_password: 密碼 + checkbox_agreement_html: 我同意 之伺服器規則 以及 服務條款 + checkbox_agreement_without_rules_html: 我同意 服務條款 delete_account: 刪除帳戶 delete_account_html: 如果你想刪除你的帳戶,請點擊這裡繼續。你需要確認你的操作。 description: - prefix_sign_up: 現在就註冊 Mastodon 帳號吧! + prefix_invited_by_user: "@%{name} 邀請您加入這個 Mastodon 伺服器!" + prefix_sign_up: 現在就註冊 Mastodon 帳戶吧! + suffix: 有了帳戶,就可以從任何 Mastodon 伺服器關注任何人、發發廢嘟,並且與任何 Mastodon 伺服器的使用者交流,以及更多! didnt_get_confirmation: 沒有收到驗證信? + dont_have_your_security_key: 找不到您的安全金鑰? forgot_password: 忘記密碼? invalid_reset_password_token: 密碼重設 token 無效或已過期。請重新設定密碼。 + link_to_otp: 請從您手機輸入雙重驗證 (2FA) 或還原碼 link_to_webauth: 使用您的安全金鑰 login: 登入 logout: 登出 @@ -710,6 +779,7 @@ zh-TW: migrate_account_html: 如果你希望引導他人關注另一個帳戶,請到這裡設定。 or_log_in_with: 或透過其他方式登入 providers: + cas: CAS saml: SAML register: 註冊 registration_closed: "%{instance} 現在不開放新成員" @@ -718,8 +788,18 @@ zh-TW: security: 登入資訊 set_new_password: 設定新密碼 setup: - email_settings_hint_html: 請確認 e-mail 是否傳送到 %{email} 。如果不對的話,可以從帳號設定修改。 + email_below_hint_html: 如果此電子郵件地址不正確,您可於此修改並接收郵件進行認證。 + email_settings_hint_html: 請確認電子信件是否寄至 %{email} 。如果不對的話,可以在帳戶設定裡變更。 title: 設定 + status: + account_status: 帳戶狀態 + confirming: 等待電子郵件確認完成。 + functional: 您的帳戶可以正常使用了。 + pending: 管管們正在處理您的申請,這可能需要一點時間處理。我們將在申請通過後以電子郵件方式通知您。 + redirecting_to: 您的帳戶因目前重新導向至 %{acct} 而被停用。 + too_fast: 送出表單的速度太快跟不上,請稍後再試。 + trouble_logging_in: 登錄時遇到困難? + use_security_key: 使用安全金鑰 authorize_follow: already_following: 你已經關注了這個使用者 already_requested: 您早已向該帳戶寄送追蹤請求 @@ -732,6 +812,19 @@ zh-TW: return: 顯示個人資料頁 web: 返回本站 title: 關注 %{acct} + challenge: + confirm: 繼續 + hint_html: "温馨小提醒: 我們在接下來一小時內不會再要求您輸入密碼。" + invalid_password: 密碼錯誤 + prompt: 輸入密碼以繼續 + crypto: + errors: + invalid_key: 這不是一把有效的 Ed25519 或 Curve25519 金鑰 + invalid_signature: 這不是有效的 Ed25519 簽章 + date: + formats: + default: "%Y年%b月%d日" + with_month_name: "%Y年%B月%d日" datetime: distance_in_words: about_x_hours: "%{count}小時前" @@ -747,14 +840,33 @@ zh-TW: x_months: "%{count}個月" x_seconds: "%{count}秒" deletes: + challenge_not_passed: 您所輸入的資料不正確 confirm_password: 輸入你現在的密碼來驗證身份 + confirm_username: 請輸入您的使用者名稱以作確認 proceed: 刪除帳戶 success_msg: 你的帳戶已經成功刪除 + warning: + before: 在進行下一步驟之前,請詳細閱讀以下説明: + caches: 已被其他節點快取的內容可能會殘留其中 + data_removal: 您的嘟文和其他資料將會被永久刪除 + email_change_html: 你可以在不刪除帳戶的情況下變更你的電子郵件地址 + email_contact_html: 如果你仍然沒有收到郵件,請寄信到 %{email} 以獲得協助 + email_reconfirmation_html: 如果你沒有收到確認郵件,你可以請求再次發送 + irreversible: 你將無法復原或重新啟用你的帳戶 + more_details_html: 更多詳細資訊,請參閲隱私政策。 + username_available: 你的使用者名稱將會釋出供他人使用 + username_unavailable: 你的使用者名稱將會保留並不予他人使用 + directories: + directory: 個人資料目錄 + explanation: 根據興趣去發現新朋友 + explore_mastodon: 探索%{title} + domain_validator: + invalid_domain: 並非一個有效域名 errors: - '400': The request you submitted was invalid or malformed. + '400': 你所送出的請求無效或格式不正確。 '403': 你沒有觀看這個頁面的權限。 '404': 您所尋找的網頁不存在。 - '406': This page is not available in the requested format. + '406': 此頁面無法以請求的格式顯示。 '410': 您所尋找的網頁此處已不存在。 '422': content: 安全驗證失敗。請確定有開啟瀏覽器 Cookies 功能? @@ -763,8 +875,11 @@ zh-TW: '500': content: 抱歉,我們的後台出現問題了。 title: 這個頁面有問題 - '503': The page could not be served due to a temporary server failure. + '503': 此頁面因伺服器暫時發生錯誤而無法提供。 noscript_html: 使用 Mastodon 網頁版應用需要啟用 JavaScript。你也可以選擇適用於你的平台的 Mastodon 應用。 + existing_username_validator: + not_found: 無法在本站找到這個名稱的使用者 + not_found_multiple: 揣嘸 %{usernames} exports: archive_takeout: date: 日期 @@ -774,30 +889,86 @@ zh-TW: request: 下載存檔 size: 大小 blocks: 您封鎖的使用者 + bookmarks: 書籤 csv: CSV + domain_blocks: 域名封鎖 lists: 列表 mutes: 您靜音的使用者 storage: 儲存空間大小 featured_tags: + add_new: 追加 + errors: + limit: 你所推薦的標籤數量已經達到上限 hint_html: "推薦標籤是什麼? 這些標籤將顯示於您的公開個人檔案頁,訪客可以藉此閱覽您標示了這些標籤的嘟文,拿來展示創意作品或者長期更新的專案很好用唷!" filters: + contexts: + account: 個人資料 + home: 首頁時間軸 + notifications: 通知 + public: 公開時間軸 + thread: 會話 + edit: + title: 編輯篩選條件 + errors: + invalid_context: 沒有提供內文或內文無效 + invalid_irreversible: 此功能僅適用於首頁或通知頁面 index: + delete: 刪除 empty: 您沒有過濾器。 title: 過濾器 + new: + title: 新增篩選器 footer: + developers: 開發者 more: 更多...... + resources: 資源 trending_now: 現正熱門 generic: all: 全部 changes_saved_msg: 已成功儲存修改! copy: 複製 delete: 刪除 + no_batch_actions_available: 此頁面目前沒有可用的批次作業 + order_by: 排序 save_changes: 儲存修改 + validation_errors: + other: 唔…這是什麼鳥?請檢查以下 %{count} 項錯誤 + html_validator: + invalid_markup: 含有無效的 HTML 語法:%{error} + identity_proofs: + active: 有效 + authorize: 是的,請授權 + authorize_connection_prompt: 授權此加密連接? + errors: + failed: 加密連接失敗。請於 %{provider} 重試。 + keybase: + invalid_token: Keybase 標記必須為雜湊加密簽章並且由66個十六進位字符組成。 + verification_failed: Keybase 無法確認此標記為 Keybase 使用者 %{kb_username} 的簽章。請在 Keybase 再試一次。 + wrong_user: 未能為%{current} 以 %{proving} 建立身分驗證。請登入為 %{proving} 再試一次。 + explanation_html: 在此你連結其他網路平台(如 Keybase)上的加密身分。讓其他人可以在那些平台上,傳送加密訊息給你,並驗證你的身分。 + i_am_html: 我是 %{service} 上的 %{username} + identity: 身份 + inactive: 非活躍 + publicize_checkbox: 並發嘟: + publicize_toot: 驗證成功!我在是住在 %{service} 的 %{username} : %{url} + remove: 移除帳戶證明 + removed: 成功移除帳戶證明 + status: 驗證狀態 + view_proof: 檢視證明 imports: + errors: + over_rows_processing_limit: 含有超過 %{count} 行 + modes: + merge: 合併 + merge_long: 保留現有記錄並新增紀錄 + overwrite: 覆蓋 + overwrite_long: 以新的紀錄覆蓋目前紀錄 preface: 您可以在此匯入您在其他伺服器所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。 success: 資料檔上傳成功,正在匯入,請稍候 types: blocking: 您封鎖的使用者名單 + bookmarks: 我的最愛 + domain_blocking: 域名封鎖名單 following: 您關注的使用者名單 muting: 您靜音的使用者名單 upload: 上傳 @@ -815,6 +986,8 @@ zh-TW: expires_in_prompt: 永不過期 generate: 建立邀請連結 invited_by: 你的邀請人是: + max_uses: + other: "%{count} 則" max_uses_prompt: 無限制 prompt: 建立分享連結,邀請他人在本伺服器註冊 table: @@ -824,21 +997,68 @@ zh-TW: lists: errors: limit: 你所建立的列表數量已經達到上限 + login_activities: + authentication_methods: + otp: 兩步驟驗證應用程式 + password: 密碼 + sign_in_token: 電子郵件安全碼 + webauthn: 安全金鑰 + description_html: 若您看到您不認識的活動,請考慮變更您的密碼或啟用兩步驟驗證。 + empty: 沒有可用的驗證歷史紀錄 + failed_sign_in_html: 使用來自 %{ip} (%{browser}) 的 %{method} 登入嘗試失敗 + successful_sign_in_html: 使用來自 %{ip} (%{browser}) 的 %{method} 登入成功 + title: 認證歷史紀錄 media_attachments: validations: images_and_video: 無法在已有圖片的文章上加入影片 + not_ready: 修但幾勒!不能附加未完成處理的檔案欸,咁按呢? too_many: 無法加入超過 4 個檔案 migrations: acct: 新帳戶的 使用者名稱@站點網域 + cancel: 取消重導向 + cancel_explanation: 取消重新導向將會重新啟用目前帳戶,但不會還原已移至該帳號的關注者。 + cancelled_msg: 成功取消重導向。 + errors: + already_moved: 與已經重導向的帳戶相同 + missing_also_known_as: 不是這個帳戶的別名 + move_to_self: 不能是目前帳戶 + not_found: 找不到 + on_cooldown: 你正在處於冷卻(CD)狀態 + followers_count: 轉移時的追隨者 + incoming_migrations: 自另一個帳戶轉移 + incoming_migrations_html: 要從其他帳號移動到此帳號的話,首先您必須建立帳號別名。 + moved_msg: 您的帳號正被重新導向到 %{acct},您的追蹤者也會同步轉移至該帳號。 + not_redirecting: 您的帳號目前尚未重新導向到任何其他帳號。 + on_cooldown: 您最近已轉移過您的帳號。此功能將在 %{count} 天後可再度使用。 + past_migrations: 以往的轉移紀錄 proceed_with_move: 移動關注者 - redirected_msg: 您的帳號現在指向 %{acct} + redirected_msg: 您的帳戶現在指向 %{acct} + redirecting_to: 您的帳號目前正被重新導向到 %{acct} + set_redirect: 設定重新導向 + warning: + backreference_required: 新的帳號必須先設定為反向參照到目前帳號 + before: 在進行下一步驟之前,請詳細閱讀以下説明: + cooldown: 在轉移帳號後會有一段等待時間,在等待時間內您將無法再次轉移 + disabled_account: 之後您的目前帳號將完全無法使用。但您可以存取資料匯出與重新啟用。 + followers: 此動作將會把目前帳號的所有追蹤者轉移至新帳號 + only_redirect_html: 或者,您也可以僅在您的個人資料中放置重新導向。 + other_data: 其他資料並不會自動轉移 + redirect: 您目前的帳號將會在個人資料頁面新增重新導向公告,並會被排除在搜尋結果之外 moderation: title: 營運 + move_handler: + carry_blocks_over_text: 此使用者轉移自被您封鎖的 %{acct}。 + carry_mutes_over_text: 此使用者轉移自被您靜音的 %{acct}。 + copy_account_note_text: 此使用者轉移自 %{acct},以下是您之前關於他們的備註: notification_mailer: digest: action: 閱覽所有通知 body: 以下是自%{since}你最後一次登入以來錯過的訊息摘要 mention: "%{name} 在此提及了你:" + new_followers_summary: + other: 此外,您在離開時獲得了 %{count} 位新的追蹤者!超棒的! + subject: + other: "從您上次造訪以來有 %{count} 個新通知 \U0001F418" title: 你不在的時候... favourite: body: '你的嘟文被 %{name} 加入了最愛:' @@ -858,10 +1078,14 @@ zh-TW: body: "%{name} 在嘟文中提及你:" subject: "%{name} 在嘟文中提及你" title: 新的提及 + poll: + subject: 由 %{name} 發起的投票已結束 reblog: body: '你的嘟文被 %{name} 轉嘟:' subject: "%{name} 轉嘟了你的嘟文" title: 新的轉嘟 + status: + subject: "%{name} 剛剛嘟文" notifications: email_events: 電子郵件通知設定 email_events_hint: 選取你想接收通知的事件: @@ -876,18 +1100,77 @@ zh-TW: quadrillion: Q thousand: K trillion: T + otp_authentication: + code_hint: 請輸入您驗證應用程式所產生的代碼以確認 + description_html: 若您啟用使用驗證應用程式的兩步驟驗證,您每次登入都需要輸入由您的手機所產生的權杖。 + enable: 啟用 + instructions_html: "請用您手機上的 Google Authenticator 或類似的 TOTP 應用程式掃描此 QR code。從現在開始,該應用程式將會產生您每次登入都必須輸入的權杖。" + manual_instructions: 如果您無法掃描 QR code,則必須手動輸入此明文密碼: + setup: 設定 + wrong_code: 您輸入的驗證碼無效!伺服器時間或是裝置時間無誤嗎? pagination: newer: 較新 next: 下一頁 older: 較舊 prev: 上一頁 + truncate: "…" + polls: + errors: + already_voted: 您已經投過票了 + duplicate_options: 包含重複項目 + duration_too_long: 太久了! + duration_too_short: 車速太快了! + expired: 投票已結束 + invalid_choice: 您所選的投票選項並不存在 + over_character_limit: 不能多於 %{max} 個字元 + too_few_options: 必須包含至少一個項目 + too_many_options: 不能包含多於 %{max} 個項目 preferences: - other: 其他設定 + other: 其他 + posting_defaults: 嘟文預設值 + public_timelines: 公開時間軸 + reactions: + errors: + limit_reached: 達到可回應之上限 + unrecognized_emoji: 並非一個可識別的 emoji + relationships: + activity: 帳號動態 + dormant: 潛水中 + follow_selected_followers: 跟隨所選的跟隨者 + followers: 跟隨者 + following: 跟隨中 + invited: 已邀請 + last_active: 最後上線 + most_recent: 最近 + moved: 已轉移 + mutual: 共同 + primary: 主要 + relationship: 關係 + remove_selected_domains: 從所選網域中移除所有追隨者 + remove_selected_followers: 移除所選的跟隨者 + remove_selected_follows: 取消跟隨所選使用者 + status: 帳戶狀態 remote_follow: acct: 請輸入您的使用者名稱@站點網域 missing_resource: 無法找到資源 + no_account_html: 還沒有帳號?您可以於這裡註冊 proceed: 下一步 prompt: '您希望關注:' + reason_html: "為什麼要經過這個步驟?因為%{instance}未必是您註冊的伺服器,我們需要先將您帶回您駐在的伺服器。" + remote_interaction: + favourite: + proceed: 加入到最愛 + prompt: 您欲將此嘟文加入最愛 + reblog: + proceed: 確認轉嘟 + prompt: 您想轉嘟此嘟文: + reply: + proceed: 確認回覆 + prompt: 您想回覆此嘟文 + scheduled_statuses: + over_daily_limit: 您已經超過了本日排定發嘟的限額 (%{limit}) + over_total_limit: 您已經超過了排定發嘟的限額 (%{limit}) + too_soon: 嘟文不可以改變過去哦,只能預定未來 (咦) sessions: activity: 最近活動 browser: 瀏覽器 @@ -914,12 +1197,26 @@ zh-TW: explanation: 這些是現在正登入於你的 Mastodon 帳戶的瀏覽器。 ip: IP 位址 platforms: + adobe_air: Adobe Air + android: Android + blackberry: 黑莓機 (Blackberry) + chrome_os: Chrome OS + firefox_os: Firefox OS ios: iOS + linux: Linux mac: Mac + other: 不明平台 + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: 取消 revoke_success: Session 取消成功 title: 作業階段 + view_authentication_history: 檢視您帳號的身份驗證歷史紀錄 settings: + account: 帳戶 + account_settings: 帳戶設定 + aliases: 帳戶別名 appearance: 外觀設定 authorized_apps: 已授權應用程式 back: 回到 Mastodon @@ -928,17 +1225,30 @@ zh-TW: edit_profile: 編輯使用者資訊 export: 匯出 featured_tags: 推薦標籤 + identity_proofs: 身分驗證 import: 匯入 + import_and_export: 匯入及匯出 migrate: 帳戶搬遷 notifications: 通知 preferences: 偏好設定 profile: 使用者資訊 + relationships: 跟隨中與跟隨者 + statuses_cleanup: 自動貼文刪除 two_factor_authentication: 兩階段認證 + webauthn_authentication: 安全金鑰 statuses: attached: + audio: + other: "%{count} 則音訊" description: 附件: %{attached} + image: + other: "%{count} 張圖片" + video: + other: "%{count} 段影片" boosted_from_html: 轉嘟自 %{acct_link} content_warning: 內容警告: %{warning} + disallowed_hashtags: + other: 含有不得使用的標籤: %{tags} errors: in_reply_not_found: 您嘗試回覆的嘟文看起來不存在。 language_detection: 自動偵測語言 @@ -950,41 +1260,201 @@ zh-TW: private: 不能置頂非公開的嘟文 reblog: 不能置頂轉嘟 poll: + total_people: + other: "%{count} 個人" + total_votes: + other: "%{count} 票" vote: 投票 show_more: 顯示更多 + show_newer: 顯示較新嘟文 + show_older: 顯示較舊嘟文 + show_thread: 顯示討論串 + sign_in_to_participate: 登入以加入討論 + title: "%{name}:「%{quote}」" visibilities: + direct: 私訊 private: 僅關注者 private_long: 只有關注你的人能看到 public: 公開 public_long: 所有人都能看到 unlisted: 公開,但不在公共時間軸顯示 unlisted_long: 所有人都能看到,但不會出現在公共時間軸上 + statuses_cleanup: + enabled: 自動刪除舊貼文 + enabled_hint: 一旦達到指定的保存期限,就會自動刪除您的貼文,除非貼文符合下列例外 + exceptions: 例外 + explanation: 因為刪除貼文是昂貴的動作,所以當伺服器不那麼忙碌的時候才會慢慢完成。因此,您的貼文會在到達保存期限後一段時間才會被刪除。 + ignore_favs: 忽略最愛 + ignore_reblogs: 忽略轉嘟 + interaction_exceptions: 以互動為基礎的例外 + interaction_exceptions_explanation: 請注意嘟文是無法保證被刪除的,如果在一次處理過後嘟文低於最愛或轉嘟的門檻。 + keep_direct: 保留私訊 + keep_direct_hint: 不會刪除任何您的私訊 + keep_media: 保留包含媒體內容的嘟文 + keep_media_hint: 不會刪除您包含媒體內容的嘟文 + keep_pinned: 保留釘選嘟文 + keep_pinned_hint: 不會刪除您的釘選嘟文 + keep_polls: 保留投票 + keep_polls_hint: 不會刪除您的投票 + keep_self_bookmark: 保留您已標記為書簽之嘟文 + keep_self_bookmark_hint: 不會刪除您已標記為書簽之嘟文 + keep_self_fav: 保留您已標記為最愛之嘟文 + keep_self_fav_hint: 不會刪除您已標記為最愛之嘟文 + min_age: + '1209600': 2 週 + '15778476': 6 個月 + '2629746': 1 個月 + '31556952': 1 年 + '5259492': 2 個月 + '63113904': 2 年 + '7889238': 3 個月 + min_age_label: 按時間篩選 + min_favs: 保留超過嘟文最愛門檻 + min_favs_hint: 如果您嘟文已收到超過最愛門檻則不會刪除。留白表示不論最愛數量皆刪除嘟文。 + min_reblogs: 保留超過嘟文轉嘟門檻 + min_reblogs_hint: 如果您嘟文已收到超過轉嘟門檻則不會刪除。留白表示不論轉嘟數量皆刪除嘟文。 stream_entries: pinned: 置頂嘟文 reblogged: 轉嘟 sensitive_content: 敏感內容 + tags: + does_not_match_previous_name: 與先前的名稱不吻合 terms: + body_html: | +

隱私權政策

+

我們會蒐集哪些資訊?

+ +
    +
  • 基本帳號資訊:若您在此伺服氣上註冊,您可能會被要求輸入使用者名稱、電子郵件地址與密碼。您也可能會輸入額外的個人檔案資訊,如顯示名稱或簡介等,以及上傳個人資料圖片與封面圖片。使用者名稱、顯示名稱、簡介、個人檔案名稱與封面圖片一律都會公開陳列。
  • +
  • 貼文、追蹤與其他資訊:您追蹤的人的清單會是公開陳列的,您的追蹤者同樣如此。當您地交了一條訊息,日期與時間,以及您從哪個應用程式遞交訊息也同樣會被儲存。訊息可能會包含多媒體附件,如圖片或影片。公開或未列出的貼文都可公開使用。當您在您的個人資料上特別突顯了某篇貼文,那麼這也會是公開資訊。您的貼文會被遞送給您的追蹤者,在某些情況下,這代表了它們會被遞送到其他伺服器,並儲存在那邊。當您刪除貼文時,同樣會遞送給您的追蹤者。轉發或收藏其他貼文的動作也同樣是公開的。
  • +
  • 直接與僅限追蹤者的貼文:所有貼文都由伺服器儲存並處理。僅限追蹤者的貼文會被遞送給您的追蹤者,以及其中所提及的使用者,而直接貼文則僅會遞送給其中提到的使用者。在某些情況下,這代表了它們會被遞送到其他伺服器,並儲存在那邊。我們非常努力地讓這些貼文的存取僅供被授權的人使用,但其他伺服器可能沒有這樣做。因此審閱您的追蹤者屬於的伺服器也很重要。您可以在設定中切換批准與回絕新追蹤者的選項。請注意,伺服器的營運者與任何接收的伺服器都可以檢視這輛的訊息,且接收者可能會螢幕截圖、複製或以其他方式轉分享這類訊息。所以請不要透過 Mastodon 分享任何危險的資訊。
  • +
  • IP 與詮釋資料:當您登入時,我們會紀錄從登入的 IP 位置,以及您瀏覽器應用程式的名稱。您可以在設定中審閱並撤銷所有已登入的工作階段。最新使用的 IP 位置會儲存長達 12 個月。我們也可能會保留伺服器紀錄檔,其中包含了每個請求存取我們的伺服器的 IP 位置。
+ +
+ +

我們會將您的資訊用於何種目的?

+ +

我們從您那裡蒐集而來的資訊都可能作為以下用途:

+ +
    +
  • 提供 Mastodon 的核心功能。您只能在登入後與其他人的內容互動,並張貼您自己的內容。舉例來說,您可能會追蹤其他人,以在您個人化的家時間軸中檢視各種貼文的結合。
  • +
  • 協助社群管理,例如比較您的 IP 位置與其他已知的 IP 位置進行比較,以確定是否有逃避禁令或其他違規行為。
  • +
  • 您提供的電子郵件地址可能會用於傳送關於其他人與您的內容互動的資訊、通知或是訊息給您,以及回覆查詢,及/或其他請求或問題。
  • +
+ +
+ +

我們如何保護您的資訊?

+ +

當您輸入、遞交或存取您的個人資訊時,我們會實施各種安全措施來維護您個人資訊的安全。除此之外,您的瀏覽器工作階段與您應用程式及 API 間的流量都以 SSL 進行保護,您的密碼也使用了相當強的單向演算法來雜湊。您可以啟用兩步驟驗證來進一步強化您帳號的安全程度。

+ +
+ +

我們的資料保留政策是什麼?

+ +

我們將努力:

+ +
    +
  • 保留包含所有對此伺服器請求的 IP 位置的伺服器紀錄檔,只要此類紀錄檔不保留超過 90 天。
  • +
  • 保留與註冊使用者相關的 IP 位置不超過 12 個月。
  • +
+ +

您可以請求並下載您內容的封存檔案,包含了您的貼文、多媒體附件、個人檔案圖片與封面圖片。

+ +

您隨時都可以不可逆地刪除您的帳號。

+ +
+ +

我們會使用 cookies 嗎?

+

是的。Cookies 是網站或其服務提供者透過您的網路瀏覽器(若您允許)傳送到您電腦硬碟的小檔案。這些 cookies 讓網站可以識別您的瀏覽器,以及如果您有註冊帳號的話,同時關聯到您已註冊的帳號。

+ +

我們使用 cookies 來了解並儲存您的偏好設定以供未來存取。

+ +
+ +

我們會向外界揭露任何資訊嗎?

+ +

我們不會出售、交易或是以其他方式向外界傳輸您的個人身份資料。這不包含協助我們營運網站、開展業務或是服務您的可信第三方,只要這些第三方同意對這些資訊保密。當我們認為發佈您的資訊是為了遵守法律、執行我們網站的政策、或是保護我們或其他人的權利、財產或安全時,我們也可能會發佈您的資訊。

+ +

您的公開內容可能會網路中其他伺服器下載。您的公開與僅追蹤者貼文將會遞送到您的追蹤者所在的伺服器,直接訊息則會遞送到接收者所在的伺服器,前提是這些追蹤者或接收者在不同的伺服器上。

+ +

當您授權應用程式使用您的帳號時,根據您所批准的授權範圍,其可能會存取您的公開個人檔案資訊、您的追蹤清單、您的追蹤者、您的清單、您所有的貼文以及您的收藏。應用程式永遠無法存取您的電子郵件地址或密碼。

+ +
+ +

兒童使用網站

+ +

如果伺服器位於歐盟或歐洲經濟區中:我們的網站、產品與服務均供至少 16 歲的人使用。如果您小於 16 歲,根據 GDPR(一般資料保護規範)的要求,請勿使用此網站。

+ +

若此伺服器位於美國:我們的網站、產品與服務均供至少 13 歲的人使用。如果您小於 13 歲,根據 COPPA(兒童線上隱私保護法)的要求,請勿使用此忘站。

+ +

如果此伺服器位於其他司法管轄區,則法律要求可能會有所不同。

+ +
+ +

我們隱私權政策的變更

+ +

若我們決定變更我們的隱私權政策,我們將會在此頁面張貼那些變更。

+ +

此文件以 CC-BY-SA 授權。最後更新時間為2018年3月7日。

+ +

最初改編自 Discourse 隱私權政策

title: "%{instance} 使用條款和隱私權政策" themes: contrast: Mastodon(高對比) + default: Mastodon(深色) mastodon-light: Mastodon(亮色主題) time: formats: default: "%Y年%-m月%d日 %H:%M" + month: "%b %Y" two_factor_authentication: + add: 新增 disable: 停用 + disabled_success: 已成功啟用兩步驟驗證 + edit: 編輯 enabled: 兩階段認證已啟用 enabled_success: 已成功啟用兩階段認證 generate_recovery_codes: 產生備用驗證碼 lost_recovery_codes: 讓你可以在遺失手機時,使用備用驗證碼登入。如果你遺失了備用驗證碼,可以在這裏產生一批新的,舊有的備用驗證碼將會失效。 + methods: 兩步驟方式 + otp: 驗證應用程式 recovery_codes: 備份備用驗證碼 recovery_codes_regenerated: 成功產生新的備用驗證碼 recovery_instructions_html: 如果你的手機無法使用,你可以使用下列任意一個備用驗證碼來重新獲得帳戶的訪問權。請妥善保管好你的備用驗證碼(例如,你可以將它們列印出來,與你的其他重要文件放在一起)。 + webauthn: 安全金鑰 user_mailer: backup_ready: explanation: 你要求的 Mastodon 帳戶完整備份檔案現已就緒,可供下載! subject: 你的備份檔已可供下載 title: 檔案匯出 + sign_in_token: + details: 以下是嘗試登入的詳細資訊: + explanation: 我們偵測到有人試圖從陌生的 IP 位置登入您的帳號。如果這是您,請在「登入確認」頁面輸入安全碼: + further_actions: 如果這不是你,請立即到這裡變更你的密碼,並啟用兩步驟驗證: + subject: 請確認登入嘗試 + title: 登入嘗試 + warning: + explanation: + disable: 您將無法以任何方式登入或使用您的帳號,但您的個人資料頁面和其他資料仍保持完整。 + sensitive: 您上傳的媒體檔案或連結的媒體將會被標記為敏感。 + silence: 您仍然可以使用您的帳號,但僅有已追蹤您的人才能看到您在此伺服器的貼文,您也可能會從公開清單中被排除。但其他人仍可手動追蹤您。 + suspend: 您將不能使用您的帳號,您的個人資料頁面及其他資料將不再能被取得。您仍可在資料被完全刪除前要求下載你的資料,但我們仍會保留一部份資料,以防止有人規避停權處罰。 + get_in_touch: 您可以回覆此電子郵件並與 %{instance} 的工作人員們聯絡。 + review_server_policies: 檢視伺服器政策 + statuses: 特別是: + subject: + disable: 您的帳號 %{acct} 已被凍結 + none: 對 %{acct} 的警告 + sensitive: 您帳號 %{acct} 張貼的媒體已被標記為敏感內容 + silence: 您的帳號 %{acct} 已被限制 + suspend: 您的帳號 %{acct} 已被停權 + title: + disable: 帳號已被涷結 + none: 警告 + sensitive: 您的媒體已被標記為敏感內容 + silence: 帳號已被限制 + suspend: 帳號己被停用 welcome: edit_profile_action: 設定個人資料 edit_profile_step: 你可以設定你的個人資料,包括上傳頭像、橫幅圖片、變更顯示名稱等等。如果你想在新的關注者關注你之前對他們進行審核,你也可以選擇為你的帳戶設為「私人」。 @@ -1003,15 +1473,31 @@ zh-TW: tips: 小幫手 title: "%{name} 歡迎你的加入!" users: - blocked_email_provider: 不允許使用這個電子信箱提供者 - invalid_email: 電子信箱位址不正確 - invalid_email_mx: 似乎沒有這個電子信箱地址 + follow_limit_reached: 您無法追蹤多於 %{limit} 個人 + generic_access_help_html: 存取您的帳號時遇到困難?您可以透過 %{email} 取得協助 invalid_otp_token: 兩階段認證碼不正確 + invalid_sign_in_token: 安全碼無效 otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫 seamless_external_login: 由於你是從外部系統登入,所以不能設定密碼與電子郵件。 signed_in_as: 目前登入的帳戶: + suspicious_sign_in_confirmation: 您之前似乎未從此裝置登入過,再加上您也有一段時間沒有登入了,因此我們剛剛傳送了安全碼到您的電子郵件地址以確認真的是您。 verification: explanation_html: 您在 Mastodon 個人資料頁上所列出的連結,可以用此方式驗證您確實掌控該連結網頁的內容。您可以在連結的網頁上加上一個連回 Mastodon 個人資料頁的連結,該連結的原始碼 必須包含rel="me"屬性。連結的顯示文字可自由發揮,以下為範例: verification: 驗證連結 webauthn_credentials: + add: 新增安全金鑰 + create: + error: 新增安全金鑰時出現了問題。請再試一次。 + success: 你已成功加入安全金鑰。 + delete: 刪除 + delete_confirmation: 您確定要移除這把安全金鑰嗎? + description_html: 如果您啟用安全金鑰驗證的話,您將在登入時需要使用其中一把安全金鑰。 + destroy: + error: 移除安全金鑰時出現了問題。請再試一次。 + success: 您已成功將安全金鑰移除。 + invalid_credential: 無效的安全金鑰 + nickname_hint: 輸入您新安全金鑰的暱稱 + not_enabled: 您尚未啟用 WebAuthn + not_supported: 此瀏覽器並不支援安全金鑰 + otp_required: 請先啟用兩步驟驗證以使用安全金鑰。 registered_on: 註冊於 %{date} diff --git a/config/navigation.rb b/config/navigation.rb index be429cfc4f..a5590d2ea6 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -7,7 +7,6 @@ SimpleNavigation::Configuration.run do |navigation| n.item :profile, safe_join([fa_icon('user fw'), t('settings.profile')]), settings_profile_url, if: -> { current_user.functional? } do |s| s.item :profile, safe_join([fa_icon('pencil fw'), t('settings.appearance')]), settings_profile_url s.item :featured_tags, safe_join([fa_icon('hashtag fw'), t('settings.featured_tags')]), settings_featured_tags_url - s.item :identity_proofs, safe_join([fa_icon('key fw'), t('settings.identity_proofs')]), settings_identity_proofs_path, highlights_on: %r{/settings/identity_proofs*}, if: proc { current_account.identity_proofs.exists? } end n.item :preferences, safe_join([fa_icon('cog fw'), t('settings.preferences')]), settings_preferences_url, if: -> { current_user.functional? } do |s| @@ -24,9 +23,10 @@ SimpleNavigation::Configuration.run do |navigation| n.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_url, if: -> { current_user.functional? } n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters}, if: -> { current_user.functional? } + n.item :statuses_cleanup, safe_join([fa_icon('history fw'), t('settings.statuses_cleanup')]), statuses_cleanup_url, if: -> { current_user.functional? } n.item :security, safe_join([fa_icon('lock fw'), t('settings.account')]), edit_user_registration_url do |s| - s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases} + s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases|/settings/login_activities} s.item :two_factor_authentication, safe_join([fa_icon('mobile fw'), t('settings.two_factor_authentication')]), settings_two_factor_authentication_methods_url, highlights_on: %r{/settings/two_factor_authentication|/settings/otp_authentication|/settings/security_keys} s.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url end @@ -39,12 +39,17 @@ SimpleNavigation::Configuration.run do |navigation| n.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: proc { Setting.min_invite_role == 'user' && current_user.functional? } n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_url, if: -> { current_user.functional? } + n.item :trends, safe_join([fa_icon('fire fw'), t('admin.trends.title')]), admin_trends_tags_path, if: proc { current_user.staff? } do |s| + s.item :tags, safe_join([fa_icon('hashtag fw'), t('admin.trends.tags.title')]), admin_trends_tags_path, highlights_on: %r{/admin/tags|/admin/trends/tags} + s.item :links, safe_join([fa_icon('newspaper-o fw'), t('admin.trends.links.title')]), admin_trends_links_path, highlights_on: %r{/admin/trends/links} + end + n.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), admin_reports_url, if: proc { current_user.staff? } do |s| s.item :action_logs, safe_join([fa_icon('bars fw'), t('admin.action_logs.title')]), admin_action_logs_url s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_url, highlights_on: %r{/admin/reports} - s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url, highlights_on: %r{/admin/accounts|/admin/pending_accounts} + s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url(origin: 'local'), highlights_on: %r{/admin/accounts|/admin/pending_accounts} s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path - s.item :tags, safe_join([fa_icon('hashtag fw'), t('admin.tags.title')]), admin_tags_path, highlights_on: %r{/admin/tags} + s.item :follow_recommendations, safe_join([fa_icon('user-plus fw'), t('admin.follow_recommendations.title')]), admin_follow_recommendations_path, highlights_on: %r{/admin/follow_recommendations} s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url(limited: whitelist_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.admin? } s.item :email_domain_blocks, safe_join([fa_icon('envelope fw'), t('admin.email_domain_blocks.title')]), admin_email_domain_blocks_url, highlights_on: %r{/admin/email_domain_blocks}, if: -> { current_user.admin? } s.item :ip_blocks, safe_join([fa_icon('ban fw'), t('admin.ip_blocks.title')]), admin_ip_blocks_url, highlights_on: %r{/admin/ip_blocks}, if: -> { current_user.admin? } @@ -53,6 +58,7 @@ SimpleNavigation::Configuration.run do |navigation| n.item :admin, safe_join([fa_icon('cogs fw'), t('admin.title')]), admin_dashboard_url, if: proc { current_user.staff? } do |s| s.item :dashboard, safe_join([fa_icon('tachometer fw'), t('admin.dashboard.title')]), admin_dashboard_url s.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url, if: -> { current_user.admin? }, highlights_on: %r{/admin/settings} + s.item :rules, safe_join([fa_icon('gavel fw'), t('admin.rules.title')]), admin_rules_path, highlights_on: %r{/admin/rules} s.item :announcements, safe_join([fa_icon('bullhorn fw'), t('admin.announcements.title')]), admin_announcements_path, highlights_on: %r{/admin/announcements} s.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_url, highlights_on: %r{/admin/custom_emojis} s.item :relays, safe_join([fa_icon('exchange fw'), t('admin.relays.title')]), admin_relays_url, if: -> { current_user.admin? && !whitelist_mode? }, highlights_on: %r{/admin/relays} diff --git a/config/routes.rb b/config/routes.rb index b3eef33641..d0eeda1e86 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,14 +3,12 @@ require 'sidekiq_unique_jobs/web' require 'sidekiq-scheduler/web' -Sidekiq::Web.set :session_secret, Rails.application.secrets[:secret_key_base] - Rails.application.routes.draw do root 'home#index' mount LetterOpenerWeb::Engine, at: 'letter_opener' if Rails.env.development? - health_check_routes + get 'health', to: 'health#show' authenticate :user, lambda { |u| u.admin? } do mount Sidekiq::Web, at: 'sidekiq', as: :sidekiq @@ -27,7 +25,6 @@ Rails.application.routes.draw do get '.well-known/nodeinfo', to: 'well_known/nodeinfo#index', as: :nodeinfo, defaults: { format: 'json' } get '.well-known/webfinger', to: 'well_known/webfinger#show', as: :webfinger get '.well-known/change-password', to: redirect('/auth/edit') - get '.well-known/keybase-proof-config', to: 'well_known/keybase_proof_config#show' get '/nodeinfo/2.0', to: 'well_known/nodeinfo#show', as: :nodeinfo_schema @@ -47,6 +44,7 @@ Rails.application.routes.draw do resource :setup, only: [:show, :update], controller: :setup resource :challenge, only: [:create], controller: :challenges get 'sessions/security_key_options', to: 'sessions#webauthn_options' + post 'captcha_confirmation', to: 'confirmations#confirm_captcha', as: :captcha_confirmation end end @@ -99,8 +97,6 @@ Rails.application.routes.draw do post '/interact/:id', to: 'remote_interaction#create' get '/explore', to: 'directories#index', as: :explore - get '/explore/:id', to: 'directories#show', as: :explore_hashtag - get '/settings', to: redirect('/settings/profile') namespace :settings do @@ -150,8 +146,6 @@ Rails.application.routes.draw do resource :confirmation, only: [:new, :create] end - resources :identity_proofs, only: [:index, :new, :create, :destroy] - resources :applications, except: [:edit] do member do post :regenerate @@ -170,6 +164,7 @@ Rails.application.routes.draw do resources :aliases, only: [:index, :create, :destroy] resources :sessions, only: [:destroy] resources :featured_tags, only: [:index, :create, :destroy] + resources :login_activities, only: [:index] end resources :media, only: [:show] do @@ -181,6 +176,7 @@ Rails.application.routes.draw do resources :invites, only: [:index, :create, :destroy] resources :filters, except: [:show] resource :relationships, only: [:show, :update] + resource :statuses_cleanup, controller: :statuses_cleanup, only: [:show, :update] get '/public', to: 'public_timelines#show', as: :public_timeline get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy @@ -221,7 +217,15 @@ Rails.application.routes.draw do end end - resources :instances, only: [:index, :show], constraints: { id: /[^\/]+/ } + resources :instances, only: [:index, :show, :destroy], constraints: { id: /[^\/]+/ } do + member do + post :clear_delivery_errors + post :restart_delivery + post :stop_delivery + end + end + + resources :rules resources :reports, only: [:index, :show] do member do @@ -230,8 +234,6 @@ Rails.application.routes.draw do post :reopen post :resolve end - - resources :reported_statuses, only: [:create] end resources :report_notes, only: [:create, :destroy] @@ -248,12 +250,23 @@ Rails.application.routes.draw do post :memorialize post :approve post :reject + post :unblock_email + end + + collection do + post :batch end resource :change_email, only: [:show, :update] resource :reset, only: [:create] resource :action, only: [:new, :create], controller: 'account_actions' - resources :statuses, only: [:index, :show, :create, :update, :destroy] + + resources :statuses, only: [:index] do + collection do + post :batch + end + end + resources :relationships, only: [:index] resource :confirmation, only: [:create] do @@ -270,16 +283,9 @@ Rails.application.routes.draw do end end - resources :pending_accounts, only: [:index] do - collection do - post :approve_all - post :reject_all - post :batch - end - end - resources :users, only: [] do resource :two_factor_authentication, only: [:destroy] + resource :sign_in_token_authentication, only: [:create, :destroy] end resources :custom_emojis, only: [:index, :new, :create] do @@ -295,12 +301,28 @@ Rails.application.routes.draw do end resources :account_moderation_notes, only: [:create, :destroy] + resource :follow_recommendations, only: [:show, :update] + resources :tags, only: [:show, :update] - resources :tags, only: [:index, :show, :update] do - collection do - post :approve_all - post :reject_all - post :batch + namespace :trends do + resources :links, only: [:index] do + collection do + post :batch + end + end + + resources :tags, only: [:index] do + collection do + post :batch + end + end + + namespace :links do + resources :preview_card_providers, only: [:index], path: :publishers do + collection do + post :batch + end + end end end end @@ -311,9 +333,6 @@ Rails.application.routes.draw do # OEmbed get '/oembed', to: 'oembed#show', as: :oembed - # Identity proofs - get :proofs, to: 'proofs#index' - # JSON / REST API namespace :v1 do resources :statuses, only: [:create, :show, :destroy] do @@ -334,6 +353,9 @@ Rails.application.routes.draw do resource :pin, only: :create post :unpin, to: 'pins#destroy' + + resource :history, only: :show + resource :source, only: :show end member do @@ -394,7 +416,7 @@ Rails.application.routes.draw do resources :favourites, only: [:index] resources :bookmarks, only: [:index] resources :reports, only: [:create] - resources :trends, only: [:index] + resources :trends, only: [:index], controller: 'trends/tags' resources :filters, only: [:index, :create, :show, :update, :destroy] resources :endorsements, only: [:index] resources :markers, only: [:index, :create] @@ -405,9 +427,19 @@ Rails.application.routes.draw do resources :apps, only: [:create] + namespace :trends do + resources :links, only: [:index] + resources :tags, only: [:index] + end + + namespace :emails do + resources :confirmations, only: [:create] + end + resource :instance, only: [:show] do resources :peers, only: [:index], controller: 'instances/peers' resource :activity, only: [:show], controller: 'instances/activity' + resources :rules, only: [:index], controller: 'instances/rules' end resource :domain_blocks, only: [:show, :create, :destroy] @@ -435,6 +467,7 @@ Rails.application.routes.draw do get :verify_credentials, to: 'credentials#show' patch :update_credentials, to: 'credentials#update' resource :search, only: :show, controller: :search + resource :lookup, only: :show, controller: :lookup resources :relationships, only: :index end @@ -449,6 +482,7 @@ Rails.application.routes.draw do member do post :follow post :unfollow + post :remove_from_followers post :block post :unblock post :mute @@ -492,7 +526,7 @@ Rails.application.routes.draw do resource :action, only: [:create], controller: 'account_actions' end - resources :reports, only: [:index, :show] do + resources :reports, only: [:index, :update, :show] do member do post :assign_to_self post :unassign @@ -500,12 +534,21 @@ Rails.application.routes.draw do post :resolve end end + + namespace :trends do + resources :tags, only: [:index] + end + + post :measures, to: 'measures#create' + post :dimensions, to: 'dimensions#create' + post :retention, to: 'retention#create' end end namespace :v2 do resources :media, only: [:create] get '/search', to: 'search#index', as: :search + resources :suggestions, only: [:index] end namespace :web do diff --git a/config/settings.yml b/config/settings.yml index 1d94880529..7d192f3691 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -33,7 +33,6 @@ defaults: &defaults system_emoji_font: false noindex: false hide_followers_count: false - enable_keybase: true flavour: 'glitch' skin: 'default' aggregate_reblogs: true @@ -67,7 +66,6 @@ defaults: &defaults - mod - moderator disallowed_hashtags: # space separated string or list of hashtags without the hash - enable_bootstrap_timeline_accounts: true bootstrap_timeline_accounts: '' activity_api_enabled: true peers_api_enabled: true @@ -75,11 +73,11 @@ defaults: &defaults show_reblogs_in_public_timelines: false show_replies_in_public_timelines: false default_content_type: 'text/plain' - spam_check_enabled: true show_domain_blocks: 'disabled' show_domain_blocks_rationale: 'disabled' outgoing_spoilers: '' require_invite_text: false + captcha_enabled: false development: <<: *defaults diff --git a/config/sidekiq.yml b/config/sidekiq.yml index 010923717e..9dde5a053b 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -13,9 +13,13 @@ every: '5m' class: Scheduler::ScheduledStatusesScheduler queue: scheduler - trending_tags_scheduler: + trends_refresh_scheduler: every: '5m' - class: Scheduler::TrendingTagsScheduler + class: Scheduler::Trends::RefreshScheduler + queue: scheduler + trends_review_notifications_scheduler: + every: '2h' + class: Scheduler::Trends::ReviewNotificationsScheduler queue: scheduler media_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *' @@ -25,6 +29,10 @@ cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * *' class: Scheduler::FeedCleanupScheduler queue: scheduler + follow_recommendations_scheduler: + cron: '<%= Random.rand(0..59) %> <%= Random.rand(6..9) %> * * *' + class: Scheduler::FollowRecommendationsScheduler + queue: scheduler doorkeeper_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * 0' class: Scheduler::DoorkeeperCleanupScheduler @@ -53,3 +61,7 @@ cron: '0 * * * *' class: Scheduler::InstanceRefreshScheduler queue: scheduler + accounts_statuses_cleanup_scheduler: + interval: 1 minute + class: Scheduler::AccountsStatusesCleanupScheduler + queue: scheduler diff --git a/config/initializers/pagination.rb b/config/storage.yml similarity index 100% rename from config/initializers/pagination.rb rename to config/storage.yml diff --git a/config/webpack/production.js b/config/webpack/production.js index f1d0dabae7..cd3d01035c 100644 --- a/config/webpack/production.js +++ b/config/webpack/production.js @@ -43,7 +43,7 @@ module.exports = merge(sharedConfig, { plugins: [ new CompressionPlugin({ - filename: '[path].gz[query]', + filename: '[path][base].gz[query]', cache: true, test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/, }), diff --git a/config/webpack/tests.js b/config/webpack/tests.js index f9d39f1b80..84f008eac8 100644 --- a/config/webpack/tests.js +++ b/config/webpack/tests.js @@ -1,7 +1,7 @@ // Note: You must restart bin/webpack-dev-server for changes to take effect const { merge } = require('webpack-merge'); -const sharedConfig = require('./shared.js'); +const sharedConfig = require('./shared'); module.exports = merge(sharedConfig, { mode: 'development', diff --git a/crowdin.yml b/crowdin.yml index 88a24d6211..6d84ab0a10 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -2,19 +2,13 @@ commit_message: '[ci skip]' files: - source: /app/javascript/mastodon/locales/en.json translation: /app/javascript/mastodon/locales/%two_letters_code%.json - update_option: update_as_unapproved - source: /config/locales/en.yml translation: /config/locales/%two_letters_code%.yml - update_option: update_as_unapproved - source: /config/locales/simple_form.en.yml translation: /config/locales/simple_form.%two_letters_code%.yml - update_option: update_as_unapproved - source: /config/locales/activerecord.en.yml translation: /config/locales/activerecord.%two_letters_code%.yml - update_option: update_as_unapproved - source: /config/locales/devise.en.yml translation: /config/locales/devise.%two_letters_code%.yml - update_option: update_as_unapproved - source: /config/locales/doorkeeper.en.yml translation: /config/locales/doorkeeper.%two_letters_code%.yml - update_option: update_as_unapproved diff --git a/db/migrate/20160223165723_add_url_to_statuses.rb b/db/migrate/20160223165723_add_url_to_statuses.rb index 80f4b3289e..fee7f9c59f 100644 --- a/db/migrate/20160223165723_add_url_to_statuses.rb +++ b/db/migrate/20160223165723_add_url_to_statuses.rb @@ -1,4 +1,4 @@ -class AddUrlToStatuses < ActiveRecord::Migration[4.2] +class AddURLToStatuses < ActiveRecord::Migration[4.2] def change add_column :statuses, :url, :string, null: true, default: nil end diff --git a/db/migrate/20160223165855_add_url_to_accounts.rb b/db/migrate/20160223165855_add_url_to_accounts.rb index c81b1c64fc..a4db8814af 100644 --- a/db/migrate/20160223165855_add_url_to_accounts.rb +++ b/db/migrate/20160223165855_add_url_to_accounts.rb @@ -1,4 +1,4 @@ -class AddUrlToAccounts < ActiveRecord::Migration[4.2] +class AddURLToAccounts < ActiveRecord::Migration[4.2] def change add_column :accounts, :url, :string, null: true, default: nil end diff --git a/db/migrate/20160322193748_add_avatar_remote_url_to_accounts.rb b/db/migrate/20160322193748_add_avatar_remote_url_to_accounts.rb index f9c213d9b4..0792863a37 100644 --- a/db/migrate/20160322193748_add_avatar_remote_url_to_accounts.rb +++ b/db/migrate/20160322193748_add_avatar_remote_url_to_accounts.rb @@ -1,4 +1,4 @@ -class AddAvatarRemoteUrlToAccounts < ActiveRecord::Migration[4.2] +class AddAvatarRemoteURLToAccounts < ActiveRecord::Migration[4.2] def change add_column :accounts, :avatar_remote_url, :string, null: true, default: nil end diff --git a/db/migrate/20161006213403_rails_settings_migration.rb b/db/migrate/20161006213403_rails_settings_migration.rb index 42875d7cbd..9d565cb5c6 100644 --- a/db/migrate/20161006213403_rails_settings_migration.rb +++ b/db/migrate/20161006213403_rails_settings_migration.rb @@ -7,12 +7,12 @@ end class RailsSettingsMigration < MIGRATION_BASE_CLASS def self.up create_table :settings do |t| - t.string :var, :null => false + t.string :var, null: false t.text :value - t.references :target, :null => false, :polymorphic => true - t.timestamps :null => true + t.references :target, null: false, polymorphic: true, index: { name: 'index_settings_on_target_type_and_target_id' } + t.timestamps null: true end - add_index :settings, [ :target_type, :target_id, :var ], :unique => true + add_index :settings, [ :target_type, :target_id, :var ], unique: true end def self.down diff --git a/db/migrate/20170318214217_add_header_remote_url_to_accounts.rb b/db/migrate/20170318214217_add_header_remote_url_to_accounts.rb index 0ba38d3e00..20c9659880 100644 --- a/db/migrate/20170318214217_add_header_remote_url_to_accounts.rb +++ b/db/migrate/20170318214217_add_header_remote_url_to_accounts.rb @@ -1,4 +1,4 @@ -class AddHeaderRemoteUrlToAccounts < ActiveRecord::Migration[5.0] +class AddHeaderRemoteURLToAccounts < ActiveRecord::Migration[5.0] def change add_column :accounts, :header_remote_url, :string, null: false, default: '' end diff --git a/db/migrate/20170920024819_status_ids_to_timestamp_ids.rb b/db/migrate/20170920024819_status_ids_to_timestamp_ids.rb index c10aa2c4f7..8679f8ece8 100644 --- a/db/migrate/20170920024819_status_ids_to_timestamp_ids.rb +++ b/db/migrate/20170920024819_status_ids_to_timestamp_ids.rb @@ -1,7 +1,7 @@ class StatusIdsToTimestampIds < ActiveRecord::Migration[5.1] def up # Prepare the function we will use to generate IDs. - Rake::Task['db:define_timestamp_id'].execute + Mastodon::Snowflake.define_timestamp_id # Set up the statuses.id column to use our timestamp-based IDs. ActiveRecord::Base.connection.execute(<<~SQL) @@ -11,7 +11,7 @@ class StatusIdsToTimestampIds < ActiveRecord::Migration[5.1] SQL # Make sure we have a sequence to use. - Rake::Task['db:ensure_id_sequences_exist'].execute + Mastodon::Snowflake.ensure_id_sequences_exist end def down diff --git a/db/migrate/20171119172437_create_admin_action_logs.rb b/db/migrate/20171119172437_create_admin_action_logs.rb index 0c2b6c623d..b690735d26 100644 --- a/db/migrate/20171119172437_create_admin_action_logs.rb +++ b/db/migrate/20171119172437_create_admin_action_logs.rb @@ -3,7 +3,7 @@ class CreateAdminActionLogs < ActiveRecord::Migration[5.1] create_table :admin_action_logs do |t| t.belongs_to :account, foreign_key: { on_delete: :cascade } t.string :action, null: false, default: '' - t.references :target, polymorphic: true + t.references :target, polymorphic: true, index: { name: 'index_admin_action_logs_on_target_type_and_target_id' } t.text :recorded_changes, null: false, default: '' t.timestamps diff --git a/db/migrate/20171130000000_add_embed_url_to_preview_cards.rb b/db/migrate/20171130000000_add_embed_url_to_preview_cards.rb index d19c0091bc..8fcabef9fd 100644 --- a/db/migrate/20171130000000_add_embed_url_to_preview_cards.rb +++ b/db/migrate/20171130000000_add_embed_url_to_preview_cards.rb @@ -1,6 +1,6 @@ require Rails.root.join('lib', 'mastodon', 'migration_helpers') -class AddEmbedUrlToPreviewCards < ActiveRecord::Migration[5.1] +class AddEmbedURLToPreviewCards < ActiveRecord::Migration[5.1] include Mastodon::MigrationHelpers disable_ddl_transaction! diff --git a/db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb b/db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb index e0b8ed5cc1..1964b51216 100644 --- a/db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb +++ b/db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb @@ -1,4 +1,4 @@ -class AddFeaturedCollectionUrlToAccounts < ActiveRecord::Migration[5.1] +class AddFeaturedCollectionURLToAccounts < ActiveRecord::Migration[5.1] def change add_column :accounts, :featured_collection_url, :string end diff --git a/db/migrate/20180528141303_fix_accounts_unique_index.rb b/db/migrate/20180528141303_fix_accounts_unique_index.rb index 5d7b3c463b..3e33e2cac4 100644 --- a/db/migrate/20180528141303_fix_accounts_unique_index.rb +++ b/db/migrate/20180528141303_fix_accounts_unique_index.rb @@ -17,6 +17,21 @@ class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2] belongs_to :account, inverse_of: :stream_entries end + class Status < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account + end + + class Mention < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account + end + + class StatusPin < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account + end + disable_ddl_transaction! def up @@ -37,7 +52,7 @@ class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2] end end - duplicates = Account.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM accounts GROUP BY lower(username), lower(domain) HAVING count(*) > 1').to_hash + duplicates = Account.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM accounts GROUP BY lower(username), lower(domain) HAVING count(*) > 1').to_ary duplicates.each do |row| deduplicate_account!(row['ids'].split(',')) diff --git a/db/migrate/20181024224956_migrate_account_conversations.rb b/db/migrate/20181024224956_migrate_account_conversations.rb index 12e0a70fac..9e6497d81f 100644 --- a/db/migrate/20181024224956_migrate_account_conversations.rb +++ b/db/migrate/20181024224956_migrate_account_conversations.rb @@ -17,8 +17,8 @@ class MigrateAccountConversations < ActiveRecord::Migration[5.2] belongs_to :account, optional: true belongs_to :activity, polymorphic: true, optional: true - belongs_to :status, foreign_type: 'Status', foreign_key: 'activity_id', optional: true - belongs_to :mention, foreign_type: 'Mention', foreign_key: 'activity_id', optional: true + belongs_to :status, foreign_key: 'activity_id', optional: true + belongs_to :mention, foreign_key: 'activity_id', optional: true def target_status mention&.status diff --git a/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb b/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb index bd4f4c2a36..40537e9c9e 100644 --- a/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb +++ b/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb @@ -1,6 +1,46 @@ class RemoveFauxRemoteAccountDuplicates < ActiveRecord::Migration[5.2] disable_ddl_transaction! + class StreamEntry < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, inverse_of: :stream_entries + end + + class Status < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, inverse_of: :statuses + has_many :favourites, inverse_of: :status, dependent: :destroy + has_many :mentions, dependent: :destroy, inverse_of: :status + end + + class Favourite < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, inverse_of: :favourites + belongs_to :status, inverse_of: :favourites + end + + class Mention < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, inverse_of: :mentions + belongs_to :status + end + + class Notification < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, optional: true + belongs_to :from_account, class_name: 'Account', optional: true + belongs_to :activity, polymorphic: true, optional: true + end + + class Account < ApplicationRecord + # Dummy class, to make migration possible across version changes + has_many :stream_entries, inverse_of: :account, dependent: :destroy + has_many :statuses, inverse_of: :account, dependent: :destroy + has_many :favourites, inverse_of: :account, dependent: :destroy + has_many :mentions, inverse_of: :account, dependent: :destroy + has_many :notifications, inverse_of: :account, dependent: :destroy + end + def up local_domain = Rails.configuration.x.local_domain diff --git a/db/migrate/20181207011115_downcase_custom_emoji_domains.rb b/db/migrate/20181207011115_downcase_custom_emoji_domains.rb index 65f1fc8d93..e27e0249d9 100644 --- a/db/migrate/20181207011115_downcase_custom_emoji_domains.rb +++ b/db/migrate/20181207011115_downcase_custom_emoji_domains.rb @@ -2,7 +2,7 @@ class DowncaseCustomEmojiDomains < ActiveRecord::Migration[5.2] disable_ddl_transaction! def up - duplicates = CustomEmoji.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM custom_emojis GROUP BY shortcode, lower(domain) HAVING count(*) > 1').to_hash + duplicates = CustomEmoji.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM custom_emojis GROUP BY shortcode, lower(domain) HAVING count(*) > 1').to_ary duplicates.each do |row| CustomEmoji.where(id: row['ids'].split(',')[0...-1]).destroy_all diff --git a/db/migrate/20190715164535_add_instance_actor.rb b/db/migrate/20190715164535_add_instance_actor.rb index a26d549493..8c0301d69d 100644 --- a/db/migrate/20190715164535_add_instance_actor.rb +++ b/db/migrate/20190715164535_add_instance_actor.rb @@ -1,4 +1,9 @@ class AddInstanceActor < ActiveRecord::Migration[5.2] + class Account < ApplicationRecord + # Dummy class, to make migration possible across version changes + validates :username, uniqueness: { scope: :domain, case_sensitive: false } + end + def up Account.create!(id: -99, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain) end diff --git a/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb b/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb index 057fc86baa..3a6527f652 100644 --- a/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb +++ b/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb @@ -2,7 +2,7 @@ class AddCaseInsensitiveIndexToTags < ActiveRecord::Migration[5.2] disable_ddl_transaction! def up - Tag.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM tags GROUP BY lower(name) HAVING count(*) > 1').to_hash.each do |row| + Tag.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM tags GROUP BY lower(name) HAVING count(*) > 1').to_ary.each do |row| canonical_tag_id = row['ids'].split(',').first redundant_tag_ids = row['ids'].split(',')[1..-1] @@ -15,7 +15,13 @@ class AddCaseInsensitiveIndexToTags < ActiveRecord::Migration[5.2] Tag.where(id: redundant_tag_ids).in_batches.delete_all end - safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower ON tags (lower(name))' } + begin + safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower ON tags (lower(name))' } + rescue ActiveRecord::StatementInvalid + remove_index :tags, name: 'index_tags_on_name_lower' + raise + end + remove_index :tags, name: 'index_tags_on_name' remove_index :tags, name: 'hashtag_search_index' end diff --git a/db/migrate/20191007013357_update_pt_locales.rb b/db/migrate/20191007013357_update_pt_locales.rb index b7288d38a0..9e8f8b4241 100644 --- a/db/migrate/20191007013357_update_pt_locales.rb +++ b/db/migrate/20191007013357_update_pt_locales.rb @@ -1,4 +1,8 @@ class UpdatePtLocales < ActiveRecord::Migration[5.2] + class User < ApplicationRecord + # Dummy class, to make migration possible across version changes + end + disable_ddl_transaction! def up diff --git a/db/migrate/20200508212852_reset_unique_jobs_locks.rb b/db/migrate/20200508212852_reset_unique_jobs_locks.rb index 3ffdeb0aa8..d717ffc547 100644 --- a/db/migrate/20200508212852_reset_unique_jobs_locks.rb +++ b/db/migrate/20200508212852_reset_unique_jobs_locks.rb @@ -3,9 +3,9 @@ class ResetUniqueJobsLocks < ActiveRecord::Migration[5.2] def up # We do this to clean up unique job digests that were not properly - # disposed of prior to https://github.com/tootsuite/mastodon/pull/13361 + # disposed of prior to https://github.com/mastodon/mastodon/pull/13361 - SidekiqUniqueJobs::Digests.delete_by_pattern('*', count: SidekiqUniqueJobs::Digests.count) + until SidekiqUniqueJobs::Digests.new.delete_by_pattern('*').nil?; end end def down; end diff --git a/db/migrate/20200529214050_add_devices_url_to_accounts.rb b/db/migrate/20200529214050_add_devices_url_to_accounts.rb index 564877e5dc..1323f8df7e 100644 --- a/db/migrate/20200529214050_add_devices_url_to_accounts.rb +++ b/db/migrate/20200529214050_add_devices_url_to_accounts.rb @@ -1,4 +1,4 @@ -class AddDevicesUrlToAccounts < ActiveRecord::Migration[5.2] +class AddDevicesURLToAccounts < ActiveRecord::Migration[5.2] def change add_column :accounts, :devices_url, :string end diff --git a/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb b/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb index c3aa8e33c2..366bf9aa75 100644 --- a/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb +++ b/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb @@ -1,16 +1,10 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + class AddFixedLowercaseIndexToAccounts < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + disable_ddl_transaction! - class CorruptionError < StandardError - def cause - nil - end - - def backtrace - [] - end - end - def up if index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower') && index_name_exists?(:accounts, 'index_accounts_on_username_and_domain_lower') remove_index :accounts, name: 'index_accounts_on_username_and_domain_lower' @@ -21,7 +15,8 @@ class AddFixedLowercaseIndexToAccounts < ActiveRecord::Migration[5.2] begin add_index :accounts, "lower (username), COALESCE(lower(domain), '')", name: 'index_accounts_on_username_and_domain_lower', unique: true, algorithm: :concurrently rescue ActiveRecord::RecordNotUnique - raise CorruptionError, 'Migration failed because of index corruption, see https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/#fixing' + remove_index :accounts, name: 'index_accounts_on_username_and_domain_lower' + raise CorruptionError end remove_index :accounts, name: 'old_index_accounts_on_username_and_domain_lower' if index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower') diff --git a/db/migrate/20210221045109_create_rules.rb b/db/migrate/20210221045109_create_rules.rb new file mode 100644 index 0000000000..abe2fd42a0 --- /dev/null +++ b/db/migrate/20210221045109_create_rules.rb @@ -0,0 +1,11 @@ +class CreateRules < ActiveRecord::Migration[5.2] + def change + create_table :rules do |t| + t.integer :priority, null: false, default: 0 + t.datetime :deleted_at + t.text :text, null: false, default: '' + + t.timestamps + end + end +end diff --git a/db/migrate/20210306164523_account_ids_to_timestamp_ids.rb b/db/migrate/20210306164523_account_ids_to_timestamp_ids.rb new file mode 100644 index 0000000000..39cd4cdea4 --- /dev/null +++ b/db/migrate/20210306164523_account_ids_to_timestamp_ids.rb @@ -0,0 +1,17 @@ +class AccountIdsToTimestampIds < ActiveRecord::Migration[5.1] + def up + # Set up the accounts.id column to use our timestamp-based IDs. + safety_assured do + execute("ALTER TABLE accounts ALTER COLUMN id SET DEFAULT timestamp_id('accounts')") + end + + # Make sure we have a sequence to use. + Mastodon::Snowflake.ensure_id_sequences_exist + end + + def down + execute("LOCK accounts") + execute("SELECT setval('accounts_id_seq', (SELECT MAX(id) FROM accounts))") + execute("ALTER TABLE accounts ALTER COLUMN id SET DEFAULT nextval('accounts_id_seq')") + end +end diff --git a/db/migrate/20210322164601_create_account_summaries.rb b/db/migrate/20210322164601_create_account_summaries.rb new file mode 100644 index 0000000000..bc9011113f --- /dev/null +++ b/db/migrate/20210322164601_create_account_summaries.rb @@ -0,0 +1,9 @@ +class CreateAccountSummaries < ActiveRecord::Migration[5.2] + def change + create_view :account_summaries, materialized: { no_data: true } + + # To be able to refresh the view concurrently, + # at least one unique index is required + safety_assured { add_index :account_summaries, :account_id, unique: true } + end +end diff --git a/db/migrate/20210323114347_create_follow_recommendations.rb b/db/migrate/20210323114347_create_follow_recommendations.rb new file mode 100644 index 0000000000..77e7290320 --- /dev/null +++ b/db/migrate/20210323114347_create_follow_recommendations.rb @@ -0,0 +1,5 @@ +class CreateFollowRecommendations < ActiveRecord::Migration[5.2] + def change + create_view :follow_recommendations + end +end diff --git a/db/migrate/20210324171613_create_follow_recommendation_suppressions.rb b/db/migrate/20210324171613_create_follow_recommendation_suppressions.rb new file mode 100644 index 0000000000..c17a0be635 --- /dev/null +++ b/db/migrate/20210324171613_create_follow_recommendation_suppressions.rb @@ -0,0 +1,9 @@ +class CreateFollowRecommendationSuppressions < ActiveRecord::Migration[6.1] + def change + create_table :follow_recommendation_suppressions do |t| + t.references :account, null: false, foreign_key: { on_delete: :cascade }, index: { unique: true } + + t.timestamps + end + end +end diff --git a/db/migrate/20210416200740_create_canonical_email_blocks.rb b/db/migrate/20210416200740_create_canonical_email_blocks.rb new file mode 100644 index 0000000000..32c44646c3 --- /dev/null +++ b/db/migrate/20210416200740_create_canonical_email_blocks.rb @@ -0,0 +1,10 @@ +class CreateCanonicalEmailBlocks < ActiveRecord::Migration[6.1] + def change + create_table :canonical_email_blocks do |t| + t.string :canonical_email_hash, null: false, default: '', index: { unique: true } + t.belongs_to :reference_account, null: false, foreign_key: { to_table: 'accounts' } + + t.timestamps + end + end +end diff --git a/db/migrate/20210421121431_add_case_insensitive_btree_index_to_tags.rb b/db/migrate/20210421121431_add_case_insensitive_btree_index_to_tags.rb new file mode 100644 index 0000000000..e492c9e863 --- /dev/null +++ b/db/migrate/20210421121431_add_case_insensitive_btree_index_to_tags.rb @@ -0,0 +1,24 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddCaseInsensitiveBtreeIndexToTags < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + begin + safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower_btree ON tags (lower(name) text_pattern_ops)' } + rescue ActiveRecord::StatementInvalid => e + remove_index :tags, name: 'index_tags_on_name_lower_btree' + raise CorruptionError if e.is_a?(ActiveRecord::RecordNotUnique) + raise e + end + + remove_index :tags, name: 'index_tags_on_name_lower' + end + + def down + safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower ON tags (lower(name))' } + remove_index :tags, name: 'index_tags_on_name_lower_btree' + end +end diff --git a/db/migrate/20210425135952_add_index_on_media_attachments_account_id_status_id.rb b/db/migrate/20210425135952_add_index_on_media_attachments_account_id_status_id.rb new file mode 100644 index 0000000000..5ef2d3c398 --- /dev/null +++ b/db/migrate/20210425135952_add_index_on_media_attachments_account_id_status_id.rb @@ -0,0 +1,13 @@ +class AddIndexOnMediaAttachmentsAccountIdStatusId < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def up + add_index :media_attachments, [:account_id, :status_id], order: { status_id: :desc }, algorithm: :concurrently + remove_index :media_attachments, :account_id, algorithm: :concurrently + end + + def down + add_index :media_attachments, :account_id, algorithm: :concurrently + remove_index :media_attachments, [:account_id, :status_id], order: { status_id: :desc }, algorithm: :concurrently + end +end diff --git a/db/migrate/20210505174616_update_follow_recommendations_to_version_2.rb b/db/migrate/20210505174616_update_follow_recommendations_to_version_2.rb new file mode 100644 index 0000000000..56c0b4cb0a --- /dev/null +++ b/db/migrate/20210505174616_update_follow_recommendations_to_version_2.rb @@ -0,0 +1,18 @@ +class UpdateFollowRecommendationsToVersion2 < ActiveRecord::Migration[6.1] + # We're switching from a normal to a materialized view so we need + # custom `up` and `down` paths. + + def up + drop_view :follow_recommendations + create_view :follow_recommendations, version: 2, materialized: { no_data: true } + + # To be able to refresh the view concurrently, + # at least one unique index is required + safety_assured { add_index :follow_recommendations, :account_id, unique: true } + end + + def down + drop_view :follow_recommendations, materialized: true + create_view :follow_recommendations, version: 1 + end +end diff --git a/db/migrate/20210609202149_create_login_activities.rb b/db/migrate/20210609202149_create_login_activities.rb new file mode 100644 index 0000000000..38e147c327 --- /dev/null +++ b/db/migrate/20210609202149_create_login_activities.rb @@ -0,0 +1,14 @@ +class CreateLoginActivities < ActiveRecord::Migration[6.1] + def change + create_table :login_activities do |t| + t.belongs_to :user, null: false, foreign_key: { on_delete: :cascade } + t.string :authentication_method + t.string :provider + t.boolean :success + t.string :failure_reason + t.inet :ip + t.string :user_agent + t.datetime :created_at + end + end +end diff --git a/db/migrate/20210616214526_create_user_ips.rb b/db/migrate/20210616214526_create_user_ips.rb new file mode 100644 index 0000000000..68e81a9d81 --- /dev/null +++ b/db/migrate/20210616214526_create_user_ips.rb @@ -0,0 +1,5 @@ +class CreateUserIps < ActiveRecord::Migration[6.1] + def change + create_view :user_ips + end +end diff --git a/db/migrate/20210621221010_add_skip_sign_in_token_to_users.rb b/db/migrate/20210621221010_add_skip_sign_in_token_to_users.rb new file mode 100644 index 0000000000..43ad9b9545 --- /dev/null +++ b/db/migrate/20210621221010_add_skip_sign_in_token_to_users.rb @@ -0,0 +1,5 @@ +class AddSkipSignInTokenToUsers < ActiveRecord::Migration[6.1] + def change + add_column :users, :skip_sign_in_token, :boolean + end +end diff --git a/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb b/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb new file mode 100644 index 0000000000..64cf84448b --- /dev/null +++ b/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb @@ -0,0 +1,13 @@ +class FixCanonicalEmailBlocksForeignKey < ActiveRecord::Migration[6.1] + def up + safety_assured do + execute 'ALTER TABLE canonical_email_blocks DROP CONSTRAINT fk_rails_1ecb262096, ADD CONSTRAINT fk_rails_1ecb262096 FOREIGN KEY (reference_account_id) REFERENCES accounts(id) ON DELETE CASCADE;' + end + end + + def down + safety_assured do + execute 'ALTER TABLE canonical_email_blocks DROP CONSTRAINT fk_rails_1ecb262096, ADD CONSTRAINT fk_rails_1ecb262096 FOREIGN KEY (reference_account_id) REFERENCES accounts(id);' + end + end +end diff --git a/db/migrate/20210722120340_create_account_statuses_cleanup_policies.rb b/db/migrate/20210722120340_create_account_statuses_cleanup_policies.rb new file mode 100644 index 0000000000..28cfb6ef52 --- /dev/null +++ b/db/migrate/20210722120340_create_account_statuses_cleanup_policies.rb @@ -0,0 +1,20 @@ +class CreateAccountStatusesCleanupPolicies < ActiveRecord::Migration[6.1] + def change + create_table :account_statuses_cleanup_policies do |t| + t.belongs_to :account, null: false, foreign_key: { on_delete: :cascade } + t.boolean :enabled, null: false, default: true + t.integer :min_status_age, null: false, default: 2.weeks.seconds + t.boolean :keep_direct, null: false, default: true + t.boolean :keep_pinned, null: false, default: true + t.boolean :keep_polls, null: false, default: false + t.boolean :keep_media, null: false, default: false + t.boolean :keep_self_fav, null: false, default: true + t.boolean :keep_self_bookmark, null: false, default: true + t.integer :min_favs, null: true + t.integer :min_reblogs, null: true + + t.timestamps + end + end +end + diff --git a/db/migrate/20210904215403_add_edited_at_to_statuses.rb b/db/migrate/20210904215403_add_edited_at_to_statuses.rb new file mode 100644 index 0000000000..216ad8e138 --- /dev/null +++ b/db/migrate/20210904215403_add_edited_at_to_statuses.rb @@ -0,0 +1,5 @@ +class AddEditedAtToStatuses < ActiveRecord::Migration[6.1] + def change + add_column :statuses, :edited_at, :datetime + end +end diff --git a/db/migrate/20210908220918_create_status_edits.rb b/db/migrate/20210908220918_create_status_edits.rb new file mode 100644 index 0000000000..6c90149d00 --- /dev/null +++ b/db/migrate/20210908220918_create_status_edits.rb @@ -0,0 +1,13 @@ +class CreateStatusEdits < ActiveRecord::Migration[6.1] + def change + create_table :status_edits do |t| + t.belongs_to :status, null: false, foreign_key: { on_delete: :cascade } + t.belongs_to :account, null: true, foreign_key: { on_delete: :nullify } + t.text :text, null: false, default: '' + t.text :spoiler_text, null: false, default: '' + t.boolean :media_attachments_changed, null: false, default: false + + t.timestamps + end + end +end diff --git a/db/migrate/20211031031021_create_preview_card_providers.rb b/db/migrate/20211031031021_create_preview_card_providers.rb new file mode 100644 index 0000000000..0bd46198e2 --- /dev/null +++ b/db/migrate/20211031031021_create_preview_card_providers.rb @@ -0,0 +1,12 @@ +class CreatePreviewCardProviders < ActiveRecord::Migration[6.1] + def change + create_table :preview_card_providers do |t| + t.string :domain, null: false, default: '', index: { unique: true } + t.attachment :icon + t.boolean :trendable + t.datetime :reviewed_at + t.datetime :requested_review_at + t.timestamps + end + end +end diff --git a/db/migrate/20211112011713_add_language_to_preview_cards.rb b/db/migrate/20211112011713_add_language_to_preview_cards.rb new file mode 100644 index 0000000000..995934de4c --- /dev/null +++ b/db/migrate/20211112011713_add_language_to_preview_cards.rb @@ -0,0 +1,7 @@ +class AddLanguageToPreviewCards < ActiveRecord::Migration[6.1] + def change + add_column :preview_cards, :language, :string + add_column :preview_cards, :max_score, :float + add_column :preview_cards, :max_score_at, :datetime + end +end diff --git a/db/migrate/20211115032527_add_trendable_to_preview_cards.rb b/db/migrate/20211115032527_add_trendable_to_preview_cards.rb new file mode 100644 index 0000000000..87bf3d7a23 --- /dev/null +++ b/db/migrate/20211115032527_add_trendable_to_preview_cards.rb @@ -0,0 +1,5 @@ +class AddTrendableToPreviewCards < ActiveRecord::Migration[6.1] + def change + add_column :preview_cards, :trendable, :boolean + end +end diff --git a/db/migrate/20211123212714_add_link_type_to_preview_cards.rb b/db/migrate/20211123212714_add_link_type_to_preview_cards.rb new file mode 100644 index 0000000000..9f57e02194 --- /dev/null +++ b/db/migrate/20211123212714_add_link_type_to_preview_cards.rb @@ -0,0 +1,5 @@ +class AddLinkTypeToPreviewCards < ActiveRecord::Migration[6.1] + def change + add_column :preview_cards, :link_type, :int + end +end diff --git a/db/migrate/20211213040746_update_account_summaries_to_version_2.rb b/db/migrate/20211213040746_update_account_summaries_to_version_2.rb new file mode 100644 index 0000000000..0d1f092ec6 --- /dev/null +++ b/db/migrate/20211213040746_update_account_summaries_to_version_2.rb @@ -0,0 +1,24 @@ +class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1] + def up + reapplication_follow_recommendations_v2 do + drop_view :account_summaries, materialized: true + create_view :account_summaries, version: 2, materialized: { no_data: true } + safety_assured { add_index :account_summaries, :account_id, unique: true } + end + end + + def down + reapplication_follow_recommendations_v2 do + drop_view :account_summaries, materialized: true + create_view :account_summaries, version: 1, materialized: { no_data: true } + safety_assured { add_index :account_summaries, :account_id, unique: true } + end + end + + def reapplication_follow_recommendations_v2 + drop_view :follow_recommendations, materialized: true + yield + create_view :follow_recommendations, version: 2, materialized: { no_data: true } + safety_assured { add_index :follow_recommendations, :account_id, unique: true } + end +end diff --git a/db/migrate/20211231080958_add_category_to_reports.rb b/db/migrate/20211231080958_add_category_to_reports.rb new file mode 100644 index 0000000000..c2b495c635 --- /dev/null +++ b/db/migrate/20211231080958_add_category_to_reports.rb @@ -0,0 +1,21 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddCategoryToReports < ActiveRecord::Migration[6.1] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured { add_column_with_default :reports, :category, :int, default: 0, allow_null: false } + add_column :reports, :action_taken_at, :datetime + add_column :reports, :rule_ids, :bigint, array: true + safety_assured { execute 'UPDATE reports SET action_taken_at = updated_at WHERE action_taken = TRUE' } + end + + def down + safety_assured { execute 'UPDATE reports SET action_taken = TRUE WHERE action_taken_at IS NOT NULL' } + remove_column :reports, :category + remove_column :reports, :action_taken_at + remove_column :reports, :rule_ids + end +end diff --git a/db/migrate/20220105163928_remove_mentions_status_id_index.rb b/db/migrate/20220105163928_remove_mentions_status_id_index.rb new file mode 100644 index 0000000000..56e9037192 --- /dev/null +++ b/db/migrate/20220105163928_remove_mentions_status_id_index.rb @@ -0,0 +1,9 @@ +class RemoveMentionsStatusIdIndex < ActiveRecord::Migration[6.1] + def up + remove_index :mentions, name: :mentions_status_id_index if index_exists?(:mentions, :status_id, name: :mentions_status_id_index) + end + + def down + # As this index should not exist and is a duplicate of another index, do not re-create it + end +end diff --git a/db/migrate/20220115125126_add_report_id_to_account_warnings.rb b/db/migrate/20220115125126_add_report_id_to_account_warnings.rb new file mode 100644 index 0000000000..a1c20c99ef --- /dev/null +++ b/db/migrate/20220115125126_add_report_id_to_account_warnings.rb @@ -0,0 +1,6 @@ +class AddReportIdToAccountWarnings < ActiveRecord::Migration[6.1] + def change + safety_assured { add_reference :account_warnings, :report, foreign_key: { on_delete: :cascade }, index: false } + add_column :account_warnings, :status_ids, :string, array: true + end +end diff --git a/db/migrate/20220115125341_fix_account_warning_actions.rb b/db/migrate/20220115125341_fix_account_warning_actions.rb new file mode 100644 index 0000000000..25cc17fd39 --- /dev/null +++ b/db/migrate/20220115125341_fix_account_warning_actions.rb @@ -0,0 +1,21 @@ +class FixAccountWarningActions < ActiveRecord::Migration[6.1] + disable_ddl_transaction! + + def up + safety_assured do + execute 'UPDATE account_warnings SET action = 1000 WHERE action = 1' + execute 'UPDATE account_warnings SET action = 2000 WHERE action = 2' + execute 'UPDATE account_warnings SET action = 3000 WHERE action = 3' + execute 'UPDATE account_warnings SET action = 4000 WHERE action = 4' + end + end + + def down + safety_assured do + execute 'UPDATE account_warnings SET action = 1 WHERE action = 1000' + execute 'UPDATE account_warnings SET action = 2 WHERE action = 2000' + execute 'UPDATE account_warnings SET action = 3 WHERE action = 3000' + execute 'UPDATE account_warnings SET action = 4 WHERE action = 4000' + end + end +end diff --git a/db/migrate/20220116202951_add_deleted_at_index_on_statuses.rb b/db/migrate/20220116202951_add_deleted_at_index_on_statuses.rb new file mode 100644 index 0000000000..dc33625528 --- /dev/null +++ b/db/migrate/20220116202951_add_deleted_at_index_on_statuses.rb @@ -0,0 +1,7 @@ +class AddDeletedAtIndexOnStatuses < ActiveRecord::Migration[6.1] + disable_ddl_transaction! + + def change + add_index :statuses, :deleted_at, where: 'deleted_at IS NOT NULL', algorithm: :concurrently + end +end diff --git a/db/post_migrate/20210308133107_remove_subscription_expires_at_from_accounts.rb b/db/post_migrate/20210308133107_remove_subscription_expires_at_from_accounts.rb new file mode 100644 index 0000000000..53e24ef261 --- /dev/null +++ b/db/post_migrate/20210308133107_remove_subscription_expires_at_from_accounts.rb @@ -0,0 +1,7 @@ +class RemoveSubscriptionExpiresAtFromAccounts < ActiveRecord::Migration[5.0] + def change + safety_assured do + remove_column :accounts, :subscription_expires_at, :datetime, null: true, default: nil + end + end +end diff --git a/db/post_migrate/20210502233513_drop_account_tag_stats.rb b/db/post_migrate/20210502233513_drop_account_tag_stats.rb new file mode 100644 index 0000000000..80adadcab0 --- /dev/null +++ b/db/post_migrate/20210502233513_drop_account_tag_stats.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class DropAccountTagStats < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def up + drop_table :account_tag_stats + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/post_migrate/20210507001928_remove_hub_url_from_accounts.rb b/db/post_migrate/20210507001928_remove_hub_url_from_accounts.rb new file mode 100644 index 0000000000..83a1f5fcf3 --- /dev/null +++ b/db/post_migrate/20210507001928_remove_hub_url_from_accounts.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class RemoveHubURLFromAccounts < ActiveRecord::Migration[5.2] + def change + safety_assured do + remove_column :accounts, :secret, :string, null: false, default: '' + remove_column :accounts, :remote_url, :string, null: false, default: '' + remove_column :accounts, :salmon_url, :string, null: false, default: '' + remove_column :accounts, :hub_url, :string, null: false, default: '' + end + end +end diff --git a/db/post_migrate/20210526193025_remove_lock_version_from_account_stats.rb b/db/post_migrate/20210526193025_remove_lock_version_from_account_stats.rb new file mode 100644 index 0000000000..3079bed09c --- /dev/null +++ b/db/post_migrate/20210526193025_remove_lock_version_from_account_stats.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class RemoveLockVersionFromAccountStats < ActiveRecord::Migration[5.2] + def change + safety_assured do + remove_column :account_stats, :lock_version, :integer, null: false, default: 0 + end + end +end diff --git a/db/post_migrate/20210616214135_remove_current_sign_in_ip_from_users.rb b/db/post_migrate/20210616214135_remove_current_sign_in_ip_from_users.rb new file mode 100644 index 0000000000..b53b247f22 --- /dev/null +++ b/db/post_migrate/20210616214135_remove_current_sign_in_ip_from_users.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class RemoveCurrentSignInIpFromUsers < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def change + safety_assured do + remove_column :users, :current_sign_in_ip, :inet + remove_column :users, :last_sign_in_ip, :inet + end + end +end diff --git a/db/post_migrate/20210808071221_clear_orphaned_account_notes.rb b/db/post_migrate/20210808071221_clear_orphaned_account_notes.rb new file mode 100644 index 0000000000..71171658af --- /dev/null +++ b/db/post_migrate/20210808071221_clear_orphaned_account_notes.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class ClearOrphanedAccountNotes < ActiveRecord::Migration[5.2] + class Account < ApplicationRecord + # Dummy class, to make migration possible across version changes + end + + class AccountNote < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account + belongs_to :target_account, class_name: 'Account' + end + + def up + AccountNote.where('NOT EXISTS (SELECT * FROM users u WHERE u.account_id = account_notes.account_id)').in_batches.delete_all + end + + def down + # nothing to do + end +end diff --git a/db/post_migrate/20211126000907_drop_account_identity_proofs.rb b/db/post_migrate/20211126000907_drop_account_identity_proofs.rb new file mode 100644 index 0000000000..44a6f1f08c --- /dev/null +++ b/db/post_migrate/20211126000907_drop_account_identity_proofs.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class DropAccountIdentityProofs < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def up + drop_table :account_identity_proofs + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/post_migrate/20220109213908_remove_action_taken_from_reports.rb b/db/post_migrate/20220109213908_remove_action_taken_from_reports.rb new file mode 100644 index 0000000000..73e6ad6f43 --- /dev/null +++ b/db/post_migrate/20220109213908_remove_action_taken_from_reports.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class RemoveActionTakenFromReports < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def change + safety_assured { remove_column :reports, :action_taken, :boolean, default: false, null: false } + end +end diff --git a/db/post_migrate/20220118183010_remove_index_users_on_remember_token.rb b/db/post_migrate/20220118183010_remove_index_users_on_remember_token.rb new file mode 100644 index 0000000000..367d489de9 --- /dev/null +++ b/db/post_migrate/20220118183010_remove_index_users_on_remember_token.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class RemoveIndexUsersOnRememberToken < ActiveRecord::Migration[6.1] + disable_ddl_transaction! + + def up + remove_index :users, name: :index_users_on_remember_token + end + + def down + add_index :users, :remember_token, algorithm: :concurrently, unique: true, name: :index_users_on_remember_token + end +end diff --git a/db/post_migrate/20220118183123_remove_rememberable_from_users.rb b/db/post_migrate/20220118183123_remove_rememberable_from_users.rb new file mode 100644 index 0000000000..1e274c6e0b --- /dev/null +++ b/db/post_migrate/20220118183123_remove_rememberable_from_users.rb @@ -0,0 +1,8 @@ +class RemoveRememberableFromUsers < ActiveRecord::Migration[6.1] + def change + safety_assured do + remove_column :users, :remember_token, :string, null: true, default: nil + remove_column :users, :remember_created_at, :datetime, null: true, default: nil + end + end +end diff --git a/db/schema.rb b/db/schema.rb index a76e34e950..ff28f7a7fb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -2,15 +2,15 @@ # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_12_18_054746) do +ActiveRecord::Schema.define(version: 2022_01_18_183123) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -51,18 +51,6 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.index ["account_id", "domain"], name: "index_account_domain_blocks_on_account_id_and_domain", unique: true end - create_table "account_identity_proofs", force: :cascade do |t| - t.bigint "account_id" - t.string "provider", default: "", null: false - t.string "provider_username", default: "", null: false - t.text "token", default: "", null: false - t.boolean "verified", default: false, null: false - t.boolean "live", default: false, null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["account_id", "provider", "provider_username"], name: "index_account_proofs_on_account_and_provider_and_username", unique: true - end - create_table "account_migrations", force: :cascade do |t| t.bigint "account_id" t.string "acct", default: "", null: false @@ -111,17 +99,24 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.datetime "last_status_at" - t.integer "lock_version", default: 0, null: false t.index ["account_id"], name: "index_account_stats_on_account_id", unique: true end - create_table "account_tag_stats", force: :cascade do |t| - t.bigint "tag_id", null: false - t.bigint "accounts_count", default: 0, null: false - t.boolean "hidden", default: false, null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["tag_id"], name: "index_account_tag_stats_on_tag_id", unique: true + create_table "account_statuses_cleanup_policies", force: :cascade do |t| + t.bigint "account_id", null: false + t.boolean "enabled", default: true, null: false + t.integer "min_status_age", default: 1209600, null: false + t.boolean "keep_direct", default: true, null: false + t.boolean "keep_pinned", default: true, null: false + t.boolean "keep_polls", default: false, null: false + t.boolean "keep_media", default: false, null: false + t.boolean "keep_self_fav", default: true, null: false + t.boolean "keep_self_bookmark", default: true, null: false + t.integer "min_favs" + t.integer "min_reblogs" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["account_id"], name: "index_account_statuses_cleanup_policies_on_account_id" end create_table "account_warning_presets", force: :cascade do |t| @@ -138,19 +133,17 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.text "text", default: "", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "report_id" + t.string "status_ids", array: true t.index ["account_id"], name: "index_account_warnings_on_account_id" t.index ["target_account_id"], name: "index_account_warnings_on_target_account_id" end - create_table "accounts", force: :cascade do |t| + create_table "accounts", id: :bigint, default: -> { "timestamp_id('accounts'::text)" }, force: :cascade do |t| t.string "username", default: "", null: false t.string "domain" - t.string "secret", default: "", null: false t.text "private_key" t.text "public_key", default: "", null: false - t.string "remote_url", default: "", null: false - t.string "salmon_url", default: "", null: false - t.string "hub_url", default: "", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.text "note", default: "", null: false @@ -166,7 +159,6 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.integer "header_file_size" t.datetime "header_updated_at" t.string "avatar_remote_url" - t.datetime "subscription_expires_at" t.boolean "locked", default: false, null: false t.string "header_remote_url", default: "", null: false t.datetime "last_webfingered_at" @@ -281,6 +273,15 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.index ["status_id"], name: "index_bookmarks_on_status_id" end + create_table "canonical_email_blocks", force: :cascade do |t| + t.string "canonical_email_hash", default: "", null: false + t.bigint "reference_account_id", null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["canonical_email_hash"], name: "index_canonical_email_blocks_on_canonical_email_hash", unique: true + t.index ["reference_account_id"], name: "index_canonical_email_blocks_on_reference_account_id" + end + create_table "conversation_mutes", force: :cascade do |t| t.bigint "conversation_id", null: false t.bigint "account_id", null: false @@ -407,6 +408,13 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.index ["tag_id"], name: "index_featured_tags_on_tag_id" end + create_table "follow_recommendation_suppressions", force: :cascade do |t| + t.bigint "account_id", null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["account_id"], name: "index_follow_recommendation_suppressions_on_account_id", unique: true + end + create_table "follow_requests", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -493,6 +501,18 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.index ["account_id"], name: "index_lists_on_account_id" end + create_table "login_activities", force: :cascade do |t| + t.bigint "user_id", null: false + t.string "authentication_method" + t.string "provider" + t.boolean "success" + t.string "failure_reason" + t.inet "ip" + t.string "user_agent" + t.datetime "created_at" + t.index ["user_id"], name: "index_login_activities_on_user_id" + end + create_table "markers", force: :cascade do |t| t.bigint "user_id" t.string "timeline", default: "", null: false @@ -526,7 +546,7 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.integer "thumbnail_file_size" t.datetime "thumbnail_updated_at" t.string "thumbnail_remote_url" - t.index ["account_id"], name: "index_media_attachments_on_account_id" + t.index ["account_id", "status_id"], name: "index_media_attachments_on_account_id_and_status_id", order: { status_id: :desc } t.index ["scheduled_status_id"], name: "index_media_attachments_on_scheduled_status_id" t.index ["shortcode"], name: "index_media_attachments_on_shortcode", unique: true t.index ["status_id"], name: "index_media_attachments_on_status_id" @@ -659,6 +679,20 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.index ["status_id"], name: "index_polls_on_status_id" end + create_table "preview_card_providers", force: :cascade do |t| + t.string "domain", default: "", null: false + t.string "icon_file_name" + t.string "icon_content_type" + t.bigint "icon_file_size" + t.datetime "icon_updated_at" + t.boolean "trendable" + t.datetime "reviewed_at" + t.datetime "requested_review_at" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["domain"], name: "index_preview_card_providers_on_domain", unique: true + end + create_table "preview_cards", force: :cascade do |t| t.string "url", default: "", null: false t.string "title", default: "", null: false @@ -680,6 +714,11 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.string "embed_url", default: "", null: false t.integer "image_storage_schema_version" t.string "blurhash" + t.string "language" + t.float "max_score" + t.datetime "max_score_at" + t.boolean "trendable" + t.integer "link_type" t.index ["url"], name: "index_preview_cards_on_url", unique: true end @@ -710,7 +749,6 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do create_table "reports", force: :cascade do |t| t.bigint "status_ids", default: [], null: false, array: true t.text "comment", default: "", null: false - t.boolean "action_taken", default: false, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "account_id", null: false @@ -719,10 +757,21 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.bigint "assigned_account_id" t.string "uri" t.boolean "forwarded" + t.integer "category", default: 0, null: false + t.datetime "action_taken_at" + t.bigint "rule_ids", array: true t.index ["account_id"], name: "index_reports_on_account_id" t.index ["target_account_id"], name: "index_reports_on_target_account_id" end + create_table "rules", force: :cascade do |t| + t.integer "priority", default: 0, null: false + t.datetime "deleted_at" + t.text "text", default: "", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "scheduled_statuses", force: :cascade do |t| t.bigint "account_id" t.datetime "scheduled_at" @@ -767,6 +816,18 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.index ["var"], name: "index_site_uploads_on_var", unique: true end + create_table "status_edits", force: :cascade do |t| + t.bigint "status_id", null: false + t.bigint "account_id" + t.text "text", default: "", null: false + t.text "spoiler_text", default: "", null: false + t.boolean "media_attachments_changed", default: false, null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["account_id"], name: "index_status_edits_on_account_id" + t.index ["status_id"], name: "index_status_edits_on_status_id" + end + create_table "status_pins", force: :cascade do |t| t.bigint "account_id", null: false t.bigint "status_id", null: false @@ -807,7 +868,9 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.bigint "poll_id" t.string "content_type" t.datetime "deleted_at" + t.datetime "edited_at" t.index ["account_id", "id", "visibility", "updated_at"], name: "index_statuses_20190820", order: { id: :desc }, where: "(deleted_at IS NULL)" + t.index ["deleted_at"], name: "index_statuses_on_deleted_at", where: "(deleted_at IS NOT NULL)" t.index ["id", "account_id"], name: "index_statuses_local_20190824", order: { id: :desc }, where: "((local OR (uri IS NULL)) AND (deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))" t.index ["id", "account_id"], name: "index_statuses_public_20200119", order: { id: :desc }, where: "((deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))" t.index ["in_reply_to_account_id"], name: "index_statuses_on_in_reply_to_account_id" @@ -841,7 +904,7 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.datetime "last_status_at" t.float "max_score" t.datetime "max_score_at" - t.index "lower((name)::text)", name: "index_tags_on_name_lower", unique: true + t.index "lower((name)::text) text_pattern_ops", name: "index_tags_on_name_lower_btree", unique: true end create_table "tombstones", force: :cascade do |t| @@ -876,12 +939,9 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" - t.datetime "remember_created_at" t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.inet "current_sign_in_ip" - t.inet "last_sign_in_ip" t.boolean "admin", default: false, null: false t.string "confirmation_token" t.datetime "confirmed_at" @@ -900,7 +960,6 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.boolean "disabled", default: false, null: false t.boolean "moderator", default: false, null: false t.bigint "invite_id" - t.string "remember_token" t.string "chosen_languages", array: true t.bigint "created_by_application_id" t.boolean "approved", default: true, null: false @@ -908,11 +967,11 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do t.datetime "sign_in_token_sent_at" t.string "webauthn_id" t.inet "sign_up_ip" + t.boolean "skip_sign_in_token" t.index ["account_id"], name: "index_users_on_account_id" t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id" t.index ["email"], name: "index_users_on_email", unique: true - t.index ["remember_token"], name: "index_users_on_remember_token", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end @@ -954,7 +1013,6 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do add_foreign_key "account_conversations", "conversations", on_delete: :cascade add_foreign_key "account_deletion_requests", "accounts", on_delete: :cascade add_foreign_key "account_domain_blocks", "accounts", name: "fk_206c6029bd", on_delete: :cascade - add_foreign_key "account_identity_proofs", "accounts", on_delete: :cascade add_foreign_key "account_migrations", "accounts", column: "target_account_id", on_delete: :nullify add_foreign_key "account_migrations", "accounts", on_delete: :cascade add_foreign_key "account_moderation_notes", "accounts" @@ -964,9 +1022,10 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do add_foreign_key "account_pins", "accounts", column: "target_account_id", on_delete: :cascade add_foreign_key "account_pins", "accounts", on_delete: :cascade add_foreign_key "account_stats", "accounts", on_delete: :cascade - add_foreign_key "account_tag_stats", "tags", on_delete: :cascade + add_foreign_key "account_statuses_cleanup_policies", "accounts", on_delete: :cascade add_foreign_key "account_warnings", "accounts", column: "target_account_id", on_delete: :cascade add_foreign_key "account_warnings", "accounts", on_delete: :nullify + add_foreign_key "account_warnings", "reports", on_delete: :cascade add_foreign_key "accounts", "accounts", column: "moved_to_account_id", on_delete: :nullify add_foreign_key "admin_action_logs", "accounts", on_delete: :cascade add_foreign_key "announcement_mutes", "accounts", on_delete: :cascade @@ -979,6 +1038,7 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do add_foreign_key "blocks", "accounts", name: "fk_4269e03e65", on_delete: :cascade add_foreign_key "bookmarks", "accounts", on_delete: :cascade add_foreign_key "bookmarks", "statuses", on_delete: :cascade + add_foreign_key "canonical_email_blocks", "accounts", column: "reference_account_id", on_delete: :cascade add_foreign_key "conversation_mutes", "accounts", name: "fk_225b4212bb", on_delete: :cascade add_foreign_key "conversation_mutes", "conversations", on_delete: :cascade add_foreign_key "custom_filters", "accounts", on_delete: :cascade @@ -991,6 +1051,7 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do add_foreign_key "favourites", "statuses", name: "fk_b0e856845e", on_delete: :cascade add_foreign_key "featured_tags", "accounts", on_delete: :cascade add_foreign_key "featured_tags", "tags", on_delete: :cascade + add_foreign_key "follow_recommendation_suppressions", "accounts", on_delete: :cascade add_foreign_key "follow_requests", "accounts", column: "target_account_id", name: "fk_9291ec025d", on_delete: :cascade add_foreign_key "follow_requests", "accounts", name: "fk_76d644b0e7", on_delete: :cascade add_foreign_key "follows", "accounts", column: "target_account_id", name: "fk_745ca29eac", on_delete: :cascade @@ -1002,6 +1063,7 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do add_foreign_key "list_accounts", "follows", on_delete: :cascade add_foreign_key "list_accounts", "lists", on_delete: :cascade add_foreign_key "lists", "accounts", on_delete: :cascade + add_foreign_key "login_activities", "users", on_delete: :cascade add_foreign_key "markers", "users", on_delete: :cascade add_foreign_key "media_attachments", "accounts", name: "fk_96dd81e81b", on_delete: :nullify add_foreign_key "media_attachments", "scheduled_statuses", on_delete: :nullify @@ -1031,6 +1093,8 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do add_foreign_key "scheduled_statuses", "accounts", on_delete: :cascade add_foreign_key "session_activations", "oauth_access_tokens", column: "access_token_id", name: "fk_957e5bda89", on_delete: :cascade add_foreign_key "session_activations", "users", name: "fk_e5fda67334", on_delete: :cascade + add_foreign_key "status_edits", "accounts", on_delete: :nullify + add_foreign_key "status_edits", "statuses", on_delete: :cascade add_foreign_key "status_pins", "accounts", name: "fk_d4cb435b62", on_delete: :cascade add_foreign_key "status_pins", "statuses", on_delete: :cascade add_foreign_key "status_stats", "statuses", on_delete: :cascade @@ -1074,4 +1138,73 @@ ActiveRecord::Schema.define(version: 2020_12_18_054746) do SQL add_index "instances", ["domain"], name: "index_instances_on_domain", unique: true + create_view "user_ips", sql_definition: <<-SQL + SELECT t0.user_id, + t0.ip, + max(t0.used_at) AS used_at + FROM ( SELECT users.id AS user_id, + users.sign_up_ip AS ip, + users.created_at AS used_at + FROM users + WHERE (users.sign_up_ip IS NOT NULL) + UNION ALL + SELECT session_activations.user_id, + session_activations.ip, + session_activations.updated_at + FROM session_activations + UNION ALL + SELECT login_activities.user_id, + login_activities.ip, + login_activities.created_at + FROM login_activities + WHERE (login_activities.success = true)) t0 + GROUP BY t0.user_id, t0.ip; + SQL + create_view "account_summaries", materialized: true, sql_definition: <<-SQL + SELECT accounts.id AS account_id, + mode() WITHIN GROUP (ORDER BY t0.language) AS language, + mode() WITHIN GROUP (ORDER BY t0.sensitive) AS sensitive + FROM (accounts + CROSS JOIN LATERAL ( SELECT statuses.account_id, + statuses.language, + statuses.sensitive + FROM statuses + WHERE ((statuses.account_id = accounts.id) AND (statuses.deleted_at IS NULL) AND (statuses.reblog_of_id IS NULL)) + ORDER BY statuses.id DESC + LIMIT 20) t0) + WHERE ((accounts.suspended_at IS NULL) AND (accounts.silenced_at IS NULL) AND (accounts.moved_to_account_id IS NULL) AND (accounts.discoverable = true) AND (accounts.locked = false)) + GROUP BY accounts.id; + SQL + add_index "account_summaries", ["account_id"], name: "index_account_summaries_on_account_id", unique: true + + create_view "follow_recommendations", materialized: true, sql_definition: <<-SQL + SELECT t0.account_id, + sum(t0.rank) AS rank, + array_agg(t0.reason) AS reason + FROM ( SELECT account_summaries.account_id, + ((count(follows.id))::numeric / (1.0 + (count(follows.id))::numeric)) AS rank, + 'most_followed'::text AS reason + FROM (((follows + JOIN account_summaries ON ((account_summaries.account_id = follows.target_account_id))) + JOIN users ON ((users.account_id = follows.account_id))) + LEFT JOIN follow_recommendation_suppressions ON ((follow_recommendation_suppressions.account_id = follows.target_account_id))) + WHERE ((users.current_sign_in_at >= (now() - 'P30D'::interval)) AND (account_summaries.sensitive = false) AND (follow_recommendation_suppressions.id IS NULL)) + GROUP BY account_summaries.account_id + HAVING (count(follows.id) >= 5) + UNION ALL + SELECT account_summaries.account_id, + (sum((status_stats.reblogs_count + status_stats.favourites_count)) / (1.0 + sum((status_stats.reblogs_count + status_stats.favourites_count)))) AS rank, + 'most_interactions'::text AS reason + FROM (((status_stats + JOIN statuses ON ((statuses.id = status_stats.status_id))) + JOIN account_summaries ON ((account_summaries.account_id = statuses.account_id))) + LEFT JOIN follow_recommendation_suppressions ON ((follow_recommendation_suppressions.account_id = statuses.account_id))) + WHERE ((statuses.id >= (((date_part('epoch'::text, (now() - 'P30D'::interval)) * (1000)::double precision))::bigint << 16)) AND (account_summaries.sensitive = false) AND (follow_recommendation_suppressions.id IS NULL)) + GROUP BY account_summaries.account_id + HAVING (sum((status_stats.reblogs_count + status_stats.favourites_count)) >= (5)::numeric)) t0 + GROUP BY t0.account_id + ORDER BY (sum(t0.rank)) DESC; + SQL + add_index "follow_recommendations", ["account_id"], name: "index_follow_recommendations_on_account_id", unique: true + end diff --git a/db/views/account_summaries_v01.sql b/db/views/account_summaries_v01.sql new file mode 100644 index 0000000000..5a632b6227 --- /dev/null +++ b/db/views/account_summaries_v01.sql @@ -0,0 +1,22 @@ +SELECT + accounts.id AS account_id, + mode() WITHIN GROUP (ORDER BY language ASC) AS language, + mode() WITHIN GROUP (ORDER BY sensitive ASC) AS sensitive +FROM accounts +CROSS JOIN LATERAL ( + SELECT + statuses.account_id, + statuses.language, + statuses.sensitive + FROM statuses + WHERE statuses.account_id = accounts.id + AND statuses.deleted_at IS NULL + ORDER BY statuses.id DESC + LIMIT 20 +) t0 +WHERE accounts.suspended_at IS NULL + AND accounts.silenced_at IS NULL + AND accounts.moved_to_account_id IS NULL + AND accounts.discoverable = 't' + AND accounts.locked = 'f' +GROUP BY accounts.id diff --git a/db/views/account_summaries_v02.sql b/db/views/account_summaries_v02.sql new file mode 100644 index 0000000000..17f5605f8f --- /dev/null +++ b/db/views/account_summaries_v02.sql @@ -0,0 +1,23 @@ +SELECT + accounts.id AS account_id, + mode() WITHIN GROUP (ORDER BY language ASC) AS language, + mode() WITHIN GROUP (ORDER BY sensitive ASC) AS sensitive +FROM accounts +CROSS JOIN LATERAL ( + SELECT + statuses.account_id, + statuses.language, + statuses.sensitive + FROM statuses + WHERE statuses.account_id = accounts.id + AND statuses.deleted_at IS NULL + AND statuses.reblog_of_id IS NULL + ORDER BY statuses.id DESC + LIMIT 20 +) t0 +WHERE accounts.suspended_at IS NULL + AND accounts.silenced_at IS NULL + AND accounts.moved_to_account_id IS NULL + AND accounts.discoverable = 't' + AND accounts.locked = 'f' +GROUP BY accounts.id diff --git a/db/views/follow_recommendations_v01.sql b/db/views/follow_recommendations_v01.sql new file mode 100644 index 0000000000..8295bbc0f0 --- /dev/null +++ b/db/views/follow_recommendations_v01.sql @@ -0,0 +1,38 @@ +SELECT + account_id, + sum(rank) AS rank, + array_agg(reason) AS reason +FROM ( + SELECT + accounts.id AS account_id, + count(follows.id) / (1.0 + count(follows.id)) AS rank, + 'most_followed' AS reason + FROM follows + INNER JOIN accounts ON accounts.id = follows.target_account_id + INNER JOIN users ON users.account_id = follows.account_id + WHERE users.current_sign_in_at >= (now() - interval '30 days') + AND accounts.suspended_at IS NULL + AND accounts.moved_to_account_id IS NULL + AND accounts.silenced_at IS NULL + AND accounts.locked = 'f' + AND accounts.discoverable = 't' + GROUP BY accounts.id + HAVING count(follows.id) >= 5 + UNION ALL + SELECT accounts.id AS account_id, + sum(status_stats.reblogs_count + status_stats.favourites_count) / (1.0 + sum(status_stats.reblogs_count + status_stats.favourites_count)) AS rank, + 'most_interactions' AS reason + FROM status_stats + INNER JOIN statuses ON statuses.id = status_stats.status_id + INNER JOIN accounts ON accounts.id = statuses.account_id + WHERE statuses.id >= ((date_part('epoch', now() - interval '30 days') * 1000)::bigint << 16) + AND accounts.suspended_at IS NULL + AND accounts.moved_to_account_id IS NULL + AND accounts.silenced_at IS NULL + AND accounts.locked = 'f' + AND accounts.discoverable = 't' + GROUP BY accounts.id + HAVING sum(status_stats.reblogs_count + status_stats.favourites_count) >= 5 +) t0 +GROUP BY account_id +ORDER BY rank DESC diff --git a/db/views/follow_recommendations_v02.sql b/db/views/follow_recommendations_v02.sql new file mode 100644 index 0000000000..f67c6eecf1 --- /dev/null +++ b/db/views/follow_recommendations_v02.sql @@ -0,0 +1,34 @@ +SELECT + account_id, + sum(rank) AS rank, + array_agg(reason) AS reason +FROM ( + SELECT + account_summaries.account_id AS account_id, + count(follows.id) / (1.0 + count(follows.id)) AS rank, + 'most_followed' AS reason + FROM follows + INNER JOIN account_summaries ON account_summaries.account_id = follows.target_account_id + INNER JOIN users ON users.account_id = follows.account_id + LEFT OUTER JOIN follow_recommendation_suppressions ON follow_recommendation_suppressions.account_id = follows.target_account_id + WHERE users.current_sign_in_at >= (now() - interval '30 days') + AND account_summaries.sensitive = 'f' + AND follow_recommendation_suppressions.id IS NULL + GROUP BY account_summaries.account_id + HAVING count(follows.id) >= 5 + UNION ALL + SELECT account_summaries.account_id AS account_id, + sum(status_stats.reblogs_count + status_stats.favourites_count) / (1.0 + sum(status_stats.reblogs_count + status_stats.favourites_count)) AS rank, + 'most_interactions' AS reason + FROM status_stats + INNER JOIN statuses ON statuses.id = status_stats.status_id + INNER JOIN account_summaries ON account_summaries.account_id = statuses.account_id + LEFT OUTER JOIN follow_recommendation_suppressions ON follow_recommendation_suppressions.account_id = statuses.account_id + WHERE statuses.id >= ((date_part('epoch', now() - interval '30 days') * 1000)::bigint << 16) + AND account_summaries.sensitive = 'f' + AND follow_recommendation_suppressions.id IS NULL + GROUP BY account_summaries.account_id + HAVING sum(status_stats.reblogs_count + status_stats.favourites_count) >= 5 +) t0 +GROUP BY account_id +ORDER BY rank DESC diff --git a/db/views/user_ips_v01.sql b/db/views/user_ips_v01.sql new file mode 100644 index 0000000000..50a8201cdf --- /dev/null +++ b/db/views/user_ips_v01.sql @@ -0,0 +1,26 @@ +SELECT + user_id, + ip, + max(used_at) AS used_at +FROM ( + SELECT + id AS user_id, + sign_up_ip AS ip, + created_at AS used_at + FROM users + WHERE sign_up_ip IS NOT NULL + UNION ALL + SELECT + user_id, + ip, + updated_at + FROM session_activations + UNION ALL + SELECT + user_id, + ip, + created_at + FROM login_activities + WHERE success = 't' +) AS t0 +GROUP BY user_id, ip diff --git a/dist/mastodon-sidekiq.service b/dist/mastodon-sidekiq.service index 721a866090..324cd5a398 100644 --- a/dist/mastodon-sidekiq.service +++ b/dist/mastodon-sidekiq.service @@ -9,9 +9,45 @@ WorkingDirectory=/home/mastodon/live Environment="RAILS_ENV=production" Environment="DB_POOL=25" Environment="MALLOC_ARENA_MAX=2" +Environment="LD_PRELOAD=libjemalloc.so" ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 25 TimeoutSec=15 Restart=always +# Proc filesystem +ProcSubset=pid +ProtectProc=invisible +# Capabilities +CapabilityBoundingSet= +# Security +NoNewPrivileges=true +# Sandboxing +ProtectSystem=strict +PrivateTmp=true +PrivateDevices=true +PrivateUsers=true +ProtectHostname=true +ProtectKernelLogs=true +ProtectKernelModules=true +ProtectKernelTunables=true +ProtectControlGroups=true +RestrictAddressFamilies=AF_INET +RestrictAddressFamilies=AF_INET6 +RestrictAddressFamilies=AF_NETLINK +RestrictAddressFamilies=AF_UNIX +RestrictNamespaces=true +LockPersonality=true +RestrictRealtime=true +RestrictSUIDSGID=true +RemoveIPC=true +PrivateMounts=true +ProtectClock=true +# System Call Filtering +SystemCallArchitectures=native +SystemCallFilter=~@cpu-emulation @debug @keyring @ipc @mount @obsolete @privileged @setuid +SystemCallFilter=@chown +SystemCallFilter=pipe +SystemCallFilter=pipe2 +ReadWritePaths=/home/mastodon/live [Install] WantedBy=multi-user.target diff --git a/dist/mastodon-streaming.service b/dist/mastodon-streaming.service index c324fccf46..cf1f2d8bc6 100644 --- a/dist/mastodon-streaming.service +++ b/dist/mastodon-streaming.service @@ -12,6 +12,40 @@ Environment="STREAMING_CLUSTER_NUM=1" ExecStart=/usr/bin/node ./streaming TimeoutSec=15 Restart=always +# Proc filesystem +ProcSubset=pid +ProtectProc=invisible +# Capabilities +CapabilityBoundingSet= +# Security +NoNewPrivileges=true +# Sandboxing +ProtectSystem=strict +PrivateTmp=true +PrivateDevices=true +PrivateUsers=true +ProtectHostname=true +ProtectKernelLogs=true +ProtectKernelModules=true +ProtectKernelTunables=true +ProtectControlGroups=true +RestrictAddressFamilies=AF_INET +RestrictAddressFamilies=AF_INET6 +RestrictAddressFamilies=AF_NETLINK +RestrictAddressFamilies=AF_UNIX +RestrictNamespaces=true +LockPersonality=true +RestrictRealtime=true +RestrictSUIDSGID=true +RemoveIPC=true +PrivateMounts=true +ProtectClock=true +# System Call Filtering +SystemCallArchitectures=native +SystemCallFilter=~@cpu-emulation @debug @keyring @ipc @memlock @mount @obsolete @privileged @resources @setuid +SystemCallFilter=pipe +SystemCallFilter=pipe2 +ReadWritePaths=/home/mastodon/live [Install] WantedBy=multi-user.target diff --git a/dist/mastodon-web.service b/dist/mastodon-web.service index 30fcbec1e0..a5598fdaa8 100644 --- a/dist/mastodon-web.service +++ b/dist/mastodon-web.service @@ -8,10 +8,46 @@ User=mastodon WorkingDirectory=/home/mastodon/live Environment="RAILS_ENV=production" Environment="PORT=3000" +Environment="LD_PRELOAD=libjemalloc.so" ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb ExecReload=/bin/kill -SIGUSR1 $MAINPID TimeoutSec=15 Restart=always +# Proc filesystem +ProcSubset=pid +ProtectProc=invisible +# Capabilities +CapabilityBoundingSet= +# Security +NoNewPrivileges=true +# Sandboxing +ProtectSystem=strict +PrivateTmp=true +PrivateDevices=true +PrivateUsers=true +ProtectHostname=true +ProtectKernelLogs=true +ProtectKernelModules=true +ProtectKernelTunables=true +ProtectControlGroups=true +RestrictAddressFamilies=AF_INET +RestrictAddressFamilies=AF_INET6 +RestrictAddressFamilies=AF_NETLINK +RestrictAddressFamilies=AF_UNIX +RestrictNamespaces=true +LockPersonality=true +RestrictRealtime=true +RestrictSUIDSGID=true +RemoveIPC=true +PrivateMounts=true +ProtectClock=true +# System Call Filtering +SystemCallArchitectures=native +SystemCallFilter=~@cpu-emulation @debug @keyring @ipc @mount @obsolete @privileged @setuid +SystemCallFilter=@chown +SystemCallFilter=pipe +SystemCallFilter=pipe2 +ReadWritePaths=/home/mastodon/live [Install] WantedBy=multi-user.target diff --git a/dist/nginx.conf b/dist/nginx.conf index a0429d2aa4..27ca868ab0 100644 --- a/dist/nginx.conf +++ b/dist/nginx.conf @@ -31,6 +31,7 @@ server { ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; + ssl_session_tickets off; # Uncomment these lines once you acquire a certificate: # ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; @@ -51,7 +52,7 @@ server { gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; - add_header Strict-Transport-Security "max-age=31536000"; + add_header Strict-Transport-Security "max-age=31536000" always; location / { try_files $uri @proxy; @@ -59,13 +60,13 @@ server { location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) { add_header Cache-Control "public, max-age=31536000, immutable"; - add_header Strict-Transport-Security "max-age=31536000"; + add_header Strict-Transport-Security "max-age=31536000" always; try_files $uri @proxy; } location /sw.js { add_header Cache-Control "public, max-age=0"; - add_header Strict-Transport-Security "max-age=31536000"; + add_header Strict-Transport-Security "max-age=31536000" always; try_files $uri @proxy; } @@ -89,7 +90,7 @@ server { proxy_cache_valid 410 24h; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; add_header X-Cached $upstream_cache_status; - add_header Strict-Transport-Security "max-age=31536000"; + add_header Strict-Transport-Security "max-age=31536000" always; tcp_nodelay on; } diff --git a/docker-compose.yml b/docker-compose.yml index 52eea7a74f..01fe320a48 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,18 +3,20 @@ services: db: restart: always - image: postgres:9.6-alpine + image: postgres:14-alpine shm_size: 256mb networks: - internal_network healthcheck: test: ["CMD", "pg_isready", "-U", "postgres"] volumes: - - ./postgres:/var/lib/postgresql/data + - ./postgres14:/var/lib/postgresql/data + environment: + - "POSTGRES_HOST_AUTH_METHOD=trust" redis: restart: always - image: redis:6.0-alpine + image: redis:6-alpine networks: - internal_network healthcheck: @@ -24,7 +26,7 @@ services: # es: # restart: always -# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10 +# image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2 # environment: # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # - "cluster.name=es-mastodon" @@ -92,6 +94,9 @@ services: - internal_network volumes: - ./public/system:/mastodon/public/system + healthcheck: + test: ["CMD-SHELL", "ps aux | grep '[s]idekiq\ 6' || false"] + ## Uncomment to enable federation with tor instances along with adding the following ENV variables ## http_proxy=http://privoxy:8118 ## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true diff --git a/lib/action_dispatch/cookie_jar_extensions.rb b/lib/action_dispatch/cookie_jar_extensions.rb new file mode 100644 index 0000000000..1be9053ba6 --- /dev/null +++ b/lib/action_dispatch/cookie_jar_extensions.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module ActionDispatch + module CookieJarExtensions + private + + # Monkey-patch ActionDispatch to serve secure cookies to Tor Hidden Service + # users. Otherwise, ActionDispatch would drop the cookie over HTTP. + def write_cookie?(*) + request.host.end_with?('.onion') || super + end + end +end + +ActionDispatch::Cookies::CookieJar.prepend(ActionDispatch::CookieJarExtensions) + +module Rack + module SessionPersistedExtensions + def security_matches?(request, options) + request.host.end_with?('.onion') || super + end + end +end + +Rack::Session::Abstract::Persisted.prepend(Rack::SessionPersistedExtensions) diff --git a/lib/active_record/batches.rb b/lib/active_record/batches.rb new file mode 100644 index 0000000000..55d29e52ef --- /dev/null +++ b/lib/active_record/batches.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module ActiveRecord + module Batches + def pluck_each(*column_names) + relation = self + + options = column_names.extract_options! + + flatten = column_names.size == 1 + batch_limit = options[:batch_limit] || 1_000 + order = options[:order] || :asc + + column_names.unshift(primary_key) + + relation = relation.reorder(batch_order(order)).limit(batch_limit) + relation.skip_query_cache! + + batch_relation = relation + + loop do + batch = batch_relation.pluck(*column_names) + + break if batch.empty? + + primary_key_offset = batch.last[0] + + batch.each do |record| + if flatten + yield record[1] + else + yield record[1..-1] + end + end + + break if batch.size < batch_limit + + batch_relation = relation.where( + predicate_builder[primary_key, primary_key_offset, order == :desc ? :lt : :gt] + ) + end + end + end +end diff --git a/lib/active_record/database_tasks_extensions.rb b/lib/active_record/database_tasks_extensions.rb new file mode 100644 index 0000000000..e274f476df --- /dev/null +++ b/lib/active_record/database_tasks_extensions.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require_relative '../mastodon/snowflake' + +module ActiveRecord + module Tasks + module DatabaseTasks + original_load_schema = instance_method(:load_schema) + + define_method(:load_schema) do |db_config, *args| + ActiveRecord::Base.establish_connection(db_config) + Mastodon::Snowflake.define_timestamp_id + + original_load_schema.bind(self).call(db_config, *args) + + Mastodon::Snowflake.ensure_id_sequences_exist + end + end + end +end diff --git a/lib/cli.rb b/lib/cli.rb index 3f1658566b..35c00e736f 100644 --- a/lib/cli.rb +++ b/lib/cli.rb @@ -13,6 +13,7 @@ require_relative 'mastodon/preview_cards_cli' require_relative 'mastodon/cache_cli' require_relative 'mastodon/upgrade_cli' require_relative 'mastodon/email_domain_blocks_cli' +require_relative 'mastodon/canonical_email_blocks_cli' require_relative 'mastodon/ip_blocks_cli' require_relative 'mastodon/maintenance_cli' require_relative 'mastodon/version' @@ -62,6 +63,9 @@ module Mastodon desc 'ip_blocks SUBCOMMAND ...ARGS', 'Manage IP blocks' subcommand 'ip_blocks', Mastodon::IpBlocksCLI + desc 'canonical_email_blocks SUBCOMMAND ...ARGS', 'Manage canonical e-mail blocks' + subcommand 'canonical_email_blocks', Mastodon::CanonicalEmailBlocksCLI + desc 'maintenance SUBCOMMAND ...ARGS', 'Various maintenance utilities' subcommand 'maintenance', Mastodon::MaintenanceCLI @@ -94,17 +98,22 @@ module Mastodon exit(1) unless prompt.ask('Type in the domain of the server to confirm:', required: true) == Rails.configuration.x.local_domain - prompt.warn('This operation WILL NOT be reversible. It can also take a long time.') - prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.') - prompt.warn('A running Sidekiq process is required. Do not shut it down until queues clear.') + unless options[:dry_run] + prompt.warn('This operation WILL NOT be reversible. It can also take a long time.') + prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.') + prompt.warn('A running Sidekiq process is required. Do not shut it down until queues clear.') - exit(1) if prompt.no?('Are you sure you want to proceed?') + exit(1) if prompt.no?('Are you sure you want to proceed?') + end inboxes = Account.inboxes processed = 0 dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + Setting.registrations_mode = 'none' unless options[:dry_run] + if inboxes.empty? + Account.local.without_suspended.in_batches.update_all(suspended_at: Time.now.utc, suspension_origin: :local) unless options[:dry_run] prompt.ok('It seems like your server has not federated with anything') prompt.ok('You can shut it down and delete it any time') return @@ -112,9 +121,7 @@ module Mastodon prompt.warn('Do NOT interrupt this process...') - Setting.registrations_mode = 'none' - - Account.local.without_suspended.find_each do |account| + delete_account = ->(account) do payload = ActiveModelSerializers::SerializableResource.new( account, serializer: ActivityPub::DeleteActorSerializer, @@ -128,12 +135,15 @@ module Mastodon [json, account.id, inbox_url] end - account.suspend! + account.suspend!(block_email: false) end processed += 1 end + Account.local.without_suspended.find_each { |account| delete_account.call(account) } + Account.local.suspended.joins(:deletion_request).find_each { |account| delete_account.call(account) } + prompt.ok("Queued #{inboxes.size * processed} items into Sidekiq for #{processed} accounts#{dry_run}") prompt.ok('Wait until Sidekiq processes all items, then you can shut everything down and delete the data') rescue TTY::Reader::InputInterrupt diff --git a/app/lib/exceptions.rb b/lib/exceptions.rb similarity index 92% rename from app/lib/exceptions.rb rename to lib/exceptions.rb index 7c8e778713..eb472abaab 100644 --- a/app/lib/exceptions.rb +++ b/lib/exceptions.rb @@ -12,7 +12,11 @@ module Mastodon class RateLimitExceededError < Error; end class UnexpectedResponseError < Error + attr_reader :response + def initialize(response = nil) + @response = response + if response.respond_to? :uri super("#{response.uri} returned code #{response.code}") else diff --git a/lib/json_ld/identity.rb b/lib/json_ld/identity.rb index 4fb3f8e9d9..f41899150d 100644 --- a/lib/json_ld/identity.rb +++ b/lib/json_ld/identity.rb @@ -1,4 +1,3 @@ -# -*- encoding: utf-8 -*- # frozen_string_literal: true # This file generated automatically from http://w3id.org/identity/v1 require 'json/ld' diff --git a/lib/json_ld/security.rb b/lib/json_ld/security.rb index a6fbce95f5..ef53913401 100644 --- a/lib/json_ld/security.rb +++ b/lib/json_ld/security.rb @@ -1,4 +1,3 @@ -# -*- encoding: utf-8 -*- # frozen_string_literal: true # This file generated automatically from http://w3id.org/security/v1 require 'json/ld' diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 653bfca301..2ef85d0a91 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -54,7 +54,8 @@ module Mastodon option :email, required: true option :confirmed, type: :boolean - option :role, default: 'user' + option :role, default: 'user', enum: %w(user moderator admin) + option :skip_sign_in_token, type: :boolean option :reattach, type: :boolean option :force, type: :boolean desc 'create USERNAME', 'Create a new user' @@ -68,6 +69,9 @@ module Mastodon With the --role option one of "user", "admin" or "moderator" can be supplied. Defaults to "user" + With the --skip-sign-in-token option, you can ensure that + the user is never asked for an e-mailed security code. + With the --reattach option, the new user will be reattached to a given existing username of an old account. If the old account is still in use by someone else, you can supply @@ -77,7 +81,7 @@ module Mastodon def create(username) account = Account.new(username: username) password = SecureRandom.hex - user = User.new(email: options[:email], password: password, agreement: true, approved: true, admin: options[:role] == 'admin', moderator: options[:role] == 'moderator', confirmed_at: options[:confirmed] ? Time.now.utc : nil, bypass_invite_request_check: true) + user = User.new(email: options[:email], password: password, agreement: true, approved: true, admin: options[:role] == 'admin', moderator: options[:role] == 'moderator', confirmed_at: options[:confirmed] ? Time.now.utc : nil, bypass_invite_request_check: true, skip_sign_in_token: options[:skip_sign_in_token]) if options[:reattach] account = Account.find_local(username) || Account.new(username: username) @@ -113,7 +117,7 @@ module Mastodon end end - option :role + option :role, enum: %w(user moderator admin) option :email option :confirm, type: :boolean option :enable, type: :boolean @@ -121,6 +125,7 @@ module Mastodon option :disable_2fa, type: :boolean option :approve, type: :boolean option :reset_password, type: :boolean + option :skip_sign_in_token, type: :boolean desc 'modify USERNAME', 'Modify a user' long_desc <<-LONG_DESC Modify a user account. @@ -142,6 +147,9 @@ module Mastodon With the --reset-password option, the user's password is replaced by a randomly-generated one, printed in the output. + + With the --skip-sign-in-token option, you can ensure that + the user is never asked for an e-mailed security code. LONG_DESC def modify(username) user = Account.find_local(username)&.user @@ -163,6 +171,7 @@ module Mastodon user.disabled = true if options[:disable] user.approved = true if options[:approve] user.otp_required_for_login = false if options[:disable_2fa] + user.skip_sign_in_token = options[:skip_sign_in_token] unless options[:skip_sign_in_token].nil? user.confirm if options[:confirm] if user.save @@ -278,7 +287,7 @@ module Mastodon option :concurrency, type: :numeric, default: 5, aliases: [:c] option :dry_run, type: :boolean - desc 'cull', 'Remove remote accounts that no longer exist' + desc 'cull [DOMAIN...]', 'Remove remote accounts that no longer exist' long_desc <<-LONG_DESC Query every single remote account in the database to determine if it still exists on the origin server, and if it doesn't, @@ -287,19 +296,22 @@ module Mastodon Accounts that have had confirmed activity within the last week are excluded from the checks. LONG_DESC - def cull + def cull(*domains) skip_threshold = 7.days.ago dry_run = options[:dry_run] ? ' (DRY RUN)' : '' skip_domains = Concurrent::Set.new - processed, culled = parallelize_with_progress(Account.remote.where(protocol: :activitypub).partitioned) do |account| + query = Account.remote.where(protocol: :activitypub) + query = query.where(domain: domains) unless domains.empty? + + processed, culled = parallelize_with_progress(query.partitioned) do |account| next if account.updated_at >= skip_threshold || (account.last_webfingered_at.present? && account.last_webfingered_at >= skip_threshold) || skip_domains.include?(account.domain) code = 0 begin code = Request.new(:head, account.uri).perform(&:code) - rescue HTTP::ConnectionError + rescue HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError skip_domains << account.domain end @@ -402,7 +414,7 @@ module Mastodon exit(1) end - parallelize_with_progress(target_account.followers.local) do |account| + processed, = parallelize_with_progress(target_account.followers.local) do |account| UnfollowService.new.call(account, target_account) end diff --git a/lib/mastodon/canonical_email_blocks_cli.rb b/lib/mastodon/canonical_email_blocks_cli.rb new file mode 100644 index 0000000000..64b72e6031 --- /dev/null +++ b/lib/mastodon/canonical_email_blocks_cli.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +require 'concurrent' +require_relative '../../config/boot' +require_relative '../../config/environment' +require_relative 'cli_helper' + +module Mastodon + class CanonicalEmailBlocksCLI < Thor + include CLIHelper + + def self.exit_on_failure? + true + end + + desc 'find EMAIL', 'Find a given e-mail address in the canonical e-mail blocks' + long_desc <<-LONG_DESC + When suspending a local user, a hash of a "canonical" version of their e-mail + address is stored to prevent them from signing up again. + + This command can be used to find whether a known email address is blocked, + and if so, which account it was attached to. + LONG_DESC + def find(email) + accts = CanonicalEmailBlock.find_blocks(email).map(&:reference_account).map(&:acct).to_a + if accts.empty? + say("#{email} is not blocked", :yellow) + else + accts.each do |acct| + say(acct, :white) + end + end + end + + desc 'remove EMAIL', 'Remove a canonical e-mail block' + long_desc <<-LONG_DESC + When suspending a local user, a hash of a "canonical" version of their e-mail + address is stored to prevent them from signing up again. + + This command allows removing a canonical email block. + LONG_DESC + def remove(email) + blocks = CanonicalEmailBlock.find_blocks(email) + if blocks.empty? + say("#{email} is not blocked", :yellow) + else + blocks.destroy_all + say("Removed canonical email block for #{email}", :green) + end + end + + private + + def color(processed, failed) + if !processed.zero? && failed.zero? + :green + elsif failed.zero? + :yellow + else + :red + end + end + end +end diff --git a/lib/mastodon/cli_helper.rb b/lib/mastodon/cli_helper.rb index ed22f44b2b..aaee1fa911 100644 --- a/lib/mastodon/cli_helper.rb +++ b/lib/mastodon/cli_helper.rb @@ -25,7 +25,9 @@ module Mastodon exit(1) end - ActiveRecord::Base.configurations[Rails.env]['pool'] = options[:concurrency] + 1 + db_config = ActiveRecord::Base.configurations[Rails.env].dup + db_config['pool'] = options[:concurrency] + 1 + ActiveRecord::Base.establish_connection(db_config) progress = create_progress_bar(scope.count) pool = Concurrent::FixedThreadPool.new(options[:concurrency]) diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb index 4ebd8a1e2c..a7c78c4a7a 100644 --- a/lib/mastodon/domains_cli.rb +++ b/lib/mastodon/domains_cli.rb @@ -17,6 +17,7 @@ module Mastodon option :verbose, type: :boolean, aliases: [:v] option :dry_run, type: :boolean option :limited_federation_mode, type: :boolean + option :by_uri, type: :boolean desc 'purge [DOMAIN...]', 'Remove accounts from a DOMAIN without a trace' long_desc <<-LONG_DESC Remove all accounts from a given DOMAIN without leaving behind any @@ -26,6 +27,12 @@ module Mastodon When the --limited-federation-mode option is given, instead of purging accounts from a single domain, all accounts from domains that have not been explicitly allowed are removed from the database. + + When the --by-uri option is given, DOMAIN is used to match the domain part of actor + URIs rather than the domain part of the webfinger handle. For instance, an account + that has the handle `foo@bar.com` but whose profile is at the URL + `https://mastodon-bar.com/users/foo`, would be purged by either + `tootctl domains purge bar.com` or `tootctl domains purge --by-uri mastodon-bar.com`. LONG_DESC def purge(*domains) dry_run = options[:dry_run] ? ' (DRY RUN)' : '' @@ -34,7 +41,11 @@ module Mastodon if options[:limited_federation_mode] Account.remote.where.not(domain: DomainAllow.pluck(:domain)) elsif !domains.empty? - Account.remote.where(domain: domains) + if options[:by_uri] + domains.map { |domain| Account.remote.where(Account.arel_table[:uri].matches("https://#{domain}/%", false, true)) }.reduce(:or) + else + Account.remote.where(domain: domains) + end else say('No domain(s) given', :red) exit(1) diff --git a/lib/mastodon/email_domain_blocks_cli.rb b/lib/mastodon/email_domain_blocks_cli.rb index 55a637d682..f79df302a2 100644 --- a/lib/mastodon/email_domain_blocks_cli.rb +++ b/lib/mastodon/email_domain_blocks_cli.rb @@ -113,7 +113,7 @@ module Mastodon result = entry.destroy if result - processed += 1 + children_count + processed += children_count + 1 else say("#{domain} could not be unblocked.", :red) failed += 1 diff --git a/lib/mastodon/emoji_cli.rb b/lib/mastodon/emoji_cli.rb index 0a1f538e6f..5bee70ea51 100644 --- a/lib/mastodon/emoji_cli.rb +++ b/lib/mastodon/emoji_cli.rb @@ -49,7 +49,7 @@ module Mastodon next if filename.start_with?('._') shortcode = [options[:prefix], filename, options[:suffix]].compact.join - custom_emoji = CustomEmoji.local.find_by(shortcode: shortcode) + custom_emoji = CustomEmoji.local.find_by("LOWER(shortcode) = ?", shortcode.downcase) if custom_emoji && !options[:overwrite] skipped += 1 diff --git a/lib/mastodon/maintenance_cli.rb b/lib/mastodon/maintenance_cli.rb index 029d42a05a..00861df774 100644 --- a/lib/mastodon/maintenance_cli.rb +++ b/lib/mastodon/maintenance_cli.rb @@ -14,7 +14,7 @@ module Mastodon end MIN_SUPPORTED_VERSION = 2019_10_01_213028 - MAX_SUPPORTED_VERSION = 2020_12_18_054746 + MAX_SUPPORTED_VERSION = 2022_01_18_183123 # Stubs to enjoy ActiveRecord queries while not depending on a particular # version of the code/database @@ -42,6 +42,8 @@ module Mastodon class CustomEmojiCategory < ApplicationRecord; end class Bookmark < ApplicationRecord; end class WebauthnCredential < ApplicationRecord; end + class FollowRecommendationSuppression < ApplicationRecord; end + class CanonicalEmailBlock < ApplicationRecord; end class PreviewCard < ApplicationRecord self.inheritance_column = false @@ -82,12 +84,14 @@ module Mastodon owned_classes = [ Status, StatusPin, MediaAttachment, Poll, Report, Tombstone, Favourite, - Follow, FollowRequest, Block, Mute, AccountIdentityProof, + Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin, AccountStat, ListAccount, PollVote, Mention ] owned_classes << AccountDeletionRequest if ActiveRecord::Base.connection.table_exists?(:account_deletion_requests) owned_classes << AccountNote if ActiveRecord::Base.connection.table_exists?(:account_notes) + owned_classes << FollowRecommendationSuppression if ActiveRecord::Base.connection.table_exists?(:follow_recommendation_suppressions) + owned_classes << AccountIdentityProof if ActiveRecord::Base.connection.table_exists?(:account_identity_proofs) owned_classes.each do |klass| klass.where(account_id: other_account.id).find_each do |record| @@ -111,6 +115,12 @@ module Mastodon end end end + + if ActiveRecord::Base.connection.table_exists?(:canonical_email_blocks) + CanonicalEmailBlock.where(reference_account_id: other_account.id).find_each do |record| + record.update_attribute(:reference_account_id, id) + end + end end end @@ -130,19 +140,23 @@ module Mastodon @prompt = TTY::Prompt.new if ActiveRecord::Migrator.current_version < MIN_SUPPORTED_VERSION - @prompt.warn 'Your version of the database schema is too old and is not supported by this script.' - @prompt.warn 'Please update to at least Mastodon 3.0.0 before running this script.' + @prompt.error 'Your version of the database schema is too old and is not supported by this script.' + @prompt.error 'Please update to at least Mastodon 3.0.0 before running this script.' exit(1) elsif ActiveRecord::Migrator.current_version > MAX_SUPPORTED_VERSION @prompt.warn 'Your version of the database schema is more recent than this script, this may cause unexpected errors.' - exit(1) unless @prompt.yes?('Continue anyway?') + exit(1) unless @prompt.yes?('Continue anyway? (Yes/No)') + end + + if Sidekiq::ProcessSet.new.any? + @prompt.error 'It seems Sidekiq is running. All Mastodon processes need to be stopped when using this script.' + exit(1) end @prompt.warn 'This task will take a long time to run and is potentially destructive.' @prompt.warn 'Please make sure to stop Mastodon and have a backup.' - exit(1) unless @prompt.yes?('Continue?') + exit(1) unless @prompt.yes?('Continue? (Yes/No)') - deduplicate_accounts! deduplicate_users! deduplicate_account_domain_blocks! deduplicate_account_identity_proofs! @@ -157,6 +171,7 @@ module Mastodon deduplicate_media_attachments! deduplicate_preview_cards! deduplicate_statuses! + deduplicate_accounts! deduplicate_tags! deduplicate_webauthn_credentials! @@ -227,12 +242,14 @@ module Mastodon end end - ActiveRecord::Base.connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM users WHERE remember_token IS NOT NULL GROUP BY remember_token HAVING count(*) > 1").each do |row| - users = User.where(id: row['ids'].split(',')).sort_by(&:updated_at).reverse.drop(1) - @prompt.warn "Unsetting remember token for those accounts: #{users.map(&:account).map(&:acct).join(', ')}" + if ActiveRecord::Migrator.current_version < 20220118183010 + ActiveRecord::Base.connection.select_all("SELECT string_agg(id::text, ',') AS ids FROM users WHERE remember_token IS NOT NULL GROUP BY remember_token HAVING count(*) > 1").each do |row| + users = User.where(id: row['ids'].split(',')).sort_by(&:updated_at).reverse.drop(1) + @prompt.warn "Unsetting remember token for those accounts: #{users.map(&:account).map(&:acct).join(', ')}" - users.each do |user| - user.update!(remember_token: nil) + users.each do |user| + user.update!(remember_token: nil) + end end end @@ -248,7 +265,7 @@ module Mastodon @prompt.say 'Restoring users indexes…' ActiveRecord::Base.connection.add_index :users, ['confirmation_token'], name: 'index_users_on_confirmation_token', unique: true ActiveRecord::Base.connection.add_index :users, ['email'], name: 'index_users_on_email', unique: true - ActiveRecord::Base.connection.add_index :users, ['remember_token'], name: 'index_users_on_remember_token', unique: true + ActiveRecord::Base.connection.add_index :users, ['remember_token'], name: 'index_users_on_remember_token', unique: true if ActiveRecord::Migrator.current_version < 20220118183010 ActiveRecord::Base.connection.add_index :users, ['reset_password_token'], name: 'index_users_on_reset_password_token', unique: true end @@ -265,6 +282,8 @@ module Mastodon end def deduplicate_account_identity_proofs! + return unless ActiveRecord::Base.connection.table_exists?(:account_identity_proofs) + remove_index_if_exists!(:account_identity_proofs, 'index_account_proofs_on_account_and_provider_and_username') @prompt.say 'Removing duplicate account identity proofs…' @@ -466,6 +485,11 @@ module Mastodon @prompt.say 'Restoring tags indexes…' ActiveRecord::Base.connection.add_index :tags, 'lower((name)::text)', name: 'index_tags_on_name_lower', unique: true + + if ActiveRecord::Base.connection.indexes(:tags).any? { |i| i.name == 'index_tags_on_name_lower_btree' } + @prompt.say 'Reindexing textual indexes on tags…' + ActiveRecord::Base.connection.execute('REINDEX INDEX index_tags_on_name_lower_btree;') + end end def deduplicate_webauthn_credentials! diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 59c118500a..36ca71844f 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -230,6 +230,7 @@ module Mastodon processed, aggregate = parallelize_with_progress(scope) do |media_attachment| next if media_attachment.remote_url.blank? || (!options[:force] && media_attachment.file_file_name.present?) + next if DomainBlock.reject_media?(media_attachment.account.domain) unless options[:dry_run] media_attachment.reset_file! diff --git a/lib/mastodon/migration_helpers.rb b/lib/mastodon/migration_helpers.rb index bf2314ecb1..5bc903349a 100644 --- a/lib/mastodon/migration_helpers.rb +++ b/lib/mastodon/migration_helpers.rb @@ -41,42 +41,32 @@ module Mastodon module MigrationHelpers - # Stub for Database.postgresql? from GitLab - def self.postgresql? - ActiveRecord::Base.configurations[Rails.env]['adapter'].casecmp('postgresql').zero? - end + class CorruptionError < StandardError + def initialize(message = nil) + super(message.presence || 'Migration failed because of index corruption, see https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/#fixing') + end - # Stub for Database.mysql? from GitLab - def self.mysql? - ActiveRecord::Base.configurations[Rails.env]['adapter'].casecmp('mysql2').zero? + def cause + nil + end + + def backtrace + [] + end end # Model that can be used for querying permissions of a SQL user. class Grant < ActiveRecord::Base - self.table_name = - if Mastodon::MigrationHelpers.postgresql? - 'information_schema.role_table_grants' - else - 'mysql.user' - end + self.table_name = 'information_schema.role_table_grants' def self.scope_to_current_user - if Mastodon::MigrationHelpers.postgresql? - where('grantee = user') - else - where("CONCAT(User, '@', Host) = current_user()") - end + where('grantee = user') end # Returns true if the current user can create and execute triggers on the # given table. def self.create_and_execute_trigger?(table) - priv = - if Mastodon::MigrationHelpers.postgresql? - where(privilege_type: 'TRIGGER', table_name: table) - else - where(Trigger_priv: 'Y') - end + priv = where(privilege_type: 'TRIGGER', table_name: table) priv.scope_to_current_user.any? end @@ -119,7 +109,7 @@ module Mastodon allow_null: options[:null] ) else - add_column(table_name, column_name, :datetime_with_timezone, options) + add_column(table_name, column_name, :datetime_with_timezone, **options) end end end @@ -141,12 +131,10 @@ module Mastodon 'in the body of your migration class' end - if MigrationHelpers.postgresql? - options = options.merge({ algorithm: :concurrently }) - disable_statement_timeout - end + options = options.merge({ algorithm: :concurrently }) + disable_statement_timeout - add_index(table_name, column_name, options) + add_index(table_name, column_name, **options) end # Removes an existed index, concurrently when supported @@ -170,7 +158,7 @@ module Mastodon disable_statement_timeout end - remove_index(table_name, options.merge({ column: column_name })) + remove_index(table_name, **options.merge({ column: column_name })) end # Removes an existing index, concurrently when supported @@ -194,13 +182,11 @@ module Mastodon disable_statement_timeout end - remove_index(table_name, options.merge({ name: index_name })) + remove_index(table_name, **options.merge({ name: index_name })) end # Only available on Postgresql >= 9.2 def supports_drop_index_concurrently? - return false unless MigrationHelpers.postgresql? - version = select_one("SELECT current_setting('server_version_num') AS v")['v'].to_i version >= 90200 @@ -226,13 +212,7 @@ module Mastodon # While MySQL does allow disabling of foreign keys it has no equivalent # of PostgreSQL's "VALIDATE CONSTRAINT". As a result we'll just fall # back to the normal foreign key procedure. - if MigrationHelpers.mysql? - return add_foreign_key(source, target, - column: column, - on_delete: on_delete) - else - on_delete = 'SET NULL' if on_delete == :nullify - end + on_delete = 'SET NULL' if on_delete == :nullify disable_statement_timeout @@ -270,7 +250,7 @@ module Mastodon # the database. Disable the session's statement timeout to ensure # migrations don't get killed prematurely. (PostgreSQL only) def disable_statement_timeout - execute('SET statement_timeout TO 0') if MigrationHelpers.postgresql? + execute('SET statement_timeout TO 0') end # Updates the value of a column in batches. @@ -315,11 +295,11 @@ module Mastodon table = Arel::Table.new(table_name) total = estimate_rows_in_table(table_name).to_i - if total == 0 + if total < 1 count_arel = table.project(Arel.star.count.as('count')) count_arel = yield table, count_arel if block_given? - total = exec_query(count_arel.to_sql).to_hash.first['count'].to_i + total = exec_query(count_arel.to_sql).to_ary.first['count'].to_i return if total == 0 end @@ -335,7 +315,7 @@ module Mastodon start_arel = table.project(table[:id]).order(table[:id].asc).take(1) start_arel = yield table, start_arel if block_given? - first_row = exec_query(start_arel.to_sql).to_hash.first + first_row = exec_query(start_arel.to_sql).to_ary.first # In case there are no rows but we didn't catch it in the estimated size: return unless first_row start_id = first_row['id'].to_i @@ -356,7 +336,7 @@ module Mastodon .skip(batch_size) stop_arel = yield table, stop_arel if block_given? - stop_row = exec_query(stop_arel.to_sql).to_hash.first + stop_row = exec_query(stop_arel.to_sql).to_ary.first update_arel = Arel::UpdateManager.new .table(table) @@ -487,11 +467,7 @@ module Mastodon # If we were in the middle of update_column_in_batches, we should remove # the old column and start over, as we have no idea where we were. if column_for(table, new) - if MigrationHelpers.postgresql? - remove_rename_triggers_for_postgresql(table, trigger_name) - else - remove_rename_triggers_for_mysql(trigger_name) - end + remove_rename_triggers_for_postgresql(table, trigger_name) remove_column(table, new) end @@ -510,7 +486,7 @@ module Mastodon col_opts[:limit] = old_col.limit end - add_column(table, new, new_type, col_opts) + add_column(table, new, new_type, **col_opts) # We set the default value _after_ adding the column so we don't end up # updating any existing data with the default value. This isn't @@ -521,13 +497,8 @@ module Mastodon quoted_old = quote_column_name(old) quoted_new = quote_column_name(new) - if MigrationHelpers.postgresql? - install_rename_triggers_for_postgresql(trigger_name, quoted_table, - quoted_old, quoted_new) - else - install_rename_triggers_for_mysql(trigger_name, quoted_table, - quoted_old, quoted_new) - end + install_rename_triggers_for_postgresql(trigger_name, quoted_table, + quoted_old, quoted_new) update_column_in_batches(table, new, Arel::Table.new(table)[old]) @@ -553,10 +524,10 @@ module Mastodon new_pk_index_name = "index_#{table}_on_#{column}_cm" unless indexes_for(table, column).find{|i| i.name == old_pk_index_name} - add_concurrent_index(table, [temp_column], { + add_concurrent_index(table, [temp_column], unique: true, name: new_pk_index_name - }) + ) end end end @@ -685,11 +656,7 @@ module Mastodon check_trigger_permissions!(table) - if MigrationHelpers.postgresql? - remove_rename_triggers_for_postgresql(table, trigger_name) - else - remove_rename_triggers_for_mysql(trigger_name) - end + remove_rename_triggers_for_postgresql(table, trigger_name) remove_column(table, old) end @@ -810,7 +777,7 @@ module Mastodon options[:using] = index.using if index.using options[:where] = index.where if index.where - add_concurrent_index(table, new_columns, options) + add_concurrent_index(table, new_columns, **options) end end @@ -844,18 +811,9 @@ module Mastodon quoted_pattern = Arel::Nodes::Quoted.new(pattern.to_s) quoted_replacement = Arel::Nodes::Quoted.new(replacement.to_s) - if MigrationHelpers.mysql? - locate = Arel::Nodes::NamedFunction - .new('locate', [quoted_pattern, column]) - insert_in_place = Arel::Nodes::NamedFunction - .new('insert', [column, locate, pattern.size, quoted_replacement]) - - Arel::Nodes::SqlLiteral.new(insert_in_place.to_sql) - else - replace = Arel::Nodes::NamedFunction - .new("regexp_replace", [column, quoted_pattern, quoted_replacement]) - Arel::Nodes::SqlLiteral.new(replace.to_sql) - end + replace = Arel::Nodes::NamedFunction + .new("regexp_replace", [column, quoted_pattern, quoted_replacement]) + Arel::Nodes::SqlLiteral.new(replace.to_sql) end def remove_foreign_key_without_error(*args) diff --git a/lib/mastodon/redis_config.rb b/lib/mastodon/redis_config.rb index c3c8ff8005..5bfd26e343 100644 --- a/lib/mastodon/redis_config.rb +++ b/lib/mastodon/redis_config.rb @@ -22,11 +22,21 @@ end setup_redis_env_url setup_redis_env_url(:cache, false) +setup_redis_env_url(:sidekiq, false) -namespace = ENV.fetch('REDIS_NAMESPACE', nil) -cache_namespace = namespace ? namespace + '_cache' : 'cache' +namespace = ENV.fetch('REDIS_NAMESPACE', nil) +cache_namespace = namespace ? namespace + '_cache' : 'cache' +sidekiq_namespace = namespace REDIS_CACHE_PARAMS = { + driver: :hiredis, + url: ENV['CACHE_REDIS_URL'], expires_in: 10.minutes, namespace: cache_namespace, }.freeze + +REDIS_SIDEKIQ_PARAMS = { + driver: :hiredis, + url: ENV['SIDEKIQ_REDIS_URL'], + namespace: sidekiq_namespace, +}.freeze diff --git a/lib/mastodon/search_cli.rb b/lib/mastodon/search_cli.rb index 22a0acec80..6ad9d7b6a9 100644 --- a/lib/mastodon/search_cli.rb +++ b/lib/mastodon/search_cli.rb @@ -17,10 +17,11 @@ module Mastodon ].freeze option :concurrency, type: :numeric, default: 2, aliases: [:c], desc: 'Workload will be split between this number of threads' + option :batch_size, type: :numeric, default: 1_000, aliases: [:b], desc: 'Number of records in each batch' option :only, type: :array, enum: %w(accounts tags statuses), desc: 'Only process these indices' - desc 'deploy', 'Create or upgrade ElasticSearch indices and populate them' + desc 'deploy', 'Create or upgrade Elasticsearch indices and populate them' long_desc <<~LONG_DESC - If ElasticSearch is empty, this command will create the necessary indices + If Elasticsearch is empty, this command will create the necessary indices and then import data from the database into those indices. This command will also upgrade indices if the underlying schema has been @@ -35,6 +36,11 @@ module Mastodon exit(1) end + if options[:batch_size] < 1 + say('Cannot run with this batch_size setting, must be at least 1', :red) + exit(1) + end + indices = begin if options[:only] options[:only].map { |str| "#{str.camelize}Index".constantize } @@ -53,7 +59,9 @@ module Mastodon index.specification.lock! end - ActiveRecord::Base.configurations[Rails.env]['pool'] = options[:concurrency] + 1 + db_config = ActiveRecord::Base.configurations[Rails.env].dup + db_config['pool'] = options[:concurrency] + 1 + ActiveRecord::Base.establish_connection(db_config) pool = Concurrent::FixedThreadPool.new(options[:concurrency]) added = Concurrent::AtomicFixnum.new(0) @@ -62,11 +70,7 @@ module Mastodon progress.title = 'Estimating workload ' # Estimate the amount of data that has to be imported first - indices.each do |index| - index.types.each do |type| - progress.total = (progress.total || 0) + type.adapter.default_scope.count - end - end + progress.total = indices.sum { |index| index.adapter.default_scope.count } # Now import all the actual data. Mind that unlike chewy:sync, we don't # fetch and compare all record IDs from the database and the index to @@ -75,70 +79,71 @@ module Mastodon # is uneconomical. So we only ever add. indices.each do |index| progress.title = "Importing #{index} " - batch_size = 1_000 + batch_size = options[:batch_size] slice_size = (batch_size / options[:concurrency]).ceil - index.types.each do |type| - type.adapter.default_scope.reorder(nil).find_in_batches(batch_size: batch_size) do |batch| - futures = [] + index.adapter.default_scope.reorder(nil).find_in_batches(batch_size: batch_size) do |batch| + futures = [] - batch.each_slice(slice_size) do |records| - futures << Concurrent::Future.execute(executor: pool) do - begin - if !progress.total.nil? && progress.progress + records.size > progress.total - # The number of items has changed between start and now, - # since there is no good way to predict the final count from - # here, just change the progress bar to an indeterminate one + batch.each_slice(slice_size) do |records| + futures << Concurrent::Future.execute(executor: pool) do + begin + if !progress.total.nil? && progress.progress + records.size > progress.total + # The number of items has changed between start and now, + # since there is no good way to predict the final count from + # here, just change the progress bar to an indeterminate one - progress.total = nil + progress.total = nil + end + + grouped_records = nil + bulk_body = nil + index_count = 0 + delete_count = 0 + + ActiveRecord::Base.connection_pool.with_connection do + grouped_records = records.to_a.group_by do |record| + index.adapter.send(:delete_from_index?, record) ? :delete : :to_index end - grouped_records = nil - bulk_body = nil - index_count = 0 - delete_count = 0 + bulk_body = Chewy::Index::Import::BulkBuilder.new(index, **grouped_records).bulk_body + end - ActiveRecord::Base.connection_pool.with_connection do - grouped_records = type.adapter.send(:grouped_objects, records) - bulk_body = Chewy::Type::Import::BulkBuilder.new(type, grouped_records).bulk_body - end + index_count = grouped_records[:to_index].size if grouped_records.key?(:to_index) + delete_count = grouped_records[:delete].size if grouped_records.key?(:delete) - index_count = grouped_records[:index].size if grouped_records.key?(:index) - delete_count = grouped_records[:delete].size if grouped_records.key?(:delete) + # The following is an optimization for statuses specifically, since + # we want to de-index statuses that cannot be searched by anybody, + # but can't use Chewy's delete_if logic because it doesn't use + # crutches and our searchable_by logic depends on them + if index == StatusesIndex + bulk_body.map! do |entry| + if entry[:to_index] && entry.dig(:to_index, :data, 'searchable_by').blank? + index_count -= 1 + delete_count += 1 - # The following is an optimization for statuses specifically, since - # we want to de-index statuses that cannot be searched by anybody, - # but can't use Chewy's delete_if logic because it doesn't use - # crutches and our searchable_by logic depends on them - if type == StatusesIndex::Status - bulk_body.map! do |entry| - if entry[:index] && entry.dig(:index, :data, 'searchable_by').blank? - index_count -= 1 - delete_count += 1 - - { delete: entry[:index].except(:data) } - else - entry - end + { delete: entry[:to_index].except(:data) } + else + entry end end - - Chewy::Type::Import::BulkRequest.new(type).perform(bulk_body) - - progress.progress += records.size - - added.increment(index_count) - removed.increment(delete_count) - - sleep 1 - rescue => e - progress.log pastel.red("Error importing #{index}: #{e}") end + + Chewy::Index::Import::BulkRequest.new(index).perform(bulk_body) + + progress.progress += records.size + + added.increment(index_count) + removed.increment(delete_count) + + sleep 1 + rescue => e + progress.log pastel.red("Error importing #{index}: #{e}") end end - - futures.map(&:value) end + + futures.map(&:value) end end diff --git a/lib/mastodon/snowflake.rb b/lib/mastodon/snowflake.rb index 9e5bc7383c..fe0dc1722e 100644 --- a/lib/mastodon/snowflake.rb +++ b/lib/mastodon/snowflake.rb @@ -84,10 +84,7 @@ module Mastodon::Snowflake -- Take the first two bytes (four hex characters) substr( -- Of the MD5 hash of the data we documented - md5(table_name || - '#{SecureRandom.hex(16)}' || - time_part::text - ), + md5(table_name || '#{SecureRandom.hex(16)}' || time_part::text), 1, 4 ) -- And turn it into a bigint @@ -138,10 +135,11 @@ module Mastodon::Snowflake end end - def id_at(timestamp) - id = timestamp.to_i * 1000 + rand(1000) + def id_at(timestamp, with_random: true) + id = timestamp.to_i * 1000 + id += rand(1000) if with_random id = id << 16 - id += rand(2**16) + id += rand(2**16) if with_random id end diff --git a/lib/mastodon/statuses_cli.rb b/lib/mastodon/statuses_cli.rb index 8a18a3b2f2..e273e2614b 100644 --- a/lib/mastodon/statuses_cli.rb +++ b/lib/mastodon/statuses_cli.rb @@ -6,6 +6,7 @@ require_relative 'cli_helper' module Mastodon class StatusesCLI < Thor + include CLIHelper include ActionView::Helpers::NumberHelper def self.exit_on_failure? @@ -13,64 +14,213 @@ module Mastodon end option :days, type: :numeric, default: 90 - option :clean_followed, type: :boolean - option :skip_media_remove, type: :boolean + option :batch_size, type: :numeric, default: 1_000, aliases: [:b], desc: 'Number of records in each batch' + option :continue, type: :boolean, default: false, desc: 'If remove is not completed, execute from the previous continuation' + option :clean_followed, type: :boolean, default: false, desc: 'Include the status of remote accounts that are followed by local accounts as candidates for remove' + option :skip_status_remove, type: :boolean, default: false, desc: 'Skip status remove (run only cleanup tasks)' + option :skip_media_remove, type: :boolean, default: false, desc: 'Skip remove orphaned media attachments' + option :compress_database, type: :boolean, default: false, desc: 'Compress database and update the statistics. This option locks the table for a long time, so run it offline' desc 'remove', 'Remove unreferenced statuses' long_desc <<~LONG_DESC Remove statuses that are not referenced by local user activity, such as ones that came from relays, or belonging to users that were once followed by someone locally but no longer are. + It also removes orphaned records and performs additional cleanup tasks + such as updating statistics and recovering disk space. + This is a computationally heavy procedure that creates extra database indices before commencing, and removes them afterward. LONG_DESC def remove + if options[:batch_size] < 1 + say('Cannot run with this batch_size setting, must be at least 1', :red) + exit(1) + end + + remove_statuses + vacuum_and_analyze_statuses + remove_orphans_media_attachments + remove_orphans_conversations + vacuum_and_analyze_conversations + end + + private + + def remove_statuses + return if options[:skip_status_remove] + say('Creating temporary database indices...') - ActiveRecord::Base.connection.add_index(:accounts, :id, name: :index_accounts_local, where: 'domain is null', algorithm: :concurrently) unless ActiveRecord::Base.connection.index_name_exists?(:accounts, :index_accounts_local) - ActiveRecord::Base.connection.add_index(:status_pins, :status_id, name: :index_status_pins_status_id, algorithm: :concurrently) unless ActiveRecord::Base.connection.index_name_exists?(:status_pins, :index_status_pins_status_id) - ActiveRecord::Base.connection.add_index(:media_attachments, :remote_url, name: :index_media_attachments_remote_url, where: 'remote_url is not null', algorithm: :concurrently) unless ActiveRecord::Base.connection.index_name_exists?(:media_attachments, :index_media_attachments_remote_url) + ActiveRecord::Base.connection.add_index(:media_attachments, :remote_url, name: :index_media_attachments_remote_url, where: 'remote_url is not null', algorithm: :concurrently, if_not_exists: true) max_id = Mastodon::Snowflake.id_at(options[:days].days.ago) start_at = Time.now.to_f - say('Beginning removal... This might take a while...') + unless options[:continue] && ActiveRecord::Base.connection.table_exists?('statuses_to_be_deleted') + ActiveRecord::Base.connection.add_index(:accounts, :id, name: :index_accounts_local, where: 'domain is null', algorithm: :concurrently, if_not_exists: true) + ActiveRecord::Base.connection.add_index(:status_pins, :status_id, name: :index_status_pins_status_id, algorithm: :concurrently, if_not_exists: true) - scope = Status.remote.where('id < ?', max_id) - # Skip reblogs of local statuses - scope = scope.where('reblog_of_id NOT IN (SELECT statuses1.id FROM statuses AS statuses1 WHERE statuses1.id = statuses.reblog_of_id AND (statuses1.uri IS NULL OR statuses1.local))') - # Skip statuses that are pinned on profiles - scope = scope.where('id NOT IN (SELECT status_pins.status_id FROM status_pins WHERE statuses.id = status_id)') - # Skip statuses that mention local accounts - scope = scope.where('id NOT IN (SELECT mentions.status_id FROM mentions WHERE statuses.id = mentions.status_id AND mentions.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL))') - # Skip statuses which have replies - scope = scope.where('id NOT IN (SELECT statuses1.in_reply_to_id FROM statuses AS statuses1 WHERE statuses.id = statuses1.in_reply_to_id)') - # Skip statuses reblogged by local accounts or with recent boosts - scope = scope.where('id NOT IN (SELECT statuses1.reblog_of_id FROM statuses AS statuses1 WHERE statuses.id = statuses1.reblog_of_id AND (statuses1.uri IS NULL OR statuses1.local OR statuses1.id >= ?))', max_id) - # Skip statuses favourited by local users - scope = scope.where('id NOT IN (SELECT favourites.status_id FROM favourites WHERE statuses.id = favourites.status_id AND favourites.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL))') - # Skip statuses bookmarked by local users - scope = scope.where('id NOT IN (SELECT bookmarks.status_id FROM bookmarks WHERE statuses.id = bookmarks.status_id)') + say('Extract the deletion target from statuses... This might take a while...') + + ActiveRecord::Base.connection.create_table('statuses_to_be_deleted', force: true) - unless options[:clean_followed] # Skip accounts followed by local accounts - scope = scope.where('account_id NOT IN (SELECT follows.target_account_id FROM follows WHERE statuses.account_id = follows.target_account_id)') + clean_followed_sql = 'AND NOT EXISTS (SELECT 1 FROM follows WHERE statuses.account_id = follows.target_account_id)' unless options[:clean_followed] + + ActiveRecord::Base.connection.exec_insert(<<-SQL.squish, 'SQL', [[nil, max_id]]) + INSERT INTO statuses_to_be_deleted (id) + SELECT statuses.id FROM statuses WHERE deleted_at IS NULL AND NOT local AND uri IS NOT NULL AND (id < $1) + AND NOT EXISTS (SELECT 1 FROM statuses AS statuses1 WHERE statuses.id = statuses1.in_reply_to_id) + AND NOT EXISTS (SELECT 1 FROM statuses AS statuses1 WHERE statuses1.id = statuses.reblog_of_id AND (statuses1.uri IS NULL OR statuses1.local)) + AND NOT EXISTS (SELECT 1 FROM statuses AS statuses1 WHERE statuses.id = statuses1.reblog_of_id AND (statuses1.uri IS NULL OR statuses1.local OR statuses1.id >= $1)) + AND NOT EXISTS (SELECT 1 FROM status_pins WHERE statuses.id = status_id) + AND NOT EXISTS (SELECT 1 FROM mentions WHERE statuses.id = mentions.status_id AND mentions.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL)) + AND NOT EXISTS (SELECT 1 FROM favourites WHERE statuses.id = favourites.status_id AND favourites.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL)) + AND NOT EXISTS (SELECT 1 FROM bookmarks WHERE statuses.id = bookmarks.status_id AND bookmarks.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL)) + #{clean_followed_sql} + SQL + + say('Removing temporary database indices to restore write performance...') + + ActiveRecord::Base.connection.remove_index(:accounts, name: :index_accounts_local, if_exists: true) + ActiveRecord::Base.connection.remove_index(:status_pins, name: :index_status_pins_status_id, if_exists: true) end - scope.in_batches.delete_all + say('Beginning statuses removal... This might take a while...') - unless options[:skip_media_remove] - say('Beginning removal of now-orphaned media attachments to free up disk space...') - Scheduler::MediaCleanupScheduler.new.perform + klass = Class.new(ApplicationRecord) do |c| + c.table_name = 'statuses_to_be_deleted' end - say("Done after #{Time.now.to_f - start_at}s", :green) + Object.const_set('StatusToBeDeleted', klass) + + scope = StatusToBeDeleted + processed = 0 + removed = 0 + progress = create_progress_bar(scope.count.fdiv(options[:batch_size]).ceil) + + scope.reorder(nil).in_batches(of: options[:batch_size]) do |relation| + ids = relation.pluck(:id) + processed += ids.count + removed += Status.unscoped.where(id: ids).delete_all + progress.increment + end + + progress.stop + + ActiveRecord::Base.connection.drop_table('statuses_to_be_deleted') + + say("Done after #{Time.now.to_f - start_at}s, removed #{removed} out of #{processed} statuses.", :green) ensure say('Removing temporary database indices to restore write performance...') - ActiveRecord::Base.connection.remove_index(:accounts, name: :index_accounts_local) if ActiveRecord::Base.connection.index_name_exists?(:accounts, :index_accounts_local) - ActiveRecord::Base.connection.remove_index(:status_pins, name: :index_status_pins_status_id) if ActiveRecord::Base.connection.index_name_exists?(:status_pins, :index_status_pins_status_id) - ActiveRecord::Base.connection.remove_index(:media_attachments, name: :index_media_attachments_remote_url) if ActiveRecord::Base.connection.index_name_exists?(:media_attachments, :index_media_attachments_remote_url) + ActiveRecord::Base.connection.remove_index(:accounts, name: :index_accounts_local, if_exists: true) + ActiveRecord::Base.connection.remove_index(:status_pins, name: :index_status_pins_status_id, if_exists: true) + ActiveRecord::Base.connection.remove_index(:media_attachments, name: :index_media_attachments_remote_url, if_exists: true) + end + + def remove_orphans_media_attachments + return if options[:skip_media_remove] + + start_at = Time.now.to_f + + say('Beginning removal of now-orphaned media attachments to free up disk space...') + + scope = MediaAttachment.reorder(nil).unattached.where('created_at < ?', options[:days].pred.days.ago) + processed = 0 + removed = 0 + progress = create_progress_bar(scope.count) + + scope.find_each do |media_attachment| + media_attachment.destroy! + + removed += 1 + rescue => e + progress.log pastel.red("Error processing #{media_attachment.id}: #{e}") + ensure + progress.increment + processed += 1 + end + + progress.stop + + say("Done after #{Time.now.to_f - start_at}s, removed #{removed} out of #{processed} media_attachments.", :green) + end + + def remove_orphans_conversations + start_at = Time.now.to_f + + unless options[:continue] && ActiveRecord::Base.connection.table_exists?('conversations_to_be_deleted') + say('Creating temporary database indices...') + + ActiveRecord::Base.connection.add_index(:statuses, :conversation_id, name: :index_statuses_conversation_id, algorithm: :concurrently, if_not_exists: true) + + say('Extract the deletion target from coversations... This might take a while...') + + ActiveRecord::Base.connection.create_table('conversations_to_be_deleted', force: true) + + ActiveRecord::Base.connection.exec_insert(<<-SQL.squish, 'SQL') + INSERT INTO conversations_to_be_deleted (id) + SELECT id FROM conversations WHERE NOT EXISTS (SELECT 1 FROM statuses WHERE statuses.conversation_id = conversations.id) + SQL + + say('Removing temporary database indices to restore write performance...') + ActiveRecord::Base.connection.remove_index(:statuses, name: :index_statuses_conversation_id, if_exists: true) + end + + say('Beginning orphans removal... This might take a while...') + + klass = Class.new(ApplicationRecord) do |c| + c.table_name = 'conversations_to_be_deleted' + end + + Object.const_set('ConversationsToBeDeleted', klass) + + scope = ConversationsToBeDeleted + processed = 0 + removed = 0 + progress = create_progress_bar(scope.count.fdiv(options[:batch_size]).ceil) + + scope.in_batches(of: options[:batch_size]) do |relation| + ids = relation.pluck(:id) + processed += ids.count + removed += Conversation.unscoped.where(id: ids).delete_all + progress.increment + end + + progress.stop + + ActiveRecord::Base.connection.drop_table('conversations_to_be_deleted') + + say("Done after #{Time.now.to_f - start_at}s, removed #{removed} out of #{processed} conversations.", :green) + ensure + say('Removing temporary database indices to restore write performance...') + ActiveRecord::Base.connection.remove_index(:statuses, name: :index_statuses_conversation_id, if_exists: true) + end + + def vacuum_and_analyze_statuses + if options[:compress_database] + say('Run VACUUM FULL ANALYZE to statuses...') + ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE statuses') + say('Run REINDEX to statuses...') + ActiveRecord::Base.connection.execute('REINDEX TABLE statuses') + else + say('Run ANALYZE to statuses...') + ActiveRecord::Base.connection.execute('ANALYZE statuses') + end + end + + def vacuum_and_analyze_conversations + if options[:compress_database] + say('Run VACUUM FULL ANALYZE to conversations...') + ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE conversations') + say('Run REINDEX to conversations...') + ActiveRecord::Base.connection.execute('REINDEX TABLE conversations') + else + say('Run ANALYZE to conversations...') + ActiveRecord::Base.connection.execute('ANALYZE conversations') + end end end end diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 12581f3e17..66c0c1c333 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -9,11 +9,11 @@ module Mastodon end def minor - 3 + 4 end def patch - 0 + 3 end def flags diff --git a/lib/paperclip/attachment_extensions.rb b/lib/paperclip/attachment_extensions.rb index e25a34213b..786f558e9b 100644 --- a/lib/paperclip/attachment_extensions.rb +++ b/lib/paperclip/attachment_extensions.rb @@ -2,6 +2,39 @@ module Paperclip module AttachmentExtensions + def meta + instance_read(:meta) + end + + # monkey-patch to avoid unlinking too avoid unlinking source file too early + # see https://github.com/kreeti/kt-paperclip/issues/64 + def post_process_style(name, style) #:nodoc: + raise "Style #{name} has no processors defined." if style.processors.blank? + + intermediate_files = [] + original = @queued_for_write[:original] + # if we're processing the original, close + unlink the source tempfile + intermediate_files << original if name == :original + + @queued_for_write[name] = style.processors. + inject(original) do |file, processor| + file = Paperclip.processor(processor).make(file, style.processor_options, self) + intermediate_files << file unless file == original + file + end + + unadapted_file = @queued_for_write[name] + @queued_for_write[name] = Paperclip.io_adapters. + for(@queued_for_write[name], @options[:adapter_options]) + unadapted_file.close if unadapted_file.respond_to?(:close) + @queued_for_write[name] + rescue Paperclip::Errors::NotIdentifiedByImageMagickError => e + log("An error was received while processing: #{e.inspect}") + (@errors[:processing] ||= []) << e.message if @options[:whiny] + ensure + unlink_files(intermediate_files) + end + # We overwrite this method to support delayed processing in # Sidekiq. Since we process the original file to reduce disk # usage, and we still want to generate thumbnails straight diff --git a/lib/paperclip/color_extractor.rb b/lib/paperclip/color_extractor.rb index a70a3d21f2..d3b8e10229 100644 --- a/lib/paperclip/color_extractor.rb +++ b/lib/paperclip/color_extractor.rb @@ -55,7 +55,7 @@ module Paperclip # If we don't have enough colors for accent and foreground, generate # new ones by manipulating the background color (2 - foreground_colors.size).times do |i| - foreground_colors << lighten_or_darken(background_color, 35 + (15 * i)) + foreground_colors << lighten_or_darken(background_color, 35 + (i * 15)) end # We want the color with the highest contrast to background to be the foreground one, @@ -147,7 +147,7 @@ module Paperclip g = l.to_f b = l.to_f # achromatic else - q = l < 0.5 ? l * (1 + s) : l + s - l * s + q = l < 0.5 ? l * (s + 1) : l + s - l * s p = 2 * l - q r = hue_to_rgb(p, q, h + 1 / 3.0) g = hue_to_rgb(p, q, h) diff --git a/lib/paperclip/gif_transcoder.rb b/lib/paperclip/gif_transcoder.rb index 9f3c8e8be3..d14465c018 100644 --- a/lib/paperclip/gif_transcoder.rb +++ b/lib/paperclip/gif_transcoder.rb @@ -100,16 +100,19 @@ end module Paperclip # This transcoder is only to be used for the MediaAttachment model - # to convert animated gifs to webm + # to convert animated GIFs to videos + class GifTranscoder < Paperclip::Processor def make return File.open(@file.path) unless needs_convert? final_file = Paperclip::Transcoder.make(file, options, attachment) - attachment.instance.file_file_name = File.basename(attachment.instance.file_file_name, '.*') + '.mp4' - attachment.instance.file_content_type = 'video/mp4' - attachment.instance.type = MediaAttachment.types[:gifv] + if options[:style] == :original + attachment.instance.file_file_name = File.basename(attachment.instance.file_file_name, '.*') + '.mp4' + attachment.instance.file_content_type = 'video/mp4' + attachment.instance.type = MediaAttachment.types[:gifv] + end final_file end @@ -117,7 +120,7 @@ module Paperclip private def needs_convert? - options[:style] == :original && GifReader.animated?(file.path) + GifReader.animated?(file.path) end end end diff --git a/lib/paperclip/image_extractor.rb b/lib/paperclip/image_extractor.rb index aab675a060..17fe4326fd 100644 --- a/lib/paperclip/image_extractor.rb +++ b/lib/paperclip/image_extractor.rb @@ -31,21 +31,17 @@ module Paperclip private def extract_image_from_file! - ::Av.logger = Paperclip.logger - - cli = ::Av.cli dst = Tempfile.new([File.basename(@file.path, '.*'), '.png']) dst.binmode - cli.add_source(@file.path) - cli.add_destination(dst.path) - cli.add_output_param loglevel: 'fatal' - begin - cli.run - rescue Cocaine::ExitStatusError, ::Av::CommandError + command = Terrapin::CommandLine.new('ffmpeg', '-i :source -loglevel :loglevel -y :destination', logger: Paperclip.logger) + command.run(source: @file.path, destination: dst.path, loglevel: 'fatal') + rescue Terrapin::ExitStatusError dst.close(true) return nil + rescue Terrapin::CommandNotFoundError + raise Paperclip::Errors::CommandNotFoundError, 'Could not run the `ffmpeg` command. Please install ffmpeg.' end dst diff --git a/lib/paperclip/media_type_spoof_detector_extensions.rb b/lib/paperclip/media_type_spoof_detector_extensions.rb deleted file mode 100644 index 43337cc688..0000000000 --- a/lib/paperclip/media_type_spoof_detector_extensions.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -module Paperclip - module MediaTypeSpoofDetectorExtensions - def mapping_override_mismatch? - !Array(mapped_content_type).include?(calculated_content_type) && !Array(mapped_content_type).include?(type_from_mime_magic) - end - - def calculated_media_type_from_mime_magic - @calculated_media_type_from_mime_magic ||= type_from_mime_magic.split('/').first - end - - def calculated_type_mismatch? - !media_types_from_name.include?(calculated_media_type) && !media_types_from_name.include?(calculated_media_type_from_mime_magic) - end - - def type_from_mime_magic - @type_from_mime_magic ||= begin - begin - File.open(@file.path) do |file| - MimeMagic.by_magic(file)&.type || '' - end - rescue Errno::ENOENT - '' - end - end - end - - def type_from_file_command - @type_from_file_command ||= FileCommandContentTypeDetector.new(@file.path).detect - end - end -end - -Paperclip::MediaTypeSpoofDetector.prepend(Paperclip::MediaTypeSpoofDetectorExtensions) diff --git a/lib/paperclip/response_with_limit_adapter.rb b/lib/paperclip/response_with_limit_adapter.rb index 17a2abd25f..deb89717a4 100644 --- a/lib/paperclip/response_with_limit_adapter.rb +++ b/lib/paperclip/response_with_limit_adapter.rb @@ -17,9 +17,9 @@ module Paperclip def cache_current_values @original_filename = filename_from_content_disposition.presence || filename_from_path.presence || 'data' - @size = @target.response.content_length @tempfile = copy_to_tempfile(@target) @content_type = ContentTypeDetector.new(@tempfile.path).detect + @size = File.size(@tempfile) end def copy_to_tempfile(source) diff --git a/lib/paperclip/storage_extensions.rb b/lib/paperclip/storage_extensions.rb new file mode 100644 index 0000000000..95c35641ed --- /dev/null +++ b/lib/paperclip/storage_extensions.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# Some S3-compatible providers might not actually be compatible with some APIs +# used by kt-paperclip, see https://github.com/mastodon/mastodon/issues/16822 +if ENV['S3_ENABLED'] == 'true' && ENV['S3_FORCE_SINGLE_REQUEST'] == 'true' + module Paperclip + module Storage + module S3Extensions + def copy_to_local_file(style, local_dest_path) + log("copying #{path(style)} to local file #{local_dest_path}") + s3_object(style).download_file(local_dest_path, { mode: 'single_request' }) + rescue Aws::Errors::ServiceError => e + warn("#{e} - cannot copy #{path(style)} to local file #{local_dest_path}") + false + end + end + end + end + + Paperclip::Storage::S3.prepend(Paperclip::Storage::S3Extensions) +end diff --git a/lib/paperclip/transcoder.rb b/lib/paperclip/transcoder.rb new file mode 100644 index 0000000000..ec13050382 --- /dev/null +++ b/lib/paperclip/transcoder.rb @@ -0,0 +1,102 @@ +# frozen_string_literal: true + +module Paperclip + # This transcoder is only to be used for the MediaAttachment model + # to check when uploaded videos are actually gifv's + class Transcoder < Paperclip::Processor + def initialize(file, options = {}, attachment = nil) + super + + @current_format = File.extname(@file.path) + @basename = File.basename(@file.path, @current_format) + @format = options[:format] + @time = options[:time] || 3 + @passthrough_options = options[:passthrough_options] + @convert_options = options[:convert_options].dup + end + + def make + metadata = VideoMetadataExtractor.new(@file.path) + + unless metadata.valid? + Paperclip.log("Unsupported file #{@file.path}") + return File.open(@file.path) + end + + update_attachment_type(metadata) + update_options_from_metadata(metadata) + + destination = Tempfile.new([@basename, @format ? ".#{@format}" : '']) + destination.binmode + + @output_options = @convert_options[:output]&.dup || {} + @input_options = @convert_options[:input]&.dup || {} + + case @format.to_s + when /jpg$/, /jpeg$/, /png$/, /gif$/ + @input_options['ss'] = @time + + @output_options['f'] = 'image2' + @output_options['vframes'] = 1 + when 'mp4' + @output_options['acodec'] = 'aac' + @output_options['strict'] = 'experimental' + end + + command_arguments, interpolations = prepare_command(destination) + + begin + command = Terrapin::CommandLine.new('ffmpeg', command_arguments.join(' '), logger: Paperclip.logger) + command.run(interpolations) + rescue Terrapin::ExitStatusError => e + raise Paperclip::Error, "Error while transcoding #{@basename}: #{e}" + rescue Terrapin::CommandNotFoundError + raise Paperclip::Errors::CommandNotFoundError, 'Could not run the `ffmpeg` command. Please install ffmpeg.' + end + + destination + end + + private + + def prepare_command(destination) + command_arguments = ['-nostdin'] + interpolations = {} + interpolation_keys = 0 + + @input_options.each_pair do |key, value| + interpolation_key = interpolation_keys + command_arguments << "-#{key} :#{interpolation_key}" + interpolations[interpolation_key] = value + interpolation_keys += 1 + end + + command_arguments << '-i :source' + interpolations[:source] = @file.path + + @output_options.each_pair do |key, value| + interpolation_key = interpolation_keys + command_arguments << "-#{key} :#{interpolation_key}" + interpolations[interpolation_key] = value + interpolation_keys += 1 + end + + command_arguments << '-y :destination' + interpolations[:destination] = destination.path + + [command_arguments, interpolations] + end + + def update_options_from_metadata(metadata) + return unless @passthrough_options && @passthrough_options[:video_codecs].include?(metadata.video_codec) && @passthrough_options[:audio_codecs].include?(metadata.audio_codec) && @passthrough_options[:colorspaces].include?(metadata.colorspace) + + @format = @passthrough_options[:options][:format] || @format + @time = @passthrough_options[:options][:time] || @time + @convert_options = @passthrough_options[:options][:convert_options].dup + end + + def update_attachment_type(metadata) + @attachment.instance.type = MediaAttachment.types[:gifv] unless metadata.audio_codec + end + end +end diff --git a/lib/paperclip/transcoder_extensions.rb b/lib/paperclip/transcoder_extensions.rb deleted file mode 100644 index c0b2447f3e..0000000000 --- a/lib/paperclip/transcoder_extensions.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module Paperclip - module TranscoderExtensions - # Prevent the transcoder from modifying our meta hash - def initialize(file, options = {}, attachment = nil) - meta_value = attachment&.instance_read(:meta) - super - attachment&.instance_write(:meta, meta_value) - end - end -end - -Paperclip::Transcoder.prepend(Paperclip::TranscoderExtensions) diff --git a/lib/paperclip/url_generator_extensions.rb b/lib/paperclip/url_generator_extensions.rb index e1d6df2c29..a2cf5929af 100644 --- a/lib/paperclip/url_generator_extensions.rb +++ b/lib/paperclip/url_generator_extensions.rb @@ -2,16 +2,6 @@ module Paperclip module UrlGeneratorExtensions - # Monkey-patch Paperclip to use Addressable::URI's normalization instead - # of the long-deprecated URI.esacpe - def escape_url(url) - if url.respond_to?(:escape) - url.escape - else - Addressable::URI.parse(url).normalize.to_str.gsub(escape_regex) { |m| "%#{m.ord.to_s(16).upcase}" } - end - end - def for_as_default(style_name) attachment_options[:interpolator].interpolate(default_url, @attachment, style_name) end diff --git a/lib/paperclip/video_transcoder.rb b/lib/paperclip/video_transcoder.rb deleted file mode 100644 index 4d9544231e..0000000000 --- a/lib/paperclip/video_transcoder.rb +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -module Paperclip - # This transcoder is only to be used for the MediaAttachment model - # to check when uploaded videos are actually gifv's - class VideoTranscoder < Paperclip::Processor - def make - movie = FFMPEG::Movie.new(@file.path) - - attachment.instance.type = MediaAttachment.types[:gifv] unless movie.audio_codec - - Paperclip::Transcoder.make(file, actual_options(movie), attachment) - end - - private - - def actual_options(movie) - opts = options[:passthrough_options] - if opts && opts[:video_codecs].include?(movie.video_codec) && opts[:audio_codecs].include?(movie.audio_codec) && opts[:colorspaces].include?(movie.colorspace) - opts[:options] - else - options - end - end - end -end diff --git a/lib/rails/engine_extensions.rb b/lib/rails/engine_extensions.rb new file mode 100644 index 0000000000..4848b15f25 --- /dev/null +++ b/lib/rails/engine_extensions.rb @@ -0,0 +1,11 @@ +module Rails + module EngineExtensions + # Rewrite task loading code to filter digitalocean.rake task + def run_tasks_blocks(app) + Railtie.instance_method(:run_tasks_blocks).bind(self).call(app) + paths["lib/tasks"].existent.reject { |ext| ext.end_with?('digitalocean.rake') }.sort.each { |ext| load(ext) } + end + end +end + +Rails::Engine.prepend(Rails::EngineExtensions) diff --git a/app/lib/sanitize_config.rb b/lib/sanitize_ext/sanitize_config.rb similarity index 100% rename from app/lib/sanitize_config.rb rename to lib/sanitize_ext/sanitize_config.rb diff --git a/app/lib/sidekiq_error_handler.rb b/lib/sidekiq_error_handler.rb similarity index 64% rename from app/lib/sidekiq_error_handler.rb rename to lib/sidekiq_error_handler.rb index ab555b1be3..358afd5404 100644 --- a/app/lib/sidekiq_error_handler.rb +++ b/lib/sidekiq_error_handler.rb @@ -17,10 +17,8 @@ class SidekiqErrorHandler private - # rubocop:disable Naming/MethodParameterName - def limit_backtrace_and_raise(e) - e.set_backtrace(e.backtrace.first(BACKTRACE_LIMIT)) - raise e + def limit_backtrace_and_raise(exception) + exception.set_backtrace(exception.backtrace.first(BACKTRACE_LIMIT)) + raise exception end - # rubocop:enable Naming/MethodParameterName end diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index f6c9c7eecf..a6b8c74cd2 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -1,36 +1,5 @@ # frozen_string_literal: true -require_relative '../mastodon/snowflake' - -def each_schema_load_environment - # If we're in development, also run this for the test environment. - # This is a somewhat hacky way to do this, so here's why: - # 1. We have to define this before we load the schema, or we won't - # have a timestamp_id function when we get to it in the schema. - # 2. db:setup calls db:schema:load_if_ruby, which calls - # db:schema:load, which we define above as having a prerequisite - # of this task. - # 3. db:schema:load ends up running - # ActiveRecord::Tasks::DatabaseTasks.load_schema_current, which - # calls a private method `each_current_configuration`, which - # explicitly also does the loading for the `test` environment - # if the current environment is `development`, so we end up - # needing to do the same, and we can't even use the same method - # to do it. - - if Rails.env.development? - test_conf = ActiveRecord::Base.configurations['test'] - - if test_conf['database']&.present? - ActiveRecord::Base.establish_connection(:test) - yield - ActiveRecord::Base.establish_connection(Rails.env.to_sym) - end - end - - yield -end - namespace :db do namespace :migrate do desc 'Setup the db or migrate depending on state of db' @@ -50,40 +19,21 @@ namespace :db do task :post_migration_hook do at_exit do - unless %w(C POSIX).include?(ActiveRecord::Base.connection.execute('SELECT datcollate FROM pg_database WHERE datname = current_database();').first['datcollate']) + unless %w(C POSIX).include?(ActiveRecord::Base.connection.select_one('SELECT datcollate FROM pg_database WHERE datname = current_database();')['datcollate']) warn <<~WARNING - Your database collation is susceptible to index corruption. - (This warning does not indicate that index corruption has occured and can be ignored) + Your database collation may be susceptible to index corruption. + (This warning does not indicate that index corruption has occurred, and it can be ignored if you've previously checked for index corruption) (To learn more, visit: https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/) WARNING end end end + task :pre_migration_check do + version = ActiveRecord::Base.connection.select_one("SELECT current_setting('server_version_num') AS v")['v'].to_i + abort 'ERROR: This version of Mastodon requires PostgreSQL 9.5 or newer. Please update PostgreSQL before updating Mastodon.' if version < 90_500 + end + + Rake::Task['db:migrate'].enhance(['db:pre_migration_check']) Rake::Task['db:migrate'].enhance(['db:post_migration_hook']) - - # Before we load the schema, define the timestamp_id function. - # Idiomatically, we might do this in a migration, but then it - # wouldn't end up in schema.rb, so we'd need to figure out a way to - # get it in before doing db:setup as well. This is simpler, and - # ensures it's always in place. - Rake::Task['db:schema:load'].enhance ['db:define_timestamp_id'] - - # After we load the schema, make sure we have sequences for each - # table using timestamp IDs. - Rake::Task['db:schema:load'].enhance do - Rake::Task['db:ensure_id_sequences_exist'].invoke - end - - task :define_timestamp_id do - each_schema_load_environment do - Mastodon::Snowflake.define_timestamp_id - end - end - - task :ensure_id_sequences_exist do - each_schema_load_environment do - Mastodon::Snowflake.ensure_id_sequences_exist - end - end end diff --git a/lib/tasks/emojis.rake b/lib/tasks/emojis.rake index d0b8fa890b..8faa48a95b 100644 --- a/lib/tasks/emojis.rake +++ b/lib/tasks/emojis.rake @@ -45,7 +45,7 @@ end namespace :emojis do desc 'Generate a unicode to filename mapping' task :generate do - source = 'http://www.unicode.org/Public/emoji/12.0/emoji-test.txt' + source = 'http://www.unicode.org/Public/emoji/13.1/emoji-test.txt' codes = [] dest = Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json') @@ -69,7 +69,7 @@ namespace :emojis do end end - existence_maps = grouped_codes.map { |c| c.map { |cc| [cc, File.exist?(Rails.root.join('public', 'emoji', codepoints_to_filename(cc) + '.svg'))] }.to_h } + existence_maps = grouped_codes.map { |c| c.index_with { |cc| File.exist?(Rails.root.join('public', 'emoji', codepoints_to_filename(cc) + '.svg')) } } map = {} existence_maps.each do |group| @@ -91,7 +91,7 @@ namespace :emojis do desc 'Generate emoji variants with white borders' task :generate_borders do src = Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json') - emojis = '🎱🐜⚫🖤⬛◼️◾◼️✒️▪️💣🎳📷📸♣️🕶️✴️🔌💂‍♀️📽️🍳🦍💂🔪🕳️🕹️🕋🖊️🖋️💂‍♂️🎤🎓🎥🎼♠️🎩🦃📼📹🎮🐃🏴🐞🕺👽⚾🐔☁️💨🕊️👀🍥👻🐐❕❔⛸️🌩️🔊🔇📃🌧️🐏🍚🍙🐓🐑💀☠️🌨️🔉🔈💬💭🏐🏳️⚪⬜◽◻️▫️' + emojis = '🎱🐜⚫🖤⬛◼️◾◼️✒️▪️💣🎳📷📸♣️🕶️✴️🔌💂‍♀️📽️🍳🦍💂🔪🕳️🕹️🕋🖊️🖋️💂‍♂️🎤🎓🎥🎼♠️🎩🦃📼📹🎮🐃🏴🐞🕺📱📲🚲👽⚾🐔☁️💨🕊️👀🍥👻🐐❕❔⛸️🌩️🔊🔇📃🌧️🐏🍚🍙🐓🐑💀☠️🌨️🔉🔈💬💭🏐🏳️⚪⬜◽◻️▫️' map = Oj.load(File.read(src)) diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 2ad1e778ba..a89af67780 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -333,8 +333,12 @@ namespace :mastodon do prompt.say 'This configuration will be written to .env.production' if prompt.yes?('Save configuration?') + incompatible_syntax = false + env_contents = env.each_pair.map do |key, value| if value.is_a?(String) && value =~ /[\s\#\\"]/ + incompatible_syntax = true + if value =~ /[']/ value = value.to_s.gsub(/[\\"\$]/) { |x| "\\#{x}" } "#{key}=\"#{value}\"" @@ -346,12 +350,19 @@ namespace :mastodon do end end.join("\n") - File.write(Rails.root.join('.env.production'), "# Generated with mastodon:setup on #{Time.now.utc}\n\n" + env_contents + "\n") + generated_header = "# Generated with mastodon:setup on #{Time.now.utc}\n\n".dup + + if incompatible_syntax + generated_header << "# Some variables in this file will be interpreted differently whether you are\n" + generated_header << "# using docker-compose or not.\n\n" + end + + File.write(Rails.root.join('.env.production'), "#{generated_header}#{env_contents}\n") if using_docker prompt.ok 'Below is your configuration, save it to an .env.production file outside Docker:' prompt.say "\n" - prompt.say File.read(Rails.root.join('.env.production')) + prompt.say "#{generated_header}#{env.each_pair.map { |key, value| "#{key}=#{value}" }.join("\n")}" prompt.say "\n" prompt.ok 'It is also saved within this container so you can proceed with this wizard.' end @@ -371,18 +382,20 @@ namespace :mastodon do end end - prompt.say "\n" - prompt.say 'The final step is compiling CSS/JS assets.' - prompt.say 'This may take a while and consume a lot of RAM.' + unless using_docker + prompt.say "\n" + prompt.say 'The final step is compiling CSS/JS assets.' + prompt.say 'This may take a while and consume a lot of RAM.' - if prompt.yes?('Compile the assets now?') - prompt.say 'Running `RAILS_ENV=production rails assets:precompile` ...' - prompt.say "\n\n" + if prompt.yes?('Compile the assets now?') + prompt.say 'Running `RAILS_ENV=production rails assets:precompile` ...' + prompt.say "\n\n" - if !system(env.transform_values(&:to_s).merge({ 'RAILS_ENV' => 'production' }), 'rails assets:precompile') - prompt.error 'That failed! Maybe you need swap space?' - else - prompt.say 'Done!' + if !system(env.transform_values(&:to_s).merge({ 'RAILS_ENV' => 'production' }), 'rails assets:precompile') + prompt.error 'That failed! Maybe you need swap space?' + else + prompt.say 'Done!' + end end end @@ -428,7 +441,7 @@ namespace :mastodon do namespace :webpush do desc 'Generate VAPID key' - task generate_vapid_key: :environment do + task :generate_vapid_key do vapid_key = Webpush.generate_key puts "VAPID_PRIVATE_KEY=#{vapid_key.private_key}" puts "VAPID_PUBLIC_KEY=#{vapid_key.public_key}" diff --git a/lib/tasks/repo.rake b/lib/tasks/repo.rake index d1de17b7c0..bbf7f20ee7 100644 --- a/lib/tasks/repo.rake +++ b/lib/tasks/repo.rake @@ -1,33 +1,40 @@ # frozen_string_literal: true +REPOSITORY_NAME = 'mastodon/mastodon' + namespace :repo do desc 'Generate the AUTHORS.md file' task :authors do file = File.open(Rails.root.join('AUTHORS.md'), 'w') + file << <<~HEADER Authors ======= - Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon) + Mastodon is available on [GitHub](https://github.com/#{REPOSITORY_NAME}) and provided thanks to the work of the following contributors: HEADER - url = 'https://api.github.com/repos/tootsuite/mastodon/contributors?anon=1' + url = "https://api.github.com/repos/#{REPOSITORY_NAME}/contributors?anon=1" + HttpLog.config.compact_log = true + while url.present? - response = HTTP.get(url) + response = HTTP.get(url) contributors = Oj.load(response.body) + contributors.each do |c| file << "* [#{c['login']}](#{c['html_url']})\n" if c['login'] file << "* [#{c['name']}](mailto:#{c['email']})\n" if c['name'] end + url = LinkHeader.parse(response.headers['Link']).find_link(%w(rel next))&.href end file << <<~FOOTER - This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead. + This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/mastodon/mastodon/graphs/contributors) instead. FOOTER end @@ -47,7 +54,7 @@ namespace :repo do response = nil loop do - response = HTTP.headers('Authorization' => "token #{ENV['GITHUB_API_TOKEN']}").get("https://api.github.com/repos/tootsuite/mastodon/pulls/#{pull_request_number}") + response = HTTP.headers('Authorization' => "token #{ENV['GITHUB_API_TOKEN']}").get("https://api.github.com/repos/#{REPOSITORY_NAME}/pulls/#{pull_request_number}") if response.code == 403 sleep_for = (response.headers['X-RateLimit-Reset'].to_i - Time.now.to_i).abs @@ -83,12 +90,46 @@ namespace :repo do missing_yaml_files = I18n.available_locales.reject { |locale| File.exist?(Rails.root.join('config', 'locales', "#{locale}.yml")) } missing_json_files = I18n.available_locales.reject { |locale| File.exist?(Rails.root.join('app', 'javascript', 'mastodon', 'locales', "#{locale}.json")) } - if missing_json_files.empty? && missing_yaml_files.empty? - puts pastel.green('OK') - else - puts pastel.red("Missing YAML files: #{pastel.bold(missing_yaml_files.join(', '))}") unless missing_yaml_files.empty? - puts pastel.red("Missing JSON files: #{pastel.bold(missing_json_files.join(', '))}") unless missing_json_files.empty? + locales_in_files = Dir[Rails.root.join('config', 'locales', '*.yml')].map do |path| + file_name = File.basename(path) + file_name.gsub(/\A(doorkeeper|devise|activerecord|simple_form)\./, '').gsub(/\.yml\z/, '').to_sym + end.uniq.compact + + missing_available_locales = locales_in_files - I18n.available_locales + missing_locale_names = I18n.available_locales.reject { |locale| LanguagesHelper::HUMAN_LOCALES.key?(locale) } + + critical = false + + unless missing_json_files.empty? + critical = true + + puts pastel.red("You are missing JSON files for these locales: #{pastel.bold(missing_json_files.join(', '))}") + puts pastel.red('This will lead to runtime errors for users who have selected those locales') + puts pastel.red("Add the missing files or remove the locales from #{pastel.bold('I18n.available_locales')} in config/application.rb") + end + + unless missing_yaml_files.empty? + critical = true + + puts pastel.red("You are missing YAML files for these locales: #{pastel.bold(missing_yaml_files.join(', '))}") + puts pastel.red('This will lead to runtime errors for users who have selected those locales') + puts pastel.red("Add the missing files or remove the locales from #{pastel.bold('I18n.available_locales')} in config/application.rb") + end + + unless missing_available_locales.empty? + puts pastel.yellow("You have locale files that are not enabled: #{pastel.bold(missing_available_locales.join(', '))}") + puts pastel.yellow("Add them to #{pastel.bold('I18n.available_locales')} in config/application.rb or remove them") + end + + unless missing_locale_names.empty? + puts pastel.yellow("You are missing human-readable names for these locales: #{pastel.bold(missing_locale_names.join(', '))}") + puts pastel.yellow("Add them to #{pastel.bold('HUMAN_LOCALES')} in app/helpers/settings_helper.rb or remove the locales from #{pastel.bold('I18n.available_locales')} in config/application.rb") + end + + if critical exit(1) + else + puts pastel.green('OK') end end end diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake new file mode 100644 index 0000000000..0f38b50e39 --- /dev/null +++ b/lib/tasks/tests.rake @@ -0,0 +1,181 @@ +# frozen_string_literal: true + +namespace :tests do + namespace :migrations do + desc 'Populate the database with test data for 2.0.0' + task populate_v2: :environment do + admin_key = OpenSSL::PKey::RSA.new(2048) + user_key = OpenSSL::PKey::RSA.new(2048) + remote_key = OpenSSL::PKey::RSA.new(2048) + remote_key2 = OpenSSL::PKey::RSA.new(2048) + remote_key3 = OpenSSL::PKey::RSA.new(2048) + admin_private_key = ActiveRecord::Base.connection.quote(admin_key.to_pem) + admin_public_key = ActiveRecord::Base.connection.quote(admin_key.public_key.to_pem) + user_private_key = ActiveRecord::Base.connection.quote(user_key.to_pem) + user_public_key = ActiveRecord::Base.connection.quote(user_key.public_key.to_pem) + remote_public_key = ActiveRecord::Base.connection.quote(remote_key.public_key.to_pem) + remote_public_key2 = ActiveRecord::Base.connection.quote(remote_key2.public_key.to_pem) + remote_public_key_ap = ActiveRecord::Base.connection.quote(remote_key3.public_key.to_pem) + local_domain = ActiveRecord::Base.connection.quote(Rails.configuration.x.local_domain) + + ActiveRecord::Base.connection.execute(<<~SQL) + -- accounts + + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at) + VALUES + (1, 'admin', NULL, #{admin_private_key}, #{admin_public_key}, now(), now()), + (2, 'user', NULL, #{user_private_key}, #{user_public_key}, now(), now()); + + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at, remote_url, salmon_url) + VALUES + (3, 'remote', 'remote.com', NULL, #{remote_public_key}, now(), now(), + 'https://remote.com/@remote', 'https://remote.com/salmon/1'), + (4, 'Remote', 'remote.com', NULL, #{remote_public_key}, now(), now(), + 'https://remote.com/@Remote', 'https://remote.com/salmon/1'), + (5, 'REMOTE', 'Remote.com', NULL, #{remote_public_key2}, now(), now(), + 'https://remote.com/stale/@REMOTE', 'https://remote.com/stale/salmon/1'); + + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at, protocol, inbox_url, outbox_url, followers_url) + VALUES + (6, 'bob', 'activitypub.com', NULL, #{remote_public_key_ap}, now(), now(), + 1, 'https://activitypub.com/users/bob/inbox', 'https://activitypub.com/users/bob/outbox', 'https://activitypub.com/users/bob/followers'); + + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at) + VALUES + (7, 'user', #{local_domain}, #{user_private_key}, #{user_public_key}, now(), now()), + (8, 'pt_user', NULL, #{user_private_key}, #{user_public_key}, now(), now()); + + -- users + + INSERT INTO "users" + (id, account_id, email, created_at, updated_at, admin) + VALUES + (1, 1, 'admin@localhost', now(), now(), true), + (2, 2, 'user@localhost', now(), now(), false); + + INSERT INTO "users" + (id, account_id, email, created_at, updated_at, admin, locale) + VALUES + (3, 7, 'ptuser@localhost', now(), now(), false, 'pt'); + + -- statuses + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at) + VALUES + (1, 1, 'test', now(), now()), + (2, 1, '@remote@remote.com hello', now(), now()), + (3, 1, '@Remote@remote.com hello', now(), now()), + (4, 1, '@REMOTE@remote.com hello', now(), now()); + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at, uri, local) + VALUES + (5, 1, 'activitypub status', now(), now(), 'https://localhost/users/admin/statuses/4', true); + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at) + VALUES + (6, 3, 'test', now(), now()); + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at, in_reply_to_id, in_reply_to_account_id) + VALUES + (7, 4, '@admin hello', now(), now(), 3, 1); + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at) + VALUES + (8, 5, 'test', now(), now()); + + INSERT INTO "statuses" + (id, account_id, reblog_of_id, created_at, updated_at) + VALUES + (9, 1, 2, now(), now()); + + -- mentions (from previous statuses) + + INSERT INTO "mentions" + (status_id, account_id, created_at, updated_at) + VALUES + (2, 3, now(), now()), + (3, 4, now(), now()), + (4, 5, now(), now()); + + -- stream entries + + INSERT INTO "stream_entries" + (activity_id, account_id, activity_type, created_at, updated_at) + VALUES + (1, 1, 'status', now(), now()), + (2, 1, 'status', now(), now()), + (3, 1, 'status', now(), now()), + (4, 1, 'status', now(), now()), + (5, 1, 'status', now(), now()), + (6, 3, 'status', now(), now()), + (7, 4, 'status', now(), now()), + (8, 5, 'status', now(), now()), + (9, 1, 'status', now(), now()); + + + -- custom emoji + + INSERT INTO "custom_emojis" + (shortcode, created_at, updated_at) + VALUES + ('test', now(), now()), + ('Test', now(), now()), + ('blobcat', now(), now()); + + INSERT INTO "custom_emojis" + (shortcode, domain, uri, created_at, updated_at) + VALUES + ('blobcat', 'remote.org', 'https://remote.org/emoji/blobcat', now(), now()), + ('blobcat', 'Remote.org', 'https://remote.org/emoji/blobcat', now(), now()), + ('Blobcat', 'remote.org', 'https://remote.org/emoji/Blobcat', now(), now()); + + -- favourites + + INSERT INTO "favourites" + (account_id, status_id, created_at, updated_at) + VALUES + (1, 1, now(), now()), + (1, 7, now(), now()), + (4, 1, now(), now()), + (3, 1, now(), now()), + (5, 1, now(), now()); + + -- pinned statuses + + INSERT INTO "status_pins" + (account_id, status_id, created_at, updated_at) + VALUES + (1, 1, now(), now()), + (3, 6, now(), now()), + (4, 7, now(), now()); + + -- follows + + INSERT INTO "follows" + (account_id, target_account_id, created_at, updated_at) + VALUES + (1, 5, now(), now()), + (6, 2, now(), now()), + (5, 2, now(), now()), + (6, 1, now(), now()); + + -- follow requests + + INSERT INTO "follow_requests" + (account_id, target_account_id, created_at, updated_at) + VALUES + (2, 5, now(), now()), + (5, 1, now(), now()); + SQL + end + end +end diff --git a/lib/terrapin/multi_pipe_extensions.rb b/lib/terrapin/multi_pipe_extensions.rb new file mode 100644 index 0000000000..209f4ad6ce --- /dev/null +++ b/lib/terrapin/multi_pipe_extensions.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: false + +require 'fcntl' + +module Terrapin + module MultiPipeExtensions + def initialize + @stdout_in, @stdout_out = IO.pipe + @stderr_in, @stderr_out = IO.pipe + + clear_nonblocking_flags! + end + + def pipe_options + # Add some flags to explicitly close the other end of the pipes + { out: @stdout_out, err: @stderr_out, @stdout_in => :close, @stderr_in => :close } + end + + def read + # While we are patching Terrapin, fix child process potentially getting stuck on writing + # to stderr. + + @stdout_output = +'' + @stderr_output = +'' + + fds_to_read = [@stdout_in, @stderr_in] + until fds_to_read.empty? + rs, = IO.select(fds_to_read) + + read_nonblocking!(@stdout_in, @stdout_output, fds_to_read) if rs.include?(@stdout_in) + read_nonblocking!(@stderr_in, @stderr_output, fds_to_read) if rs.include?(@stderr_in) + end + end + + private + + # @param [IO] io IO Stream to read until there is nothing to read + # @param [String] result Mutable string to which read values will be appended to + # @param [Array] fds_to_read Mutable array from which `io` should be removed on EOF + def read_nonblocking!(io, result, fds_to_read) + while (partial_result = io.read_nonblock(8192)) + result << partial_result + end + rescue IO::WaitReadable + # Do nothing + rescue EOFError + fds_to_read.delete(io) + end + + def clear_nonblocking_flags! + # Ruby 3.0 sets pipes to non-blocking mode, and resets the flags as + # needed when calling fork/exec-related syscalls, but posix-spawn does + # not currently do that, so we need to do it manually for the time being + # so that the child process do not error out when the buffers are full. + stdout_flags = @stdout_out.fcntl(Fcntl::F_GETFL) + @stdout_out.fcntl(Fcntl::F_SETFL, stdout_flags & ~Fcntl::O_NONBLOCK) if stdout_flags & Fcntl::O_NONBLOCK + + stderr_flags = @stderr_out.fcntl(Fcntl::F_GETFL) + @stderr_out.fcntl(Fcntl::F_SETFL, stderr_flags & ~Fcntl::O_NONBLOCK) if stderr_flags & Fcntl::O_NONBLOCK + rescue NameError, NotImplementedError, Errno::EINVAL + # Probably on windows, where pipes are blocking by default + end + end +end + +Terrapin::CommandLine::MultiPipe.prepend(Terrapin::MultiPipeExtensions) diff --git a/package.json b/package.json index b41004ad7b..921958803f 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "@tootsuite/mastodon", + "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", "engines": { - "node": ">=10.13" + "node": ">=12" }, "scripts": { "postversion": "git push --tags", @@ -14,19 +14,20 @@ "test:lint": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:lint:sass", "test:lint:js": "eslint --ext=js . --cache", "test:lint:sass": "sass-lint -v", - "test:jest": "cross-env NODE_ENV=test jest --coverage" + "test:jest": "cross-env NODE_ENV=test jest" }, "repository": { "type": "git", - "url": "https://github.com/tootsuite/mastodon.git" + "url": "https://github.com/mastodon/mastodon.git" }, "browserslist": [ "last 2 versions", - "IE >= 11", + "not IE 11", "iOS >= 9", "not dead" ], "jest": { + "testEnvironment": "jsdom", "projects": [ "/app/javascript/mastodon" ], @@ -60,39 +61,37 @@ }, "private": true, "dependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-decorators": "^7.12.12", - "@babel/plugin-transform-react-inline-elements": "^7.12.1", - "@babel/plugin-transform-runtime": "^7.12.10", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/runtime": "^7.12.5", - "@clusterws/cws": "^3.0.0", + "@babel/core": "^7.16.12", + "@babel/plugin-proposal-decorators": "^7.16.7", + "@babel/plugin-transform-react-inline-elements": "^7.16.7", + "@babel/plugin-transform-runtime": "^7.16.10", + "@babel/preset-env": "^7.16.11", + "@babel/preset-react": "^7.16.7", + "@babel/runtime": "^7.16.7", "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^0.5.7", - "@rails/ujs": "^6.1.1", - "array-includes": "^3.1.2", + "@rails/ujs": "^6.1.4", + "array-includes": "^3.1.4", "atrament": "0.2.4", "arrow-key-navigation": "^1.2.0", - "autoprefixer": "^9.8.6", - "axios": "^0.21.1", - "babel-loader": "^8.2.2", + "autoprefixer": "^9.8.8", + "axios": "^0.25.0", + "babel-loader": "^8.2.3", "babel-plugin-lodash": "^3.3.4", "babel-plugin-preval": "^5.0.0", "babel-plugin-react-intl": "^6.2.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "babel-runtime": "^6.26.0", - "blurhash": "^1.1.3", - "classnames": "^2.2.5", + "blurhash": "^1.1.4", + "classnames": "^2.3.1", "color-blend": "^3.0.1", "compression-webpack-plugin": "^6.1.1", "cross-env": "^7.0.3", - "css-loader": "^5.0.1", - "cssnano": "^4.1.10", - "detect-passive-events": "^2.0.2", - "dotenv": "^8.2.0", - "emoji-mart": "Gargron/emoji-mart#build", + "css-loader": "^5.2.7", + "cssnano": "^4.1.11", + "detect-passive-events": "^2.0.3", + "dotenv": "^10.0.0", + "emoji-mart": "npm:emoji-mart-lazyload", "es6-symbol": "^3.1.3", "escape-html": "^1.0.3", "exif-js": "^2.3.0", @@ -100,33 +99,33 @@ "favico.js": "^0.3.10", "file-loader": "^6.2.0", "font-awesome": "^4.7.0", - "glob": "^7.1.6", + "glob": "^7.2.0", "history": "^4.10.1", "http-link-header": "^1.0.3", - "immutable": "^3.8.2", + "immutable": "^4.0.0", "imports-loader": "^1.2.0", "intersection-observer": "^0.12.0", "intl": "^1.2.5", "intl-messageformat": "^2.2.0", "intl-relativeformat": "^6.4.3", "is-nan": "^1.3.2", - "js-yaml": "^4.0.0", - "lodash": "^4.17.19", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", "mark-loader": "^0.1.6", - "marky": "^1.2.1", - "mini-css-extract-plugin": "^1.3.4", + "marky": "^1.2.2", + "mini-css-extract-plugin": "^1.6.2", "mkdirp": "^1.0.4", - "npmlog": "^4.1.2", + "npmlog": "^6.0.0", "object-assign": "^4.1.1", "object-fit-images": "^3.2.3", - "object.values": "^1.1.2", + "object.values": "^1.1.5", "offline-plugin": "^5.0.7", "path-complete-extname": "^1.0.0", - "pg": "^6.4.0", + "pg": "^8.5.0", "postcss-loader": "^3.0.0", "postcss-object-fit-images": "^1.1.2", - "promise.prototype.finally": "^3.1.2", - "prop-types": "^15.5.10", + "promise.prototype.finally": "^3.1.3", + "prop-types": "^15.8.1", "punycode": "^2.1.0", "react": "^16.14.0", "react-dom": "^16.14.0", @@ -138,26 +137,26 @@ "react-motion": "^0.5.2", "react-notification": "^6.8.5", "react-overlays": "^0.9.3", - "react-redux": "^7.2.2", + "react-redux": "^7.2.6", "react-redux-loading-bar": "^4.0.8", "react-router-dom": "^4.1.1", "react-router-scroll-4": "^1.0.0-beta.1", - "react-select": "^3.2.0", + "react-select": "^5.2.2", "react-sparklines": "^1.7.0", - "react-swipeable-views": "^0.13.9", - "react-textarea-autosize": "^8.3.0", - "react-toggle": "^4.1.1", - "redis": "^3.0.2", - "redux": "^4.0.5", + "react-swipeable-views": "^0.14.0", + "react-textarea-autosize": "^8.3.3", + "react-toggle": "^4.1.2", + "redis": "^4.0.2", + "redux": "^4.1.2", "redux-immutable": "^4.0.0", - "redux-thunk": "^2.2.0", - "regenerator-runtime": "^0.13.7", + "redux-thunk": "^2.4.1", + "regenerator-runtime": "^0.13.9", "rellax": "^1.12.1", "requestidlecallback": "^0.3.0", - "reselect": "^4.0.0", + "reselect": "^4.1.5", "rimraf": "^3.0.2", - "sass": "^1.32.5", - "sass-loader": "^10.1.1", + "sass": "^1.49.0", + "sass-loader": "^10.2.0", "stacktrace-js": "^2.0.2", "stringz": "^2.1.0", "substring-trie": "^1.0.2", @@ -165,33 +164,39 @@ "tesseract.js": "^2.1.1", "throng": "^4.0.0", "tiny-queue": "^0.2.1", + "twitter-text": "3.1.0", "uuid": "^8.3.1", "webpack": "^4.46.0", - "webpack-assets-manifest": "^4.0.1", - "webpack-bundle-analyzer": "^4.3.0", + "webpack-assets-manifest": "^4.0.6", + "webpack-bundle-analyzer": "^4.5.0", "webpack-cli": "^3.3.12", - "webpack-merge": "^5.7.3", - "wicg-inert": "^3.1.0" + "webpack-merge": "^5.8.0", + "wicg-inert": "^3.1.1", + "ws": "^8.4.2" }, "devDependencies": { - "@testing-library/jest-dom": "^5.11.9", - "@testing-library/react": "^11.2.3", + "@testing-library/jest-dom": "^5.16.1", + "@testing-library/react": "^12.1.2", "babel-eslint": "^10.1.0", - "babel-jest": "^26.6.3", - "eslint": "^7.18.0", - "eslint-plugin-import": "~2.22.1", - "eslint-plugin-jsx-a11y": "~6.4.1", - "eslint-plugin-promise": "~4.2.1", - "eslint-plugin-react": "~7.22.0", - "jest": "^26.6.3", + "babel-jest": "^27.4.6", + "eslint": "^7.32.0", + "eslint-plugin-import": "~2.25.4", + "eslint-plugin-jsx-a11y": "~6.5.1", + "eslint-plugin-promise": "~6.0.0", + "eslint-plugin-react": "~7.28.0", + "jest": "^27.4.7", "raf": "^3.4.1", "react-intl-translations-manager": "^5.0.3", "react-test-renderer": "^16.14.0", "sass-lint": "^1.13.1", - "webpack-dev-server": "^3.11.2", - "yargs": "^16.2.0" + "webpack-dev-server": "^3.11.3", + "yargs": "^17.3.1" }, "resolutions": { "kind-of": "^6.0.3" + }, + "optionalDependencies": { + "bufferutil": "^4.0.6", + "utf-8-validate": "^5.0.8" } } diff --git a/public/emoji/1f1f5-1f1f9.svg b/public/emoji/1f1f5-1f1f9.svg index 78b29a89f3..c1d4a84ff2 100644 --- a/public/emoji/1f1f5-1f1f9.svg +++ b/public/emoji/1f1f5-1f1f9.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f1f9-1f1ed.svg b/public/emoji/1f1f9-1f1ed.svg index ff2a66f932..0bd4165c00 100644 --- a/public/emoji/1f1f9-1f1ed.svg +++ b/public/emoji/1f1f9-1f1ed.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f36a.svg b/public/emoji/1f36a.svg index d1b604bcd0..4f5368a41d 100644 --- a/public/emoji/1f36a.svg +++ b/public/emoji/1f36a.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f3a2.svg b/public/emoji/1f3a2.svg index b1e64ec0e1..256d8afb7d 100644 --- a/public/emoji/1f3a2.svg +++ b/public/emoji/1f3a2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f3af.svg b/public/emoji/1f3af.svg index 9562c6c39c..073817f2f3 100644 --- a/public/emoji/1f3af.svg +++ b/public/emoji/1f3af.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f3f3-fe0f-200d-26a7-fe0f.svg b/public/emoji/1f3f3-fe0f-200d-26a7-fe0f.svg index f9fc064c0c..a789852e9e 100644 --- a/public/emoji/1f3f3-fe0f-200d-26a7-fe0f.svg +++ b/public/emoji/1f3f3-fe0f-200d-26a7-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f408-200d-2b1b.svg b/public/emoji/1f408-200d-2b1b.svg new file mode 100644 index 0000000000..cf7b1d902b --- /dev/null +++ b/public/emoji/1f408-200d-2b1b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f429.svg b/public/emoji/1f429.svg index 4852dda3db..0ffd08288c 100644 --- a/public/emoji/1f429.svg +++ b/public/emoji/1f429.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f43b-200d-2744-fe0f.svg b/public/emoji/1f43b-200d-2744-fe0f.svg new file mode 100644 index 0000000000..dc70f185ad --- /dev/null +++ b/public/emoji/1f43b-200d-2744-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f441.svg b/public/emoji/1f441.svg index 75e9c48a45..bd1a45e4e6 100644 --- a/public/emoji/1f441.svg +++ b/public/emoji/1f441.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-1f37c.svg b/public/emoji/1f468-1f3fb-200d-1f37c.svg new file mode 100644 index 0000000000..19c8fff2e6 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-1f384.svg b/public/emoji/1f468-1f3fb-200d-1f384.svg new file mode 100644 index 0000000000..ef5c615311 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..d5fafaa3ba --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..ba0096370a --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..9a9e5aa1b5 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..84271cae48 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..2c19779554 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..0a15846510 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..3c29712cab --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..6aca82f50c --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..c8d0b8bd89 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..73928de4a5 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-1f37c.svg b/public/emoji/1f468-1f3fc-200d-1f37c.svg new file mode 100644 index 0000000000..5d702994dc --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-1f384.svg b/public/emoji/1f468-1f3fc-200d-1f384.svg new file mode 100644 index 0000000000..5adcdf4eb5 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..078e78a913 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..aa77842945 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..15e6ad3ac7 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..e0cceb6728 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..882bfbffbc --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..1042a95e89 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..84edcd44b5 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..dd31c8a5fd --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..56780ef10d --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..660d27bf22 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-1f37c.svg b/public/emoji/1f468-1f3fd-200d-1f37c.svg new file mode 100644 index 0000000000..46f2ea1a07 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-1f384.svg b/public/emoji/1f468-1f3fd-200d-1f384.svg new file mode 100644 index 0000000000..0a56a8b1c6 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..6350ae7747 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..7ca4a90eff --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..4b4e1c9384 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..f48b7bad1a --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..c11dec5fda --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..7e9c5db085 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..4c8801583a --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..dd9aa5c10c --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..f597a9d346 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..6c9eab66f9 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-1f37c.svg b/public/emoji/1f468-1f3fe-200d-1f37c.svg new file mode 100644 index 0000000000..ea5681fe94 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-1f384.svg b/public/emoji/1f468-1f3fe-200d-1f384.svg new file mode 100644 index 0000000000..16b3b33ec3 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..c5731cc6cf --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..491f78791a --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..c05f4abf2e --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..b770611d99 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..b6985d6d77 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..996f8590c1 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..36577f2f8a --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..4dd4d4fc01 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..2341ee2fd2 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..8285d8e984 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-1f37c.svg b/public/emoji/1f468-1f3ff-200d-1f37c.svg new file mode 100644 index 0000000000..330c92ef7e --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-1f384.svg b/public/emoji/1f468-1f3ff-200d-1f384.svg new file mode 100644 index 0000000000..4923cbf40b --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..a535d6a316 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..3f9d8cfde4 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..888ae0c707 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..d1f3b8c20c --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..b027d467d5 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..c1901ecd1a --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..0fb35cc35a --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..ecad79993f --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..a94946a944 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..fda2482888 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-200d-1f37c.svg b/public/emoji/1f468-200d-1f37c.svg new file mode 100644 index 0000000000..971908e448 --- /dev/null +++ b/public/emoji/1f468-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-200d-1f384.svg b/public/emoji/1f468-200d-1f384.svg new file mode 100644 index 0000000000..9c61da6c0f --- /dev/null +++ b/public/emoji/1f468-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg b/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg index cace24fc32..27d1b6fc7e 100644 --- a/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg +++ b/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg b/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg index 41dbd9681a..831f2fb2e5 100644 --- a/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg +++ b/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-1f37c.svg b/public/emoji/1f469-1f3fb-200d-1f37c.svg new file mode 100644 index 0000000000..311bda9faf --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-1f384.svg b/public/emoji/1f469-1f3fb-200d-1f384.svg new file mode 100644 index 0000000000..0227456d07 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..15a822acec --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..7162de94ba --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..4bd37fce1f --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..3db3581d06 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..994658d22e --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..73314e4ab9 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..9c6f709ad3 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..9bd747f460 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..2aa5a27af3 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..e9f571ef42 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..d0b112fe3d --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..5d6019e80f --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..3580f3a3d6 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..e19d11045e --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..4bfa08b5d8 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..821a996aee --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..e26fe32b98 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..abb321d9b7 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..bab53ae51d --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..0659c9b7f6 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-1f37c.svg b/public/emoji/1f469-1f3fc-200d-1f37c.svg new file mode 100644 index 0000000000..cfae280ec5 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-1f384.svg b/public/emoji/1f469-1f3fc-200d-1f384.svg new file mode 100644 index 0000000000..5887d75e09 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..5ffb98f018 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..079a8e4c8b --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..460e58ae53 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..42a17a8169 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..6fa892b190 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..fb36178d2c --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..922e2a933f --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..4dac2cb8d6 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..cc441541b4 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..f40bebabed --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..096f2e583b --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..ec70a000af --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..f8b70f5273 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..7724820b09 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..2464e01e44 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..2ee4ff885c --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..286e47cdb4 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..3642887803 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..64c21a1dea --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..02d27ddfdd --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-1f37c.svg b/public/emoji/1f469-1f3fd-200d-1f37c.svg new file mode 100644 index 0000000000..8e1e408c51 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-1f384.svg b/public/emoji/1f469-1f3fd-200d-1f384.svg new file mode 100644 index 0000000000..3e1853d2b6 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..695e539bb9 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..65a77e2bdc --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..d1d91a30c3 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..50d60b779e --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..5fd131c453 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..1356db0269 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..7438c5b0bb --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..38e0b432f4 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..b48f1d46f2 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..321d1f64af --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..cb04f10191 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..4325ef397e --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..6f77cbd32e --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..524d10235c --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..3cb1b4974d --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..04715e3dfd --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..d0d6dab849 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..2894b61147 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..4faa37f2d5 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..1813ca49b3 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-1f37c.svg b/public/emoji/1f469-1f3fe-200d-1f37c.svg new file mode 100644 index 0000000000..b910a8776e --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-1f384.svg b/public/emoji/1f469-1f3fe-200d-1f384.svg new file mode 100644 index 0000000000..6d94d270d0 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..a600e7b2f3 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..eb47006f60 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..a34e5cefce --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..824bbc4887 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..91f217cc77 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..c12c9583c6 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..1a55bb200b --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..441d235b9e --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..17525760ef --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..53aefb1d93 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..d65532a721 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..59e515fe75 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..0db014b265 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..cb9ec9c436 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..29b48c05be --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..fa0aed880e --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..e12111f650 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..4e264e1944 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..d40884564c --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..16d2f92924 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-1f37c.svg b/public/emoji/1f469-1f3ff-200d-1f37c.svg new file mode 100644 index 0000000000..698556668a --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-1f384.svg b/public/emoji/1f469-1f3ff-200d-1f384.svg new file mode 100644 index 0000000000..2178a33caf --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..63a94f31b1 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..86a47dc081 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..8bc287f05b --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..f456c7cf40 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..4ab7404284 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..ab8a2c16c4 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..0d784f5e1a --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..226ba13dcf --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..bd5f6c1d16 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..5347958341 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 0000000000..74c86e378d --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 0000000000..16731da4bc --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 0000000000..b18477a0ec --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 0000000000..1e8fee5fe8 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 0000000000..42aa5cad58 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 0000000000..63c098a5e3 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 0000000000..295504b577 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 0000000000..9150da85b7 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 0000000000..f5d3fe5b2c --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 0000000000..77da150164 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-200d-1f37c.svg b/public/emoji/1f469-200d-1f37c.svg new file mode 100644 index 0000000000..c13cc5371b --- /dev/null +++ b/public/emoji/1f469-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-200d-1f384.svg b/public/emoji/1f469-200d-1f384.svg new file mode 100644 index 0000000000..6cabe5829f --- /dev/null +++ b/public/emoji/1f469-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg index 8248ed607b..210f97c992 100644 --- a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg +++ b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg index e46dfcaebd..e8eee47b96 100644 --- a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg +++ b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f470-1f3fb-200d-2640-fe0f.svg new file mode 100644 index 0000000000..6e0b0fe349 --- /dev/null +++ b/public/emoji/1f470-1f3fb-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f470-1f3fb-200d-2642-fe0f.svg new file mode 100644 index 0000000000..84c773ab05 --- /dev/null +++ b/public/emoji/1f470-1f3fb-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fb.svg b/public/emoji/1f470-1f3fb.svg index 7691a70a34..e8c6cd06b1 100644 --- a/public/emoji/1f470-1f3fb.svg +++ b/public/emoji/1f470-1f3fb.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f470-1f3fc-200d-2640-fe0f.svg new file mode 100644 index 0000000000..ee4102b652 --- /dev/null +++ b/public/emoji/1f470-1f3fc-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f470-1f3fc-200d-2642-fe0f.svg new file mode 100644 index 0000000000..f894e261ca --- /dev/null +++ b/public/emoji/1f470-1f3fc-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fc.svg b/public/emoji/1f470-1f3fc.svg index 2ce98ebb14..511c7aa825 100644 --- a/public/emoji/1f470-1f3fc.svg +++ b/public/emoji/1f470-1f3fc.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f470-1f3fd-200d-2640-fe0f.svg new file mode 100644 index 0000000000..3d7605dc35 --- /dev/null +++ b/public/emoji/1f470-1f3fd-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f470-1f3fd-200d-2642-fe0f.svg new file mode 100644 index 0000000000..f1b941d1c9 --- /dev/null +++ b/public/emoji/1f470-1f3fd-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fd.svg b/public/emoji/1f470-1f3fd.svg index 3d4070c421..4fc12eb555 100644 --- a/public/emoji/1f470-1f3fd.svg +++ b/public/emoji/1f470-1f3fd.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f470-1f3fe-200d-2640-fe0f.svg new file mode 100644 index 0000000000..1e33374c34 --- /dev/null +++ b/public/emoji/1f470-1f3fe-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f470-1f3fe-200d-2642-fe0f.svg new file mode 100644 index 0000000000..1c8135c96f --- /dev/null +++ b/public/emoji/1f470-1f3fe-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fe.svg b/public/emoji/1f470-1f3fe.svg index ac399c7fe8..c30f3c093d 100644 --- a/public/emoji/1f470-1f3fe.svg +++ b/public/emoji/1f470-1f3fe.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f470-1f3ff-200d-2640-fe0f.svg new file mode 100644 index 0000000000..656a9b71c8 --- /dev/null +++ b/public/emoji/1f470-1f3ff-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f470-1f3ff-200d-2642-fe0f.svg new file mode 100644 index 0000000000..2c090f1a06 --- /dev/null +++ b/public/emoji/1f470-1f3ff-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3ff.svg b/public/emoji/1f470-1f3ff.svg index dc1166ecb4..9e0f2a25b6 100644 --- a/public/emoji/1f470-1f3ff.svg +++ b/public/emoji/1f470-1f3ff.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-200d-2640-fe0f.svg b/public/emoji/1f470-200d-2640-fe0f.svg new file mode 100644 index 0000000000..2fd75bfe86 --- /dev/null +++ b/public/emoji/1f470-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-200d-2642-fe0f.svg b/public/emoji/1f470-200d-2642-fe0f.svg new file mode 100644 index 0000000000..d12c670e57 --- /dev/null +++ b/public/emoji/1f470-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470.svg b/public/emoji/1f470.svg index e68b5345bf..a41b9b997b 100644 --- a/public/emoji/1f470.svg +++ b/public/emoji/1f470.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f489.svg b/public/emoji/1f489.svg index ef9c72c741..6fb5e9e9da 100644 --- a/public/emoji/1f489.svg +++ b/public/emoji/1f489.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3fb.svg b/public/emoji/1f48f-1f3fb.svg new file mode 100644 index 0000000000..787f827688 --- /dev/null +++ b/public/emoji/1f48f-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3fc.svg b/public/emoji/1f48f-1f3fc.svg new file mode 100644 index 0000000000..dbfac3f013 --- /dev/null +++ b/public/emoji/1f48f-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3fd.svg b/public/emoji/1f48f-1f3fd.svg new file mode 100644 index 0000000000..1fe89be5e3 --- /dev/null +++ b/public/emoji/1f48f-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3fe.svg b/public/emoji/1f48f-1f3fe.svg new file mode 100644 index 0000000000..394eafe0a6 --- /dev/null +++ b/public/emoji/1f48f-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3ff.svg b/public/emoji/1f48f-1f3ff.svg new file mode 100644 index 0000000000..7087f915fd --- /dev/null +++ b/public/emoji/1f48f-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f.svg b/public/emoji/1f48f.svg index 69cec3c600..ea67314f22 100644 --- a/public/emoji/1f48f.svg +++ b/public/emoji/1f48f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f491-1f3fb.svg b/public/emoji/1f491-1f3fb.svg new file mode 100644 index 0000000000..b4795dd079 --- /dev/null +++ b/public/emoji/1f491-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491-1f3fc.svg b/public/emoji/1f491-1f3fc.svg new file mode 100644 index 0000000000..971e87460d --- /dev/null +++ b/public/emoji/1f491-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491-1f3fd.svg b/public/emoji/1f491-1f3fd.svg new file mode 100644 index 0000000000..3f042ca6a6 --- /dev/null +++ b/public/emoji/1f491-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491-1f3fe.svg b/public/emoji/1f491-1f3fe.svg new file mode 100644 index 0000000000..8e98402f2a --- /dev/null +++ b/public/emoji/1f491-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491-1f3ff.svg b/public/emoji/1f491-1f3ff.svg new file mode 100644 index 0000000000..9257f7c0d7 --- /dev/null +++ b/public/emoji/1f491-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491.svg b/public/emoji/1f491.svg index ece280dc0d..73a30e93ef 100644 --- a/public/emoji/1f491.svg +++ b/public/emoji/1f491.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3fb.svg b/public/emoji/1f4aa-1f3fb.svg index 63f868316c..2627eea6f3 100644 --- a/public/emoji/1f4aa-1f3fb.svg +++ b/public/emoji/1f4aa-1f3fb.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3fc.svg b/public/emoji/1f4aa-1f3fc.svg index d9e082108d..2cac971bae 100644 --- a/public/emoji/1f4aa-1f3fc.svg +++ b/public/emoji/1f4aa-1f3fc.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3fd.svg b/public/emoji/1f4aa-1f3fd.svg index 39820dbc77..68f6b7503d 100644 --- a/public/emoji/1f4aa-1f3fd.svg +++ b/public/emoji/1f4aa-1f3fd.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3fe.svg b/public/emoji/1f4aa-1f3fe.svg index d93cc7b9f3..c773c67287 100644 --- a/public/emoji/1f4aa-1f3fe.svg +++ b/public/emoji/1f4aa-1f3fe.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3ff.svg b/public/emoji/1f4aa-1f3ff.svg index d9b4481edd..16efbe0f41 100644 --- a/public/emoji/1f4aa-1f3ff.svg +++ b/public/emoji/1f4aa-1f3ff.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa.svg b/public/emoji/1f4aa.svg index 38a7bb525f..7b4c1206c8 100644 --- a/public/emoji/1f4aa.svg +++ b/public/emoji/1f4aa.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b4.svg b/public/emoji/1f4b4.svg index 5db237d4ee..747870e0e5 100644 --- a/public/emoji/1f4b4.svg +++ b/public/emoji/1f4b4.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b5.svg b/public/emoji/1f4b5.svg index 113c6d0bba..1c68944afa 100644 --- a/public/emoji/1f4b5.svg +++ b/public/emoji/1f4b5.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b6.svg b/public/emoji/1f4b6.svg index 1869987fef..afd8b71540 100644 --- a/public/emoji/1f4b6.svg +++ b/public/emoji/1f4b6.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b7.svg b/public/emoji/1f4b7.svg index 93a16ff620..ff5c5a44b1 100644 --- a/public/emoji/1f4b7.svg +++ b/public/emoji/1f4b7.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b8.svg b/public/emoji/1f4b8.svg index d2d63ceb94..8b6fa10979 100644 --- a/public/emoji/1f4b8.svg +++ b/public/emoji/1f4b8.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4ba.svg b/public/emoji/1f4ba.svg index bf27bb1845..ab311bc7b4 100644 --- a/public/emoji/1f4ba.svg +++ b/public/emoji/1f4ba.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4c5.svg b/public/emoji/1f4c5.svg index ca68a82a6d..476a9506cc 100644 --- a/public/emoji/1f4c5.svg +++ b/public/emoji/1f4c5.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4c6.svg b/public/emoji/1f4c6.svg index ff073d7424..b2de8c5c21 100644 --- a/public/emoji/1f4c6.svg +++ b/public/emoji/1f4c6.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4f1_border.svg b/public/emoji/1f4f1_border.svg new file mode 100644 index 0000000000..fac2465100 --- /dev/null +++ b/public/emoji/1f4f1_border.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/emoji/1f4f2_border.svg b/public/emoji/1f4f2_border.svg new file mode 100644 index 0000000000..30edddf5eb --- /dev/null +++ b/public/emoji/1f4f2_border.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/emoji/1f536.svg b/public/emoji/1f536.svg index 116e72265c..9695be3eef 100644 --- a/public/emoji/1f536.svg +++ b/public/emoji/1f536.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f538.svg b/public/emoji/1f538.svg index 435ad6a5d0..842ffcc582 100644 --- a/public/emoji/1f538.svg +++ b/public/emoji/1f538.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f5e1.svg b/public/emoji/1f5e1.svg index 2741fb89d4..d1d7712c0c 100644 --- a/public/emoji/1f5e1.svg +++ b/public/emoji/1f5e1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f606.svg b/public/emoji/1f606.svg index e82c405ae2..fed5ff58ab 100644 --- a/public/emoji/1f606.svg +++ b/public/emoji/1f606.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f60b.svg b/public/emoji/1f60b.svg index 2c962bb64f..27e0d3a4cd 100644 --- a/public/emoji/1f60b.svg +++ b/public/emoji/1f60b.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f616.svg b/public/emoji/1f616.svg index 2b8871cee9..fb915d6d41 100644 --- a/public/emoji/1f616.svg +++ b/public/emoji/1f616.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f61b.svg b/public/emoji/1f61b.svg index 903422aeff..e249672d2a 100644 --- a/public/emoji/1f61b.svg +++ b/public/emoji/1f61b.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f61c.svg b/public/emoji/1f61c.svg index 6f78739042..76b205dc75 100644 --- a/public/emoji/1f61c.svg +++ b/public/emoji/1f61c.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f61d.svg b/public/emoji/1f61d.svg index 09dead62ab..c49803816f 100644 --- a/public/emoji/1f61d.svg +++ b/public/emoji/1f61d.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f62e-200d-1f4a8.svg b/public/emoji/1f62e-200d-1f4a8.svg new file mode 100644 index 0000000000..d8a4b6e0cd --- /dev/null +++ b/public/emoji/1f62e-200d-1f4a8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f633.svg b/public/emoji/1f633.svg index 2663c8cee7..80ee1fefee 100644 --- a/public/emoji/1f633.svg +++ b/public/emoji/1f633.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f635-200d-1f4ab.svg b/public/emoji/1f635-200d-1f4ab.svg new file mode 100644 index 0000000000..3238e0b0e0 --- /dev/null +++ b/public/emoji/1f635-200d-1f4ab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f636-200d-1f32b-fe0f.svg b/public/emoji/1f636-200d-1f32b-fe0f.svg new file mode 100644 index 0000000000..dc0a4745fa --- /dev/null +++ b/public/emoji/1f636-200d-1f32b-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f6b2_border.svg b/public/emoji/1f6b2_border.svg new file mode 100644 index 0000000000..0219841a1f --- /dev/null +++ b/public/emoji/1f6b2_border.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/emoji/1f6d6.svg b/public/emoji/1f6d6.svg new file mode 100644 index 0000000000..b2866e07d3 --- /dev/null +++ b/public/emoji/1f6d6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f6d7.svg b/public/emoji/1f6d7.svg new file mode 100644 index 0000000000..5369e5793a --- /dev/null +++ b/public/emoji/1f6d7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f6fb.svg b/public/emoji/1f6fb.svg new file mode 100644 index 0000000000..87643ae936 --- /dev/null +++ b/public/emoji/1f6fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f6fc.svg b/public/emoji/1f6fc.svg new file mode 100644 index 0000000000..091d51ef63 --- /dev/null +++ b/public/emoji/1f6fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f7e0.svg b/public/emoji/1f7e0.svg index 2db43d5b24..f5e120075b 100644 --- a/public/emoji/1f7e0.svg +++ b/public/emoji/1f7e0.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f7e7.svg b/public/emoji/1f7e7.svg index 3cbdde4d92..1377a4eb9b 100644 --- a/public/emoji/1f7e7.svg +++ b/public/emoji/1f7e7.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3fb.svg b/public/emoji/1f90c-1f3fb.svg new file mode 100644 index 0000000000..8af452131c --- /dev/null +++ b/public/emoji/1f90c-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3fc.svg b/public/emoji/1f90c-1f3fc.svg new file mode 100644 index 0000000000..7cee5bd5d2 --- /dev/null +++ b/public/emoji/1f90c-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3fd.svg b/public/emoji/1f90c-1f3fd.svg new file mode 100644 index 0000000000..2898fe3911 --- /dev/null +++ b/public/emoji/1f90c-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3fe.svg b/public/emoji/1f90c-1f3fe.svg new file mode 100644 index 0000000000..2e706ba424 --- /dev/null +++ b/public/emoji/1f90c-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3ff.svg b/public/emoji/1f90c-1f3ff.svg new file mode 100644 index 0000000000..e17d4b094c --- /dev/null +++ b/public/emoji/1f90c-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c.svg b/public/emoji/1f90c.svg new file mode 100644 index 0000000000..56b40f34cf --- /dev/null +++ b/public/emoji/1f90c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f923.svg b/public/emoji/1f923.svg index 7ddfcae30a..d0e3c759a6 100644 --- a/public/emoji/1f923.svg +++ b/public/emoji/1f923.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f927.svg b/public/emoji/1f927.svg index dc86ab356f..06fee3f771 100644 --- a/public/emoji/1f927.svg +++ b/public/emoji/1f927.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f92e.svg b/public/emoji/1f92e.svg index d792679fd1..42df3bd981 100644 --- a/public/emoji/1f92e.svg +++ b/public/emoji/1f92e.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f92f.svg b/public/emoji/1f92f.svg index 664d96059b..3ac19ed411 100644 --- a/public/emoji/1f92f.svg +++ b/public/emoji/1f92f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f933.svg b/public/emoji/1f933.svg index 47fa031f62..88382e13b8 100644 --- a/public/emoji/1f933.svg +++ b/public/emoji/1f933.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f94d.svg b/public/emoji/1f94d.svg index 2a4eb10c9a..8c6bcb9894 100644 --- a/public/emoji/1f94d.svg +++ b/public/emoji/1f94d.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f972.svg b/public/emoji/1f972.svg new file mode 100644 index 0000000000..f309c2236a --- /dev/null +++ b/public/emoji/1f972.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3fb.svg b/public/emoji/1f977-1f3fb.svg new file mode 100644 index 0000000000..5c981c21fb --- /dev/null +++ b/public/emoji/1f977-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3fc.svg b/public/emoji/1f977-1f3fc.svg new file mode 100644 index 0000000000..6c3545e543 --- /dev/null +++ b/public/emoji/1f977-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3fd.svg b/public/emoji/1f977-1f3fd.svg new file mode 100644 index 0000000000..557267b77b --- /dev/null +++ b/public/emoji/1f977-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3fe.svg b/public/emoji/1f977-1f3fe.svg new file mode 100644 index 0000000000..8b65491bf2 --- /dev/null +++ b/public/emoji/1f977-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3ff.svg b/public/emoji/1f977-1f3ff.svg new file mode 100644 index 0000000000..7d32872796 --- /dev/null +++ b/public/emoji/1f977-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977.svg b/public/emoji/1f977.svg new file mode 100644 index 0000000000..84be7d7af4 --- /dev/null +++ b/public/emoji/1f977.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f978.svg b/public/emoji/1f978.svg new file mode 100644 index 0000000000..6d1e4e1132 --- /dev/null +++ b/public/emoji/1f978.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f98a.svg b/public/emoji/1f98a.svg index 13704a415d..2cb2f986df 100644 --- a/public/emoji/1f98a.svg +++ b/public/emoji/1f98a.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f996.svg b/public/emoji/1f996.svg index 64b68d75a8..73b0291cce 100644 --- a/public/emoji/1f996.svg +++ b/public/emoji/1f996.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f997.svg b/public/emoji/1f997.svg index f26413fdd1..6f0476dcc1 100644 --- a/public/emoji/1f997.svg +++ b/public/emoji/1f997.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9a3.svg b/public/emoji/1f9a3.svg new file mode 100644 index 0000000000..1aa87190b9 --- /dev/null +++ b/public/emoji/1f9a3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9a4.svg b/public/emoji/1f9a4.svg new file mode 100644 index 0000000000..1dbac1e317 --- /dev/null +++ b/public/emoji/1f9a4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9ab.svg b/public/emoji/1f9ab.svg new file mode 100644 index 0000000000..7967d67801 --- /dev/null +++ b/public/emoji/1f9ab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9ac.svg b/public/emoji/1f9ac.svg new file mode 100644 index 0000000000..c8156813bd --- /dev/null +++ b/public/emoji/1f9ac.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9ad.svg b/public/emoji/1f9ad.svg new file mode 100644 index 0000000000..6904e81a57 --- /dev/null +++ b/public/emoji/1f9ad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3fb-200d-2640-fe0f.svg index 361bab6acb..e52e0d8d55 100644 --- a/public/emoji/1f9b9-1f3fb-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3fb-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3fb-200d-2642-fe0f.svg index 0b8da862a0..ced012a41d 100644 --- a/public/emoji/1f9b9-1f3fb-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3fb-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3fc-200d-2640-fe0f.svg index f035f13c1d..61c9be883a 100644 --- a/public/emoji/1f9b9-1f3fc-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3fc-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3fc-200d-2642-fe0f.svg index e9ca2e0fc9..67a93de7e3 100644 --- a/public/emoji/1f9b9-1f3fc-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3fc-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3fd-200d-2640-fe0f.svg index 58999ae9af..eeb4f0742a 100644 --- a/public/emoji/1f9b9-1f3fd-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3fd-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3fd-200d-2642-fe0f.svg index e873933f20..091e36b269 100644 --- a/public/emoji/1f9b9-1f3fd-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3fd-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3fe-200d-2640-fe0f.svg index 04120e37a9..463ee894dc 100644 --- a/public/emoji/1f9b9-1f3fe-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3fe-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3fe-200d-2642-fe0f.svg index f7e3d5611c..008a07f12b 100644 --- a/public/emoji/1f9b9-1f3fe-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3fe-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3ff-200d-2640-fe0f.svg index 5dadcd8b6e..a110d6d474 100644 --- a/public/emoji/1f9b9-1f3ff-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3ff-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3ff-200d-2642-fe0f.svg index e5d56cb36c..ec17e3b57a 100644 --- a/public/emoji/1f9b9-1f3ff-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3ff-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-200d-2640-fe0f.svg b/public/emoji/1f9b9-200d-2640-fe0f.svg index 7d6953ea29..97ee771992 100644 --- a/public/emoji/1f9b9-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-200d-2642-fe0f.svg b/public/emoji/1f9b9-200d-2642-fe0f.svg index ed0e66c346..6c20761337 100644 --- a/public/emoji/1f9b9-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9cb.svg b/public/emoji/1f9cb.svg new file mode 100644 index 0000000000..8cb61784dd --- /dev/null +++ b/public/emoji/1f9cb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3fb-200d-2640-fe0f.svg index 77c8b9ba10..37507496e4 100644 --- a/public/emoji/1f9ce-1f3fb-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3fb-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3fb-200d-2642-fe0f.svg index 09e6f4d9b2..97de596dcb 100644 --- a/public/emoji/1f9ce-1f3fb-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3fb-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fb.svg b/public/emoji/1f9ce-1f3fb.svg index 9e269bd2ab..6f97b1b9d1 100644 --- a/public/emoji/1f9ce-1f3fb.svg +++ b/public/emoji/1f9ce-1f3fb.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3fc-200d-2640-fe0f.svg index cf2ca0cc98..ee5bf15aee 100644 --- a/public/emoji/1f9ce-1f3fc-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3fc-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3fc-200d-2642-fe0f.svg index 9bd2fc01dc..e51865777c 100644 --- a/public/emoji/1f9ce-1f3fc-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3fc-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fc.svg b/public/emoji/1f9ce-1f3fc.svg index bdd410e2ef..0977ee6d0a 100644 --- a/public/emoji/1f9ce-1f3fc.svg +++ b/public/emoji/1f9ce-1f3fc.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3fd-200d-2640-fe0f.svg index ed058b9d9d..e210695d55 100644 --- a/public/emoji/1f9ce-1f3fd-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3fd-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3fd-200d-2642-fe0f.svg index 10df60c9b3..269c7cec9e 100644 --- a/public/emoji/1f9ce-1f3fd-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3fd-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fd.svg b/public/emoji/1f9ce-1f3fd.svg index 465db1df1b..7fe4f06eb6 100644 --- a/public/emoji/1f9ce-1f3fd.svg +++ b/public/emoji/1f9ce-1f3fd.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3fe-200d-2640-fe0f.svg index 83206f8d2f..e2b0930981 100644 --- a/public/emoji/1f9ce-1f3fe-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3fe-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3fe-200d-2642-fe0f.svg index fb24b6dfb4..54e4ba95e1 100644 --- a/public/emoji/1f9ce-1f3fe-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3fe-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fe.svg b/public/emoji/1f9ce-1f3fe.svg index e84e1235a1..2f70944a69 100644 --- a/public/emoji/1f9ce-1f3fe.svg +++ b/public/emoji/1f9ce-1f3fe.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3ff-200d-2640-fe0f.svg index 442cb9c498..0f2dc0c415 100644 --- a/public/emoji/1f9ce-1f3ff-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3ff-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3ff-200d-2642-fe0f.svg index aba0cb467f..b51d7ff89d 100644 --- a/public/emoji/1f9ce-1f3ff-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3ff-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3ff.svg b/public/emoji/1f9ce-1f3ff.svg index c07e81fcf4..542a604120 100644 --- a/public/emoji/1f9ce-1f3ff.svg +++ b/public/emoji/1f9ce-1f3ff.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-200d-2640-fe0f.svg b/public/emoji/1f9ce-200d-2640-fe0f.svg index 89c9ff428e..40b5754e18 100644 --- a/public/emoji/1f9ce-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-200d-2642-fe0f.svg b/public/emoji/1f9ce-200d-2642-fe0f.svg index 403d73eb31..1c8ddcd8ad 100644 --- a/public/emoji/1f9ce-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce.svg b/public/emoji/1f9ce.svg index 60fe53792c..86a60cb155 100644 --- a/public/emoji/1f9ce.svg +++ b/public/emoji/1f9ce.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-1f37c.svg b/public/emoji/1f9d1-1f3fb-200d-1f37c.svg new file mode 100644 index 0000000000..624d945f60 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-1f384.svg b/public/emoji/1f9d1-1f3fb-200d-1f384.svg new file mode 100644 index 0000000000..e204d68afd --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg new file mode 100644 index 0000000000..6542ef0898 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg new file mode 100644 index 0000000000..92180dc5a3 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg new file mode 100644 index 0000000000..7672a8360a --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg new file mode 100644 index 0000000000..3a1f8c8d77 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg new file mode 100644 index 0000000000..6b9ed98f51 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg new file mode 100644 index 0000000000..7aa9cfbbed --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg new file mode 100644 index 0000000000..adc94eefa8 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg new file mode 100644 index 0000000000..e9257bf4e1 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-1f37c.svg b/public/emoji/1f9d1-1f3fc-200d-1f37c.svg new file mode 100644 index 0000000000..cd1b853e1e --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-1f384.svg b/public/emoji/1f9d1-1f3fc-200d-1f384.svg new file mode 100644 index 0000000000..c86b6d37bf --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg new file mode 100644 index 0000000000..fc339202da --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg new file mode 100644 index 0000000000..e28ecdf2a2 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg new file mode 100644 index 0000000000..182f55dee2 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg new file mode 100644 index 0000000000..77ad1c25b3 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg new file mode 100644 index 0000000000..d2db4a4fda --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg new file mode 100644 index 0000000000..c5fa071ab5 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg new file mode 100644 index 0000000000..073ed32910 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg new file mode 100644 index 0000000000..330dd09f84 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-1f37c.svg b/public/emoji/1f9d1-1f3fd-200d-1f37c.svg new file mode 100644 index 0000000000..c1d45aa326 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-1f384.svg b/public/emoji/1f9d1-1f3fd-200d-1f384.svg new file mode 100644 index 0000000000..0c60666340 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg new file mode 100644 index 0000000000..338be2186c --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg new file mode 100644 index 0000000000..606aa6c7c6 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg new file mode 100644 index 0000000000..32425140b2 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg new file mode 100644 index 0000000000..c6dc1cab48 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg new file mode 100644 index 0000000000..c7ff545963 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg new file mode 100644 index 0000000000..70f5da4cc2 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg new file mode 100644 index 0000000000..3a1913fa2a --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg new file mode 100644 index 0000000000..7f5f2f0284 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-1f37c.svg b/public/emoji/1f9d1-1f3fe-200d-1f37c.svg new file mode 100644 index 0000000000..a4f6e769c9 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-1f384.svg b/public/emoji/1f9d1-1f3fe-200d-1f384.svg new file mode 100644 index 0000000000..fb94c66c22 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg new file mode 100644 index 0000000000..5c4c22eb28 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg new file mode 100644 index 0000000000..a88fe51967 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg new file mode 100644 index 0000000000..f5305f0d78 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg new file mode 100644 index 0000000000..995b238d12 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg new file mode 100644 index 0000000000..5ee06ffc9a --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg new file mode 100644 index 0000000000..a4056f6138 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg new file mode 100644 index 0000000000..96667d8423 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg new file mode 100644 index 0000000000..e7440744f7 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-1f37c.svg b/public/emoji/1f9d1-1f3ff-200d-1f37c.svg new file mode 100644 index 0000000000..4e75f50f2d --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-1f384.svg b/public/emoji/1f9d1-1f3ff-200d-1f384.svg new file mode 100644 index 0000000000..52121d13f4 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg new file mode 100644 index 0000000000..9c1bd57696 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg new file mode 100644 index 0000000000..2d11a919fb --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg new file mode 100644 index 0000000000..39dc1d9e8c --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg new file mode 100644 index 0000000000..57616f71cd --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg new file mode 100644 index 0000000000..a1895b8922 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg new file mode 100644 index 0000000000..49c9ef267a --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg new file mode 100644 index 0000000000..be650e4014 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg new file mode 100644 index 0000000000..0bed3d534b --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-200d-1f37c.svg b/public/emoji/1f9d1-200d-1f37c.svg new file mode 100644 index 0000000000..f2bf529481 --- /dev/null +++ b/public/emoji/1f9d1-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-200d-1f384.svg b/public/emoji/1f9d1-200d-1f384.svg new file mode 100644 index 0000000000..78bde98eef --- /dev/null +++ b/public/emoji/1f9d1-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3fb-200d-2640-fe0f.svg new file mode 100644 index 0000000000..31109bd466 --- /dev/null +++ b/public/emoji/1f9d4-1f3fb-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3fb-200d-2642-fe0f.svg new file mode 100644 index 0000000000..07e4013668 --- /dev/null +++ b/public/emoji/1f9d4-1f3fb-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3fc-200d-2640-fe0f.svg new file mode 100644 index 0000000000..96acdb542c --- /dev/null +++ b/public/emoji/1f9d4-1f3fc-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3fc-200d-2642-fe0f.svg new file mode 100644 index 0000000000..168fa82bad --- /dev/null +++ b/public/emoji/1f9d4-1f3fc-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3fd-200d-2640-fe0f.svg new file mode 100644 index 0000000000..9fb7aeaf85 --- /dev/null +++ b/public/emoji/1f9d4-1f3fd-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3fd-200d-2642-fe0f.svg new file mode 100644 index 0000000000..01e9365992 --- /dev/null +++ b/public/emoji/1f9d4-1f3fd-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3fe-200d-2640-fe0f.svg new file mode 100644 index 0000000000..489e27951d --- /dev/null +++ b/public/emoji/1f9d4-1f3fe-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3fe-200d-2642-fe0f.svg new file mode 100644 index 0000000000..27a6f756a3 --- /dev/null +++ b/public/emoji/1f9d4-1f3fe-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3ff-200d-2640-fe0f.svg new file mode 100644 index 0000000000..31f829155d --- /dev/null +++ b/public/emoji/1f9d4-1f3ff-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3ff-200d-2642-fe0f.svg new file mode 100644 index 0000000000..34a7f5e279 --- /dev/null +++ b/public/emoji/1f9d4-1f3ff-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-200d-2640-fe0f.svg b/public/emoji/1f9d4-200d-2640-fe0f.svg new file mode 100644 index 0000000000..08af35c5b0 --- /dev/null +++ b/public/emoji/1f9d4-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-200d-2642-fe0f.svg b/public/emoji/1f9d4-200d-2642-fe0f.svg new file mode 100644 index 0000000000..fcd2cdf084 --- /dev/null +++ b/public/emoji/1f9d4-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9e1.svg b/public/emoji/1f9e1.svg index 26ae9e7dad..0e61b14855 100644 --- a/public/emoji/1f9e1.svg +++ b/public/emoji/1f9e1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9e9.svg b/public/emoji/1f9e9.svg index 1505f68466..ae4bf56681 100644 --- a/public/emoji/1f9e9.svg +++ b/public/emoji/1f9e9.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1fa74.svg b/public/emoji/1fa74.svg new file mode 100644 index 0000000000..585265a407 --- /dev/null +++ b/public/emoji/1fa74.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa83.svg b/public/emoji/1fa83.svg new file mode 100644 index 0000000000..3de58a8f2c --- /dev/null +++ b/public/emoji/1fa83.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa84.svg b/public/emoji/1fa84.svg new file mode 100644 index 0000000000..988c798884 --- /dev/null +++ b/public/emoji/1fa84.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa85.svg b/public/emoji/1fa85.svg new file mode 100644 index 0000000000..a6b0f60261 --- /dev/null +++ b/public/emoji/1fa85.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa86.svg b/public/emoji/1fa86.svg new file mode 100644 index 0000000000..fca9a3c814 --- /dev/null +++ b/public/emoji/1fa86.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa96.svg b/public/emoji/1fa96.svg new file mode 100644 index 0000000000..462cbf5ee4 --- /dev/null +++ b/public/emoji/1fa96.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa97.svg b/public/emoji/1fa97.svg new file mode 100644 index 0000000000..c9c21ca2a2 --- /dev/null +++ b/public/emoji/1fa97.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa98.svg b/public/emoji/1fa98.svg new file mode 100644 index 0000000000..fa316b1253 --- /dev/null +++ b/public/emoji/1fa98.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa99.svg b/public/emoji/1fa99.svg new file mode 100644 index 0000000000..04944697a8 --- /dev/null +++ b/public/emoji/1fa99.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9a.svg b/public/emoji/1fa9a.svg new file mode 100644 index 0000000000..f33a04826c --- /dev/null +++ b/public/emoji/1fa9a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9b.svg b/public/emoji/1fa9b.svg new file mode 100644 index 0000000000..d0b988f661 --- /dev/null +++ b/public/emoji/1fa9b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9c.svg b/public/emoji/1fa9c.svg new file mode 100644 index 0000000000..cd3b979edc --- /dev/null +++ b/public/emoji/1fa9c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9d.svg b/public/emoji/1fa9d.svg new file mode 100644 index 0000000000..923a96de2f --- /dev/null +++ b/public/emoji/1fa9d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9e.svg b/public/emoji/1fa9e.svg new file mode 100644 index 0000000000..b263f10bc8 --- /dev/null +++ b/public/emoji/1fa9e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9f.svg b/public/emoji/1fa9f.svg new file mode 100644 index 0000000000..8daaad668c --- /dev/null +++ b/public/emoji/1fa9f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa0.svg b/public/emoji/1faa0.svg new file mode 100644 index 0000000000..f5422d9601 --- /dev/null +++ b/public/emoji/1faa0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa1.svg b/public/emoji/1faa1.svg new file mode 100644 index 0000000000..a99cb160d5 --- /dev/null +++ b/public/emoji/1faa1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa2.svg b/public/emoji/1faa2.svg new file mode 100644 index 0000000000..fd6a64c1c1 --- /dev/null +++ b/public/emoji/1faa2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa3.svg b/public/emoji/1faa3.svg new file mode 100644 index 0000000000..7be64da1dc --- /dev/null +++ b/public/emoji/1faa3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa4.svg b/public/emoji/1faa4.svg new file mode 100644 index 0000000000..a680fb7065 --- /dev/null +++ b/public/emoji/1faa4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa5.svg b/public/emoji/1faa5.svg new file mode 100644 index 0000000000..9c9e617794 --- /dev/null +++ b/public/emoji/1faa5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa6.svg b/public/emoji/1faa6.svg new file mode 100644 index 0000000000..f4f3a89ed6 --- /dev/null +++ b/public/emoji/1faa6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa7.svg b/public/emoji/1faa7.svg new file mode 100644 index 0000000000..ac1646ba4f --- /dev/null +++ b/public/emoji/1faa7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa8.svg b/public/emoji/1faa8.svg new file mode 100644 index 0000000000..361fc032dd --- /dev/null +++ b/public/emoji/1faa8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab0.svg b/public/emoji/1fab0.svg new file mode 100644 index 0000000000..4b13d7e77a --- /dev/null +++ b/public/emoji/1fab0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab1.svg b/public/emoji/1fab1.svg new file mode 100644 index 0000000000..1bc9b9a907 --- /dev/null +++ b/public/emoji/1fab1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab2.svg b/public/emoji/1fab2.svg new file mode 100644 index 0000000000..57fd4bfab8 --- /dev/null +++ b/public/emoji/1fab2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab3.svg b/public/emoji/1fab3.svg new file mode 100644 index 0000000000..f8c8d7879e --- /dev/null +++ b/public/emoji/1fab3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab4.svg b/public/emoji/1fab4.svg new file mode 100644 index 0000000000..92f1547bac --- /dev/null +++ b/public/emoji/1fab4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab5.svg b/public/emoji/1fab5.svg new file mode 100644 index 0000000000..981dd2d1a1 --- /dev/null +++ b/public/emoji/1fab5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab6.svg b/public/emoji/1fab6.svg new file mode 100644 index 0000000000..8e70d6cd5c --- /dev/null +++ b/public/emoji/1fab6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fac0.svg b/public/emoji/1fac0.svg new file mode 100644 index 0000000000..e6916d2756 --- /dev/null +++ b/public/emoji/1fac0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fac1.svg b/public/emoji/1fac1.svg new file mode 100644 index 0000000000..cfdf72f1fe --- /dev/null +++ b/public/emoji/1fac1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fac2.svg b/public/emoji/1fac2.svg new file mode 100644 index 0000000000..5c0413cd5e --- /dev/null +++ b/public/emoji/1fac2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad0.svg b/public/emoji/1fad0.svg new file mode 100644 index 0000000000..34e68d6b49 --- /dev/null +++ b/public/emoji/1fad0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad1.svg b/public/emoji/1fad1.svg new file mode 100644 index 0000000000..b0d5242704 --- /dev/null +++ b/public/emoji/1fad1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad2.svg b/public/emoji/1fad2.svg new file mode 100644 index 0000000000..b84ce6a1f4 --- /dev/null +++ b/public/emoji/1fad2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad3.svg b/public/emoji/1fad3.svg new file mode 100644 index 0000000000..25c1842d3f --- /dev/null +++ b/public/emoji/1fad3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad4.svg b/public/emoji/1fad4.svg new file mode 100644 index 0000000000..34a6215a87 --- /dev/null +++ b/public/emoji/1fad4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad5.svg b/public/emoji/1fad5.svg new file mode 100644 index 0000000000..1133788dfe --- /dev/null +++ b/public/emoji/1fad5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad6.svg b/public/emoji/1fad6.svg new file mode 100644 index 0000000000..9e6894dafe --- /dev/null +++ b/public/emoji/1fad6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/2694.svg b/public/emoji/2694.svg index 3cf2fa46c0..325b85f12e 100644 --- a/public/emoji/2694.svg +++ b/public/emoji/2694.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/2764-fe0f-200d-1f525.svg b/public/emoji/2764-fe0f-200d-1f525.svg new file mode 100644 index 0000000000..298dd0e155 --- /dev/null +++ b/public/emoji/2764-fe0f-200d-1f525.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/2764-fe0f-200d-1fa79.svg b/public/emoji/2764-fe0f-200d-1fa79.svg new file mode 100644 index 0000000000..a7a38bd14c --- /dev/null +++ b/public/emoji/2764-fe0f-200d-1fa79.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/sheet_10.png b/public/emoji/sheet_10.png deleted file mode 100644 index 3ee92a1f10..0000000000 Binary files a/public/emoji/sheet_10.png and /dev/null differ diff --git a/public/emoji/sheet_13.png b/public/emoji/sheet_13.png new file mode 100644 index 0000000000..1ba12b6191 Binary files /dev/null and b/public/emoji/sheet_13.png differ diff --git a/scalingo.json b/scalingo.json index 324356df0c..51d9b5b9f5 100644 --- a/scalingo.json +++ b/scalingo.json @@ -1,8 +1,8 @@ { "name": "Mastodon", "description": "A GNU Social-compatible microblogging server", - "repository": "https://github.com/tootsuite/mastodon", - "logo": "https://github.com/tootsuite.png", + "repository": "https://github.com/mastodon/mastodon", + "logo": "https://github.com/mastodon.png", "env": { "LOCAL_DOMAIN": { "description": "The domain that your Mastodon instance will run on (this can be appname.scalingo.io or a custom domain)", diff --git a/spec/controllers/accounts_controller_spec.rb b/spec/controllers/accounts_controller_spec.rb index f7d0b1af54..73d1240291 100644 --- a/spec/controllers/accounts_controller_spec.rb +++ b/spec/controllers/accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe AccountsController, type: :controller do render_views - let(:account) { Fabricate(:user).account } + let(:account) { Fabricate(:account) } shared_examples 'cachable response' do it 'does not set cookies' do @@ -35,6 +35,7 @@ RSpec.describe AccountsController, type: :controller do before do status_media.media_attachments << Fabricate(:media_attachment, account: account, type: :image) account.pinned_statuses << status_pinned + account.pinned_statuses << status_private end shared_examples 'preliminary checks' do @@ -370,7 +371,7 @@ RSpec.describe AccountsController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it_behaves_like 'cachable response' @@ -402,7 +403,7 @@ RSpec.describe AccountsController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns public Cache-Control header' do @@ -428,7 +429,7 @@ RSpec.describe AccountsController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it_behaves_like 'cachable response' @@ -446,7 +447,7 @@ RSpec.describe AccountsController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns private Cache-Control header' do diff --git a/spec/controllers/activitypub/collections_controller_spec.rb b/spec/controllers/activitypub/collections_controller_spec.rb index ac661e5e1d..21a0339458 100644 --- a/spec/controllers/activitypub/collections_controller_spec.rb +++ b/spec/controllers/activitypub/collections_controller_spec.rb @@ -4,6 +4,7 @@ require 'rails_helper' RSpec.describe ActivityPub::CollectionsController, type: :controller do let!(:account) { Fabricate(:account) } + let!(:private_pinned) { Fabricate(:status, account: account, text: 'secret private stuff', visibility: :private) } let(:remote_account) { nil } shared_examples 'cachable response' do @@ -27,6 +28,7 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do Fabricate(:status_pin, account: account) Fabricate(:status_pin, account: account) + Fabricate(:status_pin, account: account, status: private_pinned) Fabricate(:status, account: account, visibility: :private) end @@ -43,14 +45,22 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it_behaves_like 'cachable response' it 'returns orderedItems with pinned statuses' do expect(body[:orderedItems]).to be_an Array - expect(body[:orderedItems].size).to eq 2 + expect(body[:orderedItems].size).to eq 3 + end + + it 'includes URI of private pinned status' do + expect(body[:orderedItems]).to include(ActivityPub::TagManager.instance.uri_for(private_pinned)) + end + + it 'does not include contents of private pinned status' do + expect(response.body).not_to include(private_pinned.text) end context 'when account is permanently suspended' do @@ -88,7 +98,7 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it_behaves_like 'cachable response' @@ -96,7 +106,16 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do it 'returns orderedItems with pinned statuses' do json = body_as_json expect(json[:orderedItems]).to be_an Array - expect(json[:orderedItems].size).to eq 2 + expect(json[:orderedItems].size).to eq 3 + end + + it 'includes URI of private pinned status' do + json = body_as_json + expect(json[:orderedItems]).to include(ActivityPub::TagManager.instance.uri_for(private_pinned)) + end + + it 'does not include contents of private pinned status' do + expect(response.body).not_to include(private_pinned.text) end end @@ -116,7 +135,7 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns private Cache-Control header' do @@ -141,7 +160,7 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns private Cache-Control header' do diff --git a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb index 88f4554c2d..3a382ff27e 100644 --- a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb +++ b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb @@ -5,11 +5,13 @@ RSpec.describe ActivityPub::FollowersSynchronizationsController, type: :controll let!(:follower_1) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/users/a') } let!(:follower_2) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/users/b') } let!(:follower_3) { Fabricate(:account, domain: 'foo.com', uri: 'https://foo.com/users/a') } + let!(:follower_4) { Fabricate(:account, username: 'instance-actor', domain: 'example.com', uri: 'https://example.com') } before do follower_1.follow!(account) follower_2.follow!(account) follower_3.follow!(account) + follower_4.follow!(account) end before do @@ -40,12 +42,12 @@ RSpec.describe ActivityPub::FollowersSynchronizationsController, type: :controll end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns orderedItems with followers from example.com' do expect(body[:orderedItems]).to be_an Array - expect(body[:orderedItems].sort).to eq [follower_1.uri, follower_2.uri] + expect(body[:orderedItems].sort).to eq [follower_4.uri, follower_1.uri, follower_2.uri] end it 'returns private Cache-Control header' do diff --git a/spec/controllers/activitypub/outboxes_controller_spec.rb b/spec/controllers/activitypub/outboxes_controller_spec.rb index 84e3a89560..1722690db1 100644 --- a/spec/controllers/activitypub/outboxes_controller_spec.rb +++ b/spec/controllers/activitypub/outboxes_controller_spec.rb @@ -46,7 +46,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns totalItems' do @@ -55,6 +55,10 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do it_behaves_like 'cachable response' + it 'does not have a Vary header' do + expect(response.headers['Vary']).to be_nil + end + context 'when account is permanently suspended' do before do account.suspend! @@ -85,7 +89,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns orderedItems with public or unlisted statuses' do @@ -96,6 +100,10 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do it_behaves_like 'cachable response' + it 'returns Vary header with Signature' do + expect(response.headers['Vary']).to include 'Signature' + end + context 'when account is permanently suspended' do before do account.suspend! @@ -133,7 +141,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns orderedItems with public or unlisted statuses' do @@ -144,7 +152,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns private Cache-Control header' do - expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.headers['Cache-Control']).to eq 'max-age=60, private' end end @@ -159,7 +167,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns orderedItems with private statuses' do @@ -170,7 +178,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns private Cache-Control header' do - expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.headers['Cache-Control']).to eq 'max-age=60, private' end end @@ -185,7 +193,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns empty orderedItems' do @@ -195,7 +203,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns private Cache-Control header' do - expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.headers['Cache-Control']).to eq 'max-age=60, private' end end @@ -210,7 +218,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it 'returns empty orderedItems' do @@ -220,7 +228,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns private Cache-Control header' do - expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.headers['Cache-Control']).to eq 'max-age=60, private' end end end diff --git a/spec/controllers/activitypub/replies_controller_spec.rb b/spec/controllers/activitypub/replies_controller_spec.rb index 2502597528..bf82fd0207 100644 --- a/spec/controllers/activitypub/replies_controller_spec.rb +++ b/spec/controllers/activitypub/replies_controller_spec.rb @@ -73,7 +73,7 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it_behaves_like 'cachable response' @@ -120,7 +120,7 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do end it 'returns application/activity+json' do - expect(response.content_type).to eq 'application/activity+json' + expect(response.media_type).to eq 'application/activity+json' end it_behaves_like 'cachable response' diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index 608606ff90..0f71d697cd 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -21,12 +21,9 @@ RSpec.describe Admin::AccountsController, type: :controller do expect(AccountFilter).to receive(:new) do |params| h = params.to_h - expect(h[:local]).to eq '1' - expect(h[:remote]).to eq '1' + expect(h[:origin]).to eq 'local' expect(h[:by_domain]).to eq 'domain' - expect(h[:active]).to eq '1' - expect(h[:silenced]).to eq '1' - expect(h[:suspended]).to eq '1' + expect(h[:status]).to eq 'active' expect(h[:username]).to eq 'username' expect(h[:display_name]).to eq 'display name' expect(h[:email]).to eq 'local-part@domain' @@ -36,12 +33,9 @@ RSpec.describe Admin::AccountsController, type: :controller do end get :index, params: { - local: '1', - remote: '1', + origin: 'local', by_domain: 'domain', - active: '1', - silenced: '1', - suspended: '1', + status: 'active', username: 'username', display_name: 'display name', email: 'local-part@domain', @@ -67,7 +61,7 @@ RSpec.describe Admin::AccountsController, type: :controller do describe 'GET #show' do let(:current_user) { Fabricate(:user, admin: true) } - let(:account) { Fabricate(:account, username: 'bob') } + let(:account) { Fabricate(:account) } it 'returns http success' do get :show, params: { id: account.id } @@ -79,7 +73,7 @@ RSpec.describe Admin::AccountsController, type: :controller do subject { post :memorialize, params: { id: account.id } } let(:current_user) { Fabricate(:user, admin: current_user_admin) } - let(:account) { Fabricate(:account, user: user) } + let(:account) { user.account } let(:user) { Fabricate(:user, admin: target_user_admin) } context 'when user is admin' do @@ -131,7 +125,7 @@ RSpec.describe Admin::AccountsController, type: :controller do subject { post :enable, params: { id: account.id } } let(:current_user) { Fabricate(:user, admin: admin) } - let(:account) { Fabricate(:account, user: user) } + let(:account) { user.account } let(:user) { Fabricate(:user, disabled: true) } context 'when user is admin' do @@ -198,4 +192,36 @@ RSpec.describe Admin::AccountsController, type: :controller do end end end + + describe 'POST #unblock_email' do + subject do + -> { post :unblock_email, params: { id: account.id } } + end + + let(:current_user) { Fabricate(:user, admin: admin) } + let(:account) { Fabricate(:account, suspended: true) } + let!(:email_block) { Fabricate(:canonical_email_block, reference_account: account) } + + context 'when user is admin' do + let(:admin) { true } + + it 'succeeds in removing email blocks' do + is_expected.to change { CanonicalEmailBlock.where(reference_account: account).count }.from(1).to(0) + end + + it 'redirects to admin account path' do + subject.call + expect(response).to redirect_to admin_account_path(account.id) + end + end + + context 'when user is not admin' do + let(:admin) { false } + + it 'fails to remove avatar' do + subject.call + expect(response).to have_http_status :forbidden + end + end + end end diff --git a/spec/controllers/admin/change_email_controller_spec.rb b/spec/controllers/admin/change_email_controller_spec.rb index 31df0f0fce..e7f3f7c97d 100644 --- a/spec/controllers/admin/change_email_controller_spec.rb +++ b/spec/controllers/admin/change_email_controller_spec.rb @@ -11,10 +11,9 @@ RSpec.describe Admin::ChangeEmailsController, type: :controller do describe "GET #show" do it "returns http success" do - account = Fabricate(:account) - user = Fabricate(:user, account: account) + user = Fabricate(:user) - get :show, params: { account_id: account.id } + get :show, params: { account_id: user.account.id } expect(response).to have_http_status(200) end @@ -26,12 +25,11 @@ RSpec.describe Admin::ChangeEmailsController, type: :controller do end it "returns http success" do - account = Fabricate(:account) - user = Fabricate(:user, account: account) + user = Fabricate(:user) previous_email = user.email - post :update, params: { account_id: account.id, user: { unconfirmed_email: 'test@example.com' } } + post :update, params: { account_id: user.account.id, user: { unconfirmed_email: 'test@example.com' } } user.reload @@ -41,7 +39,7 @@ RSpec.describe Admin::ChangeEmailsController, type: :controller do expect(UserMailer).to have_received(:confirmation_instructions).with(user, user.confirmation_token, { to: 'test@example.com' }) - expect(response).to redirect_to(admin_account_path(account.id)) + expect(response).to redirect_to(admin_account_path(user.account.id)) end end end diff --git a/spec/controllers/admin/confirmations_controller_spec.rb b/spec/controllers/admin/confirmations_controller_spec.rb index eec2b2f5c4..5b4f7e925c 100644 --- a/spec/controllers/admin/confirmations_controller_spec.rb +++ b/spec/controllers/admin/confirmations_controller_spec.rb @@ -9,9 +9,8 @@ RSpec.describe Admin::ConfirmationsController, type: :controller do describe 'POST #create' do it 'confirms the user' do - account = Fabricate(:account) - user = Fabricate(:user, confirmed_at: false, account: account) - post :create, params: { account_id: account.id } + user = Fabricate(:user, confirmed_at: false) + post :create, params: { account_id: user.account.id } expect(response).to redirect_to(admin_accounts_path) expect(user.reload).to be_confirmed @@ -32,10 +31,9 @@ RSpec.describe Admin::ConfirmationsController, type: :controller do end describe 'POST #resernd' do - subject { post :resend, params: { account_id: account.id } } + subject { post :resend, params: { account_id: user.account.id } } - let(:account) { Fabricate(:account) } - let!(:user) { Fabricate(:user, confirmed_at: confirmed_at, account: account) } + let!(:user) { Fabricate(:user, confirmed_at: confirmed_at) } before do allow(UserMailer).to receive(:confirmation_instructions) { double(:email, deliver_later: nil) } diff --git a/spec/controllers/admin/dashboard_controller_spec.rb b/spec/controllers/admin/dashboard_controller_spec.rb index 73b50e7218..7824854f9c 100644 --- a/spec/controllers/admin/dashboard_controller_spec.rb +++ b/spec/controllers/admin/dashboard_controller_spec.rb @@ -3,9 +3,19 @@ require 'rails_helper' describe Admin::DashboardController, type: :controller do + render_views + describe 'GET #index' do - it 'returns 200' do + before do + allow(Admin::SystemCheck).to receive(:perform).and_return([ + Admin::SystemCheck::Message.new(:database_schema_check), + Admin::SystemCheck::Message.new(:rules_check, nil, admin_rules_path), + Admin::SystemCheck::Message.new(:sidekiq_process_check, 'foo, bar'), + ]) sign_in Fabricate(:user, admin: true) + end + + it 'returns 200' do get :index expect(response).to have_http_status(200) diff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb index 8c0b309f2a..53427b8748 100644 --- a/spec/controllers/admin/instances_controller_spec.rb +++ b/spec/controllers/admin/instances_controller_spec.rb @@ -3,8 +3,14 @@ require 'rails_helper' RSpec.describe Admin::InstancesController, type: :controller do render_views + let(:current_user) { Fabricate(:user, admin: true) } + + let!(:account) { Fabricate(:account, domain: 'popular') } + let!(:account2) { Fabricate(:account, domain: 'popular') } + let!(:account3) { Fabricate(:account, domain: 'less.popular') } + before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in current_user, scope: :user end describe 'GET #index' do @@ -16,10 +22,6 @@ RSpec.describe Admin::InstancesController, type: :controller do end it 'renders instances' do - Fabricate(:account, domain: 'popular') - Fabricate(:account, domain: 'popular') - Fabricate(:account, domain: 'less.popular') - get :index, params: { page: 2 } instances = assigns(:instances).to_a @@ -29,4 +31,27 @@ RSpec.describe Admin::InstancesController, type: :controller do expect(response).to have_http_status(200) end end + + describe 'DELETE #destroy' do + subject { delete :destroy, params: { id: Instance.first.id } } + + let(:current_user) { Fabricate(:user, admin: admin) } + let(:account) { Fabricate(:account) } + + context 'when user is admin' do + let(:admin) { true } + + it 'succeeds in purging instance' do + is_expected.to redirect_to admin_instances_path + end + end + + context 'when user is not admin' do + let(:admin) { false } + + it 'fails to purge instance' do + is_expected.to have_http_status :forbidden + end + end + end end diff --git a/spec/controllers/admin/report_notes_controller_spec.rb b/spec/controllers/admin/report_notes_controller_spec.rb index ec5872c7d2..c0013f41ae 100644 --- a/spec/controllers/admin/report_notes_controller_spec.rb +++ b/spec/controllers/admin/report_notes_controller_spec.rb @@ -12,11 +12,11 @@ describe Admin::ReportNotesController do describe 'POST #create' do subject { post :create, params: params } - let(:report) { Fabricate(:report, action_taken: action_taken, action_taken_by_account_id: account_id) } + let(:report) { Fabricate(:report, action_taken_at: action_taken, action_taken_by_account_id: account_id) } context 'when parameter is valid' do context 'when report is unsolved' do - let(:action_taken) { false } + let(:action_taken) { nil } let(:account_id) { nil } context 'when create_and_resolve flag is on' do @@ -41,7 +41,7 @@ describe Admin::ReportNotesController do end context 'when report is resolved' do - let(:action_taken) { true } + let(:action_taken) { Time.now.utc } let(:account_id) { user.account.id } context 'when create_and_unresolve flag is on' do @@ -68,7 +68,7 @@ describe Admin::ReportNotesController do context 'when parameter is invalid' do let(:params) { { report_note: { content: '', report_id: report.id } } } - let(:action_taken) { false } + let(:action_taken) { nil } let(:account_id) { nil } it 'renders admin/reports/show' do diff --git a/spec/controllers/admin/reported_statuses_controller_spec.rb b/spec/controllers/admin/reported_statuses_controller_spec.rb deleted file mode 100644 index 2a1598123c..0000000000 --- a/spec/controllers/admin/reported_statuses_controller_spec.rb +++ /dev/null @@ -1,59 +0,0 @@ -require 'rails_helper' - -describe Admin::ReportedStatusesController do - render_views - - let(:user) { Fabricate(:user, admin: true) } - let(:report) { Fabricate(:report, status_ids: [status.id]) } - let(:status) { Fabricate(:status) } - - before do - sign_in user, scope: :user - end - - describe 'POST #create' do - subject do - -> { post :create, params: { :report_id => report, action => '', :form_status_batch => { status_ids: status_ids } } } - end - - let(:action) { 'nsfw_on' } - let(:status_ids) { [status.id] } - let(:status) { Fabricate(:status, sensitive: !sensitive) } - let(:sensitive) { true } - let!(:media_attachment) { Fabricate(:media_attachment, status: status) } - - context 'when action is nsfw_on' do - it 'updates sensitive column' do - is_expected.to change { - status.reload.sensitive - }.from(false).to(true) - end - end - - context 'when action is nsfw_off' do - let(:action) { 'nsfw_off' } - let(:sensitive) { false } - - it 'updates sensitive column' do - is_expected.to change { - status.reload.sensitive - }.from(true).to(false) - end - end - - context 'when action is delete' do - let(:action) { 'delete' } - - it 'removes a status' do - allow(RemovalWorker).to receive(:perform_async) - subject.call - expect(RemovalWorker).to have_received(:perform_async).with(status_ids.first, immediate: true) - end - end - - it 'redirects to report page' do - subject.call - expect(response).to redirect_to(admin_report_path(report)) - end - end -end diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb index 49d3e97074..d421f0739c 100644 --- a/spec/controllers/admin/reports_controller_spec.rb +++ b/spec/controllers/admin/reports_controller_spec.rb @@ -10,8 +10,8 @@ describe Admin::ReportsController do describe 'GET #index' do it 'returns http success with no filters' do - specified = Fabricate(:report, action_taken: false) - Fabricate(:report, action_taken: true) + specified = Fabricate(:report, action_taken_at: nil) + Fabricate(:report, action_taken_at: Time.now.utc) get :index @@ -22,10 +22,10 @@ describe Admin::ReportsController do end it 'returns http success with resolved filter' do - specified = Fabricate(:report, action_taken: true) - Fabricate(:report, action_taken: false) + specified = Fabricate(:report, action_taken_at: Time.now.utc) + Fabricate(:report, action_taken_at: nil) - get :index, params: { resolved: 1 } + get :index, params: { resolved: '1' } reports = assigns(:reports).to_a expect(reports.size).to eq 1 @@ -54,15 +54,7 @@ describe Admin::ReportsController do expect(response).to redirect_to(admin_reports_path) report.reload expect(report.action_taken_by_account).to eq user.account - expect(report.action_taken).to eq true - end - - it 'sets trust level when the report is an antispam one' do - report = Fabricate(:report, account: Account.representative) - - put :resolve, params: { id: report } - report.reload - expect(report.target_account.trust_level).to eq Account::TRUST_LEVELS[:trusted] + expect(report.action_taken?).to eq true end end @@ -74,7 +66,7 @@ describe Admin::ReportsController do expect(response).to redirect_to(admin_report_path(report)) report.reload expect(report.action_taken_by_account).to eq nil - expect(report.action_taken).to eq false + expect(report.action_taken?).to eq false end end diff --git a/spec/controllers/admin/resets_controller_spec.rb b/spec/controllers/admin/resets_controller_spec.rb index a20a460bd0..28510b5afb 100644 --- a/spec/controllers/admin/resets_controller_spec.rb +++ b/spec/controllers/admin/resets_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Admin::ResetsController do render_views - let(:account) { Fabricate(:account, user: Fabricate(:user)) } + let(:account) { Fabricate(:account) } before do sign_in Fabricate(:user, admin: true), scope: :user end @@ -16,7 +16,7 @@ describe Admin::ResetsController do post :create, params: { account_id: account.id } - expect(response).to redirect_to(admin_accounts_path) + expect(response).to redirect_to(admin_account_path(account.id)) end end end diff --git a/spec/controllers/admin/statuses_controller_spec.rb b/spec/controllers/admin/statuses_controller_spec.rb index d9690d83f2..de32fd18e1 100644 --- a/spec/controllers/admin/statuses_controller_spec.rb +++ b/spec/controllers/admin/statuses_controller_spec.rb @@ -8,6 +8,9 @@ describe Admin::StatusesController do let!(:status) { Fabricate(:status, account: account) } let(:media_attached_status) { Fabricate(:status, account: account, sensitive: !sensitive) } let!(:media_attachment) { Fabricate(:media_attachment, account: account, status: media_attached_status) } + let(:last_media_attached_status) { Fabricate(:status, account: account, sensitive: !sensitive) } + let!(:last_media_attachment) { Fabricate(:media_attachment, account: account, status: last_media_attached_status) } + let!(:last_status) { Fabricate(:status, account: account) } let(:sensitive) { true } before do @@ -15,63 +18,46 @@ describe Admin::StatusesController do end describe 'GET #index' do - it 'returns http success with no media' do - get :index, params: { account_id: account.id } + context do + before do + get :index, params: { account_id: account.id } + end - statuses = assigns(:statuses).to_a - expect(statuses.size).to eq 2 - expect(response).to have_http_status(200) + it 'returns http success' do + expect(response).to have_http_status(200) + end end - it 'returns http success with media' do - get :index, params: { account_id: account.id, media: true } + context 'filtering by media' do + before do + get :index, params: { account_id: account.id, media: '1' } + end - statuses = assigns(:statuses).to_a - expect(statuses.size).to eq 1 - expect(response).to have_http_status(200) + it 'returns http success' do + expect(response).to have_http_status(200) + end end end - describe 'POST #create' do - subject do - -> { post :create, params: { :account_id => account.id, action => '', :form_status_batch => { status_ids: status_ids } } } + describe 'POST #batch' do + before do + post :batch, params: { :account_id => account.id, action => '', :admin_status_batch_action => { status_ids: status_ids } } end - let(:action) { 'nsfw_on' } let(:status_ids) { [media_attached_status.id] } - context 'when action is nsfw_on' do - it 'updates sensitive column' do - is_expected.to change { - media_attached_status.reload.sensitive - }.from(false).to(true) + context 'when action is report' do + let(:action) { 'report' } + + it 'creates a report' do + report = Report.last + expect(report.target_account_id).to eq account.id + expect(report.status_ids).to eq status_ids end - end - context 'when action is nsfw_off' do - let(:action) { 'nsfw_off' } - let(:sensitive) { false } - - it 'updates sensitive column' do - is_expected.to change { - media_attached_status.reload.sensitive - }.from(true).to(false) + it 'redirects to report page' do + expect(response).to redirect_to(admin_report_path(Report.last.id)) end end - - context 'when action is delete' do - let(:action) { 'delete' } - - it 'removes a status' do - allow(RemovalWorker).to receive(:perform_async) - subject.call - expect(RemovalWorker).to have_received(:perform_async).with(status_ids.first, immediate: true) - end - end - - it 'redirects to account statuses page' do - subject.call - expect(response).to redirect_to(admin_account_statuses_path(account.id)) - end end end diff --git a/spec/controllers/admin/tags_controller_spec.rb b/spec/controllers/admin/tags_controller_spec.rb index 5c1944fc77..85c801a9c7 100644 --- a/spec/controllers/admin/tags_controller_spec.rb +++ b/spec/controllers/admin/tags_controller_spec.rb @@ -9,11 +9,11 @@ RSpec.describe Admin::TagsController, type: :controller do sign_in Fabricate(:user, admin: true) end - describe 'GET #index' do + describe 'GET #show' do let!(:tag) { Fabricate(:tag) } before do - get :index + get :show, params: { id: tag.id } end it 'returns status 200' do diff --git a/spec/controllers/admin/two_factor_authentications_controller_spec.rb b/spec/controllers/admin/two_factor_authentications_controller_spec.rb index b0e82d3d66..c650957290 100644 --- a/spec/controllers/admin/two_factor_authentications_controller_spec.rb +++ b/spec/controllers/admin/two_factor_authentications_controller_spec.rb @@ -15,12 +15,12 @@ describe Admin::TwoFactorAuthenticationsController do user.update(otp_required_for_login: true) end - it 'redirects to admin accounts page' do + it 'redirects to admin account page' do delete :destroy, params: { user_id: user.id } user.reload expect(user.otp_enabled?).to eq false - expect(response).to redirect_to(admin_accounts_path) + expect(response).to redirect_to(admin_account_path(user.account_id)) end end @@ -38,13 +38,13 @@ describe Admin::TwoFactorAuthenticationsController do nickname: 'Security Key') end - it 'redirects to admin accounts page' do + it 'redirects to admin account page' do delete :destroy, params: { user_id: user.id } user.reload expect(user.otp_enabled?).to eq false expect(user.webauthn_enabled?).to eq false - expect(response).to redirect_to(admin_accounts_path) + expect(response).to redirect_to(admin_account_path(user.account_id)) end end end diff --git a/spec/controllers/api/base_controller_spec.rb b/spec/controllers/api/base_controller_spec.rb index 05a42d1c19..c286b8cbfc 100644 --- a/spec/controllers/api/base_controller_spec.rb +++ b/spec/controllers/api/base_controller_spec.rb @@ -28,7 +28,7 @@ describe Api::BaseController do end describe 'non-functional accounts handling' do - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } controller do diff --git a/spec/controllers/api/proofs_controller_spec.rb b/spec/controllers/api/proofs_controller_spec.rb deleted file mode 100644 index 2fe6150052..0000000000 --- a/spec/controllers/api/proofs_controller_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require 'rails_helper' - -describe Api::ProofsController do - let(:alice) { Fabricate(:account, username: 'alice') } - - before do - stub_request(:get, 'https://keybase.io/_/api/1.0/sig/proof_valid.json?domain=cb6e6126.ngrok.io&kb_username=crypto_alice&sig_hash=111111111111111111111111111111111111111111111111111111111111111111&username=alice').to_return(status: 200, body: '{"proof_valid":true,"proof_live":false}') - stub_request(:get, 'https://keybase.io/_/api/1.0/sig/proof_live.json?domain=cb6e6126.ngrok.io&kb_username=crypto_alice&sig_hash=111111111111111111111111111111111111111111111111111111111111111111&username=alice').to_return(status: 200, body: '{"proof_valid":true,"proof_live":true}') - stub_request(:get, 'https://keybase.io/_/api/1.0/sig/proof_valid.json?domain=cb6e6126.ngrok.io&kb_username=hidden_alice&sig_hash=222222222222222222222222222222222222222222222222222222222222222222&username=alice').to_return(status: 200, body: '{"proof_valid":true,"proof_live":true}') - stub_request(:get, 'https://keybase.io/_/api/1.0/sig/proof_live.json?domain=cb6e6126.ngrok.io&kb_username=hidden_alice&sig_hash=222222222222222222222222222222222222222222222222222222222222222222&username=alice').to_return(status: 200, body: '{"proof_valid":true,"proof_live":true}') - end - - describe 'GET #index' do - describe 'with a non-existent username' do - it '404s' do - get :index, params: { username: 'nonexistent', provider: 'keybase' } - - expect(response).to have_http_status(:not_found) - end - end - - describe 'with a user that has no proofs' do - it 'is an empty list of signatures' do - get :index, params: { username: alice.username, provider: 'keybase' } - - expect(body_as_json[:signatures]).to eq [] - end - end - - describe 'with a user that has a live, valid proof' do - let(:token1) { '111111111111111111111111111111111111111111111111111111111111111111' } - let(:kb_name1) { 'crypto_alice' } - - before do - Fabricate(:account_identity_proof, account: alice, verified: true, live: true, token: token1, provider_username: kb_name1) - end - - it 'is a list with that proof in it' do - get :index, params: { username: alice.username, provider: 'keybase' } - - expect(body_as_json[:signatures]).to eq [ - { kb_username: kb_name1, sig_hash: token1 }, - ] - end - - describe 'add one that is neither live nor valid' do - let(:token2) { '222222222222222222222222222222222222222222222222222222222222222222' } - let(:kb_name2) { 'hidden_alice' } - - before do - Fabricate(:account_identity_proof, account: alice, verified: false, live: false, token: token2, provider_username: kb_name2) - end - - it 'is a list with both proofs' do - get :index, params: { username: alice.username, provider: 'keybase' } - - expect(body_as_json[:signatures]).to eq [ - { kb_username: kb_name1, sig_hash: token1 }, - { kb_username: kb_name2, sig_hash: token2 }, - ] - end - end - end - - describe 'a user that has an avatar' do - let(:alice) { Fabricate(:account, username: 'alice', avatar: attachment_fixture('avatar.gif')) } - - context 'and a proof' do - let(:token1) { '111111111111111111111111111111111111111111111111111111111111111111' } - let(:kb_name1) { 'crypto_alice' } - - before do - Fabricate(:account_identity_proof, account: alice, verified: true, live: true, token: token1, provider_username: kb_name1) - get :index, params: { username: alice.username, provider: 'keybase' } - end - - it 'has two keys: signatures and avatar' do - expect(body_as_json.keys).to match_array [:signatures, :avatar] - end - - it 'has the correct signatures' do - expect(body_as_json[:signatures]).to eq [ - { kb_username: kb_name1, sig_hash: token1 }, - ] - end - - it 'has the correct avatar url' do - expect(body_as_json[:avatar]).to match "https://cb6e6126.ngrok.io#{alice.avatar.url}" - end - end - end - end -end diff --git a/spec/controllers/api/v1/accounts/credentials_controller_spec.rb b/spec/controllers/api/v1/accounts/credentials_controller_spec.rb index 4fa6fbcf42..aae35ce385 100644 --- a/spec/controllers/api/v1/accounts/credentials_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/credentials_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Api::V1::Accounts::CredentialsController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } context 'with an oauth token' do @@ -30,8 +30,8 @@ describe Api::V1::Accounts::CredentialsController do patch :update, params: { display_name: "Alice Isn't Dead", note: "Hi!\n\nToot toot!", - avatar: fixture_file_upload('files/avatar.gif', 'image/gif'), - header: fixture_file_upload('files/attachment.jpg', 'image/jpeg'), + avatar: fixture_file_upload('avatar.gif', 'image/gif'), + header: fixture_file_upload('attachment.jpg', 'image/jpeg'), source: { privacy: 'unlisted', sensitive: true, diff --git a/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb b/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb index 482a19ef2c..1e6e1d8e0a 100644 --- a/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Api::V1::Accounts::FollowerAccountsController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') } let(:account) { Fabricate(:account) } let(:alice) { Fabricate(:account) } @@ -49,10 +49,10 @@ describe Api::V1::Accounts::FollowerAccountsController do end context 'when requesting user is the account owner' do - let(:user) { Fabricate(:user, account: account) } + let(:user) { account.user } it 'returns all accounts, including muted accounts' do - user.account.mute!(bob) + account.mute!(bob) get :index, params: { account_id: account.id, limit: 2 } expect(body_as_json.size).to eq 2 diff --git a/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb b/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb index e35b625fe8..cc962c6ee3 100644 --- a/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Api::V1::Accounts::FollowingAccountsController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') } let(:account) { Fabricate(:account) } let(:alice) { Fabricate(:account) } @@ -49,10 +49,10 @@ describe Api::V1::Accounts::FollowingAccountsController do end context 'when requesting user is the account owner' do - let(:user) { Fabricate(:user, account: account) } + let(:user) { account.user } it 'returns all accounts, including muted accounts' do - user.account.mute!(bob) + account.mute!(bob) get :index, params: { account_id: account.id, limit: 2 } expect(body_as_json.size).to eq 2 diff --git a/spec/controllers/api/v1/accounts/lists_controller_spec.rb b/spec/controllers/api/v1/accounts/lists_controller_spec.rb index baafea8e6b..d714856335 100644 --- a/spec/controllers/api/v1/accounts/lists_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/lists_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Api::V1::Accounts::ListsController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:lists') } let(:account) { Fabricate(:account) } let(:list) { Fabricate(:list, account: user.account) } diff --git a/spec/controllers/api/v1/accounts/notes_controller_spec.rb b/spec/controllers/api/v1/accounts/notes_controller_spec.rb new file mode 100644 index 0000000000..47d595c705 --- /dev/null +++ b/spec/controllers/api/v1/accounts/notes_controller_spec.rb @@ -0,0 +1,48 @@ +require 'rails_helper' + +describe Api::V1::Accounts::NotesController do + render_views + + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:accounts') } + let(:account) { Fabricate(:account) } + let(:comment) { 'foo' } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'POST #create' do + subject do + post :create, params: { account_id: account.id, comment: comment } + end + + context 'when account note has reasonable length' do + let(:comment) { 'foo' } + + it 'returns http success' do + subject + expect(response).to have_http_status(200) + end + + it 'updates account note' do + subject + expect(AccountNote.find_by(account_id: user.account.id, target_account_id: account.id).comment).to eq comment + end + end + + context 'when account note exceends allowed length' do + let(:comment) { 'a' * 2_001 } + + it 'returns 422' do + subject + expect(response).to have_http_status(422) + end + + it 'does not create account note' do + subject + expect(AccountNote.where(account_id: user.account.id, target_account_id: account.id).exists?).to be_falsey + end + end + end +end diff --git a/spec/controllers/api/v1/accounts/pins_controller_spec.rb b/spec/controllers/api/v1/accounts/pins_controller_spec.rb index c71935df21..19bba093e4 100644 --- a/spec/controllers/api/v1/accounts/pins_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/pins_controller_spec.rb @@ -3,8 +3,8 @@ require 'rails_helper' RSpec.describe Api::V1::Accounts::PinsController, type: :controller do - let(:john) { Fabricate(:user, account: Fabricate(:account, username: 'john')) } - let(:kevin) { Fabricate(:user, account: Fabricate(:account, username: 'kevin')) } + let(:john) { Fabricate(:user) } + let(:kevin) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: john.id, scopes: 'write:accounts') } before do diff --git a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb index fe715ff625..69ad0d061a 100644 --- a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Api::V1::Accounts::RelationshipsController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:follows') } before do @@ -11,8 +11,8 @@ describe Api::V1::Accounts::RelationshipsController do end describe 'GET #index' do - let(:simon) { Fabricate(:user, email: 'simon@example.com', account: Fabricate(:account, username: 'simon')).account } - let(:lewis) { Fabricate(:user, email: 'lewis@example.com', account: Fabricate(:account, username: 'lewis')).account } + let(:simon) { Fabricate(:account) } + let(:lewis) { Fabricate(:account) } before do user.account.follow!(simon) diff --git a/spec/controllers/api/v1/accounts/search_controller_spec.rb b/spec/controllers/api/v1/accounts/search_controller_spec.rb index 8ff2b17dee..5b23bff681 100644 --- a/spec/controllers/api/v1/accounts/search_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/search_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::Accounts::SearchController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') } before do diff --git a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb b/spec/controllers/api/v1/accounts/statuses_controller_spec.rb index 693cd1ac66..348de08c2c 100644 --- a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/statuses_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Api::V1::Accounts::StatusesController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses') } before do @@ -39,7 +39,7 @@ describe Api::V1::Accounts::StatusesController do end end - context 'with only pinned' do + context 'with only own pinned' do before do Fabricate(:status_pin, account: user.account, status: Fabricate(:status, account: user.account)) end @@ -50,5 +50,38 @@ describe Api::V1::Accounts::StatusesController do expect(response).to have_http_status(200) end end + + context "with someone else's pinned statuses" do + let(:account) { Fabricate(:account, username: 'bob', domain: 'example.com') } + let(:status) { Fabricate(:status, account: account) } + let(:private_status) { Fabricate(:status, account: account, visibility: :private) } + let!(:pin) { Fabricate(:status_pin, account: account, status: status) } + let!(:private_pin) { Fabricate(:status_pin, account: account, status: private_status) } + + it 'returns http success' do + get :index, params: { account_id: account.id, pinned: true } + expect(response).to have_http_status(200) + end + + context 'when user does not follow account' do + it 'lists the public status only' do + get :index, params: { account_id: account.id, pinned: true } + json = body_as_json + expect(json.map { |item| item[:id].to_i }).to eq [status.id] + end + end + + context 'when user follows account' do + before do + user.account.follow!(account) + end + + it 'lists both the public and the private statuses' do + get :index, params: { account_id: account.id, pinned: true } + json = body_as_json + expect(json.map { |item| item[:id].to_i }.sort).to eq [status.id, private_status.id].sort + end + end + end end end diff --git a/spec/controllers/api/v1/accounts_controller_spec.rb b/spec/controllers/api/v1/accounts_controller_spec.rb index d9ee37ffa2..5d5c245c50 100644 --- a/spec/controllers/api/v1/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::AccountsController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:scopes) { '' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } @@ -69,7 +69,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do describe 'POST #follow' do let(:scopes) { 'write:follows' } - let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', locked: locked)).account } + let(:other_account) { Fabricate(:account, username: 'bob', locked: locked) } context do before do @@ -150,7 +150,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do describe 'POST #unfollow' do let(:scopes) { 'write:follows' } - let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:other_account) { Fabricate(:account, username: 'bob') } before do user.account.follow!(other_account) @@ -168,9 +168,29 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it_behaves_like 'forbidden for wrong scope', 'read:accounts' end + describe 'POST #remove_from_followers' do + let(:scopes) { 'write:follows' } + let(:other_account) { Fabricate(:account, username: 'bob') } + + before do + other_account.follow!(user.account) + post :remove_from_followers, params: { id: other_account.id } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'removes the followed relation between user and target user' do + expect(user.account.followed_by?(other_account)).to be false + end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' + end + describe 'POST #block' do let(:scopes) { 'write:blocks' } - let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:other_account) { Fabricate(:account, username: 'bob') } before do user.account.follow!(other_account) @@ -194,7 +214,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do describe 'POST #unblock' do let(:scopes) { 'write:blocks' } - let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:other_account) { Fabricate(:account, username: 'bob') } before do user.account.block!(other_account) @@ -214,7 +234,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do describe 'POST #mute' do let(:scopes) { 'write:mutes' } - let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:other_account) { Fabricate(:account, username: 'bob') } before do user.account.follow!(other_account) @@ -242,7 +262,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do describe 'POST #mute with notifications set to false' do let(:scopes) { 'write:mutes' } - let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:other_account) { Fabricate(:account, username: 'bob') } before do user.account.follow!(other_account) @@ -270,7 +290,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do describe 'POST #mute with nonzero duration set' do let(:scopes) { 'write:mutes' } - let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:other_account) { Fabricate(:account, username: 'bob') } before do user.account.follow!(other_account) @@ -298,7 +318,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do describe 'POST #unmute' do let(:scopes) { 'write:mutes' } - let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:other_account) { Fabricate(:account, username: 'bob') } before do user.account.mute!(other_account) diff --git a/spec/controllers/api/v1/admin/account_actions_controller_spec.rb b/spec/controllers/api/v1/admin/account_actions_controller_spec.rb index a5a8f4bb0d..601290b824 100644 --- a/spec/controllers/api/v1/admin/account_actions_controller_spec.rb +++ b/spec/controllers/api/v1/admin/account_actions_controller_spec.rb @@ -4,10 +4,10 @@ RSpec.describe Api::V1::Admin::AccountActionsController, type: :controller do render_views let(:role) { 'moderator' } - let(:user) { Fabricate(:user, role: role, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:account) { Fabricate(:user).account } + let(:account) { Fabricate(:account) } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/admin/accounts_controller_spec.rb b/spec/controllers/api/v1/admin/accounts_controller_spec.rb index f6be35f7f1..bf79ee5202 100644 --- a/spec/controllers/api/v1/admin/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/admin/accounts_controller_spec.rb @@ -4,10 +4,10 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do render_views let(:role) { 'moderator' } - let(:user) { Fabricate(:user, role: role, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:account) { Fabricate(:user).account } + let(:account) { Fabricate(:account) } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/admin/reports_controller_spec.rb b/spec/controllers/api/v1/admin/reports_controller_spec.rb index 4ed3c5dc4c..b6df53048a 100644 --- a/spec/controllers/api/v1/admin/reports_controller_spec.rb +++ b/spec/controllers/api/v1/admin/reports_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do render_views let(:role) { 'moderator' } - let(:user) { Fabricate(:user, role: role, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:report) { Fabricate(:report) } diff --git a/spec/controllers/api/v1/apps_controller_spec.rb b/spec/controllers/api/v1/apps_controller_spec.rb index 60a4c3b41c..70cd62d482 100644 --- a/spec/controllers/api/v1/apps_controller_spec.rb +++ b/spec/controllers/api/v1/apps_controller_spec.rb @@ -4,23 +4,83 @@ RSpec.describe Api::V1::AppsController, type: :controller do render_views describe 'POST #create' do + let(:client_name) { 'Test app' } + let(:scopes) { nil } + let(:redirect_uris) { 'urn:ietf:wg:oauth:2.0:oob' } + let(:website) { nil } + + let(:app_params) do + { + client_name: client_name, + redirect_uris: redirect_uris, + scopes: scopes, + website: website, + } + end + before do - post :create, params: { client_name: 'Test app', redirect_uris: 'urn:ietf:wg:oauth:2.0:oob' } + post :create, params: app_params end - it 'returns http success' do - expect(response).to have_http_status(200) + context 'with valid params' do + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'creates an OAuth app' do + expect(Doorkeeper::Application.find_by(name: client_name)).to_not be nil + end + + it 'returns client ID and client secret' do + json = body_as_json + + expect(json[:client_id]).to_not be_blank + expect(json[:client_secret]).to_not be_blank + end end - it 'creates an OAuth app' do - expect(Doorkeeper::Application.find_by(name: 'Test app')).to_not be nil + context 'with an unsupported scope' do + let(:scopes) { 'hoge' } + + it 'returns http unprocessable entity' do + expect(response).to have_http_status(422) + end end - it 'returns client ID and client secret' do - json = body_as_json + context 'with many duplicate scopes' do + let(:scopes) { (%w(read) * 40).join(' ') } - expect(json[:client_id]).to_not be_blank - expect(json[:client_secret]).to_not be_blank + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'only saves the scope once' do + expect(Doorkeeper::Application.find_by(name: client_name).scopes.to_s).to eq 'read' + end + end + + context 'with a too-long name' do + let(:client_name) { 'hoge' * 20 } + + it 'returns http unprocessable entity' do + expect(response).to have_http_status(422) + end + end + + context 'with a too-long website' do + let(:website) { 'https://foo.bar/' + ('hoge' * 2_000) } + + it 'returns http unprocessable entity' do + expect(response).to have_http_status(422) + end + end + + context 'with a too-long redirect_uris' do + let(:redirect_uris) { 'https://foo.bar/' + ('hoge' * 2_000) } + + it 'returns http unprocessable entity' do + expect(response).to have_http_status(422) + end end end end diff --git a/spec/controllers/api/v1/blocks_controller_spec.rb b/spec/controllers/api/v1/blocks_controller_spec.rb index 818f76c923..0e5c8296d8 100644 --- a/spec/controllers/api/v1/blocks_controller_spec.rb +++ b/spec/controllers/api/v1/blocks_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::BlocksController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:scopes) { 'read:blocks' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } diff --git a/spec/controllers/api/v1/conversations_controller_spec.rb b/spec/controllers/api/v1/conversations_controller_spec.rb index 070f65061b..5add7cf1d4 100644 --- a/spec/controllers/api/v1/conversations_controller_spec.rb +++ b/spec/controllers/api/v1/conversations_controller_spec.rb @@ -3,9 +3,9 @@ require 'rails_helper' RSpec.describe Api::V1::ConversationsController, type: :controller do render_views - let!(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let!(:user) { Fabricate(:user, account_attributes: { username: 'alice' }) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:other) { Fabricate(:user, account: Fabricate(:account, username: 'bob')) } + let(:other) { Fabricate(:user) } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/domain_blocks_controller_spec.rb b/spec/controllers/api/v1/domain_blocks_controller_spec.rb index 6a7a35c7a5..d9dc1bdbfe 100644 --- a/spec/controllers/api/v1/domain_blocks_controller_spec.rb +++ b/spec/controllers/api/v1/domain_blocks_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::DomainBlocksController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } before do diff --git a/spec/controllers/api/v1/follow_requests_controller_spec.rb b/spec/controllers/api/v1/follow_requests_controller_spec.rb index ae92a9627a..856ba2a1c0 100644 --- a/spec/controllers/api/v1/follow_requests_controller_spec.rb +++ b/spec/controllers/api/v1/follow_requests_controller_spec.rb @@ -3,12 +3,12 @@ require 'rails_helper' RSpec.describe Api::V1::FollowRequestsController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice', locked: true)) } + let(:user) { Fabricate(:user, account_attributes: { locked: true }) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:follower) { Fabricate(:account, username: 'bob') } + let(:follower) { Fabricate(:account) } before do - FollowService.new.call(follower, user.account.acct) + FollowService.new.call(follower, user.account) allow(controller).to receive(:doorkeeper_token) { token } end diff --git a/spec/controllers/api/v1/instances_controller_spec.rb b/spec/controllers/api/v1/instances_controller_spec.rb index 7397d25d6b..842669d965 100644 --- a/spec/controllers/api/v1/instances_controller_spec.rb +++ b/spec/controllers/api/v1/instances_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' RSpec.describe Api::V1::InstancesController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id) } before do diff --git a/spec/controllers/api/v1/lists/accounts_controller_spec.rb b/spec/controllers/api/v1/lists/accounts_controller_spec.rb index 08c22de568..526d8b5616 100644 --- a/spec/controllers/api/v1/lists/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/lists/accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Api::V1::Lists::AccountsController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:list) { Fabricate(:list, account: user.account) } diff --git a/spec/controllers/api/v1/lists_controller_spec.rb b/spec/controllers/api/v1/lists_controller_spec.rb index e92213789a..71a8094e68 100644 --- a/spec/controllers/api/v1/lists_controller_spec.rb +++ b/spec/controllers/api/v1/lists_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::ListsController, type: :controller do render_views - let!(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let!(:user) { Fabricate(:user) } let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let!(:list) { Fabricate(:list, account: user.account) } diff --git a/spec/controllers/api/v1/markers_controller_spec.rb b/spec/controllers/api/v1/markers_controller_spec.rb index 556a75b9b1..ba0f3c3221 100644 --- a/spec/controllers/api/v1/markers_controller_spec.rb +++ b/spec/controllers/api/v1/markers_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::MarkersController, type: :controller do render_views - let!(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let!(:user) { Fabricate(:user) } let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses write:statuses') } before { allow(controller).to receive(:doorkeeper_token) { token } } diff --git a/spec/controllers/api/v1/media_controller_spec.rb b/spec/controllers/api/v1/media_controller_spec.rb index 4e30372084..d8d7326302 100644 --- a/spec/controllers/api/v1/media_controller_spec.rb +++ b/spec/controllers/api/v1/media_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::MediaController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:media') } before do @@ -15,7 +15,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do context 'when imagemagick cant identify the file type' do before do expect_any_instance_of(Account).to receive_message_chain(:media_attachments, :create!).and_raise(Paperclip::Errors::NotIdentifiedByImageMagickError) - post :create, params: { file: fixture_file_upload('files/attachment.jpg', 'image/jpeg') } + post :create, params: { file: fixture_file_upload('attachment.jpg', 'image/jpeg') } end it 'returns http 422' do @@ -26,7 +26,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do context 'when there is a generic error' do before do expect_any_instance_of(Account).to receive_message_chain(:media_attachments, :create!).and_raise(Paperclip::Error) - post :create, params: { file: fixture_file_upload('files/attachment.jpg', 'image/jpeg') } + post :create, params: { file: fixture_file_upload('attachment.jpg', 'image/jpeg') } end it 'returns http 422' do @@ -37,7 +37,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do context 'image/jpeg' do before do - post :create, params: { file: fixture_file_upload('files/attachment.jpg', 'image/jpeg') } + post :create, params: { file: fixture_file_upload('attachment.jpg', 'image/jpeg') } end it 'returns http success' do @@ -59,7 +59,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do context 'image/gif' do before do - post :create, params: { file: fixture_file_upload('files/attachment.gif', 'image/gif') } + post :create, params: { file: fixture_file_upload('attachment.gif', 'image/gif') } end it 'returns http success' do @@ -81,7 +81,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do context 'video/webm' do before do - post :create, params: { file: fixture_file_upload('files/attachment.webm', 'video/webm') } + post :create, params: { file: fixture_file_upload('attachment.webm', 'video/webm') } end it do diff --git a/spec/controllers/api/v1/mutes_controller_spec.rb b/spec/controllers/api/v1/mutes_controller_spec.rb index a2b814a690..8176815d4e 100644 --- a/spec/controllers/api/v1/mutes_controller_spec.rb +++ b/spec/controllers/api/v1/mutes_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::MutesController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:scopes) { 'read:mutes' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } diff --git a/spec/controllers/api/v1/notifications_controller_spec.rb b/spec/controllers/api/v1/notifications_controller_spec.rb index db3f4b782b..f8df6589f1 100644 --- a/spec/controllers/api/v1/notifications_controller_spec.rb +++ b/spec/controllers/api/v1/notifications_controller_spec.rb @@ -3,10 +3,10 @@ require 'rails_helper' RSpec.describe Api::V1::NotificationsController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user, account_attributes: { username: 'alice' }) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:other) { Fabricate(:user, account: Fabricate(:account, username: 'bob')) } - let(:third) { Fabricate(:user, account: Fabricate(:account, username: 'carol')) } + let(:other) { Fabricate(:user) } + let(:third) { Fabricate(:user) } before do allow(controller).to receive(:doorkeeper_token) { token } @@ -57,7 +57,7 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do @mention_from_status = mentioning_status.mentions.first @favourite = FavouriteService.new.call(other.account, first_status) @second_favourite = FavouriteService.new.call(third.account, first_status) - @follow = FollowService.new.call(other.account, 'alice') + @follow = FollowService.new.call(other.account, user.account) end describe 'with no options' do diff --git a/spec/controllers/api/v1/polls/votes_controller_spec.rb b/spec/controllers/api/v1/polls/votes_controller_spec.rb index 0ee3aa040c..d7a9c19704 100644 --- a/spec/controllers/api/v1/polls/votes_controller_spec.rb +++ b/spec/controllers/api/v1/polls/votes_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::Polls::VotesController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:scopes) { 'write:statuses' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } diff --git a/spec/controllers/api/v1/polls_controller_spec.rb b/spec/controllers/api/v1/polls_controller_spec.rb index 851bccb7e2..f0d9eaf92d 100644 --- a/spec/controllers/api/v1/polls_controller_spec.rb +++ b/spec/controllers/api/v1/polls_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::PollsController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:scopes) { 'read:statuses' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } diff --git a/spec/controllers/api/v1/push/subscriptions_controller_spec.rb b/spec/controllers/api/v1/push/subscriptions_controller_spec.rb index 01146294f8..534d028790 100644 --- a/spec/controllers/api/v1/push/subscriptions_controller_spec.rb +++ b/spec/controllers/api/v1/push/subscriptions_controller_spec.rb @@ -27,20 +27,27 @@ describe Api::V1::Push::SubscriptionsController do let(:alerts_payload) do { data: { + policy: 'all', + alerts: { follow: true, + follow_request: true, favourite: false, reblog: true, mention: false, + poll: true, + status: false, } } }.with_indifferent_access end describe 'POST #create' do - it 'saves push subscriptions' do + before do post :create, params: create_payload + end + it 'saves push subscriptions' do push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) expect(push_subscription.endpoint).to eq(create_payload[:subscription][:endpoint]) @@ -52,31 +59,34 @@ describe Api::V1::Push::SubscriptionsController do it 'replaces old subscription on repeat calls' do post :create, params: create_payload - post :create, params: create_payload - expect(Web::PushSubscription.where(endpoint: create_payload[:subscription][:endpoint]).count).to eq 1 end end describe 'PUT #update' do - it 'changes alert settings' do + before do post :create, params: create_payload put :update, params: alerts_payload + end + it 'changes alert settings' do push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) - expect(push_subscription.data.dig('alerts', 'follow')).to eq(alerts_payload[:data][:alerts][:follow].to_s) - expect(push_subscription.data.dig('alerts', 'favourite')).to eq(alerts_payload[:data][:alerts][:favourite].to_s) - expect(push_subscription.data.dig('alerts', 'reblog')).to eq(alerts_payload[:data][:alerts][:reblog].to_s) - expect(push_subscription.data.dig('alerts', 'mention')).to eq(alerts_payload[:data][:alerts][:mention].to_s) + expect(push_subscription.data['policy']).to eq(alerts_payload[:data][:policy]) + + %w(follow follow_request favourite reblog mention poll status).each do |type| + expect(push_subscription.data['alerts'][type]).to eq(alerts_payload[:data][:alerts][type.to_sym].to_s) + end end end describe 'DELETE #destroy' do - it 'removes the subscription' do + before do post :create, params: create_payload delete :destroy + end + it 'removes the subscription' do expect(Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint])).to be_nil end end diff --git a/spec/controllers/api/v1/reports_controller_spec.rb b/spec/controllers/api/v1/reports_controller_spec.rb index a3596cf8a0..a13de13706 100644 --- a/spec/controllers/api/v1/reports_controller_spec.rb +++ b/spec/controllers/api/v1/reports_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' RSpec.describe Api::V1::ReportsController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } before do diff --git a/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb b/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb index 7c75a4f738..46d7b6c0a5 100644 --- a/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Statuses::BookmarksController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:bookmarks', application: app) } diff --git a/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb b/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb index f053ae5738..439a4738df 100644 --- a/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::Statuses::FavouritedByAccountsController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'read:accounts') } let(:alice) { Fabricate(:account) } diff --git a/spec/controllers/api/v1/statuses/favourites_controller_spec.rb b/spec/controllers/api/v1/statuses/favourites_controller_spec.rb index 4716ecae3c..609957e3ef 100644 --- a/spec/controllers/api/v1/statuses/favourites_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/favourites_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Statuses::FavouritesController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:favourites', application: app) } diff --git a/spec/controllers/api/v1/statuses/histories_controller_spec.rb b/spec/controllers/api/v1/statuses/histories_controller_spec.rb new file mode 100644 index 0000000000..00677f1d2c --- /dev/null +++ b/spec/controllers/api/v1/statuses/histories_controller_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Api::V1::Statuses::HistoriesController do + render_views + + let(:user) { Fabricate(:user) } + let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses', application: app) } + + context 'with an oauth token' do + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'GET #show' do + let(:status) { Fabricate(:status, account: user.account) } + + before do + get :show, params: { status_id: status.id } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + end + end +end diff --git a/spec/controllers/api/v1/statuses/mutes_controller_spec.rb b/spec/controllers/api/v1/statuses/mutes_controller_spec.rb index 966398580d..bffa9fe0d9 100644 --- a/spec/controllers/api/v1/statuses/mutes_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/mutes_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Statuses::MutesController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:mutes', application: app) } diff --git a/spec/controllers/api/v1/statuses/pins_controller_spec.rb b/spec/controllers/api/v1/statuses/pins_controller_spec.rb index 13405d285d..8bdaf8b548 100644 --- a/spec/controllers/api/v1/statuses/pins_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/pins_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Statuses::PinsController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:accounts', application: app) } diff --git a/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb b/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb index 60908b7b38..31320349df 100644 --- a/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::Statuses::RebloggedByAccountsController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'read:accounts') } let(:alice) { Fabricate(:account) } diff --git a/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb b/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb index f1d3d949c4..6eac02b232 100644 --- a/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Statuses::ReblogsController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:statuses', application: app) } diff --git a/spec/controllers/api/v1/statuses/sources_controller_spec.rb b/spec/controllers/api/v1/statuses/sources_controller_spec.rb new file mode 100644 index 0000000000..fbe6fa0be6 --- /dev/null +++ b/spec/controllers/api/v1/statuses/sources_controller_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Api::V1::Statuses::SourcesController do + render_views + + let(:user) { Fabricate(:user) } + let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses', application: app) } + + context 'with an oauth token' do + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'GET #show' do + let(:status) { Fabricate(:status, account: user.account) } + + before do + get :show, params: { status_id: status.id } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + end + end +end diff --git a/spec/controllers/api/v1/statuses_controller_spec.rb b/spec/controllers/api/v1/statuses_controller_spec.rb index df80370385..2679ab017e 100644 --- a/spec/controllers/api/v1/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/statuses_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::StatusesController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: scopes) } diff --git a/spec/controllers/api/v1/timelines/home_controller_spec.rb b/spec/controllers/api/v1/timelines/home_controller_spec.rb index e953e46495..131c2d92fa 100644 --- a/spec/controllers/api/v1/timelines/home_controller_spec.rb +++ b/spec/controllers/api/v1/timelines/home_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Timelines::HomeController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice'), current_sign_in_at: 1.day.ago) } + let(:user) { Fabricate(:user, current_sign_in_at: 1.day.ago) } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/timelines/list_controller_spec.rb b/spec/controllers/api/v1/timelines/list_controller_spec.rb index 45e4bf34c8..526c66a058 100644 --- a/spec/controllers/api/v1/timelines/list_controller_spec.rb +++ b/spec/controllers/api/v1/timelines/list_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Timelines::ListController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:list) { Fabricate(:list, account: user.account) } before do @@ -30,7 +30,7 @@ describe Api::V1::Timelines::ListController do end context 'with the wrong user context' do - let(:other_user) { Fabricate(:user, account: Fabricate(:account, username: 'bob')) } + let(:other_user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: other_user.id, scopes: 'read') } describe 'GET #show' do diff --git a/spec/controllers/api/v1/timelines/public_controller_spec.rb b/spec/controllers/api/v1/timelines/public_controller_spec.rb index b8e9d86748..0892d5db64 100644 --- a/spec/controllers/api/v1/timelines/public_controller_spec.rb +++ b/spec/controllers/api/v1/timelines/public_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Timelines::PublicController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/timelines/tag_controller_spec.rb b/spec/controllers/api/v1/timelines/tag_controller_spec.rb index f71ca2a399..7189110833 100644 --- a/spec/controllers/api/v1/timelines/tag_controller_spec.rb +++ b/spec/controllers/api/v1/timelines/tag_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Api::V1::Timelines::TagController do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/trends/tags_controller_spec.rb b/spec/controllers/api/v1/trends/tags_controller_spec.rb new file mode 100644 index 0000000000..e2e26dcab9 --- /dev/null +++ b/spec/controllers/api/v1/trends/tags_controller_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Api::V1::Trends::TagsController, type: :controller do + render_views + + describe 'GET #index' do + before do + trending_tags = double() + + allow(trending_tags).to receive(:get).and_return(Fabricate.times(10, :tag)) + allow(Trends).to receive(:tags).and_return(trending_tags) + + get :index + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + end +end diff --git a/spec/controllers/api/v1/trends_controller_spec.rb b/spec/controllers/api/v1/trends_controller_spec.rb deleted file mode 100644 index 91e0d18fe7..0000000000 --- a/spec/controllers/api/v1/trends_controller_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::TrendsController, type: :controller do - render_views - - describe 'GET #index' do - before do - allow(TrendingTags).to receive(:get).and_return(Fabricate.times(10, :tag)) - get :index - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end -end diff --git a/spec/controllers/api/v2/search_controller_spec.rb b/spec/controllers/api/v2/search_controller_spec.rb index 8ee8753ded..fa20e1e51f 100644 --- a/spec/controllers/api/v2/search_controller_spec.rb +++ b/spec/controllers/api/v2/search_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' RSpec.describe Api::V2::SearchController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:search') } before do diff --git a/spec/controllers/api/web/push_subscriptions_controller_spec.rb b/spec/controllers/api/web/push_subscriptions_controller_spec.rb index 381cdeab94..bda4a76614 100644 --- a/spec/controllers/api/web/push_subscriptions_controller_spec.rb +++ b/spec/controllers/api/web/push_subscriptions_controller_spec.rb @@ -22,11 +22,16 @@ describe Api::Web::PushSubscriptionsController do let(:alerts_payload) do { data: { + policy: 'all', + alerts: { follow: true, + follow_request: false, favourite: false, reblog: true, mention: false, + poll: true, + status: false, } } } @@ -59,10 +64,11 @@ describe Api::Web::PushSubscriptionsController do push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) - expect(push_subscription.data['alerts']['follow']).to eq(alerts_payload[:data][:alerts][:follow].to_s) - expect(push_subscription.data['alerts']['favourite']).to eq(alerts_payload[:data][:alerts][:favourite].to_s) - expect(push_subscription.data['alerts']['reblog']).to eq(alerts_payload[:data][:alerts][:reblog].to_s) - expect(push_subscription.data['alerts']['mention']).to eq(alerts_payload[:data][:alerts][:mention].to_s) + expect(push_subscription.data['policy']).to eq 'all' + + %w(follow follow_request favourite reblog mention poll status).each do |type| + expect(push_subscription.data['alerts'][type]).to eq(alerts_payload[:data][:alerts][type.to_sym].to_s) + end end end end @@ -81,10 +87,11 @@ describe Api::Web::PushSubscriptionsController do push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) - expect(push_subscription.data['alerts']['follow']).to eq(alerts_payload[:data][:alerts][:follow].to_s) - expect(push_subscription.data['alerts']['favourite']).to eq(alerts_payload[:data][:alerts][:favourite].to_s) - expect(push_subscription.data['alerts']['reblog']).to eq(alerts_payload[:data][:alerts][:reblog].to_s) - expect(push_subscription.data['alerts']['mention']).to eq(alerts_payload[:data][:alerts][:mention].to_s) + expect(push_subscription.data['policy']).to eq 'all' + + %w(follow follow_request favourite reblog mention poll status).each do |type| + expect(push_subscription.data['alerts'][type]).to eq(alerts_payload[:data][:alerts][type.to_sym].to_s) + end end end end diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 686ae70fb4..a6a6871f7a 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -42,20 +42,6 @@ describe ApplicationController, type: :controller do include_examples 'respond_with_error', 422 end - it "does not force ssl if Rails.env.production? is not 'true'" do - routes.draw { get 'success' => 'anonymous#success' } - allow(Rails.env).to receive(:production?).and_return(false) - get 'success' - expect(response).to have_http_status(200) - end - - it "forces ssl if Rails.env.production? is 'true'" do - routes.draw { get 'success' => 'anonymous#success' } - allow(Rails.env).to receive(:production?).and_return(true) - get 'success' - expect(response).to redirect_to('https://test.host/success') - end - describe 'helper_method :current_account' do it 'returns nil if not signed in' do expect(controller.view_context.current_account).to be_nil @@ -63,7 +49,7 @@ describe ApplicationController, type: :controller do it 'returns account if signed in' do account = Fabricate(:account) - sign_in(Fabricate(:user, account: account)) + sign_in(account.user) expect(controller.view_context.current_account).to eq account end end @@ -182,13 +168,13 @@ describe ApplicationController, type: :controller do end it 'does nothing if user who signed in is not suspended' do - sign_in(Fabricate(:user, account: Fabricate(:account, suspended: false))) + sign_in(Fabricate(:account, suspended: false).user) get 'success' expect(response).to have_http_status(200) end it 'redirects to account status page' do - sign_in(Fabricate(:user, account: Fabricate(:account, suspended: true))) + sign_in(Fabricate(:account, suspended: true).user) get 'success' expect(response).to redirect_to(edit_user_registration_path) end @@ -353,10 +339,6 @@ describe ApplicationController, type: :controller do expect(C.new.cache_collection(raw, Object)).to eq raw end - context 'Notification' do - include_examples 'cacheable', :notification, Notification - end - context 'Status' do include_examples 'cacheable', :status, Status end diff --git a/spec/controllers/auth/confirmations_controller_spec.rb b/spec/controllers/auth/confirmations_controller_spec.rb index 0b6b74ff90..8469119d23 100644 --- a/spec/controllers/auth/confirmations_controller_spec.rb +++ b/spec/controllers/auth/confirmations_controller_spec.rb @@ -32,6 +32,52 @@ describe Auth::ConfirmationsController, type: :controller do end end + context 'when user is unconfirmed and unapproved' do + let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil, approved: false) } + + before do + allow(BootstrapTimelineWorker).to receive(:perform_async) + @request.env['devise.mapping'] = Devise.mappings[:user] + get :show, params: { confirmation_token: 'foobar' } + end + + it 'redirects to login' do + expect(response).to redirect_to(new_user_session_path) + end + end + + context 'when user is already confirmed' do + let!(:user) { Fabricate(:user) } + + before do + allow(BootstrapTimelineWorker).to receive(:perform_async) + @request.env['devise.mapping'] = Devise.mappings[:user] + sign_in(user, scope: :user) + get :show, params: { confirmation_token: 'foobar' } + end + + it 'redirects to root path' do + expect(response).to redirect_to(root_path) + end + end + + context 'when user is already confirmed but unapproved' do + let!(:user) { Fabricate(:user, approved: false) } + + before do + allow(BootstrapTimelineWorker).to receive(:perform_async) + @request.env['devise.mapping'] = Devise.mappings[:user] + user.approved = false + user.save! + sign_in(user, scope: :user) + get :show, params: { confirmation_token: 'foobar' } + end + + it 'redirects to settings' do + expect(response).to redirect_to(edit_user_registration_path) + end + end + context 'when user is updating email' do let!(:user) { Fabricate(:user, confirmation_token: 'foobar', unconfirmed_email: 'new-email@example.com') } diff --git a/spec/controllers/auth/registrations_controller_spec.rb b/spec/controllers/auth/registrations_controller_spec.rb index ccf304a930..0ebf6641fa 100644 --- a/spec/controllers/auth/registrations_controller_spec.rb +++ b/spec/controllers/auth/registrations_controller_spec.rb @@ -228,7 +228,7 @@ RSpec.describe Auth::RegistrationsController, type: :controller do end it 'does nothing if user already exists' do - Fabricate(:user, account: Fabricate(:account, username: 'test')) + Fabricate(:account, username: 'test') subject end diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index d3a9a11ebb..64ec7b7946 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -37,8 +37,11 @@ RSpec.describe Auth::SessionsController, type: :controller do end context 'with a suspended user' do + before do + user.account.suspend! + end + it 'redirects to home after sign out' do - Fabricate(:account, user: user, suspended: true) sign_in(user, scope: :user) delete :destroy @@ -69,7 +72,7 @@ RSpec.describe Auth::SessionsController, type: :controller do end it 'shows a login error' do - expect(flash[:alert]).to match I18n.t('devise.failure.invalid', authentication_keys: 'Email') + expect(flash[:alert]).to match I18n.t('devise.failure.invalid', authentication_keys: I18n.t('activerecord.attributes.user.email')) end it "doesn't log the user in" do @@ -78,8 +81,8 @@ RSpec.describe Auth::SessionsController, type: :controller do end context 'using a valid email and existing user' do - let(:user) do - account = Fabricate.build(:account, username: 'pam_user1') + let!(:user) do + account = Fabricate.build(:account, username: 'pam_user1', user: nil) account.save!(validate: false) user = Fabricate(:user, email: 'pam@example.com', password: nil, account: account, external: true) user @@ -136,7 +139,7 @@ RSpec.describe Auth::SessionsController, type: :controller do end it 'shows a login error' do - expect(flash[:alert]).to match I18n.t('devise.failure.invalid', authentication_keys: 'Email') + expect(flash[:alert]).to match I18n.t('devise.failure.invalid', authentication_keys: I18n.t('activerecord.attributes.user.email')) end it "doesn't log the user in" do @@ -206,6 +209,38 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using email and password after an unfinished log-in attempt to a 2FA-protected account' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret(32)) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'renders two factor authentication page' do + expect(controller).to render_template("two_factor") + expect(controller).to render_template(partial: "_otp_authentication_form") + end + end + + context 'using email and password after an unfinished log-in attempt with a sign-in token challenge' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: false, current_sign_in_at: 1.month.ago) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'renders two factor authentication page' do + expect(controller).to render_template("two_factor") + expect(controller).to render_template(partial: "_otp_authentication_form") + end + end + context 'using upcase email and password' do before do post :create, params: { user: { email: user.email.upcase, password: user.password } } @@ -231,6 +266,21 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using a valid OTP, attempting to leverage previous half-login to bypass password auth' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: false, current_sign_in_at: 1.month.ago) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, otp_attempt: user.current_otp } }, session: { attempt_user_updated_at: user.updated_at.to_s } + end + + it "doesn't log the user in" do + expect(controller.current_user).to be_nil + end + end + context 'when the server has an decryption error' do before do allow_any_instance_of(User).to receive(:validate_and_consume_otp!).and_raise(OpenSSL::Cipher::CipherError) @@ -353,7 +403,7 @@ RSpec.describe Auth::SessionsController, type: :controller do end context 'when 2FA is disabled and IP is unfamiliar' do - let!(:user) { Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', current_sign_in_at: 3.weeks.ago, current_sign_in_ip: '0.0.0.0') } + let!(:user) { Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', current_sign_in_at: 3.weeks.ago) } before do request.remote_ip = '10.10.10.10' @@ -380,6 +430,52 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using email and password after an unfinished log-in attempt to a 2FA-protected account' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret(32)) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'renders sign in token authentication page' do + expect(controller).to render_template("sign_in_token") + end + + it 'generates sign in token' do + expect(user.reload.sign_in_token).to_not be_nil + end + + it 'sends sign in token e-mail' do + expect(UserMailer).to have_received(:sign_in_token) + end + end + + context 'using email and password after an unfinished log-in attempt with a sign-in token challenge' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: false, current_sign_in_at: 1.month.ago) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'renders sign in token authentication page' do + expect(controller).to render_template("sign_in_token") + end + + it 'generates sign in token' do + expect(user.reload.sign_in_token).to_not be_nil + end + + it 'sends sign in token e-mail' do + expect(UserMailer).to have_received(:sign_in_token).with(user, any_args) + end + end + context 'using a valid sign in token' do before do user.generate_sign_in_token && user.save @@ -395,6 +491,22 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using a valid sign in token, attempting to leverage previous half-login to bypass password auth' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: false, current_sign_in_at: 1.month.ago) + end + + before do + user.generate_sign_in_token && user.save + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, sign_in_token_attempt: user.sign_in_token } }, session: { attempt_user_updated_at: user.updated_at.to_s } + end + + it "doesn't log the user in" do + expect(controller.current_user).to be_nil + end + end + context 'using an invalid sign in token' do before do post :create, params: { user: { sign_in_token_attempt: 'wrongotp' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } @@ -410,4 +522,33 @@ RSpec.describe Auth::SessionsController, type: :controller do end end end + + describe 'GET #webauthn_options' do + context 'with WebAuthn and OTP enabled as second factor' do + let(:domain) { "#{Rails.configuration.x.use_https ? 'https' : 'http' }://#{Rails.configuration.x.web_domain}" } + + let(:fake_client) { WebAuthn::FakeClient.new(domain) } + + let!(:user) do + Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret(32)) + end + + before do + user.update(webauthn_id: WebAuthn.generate_user_id) + public_key_credential = WebAuthn::Credential.from_create(fake_client.create) + user.webauthn_credentials.create( + nickname: 'SecurityKeyNickname', + external_id: public_key_credential.id, + public_key: public_key_credential.public_key, + sign_count: '1000' + ) + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'returns http success' do + get :webauthn_options + expect(response).to have_http_status :ok + end + end + end end diff --git a/spec/controllers/authorize_interactions_controller_spec.rb b/spec/controllers/authorize_interactions_controller_spec.rb index ce4257b68d..99f3f6ffc6 100644 --- a/spec/controllers/authorize_interactions_controller_spec.rb +++ b/spec/controllers/authorize_interactions_controller_spec.rb @@ -16,7 +16,6 @@ describe AuthorizeInteractionsController do describe 'when signed in' do let(:user) { Fabricate(:user) } - let(:account) { Fabricate(:account, user: user) } before do sign_in(user) @@ -76,7 +75,7 @@ describe AuthorizeInteractionsController do describe 'when signed in' do let!(:user) { Fabricate(:user) } - let!(:account) { user.account } + let(:account) { user.account } before do sign_in(user) @@ -99,12 +98,10 @@ describe AuthorizeInteractionsController do allow(ResolveAccountService).to receive(:new).and_return(service) allow(service).to receive(:call).with('user@hostname').and_return(target_account) - allow(service).to receive(:call).with(target_account, skip_webfinger: true).and_return(target_account) post :create, params: { acct: 'acct:user@hostname' } - expect(service).to have_received(:call).with(target_account, skip_webfinger: true) expect(account.following?(target_account)).to be true expect(response).to render_template(:success) end diff --git a/spec/controllers/concerns/account_controller_concern_spec.rb b/spec/controllers/concerns/account_controller_concern_spec.rb index 7ea214a7d3..99975f4c44 100644 --- a/spec/controllers/concerns/account_controller_concern_spec.rb +++ b/spec/controllers/concerns/account_controller_concern_spec.rb @@ -11,13 +11,36 @@ describe ApplicationController, type: :controller do end end + around do |example| + registrations_mode = Setting.registrations_mode + example.run + Setting.registrations_mode = registrations_mode + end + before do routes.draw { get 'success' => 'anonymous#success' } end + context 'when account is unconfirmed' do + it 'returns http not found' do + account = Fabricate(:user, confirmed_at: nil).account + get 'success', params: { account_username: account.username } + expect(response).to have_http_status(404) + end + end + + context 'when account is not approved' do + it 'returns http not found' do + Setting.registrations_mode = 'approved' + account = Fabricate(:user, approved: false).account + get 'success', params: { account_username: account.username } + expect(response).to have_http_status(404) + end + end + context 'when account is suspended' do it 'returns http gone' do - account = Fabricate(:account, suspended: true, user: Fabricate(:user)) + account = Fabricate(:account, suspended: true) get 'success', params: { account_username: account.username } expect(response).to have_http_status(410) end @@ -33,19 +56,19 @@ describe ApplicationController, type: :controller do context 'when account is not suspended' do it 'assigns @account' do - account = Fabricate(:account, user: Fabricate(:user)) + account = Fabricate(:account) get 'success', params: { account_username: account.username } expect(assigns(:account)).to eq account end it 'sets link headers' do - account = Fabricate(:account, username: 'username', user: Fabricate(:user)) + account = Fabricate(:account, username: 'username') get 'success', params: { account_username: 'username' } expect(response.headers['Link'].to_s).to eq '; rel="lrdd"; type="application/jrd+json", ; rel="alternate"; type="application/activity+json"' end it 'returns http success' do - account = Fabricate(:account, user: Fabricate(:user)) + account = Fabricate(:account) get 'success', params: { account_username: account.username } expect(response).to have_http_status(200) end diff --git a/spec/controllers/concerns/accountable_concern_spec.rb b/spec/controllers/concerns/accountable_concern_spec.rb index e3c06b4947..5c5180bc24 100644 --- a/spec/controllers/concerns/accountable_concern_spec.rb +++ b/spec/controllers/concerns/accountable_concern_spec.rb @@ -12,14 +12,14 @@ RSpec.describe AccountableConcern do end end - let(:user) { Fabricate(:user, account: Fabricate(:account)) } - let(:target) { Fabricate(:user, account: Fabricate(:account)) } - let(:hoge) { Hoge.new(user.account) } + let(:user) { Fabricate(:account) } + let(:target) { Fabricate(:account) } + let(:hoge) { Hoge.new(user) } describe '#log_action' do it 'creates Admin::ActionLog' do expect do - hoge.log_action(:create, target.account) + hoge.log_action(:create, target) end.to change { Admin::ActionLog.count }.by(1) end end diff --git a/spec/controllers/concerns/cache_concern_spec.rb b/spec/controllers/concerns/cache_concern_spec.rb new file mode 100644 index 0000000000..a34d7d7267 --- /dev/null +++ b/spec/controllers/concerns/cache_concern_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe CacheConcern, type: :controller do + controller(ApplicationController) do + include CacheConcern + + def empty_array + render plain: cache_collection([], Status).size + end + + def empty_relation + render plain: cache_collection(Status.none, Status).size + end + end + + before do + routes.draw do + get 'empty_array' => 'anonymous#empty_array' + post 'empty_relation' => 'anonymous#empty_relation' + end + end + + describe '#cache_collection' do + context 'given an empty array' do + it 'returns an empty array' do + get :empty_array + expect(response.body).to eq '0' + end + end + + context 'given an empty relation' do + it 'returns an empty array' do + get :empty_relation + expect(response.body).to eq '0' + end + end + end +end diff --git a/spec/controllers/concerns/export_controller_concern_spec.rb b/spec/controllers/concerns/export_controller_concern_spec.rb index fce129bee2..1a5e46f8ef 100644 --- a/spec/controllers/concerns/export_controller_concern_spec.rb +++ b/spec/controllers/concerns/export_controller_concern_spec.rb @@ -22,8 +22,8 @@ describe ApplicationController, type: :controller do get :index, format: :csv expect(response).to have_http_status(200) - expect(response.content_type).to eq 'text/csv' - expect(response.headers['Content-Disposition']).to eq 'attachment; filename="anonymous.csv"' + expect(response.media_type).to eq 'text/csv' + expect(response.headers['Content-Disposition']).to start_with 'attachment; filename="anonymous.csv"' expect(response.body).to eq user.account.username end diff --git a/spec/controllers/follower_accounts_controller_spec.rb b/spec/controllers/follower_accounts_controller_spec.rb index f6d55f6932..eb095cf30c 100644 --- a/spec/controllers/follower_accounts_controller_spec.rb +++ b/spec/controllers/follower_accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe FollowerAccountsController do render_views - let(:alice) { Fabricate(:account, username: 'alice') } + let(:alice) { Fabricate(:account) } let(:follower0) { Fabricate(:account) } let(:follower1) { Fabricate(:account) } @@ -101,6 +101,23 @@ describe FollowerAccountsController do expect(body['partOf']).to be_blank end + context 'when account hides their network' do + before do + alice.user.settings.hide_network = true + end + + it 'returns followers count' do + expect(body['totalItems']).to eq 2 + end + + it 'does not return items' do + expect(body['items']).to be_blank + expect(body['orderedItems']).to be_blank + expect(body['first']).to be_blank + expect(body['last']).to be_blank + end + end + context 'when account is permanently suspended' do before do alice.suspend! diff --git a/spec/controllers/following_accounts_controller_spec.rb b/spec/controllers/following_accounts_controller_spec.rb index 0fc0967a63..af5ce07870 100644 --- a/spec/controllers/following_accounts_controller_spec.rb +++ b/spec/controllers/following_accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe FollowingAccountsController do render_views - let(:alice) { Fabricate(:account, username: 'alice') } + let(:alice) { Fabricate(:account) } let(:followee0) { Fabricate(:account) } let(:followee1) { Fabricate(:account) } @@ -101,6 +101,23 @@ describe FollowingAccountsController do expect(body['partOf']).to be_blank end + context 'when account hides their network' do + before do + alice.user.settings.hide_network = true + end + + it 'returns followers count' do + expect(body['totalItems']).to eq 2 + end + + it 'does not return items' do + expect(body['items']).to be_blank + expect(body['orderedItems']).to be_blank + expect(body['first']).to be_blank + expect(body['last']).to be_blank + end + end + context 'when account is permanently suspended' do before do alice.suspend! diff --git a/spec/controllers/health_check_controller_spec.rb b/spec/controllers/health_controller_spec.rb similarity index 60% rename from spec/controllers/health_check_controller_spec.rb rename to spec/controllers/health_controller_spec.rb index c00600c9b3..1e41f6ed74 100644 --- a/spec/controllers/health_check_controller_spec.rb +++ b/spec/controllers/health_controller_spec.rb @@ -1,10 +1,10 @@ require 'rails_helper' -describe HealthCheck::HealthCheckController do +describe HealthController do render_views describe 'GET #show' do - subject(:response) { get :index, params: { format: :json } } + subject(:response) { get :show, params: { format: :json } } it 'returns the right response' do expect(response).to have_http_status 200 diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb index 941f1dd914..70c5c42c5c 100644 --- a/spec/controllers/home_controller_spec.rb +++ b/spec/controllers/home_controller_spec.rb @@ -8,8 +8,10 @@ RSpec.describe HomeController, type: :controller do context 'when not signed in' do context 'when requested path is tag timeline' do - before { @request.path = '/web/timelines/tag/name' } - it { is_expected.to redirect_to '/tags/name' } + it 'redirects to the tag\'s permalink' do + @request.path = '/web/timelines/tag/name' + is_expected.to redirect_to '/tags/name' + end end it 'redirects to about page' do diff --git a/spec/controllers/media_controller_spec.rb b/spec/controllers/media_controller_spec.rb index 2925aed599..efd15b5b40 100644 --- a/spec/controllers/media_controller_spec.rb +++ b/spec/controllers/media_controller_spec.rb @@ -6,33 +6,60 @@ describe MediaController do render_views describe '#show' do - it 'redirects to the file url when attached to a status' do - status = Fabricate(:status) - media_attachment = Fabricate(:media_attachment, status: status) - get :show, params: { id: media_attachment.to_param } - - expect(response).to redirect_to(media_attachment.file.url(:original)) - end - - it 'responds with missing when there is not an attached status' do - media_attachment = Fabricate(:media_attachment, status: nil) - get :show, params: { id: media_attachment.to_param } - - expect(response).to have_http_status(404) - end - it 'raises when shortcode cant be found' do get :show, params: { id: 'missing' } expect(response).to have_http_status(404) end - it 'raises when not permitted to view' do - status = Fabricate(:status, visibility: :direct) - media_attachment = Fabricate(:media_attachment, status: status) - get :show, params: { id: media_attachment.to_param } + context 'when the media attachment has a shortcode' do + it 'redirects to the file url when attached to a status' do + status = Fabricate(:status) + media_attachment = Fabricate(:media_attachment, status: status, shortcode: 'OI6IgDzG-nYTqvDQ994') + get :show, params: { id: media_attachment.to_param } - expect(response).to have_http_status(404) + expect(response).to redirect_to(media_attachment.file.url(:original)) + end + + it 'responds with missing when there is not an attached status' do + media_attachment = Fabricate(:media_attachment, status: nil, shortcode: 'OI6IgDzG-nYTqvDQ994') + get :show, params: { id: media_attachment.to_param } + + expect(response).to have_http_status(404) + end + + it 'raises when not permitted to view' do + status = Fabricate(:status, visibility: :direct) + media_attachment = Fabricate(:media_attachment, status: status, shortcode: 'OI6IgDzG-nYTqvDQ994') + get :show, params: { id: media_attachment.to_param } + + expect(response).to have_http_status(404) + end + end + + context 'when the media attachment has no shortcode' do + it 'redirects to the file url when attached to a status' do + status = Fabricate(:status) + media_attachment = Fabricate(:media_attachment, status: status) + get :show, params: { id: media_attachment.to_param } + + expect(response).to redirect_to(media_attachment.file.url(:original)) + end + + it 'responds with missing when there is not an attached status' do + media_attachment = Fabricate(:media_attachment, status: nil) + get :show, params: { id: media_attachment.to_param } + + expect(response).to have_http_status(404) + end + + it 'raises when not permitted to view' do + status = Fabricate(:status, visibility: :direct) + media_attachment = Fabricate(:media_attachment, status: status) + get :show, params: { id: media_attachment.to_param } + + expect(response).to have_http_status(404) + end end end end diff --git a/spec/controllers/relationships_controller_spec.rb b/spec/controllers/relationships_controller_spec.rb index 16e255afe1..2056a2ac29 100644 --- a/spec/controllers/relationships_controller_spec.rb +++ b/spec/controllers/relationships_controller_spec.rb @@ -36,11 +36,7 @@ describe RelationshipsController do end describe 'PATCH #update' do - let(:poopfeast) { Fabricate(:account, username: 'poopfeast', domain: 'example.com', salmon_url: 'http://example.com/salmon') } - - before do - stub_request(:post, 'http://example.com/salmon').to_return(status: 200) - end + let(:poopfeast) { Fabricate(:account, username: 'poopfeast', domain: 'example.com') } shared_examples 'redirects back to followers page' do it 'redirects back to followers page' do diff --git a/spec/controllers/settings/deletes_controller_spec.rb b/spec/controllers/settings/deletes_controller_spec.rb index 8d5c4774fd..cd36ecc35e 100644 --- a/spec/controllers/settings/deletes_controller_spec.rb +++ b/spec/controllers/settings/deletes_controller_spec.rb @@ -17,7 +17,7 @@ describe Settings::DeletesController do end context 'when suspended' do - let(:user) { Fabricate(:user, account_attributes: { username: 'alice', suspended_at: Time.now.utc }) } + let(:user) { Fabricate(:user, account_attributes: { suspended_at: Time.now.utc }) } it 'returns http forbidden' do get :show @@ -59,8 +59,12 @@ describe Settings::DeletesController do expect(user.account.reload).to be_suspended end + it 'does not create an email block' do + expect(CanonicalEmailBlock.block?(user.email)).to be false + end + context 'when suspended' do - let(:user) { Fabricate(:user, account_attributes: { username: 'alice', suspended_at: Time.now.utc }) } + let(:user) { Fabricate(:user, account_attributes: { suspended_at: Time.now.utc }) } it 'returns http forbidden' do expect(response).to have_http_status(403) diff --git a/spec/controllers/settings/identity_proofs_controller_spec.rb b/spec/controllers/settings/identity_proofs_controller_spec.rb deleted file mode 100644 index 16f2362278..0000000000 --- a/spec/controllers/settings/identity_proofs_controller_spec.rb +++ /dev/null @@ -1,186 +0,0 @@ -require 'rails_helper' - -describe Settings::IdentityProofsController do - include RoutingHelper - render_views - - let(:user) { Fabricate(:user) } - let(:valid_token) { '1'*66 } - let(:kbname) { 'kbuser' } - let(:provider) { 'keybase' } - let(:findable_id) { Faker::Number.number(digits: 5) } - let(:unfindable_id) { Faker::Number.number(digits: 5) } - let(:new_proof_params) do - { provider: provider, provider_username: kbname, token: valid_token, username: user.account.username } - end - let(:status_text) { "i just proved that i am also #{kbname} on #{provider}." } - let(:status_posting_params) do - { post_status: '0', status_text: status_text } - end - let(:postable_params) do - { account_identity_proof: new_proof_params.merge(status_posting_params) } - end - - before do - allow_any_instance_of(ProofProvider::Keybase::Verifier).to receive(:status) { { 'proof_valid' => true, 'proof_live' => true } } - sign_in user, scope: :user - end - - describe 'new proof creation' do - context 'GET #new' do - before do - allow_any_instance_of(ProofProvider::Keybase::Badge).to receive(:avatar_url) { full_pack_url('media/images/void.png') } - end - - context 'with all of the correct params' do - it 'renders the template' do - get :new, params: new_proof_params - expect(response).to render_template(:new) - end - end - - context 'without any params' do - it 'redirects to :index' do - get :new, params: {} - expect(response).to redirect_to settings_identity_proofs_path - end - end - - context 'with params to prove a different, not logged-in user' do - let(:wrong_user_params) { new_proof_params.merge(username: 'someone_else') } - - it 'shows a helpful alert' do - get :new, params: wrong_user_params - expect(flash[:alert]).to eq I18n.t('identity_proofs.errors.wrong_user', proving: 'someone_else', current: user.account.username) - end - end - - context 'with params to prove the same username cased differently' do - let(:capitalized_username) { new_proof_params.merge(username: user.account.username.upcase) } - - it 'renders the new template' do - get :new, params: capitalized_username - expect(response).to render_template(:new) - end - end - end - - context 'POST #create' do - context 'when saving works' do - before do - allow(ProofProvider::Keybase::Worker).to receive(:perform_async) - allow_any_instance_of(ProofProvider::Keybase::Verifier).to receive(:valid?) { true } - allow_any_instance_of(AccountIdentityProof).to receive(:on_success_path) { root_url } - end - - it 'serializes a ProofProvider::Keybase::Worker' do - expect(ProofProvider::Keybase::Worker).to receive(:perform_async) - post :create, params: postable_params - end - - it 'delegates redirection to the proof provider' do - expect_any_instance_of(AccountIdentityProof).to receive(:on_success_path) - post :create, params: postable_params - expect(response).to redirect_to root_url - end - - it 'does not post a status' do - expect(PostStatusService).not_to receive(:new) - post :create, params: postable_params - end - - context 'and the user has requested to post a status' do - let(:postable_params_with_status) do - postable_params.tap { |p| p[:account_identity_proof][:post_status] = '1' } - end - - it 'posts a status' do - expect_any_instance_of(PostStatusService).to receive(:call).with(user.account, text: status_text) - - post :create, params: postable_params_with_status - end - end - end - - context 'when saving fails' do - before do - allow_any_instance_of(ProofProvider::Keybase::Verifier).to receive(:valid?) { false } - end - - it 'redirects to :index' do - post :create, params: postable_params - expect(response).to redirect_to settings_identity_proofs_path - end - - it 'flashes a helpful message' do - post :create, params: postable_params - expect(flash[:alert]).to eq I18n.t('identity_proofs.errors.failed', provider: 'Keybase') - end - end - - context 'it can also do an update if the provider and username match an existing proof' do - before do - allow_any_instance_of(ProofProvider::Keybase::Verifier).to receive(:valid?) { true } - allow(ProofProvider::Keybase::Worker).to receive(:perform_async) - Fabricate(:account_identity_proof, account: user.account, provider: provider, provider_username: kbname) - allow_any_instance_of(AccountIdentityProof).to receive(:on_success_path) { root_url } - end - - it 'calls update with the new token' do - expect_any_instance_of(AccountIdentityProof).to receive(:save) do |proof| - expect(proof.token).to eq valid_token - end - - post :create, params: postable_params - end - end - end - end - - describe 'GET #index' do - context 'with no existing proofs' do - it 'shows the helpful explanation' do - get :index - expect(response.body).to match I18n.t('identity_proofs.explanation_html') - end - end - - context 'with two proofs' do - before do - allow_any_instance_of(ProofProvider::Keybase::Verifier).to receive(:valid?) { true } - @proof1 = Fabricate(:account_identity_proof, account: user.account) - @proof2 = Fabricate(:account_identity_proof, account: user.account) - allow_any_instance_of(AccountIdentityProof).to receive(:badge) { double(avatar_url: '', profile_url: '', proof_url: '') } - allow_any_instance_of(AccountIdentityProof).to receive(:refresh!) {} - end - - it 'has the first proof username on the page' do - get :index - expect(response.body).to match /#{Regexp.quote(@proof1.provider_username)}/ - end - - it 'has the second proof username on the page' do - get :index - expect(response.body).to match /#{Regexp.quote(@proof2.provider_username)}/ - end - end - end - - describe 'DELETE #destroy' do - before do - allow_any_instance_of(ProofProvider::Keybase::Verifier).to receive(:valid?) { true } - @proof1 = Fabricate(:account_identity_proof, account: user.account) - allow_any_instance_of(AccountIdentityProof).to receive(:badge) { double(avatar_url: '', profile_url: '', proof_url: '') } - allow_any_instance_of(AccountIdentityProof).to receive(:refresh!) {} - delete :destroy, params: { id: @proof1.id } - end - - it 'redirects to :index' do - expect(response).to redirect_to settings_identity_proofs_path - end - - it 'removes the proof' do - expect(AccountIdentityProof.where(id: @proof1.id).count).to eq 0 - end - end -end diff --git a/spec/controllers/settings/imports_controller_spec.rb b/spec/controllers/settings/imports_controller_spec.rb index 7a9b021957..b8caf59413 100644 --- a/spec/controllers/settings/imports_controller_spec.rb +++ b/spec/controllers/settings/imports_controller_spec.rb @@ -21,7 +21,7 @@ RSpec.describe Settings::ImportsController, type: :controller do post :create, params: { import: { type: 'following', - data: fixture_file_upload('files/imports.txt') + data: fixture_file_upload('imports.txt') } } @@ -34,7 +34,7 @@ RSpec.describe Settings::ImportsController, type: :controller do post :create, params: { import: { type: 'blocking', - data: fixture_file_upload('files/imports.txt') + data: fixture_file_upload('imports.txt') } } diff --git a/spec/controllers/settings/migrations_controller_spec.rb b/spec/controllers/settings/migrations_controller_spec.rb index 36e4ba86e4..35c5747a06 100644 --- a/spec/controllers/settings/migrations_controller_spec.rb +++ b/spec/controllers/settings/migrations_controller_spec.rb @@ -19,8 +19,7 @@ describe Settings::MigrationsController do context 'when user is sign in' do subject { get :show } - let(:user) { Fabricate(:user, account: account) } - let(:account) { Fabricate(:account, moved_to_account: moved_to_account) } + let(:user) { Fabricate(:account, moved_to_account: moved_to_account).user } before { sign_in user, scope: :user } @@ -51,7 +50,7 @@ describe Settings::MigrationsController do it_behaves_like 'authenticate user' end - context 'when user is sign in' do + context 'when user is signed in' do subject { post :create, params: { account_migration: { acct: acct, current_password: '12345678' } } } let(:user) { Fabricate(:user, password: '12345678') } @@ -67,12 +66,45 @@ describe Settings::MigrationsController do end end - context 'when acct is a current account' do + context 'when acct is the current account' do let(:acct) { user.account } it 'renders show' do is_expected.to render_template :show end + + it 'does not update the moved account' do + expect(user.account.reload.moved_to_account_id).to be_nil + end + end + + context 'when target account does not reference the account being moved from' do + let(:acct) { Fabricate(:account, also_known_as: []) } + + it 'renders show' do + is_expected.to render_template :show + end + + it 'does not update the moved account' do + expect(user.account.reload.moved_to_account_id).to be_nil + end + end + + context 'when a recent migration already exists ' do + let(:acct) { Fabricate(:account, also_known_as: [ActivityPub::TagManager.instance.uri_for(user.account)]) } + + before do + moved_to = Fabricate(:account, also_known_as: [ActivityPub::TagManager.instance.uri_for(user.account)]) + user.account.migrations.create!(acct: moved_to.acct) + end + + it 'renders show' do + is_expected.to render_template :show + end + + it 'does not update the moved account' do + expect(user.account.reload.moved_to_account_id).to be_nil + end end end end diff --git a/spec/controllers/settings/profiles_controller_spec.rb b/spec/controllers/settings/profiles_controller_spec.rb index 5b1fe3acad..ee3aec8156 100644 --- a/spec/controllers/settings/profiles_controller_spec.rb +++ b/spec/controllers/settings/profiles_controller_spec.rb @@ -3,9 +3,11 @@ require 'rails_helper' RSpec.describe Settings::ProfilesController, type: :controller do render_views + let!(:user) { Fabricate(:user) } + let(:account) { user.account } + before do - @user = Fabricate(:user) - sign_in @user, scope: :user + sign_in user, scope: :user end describe "GET #show" do @@ -16,10 +18,12 @@ RSpec.describe Settings::ProfilesController, type: :controller do end describe 'PUT #update' do + before do + user.account.update(display_name: 'Old name') + end + it 'updates the user profile' do allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async) - account = Fabricate(:account, user: @user, display_name: 'Old name') - put :update, params: { account: { display_name: 'New name' } } expect(account.reload.display_name).to eq 'New name' expect(response).to redirect_to(settings_profile_path) @@ -30,10 +34,9 @@ RSpec.describe Settings::ProfilesController, type: :controller do describe 'PUT #update with new profile image' do it 'updates profile image' do allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async) - account = Fabricate(:account, user: @user, display_name: 'AvatarTest') expect(account.avatar.instance.avatar_file_name).to be_nil - put :update, params: { account: { avatar: fixture_file_upload('files/avatar.gif', 'image/gif') } } + put :update, params: { account: { avatar: fixture_file_upload('avatar.gif', 'image/gif') } } expect(response).to redirect_to(settings_profile_path) expect(account.reload.avatar.instance.avatar_file_name).not_to be_nil expect(ActivityPub::UpdateDistributionWorker).to have_received(:perform_async).with(account.id) @@ -43,8 +46,7 @@ RSpec.describe Settings::ProfilesController, type: :controller do describe 'PUT #update with oversized image' do it 'gives the user an error message' do allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async) - account = Fabricate(:account, user: @user, display_name: 'AvatarTest') - put :update, params: { account: { avatar: fixture_file_upload('files/4096x4097.png', 'image/png') } } + put :update, params: { account: { avatar: fixture_file_upload('4096x4097.png', 'image/png') } } expect(response.body).to include('images are not supported') end end diff --git a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb index cdfeef8d6a..7b86513bef 100644 --- a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb @@ -11,7 +11,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do subject expect(assigns(:confirmation)).to be_instance_of Form::TwoFactorConfirmation - expect(assigns(:provision_url)).to eq 'otpauth://totp/local-part@domain?secret=thisisasecretforthespecofnewview&issuer=cb6e6126.ngrok.io' + expect(assigns(:provision_url)).to eq 'otpauth://totp/cb6e6126.ngrok.io:local-part%40domain?secret=thisisasecretforthespecofnewview&issuer=cb6e6126.ngrok.io' expect(assigns(:qrcode)).to be_instance_of RQRCode::QRCode expect(response).to have_http_status(200) expect(response).to render_template(:new) diff --git a/spec/controllers/statuses_cleanup_controller_spec.rb b/spec/controllers/statuses_cleanup_controller_spec.rb new file mode 100644 index 0000000000..9247092603 --- /dev/null +++ b/spec/controllers/statuses_cleanup_controller_spec.rb @@ -0,0 +1,27 @@ +require 'rails_helper' + +RSpec.describe StatusesCleanupController, type: :controller do + render_views + + before do + @user = Fabricate(:user) + sign_in @user, scope: :user + end + + describe "GET #show" do + it "returns http success" do + get :show + expect(response).to have_http_status(200) + end + end + + describe 'PUT #update' do + it 'updates the account status cleanup policy' do + put :update, params: { account_statuses_cleanup_policy: { enabled: true, min_status_age: 2.weeks.seconds, keep_direct: false, keep_polls: true } } + expect(response).to redirect_to(statuses_cleanup_path) + expect(@user.account.statuses_cleanup_policy.enabled).to eq true + expect(@user.account.statuses_cleanup_policy.keep_direct).to eq false + expect(@user.account.statuses_cleanup_policy.keep_polls).to eq true + end + end +end diff --git a/spec/controllers/well_known/host_meta_controller_spec.rb b/spec/controllers/well_known/host_meta_controller_spec.rb index 643ba9cd32..c02aa0d596 100644 --- a/spec/controllers/well_known/host_meta_controller_spec.rb +++ b/spec/controllers/well_known/host_meta_controller_spec.rb @@ -8,7 +8,7 @@ describe WellKnown::HostMetaController, type: :controller do get :show, format: :xml expect(response).to have_http_status(200) - expect(response.content_type).to eq 'application/xrd+xml' + expect(response.media_type).to eq 'application/xrd+xml' expect(response.body).to eq < diff --git a/spec/controllers/well_known/keybase_proof_config_controller_spec.rb b/spec/controllers/well_known/keybase_proof_config_controller_spec.rb deleted file mode 100644 index 9067e676de..0000000000 --- a/spec/controllers/well_known/keybase_proof_config_controller_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'rails_helper' - -describe WellKnown::KeybaseProofConfigController, type: :controller do - render_views - - describe 'GET #show' do - it 'renders json' do - get :show - - expect(response).to have_http_status(200) - expect(response.content_type).to eq 'application/json' - expect { JSON.parse(response.body) }.not_to raise_exception - end - end -end diff --git a/spec/controllers/well_known/nodeinfo_controller_spec.rb b/spec/controllers/well_known/nodeinfo_controller_spec.rb index 12e1fa4159..694bb0fb9f 100644 --- a/spec/controllers/well_known/nodeinfo_controller_spec.rb +++ b/spec/controllers/well_known/nodeinfo_controller_spec.rb @@ -8,7 +8,7 @@ describe WellKnown::NodeInfoController, type: :controller do get :index expect(response).to have_http_status(200) - expect(response.content_type).to eq 'application/json' + expect(response.media_type).to eq 'application/json' json = body_as_json @@ -23,7 +23,7 @@ describe WellKnown::NodeInfoController, type: :controller do get :show expect(response).to have_http_status(200) - expect(response.content_type).to eq 'application/json' + expect(response.media_type).to eq 'application/json' json = body_as_json diff --git a/spec/controllers/well_known/webfinger_controller_spec.rb b/spec/controllers/well_known/webfinger_controller_spec.rb index cf7005b0e7..8574d369d1 100644 --- a/spec/controllers/well_known/webfinger_controller_spec.rb +++ b/spec/controllers/well_known/webfinger_controller_spec.rb @@ -24,8 +24,12 @@ describe WellKnown::WebfingerController, type: :controller do expect(response).to have_http_status(200) end + it 'does not set a Vary header' do + expect(response.headers['Vary']).to be_nil + end + it 'returns application/jrd+json' do - expect(response.content_type).to eq 'application/jrd+json' + expect(response.media_type).to eq 'application/jrd+json' end it 'returns links for the account' do diff --git a/spec/fabricators/account_fabricator.rb b/spec/fabricators/account_fabricator.rb index ab900c5fa0..f1cce281ca 100644 --- a/spec/fabricators/account_fabricator.rb +++ b/spec/fabricators/account_fabricator.rb @@ -10,4 +10,5 @@ Fabricator(:account) do private_key { private_key } suspended_at { |attrs| attrs[:suspended] ? Time.now.utc : nil } silenced_at { |attrs| attrs[:silenced] ? Time.now.utc : nil } + user { |attrs| attrs[:domain].nil? ? Fabricate.build(:user, account: nil) : nil } end diff --git a/spec/fabricators/account_identity_proof_fabricator.rb b/spec/fabricators/account_identity_proof_fabricator.rb deleted file mode 100644 index 7b932fa968..0000000000 --- a/spec/fabricators/account_identity_proof_fabricator.rb +++ /dev/null @@ -1,8 +0,0 @@ -Fabricator(:account_identity_proof) do - account - provider 'keybase' - provider_username { sequence(:provider_username) { |i| "#{Faker::Lorem.characters(number: 15)}" } } - token { sequence(:token) { |i| "#{i}#{Faker::Crypto.sha1()*2}"[0..65] } } - verified false - live false -end diff --git a/spec/fabricators/account_statuses_cleanup_policy_fabricator.rb b/spec/fabricators/account_statuses_cleanup_policy_fabricator.rb new file mode 100644 index 0000000000..29cf1d1339 --- /dev/null +++ b/spec/fabricators/account_statuses_cleanup_policy_fabricator.rb @@ -0,0 +1,3 @@ +Fabricator(:account_statuses_cleanup_policy) do + account +end diff --git a/spec/fabricators/canonical_email_block_fabricator.rb b/spec/fabricators/canonical_email_block_fabricator.rb new file mode 100644 index 0000000000..a0b6e0d221 --- /dev/null +++ b/spec/fabricators/canonical_email_block_fabricator.rb @@ -0,0 +1,4 @@ +Fabricator(:canonical_email_block) do + email "test@example.com" + reference_account { Fabricate(:account) } +end diff --git a/spec/fabricators/follow_recommendation_suppression_fabricator.rb b/spec/fabricators/follow_recommendation_suppression_fabricator.rb new file mode 100644 index 0000000000..4a6a07a66c --- /dev/null +++ b/spec/fabricators/follow_recommendation_suppression_fabricator.rb @@ -0,0 +1,3 @@ +Fabricator(:follow_recommendation_suppression) do + account +end diff --git a/spec/fabricators/login_activity_fabricator.rb b/spec/fabricators/login_activity_fabricator.rb new file mode 100644 index 0000000000..931d3082cc --- /dev/null +++ b/spec/fabricators/login_activity_fabricator.rb @@ -0,0 +1,8 @@ +Fabricator(:login_activity) do + user + strategy 'password' + success true + failure_reason nil + ip { Faker::Internet.ip_v4_address } + user_agent { Faker::Internet.user_agent } +end diff --git a/spec/fabricators/preview_card_fabricator.rb b/spec/fabricators/preview_card_fabricator.rb new file mode 100644 index 0000000000..f119c117d9 --- /dev/null +++ b/spec/fabricators/preview_card_fabricator.rb @@ -0,0 +1,6 @@ +Fabricator(:preview_card) do + url { Faker::Internet.url } + title { Faker::Lorem.sentence } + description { Faker::Lorem.paragraph } + type 'link' +end diff --git a/spec/fabricators/report_fabricator.rb b/spec/fabricators/report_fabricator.rb index 5bd4a63f02..2c7101e094 100644 --- a/spec/fabricators/report_fabricator.rb +++ b/spec/fabricators/report_fabricator.rb @@ -1,6 +1,6 @@ Fabricator(:report) do account - target_account { Fabricate(:account) } - comment "You nasty" - action_taken false + target_account { Fabricate(:account) } + comment "You nasty" + action_taken_at nil end diff --git a/spec/fabricators/rule_fabricator.rb b/spec/fabricators/rule_fabricator.rb new file mode 100644 index 0000000000..4bdfd05e0e --- /dev/null +++ b/spec/fabricators/rule_fabricator.rb @@ -0,0 +1,5 @@ +Fabricator(:rule) do + priority "" + deleted_at "2021-02-21 05:51:09" + text "MyText" +end \ No newline at end of file diff --git a/spec/fabricators/status_edit_fabricator.rb b/spec/fabricators/status_edit_fabricator.rb new file mode 100644 index 0000000000..21b793747e --- /dev/null +++ b/spec/fabricators/status_edit_fabricator.rb @@ -0,0 +1,7 @@ +Fabricator(:status_edit) do + status nil + account nil + text "MyText" + spoiler_text "MyText" + media_attachments_changed false +end \ No newline at end of file diff --git a/spec/fabricators/user_fabricator.rb b/spec/fabricators/user_fabricator.rb index 8f59565016..10ad2c53a3 100644 --- a/spec/fabricators/user_fabricator.rb +++ b/spec/fabricators/user_fabricator.rb @@ -1,5 +1,5 @@ Fabricator(:user) do - account + account { Fabricate.build(:account, user: nil) } email { sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } } password "123456789" confirmed_at { Time.zone.now } diff --git a/spec/fixtures/files/boop.ogg b/spec/fixtures/files/boop.ogg new file mode 100644 index 0000000000..23cbbedb16 Binary files /dev/null and b/spec/fixtures/files/boop.ogg differ diff --git a/spec/fixtures/requests/oembed_youtube.html b/spec/fixtures/requests/oembed_youtube.html new file mode 100644 index 0000000000..1508e4dd95 --- /dev/null +++ b/spec/fixtures/requests/oembed_youtube.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/spec/fixtures/xml/mastodon.atom b/spec/fixtures/xml/mastodon.atom deleted file mode 100644 index 92921a9380..0000000000 --- a/spec/fixtures/xml/mastodon.atom +++ /dev/null @@ -1,261 +0,0 @@ - - - http://kickass.zone/users/localhost.atom - ::1 - 2016-10-10T13:29:56Z - http://kickass.zone/system/accounts/avatars/000/000/001/medium/eris.png - - http://activitystrea.ms/schema/1.0/person - http://kickass.zone/users/localhost - localhost - localhost@kickass.zone - - - - - localhost - ::1 - - - - - - - tag:kickass.zone,2016-10-10:objectId=7:objectType=Follow - 2016-10-10T13:29:56Z - 2016-10-10T13:29:56Z - localhost started following kat@mastodon.social - localhost started following kat@mastodon.social - http://activitystrea.ms/schema/1.0/follow - - - http://activitystrea.ms/schema/1.0/activity - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/kat - kat - kat@mastodon.social - #trans #queer - - - - - kat - Kat - #trans #queer - - - - tag:kickass.zone,2016-10-10:objectId=3:objectType=Favourite - 2016-10-10T13:29:26Z - 2016-10-10T13:29:26Z - localhost favourited a status by kat@mastodon.social - localhost favourited a status by kat@mastodon.social - http://activitystrea.ms/schema/1.0/favorite - - - http://activitystrea.ms/schema/1.0/activity - - - http://activitystrea.ms/schema/1.0/comment - tag:mastodon.social,2016-10-10:objectId=22833:objectType=Status - @localhost oooh more mastodons ❤ - - <p><a href="http://kickass.zone/users/localhost">@localhost</a> oooh more mastodons ❤</p> - http://activitystrea.ms/schema/1.0/post - 2016-10-10T13:23:35Z - 2016-10-10T13:23:35Z - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/kat - kat - kat@mastodon.social - #trans #queer - - - - - kat - Kat - #trans #queer - - - - - - tag:kickass.zone,2016-10-10:objectId=2:objectType=Favourite - 2016-10-10T13:13:15Z - 2016-10-10T13:13:15Z - localhost favourited a status by Gargron@mastodon.social - localhost favourited a status by Gargron@mastodon.social - http://activitystrea.ms/schema/1.0/favorite - - - http://activitystrea.ms/schema/1.0/activity - - - http://activitystrea.ms/schema/1.0/note - tag:mastodon.social,2016-10-10:objectId=22825:objectType=Status - Deployed some fixes - - <p>Deployed some fixes</p> - http://activitystrea.ms/schema/1.0/post - 2016-10-10T13:10:37Z - 2016-10-10T13:10:37Z - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/Gargron - Gargron - Gargron@mastodon.social - Developer of Mastodon, a GNU social alternative: https://github.com/tootsuite/mastodon - - - - - Gargron - Eugen - Developer of Mastodon, a GNU social alternative: https://github.com/tootsuite/mastodon - - - - - tag:kickass.zone,2016-10-10:objectId=17:objectType=Status - 2016-10-10T00:41:31Z - 2016-10-10T00:41:31Z - Social media needs MOAR cats! http://kickass.zone/media/3 - <p>Social media needs MOAR cats! <a rel="nofollow noopener noreferrer" href="http://kickass.zone/media/3">http://kickass.zone/media/3</a></p> - http://activitystrea.ms/schema/1.0/post - - - http://activitystrea.ms/schema/1.0/note - - - - tag:kickass.zone,2016-10-10:objectId=14:objectType=Status - 2016-10-10T00:38:39Z - 2016-10-10T00:38:39Z - http://kickass.zone/media/2 - <p><a rel="nofollow noopener noreferrer" href="http://kickass.zone/media/2">http://kickass.zone/media/2</a></p> - http://activitystrea.ms/schema/1.0/post - - - http://activitystrea.ms/schema/1.0/note - - - - tag:kickass.zone,2016-10-10:objectId=12:objectType=Status - 2016-10-10T00:37:49Z - 2016-10-10T00:37:49Z - - <activity:verb>http://activitystrea.ms/schema/1.0/delete</activity:verb> - <link rel="self" type="application/atom+xml" href="http://kickass.zone/users/localhost/updates/7.atom"/> - <link rel="alternate" type="text/html" href="http://kickass.zone/users/localhost/updates/7"/> - <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type> - </entry> - <entry> - <id>tag:kickass.zone,2016-10-10:objectId=4:objectType=Follow</id> - <published>2016-10-10T00:23:07Z</published> - <updated>2016-10-10T00:23:07Z</updated> - <title>localhost started following bignimbus@mastodon.social - localhost started following bignimbus@mastodon.social - http://activitystrea.ms/schema/1.0/follow - - - http://activitystrea.ms/schema/1.0/activity - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/bignimbus - bignimbus - bignimbus@mastodon.social - jdauriemma.com - - - - - bignimbus - Jeff Auriemma - jdauriemma.com - - - - tag:kickass.zone,2016-10-10:objectId=2:objectType=Follow - 2016-10-10T00:14:18Z - 2016-10-10T00:14:18Z - localhost started following Gargron@mastodon.social - localhost started following Gargron@mastodon.social - http://activitystrea.ms/schema/1.0/follow - - - http://activitystrea.ms/schema/1.0/activity - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/Gargron - Gargron - Gargron@mastodon.social - Developer of Mastodon, a GNU social alternative: https://github.com/tootsuite/mastodon - - - - - Gargron - Eugen - Developer of Mastodon, a GNU social alternative: https://github.com/tootsuite/mastodon - - - - tag:kickass.zone,2016-10-10:objectId=1:objectType=Follow - 2016-10-10T00:09:09Z - 2016-10-10T00:09:09Z - localhost started following abc@mastodon.social - localhost started following abc@mastodon.social - http://activitystrea.ms/schema/1.0/follow - - - http://activitystrea.ms/schema/1.0/activity - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/abc - abc - abc@mastodon.social - - - - - abc - abc - - - - tag:kickass.zone,2016-10-10:objectId=3:objectType=Status - 2016-10-10T00:02:47Z - 2016-10-10T00:02:47Z - - <activity:verb>http://activitystrea.ms/schema/1.0/delete</activity:verb> - <link rel="self" type="application/atom+xml" href="http://kickass.zone/users/localhost/updates/3.atom"/> - <link rel="alternate" type="text/html" href="http://kickass.zone/users/localhost/updates/3"/> - <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type> - </entry> - <entry> - <id>tag:kickass.zone,2016-10-10:objectId=2:objectType=Status</id> - <published>2016-10-10T00:02:18Z</published> - <updated>2016-10-10T00:02:18Z</updated> - <title>Yes, that was the obligatory first post. :) - <p>Yes, that was the obligatory first post. :)</p> - http://activitystrea.ms/schema/1.0/post - - - http://activitystrea.ms/schema/1.0/comment - - - - tag:kickass.zone,2016-10-10:objectId=1:objectType=Status - 2016-10-10T00:01:56Z - 2016-10-10T00:01:56Z - Hello, world! - <p>Hello, world!</p> - http://activitystrea.ms/schema/1.0/post - - - http://activitystrea.ms/schema/1.0/note - - diff --git a/spec/helpers/settings_helper_spec.rb b/spec/helpers/languages_helper_spec.rb similarity index 56% rename from spec/helpers/settings_helper_spec.rb rename to spec/helpers/languages_helper_spec.rb index 092c375836..6db617824d 100644 --- a/spec/helpers/settings_helper_spec.rb +++ b/spec/helpers/languages_helper_spec.rb @@ -2,20 +2,15 @@ require 'rails_helper' -describe SettingsHelper do +describe LanguagesHelper do describe 'the HUMAN_LOCALES constant' do it 'includes all I18n locales' do - options = I18n.available_locales - - expect(described_class::HUMAN_LOCALES.keys).to include(*options) + expect(described_class::HUMAN_LOCALES.keys).to include(*I18n.available_locales) end end describe 'human_locale' do it 'finds the human readable local description from a key' do - # Ensure the value is as we expect - expect(described_class::HUMAN_LOCALES[:en]).to eq('English') - expect(helper.human_locale(:en)).to eq('English') end end diff --git a/spec/lib/activitypub/activity/accept_spec.rb b/spec/lib/activitypub/activity/accept_spec.rb index 883bab6ac9..304cf2208a 100644 --- a/spec/lib/activitypub/activity/accept_spec.rb +++ b/spec/lib/activitypub/activity/accept_spec.rb @@ -23,6 +23,7 @@ RSpec.describe ActivityPub::Activity::Accept do subject { described_class.new(json, sender) } before do + allow(RemoteAccountRefreshWorker).to receive(:perform_async) Fabricate(:follow_request, account: recipient, target_account: sender) subject.perform end @@ -34,6 +35,10 @@ RSpec.describe ActivityPub::Activity::Accept do it 'removes the follow request' do expect(recipient.requested?(sender)).to be false end + + it 'queues a refresh' do + expect(RemoteAccountRefreshWorker).to have_received(:perform_async).with(sender.id) + end end context 'given a relay' do diff --git a/spec/lib/activitypub/activity/add_spec.rb b/spec/lib/activitypub/activity/add_spec.rb index 16db71c880..e6408b610f 100644 --- a/spec/lib/activitypub/activity/add_spec.rb +++ b/spec/lib/activitypub/activity/add_spec.rb @@ -1,8 +1,8 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Add do - let(:sender) { Fabricate(:account, featured_collection_url: 'https://example.com/featured') } - let(:status) { Fabricate(:status, account: sender) } + let(:sender) { Fabricate(:account, featured_collection_url: 'https://example.com/featured', domain: 'example.com') } + let(:status) { Fabricate(:status, account: sender, visibility: :private) } let(:json) do { @@ -24,6 +24,8 @@ RSpec.describe ActivityPub::Activity::Add do end context 'when status was not known before' do + let(:service_stub) { double } + let(:json) do { '@context': 'https://www.w3.org/ns/activitystreams', @@ -36,12 +38,40 @@ RSpec.describe ActivityPub::Activity::Add do end before do - stub_request(:get, 'https://example.com/unknown').to_return(status: 410) + allow(ActivityPub::FetchRemoteStatusService).to receive(:new).and_return(service_stub) end - it 'fetches the status' do - subject.perform - expect(a_request(:get, 'https://example.com/unknown')).to have_been_made.at_least_once + context 'when there is a local follower' do + before do + account = Fabricate(:account) + account.follow!(sender) + end + + it 'fetches the status and pins it' do + allow(service_stub).to receive(:call) do |uri, id: true, on_behalf_of: nil| + expect(uri).to eq 'https://example.com/unknown' + expect(id).to eq true + expect(on_behalf_of&.following?(sender)).to eq true + status + end + subject.perform + expect(service_stub).to have_received(:call) + expect(sender.pinned?(status)).to be true + end + end + + context 'when there is no local follower' do + it 'tries to fetch the status' do + allow(service_stub).to receive(:call) do |uri, id: true, on_behalf_of: nil| + expect(uri).to eq 'https://example.com/unknown' + expect(id).to eq true + expect(on_behalf_of).to eq nil + nil + end + subject.perform + expect(service_stub).to have_received(:call) + expect(sender.pinned?(status)).to be false + end end end end diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index 3bcae46284..3e9cbba923 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -67,7 +67,7 @@ RSpec.describe ActivityPub::Activity::Create do end end - context 'public' do + context 'public with explicit public address' do let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, @@ -85,7 +85,43 @@ RSpec.describe ActivityPub::Activity::Create do end end - context 'unlisted' do + context 'public with as:Public' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'as:Public', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'public' + end + end + + context 'public with Public' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'Public', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'public' + end + end + + context 'unlisted with explicit public address' do let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, @@ -103,6 +139,42 @@ RSpec.describe ActivityPub::Activity::Create do end end + context 'unlisted with as:Public' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + cc: 'as:Public', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'unlisted' + end + end + + context 'unlisted with Public' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + cc: 'Public', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'unlisted' + end + end + context 'private' do let(:object_json) do { diff --git a/spec/lib/activitypub/activity/delete_spec.rb b/spec/lib/activitypub/activity/delete_spec.rb index 37b93ecf73..9dfb8a61b4 100644 --- a/spec/lib/activitypub/activity/delete_spec.rb +++ b/spec/lib/activitypub/activity/delete_spec.rb @@ -49,4 +49,24 @@ RSpec.describe ActivityPub::Activity::Delete do end end end + + context 'when the status has been reported' do + describe '#perform' do + subject { described_class.new(json, sender) } + let!(:reporter) { Fabricate(:account) } + + before do + reporter.reports.create!(target_account: status.account, status_ids: [status.id], forwarded: false) + subject.perform + end + + it 'marks the status as deleted' do + expect(Status.find_by(id: status.id)).to be_nil + end + + it 'actually keeps a copy for inspection' do + expect(Status.with_discarded.find_by(id: status.id)).to_not be_nil + end + end + end end diff --git a/spec/lib/activitypub/activity/follow_spec.rb b/spec/lib/activitypub/activity/follow_spec.rb index 05112cc184..fd4ede82b7 100644 --- a/spec/lib/activitypub/activity/follow_spec.rb +++ b/spec/lib/activitypub/activity/follow_spec.rb @@ -17,62 +17,171 @@ RSpec.describe ActivityPub::Activity::Follow do describe '#perform' do subject { described_class.new(json, sender) } - context 'unlocked account' do - before do - subject.perform + context 'with no prior follow' do + context 'unlocked account' do + before do + subject.perform + end + + it 'creates a follow from sender to recipient' do + expect(sender.following?(recipient)).to be true + expect(sender.active_relationships.find_by(target_account: recipient).uri).to eq 'foo' + end + + it 'does not create a follow request' do + expect(sender.requested?(recipient)).to be false + end end - it 'creates a follow from sender to recipient' do - expect(sender.following?(recipient)).to be true + context 'silenced account following an unlocked account' do + before do + sender.touch(:silenced_at) + subject.perform + end + + it 'does not create a follow from sender to recipient' do + expect(sender.following?(recipient)).to be false + end + + it 'creates a follow request' do + expect(sender.requested?(recipient)).to be true + expect(sender.follow_requests.find_by(target_account: recipient).uri).to eq 'foo' + end end - it 'does not create a follow request' do - expect(sender.requested?(recipient)).to be false + context 'unlocked account muting the sender' do + before do + recipient.mute!(sender) + subject.perform + end + + it 'creates a follow from sender to recipient' do + expect(sender.following?(recipient)).to be true + expect(sender.active_relationships.find_by(target_account: recipient).uri).to eq 'foo' + end + + it 'does not create a follow request' do + expect(sender.requested?(recipient)).to be false + end + end + + context 'locked account' do + before do + recipient.update(locked: true) + subject.perform + end + + it 'does not create a follow from sender to recipient' do + expect(sender.following?(recipient)).to be false + end + + it 'creates a follow request' do + expect(sender.requested?(recipient)).to be true + expect(sender.follow_requests.find_by(target_account: recipient).uri).to eq 'foo' + end end end - context 'silenced account following an unlocked account' do + context 'when a follow relationship already exists' do before do - sender.touch(:silenced_at) - subject.perform + sender.active_relationships.create!(target_account: recipient, uri: 'bar') end - it 'does not create a follow from sender to recipient' do - expect(sender.following?(recipient)).to be false + context 'unlocked account' do + before do + subject.perform + end + + it 'correctly sets the new URI' do + expect(sender.active_relationships.find_by(target_account: recipient).uri).to eq 'foo' + end + + it 'does not create a follow request' do + expect(sender.requested?(recipient)).to be false + end end - it 'creates a follow request' do - expect(sender.requested?(recipient)).to be true + context 'silenced account following an unlocked account' do + before do + sender.touch(:silenced_at) + subject.perform + end + + it 'correctly sets the new URI' do + expect(sender.active_relationships.find_by(target_account: recipient).uri).to eq 'foo' + end + + it 'does not create a follow request' do + expect(sender.requested?(recipient)).to be false + end + end + + context 'unlocked account muting the sender' do + before do + recipient.mute!(sender) + subject.perform + end + + it 'correctly sets the new URI' do + expect(sender.active_relationships.find_by(target_account: recipient).uri).to eq 'foo' + end + + it 'does not create a follow request' do + expect(sender.requested?(recipient)).to be false + end + end + + context 'locked account' do + before do + recipient.update(locked: true) + subject.perform + end + + it 'correctly sets the new URI' do + expect(sender.active_relationships.find_by(target_account: recipient).uri).to eq 'foo' + end + + it 'does not create a follow request' do + expect(sender.requested?(recipient)).to be false + end end end - context 'unlocked account muting the sender' do + context 'when a follow request already exists' do before do - recipient.mute!(sender) - subject.perform + sender.follow_requests.create!(target_account: recipient, uri: 'bar') end - it 'creates a follow from sender to recipient' do - expect(sender.following?(recipient)).to be true + context 'silenced account following an unlocked account' do + before do + sender.touch(:silenced_at) + subject.perform + end + + it 'does not create a follow from sender to recipient' do + expect(sender.following?(recipient)).to be false + end + + it 'correctly sets the new URI' do + expect(sender.requested?(recipient)).to be true + expect(sender.follow_requests.find_by(target_account: recipient).uri).to eq 'foo' + end end - it 'does not create a follow request' do - expect(sender.requested?(recipient)).to be false - end - end + context 'locked account' do + before do + recipient.update(locked: true) + subject.perform + end - context 'locked account' do - before do - recipient.update(locked: true) - subject.perform - end + it 'does not create a follow from sender to recipient' do + expect(sender.following?(recipient)).to be false + end - it 'does not create a follow from sender to recipient' do - expect(sender.following?(recipient)).to be false - end - - it 'creates a follow request' do - expect(sender.requested?(recipient)).to be true + it 'correctly sets the new URI' do + expect(sender.requested?(recipient)).to be true + expect(sender.follow_requests.find_by(target_account: recipient).uri).to eq 'foo' + end end end end diff --git a/spec/lib/activitypub/activity/move_spec.rb b/spec/lib/activitypub/activity/move_spec.rb index 3574f273a9..2d1d276c57 100644 --- a/spec/lib/activitypub/activity/move_spec.rb +++ b/spec/lib/activitypub/activity/move_spec.rb @@ -1,23 +1,11 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Move do - let(:follower) { Fabricate(:account) } - let(:old_account) { Fabricate(:account) } - let(:new_account) { Fabricate(:account) } - - before do - follower.follow!(old_account) - - old_account.update!(uri: 'https://example.org/alice', domain: 'example.org', protocol: :activitypub, inbox_url: 'https://example.org/inbox') - new_account.update!(uri: 'https://example.com/alice', domain: 'example.com', protocol: :activitypub, inbox_url: 'https://example.com/inbox', also_known_as: [old_account.uri]) - - stub_request(:post, 'https://example.org/inbox').to_return(status: 200) - stub_request(:post, 'https://example.com/inbox').to_return(status: 200) - - service_stub = double - allow(ActivityPub::FetchRemoteAccountService).to receive(:new).and_return(service_stub) - allow(service_stub).to receive(:call).and_return(new_account) - end + let(:follower) { Fabricate(:account) } + let(:old_account) { Fabricate(:account, uri: 'https://example.org/alice', domain: 'example.org', protocol: :activitypub, inbox_url: 'https://example.org/inbox') } + let(:new_account) { Fabricate(:account, uri: 'https://example.com/alice', domain: 'example.com', protocol: :activitypub, inbox_url: 'https://example.com/inbox', also_known_as: also_known_as) } + let(:also_known_as) { [old_account.uri] } + let(:returned_account) { new_account } let(:json) do { @@ -30,6 +18,17 @@ RSpec.describe ActivityPub::Activity::Move do }.with_indifferent_access end + before do + follower.follow!(old_account) + + stub_request(:post, old_account.inbox_url).to_return(status: 200) + stub_request(:post, new_account.inbox_url).to_return(status: 200) + + service_stub = double + allow(ActivityPub::FetchRemoteAccountService).to receive(:new).and_return(service_stub) + allow(service_stub).to receive(:call).and_return(returned_account) + end + describe '#perform' do subject { described_class.new(json, old_account) } @@ -37,16 +36,70 @@ RSpec.describe ActivityPub::Activity::Move do subject.perform end - it 'sets moved account on old account' do - expect(old_account.reload.moved_to_account_id).to eq new_account.id + context 'when all conditions are met' do + it 'sets moved account on old account' do + expect(old_account.reload.moved_to_account_id).to eq new_account.id + end + + it 'makes followers unfollow old account' do + expect(follower.following?(old_account)).to be false + end + + it 'makes followers follow-request the new account' do + expect(follower.requested?(new_account)).to be true + end end - it 'makes followers unfollow old account' do - expect(follower.following?(old_account)).to be false + context "when the new account can't be resolved" do + let(:returned_account) { nil } + + it 'does not set moved account on old account' do + expect(old_account.reload.moved_to_account_id).to be_nil + end + + it 'does not make followers unfollow old account' do + expect(follower.following?(old_account)).to be true + end + + it 'does not make followers follow-request the new account' do + expect(follower.requested?(new_account)).to be false + end end - it 'makes followers follow-request the new account' do - expect(follower.requested?(new_account)).to be true + context 'when the new account does not references the old account' do + let(:also_known_as) { [] } + + it 'does not set moved account on old account' do + expect(old_account.reload.moved_to_account_id).to be_nil + end + + it 'does not make followers unfollow old account' do + expect(follower.following?(old_account)).to be true + end + + it 'does not make followers follow-request the new account' do + expect(follower.requested?(new_account)).to be false + end + end + + context 'when a Move has been recently processed' do + around do |example| + Redis.current.set("move_in_progress:#{old_account.id}", true, nx: true, ex: 7.days.seconds) + example.run + Redis.current.del("move_in_progress:#{old_account.id}") + end + + it 'does not set moved account on old account' do + expect(old_account.reload.moved_to_account_id).to be_nil + end + + it 'does not make followers unfollow old account' do + expect(follower.following?(old_account)).to be true + end + + it 'does not make followers follow-request the new account' do + expect(follower.requested?(new_account)).to be false + end end end end diff --git a/spec/lib/activitypub/activity/update_spec.rb b/spec/lib/activitypub/activity/update_spec.rb index 42da298606..4cd853af21 100644 --- a/spec/lib/activitypub/activity/update_spec.rb +++ b/spec/lib/activitypub/activity/update_spec.rb @@ -4,43 +4,97 @@ RSpec.describe ActivityPub::Activity::Update do let!(:sender) { Fabricate(:account) } before do - stub_request(:get, actor_json[:outbox]).to_return(status: 404) - stub_request(:get, actor_json[:followers]).to_return(status: 404) - stub_request(:get, actor_json[:following]).to_return(status: 404) - stub_request(:get, actor_json[:featured]).to_return(status: 404) - sender.update!(uri: ActivityPub::TagManager.instance.uri_for(sender)) end - let(:modified_sender) do - sender.dup.tap do |modified_sender| - modified_sender.display_name = 'Totally modified now' - end - end - - let(:actor_json) do - ActiveModelSerializers::SerializableResource.new(modified_sender, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter).as_json - end - - let(:json) do - { - '@context': 'https://www.w3.org/ns/activitystreams', - id: 'foo', - type: 'Update', - actor: ActivityPub::TagManager.instance.uri_for(sender), - object: actor_json, - }.with_indifferent_access - end + subject { described_class.new(json, sender) } describe '#perform' do - subject { described_class.new(json, sender) } + context 'with an Actor object' do + let(:modified_sender) do + sender.tap do |modified_sender| + modified_sender.display_name = 'Totally modified now' + end + end - before do - subject.perform + let(:actor_json) do + ActiveModelSerializers::SerializableResource.new(modified_sender, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter).as_json + end + + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'foo', + type: 'Update', + actor: ActivityPub::TagManager.instance.uri_for(sender), + object: actor_json, + }.with_indifferent_access + end + + before do + stub_request(:get, actor_json[:outbox]).to_return(status: 404) + stub_request(:get, actor_json[:followers]).to_return(status: 404) + stub_request(:get, actor_json[:following]).to_return(status: 404) + stub_request(:get, actor_json[:featured]).to_return(status: 404) + + subject.perform + end + + it 'updates profile' do + expect(sender.reload.display_name).to eq 'Totally modified now' + end end - it 'updates profile' do - expect(sender.reload.display_name).to eq 'Totally modified now' + context 'with a Question object' do + let!(:at_time) { Time.now.utc } + let!(:status) { Fabricate(:status, account: sender, poll: Poll.new(account: sender, options: %w(Bar Baz), cached_tallies: [0, 0], expires_at: at_time + 5.days)) } + + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'foo', + type: 'Update', + actor: ActivityPub::TagManager.instance.uri_for(sender), + object: { + type: 'Question', + id: ActivityPub::TagManager.instance.uri_for(status), + content: 'Foo', + endTime: (at_time + 5.days).iso8601, + oneOf: [ + { + type: 'Note', + name: 'Bar', + replies: { + type: 'Collection', + totalItems: 0, + }, + }, + + { + type: 'Note', + name: 'Baz', + replies: { + type: 'Collection', + totalItems: 12, + }, + }, + ], + }, + }.with_indifferent_access + end + + before do + status.update!(uri: ActivityPub::TagManager.instance.uri_for(status)) + subject.perform + end + + it 'updates poll numbers' do + expect(status.preloadable_poll.cached_tallies).to eq [0, 12] + end + + it 'does not set status as edited' do + expect(status.edited_at).to be_nil + end end end end diff --git a/spec/lib/activitypub/linked_data_signature_spec.rb b/spec/lib/activitypub/linked_data_signature_spec.rb index 1f413eec99..2222c46fb5 100644 --- a/spec/lib/activitypub/linked_data_signature_spec.rb +++ b/spec/lib/activitypub/linked_data_signature_spec.rb @@ -81,6 +81,6 @@ RSpec.describe ActivityPub::LinkedDataSignature do options_hash = Digest::SHA256.hexdigest(canonicalize(options.merge('@context' => ActivityPub::LinkedDataSignature::CONTEXT))) document_hash = Digest::SHA256.hexdigest(canonicalize(document)) to_be_verified = options_hash + document_hash - Base64.strict_encode64(from_account.keypair.sign(OpenSSL::Digest::SHA256.new, to_be_verified)) + Base64.strict_encode64(from_account.keypair.sign(OpenSSL::Digest.new('SHA256'), to_be_verified)) end end diff --git a/spec/lib/activitypub/tag_manager_spec.rb b/spec/lib/activitypub/tag_manager_spec.rb index 1c5c6f0edd..606a1de2e5 100644 --- a/spec/lib/activitypub/tag_manager_spec.rb +++ b/spec/lib/activitypub/tag_manager_spec.rb @@ -42,6 +42,14 @@ RSpec.describe ActivityPub::TagManager do expect(subject.to(status)).to eq [subject.uri_for(mentioned)] end + it "returns URIs of mentioned group's followers for direct statuses to groups" do + status = Fabricate(:status, visibility: :direct) + mentioned = Fabricate(:account, domain: 'remote.org', uri: 'https://remote.org/group', followers_url: 'https://remote.org/group/followers', actor_type: 'Group') + status.mentions.create(account: mentioned) + expect(subject.to(status)).to include(subject.uri_for(mentioned)) + expect(subject.to(status)).to include(subject.followers_uri_for(mentioned)) + end + it "returns URIs of mentions for direct silenced author's status only if they are followers or requesting to be" do bob = Fabricate(:account, username: 'bob') alice = Fabricate(:account, username: 'alice') diff --git a/spec/lib/entity_cache_spec.rb b/spec/lib/entity_cache_spec.rb new file mode 100644 index 0000000000..43494bd92a --- /dev/null +++ b/spec/lib/entity_cache_spec.rb @@ -0,0 +1,19 @@ +require 'rails_helper' + +RSpec.describe EntityCache do + let(:local_account) { Fabricate(:account, domain: nil, username: 'alice') } + let(:remote_account) { Fabricate(:account, domain: 'remote.test', username: 'bob', url: 'https://remote.test/') } + + describe '#emoji' do + subject { EntityCache.instance.emoji(shortcodes, domain) } + + context 'called with an empty list of shortcodes' do + let(:shortcodes) { [] } + let(:domain) { 'example.org' } + + it 'returns an empty array' do + is_expected.to eq [] + end + end + end +end diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index efefb8f000..73cb39550e 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -21,6 +21,14 @@ RSpec.describe Formatter do end end + context 'given a stand-alone URL with a newer TLD' do + let(:text) { 'http://example.gay' } + + it 'matches the full URL' do + is_expected.to include 'href="http://example.gay"' + end + end + context 'given a stand-alone IDN URL' do let(:text) { 'https://nic.みんな/' } diff --git a/spec/lib/link_details_extractor_spec.rb b/spec/lib/link_details_extractor_spec.rb new file mode 100644 index 0000000000..850857b2dd --- /dev/null +++ b/spec/lib/link_details_extractor_spec.rb @@ -0,0 +1,29 @@ +require 'rails_helper' + +RSpec.describe LinkDetailsExtractor do + let(:original_url) { '' } + let(:html) { '' } + let(:html_charset) { nil } + + subject { described_class.new(original_url, html, html_charset) } + + describe '#canonical_url' do + let(:original_url) { 'https://foo.com/article?bar=baz123' } + + context 'when canonical URL points to another host' do + let(:html) { '' } + + it 'ignores the canonical URLs' do + expect(subject.canonical_url).to eq original_url + end + end + + context 'when canonical URL points to the same host' do + let(:html) { '' } + + it 'ignores the canonical URLs' do + expect(subject.canonical_url).to eq 'https://foo.com/article' + end + end + end +end diff --git a/spec/lib/permalink_redirector_spec.rb b/spec/lib/permalink_redirector_spec.rb new file mode 100644 index 0000000000..b916b33b22 --- /dev/null +++ b/spec/lib/permalink_redirector_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe PermalinkRedirector do + describe '#redirect_url' do + before do + account = Fabricate(:account, username: 'alice', id: 1) + Fabricate(:status, account: account, id: 123) + end + + it 'returns path for legacy account links' do + redirector = described_class.new('web/accounts/1') + expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice' + end + + it 'returns path for legacy status links' do + redirector = described_class.new('web/statuses/123') + expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice/123' + end + + it 'returns path for legacy tag links' do + redirector = described_class.new('web/timelines/tag/hoge') + expect(redirector.redirect_path).to eq '/tags/hoge' + end + + it 'returns path for pretty account links' do + redirector = described_class.new('web/@alice') + expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice' + end + + it 'returns path for pretty status links' do + redirector = described_class.new('web/@alice/123') + expect(redirector.redirect_path).to eq 'https://cb6e6126.ngrok.io/@alice/123' + end + + it 'returns path for pretty tag links' do + redirector = described_class.new('web/tags/hoge') + expect(redirector.redirect_path).to eq '/tags/hoge' + end + end +end diff --git a/spec/lib/proof_provider/keybase/verifier_spec.rb b/spec/lib/proof_provider/keybase/verifier_spec.rb deleted file mode 100644 index 0081a735df..0000000000 --- a/spec/lib/proof_provider/keybase/verifier_spec.rb +++ /dev/null @@ -1,82 +0,0 @@ -require 'rails_helper' - -describe ProofProvider::Keybase::Verifier do - let(:my_domain) { Rails.configuration.x.local_domain } - - let(:keybase_proof) do - local_proof = AccountIdentityProof.new( - provider: 'Keybase', - provider_username: 'cryptoalice', - token: '11111111111111111111111111' - ) - - described_class.new('alice', 'cryptoalice', '11111111111111111111111111', my_domain) - end - - let(:query_params) do - "domain=#{my_domain}&kb_username=cryptoalice&sig_hash=11111111111111111111111111&username=alice" - end - - describe '#valid?' do - let(:base_url) { 'https://keybase.io/_/api/1.0/sig/proof_valid.json' } - - context 'when valid' do - before do - json_response_body = '{"status":{"code":0,"name":"OK"},"proof_valid":true}' - stub_request(:get, "#{base_url}?#{query_params}").to_return(status: 200, body: json_response_body) - end - - it 'calls out to keybase and returns true' do - expect(keybase_proof.valid?).to eq true - end - end - - context 'when invalid' do - before do - json_response_body = '{"status":{"code":0,"name":"OK"},"proof_valid":false}' - stub_request(:get, "#{base_url}?#{query_params}").to_return(status: 200, body: json_response_body) - end - - it 'calls out to keybase and returns false' do - expect(keybase_proof.valid?).to eq false - end - end - - context 'with an unexpected api response' do - before do - json_response_body = '{"status":{"code":100,"desc":"wrong size hex_id","fields":{"sig_hash":"wrong size hex_id"},"name":"INPUT_ERROR"}}' - stub_request(:get, "#{base_url}?#{query_params}").to_return(status: 200, body: json_response_body) - end - - it 'swallows the error and returns false' do - expect(keybase_proof.valid?).to eq false - end - end - end - - describe '#status' do - let(:base_url) { 'https://keybase.io/_/api/1.0/sig/proof_live.json' } - - context 'with a normal response' do - before do - json_response_body = '{"status":{"code":0,"name":"OK"},"proof_live":false,"proof_valid":true}' - stub_request(:get, "#{base_url}?#{query_params}").to_return(status: 200, body: json_response_body) - end - - it 'calls out to keybase and returns the status fields as proof_valid and proof_live' do - expect(keybase_proof.status).to include({ 'proof_valid' => true, 'proof_live' => false }) - end - end - - context 'with an unexpected keybase response' do - before do - json_response_body = '{"status":{"code":100,"desc":"missing non-optional field sig_hash","fields":{"sig_hash":"missing non-optional field sig_hash"},"name":"INPUT_ERROR"}}' - stub_request(:get, "#{base_url}?#{query_params}").to_return(status: 200, body: json_response_body) - end - - it 'raises a ProofProvider::Keybase::UnexpectedResponseError' do - expect { keybase_proof.status }.to raise_error ProofProvider::Keybase::UnexpectedResponseError - end - end - end -end diff --git a/spec/lib/sanitize_config_spec.rb b/spec/lib/sanitize_config_spec.rb index da24f67d61..8bcffb2e5a 100644 --- a/spec/lib/sanitize_config_spec.rb +++ b/spec/lib/sanitize_config_spec.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'rails_helper' -require Rails.root.join('app', 'lib', 'sanitize_config.rb') describe Sanitize::Config do shared_examples 'common HTML sanitization' do diff --git a/spec/lib/spam_check_spec.rb b/spec/lib/spam_check_spec.rb deleted file mode 100644 index 159d832573..0000000000 --- a/spec/lib/spam_check_spec.rb +++ /dev/null @@ -1,192 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe SpamCheck do - let!(:sender) { Fabricate(:account) } - let!(:alice) { Fabricate(:account, username: 'alice') } - let!(:bob) { Fabricate(:account, username: 'bob') } - - def status_with_html(text, options = {}) - status = PostStatusService.new.call(sender, { text: text }.merge(options)) - status.update_columns(text: Formatter.instance.format(status), local: false) - status - end - - describe '#hashable_text' do - it 'removes mentions from HTML for remote statuses' do - status = status_with_html('@alice Hello') - expect(described_class.new(status).hashable_text).to eq 'hello' - end - - it 'removes mentions from text for local statuses' do - status = PostStatusService.new.call(alice, text: "Hey @#{sender.username}, how are you?") - expect(described_class.new(status).hashable_text).to eq 'hey , how are you?' - end - end - - describe '#insufficient_data?' do - it 'returns true when there is no text' do - status = status_with_html('@alice') - expect(described_class.new(status).insufficient_data?).to be true - end - - it 'returns false when there is text' do - status = status_with_html('@alice h') - expect(described_class.new(status).insufficient_data?).to be false - end - end - - describe '#digest' do - it 'returns a string' do - status = status_with_html('@alice Hello world') - expect(described_class.new(status).digest).to be_a String - end - end - - describe '#spam?' do - it 'returns false for a unique status' do - status = status_with_html('@alice Hello') - expect(described_class.new(status).spam?).to be false - end - - it 'returns false for different statuses to the same recipient' do - status1 = status_with_html('@alice Hello') - described_class.new(status1).remember! - status2 = status_with_html('@alice Are you available to talk?') - expect(described_class.new(status2).spam?).to be false - end - - it 'returns false for statuses with different content warnings' do - status1 = status_with_html('@alice Are you available to talk?') - described_class.new(status1).remember! - status2 = status_with_html('@alice Are you available to talk?', spoiler_text: 'This is a completely different matter than what I was talking about previously, I swear!') - expect(described_class.new(status2).spam?).to be false - end - - it 'returns false for different statuses to different recipients' do - status1 = status_with_html('@alice How is it going?') - described_class.new(status1).remember! - status2 = status_with_html('@bob Are you okay?') - expect(described_class.new(status2).spam?).to be false - end - - it 'returns false for very short different statuses to different recipients' do - status1 = status_with_html('@alice 🙄') - described_class.new(status1).remember! - status2 = status_with_html('@bob Huh?') - expect(described_class.new(status2).spam?).to be false - end - - it 'returns false for statuses with no text' do - status1 = status_with_html('@alice') - described_class.new(status1).remember! - status2 = status_with_html('@bob') - expect(described_class.new(status2).spam?).to be false - end - - it 'returns true for duplicate statuses to the same recipient' do - described_class::THRESHOLD.times do - status1 = status_with_html('@alice Hello') - described_class.new(status1).remember! - end - - status2 = status_with_html('@alice Hello') - expect(described_class.new(status2).spam?).to be true - end - - it 'returns true for duplicate statuses to different recipients' do - described_class::THRESHOLD.times do - status1 = status_with_html('@alice Hello') - described_class.new(status1).remember! - end - - status2 = status_with_html('@bob Hello') - expect(described_class.new(status2).spam?).to be true - end - - it 'returns true for nearly identical statuses with random numbers' do - source_text = 'Sodium, atomic number 11, was first isolated by Humphry Davy in 1807. A chemical component of salt, he named it Na in honor of the saltiest region on earth, North America.' - - described_class::THRESHOLD.times do - status1 = status_with_html('@alice ' + source_text + ' 1234') - described_class.new(status1).remember! - end - - status2 = status_with_html('@bob ' + source_text + ' 9568') - expect(described_class.new(status2).spam?).to be true - end - end - - describe '#skip?' do - it 'returns true when the sender is already silenced' do - status = status_with_html('@alice Hello') - sender.silence! - expect(described_class.new(status).skip?).to be true - end - - it 'returns true when the mentioned person follows the sender' do - status = status_with_html('@alice Hello') - alice.follow!(sender) - expect(described_class.new(status).skip?).to be true - end - - it 'returns false when even one mentioned person doesn\'t follow the sender' do - status = status_with_html('@alice @bob Hello') - alice.follow!(sender) - expect(described_class.new(status).skip?).to be false - end - - it 'returns true when the sender is replying to a status that mentions the sender' do - parent = PostStatusService.new.call(alice, text: "Hey @#{sender.username}, how are you?") - status = status_with_html('@alice @bob Hello', thread: parent) - expect(described_class.new(status).skip?).to be true - end - end - - describe '#remember!' do - let(:status) { status_with_html('@alice') } - let(:spam_check) { described_class.new(status) } - let(:redis_key) { spam_check.send(:redis_key) } - - it 'remembers' do - expect(Redis.current.exists?(redis_key)).to be true - spam_check.remember! - expect(Redis.current.exists?(redis_key)).to be true - end - end - - describe '#reset!' do - let(:status) { status_with_html('@alice') } - let(:spam_check) { described_class.new(status) } - let(:redis_key) { spam_check.send(:redis_key) } - - before do - spam_check.remember! - end - - it 'resets' do - expect(Redis.current.exists?(redis_key)).to be true - spam_check.reset! - expect(Redis.current.exists?(redis_key)).to be false - end - end - - describe '#flag!' do - let!(:status1) { status_with_html('@alice General Kenobi you are a bold one') } - let!(:status2) { status_with_html('@alice @bob General Kenobi, you are a bold one') } - - before do - described_class.new(status1).remember! - described_class.new(status2).flag! - end - - it 'creates a report about the account' do - expect(sender.targeted_reports.unresolved.count).to eq 1 - end - - it 'attaches both matching statuses to the report' do - expect(sender.targeted_reports.first.status_ids).to include(status1.id, status2.id) - end - end -end diff --git a/spec/lib/status_reach_finder_spec.rb b/spec/lib/status_reach_finder_spec.rb new file mode 100644 index 0000000000..f0c22b1651 --- /dev/null +++ b/spec/lib/status_reach_finder_spec.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe StatusReachFinder do + describe '#inboxes' do + context 'for a local status' do + let(:parent_status) { nil } + let(:visibility) { :public } + let(:alice) { Fabricate(:account, username: 'alice') } + let(:status) { Fabricate(:status, account: alice, thread: parent_status, visibility: visibility) } + + subject { described_class.new(status) } + + context 'when it contains mentions of remote accounts' do + let(:bob) { Fabricate(:account, username: 'bob', domain: 'foo.bar', protocol: :activitypub, inbox_url: 'https://foo.bar/inbox') } + + before do + status.mentions.create!(account: bob) + end + + it 'includes the inbox of the mentioned account' do + expect(subject.inboxes).to include 'https://foo.bar/inbox' + end + end + + context 'when it has been reblogged by a remote account' do + let(:bob) { Fabricate(:account, username: 'bob', domain: 'foo.bar', protocol: :activitypub, inbox_url: 'https://foo.bar/inbox') } + + before do + bob.statuses.create!(reblog: status) + end + + it 'includes the inbox of the reblogger' do + expect(subject.inboxes).to include 'https://foo.bar/inbox' + end + + context 'when status is not public' do + let(:visibility) { :private } + + it 'does not include the inbox of the reblogger' do + expect(subject.inboxes).to_not include 'https://foo.bar/inbox' + end + end + end + + context 'when it has been favourited by a remote account' do + let(:bob) { Fabricate(:account, username: 'bob', domain: 'foo.bar', protocol: :activitypub, inbox_url: 'https://foo.bar/inbox') } + + before do + bob.favourites.create!(status: status) + end + + it 'includes the inbox of the favouriter' do + expect(subject.inboxes).to include 'https://foo.bar/inbox' + end + + context 'when status is not public' do + let(:visibility) { :private } + + it 'does not include the inbox of the favouriter' do + expect(subject.inboxes).to_not include 'https://foo.bar/inbox' + end + end + end + + context 'when it has been replied to by a remote account' do + let(:bob) { Fabricate(:account, username: 'bob', domain: 'foo.bar', protocol: :activitypub, inbox_url: 'https://foo.bar/inbox') } + + before do + bob.statuses.create!(thread: status, text: 'Hoge') + end + + context do + it 'includes the inbox of the replier' do + expect(subject.inboxes).to include 'https://foo.bar/inbox' + end + end + + context 'when status is not public' do + let(:visibility) { :private } + + it 'does not include the inbox of the replier' do + expect(subject.inboxes).to_not include 'https://foo.bar/inbox' + end + end + end + + context 'when it is a reply to a remote account' do + let(:bob) { Fabricate(:account, username: 'bob', domain: 'foo.bar', protocol: :activitypub, inbox_url: 'https://foo.bar/inbox') } + let(:parent_status) { Fabricate(:status, account: bob) } + + context do + it 'includes the inbox of the replied-to account' do + expect(subject.inboxes).to include 'https://foo.bar/inbox' + end + end + + context 'when status is not public and replied-to account is not mentioned' do + let(:visibility) { :private } + + it 'does not include the inbox of the replied-to account' do + expect(subject.inboxes).to_not include 'https://foo.bar/inbox' + end + end + end + end + end +end diff --git a/spec/lib/tag_manager_spec.rb b/spec/lib/tag_manager_spec.rb index e9a7aa9344..2230f97103 100644 --- a/spec/lib/tag_manager_spec.rb +++ b/spec/lib/tag_manager_spec.rb @@ -83,40 +83,4 @@ RSpec.describe TagManager do expect(TagManager.instance.local_url?('https://domainn.test/')).to eq false end end - - describe '#same_acct?' do - # The following comparisons MUST be case-insensitive. - - it 'returns true if the needle has a correct username and domain for remote user' do - expect(TagManager.instance.same_acct?('username@domain.test', 'UsErNaMe@DoMaIn.Test')).to eq true - end - - it 'returns false if the needle is missing a domain for remote user' do - expect(TagManager.instance.same_acct?('username@domain.test', 'UsErNaMe')).to eq false - end - - it 'returns false if the needle has an incorrect domain for remote user' do - expect(TagManager.instance.same_acct?('username@domain.test', 'UsErNaMe@incorrect.test')).to eq false - end - - it 'returns false if the needle has an incorrect username for remote user' do - expect(TagManager.instance.same_acct?('username@domain.test', 'incorrect@DoMaIn.test')).to eq false - end - - it 'returns true if the needle has a correct username and domain for local user' do - expect(TagManager.instance.same_acct?('username', 'UsErNaMe@Cb6E6126.nGrOk.Io')).to eq true - end - - it 'returns true if the needle is missing a domain for local user' do - expect(TagManager.instance.same_acct?('username', 'UsErNaMe')).to eq true - end - - it 'returns false if the needle has an incorrect username for local user' do - expect(TagManager.instance.same_acct?('username', 'UsErNaM@Cb6E6126.nGrOk.Io')).to eq false - end - - it 'returns false if the needle has an incorrect domain for local user' do - expect(TagManager.instance.same_acct?('username', 'incorrect@Cb6E6126.nGrOk.Io')).to eq false - end - end end diff --git a/spec/mailers/admin_mailer_spec.rb b/spec/mailers/admin_mailer_spec.rb index 4a8ef7b5ea..29fb586a34 100644 --- a/spec/mailers/admin_mailer_spec.rb +++ b/spec/mailers/admin_mailer_spec.rb @@ -4,11 +4,15 @@ require 'rails_helper' RSpec.describe AdminMailer, type: :mailer do describe '.new_report' do - let(:sender) { Fabricate(:account, username: 'John', user: Fabricate(:user)) } - let(:recipient) { Fabricate(:account, username: 'Mike', user: Fabricate(:user, locale: :en)) } + let(:sender) { Fabricate(:account, username: 'John') } + let(:recipient) { Fabricate(:account, username: 'Mike') } let(:report) { Fabricate(:report, account: sender, target_account: recipient) } let(:mail) { described_class.new_report(recipient, report) } + before do + recipient.user.update(locale: :en) + end + it 'renders the headers' do expect(mail.subject).to eq("New report for cb6e6126.ngrok.io (##{report.id})") expect(mail.to).to eq [recipient.user_email] diff --git a/spec/mailers/notification_mailer_spec.rb b/spec/mailers/notification_mailer_spec.rb index 38916b54f1..2ca4e26fa8 100644 --- a/spec/mailers/notification_mailer_spec.rb +++ b/spec/mailers/notification_mailer_spec.rb @@ -1,7 +1,7 @@ require "rails_helper" RSpec.describe NotificationMailer, type: :mailer do - let(:receiver) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:receiver) { Fabricate(:user) } let(:sender) { Fabricate(:account, username: 'bob') } let(:foreign_status) { Fabricate(:status, account: sender, text: 'The body of the foreign status') } let(:own_status) { Fabricate(:status, account: receiver.account, text: 'The body of the own status') } @@ -10,12 +10,12 @@ RSpec.describe NotificationMailer, type: :mailer do it 'renders subject localized for the locale of the receiver' do locale = %i(de en).sample receiver.update!(locale: locale) - expect(mail.subject).to eq I18n.t(*args, kwrest.merge(locale: locale)) + expect(mail.subject).to eq I18n.t(*args, **kwrest.merge(locale: locale)) end it 'renders subject localized for the default locale if the locale of the receiver is unavailable' do receiver.update!(locale: nil) - expect(mail.subject).to eq I18n.t(*args, kwrest.merge(locale: I18n.default_locale)) + expect(mail.subject).to eq I18n.t(*args, **kwrest.merge(locale: I18n.default_locale)) end end @@ -59,12 +59,12 @@ RSpec.describe NotificationMailer, type: :mailer do include_examples 'localized subject', 'notification_mailer.favourite.subject', name: 'bob' it "renders the headers" do - expect(mail.subject).to eq("bob favourited your status") + expect(mail.subject).to eq("bob favourited your post") expect(mail.to).to eq([receiver.email]) end it "renders the body" do - expect(mail.body.encoded).to match("Your status was favourited by bob") + expect(mail.body.encoded).to match("Your post was favourited by bob") expect(mail.body.encoded).to include 'The body of the own status' end end @@ -76,12 +76,12 @@ RSpec.describe NotificationMailer, type: :mailer do include_examples 'localized subject', 'notification_mailer.reblog.subject', name: 'bob' it "renders the headers" do - expect(mail.subject).to eq("bob boosted your status") + expect(mail.subject).to eq("bob boosted your post") expect(mail.to).to eq([receiver.email]) end it "renders the body" do - expect(mail.body.encoded).to match("Your status was boosted by bob") + expect(mail.body.encoded).to match("Your post was boosted by bob") expect(mail.body.encoded).to include 'The body of the own status' end end diff --git a/spec/mailers/previews/admin_mailer_preview.rb b/spec/mailers/previews/admin_mailer_preview.rb index 561a56b787..75ffbbf40f 100644 --- a/spec/mailers/previews/admin_mailer_preview.rb +++ b/spec/mailers/previews/admin_mailer_preview.rb @@ -5,4 +5,14 @@ class AdminMailerPreview < ActionMailer::Preview def new_pending_account AdminMailer.new_pending_account(Account.first, User.pending.first) end + + # Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_trending_tags + def new_trending_tags + AdminMailer.new_trending_tags(Account.first, Tag.limit(3)) + end + + # Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_trending_links + def new_trending_links + AdminMailer.new_trending_links(Account.first, PreviewCard.limit(3)) + end end diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb index 6d87fd706e..69b9b971ee 100644 --- a/spec/mailers/previews/user_mailer_preview.rb +++ b/spec/mailers/previews/user_mailer_preview.rb @@ -79,7 +79,7 @@ class UserMailerPreview < ActionMailer::Preview # Preview this email at http://localhost:3000/rails/mailers/user_mailer/warning def warning - UserMailer.warning(User.first, AccountWarning.new(text: '', action: :silence), [Status.first.id]) + UserMailer.warning(User.first, AccountWarning.last) end # Preview this email at http://localhost:3000/rails/mailers/user_mailer/sign_in_token diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 6b430b5056..9c866788f2 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -9,12 +9,12 @@ describe UserMailer, type: :mailer do it 'renders subject localized for the locale of the receiver' do locale = I18n.available_locales.sample receiver.update!(locale: locale) - expect(mail.subject).to eq I18n.t(*args, kwrest.merge(locale: locale)) + expect(mail.subject).to eq I18n.t(*args, **kwrest.merge(locale: locale)) end it 'renders subject localized for the default locale if the locale of the receiver is unavailable' do receiver.update!(locale: nil) - expect(mail.subject).to eq I18n.t(*args, kwrest.merge(locale: I18n.default_locale)) + expect(mail.subject).to eq I18n.t(*args, **kwrest.merge(locale: I18n.default_locale)) end end diff --git a/spec/models/account_filter_spec.rb b/spec/models/account_filter_spec.rb index 0cdb373f6a..c2bd8c2202 100644 --- a/spec/models/account_filter_spec.rb +++ b/spec/models/account_filter_spec.rb @@ -2,10 +2,10 @@ require 'rails_helper' describe AccountFilter do describe 'with empty params' do - it 'defaults to recent local not-suspended account list' do + it 'excludes instance actor by default' do filter = described_class.new({}) - expect(filter.results).to eq Account.local.without_instance_actor.recent.without_suspended + expect(filter.results).to eq Account.without_instance_actor end end @@ -16,42 +16,4 @@ describe AccountFilter do expect { filter.results }.to raise_error(/wrong/) end end - - describe 'with valid params' do - it 'combines filters on Account' do - filter = described_class.new( - by_domain: 'test.com', - silenced: true, - username: 'test', - display_name: 'name', - email: 'user@example.com', - ) - - allow(Account).to receive(:where).and_return(Account.none) - allow(Account).to receive(:silenced).and_return(Account.none) - allow(Account).to receive(:matches_display_name).and_return(Account.none) - allow(Account).to receive(:matches_username).and_return(Account.none) - allow(User).to receive(:matches_email).and_return(User.none) - - filter.results - - expect(Account).to have_received(:where).with(domain: 'test.com') - expect(Account).to have_received(:silenced) - expect(Account).to have_received(:matches_username).with('test') - expect(Account).to have_received(:matches_display_name).with('name') - expect(User).to have_received(:matches_email).with('user@example.com') - end - - describe 'that call account methods' do - %i(local remote silenced suspended).each do |option| - it "delegates the #{option} option" do - allow(Account).to receive(option).and_return(Account.none) - filter = described_class.new({ option => true }) - filter.results - - expect(Account).to have_received(option).at_least(1) - end - end - end - end end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 1d000ed4d2..681134d498 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -5,6 +5,37 @@ RSpec.describe Account, type: :model do let(:bob) { Fabricate(:account, username: 'bob') } subject { Fabricate(:account) } + describe '#suspend!' do + it 'marks the account as suspended' do + subject.suspend! + expect(subject.suspended?).to be true + end + + it 'creates a deletion request' do + subject.suspend! + expect(AccountDeletionRequest.where(account: subject).exists?).to be true + end + + context 'when the account is of a local user' do + let!(:subject) { Fabricate(:user, email: 'foo+bar@domain.org').account } + + it 'creates a canonical domain block' do + subject.suspend! + expect(CanonicalEmailBlock.block?(subject.user_email)).to be true + end + + context 'when a canonical domain block already exists for that email' do + before do + Fabricate(:canonical_email_block, email: subject.user_email) + end + + it 'does not raise an error' do + expect { subject.suspend! }.not_to raise_error + end + end + end + end + describe '#follow!' do it 'creates a follow' do follow = subject.follow!(bob) @@ -134,18 +165,6 @@ RSpec.describe Account, type: :model do end end - describe '#subscribed?' do - it 'returns false when no subscription expiration information is present' do - account = Fabricate(:account, subscription_expires_at: nil) - expect(account.subscribed?).to be false - end - - it 'returns true when subscription expiration has been set' do - account = Fabricate(:account, subscription_expires_at: 30.days.from_now) - expect(account.subscribed?).to be true - end - end - describe '#possibly_stale?' do let(:account) { Fabricate(:account, last_webfingered_at: last_webfingered_at) } @@ -707,21 +726,6 @@ RSpec.describe Account, type: :model do end end - describe 'expiring' do - it 'returns remote accounts with followers whose subscription expiration date is past or not given' do - local = Fabricate(:account, domain: nil) - matches = [ - { domain: 'remote', subscription_expires_at: '2000-01-01T00:00:00Z' }, - ].map(&method(:Fabricate).curry(2).call(:account)) - matches.each(&local.method(:follow!)) - Fabricate(:account, domain: 'remote', subscription_expires_at: nil) - local.follow!(Fabricate(:account, domain: 'remote', subscription_expires_at: '2000-01-03T00:00:00Z')) - local.follow!(Fabricate(:account, domain: nil, subscription_expires_at: nil)) - - expect(Account.expiring('2000-01-02T00:00:00Z').recent).to eq matches.reverse - end - end - describe 'remote' do it 'returns an array of accounts who have a domain' do account_1 = Fabricate(:account, domain: nil) diff --git a/spec/models/account_stat_spec.rb b/spec/models/account_stat_spec.rb deleted file mode 100644 index 8adc0d1d63..0000000000 --- a/spec/models/account_stat_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'rails_helper' - -RSpec.describe AccountStat, type: :model do - describe '#increment_count!' do - it 'increments the count' do - account_stat = AccountStat.create(account: Fabricate(:account)) - expect(account_stat.followers_count).to eq 0 - account_stat.increment_count!(:followers_count) - expect(account_stat.followers_count).to eq 1 - end - - it 'increments the count in multi-threaded an environment' do - account_stat = AccountStat.create(account: Fabricate(:account), statuses_count: 0) - increment_by = 15 - wait_for_start = true - - threads = Array.new(increment_by) do - Thread.new do - true while wait_for_start - AccountStat.find(account_stat.id).increment_count!(:statuses_count) - end - end - - wait_for_start = false - threads.each(&:join) - - expect(account_stat.reload.statuses_count).to eq increment_by - end - end - - describe '#decrement_count!' do - it 'decrements the count' do - account_stat = AccountStat.create(account: Fabricate(:account), followers_count: 15) - expect(account_stat.followers_count).to eq 15 - account_stat.decrement_count!(:followers_count) - expect(account_stat.followers_count).to eq 14 - end - - it 'decrements the count in multi-threaded an environment' do - account_stat = AccountStat.create(account: Fabricate(:account), statuses_count: 15) - decrement_by = 10 - wait_for_start = true - - threads = Array.new(decrement_by) do - Thread.new do - true while wait_for_start - AccountStat.find(account_stat.id).decrement_count!(:statuses_count) - end - end - - wait_for_start = false - threads.each(&:join) - - expect(account_stat.reload.statuses_count).to eq 5 - end - end -end diff --git a/spec/models/account_statuses_cleanup_policy_spec.rb b/spec/models/account_statuses_cleanup_policy_spec.rb new file mode 100644 index 0000000000..4732ad625d --- /dev/null +++ b/spec/models/account_statuses_cleanup_policy_spec.rb @@ -0,0 +1,546 @@ +require 'rails_helper' + +RSpec.describe AccountStatusesCleanupPolicy, type: :model do + let(:account) { Fabricate(:account, username: 'alice', domain: nil) } + + describe 'validation' do + it 'disallow remote accounts' do + account.update(domain: 'example.com') + account_statuses_cleanup_policy = Fabricate.build(:account_statuses_cleanup_policy, account: account) + account_statuses_cleanup_policy.valid? + expect(account_statuses_cleanup_policy).to model_have_error_on_field(:account) + end + end + + describe 'save hooks' do + context 'when widening a policy' do + let!(:account_statuses_cleanup_policy) do + Fabricate(:account_statuses_cleanup_policy, + account: account, + keep_direct: true, + keep_pinned: true, + keep_polls: true, + keep_media: true, + keep_self_fav: true, + keep_self_bookmark: true, + min_favs: 1, + min_reblogs: 1 + ) + end + + before do + account_statuses_cleanup_policy.record_last_inspected(42) + end + + it 'invalidates last_inspected when widened because of keep_direct' do + account_statuses_cleanup_policy.keep_direct = false + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of keep_pinned' do + account_statuses_cleanup_policy.keep_pinned = false + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of keep_polls' do + account_statuses_cleanup_policy.keep_polls = false + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of keep_media' do + account_statuses_cleanup_policy.keep_media = false + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of keep_self_fav' do + account_statuses_cleanup_policy.keep_self_fav = false + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of keep_self_bookmark' do + account_statuses_cleanup_policy.keep_self_bookmark = false + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of higher min_favs' do + account_statuses_cleanup_policy.min_favs = 5 + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of disabled min_favs' do + account_statuses_cleanup_policy.min_favs = nil + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of higher min_reblogs' do + account_statuses_cleanup_policy.min_reblogs = 5 + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + + it 'invalidates last_inspected when widened because of disable min_reblogs' do + account_statuses_cleanup_policy.min_reblogs = nil + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to be nil + end + end + + context 'when narrowing a policy' do + let!(:account_statuses_cleanup_policy) do + Fabricate(:account_statuses_cleanup_policy, + account: account, + keep_direct: false, + keep_pinned: false, + keep_polls: false, + keep_media: false, + keep_self_fav: false, + keep_self_bookmark: false, + min_favs: nil, + min_reblogs: nil + ) + end + + it 'does not unnecessarily invalidate last_inspected' do + account_statuses_cleanup_policy.record_last_inspected(42) + account_statuses_cleanup_policy.keep_direct = true + account_statuses_cleanup_policy.keep_pinned = true + account_statuses_cleanup_policy.keep_polls = true + account_statuses_cleanup_policy.keep_media = true + account_statuses_cleanup_policy.keep_self_fav = true + account_statuses_cleanup_policy.keep_self_bookmark = true + account_statuses_cleanup_policy.min_favs = 5 + account_statuses_cleanup_policy.min_reblogs = 5 + account_statuses_cleanup_policy.save + expect(account_statuses_cleanup_policy.last_inspected).to eq 42 + end + end + end + + describe '#record_last_inspected' do + let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) } + + it 'records the given id' do + account_statuses_cleanup_policy.record_last_inspected(42) + expect(account_statuses_cleanup_policy.last_inspected).to eq 42 + end + end + + describe '#invalidate_last_inspected' do + let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) } + let(:status) { Fabricate(:status, id: 10, account: account) } + subject { account_statuses_cleanup_policy.invalidate_last_inspected(status, action) } + + before do + account_statuses_cleanup_policy.record_last_inspected(42) + end + + context 'when the action is :unbookmark' do + let(:action) { :unbookmark } + + context 'when the policy is not to keep self-bookmarked toots' do + before do + account_statuses_cleanup_policy.keep_self_bookmark = false + end + + it 'does not change the recorded id' do + subject + expect(account_statuses_cleanup_policy.last_inspected).to eq 42 + end + end + + context 'when the policy is to keep self-bookmarked toots' do + before do + account_statuses_cleanup_policy.keep_self_bookmark = true + end + + it 'records the older id' do + subject + expect(account_statuses_cleanup_policy.last_inspected).to eq 10 + end + end + end + + context 'when the action is :unfav' do + let(:action) { :unfav } + + context 'when the policy is not to keep self-favourited toots' do + before do + account_statuses_cleanup_policy.keep_self_fav = false + end + + it 'does not change the recorded id' do + subject + expect(account_statuses_cleanup_policy.last_inspected).to eq 42 + end + end + + context 'when the policy is to keep self-favourited toots' do + before do + account_statuses_cleanup_policy.keep_self_fav = true + end + + it 'records the older id' do + subject + expect(account_statuses_cleanup_policy.last_inspected).to eq 10 + end + end + end + + context 'when the action is :unpin' do + let(:action) { :unpin } + + context 'when the policy is not to keep pinned toots' do + before do + account_statuses_cleanup_policy.keep_pinned = false + end + + it 'does not change the recorded id' do + subject + expect(account_statuses_cleanup_policy.last_inspected).to eq 42 + end + end + + context 'when the policy is to keep pinned toots' do + before do + account_statuses_cleanup_policy.keep_pinned = true + end + + it 'records the older id' do + subject + expect(account_statuses_cleanup_policy.last_inspected).to eq 10 + end + end + end + + context 'when the status is more recent than the recorded inspected id' do + let(:action) { :unfav } + let(:status) { Fabricate(:status, account: account) } + + it 'does not change the recorded id' do + subject + expect(account_statuses_cleanup_policy.last_inspected).to eq 42 + end + end + end + + describe '#compute_cutoff_id' do + let!(:unrelated_status) { Fabricate(:status, created_at: 3.years.ago) } + let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) } + + subject { account_statuses_cleanup_policy.compute_cutoff_id } + + context 'when the account has posted multiple toots' do + let!(:very_old_status) { Fabricate(:status, created_at: 3.years.ago, account: account) } + let!(:old_status) { Fabricate(:status, created_at: 3.weeks.ago, account: account) } + let!(:recent_status) { Fabricate(:status, created_at: 2.days.ago, account: account) } + + it 'returns the most recent id that is still below policy age' do + expect(subject).to eq old_status.id + end + end + + context 'when the account has not posted anything' do + it 'returns nil' do + expect(subject).to be_nil + end + end + end + + describe '#statuses_to_delete' do + let!(:unrelated_status) { Fabricate(:status, created_at: 3.years.ago) } + let!(:very_old_status) { Fabricate(:status, created_at: 3.years.ago, account: account) } + let!(:pinned_status) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:direct_message) { Fabricate(:status, created_at: 1.year.ago, account: account, visibility: :direct) } + let!(:self_faved) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:self_bookmarked) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:status_with_poll) { Fabricate(:status, created_at: 1.year.ago, account: account, poll_attributes: { account: account, voters_count: 0, options: ['a', 'b'], expires_in: 2.days }) } + let!(:status_with_media) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:faved4) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:faved5) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:reblogged4) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:reblogged5) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:recent_status) { Fabricate(:status, created_at: 2.days.ago, account: account) } + + let!(:media_attachment) { Fabricate(:media_attachment, account: account, status: status_with_media) } + let!(:status_pin) { Fabricate(:status_pin, account: account, status: pinned_status) } + let!(:favourite) { Fabricate(:favourite, account: account, status: self_faved) } + let!(:bookmark) { Fabricate(:bookmark, account: account, status: self_bookmarked) } + + let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) } + + subject { account_statuses_cleanup_policy.statuses_to_delete } + + before do + 4.times { faved4.increment_count!(:favourites_count) } + 5.times { faved5.increment_count!(:favourites_count) } + 4.times { reblogged4.increment_count!(:reblogs_count) } + 5.times { reblogged5.increment_count!(:reblogs_count) } + end + + context 'when passed a max_id' do + let!(:old_status) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:slightly_less_old_status) { Fabricate(:status, created_at: 6.months.ago, account: account) } + + subject { account_statuses_cleanup_policy.statuses_to_delete(50, old_status.id).pluck(:id) } + + it 'returns statuses including max_id' do + expect(subject).to include(old_status.id) + end + + it 'returns statuses including older than max_id' do + expect(subject).to include(very_old_status.id) + end + + it 'does not return statuses newer than max_id' do + expect(subject).to_not include(slightly_less_old_status.id) + end + end + + context 'when passed a min_id' do + let!(:old_status) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:slightly_less_old_status) { Fabricate(:status, created_at: 6.months.ago, account: account) } + + subject { account_statuses_cleanup_policy.statuses_to_delete(50, recent_status.id, old_status.id).pluck(:id) } + + it 'returns statuses including min_id' do + expect(subject).to include(old_status.id) + end + + it 'returns statuses including newer than max_id' do + expect(subject).to include(slightly_less_old_status.id) + end + + it 'does not return statuses older than min_id' do + expect(subject).to_not include(very_old_status.id) + end + end + + context 'when passed a low limit' do + it 'only returns the limited number of items' do + expect(account_statuses_cleanup_policy.statuses_to_delete(1).count).to eq 1 + end + end + + context 'when policy is set to keep statuses more recent than 2 years' do + before do + account_statuses_cleanup_policy.min_status_age = 2.years.seconds + end + + it 'does not return unrelated old status' do + expect(subject.pluck(:id)).to_not include(unrelated_status.id) + end + + it 'returns only oldest status for deletion' do + expect(subject.pluck(:id)).to eq [very_old_status.id] + end + end + + context 'when policy is set to keep DMs and reject everything else' do + before do + account_statuses_cleanup_policy.keep_direct = true + account_statuses_cleanup_policy.keep_pinned = false + account_statuses_cleanup_policy.keep_polls = false + account_statuses_cleanup_policy.keep_media = false + account_statuses_cleanup_policy.keep_self_fav = false + account_statuses_cleanup_policy.keep_self_bookmark = false + end + + it 'does not return the old direct message for deletion' do + expect(subject.pluck(:id)).to_not include(direct_message.id) + end + + it 'returns every other old status for deletion' do + expect(subject.pluck(:id)).to include(very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + end + end + + context 'when policy is set to keep self-bookmarked toots and reject everything else' do + before do + account_statuses_cleanup_policy.keep_direct = false + account_statuses_cleanup_policy.keep_pinned = false + account_statuses_cleanup_policy.keep_polls = false + account_statuses_cleanup_policy.keep_media = false + account_statuses_cleanup_policy.keep_self_fav = false + account_statuses_cleanup_policy.keep_self_bookmark = true + end + + it 'does not return the old self-bookmarked message for deletion' do + expect(subject.pluck(:id)).to_not include(self_bookmarked.id) + end + + it 'returns every other old status for deletion' do + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + end + end + + context 'when policy is set to keep self-faved toots and reject everything else' do + before do + account_statuses_cleanup_policy.keep_direct = false + account_statuses_cleanup_policy.keep_pinned = false + account_statuses_cleanup_policy.keep_polls = false + account_statuses_cleanup_policy.keep_media = false + account_statuses_cleanup_policy.keep_self_fav = true + account_statuses_cleanup_policy.keep_self_bookmark = false + end + + it 'does not return the old self-bookmarked message for deletion' do + expect(subject.pluck(:id)).to_not include(self_faved.id) + end + + it 'returns every other old status for deletion' do + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + end + end + + context 'when policy is set to keep toots with media and reject everything else' do + before do + account_statuses_cleanup_policy.keep_direct = false + account_statuses_cleanup_policy.keep_pinned = false + account_statuses_cleanup_policy.keep_polls = false + account_statuses_cleanup_policy.keep_media = true + account_statuses_cleanup_policy.keep_self_fav = false + account_statuses_cleanup_policy.keep_self_bookmark = false + end + + it 'does not return the old message with media for deletion' do + expect(subject.pluck(:id)).to_not include(status_with_media.id) + end + + it 'returns every other old status for deletion' do + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + end + end + + context 'when policy is set to keep toots with polls and reject everything else' do + before do + account_statuses_cleanup_policy.keep_direct = false + account_statuses_cleanup_policy.keep_pinned = false + account_statuses_cleanup_policy.keep_polls = true + account_statuses_cleanup_policy.keep_media = false + account_statuses_cleanup_policy.keep_self_fav = false + account_statuses_cleanup_policy.keep_self_bookmark = false + end + + it 'does not return the old poll message for deletion' do + expect(subject.pluck(:id)).to_not include(status_with_poll.id) + end + + it 'returns every other old status for deletion' do + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + end + end + + context 'when policy is set to keep pinned toots and reject everything else' do + before do + account_statuses_cleanup_policy.keep_direct = false + account_statuses_cleanup_policy.keep_pinned = true + account_statuses_cleanup_policy.keep_polls = false + account_statuses_cleanup_policy.keep_media = false + account_statuses_cleanup_policy.keep_self_fav = false + account_statuses_cleanup_policy.keep_self_bookmark = false + end + + it 'does not return the old pinned message for deletion' do + expect(subject.pluck(:id)).to_not include(pinned_status.id) + end + + it 'returns every other old status for deletion' do + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + end + end + + context 'when policy is to not keep any special messages' do + before do + account_statuses_cleanup_policy.keep_direct = false + account_statuses_cleanup_policy.keep_pinned = false + account_statuses_cleanup_policy.keep_polls = false + account_statuses_cleanup_policy.keep_media = false + account_statuses_cleanup_policy.keep_self_fav = false + account_statuses_cleanup_policy.keep_self_bookmark = false + end + + it 'does not return the recent toot' do + expect(subject.pluck(:id)).to_not include(recent_status.id) + end + + it 'does not return the unrelated toot' do + expect(subject.pluck(:id)).to_not include(unrelated_status.id) + end + + it 'returns every other old status for deletion' do + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + end + end + + context 'when policy is set to keep every category of toots' do + before do + account_statuses_cleanup_policy.keep_direct = true + account_statuses_cleanup_policy.keep_pinned = true + account_statuses_cleanup_policy.keep_polls = true + account_statuses_cleanup_policy.keep_media = true + account_statuses_cleanup_policy.keep_self_fav = true + account_statuses_cleanup_policy.keep_self_bookmark = true + end + + it 'does not return unrelated old status' do + expect(subject.pluck(:id)).to_not include(unrelated_status.id) + end + + it 'returns only normal statuses for deletion' do + expect(subject.pluck(:id).sort).to eq [very_old_status.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id].sort + end + end + + context 'when policy is to keep statuses with at least 5 boosts' do + before do + account_statuses_cleanup_policy.min_reblogs = 5 + end + + it 'does not return the recent toot' do + expect(subject.pluck(:id)).to_not include(recent_status.id) + end + + it 'does not return the toot reblogged 5 times' do + expect(subject.pluck(:id)).to_not include(reblogged5.id) + end + + it 'does not return the unrelated toot' do + expect(subject.pluck(:id)).to_not include(unrelated_status.id) + end + + it 'returns old statuses not reblogged as much' do + expect(subject.pluck(:id)).to include(very_old_status.id, faved4.id, faved5.id, reblogged4.id) + end + end + + context 'when policy is to keep statuses with at least 5 favs' do + before do + account_statuses_cleanup_policy.min_favs = 5 + end + + it 'does not return the recent toot' do + expect(subject.pluck(:id)).to_not include(recent_status.id) + end + + it 'does not return the toot faved 5 times' do + expect(subject.pluck(:id)).to_not include(faved5.id) + end + + it 'does not return the unrelated toot' do + expect(subject.pluck(:id)).to_not include(unrelated_status.id) + end + + it 'returns old statuses not faved as much' do + expect(subject.pluck(:id)).to include(very_old_status.id, faved4.id, reblogged4.id, reblogged5.id) + end + end + end +end diff --git a/spec/models/account_tag_stat_spec.rb b/spec/models/account_tag_stat_spec.rb deleted file mode 100644 index 6d3057f355..0000000000 --- a/spec/models/account_tag_stat_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe AccountTagStat, type: :model do - key = 'accounts_count' - let(:account_tag_stat) { Fabricate(:tag).account_tag_stat } - - describe '#increment_count!' do - it 'calls #update' do - args = { key => account_tag_stat.public_send(key) + 1 } - expect(account_tag_stat).to receive(:update).with(args) - account_tag_stat.increment_count!(key) - end - - it 'increments value by 1' do - expect do - account_tag_stat.increment_count!(key) - end.to change { account_tag_stat.accounts_count }.by(1) - end - end - - describe '#decrement_count!' do - it 'calls #update' do - args = { key => [account_tag_stat.public_send(key) - 1, 0].max } - expect(account_tag_stat).to receive(:update).with(args) - account_tag_stat.decrement_count!(key) - end - - it 'decrements value by 1' do - account_tag_stat.update(key => 1) - - expect do - account_tag_stat.decrement_count!(key) - end.to change { account_tag_stat.accounts_count }.by(-1) - end - end -end diff --git a/spec/models/admin/account_action_spec.rb b/spec/models/admin/account_action_spec.rb index 2366b9ca4a..809c7fc46d 100644 --- a/spec/models/admin/account_action_spec.rb +++ b/spec/models/admin/account_action_spec.rb @@ -5,8 +5,8 @@ RSpec.describe Admin::AccountAction, type: :model do describe '#save!' do subject { account_action.save! } - let(:account) { Fabricate(:account, user: Fabricate(:user, admin: true)) } - let(:target_account) { Fabricate(:account, user: Fabricate(:user)) } + let(:account) { Fabricate(:user, admin: true).account } + let(:target_account) { Fabricate(:account) } let(:type) { 'disable' } before do diff --git a/spec/models/canonical_email_block_spec.rb b/spec/models/canonical_email_block_spec.rb new file mode 100644 index 0000000000..8e0050d65a --- /dev/null +++ b/spec/models/canonical_email_block_spec.rb @@ -0,0 +1,47 @@ +require 'rails_helper' + +RSpec.describe CanonicalEmailBlock, type: :model do + describe '#email=' do + let(:target_hash) { '973dfe463ec85785f5f95af5ba3906eedb2d931c24e69824a89ea65dba4e813b' } + + it 'sets canonical_email_hash' do + subject.email = 'test@example.com' + expect(subject.canonical_email_hash).to eq target_hash + end + + it 'sets the same hash even with dot permutations' do + subject.email = 't.e.s.t@example.com' + expect(subject.canonical_email_hash).to eq target_hash + end + + it 'sets the same hash even with extensions' do + subject.email = 'test+mastodon1@example.com' + expect(subject.canonical_email_hash).to eq target_hash + end + + it 'sets the same hash with different casing' do + subject.email = 'Test@EXAMPLE.com' + expect(subject.canonical_email_hash).to eq target_hash + end + end + + describe '.block?' do + let!(:canonical_email_block) { Fabricate(:canonical_email_block, email: 'foo@bar.com') } + + it 'returns true for the same email' do + expect(described_class.block?('foo@bar.com')).to be true + end + + it 'returns true for the same email with dots' do + expect(described_class.block?('f.oo@bar.com')).to be true + end + + it 'returns true for the same email with extensions' do + expect(described_class.block?('foo+spam@bar.com')).to be true + end + + it 'returns false for different email' do + expect(described_class.block?('hoge@bar.com')).to be false + end + end +end diff --git a/spec/models/concerns/account_counters_spec.rb b/spec/models/concerns/account_counters_spec.rb new file mode 100644 index 0000000000..4350496e79 --- /dev/null +++ b/spec/models/concerns/account_counters_spec.rb @@ -0,0 +1,60 @@ +require 'rails_helper' + +describe AccountCounters do + let!(:account) { Fabricate(:account) } + + describe '#increment_count!' do + it 'increments the count' do + expect(account.followers_count).to eq 0 + account.increment_count!(:followers_count) + expect(account.followers_count).to eq 1 + end + + it 'increments the count in multi-threaded an environment' do + increment_by = 15 + wait_for_start = true + + threads = Array.new(increment_by) do + Thread.new do + true while wait_for_start + account.increment_count!(:statuses_count) + end + end + + wait_for_start = false + threads.each(&:join) + + expect(account.statuses_count).to eq increment_by + end + end + + describe '#decrement_count!' do + it 'decrements the count' do + account.followers_count = 15 + account.save! + expect(account.followers_count).to eq 15 + account.decrement_count!(:followers_count) + expect(account.followers_count).to eq 14 + end + + it 'decrements the count in multi-threaded an environment' do + decrement_by = 10 + wait_for_start = true + + account.statuses_count = 15 + account.save! + + threads = Array.new(decrement_by) do + Thread.new do + true while wait_for_start + account.decrement_count!(:statuses_count) + end + end + + wait_for_start = false + threads.each(&:join) + + expect(account.statuses_count).to eq 5 + end + end +end diff --git a/spec/models/concerns/account_interactions_spec.rb b/spec/models/concerns/account_interactions_spec.rb index db959280c6..656dd66ccf 100644 --- a/spec/models/concerns/account_interactions_spec.rb +++ b/spec/models/concerns/account_interactions_spec.rb @@ -367,6 +367,23 @@ describe AccountInteractions do end end + describe '#followed_by?' do + subject { account.followed_by?(target_account) } + + context 'followed by target_account' do + it 'returns true' do + account.passive_relationships.create(account: target_account) + is_expected.to be true + end + end + + context 'not followed by target_account' do + it 'returns false' do + is_expected.to be false + end + end + end + describe '#blocking?' do subject { account.blocking?(target_account) } @@ -546,46 +563,57 @@ describe AccountInteractions do end end - describe '#followers_hash' do + describe '#remote_followers_hash' do let(:me) { Fabricate(:account, username: 'Me') } let(:remote_1) { Fabricate(:account, username: 'alice', domain: 'example.org', uri: 'https://example.org/users/alice') } let(:remote_2) { Fabricate(:account, username: 'bob', domain: 'example.org', uri: 'https://example.org/users/bob') } - let(:remote_3) { Fabricate(:account, username: 'eve', domain: 'foo.org', uri: 'https://foo.org/users/eve') } + let(:remote_3) { Fabricate(:account, username: 'instance-actor', domain: 'example.org', uri: 'https://example.org') } + let(:remote_4) { Fabricate(:account, username: 'eve', domain: 'foo.org', uri: 'https://foo.org/users/eve') } before do remote_1.follow!(me) remote_2.follow!(me) remote_3.follow!(me) + remote_4.follow!(me) me.follow!(remote_1) end - context 'on a local user' do - it 'returns correct hash for remote domains' do - expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' - expect(me.remote_followers_hash('https://foo.org/')).to eq 'ccb9c18a67134cfff9d62c7f7e7eb88e6b803446c244b84265565f4eba29df0e' - end - - it 'invalidates cache as needed when removing or adding followers' do - expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' - remote_1.unfollow!(me) - expect(me.remote_followers_hash('https://example.org/')).to eq '241b00794ce9b46aa864f3220afadef128318da2659782985bac5ed5bd436bff' - remote_1.follow!(me) - expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' - end + it 'returns correct hash for remote domains' do + expect(me.remote_followers_hash('https://example.org/')).to eq '20aecbe774b3d61c25094370baf370012b9271c5b172ecedb05caff8d79ef0c7' + expect(me.remote_followers_hash('https://foo.org/')).to eq 'ccb9c18a67134cfff9d62c7f7e7eb88e6b803446c244b84265565f4eba29df0e' + expect(me.remote_followers_hash('https://foo.org.evil.com/')).to eq '0000000000000000000000000000000000000000000000000000000000000000' + expect(me.remote_followers_hash('https://foo')).to eq '0000000000000000000000000000000000000000000000000000000000000000' end - context 'on a remote user' do - it 'returns correct hash for remote domains' do - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) - end + it 'invalidates cache as needed when removing or adding followers' do + expect(me.remote_followers_hash('https://example.org/')).to eq '20aecbe774b3d61c25094370baf370012b9271c5b172ecedb05caff8d79ef0c7' + remote_3.unfollow!(me) + expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' + remote_1.unfollow!(me) + expect(me.remote_followers_hash('https://example.org/')).to eq '241b00794ce9b46aa864f3220afadef128318da2659782985bac5ed5bd436bff' + remote_1.follow!(me) + expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' + end + end - it 'invalidates cache as needed when removing or adding followers' do - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) - me.unfollow!(remote_1) - expect(remote_1.local_followers_hash).to eq '0000000000000000000000000000000000000000000000000000000000000000' - me.follow!(remote_1) - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) - end + describe '#local_followers_hash' do + let(:me) { Fabricate(:account, username: 'Me') } + let(:remote_1) { Fabricate(:account, username: 'alice', domain: 'example.org', uri: 'https://example.org/users/alice') } + + before do + me.follow!(remote_1) + end + + it 'returns correct hash for local users' do + expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) + end + + it 'invalidates cache as needed when removing or adding followers' do + expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) + me.unfollow!(remote_1) + expect(remote_1.local_followers_hash).to eq '0000000000000000000000000000000000000000000000000000000000000000' + me.follow!(remote_1) + expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) end end diff --git a/spec/models/follow_recommendation_suppression_spec.rb b/spec/models/follow_recommendation_suppression_spec.rb new file mode 100644 index 0000000000..39107a2b04 --- /dev/null +++ b/spec/models/follow_recommendation_suppression_spec.rb @@ -0,0 +1,4 @@ +require 'rails_helper' + +RSpec.describe FollowRecommendationSuppression, type: :model do +end diff --git a/spec/models/follow_request_spec.rb b/spec/models/follow_request_spec.rb index 7c8e121d97..b0e854f09a 100644 --- a/spec/models/follow_request_spec.rb +++ b/spec/models/follow_request_spec.rb @@ -7,7 +7,7 @@ RSpec.describe FollowRequest, type: :model do let(:target_account) { Fabricate(:account) } it 'calls Account#follow!, MergeWorker.perform_async, and #destroy!' do - expect(account).to receive(:follow!).with(target_account, reblogs: true, notify: false, uri: follow_request.uri) + expect(account).to receive(:follow!).with(target_account, reblogs: true, notify: false, uri: follow_request.uri, bypass_limit: true) expect(MergeWorker).to receive(:perform_async).with(target_account.id, account.id) expect(follow_request).to receive(:destroy!) follow_request.authorize! diff --git a/spec/models/form/status_batch_spec.rb b/spec/models/form/status_batch_spec.rb deleted file mode 100644 index 68d84a7379..0000000000 --- a/spec/models/form/status_batch_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'rails_helper' - -describe Form::StatusBatch do - let(:form) { Form::StatusBatch.new(action: action, status_ids: status_ids) } - let(:status) { Fabricate(:status) } - - describe 'with nsfw action' do - let(:status_ids) { [status.id, nonsensitive_status.id, sensitive_status.id] } - let(:nonsensitive_status) { Fabricate(:status, sensitive: false) } - let(:sensitive_status) { Fabricate(:status, sensitive: true) } - let!(:shown_media_attachment) { Fabricate(:media_attachment, status: nonsensitive_status) } - let!(:hidden_media_attachment) { Fabricate(:media_attachment, status: sensitive_status) } - - context 'nsfw_on' do - let(:action) { 'nsfw_on' } - - it { expect(form.save).to be true } - it { expect { form.save }.to change { nonsensitive_status.reload.sensitive }.from(false).to(true) } - it { expect { form.save }.not_to change { sensitive_status.reload.sensitive } } - it { expect { form.save }.not_to change { status.reload.sensitive } } - end - - context 'nsfw_off' do - let(:action) { 'nsfw_off' } - - it { expect(form.save).to be true } - it { expect { form.save }.to change { sensitive_status.reload.sensitive }.from(true).to(false) } - it { expect { form.save }.not_to change { nonsensitive_status.reload.sensitive } } - it { expect { form.save }.not_to change { status.reload.sensitive } } - end - end - - describe 'with delete action' do - let(:status_ids) { [status.id] } - let(:action) { 'delete' } - let!(:another_status) { Fabricate(:status) } - - before do - allow(RemovalWorker).to receive(:perform_async) - end - - it 'call RemovalWorker' do - form.save - expect(RemovalWorker).to have_received(:perform_async).with(status.id, immediate: true) - end - - it 'do not call RemovalWorker' do - form.save - expect(RemovalWorker).not_to have_received(:perform_async).with(another_status.id, immediate: true) - end - end -end diff --git a/spec/models/login_activity_spec.rb b/spec/models/login_activity_spec.rb new file mode 100644 index 0000000000..ba2d207c91 --- /dev/null +++ b/spec/models/login_activity_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe LoginActivity, type: :model do + +end diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb index 456bc42167..7360b23cf0 100644 --- a/spec/models/media_attachment_spec.rb +++ b/spec/models/media_attachment_spec.rb @@ -62,11 +62,23 @@ RSpec.describe MediaAttachment, type: :model do end describe '#to_param' do - let(:media_attachment) { Fabricate(:media_attachment) } - let(:shortcode) { media_attachment.shortcode } + let(:media_attachment) { Fabricate(:media_attachment, shortcode: shortcode) } + let(:shortcode) { nil } - it 'returns shortcode' do - expect(media_attachment.to_param).to eq shortcode + context 'when media attachment has a shortcode' do + let(:shortcode) { 'foo' } + + it 'returns shortcode' do + expect(media_attachment.to_param).to eq shortcode + end + end + + context 'when media attachment does not have a shortcode' do + let(:shortcode) { nil } + + it 'returns string representation of id' do + expect(media_attachment.to_param).to eq media_attachment.id.to_s + end end end @@ -114,6 +126,30 @@ RSpec.describe MediaAttachment, type: :model do end end + describe 'ogg with cover art' do + let(:media) { MediaAttachment.create(account: Fabricate(:account), file: attachment_fixture('boop.ogg')) } + + it 'detects it as an audio file' do + expect(media.type).to eq 'audio' + end + + it 'sets meta for the duration' do + expect(media.file.meta['original']['duration']).to be_within(0.05).of(0.235102) + end + + it 'extracts thumbnail' do + expect(media.thumbnail.present?).to eq true + end + + it 'extracts colors from thumbnail' do + expect(media.file.meta['colors']['background']).to eq '#3088d4' + end + + it 'gives the file a random name' do + expect(media.file_file_name).to_not eq 'boop.ogg' + end + end + describe 'jpeg' do let(:media) { MediaAttachment.create(account: Fabricate(:account), file: attachment_fixture('attachment.jpg')) } @@ -157,4 +193,32 @@ RSpec.describe MediaAttachment, type: :model do expect(media.description.size).to be <= 1_500 end end + + describe 'size limit validation' do + it 'rejects video files that are too large' do + stub_const 'MediaAttachment::IMAGE_LIMIT', 100.megabytes + stub_const 'MediaAttachment::VIDEO_LIMIT', 1.kilobyte + expect { MediaAttachment.create!(account: Fabricate(:account), file: attachment_fixture('attachment.webm')) }.to raise_error(ActiveRecord::RecordInvalid) + end + + it 'accepts video files that are small enough' do + stub_const 'MediaAttachment::IMAGE_LIMIT', 1.kilobyte + stub_const 'MediaAttachment::VIDEO_LIMIT', 100.megabytes + media = MediaAttachment.create!(account: Fabricate(:account), file: attachment_fixture('attachment.webm')) + expect(media.valid?).to be true + end + + it 'rejects image files that are too large' do + stub_const 'MediaAttachment::IMAGE_LIMIT', 1.kilobyte + stub_const 'MediaAttachment::VIDEO_LIMIT', 100.megabytes + expect { MediaAttachment.create!(account: Fabricate(:account), file: attachment_fixture('attachment.jpg')) }.to raise_error(ActiveRecord::RecordInvalid) + end + + it 'accepts image files that are small enough' do + stub_const 'MediaAttachment::IMAGE_LIMIT', 100.megabytes + stub_const 'MediaAttachment::VIDEO_LIMIT', 1.kilobyte + media = MediaAttachment.create!(account: Fabricate(:account), file: attachment_fixture('attachment.jpg')) + expect(media.valid?).to be true + end + end end diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index 0a045904bb..1e9e45d8d6 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -56,47 +56,114 @@ RSpec.describe Notification, type: :model do end end - describe '.reload_stale_associations!' do - context 'account_ids are empty' do - let(:cached_items) { [] } - - subject { described_class.reload_stale_associations!(cached_items) } - - it 'returns nil' do - is_expected.to be nil + describe '.preload_cache_collection_target_statuses' do + subject do + described_class.preload_cache_collection_target_statuses(notifications) do |target_statuses| + # preload account for testing instead of using cache_collection + Status.preload(:account).where(id: target_statuses.map(&:id)) end end - context 'account_ids are present' do + context 'notifications are empty' do + let(:notifications) { [] } + + it 'returns []' do + is_expected.to eq [] + end + end + + context 'notifications are present' do before do - allow(accounts_with_ids).to receive(:[]).with(stale_account1.id).and_return(account1) - allow(accounts_with_ids).to receive(:[]).with(stale_account2.id).and_return(account2) - allow(Account).to receive_message_chain(:where, :includes, :index_by).and_return(accounts_with_ids) + notifications.each(&:reload) end - let(:cached_items) do + let(:mention) { Fabricate(:mention) } + let(:status) { Fabricate(:status) } + let(:reblog) { Fabricate(:status, reblog: Fabricate(:status)) } + let(:follow) { Fabricate(:follow) } + let(:follow_request) { Fabricate(:follow_request) } + let(:favourite) { Fabricate(:favourite) } + let(:poll) { Fabricate(:poll) } + + let(:notifications) do [ - Fabricate(:notification, activity: Fabricate(:status)), - Fabricate(:notification, activity: Fabricate(:follow)), + Fabricate(:notification, type: :mention, activity: mention), + Fabricate(:notification, type: :status, activity: status), + Fabricate(:notification, type: :reblog, activity: reblog), + Fabricate(:notification, type: :follow, activity: follow), + Fabricate(:notification, type: :follow_request, activity: follow_request), + Fabricate(:notification, type: :favourite, activity: favourite), + Fabricate(:notification, type: :poll, activity: poll), ] end - let(:stale_account1) { cached_items[0].from_account } - let(:stale_account2) { cached_items[1].from_account } + it 'preloads target status' do + # mention + expect(subject[0].type).to eq :mention + expect(subject[0].association(:mention)).to be_loaded + expect(subject[0].mention.association(:status)).to be_loaded - let(:account1) { Fabricate(:account) } - let(:account2) { Fabricate(:account) } + # status + expect(subject[1].type).to eq :status + expect(subject[1].association(:status)).to be_loaded - let(:accounts_with_ids) { { account1.id => account1, account2.id => account2 } } + # reblog + expect(subject[2].type).to eq :reblog + expect(subject[2].association(:status)).to be_loaded + expect(subject[2].status.association(:reblog)).to be_loaded - it 'reloads associations' do - expect(cached_items[0].from_account).to be stale_account1 - expect(cached_items[1].from_account).to be stale_account2 + # follow: nothing + expect(subject[3].type).to eq :follow + expect(subject[3].target_status).to be_nil - described_class.reload_stale_associations!(cached_items) + # follow_request: nothing + expect(subject[4].type).to eq :follow_request + expect(subject[4].target_status).to be_nil - expect(cached_items[0].from_account).to be account1 - expect(cached_items[1].from_account).to be account2 + # favourite + expect(subject[5].type).to eq :favourite + expect(subject[5].association(:favourite)).to be_loaded + expect(subject[5].favourite.association(:status)).to be_loaded + + # poll + expect(subject[6].type).to eq :poll + expect(subject[6].association(:poll)).to be_loaded + expect(subject[6].poll.association(:status)).to be_loaded + end + + it 'replaces to cached status' do + # mention + expect(subject[0].type).to eq :mention + expect(subject[0].target_status.association(:account)).to be_loaded + expect(subject[0].target_status).to eq mention.status + + # status + expect(subject[1].type).to eq :status + expect(subject[1].target_status.association(:account)).to be_loaded + expect(subject[1].target_status).to eq status + + # reblog + expect(subject[2].type).to eq :reblog + expect(subject[2].target_status.association(:account)).to be_loaded + expect(subject[2].target_status).to eq reblog.reblog + + # follow: nothing + expect(subject[3].type).to eq :follow + expect(subject[3].target_status).to be_nil + + # follow_request: nothing + expect(subject[4].type).to eq :follow_request + expect(subject[4].target_status).to be_nil + + # favourite + expect(subject[5].type).to eq :favourite + expect(subject[5].target_status.association(:account)).to be_loaded + expect(subject[5].target_status).to eq favourite.status + + # poll + expect(subject[6].type).to eq :poll + expect(subject[6].target_status.association(:account)).to be_loaded + expect(subject[6].target_status).to eq poll.status end end end diff --git a/spec/models/public_feed_spec.rb b/spec/models/public_feed_spec.rb index c251953a4c..23cc3ceea1 100644 --- a/spec/models/public_feed_spec.rb +++ b/spec/models/public_feed_spec.rb @@ -31,7 +31,6 @@ RSpec.describe PublicFeed, type: :model do end it 'filters out silenced accounts' do - account = Fabricate(:account) silenced_account = Fabricate(:account, silenced: true) status = Fabricate(:status, account: account) silenced_status = Fabricate(:status, account: silenced_account) @@ -238,8 +237,7 @@ RSpec.describe PublicFeed, type: :model do context 'with language preferences' do it 'excludes statuses in languages not allowed by the account user' do - user = Fabricate(:user, chosen_languages: [:en, :es]) - @account.update(user: user) + @account.user.update(chosen_languages: [:en, :es]) en_status = Fabricate(:status, language: 'en') es_status = Fabricate(:status, language: 'es') fr_status = Fabricate(:status, language: 'fr') @@ -250,8 +248,7 @@ RSpec.describe PublicFeed, type: :model do end it 'includes all languages when user does not have a setting' do - user = Fabricate(:user, chosen_languages: nil) - @account.update(user: user) + @account.user.update(chosen_languages: nil) en_status = Fabricate(:status, language: 'en') es_status = Fabricate(:status, language: 'es') @@ -261,7 +258,8 @@ RSpec.describe PublicFeed, type: :model do end it 'includes all languages when account does not have a user' do - expect(@account.user).to be_nil + @account.update(user: nil) + en_status = Fabricate(:status, language: 'en') es_status = Fabricate(:status, language: 'es') diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb index 312954c9dc..3d29c02195 100644 --- a/spec/models/report_spec.rb +++ b/spec/models/report_spec.rb @@ -54,7 +54,7 @@ describe Report do end describe 'resolve!' do - subject(:report) { Fabricate(:report, action_taken: false, action_taken_by_account_id: nil) } + subject(:report) { Fabricate(:report, action_taken_at: nil, action_taken_by_account_id: nil) } let(:acting_account) { Fabricate(:account) } @@ -63,12 +63,13 @@ describe Report do end it 'records action taken' do - expect(report).to have_attributes(action_taken: true, action_taken_by_account_id: acting_account.id) + expect(report.action_taken?).to be true + expect(report.action_taken_by_account_id).to eq acting_account.id end end describe 'unresolve!' do - subject(:report) { Fabricate(:report, action_taken: true, action_taken_by_account_id: acting_account.id) } + subject(:report) { Fabricate(:report, action_taken_at: Time.now.utc, action_taken_by_account_id: acting_account.id) } let(:acting_account) { Fabricate(:account) } @@ -77,23 +78,24 @@ describe Report do end it 'unresolves' do - expect(report).to have_attributes(action_taken: false, action_taken_by_account_id: nil) + expect(report.action_taken?).to be false + expect(report.action_taken_by_account_id).to be_nil end end describe 'unresolved?' do subject { report.unresolved? } - let(:report) { Fabricate(:report, action_taken: action_taken) } + let(:report) { Fabricate(:report, action_taken_at: action_taken) } context 'if action is taken' do - let(:action_taken) { true } + let(:action_taken) { Time.now.utc } it { is_expected.to be false } end context 'if action not is taken' do - let(:action_taken) { false } + let(:action_taken) { nil } it { is_expected.to be true } end diff --git a/spec/models/rule_spec.rb b/spec/models/rule_spec.rb new file mode 100644 index 0000000000..8666bda713 --- /dev/null +++ b/spec/models/rule_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Rule, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/session_activation_spec.rb b/spec/models/session_activation_spec.rb index 2aa6950370..450dc1399f 100644 --- a/spec/models/session_activation_spec.rb +++ b/spec/models/session_activation_spec.rb @@ -74,13 +74,13 @@ RSpec.describe SessionActivation, type: :model do let(:options) { { user: Fabricate(:user), session_id: '1' } } it 'calls create! and purge_old' do - expect(described_class).to receive(:create!).with(options) + expect(described_class).to receive(:create!).with(**options) expect(described_class).to receive(:purge_old) - described_class.activate(options) + described_class.activate(**options) end it 'returns an instance of SessionActivation' do - expect(described_class.activate(options)).to be_kind_of SessionActivation + expect(described_class.activate(**options)).to be_kind_of SessionActivation end end diff --git a/spec/models/setting_spec.rb b/spec/models/setting_spec.rb index 1cc5286748..3ccc21d6c4 100644 --- a/spec/models/setting_spec.rb +++ b/spec/models/setting_spec.rb @@ -99,11 +99,12 @@ RSpec.describe Setting, type: :model do end it 'does not query the database' do - expect do |callback| - ActiveSupport::Notifications.subscribed callback, 'sql.active_record' do - described_class[key] - end - end.not_to yield_control + callback = double + allow(callback).to receive(:call) + ActiveSupport::Notifications.subscribed callback, 'sql.active_record' do + described_class[key] + end + expect(callback).not_to have_received(:call) end it 'returns the cached value' do diff --git a/spec/models/status_edit_spec.rb b/spec/models/status_edit_spec.rb new file mode 100644 index 0000000000..2ecafef734 --- /dev/null +++ b/spec/models/status_edit_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe StatusEdit, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/status_pin_spec.rb b/spec/models/status_pin_spec.rb index 6f0b2feb8b..c18faca782 100644 --- a/spec/models/status_pin_spec.rb +++ b/spec/models/status_pin_spec.rb @@ -24,11 +24,11 @@ RSpec.describe StatusPin, type: :model do expect(StatusPin.new(account: account, status: reblog).save).to be false end - it 'does not allow pins of private statuses' do + it 'does allow pins of direct statuses' do account = Fabricate(:account) status = Fabricate(:status, account: account, visibility: :private) - expect(StatusPin.new(account: account, status: status).save).to be false + expect(StatusPin.new(account: account, status: status).save).to be true end it 'does not allow pins of direct statuses' do diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index c1375ea944..25c98d508c 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -354,6 +354,87 @@ RSpec.describe Status, type: :model do end end + describe '.tagged_with' do + let(:tag1) { Fabricate(:tag) } + let(:tag2) { Fabricate(:tag) } + let(:tag3) { Fabricate(:tag) } + let!(:status1) { Fabricate(:status, tags: [tag1]) } + let!(:status2) { Fabricate(:status, tags: [tag2]) } + let!(:status3) { Fabricate(:status, tags: [tag3]) } + let!(:status4) { Fabricate(:status, tags: []) } + let!(:status5) { Fabricate(:status, tags: [tag1, tag2, tag3]) } + + context 'when given one tag' do + it 'returns the expected statuses' do + expect(Status.tagged_with([tag1.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status5.id] + expect(Status.tagged_with([tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status5.id] + expect(Status.tagged_with([tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status3.id, status5.id] + end + end + + context 'when given multiple tags' do + it 'returns the expected statuses' do + expect(Status.tagged_with([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status2.id, status5.id] + expect(Status.tagged_with([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status3.id, status5.id] + expect(Status.tagged_with([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status3.id, status5.id] + end + end + end + + describe '.tagged_with_all' do + let(:tag1) { Fabricate(:tag) } + let(:tag2) { Fabricate(:tag) } + let(:tag3) { Fabricate(:tag) } + let!(:status1) { Fabricate(:status, tags: [tag1]) } + let!(:status2) { Fabricate(:status, tags: [tag2]) } + let!(:status3) { Fabricate(:status, tags: [tag3]) } + let!(:status4) { Fabricate(:status, tags: []) } + let!(:status5) { Fabricate(:status, tags: [tag1, tag2]) } + + context 'when given one tag' do + it 'returns the expected statuses' do + expect(Status.tagged_with_all([tag1.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status5.id] + expect(Status.tagged_with_all([tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status5.id] + expect(Status.tagged_with_all([tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status3.id] + end + end + + context 'when given multiple tags' do + it 'returns the expected statuses' do + expect(Status.tagged_with_all([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status5.id] + expect(Status.tagged_with_all([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [] + expect(Status.tagged_with_all([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [] + end + end + end + + describe '.tagged_with_none' do + let(:tag1) { Fabricate(:tag) } + let(:tag2) { Fabricate(:tag) } + let(:tag3) { Fabricate(:tag) } + let!(:status1) { Fabricate(:status, tags: [tag1]) } + let!(:status2) { Fabricate(:status, tags: [tag2]) } + let!(:status3) { Fabricate(:status, tags: [tag3]) } + let!(:status4) { Fabricate(:status, tags: []) } + let!(:status5) { Fabricate(:status, tags: [tag1, tag2, tag3]) } + + context 'when given one tag' do + it 'returns the expected statuses' do + expect(Status.tagged_with_none([tag1.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status3.id, status4.id] + expect(Status.tagged_with_none([tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status3.id, status4.id] + expect(Status.tagged_with_none([tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status2.id, status4.id] + end + end + + context 'when given multiple tags' do + it 'returns the expected statuses' do + expect(Status.tagged_with_none([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status3.id, status4.id] + expect(Status.tagged_with_none([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status4.id] + expect(Status.tagged_with_none([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status4.id] + end + end + end + describe '.permitted_for' do subject { described_class.permitted_for(target_account, account).pluck(:visibility) } diff --git a/spec/models/tag_feed_spec.rb b/spec/models/tag_feed_spec.rb index 76277c4678..45f7c3329b 100644 --- a/spec/models/tag_feed_spec.rb +++ b/spec/models/tag_feed_spec.rb @@ -37,7 +37,7 @@ describe TagFeed, type: :service do expect(results).to include both end - it 'handles being passed non existant tag names' do + it 'handles being passed non existent tag names' do results = described_class.new(tag1, nil, any: ['wark']).get(20) expect(results).to include status1 expect(results).to_not include status2 diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index df876593c9..3949dbce54 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -96,6 +96,20 @@ RSpec.describe Tag, type: :model do end end + describe '.matches_name' do + it 'returns tags for multibyte case-insensitive names' do + upcase_string = 'abcABCabcABCやゆよ' + downcase_string = 'abcabcabcabcやゆよ'; + + tag = Fabricate(:tag, name: downcase_string) + expect(Tag.matches_name(upcase_string)).to eq [tag] + end + + it 'uses the LIKE operator' do + expect(Tag.matches_name('100%abc').to_sql).to eq %q[SELECT "tags".* FROM "tags" WHERE LOWER("tags"."name") LIKE LOWER('100\\%abc%')] + end + end + describe '.matching_name' do it 'returns tags for multibyte case-insensitive names' do upcase_string = 'abcABCabcABCやゆよ' diff --git a/spec/models/trending_tags_spec.rb b/spec/models/trending_tags_spec.rb deleted file mode 100644 index b6122c9948..0000000000 --- a/spec/models/trending_tags_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -require 'rails_helper' - -RSpec.describe TrendingTags do - describe '.record_use!' do - pending - end - - describe '.update!' do - let!(:at_time) { Time.now.utc } - let!(:tag1) { Fabricate(:tag, name: 'Catstodon') } - let!(:tag2) { Fabricate(:tag, name: 'DogsOfMastodon') } - let!(:tag3) { Fabricate(:tag, name: 'OCs') } - - before do - allow(Redis.current).to receive(:pfcount) do |key| - case key - when "activity:tags:#{tag1.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts" - 2 - when "activity:tags:#{tag1.id}:#{at_time.beginning_of_day.to_i}:accounts" - 16 - when "activity:tags:#{tag2.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts" - 0 - when "activity:tags:#{tag2.id}:#{at_time.beginning_of_day.to_i}:accounts" - 4 - when "activity:tags:#{tag3.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts" - 13 - end - end - - Redis.current.zadd('trending_tags', 0.9, tag3.id) - Redis.current.sadd("trending_tags:used:#{at_time.beginning_of_day.to_i}", [tag1.id, tag2.id]) - - tag3.update(max_score: 0.9, max_score_at: (at_time - 1.day).beginning_of_day + 12.hours) - - described_class.update!(at_time) - end - - it 'calculates and re-calculates scores' do - expect(described_class.get(10, filtered: false)).to eq [tag1, tag3] - end - - it 'omits hashtags below threshold' do - expect(described_class.get(10, filtered: false)).to_not include(tag2) - end - - it 'decays scores' do - expect(Redis.current.zscore('trending_tags', tag3.id)).to be < 0.9 - end - end - - describe '.trending?' do - let(:tag) { Fabricate(:tag) } - - before do - 10.times { |i| Redis.current.zadd('trending_tags', i + 1, Fabricate(:tag).id) } - end - - it 'returns true if the hashtag is within limit' do - Redis.current.zadd('trending_tags', 11, tag.id) - expect(described_class.trending?(tag)).to be true - end - - it 'returns false if the hashtag is outside the limit' do - Redis.current.zadd('trending_tags', 0, tag.id) - expect(described_class.trending?(tag)).to be false - end - end -end diff --git a/spec/models/trends/tags_spec.rb b/spec/models/trends/tags_spec.rb new file mode 100644 index 0000000000..4f98c6aa4c --- /dev/null +++ b/spec/models/trends/tags_spec.rb @@ -0,0 +1,67 @@ +require 'rails_helper' + +RSpec.describe Trends::Tags do + subject { described_class.new(threshold: 5, review_threshold: 10) } + + let!(:at_time) { DateTime.new(2021, 11, 14, 10, 15, 0) } + + describe '#add' do + let(:tag) { Fabricate(:tag) } + + before do + subject.add(tag, 1, at_time) + end + + it 'records history' do + expect(tag.history.get(at_time).accounts).to eq 1 + end + + it 'records use' do + expect(subject.send(:recently_used_ids, at_time)).to eq [tag.id] + end + end + + describe '#get' do + pending + end + + describe '#refresh' do + let!(:today) { at_time } + let!(:yesterday) { today - 1.day } + + let!(:tag1) { Fabricate(:tag, name: 'Catstodon', trendable: true) } + let!(:tag2) { Fabricate(:tag, name: 'DogsOfMastodon', trendable: true) } + let!(:tag3) { Fabricate(:tag, name: 'OCs', trendable: true) } + + before do + 2.times { |i| subject.add(tag1, i, yesterday) } + 13.times { |i| subject.add(tag3, i, yesterday) } + 16.times { |i| subject.add(tag1, i, today) } + 4.times { |i| subject.add(tag2, i, today) } + end + + context do + before do + subject.refresh(yesterday + 12.hours) + subject.refresh(at_time) + end + + it 'calculates and re-calculates scores' do + expect(subject.get(false, 10)).to eq [tag1, tag3] + end + + it 'omits hashtags below threshold' do + expect(subject.get(false, 10)).to_not include(tag2) + end + end + + it 'decays scores' do + subject.refresh(yesterday + 12.hours) + original_score = subject.score(tag3.id) + expect(original_score).to eq 144.0 + subject.refresh(yesterday + 12.hours + subject.options[:max_score_halflife]) + decayed_score = subject.score(tag3.id) + expect(decayed_score).to be <= original_score / 2 + end + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index cded4c99bd..406438c220 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -175,7 +175,7 @@ RSpec.describe User, type: :model do user = Fabricate(:user) ActiveJob::Base.queue_adapter = :test - expect { user.send_confirmation_instructions }.to have_enqueued_job(ActionMailer::DeliveryJob) + expect { user.send_confirmation_instructions }.to have_enqueued_job(ActionMailer::MailDeliveryJob) end end @@ -194,19 +194,19 @@ RSpec.describe User, type: :model do end it "returns 'private' if user has not configured default privacy setting and account is locked" do - user = Fabricate(:user, account: Fabricate(:account, locked: true)) + user = Fabricate(:account, locked: true).user expect(user.setting_default_privacy).to eq 'private' end it "returns 'public' if user has not configured default privacy setting and account is not locked" do - user = Fabricate(:user, account: Fabricate(:account, locked: false)) + user = Fabricate(:account, locked: false).user expect(user.setting_default_privacy).to eq 'public' end end describe 'whitelist' do around(:each) do |example| - old_whitelist = Rails.configuration.x.email_whitelist + old_whitelist = Rails.configuration.x.email_domains_whitelist Rails.configuration.x.email_domains_whitelist = 'mastodon.space' @@ -248,7 +248,7 @@ RSpec.describe User, type: :model do it_behaves_like 'Settings-extended' do def create! - User.create!(account: Fabricate(:account), email: 'foo@mastodon.space', password: 'abcd1234', agreement: true) + User.create!(account: Fabricate(:account, user: nil), email: 'foo@mastodon.space', password: 'abcd1234', agreement: true) end def fabricate @@ -344,6 +344,34 @@ RSpec.describe User, type: :model do end end + describe '#reset_password!' do + subject(:user) { Fabricate(:user, password: 'foobar12345') } + + let!(:session_activation) { Fabricate(:session_activation, user: user) } + let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) } + let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) } + + before do + user.reset_password! + end + + it 'changes the password immediately' do + expect(user.external_or_valid_password?('foobar12345')).to be false + end + + it 'deactivates all sessions' do + expect(user.session_activations.count).to eq 0 + end + + it 'revokes all access tokens' do + expect(Doorkeeper::AccessToken.active_for(user).count).to eq 0 + end + + it 'removes push subscriptions' do + expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count).to eq 0 + end + end + describe '#confirm!' do subject(:user) { Fabricate(:user, confirmed_at: confirmed_at) } diff --git a/spec/models/web/push_subscription_spec.rb b/spec/models/web/push_subscription_spec.rb index c6665611c6..b44904369b 100644 --- a/spec/models/web/push_subscription_spec.rb +++ b/spec/models/web/push_subscription_spec.rb @@ -1,16 +1,94 @@ require 'rails_helper' RSpec.describe Web::PushSubscription, type: :model do - let(:alerts) { { mention: true, reblog: false, follow: true, follow_request: false, favourite: true } } - let(:push_subscription) { Web::PushSubscription.new(data: { alerts: alerts }) } + let(:account) { Fabricate(:account) } + + let(:policy) { 'all' } + + let(:data) do + { + policy: policy, + + alerts: { + mention: true, + reblog: false, + follow: true, + follow_request: false, + favourite: true, + }, + } + end + + subject { described_class.new(data: data) } describe '#pushable?' do - it 'obeys alert settings' do - expect(push_subscription.send(:pushable?, Notification.new(activity_type: 'Mention'))).to eq true - expect(push_subscription.send(:pushable?, Notification.new(activity_type: 'Status'))).to eq false - expect(push_subscription.send(:pushable?, Notification.new(activity_type: 'Follow'))).to eq true - expect(push_subscription.send(:pushable?, Notification.new(activity_type: 'FollowRequest'))).to eq false - expect(push_subscription.send(:pushable?, Notification.new(activity_type: 'Favourite'))).to eq true + let(:notification_type) { :mention } + let(:notification) { Fabricate(:notification, account: account, type: notification_type) } + + %i(mention reblog follow follow_request favourite).each do |type| + context "when notification is a #{type}" do + let(:notification_type) { type } + + it "returns boolean corresonding to alert setting" do + expect(subject.pushable?(notification)).to eq data[:alerts][type] + end + end + end + + context 'when policy is all' do + let(:policy) { 'all' } + + it 'returns true' do + expect(subject.pushable?(notification)).to eq true + end + end + + context 'when policy is none' do + let(:policy) { 'none' } + + it 'returns false' do + expect(subject.pushable?(notification)).to eq false + end + end + + context 'when policy is followed' do + let(:policy) { 'followed' } + + context 'and notification is from someone you follow' do + before do + account.follow!(notification.from_account) + end + + it 'returns true' do + expect(subject.pushable?(notification)).to eq true + end + end + + context 'and notification is not from someone you follow' do + it 'returns false' do + expect(subject.pushable?(notification)).to eq false + end + end + end + + context 'when policy is follower' do + let(:policy) { 'follower' } + + context 'and notification is from someone who follows you' do + before do + notification.from_account.follow!(account) + end + + it 'returns true' do + expect(subject.pushable?(notification)).to eq true + end + end + + context 'and notification is not from someone who follows you' do + it 'returns false' do + expect(subject.pushable?(notification)).to eq false + end + end end end end diff --git a/spec/policies/account_moderation_note_policy_spec.rb b/spec/policies/account_moderation_note_policy_spec.rb index bb7af94e45..39ec2008ae 100644 --- a/spec/policies/account_moderation_note_policy_spec.rb +++ b/spec/policies/account_moderation_note_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe AccountModerationNotePolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :create? do context 'staff' do @@ -42,7 +42,7 @@ RSpec.describe AccountModerationNotePolicy do end context 'neither admin nor owner' do - let(:kevin) { Fabricate(:user).account } + let(:kevin) { Fabricate(:account) } it 'denies to destroy' do expect(subject).to_not permit(kevin, account_moderation_note) diff --git a/spec/policies/account_policy_spec.rb b/spec/policies/account_policy_spec.rb index 1347ca4a03..b55eb65a79 100644 --- a/spec/policies/account_policy_spec.rb +++ b/spec/policies/account_policy_spec.rb @@ -6,8 +6,8 @@ require 'pundit/rspec' RSpec.describe AccountPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } - let(:alice) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } + let(:alice) { Fabricate(:account) } permissions :index? do context 'staff' do @@ -37,7 +37,7 @@ RSpec.describe AccountPolicy do end end - permissions :unsuspend? do + permissions :unsuspend?, :unblock_email? do before do alice.suspend! end diff --git a/spec/policies/backup_policy_spec.rb b/spec/policies/backup_policy_spec.rb index 80407e12f8..6b31c6f7c7 100644 --- a/spec/policies/backup_policy_spec.rb +++ b/spec/policies/backup_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe BackupPolicy do let(:subject) { described_class } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :create? do context 'not user_signed_in?' do diff --git a/spec/policies/custom_emoji_policy_spec.rb b/spec/policies/custom_emoji_policy_spec.rb index 8def88212f..e4f1af3c1b 100644 --- a/spec/policies/custom_emoji_policy_spec.rb +++ b/spec/policies/custom_emoji_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe CustomEmojiPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :index?, :enable?, :disable? do context 'staff' do diff --git a/spec/policies/domain_block_policy_spec.rb b/spec/policies/domain_block_policy_spec.rb index aea50ec0fd..b24ed9e3a3 100644 --- a/spec/policies/domain_block_policy_spec.rb +++ b/spec/policies/domain_block_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe DomainBlockPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :index?, :show?, :create?, :destroy? do context 'admin' do diff --git a/spec/policies/email_domain_block_policy_spec.rb b/spec/policies/email_domain_block_policy_spec.rb index a3e825e078..1ff55af8e6 100644 --- a/spec/policies/email_domain_block_policy_spec.rb +++ b/spec/policies/email_domain_block_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe EmailDomainBlockPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :index?, :create?, :destroy? do context 'admin' do diff --git a/spec/policies/instance_policy_spec.rb b/spec/policies/instance_policy_spec.rb index 77a3bde3fb..71ef1fe507 100644 --- a/spec/policies/instance_policy_spec.rb +++ b/spec/policies/instance_policy_spec.rb @@ -6,9 +6,9 @@ require 'pundit/rspec' RSpec.describe InstancePolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } - permissions :index? do + permissions :index?, :show?, :destroy? do context 'admin' do it 'permits' do expect(subject).to permit(admin, Instance) diff --git a/spec/policies/invite_policy_spec.rb b/spec/policies/invite_policy_spec.rb index e391455be3..1221378047 100644 --- a/spec/policies/invite_policy_spec.rb +++ b/spec/policies/invite_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe InvitePolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :index? do context 'staff?' do diff --git a/spec/policies/relay_policy_spec.rb b/spec/policies/relay_policy_spec.rb index 640f27d547..139d945dc8 100644 --- a/spec/policies/relay_policy_spec.rb +++ b/spec/policies/relay_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe RelayPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :update? do context 'admin?' do diff --git a/spec/policies/report_note_policy_spec.rb b/spec/policies/report_note_policy_spec.rb index 596d7d7a95..c34f99b712 100644 --- a/spec/policies/report_note_policy_spec.rb +++ b/spec/policies/report_note_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe ReportNotePolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :create? do context 'staff?' do diff --git a/spec/policies/report_policy_spec.rb b/spec/policies/report_policy_spec.rb index c9ae1e87a9..84c366d7f3 100644 --- a/spec/policies/report_policy_spec.rb +++ b/spec/policies/report_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe ReportPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :update?, :index?, :show? do context 'staff?' do diff --git a/spec/policies/settings_policy_spec.rb b/spec/policies/settings_policy_spec.rb index 92f1f4869a..3fa183c509 100644 --- a/spec/policies/settings_policy_spec.rb +++ b/spec/policies/settings_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe SettingsPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :update?, :show? do context 'admin?' do diff --git a/spec/policies/tag_policy_spec.rb b/spec/policies/tag_policy_spec.rb index c63875dc08..256e6786a3 100644 --- a/spec/policies/tag_policy_spec.rb +++ b/spec/policies/tag_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe TagPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :index?, :show?, :update? do context 'staff?' do diff --git a/spec/policies/user_policy_spec.rb b/spec/policies/user_policy_spec.rb index e37904f048..1933ee014f 100644 --- a/spec/policies/user_policy_spec.rb +++ b/spec/policies/user_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe UserPolicy do let(:subject) { described_class } let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:user).account } + let(:john) { Fabricate(:account) } permissions :reset_password?, :change_email? do context 'staff?' do diff --git a/spec/presenters/account_relationships_presenter_spec.rb b/spec/presenters/account_relationships_presenter_spec.rb index f8b048d38a..edfbbb3549 100644 --- a/spec/presenters/account_relationships_presenter_spec.rb +++ b/spec/presenters/account_relationships_presenter_spec.rb @@ -13,7 +13,7 @@ RSpec.describe AccountRelationshipsPresenter do allow(Account).to receive(:domain_blocking_map).with(account_ids, current_account_id).and_return(default_map) end - let(:presenter) { AccountRelationshipsPresenter.new(account_ids, current_account_id, options) } + let(:presenter) { AccountRelationshipsPresenter.new(account_ids, current_account_id, **options) } let(:current_account_id) { Fabricate(:account).id } let(:account_ids) { [Fabricate(:account).id] } let(:default_map) { { 1 => true } } diff --git a/spec/requests/catch_all_route_request_spec.rb b/spec/requests/catch_all_route_request_spec.rb index 22ce1cf59f..f965f55221 100644 --- a/spec/requests/catch_all_route_request_spec.rb +++ b/spec/requests/catch_all_route_request_spec.rb @@ -6,7 +6,7 @@ describe "The catch all route" do get "/test" expect(response.status).to eq 404 - expect(response.content_type).to eq "text/html" + expect(response.media_type).to eq "text/html" end end @@ -15,7 +15,7 @@ describe "The catch all route" do get "/test.test" expect(response.status).to eq 404 - expect(response.content_type).to eq "text/html" + expect(response.media_type).to eq "text/html" end end end diff --git a/spec/requests/host_meta_request_spec.rb b/spec/requests/host_meta_request_spec.rb index beb33a859e..0ca6414613 100644 --- a/spec/requests/host_meta_request_spec.rb +++ b/spec/requests/host_meta_request_spec.rb @@ -6,7 +6,7 @@ describe "The host_meta route" do get host_meta_url expect(response).to have_http_status(200) - expect(response.content_type).to eq "application/xrd+xml" + expect(response.media_type).to eq "application/xrd+xml" end end end diff --git a/spec/requests/link_headers_spec.rb b/spec/requests/link_headers_spec.rb index 712ee262b8..c32e0f79a9 100644 --- a/spec/requests/link_headers_spec.rb +++ b/spec/requests/link_headers_spec.rb @@ -25,7 +25,7 @@ describe 'Link headers' do end def link_header_with_type(type) - response.headers['Link'].links.find do |link| + LinkHeader.parse(response.headers['Link'].to_s).links.find do |link| link.attr_pairs.any? { |pair| pair == ['type', type] } end end diff --git a/spec/requests/webfinger_request_spec.rb b/spec/requests/webfinger_request_spec.rb index 48823714e2..209fda72aa 100644 --- a/spec/requests/webfinger_request_spec.rb +++ b/spec/requests/webfinger_request_spec.rb @@ -8,7 +8,7 @@ describe 'The webfinger route' do get webfinger_url(resource: alice.to_webfinger_s) expect(response).to have_http_status(200) - expect(response.content_type).to eq 'application/jrd+json' + expect(response.media_type).to eq 'application/jrd+json' end end @@ -17,7 +17,7 @@ describe 'The webfinger route' do get webfinger_url(resource: alice.to_webfinger_s, format: :json) expect(response).to have_http_status(200) - expect(response.content_type).to eq 'application/jrd+json' + expect(response.media_type).to eq 'application/jrd+json' end it 'returns a json response for json accept header' do @@ -25,7 +25,7 @@ describe 'The webfinger route' do get webfinger_url(resource: alice.to_webfinger_s), headers: headers expect(response).to have_http_status(200) - expect(response.content_type).to eq 'application/jrd+json' + expect(response.media_type).to eq 'application/jrd+json' end end end diff --git a/spec/services/account_statuses_cleanup_service_spec.rb b/spec/services/account_statuses_cleanup_service_spec.rb new file mode 100644 index 0000000000..257655c41b --- /dev/null +++ b/spec/services/account_statuses_cleanup_service_spec.rb @@ -0,0 +1,101 @@ +require 'rails_helper' + +describe AccountStatusesCleanupService, type: :service do + let(:account) { Fabricate(:account, username: 'alice', domain: nil) } + let(:account_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) } + let!(:unrelated_status) { Fabricate(:status, created_at: 3.years.ago) } + + describe '#call' do + context 'when the account has not posted anything' do + it 'returns 0 deleted toots' do + expect(subject.call(account_policy)).to eq 0 + end + end + + context 'when the account has posted several old statuses' do + let!(:very_old_status) { Fabricate(:status, created_at: 3.years.ago, account: account) } + let!(:old_status) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:another_old_status) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:recent_status) { Fabricate(:status, created_at: 1.day.ago, account: account) } + + context 'given a budget of 1' do + it 'reports 1 deleted toot' do + expect(subject.call(account_policy, 1)).to eq 1 + end + end + + context 'given a normal budget of 10' do + it 'reports 3 deleted statuses' do + expect(subject.call(account_policy, 10)).to eq 3 + end + + it 'records the last deleted id' do + subject.call(account_policy, 10) + expect(account_policy.last_inspected).to eq [old_status.id, another_old_status.id].max + end + + it 'actually deletes the statuses' do + subject.call(account_policy, 10) + expect(Status.find_by(id: [very_old_status.id, old_status.id, another_old_status.id])).to be_nil + end + end + + context 'when called repeatedly with a budget of 2' do + it 'reports 2 then 1 deleted statuses' do + expect(subject.call(account_policy, 2)).to eq 2 + expect(subject.call(account_policy, 2)).to eq 1 + end + + it 'actually deletes the statuses in the expected order' do + subject.call(account_policy, 2) + expect(Status.find_by(id: very_old_status.id)).to be_nil + subject.call(account_policy, 2) + expect(Status.find_by(id: [very_old_status.id, old_status.id, another_old_status.id])).to be_nil + end + end + + context 'when a self-faved toot is unfaved' do + let!(:self_faved) { Fabricate(:status, created_at: 6.months.ago, account: account) } + let!(:favourite) { Fabricate(:favourite, account: account, status: self_faved) } + + it 'deletes it once unfaved' do + expect(subject.call(account_policy, 20)).to eq 3 + expect(Status.find_by(id: self_faved.id)).to_not be_nil + expect(subject.call(account_policy, 20)).to eq 0 + favourite.destroy! + expect(subject.call(account_policy, 20)).to eq 1 + expect(Status.find_by(id: self_faved.id)).to be_nil + end + end + + context 'when there are more un-deletable old toots than the early search cutoff' do + before do + stub_const 'AccountStatusesCleanupPolicy::EARLY_SEARCH_CUTOFF', 5 + # Old statuses that should be cut-off + 10.times do + Fabricate(:status, created_at: 4.years.ago, visibility: :direct, account: account) + end + # New statuses that prevent cut-off id to reach the last status + 10.times do + Fabricate(:status, created_at: 4.seconds.ago, visibility: :direct, account: account) + end + end + + it 'reports 0 deleted statuses then 0 then 3 then 0 again' do + expect(subject.call(account_policy, 10)).to eq 0 + expect(subject.call(account_policy, 10)).to eq 0 + expect(subject.call(account_policy, 10)).to eq 3 + expect(subject.call(account_policy, 10)).to eq 0 + end + + it 'never causes the recorded id to get higher than oldest deletable toot' do + subject.call(account_policy, 10) + subject.call(account_policy, 10) + subject.call(account_policy, 10) + subject.call(account_policy, 10) + expect(account_policy.last_inspected).to be < Mastodon::Snowflake.id_at(account_policy.min_status_age.seconds.ago, with_random: false) + end + end + end + end +end diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb index 1ecc469524..94574aa7f4 100644 --- a/spec/services/activitypub/fetch_remote_status_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb @@ -67,7 +67,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do expect(status).to_not be_nil expect(status.url).to eq "https://#{valid_domain}/watch?v=12345" - expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remix https://#{valid_domain}/watch?v=12345" + expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://#{valid_domain}/watch?v=12345" end end @@ -100,7 +100,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do expect(status).to_not be_nil expect(status.url).to eq "https://#{valid_domain}/watch?v=12345" - expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remix https://#{valid_domain}/watch?v=12345" + expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://#{valid_domain}/watch?v=12345" end end @@ -120,7 +120,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do expect(status).to_not be_nil expect(status.url).to eq "https://#{valid_domain}/@foo/1234" - expect(strip_tags(status.text)).to eq "Let's change the world https://#{valid_domain}/@foo/1234" + expect(strip_tags(status.text)).to eq "Let's change the worldhttps://#{valid_domain}/@foo/1234" end end @@ -145,5 +145,46 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do expect(sender.statuses.first).to be_nil end end + + context 'with a valid Create activity' do + let(:object) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: "https://#{valid_domain}/@foo/1234/create", + type: 'Create', + actor: ActivityPub::TagManager.instance.uri_for(sender), + object: note, + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.uri).to eq note[:id] + expect(status.text).to eq note[:content] + end + end + + context 'with a Create activity with a mismatching id' do + let(:object) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: "https://#{valid_domain}/@foo/1234/create", + type: 'Create', + actor: ActivityPub::TagManager.instance.uri_for(sender), + object: { + id: "https://real.address/@foo/1234", + type: 'Note', + content: 'Lorem ipsum', + attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + }, + } + end + + it 'does not create status' do + expect(sender.statuses.first).to be_nil + end + end end end diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index 56e7f83211..7728b9ba82 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -12,6 +12,7 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do attachment: [ { type: 'PropertyValue', name: 'Pronouns', value: 'They/them' }, { type: 'PropertyValue', name: 'Occupation', value: 'Unit test' }, + { type: 'PropertyValue', name: 'non-string', value: ['foo', 'bar'] }, ], }.with_indifferent_access end @@ -29,51 +30,6 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do end end - context 'identity proofs' do - let(:payload) do - { - id: 'https://foo.test', - type: 'Actor', - inbox: 'https://foo.test/inbox', - attachment: [ - { type: 'IdentityProof', name: 'Alice', signatureAlgorithm: 'keybase', signatureValue: 'a' * 66 }, - ], - }.with_indifferent_access - end - - it 'parses out of attachment' do - allow(ProofProvider::Keybase::Worker).to receive(:perform_async) - - account = subject.call('alice', 'example.com', payload) - - expect(account.identity_proofs.count).to eq 1 - - proof = account.identity_proofs.first - - expect(proof.provider).to eq 'keybase' - expect(proof.provider_username).to eq 'Alice' - expect(proof.token).to eq 'a' * 66 - end - - it 'removes no longer present proofs' do - allow(ProofProvider::Keybase::Worker).to receive(:perform_async) - - account = Fabricate(:account, username: 'alice', domain: 'example.com') - old_proof = Fabricate(:account_identity_proof, account: account, provider: 'keybase', provider_username: 'Bob', token: 'b' * 66) - - subject.call('alice', 'example.com', payload) - - expect(account.identity_proofs.count).to eq 1 - expect(account.identity_proofs.find_by(id: old_proof.id)).to be_nil - end - - it 'queues a validity check on the proof' do - allow(ProofProvider::Keybase::Worker).to receive(:perform_async) - account = subject.call('alice', 'example.com', payload) - expect(ProofProvider::Keybase::Worker).to have_received(:perform_async) - end - end - context 'when account is not suspended' do let!(:account) { Fabricate(:account, username: 'alice', domain: 'example.com') } diff --git a/spec/services/after_block_service_spec.rb b/spec/services/after_block_service_spec.rb index f63b2045ad..fe5b26b2be 100644 --- a/spec/services/after_block_service_spec.rb +++ b/spec/services/after_block_service_spec.rb @@ -5,12 +5,14 @@ RSpec.describe AfterBlockService, type: :service do -> { described_class.new.call(account, target_account) } end - let(:account) { Fabricate(:account) } - let(:target_account) { Fabricate(:account) } + let(:account) { Fabricate(:account) } + let(:target_account) { Fabricate(:account) } + let(:status) { Fabricate(:status, account: target_account) } + let(:other_status) { Fabricate(:status, account: target_account) } + let(:other_account_status) { Fabricate(:status) } + let(:other_account_reblog) { Fabricate(:status, reblog_of_id: other_status.id) } describe 'home timeline' do - let(:status) { Fabricate(:status, account: target_account) } - let(:other_account_status) { Fabricate(:status) } let(:home_timeline_key) { FeedManager.instance.key(:home, account.id) } before do @@ -20,10 +22,30 @@ RSpec.describe AfterBlockService, type: :service do it "clears account's statuses" do FeedManager.instance.push_to_home(account, status) FeedManager.instance.push_to_home(account, other_account_status) + FeedManager.instance.push_to_home(account, other_account_reblog) is_expected.to change { Redis.current.zrange(home_timeline_key, 0, -1) - }.from([status.id.to_s, other_account_status.id.to_s]).to([other_account_status.id.to_s]) + }.from([status.id.to_s, other_account_status.id.to_s, other_account_reblog.id.to_s]).to([other_account_status.id.to_s]) + end + end + + describe 'lists' do + let(:list) { Fabricate(:list, account: account) } + let(:list_timeline_key) { FeedManager.instance.key(:list, list.id) } + + before do + Redis.current.del(list_timeline_key) + end + + it "clears account's statuses" do + FeedManager.instance.push_to_list(list, status) + FeedManager.instance.push_to_list(list, other_account_status) + FeedManager.instance.push_to_list(list, other_account_reblog) + + is_expected.to change { + Redis.current.zrange(list_timeline_key, 0, -1) + }.from([status.id.to_s, other_account_status.id.to_s, other_account_reblog.id.to_s]).to([other_account_status.id.to_s]) end end end diff --git a/spec/services/authorize_follow_service_spec.rb b/spec/services/authorize_follow_service_spec.rb index ce56d57a62..888d694b61 100644 --- a/spec/services/authorize_follow_service_spec.rb +++ b/spec/services/authorize_follow_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe AuthorizeFollowService, type: :service do subject { AuthorizeFollowService.new } describe 'local' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do FollowRequest.create(account: bob, target_account: sender) @@ -22,26 +22,8 @@ RSpec.describe AuthorizeFollowService, type: :service do end end - describe 'remote OStatus' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } - - before do - FollowRequest.create(account: bob, target_account: sender) - stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) - subject.call(bob, sender) - end - - it 'removes follow request' do - expect(bob.requested?(sender)).to be false - end - - it 'creates follow relation' do - expect(bob.following?(sender)).to be true - end - end - describe 'remote ActivityPub' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox')).account } + let(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox') } before do FollowRequest.create(account: bob, target_account: sender) diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb index c1f54a6fd2..8f38908cd2 100644 --- a/spec/services/batched_remove_status_service_spec.rb +++ b/spec/services/batched_remove_status_service_spec.rb @@ -4,8 +4,8 @@ RSpec.describe BatchedRemoveStatusService, type: :service do subject { BatchedRemoveStatusService.new } let!(:alice) { Fabricate(:account) } - let!(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://example.com/salmon') } - let!(:jeff) { Fabricate(:user).account } + let!(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com') } + let!(:jeff) { Fabricate(:account) } let!(:hank) { Fabricate(:account, username: 'hank', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } let(:status1) { PostStatusService.new.call(alice, text: 'Hello @bob@example.com') } diff --git a/spec/services/block_service_spec.rb b/spec/services/block_service_spec.rb index de20dd0265..a53e1f9288 100644 --- a/spec/services/block_service_spec.rb +++ b/spec/services/block_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe BlockService, type: :service do subject { BlockService.new } describe 'local' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do subject.call(sender, bob) @@ -17,21 +17,8 @@ RSpec.describe BlockService, type: :service do end end - describe 'remote OStatus' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } - - before do - stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) - subject.call(sender, bob) - end - - it 'creates a blocking relation' do - expect(sender.blocking?(bob)).to be true - end - end - describe 'remote ActivityPub' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } + let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } before do stub_request(:post, 'http://example.com/inbox').to_return(status: 200) diff --git a/spec/services/bootstrap_timeline_service_spec.rb b/spec/services/bootstrap_timeline_service_spec.rb index a28d2407c1..16f3e9962e 100644 --- a/spec/services/bootstrap_timeline_service_spec.rb +++ b/spec/services/bootstrap_timeline_service_spec.rb @@ -1,42 +1,37 @@ require 'rails_helper' RSpec.describe BootstrapTimelineService, type: :service do - subject { described_class.new } + subject { BootstrapTimelineService.new } - describe '#call' do - let(:source_account) { Fabricate(:account) } + context 'when the new user has registered from an invite' do + let(:service) { double } + let(:autofollow) { false } + let(:inviter) { Fabricate(:user, confirmed_at: 2.days.ago) } + let(:invite) { Fabricate(:invite, user: inviter, max_uses: nil, expires_at: 1.hour.from_now, autofollow: autofollow) } + let(:new_user) { Fabricate(:user, invite_code: invite.code) } - context 'when setting is empty' do - let!(:admin) { Fabricate(:user, admin: true) } + before do + allow(FollowService).to receive(:new).and_return(service) + allow(service).to receive(:call) + end - before do - Setting.bootstrap_timeline_accounts = nil - subject.call(source_account) - end + context 'when the invite has auto-follow enabled' do + let(:autofollow) { true } - it 'follows admin accounts from account' do - expect(source_account.following?(admin.account)).to be true + it 'calls FollowService to follow the inviter' do + subject.call(new_user.account) + expect(service).to have_received(:call).with(new_user.account, inviter.account) end end - context 'when setting is set' do - let!(:alice) { Fabricate(:account, username: 'alice') } - let!(:bob) { Fabricate(:account, username: 'bob') } - let!(:eve) { Fabricate(:account, username: 'eve', suspended: true) } + context 'when the invite does not have auto-follow enable' do + let(:autofollow) { false } - before do - Setting.bootstrap_timeline_accounts = 'alice, @bob, eve, unknown' - subject.call(source_account) - end - - it 'follows found accounts from account' do - expect(source_account.following?(alice)).to be true - expect(source_account.following?(bob)).to be true - end - - it 'does not follow suspended account' do - expect(source_account.following?(eve)).to be false + it 'calls FollowService to follow the inviter' do + subject.call(new_user.account) + expect(service).to_not have_received(:call) end end + end end diff --git a/spec/services/delete_account_service_spec.rb b/spec/services/delete_account_service_spec.rb index cd7d32d592..b1da970366 100644 --- a/spec/services/delete_account_service_spec.rb +++ b/spec/services/delete_account_service_spec.rb @@ -21,6 +21,8 @@ RSpec.describe DeleteAccountService, type: :service do let!(:favourite_notification) { Fabricate(:notification, account: local_follower, activity: favourite, type: :favourite) } let!(:follow_notification) { Fabricate(:notification, account: local_follower, activity: active_relationship, type: :follow) } + let!(:account_note) { Fabricate(:account_note, account: account) } + subject do -> { described_class.new.call(account) } end @@ -35,8 +37,9 @@ RSpec.describe DeleteAccountService, type: :service do account.active_relationships, account.passive_relationships, account.polls, + account.account_notes, ].map(&:count) - }.from([2, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0]) + }.from([2, 1, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0, 0]) end it 'deletes associated target records' do diff --git a/spec/services/fan_out_on_write_service_spec.rb b/spec/services/fan_out_on_write_service_spec.rb index 538dc25922..aaf179ce53 100644 --- a/spec/services/fan_out_on_write_service_spec.rb +++ b/spec/services/fan_out_on_write_service_spec.rb @@ -1,37 +1,112 @@ require 'rails_helper' RSpec.describe FanOutOnWriteService, type: :service do - let(:author) { Fabricate(:account, username: 'tom') } - let(:status) { Fabricate(:status, text: 'Hello @alice #test', account: author) } - let(:alice) { Fabricate(:user, account: Fabricate(:account, username: 'alice')).account } - let(:follower) { Fabricate(:account, username: 'bob') } + let(:last_active_at) { Time.now.utc } - subject { FanOutOnWriteService.new } + let!(:alice) { Fabricate(:user, current_sign_in_at: last_active_at).account } + let!(:bob) { Fabricate(:user, current_sign_in_at: last_active_at, account_attributes: { username: 'bob' }).account } + let!(:tom) { Fabricate(:user, current_sign_in_at: last_active_at).account } + + subject { described_class.new } + + let(:status) { Fabricate(:status, account: alice, visibility: visibility, text: 'Hello @bob #hoge') } before do - alice - follower.follow!(author) + bob.follow!(alice) + tom.follow!(alice) ProcessMentionsService.new.call(status) ProcessHashtagsService.new.call(status) + allow(Redis.current).to receive(:publish) + subject.call(status) end - it 'delivers status to home timeline' do - expect(HomeFeed.new(author).get(10).map(&:id)).to include status.id + def home_feed_of(account) + HomeFeed.new(account).get(10).map(&:id) end - it 'delivers status to local followers' do - pending 'some sort of problem in test environment causes this to sometimes fail' - expect(HomeFeed.new(follower).get(10).map(&:id)).to include status.id + context 'when status is public' do + let(:visibility) { 'public' } + + it 'is added to the home feed of its author' do + expect(home_feed_of(alice)).to include status.id + end + + it 'is added to the home feed of a follower' do + expect(home_feed_of(bob)).to include status.id + expect(home_feed_of(tom)).to include status.id + end + + it 'is broadcast to the hashtag stream' do + expect(Redis.current).to have_received(:publish).with('timeline:hashtag:hoge', anything) + expect(Redis.current).to have_received(:publish).with('timeline:hashtag:hoge:local', anything) + end + + it 'is broadcast to the public stream' do + expect(Redis.current).to have_received(:publish).with('timeline:public', anything) + expect(Redis.current).to have_received(:publish).with('timeline:public:local', anything) + end end - it 'delivers status to hashtag' do - expect(TagFeed.new(Tag.find_by(name: 'test'), alice).get(20).map(&:id)).to include status.id + context 'when status is limited' do + let(:visibility) { 'limited' } + + it 'is added to the home feed of its author' do + expect(home_feed_of(alice)).to include status.id + end + + it 'is added to the home feed of the mentioned follower' do + expect(home_feed_of(bob)).to include status.id + end + + it 'is not added to the home feed of the other follower' do + expect(home_feed_of(tom)).to_not include status.id + end + + it 'is not broadcast publicly' do + expect(Redis.current).to_not have_received(:publish).with('timeline:hashtag:hoge', anything) + expect(Redis.current).to_not have_received(:publish).with('timeline:public', anything) + end end - it 'delivers status to public timeline' do - expect(PublicFeed.new(alice).get(20).map(&:id)).to include status.id + context 'when status is private' do + let(:visibility) { 'private' } + + it 'is added to the home feed of its author' do + expect(home_feed_of(alice)).to include status.id + end + + it 'is added to the home feed of a follower' do + expect(home_feed_of(bob)).to include status.id + expect(home_feed_of(tom)).to include status.id + end + + it 'is not broadcast publicly' do + expect(Redis.current).to_not have_received(:publish).with('timeline:hashtag:hoge', anything) + expect(Redis.current).to_not have_received(:publish).with('timeline:public', anything) + end + end + + context 'when status is direct' do + let(:visibility) { 'direct' } + + it 'is added to the home feed of its author' do + expect(home_feed_of(alice)).to include status.id + end + + it 'is added to the home feed of the mentioned follower' do + expect(home_feed_of(bob)).to include status.id + end + + it 'is not added to the home feed of the other follower' do + expect(home_feed_of(tom)).to_not include status.id + end + + it 'is not broadcast publicly' do + expect(Redis.current).to_not have_received(:publish).with('timeline:hashtag:hoge', anything) + expect(Redis.current).to_not have_received(:publish).with('timeline:public', anything) + end end end diff --git a/spec/services/favourite_service_spec.rb b/spec/services/favourite_service_spec.rb index 4c29ea77b7..94a8111dd5 100644 --- a/spec/services/favourite_service_spec.rb +++ b/spec/services/favourite_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe FavouriteService, type: :service do subject { FavouriteService.new } describe 'local' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account) } let(:status) { Fabricate(:status, account: bob) } before do @@ -18,22 +18,8 @@ RSpec.describe FavouriteService, type: :service do end end - describe 'remote OStatus' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } - let(:status) { Fabricate(:status, account: bob, uri: 'tag:example.com:blahblah') } - - before do - stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) - subject.call(sender, status) - end - - it 'creates a favourite' do - expect(status.favourites.first).to_not be_nil - end - end - describe 'remote ActivityPub' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, protocol: :activitypub, username: 'bob', domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } + let(:bob) { Fabricate(:account, protocol: :activitypub, username: 'bob', domain: 'example.com', inbox_url: 'http://example.com/inbox') } let(:status) { Fabricate(:status, account: bob) } before do diff --git a/spec/services/fetch_link_card_service_spec.rb b/spec/services/fetch_link_card_service_spec.rb index 8b296cc704..4914c27532 100644 --- a/spec/services/fetch_link_card_service_spec.rb +++ b/spec/services/fetch_link_card_service_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe FetchLinkCardService, type: :service do - subject { FetchLinkCardService.new } + subject { described_class.new } before do stub_request(:get, 'http://example.xn--fiqs8s/').to_return(request_fixture('idn.txt')) @@ -77,6 +77,14 @@ RSpec.describe FetchLinkCardService, type: :service do expect(a_request(:get, 'http://example.com/test-')).to have_been_made.at_least_once end end + + context do + let(:status) { Fabricate(:status, text: 'testhttp://example.com/sjis') } + + it 'does not fetch URLs with not isolated from their surroundings' do + expect(a_request(:get, 'http://example.com/sjis')).to_not have_been_made + end + end end context 'in a remote status' do diff --git a/spec/services/fetch_oembed_service_spec.rb b/spec/services/fetch_oembed_service_spec.rb index a4262b0408..88f0113edd 100644 --- a/spec/services/fetch_oembed_service_spec.rb +++ b/spec/services/fetch_oembed_service_spec.rb @@ -13,6 +13,32 @@ describe FetchOEmbedService, type: :service do describe 'discover_provider' do context 'when status code is 200 and MIME type is text/html' do + context 'when OEmbed endpoint contains URL as parameter' do + before do + stub_request(:get, 'https://www.youtube.com/watch?v=IPSbNdBmWKE').to_return( + status: 200, + headers: { 'Content-Type': 'text/html' }, + body: request_fixture('oembed_youtube.html'), + ) + stub_request(:get, 'https://www.youtube.com/oembed?format=json&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DIPSbNdBmWKE').to_return( + status: 200, + headers: { 'Content-Type': 'text/html' }, + body: request_fixture('oembed_json_empty.html') + ) + end + + it 'returns new OEmbed::Provider for JSON provider' do + subject.call('https://www.youtube.com/watch?v=IPSbNdBmWKE') + expect(subject.endpoint_url).to eq 'https://www.youtube.com/oembed?format=json&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DIPSbNdBmWKE' + expect(subject.format).to eq :json + end + + it 'stores URL template' do + subject.call('https://www.youtube.com/watch?v=IPSbNdBmWKE') + expect(Rails.cache.read('oembed_endpoint:www.youtube.com')[:endpoint]).to eq 'https://www.youtube.com/oembed?format=json&url={url}' + end + end + context 'Both of JSON and XML provider are discoverable' do before do stub_request(:get, 'https://host.test/oembed.html').to_return( @@ -33,6 +59,11 @@ describe FetchOEmbedService, type: :service do expect(subject.endpoint_url).to eq 'https://host.test/provider.xml' expect(subject.format).to eq :xml end + + it 'does not cache OEmbed endpoint' do + subject.call('https://host.test/oembed.html', format: :xml) + expect(Rails.cache.exist?('oembed_endpoint:host.test')).to eq false + end end context 'JSON provider is discoverable while XML provider is not' do @@ -49,6 +80,11 @@ describe FetchOEmbedService, type: :service do expect(subject.endpoint_url).to eq 'https://host.test/provider.json' expect(subject.format).to eq :json end + + it 'does not cache OEmbed endpoint' do + subject.call('https://host.test/oembed.html') + expect(Rails.cache.exist?('oembed_endpoint:host.test')).to eq false + end end context 'XML provider is discoverable while JSON provider is not' do @@ -65,6 +101,11 @@ describe FetchOEmbedService, type: :service do expect(subject.endpoint_url).to eq 'https://host.test/provider.xml' expect(subject.format).to eq :xml end + + it 'does not cache OEmbed endpoint' do + subject.call('https://host.test/oembed.html') + expect(Rails.cache.exist?('oembed_endpoint:host.test')).to eq false + end end context 'Invalid XML provider is discoverable while JSON provider is not' do diff --git a/spec/services/fetch_remote_status_service_spec.rb b/spec/services/fetch_remote_status_service_spec.rb index 1c4b4fee26..0e63cc9eba 100644 --- a/spec/services/fetch_remote_status_service_spec.rb +++ b/spec/services/fetch_remote_status_service_spec.rb @@ -31,56 +31,4 @@ RSpec.describe FetchRemoteStatusService, type: :service do expect(status.text).to eq 'Lorem ipsum' end end - - context 'protocol is :ostatus' do - subject { described_class.new } - - before do - Fabricate(:account, username: 'tracer', domain: 'real.domain', remote_url: 'https://real.domain/users/tracer') - end - - it 'does not create status with author at different domain' do - status_body = <<-XML.squish - - - tag:real.domain,2017-04-27:objectId=4487555:objectType=Status - 2017-04-27T13:49:25Z - 2017-04-27T13:49:25Z - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - https://real.domain/users/tracer - http://activitystrea.ms/schema/1.0/person - https://real.domain/users/tracer - tracer - - Overwatch rocks - - XML - - expect(subject.call('https://fake.domain/foo', status_body)).to be_nil - end - - it 'does not create status with wrong id when id uses http format' do - status_body = <<-XML.squish - - - https://other-real.domain/statuses/123 - 2017-04-27T13:49:25Z - 2017-04-27T13:49:25Z - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - https://real.domain/users/tracer - http://activitystrea.ms/schema/1.0/person - https://real.domain/users/tracer - tracer - - Overwatch rocks - - XML - - expect(subject.call('https://real.domain/statuses/456', status_body)).to be_nil - end - end end diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb index ae863a9f0e..02bc87c58d 100644 --- a/spec/services/follow_service_spec.rb +++ b/spec/services/follow_service_spec.rb @@ -7,10 +7,10 @@ RSpec.describe FollowService, type: :service do context 'local account' do describe 'locked account' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, locked: true, username: 'bob')).account } + let(:bob) { Fabricate(:account, locked: true, username: 'bob') } before do - subject.call(sender, bob.acct) + subject.call(sender, bob) end it 'creates a follow request with reblogs' do @@ -19,10 +19,10 @@ RSpec.describe FollowService, type: :service do end describe 'locked account, no reblogs' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, locked: true, username: 'bob')).account } + let(:bob) { Fabricate(:account, locked: true, username: 'bob') } before do - subject.call(sender, bob.acct, reblogs: false) + subject.call(sender, bob, reblogs: false) end it 'creates a follow request without reblogs' do @@ -31,11 +31,11 @@ RSpec.describe FollowService, type: :service do end describe 'unlocked account, from silenced account' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do sender.touch(:silenced_at) - subject.call(sender, bob.acct) + subject.call(sender, bob) end it 'creates a follow request with reblogs' do @@ -44,11 +44,11 @@ RSpec.describe FollowService, type: :service do end describe 'unlocked account, from a muted account' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do bob.mute!(sender) - subject.call(sender, bob.acct) + subject.call(sender, bob) end it 'creates a following relation with reblogs' do @@ -58,10 +58,10 @@ RSpec.describe FollowService, type: :service do end describe 'unlocked account' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do - subject.call(sender, bob.acct) + subject.call(sender, bob) end it 'creates a following relation with reblogs' do @@ -71,10 +71,10 @@ RSpec.describe FollowService, type: :service do end describe 'unlocked account, no reblogs' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do - subject.call(sender, bob.acct, reblogs: false) + subject.call(sender, bob, reblogs: false) end it 'creates a following relation without reblogs' do @@ -84,11 +84,11 @@ RSpec.describe FollowService, type: :service do end describe 'already followed account' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do sender.follow!(bob) - subject.call(sender, bob.acct) + subject.call(sender, bob) end it 'keeps a following relation' do @@ -97,11 +97,11 @@ RSpec.describe FollowService, type: :service do end describe 'already followed account, turning reblogs off' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do sender.follow!(bob, reblogs: true) - subject.call(sender, bob.acct, reblogs: false) + subject.call(sender, bob, reblogs: false) end it 'disables reblogs' do @@ -110,11 +110,11 @@ RSpec.describe FollowService, type: :service do end describe 'already followed account, turning reblogs on' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do sender.follow!(bob, reblogs: false) - subject.call(sender, bob.acct, reblogs: true) + subject.call(sender, bob, reblogs: true) end it 'disables reblogs' do @@ -124,11 +124,11 @@ RSpec.describe FollowService, type: :service do end context 'remote ActivityPub account' do - let(:bob) { Fabricate(:user, account: Fabricate(:account, username: 'bob', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox')).account } + let(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox') } before do stub_request(:post, "http://example.com/inbox").to_return(:status => 200, :body => "", :headers => {}) - subject.call(sender, bob.acct) + subject.call(sender, bob) end it 'creates follow request' do diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb index 118436f8ba..83e62ff361 100644 --- a/spec/services/notify_service_spec.rb +++ b/spec/services/notify_service_spec.rb @@ -64,8 +64,9 @@ RSpec.describe NotifyService, type: :service do is_expected.to_not change(Notification, :count) end - context 'if the message chain initiated by recipient, but is not direct message' do + context 'if the message chain is initiated by recipient, but is not direct message' do let(:reply_to) { Fabricate(:status, account: recipient) } + let!(:mention) { Fabricate(:mention, account: sender, status: reply_to) } let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) } it 'does not notify' do @@ -73,8 +74,20 @@ RSpec.describe NotifyService, type: :service do end end - context 'if the message chain initiated by recipient and is direct message' do + context 'if the message chain is initiated by recipient, but without a mention to the sender, even if the sender sends multiple messages in a row' do + let(:reply_to) { Fabricate(:status, account: recipient) } + let!(:mention) { Fabricate(:mention, account: sender, status: reply_to) } + let(:dummy_reply) { Fabricate(:status, account: sender, visibility: :direct, thread: reply_to) } + let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: dummy_reply)) } + + it 'does not notify' do + is_expected.to_not change(Notification, :count) + end + end + + context 'if the message chain is initiated by the recipient with a mention to the sender' do let(:reply_to) { Fabricate(:status, account: recipient, visibility: :direct) } + let!(:mention) { Fabricate(:mention, account: sender, status: reply_to) } let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) } it 'does notify' do diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 147a59fc31..d21270c793 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -25,29 +25,33 @@ RSpec.describe PostStatusService, type: :service do expect(status.thread).to eq in_reply_to_status end - it 'schedules a status' do - account = Fabricate(:account) - future = Time.now.utc + 2.hours + context 'when scheduling a status' do + let!(:account) { Fabricate(:account) } + let!(:future) { Time.now.utc + 2.hours } + let!(:previous_status) { Fabricate(:status, account: account) } - status = subject.call(account, text: 'Hi future!', scheduled_at: future) + it 'schedules a status' do + status = subject.call(account, text: 'Hi future!', scheduled_at: future) + expect(status).to be_a ScheduledStatus + expect(status.scheduled_at).to eq future + expect(status.params['text']).to eq 'Hi future!' + end - expect(status).to be_a ScheduledStatus - expect(status.scheduled_at).to eq future - expect(status.params['text']).to eq 'Hi future!' - end + it 'does not immediately create a status' do + media = Fabricate(:media_attachment, account: account) + status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future) - it 'does not immediately create a status when scheduling a status' do - account = Fabricate(:account) - media = Fabricate(:media_attachment) - future = Time.now.utc + 2.hours + expect(status).to be_a ScheduledStatus + expect(status.scheduled_at).to eq future + expect(status.params['text']).to eq 'Hi future!' + expect(status.params['media_ids']).to eq [media.id] + expect(media.reload.status).to be_nil + expect(Status.where(text: 'Hi future!').exists?).to be_falsey + end - status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future) - - expect(status).to be_a ScheduledStatus - expect(status.scheduled_at).to eq future - expect(status.params['text']).to eq 'Hi future!' - expect(media.reload.status).to be_nil - expect(Status.where(text: 'Hi future!').exists?).to be_falsey + it 'does not change statuses count' do + expect { subject.call(account, text: 'Hi future!', scheduled_at: future, thread: previous_status) }.not_to change { [account.statuses_count, previous_status.replies_count] } + end end it 'creates response to the original status of boost' do diff --git a/spec/services/process_mentions_service_spec.rb b/spec/services/process_mentions_service_spec.rb index c30de8eeb9..89b265e9a0 100644 --- a/spec/services/process_mentions_service_spec.rb +++ b/spec/services/process_mentions_service_spec.rb @@ -7,90 +7,57 @@ RSpec.describe ProcessMentionsService, type: :service do subject { ProcessMentionsService.new } - context 'OStatus with public toot' do - let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com') } - - before do - stub_request(:post, remote_user.salmon_url) - subject.call(status) - end - - it 'does not create a mention' do - expect(remote_user.mentions.where(status: status).count).to eq 0 - end - end - - context 'OStatus with private toot' do - let(:visibility) { :private } - let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com') } - - before do - stub_request(:post, remote_user.salmon_url) - subject.call(status) - end - - it 'does not create a mention' do - expect(remote_user.mentions.where(status: status).count).to eq 0 - end - - it 'does not post to remote user\'s Salmon end point' do - expect(a_request(:post, remote_user.salmon_url)).to_not have_been_made - end - end - context 'ActivityPub' do context do - let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } + let!(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } before do - stub_request(:post, remote_user.inbox_url) subject.call(status) end it 'creates a mention' do expect(remote_user.mentions.where(status: status).count).to eq 1 end - - it 'sends activity to the inbox' do - expect(a_request(:post, remote_user.inbox_url)).to have_been_made.once - end end context 'with an IDN domain' do - let(:remote_user) { Fabricate(:account, username: 'sneak', protocol: :activitypub, domain: 'xn--hresiar-mxa.ch', inbox_url: 'http://example.com/inbox') } - let(:status) { Fabricate(:status, account: account, text: "Hello @sneak@hæresiar.ch") } + let!(:remote_user) { Fabricate(:account, username: 'sneak', protocol: :activitypub, domain: 'xn--hresiar-mxa.ch', inbox_url: 'http://example.com/inbox') } + let!(:status) { Fabricate(:status, account: account, text: "Hello @sneak@hæresiar.ch") } before do - stub_request(:post, remote_user.inbox_url) subject.call(status) end it 'creates a mention' do expect(remote_user.mentions.where(status: status).count).to eq 1 end + end - it 'sends activity to the inbox' do - expect(a_request(:post, remote_user.inbox_url)).to have_been_made.once + context 'with an IDN TLD' do + let!(:remote_user) { Fabricate(:account, username: 'foo', protocol: :activitypub, domain: 'xn--y9a3aq.xn--y9a3aq', inbox_url: 'http://example.com/inbox') } + let!(:status) { Fabricate(:status, account: account, text: "Hello @foo@հայ.հայ") } + + before do + subject.call(status) + end + + it 'creates a mention' do + expect(remote_user.mentions.where(status: status).count).to eq 1 end end end context 'Temporarily-unreachable ActivityPub user' do - let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox', last_webfingered_at: nil) } + let!(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox', last_webfingered_at: nil) } before do stub_request(:get, "https://example.com/.well-known/host-meta").to_return(status: 404) stub_request(:get, "https://example.com/.well-known/webfinger?resource=acct:remote_user@example.com").to_return(status: 500) - stub_request(:post, remote_user.inbox_url) subject.call(status) end it 'creates a mention' do expect(remote_user.mentions.where(status: status).count).to eq 1 end - - it 'sends activity to the inbox' do - expect(a_request(:post, remote_user.inbox_url)).to have_been_made.once - end end end diff --git a/spec/services/purge_domain_service_spec.rb b/spec/services/purge_domain_service_spec.rb new file mode 100644 index 0000000000..59285f1269 --- /dev/null +++ b/spec/services/purge_domain_service_spec.rb @@ -0,0 +1,27 @@ +require 'rails_helper' + +RSpec.describe PurgeDomainService, type: :service do + let!(:old_account) { Fabricate(:account, domain: 'obsolete.org') } + let!(:old_status1) { Fabricate(:status, account: old_account) } + let!(:old_status2) { Fabricate(:status, account: old_account) } + let!(:old_attachment) { Fabricate(:media_attachment, account: old_account, status: old_status2, file: attachment_fixture('attachment.jpg')) } + + subject { PurgeDomainService.new } + + describe 'for a suspension' do + before do + subject.call('obsolete.org') + end + + it 'removes the remote accounts\'s statuses and media attachments' do + expect { old_account.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { old_status1.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { old_status2.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { old_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound + end + + it 'refreshes instances view' do + expect(Instance.where(domain: 'obsolete.org').exists?).to be false + end + end +end diff --git a/spec/services/reblog_service_spec.rb b/spec/services/reblog_service_spec.rb index 58fb46f0ff..e2077f282a 100644 --- a/spec/services/reblog_service_spec.rb +++ b/spec/services/reblog_service_spec.rb @@ -32,22 +32,6 @@ RSpec.describe ReblogService, type: :service do end end - context 'OStatus' do - let(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com') } - let(:status) { Fabricate(:status, account: bob, uri: 'tag:example.com;something:something') } - - subject { ReblogService.new } - - before do - stub_request(:post, 'http://salmon.example.com') - subject.call(alice, status) - end - - it 'creates a reblog' do - expect(status.reblogs.count).to eq 1 - end - end - context 'ActivityPub' do let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } let(:status) { Fabricate(:status, account: bob) } diff --git a/spec/services/reject_follow_service_spec.rb b/spec/services/reject_follow_service_spec.rb index 1aec060db7..e14bfa78dc 100644 --- a/spec/services/reject_follow_service_spec.rb +++ b/spec/services/reject_follow_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe RejectFollowService, type: :service do subject { RejectFollowService.new } describe 'local' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account) } before do FollowRequest.create(account: bob, target_account: sender) @@ -22,26 +22,8 @@ RSpec.describe RejectFollowService, type: :service do end end - describe 'remote OStatus' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } - - before do - FollowRequest.create(account: bob, target_account: sender) - stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) - subject.call(bob, sender) - end - - it 'removes follow request' do - expect(bob.requested?(sender)).to be false - end - - it 'does not create follow relation' do - expect(bob.following?(sender)).to be false - end - end - describe 'remote ActivityPub' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox')).account } + let(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox') } before do FollowRequest.create(account: bob, target_account: sender) diff --git a/spec/services/remove_from_follwers_service_spec.rb b/spec/services/remove_from_follwers_service_spec.rb new file mode 100644 index 0000000000..a83f6f49ab --- /dev/null +++ b/spec/services/remove_from_follwers_service_spec.rb @@ -0,0 +1,38 @@ +require 'rails_helper' + +RSpec.describe RemoveFromFollowersService, type: :service do + let(:bob) { Fabricate(:account, username: 'bob') } + + subject { RemoveFromFollowersService.new } + + describe 'local' do + let(:sender) { Fabricate(:account, username: 'alice') } + + before do + Follow.create(account: sender, target_account: bob) + subject.call(bob, sender) + end + + it 'does not create follow relation' do + expect(bob.followed_by?(sender)).to be false + end + end + + describe 'remote ActivityPub' do + let(:sender) { Fabricate(:account, username: 'alice', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox') } + + before do + Follow.create(account: sender, target_account: bob) + stub_request(:post, sender.inbox_url).to_return(status: 200) + subject.call(bob, sender) + end + + it 'does not create follow relation' do + expect(bob.followed_by?(sender)).to be false + end + + it 'sends a reject activity' do + expect(a_request(:post, sender.inbox_url)).to have_been_made.once + end + end +end diff --git a/spec/services/remove_status_service_spec.rb b/spec/services/remove_status_service_spec.rb index 7ce75b2c72..fb7c6b4625 100644 --- a/spec/services/remove_status_service_spec.rb +++ b/spec/services/remove_status_service_spec.rb @@ -3,8 +3,8 @@ require 'rails_helper' RSpec.describe RemoveStatusService, type: :service do subject { RemoveStatusService.new } - let!(:alice) { Fabricate(:account, user: Fabricate(:user)) } - let!(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://example.com/salmon') } + let!(:alice) { Fabricate(:account) } + let!(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com') } let!(:jeff) { Fabricate(:account) } let!(:hank) { Fabricate(:account, username: 'hank', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } let!(:bill) { Fabricate(:account, username: 'bill', protocol: :activitypub, domain: 'example2.com', inbox_url: 'http://example2.com/inbox') } diff --git a/spec/services/report_service_spec.rb b/spec/services/report_service_spec.rb index 454e4d896f..7e6a113e02 100644 --- a/spec/services/report_service_spec.rb +++ b/spec/services/report_service_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe ReportService, type: :service do subject { described_class.new } - let(:source_account) { Fabricate(:user).account } + let(:source_account) { Fabricate(:account) } context 'for a remote account' do let(:remote_account) { Fabricate(:account, domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox') } diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb index a604e90b54..7b1e8885cc 100644 --- a/spec/services/resolve_account_service_spec.rb +++ b/spec/services/resolve_account_service_spec.rb @@ -13,6 +13,47 @@ RSpec.describe ResolveAccountService, type: :service do stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:hoge@example.com').to_return(status: 410) end + context 'using skip_webfinger' do + context 'when account is known' do + let!(:remote_account) { Fabricate(:account, username: 'foo', domain: 'ap.example.com', protocol: 'activitypub') } + + context 'when domain is banned' do + let!(:domain_block) { Fabricate(:domain_block, domain: 'ap.example.com', severity: :suspend) } + + it 'does not return an account' do + expect(subject.call('foo@ap.example.com', skip_webfinger: true)).to be_nil + end + + it 'does not make a webfinger query' do + subject.call('foo@ap.example.com', skip_webfinger: true) + expect(a_request(:get, 'https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com')).to_not have_been_made + end + end + + context 'when domain is not banned' do + it 'returns the expected account' do + expect(subject.call('foo@ap.example.com', skip_webfinger: true)).to eq remote_account + end + + it 'does not make a webfinger query' do + subject.call('foo@ap.example.com', skip_webfinger: true) + expect(a_request(:get, 'https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com')).to_not have_been_made + end + end + end + + context 'when account is not known' do + it 'does not return an account' do + expect(subject.call('foo@ap.example.com', skip_webfinger: true)).to be_nil + end + + it 'does not make a webfinger query' do + subject.call('foo@ap.example.com', skip_webfinger: true) + expect(a_request(:get, 'https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com')).to_not have_been_made + end + end + end + context 'when there is an LRDD endpoint but no resolvable account' do before do stub_request(:get, "https://quitter.no/.well-known/host-meta").to_return(request_fixture('.host-meta.txt')) diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb new file mode 100644 index 0000000000..cf7eb257a0 --- /dev/null +++ b/spec/services/suspend_account_service_spec.rb @@ -0,0 +1,85 @@ +require 'rails_helper' + +RSpec.describe SuspendAccountService, type: :service do + shared_examples 'common behavior' do + let!(:local_follower) { Fabricate(:user, current_sign_in_at: 1.hour.ago).account } + let!(:list) { Fabricate(:list, account: local_follower) } + + subject do + -> { described_class.new.call(account) } + end + + before do + allow(FeedManager.instance).to receive(:unmerge_from_home).and_return(nil) + allow(FeedManager.instance).to receive(:unmerge_from_list).and_return(nil) + + local_follower.follow!(account) + list.accounts << account + end + + it "unmerges from local followers' feeds" do + subject.call + expect(FeedManager.instance).to have_received(:unmerge_from_home).with(account, local_follower) + expect(FeedManager.instance).to have_received(:unmerge_from_list).with(account, list) + end + + it 'marks account as suspended' do + is_expected.to change { account.suspended? }.from(false).to(true) + end + end + + describe 'suspending a local account' do + def match_update_actor_request(req, account) + json = JSON.parse(req.body) + actor_id = ActivityPub::TagManager.instance.uri_for(account) + json['type'] == 'Update' && json['actor'] == actor_id && json['object']['id'] == actor_id && json['object']['suspended'] + end + + before do + stub_request(:post, 'https://alice.com/inbox').to_return(status: 201) + stub_request(:post, 'https://bob.com/inbox').to_return(status: 201) + end + + include_examples 'common behavior' do + let!(:account) { Fabricate(:account) } + let!(:remote_follower) { Fabricate(:account, uri: 'https://alice.com', inbox_url: 'https://alice.com/inbox', protocol: :activitypub) } + let!(:remote_reporter) { Fabricate(:account, uri: 'https://bob.com', inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } + let!(:report) { Fabricate(:report, account: remote_reporter, target_account: account) } + + before do + remote_follower.follow!(account) + end + + it 'sends an update actor to followers and reporters' do + subject.call + expect(a_request(:post, remote_follower.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once + expect(a_request(:post, remote_reporter.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once + end + end + end + + describe 'suspending a remote account' do + def match_reject_follow_request(req, account, followee) + json = JSON.parse(req.body) + json['type'] == 'Reject' && json['actor'] == ActivityPub::TagManager.instance.uri_for(followee) && json['object']['actor'] == account.uri + end + + before do + stub_request(:post, 'https://bob.com/inbox').to_return(status: 201) + end + + include_examples 'common behavior' do + let!(:account) { Fabricate(:account, domain: 'bob.com', uri: 'https://bob.com', inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } + let!(:local_followee) { Fabricate(:account) } + + before do + account.follow!(local_followee) + end + + it 'sends a reject follow' do + subject.call + expect(a_request(:post, account.inbox_url).with { |req| match_reject_follow_request(req, account, local_followee) }).to have_been_made.once + end + end + end +end diff --git a/spec/services/unblock_service_spec.rb b/spec/services/unblock_service_spec.rb index 6350c68344..10448b3403 100644 --- a/spec/services/unblock_service_spec.rb +++ b/spec/services/unblock_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe UnblockService, type: :service do subject { UnblockService.new } describe 'local' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account) } before do sender.block!(bob) @@ -18,22 +18,8 @@ RSpec.describe UnblockService, type: :service do end end - describe 'remote OStatus' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } - - before do - sender.block!(bob) - stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) - subject.call(sender, bob) - end - - it 'destroys the blocking relation' do - expect(sender.blocking?(bob)).to be false - end - end - describe 'remote ActivityPub' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } + let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } before do sender.block!(bob) diff --git a/spec/services/unfollow_service_spec.rb b/spec/services/unfollow_service_spec.rb index 84b5dafbc4..bb5bef5c91 100644 --- a/spec/services/unfollow_service_spec.rb +++ b/spec/services/unfollow_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe UnfollowService, type: :service do subject { UnfollowService.new } describe 'local' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:bob) { Fabricate(:account, username: 'bob') } before do sender.follow!(bob) @@ -18,22 +18,8 @@ RSpec.describe UnfollowService, type: :service do end end - describe 'remote OStatus' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } - - before do - sender.follow!(bob) - stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) - subject.call(sender, bob) - end - - it 'destroys the following relation' do - expect(sender.following?(bob)).to be false - end - end - describe 'remote ActivityPub' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } + let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } before do sender.follow!(bob) @@ -51,7 +37,7 @@ RSpec.describe UnfollowService, type: :service do end describe 'remote ActivityPub (reverse)' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } + let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } before do bob.follow!(sender) diff --git a/spec/services/unsuspend_account_service_spec.rb b/spec/services/unsuspend_account_service_spec.rb new file mode 100644 index 0000000000..d52cb6cc00 --- /dev/null +++ b/spec/services/unsuspend_account_service_spec.rb @@ -0,0 +1,135 @@ +require 'rails_helper' + +RSpec.describe UnsuspendAccountService, type: :service do + shared_examples 'common behavior' do + let!(:local_follower) { Fabricate(:user, current_sign_in_at: 1.hour.ago).account } + let!(:list) { Fabricate(:list, account: local_follower) } + + subject do + -> { described_class.new.call(account) } + end + + before do + allow(FeedManager.instance).to receive(:merge_into_home).and_return(nil) + allow(FeedManager.instance).to receive(:merge_into_list).and_return(nil) + + local_follower.follow!(account) + list.accounts << account + + account.suspend!(origin: :local) + end + end + + describe 'unsuspending a local account' do + def match_update_actor_request(req, account) + json = JSON.parse(req.body) + actor_id = ActivityPub::TagManager.instance.uri_for(account) + json['type'] == 'Update' && json['actor'] == actor_id && json['object']['id'] == actor_id && !json['object']['suspended'] + end + + before do + stub_request(:post, 'https://alice.com/inbox').to_return(status: 201) + stub_request(:post, 'https://bob.com/inbox').to_return(status: 201) + end + + it 'marks account as unsuspended' do + is_expected.to change { account.suspended? }.from(true).to(false) + end + + include_examples 'common behavior' do + let!(:account) { Fabricate(:account) } + let!(:remote_follower) { Fabricate(:account, uri: 'https://alice.com', inbox_url: 'https://alice.com/inbox', protocol: :activitypub) } + let!(:remote_reporter) { Fabricate(:account, uri: 'https://bob.com', inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } + let!(:report) { Fabricate(:report, account: remote_reporter, target_account: account) } + + before do + remote_follower.follow!(account) + end + + it "merges back into local followers' feeds" do + subject.call + expect(FeedManager.instance).to have_received(:merge_into_home).with(account, local_follower) + expect(FeedManager.instance).to have_received(:merge_into_list).with(account, list) + end + + it 'sends an update actor to followers and reporters' do + subject.call + expect(a_request(:post, remote_follower.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once + expect(a_request(:post, remote_reporter.inbox_url).with { |req| match_update_actor_request(req, account) }).to have_been_made.once + end + end + end + + describe 'unsuspending a remote account' do + include_examples 'common behavior' do + let!(:account) { Fabricate(:account, domain: 'bob.com', uri: 'https://bob.com', inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } + let!(:reslove_account_service) { double } + + before do + allow(ResolveAccountService).to receive(:new).and_return(reslove_account_service) + end + + context 'when the account is not remotely suspended' do + before do + allow(reslove_account_service).to receive(:call).with(account).and_return(account) + end + + it 're-fetches the account' do + subject.call + expect(reslove_account_service).to have_received(:call).with(account) + end + + it "merges back into local followers' feeds" do + subject.call + expect(FeedManager.instance).to have_received(:merge_into_home).with(account, local_follower) + expect(FeedManager.instance).to have_received(:merge_into_list).with(account, list) + end + + it 'marks account as unsuspended' do + is_expected.to change { account.suspended? }.from(true).to(false) + end + end + + context 'when the account is remotely suspended' do + before do + allow(reslove_account_service).to receive(:call).with(account) do |account| + account.suspend!(origin: :remote) + account + end + end + + it 're-fetches the account' do + subject.call + expect(reslove_account_service).to have_received(:call).with(account) + end + + it "does not merge back into local followers' feeds" do + subject.call + expect(FeedManager.instance).to_not have_received(:merge_into_home).with(account, local_follower) + expect(FeedManager.instance).to_not have_received(:merge_into_list).with(account, list) + end + + it 'does not mark the account as unsuspended' do + is_expected.not_to change { account.suspended? } + end + end + + context 'when the account is remotely deleted' do + before do + allow(reslove_account_service).to receive(:call).with(account).and_return(nil) + end + + it 're-fetches the account' do + subject.call + expect(reslove_account_service).to have_received(:call).with(account) + end + + it "does not merge back into local followers' feeds" do + subject.call + expect(FeedManager.instance).to_not have_received(:merge_into_home).with(account, local_follower) + expect(FeedManager.instance).to_not have_received(:merge_into_list).with(account, list) + end + end + end + end +end diff --git a/spec/services/update_account_service_spec.rb b/spec/services/update_account_service_spec.rb index 960b26891f..c2dc791e4d 100644 --- a/spec/services/update_account_service_spec.rb +++ b/spec/services/update_account_service_spec.rb @@ -5,9 +5,9 @@ RSpec.describe UpdateAccountService, type: :service do describe 'switching form locked to unlocked accounts' do let(:account) { Fabricate(:account, locked: true) } - let(:alice) { Fabricate(:user, email: 'alice@example.com', account: Fabricate(:account, username: 'alice')).account } - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } - let(:eve) { Fabricate(:user, email: 'eve@example.com', account: Fabricate(:account, username: 'eve')).account } + let(:alice) { Fabricate(:account) } + let(:bob) { Fabricate(:account) } + let(:eve) { Fabricate(:account) } before do bob.touch(:silenced_at) diff --git a/spec/validators/blacklisted_email_validator_spec.rb b/spec/validators/blacklisted_email_validator_spec.rb index f0708dc462..f7d5e01bc8 100644 --- a/spec/validators/blacklisted_email_validator_spec.rb +++ b/spec/validators/blacklisted_email_validator_spec.rb @@ -9,23 +9,36 @@ RSpec.describe BlacklistedEmailValidator, type: :validator do before do allow(user).to receive(:valid_invitation?) { false } - allow_any_instance_of(described_class).to receive(:blocked_email?) { blocked_email } - described_class.new.validate(user) + allow_any_instance_of(described_class).to receive(:blocked_email_provider?) { blocked_email } end - context 'blocked_email?' do + subject { described_class.new.validate(user); errors } + + context 'when e-mail provider is blocked' do let(:blocked_email) { true } - it 'calls errors.add' do - expect(errors).to have_received(:add).with(:email, I18n.t('users.blocked_email_provider')) + it 'adds error' do + expect(subject).to have_received(:add).with(:email, :blocked) end end - context '!blocked_email?' do + context 'when e-mail provider is not blocked' do let(:blocked_email) { false } - it 'not calls errors.add' do - expect(errors).not_to have_received(:add).with(:email, I18n.t('users.blocked_email_provider')) + it 'does not add errors' do + expect(subject).not_to have_received(:add).with(:email, :blocked) + end + + context 'when canonical e-mail is blocked' do + let(:other_user) { Fabricate(:user, email: 'i.n.f.o@mail.com') } + + before do + other_user.account.suspend! + end + + it 'adds error' do + expect(subject).to have_received(:add).with(:email, :taken) + end end end end diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb index 48e17a4f10..550e91996b 100644 --- a/spec/validators/email_mx_validator_spec.rb +++ b/spec/validators/email_mx_validator_spec.rb @@ -6,6 +6,24 @@ describe EmailMxValidator do describe '#validate' do let(:user) { double(email: 'foo@example.com', errors: double(add: nil)) } + it 'does not add errors if there are no DNS records for an e-mail domain that is explicitly allowed' do + old_whitelist = Rails.configuration.x.email_domains_whitelist + Rails.configuration.x.email_domains_whitelist = 'example.com' + + resolver = double + + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:timeouts=).and_return(nil) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) + + subject.validate(user) + expect(user.errors).to_not have_received(:add) + + Rails.configuration.x.email_domains_whitelist = old_whitelist + end + it 'adds an error if there are no DNS records for the e-mail domain' do resolver = double diff --git a/spec/validators/note_length_validator_spec.rb b/spec/validators/note_length_validator_spec.rb new file mode 100644 index 0000000000..6e9b4e132f --- /dev/null +++ b/spec/validators/note_length_validator_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe NoteLengthValidator do + subject { NoteLengthValidator.new(attributes: { note: true }, maximum: 500) } + + describe '#validate' do + it 'adds an error when text is over 500 characters' do + text = 'a' * 520 + account = double(note: text, errors: double(add: nil)) + + subject.validate_each(account, 'note', text) + expect(account.errors).to have_received(:add) + end + + it 'counts URLs as 23 characters flat' do + text = ('a' * 476) + " http://#{'b' * 30}.com/example" + account = double(note: text, errors: double(add: nil)) + + subject.validate_each(account, 'note', text) + expect(account.errors).to_not have_received(:add) + end + + it 'does not count non-autolinkable URLs as 23 characters flat' do + text = ('a' * 476) + "http://#{'b' * 30}.com/example" + account = double(note: text, errors: double(add: nil)) + + subject.validate_each(account, 'note', text) + expect(account.errors).to have_received(:add) + end + end +end diff --git a/spec/validators/status_length_validator_spec.rb b/spec/validators/status_length_validator_spec.rb index 62791cd2f0..643ea6d229 100644 --- a/spec/validators/status_length_validator_spec.rb +++ b/spec/validators/status_length_validator_spec.rb @@ -47,6 +47,14 @@ describe StatusLengthValidator do expect(status.errors).to_not have_received(:add) end + it 'does not count non-autolinkable URLs as 23 characters flat' do + text = ('a' * 476) + "http://#{'b' * 30}.com/example" + status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false) + + subject.validate(status) + expect(status.errors).to have_received(:add) + end + it 'counts only the front part of remote usernames' do username = '@alice' chars = StatusLengthValidator::MAX_CHARS - 1 - username.length diff --git a/spec/validators/status_pin_validator_spec.rb b/spec/validators/status_pin_validator_spec.rb index 06532e5b3f..d5bd0d1b83 100644 --- a/spec/validators/status_pin_validator_spec.rb +++ b/spec/validators/status_pin_validator_spec.rb @@ -9,7 +9,7 @@ RSpec.describe StatusPinValidator, type: :validator do end let(:pin) { double(account: account, errors: errors, status: status, account_id: pin_account_id) } - let(:status) { double(reblog?: reblog, account_id: status_account_id, visibility: visibility) } + let(:status) { double(reblog?: reblog, account_id: status_account_id, visibility: visibility, direct_visibility?: visibility == 'direct') } let(:account) { double(status_pins: status_pins, local?: local) } let(:status_pins) { double(count: count) } let(:errors) { double(add: nil) } @@ -37,11 +37,11 @@ RSpec.describe StatusPinValidator, type: :validator do end end - context 'unless %w(public unlisted).include?(pin.status.visibility)' do - let(:visibility) { '' } + context 'if pin.status.direct_visibility?' do + let(:visibility) { 'direct' } it 'calls errors.add' do - expect(errors).to have_received(:add).with(:base, I18n.t('statuses.pin_errors.private')) + expect(errors).to have_received(:add).with(:base, I18n.t('statuses.pin_errors.direct')) end end diff --git a/spec/validators/unreserved_username_validator_spec.rb b/spec/validators/unreserved_username_validator_spec.rb index 0187941b03..cabd6d386b 100644 --- a/spec/validators/unreserved_username_validator_spec.rb +++ b/spec/validators/unreserved_username_validator_spec.rb @@ -13,7 +13,7 @@ RSpec.describe UnreservedUsernameValidator, type: :validator do let(:account) { double(username: username, errors: errors) } let(:errors ) { double(add: nil) } - context '@username.nil?' do + context '@username.blank?' do let(:username) { nil } it 'not calls errors.add' do @@ -21,14 +21,14 @@ RSpec.describe UnreservedUsernameValidator, type: :validator do end end - context '!@username.nil?' do - let(:username) { '' } + context '!@username.blank?' do + let(:username) { 'f' } context 'reserved_username?' do let(:reserved_username) { true } it 'calls erros.add' do - expect(errors).to have_received(:add).with(:username, I18n.t('accounts.reserved_username')) + expect(errors).to have_received(:add).with(:username, :reserved) end end diff --git a/spec/validators/url_validator_spec.rb b/spec/validators/url_validator_spec.rb index e8d0e64946..a44878a44f 100644 --- a/spec/validators/url_validator_spec.rb +++ b/spec/validators/url_validator_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe UrlValidator, type: :validator do +RSpec.describe URLValidator, type: :validator do describe '#validate_each' do before do allow(validator).to receive(:compliant?).with(value) { compliant } diff --git a/spec/views/about/show.html.haml_spec.rb b/spec/views/about/show.html.haml_spec.rb index 26b1319779..d608bbf5d3 100644 --- a/spec/views/about/show.html.haml_spec.rb +++ b/spec/views/about/show.html.haml_spec.rb @@ -19,7 +19,7 @@ describe 'about/show.html.haml', without_verify_partial_doubles: true do site_short_description: 'something', site_description: 'something', version_number: '1.0', - source_url: 'https://github.com/tootsuite/mastodon', + source_url: 'https://github.com/mastodon/mastodon', open_registrations: false, thumbnail: nil, hero: nil, diff --git a/spec/views/statuses/show.html.haml_spec.rb b/spec/views/statuses/show.html.haml_spec.rb index dbda3b6655..879a26959e 100644 --- a/spec/views/statuses/show.html.haml_spec.rb +++ b/spec/views/statuses/show.html.haml_spec.rb @@ -16,10 +16,11 @@ describe 'statuses/show.html.haml', without_verify_partial_doubles: true do end it 'has valid author h-card and basic data for a detailed_status' do - alice = Fabricate(:account, username: 'alice', display_name: 'Alice') - bob = Fabricate(:account, username: 'bob', display_name: 'Bob') - status = Fabricate(:status, account: alice, text: 'Hello World') - reply = Fabricate(:status, account: bob, thread: status, text: 'Hello Alice') + alice = Fabricate(:account, username: 'alice', display_name: 'Alice') + bob = Fabricate(:account, username: 'bob', display_name: 'Bob') + status = Fabricate(:status, account: alice, text: 'Hello World') + media = Fabricate(:media_attachment, account: alice, status: status, type: :video) + reply = Fabricate(:status, account: bob, thread: status, text: 'Hello Alice') assign(:status, status) assign(:account, alice) @@ -35,12 +36,13 @@ describe 'statuses/show.html.haml', without_verify_partial_doubles: true do end it 'has valid h-cites for p-in-reply-to and p-comment' do - alice = Fabricate(:account, username: 'alice', display_name: 'Alice') - bob = Fabricate(:account, username: 'bob', display_name: 'Bob') - carl = Fabricate(:account, username: 'carl', display_name: 'Carl') - status = Fabricate(:status, account: alice, text: 'Hello World') - reply = Fabricate(:status, account: bob, thread: status, text: 'Hello Alice') - comment = Fabricate(:status, account: carl, thread: reply, text: 'Hello Bob') + alice = Fabricate(:account, username: 'alice', display_name: 'Alice') + bob = Fabricate(:account, username: 'bob', display_name: 'Bob') + carl = Fabricate(:account, username: 'carl', display_name: 'Carl') + status = Fabricate(:status, account: alice, text: 'Hello World') + media = Fabricate(:media_attachment, account: alice, status: status, type: :video) + reply = Fabricate(:status, account: bob, thread: status, text: 'Hello Alice') + comment = Fabricate(:status, account: carl, thread: reply, text: 'Hello Bob') assign(:status, reply) assign(:account, alice) @@ -62,8 +64,9 @@ describe 'statuses/show.html.haml', without_verify_partial_doubles: true do end it 'has valid opengraph tags' do - alice = Fabricate(:account, username: 'alice', display_name: 'Alice') - status = Fabricate(:status, account: alice, text: 'Hello World') + alice = Fabricate(:account, username: 'alice', display_name: 'Alice') + status = Fabricate(:status, account: alice, text: 'Hello World') + media = Fabricate(:media_attachment, account: alice, status: status, type: :video) assign(:status, status) assign(:account, alice) @@ -78,4 +81,21 @@ describe 'statuses/show.html.haml', without_verify_partial_doubles: true do expect(header_tags).to match(%r{}) expect(header_tags).to match(%r{}) end + + it 'has twitter player tag' do + alice = Fabricate(:account, username: 'alice', display_name: 'Alice') + status = Fabricate(:status, account: alice, text: 'Hello World') + media = Fabricate(:media_attachment, account: alice, status: status, type: :video) + + assign(:status, status) + assign(:account, alice) + assign(:descendant_threads, []) + + render + + header_tags = view.content_for(:header_tags) + + expect(header_tags).to match(%r{}) + expect(header_tags).to match(%r{}) + end end diff --git a/spec/workers/activitypub/delivery_worker_spec.rb b/spec/workers/activitypub/delivery_worker_spec.rb index f4633731e5..d39393d507 100644 --- a/spec/workers/activitypub/delivery_worker_spec.rb +++ b/spec/workers/activitypub/delivery_worker_spec.rb @@ -11,7 +11,7 @@ describe ActivityPub::DeliveryWorker do let(:payload) { 'test' } before do - allow_any_instance_of(Account).to receive(:remote_followers_hash).with('https://example.com/').and_return('somehash') + allow_any_instance_of(Account).to receive(:remote_followers_hash).with('https://example.com/api').and_return('somehash') end describe 'perform' do diff --git a/spec/workers/activitypub/distribution_worker_spec.rb b/spec/workers/activitypub/distribution_worker_spec.rb index 368ca025a0..c017b4da1a 100644 --- a/spec/workers/activitypub/distribution_worker_spec.rb +++ b/spec/workers/activitypub/distribution_worker_spec.rb @@ -35,13 +35,16 @@ describe ActivityPub::DistributionWorker do end context 'with direct status' do + let(:mentioned_account) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/inbox')} + before do status.update(visibility: :direct) + status.mentions.create!(account: mentioned_account) end - it 'does nothing' do + it 'delivers to mentioned accounts' do subject.perform(status.id) - expect(ActivityPub::DeliveryWorker).to_not have_received(:push_bulk) + expect(ActivityPub::DeliveryWorker).to have_received(:push_bulk).with(['https://foo.bar/inbox']) end end end diff --git a/spec/workers/admin/domain_purge_worker_spec.rb b/spec/workers/admin/domain_purge_worker_spec.rb new file mode 100644 index 0000000000..b67c58b234 --- /dev/null +++ b/spec/workers/admin/domain_purge_worker_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Admin::DomainPurgeWorker do + subject { described_class.new } + + describe 'perform' do + it 'calls domain purge service for relevant domain block' do + service = double(call: nil) + allow(PurgeDomainService).to receive(:new).and_return(service) + result = subject.perform('example.com') + + expect(result).to be_nil + expect(service).to have_received(:call).with('example.com') + end + end +end diff --git a/spec/workers/feed_insert_worker_spec.rb b/spec/workers/feed_insert_worker_spec.rb index 3509f1f50e..fb34970fc3 100644 --- a/spec/workers/feed_insert_worker_spec.rb +++ b/spec/workers/feed_insert_worker_spec.rb @@ -45,7 +45,7 @@ describe FeedInsertWorker do result = subject.perform(status.id, follower.id) expect(result).to be_nil - expect(instance).to have_received(:push_to_home).with(follower, status) + expect(instance).to have_received(:push_to_home).with(follower, status, update: nil) end end end diff --git a/spec/workers/move_worker_spec.rb b/spec/workers/move_worker_spec.rb index 8ab4f182fd..4db5810f19 100644 --- a/spec/workers/move_worker_spec.rb +++ b/spec/workers/move_worker_spec.rb @@ -3,13 +3,14 @@ require 'rails_helper' describe MoveWorker do - let(:local_follower) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } - let(:blocking_account) { Fabricate(:user, email: 'bar@example.com', account: Fabricate(:account, username: 'bar')).account } - let(:muting_account) { Fabricate(:user, email: 'foo@example.com', account: Fabricate(:account, username: 'foo')).account } + let(:local_follower) { Fabricate(:account) } + let(:blocking_account) { Fabricate(:account) } + let(:muting_account) { Fabricate(:account) } let(:source_account) { Fabricate(:account, protocol: :activitypub, domain: 'example.com') } let(:target_account) { Fabricate(:account, protocol: :activitypub, domain: 'example.com') } let(:local_user) { Fabricate(:user) } - let!(:account_note) { Fabricate(:account_note, account: local_user.account, target_account: source_account) } + let(:comment) { 'old note prior to move' } + let!(:account_note) { Fabricate(:account_note, account: local_user.account, target_account: source_account, comment: comment) } let(:block_service) { double } @@ -26,19 +27,37 @@ describe MoveWorker do end shared_examples 'user note handling' do - it 'copies user note' do - subject.perform(source_account.id, target_account.id) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(source_account.acct) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) + context 'when user notes are short enough' do + it 'copies user note with prelude' do + subject.perform(source_account.id, target_account.id) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(source_account.acct) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) + end + + it 'merges user notes when needed' do + new_account_note = AccountNote.create!(account: account_note.account, target_account: target_account, comment: 'new note prior to move') + + subject.perform(source_account.id, target_account.id) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(source_account.acct) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(new_account_note.comment) + end end - it 'merges user notes when needed' do - new_account_note = AccountNote.create!(account: account_note.account, target_account: target_account, comment: 'new note prior to move') + context 'when user notes are too long' do + let(:comment) { 'abc' * 333 } - subject.perform(source_account.id, target_account.id) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(source_account.acct) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(new_account_note.comment) + it 'copies user note without prelude' do + subject.perform(source_account.id, target_account.id) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) + end + + it 'keeps user notes unchanged' do + new_account_note = AccountNote.create!(account: account_note.account, target_account: target_account, comment: 'new note prior to move') + + subject.perform(source_account.id, target_account.id) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(new_account_note.comment) + end end end @@ -69,7 +88,7 @@ describe MoveWorker do end context 'target account is local' do - let(:target_account) { Fabricate(:user, email: 'alice@example.com', account: Fabricate(:account, username: 'alice')).account } + let(:target_account) { Fabricate(:account) } describe 'perform' do it 'calls UnfollowFollowWorker' do @@ -83,8 +102,8 @@ describe MoveWorker do end context 'both target and source accounts are local' do - let(:target_account) { Fabricate(:user, email: 'alice@example.com', account: Fabricate(:account, username: 'alice')).account } - let(:source_account) { Fabricate(:user, email: 'alice_@example.com', account: Fabricate(:account, username: 'alice_')).account } + let(:target_account) { Fabricate(:account) } + let(:source_account) { Fabricate(:account) } describe 'perform' do it 'calls makes local followers follow the target account' do @@ -96,7 +115,7 @@ describe MoveWorker do include_examples 'block and mute handling' it 'does not fail when a local user is already following both accounts' do - double_follower = Fabricate(:user, email: 'eve@example.com', account: Fabricate(:account, username: 'eve')).account + double_follower = Fabricate(:account) double_follower.follow!(source_account) double_follower.follow!(target_account) subject.perform(source_account.id, target_account.id) diff --git a/spec/workers/publish_scheduled_announcement_worker_spec.rb b/spec/workers/publish_scheduled_announcement_worker_spec.rb new file mode 100644 index 0000000000..0977bba1ee --- /dev/null +++ b/spec/workers/publish_scheduled_announcement_worker_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe PublishScheduledAnnouncementWorker do + subject { described_class.new } + + let!(:remote_account) { Fabricate(:account, domain: 'domain.com', username: 'foo', uri: 'https://domain.com/users/foo') } + let!(:remote_status) { Fabricate(:status, uri: 'https://domain.com/users/foo/12345', account: remote_account) } + let!(:local_status) { Fabricate(:status) } + let(:scheduled_announcement) { Fabricate(:announcement, text: "rebooting very soon, see #{ActivityPub::TagManager.instance.uri_for(remote_status)} and #{ActivityPub::TagManager.instance.uri_for(local_status)}") } + + describe 'perform' do + before do + service = double + allow(FetchRemoteStatusService).to receive(:new).and_return(service) + allow(service).to receive(:call).with('https://domain.com/users/foo/12345') { remote_status.reload } + + subject.perform(scheduled_announcement.id) + end + + it 'updates the linked statuses' do + expect(scheduled_announcement.reload.status_ids).to eq [remote_status.id, local_status.id] + end + end +end diff --git a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb new file mode 100644 index 0000000000..8f20725c87 --- /dev/null +++ b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb @@ -0,0 +1,127 @@ +require 'rails_helper' + +describe Scheduler::AccountsStatusesCleanupScheduler do + subject { described_class.new } + + let!(:account1) { Fabricate(:account, domain: nil) } + let!(:account2) { Fabricate(:account, domain: nil) } + let!(:account3) { Fabricate(:account, domain: nil) } + let!(:account4) { Fabricate(:account, domain: nil) } + let!(:remote) { Fabricate(:account) } + + let!(:policy1) { Fabricate(:account_statuses_cleanup_policy, account: account1) } + let!(:policy2) { Fabricate(:account_statuses_cleanup_policy, account: account3) } + let!(:policy3) { Fabricate(:account_statuses_cleanup_policy, account: account4, enabled: false) } + + let(:queue_size) { 0 } + let(:queue_latency) { 0 } + let(:process_set_stub) do + [ + { + 'concurrency' => 2, + 'queues' => ['push', 'default'], + }, + ] + end + let(:retry_size) { 0 } + + before do + queue_stub = double + allow(queue_stub).to receive(:size).and_return(queue_size) + allow(queue_stub).to receive(:latency).and_return(queue_latency) + allow(Sidekiq::Queue).to receive(:new).and_return(queue_stub) + allow(Sidekiq::ProcessSet).to receive(:new).and_return(process_set_stub) + + sidekiq_stats_stub = double + allow(sidekiq_stats_stub).to receive(:retry_size).and_return(retry_size) + allow(Sidekiq::Stats).to receive(:new).and_return(sidekiq_stats_stub) + + # Create a bunch of old statuses + 10.times do + Fabricate(:status, account: account1, created_at: 3.years.ago) + Fabricate(:status, account: account2, created_at: 3.years.ago) + Fabricate(:status, account: account3, created_at: 3.years.ago) + Fabricate(:status, account: account4, created_at: 3.years.ago) + Fabricate(:status, account: remote, created_at: 3.years.ago) + end + + # Create a bunch of newer statuses + 5.times do + Fabricate(:status, account: account1, created_at: 3.minutes.ago) + Fabricate(:status, account: account2, created_at: 3.minutes.ago) + Fabricate(:status, account: account3, created_at: 3.minutes.ago) + Fabricate(:status, account: account4, created_at: 3.minutes.ago) + Fabricate(:status, account: remote, created_at: 3.minutes.ago) + end + end + + describe '#under_load?' do + context 'when nothing is queued' do + it 'returns false' do + expect(subject.under_load?).to be false + end + end + + context 'when numerous jobs are queued' do + let(:queue_size) { 5 } + let(:queue_latency) { 120 } + + it 'returns true' do + expect(subject.under_load?).to be true + end + end + + context 'when there is a huge amount of jobs to retry' do + let(:retry_size) { 1_000_000 } + + it 'returns true' do + expect(subject.under_load?).to be true + end + end + end + + describe '#get_budget' do + context 'on a single thread' do + let(:process_set_stub) { [ { 'concurrency' => 1, 'queues' => ['push', 'default'] } ] } + + it 'returns a low value' do + expect(subject.compute_budget).to be < 10 + end + end + + context 'on a lot of threads' do + let(:process_set_stub) do + [ + { 'concurrency' => 2, 'queues' => ['push', 'default'] }, + { 'concurrency' => 2, 'queues' => ['push'] }, + { 'concurrency' => 2, 'queues' => ['push'] }, + { 'concurrency' => 2, 'queues' => ['push'] }, + ] + end + + it 'returns a larger value' do + expect(subject.compute_budget).to be > 10 + end + end + end + + describe '#perform' do + context 'when the budget is lower than the number of toots to delete' do + it 'deletes as many statuses as the given budget' do + expect { subject.perform }.to change { Status.count }.by(-subject.compute_budget) + end + + it 'does not delete from accounts with no cleanup policy' do + expect { subject.perform }.to_not change { account2.statuses.count } + end + + it 'does not delete from accounts with disabled cleanup policies' do + expect { subject.perform }.to_not change { account4.statuses.count } + end + + it 'eventually deletes every deletable toot' do + expect { subject.perform; subject.perform; subject.perform; subject.perform }.to change { Status.count }.by(-20) + end + end + end +end diff --git a/spec/workers/unfollow_follow_worker_spec.rb b/spec/workers/unfollow_follow_worker_spec.rb index 5052c5616a..5ea4256a9b 100644 --- a/spec/workers/unfollow_follow_worker_spec.rb +++ b/spec/workers/unfollow_follow_worker_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe UnfollowFollowWorker do - let(:local_follower) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } + let(:local_follower) { Fabricate(:account) } let(:source_account) { Fabricate(:account) } let(:target_account) { Fabricate(:account) } let(:show_reblogs) { true } diff --git a/spec/workers/web/push_notification_worker_spec.rb b/spec/workers/web/push_notification_worker_spec.rb new file mode 100644 index 0000000000..5bc24f8886 --- /dev/null +++ b/spec/workers/web/push_notification_worker_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Web::PushNotificationWorker do + subject { described_class.new } + + let(:p256dh) { 'BN4GvZtEZiZuqFxSKVZfSfluwKBD7UxHNBmWkfiZfCtgDE8Bwh-_MtLXbBxTBAWH9r7IPKL0lhdcaqtL1dfxU5E=' } + let(:auth) { 'Q2BoAjC09xH3ywDLNJr-dA==' } + let(:endpoint) { 'https://updates.push.services.mozilla.com/push/v1/subscription-id' } + let(:user) { Fabricate(:user) } + let(:notification) { Fabricate(:notification) } + let(:subscription) { Fabricate(:web_push_subscription, user_id: user.id, key_p256dh: p256dh, key_auth: auth, endpoint: endpoint, data: { alerts: { notification.type => true } }) } + let(:vapid_public_key) { 'BB37UCyc8LLX4PNQSe-04vSFvpUWGrENubUaslVFM_l5TxcGVMY0C3RXPeUJAQHKYlcOM2P4vTYmkoo0VZGZTM4=' } + let(:vapid_private_key) { 'OPrw1Sum3gRoL4-DXfSCC266r-qfFSRZrnj8MgIhRHg=' } + let(:vapid_key) { Webpush::VapidKey.from_keys(vapid_public_key, vapid_private_key) } + let(:contact_email) { 'sender@example.com' } + let(:ciphertext) { "+\xB8\xDBT}\x13\xB6\xDD.\xF9\xB0\xA7\xC8\xD2\x80\xFD\x99#\xF7\xAC\x83\xA4\xDB,\x1F\xB5\xB9w\x85>\xF7\xADr" } + let(:salt) { "X\x97\x953\xE4X\xF8_w\xE7T\x95\xC51q\xFE" } + let(:server_public_key) { "\x04\b-RK9w\xDD$\x16lFz\xF9=\xB4~\xC6\x12k\xF3\xF40t\xA9\xC1\fR\xC3\x81\x80\xAC\f\x7F\xE4\xCC\x8E\xC2\x88 n\x8BB\xF1\x9C\x14\a\xFA\x8D\xC9\x80\xA1\xDDyU\\&c\x01\x88#\x118Ua" } + let(:shared_secret) { "\t\xA7&\x85\t\xC5m\b\xA8\xA7\xF8B{1\xADk\xE1y'm\xEDE\xEC\xDD\xEDj\xB3$s\xA9\xDA\xF0" } + let(:payload) { { ciphertext: ciphertext, salt: salt, server_public_key: server_public_key, shared_secret: shared_secret } } + + describe 'perform' do + before do + allow_any_instance_of(subscription.class).to receive(:contact_email).and_return(contact_email) + allow_any_instance_of(subscription.class).to receive(:vapid_key).and_return(vapid_key) + allow(Webpush::Encryption).to receive(:encrypt).and_return(payload) + allow(JWT).to receive(:encode).and_return('jwt.encoded.payload') + + stub_request(:post, endpoint).to_return(status: 201, body: '') + + subject.perform(subscription.id, notification.id) + end + + it 'calls the relevant service with the correct headers' do + expect(a_request(:post, endpoint).with(headers: { + 'Content-Encoding' => 'aesgcm', + 'Content-Type' => 'application/octet-stream', + 'Crypto-Key' => 'dh=BAgtUks5d90kFmxGevk9tH7GEmvz9DB0qcEMUsOBgKwMf-TMjsKIIG6LQvGcFAf6jcmAod15VVwmYwGIIxE4VWE;p256ecdsa=' + vapid_public_key.delete('='), + 'Encryption' => 'salt=WJeVM-RY-F9351SVxTFx_g', + 'Ttl' => '172800', + 'Urgency' => 'normal', + 'Authorization' => 'WebPush jwt.encoded.payload', + }, body: "+\xB8\xDBT}\u0013\xB6\xDD.\xF9\xB0\xA7\xC8Ҁ\xFD\x99#\xF7\xAC\x83\xA4\xDB,\u001F\xB5\xB9w\x85>\xF7\xADr")).to have_been_made + end + end +end diff --git a/streaming/index.js b/streaming/index.js index d17ac64e94..2dbb546c01 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -9,9 +9,9 @@ const redis = require('redis'); const pg = require('pg'); const log = require('npmlog'); const url = require('url'); -const { WebSocketServer } = require('@clusterws/cws'); const uuid = require('uuid'); const fs = require('fs'); +const WebSocket = require('ws'); const env = process.env.NODE_ENV || 'development'; const alwaysRequireAuth = process.env.LIMITED_FEDERATION_MODE === 'true' || process.env.WHITELIST_MODE === 'true' || process.env.AUTHORIZED_FETCH === 'true'; @@ -63,20 +63,29 @@ const dbUrlToConfig = (dbUrl) => { * @param {Object.} defaultConfig * @param {string} redisUrl */ -const redisUrlToClient = (defaultConfig, redisUrl) => { +const redisUrlToClient = async (defaultConfig, redisUrl) => { const config = defaultConfig; + let client; + if (!redisUrl) { - return redis.createClient(config); + client = redis.createClient(config); + } else if (redisUrl.startsWith('unix://')) { + client = redis.createClient(Object.assign(config, { + socket: { + path: redisUrl.slice(7), + }, + })); + } else { + client = redis.createClient(Object.assign(config, { + url: redisUrl, + })); } - if (redisUrl.startsWith('unix://')) { - return redis.createClient(redisUrl.slice(7), config); - } + client.on('error', (err) => log.error('Redis Client Error!', err)); + await client.connect(); - return redis.createClient(Object.assign(config, { - url: redisUrl, - })); + return client; }; const numWorkers = +process.env.STREAMING_CLUSTER_NUM || (env === 'development' ? 1 : Math.max(os.cpus().length - 1, 1)); @@ -99,11 +108,11 @@ const startMaster = () => { log.warn('UNIX domain socket is now supported by using SOCKET. Please migrate from PORT hack.'); } - log.info(`Starting streaming API server master with ${numWorkers} workers`); + log.warn(`Starting streaming API server master with ${numWorkers} workers`); }; -const startWorker = (workerId) => { - log.info(`Starting worker ${workerId}`); +const startWorker = async (workerId) => { + log.warn(`Starting worker ${workerId}`); const pgConfigs = { development: { @@ -127,7 +136,7 @@ const startWorker = (workerId) => { if (!!process.env.DB_SSLMODE && process.env.DB_SSLMODE !== 'disable') { pgConfigs.development.ssl = true; - pgConfigs.production.ssl = true; + pgConfigs.production.ssl = true; } const app = express(); @@ -139,9 +148,11 @@ const startWorker = (workerId) => { const redisNamespace = process.env.REDIS_NAMESPACE || null; const redisParams = { - host: process.env.REDIS_HOST || '127.0.0.1', - port: process.env.REDIS_PORT || 6379, - db: process.env.REDIS_DB || 0, + socket: { + host: process.env.REDIS_HOST || '127.0.0.1', + port: process.env.REDIS_PORT || 6379, + }, + database: process.env.REDIS_DB || 0, password: process.env.REDIS_PASSWORD || undefined, }; @@ -151,25 +162,8 @@ const startWorker = (workerId) => { const redisPrefix = redisNamespace ? `${redisNamespace}:` : ''; - const redisSubscribeClient = redisUrlToClient(redisParams, process.env.REDIS_URL); - const redisClient = redisUrlToClient(redisParams, process.env.REDIS_URL); - - /** - * @type {Object.>} - */ - const subs = {}; - - redisSubscribeClient.on('message', (channel, message) => { - const callbacks = subs[channel]; - - log.silly(`New message on channel ${channel}`); - - if (!callbacks) { - return; - } - - callbacks.forEach(callback => callback(message)); - }); + const redisSubscribeClient = await redisUrlToClient(redisParams, process.env.REDIS_URL); + const redisClient = await redisUrlToClient(redisParams, process.env.REDIS_URL); /** * @param {string[]} channels @@ -197,14 +191,8 @@ const startWorker = (workerId) => { */ const subscribe = (channel, callback) => { log.silly(`Adding listener for ${channel}`); - subs[channel] = subs[channel] || []; - if (subs[channel].length === 0) { - log.verbose(`Subscribe ${channel}`); - redisSubscribeClient.subscribe(channel); - } - - subs[channel].push(callback); + redisSubscribeClient.subscribe(channel, callback); }; /** @@ -214,17 +202,7 @@ const startWorker = (workerId) => { const unsubscribe = (channel, callback) => { log.silly(`Removing listener for ${channel}`); - if (!subs[channel]) { - return; - } - - subs[channel] = subs[channel].filter(item => item !== callback); - - if (subs[channel].length === 0) { - log.verbose(`Unsubscribe ${channel}`); - redisSubscribeClient.unsubscribe(channel); - delete subs[channel]; - } + redisSubscribeClient.unsubscribe(channel, callback); }; const FALSE_VALUES = [ @@ -282,6 +260,14 @@ const startWorker = (workerId) => { next(); }; + /** + * @param {any} req + * @param {string[]} necessaryScopes + * @return {boolean} + */ + const isInScope = (req, necessaryScopes) => + req.scopes.some(scope => necessaryScopes.includes(scope)); + /** * @param {string} token * @param {any} req @@ -314,7 +300,6 @@ const startWorker = (workerId) => { req.scopes = result.rows[0].scopes.split(' '); req.accountId = result.rows[0].account_id; req.chosenLanguages = result.rows[0].chosen_languages; - req.allowNotifications = req.scopes.some(scope => ['read', 'read:notifications'].includes(scope)); req.deviceId = result.rows[0].device_id; resolve(); @@ -359,7 +344,7 @@ const startWorker = (workerId) => { const onlyMedia = isTruthy(query.only_media); const allowLocalOnly = isTruthy(query.allow_local_only); - switch(path) { + switch (path) { case '/api/v1/streaming/user': return 'user'; case '/api/v1/streaming/user/notification': @@ -424,7 +409,7 @@ const startWorker = (workerId) => { requiredScopes.push('read:statuses'); } - if (requiredScopes.some(requiredScope => req.scopes.includes(requiredScope))) { + if (req.scopes && requiredScopes.some(requiredScope => req.scopes.includes(requiredScope))) { resolve(); return; } @@ -490,7 +475,7 @@ const startWorker = (workerId) => { const listener = createSystemMessageListener(req, { - onKill () { + onKill() { res.end(); }, @@ -542,7 +527,7 @@ const startWorker = (workerId) => { }; /** - * @param {array} + * @param {array} arr * @param {number=} shift * @return {string} */ @@ -581,15 +566,13 @@ const startWorker = (workerId) => { * @param {function(string, string): void} output * @param {function(string[], function(string): void): void} attachCloseHandler * @param {boolean=} needsFiltering - * @param {boolean=} notificationOnly * @param {boolean=} allowLocalOnly * @return {function(string): void} */ - const streamFrom = (ids, req, output, attachCloseHandler, needsFiltering = false, notificationOnly = false, allowLocalOnly = false) => { - const accountId = req.accountId || req.remoteAddress; - const streamType = notificationOnly ? ' (notification)' : ''; + const streamFrom = (ids, req, output, attachCloseHandler, needsFiltering = false, allowLocalOnly = false) => { + const accountId = req.accountId || req.remoteAddress; - log.verbose(req.requestId, `Starting stream from ${ids.join(', ')} for ${accountId}${streamType}`); + log.verbose(req.requestId, `Starting stream from ${ids.join(', ')} for ${accountId}`); const listener = message => { const json = parseJSON(message); @@ -599,22 +582,14 @@ const startWorker = (workerId) => { const { event, payload, queued_at } = json; const transmit = () => { - const now = new Date().getTime(); - const delta = now - queued_at; + const now = new Date().getTime(); + const delta = now - queued_at; const encodedPayload = typeof payload === 'object' ? JSON.stringify(payload) : payload; log.silly(req.requestId, `Transmitting for ${accountId}: ${event} ${encodedPayload} Delay: ${delta}ms`); output(event, encodedPayload); }; - if (notificationOnly && event !== 'notification') { - return; - } - - if (event === 'notification' && !req.allowNotifications) { - return; - } - // Only send local-only statuses to logged-in users if (event === 'update' && payload.local_only && !(req.accountId && allowLocalOnly)) { log.silly(req.requestId, `Message ${payload.id} filtered because it was local-only`); @@ -628,9 +603,9 @@ const startWorker = (workerId) => { return; } - const unpackedPayload = payload; + const unpackedPayload = payload; const targetAccountIds = [unpackedPayload.account.id].concat(unpackedPayload.mentions.map(item => item.id)); - const accountDomain = unpackedPayload.account.acct.split('@')[1]; + const accountDomain = unpackedPayload.account.acct.split('@')[1]; if (Array.isArray(req.chosenLanguages) && unpackedPayload.language !== null && req.chosenLanguages.indexOf(unpackedPayload.language) === -1) { log.silly(req.requestId, `Message ${unpackedPayload.id} filtered by language (${unpackedPayload.language})`); @@ -650,7 +625,15 @@ const startWorker = (workerId) => { } const queries = [ - client.query(`SELECT 1 FROM blocks WHERE (account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})) OR (account_id = $2 AND target_account_id = $1) UNION SELECT 1 FROM mutes WHERE account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})`, [req.accountId, unpackedPayload.account.id].concat(targetAccountIds)), + client.query(`SELECT 1 + FROM blocks + WHERE (account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})) + OR (account_id = $2 AND target_account_id = $1) + UNION + SELECT 1 + FROM mutes + WHERE account_id = $1 + AND target_account_id IN (${placeholders(targetAccountIds, 2)})`, [req.accountId, unpackedPayload.account.id].concat(targetAccountIds)), ]; if (accountDomain) { @@ -713,12 +696,12 @@ const startWorker = (workerId) => { /** * @param {any} req * @param {function(): void} [closeHandler] - * @return {function(string[], function(string): void)} + * @return {function(string[]): void} */ - const streamHttpEnd = (req, closeHandler = undefined) => (ids, listener) => { + const streamHttpEnd = (req, closeHandler = undefined) => (ids) => { req.on('close', () => { ids.forEach(id => { - unsubscribe(id, listener); + unsubscribe(id); }); if (closeHandler) { @@ -765,16 +748,16 @@ const startWorker = (workerId) => { app.get('/api/v1/streaming/*', (req, res) => { channelNameToIds(req, channelNameFromPath(req), req.query).then(({ channelIds, options }) => { const onSend = streamToHttp(req, res); - const onEnd = streamHttpEnd(req, subscriptionHeartbeat(channelIds)); + const onEnd = streamHttpEnd(req, subscriptionHeartbeat(channelIds)); - streamFrom(channelIds, req, onSend, onEnd, options.needsFiltering, options.notificationOnly, options.allowLocalOnly); + streamFrom(channelIds, req, onSend, onEnd, options.needsFiltering, options.allowLocalOnly); }).catch(err => { log.verbose(req.requestId, 'Subscription error:', err.toString()); httpNotFound(res); }); }); - const wss = new WebSocketServer({ server, verifyClient: wsVerifyClient }); + const wss = new WebSocket.Server({ server, verifyClient: wsVerifyClient }); /** * @typedef StreamParams @@ -783,88 +766,106 @@ const startWorker = (workerId) => { * @property {string} [only_media] */ + /** + * @param {any} req + * @return {string[]} + */ + const channelsForUserStream = req => { + const arr = [`timeline:${req.accountId}`]; + + if (isInScope(req, ['crypto']) && req.deviceId) { + arr.push(`timeline:${req.accountId}:${req.deviceId}`); + } + + if (isInScope(req, ['read', 'read:notifications'])) { + arr.push(`timeline:${req.accountId}:notifications`); + } + + return arr; + }; + /** * @param {any} req * @param {string} name * @param {StreamParams} params - * @return {Promise.<{ channelIds: string[], options: { needsFiltering: boolean, notificationOnly: boolean } }>} + * @return {Promise.<{ channelIds: string[], options: { needsFiltering: boolean } }>} */ const channelNameToIds = (req, name, params) => new Promise((resolve, reject) => { - switch(name) { + switch (name) { case 'user': resolve({ - channelIds: req.deviceId ? [`timeline:${req.accountId}`, `timeline:${req.accountId}:${req.deviceId}`] : [`timeline:${req.accountId}`], - options: { needsFiltering: false, notificationOnly: false, allowLocalOnly: true }, + channelIds: channelsForUserStream(req), + options: { needsFiltering: false, allowLocalOnly: true }, }); break; case 'user:notification': resolve({ - channelIds: [`timeline:${req.accountId}`], - options: { needsFiltering: false, notificationOnly: true, allowLocalOnly: true }, + channelIds: [`timeline:${req.accountId}:notifications`], + options: { needsFiltering: false, allowLocalOnly: true }, }); break; case 'public': resolve({ channelIds: ['timeline:public'], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: isTruthy(params.allow_local_only) }, + options: { needsFiltering: true, allowLocalOnly: isTruthy(params.allow_local_only) }, }); break; case 'public:allow_local_only': resolve({ channelIds: ['timeline:public'], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: true }, + options: { needsFiltering: true, allowLocalOnly: true }, }); break; case 'public:local': resolve({ channelIds: ['timeline:public:local'], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: true }, + options: { needsFiltering: true, allowLocalOnly: true }, }); break; case 'public:remote': resolve({ channelIds: ['timeline:public:remote'], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: false }, + options: { needsFiltering: true, allowLocalOnly: false }, }); break; case 'public:media': resolve({ channelIds: ['timeline:public:media'], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: isTruthy(query.allow_local_only) }, + options: { needsFiltering: true, allowLocalOnly: isTruthy(query.allow_local_only) }, }); break; case 'public:allow_local_only:media': resolve({ channelIds: ['timeline:public:media'], - options: { needsFiltering: true, notificationsOnly: false, allowLocalOnly: true }, + options: { needsFiltering: true, allowLocalOnly: true }, }); break; case 'public:local:media': resolve({ channelIds: ['timeline:public:local:media'], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: true }, + options: { needsFiltering: true, allowLocalOnly: true }, }); break; case 'public:remote:media': resolve({ channelIds: ['timeline:public:remote:media'], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: false }, + options: { needsFiltering: true, allowLocalOnly: false }, }); break; case 'direct': resolve({ channelIds: [`timeline:direct:${req.accountId}`], - options: { needsFiltering: false, notificationOnly: false, allowLocalOnly: true }, + options: { needsFiltering: false, allowLocalOnly: true }, }); break; @@ -874,7 +875,7 @@ const startWorker = (workerId) => { } else { resolve({ channelIds: [`timeline:hashtag:${params.tag.toLowerCase()}`], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: true }, + options: { needsFiltering: true, allowLocalOnly: true }, }); } @@ -885,7 +886,7 @@ const startWorker = (workerId) => { } else { resolve({ channelIds: [`timeline:hashtag:${params.tag.toLowerCase()}:local`], - options: { needsFiltering: true, notificationOnly: false, allowLocalOnly: true }, + options: { needsFiltering: true, allowLocalOnly: true }, }); } @@ -894,7 +895,7 @@ const startWorker = (workerId) => { authorizeListAccess(params.list, req).then(() => { resolve({ channelIds: [`timeline:list:${params.list}`], - options: { needsFiltering: false, notificationOnly: false, allowLocalOnly: true }, + options: { needsFiltering: false, allowLocalOnly: true }, }); }).catch(() => { reject('Not authorized to stream this list'); @@ -934,14 +935,17 @@ const startWorker = (workerId) => { * @param {StreamParams} params */ const subscribeWebsocketToChannel = ({ socket, request, subscriptions }, channelName, params) => - checkScopes(request, channelName).then(() => channelNameToIds(request, channelName, params)).then(({ channelIds, options }) => { + checkScopes(request, channelName).then(() => channelNameToIds(request, channelName, params)).then(({ + channelIds, + options, + }) => { if (subscriptions[channelIds.join(';')]) { return; } - const onSend = streamToWs(request, socket, streamNameFromChannelName(channelName, params)); + const onSend = streamToWs(request, socket, streamNameFromChannelName(channelName, params)); const stopHeartbeat = subscriptionHeartbeat(channelIds); - const listener = streamFrom(channelIds, request, onSend, undefined, options.needsFiltering, options.notificationOnly, options.allowLocalOnly); + const listener = streamFrom(channelIds, request, onSend, undefined, options.needsFiltering, options.allowLocalOnly); subscriptions[channelIds.join(';')] = { listener, @@ -989,7 +993,7 @@ const startWorker = (workerId) => { const listener = createSystemMessageListener(request, { - onKill () { + onKill() { socket.close(); }, @@ -999,7 +1003,8 @@ const startWorker = (workerId) => { subscriptions[systemChannelId] = { listener, - stopHeartbeat: () => {}, + stopHeartbeat: () => { + }, }; }; @@ -1018,9 +1023,15 @@ const startWorker = (workerId) => { wss.on('connection', (ws, req) => { const location = url.parse(req.url, true); - req.requestId = uuid.v4(); + req.requestId = uuid.v4(); req.remoteAddress = ws._socket.remoteAddress; + ws.isAlive = true; + + ws.on('pong', () => { + ws.isAlive = true; + }); + /** * @type {WebSocketSession} */ @@ -1070,14 +1081,24 @@ const startWorker = (workerId) => { } }); - wss.startAutoPing(30000); + setInterval(() => { + wss.clients.forEach(ws => { + if (ws.isAlive === false) { + ws.terminate(); + return; + } + + ws.isAlive = false; + ws.ping('', false); + }); + }, 30000); attachServerWithConfig(server, address => { - log.info(`Worker ${workerId} now listening on ${address}`); + log.warn(`Worker ${workerId} now listening on ${address}`); }); const onExit = () => { - log.info(`Worker ${workerId} exiting, bye bye`); + log.warn(`Worker ${workerId} exiting`); server.close(); process.exit(0); }; diff --git a/yarn.lock b/yarn.lock index 6b5c18b104..313a3567af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,449 +2,479 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": +"@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" - integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== - -"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" - integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.10" - "@babel/types" "^7.12.10" + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.12", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" + integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.12" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.10" + "@babel/types" "^7.16.8" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" - semver "^5.4.1" + semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.12.10", "@babel/generator@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" - integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== +"@babel/generator@^7.16.8", "@babel/generator@^7.7.2": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== dependencies: - "@babel/types" "^7.12.11" + "@babel/types" "^7.16.8" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.7" -"@babel/helper-annotate-as-pure@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" - integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: - "@babel/types" "^7.12.10" + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" - integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== +"@babel/helper-builder-react-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.16.7.tgz#6f9da7cea0fde8420e0938d490837feb5bde8dda" + integrity sha512-XKorXOl2868Un8/XK2o4GLlXr8Q08KthWI5W3qyCkh6tCGf5Ncg3HR4oN2UO+sqPoAlcMgz9elFW/FZvAHYotA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-builder-react-jsx-experimental@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.10.tgz#a58cb96a793dc0fcd5c9ed3bb36d62fdc60534c2" - integrity sha512-3Kcr2LGpL7CTRDTTYm1bzeor9qZbxbvU2AxsLA6mUG9gYarSfIKMK0UlU+azLWI+s0+BH768bwyaziWB2NOJlQ== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.10" - "@babel/helper-module-imports" "^7.12.5" - "@babel/types" "^7.12.10" + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" -"@babel/helper-builder-react-jsx-experimental@^7.12.4": - version "7.12.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48" - integrity sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og== +"@babel/helper-create-class-features-plugin@^7.16.10": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" + integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-module-imports" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-builder-react-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" - integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== +"@babel/helper-create-class-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" + integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-compilation-targets@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" - integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== dependencies: - "@babel/compat-data" "^7.12.5" - "@babel/helper-validator-option" "^7.12.1" - browserslist "^4.14.5" - semver "^5.5.0" - -"@babel/helper-create-class-features-plugin@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" - integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" - -"@babel/helper-create-regexp-features-plugin@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz#18b1302d4677f9dc4740fe8c9ed96680e29d37e8" - integrity sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-regex" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.16.7" regexpu-core "^4.7.1" -"@babel/helper-define-map@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz#f037ad794264f729eda1889f4ee210b870999092" - integrity sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA== +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.4" - lodash "^4.17.13" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" - integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== dependencies: - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" - integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: - "@babel/helper-get-function-arity" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/types" "^7.12.11" + "@babel/types" "^7.16.7" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== dependencies: - "@babel/types" "^7.10.4" + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-get-function-arity@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" - integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== dependencies: - "@babel/types" "^7.12.10" + "@babel/types" "^7.16.7" -"@babel/helper-hoist-variables@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" - integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" - integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.16.7" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" - integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" - integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-simple-access" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/helper-validator-identifier" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - lodash "^4.17.19" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== -"@babel/helper-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.4.tgz#59b373daaf3458e5747dece71bbaf45f9676af6d" - integrity sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ== +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== dependencies: - lodash "^4.17.13" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" -"@babel/helper-remap-async-to-generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" - integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-wrap-function" "^7.10.4" - "@babel/types" "^7.12.1" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-replace-supers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" - integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw== +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/types" "^7.16.7" -"@babel/helper-simple-access@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" - integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.16.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: - "@babel/types" "^7.12.1" - -"@babel/helper-split-export-declaration@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" - integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-split-export-declaration@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" - integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== - dependencies: - "@babel/types" "^7.12.11" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + "@babel/types" "^7.16.7" "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== -"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" - integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/helper-wrap-function@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" - integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== -"@babel/helpers@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" - integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" "@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.7.0": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" - integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== - -"@babel/plugin-proposal-async-generator-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" - integrity sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A== +"@babel/highlight@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.8.3": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" - integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.7.0": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" + integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== -"@babel/plugin-proposal-decorators@^7.12.12": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.12.tgz#067a6d3d6ca86d54cf56bb183239199c20daeafe" - integrity sha512-fhkE9lJYpw2mjHelBpM2zCbaA11aov2GJs7q4cFaXNrWx0H3bW58H9Esy2rdtYOghFBEYUDRIpvlgi+ZD+AvvQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-decorators" "^7.12.1" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-dynamic-import@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" - integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" -"@babel/plugin-proposal-export-namespace-from@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" - integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== +"@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz#922907d2e3e327f5b07d2246bcfc0bd438f360d2" + integrity sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-decorators" "^7.16.7" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" - integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" - integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" - integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" - integrity sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ== +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== +"@babel/plugin-proposal-object-rest-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" -"@babel/plugin-proposal-optional-catch-binding@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" - integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" - integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" - integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== +"@babel/plugin-proposal-private-methods@^7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" - integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== @@ -458,21 +488,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" - integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-decorators@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz#81a8b535b284476c41be6de06853a8802b98c5dd" - integrity sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w== +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-dynamic-import@^7.8.0": +"@babel/plugin-syntax-decorators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" + integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -493,19 +530,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": +"@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== +"@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -514,7 +551,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== @@ -528,410 +565,435 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" - integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" - integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" - integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" - integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-block-scoping@^7.12.11": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz#d93a567a152c22aea3b1929bb118d1d0a175cdca" - integrity sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ== +"@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" -"@babel/plugin-transform-classes@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" - integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-define-map" "^7.10.4" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" - integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" - integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== +"@babel/plugin-transform-destructuring@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" - integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-duplicate-keys@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" - integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-exponentiation-operator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" - integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-for-of@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" - integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-function-name@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" - integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" - integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-member-expression-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" - integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-modules-amd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" - integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" - integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== +"@babel/plugin-transform-modules-commonjs@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" - integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== +"@babel/plugin-transform-modules-systemjs@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== dependencies: - "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" - integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" - integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" + integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" -"@babel/plugin-transform-new-target@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" - integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-object-super@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" - integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" -"@babel/plugin-transform-parameters@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" - integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-property-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" - integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-react-display-name@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" - integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== +"@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-react-inline-elements@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.12.1.tgz#f7d507200923adbbdacb107feec7ad09cefae631" - integrity sha512-9ZuH22V68nUyLkhSJYKBqQr10d/gqmyAEeffpGXh3cRkETDUVDaY5PgX/dg8id419KoyWc5VCwsCgJVmxxAk3g== +"@babel/plugin-transform-react-inline-elements@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.16.7.tgz#87d470ae5fc8ad5c803494070f7dc513846c03fe" + integrity sha512-jFGuZSebHob02zhrXsJhnI8xcemiDfdlJa1KR2LUfVj/4y9G2iwbJNGVsiH8mW6HEQVh5XwzWWbo/YoroDlQRg== dependencies: - "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-builder-react-jsx" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-react-jsx-development@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.7.tgz#4c2a647de79c7e2b16bfe4540677ba3121e82a08" - integrity sha512-Rs3ETtMtR3VLXFeYRChle5SsP/P9Jp/6dsewBQfokDSzKJThlsuFcnzLTDRALiUmTC48ej19YD9uN1mupEeEDg== +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.12.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.16.7" -"@babel/plugin-transform-react-jsx@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.10.tgz#a7af3097c73479123594c8c8fe39545abebd44e3" - integrity sha512-MM7/BC8QdHXM7Qc1wdnuk73R4gbuOpfrSUgfV/nODGc86sPY1tgmY2M9E9uAnf2e4DOIp8aKGWqgZfQxnTNGuw== +"@babel/plugin-transform-react-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" + integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== dependencies: - "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-builder-react-jsx-experimental" "^7.12.10" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" + integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" - integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== +"@babel/plugin-transform-regenerator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" - integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-runtime@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz#af0fded4e846c4b37078e8e5d06deac6cd848562" - integrity sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA== +"@babel/plugin-transform-runtime@^7.16.10": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz#53d9fd3496daedce1dd99639097fa5d14f4c7c2c" + integrity sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w== dependencies: - "@babel/helper-module-imports" "^7.12.5" - "@babel/helper-plugin-utils" "^7.10.4" - semver "^5.5.1" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" - integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-spread@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" - integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" -"@babel/plugin-transform-sticky-regex@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" - integrity sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg== +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-template-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" - integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-typeof-symbol@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b" - integrity sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA== +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-unicode-escapes@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" - integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-unicode-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" - integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/preset-env@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" - integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== +"@babel/preset-env@^7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" + integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== dependencies: - "@babel/compat-data" "^7.12.7" - "@babel/helper-compilation-targets" "^7.12.5" - "@babel/helper-module-imports" "^7.12.5" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.11" - "@babel/plugin-proposal-async-generator-functions" "^7.12.1" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-dynamic-import" "^7.12.1" - "@babel/plugin-proposal-export-namespace-from" "^7.12.1" - "@babel/plugin-proposal-json-strings" "^7.12.1" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-numeric-separator" "^7.12.7" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.7" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.12.1" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/compat-data" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.12.1" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-async-to-generator" "^7.12.1" - "@babel/plugin-transform-block-scoped-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.11" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-computed-properties" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-dotall-regex" "^7.12.1" - "@babel/plugin-transform-duplicate-keys" "^7.12.1" - "@babel/plugin-transform-exponentiation-operator" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-function-name" "^7.12.1" - "@babel/plugin-transform-literals" "^7.12.1" - "@babel/plugin-transform-member-expression-literals" "^7.12.1" - "@babel/plugin-transform-modules-amd" "^7.12.1" - "@babel/plugin-transform-modules-commonjs" "^7.12.1" - "@babel/plugin-transform-modules-systemjs" "^7.12.1" - "@babel/plugin-transform-modules-umd" "^7.12.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" - "@babel/plugin-transform-new-target" "^7.12.1" - "@babel/plugin-transform-object-super" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-property-literals" "^7.12.1" - "@babel/plugin-transform-regenerator" "^7.12.1" - "@babel/plugin-transform-reserved-words" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/plugin-transform-sticky-regex" "^7.12.7" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/plugin-transform-typeof-symbol" "^7.12.10" - "@babel/plugin-transform-unicode-escapes" "^7.12.1" - "@babel/plugin-transform-unicode-regex" "^7.12.1" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.11" - core-js-compat "^3.8.0" - semver "^5.5.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.8" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.8" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" + semver "^6.3.0" -"@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -939,16 +1001,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.10.tgz#4fed65f296cbb0f5fb09de6be8cddc85cc909be9" - integrity sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ== +"@babel/preset-react@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" + integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-display-name" "^7.12.1" - "@babel/plugin-transform-react-jsx" "^7.12.10" - "@babel/plugin-transform-react-jsx-development" "^7.12.7" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" "@babel/runtime-corejs3@^7.10.2": version "7.10.3" @@ -965,44 +1028,44 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.16.7", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.3.3": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" - integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== +"@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.0": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" - integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" + integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== dependencies: - "@babel/code-frame" "^7.12.11" - "@babel/generator" "^7.12.11" - "@babel/helper-function-name" "^7.12.11" - "@babel/helper-split-export-declaration" "^7.12.11" - "@babel/parser" "^7.12.11" - "@babel/types" "^7.12.12" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.10" + "@babel/types" "^7.16.8" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" - integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1010,114 +1073,83 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@clusterws/cws@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@clusterws/cws/-/cws-3.0.0.tgz#518fc8e7d9066e220f6f6aef3158cc14d5a1e98e" - integrity sha512-6RO7IUbSlTO3l8XPN/9g21YGPF4HjfkidDzchkP0h6iwq5jYtji+KUCgyxcSYiuN7aWu8nGJDjBer7XJilPnOg== - -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== +"@emotion/cache@^11.1.3", "@emotion/cache@^11.4.0": + version "11.4.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.4.0.tgz#293fc9d9a7a38b9aad8e9337e5014366c3b09ac0" + integrity sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g== dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" + "@emotion/memoize" "^0.7.4" + "@emotion/sheet" "^1.0.0" + "@emotion/utils" "^1.0.0" + "@emotion/weak-memoize" "^0.2.5" + stylis "^4.0.3" -"@emotion/cache@^10.0.17", "@emotion/cache@^10.0.9": - version "10.0.19" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.19.tgz#d258d94d9c707dcadaf1558def968b86bb87ad71" - integrity sha512-BoiLlk4vEsGBg2dAqGSJu0vJl/PgVtCYLBFJaEO8RmQzPugXewQCXZJNXTDFaRlfCs0W+quesayav4fvaif5WQ== - dependencies: - "@emotion/sheet" "0.9.3" - "@emotion/stylis" "0.8.4" - "@emotion/utils" "0.11.2" - "@emotion/weak-memoize" "0.2.4" - -"@emotion/core@^10.0.9": - version "10.0.17" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.17.tgz#3367376709721f4ee2068cff54ba581d362789d8" - integrity sha512-gykyjjr0sxzVuZBVTVK4dUmYsorc2qLhdYgSiOVK+m7WXgcYTKZevGWZ7TLAgTZvMelCTvhNq8xnf8FR1IdTbg== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/cache" "^10.0.17" - "@emotion/css" "^10.0.14" - "@emotion/serialize" "^0.11.10" - "@emotion/sheet" "0.9.3" - "@emotion/utils" "0.11.2" - -"@emotion/css@^10.0.14", "@emotion/css@^10.0.9": - version "10.0.14" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.14.tgz#95dacabdd0e22845d1a1b0b5968d9afa34011139" - integrity sha512-MozgPkBEWvorcdpqHZE5x1D/PLEHUitALQCQYt2wayf4UNhpgQs2tN0UwHYS4FMy5ROBH+0ALyCFVYJ/ywmwlg== - dependencies: - "@emotion/serialize" "^0.11.8" - "@emotion/utils" "0.11.2" - babel-plugin-emotion "^10.0.14" - -"@emotion/hash@0.8.0": +"@emotion/hash@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== +"@emotion/memoize@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" + integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== -"@emotion/serialize@^0.11.10", "@emotion/serialize@^0.11.16", "@emotion/serialize@^0.11.8": - version "0.11.16" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" - integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg== +"@emotion/react@^11.1.1": + version "11.1.4" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.1.4.tgz#ddee4247627ff7dd7d0c6ae52f1cfd6b420357d2" + integrity sha512-9gkhrW8UjV4IGRnEe4/aGPkUxoGS23aD9Vu6JCGfEDyBYL+nGkkRBoMFGAzCT9qFdyUvQp4UUtErbKWxq/JS4A== dependencies: - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/unitless" "0.7.5" - "@emotion/utils" "0.11.3" - csstype "^2.5.7" + "@babel/runtime" "^7.7.2" + "@emotion/cache" "^11.1.3" + "@emotion/serialize" "^1.0.0" + "@emotion/sheet" "^1.0.1" + "@emotion/utils" "^1.0.0" + "@emotion/weak-memoize" "^0.2.5" + hoist-non-react-statics "^3.3.1" -"@emotion/sheet@0.9.3": - version "0.9.3" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.3.tgz#689f135ecf87d3c650ed0c4f5ddcbe579883564a" - integrity sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A== +"@emotion/serialize@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.0.tgz#1a61f4f037cf39995c97fc80ebe99abc7b191ca9" + integrity sha512-zt1gm4rhdo5Sry8QpCOpopIUIKU+mUSpV9WNmFILUraatm5dttNEaYzUWWSboSMUE6PtN2j1cAsuvcugfdI3mw== + dependencies: + "@emotion/hash" "^0.8.0" + "@emotion/memoize" "^0.7.4" + "@emotion/unitless" "^0.7.5" + "@emotion/utils" "^1.0.0" + csstype "^3.0.2" -"@emotion/stylis@0.8.4": - version "0.8.4" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.4.tgz#6c51afdf1dd0d73666ba09d2eb6c25c220d6fe4c" - integrity sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ== +"@emotion/sheet@^1.0.0", "@emotion/sheet@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.1.tgz#245f54abb02dfd82326e28689f34c27aa9b2a698" + integrity sha512-GbIvVMe4U+Zc+929N1V7nW6YYJtidj31lidSmdYcWozwoBIObXBnaJkKNDjZrLm9Nc0BR+ZyHNaRZxqNZbof5g== -"@emotion/unitless@0.7.5": +"@emotion/unitless@^0.7.5": version "0.7.5" resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@emotion/utils@0.11.2": - version "0.11.2" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.2.tgz#713056bfdffb396b0a14f1c8f18e7b4d0d200183" - integrity sha512-UHX2XklLl3sIaP6oiMmlVzT0J+2ATTVpf0dHQVyPJHTkOITvXfaSqnRk6mdDhV9pR8T/tHc3cex78IKXssmzrA== +"@emotion/utils@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af" + integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA== -"@emotion/utils@0.11.3": - version "0.11.3" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924" - integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== +"@emotion/weak-memoize@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@emotion/weak-memoize@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.4.tgz#622a72bebd1e3f48d921563b4b60a762295a81fc" - integrity sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA== - -"@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.20" minimatch "^3.0.4" strip-json-comments "^3.1.1" @@ -1143,6 +1175,20 @@ resolved "https://registry.yarnpkg.com/@github/webauthn-json/-/webauthn-json-0.5.7.tgz#143bc67f6e0f75f8d188e565741507bb08c31214" integrity sha512-SUYsttDxFSvWvvJssJpwzjmRCqYfdfqC9VCmAHQYfdKCVelyJteCHo9/lK1CB72mx/jrl6cFNY08aua4J2jIyg== +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1159,162 +1205,160 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== +"@jest/console@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.4.6.tgz#0742e6787f682b22bdad56f9db2a8a77f6a86107" + integrity sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.4.6" + jest-util "^27.4.2" slash "^3.0.0" -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== +"@jest/core@^27.4.7": + version "27.4.7" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.7.tgz#84eabdf42a25f1fa138272ed229bcf0a1b5e6913" + integrity sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg== dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.4.6" + "@jest/reporters" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" + emittery "^0.8.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" + jest-changed-files "^27.4.2" + jest-config "^27.4.7" + jest-haste-map "^27.4.6" + jest-message-util "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-resolve-dependencies "^27.4.6" + jest-runner "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + jest-validate "^27.4.6" + jest-watcher "^27.4.6" + micromatch "^4.0.4" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== +"@jest/environment@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.4.6.tgz#1e92885d64f48c8454df35ed9779fbcf31c56d8b" + integrity sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg== dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^26.6.2" + jest-mock "^27.4.6" -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== +"@jest/fake-timers@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.4.6.tgz#e026ae1671316dbd04a56945be2fa251204324e8" + integrity sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A== dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" + "@jest/types" "^27.4.2" + "@sinonjs/fake-timers" "^8.0.1" "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.4.6" + jest-mock "^27.4.6" + jest-util "^27.4.2" -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== +"@jest/globals@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.4.6.tgz#3f09bed64b0fd7f5f996920258bd4be8f52f060a" + integrity sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw== dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" + "@jest/environment" "^27.4.6" + "@jest/types" "^27.4.2" + expect "^27.4.6" -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== +"@jest/reporters@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.6.tgz#b53dec3a93baf9b00826abf95b932de919d6d8dd" + integrity sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" graceful-fs "^4.2.4" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" + istanbul-reports "^3.1.3" + jest-haste-map "^27.4.6" + jest-resolve "^27.4.6" + jest-util "^27.4.2" + jest-worker "^27.4.6" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" + v8-to-istanbul "^8.1.0" -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== +"@jest/source-map@^27.4.0": + version "27.4.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.4.0.tgz#2f0385d0d884fb3e2554e8f71f8fa957af9a74b6" + integrity sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ== dependencies: callsites "^3.0.0" graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== +"@jest/test-result@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.4.6.tgz#b3df94c3d899c040f602cea296979844f61bdf69" + integrity sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ== dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.4.6" + "@jest/types" "^27.4.2" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== +"@jest/test-sequencer@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz#447339b8a3d7b5436f50934df30854e442a9d904" + integrity sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw== dependencies: - "@jest/test-result" "^26.6.2" + "@jest/test-result" "^27.4.6" graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" + jest-haste-map "^27.4.6" + jest-runtime "^27.4.6" -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== +"@jest/transform@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.6.tgz#153621940b1ed500305eacdb31105d415dc30231" + integrity sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" + "@jest/types" "^27.4.2" + babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" + jest-haste-map "^27.4.6" + jest-regex-util "^27.4.0" + jest-util "^27.4.2" + micromatch "^4.0.4" + pirates "^4.0.4" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" @@ -1329,17 +1373,47 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== +"@jest/types@^27.0.2", "@jest/types@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5" + integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^15.0.0" + "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@node-redis/bloom@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@node-redis/bloom/-/bloom-1.0.1.tgz#144474a0b7dc4a4b91badea2cfa9538ce0a1854e" + integrity sha512-mXEBvEIgF4tUzdIN89LiYsbi6//EdpFA7L8M+DHCvePXg+bfHWi+ct5VI6nHUFQE5+ohm/9wmgihCH3HSkeKsw== + +"@node-redis/client@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@node-redis/client/-/client-1.0.2.tgz#7f09fb739675728fbc6e73536f7cd1be99bf7b8f" + integrity sha512-C+gkx68pmTnxfV+y4pzasvCH3s4UGHNOAUNhdJxGI27aMdnXNDZct7ffDHBL7bAZSGv9FSwCP5PeYvEIEKGbiA== + dependencies: + cluster-key-slot "1.1.0" + generic-pool "3.8.2" + redis-parser "3.0.0" + yallist "4.0.0" + +"@node-redis/json@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@node-redis/json/-/json-1.0.2.tgz#8ad2d0f026698dc1a4238cc3d1eb099a3bee5ab8" + integrity sha512-qVRgn8WfG46QQ08CghSbY4VhHFgaTY71WjpwRBGEuqGPfWwfRcIf3OqSpR7Q/45X+v3xd8mvYjywqh0wqJ8T+g== + +"@node-redis/search@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@node-redis/search/-/search-1.0.2.tgz#8cfc91006ea787df801d41410283e1f59027f818" + integrity sha512-gWhEeji+kTAvzZeguUNJdMSZNH2c5dv3Bci8Nn2f7VGuf6IvvwuZDSBOuOlirLVgayVuWzAG7EhwaZWK1VDnWQ== + +"@node-redis/time-series@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@node-redis/time-series/-/time-series-1.0.1.tgz#703149f8fa4f6fff377c61a0873911e7c1ba5cc3" + integrity sha512-+nTn6EewVj3GlUXPuD3dgheWqo219jTxlo6R+pg24OeVvFHx9aFGGiyOgj3vBPhWUdRZ0xMcujXV5ki4fbLyMw== + "@npmcli/move-file@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464" @@ -1352,10 +1426,10 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz#aeb16f50649a91af79dbe36574b66d0f9e4d9f71" integrity sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA== -"@rails/ujs@^6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.1.tgz#25c4e60018274b37e5ba0850134f6445429de2f5" - integrity sha512-uF6zEbXpGkNa7Vvxrd9Yqas8xsbc3lsC733V6I7fXgPuj8xXiuZakdE4uIyQSFRVmZKe12qmC6CNJNtIEvt4bA== +"@rails/ujs@^6.1.4": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.4.tgz#093d5341595a02089ed309dec40f3c37da7b1b10" + integrity sha512-O3lEzL5DYbxppMdsFSw36e4BHIlfz/xusynwXGv3l2lhSlvah41qviRpsoAlKXxl37nZAqK+UUF5cnGGK45Mfw== "@sinonjs/commons@^1.7.0": version "1.8.1" @@ -1364,58 +1438,64 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== +"@sinonjs/fake-timers@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz#1c1c9a91419f804e59ae8df316a07dd1c3a76b94" + integrity sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew== dependencies: "@sinonjs/commons" "^1.7.0" -"@testing-library/dom@^7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.28.1.tgz#dea78be6e1e6db32ddcb29a449e94d9700c79eb9" - integrity sha512-acv3l6kDwZkQif/YqJjstT3ks5aaI33uxGNVIQmdKzbZ2eMKgg3EV2tB84GDdc72k3Kjhl6mO8yUt6StVIdRDg== +"@testing-library/dom@^8.0.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.1.0.tgz#f8358b1883844ea569ba76b7e94582168df5370d" + integrity sha512-kmW9alndr19qd6DABzQ978zKQ+J65gU2Rzkl8hriIetPnwpesRaK4//jEQyYh8fEALmGhomD/LBQqt+o+DL95Q== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^4.2.0" aria-query "^4.2.2" chalk "^4.1.0" - dom-accessibility-api "^0.5.4" + dom-accessibility-api "^0.5.6" lz-string "^1.4.4" - pretty-format "^26.6.2" + pretty-format "^27.0.2" -"@testing-library/jest-dom@^5.11.9": - version "5.11.9" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.11.9.tgz#e6b3cd687021f89f261bd53cbe367041fbd3e975" - integrity sha512-Mn2gnA9d1wStlAIT2NU8J15LNob0YFBVjs2aEQ3j8rsfRQo+lAs7/ui1i2TGaJjapLmuNPLTsrm+nPjmZDwpcQ== +"@testing-library/jest-dom@^5.16.1": + version "5.16.1" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.1.tgz#3db7df5ae97596264a7da9696fe14695ba02e51f" + integrity sha512-ajUJdfDIuTCadB79ukO+0l8O+QwN0LiSxDaYUTI4LndbbUsGi6rWU1SCexXzBA2NSjlVB9/vbkasQIL3tmPBjw== dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" - aria-query "^4.2.2" + aria-query "^5.0.0" chalk "^3.0.0" css "^3.0.0" css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^11.2.3": - version "11.2.3" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.3.tgz#9971ede1c8465a231d7982eeca3c39fc362d5443" - integrity sha512-BirBUGPkTW28ULuCwIbYo0y2+0aavHczBT6N9r3LrsswEW3pg25l1wgoE7I8QBIy1upXWkwKpYdWY7NYYP0Bxw== +"@testing-library/react@^12.1.2": + version "12.1.2" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.2.tgz#f1bc9a45943461fa2a598bb4597df1ae044cfc76" + integrity sha512-ihQiEOklNyHIpo2Y8FREkyD1QAea054U0MVbwH1m8N9TxeFz+KoJ9LkqoKqJlzx2JDm56DVwaJ1r36JYxZM05g== dependencies: "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^7.28.1" + "@testing-library/dom" "^8.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/aria-query@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.3", "@types/babel__core@^7.1.7": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.3": + version "7.1.14" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" + integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1478,6 +1558,14 @@ dependencies: "@types/node" "*" +"@types/hoist-non-react-statics@^3.3.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" @@ -1533,26 +1621,57 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.1.tgz#56af902ad157e763f9ba63d671c39cda3193c835" integrity sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw== -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prettier@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.2.tgz#5bb52ee68d0f8efa9cc0099920e56be6cc4e37f3" - integrity sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA== +"@types/prettier@^2.1.5": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" + integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/react-redux@^7.1.20": + version "7.1.20" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.20.tgz#42f0e61ababb621e12c66c96dda94c58423bd7df" + integrity sha512-q42es4c8iIeTgcnB+yJgRTTzftv3eYYvCZOh1Ckn2eX/3o5TdsQYKUWpLoLuGlcY/p+VAhV9IOEZJcWk/vfkXw== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + +"@types/react-transition-group@^4.4.0": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" + integrity sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79" + integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" + integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + "@types/schema-utils@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/schema-utils/-/schema-utils-1.0.0.tgz#295d36f01e2cb8bc3207ca1d9a68e210db6b40cb" @@ -1582,6 +1701,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^16.0.0": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.3.tgz#4b6d35bb8e680510a7dc2308518a80ee1ef27e01" + integrity sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ== + dependencies: + "@types/yargs-parser" "*" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -1737,7 +1863,7 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -abab@^2.0.3: +abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== @@ -1800,10 +1926,17 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" - integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== +acorn@^8.0.4, acorn@^8.2.4: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88" + integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" aggregate-error@^3.0.0: version "3.1.0" @@ -1836,7 +1969,7 @@ ajv@^4.7.0: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1846,6 +1979,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" + integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -1873,10 +2016,10 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.11.0" -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= +ansi-html-community@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^2.0.0: version "2.1.1" @@ -1898,6 +2041,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -1918,6 +2066,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -1934,18 +2087,23 @@ anymatch@^3.0.3, anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== dependencies: delegates "^1.0.0" - readable-stream "^2.0.6" + readable-stream "^3.6.0" argparse@^1.0.7: version "1.0.10" @@ -1967,6 +2125,11 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" +aria-query@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" + integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1992,16 +2155,16 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.1, array-includes@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" - integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== +array-includes@^3.1.3, array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - get-intrinsic "^1.0.1" - is-string "^1.0.5" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" array-union@^1.0.1: version "1.0.2" @@ -2020,22 +2183,23 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== +array.prototype.flat@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.19.0" -array.prototype.flatmap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== +array.prototype.flatmap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.19.0" arrow-key-navigation@^1.2.0: version "1.2.0" @@ -2052,18 +2216,6 @@ asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - assert@^1.1.1: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" @@ -2119,40 +2271,30 @@ atrament@0.2.4: resolved "https://registry.yarnpkg.com/atrament/-/atrament-0.2.4.tgz#6f78196edfcd194e568b7c0b9c88201ec371ac66" integrity sha512-hSA9VwW6COMwvRhSEO4uZweZ91YGOdHqwvslNyrJZG+8mzc4qx/qMsDZBuAeXFeWZO/QKtRjIXguOUy1aNMl3A== -autoprefixer@^9.8.6: - version "9.8.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== +autoprefixer@^9.8.8: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== dependencies: browserslist "^4.12.0" caniuse-lite "^1.0.30001109" - colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" + picocolors "^0.2.1" postcss "^7.0.32" postcss-value-parser "^4.1.0" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= +axe-core@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5" + integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA== -aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== - -axe-core@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.0.2.tgz#c7cf7378378a51fcd272d3c09668002a4990b1cb" - integrity sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA== - -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== dependencies: - follow-redirects "^1.10.0" + follow-redirects "^1.14.7" axobject-query@^2.2.0: version "2.2.0" @@ -2171,24 +2313,24 @@ babel-eslint@^10.1.0: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== +babel-jest@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.6.tgz#4d024e69e241cdf4f396e453a07100f44f7ce314" + integrity sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg== dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.4.0" chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" -babel-loader@^8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" - integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== +babel-loader@^8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== dependencies: find-cache-dir "^3.3.1" loader-utils "^1.4.0" @@ -2202,37 +2344,21 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-emotion@^10.0.14: - version "10.0.33" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz#ce1155dcd1783bbb9286051efee53f4e2be63e03" - integrity sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/serialize" "^0.11.16" - babel-plugin-macros "^2.0.0" - babel-plugin-syntax-jsx "^6.18.0" - convert-source-map "^1.5.0" - escape-string-regexp "^1.0.5" - find-root "^1.1.0" - source-map "^0.5.7" - -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== +babel-plugin-jest-hoist@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz#d7831fc0f93573788d80dee7e682482da4c730d6" + integrity sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2250,7 +2376,7 @@ babel-plugin-lodash@^3.3.4: lodash "^4.17.10" require-package-name "^2.0.1" -babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.8.0: +babel-plugin-macros@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== @@ -2259,6 +2385,30 @@ babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.8.0: cosmiconfig "^6.0.0" resolve "^1.12.0" +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" + integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.20.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + babel-plugin-preval@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-preval/-/babel-plugin-preval-5.0.0.tgz#6cabb947ecc241664966e1f99eb56a3b4bb63d1e" @@ -2281,11 +2431,6 @@ babel-plugin-react-intl@^6.2.0: intl-messageformat-parser "^4.1.1" schema-utils "^2.2.0" -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" @@ -2309,12 +2454,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== +babel-preset-jest@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz#70d0e676a282ccb200fbabd7f415db5fdf393bca" + integrity sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg== dependencies: - babel-plugin-jest-hoist "^26.6.2" + babel-plugin-jest-hoist "^27.4.0" babel-preset-current-node-syntax "^1.0.0" babel-runtime@^6.26.0: @@ -2353,13 +2498,6 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -2392,41 +2530,41 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -blurhash@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.3.tgz#dc325af7da836d07a0861d830bdd63694382483e" - integrity sha512-yUhPJvXexbqbyijCIE/T2NCXcj9iNPhWmOKbPTuR/cm7Q5snXYIfnVnz6m7MWOXxODMz/Cr3UcVkRdHiuDVRDw== +blurhash@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.4.tgz#a7010ceb3019cd2c9809b17c910ebf6175d29244" + integrity sha512-MXIPz6zwYUKayju+Uidf83KhH0vodZfeRl6Ich8Gu+KGl0JgKiFq9LsfqV7cVU5fKD/AotmduZqvOfrGKOfTaA== bmp-js@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.1.1: version "5.1.3" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" + integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== dependencies: - bytes "3.1.0" + bytes "3.1.1" content-type "~1.0.4" debug "2.6.9" depd "~1.1.2" - http-errors "1.7.2" + http-errors "1.8.1" iconv-lite "0.4.24" on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + qs "6.9.6" + raw-body "2.4.2" + type-is "~1.6.18" bonjour@^3.5.0: version "3.5.0" @@ -2483,7 +2621,7 @@ bricks.js@^1.7.0: dependencies: knot.js "^1.1.5" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -2555,36 +2693,37 @@ browserify-zlib@^0.2.0: pako "~1.0.5" browserslist@^4.0.0, browserslist@^4.12.0: - version "4.14.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" - integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001135" - electron-to-chromium "^1.3.571" - escalade "^3.1.0" - node-releases "^1.1.61" - -browserslist@^4.14.5: - version "4.14.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.7.tgz#c071c1b3622c1c2e790799a37bb09473a4351cb6" - integrity sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ== - dependencies: - caniuse-lite "^1.0.30001157" - colorette "^1.2.1" - electron-to-chromium "^1.3.591" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" escalade "^3.1.1" - node-releases "^1.1.66" + node-releases "^1.1.71" -browserslist@^4.15.0: - version "4.16.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.0.tgz#410277627500be3cb28a1bfe037586fbedf9488b" - integrity sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ== +browserslist@^4.17.5: + version "4.17.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.5.tgz#c827bbe172a4c22b123f5e337533ceebadfdd559" + integrity sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA== dependencies: - caniuse-lite "^1.0.30001165" - colorette "^1.2.1" - electron-to-chromium "^1.3.621" + caniuse-lite "^1.0.30001271" + electron-to-chromium "^1.3.878" escalade "^3.1.1" - node-releases "^1.1.67" + node-releases "^2.0.1" + picocolors "^1.0.0" + +browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" bser@2.1.1: version "2.1.1" @@ -2603,10 +2742,10 @@ buffer-indexof@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== -buffer-writer@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08" - integrity sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg= +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== buffer-xor@^1.0.3: version "1.0.3" @@ -2622,6 +2761,13 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +bufferutil@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + dependencies: + node-gyp-build "^4.3.0" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -2632,10 +2778,10 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== cacache@^12.0.2: version "12.0.4" @@ -2696,13 +2842,13 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -call-bind@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" - integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" - get-intrinsic "^1.0.0" + get-intrinsic "^1.0.2" caller-callsite@^2.0.0: version "2.0.0" @@ -2745,7 +2891,7 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0: +camelcase@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== @@ -2760,32 +2906,20 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: - version "1.0.30001143" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001143.tgz#560f2cfb9f313d1d7e52eb8dac0e4e36c8821c0d" - integrity sha512-p/PO5YbwmCpBJPxjOiKBvAlUPgF8dExhfEpnsH+ys4N/791WHrYrGg0cyHiAURl5hSbx5vIcjKmQAP6sHDYH3w== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== -caniuse-lite@^1.0.30001157: - version "1.0.30001159" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz#bebde28f893fa9594dadcaa7d6b8e2aa0299df20" - integrity sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA== +caniuse-lite@^1.0.30001271: + version "1.0.30001274" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz#26ca36204d15b17601ba6fc35dbdad950a647cc7" + integrity sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew== -caniuse-lite@^1.0.30001165: - version "1.0.30001171" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001171.tgz#3291e11e02699ad0a29e69b8d407666fc843eba7" - integrity sha512-5Alrh8TTYPG9IH4UkRqEBZoEToWRLvPbSQokvzSz0lii8/FOWKG4keO1HoYfPWs8IF/NH/dyNPg1cmJGvV3Zlg== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +caniuse-lite@^1.0.30001286: + version "1.0.30001300" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz#11ab6c57d3eb6f964cba950401fd00a146786468" + integrity sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA== chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" @@ -2828,10 +2962,10 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" - integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -2839,9 +2973,9 @@ char-regex@^1.0.2: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.5.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.1" chokidar@^2.1.8: version "2.1.8" @@ -2879,10 +3013,10 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -2897,10 +3031,10 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== +cjs-module-lexer@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz#2fd46d9906a126965aa541345c499aaa18e8cd73" + integrity sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw== class-utils@^0.3.5: version "0.3.6" @@ -2912,10 +3046,10 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== +classnames@^2.2.5, classnames@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== clean-stack@^2.0.0: version "2.2.0" @@ -2943,15 +3077,6 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.3.tgz#ef180f26c8d9bff3927ee52428bfec2090427981" @@ -2970,6 +3095,11 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +cluster-key-slot@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" + integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3032,13 +3162,18 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + color@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" @@ -3047,12 +3182,12 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3064,10 +3199,10 @@ commander@^2.20.0, commander@^2.8.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" - integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commondir@^1.0.1: version "1.0.1" @@ -3135,7 +3270,7 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: +console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= @@ -3145,24 +3280,19 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -3174,10 +3304,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== copy-concurrently@^1.0.0: version "1.0.5" @@ -3196,12 +3326,12 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.8.0: - version "3.8.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.1.tgz#8d1ddd341d660ba6194cbe0ce60f4c794c87a36e" - integrity sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ== +core-js-compat@^3.20.0, core-js-compat@^3.20.2: + version "3.20.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" + integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== dependencies: - browserslist "^4.15.0" + browserslist "^4.19.1" semver "7.0.0" core-js-pure@^3.0.0: @@ -3214,7 +3344,12 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-js@^2.5.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= @@ -3289,7 +3424,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3360,23 +3495,21 @@ css-list-helpers@^1.0.1: dependencies: tcomb "^2.5.0" -css-loader@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.1.tgz#9e4de0d6636a6266a585bd0900b422c85539d25f" - integrity sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw== +css-loader@^5.2.7: + version "5.2.7" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== dependencies: - camelcase "^6.2.0" - cssesc "^3.0.0" - icss-utils "^5.0.0" + icss-utils "^5.1.0" loader-utils "^2.0.0" - postcss "^8.1.4" + postcss "^8.2.15" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.1.0" schema-utils "^3.0.0" - semver "^7.3.2" + semver "^7.3.5" css-select-base-adapter@^0.1.1: version "0.1.1" @@ -3438,10 +3571,10 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== +cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" @@ -3471,7 +3604,7 @@ cssnano-preset-default@^4.0.7: postcss-ordered-values "^4.1.2" postcss-reduce-initial "^4.0.3" postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" + postcss-svgo "^4.0.3" postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: @@ -3496,13 +3629,13 @@ cssnano-util-same-parent@^4.0.0: resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== -cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== +cssnano@^4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== dependencies: cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" + cssnano-preset-default "^4.0.8" is-resolvable "^1.0.0" postcss "^7.0.0" @@ -3523,18 +3656,23 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.2.0: +cssstyle@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" -csstype@^2.5.7, csstype@^2.6.7: +csstype@^2.6.7: version "2.6.13" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f" integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A== +csstype@^3.0.2: + version "3.0.6" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.6.tgz#865d0b5833d7d8d40f4e5b8a6d76aea3de4725ef" + integrity sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw== + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -3548,17 +3686,10 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" -damerau-levenshtein@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" - integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" +damerau-levenshtein@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== data-urls@^2.0.0: version "2.0.0" @@ -3576,26 +3707,26 @@ debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.1.1, debug@^3.2.6: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decimal.js@^10.2.0: +decimal.js@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== @@ -3605,6 +3736,11 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + deep-equal@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" @@ -3627,7 +3763,7 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@^4.2.2: +deepmerge@^4.0, deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== @@ -3692,11 +3828,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -denque@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" - integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3720,6 +3851,11 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +detect-it@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/detect-it/-/detect-it-4.0.1.tgz#3f8de6b8330f5086270571251bedf10aec049e18" + integrity sha512-dg5YBTJYvogK1+dA2mBUDKzOWfYZtHVba89SyZUhc4+e3i2tzgjANFg5lDRCd3UOtRcw00vUTMK8LELcMdicug== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3730,20 +3866,22 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -detect-passive-events@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/detect-passive-events/-/detect-passive-events-2.0.2.tgz#229d02a20c47371194a2def84144c07d83e324c2" - integrity sha512-Ru7Eiz+pCy++QpqaNOgaIjlM0PzxEsh3Etg3wtntNhW2r3H1/8KkcR8bX9ApPIZChiNO2Pz//60uUg29DPNh3Q== +detect-passive-events@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-passive-events/-/detect-passive-events-2.0.3.tgz#1f75ebf80660a66c615d8be23c3241cdda6977e0" + integrity sha512-QN/1X65Axis6a9D8qg8Py9cwY/fkWAmAH/edTbmLMcv4m5dboLJ7LcAi8CfaCON2tjk904KwKX/HTdsHC6yeRg== + dependencies: + detect-it "^4.0.1" diff-sequences@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +diff-sequences@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" + integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== diffie-hellman@^5.0.0: version "5.0.3" @@ -3760,9 +3898,9 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -3774,7 +3912,7 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" -doctrine@1.5.0, doctrine@^1.2.2: +doctrine@^1.2.2: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= @@ -3796,10 +3934,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" - integrity sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ== +dom-accessibility-api@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz#3f5d43b52c7a3bd68b5fb63fa47b4e4c1fdf65a9" + integrity sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw== dom-helpers@^3.2.1, dom-helpers@^3.4.0: version "3.4.0" @@ -3861,10 +3999,10 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -dotenv@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== duplexer@^0.1.2: version "0.1.2" @@ -3881,14 +4019,6 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3899,42 +4029,47 @@ ejs@^2.3.4: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.571: - version "1.3.574" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.574.tgz#bdd87f62fe70165e5c862a0acf0cee9889e23aa3" - integrity sha512-kF8Bfe1h8X1pPwlw6oRoIXj0DevowviP6fl0wcljm+nZjy/7+Fos4THo1N/7dVGEJlyEqK9C8qNnbheH+Eazfw== +electron-to-chromium@^1.3.723: + version "1.3.736" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz#f632d900a1f788dab22fec9c62ec5c9c8f0c4052" + integrity sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig== -electron-to-chromium@^1.3.591: - version "1.3.603" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz#1b71bec27fb940eccd79245f6824c63d5f7e8abf" - integrity sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ== +electron-to-chromium@^1.3.878: + version "1.3.886" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.886.tgz#ac039c4001b665b1dd0f0ed9c2e4da90ff3c9267" + integrity sha512-+vYdeBosI63VkCtNWnEVFjgNd/IZwvnsWkKyPtWAvrhA+XfByKoBJcbsMgudVU/bUcGAF9Xp3aXn96voWlc3oQ== -electron-to-chromium@^1.3.621: - version "1.3.633" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.633.tgz#16dd5aec9de03894e8d14a1db4cda8a369b9b7fe" - integrity sha512-bsVCsONiVX1abkWdH7KtpuDAhsQ3N3bjPYhROSAXE78roJKet0Y5wznA14JE9pzbwSZmSMAW6KiKYf1RvbTJkA== +electron-to-chromium@^1.4.17: + version "1.4.47" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.47.tgz#5d5535cdbca2b9264abee4d6ea121995e9554bbe" + integrity sha512-ZHc8i3/cgeCRK/vC7W2htAG6JqUmOUgDNn/f9yY9J8UjfLjwzwOVEt4MWmgJAdvmxyrsR5KIFA/6+kUHGY0eUA== elliptic@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" -emittery@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" - integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== -emoji-mart@Gargron/emoji-mart#build: - version "2.6.3" - resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/934f314fd8322276765066e8a2a6be5bac61b1cf" +"emoji-mart@npm:emoji-mart-lazyload": + version "3.0.1-j" + resolved "https://registry.npmjs.org/emoji-mart-lazyload/-/emoji-mart-lazyload-3.0.1-j.tgz#87a90d30b79d9145ece078d53e3e683c1a10ce9c" + integrity sha512-0wKF7MR0/iAeCIoiBLY+JjXCugycTgYRC2SL0y9/bjNSQlbeMdzILmPQJAufU/mgLFDUitOvjxLDhOZ9yxZ48g== + dependencies: + "@babel/runtime" "^7.0.0" + intersection-observer "^0.12.0" + prop-types "^15.6.0" emoji-regex@^7.0.1: version "7.0.3" @@ -3946,10 +4081,10 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4" - integrity sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^2.0.0: version "2.1.0" @@ -4001,7 +4136,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -4015,40 +4150,31 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1, es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -4126,7 +4252,7 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escalade@^3.1.0, escalade@^3.1.1: +escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== @@ -4146,13 +4272,18 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.14.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: @@ -4168,79 +4299,83 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz#1d0aa455dcf41052339b63cada8ab5fd57577129" + integrity sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-import@~2.25.4: + version "2.25.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" + integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" debug "^2.6.9" - resolve "^1.13.1" - -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-import@~2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-jsx-a11y@~6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" - integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== - dependencies: - "@babel/runtime" "^7.11.2" - aria-query "^4.2.2" - array-includes "^3.1.1" - ast-types-flow "^0.0.7" - axe-core "^4.0.2" - axobject-query "^2.2.0" - damerau-levenshtein "^1.0.6" - emoji-regex "^9.0.0" - has "^1.0.3" - jsx-ast-utils "^3.1.0" - language-tags "^1.0.5" - -eslint-plugin-promise@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" - integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== - -eslint-plugin-react@~7.22.0: - version "7.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" - integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== - dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.2" has "^1.0.3" + is-core-module "^2.8.0" + is-glob "^4.0.3" + minimatch "^3.0.4" + object.values "^1.1.5" + resolve "^1.20.0" + tsconfig-paths "^3.12.0" + +eslint-plugin-jsx-a11y@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" + integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== + dependencies: + "@babel/runtime" "^7.16.3" + aria-query "^4.2.2" + array-includes "^3.1.4" + ast-types-flow "^0.0.7" + axe-core "^4.3.5" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.7" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.2.1" + language-tags "^1.0.5" + minimatch "^3.0.4" + +eslint-plugin-promise@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" + integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== + +eslint-plugin-react@~7.28.0: + version "7.28.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz#8f3ff450677571a659ce76efc6d80b6a525adbdf" + integrity sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw== + dependencies: + array-includes "^3.1.4" + array.prototype.flatmap "^1.2.5" + doctrine "^2.1.0" + estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" + minimatch "^3.0.4" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.0" + object.values "^1.1.5" prop-types "^15.7.2" - resolve "^1.18.1" - string.prototype.matchall "^4.0.2" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.6" eslint-scope@^4.0.3: version "4.0.3" @@ -4314,29 +4449,32 @@ eslint@^2.7.0: text-table "~0.2.0" user-home "^2.0.0" -eslint@^7.18.0: - version "7.18.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.18.0.tgz#7fdcd2f3715a41fe6295a16234bd69aed2c75e67" - integrity sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ== +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.3.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" - esquery "^1.2.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^6.0.0" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -4344,7 +4482,7 @@ eslint@^7.18.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.20" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -4353,7 +4491,7 @@ eslint@^7.18.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.4" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -4379,10 +4517,10 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" @@ -4398,10 +4536,10 @@ estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -4446,11 +4584,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -4464,19 +4597,19 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.0.0" exif-js@^2.3.0: @@ -4514,29 +4647,27 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== +expect@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.4.6.tgz#f335e128b0335b6ceb4fcab67ece7cbd14c942e6" + integrity sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag== dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" + "@jest/types" "^27.4.2" + jest-get-type "^27.4.0" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== +express@^4.17.1, express@^4.17.2: + version "4.17.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" + integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== dependencies: accepts "~1.3.7" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.19.1" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.4.1" cookie-signature "1.0.6" debug "2.6.9" depd "~1.1.2" @@ -4550,13 +4681,13 @@ express@^4.17.1: on-finished "~2.3.0" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.9.6" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" + safe-buffer "5.2.1" + send "0.17.2" + serve-static "1.14.2" + setprototypeof "1.2.0" statuses "~1.5.0" type-is "~1.6.18" utils-merge "1.0.1" @@ -4584,11 +4715,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -4603,17 +4729,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -4668,10 +4784,10 @@ file-entry-cache@^1.1.1: flat-cache "^1.2.1" object-assign "^4.0.1" -file-entry-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" - integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" @@ -4741,12 +4857,7 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -4809,10 +4920,10 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0, follow-redirects@^1.10.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" - integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.14.7" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" + integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== font-awesome@^4.7.0: version "4.7.0" @@ -4824,24 +4935,19 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fragment-cache@^0.2.1: version "0.2.1" @@ -4918,10 +5024,10 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@^2.1.2, fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@^2.3.2, fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -4933,19 +5039,20 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= +gauge@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.0.tgz#afba07aa0374a93c6219603b1fb83eaa2264d8f8" + integrity sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw== dependencies: - aproba "^1.0.3" + ansi-regex "^5.0.1" + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" + has-unicode "^2.0.1" signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" generate-function@^2.0.0: version "2.3.1" @@ -4961,25 +5068,25 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" -generic-pool@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.3.tgz#780c36f69dfad05a5a045dd37be7adca11a4f6ff" - integrity sha1-eAw29p360FpaBF3Te+etyhGk9v8= +generic-pool@3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.8.2.tgz#aab4f280adb522fdfbdc5e5b64d718d3683f04e9" + integrity sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg== -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.0, get-intrinsic@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" - integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -4997,25 +5104,24 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: - pump "^3.0.0" + call-bind "^1.0.2" + get-intrinsic "^1.1.1" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -5024,17 +5130,29 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== +glob-parent@^5.1.2, glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~7.1.1: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5084,12 +5202,12 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" - integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== +globals@^13.6.0, globals@^13.9.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" + integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" globals@^9.2.0: version "9.18.0" @@ -5128,11 +5246,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -5145,19 +5258,6 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -5165,6 +5265,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -5185,7 +5290,19 @@ has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-unicode@^2.0.0: +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= @@ -5273,7 +5390,7 @@ history@^4.7.2: value-equal "^0.4.0" warning "^3.0.0" -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -5287,7 +5404,7 @@ hoist-non-react-statics@^2.5.0: resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -5301,11 +5418,6 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -5326,11 +5438,6 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -5353,16 +5460,16 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" + inherits "2.0.4" + setprototypeof "1.2.0" statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + toidentifier "1.0.1" http-errors@~1.6.2: version "1.6.3" @@ -5374,17 +5481,6 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-link-header@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.0.3.tgz#abbc2cdc5e06dd7e196a4983adac08a2d085ec90" @@ -5400,6 +5496,15 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-proxy-middleware@0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" @@ -5419,24 +5524,23 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@0.4.24: version "0.4.24" @@ -5445,10 +5549,10 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -icss-utils@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.0.0.tgz#03ed56c3accd32f9caaf1752ebf64ef12347bb84" - integrity sha512-aF2Cf/CkEZrI/vsu5WI/I+akFgdbwQHVE9YRZxATrhH4PVIe6a3BIjwjEcW+z+jP/hNh+YvM3lAAn1wJQ6opSg== +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== idb-keyval@^3.2.0: version "3.2.0" @@ -5475,10 +5579,10 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -immutable@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== import-cwd@^2.0.0: version "2.1.0" @@ -5611,14 +5715,14 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - es-abstract "^1.17.0-next.1" + get-intrinsic "^1.1.0" has "^1.0.3" - side-channel "^1.0.2" + side-channel "^1.0.4" interpret@^1.4.0: version "1.4.0" @@ -5732,6 +5836,11 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -5746,17 +5855,22 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-callable@^1.1.4, is-callable@^1.2.2: +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + +is-callable@^1.1.4: version "1.2.2" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" +is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-color-stop@^1.0.0: version "1.1.0" @@ -5770,10 +5884,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" - integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== +is-core-module@^2.2.0, is-core-module@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== dependencies: has "^1.0.3" @@ -5819,11 +5933,6 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= -is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== - is-electron@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0" @@ -5875,10 +5984,10 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -5906,10 +6015,15 @@ is-nan@^1.3.2: call-bind "^1.0.0" define-properties "^1.1.3" -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== is-number@^3.0.0: version "3.0.0" @@ -5954,10 +6068,10 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-property@^1.0.0, is-property@^1.0.2: version "1.0.2" @@ -5971,18 +6085,24 @@ is-regex@^1.0.4: dependencies: has-symbols "^1.0.1" -is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - has-symbols "^1.0.1" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -5993,17 +6113,12 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: - html-comment-regex "^1.1.0" + has-tostringtag "^1.0.0" is-symbol@^1.0.2: version "1.0.3" @@ -6012,7 +6127,14 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -6022,6 +6144,13 @@ is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6032,13 +6161,6 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -6066,24 +6188,25 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - istanbul-lib-coverage@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== +istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== dependencies: - "@babel/core" "^7.7.5" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" + istanbul-lib-coverage "^3.2.0" semver "^6.3.0" istanbul-lib-report@^3.0.0: @@ -6104,65 +6227,93 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== +istanbul-reports@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" + integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== +jest-changed-files@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.4.2.tgz#da2547ea47c6e6a5f6ed336151bd2075736eb4a5" + integrity sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A== dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" + "@jest/types" "^27.4.2" + execa "^5.0.0" + throat "^6.0.1" -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== +jest-circus@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.6.tgz#d3af34c0eb742a967b1919fbb351430727bcea6c" + integrity sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ== dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.4.6" + is-generator-fn "^2.0.0" + jest-each "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + pretty-format "^27.4.6" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.4.7: + version "27.4.7" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.7.tgz#d00e759e55d77b3bcfea0715f527c394ca314e5a" + integrity sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw== + dependencies: + "@jest/core" "^27.4.7" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-config "^27.4.7" + jest-util "^27.4.2" + jest-validate "^27.4.6" prompts "^2.0.1" - yargs "^15.4.1" + yargs "^16.2.0" -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== +jest-config@^27.4.7: + version "27.4.7" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.7.tgz#4f084b2acbd172c8b43aa4cdffe75d89378d3972" + integrity sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.4.6" + "@jest/types" "^27.4.2" + babel-jest "^27.4.6" chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" + jest-circus "^27.4.6" + jest-environment-jsdom "^27.4.6" + jest-environment-node "^27.4.6" + jest-get-type "^27.4.0" + jest-jasmine2 "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-runner "^27.4.6" + jest-util "^27.4.2" + jest-validate "^27.4.6" + micromatch "^4.0.4" + pretty-format "^27.4.6" + slash "^3.0.0" jest-diff@^25.2.1: version "25.5.0" @@ -6174,153 +6325,151 @@ jest-diff@^25.2.1: jest-get-type "^25.2.6" pretty-format "^25.5.0" -jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== +jest-diff@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d" + integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w== dependencies: chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + diff-sequences "^27.4.0" + jest-get-type "^27.4.0" + pretty-format "^27.4.6" -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== +jest-docblock@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.4.0.tgz#06c78035ca93cbbb84faf8fce64deae79a59f69f" + integrity sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg== dependencies: detect-newline "^3.0.0" -jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== +jest-each@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.4.6.tgz#e7e8561be61d8cc6dbf04296688747ab186c40ff" + integrity sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" + jest-get-type "^27.4.0" + jest-util "^27.4.2" + pretty-format "^27.4.6" -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== +jest-environment-jsdom@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz#c23a394eb445b33621dfae9c09e4c8021dea7b36" + integrity sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" + jest-mock "^27.4.6" + jest-util "^27.4.2" + jsdom "^16.6.0" -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== +jest-environment-node@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.4.6.tgz#ee8cd4ef458a0ef09d087c8cd52ca5856df90242" + integrity sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-mock "^27.4.6" + jest-util "^27.4.2" jest-get-type@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" + integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== +jest-haste-map@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.6.tgz#c60b5233a34ca0520f325b7e2cc0a0140ad0862a" + integrity sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" "@types/graceful-fs" "^4.1.2" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" + jest-regex-util "^27.4.0" + jest-serializer "^27.4.0" + jest-util "^27.4.2" + jest-worker "^27.4.6" + micromatch "^4.0.4" walker "^1.0.7" optionalDependencies: - fsevents "^2.1.2" + fsevents "^2.3.2" -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== +jest-jasmine2@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz#109e8bc036cb455950ae28a018f983f2abe50127" + integrity sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw== dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.4.6" + "@jest/source-map" "^27.4.0" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^26.6.2" + expect "^27.4.6" is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" + jest-each "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + pretty-format "^27.4.6" + throat "^6.0.1" -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== +jest-leak-detector@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz#ed9bc3ce514b4c582637088d9faf58a33bd59bf4" + integrity sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA== dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + jest-get-type "^27.4.0" + pretty-format "^27.4.6" -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== +jest-matcher-utils@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz#53ca7f7b58170638590e946f5363b988775509b8" + integrity sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA== dependencies: chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + jest-diff "^27.4.6" + jest-get-type "^27.4.0" + pretty-format "^27.4.6" -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== +jest-message-util@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.6.tgz#9fdde41a33820ded3127465e1a5896061524da31" + integrity sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA== dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.4.2" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" + micromatch "^4.0.4" + pretty-format "^27.4.6" slash "^3.0.0" - stack-utils "^2.0.2" + stack-utils "^2.0.3" -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== +jest-mock@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.4.6.tgz#77d1ba87fbd33ccb8ef1f061697e7341b7635195" + integrity sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -6328,158 +6477,163 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-regex-util@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca" + integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== +jest-resolve-dependencies@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz#fc50ee56a67d2c2183063f6a500cc4042b5e2327" + integrity sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw== dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" + "@jest/types" "^27.4.2" + jest-regex-util "^27.4.0" + jest-snapshot "^27.4.6" -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== +jest-resolve@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.6.tgz#2ec3110655e86d5bfcfa992e404e22f96b0b5977" + integrity sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" chalk "^4.0.0" graceful-fs "^4.2.4" + jest-haste-map "^27.4.6" jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" + jest-util "^27.4.2" + jest-validate "^27.4.6" + resolve "^1.20.0" + resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== +jest-runner@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.6.tgz#1d390d276ec417e9b4d0d081783584cbc3e24773" + integrity sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg== dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.4.6" + "@jest/environment" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" - emittery "^0.7.1" + emittery "^0.8.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" + jest-docblock "^27.4.0" + jest-environment-jsdom "^27.4.6" + jest-environment-node "^27.4.6" + jest-haste-map "^27.4.6" + jest-leak-detector "^27.4.6" + jest-message-util "^27.4.6" + jest-resolve "^27.4.6" + jest-runtime "^27.4.6" + jest-util "^27.4.2" + jest-worker "^27.4.6" source-map-support "^0.5.6" - throat "^5.0.0" + throat "^6.0.1" -jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== +jest-runtime@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.6.tgz#83ae923818e3ea04463b22f3597f017bb5a1cffa" + integrity sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ== dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/globals" "^27.4.6" + "@jest/source-map" "^27.4.0" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" chalk "^4.0.0" - cjs-module-lexer "^0.6.0" + cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - exit "^0.1.2" + execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-haste-map "^27.4.6" + jest-message-util "^27.4.6" + jest-mock "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.4.1" -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== +jest-serializer@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.4.0.tgz#34866586e1cae2388b7d12ffa2c7819edef5958a" + integrity sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ== dependencies: "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== +jest-snapshot@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.6.tgz#e2a3b4fff8bdce3033f2373b2e525d8b6871f616" + integrity sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ== dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^26.6.2" + expect "^27.4.6" graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" + jest-diff "^27.4.6" + jest-get-type "^27.4.0" + jest-haste-map "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-util "^27.4.2" natural-compare "^1.4.0" - pretty-format "^26.6.2" + pretty-format "^27.4.6" semver "^7.3.2" -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== +jest-util@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.4.2.tgz#ed95b05b1adfd761e2cda47e0144c6a58e05a621" + integrity sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" + ci-info "^3.2.0" graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" + picomatch "^2.2.3" -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== +jest-validate@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.4.6.tgz#efc000acc4697b6cf4fa68c7f3f324c92d0c4f1f" + integrity sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ== dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^27.4.2" + camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^26.3.0" + jest-get-type "^27.4.0" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^27.4.6" -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== +jest-watcher@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.4.6.tgz#673679ebeffdd3f94338c24f399b85efc932272d" + integrity sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw== dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.6.2" + jest-util "^27.4.2" string-length "^4.0.1" jest-worker@^26.5.0: @@ -6491,34 +6645,29 @@ jest-worker@^26.5.0: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== +jest-worker@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" + integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== dependencies: "@types/node" "*" merge-stream "^2.0.0" - supports-color "^7.0.0" + supports-color "^8.0.0" -jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== +jest@^27.4.7: + version "27.4.7" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.4.7.tgz#87f74b9026a1592f2da05b4d258e57505f28eca4" + integrity sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg== dependencies: - "@jest/core" "^26.6.3" + "@jest/core" "^27.4.7" import-local "^3.0.2" - jest-cli "^26.6.3" + jest-cli "^27.4.7" js-base64@^2.1.9: version "2.6.4" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== -js-string-escape@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6532,48 +6681,44 @@ js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^16.4.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" - integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== +jsdom@^16.6.0: + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== dependencies: - abab "^2.0.3" - acorn "^7.1.1" + abab "^2.0.5" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" - cssstyle "^2.2.0" + cssstyle "^2.3.0" data-urls "^2.0.0" - decimal.js "^10.2.0" + decimal.js "^10.2.1" domexception "^2.0.1" - escodegen "^1.14.1" + escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" - parse5 "5.1.1" - request "^2.88.2" - request-promise-native "^1.0.8" - saxes "^5.0.0" + parse5 "6.0.1" + saxes "^5.0.1" symbol-tree "^3.2.4" - tough-cookie "^3.0.1" + tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" w3c-xmlserializer "^2.0.0" webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - ws "^7.2.3" + whatwg-url "^8.5.0" + ws "^7.4.5" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -6596,10 +6741,10 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" @@ -6613,11 +6758,6 @@ json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - json3@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" @@ -6666,23 +6806,13 @@ jsonpointer@^4.0.0: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc" integrity sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg== -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz#642f1d7b88aa6d7eb9d8f2210e166478444fa891" - integrity sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA== - dependencies: - array-includes "^3.1.1" - object.assign "^4.1.1" + array-includes "^3.1.3" + object.assign "^4.1.2" keycode@^2.1.7: version "2.2.0" @@ -6752,29 +6882,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -line-column@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" - integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI= - dependencies: - isarray "^1.0.0" - isobject "^2.0.0" - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -6831,7 +6943,7 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lockfile@^1.0.4: +lockfile@^1.0: version "1.0.4" resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== @@ -6843,16 +6955,21 @@ lodash.capitalize@^4.1.0: resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.defaults@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= -lodash.escaperegexp@^4.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= - lodash.get@^4.0: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -6888,20 +7005,25 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.3.0, lodash@~4.17.10: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.3.0, lodash@^4.7.0, lodash@~4.17.10: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loglevel@^1.6.8: version "1.7.0" @@ -6973,10 +7095,10 @@ mark-loader@^0.1.6: resolved "https://registry.yarnpkg.com/mark-loader/-/mark-loader-0.1.6.tgz#0abb477dca7421d70e20128ff6489f5cae8676d5" integrity sha1-CrtHfcp0IdcOIBKP9kifXK6GdtU= -marky@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.1.tgz#a3fcf82ffd357756b8b8affec9fdbf3a30dc1b02" - integrity sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ== +marky@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.2.tgz#4456765b4de307a13d263a69b0c79bf226e68323" + integrity sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ== md5.js@^1.3.4: version "1.3.5" @@ -7062,13 +7184,13 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" - picomatch "^2.0.5" + picomatch "^2.2.3" miller-rabin@^4.0.0: version "4.0.1" @@ -7083,7 +7205,7 @@ mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== @@ -7115,10 +7237,10 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-css-extract-plugin@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.4.tgz#706e69632cdcdb8b15bf8e638442a0dba304a9c8" - integrity sha512-dNjqyeogUd8ucUgw5sxm1ahvSfSUgef7smbmATRSbDm4EmNx5kQA6VdUEhEeCKSjX6CTYjb5vxgMUvRjqP3uHg== +mini-css-extract-plugin@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz#83172b4fd812f8fc4a09d6f6d16f924f53990ca8" + integrity sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" @@ -7129,7 +7251,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= @@ -7146,7 +7268,7 @@ minimist@1.1.x: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -7245,16 +7367,16 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -7278,10 +7400,10 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== -nanoid@^3.1.16: - version "3.1.16" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.16.tgz#b21f0a7d031196faf75314d7c65d36352beeef64" - integrity sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w== +nanoid@^3.1.23: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== nanomatch@^1.2.9: version "1.2.13" @@ -7326,15 +7448,22 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-gyp-build@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -7369,42 +7498,15 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== -node-notifier@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1" - integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - -node-releases@^1.1.61: - version "1.1.61" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" - integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== - -node-releases@^1.1.66, node-releases@^1.1.67: - version "1.1.67" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" - integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== normalize-path@^2.1.1: version "2.1.1" @@ -7435,22 +7537,22 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== +npmlog@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.0.tgz#ba9ef39413c3d936ea91553db7be49c34ad0520c" + integrity sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.0" + set-blocking "^2.0.0" nth-check@^1.0.2: version "1.0.2" @@ -7474,16 +7576,6 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= - object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -7503,10 +7595,15 @@ object-fit-images@^3.2.3: resolved "https://registry.yarnpkg.com/object-fit-images/-/object-fit-images-3.2.4.tgz#6c299d38fdf207746e5d2d46c2877f6f25d15b52" integrity sha512-G+7LzpYfTfqUyrZlfrou/PLLLAPNC52FTy5y1CBywX+1/FkxIloOyQXBmZ3Zxa2AWO+lMF0JTuvqbr7G5e5CWg== -object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== object-is@^1.0.1: version "1.1.3" @@ -7528,7 +7625,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1: +object.assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== @@ -7538,24 +7635,33 @@ object.assign@^4.1.0, object.assign@^4.1.1: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" - has "^1.0.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" object.getownpropertydescriptors@^2.1.0: version "2.1.0" @@ -7565,6 +7671,14 @@ object.getownpropertydescriptors@^2.1.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +object.hasown@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.19.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -7572,15 +7686,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== +object.values@^1.1.0, object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" + es-abstract "^1.19.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -7622,7 +7735,7 @@ onetime@^1.0.0: resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= -onetime@^5.1.0: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -7687,11 +7800,6 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -p-each-series@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" - integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -7768,10 +7876,10 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -packet-reader@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" - integrity sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc= +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== pako@~1.0.5: version "1.0.11" @@ -7820,13 +7928,6 @@ parse-css-font@^2.0.2: tcomb "^2.5.0" unquote "^1.1.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -7850,10 +7951,10 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parse5@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" @@ -7911,9 +8012,9 @@ path-key@^3.0.0, path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" @@ -7927,13 +8028,6 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -7960,61 +8054,77 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pg-connection-string@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" - integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= +pg-connection-string@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10" + integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ== pg-int8@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@1.*: - version "1.8.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.8.0.tgz#f7ec73824c37a03f076f51bfdf70e340147c4f37" - integrity sha1-9+xzgkw3oD8Hb1G/33DjQBR8Tzc= - dependencies: - generic-pool "2.4.3" - object-assign "4.1.0" +pg-pool@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.2.2.tgz#a560e433443ed4ad946b84d774b3f22452694dff" + integrity sha512-ORJoFxAlmmros8igi608iVEbQNNZlp89diFVx6yV5v+ehmpMY9sK6QgpmgoXbmkNaBAx8cOOZh9g80kJv1ooyA== -pg-types@1.*: - version "1.13.0" - resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.13.0.tgz#75f490b8a8abf75f1386ef5ec4455ecf6b345c63" - integrity sha512-lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ== +pg-protocol@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.4.0.tgz#43a71a92f6fe3ac559952555aa3335c8cb4908be" + integrity sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== dependencies: pg-int8 "1.0.1" - postgres-array "~1.0.0" + postgres-array "~2.0.0" postgres-bytea "~1.0.0" - postgres-date "~1.0.0" + postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^6.4.0: - version "6.4.2" - resolved "https://registry.yarnpkg.com/pg/-/pg-6.4.2.tgz#c364011060eac7a507a2ae063eb857ece910e27f" - integrity sha1-w2QBEGDqx6UHoq4GPrhX7OkQ4n8= +pg@^8.5.0: + version "8.5.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.5.1.tgz#34dcb15f6db4a29c702bf5031ef2e1e25a06a120" + integrity sha512-9wm3yX9lCfjvA98ybCyw2pADUivyNWT/yIP4ZcDVpMN0og70BUWYEGXPCTAQdGTAqnytfRADb7NERrY1qxhIqw== dependencies: - buffer-writer "1.0.1" - js-string-escape "1.0.1" - packet-reader "0.3.1" - pg-connection-string "0.1.3" - pg-pool "1.*" - pg-types "1.*" - pgpass "1.*" - semver "4.3.2" + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.4.0" + pg-pool "^3.2.2" + pg-protocol "^1.4.0" + pg-types "^2.1.0" + pgpass "1.x" -pgpass@1.*: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" - integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= +pgpass@1.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" + integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w== dependencies: - split "^1.0.0" + split2 "^3.1.1" -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8037,19 +8147,10 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" +pirates@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" + integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== pkg-dir@^3.0.0: version "3.0.0" @@ -8395,12 +8496,11 @@ postcss-selector-parser@^6.0.4: uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== dependencies: - is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" @@ -8443,27 +8543,26 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^8.1.4: - version "8.1.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.6.tgz#b022ba2cfb8701da234d073ed3128c5a384c35ff" - integrity sha512-JuifSl4h8dJ70SiMXKjzCxhalE6p2TnMHuq9G8ftyXj2jg6SXzqCsEuxMj9RkmJoO5D+Z9YrWunNkxqpRT02qg== +postcss@^8.2.15: + version "8.3.0" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.0.tgz#b1a713f6172ca427e3f05ef1303de8b65683325f" + integrity sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ== dependencies: - colorette "^1.2.1" - line-column "^1.0.2" - nanoid "^3.1.16" - source-map "^0.6.1" + colorette "^1.2.2" + nanoid "^3.1.23" + source-map-js "^0.6.2" -postgres-array@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz#c561fc3b266b21451fc6555384f4986d78ec80f5" - integrity sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ== +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== postgres-bytea@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= -postgres-date@~1.0.0: +postgres-date@~1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== @@ -8495,14 +8594,23 @@ pretty-format@^25.2.1, pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" -pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== +pretty-format@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.2.tgz#9283ff8c4f581b186b2d4da461617143dca478a4" + integrity sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.0.2" ansi-regex "^5.0.0" - ansi-styles "^4.0.0" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7" + integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" react-is "^17.0.1" process-nextick-args@~2.0.0: @@ -8530,14 +8638,14 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -promise.prototype.finally@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.2.tgz#b8af89160c9c673cefe3b4c4435b53cfd0287067" - integrity sha512-A2HuJWl2opDH0EafgdjwEw7HysI8ff/n4lW4QEVBCUXFk9QeGecBWv0Deph0UmLe3tTNYegz8MOjsVuE6SMoJA== +promise.prototype.finally@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz#d3186e58fcf4df1682a150f934ccc27b7893389c" + integrity sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.0" - function-bind "^1.1.1" + es-abstract "^1.19.1" prompts@^2.0.1: version "2.3.2" @@ -8555,21 +8663,21 @@ prop-types-extra@^1.0.1: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== +prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" - react-is "^16.8.1" + react-is "^16.13.1" -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + forwarded "0.2.0" ipaddr.js "1.9.1" prr@~1.0.1: @@ -8577,7 +8685,7 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -psl@^1.1.28: +psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -8624,7 +8732,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4: +punycode@1.4.1, punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -8639,15 +8747,10 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@6.9.6: + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== querystring-es3@^0.2.0: version "0.2.1" @@ -8696,13 +8799,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.1" + http-errors "1.8.1" iconv-lite "0.4.24" unpipe "1.0.0" @@ -8755,13 +8858,6 @@ react-infinite-scroller@^1.0.12: dependencies: prop-types "^15.5.8" -react-input-autosize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-3.0.0.tgz#6b5898c790d4478d69420b55441fcc31d5c50a85" - integrity sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg== - dependencies: - prop-types "^15.5.8" - react-intl-translations-manager@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/react-intl-translations-manager/-/react-intl-translations-manager-5.0.3.tgz#aee010ecf35975673e033ca5d7d3f4147894324d" @@ -8783,15 +8879,15 @@ react-intl@^2.9.0: intl-relativeformat "^2.1.0" invariant "^2.1.1" -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.6: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" - integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== +react-is@^17.0.1, react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -8843,16 +8939,17 @@ react-redux-loading-bar@^4.0.8: prop-types "^15.6.2" react-lifecycles-compat "^3.0.2" -react-redux@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.2.tgz#03862e803a30b6b9ef8582dadcc810947f74b736" - integrity sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA== +react-redux@^7.2.6: + version "7.2.6" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.6.tgz#49633a24fe552b5f9caf58feb8a138936ddfe9aa" + integrity sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ== dependencies: - "@babel/runtime" "^7.12.1" + "@babel/runtime" "^7.15.4" + "@types/react-redux" "^7.1.20" hoist-non-react-statics "^3.3.2" loose-envify "^1.4.0" prop-types "^15.7.2" - react-is "^16.13.1" + react-is "^17.0.2" react-router-dom@^4.1.1: version "4.3.1" @@ -8887,18 +8984,17 @@ react-router@^4.3.1: prop-types "^15.6.1" warning "^4.0.1" -react-select@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.2.0.tgz#de9284700196f5f9b5277c5d850a9ce85f5c72fe" - integrity sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ== +react-select@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.2.2.tgz#3d5edf0a60f1276fd5f29f9f90a305f0a25a5189" + integrity sha512-miGS2rT1XbFNjduMZT+V73xbJEeMzVkJOz727F6MeAr2hKE0uUSA8Ff7vD44H32x2PD3SRB6OXTY/L+fTV3z9w== dependencies: - "@babel/runtime" "^7.4.4" - "@emotion/cache" "^10.0.9" - "@emotion/core" "^10.0.9" - "@emotion/css" "^10.0.9" + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.1.1" + "@types/react-transition-group" "^4.4.0" memoize-one "^5.0.0" prop-types "^15.6.0" - react-input-autosize "^3.0.0" react-transition-group "^4.3.0" react-sparklines@^1.7.0: @@ -8908,35 +9004,35 @@ react-sparklines@^1.7.0: dependencies: prop-types "^15.5.10" -react-swipeable-views-core@^0.13.7: - version "0.13.7" - resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.13.7.tgz#c082b553f26e83fd20fc17f934200eb717023c8a" - integrity sha512-ekn9oDYfBt0oqJSGGwLEhKvn+QaqMGTy//9dURTLf+vp7W5j6GvmKryYdnwJCDITaPFI2hujXV4CH9krhvaE5w== +react-swipeable-views-core@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.14.0.tgz#6ac443a7cc7bc5ea022fbd549292bb5fff361cce" + integrity sha512-0W/e9uPweNEOSPjmYtuKSC/SvKKg1sfo+WtPdnxeLF3t2L82h7jjszuOHz9C23fzkvLfdgkaOmcbAxE9w2GEjA== dependencies: "@babel/runtime" "7.0.0" warning "^4.0.1" -react-swipeable-views-utils@^0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.9.tgz#a66e98f2f4502d8b00182901f80d13b2f903e10f" - integrity sha512-QLGxRKrbJCbWz94vkWLzb1Daaa2Y/TZKmsNKQ6WSNrS+chrlfZ3z9tqZ7YUJlW6pRWp3QZdLSY3UE3cN0TXXmw== +react-swipeable-views-utils@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.14.0.tgz#6b76e251906747482730c22002fe47ab1014ba32" + integrity sha512-W+fXBOsDqgFK1/g7MzRMVcDurp3LqO3ksC8UgInh2P/tKgb5DusuuB1geKHFc6o1wKl+4oyER4Zh3Lxmr8xbXA== dependencies: "@babel/runtime" "7.0.0" keycode "^2.1.7" prop-types "^15.6.0" react-event-listener "^0.6.0" - react-swipeable-views-core "^0.13.7" + react-swipeable-views-core "^0.14.0" shallow-equal "^1.2.1" -react-swipeable-views@^0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.9.tgz#d6a6c508bf5288ad55509f9c65916db5df0f2cec" - integrity sha512-WXC2FKYvZ9QdJ31v9LjEJEl1bA7E4AcaloTkbW0uU0dYf5uvv4aOpiyxubvOkVl1a5L2UAHmKSif4TmJ9usrSg== +react-swipeable-views@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.14.0.tgz#149c0df3d92220cc89e3f6d5c04a78dfe46f9b54" + integrity sha512-wrTT6bi2nC3JbmyNAsPXffUXLn0DVT9SbbcFr36gKpbaCgEp7rX/OFxsu5hPc/NBsUhHyoSRGvwqJNNrWTwCww== dependencies: "@babel/runtime" "7.0.0" prop-types "^15.5.4" - react-swipeable-views-core "^0.13.7" - react-swipeable-views-utils "^0.13.9" + react-swipeable-views-core "^0.14.0" + react-swipeable-views-utils "^0.14.0" warning "^4.0.1" react-test-renderer@^16.14.0: @@ -8949,19 +9045,19 @@ react-test-renderer@^16.14.0: react-is "^16.8.6" scheduler "^0.19.1" -react-textarea-autosize@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.0.tgz#e6e2fd186d9f61bb80ac6e2dcb4c55504f93c2fa" - integrity sha512-3GLWFAan2pbwBeoeNDoqGmSbrShORtgWfaWX0RJDivsUrpShh01saRM5RU/i4Zmf+whpBVEY5cA90Eq8Ub1N3w== +react-textarea-autosize@^8.3.3: + version "8.3.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" + integrity sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ== dependencies: "@babel/runtime" "^7.10.2" use-composed-ref "^1.0.0" use-latest "^1.0.0" -react-toggle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.1.tgz#2317f67bf918ea3508a96b09dd383efd9da572af" - integrity sha512-+wXlMcSpg8SmnIXauMaZiKpR+r2wp2gMUteroejp2UTSqGTVvZLN+m9EhMzFARBKEw7KpQOwzCyfzeHeAndQGw== +react-toggle@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.2.tgz#b00500832f925ad524356d909821821ae39f6c52" + integrity sha512-4Ohw31TuYQdhWfA6qlKafeXx3IOH7t4ZHhmRdwsm1fQREwOBGxJT+I22sgHqR/w8JRdk+AeMCJXPImEFSrNXow== dependencies: classnames "^2.2.5" @@ -8994,43 +9090,7 @@ react@^16.14.0: object-assign "^4.1.1" prop-types "^15.6.2" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -9043,7 +9103,7 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.6.0: +readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9061,10 +9121,10 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" @@ -9085,50 +9145,45 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redis-commands@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.6.0.tgz#36d4ca42ae9ed29815cdb30ad9f97982eba1ce23" - integrity sha512-2jnZ0IkjZxvguITjFTrGiLyzQZcTvaw8DAaCXxZq/dsHXz7KfMQ3OUJy7Tz9vnRtZRVz6VRCPDvruvU8Ts44wQ== - -redis-errors@^1.0.0, redis-errors@^1.2.0: +redis-errors@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= -redis-parser@^3.0.0: +redis-parser@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= dependencies: redis-errors "^1.0.0" -redis@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/redis/-/redis-3.0.2.tgz#bd47067b8a4a3e6a2e556e57f71cc82c7360150a" - integrity sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ== +redis@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/redis/-/redis-4.0.2.tgz#096cf716842731a24f34c7c3a996c143e2b133bb" + integrity sha512-Ip1DJ/lwuvtJz9AZ6pl1Bv33fWzk5d3iQpGzsXpi04ErkT4fq0pfGOm4k/p9DHmPGieEIOWvJ9xmIeQMooLybg== dependencies: - denque "^1.4.1" - redis-commands "^1.5.0" - redis-errors "^1.2.0" - redis-parser "^3.0.0" + "@node-redis/bloom" "^1.0.0" + "@node-redis/client" "^1.0.2" + "@node-redis/json" "^1.0.2" + "@node-redis/search" "^1.0.2" + "@node-redis/time-series" "^1.0.1" redux-immutable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz#3a1a32df66366462b63691f0e1dc35e472bbc9f3" integrity sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM= -redux-thunk@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" - integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== +redux-thunk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714" + integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q== -redux@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" - integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== +redux@^4.0.0, redux@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" + integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" + "@babel/runtime" "^7.9.2" regenerate-unicode-properties@^8.2.0: version "8.2.0" @@ -9152,10 +9207,10 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== -regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" @@ -9172,7 +9227,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: +regexp.prototype.flags@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== @@ -9180,6 +9235,14 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" @@ -9229,48 +9292,6 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.8: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - requestidlecallback@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/requestidlecallback/-/requestidlecallback-0.3.0.tgz#6fb74e0733f90df3faa4838f9f6a2a5f9b742ac5" @@ -9309,10 +9330,10 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= -reselect@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" - integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== +reselect@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6" + integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ== resolve-cwd@^2.0.0: version "2.0.0" @@ -9371,12 +9392,25 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.1.0" + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" path-parse "^1.0.6" restore-cursor@^1.0.1: @@ -9436,11 +9470,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -9465,7 +9494,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -9477,26 +9506,11 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - sass-lint@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f" @@ -9517,10 +9531,10 @@ sass-lint@^1.13.1: path-is-absolute "^1.0.0" util "^0.10.3" -sass-loader@^10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" - integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== +sass-loader@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.0.tgz#3d64c1590f911013b3fa48a0b22a83d5e1494716" + integrity sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw== dependencies: klona "^2.0.4" loader-utils "^2.0.0" @@ -9528,19 +9542,21 @@ sass-loader@^10.1.1: schema-utils "^3.0.0" semver "^7.3.2" -sass@^1.32.5: - version "1.32.5" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.5.tgz#2882d22ad5748c05fa9bff6c3b0ffbc4f4b9e1dc" - integrity sha512-kU1yJ5zUAmPxr7f3q0YXTAd1oZjSR1g3tYyv+xu0HZSl5JiNOaE987eiz7wCUvbm4I9fGWGU2TgApTtcP4GMNQ== +sass@^1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.0.tgz#65ec1b1d9a6bc1bae8d2c9d4b392c13f5d32c078" + integrity sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw== dependencies: - chokidar ">=2.0.0 <4.0.0" + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^5.0.0: +saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== @@ -9602,37 +9618,32 @@ selfsigned@^1.10.8: dependencies: node-forge "^0.10.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" - integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= - semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.3.0: +semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" depd "~1.1.2" @@ -9641,9 +9652,9 @@ send@0.17.1: escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "1.8.1" mime "1.6.0" - ms "2.1.1" + ms "2.1.3" on-finished "~2.3.0" range-parser "~1.2.1" statuses "~1.5.0" @@ -9673,17 +9684,17 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.17.2" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -9708,10 +9719,10 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" @@ -9762,20 +9773,16 @@ shelljs@^0.6.0: resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" integrity sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg= -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -side-channel@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" - integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - es-abstract "^1.18.0-next.0" - object-inspect "^1.8.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -9881,6 +9888,16 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +"source-map-js@>=0.6.2 <2.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -9918,7 +9935,7 @@ source-map@0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -9933,32 +9950,6 @@ source-map@^0.7.3, source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" - integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -9989,37 +9980,22 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== +split2@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: - through "2" + readable-stream "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" @@ -10042,10 +10018,10 @@ stack-generator@^2.0.5: dependencies: stackframe "^1.1.1" -stack-utils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" - integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== +stack-utils@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" + integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== dependencies: escape-string-regexp "^2.0.0" @@ -10084,11 +10060,6 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -10155,42 +10126,44 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== +string.prototype.matchall@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" - has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -10241,6 +10214,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -10292,6 +10272,11 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +stylis@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.6.tgz#0d8b97b6bc4748bea46f68602b6df27641b3c548" + integrity sha512-1igcUEmYFBEO14uQHAJhCUelTR5jPztfdVKrYxRnDa5D5Dn3w0NxXupJNPr/VV/yRfZYEAco8sTIRZzH3sRYKg== + substring-trie@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/substring-trie/-/substring-trie-1.0.2.tgz#7b42592391628b4f2cb17365c6cce4257c7b7af5" @@ -10330,6 +10315,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" @@ -10357,11 +10349,6 @@ svgo@^1.0.0: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -10379,15 +10366,17 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" -table@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" - integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw== +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: - ajv "^6.12.4" - lodash "^4.17.20" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tapable@^1.0, tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -10395,9 +10384,9 @@ tapable@^1.0, tapable@^1.0.0, tapable@^1.1.3: integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^6.0.2: - version "6.0.5" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" - integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg== + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -10503,10 +10492,10 @@ text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== throng@^4.0.0: version "4.0.0" @@ -10523,7 +10512,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, through@^2.3.6: +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -10561,9 +10550,9 @@ tiny-warning@^1.0.0: integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-arraybuffer@^1.0.0: version "1.0.1" @@ -10607,49 +10596,46 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== totalist@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: - psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" - -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== - dependencies: - punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= ts-essentials@^2.0.3: version "2.0.12" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +tsconfig-paths@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" + integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" @@ -10666,17 +10652,20 @@ tty-browserify@0.0.0: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" +twemoji-parser@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/twemoji-parser/-/twemoji-parser-11.0.2.tgz#24e87c2008abe8544c962f193b88b331de32b446" + integrity sha512-5kO2XCcpAql6zjdLwRwJjYvAZyDy3+Uj7v1ipBzLthQmDL7Ce19bEqHr3ImSNeoSW2OA8u02XmARbXHaNO8GhA== -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +twitter-text@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/twitter-text/-/twitter-text-3.1.0.tgz#798e932b289f506efe2a1f03fe917ba30627f125" + integrity sha512-nulfUi3FN6z0LUjYipJid+eiwXvOLb8Ass7Jy/6zsXmZK3URte043m8fL3FyDzrK+WLpyqhHuR/TcARTN/iuGQ== + dependencies: + "@babel/runtime" "^7.3.1" + core-js "^2.5.0" + punycode "1.4.1" + twemoji-parser "^11.0.2" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -10702,17 +10691,12 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -10742,6 +10726,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -10799,7 +10793,7 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -universalify@^0.1.0: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -10840,9 +10834,9 @@ urix@^0.1.0: integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-parse@^1.4.3, url-parse@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -10886,6 +10880,13 @@ user-home@^2.0.0: dependencies: os-homedir "^1.0.0" +utf-8-validate@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58" + integrity sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA== + dependencies: + node-gyp-build "^4.3.0" + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -10932,7 +10933,7 @@ uuid@^3.3.2, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.3.0, uuid@^8.3.1: +uuid@^8.3.1: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -10942,23 +10943,15 @@ v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== -v8-to-istanbul@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz#b4fe00e35649ef7785a9b7fcebcea05f37c332fc" - integrity sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA== +v8-to-istanbul@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" + integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" source-map "^0.7.3" -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - value-equal@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" @@ -10979,15 +10972,6 @@ vendors@^1.0.0: resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -11007,7 +10991,7 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -walker@^1.0.7, walker@~1.0.5: +walker@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= @@ -11053,6 +11037,11 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -11063,15 +11052,14 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-assets-manifest@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-4.0.1.tgz#918989c51a7800be6683aaa27b9f36bcc7a9afdc" - integrity sha512-NS7Bx2C3JsEj6a0MB/PPmPOD/BzDYjB3PaKcI7/r2fKXq0PuZ4YtcbZ5Og+q4gkmetGX9v21vejeAlbru/Fvhw== +webpack-assets-manifest@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-4.0.6.tgz#cb8cfd2d2d8d129228cea645c832448380c21ae0" + integrity sha512-9MsBOINUoGcj3D7XHQOOuQri7VEDArkhn5gqnpCqPungLj8Vy3utlVZ6vddAVU5feYroj+DEncktbaZhnBxdeQ== dependencies: chalk "^4.0" - deepmerge "^4.2.2" - lockfile "^1.0.4" - lodash.escaperegexp "^4.0" + deepmerge "^4.0" + lockfile "^1.0" lodash.get "^4.0" lodash.has "^4.0" mkdirp "^1.0" @@ -11079,15 +11067,15 @@ webpack-assets-manifest@^4.0.1: tapable "^1.0" webpack-sources "^1.0" -webpack-bundle-analyzer@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.3.0.tgz#2f3c0ca9041d5ee47fa418693cf56b4a518b578b" - integrity sha512-J3TPm54bPARx6QG8z4cKBszahnUglcv70+N+8gUqv2I5KOFHJbzBiLx+pAp606so0X004fxM7hqRu10MLjJifA== +webpack-bundle-analyzer@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== dependencies: acorn "^8.0.4" acorn-walk "^8.0.0" chalk "^4.1.0" - commander "^6.2.0" + commander "^7.2.0" gzip-size "^6.0.0" lodash "^4.17.20" opener "^1.5.2" @@ -11122,12 +11110,12 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.11.2: - version "3.11.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" - integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== +webpack-dev-server@^3.11.3: + version "3.11.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3" + integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA== dependencies: - ansi-html "0.0.7" + ansi-html-community "0.0.8" bonjour "^3.5.0" chokidar "^2.1.8" compression "^1.7.4" @@ -11169,10 +11157,10 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-merge@^5.7.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" - integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== +webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" @@ -11249,15 +11237,34 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^8.0.0: - version "8.2.2" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.2.2.tgz#85e7f9795108b53d554cec640b2e8aee2a0d4bfd" - integrity sha512-PcVnO6NiewhkmzV0qn7A+UZ9Xx4maNTI+O+TShmfE4pqjoCMwUMjkvoNhNHPTvgR7QH9Xt3R13iHuWy2sToFxQ== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.2" + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" + integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" webidl-conversions "^6.1.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -11270,19 +11277,19 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wicg-inert@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/wicg-inert/-/wicg-inert-3.1.0.tgz#6525f12db188b83f0051bed2ddcf6c1aa5b17590" - integrity sha512-P0ZiWaN9SxOkJbYtF/PIwmIRO8UTqTJtyl33QTQlHfAb6h15T0Dp5m7WTJ8N6UWIoj+KU5M0a8EtfRZLlHiP0Q== +wicg-inert@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/wicg-inert/-/wicg-inert-3.1.1.tgz#b033fd4fbfb9e3fd709e5d84becbdf2e06e5c229" + integrity sha512-PhBaNh8ur9Xm4Ggy4umelwNIP6pPP1bv3EaWaKqfb/QNme2rdLjm7wIInvV4WhxVHhzA4Spgw9qNSqWtB/ca2A== -wide-align@^1.1.0: +wide-align@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== @@ -11315,15 +11322,6 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -11362,10 +11360,15 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.2.3, ws@^7.3.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" - integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ== +ws@^7.3.1, ws@^7.4.5: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" + integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== xml-name-validator@^3.0.0: version "3.0.0" @@ -11383,25 +11386,25 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== +yallist@4.0.0, yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^1.7.2: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" @@ -11415,19 +11418,16 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^20.2.2: version "20.2.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.3.tgz#92419ba867b858c868acf8bae9bf74af0dd0ce26" integrity sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww== +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -11444,23 +11444,6 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -11474,6 +11457,19 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.3.1: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + zlibjs@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/zlibjs/-/zlibjs-0.3.1.tgz#50197edb28a1c42ca659cc8b4e6a9ddd6d444554"