diff options
author | Starfall <us@starfall.systems> | 2022-07-25 18:53:31 -0500 |
---|---|---|
committer | Starfall <us@starfall.systems> | 2022-07-25 18:53:31 -0500 |
commit | 5b9419060d79eda85c40a12c567dd0e1e44a7ecb (patch) | |
tree | f5e21930844f7c11ae40b9097a78a32916ba5dba | |
parent | a137fecf94d25a03ef7224843c1afd0c30f428e6 (diff) | |
parent | 3a7c641dd4db1d67b172f731518b472d58dd2262 (diff) |
Merge remote-tracking branch 'glitch/main'
580 files changed, 13237 insertions, 4518 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml index b9228f996..2a60ae684 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -134,6 +134,12 @@ jobs: command: ./bin/rails tests:migrations:populate_v2_4 name: Populate database with test data - run: + command: ./bin/rails db:migrate VERSION=20180707154237 + name: Run migrations up to v2.4.3 + - run: + command: ./bin/rails tests:migrations:populate_v2_4_3 + name: Populate database with test data + - run: command: ./bin/rails db:migrate name: Run all remaining migrations - run: @@ -168,13 +174,21 @@ jobs: command: ./bin/rails tests:migrations:populate_v2_4 name: Populate database with test data - run: + command: ./bin/rails db:migrate VERSION=20180707154237 + name: Run migrations up to v2.4.3 + environment: + SKIP_POST_DEPLOYMENT_MIGRATIONS: true + - run: + command: ./bin/rails tests:migrations:populate_v2_4_3 + name: Populate database with test data + - run: command: ./bin/rails db:migrate - name: Run all pre-deployment migrations + name: Run all remaining pre-deployment migrations environment: SKIP_POST_DEPLOYMENT_MIGRATIONS: true - run: command: ./bin/rails db:migrate - name: Run all post-deployment remaining migrations + name: Run all post-deployment migrations - run: command: ./bin/rails tests:migrations:check_database name: Check migration result diff --git a/.env.production.sample b/.env.production.sample index 0df0a8778..ad058b2b7 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -283,9 +283,17 @@ MAX_POLL_OPTION_CHARS=100 # 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 +# MAX_EMOJI_SIZE=262144 +# MAX_REMOTE_EMOJI_SIZE=262144 # Optional hCaptcha support # HCAPTCHA_SECRET_KEY= # HCAPTCHA_SITE_KEY= + +# IP and session retention +# ----------------------- +# Make sure to modify the scheduling of ip_cleanup_scheduler in config/sidekiq.yml +# to be less than daily if you lower IP_RETENTION_PERIOD below two days (172800). +# ----------------------- +IP_RETENTION_PERIOD=31556952 +SESSION_RETENTION_PERIOD=31556952 diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml new file mode 100644 index 000000000..63aefc37e --- /dev/null +++ b/.github/workflows/build-image.yml @@ -0,0 +1,43 @@ +name: Build container image +on: + workflow_dispatch: + push: + branches: + - 'main' + tags: + - '*' + pull_request: + paths: + - .github/workflows/build-image.yml + - Dockerfile +jobs: + build-image: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: docker/setup-qemu-action@v2 + - uses: docker/setup-buildx-action@v2 + - uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + if: github.event_name != 'pull_request' + - uses: docker/metadata-action@v4 + id: meta + with: + images: ghcr.io/${{ github.repository_owner }}/mastodon + flavor: | + latest=auto + tags: | + type=edge,branch=main + type=match,pattern=v(.*),group=0 + type=ref,event=pr + - uses: docker/build-push-action@v3 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/mastodon:latest + cache-to: type=inline diff --git a/.rubocop.yml b/.rubocop.yml index 9e3ff21f2..8dc2d1c47 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -67,7 +67,7 @@ Lint/UselessAccessModifier: - class_methods Metrics/AbcSize: - Max: 100 + Max: 115 Exclude: - 'lib/mastodon/*_cli.rb' @@ -84,7 +84,7 @@ Metrics/BlockNesting: Metrics/ClassLength: CountComments: false - Max: 400 + Max: 500 Exclude: - 'lib/mastodon/*_cli.rb' diff --git a/Dockerfile b/Dockerfile index da4fb964c..6f04d400d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ SHELL ["/bin/bash", "-c"] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections # Install Node v16 (LTS) -ENV NODE_VER="16.14.2" +ENV NODE_VER="16.15.1" RUN ARCH= && \ dpkgArch="$(dpkg --print-architecture)" && \ case "${dpkgArch##*-}" in \ diff --git a/Gemfile b/Gemfile index dc25538c0..f723ce739 100644 --- a/Gemfile +++ b/Gemfile @@ -10,10 +10,10 @@ gem 'puma', '~> 5.6' gem 'rails', '~> 6.1.6' gem 'sprockets', '~> 3.7.2' gem 'thor', '~> 1.2' -gem 'rack', '~> 2.2.3' +gem 'rack', '~> 2.2.4' gem 'hamlit-rails', '~> 0.2' -gem 'pg', '~> 1.3' +gem 'pg', '~> 1.4' gem 'makara', '~> 0.5' gem 'pghero', '~> 2.8' gem 'dotenv-rails', '~> 2.7' @@ -40,7 +40,7 @@ end gem 'net-ldap', '~> 0.17' gem 'omniauth-cas', '~> 2.0' gem 'omniauth-saml', '~> 1.10' -gem 'gitlab-omniauth-openid-connect', '~>0.9.1', require: 'omniauth_openid_connect' +gem 'gitlab-omniauth-openid-connect', '~>0.10.0', require: 'omniauth_openid_connect' gem 'omniauth', '~> 1.9' gem 'omniauth-rails_csrf_protection', '~> 0.1' @@ -53,7 +53,7 @@ gem 'fastimage' gem 'hiredis', '~> 0.6' gem 'redis-namespace', '~> 1.8' gem 'htmlentities', '~> 4.3' -gem 'http', '~> 5.0' +gem 'http', '~> 5.1' gem 'http_accept_language', '~> 2.1' gem 'httplog', '~> 1.5.0' gem 'idn-ruby', require: 'idn' @@ -78,7 +78,7 @@ gem 'rqrcode', '~> 2.1' gem 'ruby-progressbar', '~> 1.11' gem 'sanitize', '~> 6.0' gem 'scenic', '~> 1.6' -gem 'sidekiq', '~> 6.4' +gem 'sidekiq', '~> 6.5' gem 'sidekiq-scheduler', '~> 4.0' gem 'sidekiq-unique-jobs', '~> 7.1' gem 'sidekiq-bulk', '~> 0.2.0' @@ -101,7 +101,7 @@ gem 'rdf-normalize', '~> 0.5' gem 'redcarpet', '~> 3.5' group :development, :test do - gem 'fabrication', '~> 2.28' + gem 'fabrication', '~> 2.29' gem 'fuubar', '~> 2.5' gem 'i18n-tasks', '~> 1.0', require: false gem 'pry-byebug', '~> 3.9' @@ -157,3 +157,4 @@ gem 'connection_pool', require: false gem 'xorcist', '~> 1.1' gem 'hcaptcha', '~> 7.1' +gem 'cocoon', '~> 1.2' diff --git a/Gemfile.lock b/Gemfile.lock index 8c02b4244..b16d38d38 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -163,6 +163,7 @@ GEM elasticsearch-dsl chunky_png (1.4.0) climate_control (0.2.0) + cocoon (1.2.15) coderay (1.1.3) color_diff (0.1) concurrent-ruby (1.1.10) @@ -218,7 +219,7 @@ GEM et-orbi (1.2.7) tzinfo excon (0.76.0) - fabrication (2.28.0) + fabrication (2.29.0) faker (2.21.0) i18n (>= 1.8.11, < 2) faraday (1.9.3) @@ -269,9 +270,9 @@ GEM fuubar (2.5.1) rspec-core (~> 3.0) ruby-progressbar (~> 1.4) - gitlab-omniauth-openid-connect (0.9.1) + gitlab-omniauth-openid-connect (0.10.0) addressable (~> 2.7) - omniauth (~> 1.9) + omniauth (>= 1.9, < 3) openid_connect (~> 1.2) globalid (1.0.0) activesupport (>= 5.0) @@ -293,12 +294,12 @@ GEM hkdf (0.3.0) html_tokenizer (0.0.7) htmlentities (4.3.4) - http (5.0.4) + http (5.1.0) addressable (~> 2.8) http-cookie (~> 1.0) http-form_data (~> 2.2) llhttp-ffi (~> 0.4.0) - http-cookie (1.0.4) + http-cookie (1.0.5) domain_name (~> 0.5) http-form_data (2.3.0) http_accept_language (2.1.1) @@ -406,7 +407,7 @@ GEM net-ssh (>= 2.6.5, < 7.0.0) net-ssh (6.1.0) nio4r (2.5.8) - nokogiri (1.13.6) + nokogiri (1.13.7) mini_portile2 (~> 2.8.0) racc (~> 1.4) nsa (0.2.8) @@ -414,7 +415,7 @@ GEM concurrent-ruby (~> 1.0, >= 1.0.2) sidekiq (>= 3.5) statsd-ruby (~> 1.4, >= 1.4.0) - oj (3.13.14) + oj (3.13.17) omniauth (1.9.1) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) @@ -448,7 +449,7 @@ GEM parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) - pg (1.3.5) + pg (1.4.1) pghero (2.8.3) activerecord (>= 5) pkg-config (1.4.7) @@ -476,7 +477,7 @@ GEM activesupport (>= 3.0.0) raabro (1.4.0) racc (1.6.0) - rack (2.2.3.1) + rack (2.2.4) rack-attack (6.6.1) rack (>= 1.0, < 3) rack-cors (1.1.1) @@ -603,13 +604,13 @@ GEM railties (>= 4.0.0) securecompare (1.0.0) semantic_range (3.0.0) - sidekiq (6.4.2) + sidekiq (6.5.1) connection_pool (>= 2.2.2) rack (~> 2.0) redis (>= 4.2.0) sidekiq-bulk (0.2.0) sidekiq - sidekiq-scheduler (4.0.1) + sidekiq-scheduler (4.0.2) redis (>= 4.2.0) rufus-scheduler (~> 3.2) sidekiq (>= 4) @@ -679,13 +680,13 @@ GEM tzinfo (>= 1.0.0) unf (0.1.4) unf_ext - unf_ext (0.0.8) + unf_ext (0.0.8.2) unicode-display_width (2.1.0) uniform_notifier (1.16.0) validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) - validate_url (1.0.13) + validate_url (1.0.15) activemodel (>= 3.0.0) public_suffix warden (1.2.9) @@ -749,6 +750,7 @@ DEPENDENCIES charlock_holmes (~> 0.7.7) chewy (~> 7.2) climate_control (~> 0.2) + cocoon (~> 1.2) color_diff (~> 0.1) concurrent-ruby connection_pool @@ -759,19 +761,19 @@ DEPENDENCIES doorkeeper (~> 5.5) dotenv-rails (~> 2.7) ed25519 (~> 1.3) - fabrication (~> 2.28) + fabrication (~> 2.29) faker (~> 2.21) fast_blank (~> 1.0) fastimage fog-core (<= 2.1.0) fog-openstack (~> 0.3) fuubar (~> 2.5) - gitlab-omniauth-openid-connect (~> 0.9.1) + gitlab-omniauth-openid-connect (~> 0.10.0) hamlit-rails (~> 0.2) hcaptcha (~> 7.1) hiredis (~> 0.6) htmlentities (~> 4.3) - http (~> 5.0) + http (~> 5.1) http_accept_language (~> 2.1) httplog (~> 1.5.0) i18n-tasks (~> 1.0) @@ -799,7 +801,7 @@ DEPENDENCIES omniauth-saml (~> 1.10) ox (~> 2.14) parslet - pg (~> 1.3) + pg (~> 1.4) pghero (~> 2.8) pkg-config (~> 1.4) posix-spawn @@ -809,7 +811,7 @@ DEPENDENCIES pry-rails (~> 0.3) puma (~> 5.6) pundit (~> 2.2) - rack (~> 2.2.3) + rack (~> 2.2.4) rack-attack (~> 6.6) rack-cors (~> 1.1) rails (~> 6.1.6) @@ -830,7 +832,7 @@ DEPENDENCIES ruby-progressbar (~> 1.11) sanitize (~> 6.0) scenic (~> 1.6) - sidekiq (~> 6.4) + sidekiq (~> 6.5) sidekiq-bulk (~> 0.2.0) sidekiq-scheduler (~> 4.0) sidekiq-unique-jobs (~> 7.1) diff --git a/app/controllers/admin/account_actions_controller.rb b/app/controllers/admin/account_actions_controller.rb index ea56fa0ac..3f2e28b6a 100644 --- a/app/controllers/admin/account_actions_controller.rb +++ b/app/controllers/admin/account_actions_controller.rb @@ -5,11 +5,15 @@ module Admin before_action :set_account def new + authorize @account, :show? + @account_action = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true, include_statuses: true) @warning_presets = AccountWarningPreset.all end def create + authorize @account, :show? + account_action = Admin::AccountAction.new(resource_params) account_action.target_account = @account account_action.current_account = current_account diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index e0ae71b9f..46c9aba91 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -14,6 +14,8 @@ module Admin end def batch + authorize :account, :index? + @form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/action_logs_controller.rb b/app/controllers/admin/action_logs_controller.rb index 2d77620df..42edec15a 100644 --- a/app/controllers/admin/action_logs_controller.rb +++ b/app/controllers/admin/action_logs_controller.rb @@ -4,7 +4,10 @@ module Admin class ActionLogsController < BaseController before_action :set_action_logs - def index; end + def index + authorize :audit_log, :index? + @auditable_accounts = Account.where(id: Admin::ActionLog.reorder(nil).select('distinct account_id')).select(:id, :username) + end private diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index cc6cd51f0..c645ce12b 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -7,9 +7,9 @@ module Admin layout 'admin' - before_action :require_staff! before_action :set_pack before_action :set_body_classes + after_action :verify_authorized private diff --git a/app/controllers/admin/custom_emojis_controller.rb b/app/controllers/admin/custom_emojis_controller.rb index 47138bf6c..1fae60f5b 100644 --- a/app/controllers/admin/custom_emojis_controller.rb +++ b/app/controllers/admin/custom_emojis_controller.rb @@ -29,6 +29,8 @@ module Admin end def batch + authorize :custom_emoji, :index? + @form = Form::CustomEmojiBatch.new(form_custom_emoji_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index da9c6dd16..924b623ad 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -5,7 +5,9 @@ module Admin include Redisable def index - @system_checks = Admin::SystemCheck.perform + authorize :dashboard, :index? + + @system_checks = Admin::SystemCheck.perform(current_user) @time_period = (29.days.ago.to_date...Time.now.utc.to_date) @pending_users_count = User.pending.count @pending_reports_count = Report.unresolved.count diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index 48e9781d6..32f1f9a5d 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -5,6 +5,7 @@ module Admin before_action :set_domain_block, only: [:show, :destroy, :edit, :update] def batch + authorize :domain_block, :create? @form = Form::DomainBlockBatch.new(form_domain_block_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/email_domain_blocks_controller.rb b/app/controllers/admin/email_domain_blocks_controller.rb index a4bbbba5b..593457b94 100644 --- a/app/controllers/admin/email_domain_blocks_controller.rb +++ b/app/controllers/admin/email_domain_blocks_controller.rb @@ -12,6 +12,8 @@ module Admin end def batch + authorize :email_domain_block, :index? + @form = Form::EmailDomainBlockBatch.new(form_email_domain_block_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/follow_recommendations_controller.rb b/app/controllers/admin/follow_recommendations_controller.rb index e3eac62b3..841e3cc7f 100644 --- a/app/controllers/admin/follow_recommendations_controller.rb +++ b/app/controllers/admin/follow_recommendations_controller.rb @@ -12,6 +12,8 @@ module Admin end def update + authorize :follow_recommendation, :show? + @form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/ip_blocks_controller.rb b/app/controllers/admin/ip_blocks_controller.rb index 92b8b0d2b..a87520f4e 100644 --- a/app/controllers/admin/ip_blocks_controller.rb +++ b/app/controllers/admin/ip_blocks_controller.rb @@ -29,6 +29,8 @@ module Admin end def batch + authorize :ip_block, :index? + @form = Form::IpBlockBatch.new(form_ip_block_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/relationships_controller.rb b/app/controllers/admin/relationships_controller.rb index 085ded21c..67645f054 100644 --- a/app/controllers/admin/relationships_controller.rb +++ b/app/controllers/admin/relationships_controller.rb @@ -7,7 +7,7 @@ module Admin PER_PAGE = 40 def index - authorize :account, :index? + authorize @account, :show? @accounts = RelationshipFilter.new(@account, filter_params).results.includes(:account_stat, user: [:ips, :invite_request]).page(params[:page]).per(PER_PAGE) @form = Form::AccountBatch.new diff --git a/app/controllers/admin/roles_controller.rb b/app/controllers/admin/roles_controller.rb index 13f56e9be..3e502ccc4 100644 --- a/app/controllers/admin/roles_controller.rb +++ b/app/controllers/admin/roles_controller.rb @@ -2,20 +2,63 @@ module Admin class RolesController < BaseController - before_action :set_user + before_action :set_role, except: [:index, :new, :create] - def promote - authorize @user, :promote? - @user.promote! - log_action :promote, @user - redirect_to admin_account_path(@user.account_id) + def index + authorize :user_role, :index? + + @roles = UserRole.order(position: :desc).page(params[:page]) + end + + def new + authorize :user_role, :create? + + @role = UserRole.new + end + + def create + authorize :user_role, :create? + + @role = UserRole.new(resource_params) + @role.current_account = current_account + + if @role.save + redirect_to admin_roles_path + else + render :new + end + end + + def edit + authorize @role, :update? + end + + def update + authorize @role, :update? + + @role.current_account = current_account + + if @role.update(resource_params) + redirect_to admin_roles_path + else + render :edit + end + end + + def destroy + authorize @role, :destroy? + @role.destroy! + redirect_to admin_roles_path + end + + private + + def set_role + @role = UserRole.find(params[:id]) end - def demote - authorize @user, :demote? - @user.demote! - log_action :demote, @user - redirect_to admin_account_path(@user.account_id) + def resource_params + params.require(:user_role).permit(:name, :color, :highlighted, :position, permissions_as_keys: []) end end end diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb index 817c0caa9..084921ceb 100644 --- a/app/controllers/admin/statuses_controller.rb +++ b/app/controllers/admin/statuses_controller.rb @@ -14,6 +14,8 @@ module Admin end def batch + authorize :status, :index? + @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 diff --git a/app/controllers/admin/subscriptions_controller.rb b/app/controllers/admin/subscriptions_controller.rb deleted file mode 100644 index 40500ef43..000000000 --- a/app/controllers/admin/subscriptions_controller.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -module Admin - class SubscriptionsController < BaseController - def index - authorize :subscription, :index? - @subscriptions = ordered_subscriptions.page(requested_page) - end - - private - - def ordered_subscriptions - Subscription.order(id: :desc).includes(:account) - end - - def requested_page - params[:page].to_i - end - end -end diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 749e2f144..4f727c398 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -16,6 +16,8 @@ module Admin if @tag.update(tag_params.merge(reviewed_at: Time.now.utc)) redirect_to admin_tag_path(@tag.id), notice: I18n.t('admin.tags.updated_msg') else + @time_period = (6.days.ago.to_date...Time.now.utc.to_date) + render :show end end @@ -27,7 +29,7 @@ module Admin end def tag_params - params.require(:tag).permit(:name, :trendable, :usable, :listable) + params.require(:tag).permit(:name, :display_name, :trendable, :usable, :listable) 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 index 40a466cd6..97dee8eca 100644 --- a/app/controllers/admin/trends/links/preview_card_providers_controller.rb +++ b/app/controllers/admin/trends/links/preview_card_providers_controller.rb @@ -2,13 +2,15 @@ class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseController def index - authorize :preview_card_provider, :index? + authorize :preview_card_provider, :review? @preview_card_providers = filtered_preview_card_providers.page(params[:page]) @form = Trends::PreviewCardProviderBatch.new end def batch + authorize :preview_card_provider, :review? + @form = Trends::PreviewCardProviderBatch.new(trends_preview_card_provider_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/trends/links_controller.rb b/app/controllers/admin/trends/links_controller.rb index 434eec5fe..a497eae41 100644 --- a/app/controllers/admin/trends/links_controller.rb +++ b/app/controllers/admin/trends/links_controller.rb @@ -2,13 +2,15 @@ class Admin::Trends::LinksController < Admin::BaseController def index - authorize :preview_card, :index? + authorize :preview_card, :review? @preview_cards = filtered_preview_cards.page(params[:page]) @form = Trends::PreviewCardBatch.new end def batch + authorize :preview_card, :review? + @form = Trends::PreviewCardBatch.new(trends_preview_card_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/trends/statuses_controller.rb b/app/controllers/admin/trends/statuses_controller.rb index 766242738..c538962f9 100644 --- a/app/controllers/admin/trends/statuses_controller.rb +++ b/app/controllers/admin/trends/statuses_controller.rb @@ -2,13 +2,15 @@ class Admin::Trends::StatusesController < Admin::BaseController def index - authorize :status, :index? + authorize :status, :review? @statuses = filtered_statuses.page(params[:page]) @form = Trends::StatusBatch.new end def batch + authorize :status, :review? + @form = Trends::StatusBatch.new(trends_status_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/trends/tags_controller.rb b/app/controllers/admin/trends/tags_controller.rb index f4d1ec0d1..98dd6c8ec 100644 --- a/app/controllers/admin/trends/tags_controller.rb +++ b/app/controllers/admin/trends/tags_controller.rb @@ -2,13 +2,15 @@ class Admin::Trends::TagsController < Admin::BaseController def index - authorize :tag, :index? + authorize :tag, :review? @tags = filtered_tags.page(params[:page]) @form = Trends::TagBatch.new end def batch + authorize :tag, :review? + @form = Trends::TagBatch.new(trends_tag_batch_params.merge(current_account: current_account, action: action_from_button)) @form.save rescue ActionController::ParameterMissing diff --git a/app/controllers/admin/users/roles_controller.rb b/app/controllers/admin/users/roles_controller.rb new file mode 100644 index 000000000..0db50cee9 --- /dev/null +++ b/app/controllers/admin/users/roles_controller.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Admin + class Users::RolesController < BaseController + before_action :set_user + + def show + authorize @user, :change_role? + end + + def update + authorize @user, :change_role? + + @user.current_account = current_account + + if @user.update(resource_params) + redirect_to admin_account_path(@user.account_id), notice: I18n.t('admin.accounts.change_role.changed_msg') + else + render :show + end + end + + private + + def set_user + @user = User.find(params[:user_id]) + end + + def resource_params + params.require(:user).permit(:role_id) + end + end +end diff --git a/app/controllers/admin/two_factor_authentications_controller.rb b/app/controllers/admin/users/two_factor_authentications_controller.rb index f7fb7eb8f..5e3fb2b3c 100644 --- a/app/controllers/admin/two_factor_authentications_controller.rb +++ b/app/controllers/admin/users/two_factor_authentications_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module Admin - class TwoFactorAuthenticationsController < BaseController + class Users::TwoFactorAuthenticationsController < BaseController before_action :set_target_user def destroy diff --git a/app/controllers/api/v1/admin/account_actions_controller.rb b/app/controllers/api/v1/admin/account_actions_controller.rb index 6c9e04402..7249797a4 100644 --- a/app/controllers/api/v1/admin/account_actions_controller.rb +++ b/app/controllers/api/v1/admin/account_actions_controller.rb @@ -1,11 +1,16 @@ # frozen_string_literal: true class Api::V1::Admin::AccountActionsController < Api::BaseController + include Authorization + before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:accounts' } - before_action :require_staff! before_action :set_account + after_action :verify_authorized + def create + authorize @account, :show? + account_action = Admin::AccountAction.new(resource_params) account_action.target_account = @account account_action.current_account = current_account diff --git a/app/controllers/api/v1/admin/accounts_controller.rb b/app/controllers/api/v1/admin/accounts_controller.rb index 65ed69f7b..0dee02e94 100644 --- a/app/controllers/api/v1/admin/accounts_controller.rb +++ b/app/controllers/api/v1/admin/accounts_controller.rb @@ -8,11 +8,11 @@ class Api::V1::Admin::AccountsController < Api::BaseController 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 before_action :require_local_account!, only: [:enable, :approve, :reject] + after_action :verify_authorized after_action :insert_pagination_headers, only: :index FILTER_PARAMS = %i( @@ -119,7 +119,9 @@ class Api::V1::Admin::AccountsController < Api::BaseController translated_params[:status] = status.to_s if params[status].present? end - translated_params[:permissions] = 'staff' if params[:staff].present? + if params[:staff].present? + translated_params[:role_ids] = UserRole.that_can(:manage_reports).map(&:id) + end translated_params end diff --git a/app/controllers/api/v1/admin/dimensions_controller.rb b/app/controllers/api/v1/admin/dimensions_controller.rb index 49a5be1c3..4a72ad08b 100644 --- a/app/controllers/api/v1/admin/dimensions_controller.rb +++ b/app/controllers/api/v1/admin/dimensions_controller.rb @@ -1,11 +1,15 @@ # frozen_string_literal: true class Api::V1::Admin::DimensionsController < Api::BaseController + include Authorization + before_action -> { authorize_if_got_token! :'admin:read' } - before_action :require_staff! before_action :set_dimensions + after_action :verify_authorized + def create + authorize :dashboard, :index? render json: @dimensions, each_serializer: REST::Admin::DimensionSerializer end diff --git a/app/controllers/api/v1/admin/domain_allows_controller.rb b/app/controllers/api/v1/admin/domain_allows_controller.rb new file mode 100644 index 000000000..59aa807d6 --- /dev/null +++ b/app/controllers/api/v1/admin/domain_allows_controller.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +class Api::V1::Admin::DomainAllowsController < Api::BaseController + include Authorization + include AccountableConcern + + LIMIT = 100 + + before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:domain_allows' }, only: [:index, :show] + before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:domain_allows' }, except: [:index, :show] + before_action :set_domain_allows, only: :index + before_action :set_domain_allow, only: [:show, :destroy] + + after_action :verify_authorized + after_action :insert_pagination_headers, only: :index + + PAGINATION_PARAMS = %i(limit).freeze + + def create + authorize :domain_allow, :create? + + @domain_allow = DomainAllow.find_by(resource_params) + + if @domain_allow.nil? + @domain_allow = DomainAllow.create!(resource_params) + log_action :create, @domain_allow + end + + render json: @domain_allow, serializer: REST::Admin::DomainAllowSerializer + end + + def index + authorize :domain_allow, :index? + render json: @domain_allows, each_serializer: REST::Admin::DomainAllowSerializer + end + + def show + authorize @domain_allow, :show? + render json: @domain_allow, serializer: REST::Admin::DomainAllowSerializer + end + + def destroy + authorize @domain_allow, :destroy? + UnallowDomainService.new.call(@domain_allow) + log_action :destroy, @domain_allow + render json: @domain_allow, serializer: REST::Admin::DomainAllowSerializer + end + + private + + def set_domain_allows + @domain_allows = filtered_domain_allows.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) + end + + def set_domain_allow + @domain_allow = DomainAllow.find(params[:id]) + end + + def filtered_domain_allows + # TODO: no filtering yet + DomainAllow.all + end + + def insert_pagination_headers + set_pagination_headers(next_path, prev_path) + end + + def next_path + api_v1_admin_domain_allows_url(pagination_params(max_id: pagination_max_id)) if records_continue? + end + + def prev_path + api_v1_admin_domain_allows_url(pagination_params(min_id: pagination_since_id)) unless @domain_allows.empty? + end + + def pagination_max_id + @domain_allows.last.id + end + + def pagination_since_id + @domain_allows.first.id + end + + def records_continue? + @domain_allows.size == limit_param(LIMIT) + end + + def pagination_params(core_params) + params.slice(*PAGINATION_PARAMS).permit(*PAGINATION_PARAMS).merge(core_params) + end + + def resource_params + params.permit(:domain) + end +end diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb index 229870eee..de8fd9d08 100644 --- a/app/controllers/api/v1/admin/domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb @@ -8,10 +8,10 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:domain_blocks' }, only: [:index, :show] before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:domain_blocks' }, except: [:index, :show] - before_action :require_staff! before_action :set_domain_blocks, only: :index before_action :set_domain_block, only: [:show, :update, :destroy] + after_action :verify_authorized after_action :insert_pagination_headers, only: :index PAGINATION_PARAMS = %i(limit).freeze diff --git a/app/controllers/api/v1/admin/measures_controller.rb b/app/controllers/api/v1/admin/measures_controller.rb index da95d3422..d78d7e10b 100644 --- a/app/controllers/api/v1/admin/measures_controller.rb +++ b/app/controllers/api/v1/admin/measures_controller.rb @@ -1,11 +1,15 @@ # frozen_string_literal: true class Api::V1::Admin::MeasuresController < Api::BaseController + include Authorization + before_action -> { authorize_if_got_token! :'admin:read' } - before_action :require_staff! before_action :set_measures + after_action :verify_authorized + def create + authorize :dashboard, :index? render json: @measures, each_serializer: REST::Admin::MeasureSerializer end diff --git a/app/controllers/api/v1/admin/reports_controller.rb b/app/controllers/api/v1/admin/reports_controller.rb index 865ba3d23..9dfb181a2 100644 --- a/app/controllers/api/v1/admin/reports_controller.rb +++ b/app/controllers/api/v1/admin/reports_controller.rb @@ -8,10 +8,10 @@ class Api::V1::Admin::ReportsController < Api::BaseController 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 + after_action :verify_authorized after_action :insert_pagination_headers, only: :index FILTER_PARAMS = %i( diff --git a/app/controllers/api/v1/admin/retention_controller.rb b/app/controllers/api/v1/admin/retention_controller.rb index 98d1a3d81..59d6b8388 100644 --- a/app/controllers/api/v1/admin/retention_controller.rb +++ b/app/controllers/api/v1/admin/retention_controller.rb @@ -1,11 +1,15 @@ # frozen_string_literal: true class Api::V1::Admin::RetentionController < Api::BaseController + include Authorization + before_action -> { authorize_if_got_token! :'admin:read' } - before_action :require_staff! before_action :set_cohorts + after_action :verify_authorized + def create + authorize :dashboard, :index? render json: @cohorts, each_serializer: REST::Admin::CohortSerializer end diff --git a/app/controllers/api/v1/admin/trends/links_controller.rb b/app/controllers/api/v1/admin/trends/links_controller.rb index 0a191fe4b..cc6388980 100644 --- a/app/controllers/api/v1/admin/trends/links_controller.rb +++ b/app/controllers/api/v1/admin/trends/links_controller.rb @@ -1,17 +1,19 @@ # frozen_string_literal: true -class Api::V1::Admin::Trends::LinksController < Api::BaseController +class Api::V1::Admin::Trends::LinksController < Api::V1::Trends::LinksController before_action -> { authorize_if_got_token! :'admin:read' } - before_action :require_staff! - before_action :set_links - - def index - render json: @links, each_serializer: REST::Trends::LinkSerializer - end private - def set_links - @links = Trends.links.query.limit(limit_param(10)) + def enabled? + super || current_user&.can?(:manage_taxonomies) + end + + def links_from_trends + if current_user&.can?(:manage_taxonomies) + Trends.links.query + else + super + end end end diff --git a/app/controllers/api/v1/admin/trends/statuses_controller.rb b/app/controllers/api/v1/admin/trends/statuses_controller.rb index cb145f165..c39f77363 100644 --- a/app/controllers/api/v1/admin/trends/statuses_controller.rb +++ b/app/controllers/api/v1/admin/trends/statuses_controller.rb @@ -1,17 +1,19 @@ # frozen_string_literal: true -class Api::V1::Admin::Trends::StatusesController < Api::BaseController +class Api::V1::Admin::Trends::StatusesController < Api::V1::Trends::StatusesController before_action -> { authorize_if_got_token! :'admin:read' } - before_action :require_staff! - before_action :set_statuses - - def index - render json: @statuses, each_serializer: REST::StatusSerializer - end private - def set_statuses - @statuses = cache_collection(Trends.statuses.query.limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status) + def enabled? + super || current_user&.can?(:manage_taxonomies) + end + + def statuses_from_trends + if current_user&.can?(:manage_taxonomies) + Trends.statuses.query + else + super + end end end diff --git a/app/controllers/api/v1/admin/trends/tags_controller.rb b/app/controllers/api/v1/admin/trends/tags_controller.rb index 9c28b0412..f3c0c4b6b 100644 --- a/app/controllers/api/v1/admin/trends/tags_controller.rb +++ b/app/controllers/api/v1/admin/trends/tags_controller.rb @@ -1,17 +1,19 @@ # frozen_string_literal: true -class Api::V1::Admin::Trends::TagsController < Api::BaseController +class Api::V1::Admin::Trends::TagsController < Api::V1::Trends::TagsController 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.query.limit(limit_param(10)) + def enabled? + super || current_user&.can?(:manage_taxonomies) + end + + def tags_from_trends + if current_user&.can?(:manage_taxonomies) + Trends.tags.query + else + super + end end end diff --git a/app/controllers/api/v1/featured_tags/suggestions_controller.rb b/app/controllers/api/v1/featured_tags/suggestions_controller.rb index 75545d3c7..76633210a 100644 --- a/app/controllers/api/v1/featured_tags/suggestions_controller.rb +++ b/app/controllers/api/v1/featured_tags/suggestions_controller.rb @@ -6,7 +6,7 @@ class Api::V1::FeaturedTags::SuggestionsController < Api::BaseController before_action :set_recently_used_tags, only: :index def index - render json: @recently_used_tags, each_serializer: REST::TagSerializer + render json: @recently_used_tags, each_serializer: REST::TagSerializer, relationships: TagRelationshipsPresenter.new(@recently_used_tags, current_user&.account_id) end private diff --git a/app/controllers/api/v1/featured_tags_controller.rb b/app/controllers/api/v1/featured_tags_controller.rb index e4e836c97..c1ead4f54 100644 --- a/app/controllers/api/v1/featured_tags_controller.rb +++ b/app/controllers/api/v1/featured_tags_controller.rb @@ -13,9 +13,7 @@ class Api::V1::FeaturedTagsController < Api::BaseController end def create - @featured_tag = current_account.featured_tags.new(featured_tag_params) - @featured_tag.reset_data - @featured_tag.save! + @featured_tag = current_account.featured_tags.create!(featured_tag_params) render json: @featured_tag, serializer: REST::FeaturedTagSerializer end diff --git a/app/controllers/api/v1/filters/keywords_controller.rb b/app/controllers/api/v1/filters/keywords_controller.rb new file mode 100644 index 000000000..d3718a137 --- /dev/null +++ b/app/controllers/api/v1/filters/keywords_controller.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +class Api::V1::Filters::KeywordsController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:filters' }, only: [:index, :show] + before_action -> { doorkeeper_authorize! :write, :'write:filters' }, except: [:index, :show] + before_action :require_user! + + before_action :set_keywords, only: :index + before_action :set_keyword, only: [:show, :update, :destroy] + + def index + render json: @keywords, each_serializer: REST::FilterKeywordSerializer + end + + def create + @keyword = current_account.custom_filters.find(params[:filter_id]).keywords.create!(resource_params) + + render json: @keyword, serializer: REST::FilterKeywordSerializer + end + + def show + render json: @keyword, serializer: REST::FilterKeywordSerializer + end + + def update + @keyword.update!(resource_params) + + render json: @keyword, serializer: REST::FilterKeywordSerializer + end + + def destroy + @keyword.destroy! + render_empty + end + + private + + def set_keywords + filter = current_account.custom_filters.includes(:keywords).find(params[:filter_id]) + @keywords = filter.keywords + end + + def set_keyword + @keyword = CustomFilterKeyword.includes(:custom_filter).where(custom_filter: { account: current_account }).find(params[:id]) + end + + def resource_params + params.permit(:keyword, :whole_word) + end +end diff --git a/app/controllers/api/v1/filters_controller.rb b/app/controllers/api/v1/filters_controller.rb index b0ace3af0..07cd14147 100644 --- a/app/controllers/api/v1/filters_controller.rb +++ b/app/controllers/api/v1/filters_controller.rb @@ -8,21 +8,32 @@ class Api::V1::FiltersController < Api::BaseController before_action :set_filter, only: [:show, :update, :destroy] def index - render json: @filters, each_serializer: REST::FilterSerializer + render json: @filters, each_serializer: REST::V1::FilterSerializer end def create - @filter = current_account.custom_filters.create!(resource_params) - render json: @filter, serializer: REST::FilterSerializer + ApplicationRecord.transaction do + filter_category = current_account.custom_filters.create!(resource_params) + @filter = filter_category.keywords.create!(keyword_params) + end + + render json: @filter, serializer: REST::V1::FilterSerializer end def show - render json: @filter, serializer: REST::FilterSerializer + render json: @filter, serializer: REST::V1::FilterSerializer end def update - @filter.update!(resource_params) - render json: @filter, serializer: REST::FilterSerializer + ApplicationRecord.transaction do + @filter.update!(keyword_params) + @filter.custom_filter.assign_attributes(filter_params) + raise Mastodon::ValidationError, I18n.t('filters.errors.deprecated_api_multiple_keywords') if @filter.custom_filter.changed? && @filter.custom_filter.keywords.count > 1 + + @filter.custom_filter.save! + end + + render json: @filter, serializer: REST::V1::FilterSerializer end def destroy @@ -33,14 +44,22 @@ class Api::V1::FiltersController < Api::BaseController private def set_filters - @filters = current_account.custom_filters + @filters = CustomFilterKeyword.includes(:custom_filter).where(custom_filter: { account: current_account }) end def set_filter - @filter = current_account.custom_filters.find(params[:id]) + @filter = CustomFilterKeyword.includes(:custom_filter).where(custom_filter: { account: current_account }).find(params[:id]) end def resource_params params.permit(:phrase, :expires_in, :irreversible, :whole_word, context: []) end + + def filter_params + resource_params.slice(:expires_in, :irreversible, :context) + end + + def keyword_params + resource_params.slice(:phrase, :whole_word) + end end diff --git a/app/controllers/api/v1/followed_tags_controller.rb b/app/controllers/api/v1/followed_tags_controller.rb new file mode 100644 index 000000000..f0dfd044c --- /dev/null +++ b/app/controllers/api/v1/followed_tags_controller.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +class Api::V1::FollowedTagsController < Api::BaseController + TAGS_LIMIT = 100 + + before_action -> { doorkeeper_authorize! :follow, :read, :'read:follows' }, except: :show + before_action :require_user! + before_action :set_results + + after_action :insert_pagination_headers, only: :show + + def index + render json: @results.map(&:tag), each_serializer: REST::TagSerializer, relationships: TagRelationshipsPresenter.new(@results.map(&:tag), current_user&.account_id) + end + + private + + def set_results + @results = TagFollow.where(account: current_account).joins(:tag).eager_load(:tag).to_a_paginated_by_id( + limit_param(TAGS_LIMIT), + params_slice(:max_id, :since_id, :min_id) + ) + end + + def insert_pagination_headers + set_pagination_headers(next_path, prev_path) + end + + def next_path + api_v1_followed_tags_url pagination_params(max_id: pagination_max_id) if records_continue? + end + + def prev_path + api_v1_followed_tags_url pagination_params(since_id: pagination_since_id) unless @results.empty? + end + + def pagination_max_id + @results.last.id + end + + def pagination_since_id + @results.first.id + end + + def records_continue? + @results.size == limit_param(TAG_LIMIT) + end + + def pagination_params(core_params) + params.slice(:limit).permit(:limit).merge(core_params) + end +end diff --git a/app/controllers/api/v1/push/subscriptions_controller.rb b/app/controllers/api/v1/push/subscriptions_controller.rb index 47f2e6440..7148d63a4 100644 --- a/app/controllers/api/v1/push/subscriptions_controller.rb +++ b/app/controllers/api/v1/push/subscriptions_controller.rb @@ -52,6 +52,6 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController def data_params return {} if params[:data].blank? - params.require(:data).permit(:policy, alerts: [:follow, :follow_request, :favourite, :reblog, :mention, :poll, :status]) + params.require(:data).permit(:policy, alerts: Notification::TYPES) end end diff --git a/app/controllers/api/v1/tags_controller.rb b/app/controllers/api/v1/tags_controller.rb new file mode 100644 index 000000000..9e5c53330 --- /dev/null +++ b/app/controllers/api/v1/tags_controller.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class Api::V1::TagsController < Api::BaseController + before_action -> { doorkeeper_authorize! :follow, :write, :'write:follows' }, except: :show + before_action :require_user!, except: :show + before_action :set_or_create_tag + + override_rate_limit_headers :follow, family: :follows + + def show + render json: @tag, serializer: REST::TagSerializer + end + + def follow + TagFollow.create!(tag: @tag, account: current_account, rate_limit: true) + render json: @tag, serializer: REST::TagSerializer + end + + def unfollow + TagFollow.find_by(account: current_account, tag: @tag)&.destroy! + render json: @tag, serializer: REST::TagSerializer + end + + private + + def set_or_create_tag + return not_found unless /\A(#{Tag::HASHTAG_NAME_RE})\z/.match?(params[:id]) + @tag = Tag.find_normalized(params[:id]) || Tag.new(name: Tag.normalize(params[:id]), display_name: params[:id]) + end +end diff --git a/app/controllers/api/v1/trends/links_controller.rb b/app/controllers/api/v1/trends/links_controller.rb index 2385fe438..1a9f918f2 100644 --- a/app/controllers/api/v1/trends/links_controller.rb +++ b/app/controllers/api/v1/trends/links_controller.rb @@ -13,10 +13,14 @@ class Api::V1::Trends::LinksController < Api::BaseController private + def enabled? + Setting.trends + end + def set_links @links = begin - if Setting.trends - links_from_trends + if enabled? + links_from_trends.offset(offset_param).limit(limit_param(DEFAULT_LINKS_LIMIT)) else [] end @@ -24,7 +28,7 @@ class Api::V1::Trends::LinksController < Api::BaseController end def links_from_trends - Trends.links.query.allowed.in_locale(content_locale).offset(offset_param).limit(limit_param(DEFAULT_LINKS_LIMIT)) + Trends.links.query.allowed.in_locale(content_locale) end def insert_pagination_headers diff --git a/app/controllers/api/v1/trends/statuses_controller.rb b/app/controllers/api/v1/trends/statuses_controller.rb index 1f2fff582..c275d5fc8 100644 --- a/app/controllers/api/v1/trends/statuses_controller.rb +++ b/app/controllers/api/v1/trends/statuses_controller.rb @@ -11,10 +11,14 @@ class Api::V1::Trends::StatusesController < Api::BaseController private + def enabled? + Setting.trends + end + def set_statuses @statuses = begin - if Setting.trends - cache_collection(statuses_from_trends, Status) + if enabled? + cache_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status) else [] end @@ -24,7 +28,7 @@ class Api::V1::Trends::StatusesController < Api::BaseController def statuses_from_trends scope = Trends.statuses.query.allowed.in_locale(content_locale) scope = scope.filtered_for(current_account) if user_signed_in? - scope.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)) + scope end def insert_pagination_headers diff --git a/app/controllers/api/v1/trends/tags_controller.rb b/app/controllers/api/v1/trends/tags_controller.rb index 38003f599..21adfa2a1 100644 --- a/app/controllers/api/v1/trends/tags_controller.rb +++ b/app/controllers/api/v1/trends/tags_controller.rb @@ -8,21 +8,29 @@ class Api::V1::Trends::TagsController < Api::BaseController DEFAULT_TAGS_LIMIT = 10 def index - render json: @tags, each_serializer: REST::TagSerializer + render json: @tags, each_serializer: REST::TagSerializer, relationships: TagRelationshipsPresenter.new(@tags, current_user&.account_id) end private + def enabled? + Setting.trends + end + def set_tags @tags = begin - if Setting.trends - Trends.tags.query.allowed.offset(offset_param).limit(limit_param(DEFAULT_TAGS_LIMIT)) + if enabled? + tags_from_trends.offset(offset_param).limit(limit_param(DEFAULT_TAGS_LIMIT)) else [] end end end + def tags_from_trends + Trends.tags.query.allowed + end + def insert_pagination_headers set_pagination_headers(next_path, prev_path) end diff --git a/app/controllers/api/v2/admin/accounts_controller.rb b/app/controllers/api/v2/admin/accounts_controller.rb index a89e6835e..bcc1a0733 100644 --- a/app/controllers/api/v2/admin/accounts_controller.rb +++ b/app/controllers/api/v2/admin/accounts_controller.rb @@ -11,6 +11,7 @@ class Api::V2::Admin::AccountsController < Api::V1::Admin::AccountsController email ip invited_by + role_ids ).freeze PAGINATION_PARAMS = (%i(limit) + FILTER_PARAMS).freeze @@ -18,7 +19,17 @@ class Api::V2::Admin::AccountsController < Api::V1::Admin::AccountsController private def filtered_accounts - AccountFilter.new(filter_params).results + AccountFilter.new(translated_filter_params).results + end + + def translated_filter_params + translated_params = filter_params.slice(*AccountFilter::KEYS) + + if params[:permissions] == 'staff' + translated_params[:role_ids] = UserRole.that_can(:manage_reports).map(&:id) + end + + translated_params end def filter_params diff --git a/app/controllers/api/v2/filters_controller.rb b/app/controllers/api/v2/filters_controller.rb new file mode 100644 index 000000000..8ff3076cf --- /dev/null +++ b/app/controllers/api/v2/filters_controller.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class Api::V2::FiltersController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:filters' }, only: [:index, :show] + before_action -> { doorkeeper_authorize! :write, :'write:filters' }, except: [:index, :show] + before_action :require_user! + before_action :set_filters, only: :index + before_action :set_filter, only: [:show, :update, :destroy] + + def index + render json: @filters, each_serializer: REST::FilterSerializer, rules_requested: true + end + + def create + @filter = current_account.custom_filters.create!(resource_params) + + render json: @filter, serializer: REST::FilterSerializer, rules_requested: true + end + + def show + render json: @filter, serializer: REST::FilterSerializer, rules_requested: true + end + + def update + @filter.update!(resource_params) + + render json: @filter, serializer: REST::FilterSerializer, rules_requested: true + end + + def destroy + @filter.destroy! + render_empty + end + + private + + def set_filters + @filters = current_account.custom_filters.includes(:keywords) + end + + def set_filter + @filter = current_account.custom_filters.find(params[:id]) + end + + def resource_params + params.permit(:title, :expires_in, :filter_action, context: [], keywords_attributes: [:id, :keyword, :whole_word, :_destroy]) + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0f948ff5f..ee3c5204d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -58,14 +58,6 @@ class ApplicationController < ActionController::Base store_location_for(:user, request.url) unless [:json, :rss].include?(request.format&.to_sym) end - def require_admin! - forbidden unless current_user&.admin? - end - - def require_staff! - forbidden unless current_user&.staff? - end - def require_functional! redirect_to edit_user_registration_path unless current_user.functional? end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 056f8a9f1..13dfebcdd 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -8,12 +8,18 @@ class Auth::SessionsController < Devise::SessionsController skip_before_action :update_user_sign_in prepend_before_action :set_pack + prepend_before_action :check_suspicious!, only: [:create] include TwoFactorAuthenticationConcern before_action :set_instance_presenter, only: [:new] before_action :set_body_classes + def check_suspicious! + user = find_user + @login_is_suspicious = suspicious_sign_in?(user) unless user.nil? + end + def create super do |resource| # We only need to call this if this hasn't already been @@ -148,7 +154,7 @@ class Auth::SessionsController < Devise::SessionsController user_agent: request.user_agent ) - UserMailer.suspicious_sign_in(user, request.remote_ip, request.user_agent, Time.now.utc).deliver_later! if suspicious_sign_in?(user) + UserMailer.suspicious_sign_in(user, request.remote_ip, request.user_agent, Time.now.utc).deliver_later! if @login_is_suspicious end def suspicious_sign_in?(user) diff --git a/app/controllers/custom_css_controller.rb b/app/controllers/custom_css_controller.rb index e1dc5eaf6..9270c467d 100644 --- a/app/controllers/custom_css_controller.rb +++ b/app/controllers/custom_css_controller.rb @@ -13,6 +13,6 @@ class CustomCssController < ApplicationController def show expires_in 3.minutes, public: true request.session_options[:skip] = true - render plain: Setting.custom_css || '', content_type: 'text/css' + render content_type: 'text/css' end end diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb index 0d4c1b97c..6d778312e 100644 --- a/app/controllers/filters_controller.rb +++ b/app/controllers/filters_controller.rb @@ -4,17 +4,17 @@ class FiltersController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_filters, only: :index before_action :set_filter, only: [:edit, :update, :destroy] before_action :set_pack before_action :set_body_classes def index - @filters = current_account.custom_filters.order(:phrase) + @filters = current_account.custom_filters.includes(:keywords).order(:phrase) end def new - @filter = current_account.custom_filters.build + @filter = current_account.custom_filters.build(action: :warn) + @filter.keywords.build end def create @@ -48,16 +48,12 @@ class FiltersController < ApplicationController use_pack 'settings' end - def set_filters - @filters = current_account.custom_filters - end - def set_filter @filter = current_account.custom_filters.find(params[:id]) end def resource_params - params.require(:custom_filter).permit(:phrase, :expires_in, :irreversible, :whole_word, context: []) + params.require(:custom_filter).permit(:title, :expires_in, :filter_action, context: [], keywords_attributes: [:id, :keyword, :whole_word, :_destroy]) end def set_body_classes diff --git a/app/controllers/settings/featured_tags_controller.rb b/app/controllers/settings/featured_tags_controller.rb index e805527d0..aadff7c83 100644 --- a/app/controllers/settings/featured_tags_controller.rb +++ b/app/controllers/settings/featured_tags_controller.rb @@ -11,7 +11,6 @@ class Settings::FeaturedTagsController < Settings::BaseController def create @featured_tag = current_account.featured_tags.new(featured_tag_params) - @featured_tag.reset_data if @featured_tag.save redirect_to settings_featured_tags_path diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb index d2e198265..2a17b69e3 100644 --- a/app/helpers/accounts_helper.rb +++ b/app/helpers/accounts_helper.rb @@ -61,21 +61,13 @@ module AccountsHelper end end - def account_badge(account, all: false) + def account_badge(account) if account.bot? content_tag(:div, content_tag(:div, t('accounts.roles.bot'), class: 'account-role bot'), class: 'roles') elsif account.group? content_tag(:div, content_tag(:div, t('accounts.roles.group'), class: 'account-role group'), class: 'roles') - elsif (Setting.show_staff_badge && account.user_staff?) || all - content_tag(:div, class: 'roles') do - if all && !account.user_staff? - content_tag(:div, t('admin.accounts.roles.user'), class: 'account-role') - elsif account.user_admin? - content_tag(:div, t('accounts.roles.admin'), class: 'account-role admin') - elsif account.user_moderator? - content_tag(:div, t('accounts.roles.moderator'), class: 'account-role moderator') - end - end + elsif account.user_role&.highlighted? + content_tag(:div, content_tag(:div, account.user_role.name, class: "account-role user-role-#{account.user_role.id}"), class: 'roles') end end diff --git a/app/helpers/routing_helper.rb b/app/helpers/routing_helper.rb index f95f46a56..0d5a8505a 100644 --- a/app/helpers/routing_helper.rb +++ b/app/helpers/routing_helper.rb @@ -16,7 +16,11 @@ module RoutingHelper def full_asset_url(source, **options) source = ActionController::Base.helpers.asset_url(source, **options) unless use_storage? - URI.join(root_url, source).to_s + URI.join(asset_host, source).to_s + end + + def asset_host + Rails.configuration.action_controller.asset_host || root_url end def full_pack_url(source, **options) diff --git a/app/javascript/flavours/glitch/actions/importer/index.js b/app/javascript/flavours/glitch/actions/importer/index.js index f4372fb31..ec41fea6e 100644 --- a/app/javascript/flavours/glitch/actions/importer/index.js +++ b/app/javascript/flavours/glitch/actions/importer/index.js @@ -63,7 +63,7 @@ export function importFetchedStatuses(statuses) { const polls = []; function processStatus(status) { - pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(['statuses', status.id]))); + pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(['statuses', status.id]), getState().get('local_settings'))); pushUnique(accounts, status.account); if (status.reblog && status.reblog.id) { diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js index c38af196a..c6acdbdbb 100644 --- a/app/javascript/flavours/glitch/actions/importer/normalizer.js +++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js @@ -1,6 +1,7 @@ import escapeTextContentForBrowser from 'escape-html'; import emojify from 'flavours/glitch/util/emoji'; import { unescapeHTML } from 'flavours/glitch/util/html'; +import { autoHideCW } from 'flavours/glitch/util/content_warning'; const domParser = new DOMParser(); @@ -41,7 +42,7 @@ export function normalizeAccount(account) { return account; } -export function normalizeStatus(status, normalOldStatus) { +export function normalizeStatus(status, normalOldStatus, settings) { const normalStatus = { ...status }; normalStatus.account = status.account.id; @@ -60,6 +61,7 @@ export function normalizeStatus(status, normalOldStatus) { normalStatus.search_index = normalOldStatus.get('search_index'); normalStatus.contentHtml = normalOldStatus.get('contentHtml'); normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml'); + normalStatus.hidden = normalOldStatus.get('hidden'); } else { const spoilerText = normalStatus.spoiler_text || ''; 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(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n'); @@ -68,6 +70,7 @@ export function normalizeStatus(status, normalOldStatus) { normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent; normalStatus.contentHtml = emojify(normalStatus.content, emojiMap); normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(spoilerText), emojiMap); + normalStatus.hidden = (spoilerText.length > 0 || normalStatus.sensitive) && autoHideCW(settings, spoilerText); } return normalStatus; diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js index 85938867b..3993b1ea5 100644 --- a/app/javascript/flavours/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -103,6 +103,10 @@ export function updateNotifications(notification, intlMessages, intlLocale) { dispatch(importFetchedStatus(notification.status)); } + if (notification.report) { + dispatch(importFetchedAccount(notification.report.target_account)); + } + dispatch({ type: NOTIFICATIONS_UPDATE, notification, @@ -146,6 +150,7 @@ const excludeTypesFromFilter = filter => { 'status', 'update', 'admin.sign_up', + 'admin.report', ]); return allTypes.filterNot(item => item === filter).toJS(); @@ -191,6 +196,7 @@ export function expandNotifications({ maxId } = {}, done = noOp) { dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); + dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems)); fetchRelatedRelationships(dispatch, response.data); diff --git a/app/javascript/flavours/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js index 6ffcf181d..1f223f22e 100644 --- a/app/javascript/flavours/glitch/actions/statuses.js +++ b/app/javascript/flavours/glitch/actions/statuses.js @@ -24,6 +24,10 @@ export const STATUS_UNMUTE_REQUEST = 'STATUS_UNMUTE_REQUEST'; export const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS'; export const STATUS_UNMUTE_FAIL = 'STATUS_UNMUTE_FAIL'; +export const STATUS_REVEAL = 'STATUS_REVEAL'; +export const STATUS_HIDE = 'STATUS_HIDE'; +export const STATUS_COLLAPSE = 'STATUS_COLLAPSE'; + export const REDRAFT = 'REDRAFT'; export const STATUS_FETCH_SOURCE_REQUEST = 'STATUS_FETCH_SOURCE_REQUEST'; @@ -277,3 +281,33 @@ export function unmuteStatusFail(id, error) { error, }; }; + +export function hideStatus(ids) { + if (!Array.isArray(ids)) { + ids = [ids]; + } + + return { + type: STATUS_HIDE, + ids, + }; +}; + +export function revealStatus(ids) { + if (!Array.isArray(ids)) { + ids = [ids]; + } + + return { + type: STATUS_REVEAL, + ids, + }; +}; + +export function toggleStatusCollapse(id, isCollapsed) { + return { + type: STATUS_COLLAPSE, + id, + isCollapsed, + }; +} diff --git a/app/javascript/flavours/glitch/components/hashtag.js b/app/javascript/flavours/glitch/components/hashtag.js index 769185a2b..5bbf32c87 100644 --- a/app/javascript/flavours/glitch/components/hashtag.js +++ b/app/javascript/flavours/glitch/components/hashtag.js @@ -1,7 +1,7 @@ // @ts-check import React from 'react'; import { Sparklines, SparklinesCurve } from 'react-sparklines'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Permalink from './permalink'; @@ -9,6 +9,10 @@ import ShortNumber from 'flavours/glitch/components/short_number'; import Skeleton from 'flavours/glitch/components/skeleton'; import classNames from 'classnames'; +const messages = defineMessages({ + totalVolume: { id: 'hashtag.total_volume', defaultMessage: 'Total volume in the last {days, plural, one {day} other {{days} days}}' }, +}); + class SilentErrorBoundary extends React.Component { static propTypes = { @@ -41,10 +45,11 @@ class SilentErrorBoundary extends React.Component { const accountsCountRenderer = (displayNumber, pluralReady) => ( <FormattedMessage id='trends.counter_by_accounts' - defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} talking' + defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}' values={{ count: pluralReady, counter: <strong>{displayNumber}</strong>, + days: 2, }} /> ); @@ -64,7 +69,7 @@ ImmutableHashtag.propTypes = { hashtag: ImmutablePropTypes.map.isRequired, }; -const Hashtag = ({ name, href, to, people, uses, history, className }) => ( +const Hashtag = injectIntl(({ name, href, to, people, uses, history, className, intl }) => ( <div className={classNames('trends__item', className)}> <div className='trends__item__name'> <Permalink href={href} to={to}> @@ -74,9 +79,10 @@ const Hashtag = ({ name, href, to, people, uses, history, className }) => ( {typeof people !== 'undefined' ? <ShortNumber value={people} renderer={accountsCountRenderer} /> : <Skeleton width={100} />} </div> - <div className='trends__item__current'> + <abbr className='trends__item__current' title={intl.formatMessage(messages.totalVolume, { days: 2 })}> {typeof uses !== 'undefined' ? <ShortNumber value={uses} /> : <Skeleton width={42} height={36} />} - </div> + <span className='trends__item__current__asterisk'>*</span> + </abbr> <div className='trends__item__sparkline'> <SilentErrorBoundary> @@ -86,7 +92,7 @@ const Hashtag = ({ name, href, to, people, uses, history, className }) => ( </SilentErrorBoundary> </div> </div> -); +)); Hashtag.propTypes = { name: PropTypes.string, diff --git a/app/javascript/flavours/glitch/components/icon_button.js b/app/javascript/flavours/glitch/components/icon_button.js index 9a05badd0..be2468d68 100644 --- a/app/javascript/flavours/glitch/components/icon_button.js +++ b/app/javascript/flavours/glitch/components/icon_button.js @@ -140,8 +140,16 @@ export default class IconButton extends React.PureComponent { ); if (href) { - contents = ( - <a href={href} target='_blank' rel='noopener noreferrer'> + return ( + <a + href={href} + aria-label={title} + title={title} + target='_blank' + rel='noopener noreferrer' + className={classes} + style={style} + > {contents} </a> ); diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 8a5fda676..11c81765b 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -81,8 +81,8 @@ class Status extends ImmutablePureComponent { onBlock: PropTypes.func, onEmbed: PropTypes.func, onHeightChange: PropTypes.func, + onToggleHidden: PropTypes.func, muted: PropTypes.bool, - collapse: PropTypes.bool, hidden: PropTypes.bool, unread: PropTypes.bool, prepend: PropTypes.string, @@ -121,7 +121,6 @@ class Status extends ImmutablePureComponent { 'settings', 'prepend', 'muted', - 'collapse', 'notification', 'hidden', 'expanded', @@ -149,14 +148,14 @@ class Status extends ImmutablePureComponent { let updated = false; // Make sure the state mirrors props we track… - if (nextProps.collapse !== prevState.collapseProp) { - update.collapseProp = nextProps.collapse; - updated = true; - } if (nextProps.expanded !== prevState.expandedProp) { update.expandedProp = nextProps.expanded; updated = true; } + if (nextProps.status?.get('hidden') !== prevState.statusPropHidden) { + update.statusPropHidden = nextProps.status?.get('hidden'); + updated = true; + } // Update state based on new props if (!nextProps.settings.getIn(['collapsed', 'enabled'])) { @@ -164,14 +163,19 @@ class Status extends ImmutablePureComponent { update.isCollapsed = false; updated = true; } - } else if ( - nextProps.collapse !== prevState.collapseProp && - nextProps.collapse !== undefined + } + + // Handle uncollapsing toots when the shared CW state is expanded + if (nextProps.settings.getIn(['content_warnings', 'shared_state']) && + nextProps.status?.get('spoiler_text')?.length && nextProps.status?.get('hidden') === false && + prevState.statusPropHidden !== false && prevState.isCollapsed ) { - update.isCollapsed = nextProps.collapse; - if (nextProps.collapse) update.isExpanded = false; + update.isCollapsed = false; updated = true; } + + // The “expanded” prop is used to one-off change the local state. + // It's used in the thread view when unfolding/re-folding all CWs at once. if (nextProps.expanded !== prevState.expandedProp && nextProps.expanded !== undefined ) { @@ -180,15 +184,9 @@ class Status extends ImmutablePureComponent { updated = true; } - if (nextProps.expanded === undefined && - prevState.isExpanded === undefined && - update.isExpanded === undefined - ) { - const isExpanded = autoUnfoldCW(nextProps.settings, nextProps.status); - if (isExpanded !== undefined) { - update.isExpanded = isExpanded; - updated = true; - } + if (prevState.isExpanded === undefined && update.isExpanded === undefined) { + update.isExpanded = autoUnfoldCW(nextProps.settings, nextProps.status); + updated = true; } if (nextProps.status && nextProps.status.get('id') !== prevState.statusId) { @@ -243,22 +241,18 @@ class Status extends ImmutablePureComponent { const autoCollapseSettings = settings.getIn(['collapsed', 'auto']); - if (function () { - switch (true) { - case !!collapse: - case !!autoCollapseSettings.get('all'): - case autoCollapseSettings.get('notifications') && !!muted: - case autoCollapseSettings.get('lengthy') && node.clientHeight > ( - status.get('media_attachments').size && !muted ? 650 : 400 - ): - case autoCollapseSettings.get('reblogs') && prepend === 'reblogged_by': - case autoCollapseSettings.get('replies') && status.get('in_reply_to_id', null) !== null: - case autoCollapseSettings.get('media') && !(status.get('spoiler_text').length) && !!status.get('media_attachments').size: - return true; - default: - return false; - } - }()) { + // Don't autocollapse if CW state is shared and status is explicitly revealed, + // as it could cause surprising changes when receiving notifications + if (settings.getIn(['content_warnings', 'shared_state']) && status.get('spoiler_text').length && !status.get('hidden')) return; + + if (collapse || + autoCollapseSettings.get('all') || + (autoCollapseSettings.get('notifications') && muted) || + (autoCollapseSettings.get('lengthy') && node.clientHeight > ((status.get('media_attachments').size && !muted) ? 650 : 400)) || + (autoCollapseSettings.get('reblogs') && prepend === 'reblogged_by') || + (autoCollapseSettings.get('replies') && status.get('in_reply_to_id', null) !== null) || + (autoCollapseSettings.get('media') && !(status.get('spoiler_text').length) && status.get('media_attachments').size > 0) + ) { this.setCollapsed(true); // Hack to fix timeline jumps on second rendering when auto-collapsing this.setState({ autoCollapsed: true }); @@ -309,16 +303,20 @@ class Status extends ImmutablePureComponent { // is enabled, so we don't have to. setCollapsed = (value) => { if (this.props.settings.getIn(['collapsed', 'enabled'])) { - this.setState({ isCollapsed: value }); if (value) { this.setExpansion(false); } + this.setState({ isCollapsed: value }); } else { this.setState({ isCollapsed: false }); } } setExpansion = (value) => { + if (this.props.settings.getIn(['content_warnings', 'shared_state']) && this.props.status.get('hidden') === value) { + this.props.onToggleHidden(this.props.status); + } + this.setState({ isExpanded: value }); if (value) { this.setCollapsed(false); @@ -365,7 +363,9 @@ class Status extends ImmutablePureComponent { } handleExpandedToggle = () => { - if (this.props.status.get('spoiler_text')) { + if (this.props.settings.getIn(['content_warnings', 'shared_state'])) { + this.props.onToggleHidden(this.props.status); + } else if (this.props.status.get('spoiler_text')) { this.setExpansion(!this.state.isExpanded); } }; @@ -505,16 +505,31 @@ class Status extends ImmutablePureComponent { usingPiP, ...other } = this.props; - const { isExpanded, isCollapsed, forceFilter } = this.state; + const { isCollapsed, forceFilter } = this.state; let background = null; let attachments = null; - let media = []; - let mediaIcons = []; + + // Depending on user settings, some media are considered as parts of the + // contents (affected by CW) while other will be displayed outside of the + // CW. + let contentMedia = []; + let contentMediaIcons = []; + let extraMedia = []; + let extraMediaIcons = []; + let media = contentMedia; + let mediaIcons = contentMediaIcons; + + if (settings.getIn(['content_warnings', 'media_outside'])) { + media = extraMedia; + mediaIcons = extraMediaIcons; + } if (status === null) { return null; } + const isExpanded = settings.getIn(['content_warnings', 'shared_state']) ? !status.get('hidden') : this.state.isExpanded; + const handlers = { reply: this.handleHotkeyReply, favourite: this.handleHotkeyFavourite, @@ -681,8 +696,8 @@ class Status extends ImmutablePureComponent { } if (status.get('poll')) { - media.push(<PollContainer pollId={status.get('poll')} />); - mediaIcons.push('tasks'); + contentMedia.push(<PollContainer pollId={status.get('poll')} />); + contentMediaIcons.push('tasks'); } // Here we prepare extra data-* attributes for CSS selectors. @@ -748,7 +763,7 @@ class Status extends ImmutablePureComponent { </span> <StatusIcons status={status} - mediaIcons={mediaIcons} + mediaIcons={contentMediaIcons.concat(extraMediaIcons)} collapsible={settings.getIn(['collapsed', 'enabled'])} collapsed={isCollapsed} setCollapsed={setCollapsed} @@ -757,8 +772,9 @@ class Status extends ImmutablePureComponent { </header> <StatusContent status={status} - media={media} - mediaIcons={mediaIcons} + media={contentMedia} + extraMedia={extraMedia} + mediaIcons={contentMediaIcons} expanded={isExpanded} onExpandedToggle={this.handleExpandedToggle} parseClick={parseClick} @@ -766,6 +782,7 @@ class Status extends ImmutablePureComponent { tagLinks={settings.get('tag_misleading_links')} rewriteMentions={settings.get('rewrite_mentions')} /> + {!isCollapsed || !(muted || !settings.getIn(['collapsed', 'show_action_bar'])) ? ( <StatusActionBar {...other} diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js index 0a5c5b69d..667afac5a 100644 --- a/app/javascript/flavours/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -5,10 +5,11 @@ import IconButton from './icon_button'; import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me, isStaff } from 'flavours/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; import RelativeTimestamp from './relative_timestamp'; import { accountAdminLink, statusAdminLink } from 'flavours/glitch/util/backend_links'; import classNames from 'classnames'; +import { PERMISSION_MANAGE_USERS } from 'flavours/glitch/permissions'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, @@ -47,6 +48,7 @@ class StatusActionBar extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, + identity: PropTypes.object, }; static propTypes = { @@ -240,7 +242,7 @@ class StatusActionBar extends ImmutablePureComponent { menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick }); menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport }); - if (isStaff && (accountAdminLink || statusAdminLink)) { + if ((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && (accountAdminLink || statusAdminLink)) { menu.push(null); if (accountAdminLink !== undefined) { menu.push({ diff --git a/app/javascript/flavours/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js index 6a027f8d2..39891da4f 100644 --- a/app/javascript/flavours/glitch/components/status_content.js +++ b/app/javascript/flavours/glitch/components/status_content.js @@ -70,6 +70,7 @@ export default class StatusContent extends React.PureComponent { collapsed: PropTypes.bool, onExpandedToggle: PropTypes.func, media: PropTypes.node, + extraMedia: PropTypes.node, mediaIcons: PropTypes.arrayOf(PropTypes.string), parseClick: PropTypes.func, disabled: PropTypes.bool, @@ -256,6 +257,7 @@ export default class StatusContent extends React.PureComponent { const { status, media, + extraMedia, mediaIcons, parseClick, disabled, @@ -351,6 +353,8 @@ export default class StatusContent extends React.PureComponent { {media} </div> + {extraMedia} + </div> ); } else if (parseClick) { @@ -372,6 +376,7 @@ export default class StatusContent extends React.PureComponent { lang={lang} /> {media} + {extraMedia} </div> ); } else { @@ -391,6 +396,7 @@ export default class StatusContent extends React.PureComponent { lang={lang} /> {media} + {extraMedia} </div> ); } diff --git a/app/javascript/flavours/glitch/containers/mastodon.js b/app/javascript/flavours/glitch/containers/mastodon.js index 989e37024..d07b2b3d0 100644 --- a/app/javascript/flavours/glitch/containers/mastodon.js +++ b/app/javascript/flavours/glitch/containers/mastodon.js @@ -31,6 +31,7 @@ const createIdentityContext = state => ({ signedIn: !!state.meta.me, accountId: state.meta.me, accessToken: state.meta.access_token, + permissions: state.role.permissions, }); export default class Mastodon extends React.PureComponent { diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js index 358b89ab9..6c8f261e4 100644 --- a/app/javascript/flavours/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -17,7 +17,14 @@ import { pin, unpin, } from 'flavours/glitch/actions/interactions'; -import { muteStatus, unmuteStatus, deleteStatus, editStatus } from 'flavours/glitch/actions/statuses'; +import { + muteStatus, + unmuteStatus, + deleteStatus, + hideStatus, + revealStatus, + editStatus +} from 'flavours/glitch/actions/statuses'; import { initMuteModal } from 'flavours/glitch/actions/mutes'; import { initBlockModal } from 'flavours/glitch/actions/blocks'; import { initReport } from 'flavours/glitch/actions/reports'; @@ -252,6 +259,14 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ } }, + onToggleHidden (status) { + if (status.get('hidden')) { + dispatch(revealStatus(status.get('id'))); + } else { + dispatch(hideStatus(status.get('id'))); + } + }, + deployPictureInPicture (status, type, mediaProps) { dispatch((_, getState) => { if (getState().getIn(['local_settings', 'media', 'pop_in_player'])) { diff --git a/app/javascript/flavours/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js index 45aba53f7..53170b7a6 100644 --- a/app/javascript/flavours/glitch/features/account/components/header.js +++ b/app/javascript/flavours/glitch/features/account/components/header.js @@ -3,7 +3,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { autoPlayGif, me, isStaff } from 'flavours/glitch/util/initial_state'; +import { autoPlayGif, me } from 'flavours/glitch/util/initial_state'; import { preferencesLink, profileLink, accountAdminLink } from 'flavours/glitch/util/backend_links'; import classNames from 'classnames'; import Icon from 'flavours/glitch/components/icon'; @@ -13,6 +13,7 @@ import Button from 'flavours/glitch/components/button'; import { NavLink } from 'react-router-dom'; import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import AccountNoteContainer from '../containers/account_note_container'; +import { PERMISSION_MANAGE_USERS } from 'flavours/glitch/permissions'; const messages = defineMessages({ unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, @@ -64,6 +65,10 @@ const dateFormatOptions = { export default @injectIntl class Header extends ImmutablePureComponent { + static contextTypes = { + identity: PropTypes.object, + }; + static propTypes = { account: ImmutablePropTypes.map, identity_props: ImmutablePropTypes.list, @@ -244,7 +249,7 @@ class Header extends ImmutablePureComponent { } } - if (account.get('id') !== me && isStaff && accountAdminLink) { + if (account.get('id') !== me && (this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && accountAdminLink) { menu.push(null); menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: accountAdminLink(account.get('id')) }); } diff --git a/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.js b/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.js index 202d96676..7107c9db3 100644 --- a/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.js @@ -132,6 +132,8 @@ class Conversation extends ImmutablePureComponent { } handleShowMore = () => { + this.props.onToggleHidden(this.props.lastStatus); + if (this.props.lastStatus.get('spoiler_text')) { this.setExpansion(!this.state.isExpanded); } @@ -143,12 +145,13 @@ class Conversation extends ImmutablePureComponent { render () { const { accounts, lastStatus, unread, scrollKey, intl } = this.props; - const { isExpanded } = this.state; if (lastStatus === null) { return null; } + const isExpanded = this.props.settings.getIn(['content_warnings', 'shared_state']) ? !lastStatus.get('hidden') : this.state.isExpanded; + const menu = [ { text: intl.formatMessage(messages.open), action: this.handleClick }, null, diff --git a/app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js b/app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js index b15ce9f0f..f5e5946e3 100644 --- a/app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js @@ -23,6 +23,7 @@ const mapStateToProps = () => { accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), unread: conversation.get('unread'), lastStatus: lastStatusId && getStatus(state, { id: lastStatusId }), + settings: state.get('local_settings'), }; }; }; diff --git a/app/javascript/flavours/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js index 2490b6e2d..ffa4e3409 100644 --- a/app/javascript/flavours/glitch/features/local_settings/page/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/page/index.js @@ -303,38 +303,59 @@ class LocalSettingsPage extends React.PureComponent { ({ intl, onChange, settings }) => ( <div className='glitch local-settings__page content_warnings'> <h1><FormattedMessage id='settings.content_warnings' defaultMessage='Content warnings' /></h1> - <DeprecatedLocalSettingsPageItem - id='mastodon-settings--content_warnings-auto_unfold' - value={expandSpoilers} + <LocalSettingsPageItem + settings={settings} + item={['content_warnings', 'shared_state']} + id='mastodon-settings--content_warnings-shared_state' + onChange={onChange} > - <FormattedMessage id='settings.enable_content_warnings_auto_unfold' defaultMessage='Automatically unfold content-warnings' /> - <span className='hint'> - <FormattedMessage - id='settings.deprecated_setting' - defaultMessage="This setting is now controlled from Mastodon's {settings_page_link}" - values={{ - settings_page_link: ( - <a href={preferenceLink('user_setting_expand_spoilers')}> - <FormattedMessage - id='settings.shared_settings_link' - defaultMessage='user preferences' - /> - </a> - ) - }} - /> - </span> - </DeprecatedLocalSettingsPageItem> + <FormattedMessage id='settings.content_warnings_shared_state' defaultMessage='Show/hide content of all copies at once' /> + <span className='hint'><FormattedMessage id='settings.content_warnings_shared_state_hint' defaultMessage='Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW' /></span> + </LocalSettingsPageItem> <LocalSettingsPageItem settings={settings} - item={['content_warnings', 'filter']} - id='mastodon-settings--content_warnings-auto_unfold' + item={['content_warnings', 'media_outside']} + id='mastodon-settings--content_warnings-media_outside' onChange={onChange} - placeholder={intl.formatMessage(messages.regexp)} - disabled={!expandSpoilers} > - <FormattedMessage id='settings.content_warnings_filter' defaultMessage='Content warnings to not automatically unfold:' /> + <FormattedMessage id='settings.content_warnings_media_outside' defaultMessage='Display media attachments outside content warnings' /> + <span className='hint'><FormattedMessage id='settings.content_warnings_media_outside_hint' defaultMessage='Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments' /></span> </LocalSettingsPageItem> + <section> + <h2><FormattedMessage id='settings.content_warnings_unfold_opts' defaultMessage='Auto-unfolding options' /></h2> + <DeprecatedLocalSettingsPageItem + id='mastodon-settings--content_warnings-auto_unfold' + value={expandSpoilers} + > + <FormattedMessage id='settings.enable_content_warnings_auto_unfold' defaultMessage='Automatically unfold content-warnings' /> + <span className='hint'> + <FormattedMessage + id='settings.deprecated_setting' + defaultMessage="This setting is now controlled from Mastodon's {settings_page_link}" + values={{ + settings_page_link: ( + <a href={preferenceLink('user_setting_expand_spoilers')}> + <FormattedMessage + id='settings.shared_settings_link' + defaultMessage='user preferences' + /> + </a> + ) + }} + /> + </span> + </DeprecatedLocalSettingsPageItem> + <LocalSettingsPageItem + settings={settings} + item={['content_warnings', 'filter']} + id='mastodon-settings--content_warnings-auto_unfold' + onChange={onChange} + placeholder={intl.formatMessage(messages.regexp)} + disabled={!expandSpoilers} + > + <FormattedMessage id='settings.content_warnings_filter' defaultMessage='Content warnings to not automatically unfold:' /> + </LocalSettingsPageItem> + </section> </div> ), ({ intl, onChange, settings }) => ( @@ -366,6 +387,7 @@ class LocalSettingsPage extends React.PureComponent { onChange={onChange} > <FormattedMessage id='settings.enable_collapsed' defaultMessage='Enable collapsed toots' /> + <span className='hint'><FormattedMessage id='settings.enable_collapsed_hint' defaultMessage='Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature' /></span> </LocalSettingsPageItem> <LocalSettingsPageItem settings={settings} @@ -457,6 +479,7 @@ class LocalSettingsPage extends React.PureComponent { dependsOn={[['collapsed', 'enabled']]} > <FormattedMessage id='settings.image_backgrounds_media' defaultMessage='Preview collapsed toot media' /> + <span className='hint'><FormattedMessage id='settings.image_backgrounds_media_hint' defaultMessage='If the post has any media attachment, use the first one as a background' /></span> </LocalSettingsPageItem> </section> </div> diff --git a/app/javascript/flavours/glitch/features/notifications/components/admin_report.js b/app/javascript/flavours/glitch/features/notifications/components/admin_report.js new file mode 100644 index 000000000..80beeb9da --- /dev/null +++ b/app/javascript/flavours/glitch/features/notifications/components/admin_report.js @@ -0,0 +1,108 @@ +// Package imports. +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import PropTypes from 'prop-types'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import ImmutablePureComponent from 'react-immutable-pure-component'; +import { HotKeys } from 'react-hotkeys'; +import classNames from 'classnames'; + +// Our imports. +import Permalink from 'flavours/glitch/components/permalink'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import NotificationOverlayContainer from '../containers/overlay_container'; +import Icon from 'flavours/glitch/components/icon'; +import Report from './report'; + +const messages = defineMessages({ + adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' }, +}); + +export default class AdminReport extends ImmutablePureComponent { + + static propTypes = { + hidden: PropTypes.bool, + id: PropTypes.string.isRequired, + account: ImmutablePropTypes.map.isRequired, + notification: ImmutablePropTypes.map.isRequired, + unread: PropTypes.bool, + report: ImmutablePropTypes.map.isRequired, + }; + + handleMoveUp = () => { + const { notification, onMoveUp } = this.props; + onMoveUp(notification.get('id')); + } + + handleMoveDown = () => { + const { notification, onMoveDown } = this.props; + onMoveDown(notification.get('id')); + } + + handleOpen = () => { + this.handleOpenProfile(); + } + + handleOpenProfile = () => { + const { notification } = this.props; + this.context.router.history.push(`/@${notification.getIn(['account', 'acct'])}`); + } + + handleMention = e => { + e.preventDefault(); + + const { notification, onMention } = this.props; + onMention(notification.get('account'), this.context.router.history); + } + + getHandlers () { + return { + moveUp: this.handleMoveUp, + moveDown: this.handleMoveDown, + open: this.handleOpen, + openProfile: this.handleOpenProfile, + mention: this.handleMention, + reply: this.handleMention, + }; + } + + render () { + const { intl, account, notification, unread, report } = this.props; + + // Links to the display name. + const displayName = account.get('display_name_html') || account.get('username'); + const link = ( + <bdi><Permalink + className='notification__display-name' + href={account.get('url')} + title={account.get('acct')} + to={`/@${account.get('acct')}`} + dangerouslySetInnerHTML={{ __html: displayName }} + /></bdi> + ); + + const targetAccount = report.get('target_account'); + const targetDisplayNameHtml = { __html: targetAccount.get('display_name_html') }; + const targetLink = <bdi><Permalink className='notification__display-name' href={targetAccount.get('url')} title={targetAccount.get('acct')} to={`/@${targetAccount.get('acct')}`} dangerouslySetInnerHTML={targetDisplayNameHtml} /></bdi>; + + return ( + <HotKeys handlers={this.getHandlers()}> + <div className={classNames('notification notification-admin-report focusable', { unread })} tabIndex='0'> + <div className='notification__message'> + <div className='notification__favourite-icon-wrapper'> + <Icon id='flag' fixedWidth /> + </div> + + <span title={notification.get('created_at')}> + <FormattedMessage id='notification.admin.report' defaultMessage='{name} reported {target}' values={{ name: link, target: targetLink }} /> + </span> + </div> + + <Report account={account} report={notification.get('report')} hidden={this.props.hidden} /> + <NotificationOverlayContainer notification={notification} /> + </div> + </HotKeys> + ); + } + +} diff --git a/app/javascript/flavours/glitch/features/notifications/components/column_settings.js b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js index 0be2a7e13..42ab9de35 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/column_settings.js +++ b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js @@ -6,10 +6,14 @@ import ClearColumnButton from './clear_column_button'; import GrantPermissionButton from './grant_permission_button'; import SettingToggle from './setting_toggle'; import PillBarButton from './pill_bar_button'; -import { isStaff } from 'flavours/glitch/util/initial_state'; +import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'flavours/glitch/permissions'; export default class ColumnSettings extends React.PureComponent { + static contextTypes = { + identity: PropTypes.object, + }; + static propTypes = { settings: ImmutablePropTypes.map.isRequired, pushSettings: ImmutablePropTypes.map.isRequired, @@ -167,7 +171,7 @@ export default class ColumnSettings extends React.PureComponent { </div> </div> - {isStaff && ( + {(this.context.identity.permissions & PERMISSION_MANAGE_USERS === PERMISSION_MANAGE_USERS) && ( <div role='group' aria-labelledby='notifications-admin-sign-up'> <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.admin.sign_up' defaultMessage='New sign-ups:' /></span> @@ -179,6 +183,19 @@ export default class ColumnSettings extends React.PureComponent { </div> </div> )} + + {(this.context.identity.permissions & PERMISSION_MANAGE_REPORTS === PERMISSION_MANAGE_REPORTS) && ( + <div role='group' aria-labelledby='notifications-admin-report'> + <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.admin.report' defaultMessage='New reports:' /></span> + + <div className='column-settings__pillbar'> + <PillBarButton disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'admin.report']} onChange={onChange} label={alertStr} /> + {showPushSettings && <PillBarButton prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'admin.report']} onChange={this.onPushChange} label={pushStr} />} + <PillBarButton prefix='notifications' settings={settings} settingPath={['shows', 'admin.report']} onChange={onChange} label={showStr} /> + <PillBarButton prefix='notifications' settings={settings} settingPath={['sounds', 'admin.report']} onChange={onChange} label={soundStr} /> + </div> + </div> + )} </div> ); } diff --git a/app/javascript/flavours/glitch/features/notifications/components/notification.js b/app/javascript/flavours/glitch/features/notifications/components/notification.js index e0cd3c7a6..d676a4207 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/notification.js +++ b/app/javascript/flavours/glitch/features/notifications/components/notification.js @@ -9,6 +9,7 @@ import StatusContainer from 'flavours/glitch/containers/status_container'; import NotificationFollow from './follow'; import NotificationFollowRequestContainer from '../containers/follow_request_container'; import NotificationAdminSignup from './admin_signup'; +import NotificationAdminReportContainer from '../containers/admin_report_container'; export default class Notification extends ImmutablePureComponent { @@ -77,6 +78,19 @@ export default class Notification extends ImmutablePureComponent { unread={this.props.unread} /> ); + case 'admin.report': + return ( + <NotificationAdminReportContainer + hidden={hidden} + id={notification.get('id')} + account={notification.get('account')} + notification={notification} + onMoveDown={onMoveDown} + onMoveUp={onMoveUp} + onMention={onMention} + unread={this.props.unread} + /> + ); case 'mention': return ( <StatusContainer diff --git a/app/javascript/flavours/glitch/features/notifications/components/report.js b/app/javascript/flavours/glitch/features/notifications/components/report.js new file mode 100644 index 000000000..46a307250 --- /dev/null +++ b/app/javascript/flavours/glitch/features/notifications/components/report.js @@ -0,0 +1,62 @@ +import React, { Fragment } from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import PropTypes from 'prop-types'; +import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; +import ImmutablePureComponent from 'react-immutable-pure-component'; +import AvatarOverlay from 'flavours/glitch/components/avatar_overlay'; +import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp'; + +const messages = defineMessages({ + openReport: { id: 'report_notification.open', defaultMessage: 'Open report' }, + other: { id: 'report_notification.categories.other', defaultMessage: 'Other' }, + spam: { id: 'report_notification.categories.spam', defaultMessage: 'Spam' }, + violation: { id: 'report_notification.categories.violation', defaultMessage: 'Rule violation' }, +}); + +export default @injectIntl +class Report extends ImmutablePureComponent { + + static propTypes = { + account: ImmutablePropTypes.map.isRequired, + report: ImmutablePropTypes.map.isRequired, + hidden: PropTypes.bool, + intl: PropTypes.object.isRequired, + }; + + render () { + const { intl, hidden, report, account } = this.props; + + if (!report) { + return null; + } + + if (hidden) { + return ( + <Fragment> + {report.get('id')} + </Fragment> + ); + } + + return ( + <div className='notification__report'> + <div className='notification__report__avatar'> + <AvatarOverlay account={report.get('target_account')} friend={account} /> + </div> + + <div className='notification__report__details'> + <div> + <RelativeTimestamp timestamp={report.get('created_at')} short={false} /> · <FormattedMessage id='report_notification.attached_statuses' defaultMessage='{count, plural, one {{count} post} other {{count} posts}} attached' values={{ count: report.get('status_ids').size }} /> + <br /> + <strong>{intl.formatMessage(messages[report.get('category')])}</strong> + </div> + + <div className='notification__report__actions'> + <a href={`/admin/reports/${report.get('id')}`} className='button' target='_blank' rel='noopener noreferrer'>{intl.formatMessage(messages.openReport)}</a> + </div> + </div> + </div> + ); + } + +} diff --git a/app/javascript/flavours/glitch/features/notifications/containers/admin_report_container.js b/app/javascript/flavours/glitch/features/notifications/containers/admin_report_container.js new file mode 100644 index 000000000..4198afce8 --- /dev/null +++ b/app/javascript/flavours/glitch/features/notifications/containers/admin_report_container.js @@ -0,0 +1,13 @@ +import { connect } from 'react-redux'; +import { makeGetReport } from 'flavours/glitch/selectors'; +import AdminReport from '../components/admin_report'; + +const mapStateToProps = (state, { notification }) => { + const getReport = makeGetReport(); + + return { + report: notification.get('report') ? getReport(state, notification.get('report'), notification.getIn(['report', 'target_account', 'id'])) : null, + }; +}; + +export default connect(mapStateToProps)(AdminReport); diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js index a67a045da..ef0f0f2b7 100644 --- a/app/javascript/flavours/glitch/features/status/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js @@ -4,9 +4,10 @@ import IconButton from 'flavours/glitch/components/icon_button'; import ImmutablePropTypes from 'react-immutable-proptypes'; import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; -import { me, isStaff } from 'flavours/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; import { accountAdminLink, statusAdminLink } from 'flavours/glitch/util/backend_links'; import classNames from 'classnames'; +import { PERMISSION_MANAGE_USERS } from 'flavours/glitch/permissions'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, @@ -41,6 +42,7 @@ class ActionBar extends React.PureComponent { static contextTypes = { router: PropTypes.object, + identity: PropTypes.object, }; static propTypes = { @@ -182,7 +184,7 @@ class ActionBar extends React.PureComponent { menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick }); menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick }); menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport }); - if (isStaff && (accountAdminLink || statusAdminLink)) { + if ((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && (accountAdminLink || statusAdminLink)) { menu.push(null); if (accountAdminLink !== undefined) { menu.push({ diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js index f4e6c24c5..301a2add6 100644 --- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js +++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js @@ -122,14 +122,27 @@ class DetailedStatus extends ImmutablePureComponent { return null; } - let media = []; - let mediaIcons = []; let applicationLink = ''; let reblogLink = ''; let reblogIcon = 'retweet'; let favouriteLink = ''; let edited = ''; + // Depending on user settings, some media are considered as parts of the + // contents (affected by CW) while other will be displayed outside of the + // CW. + let contentMedia = []; + let contentMediaIcons = []; + let extraMedia = []; + let extraMediaIcons = []; + let media = contentMedia; + let mediaIcons = contentMediaIcons; + + if (settings.getIn(['content_warnings', 'media_outside'])) { + media = extraMedia; + mediaIcons = extraMediaIcons; + } + if (this.props.measureHeight) { outerStyle.height = `${this.state.height}px`; } @@ -199,8 +212,8 @@ class DetailedStatus extends ImmutablePureComponent { } if (status.get('poll')) { - media.push(<PollContainer pollId={status.get('poll')} />); - mediaIcons.push('tasks'); + contentMedia.push(<PollContainer pollId={status.get('poll')} />); + contentMediaIcons.push('tasks'); } if (status.get('application')) { @@ -282,8 +295,9 @@ class DetailedStatus extends ImmutablePureComponent { <StatusContent status={status} - media={media} - mediaIcons={mediaIcons} + media={contentMedia} + extraMedia={extraMedia} + mediaIcons={contentMediaIcons} expanded={expanded} collapsed={false} onExpandedToggle={onToggleHidden} diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js index 653fabeae..9c86d54db 100644 --- a/app/javascript/flavours/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -26,7 +26,14 @@ import { directCompose, } from 'flavours/glitch/actions/compose'; import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; -import { muteStatus, unmuteStatus, deleteStatus, editStatus } from 'flavours/glitch/actions/statuses'; +import { + muteStatus, + unmuteStatus, + deleteStatus, + editStatus, + hideStatus, + revealStatus +} from 'flavours/glitch/actions/statuses'; import { initMuteModal } from 'flavours/glitch/actions/mutes'; import { initBlockModal } from 'flavours/glitch/actions/blocks'; import { initReport } from 'flavours/glitch/actions/reports'; @@ -215,11 +222,19 @@ class Status extends ImmutablePureComponent { return updated ? update : null; } - handleExpandedToggle = () => { - if (this.props.status.get('spoiler_text')) { + handleToggleHidden = () => { + const { status } = this.props; + + if (this.props.settings.getIn(['content_warnings', 'shared_state'])) { + if (status.get('hidden')) { + this.props.dispatch(revealStatus(status.get('id'))); + } else { + this.props.dispatch(hideStatus(status.get('id'))); + } + } else if (this.props.status.get('spoiler_text')) { this.setExpansion(!this.state.isExpanded); } - }; + } handleToggleMediaVisibility = () => { this.setState({ showMedia: !this.state.showMedia }); @@ -354,7 +369,19 @@ class Status extends ImmutablePureComponent { } handleToggleAll = () => { - const { isExpanded } = this.state; + const { status, ancestorsIds, descendantsIds, settings } = this.props; + const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS()); + let { isExpanded } = this.state; + + if (settings.getIn(['content_warnings', 'shared_state'])) + isExpanded = !status.get('hidden'); + + if (!isExpanded) { + this.props.dispatch(revealStatus(statusIds)); + } else { + this.props.dispatch(hideStatus(statusIds)); + } + this.setState({ isExpanded: !isExpanded, threadExpanded: !isExpanded }); } @@ -513,9 +540,8 @@ class Status extends ImmutablePureComponent { render () { let ancestors, descendants; - const { setExpansion } = this; const { status, settings, ancestorsIds, descendantsIds, intl, domain, multiColumn, usingPiP } = this.props; - const { fullscreen, isExpanded } = this.state; + const { fullscreen } = this.state; if (status === null) { return ( @@ -526,6 +552,8 @@ class Status extends ImmutablePureComponent { ); } + const isExpanded = settings.getIn(['content_warnings', 'shared_state']) ? !status.get('hidden') : this.state.isExpanded; + if (ancestorsIds && ancestorsIds.size > 0) { ancestors = <div>{this.renderChildren(ancestorsIds)}</div>; } @@ -543,7 +571,7 @@ class Status extends ImmutablePureComponent { bookmark: this.handleHotkeyBookmark, mention: this.handleHotkeyMention, openProfile: this.handleHotkeyOpenProfile, - toggleSpoiler: this.handleExpandedToggle, + toggleSpoiler: this.handleToggleHidden, toggleSensitive: this.handleHotkeyToggleSensitive, openMedia: this.handleHotkeyOpenMedia, }; @@ -574,7 +602,7 @@ class Status extends ImmutablePureComponent { onOpenVideo={this.handleOpenVideo} onOpenMedia={this.handleOpenMedia} expanded={isExpanded} - onToggleHidden={this.handleExpandedToggle} + onToggleHidden={this.handleToggleHidden} domain={domain} showMedia={this.state.showMedia} onToggleMediaVisibility={this.handleToggleMediaVisibility} diff --git a/app/javascript/flavours/glitch/features/ui/components/image_loader.js b/app/javascript/flavours/glitch/features/ui/components/image_loader.js index c6f16a792..dfa0efe49 100644 --- a/app/javascript/flavours/glitch/features/ui/components/image_loader.js +++ b/app/javascript/flavours/glitch/features/ui/components/image_loader.js @@ -1,10 +1,10 @@ -import React from 'react'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; +import PropTypes from 'prop-types'; +import React, { PureComponent } from 'react'; import { LoadingBar } from 'react-redux-loading-bar'; import ZoomableImage from './zoomable_image'; -export default class ImageLoader extends React.PureComponent { +export default class ImageLoader extends PureComponent { static propTypes = { alt: PropTypes.string, @@ -43,7 +43,7 @@ export default class ImageLoader extends React.PureComponent { this.loadImage(this.props); } - componentWillReceiveProps (nextProps) { + UNSAFE_componentWillReceiveProps (nextProps) { if (this.props.src !== nextProps.src) { this.loadImage(nextProps); } @@ -139,14 +139,18 @@ export default class ImageLoader extends React.PureComponent { return ( <div className={className}> - <LoadingBar loading={loading ? 1 : 0} className='loading-bar' style={{ width: this.state.width || width }} /> {loading ? ( - <canvas - className='image-loader__preview-canvas' - ref={this.setCanvasRef} - width={width} - height={height} - /> + <> + <div className='loading-bar__container' style={{ width: this.state.width || width }}> + <LoadingBar className='loading-bar' loading={1} /> + </div> + <canvas + className='image-loader__preview-canvas' + ref={this.setCanvasRef} + width={width} + height={height} + /> + </> ) : ( <ZoomableImage alt={alt} diff --git a/app/javascript/flavours/glitch/features/ui/components/link_footer.js b/app/javascript/flavours/glitch/features/ui/components/link_footer.js index 5d566e516..040e967f2 100644 --- a/app/javascript/flavours/glitch/features/ui/components/link_footer.js +++ b/app/javascript/flavours/glitch/features/ui/components/link_footer.js @@ -3,10 +3,11 @@ import React from 'react'; import PropTypes from 'prop-types'; import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; -import { invitesEnabled, limitedFederationMode, version, repository, source_url } from 'flavours/glitch/util/initial_state'; +import { limitedFederationMode, version, repository, source_url } from 'flavours/glitch/util/initial_state'; import { signOutLink, securityLink } from 'flavours/glitch/util/backend_links'; import { logOut } from 'flavours/glitch/util/log_out'; import { openModal } from 'flavours/glitch/actions/modal'; +import { PERMISSION_INVITE_USERS } from 'flavours/glitch/permissions'; const messages = defineMessages({ logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, @@ -28,6 +29,10 @@ export default @injectIntl @connect(null, mapDispatchToProps) class LinkFooter extends React.PureComponent { + static contextTypes = { + identity: PropTypes.object, + }; + static propTypes = { onLogout: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, @@ -46,7 +51,7 @@ class LinkFooter extends React.PureComponent { return ( <div className='getting-started__footer'> <ul> - {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} + {((this.context.identity.permissions & PERMISSION_INVITE_USERS) === PERMISSION_INVITE_USERS) && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} {!!securityLink && <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li>} {!limitedFederationMode && <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li>} <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li> diff --git a/app/javascript/flavours/glitch/packs/settings.js b/app/javascript/flavours/glitch/packs/settings.js index 0a53e1c25..de88d4f52 100644 --- a/app/javascript/flavours/glitch/packs/settings.js +++ b/app/javascript/flavours/glitch/packs/settings.js @@ -2,6 +2,7 @@ import 'packs/public-path'; import loadPolyfills from 'flavours/glitch/util/load_polyfills'; import ready from 'flavours/glitch/util/ready'; import loadKeyboardExtensions from 'flavours/glitch/util/load_keyboard_extensions'; +import 'cocoon-js-vanilla'; function main() { const { delegate } = require('@rails/ujs'); diff --git a/app/javascript/flavours/glitch/permissions.js b/app/javascript/flavours/glitch/permissions.js new file mode 100644 index 000000000..752ddd6c5 --- /dev/null +++ b/app/javascript/flavours/glitch/permissions.js @@ -0,0 +1,3 @@ +export const PERMISSION_INVITE_USERS = 0x0000000000010000; +export const PERMISSION_MANAGE_USERS = 0x0000000000000400; +export const PERMISSION_MANAGE_REPORTS = 0x0000000000000010; diff --git a/app/javascript/flavours/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js index d4cdc124f..62ce29f0c 100644 --- a/app/javascript/flavours/glitch/reducers/local_settings.js +++ b/app/javascript/flavours/glitch/reducers/local_settings.js @@ -25,7 +25,9 @@ const initialState = ImmutableMap({ tag_misleading_links: true, rewrite_mentions: 'no', content_warnings : ImmutableMap({ - filter : null, + filter : null, + media_outside: false, + shared_state : false, }), collapsed : ImmutableMap({ enabled : true, diff --git a/app/javascript/flavours/glitch/reducers/meta.js b/app/javascript/flavours/glitch/reducers/meta.js index a98dc436a..0f3ab3b84 100644 --- a/app/javascript/flavours/glitch/reducers/meta.js +++ b/app/javascript/flavours/glitch/reducers/meta.js @@ -4,12 +4,13 @@ import { Map as ImmutableMap } from 'immutable'; const initialState = ImmutableMap({ streaming_api_base_url: null, access_token: null, + permissions: '0', }); export default function meta(state = initialState, action) { switch(action.type) { case STORE_HYDRATE: - return state.merge(action.state.get('meta')); + return state.merge(action.state.get('meta')).set('permissions', action.state.getIn(['role', 'permissions'])); default: return state; } diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js index 859a8b3a1..f538af7fa 100644 --- a/app/javascript/flavours/glitch/reducers/notifications.js +++ b/app/javascript/flavours/glitch/reducers/notifications.js @@ -31,7 +31,7 @@ import { } from 'flavours/glitch/actions/markers'; import { DOMAIN_BLOCK_SUCCESS } from 'flavours/glitch/actions/domain_blocks'; import { TIMELINE_DELETE, TIMELINE_DISCONNECT } from 'flavours/glitch/actions/timelines'; -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; +import { fromJS, Map as ImmutableMap, List as ImmutableList } from 'immutable'; import compareId from 'flavours/glitch/util/compare_id'; const initialState = ImmutableMap({ @@ -58,6 +58,7 @@ const notificationToMap = (state, notification) => ImmutableMap({ account: notification.account.id, markedForDelete: state.get('markNewForDelete'), status: notification.status ? notification.status.id : null, + report: notification.report ? fromJS(notification.report) : null, }); const normalizeNotification = (state, notification, usePendingItems) => { diff --git a/app/javascript/flavours/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js index 0c28b2959..1d99441a1 100644 --- a/app/javascript/flavours/glitch/reducers/settings.js +++ b/app/javascript/flavours/glitch/reducers/settings.js @@ -43,6 +43,7 @@ const initialState = ImmutableMap({ status: false, update: false, 'admin.sign_up': false, + 'admin.report': false, }), quickFilter: ImmutableMap({ @@ -64,6 +65,7 @@ const initialState = ImmutableMap({ status: true, update: true, 'admin.sign_up': true, + 'admin.report': true, }), sounds: ImmutableMap({ @@ -76,6 +78,7 @@ const initialState = ImmutableMap({ status: true, update: true, 'admin.sign_up': true, + 'admin.report': true, }), }), diff --git a/app/javascript/flavours/glitch/reducers/statuses.js b/app/javascript/flavours/glitch/reducers/statuses.js index 5db766b96..333e4b45c 100644 --- a/app/javascript/flavours/glitch/reducers/statuses.js +++ b/app/javascript/flavours/glitch/reducers/statuses.js @@ -10,6 +10,9 @@ import { import { STATUS_MUTE_SUCCESS, STATUS_UNMUTE_SUCCESS, + STATUS_REVEAL, + STATUS_HIDE, + STATUS_COLLAPSE, } from 'flavours/glitch/actions/statuses'; import { TIMELINE_DELETE, @@ -56,6 +59,24 @@ export default function statuses(state = initialState, action) { return state.setIn([action.id, 'muted'], true); case STATUS_UNMUTE_SUCCESS: return state.setIn([action.id, 'muted'], false); + case STATUS_REVEAL: + return state.withMutations(map => { + action.ids.forEach(id => { + if (!(state.get(id) === undefined)) { + map.setIn([id, 'hidden'], false); + } + }); + }); + case STATUS_HIDE: + return state.withMutations(map => { + action.ids.forEach(id => { + if (!(state.get(id) === undefined)) { + map.setIn([id, 'hidden'], true); + } + }); + }); + case STATUS_COLLAPSE: + return state.setIn([action.id, 'collapsed'], action.isCollapsed); case TIMELINE_DELETE: return deleteStatus(state, action.id, action.references); default: diff --git a/app/javascript/flavours/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js index 99afe5355..d9aa8f140 100644 --- a/app/javascript/flavours/glitch/selectors/index.js +++ b/app/javascript/flavours/glitch/selectors/index.js @@ -171,14 +171,15 @@ export const getAlerts = createSelector([getAlertsBase], (base) => { return arr; }); -export const makeGetNotification = () => { - return createSelector([ - (_, base) => base, - (state, _, accountId) => state.getIn(['accounts', accountId]), - ], (base, account) => { - return base.set('account', account); - }); -}; +export const makeGetNotification = () => createSelector([ + (_, base) => base, + (state, _, accountId) => state.getIn(['accounts', accountId]), +], (base, account) => base.set('account', account)); + +export const makeGetReport = () => createSelector([ + (_, base) => base, + (state, _, targetAccountId) => state.getIn(['accounts', targetAccountId]), +], (base, targetAccount) => base.set('target_account', targetAccount)); export const getAccountGallery = createSelector([ (state, id) => state.getIn(['timelines', `account:${id}:media`, 'items'], ImmutableList()), diff --git a/app/javascript/flavours/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss index 87e35236c..ac1be6ad8 100644 --- a/app/javascript/flavours/glitch/styles/accounts.scss +++ b/app/javascript/flavours/glitch/styles/accounts.scss @@ -211,9 +211,9 @@ font-size: 12px; line-height: 12px; font-weight: 500; - color: $ui-secondary-color; - background-color: rgba($ui-secondary-color, 0.1); - border: 1px solid rgba($ui-secondary-color, 0.5); + color: var(--user-role-accent, $ui-secondary-color); + background-color: var(--user-role-background, rgba($ui-secondary-color, 0.1)); + border: 1px solid var(--user-role-border, rgba($ui-secondary-color, 0.5)); &.moderator { color: $success-green; diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index 9553aa4ae..77890c467 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -75,6 +75,13 @@ $content-width: 840px; height: 100px; } + .logo--wordmark { + display: inherit; + margin: inherit; + width: inherit; + height: 20px; + } + @media screen and (max-width: $no-columns-breakpoint) { & > a:first-child { display: none; @@ -927,7 +934,8 @@ a.name-tag, text-align: center; } -.applications-list__item { +.applications-list__item, +.filters-list__item { padding: 15px 0; background: $ui-base-color; border: 1px solid lighten($ui-base-color, 4%); @@ -935,7 +943,12 @@ a.name-tag, margin-top: 15px; } -.announcements-list { +.user-role { + color: var(--user-role-accent); +} + +.announcements-list, +.filters-list { border: 1px solid lighten($ui-base-color, 4%); border-radius: 4px; @@ -970,6 +983,17 @@ a.name-tag, &__meta { padding: 0 15px; color: $dark-text-color; + + a { + color: inherit; + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + } } &__action-bar { @@ -988,6 +1012,33 @@ a.name-tag, } } +.filters-list__item { + &__title { + display: flex; + justify-content: space-between; + margin-bottom: 0; + } + + &__permissions { + margin-top: 0; + margin-bottom: 10px; + } + + .expiration { + font-size: 13px; + } + + &.expired { + .expiration { + color: lighten($error-red, 12%); + } + + .permissions-list__item__icon { + color: $dark-text-color; + } + } +} + .dashboard__counters.admin-account-counters { margin-top: 10px; } diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss index 377cdd91f..4e912b18b 100644 --- a/app/javascript/flavours/glitch/styles/components/accounts.scss +++ b/app/javascript/flavours/glitch/styles/components/accounts.scss @@ -105,6 +105,8 @@ position: relative; @include avatar-size(48px); + position: relative; + &-base { @include avatar-radius(); @include avatar-size(36px); @@ -243,6 +245,33 @@ margin-right: 10px; } +.notification__report { + padding: 8px 10px; + padding-left: 68px; + position: relative; + border-bottom: 1px solid lighten($ui-base-color, 8%); + min-height: 54px; + + &__details { + display: flex; + justify-content: space-between; + align-items: center; + color: $darker-text-color; + font-size: 15px; + line-height: 22px; + + strong { + font-weight: 500; + } + } + + &__avatar { + position: absolute; + left: 10px; + top: 10px; + } +} + .notification__message { margin-left: 42px; padding: 8px 0 0 26px; diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 7f9ed2186..b54c3f696 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -442,10 +442,14 @@ object-fit: contain; } - .loading-bar { + .loading-bar__container { position: relative; } + .loading-bar { + position: absolute; + } + &.image-loader--amorphous .image-loader__preview-canvas { display: none; } diff --git a/app/javascript/flavours/glitch/styles/components/search.scss b/app/javascript/flavours/glitch/styles/components/search.scss index f7415368b..17a34db62 100644 --- a/app/javascript/flavours/glitch/styles/components/search.scss +++ b/app/javascript/flavours/glitch/styles/components/search.scss @@ -176,6 +176,13 @@ padding-right: 15px; margin-left: 5px; color: $secondary-text-color; + text-decoration: none; + + &__asterisk { + color: $darker-text-color; + font-size: 18px; + vertical-align: super; + } } &__sparkline { diff --git a/app/javascript/flavours/glitch/styles/components/single_column.scss b/app/javascript/flavours/glitch/styles/components/single_column.scss index d10fc1d3e..3843bcd68 100644 --- a/app/javascript/flavours/glitch/styles/components/single_column.scss +++ b/app/javascript/flavours/glitch/styles/components/single_column.scss @@ -154,6 +154,16 @@ padding-top: 15px; } + .notification__report { + padding: 15px 15px 15px (48px + 15px * 2); + min-height: 48px + 2px; + + &__avatar { + left: 15px; + top: 17px; + } + } + .status { padding: 15px; min-height: 48px + 2px; diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index de8bd2d45..9ed656e13 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -241,6 +241,10 @@ code { } } + .input.with_block_label.user_role_permissions_as_keys ul { + columns: unset; + } + .input.datetime .label_input select { display: inline-block; width: auto; @@ -1059,3 +1063,34 @@ code { } } } + +.keywords-table { + thead { + th { + white-space: nowrap; + } + + th:first-child { + width: 100%; + } + } + + tfoot { + td { + border: 0; + } + } + + .input.string { + margin-bottom: 0; + } + + .label_input__wrapper { + margin-top: 10px; + } + + .table-action-link { + margin-top: 10px; + white-space: nowrap; + } +} diff --git a/app/javascript/flavours/glitch/util/content_warning.js b/app/javascript/flavours/glitch/util/content_warning.js index baeb97881..383a34226 100644 --- a/app/javascript/flavours/glitch/util/content_warning.js +++ b/app/javascript/flavours/glitch/util/content_warning.js @@ -1,26 +1,31 @@ import { expandSpoilers } from 'flavours/glitch/util/initial_state'; -export function autoUnfoldCW (settings, status) { - if (!expandSpoilers) { +function _autoUnfoldCW(spoiler_text, skip_unfold_regex) { + if (!expandSpoilers) return false; - } - - const rawRegex = settings.getIn(['content_warnings', 'filter']); - if (!rawRegex) { + if (!skip_unfold_regex) return true; - } - let regex = null; + let regex = null; try { - regex = rawRegex && new RegExp(rawRegex.trim(), 'i'); + regex = new RegExp(skip_unfold_regex.trim(), 'i'); } catch (e) { - // Bad regex, don't affect filters + // Bad regex, skip filters + return true; } - if (!(status && regex)) { - return undefined; - } - return !regex.test(status.get('spoiler_text')); + return !regex.test(spoiler_text); +} + +export function autoHideCW(settings, spoiler_text) { + return !_autoUnfoldCW(spoiler_text, settings.getIn(['content_warnings', 'filter'])); +} + +export function autoUnfoldCW(settings, status) { + if (!status) + return false; + + return _autoUnfoldCW(status.get('spoiler_text'), settings.getIn(['content_warnings', 'filter'])); } diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js index b6eab0c87..90dada4b3 100644 --- a/app/javascript/flavours/glitch/util/initial_state.js +++ b/app/javascript/flavours/glitch/util/initial_state.js @@ -23,14 +23,12 @@ export const me = getMeta('me'); export const searchEnabled = getMeta('search_enabled'); export const maxChars = (initialState && initialState.max_toot_chars) || 500; export const pollLimits = (initialState && initialState.poll_limits); -export const invitesEnabled = getMeta('invites_enabled'); export const limitedFederationMode = getMeta('limited_federation_mode'); export const repository = getMeta('repository'); export const source_url = getMeta('source_url'); export const version = getMeta('version'); export const mascot = getMeta('mascot'); export const profile_directory = getMeta('profile_directory'); -export const isStaff = getMeta('is_staff'); export const defaultContentType = getMeta('default_content_type'); export const forceSingleColumn = getMeta('advanced_layout') === false; export const useBlurhash = getMeta('use_blurhash'); diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 878011fc0..cffd032b3 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -608,7 +608,20 @@ function insertIntoTagHistory(recognizedTags, text) { const state = getState(); const oldHistory = state.getIn(['compose', 'tagHistory']); const me = state.getIn(['meta', 'me']); - const names = recognizedTags.map(tag => text.match(new RegExp(`#${tag.name}`, 'i'))[0].slice(1)); + + // FIXME: Matching input hashtags with recognized hashtags has become more + // complicated because of new normalization rules, it's no longer just + // a case sensitivity issue + const names = recognizedTags.map(tag => { + const matches = text.match(new RegExp(`#${tag.name}`, 'i')); + + if (matches && matches.length > 0) { + return matches[0].slice(1); + } else { + return tag.name; + } + }); + const intersectedOldHistory = oldHistory.filter(name => names.findIndex(newName => newName.toLowerCase() === name.toLowerCase()) === -1); names.push(...intersectedOldHistory.toJS()); diff --git a/app/javascript/mastodon/actions/filters.js b/app/javascript/mastodon/actions/filters.js deleted file mode 100644 index 7fa1c9a70..000000000 --- a/app/javascript/mastodon/actions/filters.js +++ /dev/null @@ -1,26 +0,0 @@ -import api from '../api'; - -export const FILTERS_FETCH_REQUEST = 'FILTERS_FETCH_REQUEST'; -export const FILTERS_FETCH_SUCCESS = 'FILTERS_FETCH_SUCCESS'; -export const FILTERS_FETCH_FAIL = 'FILTERS_FETCH_FAIL'; - -export const fetchFilters = () => (dispatch, getState) => { - dispatch({ - type: FILTERS_FETCH_REQUEST, - skipLoading: true, - }); - - api(getState) - .get('/api/v1/filters') - .then(({ data }) => dispatch({ - type: FILTERS_FETCH_SUCCESS, - filters: data, - skipLoading: true, - })) - .catch(err => dispatch({ - type: FILTERS_FETCH_FAIL, - err, - skipLoading: true, - skipAlert: true, - })); -}; diff --git a/app/javascript/mastodon/actions/importer/index.js b/app/javascript/mastodon/actions/importer/index.js index f4372fb31..9c69be601 100644 --- a/app/javascript/mastodon/actions/importer/index.js +++ b/app/javascript/mastodon/actions/importer/index.js @@ -5,6 +5,7 @@ export const ACCOUNTS_IMPORT = 'ACCOUNTS_IMPORT'; export const STATUS_IMPORT = 'STATUS_IMPORT'; export const STATUSES_IMPORT = 'STATUSES_IMPORT'; export const POLLS_IMPORT = 'POLLS_IMPORT'; +export const FILTERS_IMPORT = 'FILTERS_IMPORT'; function pushUnique(array, object) { if (array.every(element => element.id !== object.id)) { @@ -28,6 +29,10 @@ export function importStatuses(statuses) { return { type: STATUSES_IMPORT, statuses }; } +export function importFilters(filters) { + return { type: FILTERS_IMPORT, filters }; +} + export function importPolls(polls) { return { type: POLLS_IMPORT, polls }; } @@ -61,11 +66,16 @@ export function importFetchedStatuses(statuses) { const accounts = []; const normalStatuses = []; const polls = []; + const filters = []; function processStatus(status) { pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(['statuses', status.id]))); pushUnique(accounts, status.account); + if (status.filtered) { + status.filtered.forEach(result => pushUnique(filters, result.filter)); + } + if (status.reblog && status.reblog.id) { processStatus(status.reblog); } @@ -80,6 +90,7 @@ export function importFetchedStatuses(statuses) { dispatch(importPolls(polls)); dispatch(importFetchedAccounts(accounts)); dispatch(importStatuses(normalStatuses)); + dispatch(importFilters(filters)); }; } diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js index ca76e3494..8a22f83fa 100644 --- a/app/javascript/mastodon/actions/importer/normalizer.js +++ b/app/javascript/mastodon/actions/importer/normalizer.js @@ -42,6 +42,14 @@ export function normalizeAccount(account) { return account; } +export function normalizeFilterResult(result) { + const normalResult = { ...result }; + + normalResult.filter = normalResult.filter.id; + + return normalResult; +} + export function normalizeStatus(status, normalOldStatus) { const normalStatus = { ...status }; normalStatus.account = status.account.id; @@ -54,6 +62,10 @@ export function normalizeStatus(status, normalOldStatus) { normalStatus.poll = status.poll.id; } + if (status.filtered) { + normalStatus.filtered = status.filtered.map(normalizeFilterResult); + } + // Only calculate these values when status first encountered and // when the underlying values change. Otherwise keep the ones // already in the reducer diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 96cf628d6..3c42f71da 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -12,10 +12,8 @@ import { saveSettings } from './settings'; import { defineMessages } from 'react-intl'; import { List as ImmutableList } from 'immutable'; import { unescapeHTML } from '../utils/html'; -import { getFiltersRegex } from '../selectors'; import { usePendingItems as preferPendingItems } from 'mastodon/initial_state'; import compareId from 'mastodon/compare_id'; -import { searchTextFromRawStatus } from 'mastodon/actions/importer/normalizer'; import { requestNotificationPermission } from '../utils/notifications'; export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE'; @@ -62,20 +60,17 @@ export function updateNotifications(notification, intlMessages, intlLocale) { const showInColumn = activeFilter === 'all' ? getState().getIn(['settings', 'notifications', 'shows', notification.type], true) : activeFilter === notification.type; const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); - const filters = getFiltersRegex(getState(), { contextType: 'notifications' }); let filtered = false; - if (['mention', 'status'].includes(notification.type)) { - const dropRegex = filters[0]; - const regex = filters[1]; - const searchIndex = searchTextFromRawStatus(notification.status); + if (['mention', 'status'].includes(notification.type) && notification.status.filtered) { + const filters = notification.status.filtered.filter(result => result.filter.context.includes('notifications')); - if (dropRegex && dropRegex.test(searchIndex)) { + if (filters.some(result => result.filter.filter_action === 'hide')) { return; } - filtered = regex && regex.test(searchIndex); + filtered = filters.length > 0; } if (['follow_request'].includes(notification.type)) { @@ -91,6 +86,10 @@ export function updateNotifications(notification, intlMessages, intlLocale) { dispatch(importFetchedStatus(notification.status)); } + if (notification.report) { + dispatch(importFetchedAccount(notification.report.target_account)); + } + dispatch({ type: NOTIFICATIONS_UPDATE, notification, @@ -134,6 +133,7 @@ const excludeTypesFromFilter = filter => { 'status', 'update', 'admin.sign_up', + 'admin.report', ]); return allTypes.filterNot(item => item === filter).toJS(); @@ -179,6 +179,7 @@ export function expandNotifications({ maxId } = {}, done = noOp) { dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); + dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems)); fetchRelatedRelationships(dispatch, response.data); diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index d76f045c8..84709083f 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -21,7 +21,6 @@ import { updateReaction as updateAnnouncementsReaction, deleteAnnouncement, } from './announcements'; -import { fetchFilters } from './filters'; import { getLocale } from '../locales'; const { messages } = getLocale(); @@ -97,9 +96,6 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti case 'conversation': dispatch(updateConversations(JSON.parse(data.payload))); break; - case 'filters_changed': - dispatch(fetchFilters()); - break; case 'announcement': dispatch(updateAnnouncements(JSON.parse(data.payload))); break; diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js index 7f442d189..4e9cd3569 100644 --- a/app/javascript/mastodon/components/hashtag.js +++ b/app/javascript/mastodon/components/hashtag.js @@ -1,7 +1,7 @@ // @ts-check import React from 'react'; import { Sparklines, SparklinesCurve } from 'react-sparklines'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Permalink from './permalink'; @@ -9,6 +9,10 @@ import ShortNumber from 'mastodon/components/short_number'; import Skeleton from 'mastodon/components/skeleton'; import classNames from 'classnames'; +const messages = defineMessages({ + totalVolume: { id: 'hashtag.total_volume', defaultMessage: 'Total volume in the last {days, plural, one {day} other {{days} days}}' }, +}); + class SilentErrorBoundary extends React.Component { static propTypes = { @@ -41,10 +45,11 @@ class SilentErrorBoundary extends React.Component { export const accountsCountRenderer = (displayNumber, pluralReady) => ( <FormattedMessage id='trends.counter_by_accounts' - defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} talking' + defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}' values={{ count: pluralReady, counter: <strong>{displayNumber}</strong>, + days: 2, }} /> ); @@ -64,7 +69,7 @@ ImmutableHashtag.propTypes = { hashtag: ImmutablePropTypes.map.isRequired, }; -const Hashtag = ({ name, href, to, people, uses, history, className }) => ( +const Hashtag = injectIntl(({ name, href, to, people, uses, history, className, intl }) => ( <div className={classNames('trends__item', className)}> <div className='trends__item__name'> <Permalink href={href} to={to}> @@ -74,9 +79,10 @@ const Hashtag = ({ name, href, to, people, uses, history, className }) => ( {typeof people !== 'undefined' ? <ShortNumber value={people} renderer={accountsCountRenderer} /> : <Skeleton width={100} />} </div> - <div className='trends__item__current'> + <abbr className='trends__item__current' title={intl.formatMessage(messages.totalVolume, { days: 2 })}> {typeof uses !== 'undefined' ? <ShortNumber value={uses} /> : <Skeleton width={42} height={36} />} - </div> + <span className='trends__item__current__asterisk'>*</span> + </abbr> <div className='trends__item__sparkline'> <SilentErrorBoundary> @@ -86,7 +92,7 @@ const Hashtag = ({ name, href, to, people, uses, history, className }) => ( </SilentErrorBoundary> </div> </div> -); +)); Hashtag.propTypes = { name: PropTypes.string, diff --git a/app/javascript/mastodon/components/icon_button.js b/app/javascript/mastodon/components/icon_button.js index 6a653675b..81743a1db 100644 --- a/app/javascript/mastodon/components/icon_button.js +++ b/app/javascript/mastodon/components/icon_button.js @@ -132,8 +132,16 @@ export default class IconButton extends React.PureComponent { ); if (href) { - contents = ( - <a href={href} target='_blank' rel='noopener noreferrer'> + return ( + <a + href={href} + aria-label={title} + title={title} + target='_blank' + rel='noopener noreferrer' + className={classes} + style={style} + > {contents} </a> ); diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 7c44669d2..238a0d734 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -116,6 +116,7 @@ class Status extends ImmutablePureComponent { state = { showMedia: defaultMediaVisibility(this.props.status), statusId: undefined, + forceFilter: undefined, }; static getDerivedStateFromProps(nextProps, prevState) { @@ -277,6 +278,15 @@ class Status extends ImmutablePureComponent { this.handleToggleMediaVisibility(); } + handleUnfilterClick = e => { + this.setState({ forceFilter: false }); + e.preventDefault(); + } + + handleFilterClick = () => { + this.setState({ forceFilter: true }); + } + _properStatus () { const { status } = this.props; @@ -328,7 +338,8 @@ class Status extends ImmutablePureComponent { ); } - if (status.get('filtered') || status.getIn(['reblog', 'filtered'])) { + const matchedFilters = status.get('matched_filters'); + if (this.state.forceFilter === undefined ? matchedFilters : this.state.forceFilter) { const minHandlers = this.props.muted ? {} : { moveUp: this.handleHotkeyMoveUp, moveDown: this.handleHotkeyMoveDown, @@ -337,7 +348,11 @@ class Status extends ImmutablePureComponent { return ( <HotKeys handlers={minHandlers}> <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0' ref={this.handleRef}> - <FormattedMessage id='status.filtered' defaultMessage='Filtered' /> + <FormattedMessage id='status.filtered' defaultMessage='Filtered' />: {matchedFilters.join(', ')}. + {' '} + <button className='status__wrapper--filtered__button' onClick={this.handleUnfilterClick}> + <FormattedMessage id='status.show_filter_reason' defaultMessage='Show anyway' /> + </button> </div> </HotKeys> ); @@ -496,7 +511,7 @@ class Status extends ImmutablePureComponent { {media} - <StatusActionBar scrollKey={scrollKey} status={status} account={account} {...other} /> + <StatusActionBar scrollKey={scrollKey} status={status} account={account} onFilter={matchedFilters && this.handleFilterClick} {...other} /> </div> </div> </HotKeys> diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 1d8fe23da..d44da482d 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -6,8 +6,9 @@ import IconButton from './icon_button'; import DropdownMenuContainer from '../containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me, isStaff } from '../initial_state'; +import { me } from '../initial_state'; import classNames from 'classnames'; +import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, @@ -38,6 +39,7 @@ const messages = defineMessages({ admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' }, admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' }, copy: { id: 'status.copy', defaultMessage: 'Copy link to status' }, + hide: { id: 'status.hide', defaultMessage: 'Hide toot' }, blockDomain: { id: 'account.block_domain', defaultMessage: 'Block domain {domain}' }, unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' }, unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' }, @@ -54,6 +56,7 @@ class StatusActionBar extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, + identity: PropTypes.object, }; static propTypes = { @@ -76,6 +79,7 @@ class StatusActionBar extends ImmutablePureComponent { onMuteConversation: PropTypes.func, onPin: PropTypes.func, onBookmark: PropTypes.func, + onFilter: PropTypes.func, withDismiss: PropTypes.bool, withCounters: PropTypes.bool, scrollKey: PropTypes.string, @@ -207,6 +211,10 @@ class StatusActionBar extends ImmutablePureComponent { this.props.onMuteConversation(this.props.status); } + handleFilter = () => { + this.props.onFilter(); + } + handleCopy = () => { const url = this.props.status.get('url'); const textarea = document.createElement('textarea'); @@ -226,6 +234,11 @@ class StatusActionBar extends ImmutablePureComponent { } } + + handleFilterClick = () => { + this.props.onFilter(); + } + render () { const { status, relationship, intl, withDismiss, withCounters, scrollKey } = this.props; @@ -295,7 +308,7 @@ class StatusActionBar extends ImmutablePureComponent { } } - if (isStaff) { + if ((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) { menu.push(null); menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` }); menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses?id=${status.get('id')}` }); @@ -329,6 +342,10 @@ class StatusActionBar extends ImmutablePureComponent { <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShareClick} /> ); + const filterButton = this.props.onFilter && ( + <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.hide)} icon='eye' onClick={this.handleFilterClick} /> + ); + return ( <div className='status__action-bar'> <IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} obfuscateCount /> @@ -337,6 +354,8 @@ class StatusActionBar extends ImmutablePureComponent { {shareButton} + {filterButton} + <div className='status__action-bar-dropdown'> <DropdownMenuContainer scrollKey={scrollKey} diff --git a/app/javascript/mastodon/containers/mastodon.js b/app/javascript/mastodon/containers/mastodon.js index 0c3f6afa8..f4bef4686 100644 --- a/app/javascript/mastodon/containers/mastodon.js +++ b/app/javascript/mastodon/containers/mastodon.js @@ -26,6 +26,7 @@ const createIdentityContext = state => ({ signedIn: !!state.meta.me, accountId: state.meta.me, accessToken: state.meta.access_token, + permissions: state.role.permissions, }); export default class Mastodon extends React.PureComponent { diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js index 8e6b9f063..1ad9341c7 100644 --- a/app/javascript/mastodon/features/account/components/header.js +++ b/app/javascript/mastodon/features/account/components/header.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import Button from 'mastodon/components/button'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { autoPlayGif, me, isStaff } from 'mastodon/initial_state'; +import { autoPlayGif, me } from 'mastodon/initial_state'; import classNames from 'classnames'; import Icon from 'mastodon/components/icon'; import IconButton from 'mastodon/components/icon_button'; @@ -14,6 +14,7 @@ import ShortNumber from 'mastodon/components/short_number'; import { NavLink } from 'react-router-dom'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; import AccountNoteContainer from '../containers/account_note_container'; +import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions'; const messages = defineMessages({ unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, @@ -64,6 +65,10 @@ const dateFormatOptions = { export default @injectIntl class Header extends ImmutablePureComponent { + static contextTypes = { + identity: PropTypes.object, + }; + static propTypes = { account: ImmutablePropTypes.map, identity_props: ImmutablePropTypes.list, @@ -241,7 +246,7 @@ class Header extends ImmutablePureComponent { } } - if (account.get('id') !== me && isStaff) { + if (account.get('id') !== me && (this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) { menu.push(null); menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${account.get('id')}` }); } diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.js b/app/javascript/mastodon/features/notifications/components/column_settings.js index 1cdb24086..b1618c1b4 100644 --- a/app/javascript/mastodon/features/notifications/components/column_settings.js +++ b/app/javascript/mastodon/features/notifications/components/column_settings.js @@ -5,10 +5,14 @@ import { FormattedMessage } from 'react-intl'; import ClearColumnButton from './clear_column_button'; import GrantPermissionButton from './grant_permission_button'; import SettingToggle from './setting_toggle'; -import { isStaff } from 'mastodon/initial_state'; +import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions'; export default class ColumnSettings extends React.PureComponent { + static contextTypes = { + identity: PropTypes.object, + }; + static propTypes = { settings: ImmutablePropTypes.map.isRequired, pushSettings: ImmutablePropTypes.map.isRequired, @@ -166,7 +170,7 @@ export default class ColumnSettings extends React.PureComponent { </div> </div> - {isStaff && ( + {(this.context.identity.permissions & PERMISSION_MANAGE_USERS === PERMISSION_MANAGE_USERS) && ( <div role='group' aria-labelledby='notifications-admin-sign-up'> <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.admin.sign_up' defaultMessage='New sign-ups:' /></span> @@ -178,6 +182,19 @@ export default class ColumnSettings extends React.PureComponent { </div> </div> )} + + {(this.context.identity.permissions & PERMISSION_MANAGE_REPORTS === PERMISSION_MANAGE_REPORTS) && ( + <div role='group' aria-labelledby='notifications-admin-report'> + <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.admin.report' defaultMessage='New reports:' /></span> + + <div className='column-settings__row'> + <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'admin.report']} onChange={onChange} label={alertStr} /> + {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'admin.report']} onChange={this.onPushChange} label={pushStr} />} + <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'admin.report']} onChange={onChange} label={showStr} /> + <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'admin.report']} onChange={onChange} label={soundStr} /> + </div> + </div> + )} </div> ); } diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/mastodon/features/notifications/components/notification.js index 9198e9c9d..0af71418c 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.js +++ b/app/javascript/mastodon/features/notifications/components/notification.js @@ -7,6 +7,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { me } from 'mastodon/initial_state'; import StatusContainer from 'mastodon/containers/status_container'; import AccountContainer from 'mastodon/containers/account_container'; +import Report from './report'; import FollowRequestContainer from '../containers/follow_request_container'; import Icon from 'mastodon/components/icon'; import Permalink from 'mastodon/components/permalink'; @@ -21,6 +22,7 @@ const messages = defineMessages({ status: { id: 'notification.status', defaultMessage: '{name} just posted' }, update: { id: 'notification.update', defaultMessage: '{name} edited a post' }, adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' }, + adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' }, }); const notificationForScreenReader = (intl, message, timestamp) => { @@ -367,6 +369,32 @@ class Notification extends ImmutablePureComponent { ); } + renderAdminReport (notification, account, link) { + const { intl, unread, report } = this.props; + + const targetAccount = report.get('target_account'); + const targetDisplayNameHtml = { __html: targetAccount.get('display_name_html') }; + const targetLink = <bdi><Permalink className='notification__display-name' href={targetAccount.get('url')} title={targetAccount.get('acct')} to={`/@${targetAccount.get('acct')}`} dangerouslySetInnerHTML={targetDisplayNameHtml} /></bdi>; + + return ( + <HotKeys handlers={this.getHandlers()}> + <div className={classNames('notification notification-admin-report focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.adminReport, { name: account.get('acct'), target: notification.getIn(['report', 'target_account', 'acct']) }), notification.get('created_at'))}> + <div className='notification__message'> + <div className='notification__favourite-icon-wrapper'> + <Icon id='flag' fixedWidth /> + </div> + + <span title={notification.get('created_at')}> + <FormattedMessage id='notification.admin.report' defaultMessage='{name} reported {target}' values={{ name: link, target: targetLink }} /> + </span> + </div> + + <Report account={account} report={notification.get('report')} hidden={this.props.hidden} /> + </div> + </HotKeys> + ); + } + render () { const { notification } = this.props; const account = notification.get('account'); @@ -392,6 +420,8 @@ class Notification extends ImmutablePureComponent { return this.renderPoll(notification, account); case 'admin.sign_up': return this.renderAdminSignUp(notification, account, link); + case 'admin.report': + return this.renderAdminReport(notification, account, link); } return null; diff --git a/app/javascript/mastodon/features/notifications/components/report.js b/app/javascript/mastodon/features/notifications/components/report.js new file mode 100644 index 000000000..3ce3eb9d3 --- /dev/null +++ b/app/javascript/mastodon/features/notifications/components/report.js @@ -0,0 +1,62 @@ +import React, { Fragment } from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import PropTypes from 'prop-types'; +import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; +import ImmutablePureComponent from 'react-immutable-pure-component'; +import AvatarOverlay from 'mastodon/components/avatar_overlay'; +import RelativeTimestamp from 'mastodon/components/relative_timestamp'; + +const messages = defineMessages({ + openReport: { id: 'report_notification.open', defaultMessage: 'Open report' }, + other: { id: 'report_notification.categories.other', defaultMessage: 'Other' }, + spam: { id: 'report_notification.categories.spam', defaultMessage: 'Spam' }, + violation: { id: 'report_notification.categories.violation', defaultMessage: 'Rule violation' }, +}); + +export default @injectIntl +class Report extends ImmutablePureComponent { + + static propTypes = { + account: ImmutablePropTypes.map.isRequired, + report: ImmutablePropTypes.map.isRequired, + hidden: PropTypes.bool, + intl: PropTypes.object.isRequired, + }; + + render () { + const { intl, hidden, report, account } = this.props; + + if (!report) { + return null; + } + + if (hidden) { + return ( + <Fragment> + {report.get('id')} + </Fragment> + ); + } + + return ( + <div className='notification__report'> + <div className='notification__report__avatar'> + <AvatarOverlay account={report.get('target_account')} friend={account} /> + </div> + + <div className='notification__report__details'> + <div> + <RelativeTimestamp timestamp={report.get('created_at')} short={false} /> · <FormattedMessage id='report_notification.attached_statuses' defaultMessage='{count, plural, one {{count} post} other {{count} posts}} attached' values={{ count: report.get('status_ids').size }} /> + <br /> + <strong>{intl.formatMessage(messages[report.get('category')])}</strong> + </div> + + <div className='notification__report__actions'> + <a href={`/admin/reports/${report.get('id')}`} className='button' target='_blank' rel='noopener noreferrer'>{intl.formatMessage(messages.openReport)}</a> + </div> + </div> + </div> + ); + } + +} diff --git a/app/javascript/mastodon/features/notifications/containers/notification_container.js b/app/javascript/mastodon/features/notifications/containers/notification_container.js index 5c984197f..8bd5b3d78 100644 --- a/app/javascript/mastodon/features/notifications/containers/notification_container.js +++ b/app/javascript/mastodon/features/notifications/containers/notification_container.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux'; -import { makeGetNotification, makeGetStatus } from '../../../selectors'; +import { makeGetNotification, makeGetStatus, makeGetReport } from '../../../selectors'; import Notification from '../components/notification'; import { initBoostModal } from '../../../actions/boosts'; import { mentionCompose } from '../../../actions/compose'; @@ -18,12 +18,14 @@ import { boostModal } from '../../../initial_state'; const makeMapStateToProps = () => { const getNotification = makeGetNotification(); const getStatus = makeGetStatus(); + const getReport = makeGetReport(); const mapStateToProps = (state, props) => { const notification = getNotification(state, props.notification, props.accountId); return { notification: notification, status: notification.get('status') ? getStatus(state, { id: notification.get('status') }) : null, + report: notification.get('report') ? getReport(state, notification.get('report'), notification.getIn(['report', 'target_account', 'id'])) : null, }; }; diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js index edaff959e..50bda69f8 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.js +++ b/app/javascript/mastodon/features/status/components/action_bar.js @@ -5,8 +5,9 @@ import IconButton from '../../../components/icon_button'; import ImmutablePropTypes from 'react-immutable-proptypes'; import DropdownMenuContainer from '../../../containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; -import { me, isStaff } from '../../../initial_state'; +import { me } from '../../../initial_state'; import classNames from 'classnames'; +import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, @@ -50,6 +51,7 @@ class ActionBar extends React.PureComponent { static contextTypes = { router: PropTypes.object, + identity: PropTypes.object, }; static propTypes = { @@ -248,7 +250,7 @@ class ActionBar extends React.PureComponent { } } - if (isStaff) { + if ((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) { menu.push(null); menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` }); menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses?id=${status.get('id')}` }); diff --git a/app/javascript/mastodon/features/ui/components/image_loader.js b/app/javascript/mastodon/features/ui/components/image_loader.js index c6f16a792..dfa0efe49 100644 --- a/app/javascript/mastodon/features/ui/components/image_loader.js +++ b/app/javascript/mastodon/features/ui/components/image_loader.js @@ -1,10 +1,10 @@ -import React from 'react'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; +import PropTypes from 'prop-types'; +import React, { PureComponent } from 'react'; import { LoadingBar } from 'react-redux-loading-bar'; import ZoomableImage from './zoomable_image'; -export default class ImageLoader extends React.PureComponent { +export default class ImageLoader extends PureComponent { static propTypes = { alt: PropTypes.string, @@ -43,7 +43,7 @@ export default class ImageLoader extends React.PureComponent { this.loadImage(this.props); } - componentWillReceiveProps (nextProps) { + UNSAFE_componentWillReceiveProps (nextProps) { if (this.props.src !== nextProps.src) { this.loadImage(nextProps); } @@ -139,14 +139,18 @@ export default class ImageLoader extends React.PureComponent { return ( <div className={className}> - <LoadingBar loading={loading ? 1 : 0} className='loading-bar' style={{ width: this.state.width || width }} /> {loading ? ( - <canvas - className='image-loader__preview-canvas' - ref={this.setCanvasRef} - width={width} - height={height} - /> + <> + <div className='loading-bar__container' style={{ width: this.state.width || width }}> + <LoadingBar className='loading-bar' loading={1} /> + </div> + <canvas + className='image-loader__preview-canvas' + ref={this.setCanvasRef} + width={width} + height={height} + /> + </> ) : ( <ZoomableImage alt={alt} diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js index edf1104c4..bbb9b122a 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.js +++ b/app/javascript/mastodon/features/ui/components/link_footer.js @@ -3,9 +3,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; -import { invitesEnabled, limitedFederationMode, version, repository, source_url, profile_directory as profileDirectory } from 'mastodon/initial_state'; +import { limitedFederationMode, version, repository, source_url, profile_directory as profileDirectory } from 'mastodon/initial_state'; import { logOut } from 'mastodon/utils/log_out'; import { openModal } from 'mastodon/actions/modal'; +import { PERMISSION_INVITE_USERS } from 'mastodon/permissions'; const messages = defineMessages({ logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, @@ -27,6 +28,10 @@ export default @injectIntl @connect(null, mapDispatchToProps) class LinkFooter extends React.PureComponent { + static contextTypes = { + identity: PropTypes.object, + }; + static propTypes = { withHotkeys: PropTypes.bool, onLogout: PropTypes.func.isRequired, @@ -48,7 +53,7 @@ class LinkFooter extends React.PureComponent { return ( <div className='getting-started__footer'> <ul> - {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} + {((this.context.identity.permissions & PERMISSION_INVITE_USERS) === PERMISSION_INVITE_USERS) && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} {withHotkeys && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>} <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li> {!limitedFederationMode && <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li>} diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index 1ee038223..9a901f12a 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -13,7 +13,6 @@ import { debounce } from 'lodash'; import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../actions/compose'; import { expandHomeTimeline } from '../../actions/timelines'; import { expandNotifications } from '../../actions/notifications'; -import { fetchFilters } from '../../actions/filters'; import { fetchRules } from '../../actions/rules'; import { clearHeight } from '../../actions/height_cache'; import { focusApp, unfocusApp, changeLayout } from 'mastodon/actions/app'; @@ -368,7 +367,7 @@ class UI extends React.PureComponent { this.props.dispatch(fetchMarkers()); this.props.dispatch(expandHomeTimeline()); this.props.dispatch(expandNotifications()); - setTimeout(() => this.props.dispatch(fetchFilters()), 500); + setTimeout(() => this.props.dispatch(fetchRules()), 3000); this.hotkeys.__mousetrap__.stopCallback = (e, element) => { diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 51d023c8e..b1dd07f61 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -13,14 +13,12 @@ export const deleteModal = getMeta('delete_modal'); export const me = getMeta('me'); export const searchEnabled = getMeta('search_enabled'); export const maxChars = (initialState && initialState.max_toot_chars) || 500; -export const invitesEnabled = getMeta('invites_enabled'); export const limitedFederationMode = getMeta('limited_federation_mode'); export const repository = getMeta('repository'); export const source_url = getMeta('source_url'); export const version = getMeta('version'); export const mascot = getMeta('mascot'); export const profile_directory = getMeta('profile_directory'); -export const isStaff = getMeta('is_staff'); export const forceSingleColumn = !getMeta('advanced_layout'); export const useBlurhash = getMeta('use_blurhash'); export const usePendingItems = getMeta('use_pending_items'); diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index 52cb08217..9e84a1bd7 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 406868d65..d3f49b82f 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "التفضيلات", "navigation_bar.public_timeline": "الخيط العام الموحد", "navigation_bar.security": "الأمان", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "أنشأ {name} حسابًا", "notification.favourite": "أُعجِب {name} بمنشورك", "notification.follow": "{name} يتابعك", @@ -326,6 +327,7 @@ "notification.update": "عدّلَ {name} منشورًا", "notifications.clear": "امسح الإخطارات", "notifications.clear_confirmation": "أمتأكد من أنك تود مسح جل الإخطارات الخاصة بك و المتلقاة إلى حد الآن ؟", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:", "notifications.column_settings.alert": "إشعارات سطح المكتب", "notifications.column_settings.favourite": "المُفَضَّلة:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "شُكرًا لَكَ على الإبلاغ، سَوفَ نَنظُرُ فِي هَذَا الأمر.", "report.unfollow": "إلغاء متابعة @{name}", "report.unfollow_explanation": "أنت تتابع هذا الحساب، لإزالة مَنشوراته من تغذيَتِكَ الرئيسة ألغ متابعته.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "ابحث", "search_popout.search_format": "نمط البحث المتقدم", "search_popout.tips.full_text": "النص البسيط يقوم بعرض المنشورات التي كتبتها أو قمت بإرسالها أو ترقيتها أو تمت الإشارة إليك فيها من طرف آخرين ، بالإضافة إلى مطابقة أسماء المستخدمين وأسماء العرض وعلامات التصنيف.", @@ -461,6 +468,7 @@ "status.embed": "إدماج", "status.favourite": "أضف إلى المفضلة", "status.filtered": "مُصفّى", + "status.hide": "Hide toot", "status.history.created": "أنشأه {name} {date}", "status.history.edited": "عدله {name} {date}", "status.load_more": "حمّل المزيد", @@ -484,6 +492,7 @@ "status.report": "ابلِغ عن @{name}", "status.sensitive_warning": "محتوى حساس", "status.share": "مشاركة", + "status.show_filter_reason": "Show anyway", "status.show_less": "اعرض أقلّ", "status.show_less_all": "طي الكل", "status.show_more": "أظهر المزيد", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 0f18f7376..16fa5e1b6 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -33,7 +33,7 @@ "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", "account.posts": "Barritos", - "account.posts_with_replies": "Barritos y rempuestes", + "account.posts_with_replies": "Artículos y rempuestes", "account.report": "Report @{name}", "account.requested": "Esperando pola aprobación. Calca pa encaboxar la solicitú de siguimientu", "account.share": "Share @{name}'s profile", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferencies", "navigation_bar.public_timeline": "Llinia temporal federada", "navigation_bar.security": "Seguranza", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} siguióte", @@ -326,6 +327,7 @@ "notification.update": "{name} editó l'artículu", "notifications.clear": "Llimpiar avisos", "notifications.clear_confirmation": "¿De xuru que quies llimpiar dafechu tolos avisos?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Avisos d'escritoriu", "notifications.column_settings.favourite": "Favoritos:", @@ -413,14 +415,14 @@ "report.placeholder": "Comentarios adicionales", "report.reasons.dislike": "I don't like it", "report.reasons.dislike_description": "It is not something you want to see", - "report.reasons.other": "It's something else", - "report.reasons.other_description": "The issue does not fit into other categories", - "report.reasons.spam": "It's spam", + "report.reasons.other": "Ye daqué más", + "report.reasons.other_description": "La incidencia nun s'axusta a les demás categoríes", + "report.reasons.spam": "Ye spam", "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", "report.reasons.violation": "Incumple les regles del sirvidor", "report.reasons.violation_description": "You are aware that it breaks specific rules", "report.rules.subtitle": "Select all that apply", - "report.rules.title": "Which rules are being violated?", + "report.rules.title": "¿Qué regles s'incumplen?", "report.statuses.subtitle": "Select all that apply", "report.statuses.title": "Are there any posts that back up this report?", "report.submit": "Unviar", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Buscar", "search_popout.search_format": "Formatu de gueta avanzada", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Empotrar", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Cargar más", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Conteníu sensible", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Amosar menos", "status.show_less_all": "Amosar menos en too", "status.show_more": "Amosar más", @@ -509,7 +518,7 @@ "timeline_hint.resources.follows": "Follows", "timeline_hint.resources.statuses": "Older posts", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", - "trends.trending_now": "Trending now", + "trends.trending_now": "En tendencia", "ui.beforeunload": "El borrador va perdese si coles de Mastodon.", "units.short.billion": "{count} B", "units.short.million": "{count} M", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 69f4796ff..18d95b5dd 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Предпочитания", "navigation_bar.public_timeline": "Публичен канал", "navigation_bar.security": "Сигурност", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} хареса твоята публикация", "notification.follow": "{name} те последва", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Изчистване на известия", "notifications.clear_confirmation": "Сигурни ли сте, че искате да изчистите окончателно всичките си известия?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Десктоп известия", "notifications.column_settings.favourite": "Предпочитани:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Търсене", "search_popout.search_format": "Формат за разширено търсене", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Вграждане", "status.favourite": "Предпочитани", "status.filtered": "Филтрирано", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Зареждане на още", @@ -484,6 +492,7 @@ "status.report": "Докладване на @{name}", "status.sensitive_warning": "Деликатно съдържание", "status.share": "Споделяне", + "status.show_filter_reason": "Show anyway", "status.show_less": "Покажи по-малко", "status.show_less_all": "Покажи по-малко за всички", "status.show_more": "Покажи повече", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 912a7eb7e..34d650234 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "পছন্দসমূহ", "navigation_bar.public_timeline": "যুক্তবিশ্বের সময়রেখা", "navigation_bar.security": "নিরাপত্তা", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} আপনার কার্যক্রম পছন্দ করেছেন", "notification.follow": "{name} আপনাকে অনুসরণ করেছেন", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "প্রজ্ঞাপনগুলো মুছে ফেলতে", "notifications.clear_confirmation": "আপনি কি নির্চিত প্রজ্ঞাপনগুলো মুছে ফেলতে চান ?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "কম্পিউটারে প্রজ্ঞাপনগুলি", "notifications.column_settings.favourite": "পছন্দের:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "অনুসন্ধান", "search_popout.search_format": "বিস্তারিতভাবে খোঁজার পদ্ধতি", "search_popout.tips.full_text": "সাধারণ লেখা দিয়ে খুঁজলে বের হবে সেরকম আপনার লেখা, পছন্দের লেখা, সমর্থন করা লেখা, আপনাকে উল্লেখকরা কোনো লেখা, যা খুঁজছেন সেরকম কোনো ব্যবহারকারীর নাম বা কোনো হ্যাশট্যাগগুলো।", @@ -461,6 +468,7 @@ "status.embed": "এমবেড করতে", "status.favourite": "পছন্দের করতে", "status.filtered": "ছাঁকনিদিত", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "আরো দেখুন", @@ -484,6 +492,7 @@ "status.report": "@{name} কে রিপোর্ট করতে", "status.sensitive_warning": "সংবেদনশীল কিছু", "status.share": "অন্যদের জানান", + "status.show_filter_reason": "Show anyway", "status.show_less": "কম দেখতে", "status.show_less_all": "সবগুলোতে কম দেখতে", "status.show_more": "আরো দেখাতে", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index c5559a277..14a55e420 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Gwellvezioù", "navigation_bar.public_timeline": "Red-amzer kevreet", "navigation_bar.security": "Diogelroez", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} en/he deus lakaet ho toud en e/he muiañ-karet", "notification.follow": "heuliañ a ra {name} ac'hanoc'h", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Skarzhañ ar c'hemennoù", "notifications.clear_confirmation": "Ha sur oc'h e fell deoc'h skarzhañ ho kemennoù penn-da-benn?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Kemennoù war ar burev", "notifications.column_settings.favourite": "Ar re vuiañ-karet:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Klask", "search_popout.search_format": "Framm klask araokaet", "search_popout.tips.full_text": "Testenn simpl a adkas toudoù skrivet ganeoc'h, merket ganeoc'h evel miuañ-karet, toudoù skignet, pe e-lec'h oc'h bet meneget, met ivez anvioù skrammañ, anvioù implijer ha gêrioù-klik hag a glot.", @@ -461,6 +468,7 @@ "status.embed": "Enframmañ", "status.favourite": "Muiañ-karet", "status.filtered": "Silet", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Kargañ muioc'h", @@ -484,6 +492,7 @@ "status.report": "Disklêriañ @{name}", "status.sensitive_warning": "Dalc'had kizidik", "status.share": "Rannañ", + "status.show_filter_reason": "Show anyway", "status.show_less": "Diskouez nebeutoc'h", "status.show_less_all": "Diskouez nebeutoc'h evit an holl", "status.show_more": "Diskouez muioc'h", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 5490bb6b7..2e3520fed 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferències", "navigation_bar.public_timeline": "Línia de temps federada", "navigation_bar.security": "Seguretat", + "notification.admin.report": "{name} ha reportat {target}", "notification.admin.sign_up": "{name} s'ha registrat", "notification.favourite": "{name} ha afavorit la teva publicació", "notification.follow": "{name} et segueix", @@ -326,6 +327,7 @@ "notification.update": "{name} ha editat una publicació", "notifications.clear": "Esborra les notificacions", "notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?", + "notifications.column_settings.admin.report": "Nous informes:", "notifications.column_settings.admin.sign_up": "Nous registres:", "notifications.column_settings.alert": "Notificacions d'escriptori", "notifications.column_settings.favourite": "Preferits:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Gràcies per denunciar-ho. Ho investigarem.", "report.unfollow": "Deixa de seguir @{name}", "report.unfollow_explanation": "Estàs seguint aquest compte. Per no veure les seves publicacions a la teva línia de temps d'Inici, deixa de seguir-lo.", + "report_notification.attached_statuses": "{count, plural, one {{count} publicació} other {{count} publicacions}} attached", + "report_notification.categories.other": "Altres", + "report_notification.categories.spam": "Contingut brossa", + "report_notification.categories.violation": "Violació de norma", + "report_notification.open": "Informe obert", "search.placeholder": "Cerca", "search_popout.search_format": "Format de cerca avançada", "search_popout.tips.full_text": "El text simple recupera publicacions que has escrit, marcat com a preferides, que has impulsat o on t'han esmentat, així com els usuaris, els noms d'usuaris i les etiquetes.", @@ -461,6 +468,7 @@ "status.embed": "Incrusta", "status.favourite": "Favorit", "status.filtered": "Filtrat", + "status.hide": "Amaga publicació", "status.history.created": "{name} ha creat {date}", "status.history.edited": "{name} ha editat {date}", "status.load_more": "Carregar-ne més", @@ -484,6 +492,7 @@ "status.report": "Denuncia @{name}", "status.sensitive_warning": "Contingut sensible", "status.share": "Comparteix", + "status.show_filter_reason": "Mostra igualment", "status.show_less": "Mostrar-ne menys", "status.show_less_all": "Mostrar-ne menys per a tot", "status.show_more": "Mostrar-ne més", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index e7c4dab71..223b0d417 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "پەسەندەکان", "navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک", "navigation_bar.security": "ئاسایش", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} تۆمارکرا", "notification.favourite": "{name} نووسراوەکەتی پەسەند کرد", "notification.follow": "{name} دوای تۆ کەوت", @@ -326,6 +327,7 @@ "notification.update": "{name} پۆستێکی دەستکاریکرد", "notifications.clear": "ئاگانامەکان بسڕیەوە", "notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "چوونەژوورەوەی نوێ:", "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی", "notifications.column_settings.favourite": "دڵخوازترین:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "سوپاس بۆ ڕاپۆرتکردن، ئێمە سەیری ئەم بابەتە دەکەین.", "report.unfollow": "بەدوادانەچوو@{name}", "report.unfollow_explanation": "تۆ شوێنکەوتووی ئەم هەژماررەی دەکەیت. بۆ ئەوەی چیتر نووسراوەکانیان لە هۆم فیدی خۆت نەبینی، بەدوایان مەچۆ.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "گەڕان", "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو", "search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.", @@ -461,6 +468,7 @@ "status.embed": "نیشتەجێ بکە", "status.favourite": "دڵخواز", "status.filtered": "پاڵاوتن", + "status.hide": "Hide toot", "status.history.created": "{name} دروستکراوە لە{date}", "status.history.edited": "{name} دروستکاریکراوە لە{date}", "status.load_more": "زیاتر بار بکە", @@ -484,6 +492,7 @@ "status.report": "گوزارشت @{name}", "status.sensitive_warning": "ناوەڕۆکی هەستیار", "status.share": "هاوبەشی بکە", + "status.show_filter_reason": "Show anyway", "status.show_less": "کەمتر نیشان بدە", "status.show_less_all": "هەمووی بچووک بکەوە", "status.show_more": "زیاتر نیشان بدە", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 9172aea2e..9dd6f1a48 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferenze", "navigation_bar.public_timeline": "Linea pubblica glubale", "navigation_bar.security": "Sicurità", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} hà aghjuntu u vostru statutu à i so favuriti", "notification.follow": "{name} v'hà seguitatu", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Purgà e nutificazione", "notifications.clear_confirmation": "Site sicuru·a che vulete toglie tutte ste nutificazione?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Nutificazione nant'à l'urdinatore", "notifications.column_settings.favourite": "Favuriti:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Circà", "search_popout.search_format": "Ricerca avanzata", "search_popout.tips.full_text": "I testi simplici rimandanu i statuti ch'avete scritti, aghjunti à i vostri favuriti, spartuti o induve quelli site mintuvatu·a, è ancu i cugnomi, nomi pubblichi è hashtag chì currispondenu.", @@ -461,6 +468,7 @@ "status.embed": "Integrà", "status.favourite": "Aghjunghje à i favuriti", "status.filtered": "Filtratu", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Vede di più", @@ -484,6 +492,7 @@ "status.report": "Palisà @{name}", "status.sensitive_warning": "Cuntinutu sensibile", "status.share": "Sparte", + "status.show_filter_reason": "Show anyway", "status.show_less": "Ripiegà", "status.show_less_all": "Ripiegà tuttu", "status.show_more": "Slibrà", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index e1602dacf..e7d6eb87b 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Předvolby", "navigation_bar.public_timeline": "Federovaná časová osa", "navigation_bar.security": "Zabezpečení", + "notification.admin.report": "Uživatel {name} nahlásil {target}", "notification.admin.sign_up": "Uživatel {name} se zaregistroval", "notification.favourite": "Uživatel {name} si oblíbil váš příspěvek", "notification.follow": "Uživatel {name} vás začal sledovat", @@ -326,6 +327,7 @@ "notification.update": "Uživatel {name} upravil příspěvek", "notifications.clear": "Vymazat oznámení", "notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?", + "notifications.column_settings.admin.report": "Nová hlášení:", "notifications.column_settings.admin.sign_up": "Nové registrace:", "notifications.column_settings.alert": "Oznámení na počítači", "notifications.column_settings.favourite": "Oblíbení:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Děkujeme za nahlášení, podíváme se na to.", "report.unfollow": "Přestat sledovat @{name}", "report.unfollow_explanation": "Tento účet sledujete. Abyste už neviděli jejich příspěvky ve své domácí časové ose, přestaňte je sledovat.", + "report_notification.attached_statuses": "{count, plural, one {{count} připojený příspěvek} few {{count} připojené příspěvky} many {{count} připojených příspěvků} other {{count} připojených příspěvků}}", + "report_notification.categories.other": "Ostatní", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Porušení pravidla", + "report_notification.open": "Otevřít hlášení", "search.placeholder": "Hledat", "search_popout.search_format": "Pokročilé hledání", "search_popout.tips.full_text": "Jednoduchý text vrací příspěvky, které jste napsali, oblíbili si, boostnuli, nebo vás v nich někdo zmínil, a také odpovídající přezdívky, zobrazovaná jména a hashtagy.", @@ -461,6 +468,7 @@ "status.embed": "Vložit na web", "status.favourite": "Oblíbit", "status.filtered": "Filtrováno", + "status.hide": "Skrýt příspěvek", "status.history.created": "Uživatel {name} vytvořil {date}", "status.history.edited": "Uživatel {name} upravil {date}", "status.load_more": "Zobrazit více", @@ -484,6 +492,7 @@ "status.report": "Nahlásit @{name}", "status.sensitive_warning": "Citlivý obsah", "status.share": "Sdílet", + "status.show_filter_reason": "Přesto zobrazit", "status.show_less": "Zobrazit méně", "status.show_less_all": "Zobrazit méně pro všechny", "status.show_more": "Zobrazit více", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 42fef4732..3a18db095 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -92,10 +92,10 @@ "community.column_settings.local_only": "Lleol yn unig", "community.column_settings.media_only": "Cyfryngau yn unig", "community.column_settings.remote_only": "Anghysbell yn unig", - "compose.language.change": "Change language", - "compose.language.search": "Search languages...", + "compose.language.change": "Newid iaith", + "compose.language.search": "Chwilio ieithoedd...", "compose_form.direct_message_warning_learn_more": "Dysgu mwy", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "Dyw postiadau ar Mastodon ddim wedi'u hamgryptio o ben i ben. Peidiwch â rhannu unrhyw wybodaeth sensitif dros Mastodon.", "compose_form.hashtag_warning": "Ni fydd y post hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond postiadau cyhoeddus gellid chwilio amdanynt drwy hashnod.", "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich postiadau dilynwyr-yn-unig.", "compose_form.lock_disclaimer.lock": "wedi ei gloi", @@ -106,7 +106,7 @@ "compose_form.poll.remove_option": "Tynnu'r dewisiad", "compose_form.poll.switch_to_multiple": "Newid pleidlais i adael mwy nag un dewis", "compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis", - "compose_form.publish": "Publish", + "compose_form.publish": "Cyhoeddi", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "Cadw newidiadau", "compose_form.sensitive.hide": "Marcio cyfryngau fel eu bod yn sensitif", @@ -149,7 +149,7 @@ "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.", "embed.preview": "Dyma sut olwg fydd arno:", "emoji_button.activity": "Gweithgarwch", - "emoji_button.clear": "Clear", + "emoji_button.clear": "Clir", "emoji_button.custom": "Unigryw", "emoji_button.flags": "Baneri", "emoji_button.food": "Bwyd a Diod", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Dewisiadau", "navigation_bar.public_timeline": "Ffrwd y ffederasiwn", "navigation_bar.security": "Diogelwch", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "Cofrestrodd {name}", "notification.favourite": "Hoffodd {name} eich post", "notification.follow": "Dilynodd {name} chi", @@ -326,6 +327,7 @@ "notification.update": "Golygodd {name} bost", "notifications.clear": "Clirio hysbysiadau", "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?", + "notifications.column_settings.admin.report": "Adroddiadau newydd:", "notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", "notifications.column_settings.favourite": "Ffefrynnau:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Diolch am adrodd, byddwn yn ymchwilio i hyn.", "report.unfollow": "Dad-ddilyn @{name}", "report.unfollow_explanation": "Rydych chi'n dilyn y cyfrif hwn. I beidio â gweld eu postiadau yn eich porthiant cartref mwyach, dad-ddilynwch nhw.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Arall", + "report_notification.categories.spam": "Sbam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Chwilio", "search_popout.search_format": "Fformat chwilio uwch", "search_popout.tips.full_text": "Mae testun syml yn dychwelyd postiadau yr ydych wedi ysgrifennu, hoffi, wedi'u hybio, neu wedi'ch crybwyll ynddynt, ynghyd a chyfateb a enwau defnyddwyr, enwau arddangos ac hashnodau.", @@ -461,6 +468,7 @@ "status.embed": "Plannu", "status.favourite": "Hoffi", "status.filtered": "Wedi'i hidlo", + "status.hide": "Hide toot", "status.history.created": "{name} greuodd {date}", "status.history.edited": "{name} olygodd {date}", "status.load_more": "Llwythwch mwy", @@ -484,6 +492,7 @@ "status.report": "Adrodd @{name}", "status.sensitive_warning": "Cynnwys sensitif", "status.share": "Rhannu", + "status.show_filter_reason": "Show anyway", "status.show_less": "Dangos llai", "status.show_less_all": "Dangos llai i bawb", "status.show_more": "Dangos mwy", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 537fa6af6..fab1f2075 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -92,8 +92,8 @@ "community.column_settings.local_only": "Kun lokalt", "community.column_settings.media_only": "Kun medier", "community.column_settings.remote_only": "Kun udefra", - "compose.language.change": "Change language", - "compose.language.search": "Search languages...", + "compose.language.change": "Skift sprog", + "compose.language.search": "Søg efter sprog...", "compose_form.direct_message_warning_learn_more": "Få mere at vide", "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende krypteret. Del derfor ikke sensitiv information via Mastodon.", "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, idet kun offentlige indlæg kan søges via hashtags.", @@ -149,7 +149,7 @@ "embed.instructions": "Indlejr dette indlæg på dit websted ved at kopiere nedenstående kode.", "embed.preview": "Sådan kommer det til at se ud:", "emoji_button.activity": "Aktivitet", - "emoji_button.clear": "Clear", + "emoji_button.clear": "Ryd", "emoji_button.custom": "Tilpasset", "emoji_button.flags": "Flag", "emoji_button.food": "Mad og drikke", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Præferencer", "navigation_bar.public_timeline": "Fælles tidslinje", "navigation_bar.security": "Sikkerhed", + "notification.admin.report": "{name} anmeldte {target}", "notification.admin.sign_up": "{name} tilmeldte sig", "notification.favourite": "{name} favoritmarkerede dit indlæg", "notification.follow": "{name} begyndte at følge dig", @@ -326,6 +327,7 @@ "notification.update": "{name} redigerede et indlæg", "notifications.clear": "Ryd notifikationer", "notifications.clear_confirmation": "Sikker på, at du vil rydde alle dine notifikationer permanent?", + "notifications.column_settings.admin.report": "Nye anmeldelser:", "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:", "notifications.column_settings.alert": "Computernotifikationer", "notifications.column_settings.favourite": "Favoritter:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Tak for anmeldelsen, der vil blive set nærmere på dette.", "report.unfollow": "Følg ikke længere @{name}", "report.unfollow_explanation": "Denne konto følges. For at ophøre med at se vedkommendes indlæg på hjemmetidslinjen, vælg Følg ikke længere.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} poster}} vedhæftet", + "report_notification.categories.other": "Andre", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Regelovertrædelse", + "report_notification.open": "Åbn anmeldelse", "search.placeholder": "Søg", "search_popout.search_format": "Avanceret søgeformat", "search_popout.tips.full_text": "Simpel tekst returnerer indlæg, du har skrevet, favoritmarkeret, boostet eller som er nævnt i/matcher bruger- og profilnavne samt hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Indlejr", "status.favourite": "Favorit", "status.filtered": "Filtreret", + "status.hide": "Skjul indlæg", "status.history.created": "{name} oprettet {date}", "status.history.edited": "{name} redigeret {date}", "status.load_more": "Indlæs mere", @@ -484,6 +492,7 @@ "status.report": "Anmeld @{name}", "status.sensitive_warning": "Følsomt indhold", "status.share": "Del", + "status.show_filter_reason": "Vis alligevel", "status.show_less": "Vis mindre", "status.show_less_all": "Vis mindre for alle", "status.show_more": "Vis mere", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index d617da412..d3311d6a7 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Einstellungen", "navigation_bar.public_timeline": "Föderierte Zeitleiste", "navigation_bar.security": "Sicherheit", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} hat sich registriert", "notification.favourite": "{name} hat deinen Beitrag favorisiert", "notification.follow": "{name} folgt dir", @@ -326,6 +327,7 @@ "notification.update": "{name} bearbeitete einen Beitrag", "notifications.clear": "Mitteilungen löschen", "notifications.clear_confirmation": "Bist du dir sicher, dass du alle Mitteilungen löschen möchtest?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Neue Anmeldungen:", "notifications.column_settings.alert": "Desktop-Benachrichtigungen", "notifications.column_settings.favourite": "Favorisierungen:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Vielen Dank für die Meldung, wir werden uns das ansehen.", "report.unfollow": "@{name} entfolgen", "report.unfollow_explanation": "Du folgst diesem Konto. Um die Beiträge nicht mehr auf deiner Startseite zu sehen, entfolge dem Konto.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Suche", "search_popout.search_format": "Fortgeschrittenes Suchformat", "search_popout.tips.full_text": "Einfache Texteingabe gibt Beiträge, die du geschrieben, favorisiert und geteilt hast zurück. Außerdem auch Beiträge in denen du erwähnt wurdest, aber auch passende Nutzernamen, Anzeigenamen oder Hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Einbetten", "status.favourite": "Favorisieren", "status.filtered": "Gefiltert", + "status.hide": "Hide toot", "status.history.created": "{name} erstellte {date}", "status.history.edited": "{name} bearbeitete {date}", "status.load_more": "Weitere laden", @@ -484,6 +492,7 @@ "status.report": "@{name} melden", "status.sensitive_warning": "NSFW", "status.share": "Teilen", + "status.show_filter_reason": "Show anyway", "status.show_less": "Weniger anzeigen", "status.show_less_all": "Alle Inhaltswarnungen zuklappen", "status.show_more": "Mehr anzeigen", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index d1ed52832..513f50c3b 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -290,7 +290,11 @@ { "descriptors": [ { - "defaultMessage": "{count, plural, one {{counter} person} other {{counter} people}} talking", + "defaultMessage": "Total volume in the last {days, plural, one {day} other {{days} days}}", + "id": "hashtag.total_volume" + }, + { + "defaultMessage": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}", "id": "trends.counter_by_accounts" } ], @@ -613,6 +617,10 @@ "id": "status.copy" }, { + "defaultMessage": "Hide toot", + "id": "status.hide" + }, + { "defaultMessage": "Block domain {domain}", "id": "account.block_domain" }, @@ -679,6 +687,10 @@ "id": "status.filtered" }, { + "defaultMessage": "Show anyway", + "id": "status.show_filter_reason" + }, + { "defaultMessage": "Pinned post", "id": "status.pinned" }, @@ -2532,6 +2544,10 @@ { "defaultMessage": "New sign-ups:", "id": "notifications.column_settings.admin.sign_up" + }, + { + "defaultMessage": "New reports:", + "id": "notifications.column_settings.admin.report" } ], "path": "app/javascript/mastodon/features/notifications/components/column_settings.json" @@ -2626,6 +2642,10 @@ "id": "notification.admin.sign_up" }, { + "defaultMessage": "{name} reported {target}", + "id": "notification.admin.report" + }, + { "defaultMessage": "{name} has requested to follow you", "id": "notification.follow_request" } @@ -2656,6 +2676,31 @@ { "descriptors": [ { + "defaultMessage": "Open report", + "id": "report_notification.open" + }, + { + "defaultMessage": "Other", + "id": "report_notification.categories.other" + }, + { + "defaultMessage": "Spam", + "id": "report_notification.categories.spam" + }, + { + "defaultMessage": "Rule violation", + "id": "report_notification.categories.violation" + }, + { + "defaultMessage": "{count, plural, one {{count} post} other {{count} posts}} attached", + "id": "report_notification.attached_statuses" + } + ], + "path": "app/javascript/mastodon/features/notifications/components/report.json" + }, + { + "descriptors": [ + { "defaultMessage": "Are you sure you want to permanently clear all your notifications?", "id": "notifications.clear_confirmation" }, @@ -3724,4 +3769,4 @@ ], "path": "app/javascript/mastodon/features/video/index.json" } -] \ No newline at end of file +] diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 6f324860c..3240b682a 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Προτιμήσεις", "navigation_bar.public_timeline": "Ομοσπονδιακή ροή", "navigation_bar.security": "Ασφάλεια", + "notification.admin.report": "{name} ανέφερε {target}", "notification.admin.sign_up": "{name} έχει εγγραφεί", "notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου", "notification.follow": "Ο/Η {name} σε ακολούθησε", @@ -326,6 +327,7 @@ "notification.update": "{name} επεξεργάστηκε μια δημοσίευση", "notifications.clear": "Καθαρισμός ειδοποιήσεων", "notifications.clear_confirmation": "Σίγουρα θέλεις να καθαρίσεις όλες τις ειδοποιήσεις σου;", + "notifications.column_settings.admin.report": "Νέες αναφορές:", "notifications.column_settings.admin.sign_up": "Νέες εγγραφές:", "notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας", "notifications.column_settings.favourite": "Αγαπημένα:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Άλλες", + "report_notification.categories.spam": "Ανεπιθύμητα", + "report_notification.categories.violation": "Παραβίαση κανόνα", + "report_notification.open": "Open report", "search.placeholder": "Αναζήτηση", "search_popout.search_format": "Προχωρημένη αναζήτηση", "search_popout.tips.full_text": "Απλό κείμενο που επιστρέφει καταστάσεις που έχεις γράψει, έχεις σημειώσει ως αγαπημένες, έχεις προωθήσει ή έχεις αναφερθεί σε αυτές, καθώς και όσα ονόματα χρηστών και ετικέτες ταιριάζουν.", @@ -461,6 +468,7 @@ "status.embed": "Ενσωμάτωσε", "status.favourite": "Σημείωσε ως αγαπημένο", "status.filtered": "Φιλτραρισμένα", + "status.hide": "Απόκρυψη toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Φόρτωσε περισσότερα", @@ -484,6 +492,7 @@ "status.report": "Κατάγγειλε @{name}", "status.sensitive_warning": "Ευαίσθητο περιεχόμενο", "status.share": "Μοιράσου", + "status.show_filter_reason": "Εμφάνιση παρ'όλα αυτά", "status.show_less": "Δείξε λιγότερα", "status.show_less_all": "Δείξε λιγότερα για όλα", "status.show_more": "Δείξε περισσότερα", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 71874cb45..561f1088b 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 48f288af5..df25a34c1 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -224,6 +224,7 @@ "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", "hashtag.column_settings.tag_toggle": "Include additional tags for this column", + "hashtag.total_volume": "Total volume in the last {days, plural, one {day} other {{days} days}}", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", @@ -319,6 +320,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your post", "notification.follow": "{name} followed you", @@ -331,6 +333,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -436,6 +439,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns posts you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -466,6 +474,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -489,6 +498,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", @@ -513,7 +523,7 @@ "timeline_hint.resources.followers": "Followers", "timeline_hint.resources.follows": "Follows", "timeline_hint.resources.statuses": "Older posts", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", + "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}", "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "units.short.billion": "{count}B", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 236d25496..3e2475f20 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -4,25 +4,25 @@ "account.badges.bot": "Roboto", "account.badges.group": "Grupo", "account.block": "Bloki @{name}", - "account.block_domain": "Bloki domajnon {domain}", + "account.block_domain": "Bloki la domajnon {domain}", "account.blocked": "Blokita", - "account.browse_more_on_origin_server": "Vidi pli ĉe la originala profilo", - "account.cancel_follow_request": "Nuligi peton de sekvado", + "account.browse_more_on_origin_server": "Foliumi pli ĉe la originala profilo", + "account.cancel_follow_request": "Nuligi la demandon de sekvado", "account.direct": "Rekte mesaĝi @{name}", - "account.disable_notifications": "Ĉesu sciigi min kiam @{name} mesaĝi", + "account.disable_notifications": "Ne plu sciigi min kiam @{name} mesaĝas", "account.domain_blocked": "Domajno blokita", - "account.edit_profile": "Redakti profilon", - "account.enable_notifications": "Sciigi min kiam @{name} mesaĝi", - "account.endorse": "Montri en profilo", + "account.edit_profile": "Redakti la profilon", + "account.enable_notifications": "Sciigi min kiam @{name} mesaĝas", + "account.endorse": "Rekomendi ĉe via profilo", "account.follow": "Sekvi", "account.followers": "Sekvantoj", "account.followers.empty": "Ankoraŭ neniu sekvas tiun uzanton.", "account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}", - "account.following": "Sekvantaj", - "account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}", - "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.", + "account.following": "Sekvadoj", + "account.following_counter": "{count, plural, one {{counter} Sekvado} other {{counter} Sekvadoj}}", + "account.follows.empty": "La uzanto ankoraŭ ne sekvas iun ajn.", "account.follows_you": "Sekvas vin", - "account.hide_reblogs": "Kaŝi plusendojn de @{name}", + "account.hide_reblogs": "Kaŝi la plusendojn de @{name}", "account.joined": "Kuniĝis {date}", "account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}", "account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.", @@ -34,46 +34,46 @@ "account.muted": "Silentigita", "account.posts": "Mesaĝoj", "account.posts_with_replies": "Mesaĝoj kaj respondoj", - "account.report": "Signali @{name}", - "account.requested": "Atendo de aprobo. Alklaku por nuligi peton de sekvado", + "account.report": "Raporti @{name}", + "account.requested": "Atendo de aprobo. Klaku por nuligi la demandon de sekvado", "account.share": "Kundividi la profilon de @{name}", "account.show_reblogs": "Montri la plusendojn de @{name}", "account.statuses_counter": "{count, plural, one {{counter} Mesaĝo} other {{counter} Mesaĝoj}}", "account.unblock": "Malbloki @{name}", - "account.unblock_domain": "Malbloki {domain}", + "account.unblock_domain": "Malbloki la domajnon {domain}", "account.unblock_short": "Malbloki", - "account.unendorse": "Ne montri en profilo", + "account.unendorse": "Ne plu rekomendi ĉe la profilo", "account.unfollow": "Ne plu sekvi", - "account.unmute": "Malsilentigi @{name}", - "account.unmute_notifications": "Malsilentigi sciigojn de @{name}", - "account.unmute_short": "Malsilentigi", - "account_note.placeholder": "Alklaku por aldoni noton", + "account.unmute": "Ne plu silentigi @{name}", + "account.unmute_notifications": "Ne plu silentigi la sciigojn de @{name}", + "account.unmute_short": "Ne plu silentigi", + "account_note.placeholder": "Klaku por aldoni noton", "admin.dashboard.daily_retention": "User retention rate by day after sign-up", "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", "admin.dashboard.retention.average": "Averaĝa", - "admin.dashboard.retention.cohort": "Registriĝo monato", + "admin.dashboard.retention.cohort": "Monato de registriĝo", "admin.dashboard.retention.cohort_size": "Novaj uzantoj", "alert.rate_limited.message": "Bonvolu reprovi post {retry_time, time, medium}.", "alert.rate_limited.title": "Mesaĝkvante limigita", "alert.unexpected.message": "Neatendita eraro okazis.", - "alert.unexpected.title": "Ups!", + "alert.unexpected.title": "Aj!", "announcement.announcement": "Anonco", "attachments_list.unprocessed": "(neprilaborita)", "autosuggest_hashtag.per_week": "{count} semajne", "boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje", "bundle_column_error.body": "Io misfunkciis en la ŝargado de ĉi tiu elemento.", - "bundle_column_error.retry": "Bonvolu reprovi", - "bundle_column_error.title": "Reta eraro", + "bundle_column_error.retry": "Provu refoje", + "bundle_column_error.title": "Eraro de reto", "bundle_modal_error.close": "Fermi", "bundle_modal_error.message": "Io misfunkciis en la ŝargado de ĉi tiu elemento.", - "bundle_modal_error.retry": "Bonvolu reprovi", + "bundle_modal_error.retry": "Provu refoje", "column.blocks": "Blokitaj uzantoj", "column.bookmarks": "Legosignoj", "column.community": "Loka templinio", "column.direct": "Rektaj mesaĝoj", - "column.directory": "Trarigardi profilojn", + "column.directory": "Foliumi la profilojn", "column.domain_blocks": "Blokitaj domajnoj", - "column.favourites": "Stelumoj", + "column.favourites": "Preferaĵoj", "column.follow_requests": "Demandoj de sekvado", "column.home": "Hejmo", "column.lists": "Listoj", @@ -82,49 +82,49 @@ "column.pins": "Alpinglitaj mesaĝoj", "column.public": "Fratara templinio", "column_back_button.label": "Reveni", - "column_header.hide_settings": "Kaŝi agordojn", + "column_header.hide_settings": "Kaŝi la agordojn", "column_header.moveLeft_settings": "Movi kolumnon maldekstren", "column_header.moveRight_settings": "Movi kolumnon dekstren", "column_header.pin": "Alpingli", - "column_header.show_settings": "Montri agordojn", + "column_header.show_settings": "Montri la agordojn", "column_header.unpin": "Depingli", - "column_subheading.settings": "Agordado", + "column_subheading.settings": "Agordoj", "community.column_settings.local_only": "Nur loka", "community.column_settings.media_only": "Nur aŭdovidaĵoj", - "community.column_settings.remote_only": "Nur malproksima", + "community.column_settings.remote_only": "Nur fora", "compose.language.change": "Ŝanĝi lingvon", "compose.language.search": "Serĉi lingvojn...", "compose_form.direct_message_warning_learn_more": "Lerni pli", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "La mesaĵoj en Mastodon ne estas tutvoje ĉifritaj. Ne kundividu tiklajn informojn ĉe Mastodon.", "compose_form.hashtag_warning": "Ĉi tiu mesaĝo ne estos listigita per ajna kradvorto. Nur publikaj mesaĝoj estas serĉeblaj per kradvortoj.", - "compose_form.lock_disclaimer": "Via konta ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn, kiuj estas nur por sekvantoj.", + "compose_form.lock_disclaimer": "Via konto ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn nur al la sekvantoj.", "compose_form.lock_disclaimer.lock": "ŝlosita", "compose_form.placeholder": "Kion vi pensas?", "compose_form.poll.add_option": "Aldoni elekteblon", - "compose_form.poll.duration": "Balotenketa daŭro", + "compose_form.poll.duration": "Daŭro de la balotenketo", "compose_form.poll.option_placeholder": "Elekteblo {number}", "compose_form.poll.remove_option": "Forigi ĉi tiu elekteblon", "compose_form.poll.switch_to_multiple": "Ŝanĝi la balotenketon por permesi multajn elektojn", "compose_form.poll.switch_to_single": "Ŝanĝi la balotenketon por permesi unu solan elekton", - "compose_form.publish": "Publish", + "compose_form.publish": "Publikigi", "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Konservi ŝanĝojn", - "compose_form.sensitive.hide": "Marki la aŭdovidaĵojn kiel tiklaj", - "compose_form.sensitive.marked": "Aŭdovidaĵo markita tikla", - "compose_form.sensitive.unmarked": "Aŭdovidaĵo ne markita tikla", - "compose_form.spoiler.marked": "Teksto kaŝita malantaŭ averto", - "compose_form.spoiler.unmarked": "Teksto ne kaŝita", + "compose_form.save_changes": "Konservi la ŝanĝojn", + "compose_form.sensitive.hide": "{count, plural, one {Marki la aŭdovidaĵon kiel tikla} other {Marki la aŭdovidaĵojn kiel tikla}}", + "compose_form.sensitive.marked": "{count, plural, one {La aŭdovidaĵo estas markita kiel tikla} other {La aŭdovidaĵoj estas markitaj kiel tikla}}", + "compose_form.sensitive.unmarked": "{count, plural, one {La aŭdovidaĵo ne estas markita kiel tikla} other {La aŭdovidaĵoj ne estas markitaj kiel tikla}}", + "compose_form.spoiler.marked": "Forigi la averton de enhavo", + "compose_form.spoiler.unmarked": "Aldoni averton de enhavo", "compose_form.spoiler_placeholder": "Skribu vian averton ĉi tie", "confirmation_modal.cancel": "Nuligi", - "confirmations.block.block_and_report": "Bloki kaj signali", + "confirmations.block.block_and_report": "Bloki kaj raporti", "confirmations.block.confirm": "Bloki", "confirmations.block.message": "Ĉu vi certas, ke vi volas bloki {name}?", "confirmations.delete.confirm": "Forigi", "confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun mesaĝon?", "confirmations.delete_list.confirm": "Forigi", "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?", - "confirmations.discard_edit_media.confirm": "Ne konservi", - "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", + "confirmations.discard_edit_media.confirm": "Forlasi", + "confirmations.discard_edit_media.message": "Vi havas nekonservitajn ŝanĝojn de la priskribo aŭ de la antaŭmontro de la aŭdovidaĵo, ĉu vi forlasu ilin ĉiuokaze?", "confirmations.domain_block.confirm": "Bloki la tutan domajnon", "confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas. Vi ne vidos enhavon de tiu domajno en publika templinio aŭ en viaj sciigoj. Viaj sekvantoj de tiu domajno estos forigitaj.", "confirmations.logout.confirm": "Adiaŭi", @@ -163,7 +163,7 @@ "emoji_button.search_results": "Serĉaj rezultoj", "emoji_button.symbols": "Simboloj", "emoji_button.travel": "Vojaĝoj kaj lokoj", - "empty_column.account_suspended": "Konto haltigita", + "empty_column.account_suspended": "Konto suspendita", "empty_column.account_timeline": "Neniu mesaĝo ĉi tie!", "empty_column.account_unavailable": "Profilo ne disponebla", "empty_column.blocks": "Vi ankoraŭ ne blokis uzanton.", @@ -172,10 +172,10 @@ "empty_column.direct": "Vi ankoraŭ ne havas rektan mesaĝon. Kiam vi sendos aŭ ricevos iun, ĝi aperos ĉi tie.", "empty_column.domain_blocks": "Ankoraŭ neniu domajno estas blokita.", "empty_column.explore_statuses": "Nenio tendencas nun. Rekontrolu poste!", - "empty_column.favourited_statuses": "Vi ankoraŭ ne stelumis mesaĝon. Kiam vi stelumos iun, tiu aperos ĉi tie.", - "empty_column.favourites": "Ankoraŭ neniu stelumis tiun mesaĝon. Kiam iu faros tion, tiu aperos ĉi tie.", + "empty_column.favourited_statuses": "Vi ankoraŭ ne havas mesaĝon en la preferaĵoj. Kiam vi aldonas iun, tiu aperos ĉi tie.", + "empty_column.favourites": "Ankoraŭ neniu aldonis tiun mesaĝon al siaj preferaĵoj. Kiam iu faros ĉi tion, tiu aperos ĉi tie.", "empty_column.follow_recommendations": "Ŝajnas, ke neniuj sugestoj povis esti generitaj por vi. Vi povas provi uzi serĉon por serĉi homojn, kiujn vi eble konas, aŭ esplori tendencajn kradvortojn.", - "empty_column.follow_requests": "Vi ne ankoraŭ havas iun peton de sekvado. Kiam vi ricevos unu, ĝi aperos ĉi tie.", + "empty_column.follow_requests": "Vi ankoraŭ ne havas demandon de sekvado. Kiam vi ricevas unu, ĝi aperas tie ĉi.", "empty_column.hashtag": "Ankoraŭ estas nenio per ĉi tiu kradvorto.", "empty_column.home": "Via hejma tempolinio estas malplena! Vizitu {public} aŭ uzu la serĉilon por renkonti aliajn uzantojn.", "empty_column.home.suggestions": "Vidu iujn sugestojn", @@ -197,11 +197,11 @@ "explore.trending_statuses": "Afiŝoj", "explore.trending_tags": "Kradvortoj", "follow_recommendations.done": "Farita", - "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.", - "follow_recommendations.lead": "La mesaĝoj de personoj kiujn vi sekvas, aperos kronologie en via abonfluo. Ne timu erari, vi povas ĉesi sekvi facile iam ajn!", + "follow_recommendations.heading": "Sekvi la personojn kies mesaĝojn vi volas vidi! Jen iom da sugestoj.", + "follow_recommendations.lead": "La mesaĝoj de personoj kiujn vi sekvas, aperos laŭ kronologia ordo en via hejma templinio. Ne timu erari, vi povas ĉesi sekvi facile iam ajn!", "follow_request.authorize": "Rajtigi", "follow_request.reject": "Rifuzi", - "follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la teamo de {domain} pensis ke vi eble volas kontroli la demandojn de sekvado de ĉi tiuj kontoj permane.", + "follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la teamo de {domain} pensas, ke vi eble volas permane kontroli la demandojn de sekvado de ĉi tiuj kontoj.", "generic.saved": "Konservita", "getting_started.developers": "Programistoj", "getting_started.directory": "Profilujo", @@ -210,7 +210,7 @@ "getting_started.invite": "Inviti homojn", "getting_started.open_source_notice": "Mastodon estas malfermitkoda programo. Vi povas kontribui aŭ raporti problemojn en GitHub je {github}.", "getting_started.security": "Sekureco", - "getting_started.terms": "Uzkondiĉoj", + "getting_started.terms": "Kondiĉoj de la servo", "hashtag.column_header.tag_mode.all": "kaj {additional}", "hashtag.column_header.tag_mode.any": "aŭ {additional}", "hashtag.column_header.tag_mode.none": "sen {additional}", @@ -223,22 +223,22 @@ "home.column_settings.basic": "Bazaj agordoj", "home.column_settings.show_reblogs": "Montri plusendojn", "home.column_settings.show_replies": "Montri respondojn", - "home.hide_announcements": "Kaŝi anoncojn", + "home.hide_announcements": "Kaŝi la anoncojn", "home.show_announcements": "Montri anoncojn", "intervals.full.days": "{number, plural, one {# tago} other {# tagoj}}", "intervals.full.hours": "{number, plural, one {# horo} other {# horoj}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutoj}}", "keyboard_shortcuts.back": "reveni", - "keyboard_shortcuts.blocked": "malfermi la liston de blokitaj uzantoj", - "keyboard_shortcuts.boost": "Plusendi", + "keyboard_shortcuts.blocked": "Malfermi la liston de blokitaj uzantoj", + "keyboard_shortcuts.boost": "Plusendi la mesaĝon", "keyboard_shortcuts.column": "fokusi mesaĝon en unu el la kolumnoj", "keyboard_shortcuts.compose": "enfokusigi la tekstujon", "keyboard_shortcuts.description": "Priskribo", "keyboard_shortcuts.direct": "malfermi la kolumnon de rektaj mesaĝoj", "keyboard_shortcuts.down": "iri suben en la listo", "keyboard_shortcuts.enter": "malfermi mesaĝon", - "keyboard_shortcuts.favourite": "stelumi", - "keyboard_shortcuts.favourites": "malfermi la liston de stelumoj", + "keyboard_shortcuts.favourite": "Aldoni la mesaĝon al preferaĵoj", + "keyboard_shortcuts.favourites": "Malfermi la liston de preferaĵoj", "keyboard_shortcuts.federated": "Malfermi la frataran templinion", "keyboard_shortcuts.heading": "Klavaraj mallongigoj", "keyboard_shortcuts.home": "Malfermi la hejman templinion", @@ -249,26 +249,26 @@ "keyboard_shortcuts.muted": "malfermi la liston de silentigitaj uzantoj", "keyboard_shortcuts.my_profile": "malfermi vian profilon", "keyboard_shortcuts.notifications": "malfermi la kolumnon de sciigoj", - "keyboard_shortcuts.open_media": "malfermi aŭdovidaĵon", + "keyboard_shortcuts.open_media": "Malfermi la aŭdovidaĵon", "keyboard_shortcuts.pinned": "malfermi la liston de alpinglitaj mesaĝoj", "keyboard_shortcuts.profile": "malfermi la profilon de la aŭtoro", "keyboard_shortcuts.reply": "respondi", - "keyboard_shortcuts.requests": "malfermi la liston de petoj de sekvado", + "keyboard_shortcuts.requests": "Malfermi la liston de demandoj de sekvado", "keyboard_shortcuts.search": "enfokusigi la serĉilon", - "keyboard_shortcuts.spoilers": "montri/kaŝi la kampon de enhava averto", + "keyboard_shortcuts.spoilers": "Montri/kaŝi la kampon de averto de enhavo (\"CW\")", "keyboard_shortcuts.start": "malfermi la kolumnon «por komenci»", - "keyboard_shortcuts.toggle_hidden": "montri/kaŝi tekston malantaŭ enhava averto", - "keyboard_shortcuts.toggle_sensitivity": "montri/kaŝi aŭdovidaĵojn", + "keyboard_shortcuts.toggle_hidden": "Montri/kaŝi tekston malantaŭ la averto de enhavo (\"CW\")", + "keyboard_shortcuts.toggle_sensitivity": "Montri/kaŝi la aŭdovidaĵojn", "keyboard_shortcuts.toot": "Krei novan mesaĝon", "keyboard_shortcuts.unfocus": "malenfokusigi la tekstujon aŭ la serĉilon", "keyboard_shortcuts.up": "iri supren en la listo", "lightbox.close": "Fermi", "lightbox.compress": "Kunpremi bildan vidkeston", "lightbox.expand": "Pligrandigi bildan vidkeston", - "lightbox.next": "Sekva", - "lightbox.previous": "Antaŭa", + "lightbox.next": "Antaŭen", + "lightbox.previous": "Malantaŭen", "limited_account_hint.action": "Montru profilon ĉiukaze", - "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", + "limited_account_hint.title": "La profilo estas kaŝita de la moderigantoj de via servilo.", "lists.account.add": "Aldoni al la listo", "lists.account.remove": "Forigi de la listo", "lists.delete": "Forigi la liston", @@ -279,12 +279,12 @@ "lists.replies_policy.followed": "Iu sekvanta uzanto", "lists.replies_policy.list": "Membroj de la listo", "lists.replies_policy.none": "Neniu", - "lists.replies_policy.title": "Montri respondon al:", + "lists.replies_policy.title": "Montri respondojn al:", "lists.search": "Serĉi inter la homoj, kiujn vi sekvas", "lists.subheading": "Viaj listoj", "load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}", "loading_indicator.label": "Ŝargado…", - "media_gallery.toggle_visible": "Baskuligi videblecon", + "media_gallery.toggle_visible": "{number, plural, one {Kaŝi la bildon} other {Kaŝi la bildojn}}", "missing_indicator.label": "Ne trovita", "missing_indicator.sublabel": "Ĉi tiu elemento ne estis trovita", "mute_modal.duration": "Daŭro", @@ -300,9 +300,9 @@ "navigation_bar.domain_blocks": "Blokitaj domajnoj", "navigation_bar.edit_profile": "Redakti profilon", "navigation_bar.explore": "Esplori", - "navigation_bar.favourites": "Stelumoj", + "navigation_bar.favourites": "Preferaĵoj", "navigation_bar.filters": "Silentigitaj vortoj", - "navigation_bar.follow_requests": "Petoj de sekvado", + "navigation_bar.follow_requests": "Demandoj de sekvado", "navigation_bar.follows_and_followers": "Sekvatoj kaj sekvantoj", "navigation_bar.info": "Pri ĉi tiu servilo", "navigation_bar.keyboard_shortcuts": "Rapidklavoj", @@ -314,8 +314,9 @@ "navigation_bar.preferences": "Preferoj", "navigation_bar.public_timeline": "Fratara templinio", "navigation_bar.security": "Sekureco", + "notification.admin.report": "{name} raportis {target}", "notification.admin.sign_up": "{name} registris", - "notification.favourite": "{name} stelumis vian mesaĝon", + "notification.favourite": "{name} aldonis vian mesaĝon al siaj preferaĵoj", "notification.follow": "{name} eksekvis vin", "notification.follow_request": "{name} petis sekvi vin", "notification.mention": "{name} menciis vin", @@ -326,14 +327,15 @@ "notification.update": "{name} redaktis afiŝon", "notifications.clear": "Forviŝi sciigojn", "notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?", + "notifications.column_settings.admin.report": "Novaj raportoj:", "notifications.column_settings.admin.sign_up": "Novaj registriĝoj:", - "notifications.column_settings.alert": "Retumilaj sciigoj", - "notifications.column_settings.favourite": "Stelumoj:", + "notifications.column_settings.alert": "Sciigoj de la retumilo", + "notifications.column_settings.favourite": "Preferaĵoj:", "notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn", "notifications.column_settings.filter_bar.category": "Rapida filtra breto", - "notifications.column_settings.filter_bar.show_bar": "Montru filtrilon", + "notifications.column_settings.filter_bar.show_bar": "Montri la breton de filtrilo", "notifications.column_settings.follow": "Novaj sekvantoj:", - "notifications.column_settings.follow_request": "Novaj petoj de sekvado:", + "notifications.column_settings.follow_request": "Novaj demandoj de sekvado:", "notifications.column_settings.mention": "Mencioj:", "notifications.column_settings.poll": "Balotenketaj rezultoj:", "notifications.column_settings.push": "Puŝsciigoj", @@ -346,7 +348,7 @@ "notifications.column_settings.update": "Redaktoj:", "notifications.filter.all": "Ĉiuj", "notifications.filter.boosts": "Plusendoj", - "notifications.filter.favourites": "Stelumoj", + "notifications.filter.favourites": "Preferaĵoj", "notifications.filter.follows": "Sekvoj", "notifications.filter.mentions": "Mencioj", "notifications.filter.polls": "Balotenketaj rezultoj", @@ -372,19 +374,19 @@ "poll_button.remove_poll": "Forigi balotenketon", "privacy.change": "Agordi mesaĝan privatecon", "privacy.direct.long": "Videbla nur al menciitaj uzantoj", - "privacy.direct.short": "Direct", + "privacy.direct.short": "Nur menciitaj personoj", "privacy.private.long": "Videbla nur al viaj sekvantoj", "privacy.private.short": "Nur abonantoj", "privacy.public.long": "Videbla por ĉiuj", "privacy.public.short": "Publika", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "Videbla por ĉiuj, sed ekskluzive de la funkcio de esploro", "privacy.unlisted.short": "Nelistigita", "refresh": "Refreŝigu", "regeneration_indicator.label": "Ŝargado…", - "regeneration_indicator.sublabel": "Via hejma fluo pretiĝas!", + "regeneration_indicator.sublabel": "Via abonfluo estas preparata!", "relative_time.days": "{number}t", - "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", - "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", + "relative_time.full.days": "antaŭ {number, plural, one {# tago} other {# tagoj}}", + "relative_time.full.hours": "antaŭ {number, plural, one {# horo} other {# horoj}}", "relative_time.full.just_now": "ĵus nun", "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", @@ -397,19 +399,19 @@ "report.block": "Bloki", "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", "report.categories.other": "Aliaj", - "report.categories.spam": "Spamo", + "report.categories.spam": "Trudmesaĝo", "report.categories.violation": "Content violates one or more server rules", "report.category.subtitle": "Elektu la plej bonan kongruon", "report.category.title": "Diru al ni kio okazas pri ĉi tiu {type}", "report.category.title_account": "profilo", "report.category.title_status": "afiŝo", "report.close": "Farita", - "report.comment.title": "Is there anything else you think we should know?", + "report.comment.title": "Ĉu estas io alia kion vi pensas ke ni devas scii?", "report.forward": "Plusendi al {target}", - "report.forward_hint": "La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaŭ tien?", + "report.forward_hint": "La konto estas de alia servilo. Ĉu vi volas sendi anoniman kopion de la raporto ankaŭ al tie?", "report.mute": "Silentigi", - "report.mute_explanation": "Vi ne vidos iliajn afiŝojn. Ili ankoraŭ povas sekvi vin kaj vidi viajn afiŝojn, kaj ne scios ke si estas silentigitaj.", - "report.next": "Sekva", + "report.mute_explanation": "Vi ne vidos iliajn afiŝojn. Ili ankoraŭ povas sekvi vin kaj vidi viajn afiŝojn, kaj ne scios ke ili estas silentigitaj.", + "report.next": "Antaŭen", "report.placeholder": "Pliaj komentoj", "report.reasons.dislike": "Mi ne ŝatas ĝin", "report.reasons.dislike_description": "Ĝi ne estas io, kiun vi volas vidi", @@ -417,20 +419,25 @@ "report.reasons.other_description": "La problemo ne taŭgas en aliaj kategorioj", "report.reasons.spam": "Ĝi estas trudaĵo", "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", - "report.reasons.violation": "Ĝi malrespektas servilajn regulojn", + "report.reasons.violation": "Ĝi malobservas la regulojn de la servilo", "report.reasons.violation_description": "You are aware that it breaks specific rules", "report.rules.subtitle": "Elektu ĉiujn, kiuj validas", "report.rules.title": "Kiuj reguloj estas malobservataj?", "report.statuses.subtitle": "Elektu ĉiujn, kiuj validas", "report.statuses.title": "Are there any posts that back up this report?", "report.submit": "Sendi", - "report.target": "Signali {target}", + "report.target": "Raporti pri {target}", "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", "report.thanks.title": "Ĉu vi ne volas vidi ĉi tion?", "report.thanks.title_actionable": "Dankon pro raporti, ni esploros ĉi tion.", "report.unfollow": "Malsekvi @{name}", - "report.unfollow_explanation": "Vi estas sekvanta ĉi tiun konton. Por ne plu vidi ties afiŝojn en via hejma templinio, malsekvu ilin.", + "report.unfollow_explanation": "Vi sekvas ĉi tiun konton. Por ne plu vidi ĝiajn abonfluojn en via hejma templinio, ĉesu sekvi ĝin.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Alia", + "report_notification.categories.spam": "Trudmesaĝo", + "report_notification.categories.violation": "Malobservo de la regulo", + "report_notification.open": "Malfermi la raporton", "search.placeholder": "Serĉi", "search_popout.search_format": "Detala serĉo", "search_popout.tips.full_text": "Simplaj tekstoj montras la mesaĝojn, kiujn vi skribis, stelumis, diskonigis, aŭ en kiuj vi estis menciita, sed ankaŭ kongruajn uzantnomojn, montratajn nomojn, kaj kradvortojn.", @@ -459,8 +466,9 @@ "status.edited": "Redaktita {date}", "status.edited_x_times": "Redactita {count, plural, one {{count} fojon} other {{count} fojojn}}", "status.embed": "Enkorpigi", - "status.favourite": "Stelumi", + "status.favourite": "Aldoni al viaj preferaĵoj", "status.filtered": "Filtrita", + "status.hide": "Kaŝi la mesaĝon", "status.history.created": "{name} kreis {date}", "status.history.edited": "{name} redaktis {date}", "status.load_more": "Ŝargi pli", @@ -469,32 +477,33 @@ "status.more": "Pli", "status.mute": "Silentigi @{name}", "status.mute_conversation": "Silentigi konversacion", - "status.open": "Grandigi ĉi tiun mesaĝon", - "status.pin": "Alpingli profile", + "status.open": "Disvolvi la mesaĝon", + "status.pin": "Alpingli al la profilo", "status.pinned": "Alpinglita mesaĝo", "status.read_more": "Legi pli", "status.reblog": "Plusendi", - "status.reblog_private": "Plusendi kiel la originala videbleco", + "status.reblog_private": "Plusendi kun la originala videbleco", "status.reblogged_by": "{name} plusendis", - "status.reblogs.empty": "Neniu ankoraŭ plusendis la mesaĝon. Kiam iu faros tion, ili aperos ĉi tie.", + "status.reblogs.empty": "Ankoraŭ neniu plusendis la mesaĝon. Kiam iu faras tion, ili aperos ĉi tie.", "status.redraft": "Forigi kaj reskribi", "status.remove_bookmark": "Forigi legosignon", "status.reply": "Respondi", "status.replyAll": "Respondi al la fadeno", - "status.report": "Signali @{name}", + "status.report": "Raporti @{name}", "status.sensitive_warning": "Tikla enhavo", - "status.share": "Diskonigi", - "status.show_less": "Malgrandigi", - "status.show_less_all": "Malgrandigi ĉiujn", - "status.show_more": "Grandigi", - "status.show_more_all": "Malfoldi ĉiun", - "status.show_thread": "Montri la fadenon", + "status.share": "Kundividi", + "status.show_filter_reason": "Ĉial montri", + "status.show_less": "Montri malpli", + "status.show_less_all": "Montri malpli ĉiun", + "status.show_more": "Montri pli", + "status.show_more_all": "Montri pli ĉiun", + "status.show_thread": "Montri la mesaĝaron", "status.uncached_media_warning": "Nedisponebla", "status.unmute_conversation": "Malsilentigi la konversacion", "status.unpin": "Depingli de profilo", "suggestions.dismiss": "Forigi la proponon", "suggestions.header": "Vi povus interesiĝi pri…", - "tabs_bar.federated_timeline": "Fratara templinio", + "tabs_bar.federated_timeline": "Fratara", "tabs_bar.home": "Hejmo", "tabs_bar.local_timeline": "Loka templinio", "tabs_bar.notifications": "Sciigoj", @@ -531,7 +540,7 @@ "upload_modal.choose_image": "Elekti bildon", "upload_modal.description_placeholder": "Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj", "upload_modal.detect_text": "Detekti tekston de la bildo", - "upload_modal.edit_media": "Redakti aŭdovidaĵon", + "upload_modal.edit_media": "Redakti la aŭdovidaĵon", "upload_modal.hint": "Klaku aŭ trenu la cirklon en la antaŭvidilo por elekti la fokuspunkton kiu ĉiam videblos en ĉiuj etigitaj bildoj.", "upload_modal.preparing_ocr": "Preparante OSR…", "upload_modal.preview_label": "Antaŭvido ({ratio})", @@ -539,7 +548,7 @@ "video.close": "Fermi la videon", "video.download": "Elŝuti dosieron", "video.exit_fullscreen": "Eksigi plenekrana", - "video.expand": "Grandigi la videon", + "video.expand": "Pligrandigi la videon", "video.fullscreen": "Igi plenekrana", "video.hide": "Kaŝi la videon", "video.mute": "Silentigi", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 78d81b38f..2c967ccdf 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Configuración", "navigation_bar.public_timeline": "Línea temporal federada", "navigation_bar.security": "Seguridad", + "notification.admin.report": "{name} denunció a {target}", "notification.admin.sign_up": "Se registró {name}", "notification.favourite": "{name} marcó tu mensaje como favorito", "notification.follow": "{name} te empezó a seguir", @@ -326,6 +327,7 @@ "notification.update": "{name} editó un mensaje", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?", + "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Gracias por tu denuncia, vamos a revisarla.", "report.unfollow": "Dejar de seguir a @{name}", "report.unfollow_explanation": "Estás siguiendo a esta cuenta. Para no ver sus mensajes en tu línea temporal principal, dejá de seguirla.", + "report_notification.attached_statuses": "{count, plural, one {{count} mensaje adjunto} other {{count} mensajes adjuntos}}", + "report_notification.categories.other": "Otros", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Violación de regla", + "report_notification.open": "Abrir denuncia", "search.placeholder": "Buscar", "search_popout.search_format": "Formato de búsqueda avanzada", "search_popout.tips.full_text": "Las búsquedas de texto simple devuelven los mensajes que escribiste, los marcados como favoritos, los adheridos o en los que te mencionaron, así como nombres de usuarios, nombres mostrados y etiquetas.", @@ -461,6 +468,7 @@ "status.embed": "Insertar", "status.favourite": "Marcar como favorito", "status.filtered": "Filtrado", + "status.hide": "Ocultar mensaje", "status.history.created": "Creado por {name} el {date}", "status.history.edited": "Editado por {name} el {date}", "status.load_more": "Cargar más", @@ -484,6 +492,7 @@ "status.report": "Denunciar a @{name}", "status.sensitive_warning": "Contenido sensible", "status.share": "Compartir", + "status.show_filter_reason": "Mostrar de todos modos", "status.show_less": "Mostrar menos", "status.show_less_all": "Mostrar menos para todo", "status.show_more": "Mostrar más", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 570a03186..0923a0734 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Historia federada", "navigation_bar.security": "Seguridad", + "notification.admin.report": "{name} informó {target}", "notification.admin.sign_up": "{name} se unio", "notification.favourite": "{name} marcó tu estado como favorito", "notification.follow": "{name} te empezó a seguir", @@ -326,6 +327,7 @@ "notification.update": "{name} editó una publicación", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?", + "notifications.column_settings.admin.report": "Nuevos informes:", "notifications.column_settings.admin.sign_up": "Registros nuevos:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Gracias por informar, estudiaremos esto.", "report.unfollow": "Dejar de seguir @{name}", "report.unfollow_explanation": "Estás siguiendo esta cuenta. Para no ver sus publicaciones en tu sección de noticias, deja de seguirlo.", + "report_notification.attached_statuses": "{count, plural, one {{count} publicación} other {{count} publicaciones}} adjunta(s)", + "report_notification.categories.other": "Otros", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Infracción de regla", + "report_notification.open": "Abrir informe", "search.placeholder": "Buscar", "search_popout.search_format": "Formato de búsqueda avanzada", "search_popout.tips.full_text": "Búsquedas de texto recuperan posts que has escrito, marcado como favoritos, retooteado o en los que has sido mencionado, así como usuarios, nombres y hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Incrustado", "status.favourite": "Favorito", "status.filtered": "Filtrado", + "status.hide": "Hide toot", "status.history.created": "{name} creó {date}", "status.history.edited": "{name} editado {date}", "status.load_more": "Cargar más", @@ -484,6 +492,7 @@ "status.report": "Reportar", "status.sensitive_warning": "Contenido sensible", "status.share": "Compartir", + "status.show_filter_reason": "Show anyway", "status.show_less": "Mostrar menos", "status.show_less_all": "Mostrar menos para todo", "status.show_more": "Mostrar más", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index d9c925c87..98a7d9de4 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Línea de tiempo federada", "navigation_bar.security": "Seguridad", + "notification.admin.report": "{name} informó {target}", "notification.admin.sign_up": "{name} se registró", "notification.favourite": "{name} marcó tu estado como favorito", "notification.follow": "{name} te empezó a seguir", @@ -326,6 +327,7 @@ "notification.update": "{name} editó una publicación", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?", + "notifications.column_settings.admin.report": "Nuevos informes:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.favourite": "Favoritos:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Gracias por informar, estudiaremos esto.", "report.unfollow": "Dejar de seguir a @{name}", "report.unfollow_explanation": "Estás siguiendo esta cuenta. Para no ver sus publicaciones en tu muro de inicio, deja de seguirla.", + "report_notification.attached_statuses": "{count, plural, one {{count} publicación} other {{count} publicaciones}} adjunta(s)", + "report_notification.categories.other": "Otros", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Infracción de regla", + "report_notification.open": "Abrir informe", "search.placeholder": "Buscar", "search_popout.search_format": "Formato de búsqueda avanzada", "search_popout.tips.full_text": "Las búsquedas de texto recuperan publicaciones que has escrito, marcado como favoritas, retooteado o en los que has sido mencionado, así como usuarios, nombres y hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Incrustado", "status.favourite": "Favorito", "status.filtered": "Filtrado", + "status.hide": "Ocultar publicación", "status.history.created": "{name} creó {date}", "status.history.edited": "{name} editó {date}", "status.load_more": "Cargar más", @@ -484,6 +492,7 @@ "status.report": "Reportar", "status.sensitive_warning": "Contenido sensible", "status.share": "Compartir", + "status.show_filter_reason": "Mostrar de todos modos", "status.show_less": "Mostrar menos", "status.show_less_all": "Mostrar menos para todo", "status.show_more": "Mostrar más", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index eb3425f79..2f2d29b8d 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Eelistused", "navigation_bar.public_timeline": "Föderatiivne ajajoon", "navigation_bar.security": "Turvalisus", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} märkis Teie staatuse lemmikuks", "notification.follow": "{name} jälgib nüüd Teid", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Puhasta teated", "notifications.clear_confirmation": "Olete kindel, et soovite püsivalt kõik oma teated eemaldada?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Töölauateated", "notifications.column_settings.favourite": "Lemmikud:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Otsi", "search_popout.search_format": "Täiustatud otsiformaat", "search_popout.tips.full_text": "Lihtne tekst toob esile staatused mida olete kirjutanud, lisanud lemmikuks, upitanud või olete seal mainitud, ning lisaks veel kattuvad kasutajanimed, kuvanimed ja sildid.", @@ -461,6 +468,7 @@ "status.embed": "Sängita", "status.favourite": "Lemmik", "status.filtered": "Filtreeritud", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Lae rohkem", @@ -484,6 +492,7 @@ "status.report": "Raporteeri @{name}", "status.sensitive_warning": "Tundlik sisu", "status.share": "Jaga", + "status.show_filter_reason": "Show anyway", "status.show_less": "Näita vähem", "status.show_less_all": "Näita vähem kõigile", "status.show_more": "Näita veel", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index c8182640a..618b8265f 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Hobespenak", "navigation_bar.public_timeline": "Federatutako denbora-lerroa", "navigation_bar.security": "Segurtasuna", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} erabiltzailea erregistratu da", "notification.favourite": "{name}(e)k zure bidalketa gogoko du", "notification.follow": "{name}(e)k jarraitzen zaitu", @@ -326,6 +327,7 @@ "notification.update": "{name} erabiltzaileak bidalketa bat editatu du", "notifications.clear": "Garbitu jakinarazpenak", "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Izen-emate berriak:", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", "notifications.column_settings.favourite": "Gogokoak:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Mila esker salaketagatik, berrikusiko dugu.", "report.unfollow": "@{name} jarraitzeari utzi", "report.unfollow_explanation": "Kontu hau jarraitzen ari zara. Zure denbora-lerro nagusian bere bidalketak ez ikusteko, jarraitzeari utzi.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Bilatu", "search_popout.search_format": "Bilaketa aurreratuaren formatua", "search_popout.tips.full_text": "Testu hutsarekin zuk idatzitako bidalketak, gogokoak, bultzadak edo aipamenak aurkitu ditzakezu, bat datozen erabiltzaile-izenak, pantaila-izenak, eta traolak.", @@ -461,6 +468,7 @@ "status.embed": "Txertatu", "status.favourite": "Gogokoa", "status.filtered": "Iragazita", + "status.hide": "Hide toot", "status.history.created": "{name} erabiltzaileak sortua {date}", "status.history.edited": "{name} erabiltzaileak editatua {date}", "status.load_more": "Kargatu gehiago", @@ -484,6 +492,7 @@ "status.report": "Salatu @{name}", "status.sensitive_warning": "Kontuz: Eduki hunkigarria", "status.share": "Partekatu", + "status.show_filter_reason": "Show anyway", "status.show_less": "Erakutsi gutxiago", "status.show_less_all": "Erakutsi denetarik gutxiago", "status.show_more": "Erakutsi gehiago", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index c76c596eb..99621747e 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "ترجیحات", "navigation_bar.public_timeline": "خط زمانی همگانی", "navigation_bar.security": "امنیت", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} ثبت نام کرد", "notification.favourite": "{name} فرستهتان را پسندید", "notification.follow": "{name} پیگیرتان شد", @@ -326,6 +327,7 @@ "notification.update": "{name} فرستهای را ویرایش کرد", "notifications.clear": "پاکسازی آگاهیها", "notifications.clear_confirmation": "مطمئنید میخواهید همهٔ آگاهیهایتان را برای همیشه پاک کنید؟", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "ثبت نامهای جدید:", "notifications.column_settings.alert": "آگاهیهای میزکار", "notifications.column_settings.favourite": "پسندیدهها:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "ممنون بابت گزارش، ما آن را بررسی خواهیم کرد.", "report.unfollow": "ناپیگیری @{name}", "report.unfollow_explanation": "شما این حساب را پیگرفتهاید، برای اینکه دیگر فرستههایش را در خوراک خانهتان نبینید؛ آن را پینگیرید.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "جستوجو", "search_popout.search_format": "راهنمای جستوجوی پیشرفته", "search_popout.tips.full_text": "جستوجوی متنی ساده فرستههایی که نوشته، پسندیده، تقویتکرده یا در آنها نامبرده شدهاید را به علاوهٔ نامهای کاربری، نامهای نمایشی و برچسبها برمیگرداند.", @@ -461,6 +468,7 @@ "status.embed": "جاسازی", "status.favourite": "پسندیدن", "status.filtered": "پالوده", + "status.hide": "Hide toot", "status.history.created": "توسط {name} در {date} ایجاد شد", "status.history.edited": "توسط {name} در {date} ویرایش شد", "status.load_more": "بار کردن بیشتر", @@ -484,6 +492,7 @@ "status.report": "گزارش @{name}", "status.sensitive_warning": "محتوای حساس", "status.share": "همرسانی", + "status.show_filter_reason": "Show anyway", "status.show_less": "نمایش کمتر", "status.show_less_all": "نمایش کمتر همه", "status.show_more": "نمایش بیشتر", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 014f249ac..c925e6280 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Asetukset", "navigation_bar.public_timeline": "Yleinen aikajana", "navigation_bar.security": "Turvallisuus", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} rekisteröitynyt", "notification.favourite": "{name} tykkäsi viestistäsi", "notification.follow": "{name} seurasi sinua", @@ -326,6 +327,7 @@ "notification.update": "{name} muokkasi viestiä", "notifications.clear": "Tyhjennä ilmoitukset", "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Uudet kirjautumiset:", "notifications.column_settings.alert": "Työpöytäilmoitukset", "notifications.column_settings.favourite": "Tykkäykset:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Kiitos raportista, tutkimme asiaa.", "report.unfollow": "Lopeta seuraaminen @{name}", "report.unfollow_explanation": "Seuraat tätä tiliä. Jotta et enää näkisi heidän kirjoituksiaan, lopeta niiden seuraaminen.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Hae", "search_popout.search_format": "Tarkennettu haku", "search_popout.tips.full_text": "Tekstihaku listaa tilapäivitykset, jotka olet kirjoittanut, lisännyt suosikkeihisi, boostannut tai joissa sinut mainitaan, sekä tekstin sisältävät käyttäjänimet, nimimerkit ja hastagit.", @@ -461,6 +468,7 @@ "status.embed": "Upota", "status.favourite": "Tykkää", "status.filtered": "Suodatettu", + "status.hide": "Hide toot", "status.history.created": "{name} luotu {date}", "status.history.edited": "{name} muokkasi {date}", "status.load_more": "Lataa lisää", @@ -484,6 +492,7 @@ "status.report": "Raportoi @{name}", "status.sensitive_warning": "Arkaluontoista sisältöä", "status.share": "Jaa", + "status.show_filter_reason": "Show anyway", "status.show_less": "Näytä vähemmän", "status.show_less_all": "Näytä vähemmän kaikista", "status.show_more": "Näytä lisää", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index eb3c293ee..eeef39e6f 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Préférences", "navigation_bar.public_timeline": "Fil public global", "navigation_bar.security": "Sécurité", + "notification.admin.report": "{name} a signalé {target}", "notification.admin.sign_up": "{name} s'est inscrit·e", "notification.favourite": "{name} a ajouté le message à ses favoris", "notification.follow": "{name} vous suit", @@ -326,6 +327,7 @@ "notification.update": "{name} a modifié un message", "notifications.clear": "Effacer les notifications", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications ?", + "notifications.column_settings.admin.report": "Nouveaux signalements :", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :", "notifications.column_settings.alert": "Notifications du navigateur", "notifications.column_settings.favourite": "Favoris :", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Merci pour votre signalement, nous allons investiguer.", "report.unfollow": "Ne plus suivre @{name}", "report.unfollow_explanation": "Vous suivez ce compte. Désabonnez-vous pour ne plus en voir les messages sur votre fil principal.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Autre", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Infraction aux règles du serveur", + "report_notification.open": "Ouvrir le signalement", "search.placeholder": "Rechercher", "search_popout.search_format": "Recherche avancée", "search_popout.tips.full_text": "Un texte normal retourne les messages que vous avez écrits, ajoutés à vos favoris, partagés, ou vous mentionnant, ainsi que les identifiants, les noms affichés, et les hashtags des personnes et messages correspondants.", @@ -461,6 +468,7 @@ "status.embed": "Intégrer", "status.favourite": "Ajouter aux favoris", "status.filtered": "Filtré", + "status.hide": "Cacher le pouet", "status.history.created": "créé par {name} {date}", "status.history.edited": "édité par {name} {date}", "status.load_more": "Charger plus", @@ -484,6 +492,7 @@ "status.report": "Signaler @{name}", "status.sensitive_warning": "Contenu sensible", "status.share": "Partager", + "status.show_filter_reason": "Afficher quand même", "status.show_less": "Replier", "status.show_less_all": "Tout replier", "status.show_more": "Déplier", @@ -524,7 +533,7 @@ "upload_form.edit": "Décrire", "upload_form.thumbnail": "Changer la vignette", "upload_form.undo": "Supprimer", - "upload_form.video_description": "Décrire pour les personnes ayant des problèmes d’audition ou de vision", + "upload_form.video_description": "Décrire pour les personnes ayant des problèmes de vue ou d'audition", "upload_modal.analyzing_picture": "Analyse de l’image en cours…", "upload_modal.apply": "Appliquer", "upload_modal.applying": "Application en cours…", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index f8485270a..dd361b995 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Foarkarren", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} hat harren ynskreaun", "notification.favourite": "{name} hat jo berjocht as favoryt markearre", "notification.follow": "{name} folget jo", @@ -326,6 +327,7 @@ "notification.update": "{name} hat in berjocht feroare", "notifications.clear": "Notifikaasjes leegje", "notifications.clear_confirmation": "Wolle jo al jo notifikaasjes werklik foar ivich fuortsmite?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Nije ynskriuwingen:", "notifications.column_settings.alert": "Desktop notifikaasjes", "notifications.column_settings.favourite": "Favoriten:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Ynslute", "status.favourite": "Favorite", "status.filtered": "Filtere", + "status.hide": "Hide toot", "status.history.created": "{name} makke dit {date}", "status.history.edited": "{name} feroare dit {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Jou @{name} oan", "status.sensitive_warning": "Sensitive content", "status.share": "Diele", + "status.show_filter_reason": "Show anyway", "status.show_less": "Minder sjen litte", "status.show_less_all": "Foar alles minder sjen litte", "status.show_more": "Mear sjen litte", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 2d2551845..f036e9b08 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "Roghnaigh {name} do phostáil", "notification.follow": "Lean {name} thú", @@ -326,6 +327,7 @@ "notification.update": "Chuir {name} postáil in eagar", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Roghanna:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Cuardaigh", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Rogha", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "Curtha in eagar ag {name} in {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index bdfc02af7..a0127c578 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Roghainnean", "navigation_bar.public_timeline": "Loidhne-ama cho-naisgte", "navigation_bar.security": "Tèarainteachd", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "Chlàraich {name}", "notification.favourite": "Is annsa le {name} am post agad", "notification.follow": "Tha {name} a’ leantainn ort a-nis", @@ -326,6 +327,7 @@ "notification.update": "Dheasaich {name} post", "notifications.clear": "Falamhaich na brathan", "notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Clàraidhean ùra:", "notifications.column_settings.alert": "Brathan deasga", "notifications.column_settings.favourite": "Na h-annsachdan:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Mòran taing airson a’ ghearain, bheir sinn sùil air.", "report.unfollow": "Na lean air @{name} tuilleadh", "report.unfollow_explanation": "Tha thu a’ leantainn air a’ chunntas seo. Sgur de leantainn orra ach nach fhaic thu na puist aca air inbhir na dachaigh agad.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Lorg", "search_popout.search_format": "Fòrmat adhartach an luirg", "search_popout.tips.full_text": "Bheir teacsa sìmplidh dhut na postaichean a sgrìobh thu, a tha nan annsachdan dhut, a bhrosnaich thu no san deach iomradh a thoirt ort cho math ri ainmean-cleachdaiche, ainmean taisbeanaidh agus tagaichean hais a mhaidsicheas.", @@ -461,6 +468,7 @@ "status.embed": "Leabaich", "status.favourite": "Cuir ris na h-annsachdan", "status.filtered": "Criathraichte", + "status.hide": "Hide toot", "status.history.created": "Chruthaich {name} {date} e", "status.history.edited": "Dheasaich {name} {date} e", "status.load_more": "Luchdaich barrachd dheth", @@ -484,6 +492,7 @@ "status.report": "Dèan gearan mu @{name}", "status.sensitive_warning": "Susbaint fhrionasach", "status.share": "Co-roinn", + "status.show_filter_reason": "Show anyway", "status.show_less": "Seall nas lugha dheth", "status.show_less_all": "Seall nas lugha dhen a h-uile", "status.show_more": "Seall barrachd dheth", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 0a6aac287..c11db8a65 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -8,7 +8,7 @@ "account.blocked": "Bloqueada", "account.browse_more_on_origin_server": "Busca máis no perfil orixinal", "account.cancel_follow_request": "Desbotar solicitude de seguimento", - "account.direct": "Mensaxe directa @{name}", + "account.direct": "Mensaxe directa a @{name}", "account.disable_notifications": "Deixar de notificarme cando @{name} publica", "account.domain_blocked": "Dominio agochado", "account.edit_profile": "Editar perfil", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Cronoloxía federada", "navigation_bar.security": "Seguranza", + "notification.admin.report": "{name} denunciou a {target}", "notification.admin.sign_up": "{name} rexistrouse", "notification.favourite": "{name} marcou a túa publicación como favorita", "notification.follow": "{name} comezou a seguirte", @@ -326,6 +327,7 @@ "notification.update": "{name} editou unha publicación", "notifications.clear": "Limpar notificacións", "notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?", + "notifications.column_settings.admin.report": "Novas denuncias:", "notifications.column_settings.admin.sign_up": "Novas usuarias:", "notifications.column_settings.alert": "Notificacións de escritorio", "notifications.column_settings.favourite": "Favoritos:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Grazas pola denuncia, investigarémola.", "report.unfollow": "Non seguir a @{name}", "report.unfollow_explanation": "Estás a seguir esta conta. Deixar de ver as súas publicacións na túa cronoloxía, non seguila.", + "report_notification.attached_statuses": "Achegou {count, plural, one {{count} publicación} other {{count} publicacións}}", + "report_notification.categories.other": "Outro", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Faltou ás regras", + "report_notification.open": "Abrir a denuncia", "search.placeholder": "Procurar", "search_popout.search_format": "Formato de procura avanzada", "search_popout.tips.full_text": "Texto simple devolve toots que ti escribiches, promoviches, marcaches favoritos, ou foches mencionada, así como nomes de usuaria coincidentes, nomes públicos e cancelos.", @@ -461,6 +468,7 @@ "status.embed": "Incrustar", "status.favourite": "Favorito", "status.filtered": "Filtrado", + "status.hide": "Agochar publicación", "status.history.created": "{name} creouno o {date}", "status.history.edited": "{name} editouno o {date}", "status.load_more": "Cargar máis", @@ -484,6 +492,7 @@ "status.report": "Denunciar @{name}", "status.sensitive_warning": "Contido sensíbel", "status.share": "Compartir", + "status.show_filter_reason": "Mostrar igualmente", "status.show_less": "Amosar menos", "status.show_less_all": "Amosar menos para todos", "status.show_more": "Amosar máis", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index ecbc373c6..5d71113e4 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "העדפות", "navigation_bar.public_timeline": "ציר זמן בין-קהילתי", "navigation_bar.security": "אבטחה", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} נרשמו", "notification.favourite": "חצרוצך חובב על ידי {name}", "notification.follow": "{name} במעקב אחרייך", @@ -321,11 +322,12 @@ "notification.mention": "אוזכרת על ידי {name}", "notification.own_poll": "הסקר שלך הסתיים", "notification.poll": "סקר שהצבעת בו הסתיים", - "notification.reblog": "חצרוצך הודהד על ידי {name}", + "notification.reblog": "הפוסט הזה הודהד על ידי {name}", "notification.status": "{name} הרגע פרסמו", "notification.update": "{name} ערכו פוסט", "notifications.clear": "הסרת התראות", "notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "הרשמות חדשות:", "notifications.column_settings.alert": "התראות לשולחן העבודה", "notifications.column_settings.favourite": "מחובבים:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "תודה על הדיווח, נבדוק את העניין.", "report.unfollow": "הפסיקו לעקוב אחרי @{name}", "report.unfollow_explanation": "אתם עוקבים אחרי החשבון הזה. כדי להפסיק לראות את הפרסומים שלו בפיד הבית שלכם, הפסיקו לעקוב אחריהם.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "חיפוש", "search_popout.search_format": "מבנה חיפוש מתקדם", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "הטמעה", "status.favourite": "חיבוב", "status.filtered": "סונן", + "status.hide": "Hide toot", "status.history.created": "{name} יצר/ה {date}", "status.history.edited": "{name} ערך/ה {date}", "status.load_more": "עוד", @@ -475,7 +483,7 @@ "status.read_more": "לקרוא עוד", "status.reblog": "הדהוד", "status.reblog_private": "להדהד ברמת הנראות המקורית", - "status.reblogged_by": "הודהד על ידי {name}", + "status.reblogged_by": "{name} הידהד/ה:", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", "status.redraft": "מחיקה ועריכה מחדש", "status.remove_bookmark": "הסרת סימניה", @@ -484,6 +492,7 @@ "status.report": "דיווח על @{name}", "status.sensitive_warning": "תוכן רגיש", "status.share": "שיתוף", + "status.show_filter_reason": "Show anyway", "status.show_less": "הראה פחות", "status.show_less_all": "להציג פחות מהכל", "status.show_more": "הראה יותר", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index df0085067..0ff1fc7a1 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "खोजें", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "संवेदनशील विषय वस्तु", "status.share": "शेयर करें", + "status.show_filter_reason": "Show anyway", "status.show_less": "कम दिखाएँ", "status.show_less_all": "Show less for all", "status.show_more": "और दिखाएँ", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 1ed57960e..56678d12a 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Postavke", "navigation_bar.public_timeline": "Federalna vremenska crta", "navigation_bar.security": "Sigurnost", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} je favorizirao/la Vaš toot", "notification.follow": "{name} Vas je počeo/la pratiti", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Očisti obavijesti", "notifications.clear_confirmation": "Želite li zaista trajno očistiti sve Vaše obavijesti?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Obavijesti radne površine", "notifications.column_settings.favourite": "Favoriti:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Traži", "search_popout.search_format": "Format naprednog pretraživanja", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Označi favoritom", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Učitaj više", @@ -484,6 +492,7 @@ "status.report": "Prijavi @{name}", "status.sensitive_warning": "Osjetljiv sadržaj", "status.share": "Podijeli", + "status.show_filter_reason": "Show anyway", "status.show_less": "Pokaži manje", "status.show_less_all": "Show less for all", "status.show_more": "Pokaži više", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 403e9edfe..4b768de8f 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Beállítások", "navigation_bar.public_timeline": "Föderációs idővonal", "navigation_bar.security": "Biztonság", + "notification.admin.report": "{name} jelentette: {target}", "notification.admin.sign_up": "{name} regisztrált", "notification.favourite": "{name} kedvencnek jelölte a bejegyzésedet", "notification.follow": "{name} követ téged", @@ -326,6 +327,7 @@ "notification.update": "{name} szerkesztett egy bejegyzést", "notifications.clear": "Értesítések törlése", "notifications.clear_confirmation": "Biztos, hogy véglegesen törölni akarod az összes értesítésed?", + "notifications.column_settings.admin.report": "Új jelentések:", "notifications.column_settings.admin.sign_up": "Új regisztrálók:", "notifications.column_settings.alert": "Asztali értesítések", "notifications.column_settings.favourite": "Kedvencek:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Köszönjük, hogy jelentetted, megnézzük.", "report.unfollow": "@{name} követésének leállítása", "report.unfollow_explanation": "Követed ezt a fiókot. Hogy ne lásd a bejegyzéseit a saját idővonaladon, szüntesd meg a követését.", + "report_notification.attached_statuses": "{count} bejegyzés mellékelve", + "report_notification.categories.other": "Egyéb", + "report_notification.categories.spam": "Kéretlen üzenet", + "report_notification.categories.violation": "Szabálysértés", + "report_notification.open": "Bejelentés megnyitása", "search.placeholder": "Keresés", "search_popout.search_format": "Speciális keresés", "search_popout.tips.full_text": "Egyszerű szöveg, mely általad írt, kedvencnek jelölt vagy megtolt bejegyzéseket, rólad szóló megemlítéseket, felhasználói neveket, megjelenített neveket, hashtageket ad majd vissza.", @@ -461,6 +468,7 @@ "status.embed": "Beágyazás", "status.favourite": "Kedvenc", "status.filtered": "Megszűrt", + "status.hide": "Bejegyzés elrejtése", "status.history.created": "{name} létrehozta: {date}", "status.history.edited": "{name} szerkesztette: {date}", "status.load_more": "Többet", @@ -484,6 +492,7 @@ "status.report": "@{name} bejelentése", "status.sensitive_warning": "Kényes tartalom", "status.share": "Megosztás", + "status.show_filter_reason": "Megjelenítés mindenképp", "status.show_less": "Kevesebb megjelenítése", "status.show_less_all": "Kevesebbet mindenhol", "status.show_more": "Többet", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 7d80b18d8..866a6a2cf 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Նախապատուութիւններ", "navigation_bar.public_timeline": "Դաշնային հոսք", "navigation_bar.security": "Անվտանգութիւն", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name}-ը գրանցուած է", "notification.favourite": "{name} հաւանեց գրառումդ", "notification.follow": "{name} սկսեց հետեւել քեզ", @@ -326,6 +327,7 @@ "notification.update": "{name}-ը փոխել է գրառումը", "notifications.clear": "Մաքրել ծանուցումները", "notifications.clear_confirmation": "Վստա՞հ ես, որ ուզում ես մշտապէս մաքրել քո բոլոր ծանուցումները։", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Նոր գրանցումներ՝", "notifications.column_settings.alert": "Աշխատատիրոյթի ծանուցումներ", "notifications.column_settings.favourite": "Հաւանածներից՝", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Փնտրել", "search_popout.search_format": "Փնտրելու առաջադէմ ձեւ", "search_popout.tips.full_text": "Պարզ տեքստը վերադարձնում է գրառումներդ, հաւանածներդ, տարածածներդ, որտեղ ես նշուած եղել, ինչպէս նաեւ նման օգտանուններ, անուններ եւ պիտակներ։", @@ -461,6 +468,7 @@ "status.embed": "Ներդնել", "status.favourite": "Հաւանել", "status.filtered": "Զտուած", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Բեռնել աւելին", @@ -484,6 +492,7 @@ "status.report": "Բողոքել @{name}֊ից", "status.sensitive_warning": "Կասկածելի բովանդակութիւն", "status.share": "Կիսուել", + "status.show_filter_reason": "Show anyway", "status.show_less": "Պակաս", "status.show_less_all": "Թաքցնել բոլոր նախազգուշացնումները", "status.show_more": "Աւելին", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 10f80ee61..04fe5213b 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Pengaturan", "navigation_bar.public_timeline": "Linimasa gabungan", "navigation_bar.security": "Keamanan", + "notification.admin.report": "{name} melaporkan {target}", "notification.admin.sign_up": "{name} mendaftar", "notification.favourite": "{name} menyukai status anda", "notification.follow": "{name} mengikuti anda", @@ -326,6 +327,7 @@ "notification.update": "{name} mengedit kiriman", "notifications.clear": "Hapus notifikasi", "notifications.clear_confirmation": "Apa anda yakin hendak menghapus semua notifikasi anda?", + "notifications.column_settings.admin.report": "Laporan baru:", "notifications.column_settings.admin.sign_up": "Pendaftaran baru:", "notifications.column_settings.alert": "Notifikasi desktop", "notifications.column_settings.favourite": "Favorit:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Terima kasih atas pelaporan Anda, kami akan memeriksa ini lebih lanjut.", "report.unfollow": "Berhenti mengikuti @{name}", "report.unfollow_explanation": "Anda mengikuti akun ini. Untuk tidak melihat postingan mereka di Beranda Anda, berhenti mengikuti mereka.", + "report_notification.attached_statuses": "{count, plural, other {{count} postingan}} terlampir", + "report_notification.categories.other": "Lainnya", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Pelanggaran peraturan", + "report_notification.open": "Buka laporan", "search.placeholder": "Pencarian", "search_popout.search_format": "Format pencarian mahir", "search_popout.tips.full_text": "Teks simpel menampilkan status yang Anda tulis, favoritkan, boost-kan, atau status yang menyebut Anda, serta nama pengguna, nama yang ditampilkan, dan tagar yang cocok.", @@ -461,6 +468,7 @@ "status.embed": "Tanam", "status.favourite": "Difavoritkan", "status.filtered": "Disaring", + "status.hide": "Hide toot", "status.history.created": "{name} membuat pada {date}", "status.history.edited": "{name} mengedit pada {date}", "status.load_more": "Tampilkan semua", @@ -484,6 +492,7 @@ "status.report": "Laporkan @{name}", "status.sensitive_warning": "Konten sensitif", "status.share": "Bagikan", + "status.show_filter_reason": "Show anyway", "status.show_less": "Tampilkan lebih sedikit", "status.show_less_all": "Tampilkan lebih sedikit", "status.show_more": "Tampilkan semua", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 3eea9dcca..d06045cf8 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferi", "navigation_bar.public_timeline": "Federata tempolineo", "navigation_bar.security": "Sekureso", + "notification.admin.report": "{name} raportizis {target}", "notification.admin.sign_up": "{name} registresis", "notification.favourite": "{name} favorizis tua mesajo", "notification.follow": "{name} sequeskis tu", @@ -326,6 +327,7 @@ "notification.update": "{name} modifikis posto", "notifications.clear": "Efacar savigi", "notifications.clear_confirmation": "Ka tu esas certa, ke tu volas efacar omna tua savigi?", + "notifications.column_settings.admin.report": "Nova raporti:", "notifications.column_settings.admin.sign_up": "Nova registranti:", "notifications.column_settings.alert": "Desktopavizi", "notifications.column_settings.favourite": "Favorati:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Danko por raportizar, ni kontrolos co.", "report.unfollow": "Desequez @{name}", "report.unfollow_explanation": "Vu sequas ca konto. Por ne vidar olia posti en vua hemniuzeto pluse, desequez oli.", + "report_notification.attached_statuses": "{count, plural,one {{count} posti} other {{count} posti}} adjuntesas", + "report_notification.categories.other": "Altra", + "report_notification.categories.spam": "Spamo", + "report_notification.categories.violation": "Regulnesequo", + "report_notification.open": "Apertez raporto", "search.placeholder": "Serchez", "search_popout.search_format": "Avancata trovformato", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Eninsertez", "status.favourite": "Favorizar", "status.filtered": "Filtrita", + "status.hide": "Celez posto", "status.history.created": "{name} kreis ye {date}", "status.history.edited": "{name} modifikis ye {date}", "status.load_more": "Kargar pluse", @@ -484,6 +492,7 @@ "status.report": "Denuncar @{name}", "status.sensitive_warning": "Trubliva kontenajo", "status.share": "Partigez", + "status.show_filter_reason": "Jus montrez", "status.show_less": "Montrar mine", "status.show_less_all": "Montrez min por omno", "status.show_more": "Montrar plue", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 2cdf3c2c0..a2714aa4f 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Kjörstillingar", "navigation_bar.public_timeline": "Sameiginleg tímalína", "navigation_bar.security": "Öryggi", + "notification.admin.report": "{name} kærði {target}", "notification.admin.sign_up": "{name} skráði sig", "notification.favourite": "{name} setti færslu þína í eftirlæti", "notification.follow": "{name} fylgist með þér", @@ -326,6 +327,7 @@ "notification.update": "{name} breytti færslu", "notifications.clear": "Hreinsa tilkynningar", "notifications.clear_confirmation": "Ertu viss um að þú viljir endanlega eyða öllum tilkynningunum þínum?", + "notifications.column_settings.admin.report": "Nýjar kærur:", "notifications.column_settings.admin.sign_up": "Nýjar skráningar:", "notifications.column_settings.alert": "Tilkynningar á skjáborði", "notifications.column_settings.favourite": "Eftirlæti:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Takk fyrir tilkynninguna, við munum skoða málið.", "report.unfollow": "Hætta að fylgjast með @{name}", "report.unfollow_explanation": "Þú ert að fylgjast með þessum aðgangi. Til að hætta að sjá viðkomandi færslur á streyminu þínu, skaltu hætta að fylgjast með viðkomandi.", + "report_notification.attached_statuses": "{count, plural, one {{count} færsla} other {{count} færslur}} viðhengdar", + "report_notification.categories.other": "Annað", + "report_notification.categories.spam": "Ruslpóstur", + "report_notification.categories.violation": "Brot á reglum", + "report_notification.open": "Opin kæra", "search.placeholder": "Leita", "search_popout.search_format": "Snið ítarlegrar leitar", "search_popout.tips.full_text": "Einfaldur texti skilar færslum sem þú hefur skrifað, sett í eftirlæti, endurbirt eða verið minnst á þig í, ásamt samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum.", @@ -461,6 +468,7 @@ "status.embed": "Ívefja", "status.favourite": "Eftirlæti", "status.filtered": "Síað", + "status.hide": "Fela færslu", "status.history.created": "{name} útbjó {date}", "status.history.edited": "{name} breytti {date}", "status.load_more": "Hlaða inn meiru", @@ -484,6 +492,7 @@ "status.report": "Kæra @{name}", "status.sensitive_warning": "Viðkvæmt efni", "status.share": "Deila", + "status.show_filter_reason": "Birta samt", "status.show_less": "Sýna minna", "status.show_less_all": "Sýna minna fyrir allt", "status.show_more": "Sýna meira", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index d28316242..ab8b10e8d 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Impostazioni", "navigation_bar.public_timeline": "Timeline federata", "navigation_bar.security": "Sicurezza", + "notification.admin.report": "{name} ha segnalato {target}", "notification.admin.sign_up": "{name} si è iscritto", "notification.favourite": "{name} ha apprezzato il tuo post", "notification.follow": "{name} ha iniziato a seguirti", @@ -326,6 +327,7 @@ "notification.update": "{name} ha modificato un post", "notifications.clear": "Cancella notifiche", "notifications.clear_confirmation": "Vuoi davvero cancellare tutte le notifiche?", + "notifications.column_settings.admin.report": "Nuove segnalazioni:", "notifications.column_settings.admin.sign_up": "Nuove iscrizioni:", "notifications.column_settings.alert": "Notifiche desktop", "notifications.column_settings.favourite": "Apprezzati:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Grazie per la segnalazione, controlleremo il problema.", "report.unfollow": "Non seguire più @{name}", "report.unfollow_explanation": "Stai seguendo questo account. Per non vedere più i suoi post nel tuo feed home, smetti di seguirlo.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} post}} allegati", + "report_notification.categories.other": "Altro", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Violazione delle regole", + "report_notification.open": "Apri segnalazione", "search.placeholder": "Cerca", "search_popout.search_format": "Formato di ricerca avanzato", "search_popout.tips.full_text": "Testo semplice per trovare gli status che hai scritto, segnato come apprezzati, condiviso o in cui sei stato citato, e inoltre i nomi utente, nomi visualizzati e hashtag che lo contengono.", @@ -461,6 +468,7 @@ "status.embed": "Incorpora", "status.favourite": "Apprezzato", "status.filtered": "Filtrato", + "status.hide": "Nascondi toot", "status.history.created": "{name} ha creato {date}", "status.history.edited": "{name} ha modificato {date}", "status.load_more": "Mostra di più", @@ -484,6 +492,7 @@ "status.report": "Segnala @{name}", "status.sensitive_warning": "Materiale sensibile", "status.share": "Condividi", + "status.show_filter_reason": "Mostra comunque", "status.show_less": "Mostra meno", "status.show_less_all": "Mostra meno per tutti", "status.show_more": "Mostra di più", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index fdb0a3b36..0cfa295de 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -319,6 +319,7 @@ "navigation_bar.public_timeline": "連合タイムライン", "navigation_bar.misc": "その他", "navigation_bar.security": "セキュリティ", + "notification.admin.report": "{name}さんが{target}さんを通報しました", "notification.admin.sign_up": "{name}さんがサインアップしました", "notification.favourite": "{name}さんがあなたの投稿をお気に入りに登録しました", "notification.follow": "{name}さんにフォローされました", @@ -331,6 +332,7 @@ "notification.update": "{name}さんが投稿を編集しました", "notifications.clear": "通知を消去", "notifications.clear_confirmation": "本当に通知を消去しますか?", + "notifications.column_settings.admin.report": "新しい通報:", "notifications.column_settings.admin.sign_up": "新規登録:", "notifications.column_settings.alert": "デスクトップ通知", "notifications.column_settings.favourite": "お気に入り:", @@ -436,6 +438,11 @@ "report.thanks.title_actionable": "ご報告ありがとうございます、追って確認します。", "report.unfollow": "@{name}さんのフォローを解除", "report.unfollow_explanation": "このアカウントをフォローしています。ホームフィードに彼らの投稿を表示しないようにするには、彼らのフォローを外してください。", + "report_notification.attached_statuses": "{count, plural, one {{count} 件の投稿} other {{count} 件の投稿}}が添付されました。", + "report_notification.categories.other": "その他", + "report_notification.categories.spam": "スパム", + "report_notification.categories.violation": "ルール違反", + "report_notification.open": "通報を開く", "search.placeholder": "検索", "search_popout.search_format": "高度な検索フォーマット", "search_popout.tips.full_text": "表示名やユーザー名、ハッシュタグのほか、あなたの投稿やお気に入り、ブーストした投稿、返信に一致する単純なテキスト。", @@ -466,6 +473,7 @@ "status.embed": "埋め込み", "status.favourite": "お気に入り", "status.filtered": "フィルターされました", + "status.hide": "トゥートを非表示", "status.history.created": "{name}さんが{date}に作成", "status.history.edited": "{name}さんが{date}に編集", "status.load_more": "もっと見る", @@ -489,6 +497,7 @@ "status.report": "@{name}さんを通報", "status.sensitive_warning": "閲覧注意", "status.share": "共有", + "status.show_filter_reason": "表示する", "status.show_less": "隠す", "status.show_less_all": "全て隠す", "status.show_more": "もっと見る", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index d97673fc4..047cdab85 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "პრეფერენსიები", "navigation_bar.public_timeline": "ფედერალური თაიმლაინი", "navigation_bar.security": "უსაფრთხოება", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name}-მა თქვენი სტატუსი აქცია ფავორიტად", "notification.follow": "{name} გამოგყვათ", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "შეტყობინებების გასუფთავება", "notifications.clear_confirmation": "დარწმუნებული ხართ, გსურთ სამუდამოდ წაშალოთ ყველა თქვენი შეტყობინება?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "დესკტოპ შეტყობინებები", "notifications.column_settings.favourite": "ფავორიტები:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "ძებნა", "search_popout.search_format": "დეტალური ძებნის ფორმა", "search_popout.tips.full_text": "მარტივი ტექსტი აბრუნებს სტატუსებს რომლებიც შექმენით, აქციეთ ფავორიტად, დაბუსტეთ, ან რაშიც ასახელეთ, ასევე ემთხვევა მომხმარებლის სახელებს, დისპლეი სახელებს, და ჰეშტეგებს.", @@ -461,6 +468,7 @@ "status.embed": "ჩართვა", "status.favourite": "ფავორიტი", "status.filtered": "ფილტრირებული", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "მეტის ჩატვირთვა", @@ -484,6 +492,7 @@ "status.report": "დაარეპორტე @{name}", "status.sensitive_warning": "მგრძნობიარე კონტენტი", "status.share": "გაზიარება", + "status.show_filter_reason": "Show anyway", "status.show_less": "აჩვენე ნაკლები", "status.show_less_all": "აჩვენე ნაკლები ყველაზე", "status.show_more": "აჩვენე მეტი", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index b19bb8e49..57e6bf0d1 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Imenyafen", "navigation_bar.public_timeline": "Tasuddemt tazayezt tamatut", "navigation_bar.security": "Taɣellist", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} yesmenyef tasuffeɣt-ik·im", "notification.follow": "{name} yeṭṭafaṛ-ik", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Sfeḍ tilɣa", "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Tilɣa n tnarit", "notifications.column_settings.favourite": "Ismenyifen:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Nadi", "search_popout.search_format": "Anadi yenneflin", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Seddu", "status.favourite": "Rnu ɣer yismenyifen", "status.filtered": "Yettwasizdeg", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Sali ugar", @@ -484,6 +492,7 @@ "status.report": "Cetki ɣef @{name}", "status.sensitive_warning": "Agbur amḥulfu", "status.share": "Bḍu", + "status.show_filter_reason": "Show anyway", "status.show_less": "Ssken-d drus", "status.show_less_all": "Semẓi akk tisuffγin", "status.show_more": "Ssken-d ugar", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 1364311ac..c5459baf3 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Басымдықтар", "navigation_bar.public_timeline": "Жаһандық желі", "navigation_bar.security": "Қауіпсіздік", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} жазбаңызды таңдаулыға қосты", "notification.follow": "{name} сізге жазылды", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Ескертпелерді тазарт", "notifications.clear_confirmation": "Шынымен барлық ескертпелерді өшіресіз бе?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Үстел ескертпелері", "notifications.column_settings.favourite": "Таңдаулылар:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Іздеу", "search_popout.search_format": "Кеңейтілген іздеу форматы", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, bоosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embеd", "status.favourite": "Таңдаулы", "status.filtered": "Фильтрленген", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Тағы әкел", @@ -484,6 +492,7 @@ "status.report": "Шағым @{name}", "status.sensitive_warning": "Нәзік контент", "status.share": "Бөлісу", + "status.show_filter_reason": "Show anyway", "status.show_less": "Аздап көрсет", "status.show_less_all": "Бәрін аздап көрсет", "status.show_more": "Толығырақ", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 630431d39..3e0649ba1 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 34fabbacf..c07948a73 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "사용자 설정", "navigation_bar.public_timeline": "연합 타임라인", "navigation_bar.security": "보안", + "notification.admin.report": "{name} 님이 {target}를 신고했습니다", "notification.admin.sign_up": "{name} 님이 가입했습니다", "notification.favourite": "{name} 님이 당신의 게시물을 마음에 들어합니다", "notification.follow": "{name} 님이 나를 팔로우 했습니다", @@ -326,6 +327,7 @@ "notification.update": "{name} 님이 게시물을 수정했습니다", "notifications.clear": "알림 지우기", "notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?", + "notifications.column_settings.admin.report": "새 신고:", "notifications.column_settings.admin.sign_up": "새로운 가입:", "notifications.column_settings.alert": "데스크탑 알림", "notifications.column_settings.favourite": "좋아요:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "신고해주셔서 감사합니다, 중재자분들이 확인할 예정입니다.", "report.unfollow": "@{name}을 팔로우 해제", "report.unfollow_explanation": "당신을 이 계정을 팔로우 하고 있습니다. 홈 피드에서 게시물을 보지 않으려면, 팔로우를 해제하세요.", + "report_notification.attached_statuses": "{count}개의 게시물 첨부됨", + "report_notification.categories.other": "기타", + "report_notification.categories.spam": "스팸", + "report_notification.categories.violation": "규칙 위반", + "report_notification.open": "신고 열기", "search.placeholder": "검색", "search_popout.search_format": "고급 검색 방법", "search_popout.tips.full_text": "단순한 텍스트 검색은 당신이 작성했거나, 관심글로 지정했거나, 부스트했거나, 멘션을 받은 게시글, 그리고 사용자명, 표시되는 이름, 해시태그를 반환합니다.", @@ -461,6 +468,7 @@ "status.embed": "공유하기", "status.favourite": "좋아요", "status.filtered": "필터로 걸러짐", + "status.hide": "툿 숨기기", "status.history.created": "{name} 님이 {date}에 생성함", "status.history.edited": "{name} 님이 {date}에 수정함", "status.load_more": "더 보기", @@ -484,6 +492,7 @@ "status.report": "신고", "status.sensitive_warning": "민감한 미디어", "status.share": "공유", + "status.show_filter_reason": "그냥 표시하기", "status.show_less": "숨기기", "status.show_less_all": "모두 접기", "status.show_more": "더 보기", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index a38f18fa3..2bc1e9bea 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Sazkarî", "navigation_bar.public_timeline": "Demnameyê federalîkirî", "navigation_bar.security": "Ewlehî", + "notification.admin.report": "{name} hate ragihandin {target}", "notification.admin.sign_up": "{name} tomar bû", "notification.favourite": "{name} şandiya te hez kir", "notification.follow": "{name} te şopand", @@ -326,6 +327,7 @@ "notification.update": "{name} şandiyek serrast kir", "notifications.clear": "Agahdariyan pak bike", "notifications.clear_confirmation": "Bi rastî tu dixwazî bi awayekî dawî hemû agahdariyên xwe pak bikî?", + "notifications.column_settings.admin.report": "Ragihandinên nû:", "notifications.column_settings.admin.sign_up": "Tomarkirinên nû:", "notifications.column_settings.alert": "Agahdariyên sermaseyê", "notifications.column_settings.favourite": "Bijarte:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Spas ji bo ragihandina te, em ê binirxînin.", "report.unfollow": "@{name} neşopîne", "report.unfollow_explanation": "Tê vê ajimêrê dişopînî. Ji bo ku êdî şandiyên wan di rojeva xwe de nebînî, wan neşopîne.", + "report_notification.attached_statuses": "{count, plural,one {{count} şandî} other {{count} şandî }} pêvekirî", + "report_notification.categories.other": "Ên din", + "report_notification.categories.spam": "Nexwestî (Spam)", + "report_notification.categories.violation": "Binpêkirina rêzîkê", + "report_notification.open": "Ragihandinê veke", "search.placeholder": "Bigere", "search_popout.search_format": "Dirûva lêgerîna pêşketî", "search_popout.tips.full_text": "Nivîsên hêsan, şandiyên ku te nivîsandiye, bijare kiriye, bilind kiriye an jî yên behsa te kirine û her wiha navê bikarhêneran, navên xûya dike û hashtagan vedigerîne.", @@ -461,6 +468,7 @@ "status.embed": "Hedimandî", "status.favourite": "Bijarte", "status.filtered": "Parzûnkirî", + "status.hide": "Şandiyê veşêre", "status.history.created": "{name} {date} afirand", "status.history.edited": "{name} {date} serrast kir", "status.load_more": "Bêtir bar bike", @@ -484,6 +492,7 @@ "status.report": "{name} gilî bike", "status.sensitive_warning": "Naveroka hestiyarî", "status.share": "Parve bike", + "status.show_filter_reason": "Bi her awayî nîşan bide", "status.show_less": "Kêmtir nîşan bide", "status.show_less_all": "Ji bo hemîyan kêmtir nîşan bide", "status.show_more": "Hêj zehftir nîşan bide", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index 6a8c9933a..8ffa521b5 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Erviransow", "navigation_bar.public_timeline": "Amserlin geffrysys", "navigation_bar.security": "Diogeledh", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} a wrug merkya agas post vel drudh", "notification.follow": "{name} a wrug agas holya", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Dilea gwarnyansow", "notifications.clear_confirmation": "Owgh hwi sur a vynnes dilea agas gwarnyansow oll yn fast?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Gwarnyansow pennskrin", "notifications.column_settings.favourite": "Re drudh:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Hwilas", "search_popout.search_format": "Furvas hwilas avonsys", "search_popout.tips.full_text": "Tekst sempel a wra daskor postow a wrussowgh aga skrifa, merkya vel drudh, po bos menegys ynna, keffrys ha henwyn devnydhyoryon ha displetyans, ha bòlnosow a dhesedh.", @@ -461,6 +468,7 @@ "status.embed": "Staga", "status.favourite": "Merkya vel drudh", "status.filtered": "Sidhlys", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Karga moy", @@ -484,6 +492,7 @@ "status.report": "Reportya @{name}", "status.sensitive_warning": "Dalgh tender", "status.share": "Kevrenna", + "status.show_filter_reason": "Show anyway", "status.show_less": "Diskwedhes le", "status.show_less_all": "Diskwedhes le rag puptra", "status.show_more": "Diskwedhes moy", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index afff3a79c..1a69e7e1d 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index b889948cf..a91fa9aea 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Iestatījumi", "navigation_bar.public_timeline": "Apvienotā ziņu lenta", "navigation_bar.security": "Drošība", + "notification.admin.report": "{name} ziņoja par {target}", "notification.admin.sign_up": "{name} ir pierakstījies", "notification.favourite": "{name} izcēla tavu ziņu", "notification.follow": "{name} uzsāka tev sekot", @@ -326,6 +327,7 @@ "notification.update": "{name} ir rediģējis rakstu", "notifications.clear": "Notīrīt paziņojumus", "notifications.clear_confirmation": "Vai tiešām vēlies neatgriezeniski notīrīt visus savus paziņojumus?", + "notifications.column_settings.admin.report": "Jauni ziņojumi:", "notifications.column_settings.admin.sign_up": "Jaunas pierakstīšanās:", "notifications.column_settings.alert": "Darbvirsmas paziņojumi", "notifications.column_settings.favourite": "Izlases:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Paldies, ka ziņoji, mēs to izskatīsim.", "report.unfollow": "Pārtraukt sekošanu @{name}", "report.unfollow_explanation": "Tu seko šim kontam. Lai vairs neredzētu viņu ziņas savā ziņu plūsmā, pārtrauc viņiem sekot.", + "report_notification.attached_statuses": "Pievienoti {count, plural,one {{count} sūtījums} other {{count} sūtījumi}}", + "report_notification.categories.other": "Cita", + "report_notification.categories.spam": "Spams", + "report_notification.categories.violation": "Noteikumu pārkāpums", + "report_notification.open": "Atvērt ziņojumu", "search.placeholder": "Meklēšana", "search_popout.search_format": "Paplašināts meklēšanas formāts", "search_popout.tips.full_text": "Vienkāršs teksts atgriež ziņas, kuras esi rakstījis, iecienījis, paaugstinājis vai pieminējis, kā arī atbilstošie lietotājvārdi, parādāmie vārdi un tēmturi.", @@ -461,6 +468,7 @@ "status.embed": "Iestrādāt", "status.favourite": "Iecienītā", "status.filtered": "Filtrēts", + "status.hide": "Slēpt", "status.history.created": "{name} izveidots {date}", "status.history.edited": "{name} rediģēts {date}", "status.load_more": "Ielādēt vairāk", @@ -484,6 +492,7 @@ "status.report": "Ziņot par @{name}", "status.sensitive_warning": "Sensitīvs saturs", "status.share": "Kopīgot", + "status.show_filter_reason": "Tomēr rādīt", "status.show_less": "Rādīt mazāk", "status.show_less_all": "Rādīt mazāk visiem", "status.show_more": "Rādīt vairāk", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index 1b868de07..36126fc25 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Федеративен времеплов", "navigation_bar.security": "Безбедност", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Барај", "search_popout.search_format": "Напреден формат за барање", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 674f74dd6..4307259c0 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "ക്രമീകരണങ്ങൾ", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "സുരക്ഷ", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} നിങ്ങളെ പിന്തുടർന്നു", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "അറിയിപ്പ് മായ്ക്കുക", "notifications.clear_confirmation": "നിങ്ങളുടെ എല്ലാ അറിയിപ്പുകളും ശാശ്വതമായി മായ്ക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ", "notifications.column_settings.favourite": "പ്രിയപ്പെട്ടവ:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "തിരയുക", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "ഉൾച്ചേർക്കുക", "status.favourite": "പ്രിയപ്പെട്ടത്", "status.filtered": "ഫിൽട്ടർ ചെയ്തു", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "കൂടുതൽ ലോഡു ചെയ്യുക", @@ -484,6 +492,7 @@ "status.report": "@{name}--നെ റിപ്പോർട്ട് ചെയ്യുക", "status.sensitive_warning": "Sensitive content", "status.share": "പങ്കിടുക", + "status.show_filter_reason": "Show anyway", "status.show_less": "കുറച്ച് കാണിക്കുക", "status.show_less_all": "Show less for all", "status.show_more": "കൂടുതകൽ കാണിക്കുക", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index d9dafa222..d78e0384e 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index c3ca25965..c1f20ec4f 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Keutamaan", "navigation_bar.public_timeline": "Garis masa bersekutu", "navigation_bar.security": "Keselamatan", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} menggemari hantaran anda", "notification.follow": "{name} mengikuti anda", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Buang pemberitahuan", "notifications.clear_confirmation": "Adakah anda pasti anda ingin membuang semua pemberitahuan anda secara kekal?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Pemberitahuan atas meja", "notifications.column_settings.favourite": "Kegemaran:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Cari", "search_popout.search_format": "Format gelintar lanjutan", "search_popout.tips.full_text": "Teks ringkas mengembalikan hantaran yang anda telah tulis, menggemari, menggalak, atau telah disebutkan, dan juga nama pengguna, nama paparan, dan tanda pagar yang dipadankan.", @@ -461,6 +468,7 @@ "status.embed": "Benaman", "status.favourite": "Kegemaran", "status.filtered": "Ditapis", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Muatkan lagi", @@ -484,6 +492,7 @@ "status.report": "Laporkan @{name}", "status.sensitive_warning": "Kandungan sensitif", "status.share": "Kongsi", + "status.show_filter_reason": "Show anyway", "status.show_less": "Tunjukkan kurang", "status.show_less_all": "Tunjukkan kurang untuk semua", "status.show_more": "Tunjukkan lebih", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 058c167bb..99fcd1e73 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -23,7 +23,7 @@ "account.follows.empty": "Deze gebruiker volgt nog niemand.", "account.follows_you": "Volgt jou", "account.hide_reblogs": "Boosts van @{name} verbergen", - "account.joined": "Geregistreerd in {date}", + "account.joined": "Geregistreerd op {date}", "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie diegene kan volgen.", "account.media": "Media", @@ -200,7 +200,7 @@ "follow_recommendations.heading": "Volg mensen waarvan je graag berichten wil zien! Hier zijn enkele aanbevelingen.", "follow_recommendations.lead": "Berichten van mensen die je volgt zullen in chronologische volgorde onder start verschijnen. Wees niet bang om hierin fouten te maken, want je kunt mensen op elk moment net zo eenvoudig ontvolgen!", "follow_request.authorize": "Goedkeuren", - "follow_request.reject": "Afkeuren", + "follow_request.reject": "Afwijzen", "follow_requests.unlocked_explanation": "Ook al is jouw account niet besloten, de medewerkers van {domain} denken dat jij misschien de volgende volgverzoeken handmatig wil controleren.", "generic.saved": "Opgeslagen", "getting_started.developers": "Ontwikkelaars", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Instellingen", "navigation_bar.public_timeline": "Globale tijdlijn", "navigation_bar.security": "Beveiliging", + "notification.admin.report": "{name} heeft {target} geapporteerd", "notification.admin.sign_up": "{name} heeft zich aangemeld", "notification.favourite": "{name} voegde jouw bericht als favoriet toe", "notification.follow": "{name} volgt jou nu", @@ -326,6 +327,7 @@ "notification.update": "{name} heeft een bericht bewerkt", "notifications.clear": "Meldingen verwijderen", "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?", + "notifications.column_settings.admin.report": "Nieuwe rapportages:", "notifications.column_settings.admin.sign_up": "Nieuwe aanmeldingen:", "notifications.column_settings.alert": "Desktopmeldingen", "notifications.column_settings.favourite": "Favorieten:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Dank je voor het rapporteren. Wij gaan er naar kijken.", "report.unfollow": "@{name} ontvolgen", "report.unfollow_explanation": "Je volgt dit account. Om diens berichten niet meer op jouw starttijdlijn te zien, kun je diegene ontvolgen.", + "report_notification.attached_statuses": "{count, plural, one {{count} bericht} other {{count} berichten}} toegevoegd", + "report_notification.categories.other": "Overig", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Overtreden regel(s)", + "report_notification.open": "Rapportage openen", "search.placeholder": "Zoeken", "search_popout.search_format": "Geavanceerd zoeken", "search_popout.tips.full_text": "Gebruik gewone tekst om te zoeken in jouw berichten, gebooste berichten, favorieten en in berichten waarin je bent vermeldt, en tevens naar gebruikersnamen, weergavenamen en hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Insluiten", "status.favourite": "Favoriet", "status.filtered": "Gefilterd", + "status.hide": "Bericht verbergen", "status.history.created": "{name} plaatste dit {date}", "status.history.edited": "{name} bewerkte dit {date}", "status.load_more": "Meer laden", @@ -484,6 +492,7 @@ "status.report": "@{name} rapporteren", "status.sensitive_warning": "Gevoelige inhoud", "status.share": "Delen", + "status.show_filter_reason": "Alsnog tonen", "status.show_less": "Minder tonen", "status.show_less_all": "Alles minder tonen", "status.show_more": "Meer tonen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index cd802bed0..87d3579e9 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Innstillingar", "navigation_bar.public_timeline": "Føderert tidsline", "navigation_bar.security": "Tryggleik", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} merkte statusen din som favoritt", "notification.follow": "{name} fylgde deg", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Tøm varsel", "notifications.clear_confirmation": "Er du sikker på at du vil fjerna alle varsla dine for alltid?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Skrivebordsvarsel", "notifications.column_settings.favourite": "Favorittar:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Søk", "search_popout.search_format": "Avansert søkeformat", "search_popout.tips.full_text": "Enkel tekst returnerer statusar du har skrive, likt, framheva eller vorte nemnd i, i tillegg til samsvarande brukarnamn, visningsnamn og emneknaggar.", @@ -461,6 +468,7 @@ "status.embed": "Bygg inn", "status.favourite": "Favoritt", "status.filtered": "Filtrert", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Last inn meir", @@ -484,6 +492,7 @@ "status.report": "Rapporter @{name}", "status.sensitive_warning": "Sensitivt innhald", "status.share": "Del", + "status.show_filter_reason": "Show anyway", "status.show_less": "Vis mindre", "status.show_less_all": "Vis mindre for alle", "status.show_more": "Vis meir", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index c188a868b..b4da321eb 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Innstillinger", "navigation_bar.public_timeline": "Felles tidslinje", "navigation_bar.security": "Sikkerhet", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} likte din status", "notification.follow": "{name} fulgte deg", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Fjern varsler", "notifications.clear_confirmation": "Er du sikker på at du vil fjerne alle dine varsler permanent?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Skrivebordsvarslinger", "notifications.column_settings.favourite": "Likt:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Søk", "search_popout.search_format": "Avansert søkeformat", "search_popout.tips.full_text": "Enkel tekst gir resultater for statuser du har skrevet, likt, fremhevet, eller har blitt nevnt i, i tillegg til samsvarende brukernavn, visningsnavn og emneknagger.", @@ -461,6 +468,7 @@ "status.embed": "Bygge inn", "status.favourite": "Lik", "status.filtered": "Filtrert", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Last mer", @@ -484,6 +492,7 @@ "status.report": "Rapporter @{name}", "status.sensitive_warning": "Følsomt innhold", "status.share": "Del", + "status.show_filter_reason": "Show anyway", "status.show_less": "Vis mindre", "status.show_less_all": "Vis mindre for alle", "status.show_more": "Vis mer", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 3a57a5c3f..982a3fa16 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferéncias", "navigation_bar.public_timeline": "Flux public global", "navigation_bar.security": "Seguretat", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} se marquèt", "notification.favourite": "{name} a ajustat a sos favorits", "notification.follow": "{name} vos sèc", @@ -326,6 +327,7 @@ "notification.update": "{name} modiquè sa publicacion", "notifications.clear": "Escafar", "notifications.clear_confirmation": "Volètz vertadièrament escafar totas vòstras las notificacions ?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Notificacions localas", "notifications.column_settings.favourite": "Favorits :", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Quitar de sègre {name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Recercar", "search_popout.search_format": "Format recèrca avançada", "search_popout.tips.full_text": "Un tèxte simple que tòrna los estatuts qu’avètz escriches, mes en favorits, partejats, o ont sètz mencionat, e tanben los noms d’utilizaires, escais-noms e etiquetas que correspondonas.", @@ -461,6 +468,7 @@ "status.embed": "Embarcar", "status.favourite": "Apondre als favorits", "status.filtered": "Filtrat", + "status.hide": "Hide toot", "status.history.created": "{name} o creèt lo {date}", "status.history.edited": "{name} o modifiquèt lo {date}", "status.load_more": "Cargar mai", @@ -484,6 +492,7 @@ "status.report": "Senhalar @{name}", "status.sensitive_warning": "Contengut sensible", "status.share": "Partejar", + "status.show_filter_reason": "Show anyway", "status.show_less": "Tornar plegar", "status.show_less_all": "Los tornar plegar totes", "status.show_more": "Desplegar", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 658a3318e..13cb39de8 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index f51948d6a..e31a44586 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -319,6 +319,7 @@ "navigation_bar.preferences": "Preferencje", "navigation_bar.public_timeline": "Globalna oś czasu", "navigation_bar.security": "Bezpieczeństwo", + "notification.admin.report": "{name} zgłosił {target}", "notification.admin.sign_up": "Użytkownik {name} zarejestrował się", "notification.favourite": "{name} dodał(a) Twój wpis do ulubionych", "notification.follow": "{name} zaczął(-ęła) Cię śledzić", @@ -331,6 +332,7 @@ "notification.update": "{name} edytował post", "notifications.clear": "Wyczyść powiadomienia", "notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?", + "notifications.column_settings.admin.report": "Nowe raporty:", "notifications.column_settings.admin.sign_up": "Nowe rejestracje:", "notifications.column_settings.alert": "Powiadomienia na pulpicie", "notifications.column_settings.favourite": "Dodanie do ulubionych:", @@ -436,6 +438,11 @@ "report.thanks.title_actionable": "Dziękujemy za zgłoszenie. Przyjrzymy się tej sprawie.", "report.unfollow": "Przestań śledzić @{name}", "report.unfollow_explanation": "Śledzisz to konto. Jeśli nie chcesz już widzieć postów z tego konta w swojej głównej osi czasu, przestań je śledzić.", + "report_notification.attached_statuses": "{count, plural, one {{count} wpis} few {{count} wpisy} many {{counter} wpisów} other {{counter} wpisów}}", + "report_notification.categories.other": "Inne", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Naruszenie zasad", + "report_notification.open": "Otwórz raport", "search.placeholder": "Szukaj", "search_popout.search_format": "Zaawansowane wyszukiwanie", "search_popout.tips.full_text": "Pozwala na wyszukiwanie wpisów które napisałeś(-aś), dodałeś(-aś) do ulubionych lub podbiłeś(-aś), w których o Tobie wspomniano, oraz pasujące nazwy użytkowników, pełne nazwy i hashtagi.", @@ -466,6 +473,7 @@ "status.embed": "Osadź", "status.favourite": "Dodaj do ulubionych", "status.filtered": "Filtrowany(-a)", + "status.hide": "Schowaj toota", "status.history.created": "{name} utworzył(a) {date}", "status.history.edited": "{name} edytował(a) {date}", "status.load_more": "Załaduj więcej", @@ -489,6 +497,7 @@ "status.report": "Zgłoś @{name}", "status.sensitive_warning": "Wrażliwa zawartość", "status.share": "Udostępnij", + "status.show_filter_reason": "Pokaż mimo wszystko", "status.show_less": "Zwiń", "status.show_less_all": "Zwiń wszystkie", "status.show_more": "Rozwiń", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 66960ffca..742bf2d7f 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferências", "navigation_bar.public_timeline": "Linha global", "navigation_bar.security": "Segurança", + "notification.admin.report": "{name} denunciou {target}", "notification.admin.sign_up": "{name} se inscreveu", "notification.favourite": "{name} favoritou teu toot", "notification.follow": "{name} te seguiu", @@ -326,6 +327,7 @@ "notification.update": "{name} editou uma publicação", "notifications.clear": "Limpar notificações", "notifications.clear_confirmation": "Você tem certeza de que deseja limpar todas as suas notificações?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no computador", "notifications.column_settings.favourite": "Favoritos:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Obrigado por reportar. Vamos analisar.", "report.unfollow": "Deixar de seguir @{name}", "report.unfollow_explanation": "Você está seguindo esta conta. Para não mais ver os posts dele em sua página inicial, deixe de segui-lo.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Outro", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Violação de regra", + "report_notification.open": "Abrir relatório", "search.placeholder": "Pesquisar", "search_popout.search_format": "Formato de pesquisa avançada", "search_popout.tips.full_text": "Texto simples retorna toots que você escreveu, favoritou, deu boost, ou em que foi mencionado, assim como nomes de usuário e de exibição, e hashtags correspondentes.", @@ -461,6 +468,7 @@ "status.embed": "Incorporar", "status.favourite": "Favoritar", "status.filtered": "Filtrado", + "status.hide": "Hide toot", "status.history.created": "{name} criou {date}", "status.history.edited": "{name} editou {date}", "status.load_more": "Ver mais", @@ -484,6 +492,7 @@ "status.report": "Denunciar @{name}", "status.sensitive_warning": "Mídia sensível", "status.share": "Compartilhar", + "status.show_filter_reason": "Show anyway", "status.show_less": "Mostrar menos", "status.show_less_all": "Mostrar menos em tudo", "status.show_more": "Mostrar mais", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 90285a70f..c8810703e 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferências", "navigation_bar.public_timeline": "Cronologia federada", "navigation_bar.security": "Segurança", + "notification.admin.report": "{name} denunciou {target}", "notification.admin.sign_up": "{name} inscreveu-se", "notification.favourite": "{name} adicionou a tua publicação aos favoritos", "notification.follow": "{name} começou a seguir-te", @@ -326,6 +327,7 @@ "notification.update": "{name} editou uma publicação", "notifications.clear": "Limpar notificações", "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?", + "notifications.column_settings.admin.report": "Novas denúncias:", "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no ambiente de trabalho", "notifications.column_settings.favourite": "Favoritos:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Obrigado por reportar, vamos analisar.", "report.unfollow": "Deixar de seguir @{name}", "report.unfollow_explanation": "Está a seguir esta conta. Para não ver mais as publicações desta conta na sua página inicial, deixe de segui-la.", + "report_notification.attached_statuses": "{count, plural,one {{count} publicação} other {{count} publicações}} em anexo", + "report_notification.categories.other": "Outro", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Violação de regra", + "report_notification.open": "Abrir denúncia", "search.placeholder": "Pesquisar", "search_popout.search_format": "Formato avançado de pesquisa", "search_popout.tips.full_text": "Texto simples devolve publicações que escreveu, marcou como favorita, partilhou ou em que foi mencionado, tal como nomes de utilizador, alcunhas e hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Incorporar", "status.favourite": "Adicionar aos favoritos", "status.filtered": "Filtrada", + "status.hide": "Esconder publicação", "status.history.created": "{name} criado em {date}", "status.history.edited": "{name} editado em {date}", "status.load_more": "Carregar mais", @@ -484,6 +492,7 @@ "status.report": "Denunciar @{name}", "status.sensitive_warning": "Conteúdo sensível", "status.share": "Partilhar", + "status.show_filter_reason": "Mostrar mesmo assim", "status.show_less": "Mostrar menos", "status.show_less_all": "Mostrar menos para todas", "status.show_more": "Mostrar mais", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 34328e65b..0c2ce0b2d 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferințe", "navigation_bar.public_timeline": "Cronologie globală", "navigation_bar.security": "Securitate", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} a adăugat postarea ta la favorite", "notification.follow": "{name} s-a abonat la tine", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Șterge notificările", "notifications.clear_confirmation": "Ești sigur că vrei să ștergi permanent toate notificările?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Notificări pe desktop", "notifications.column_settings.favourite": "Favorite:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Caută", "search_popout.search_format": "Formate pentru căutare avansată", "search_popout.tips.full_text": "Textele simple returnează postări pe care le-ai scris, favorizat, impulsionat, sau în care sunt menționate, deasemenea și utilizatorii sau hashtag-urile care se potrivesc.", @@ -461,6 +468,7 @@ "status.embed": "Înglobează", "status.favourite": "Favorite", "status.filtered": "Sortate", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Încarcă mai multe", @@ -484,6 +492,7 @@ "status.report": "Raportează pe @{name}", "status.sensitive_warning": "Conținut sensibil", "status.share": "Distribuie", + "status.show_filter_reason": "Show anyway", "status.show_less": "Arată mai puțin", "status.show_less_all": "Arată mai puțin pentru toți", "status.show_more": "Arată mai mult", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 42dee567e..f622cfe36 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Настройки", "navigation_bar.public_timeline": "Глобальная лента", "navigation_bar.security": "Безопасность", + "notification.admin.report": "{name} сообщил о {target}", "notification.admin.sign_up": "{name} зарегистрирован", "notification.favourite": "{name} добавил(а) ваш пост в избранное", "notification.follow": "{name} подписался (-лась) на вас", @@ -326,6 +327,7 @@ "notification.update": "{name} изменил(а) пост", "notifications.clear": "Очистить уведомления", "notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?", + "notifications.column_settings.admin.report": "Новые жалобы:", "notifications.column_settings.admin.sign_up": "Новые регистрации:", "notifications.column_settings.alert": "Уведомления на рабочем столе", "notifications.column_settings.favourite": "Ваш пост добавили в «избранное»:", @@ -405,7 +407,7 @@ "report.category.title_status": "этим постом", "report.close": "Готово", "report.comment.title": "Есть ли что-нибудь ещё, что нам стоит знать?", - "report.forward": "Переслать на {target}", + "report.forward": "Переслать в {target}", "report.forward_hint": "Эта учётная запись расположена на другом узле. Отправить туда анонимную копию вашей жалобы?", "report.mute": "Игнорировать", "report.mute_explanation": "Вы не будете видеть их посты. Они по-прежнему могут подписываться на вас и видеть ваши посты, но не будут знать, что они в списке игнорируемых.", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Спасибо за обращение, мы его рассмотрим.", "report.unfollow": "Отписаться от @{name}", "report.unfollow_explanation": "Вы подписаны на этого пользователя. Чтобы не видеть его/её посты в своей домашней ленте, отпишитесь от него/неё.", + "report_notification.attached_statuses": "{count, plural, one {{count} сообщение} few {{count} сообщения} many {{count} сообщений} other {{count} сообщений}} вложено", + "report_notification.categories.other": "Прочее", + "report_notification.categories.spam": "Спам", + "report_notification.categories.violation": "Нарушение правил", + "report_notification.open": "Подать жалобу", "search.placeholder": "Поиск", "search_popout.search_format": "Продвинутый формат поиска", "search_popout.tips.full_text": "Поиск по простому тексту отобразит посты, которые вы написали, добавили в избранное, продвинули или в которых были упомянуты, а также подходящие имена пользователей и хэштеги.", @@ -461,6 +468,7 @@ "status.embed": "Встроить на свой сайт", "status.favourite": "В избранное", "status.filtered": "Отфильтровано", + "status.hide": "Скрыть пост", "status.history.created": "{name} создал {date}", "status.history.edited": "{name} отредактировал {date}", "status.load_more": "Загрузить остальное", @@ -484,6 +492,7 @@ "status.report": "Пожаловаться", "status.sensitive_warning": "Содержимое «деликатного характера»", "status.share": "Поделиться", + "status.show_filter_reason": "Все равно показать", "status.show_less": "Свернуть", "status.show_less_all": "Свернуть все спойлеры в ветке", "status.show_more": "Развернуть", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index f0861f9bc..0bcca64ea 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 202caa5ca..957b114c0 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferèntzias", "navigation_bar.public_timeline": "Lìnia de tempus federada", "navigation_bar.security": "Seguresa", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} at marcadu sa publicatzione tua comente a preferida", "notification.follow": "{name} ti sighit", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Lìmpia notìficas", "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Notìficas de iscrivania", "notifications.column_settings.favourite": "Preferidos:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Chirca", "search_popout.search_format": "Formadu de chirca avantzada", "search_popout.tips.full_text": "Testu sèmplitze pro agatare publicatziones chi as iscritu, marcadu comente a preferidas, cumpartzidu o chi t'ant mentovadu, e fintzas nòmines, nòmines de utente e etichetas.", @@ -461,6 +468,7 @@ "status.embed": "Afissa", "status.favourite": "Preferidos", "status.filtered": "Filtradu", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Càrriga·nde àteros", @@ -484,6 +492,7 @@ "status.report": "Sinnala @{name}", "status.sensitive_warning": "Cuntenutu sensìbile", "status.share": "Cumpartzi", + "status.show_filter_reason": "Show anyway", "status.show_less": "Ammustra·nde prus pagu", "status.show_less_all": "Ammustra·nde prus pagu pro totus", "status.show_more": "Ammustra·nde prus", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 4d9e0d3b5..7ef228273 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -7,155 +7,155 @@ "account.block_domain": "{domain} වසම අවහිර කරන්න", "account.blocked": "අවහිර කර ඇත", "account.browse_more_on_origin_server": "මුල් පැතිකඩෙහි තවත් පිරික්සන්න", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "ඉල්ලීම අනුගමනය කිරීම අවලංගු කරන්න", "account.direct": "@{name} සෘජු පණිවිඩය", "account.disable_notifications": "@{name} පළ කරන විට මට දැනුම් දීම නවත්වන්න", "account.domain_blocked": "වසම අවහිර කර ඇත", "account.edit_profile": "පැතිකඩ සංස්කරණය", "account.enable_notifications": "@{name} පළ කරන විට මට දැනුම් දෙන්න", "account.endorse": "පැතිකඩෙහි විශේෂාංගය", - "account.follow": "Follow", - "account.followers": "Followers", - "account.followers.empty": "No one follows this user yet.", - "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", - "account.following": "Following", - "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", - "account.follows.empty": "This user doesn't follow anyone yet.", - "account.follows_you": "Follows you", - "account.hide_reblogs": "Hide boosts from @{name}", + "account.follow": "අනුගමනය", + "account.followers": "අනුගාමිකයින්", + "account.followers.empty": "කිසිවෙකු තවමත් මෙම පරිශීලකයා අනුගමනය නොකරයි.", + "account.followers_counter": "{count, plural, one {{counter} අනුගාමිකයෙක්} other {{counter} අනුගාමිකයින්}}", + "account.following": "අනුගමනය", + "account.following_counter": "{count, plural, one {{counter} අනුගමනය කරන්න} other {{counter} අනුගමනය කරන්න}}", + "account.follows.empty": "මෙම පරිශීලකයා තවමත් කිසිවෙකු අනුගමනය නොකරයි.", + "account.follows_you": "ඔබව අනුගමනය කරයි", + "account.hide_reblogs": "@{name}සිට බූස්ට් සඟවන්න", "account.joined": "{date} එක් වී ඇත", - "account.link_verified_on": "මෙම සබැඳියේ හිමිකාරිත්වය {date} දින පරීක්ෂා කරන ලදි", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.link_verified_on": "මෙම සබැඳියේ හිමිකාරිත්වය {date} දින පරීක්ෂා කරන ලදී", + "account.locked_info": "මෙම ගිණුමේ රහස්යතා තත්ත්වය අගුලු දමා ඇත. හිමිකරු ඔවුන් අනුගමනය කළ හැක්කේ කාටදැයි හස්තීයව සමාලෝචනය කරයි.", "account.media": "මාධ්යය", "account.mention": "@{name} සැඳහුම", - "account.moved_to": "{name} has moved to:", + "account.moved_to": "{name} වෙත මාරු වී ඇත:", "account.mute": "@{name} නිහඬ කරන්න", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", + "account.mute_notifications": "@{name}වෙතින් දැනුම්දීම් නිහඬ කරන්න", + "account.muted": "නිහඬ කළා", + "account.posts": "ටූට්ස්", + "account.posts_with_replies": "ටූට්ස් සහ පිළිතුරු", "account.report": "@{name} වාර්තා කරන්න", - "account.requested": "Awaiting approval", + "account.requested": "අනුමැතිය බලාපොරොත්තුවෙන්", "account.share": "@{name} ගේ පැතිකඩ බෙදාගන්න", - "account.show_reblogs": "Show boosts from @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", + "account.show_reblogs": "@{name}සිට බූස්ට් පෙන්වන්න", + "account.statuses_counter": "{count, plural, one {{counter} ටූට්} other {{counter} ටූට්ස්}}", "account.unblock": "@{name} අනවහිර කරන්න", "account.unblock_domain": "{domain} වසම අනවහිර කරන්න", - "account.unblock_short": "Unblock", + "account.unblock_short": "අවහිර කිරීම ඉවත් කරන්න", "account.unendorse": "පැතිකඩෙහි විශේෂාංග නොකරන්න", - "account.unfollow": "Unfollow", - "account.unmute": "Unmute @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", - "account.unmute_short": "Unmute", + "account.unfollow": "අනුගමනය නොකරන්න", + "account.unmute": "@{name}නිහඬ නොකරන්න", + "account.unmute_notifications": "@{name}වෙතින් දැනුම්දීම් නිහඬ නොකරන්න", + "account.unmute_short": "නිහඬ නොකරන්න", "account_note.placeholder": "සටහන එකතු කිරීමට ක්ලික් කරන්න", - "admin.dashboard.daily_retention": "User retention rate by day after sign-up", - "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", - "admin.dashboard.retention.average": "Average", - "admin.dashboard.retention.cohort": "Sign-up month", + "admin.dashboard.daily_retention": "ලියාපදිංචි වීමෙන් පසු දිනකට පරිශීලක රඳවා ගැනීමේ අනුපාතය", + "admin.dashboard.monthly_retention": "ලියාපදිංචි වීමෙන් පසු මාසය අනුව පරිශීලක රඳවා ගැනීමේ අනුපාතය", + "admin.dashboard.retention.average": "සාමාන්යය", + "admin.dashboard.retention.cohort": "ලියාපදිංචි වීමේ මාසය", "admin.dashboard.retention.cohort_size": "නව පරිශීලකයින්", "alert.rate_limited.message": "කරුණාකර {retry_time, time, medium} ට පසු නැවත උත්සාහ කරන්න.", - "alert.rate_limited.title": "Rate limited", - "alert.unexpected.message": "An unexpected error occurred.", + "alert.rate_limited.title": "මිල සීමා සහිතයි", + "alert.unexpected.message": "අනපේක්ෂිත දෝෂයක් ඇතිවුනා.", "alert.unexpected.title": "අපොයි!", "announcement.announcement": "නිවේදනය", - "attachments_list.unprocessed": "(unprocessed)", - "autosuggest_hashtag.per_week": "{count} per week", - "boost_modal.combo": "You can press {combo} to skip this next time", - "bundle_column_error.body": "Something went wrong while loading this component.", + "attachments_list.unprocessed": "(සැකසුම් නොකළ)", + "autosuggest_hashtag.per_week": "සතියකට {count}", + "boost_modal.combo": "ඊළඟ වතාවේ මෙය මඟ හැරීමට ඔබට {combo} එබිය හැක", + "bundle_column_error.body": "මෙම සංරචකය පූරණය කිරීමේදී යම් දෙයක් වැරදී ඇත.", "bundle_column_error.retry": "නැවත උත්සාහ කරන්න", "bundle_column_error.title": "ජාලයේ දෝෂයකි", "bundle_modal_error.close": "වසන්න", - "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.message": "මෙම සංරචකය පූරණය කිරීමේදී යම් දෙයක් වැරදී ඇත.", "bundle_modal_error.retry": "නැවත උත්සාහ කරන්න", "column.blocks": "අවහිර කළ පරිශීලකයින්", "column.bookmarks": "පොත් යොමු", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.directory": "පැතිකඩයන් පිරික්සන්න", + "column.community": "දේශීය කාලරේඛාව", + "column.direct": "සෘජු පණිවිඩ", + "column.directory": "පැතිකඩ පිරික්සන්න", "column.domain_blocks": "අවහිර කළ වසම්", "column.favourites": "ප්රියතමයන්", - "column.follow_requests": "Follow requests", + "column.follow_requests": "ඉල්ලීම් අනුගමනය කරන්න", "column.home": "මුල් පිටුව", - "column.lists": "ලැයිස්තු", - "column.mutes": "නිහඬ කළ පරිශීලකයන්", + "column.lists": "ලැයිස්තුව", + "column.mutes": "සමඟ කළ පරිශීලකයන්", "column.notifications": "දැනුම්දීම්", - "column.pins": "Pinned toot", - "column.public": "Federated timeline", + "column.pins": "පින් කළ දත", + "column.public": "ෆෙඩරේටඩ් කාලරේඛාව", "column_back_button.label": "ආපසු", "column_header.hide_settings": "සැකසුම් සඟවන්න", "column_header.moveLeft_settings": "තීරුව වමට ගෙනයන්න", "column_header.moveRight_settings": "තීරුව දකුණට ගෙනයන්න", - "column_header.pin": "Pin", + "column_header.pin": "පින් කරන්න", "column_header.show_settings": "සැකසුම් පෙන්වන්න", - "column_header.unpin": "Unpin", + "column_header.unpin": "ඇමුණුම ඉවත් කරන්න", "column_subheading.settings": "සැකසුම්", "community.column_settings.local_only": "ස්ථානීයව පමණයි", "community.column_settings.media_only": "මාධ්ය පමණයි", "community.column_settings.remote_only": "දුරස්ථව පමණයි", - "compose.language.change": "Change language", - "compose.language.search": "Search languages...", + "compose.language.change": "භාෂාව වෙනස් කරන්න", + "compose.language.search": "භාෂා සොයන්න...", "compose_form.direct_message_warning_learn_more": "තව දැනගන්න", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.encryption_warning": "Mastodon හි පළ කිරීම් අන්තයේ සිට අවසානය දක්වා සංකේතනය කර නොමැත. Mastodon හරහා කිසිදු සංවේදී තොරතුරක් බෙදා නොගන්න.", + "compose_form.hashtag_warning": "මෙම මෙවලම ලැයිස්තුගත කර නොමැති බැවින් කිසිදු හැෂ් ටැගය යටතේ ලැයිස්තුගත නොකෙරේ. හැෂ් ටැග් මගින් සෙවිය හැක්කේ පොදු මෙවලම් පමණි.", + "compose_form.lock_disclaimer": "ඔබගේ ගිණුම {locked}නොවේ. ඔබගේ අනුගාමිකයින්ට පමණක් පළ කිරීම් බැලීමට ඕනෑම කෙනෙකුට ඔබව අනුගමනය කළ හැක.", "compose_form.lock_disclaimer.lock": "අගුළු දමා ඇත", "compose_form.placeholder": "ඔබගේ සිතුවිලි මොනවාද?", "compose_form.poll.add_option": "තේරීමක් එකතු කරන්න", "compose_form.poll.duration": "මත විමසීමේ කාලය", - "compose_form.poll.option_placeholder": "Choice {number}", - "compose_form.poll.remove_option": "මෙම තේරීම ඉවත් කරන්න", - "compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයකට ඉඩ දීම සඳහා මත විමසුම වෙනස් කරන්න", + "compose_form.poll.option_placeholder": "තේරීම {number}", + "compose_form.poll.remove_option": "මෙම ඉවත් කරන්න", + "compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයක් ඉඩ දීම සඳහා මත විමසුම වෙනස් කරන්න", "compose_form.poll.switch_to_single": "තනි තේරීමකට ඉඩ දීම සඳහා මත විමසුම වෙනස් කරන්න", - "compose_form.publish": "Publish", + "compose_form.publish": "ප්රකාශ කරන්න", "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Save changes", - "compose_form.sensitive.hide": "{count, plural, one {මාධ්ය සංවේදී ලෙස සලකුණු කරන්න} other {මාධ්ය සංවේදී ලෙස සලකුණු කරන්න}}", + "compose_form.save_changes": "වෙනස්කම් සුරකින්න", + "compose_form.sensitive.hide": "{count, plural, one {මාධ්ය සංවේදී ලෙස සලකුණු කරන්න} other {මාධ්ය සංවේදී ලෙස සලකුණු කරන්න}}", "compose_form.sensitive.marked": "{count, plural, one {මාධ්ය සංවේදී ලෙස සලකුණු කර ඇත} other {මාධ්ය සංවේදී ලෙස සලකුණු කර ඇත}}", "compose_form.sensitive.unmarked": "{count, plural, one {මාධ්ය සංවේදී ලෙස සලකුණු කර නැත} other {මාධ්ය සංවේදී ලෙස සලකුණු කර නැත}}", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "පාඨය සඟවා නැත", + "compose_form.spoiler.marked": "අනතුරු ඇඟවීම පිටුපස පෙළ සඟවා ඇත", + "compose_form.spoiler.unmarked": "ප්රයෝජනය සඟවා නැත", "compose_form.spoiler_placeholder": "ඔබගේ අවවාදය මෙහි ලියන්න", "confirmation_modal.cancel": "අවලංගු", "confirmations.block.block_and_report": "අවහිර කර වාර්තා කරන්න", "confirmations.block.confirm": "අවහිර", - "confirmations.block.message": "ඔබට {name} අවහිර කිරීමට අවශ්ය බව විශ්වාසද?", - "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.block.message": "ඔබට {name} අවහිර කිරීමට අවශ්ය බව ද?", + "confirmations.delete.confirm": "මකන්න", + "confirmations.delete.message": "ඔබට මෙම තත්ත්වය මැකීමට අවශ්ය බව විශ්වාසද?", + "confirmations.delete_list.confirm": "මකන්න", + "confirmations.delete_list.message": "ඔබට මෙම ලැයිස්තුව ස්ථිරවම මැකීමට අවශ්ය බව විශ්වාසද?", "confirmations.discard_edit_media.confirm": "ඉවත ලන්න", - "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", + "confirmations.discard_edit_media.message": "ඔබට මාධ්ය විස්තරයට හෝ පෙරදසුනට නොසුරකින ලද වෙනස්කම් තිබේ, කෙසේ වෙතත් ඒවා ඉවත දමන්නද?", "confirmations.domain_block.confirm": "සම්පූර්ණ වසම අවහිර කරන්න", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.domain_block.message": "ඔබට සම්පූර්ණ {domain}අවහිර කිරීමට අවශ්ය බව ඔබට සැබවින්ම විශ්වාසද? බොහෝ අවස්ථාවලදී ඉලක්කගත බ්ලොක් හෝ නිශ්ශබ්ද කිරීම් කිහිපයක් ප්රමාණවත් වන අතර වඩාත් යෝග්ය වේ. ඔබ කිසිදු පොදු කාලරාමුවක හෝ ඔබගේ දැනුම්දීම් වල එම වසමේ අන්තර්ගතය නොදකිනු ඇත. එම වසමෙන් ඔබගේ අනුගාමිකයින් ඉවත් කරනු ලැබේ.", "confirmations.logout.confirm": "නික්මෙන්න", "confirmations.logout.message": "ඔබට නික්මෙන්න අවශ්ය බව විශ්වාසද?", "confirmations.mute.confirm": "නිශ්ශබ්ද", - "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", + "confirmations.mute.explanation": "මෙය ඔවුන්ගෙන් පළ කිරීම් සහ ඒවා සඳහන් කරන පළ කිරීම් සඟවයි, නමුත් එය ඔවුන්ට ඔබේ පළ කිරීම් බැලීමට සහ ඔබව අනුගමනය කිරීමට තවමත් ඉඩ ලබා දේ.", "confirmations.mute.message": "ඔබට {name} නිශ්ශබ්ද කිරීමට අවශ්ය බව විශ්වාසද?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.redraft.confirm": "මකන්න සහ නැවත කෙටුම්පත් කරන්න", + "confirmations.redraft.message": "ඔබට මෙම තත්ත්වය මකා එය නැවත කෙටුම්පත් කිරීමට අවශ්ය බව විශ්වාසද? ප්රියතමයන් සහ බූස්ට් අහිමි වනු ඇත, මුල් පළ කිරීම සඳහා පිළිතුරු අනාථ වනු ඇත.", "confirmations.reply.confirm": "පිළිතුර", - "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "conversation.delete": "Delete conversation", + "confirmations.reply.message": "දැන් පිළිතුරු දීම ඔබ දැනට රචනා කරන පණිවිඩය උඩින් ලියයි. ඔබට ඉදිරියට යාමට අවශ්ය බව විශ්වාසද?", + "confirmations.unfollow.confirm": "අනුගමනය නොකරන්න", + "confirmations.unfollow.message": "ඔබට {name}අනුගමනය නොකිරීමට අවශ්ය බව විශ්වාසද?", + "conversation.delete": "සංවාදය මකන්න", "conversation.mark_as_read": "කියවූ ලෙස සලකුණු කරන්න", "conversation.open": "සංවාදය බලන්න", "conversation.with": "{names} සමඟ", - "directory.federated": "From known fediverse", - "directory.local": "{domain} වෙතින් පමණි", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", - "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", + "directory.federated": "දන්නා fediverse වලින්", + "directory.local": "{domain} පමණි", + "directory.new_arrivals": "නව පැමිණීම්", + "directory.recently_active": "මෑතකදී ක්රියාකාරී", + "embed.instructions": "පහත කේතය පිටපත් කිරීමෙන් මෙම තත්ත්වය ඔබේ වෙබ් අඩවියට ඇතුළත් කරන්න.", + "embed.preview": "එය පෙනෙන්නේ කෙසේද යන්න මෙන්න:", "emoji_button.activity": "ක්රියාකාරකම", - "emoji_button.clear": "Clear", + "emoji_button.clear": "පැහැදිලිව", "emoji_button.custom": "අභිරුචි", - "emoji_button.flags": "Flags", + "emoji_button.flags": "කොඩි", "emoji_button.food": "ආහාර සහ පාන", - "emoji_button.label": "Insert emoji", - "emoji_button.nature": "සොබාදහම", - "emoji_button.not_found": "No matching emojis found", + "emoji_button.label": "ඉමොජි ඇතුළු කරන්න", + "emoji_button.nature": "ස්වභාවික", + "emoji_button.not_found": "ගැළපෙන ඉමෝජි හමු නොවීය", "emoji_button.objects": "වස්තූන්", "emoji_button.people": "මිනිසුන්", "emoji_button.recent": "නිතර භාවිතා වූ", @@ -164,386 +164,395 @@ "emoji_button.symbols": "සංකේත", "emoji_button.travel": "චාරිකා සහ ස්ථාන", "empty_column.account_suspended": "ගිණුම අත්හිටුවා ඇත", - "empty_column.account_timeline": "No toots here!", - "empty_column.account_unavailable": "Profile unavailable", + "empty_column.account_timeline": "මෙහි දත් නැත!", + "empty_column.account_unavailable": "පැතිකඩ නොමැත", "empty_column.blocks": "ඔබ තවමත් කිසිදු පරිශීලකයෙකු අවහිර කර නැත.", - "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", - "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.bookmarked_statuses": "ඔබට තවමත් පිටු සලකුණු කළ මෙවලම් කිසිවක් නොමැත. ඔබ එකක් පිටු සලකුණු කළ විට, එය මෙහි පෙන්වනු ඇත.", + "empty_column.community": "දේශීය කාලරේඛාව හිස් ය. පන්දුව පෙරළීමට ප්රසිද්ධියේ යමක් ලියන්න!", + "empty_column.direct": "ඔබට තවමත් සෘජු පණිවිඩ කිසිවක් නොමැත. ඔබ එකක් යවන විට හෝ ලැබුණු විට, එය මෙහි පෙන්වනු ඇත.", "empty_column.domain_blocks": "අවහිර කළ වසම් නොමැත.", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", - "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}", - "empty_column.home.suggestions": "See some suggestions", - "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", - "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", - "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", - "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", - "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", - "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", - "errors.unexpected_crash.report_issue": "Report issue", - "explore.search_results": "Search results", - "explore.suggested_follows": "For you", - "explore.title": "Explore", - "explore.trending_links": "News", - "explore.trending_statuses": "Posts", - "explore.trending_tags": "Hashtags", - "follow_recommendations.done": "Done", - "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.", - "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", - "follow_request.authorize": "Authorize", - "follow_request.reject": "ප්රතික්ෂේප", - "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", + "empty_column.explore_statuses": "දැන් කිසිවක් නැඹුරු නොවේ. පසුව නැවත පරීක්ෂා කරන්න!", + "empty_column.favourited_statuses": "ඔබට තවමත් ප්රියතම දත් කිසිවක් නැත. ඔබ කැමති එකක් වූ විට, එය මෙහි පෙන්වනු ඇත.", + "empty_column.favourites": "කිසිවෙකු තවමත් මෙම මෙවලමට ප්රිය කර නැත. යමෙකු එසේ කළ විට, ඔවුන් මෙහි පෙන්වනු ඇත.", + "empty_column.follow_recommendations": "ඔබ වෙනුවෙන් යෝජනා ජනනය කළ නොහැකි බව පෙනේ. ඔබ දන්නා හඳුනන පුද්ගලයින් සෙවීමට හෝ ප්රවණතා හැෂ් ටැග් ගවේෂණය කිරීමට ඔබට සෙවීම භාවිත කිරීමට උත්සාහ කළ හැක.", + "empty_column.follow_requests": "ඔබට තවමත් අනුගමනය කිරීමේ ඉල්ලීම් කිසිවක් නොමැත. ඔබට එකක් ලැබුණු විට, එය මෙහි පෙන්වනු ඇත.", + "empty_column.hashtag": "මෙම හැෂ් ටැග් එකේ තවම කිසිවක් නොමැත.", + "empty_column.home": "ඔබගේ නිවසේ කාලරේඛාව හිස්ය! එය පිරවීම සඳහා තවත් පුද්ගලයින් අනුගමනය කරන්න. {suggestions}", + "empty_column.home.suggestions": "යෝජනා කිහිපයක් බලන්න", + "empty_column.list": "මෙම ලැයිස්තුවේ තවමත් කිසිවක් නොමැත. මෙම ලැයිස්තුවේ සාමාජිකයන් නව තත්ව පළ කරන විට, ඔවුන් මෙහි දිස් වනු ඇත.", + "empty_column.lists": "ඔබට තවමත් ලැයිස්තු කිසිවක් නැත. ඔබ එකක් සාදන විට, එය මෙහි පෙන්වනු ඇත.", + "empty_column.mutes": "ඔබ තවමත් කිසිදු පරිශීලකයෙකු නිහඬ කර නැත.", + "empty_column.notifications": "ඔබට තවම දැනුම්දීම් කිසිවක් නැත. වෙනත් පුද්ගලයින් ඔබ සමඟ අන්තර් ක්රියා කරන විට, ඔබ එය මෙහි දකිනු ඇත.", + "empty_column.public": "මෙහි කිසිවක් නැත! යමක් ප්රසිද්ධියේ ලියන්න, නැතහොත් එය පිරවීම සඳහා වෙනත් සේවාදායකයන්ගෙන් පරිශීලකයන් හස්තීයව අනුගමනය කරන්න", + "error.unexpected_crash.explanation": "අපගේ කේතයේ දෝෂයක් හෝ බ්රවුසර ගැළපුම් ගැටලුවක් හේතුවෙන්, මෙම පිටුව නිවැරදිව ප්රදර්ශනය කළ නොහැක.", + "error.unexpected_crash.explanation_addons": "මෙම පිටුව නිවැරදිව ප්රදර්ශනය කළ නොහැක. මෙම දෝෂය බ්රවුසර ඇඩෝනයක් හෝ ස්වයංක්රීය පරිවර්තන මෙවලම් නිසා ඇති විය හැක.", + "error.unexpected_crash.next_steps": "පිටුව නැවුම් කිරීමට උත්සාහ කරන්න. එය උදව් නොකළහොත්, ඔබට තවමත් වෙනත් බ්රවුසරයක් හෝ ස්වදේශීය යෙදුමක් හරහා Mastodon භාවිත කිරීමට හැකි වේ.", + "error.unexpected_crash.next_steps_addons": "ඒවා අක්රිය කර පිටුව නැවුම් කිරීමට උත්සාහ කරන්න. එය උදව් නොකළහොත්, ඔබට තවමත් වෙනත් බ්රවුසරයක් හෝ ස්වදේශීය යෙදුමක් හරහා Mastodon භාවිත කිරීමට හැකි වේ.", + "errors.unexpected_crash.copy_stacktrace": "ස්ටැක්ට්රේස් පසුරු පුවරුවට පිටපත් කරන්න", + "errors.unexpected_crash.report_issue": "ගැටලුව වාර්තා කරන්න", + "explore.search_results": "සෙවුම් ප්රතිඵල", + "explore.suggested_follows": "ඔයා වෙනුවෙන්", + "explore.title": "ගවේෂණය කරන්න", + "explore.trending_links": "පුවත්", + "explore.trending_statuses": "තනතුරු", + "explore.trending_tags": "හැෂ් ටැග්", + "follow_recommendations.done": "කළා", + "follow_recommendations.heading": "ඔබ පළ කිරීම් බැලීමට කැමති පුද්ගලයින් අනුගමනය කරන්න! මෙන්න යෝජනා කිහිපයක්.", + "follow_recommendations.lead": "ඔබ අනුගමන කරන පුද්ගලයින්ගේ පළ කිරීම් ඔබගේ නිවසේ සංග්රහයේ කාලානුක්රමික අනුපිළිවෙලට පෙන්වනු ඇත. වැරදි කිරීමට බිය නොවන්න, ඔබට ඕනෑම වේලාවක පහසුවෙන් මිනිසුන් අනුගමනය කළ නොහැක!", + "follow_request.authorize": "අවසරලත්", + "follow_request.reject": "ප්රතික්ෂේප", + "follow_requests.unlocked_explanation": "ඔබගේ ගිණුම අගුලු දමා නොතිබුණද, {domain} කාර්ය මණ්ඩලය සිතුවේ ඔබට මෙම ගිණුම් වලින් ලැබෙන ඉල්ලීම් හස්තීයව සමාලෝචනය කිරීමට අවශ්ය විය හැකි බවයි.", "generic.saved": "සුරැකිණි", "getting_started.developers": "සංවර්ධකයින්", "getting_started.directory": "පැතිකඩ නාමාවලිය", "getting_started.documentation": "ප්රලේඛනය", - "getting_started.heading": "Getting started", + "getting_started.heading": "ඇරඹේ", "getting_started.invite": "මිනිසුන්ට ආරාධනා කරන්න", - "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.open_source_notice": "Mastodon යනු විවෘත කේත මෘදුකාංගයකි. ඔබට GitHub හි {github}ට දායක වීමට හෝ ගැටළු වාර්තා කිරීමට හැකිය.", "getting_started.security": "ගිණුමේ සැකසුම්", "getting_started.terms": "සේවාවේ කොන්දේසි", "hashtag.column_header.tag_mode.all": "සහ {additional}", "hashtag.column_header.tag_mode.any": "හෝ {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_header.tag_mode.none": "{additional}නොමැතිව", "hashtag.column_settings.select.no_options_message": "යෝජනා කිසිවක් හමු නොවිණි", - "hashtag.column_settings.select.placeholder": "Enter hashtags…", - "hashtag.column_settings.tag_mode.all": "මේ සියල්ලම", - "hashtag.column_settings.tag_mode.any": "මෙයින් ඕනෑම එකක්", - "hashtag.column_settings.tag_mode.none": "None of these", - "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.column_settings.select.placeholder": "හැෂ් ටැග්…ඇතුලත් කරන්න", + "hashtag.column_settings.tag_mode.all": "මේ වගේ", + "hashtag.column_settings.tag_mode.any": "ඇතුළත් එකක්", + "hashtag.column_settings.tag_mode.none": "මේ කිසිවක් නැත", + "hashtag.column_settings.tag_toggle": "මෙම තීරුවේ අමතර ටැග් ඇතුළත් කරන්න", "home.column_settings.basic": "මූලික", - "home.column_settings.show_reblogs": "Show boosts", - "home.column_settings.show_replies": "ප්රතිචාර පෙන්වන්න", + "home.column_settings.show_reblogs": "බූස්ට් පෙන්වන්න", + "home.column_settings.show_replies": "ප්රතිචාර පෙන්වන්න", "home.hide_announcements": "නිවේදන සඟවන්න", "home.show_announcements": "නිවේදන පෙන්වන්න", - "intervals.full.days": "{number, plural, one {# day} other {# days}}", - "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", - "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", - "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.blocked": "to open blocked users list", - "keyboard_shortcuts.boost": "to boost", - "keyboard_shortcuts.column": "to focus a status in one of the columns", - "keyboard_shortcuts.compose": "to focus the compose textarea", + "intervals.full.days": "{number, plural, one {# දින} other {# දින}}", + "intervals.full.hours": "{number, plural, one {# පැය} other {# පැය}}", + "intervals.full.minutes": "{number, plural, one {විනාඩි #} other {# මිනිත්තු}}", + "keyboard_shortcuts.back": "ආපසු සැරිසැරීමට", + "keyboard_shortcuts.blocked": "අවහිර කළ පරිශීලක ලැයිස්තුව විවෘත කිරීමට", + "keyboard_shortcuts.boost": "වැඩි කිරීමට", + "keyboard_shortcuts.column": "එක් තීරුවක තත්ත්වය නාභිගත කිරීමට", + "keyboard_shortcuts.compose": "රචනා පාඨ ප්රදේශය නාභිගත කිරීමට", "keyboard_shortcuts.description": "සවිස්තරය", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "to move down in the list", - "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.favourite": "to favourite", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.direct": "සෘජු පණිවිඩ තීරුව විවෘත කිරීමට", + "keyboard_shortcuts.down": "ලැයිස්තුවේ පහළට ගමන් කිරීමට", + "keyboard_shortcuts.enter": "තත්ත්වය විවෘත කිරීමට", + "keyboard_shortcuts.favourite": "කැමති කිරීමට", + "keyboard_shortcuts.favourites": "ප්රියතම ලැයිස්තුව විවෘත කිරීමට", + "keyboard_shortcuts.federated": "ෆෙඩරේටඩ් කාලරාමුව විවෘත කිරීමට", + "keyboard_shortcuts.heading": "යතුරුපුවරු කෙටිමං", + "keyboard_shortcuts.home": "නිවසේ කාලරේඛාව විවෘත කිරීමට", "keyboard_shortcuts.hotkey": "උණුසුම් යතුර", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.local": "to open local timeline", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.open_media": "to open media", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.requests": "to open follow requests list", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.spoilers": "to show/hide CW field", - "keyboard_shortcuts.start": "to open \"get started\" column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", - "keyboard_shortcuts.toot": "to start a brand new toot", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", + "keyboard_shortcuts.legend": "මෙම පුරාවෘත්තය ප්රදර්ශනය කිරීමට", + "keyboard_shortcuts.local": "දේශීය කාලරේඛාව විවෘත කිරීමට", + "keyboard_shortcuts.mention": "කතුවරයා සඳහන් කිරීමට", + "keyboard_shortcuts.muted": "නිශ්ශබ්ද පරිශීලක ලැයිස්තුව විවෘත කිරීමට", + "keyboard_shortcuts.my_profile": "ඔබගේ පැතිකඩ විවෘත කිරීමට", + "keyboard_shortcuts.notifications": "දැනුම්දීම් තීරුව විවෘත කිරීමට", + "keyboard_shortcuts.open_media": "මාධ්ය විවෘත කිරීමට", + "keyboard_shortcuts.pinned": "පින් කළ මෙවලම් ලැයිස්තුව විවෘත කිරීමට", + "keyboard_shortcuts.profile": "කර්තෘගේ පැතිකඩ විවෘත කිරීමට", + "keyboard_shortcuts.reply": "පිළිතුරු දීමට", + "keyboard_shortcuts.requests": "පහත ඉල්ලීම් ලැයිස්තුව විවෘත කිරීමට", + "keyboard_shortcuts.search": "සෙවුම් අවධානය යොමු කිරීමට", + "keyboard_shortcuts.spoilers": "CW ක්ෂේත්රය පෙන්වීමට/සැඟවීමට", + "keyboard_shortcuts.start": "\"ආරම්භ කරන්න\" තීරුව විවෘත කිරීමට", + "keyboard_shortcuts.toggle_hidden": "CW පිටුපස පෙළ පෙන්වීමට/සැඟවීමට", + "keyboard_shortcuts.toggle_sensitivity": "මාධ්ය පෙන්වීමට/සැඟවීමට", + "keyboard_shortcuts.toot": "අලුත්ම ටූට් එකක් පටන් ගන්න", + "keyboard_shortcuts.unfocus": "අවධානය යොමු නොකිරීමට textarea/search රචනා කරන්න", + "keyboard_shortcuts.up": "ලැයිස්තුවේ ඉහළට යාමට", "lightbox.close": "වසන්න", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "රූප බැලීමේ කොටුව සම්පීඩනය කරන්න", + "lightbox.expand": "රූප දර්ශන පෙට්ටිය දිග හරින්න", "lightbox.next": "ඊළඟ", "lightbox.previous": "පෙර", - "limited_account_hint.action": "Show profile anyway", - "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", + "limited_account_hint.action": "කෙසේ හෝ පැතිකඩ පෙන්වන්න", + "limited_account_hint.title": "මෙම පැතිකඩ ඔබගේ සේවාදායකයේ පරිපාලකයින් විසින් සඟවා ඇත.", "lists.account.add": "ලැයිස්තුවට එකතු කරන්න", - "lists.account.remove": "Remove from list", - "lists.delete": "Delete list", + "lists.account.remove": "ලැයිස්තුවෙන් ඉවත්", + "lists.delete": "ලැයිස්තුව මකන්න", "lists.edit": "ලැයිස්තුව සංස්කරණය කරන්න", - "lists.edit.submit": "Change title", + "lists.edit.submit": "මාතෘකාව වෙනස් කරන්න", "lists.new.create": "ලැයිස්තුව එකතු කරන්න", - "lists.new.title_placeholder": "New list title", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", + "lists.new.title_placeholder": "නව ලැයිස්තු මාතෘකාව", + "lists.replies_policy.followed": "අනුගමනය කරන ඕනෑම පරිශීලකයෙක්", + "lists.replies_policy.list": "ලැයිස්තුවේ සාමාජිකයන්", "lists.replies_policy.none": "කිසිවෙක් නැත", - "lists.replies_policy.title": "Show replies to:", - "lists.search": "Search among people you follow", - "lists.subheading": "Your lists", - "load_pending": "{count, plural, one {# new item} other {# new items}}", + "lists.replies_policy.title": "පිළිතුරු පෙන්වන්න:", + "lists.search": "ඔබ අනුගමනය කරන පුද්ගලයින් අතර සොයන්න", + "lists.subheading": "ඔබේ ලැයිස්තු", + "load_pending": "{count, plural, one {# නව අයිතමයක්} other {නව අයිතම #ක්}}", "loading_indicator.label": "පූරණය වෙමින්...", - "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", - "missing_indicator.label": "Not found", - "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.duration": "Duration", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "mute_modal.indefinite": "Indefinite", + "media_gallery.toggle_visible": "{number, plural, one {රූපය සඟවන්න} other {පින්තූර සඟවන්න}}", + "missing_indicator.label": "හමු වුණේ නැහැ", + "missing_indicator.sublabel": "මෙම සම්පත සොයාගත නොහැකි විය", + "mute_modal.duration": "කාල සීමාව", + "mute_modal.hide_notifications": "මෙම පරිශීලකයාගෙන් දැනුම්දීම් සඟවන්නද?", + "mute_modal.indefinite": "අවිනිශ්චිත", "navigation_bar.apps": "ජංගම යෙදුම්", "navigation_bar.blocks": "අවහිර කළ පරිශීලකයින්", - "navigation_bar.bookmarks": "පොත් යොමු", - "navigation_bar.community_timeline": "Local timeline", - "navigation_bar.compose": "Compose new toot", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.bookmarks": "පොත් යොමු කරන්න", + "navigation_bar.community_timeline": "දේශීය කාලරේඛාව", + "navigation_bar.compose": "නව ටූට් සාදන්න", + "navigation_bar.direct": "සෘජු පණිවිඩ", + "navigation_bar.discover": "සොයා ගන්න", + "navigation_bar.domain_blocks": "සැඟවුණු වසම්", "navigation_bar.edit_profile": "පැතිකඩ සංස්කරණය", - "navigation_bar.explore": "Explore", + "navigation_bar.explore": "ගවේෂණය කරන්න", "navigation_bar.favourites": "ප්රියතමයන්", - "navigation_bar.filters": "නිහඬ කළ වචන", - "navigation_bar.follow_requests": "Follow requests", - "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.filters": "සමඟ කළ වචන", + "navigation_bar.follow_requests": "ඉල්ලීම් අනුගමනය කරන්න", + "navigation_bar.follows_and_followers": "අනුගාමිකයින් සහ අනුගාමිකයින්", "navigation_bar.info": "මෙම සේවාදායකය පිළිබඳව", "navigation_bar.keyboard_shortcuts": "උණුසුම් යතුරු", - "navigation_bar.lists": "Lists", + "navigation_bar.lists": "ලැයිස්තු", "navigation_bar.logout": "නික්මෙන්න", - "navigation_bar.mutes": "Muted users", + "navigation_bar.mutes": "නිශ්ශබ්ද පරිශීලකයන්", "navigation_bar.personal": "පුද්ගලික", - "navigation_bar.pins": "Pinned toots", - "navigation_bar.preferences": "Preferences", - "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.pins": "ඇලවූ දත්", + "navigation_bar.preferences": "මනාප", + "navigation_bar.public_timeline": "ෆෙඩරේටඩ් කාලරේඛාව", "navigation_bar.security": "ආරක්ෂාව", - "notification.admin.sign_up": "{name} signed up", - "notification.favourite": "{name} favourited your status", - "notification.follow": "{name} followed you", - "notification.follow_request": "{name} has requested to follow you", - "notification.mention": "{name} mentioned you", - "notification.own_poll": "Your poll has ended", - "notification.poll": "A poll you have voted in has ended", - "notification.reblog": "{name} boosted your status", - "notification.status": "{name} just posted", - "notification.update": "{name} edited a post", + "notification.admin.report": "{name} වාර්තා {target}", + "notification.admin.sign_up": "{name} අත්සන් කර ඇත", + "notification.favourite": "{name} ඔබගේ තත්වයට කැමති විය", + "notification.follow": "{name} ඔබව අනුගමනය කළා", + "notification.follow_request": "{name} ඔබව අනුගමනය කිරීමට ඉල්ලා ඇත", + "notification.mention": "{name} ඔබව සඳහන් කර ඇත", + "notification.own_poll": "ඔබේ මත විමසුම අවසන් වී ඇත", + "notification.poll": "ඔබ ඡන්දය දුන් මත විමසුමක් අවසන් වී ඇත", + "notification.reblog": "{name} ඔබේ තත්ත්වය ඉහළ නැංවීය", + "notification.status": "{name} දැන් පළ කළා", + "notification.update": "{name} පළ කිරීමක් සංස්කරණය කළා", "notifications.clear": "දැනුම්දීම් හිස්කරන්න", - "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", - "notifications.column_settings.admin.sign_up": "New sign-ups:", - "notifications.column_settings.alert": "Desktop notifications", + "notifications.clear_confirmation": "ඔබට ඔබගේ සියලු දැනුම්දීම් ස්ථිරවම හිස් කිරීමට අවශ්ය බව විශ්වාසද?", + "notifications.column_settings.admin.report": "නව වාර්තා:", + "notifications.column_settings.admin.sign_up": "නව ලියාපදිංචි කිරීම්:", + "notifications.column_settings.alert": "ඩෙස්ක්ටොප් දැනුම්දීම්", "notifications.column_settings.favourite": "ප්රියතමයන්:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show_bar": "Show filter bar", - "notifications.column_settings.follow": "New followers:", - "notifications.column_settings.follow_request": "New follow requests:", + "notifications.column_settings.filter_bar.advanced": "සියලුම කාණ්ඩ පෙන්වන්න", + "notifications.column_settings.filter_bar.category": "ඉක්මන් පෙරහන් තීරුව", + "notifications.column_settings.filter_bar.show_bar": "පෙරහන් තීරුව පෙන්වන්න", + "notifications.column_settings.follow": "නව අනුගාමිකයින්:", + "notifications.column_settings.follow_request": "නව පහත ඉල්ලීම්:", "notifications.column_settings.mention": "සැඳහුම්:", - "notifications.column_settings.poll": "Poll results:", - "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.poll": "ඡන්ද ප්රතිඵල:", + "notifications.column_settings.push": "තල්ලු දැනුම්දීම්", + "notifications.column_settings.reblog": "තල්ලු කිරීම්:", "notifications.column_settings.show": "තීරුවෙහි පෙන්වන්න", - "notifications.column_settings.sound": "ශබ්දය ධාවනය", - "notifications.column_settings.status": "New toots:", - "notifications.column_settings.unread_notifications.category": "Unread notifications", - "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications", - "notifications.column_settings.update": "Edits:", + "notifications.column_settings.sound": "ශබ්දය සිදු කරන ලදී", + "notifications.column_settings.status": "නව දත්:", + "notifications.column_settings.unread_notifications.category": "නොකියවූ දැනුම්දීම්", + "notifications.column_settings.unread_notifications.highlight": "නොකියවූ දැනුම්දීම් ඉස්මතු කරන්න", + "notifications.column_settings.update": "සංස්කරණ:", "notifications.filter.all": "සියල්ල", - "notifications.filter.boosts": "Boosts", + "notifications.filter.boosts": "බූස්ට් කරයි", "notifications.filter.favourites": "ප්රියතමයන්", - "notifications.filter.follows": "Follows", + "notifications.filter.follows": "පහත සඳහන්", "notifications.filter.mentions": "සැඳහුම්", - "notifications.filter.polls": "Poll results", - "notifications.filter.statuses": "Updates from people you follow", - "notifications.grant_permission": "Grant permission.", + "notifications.filter.polls": "ඡන්ද ප්රතිඵල", + "notifications.filter.statuses": "ඔබ අනුගමනය කරන පුද්ගලයින්ගෙන් යාවත්කාලීන", + "notifications.grant_permission": "අවසර දෙන්න.", "notifications.group": "දැනුම්දීම් {count}", - "notifications.mark_as_read": "සෑම දැනුම්දීමක්ම කියවූ ලෙස සලකුණු කරන්න", - "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", - "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", - "notifications_permission_banner.enable": "Enable desktop notifications", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", - "notifications_permission_banner.title": "Never miss a thing", - "picture_in_picture.restore": "Put it back", + "notifications.mark_as_read": "දැනුම්දීමක්ම කියවූ ලෙස සලකුණු කරන්න", + "notifications.permission_denied": "කලින් ප්රතික්ෂේප කළ බ්රවුසර අවසර ඉල්ලීම හේතුවෙන් ඩෙස්ක්ටොප් දැනුම්දීම් නොමැත", + "notifications.permission_denied_alert": "බ්රවුසර අවසරය පෙර ප්රතික්ෂේප කර ඇති බැවින්, ඩෙස්ක්ටොප් දැනුම්දීම් සබල කළ නොහැක", + "notifications.permission_required": "අවශ්ය අවසරය ලබා දී නොමැති නිසා ඩෙස්ක්ටොප් දැනුම්දීම් නොමැත.", + "notifications_permission_banner.enable": "ඩෙස්ක්ටොප් දැනුම්දීම් සබල කරන්න", + "notifications_permission_banner.how_to_control": "Mastodon විවෘතව නොමැති විට දැනුම්දීම් ලබා ගැනීමට, ඩෙස්ක්ටොප් දැනුම්දීම් සබල කරන්න. ඔබට ඒවා සක්රිය කළ පසු ඉහත {icon} බොත්තම හරහා ඩෙස්ක්ටොප් දැනුම්දීම් ජනනය කරන්නේ කුමන ආකාරයේ අන්තර්ක්රියාද යන්න නිවැරදිව පාලනය කළ හැක.", + "notifications_permission_banner.title": "කිසිම දෙයක් අතපසු කරන්න එපා", + "picture_in_picture.restore": "ආපහු දාන්න", "poll.closed": "වසා ඇත", "poll.refresh": "නැවුම් කරන්න", - "poll.total_people": "{count, plural, one {# person} other {# people}}", - "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", + "poll.total_people": "{count, plural, one {# පුද්ගලයා} other {# මහජන}}", + "poll.total_votes": "{count, plural, one {# ඡන්දය} other {ඡන්ද #}}", "poll.vote": "මනාපය", - "poll.voted": "You voted for this answer", - "poll.votes": "{votes, plural, one {# vote} other {# votes}}", - "poll_button.add_poll": "Add a poll", - "poll_button.remove_poll": "Remove poll", - "privacy.change": "Adjust status privacy", - "privacy.direct.long": "Visible for mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Visible for followers only", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", - "privacy.public.short": "ප්රසිද්ධ", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", - "privacy.unlisted.short": "Unlisted", + "poll.voted": "ඔබ මෙම පිළිතුරට ඡන්දය දුන්නා", + "poll.votes": "{votes, plural, one {# ඡන්දය} other {ඡන්ද #}}", + "poll_button.add_poll": "මත විමසුමක් එක් කරන්න", + "poll_button.remove_poll": "ඡන්ද විමසීම ඉවත් කරන්න", + "privacy.change": "තත්ත්වයේ පෞද්ගලිකත්වය සීරුමාරු කරන්න", + "privacy.direct.long": "සඳහන් කළ පරිශීලකයින් සඳහා පමණක් දෘශ්යමාන වේ", + "privacy.direct.short": "සඳහන් කළ පුද්ගලයන් පමණි", + "privacy.private.long": "අනුගාමිකයින් සඳහා පමණක් දෘශ්යමාන වේ", + "privacy.private.short": "අනුගාමිකයින් පමණි", + "privacy.public.long": "සැමට දෘශ්යමානයි", + "privacy.public.short": "ප්රසිද්ධ", + "privacy.unlisted.long": "සැමට දෘශ්යමාන, නමුත් සොයාගැනීමේ විශේෂාංග වලින් ඉවත් විය", + "privacy.unlisted.short": "ලැයිස්තුගත නොකළ", "refresh": "නැවුම් කරන්න", "regeneration_indicator.label": "පූරණය වෙමින්…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "regeneration_indicator.sublabel": "ඔබේ නිවසේ පෝෂණය සූදානම් වෙමින් පවතී!", "relative_time.days": "{number}d", - "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", - "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", - "relative_time.full.just_now": "just now", - "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", - "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", - "relative_time.hours": "{number}h", + "relative_time.full.days": "{number, plural, one {# දින} other {# දින}} පෙර", + "relative_time.full.hours": "{number, plural, one {# පැය} other {# පැය}} පෙර", + "relative_time.full.just_now": "මේ දැන්", + "relative_time.full.minutes": "{number, plural, one {විනාඩි #} other {# මිනිත්තු}} පෙර", + "relative_time.full.seconds": "{number, plural, one {# දෙවැනි} other {# තත්පර}} පෙර", + "relative_time.hours": "පැය {number}", "relative_time.just_now": "දැන්", - "relative_time.minutes": "{number}m", - "relative_time.seconds": "{number}s", + "relative_time.minutes": "මීටර් {number}", + "relative_time.seconds": "{number}තත්", "relative_time.today": "අද", "reply_indicator.cancel": "අවලංගු කරන්න", - "report.block": "Block", - "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", - "report.categories.other": "Other", - "report.categories.spam": "Spam", - "report.categories.violation": "Content violates one or more server rules", - "report.category.subtitle": "Choose the best match", - "report.category.title": "Tell us what's going on with this {type}", - "report.category.title_account": "profile", - "report.category.title_status": "post", - "report.close": "Done", - "report.comment.title": "Is there anything else you think we should know?", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.mute": "Mute", - "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.", - "report.next": "Next", + "report.block": "අවහිර කරන්න", + "report.block_explanation": "ඔබට ඔවුන්ගේ පෝස්ට් නොපෙනේ. ඔවුන්ට ඔබේ පළ කිරීම් බැලීමට හෝ ඔබව අනුගමනය කිරීමට නොහැකි වනු ඇත. ඔවුන් අවහිර කර ඇති බව ඔවුන්ට පැවසිය හැකිය.", + "report.categories.other": "වෙනත්", + "report.categories.spam": "ආයාචිත තැපැල්", + "report.categories.violation": "අන්තර්ගතය සේවාදායක නීති එකක් හෝ කිහිපයක් උල්ලංඝනය කරයි", + "report.category.subtitle": "හොඳම ගැලපීම තෝරන්න", + "report.category.title": "මෙම {type}සමඟ සිදුවන්නේ කුමක්දැයි අපට කියන්න", + "report.category.title_account": "පැතිකඩ", + "report.category.title_status": "තැපැල්", + "report.close": "කළා", + "report.comment.title": "අප දැනගත යුතු යැයි ඔබ සිතන තවත් යමක් තිබේද?", + "report.forward": "{target}වෙත යොමු කරන්න", + "report.forward_hint": "ගිණුම වෙනත් සේවාදායකයකින්. වාර්තාවේ නිර්නාමික පිටපතක් එතනටත් එවන්න?", + "report.mute": "නිහඬ කරන්න", + "report.mute_explanation": "ඔබට ඔවුන්ගේ පෝස්ට් නොපෙනේ. ඔවුන්ට තවමත් ඔබව අනුගමනය කිරීමට සහ ඔබේ පළ කිරීම් දැකීමට හැකි අතර ඒවා නිශ්ශබ්ද කර ඇති බව නොදැනේ.", + "report.next": "ඊළඟ", "report.placeholder": "අමතර අදහස්", - "report.reasons.dislike": "I don't like it", - "report.reasons.dislike_description": "It is not something you want to see", - "report.reasons.other": "It's something else", - "report.reasons.other_description": "The issue does not fit into other categories", - "report.reasons.spam": "It's spam", - "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", - "report.reasons.violation": "It violates server rules", - "report.reasons.violation_description": "You are aware that it breaks specific rules", - "report.rules.subtitle": "Select all that apply", - "report.rules.title": "Which rules are being violated?", - "report.statuses.subtitle": "Select all that apply", - "report.statuses.title": "Are there any posts that back up this report?", + "report.reasons.dislike": "මම ඒකට කැමති නැහැ", + "report.reasons.dislike_description": "ඒක බලන්න ඕන දෙයක් නෙවෙයි", + "report.reasons.other": "ඒක වෙන දෙයක්", + "report.reasons.other_description": "ගැටළුව වෙනත් වර්ග වලට නොගැලපේ", + "report.reasons.spam": "එය අයාචිත තැපැල් ය", + "report.reasons.spam_description": "අනිෂ්ට සබැඳි, ව්යාජ නියැලීම, හෝ පුනරාවර්තන පිළිතුරු", + "report.reasons.violation": "එය සේවාදායක නීති උල්ලංඝනය කරයි", + "report.reasons.violation_description": "එය නිශ්චිත නීති කඩ කරන බව ඔබ දන්නවා", + "report.rules.subtitle": "අදාළ සියල්ල තෝරන්න", + "report.rules.title": "කුමන නීති උල්ලංඝනය කරන්නේද?", + "report.statuses.subtitle": "අදාළ සියල්ල තෝරන්න", + "report.statuses.title": "මෙම වාර්තාව උපස්ථ කරන පෝස්ට් තිබේද?", "report.submit": "යොමන්න", - "report.target": "Report {target}", - "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", - "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", - "report.thanks.title": "Don't want to see this?", - "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", - "report.unfollow": "Unfollow @{name}", - "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report.target": "වාර්තාව {target}", + "report.thanks.take_action": "Mastodon හි ඔබ දකින දේ පාලනය කිරීම සඳහා ඔබේ විකල්ප මෙන්න:", + "report.thanks.take_action_actionable": "අපි මෙය සමාලෝචනය කරන අතරතුර, ඔබට @{name}ට එරෙහිව පියවර ගත හැක:", + "report.thanks.title": "මේක බලන්න ඕන නැද්ද?", + "report.thanks.title_actionable": "වාර්තා කිරීමට ස්තූතියි, අපි මේ ගැන සොයා බලමු.", + "report.unfollow": "@{name}අනුගමනය නොකරන්න", + "report.unfollow_explanation": "ඔබ මෙම ගිණුම අනුගමනය කරයි. ඔබේ නිවසේ සංග්රහයේ ඔවුන්ගේ පළ කිරීම් තවදුරටත් නොදැකීමට, ඒවා අනුගමනය නොකරන්න.", + "report_notification.attached_statuses": "{count, plural, one {{count} තැපැල්} other {{count} තනතුරු}} අමුණා ඇත", + "report_notification.categories.other": "වෙනත්", + "report_notification.categories.spam": "ආයාචිත තැපැල්", + "report_notification.categories.violation": "රීති උල්ලංඝනය කිරීම", + "report_notification.open": "විවෘත වාර්තාව", "search.placeholder": "සොයන්න", - "search_popout.search_format": "Advanced search format", - "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.search_format": "උසස් සෙවුම් ආකෘතිය", + "search_popout.tips.full_text": "සරල පෙළ ඔබ ලියා ඇති, ප්රිය කළ, වැඩි කළ හෝ සඳහන් කර ඇති තත්ත්වයන් මෙන්ම ගැළපෙන පරිශීලක නාම, සංදර්ශක නම් සහ හැෂ් ටැග් ලබා දෙයි.", + "search_popout.tips.hashtag": "හෑෂ් ටැගය", + "search_popout.tips.status": "තත්ත්වය", + "search_popout.tips.text": "සරල පෙළ ගැළපෙන සංදර්ශක නම්, පරිශීලක නාම සහ හැෂ් ටැග් ලබා දෙයි", "search_popout.tips.user": "පරිශීලක", "search_results.accounts": "මිනිසුන්", - "search_results.all": "All", - "search_results.hashtags": "Hashtags", - "search_results.nothing_found": "Could not find anything for these search terms", - "search_results.statuses": "Toots", - "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", - "search_results.total": "{count, number} {count, plural, one {result} other {results}}", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "search_results.all": "සියලුම", + "search_results.hashtags": "හැෂ් ටැග්", + "search_results.nothing_found": "මෙම සෙවුම් පද සඳහා කිසිවක් සොයාගත නොහැකි විය", + "search_results.statuses": "ටූට්ස්", + "search_results.statuses_fts_disabled": "මෙම Mastodon සේවාදායකයේ ඒවායේ අන්තර්ගතය අනුව මෙවලම් සෙවීම සබල නොවේ.", + "search_results.total": "{count, number} {count, plural, one {ප්රතිඵලය} other {ප්රතිපල}}", + "status.admin_account": "@{name}සඳහා මධ්යස්ථ අතුරුමුහුණත විවෘත කරන්න", + "status.admin_status": "මධ්යස්ථ අතුරුමුහුණතෙහි මෙම තත්ත්වය විවෘත කරන්න", "status.block": "@{name} අවහිර කරන්න", "status.bookmark": "පොත් යොමුව", "status.cancel_reblog_private": "Unboost", - "status.cannot_reblog": "This post cannot be boosted", - "status.copy": "Copy link to status", - "status.delete": "Delete", - "status.detailed_status": "Detailed conversation view", + "status.cannot_reblog": "මෙම තනතුර වැඩි කළ නොහැක", + "status.copy": "තත්වයට සබැඳිය පිටපත් කරන්න", + "status.delete": "මකන්න", + "status.detailed_status": "සවිස්තරාත්මක සංවාද දසුන", "status.direct": "@{name} සෘජු පණිවිඩය", - "status.edit": "Edit", - "status.edited": "Edited {date}", - "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", + "status.edit": "සංස්කරණය කරන්න", + "status.edited": "සංස්කරණය {date}", + "status.edited_x_times": "සංස්කරණය කළා {count, plural, one {{count} කාලය} other {{count} වාර}}", "status.embed": "එබ්බවූ", "status.favourite": "ප්රියතම", "status.filtered": "පෙරන ලද", - "status.history.created": "{name} created {date}", - "status.history.edited": "{name} edited {date}", + "status.hide": "Hide toot", + "status.history.created": "{name} නිර්මාණය {date}", + "status.history.edited": "{name} සංස්කරණය {date}", "status.load_more": "තව පූරණය කරන්න", - "status.media_hidden": "මාධ්ය සඟවා ඇත", + "status.media_hidden": "මාධ්ය සංගුවා ඇත", "status.mention": "@{name} සැඳහුම", "status.more": "තව", - "status.mute": "@{name} නිහඬ කරන්න", - "status.mute_conversation": "සංවාදය නිහඬ කරන්න", - "status.open": "Expand this status", - "status.pin": "Pin on profile", - "status.pinned": "Pinned toot", + "status.mute": "@{name} කරන්න", + "status.mute_conversation": "සංවාදයෙන් කරන්න", + "status.open": "මෙම තත්ත්වය පුළුල් කරන්න", + "status.pin": "පැතිකඩ මත අමුණන්න", + "status.pinned": "පින් කළ දත", "status.read_more": "තව කියවන්න", - "status.reblog": "Boost", - "status.reblog_private": "Boost with original visibility", - "status.reblogged_by": "{name} boosted", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", + "status.reblog": "බූස්ට් කරන්න", + "status.reblog_private": "මුල් දෘශ්යතාව සමඟ වැඩි කරන්න", + "status.reblogged_by": "{name} වැඩි කරන ලදී", + "status.reblogs.empty": "තාම කවුරුත් මේ toot එක boost කරලා නැහැ. යමෙකු එසේ කළ විට, ඔවුන් මෙහි පෙන්වනු ඇත.", + "status.redraft": "මකන්න සහ නැවත කෙටුම්පත", "status.remove_bookmark": "පොත්යොමුව ඉවත් කරන්න", "status.reply": "පිළිතුරු", - "status.replyAll": "Reply to thread", + "status.replyAll": "ත්රෙඩ් එකට පිළිතුරු දෙන්න", "status.report": "@{name} වාර්තා කරන්න", "status.sensitive_warning": "සංවේදී අන්තර්ගතයකි", "status.share": "බෙදාගන්න", + "status.show_filter_reason": "Show anyway", "status.show_less": "අඩුවෙන් පෙන්වන්න", - "status.show_less_all": "Show less for all", + "status.show_less_all": "සියල්ලටම අඩුවෙන් පෙන්වන්න", "status.show_more": "තව පෙන්වන්න", - "status.show_more_all": "Show more for all", - "status.show_thread": "Show thread", - "status.uncached_media_warning": "Not available", - "status.unmute_conversation": "Unmute conversation", - "status.unpin": "Unpin from profile", - "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", - "tabs_bar.federated_timeline": "Federated", + "status.show_more_all": "සියල්ල සඳහා තවත් පෙන්වන්න", + "status.show_thread": "නූල් පෙන්වන්න", + "status.uncached_media_warning": "ලද නොහැක", + "status.unmute_conversation": "සංවාදය නිහඬ නොකරන්න", + "status.unpin": "පැතිකඩෙන් ඉවත් කරන්න", + "suggestions.dismiss": "යෝජනාව ඉවත ලන්න", + "suggestions.header": "ඔබ…ගැන උනන්දු විය හැකිය", + "tabs_bar.federated_timeline": "ෆෙඩරල්", "tabs_bar.home": "මුල් පිටුව", "tabs_bar.local_timeline": "ස්ථානීය", "tabs_bar.notifications": "දැනුම්දීම්", "tabs_bar.search": "සොයන්න", - "time_remaining.days": "{number, plural, one {# day} other {# days}} left", - "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", - "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", - "time_remaining.moments": "Moments remaining", - "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", - "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", - "timeline_hint.resources.followers": "Followers", - "timeline_hint.resources.follows": "Follows", - "timeline_hint.resources.statuses": "Older toots", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", - "trends.trending_now": "Trending now", - "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", - "units.short.billion": "{count}B", - "units.short.million": "{count}M", - "units.short.thousand": "{count}K", + "time_remaining.days": "{number, plural, one {# දින} other {# දින}} අත්හැරියා", + "time_remaining.hours": "{number, plural, one {# පැය} other {# පැය}} අත්හැරියා", + "time_remaining.minutes": "{number, plural, one {විනාඩි #} other {# මිනිත්තු}} අත්හැරියා", + "time_remaining.moments": "ඉතිරිව ඇති මොහොත", + "time_remaining.seconds": "{number, plural, one {# දෙවැනි} other {# තත්පර}} අත්හැරියා", + "timeline_hint.remote_resource_not_displayed": "වෙනත් සේවාදායකයන්ගෙන් {resource} දර්ශනය නොවේ.", + "timeline_hint.resources.followers": "අනුගාමිකයින්", + "timeline_hint.resources.follows": "පහත සඳහන්", + "timeline_hint.resources.statuses": "පැරණි දත්", + "trends.counter_by_accounts": "{count, plural, one {{counter} පුද්ගලයා} other {{counter} මහජන}} කතා කරනවා", + "trends.trending_now": "දැන් ප්රවණතාවය", + "ui.beforeunload": "ඔබ Mastodon හැර ගියහොත් ඔබේ කෙටුම්පත නැති වනු ඇත.", + "units.short.billion": "{count}බී", + "units.short.million": "{count}එම්", + "units.short.thousand": "{count}කි", "upload_area.title": "උඩුගත කිරීමට ඇද දමන්න", - "upload_button.label": "Add images, a video or an audio file", - "upload_error.limit": "ගොනුව උඩුගත කළ හැකි සීමාව ඉක්මවා ඇත.", - "upload_error.poll": "File upload not allowed with polls.", - "upload_form.audio_description": "Describe for people with hearing loss", - "upload_form.description": "Describe for the visually impaired", - "upload_form.description_missing": "No description added", + "upload_button.label": "පින්තූර, වීඩියෝවක් හෝ ශ්රව්ය ගොනුවක් එක් කරන්න", + "upload_error.limit": "ගොනුව උඩුගත කළ හැකි සීමාවන් ඇත.", + "upload_error.poll": "ඡන්ද විමසීම් සමඟ ගොනු උඩුගත කිරීමට අවසර නැත.", + "upload_form.audio_description": "ශ්රවණාබාධ ඇති පුද්ගලයන් සඳහා විස්තර කරන්න", + "upload_form.description": "දෘශ්යාබාධිතයන් සඳහා විස්තර කරන්න", + "upload_form.description_missing": "විස්තරයක් එක් කර නැත", "upload_form.edit": "සංස්කරණය", - "upload_form.thumbnail": "Change thumbnail", - "upload_form.undo": "Delete", - "upload_form.video_description": "Describe for people with hearing loss or visual impairment", + "upload_form.thumbnail": "සිඟිති රුව වෙනස් කරන්න", + "upload_form.undo": "මකන්න", + "upload_form.video_description": "ශ්රවණාබාධ හෝ දෘශ්යාබාධිත පුද්ගලයන් සඳහා විස්තර කරන්න", "upload_modal.analyzing_picture": "පින්තූරය විශ්ලේෂණය කරමින්…", "upload_modal.apply": "යොදන්න", - "upload_modal.applying": "Applying…", - "upload_modal.choose_image": "පින්තුරයක් තෝරන්න", - "upload_modal.description_placeholder": "කඩිසර දුඹුරු හිවලෙක් කම්මැලි බල්ලා මතින් පනී", - "upload_modal.detect_text": "පින්තූරයෙන් පාඨ හඳුනාගන්න", + "upload_modal.applying": "…යෙදීම", + "upload_modal.choose_image": "පින්තුරයක් තෝරාගන්න", + "upload_modal.description_placeholder": "කඩිසර හා හිවලෙක් කම්මැලි බල්ලා මතින් පනී", + "upload_modal.detect_text": "පින්තූරයෙන් හඳුනාගන්න", "upload_modal.edit_media": "මාධ්ය සංස්කරණය", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preparing_ocr": "Preparing OCR…", + "upload_modal.hint": "සියලුම සිඟිති රූ මත සැම විටම දර්ශනය වන නාභි ලක්ෂ්යය තේරීමට පෙරදසුනෙහි රවුම ක්ලික් කරන්න හෝ අදින්න.", + "upload_modal.preparing_ocr": "OCR…සූදානම් කරමින්", "upload_modal.preview_label": "පෙරදසුන ({ratio})", "upload_progress.label": "උඩුගත වෙමින්...", - "video.close": "දෘශ්යකය වසන්න", + "video.close": "දෘශ්යයක් වසන්න", "video.download": "ගොනුව බාගන්න", "video.exit_fullscreen": "පූර්ණ තිරයෙන් පිටවන්න", - "video.expand": "Expand video", + "video.expand": "වීඩියෝව දිග හරින්න", "video.fullscreen": "පූර්ණ තිරය", - "video.hide": "දෘශ්යකය සඟවන්න", - "video.mute": "Mute sound", + "video.hide": "දෘශ්යය සඟවන්න", + "video.mute": "ශබ්දය නිශ්ශබ්ද කරන්න", "video.pause": "විරාමය", "video.play": "ධාවනය", - "video.unmute": "Unmute sound" + "video.unmute": "ශබ්දය නිශ්ශබ්ද කරන්න" } diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 861722c2f..46873d31c 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -268,7 +268,7 @@ "lightbox.next": "Ďalšie", "lightbox.previous": "Predchádzajúci", "limited_account_hint.action": "Ukáž profil aj tak", - "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", + "limited_account_hint.title": "Tento profil bol ukrytý správcami tvojho servera.", "lists.account.add": "Pridaj do zoznamu", "lists.account.remove": "Odober zo zoznamu", "lists.delete": "Vymaž list", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Nastavenia", "navigation_bar.public_timeline": "Federovaná časová os", "navigation_bar.security": "Zabezbečenie", + "notification.admin.report": "{name} nahlásil/a {target}", "notification.admin.sign_up": "{name} sa zaregistroval/a", "notification.favourite": "{name} si obľúbil/a tvoj príspevok", "notification.follow": "{name} ťa začal/a následovať", @@ -326,6 +327,7 @@ "notification.update": "{name} upravil/a príspevok", "notifications.clear": "Vyčisti oboznámenia", "notifications.clear_confirmation": "Naozaj chceš nenávratne prečistiť všetky tvoje oboznámenia?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Nové registrácie:", "notifications.column_settings.alert": "Oboznámenia na ploche", "notifications.column_settings.favourite": "Obľúbené:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Nesleduj @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Hľadaj", "search_popout.search_format": "Pokročilé vyhľadávanie", "search_popout.tips.full_text": "Vráti jednoduchý textový výpis príspevkov ktoré si napísal/a, ktoré si obľúbil/a, povýšil/a, alebo aj tých, v ktorých si bol/a spomenutý/á, a potom všetky zadaniu odpovedajúce prezývky, mená a haštagy.", @@ -461,6 +468,7 @@ "status.embed": "Vložiť", "status.favourite": "Páči sa mi", "status.filtered": "Filtrované", + "status.hide": "Hide toot", "status.history.created": "{name} vytvoril/a {date}", "status.history.edited": "{name} upravil/a {date}", "status.load_more": "Ukáž viac", @@ -484,6 +492,7 @@ "status.report": "Nahlás @{name}", "status.sensitive_warning": "Chúlostivý obsah", "status.share": "Zdieľaj", + "status.show_filter_reason": "Show anyway", "status.show_less": "Zobraz menej", "status.show_less_all": "Všetkým ukáž menej", "status.show_more": "Ukáž viac", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index b094abfff..6e7368592 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Nastavitve", "navigation_bar.public_timeline": "Združena časovnica", "navigation_bar.security": "Varnost", + "notification.admin.report": "{name} je prijavil/a {target}", "notification.admin.sign_up": "{name} se je vpisal/a", "notification.favourite": "{name} je vzljubil/a vaš status", "notification.follow": "{name} vam sledi", @@ -326,6 +327,7 @@ "notification.update": "{name} je uredil(a) objavo", "notifications.clear": "Počisti obvestila", "notifications.clear_confirmation": "Ali ste prepričani, da želite trajno izbrisati vsa vaša obvestila?", + "notifications.column_settings.admin.report": "Nove prijave:", "notifications.column_settings.admin.sign_up": "Novi vpisi:", "notifications.column_settings.alert": "Namizna obvestila", "notifications.column_settings.favourite": "Priljubljeni:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Hvala za poročilo, bomo preverili.", "report.unfollow": "Ne sledi več @{name}", "report.unfollow_explanation": "Temu računu sledite. Da ne boste več videli njegovih objav v svojem domačem viru, mu prenehajte slediti.", + "report_notification.attached_statuses": "{count, plural, one {{count} objava pripeta} two {{count} objavi pripeti} few {{count} objave pripete} other {{count} objav pripetih}}", + "report_notification.categories.other": "Drugo", + "report_notification.categories.spam": "Neželeno", + "report_notification.categories.violation": "Kršitev pravila", + "report_notification.open": "Odpri prijavo", "search.placeholder": "Iskanje", "search_popout.search_format": "Napredna oblika iskanja", "search_popout.tips.full_text": "Enostavno besedilo vrne objave, ki ste jih napisali, vzljubili, izpostavili ali ste bili v njih omenjeni, kot tudi ujemajoča se uporabniška imena, prikazna imena in ključnike.", @@ -461,6 +468,7 @@ "status.embed": "Vgradi", "status.favourite": "Priljubljen", "status.filtered": "Filtrirano", + "status.hide": "Skrij tut", "status.history.created": "{name}: ustvarjeno {date}", "status.history.edited": "{name}: urejeno {date}", "status.load_more": "Naloži več", @@ -484,6 +492,7 @@ "status.report": "Prijavi @{name}", "status.sensitive_warning": "Občutljiva vsebina", "status.share": "Deli", + "status.show_filter_reason": "Vseeno pokaži", "status.show_less": "Prikaži manj", "status.show_less_all": "Prikaži manj za vse", "status.show_more": "Prikaži več", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index ba354e98b..4aa70477d 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Parapëlqime", "navigation_bar.public_timeline": "Rrjedhë kohore të federuarish", "navigation_bar.security": "Siguri", + "notification.admin.report": "{name} raportoi {target}", "notification.admin.sign_up": "{name} u regjistrua", "notification.favourite": "{name} pëlqeu mesazhin tuaj", "notification.follow": "{name} zuri t’ju ndjekë", @@ -326,6 +327,7 @@ "notification.update": "{name} përpunoi një postim", "notifications.clear": "Spastroji njoftimet", "notifications.clear_confirmation": "Jeni i sigurt se doni të spastrohen përgjithmonë krejt njoftimet tuaja?", + "notifications.column_settings.admin.report": "Raportime të reja:", "notifications.column_settings.admin.sign_up": "Regjistrime të reja:", "notifications.column_settings.alert": "Njoftime desktopi", "notifications.column_settings.favourite": "Të parapëlqyer:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Faleminderit për raportimin, do ta shohim.", "report.unfollow": "Mos e ndiq më @{name}", "report.unfollow_explanation": "Po e ndiqni këtë llogari. Për të mos parë më postimet e tyre te prurja juaj e kreut, ndalni ndjekjen e tyre.", + "report_notification.attached_statuses": "{count, plural, one {{count} postim} other {{count} postime}} bashkëngjitur", + "report_notification.categories.other": "Tjetër", + "report_notification.categories.spam": "I padëshiruar", + "report_notification.categories.violation": "Cenim rregullash", + "report_notification.open": "Hape raportimin", "search.placeholder": "Kërkoni", "search_popout.search_format": "Format kërkimi të mëtejshëm", "search_popout.tips.full_text": "Kërkimi për tekst të thjeshtë përgjigjet me mesazhe që keni shkruar, parapëlqyer, përforcuar, ose ku jeni përmendur, si dhe emra përdoruesish, emra ekrani dhe hashtag-ë që kanë përputhje me termin e kërkimit.", @@ -461,6 +468,7 @@ "status.embed": "Trupëzim", "status.favourite": "I parapëlqyer", "status.filtered": "I filtruar", + "status.hide": "Fshihe mesazhin", "status.history.created": "{name} u krijua më {date}", "status.history.edited": "{name} u përpunua më {date}", "status.load_more": "Ngarko më tepër", @@ -484,6 +492,7 @@ "status.report": "Raportojeni @{name}", "status.sensitive_warning": "Lëndë rezervat", "status.share": "Ndajeni me të tjerë", + "status.show_filter_reason": "Shfaqe, sido qoftë", "status.show_less": "Shfaq më pak", "status.show_less_all": "Shfaq më pak për të tërë", "status.show_more": "Shfaq më tepër", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 498cbf963..4dedb58bb 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Podešavanja", "navigation_bar.public_timeline": "Federisana lajna", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} je stavio Vaš status kao omiljeni", "notification.follow": "{name} Vas je zapratio", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Očisti obaveštenja", "notifications.clear_confirmation": "Da li ste sigurno da trajno želite da očistite Vaša obaveštenja?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Obaveštenja na radnoj površini", "notifications.column_settings.favourite": "Omiljeni:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Pretraga", "search_popout.search_format": "Napredni format pretrage", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Ugradi na sajt", "status.favourite": "Omiljeno", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Učitaj još", @@ -484,6 +492,7 @@ "status.report": "Prijavi korisnika @{name}", "status.sensitive_warning": "Osetljiv sadržaj", "status.share": "Podeli", + "status.show_filter_reason": "Show anyway", "status.show_less": "Prikaži manje", "status.show_less_all": "Show less for all", "status.show_more": "Prikaži više", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 1e6ec2086..42ae479da 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Подешавања", "navigation_bar.public_timeline": "Здружена временска линија", "navigation_bar.security": "Безбедност", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} је ставио/ла Ваш статус као омиљени", "notification.follow": "{name} Вас је запратио/ла", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Очисти обавештења", "notifications.clear_confirmation": "Да ли сте сигурно да трајно желите да очистите Ваша обавештења?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Обавештења на радној површини", "notifications.column_settings.favourite": "Омиљени:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Претрага", "search_popout.search_format": "Напредни формат претраге", "search_popout.tips.full_text": "Једноставан текст враћа статусе које сте написали, фаворизовали, подржали или били поменути, као и подударање корисничких имена, приказаних имена, и тараба.", @@ -461,6 +468,7 @@ "status.embed": "Угради на сајт", "status.favourite": "Омиљено", "status.filtered": "Филтрирано", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Учитај још", @@ -484,6 +492,7 @@ "status.report": "Пријави корисника @{name}", "status.sensitive_warning": "Осетљив садржај", "status.share": "Подели", + "status.show_filter_reason": "Show anyway", "status.show_less": "Прикажи мање", "status.show_less_all": "Прикажи мање за све", "status.show_more": "Прикажи више", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index f7a5850c8..854d9aded 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Inställningar", "navigation_bar.public_timeline": "Federerad tidslinje", "navigation_bar.security": "Säkerhet", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} registrerade sig", "notification.favourite": "{name} favoriserade din status", "notification.follow": "{name} följer dig", @@ -326,6 +327,7 @@ "notification.update": "{name} redigerade ett inlägg", "notifications.clear": "Rensa aviseringar", "notifications.clear_confirmation": "Är du säker på att du vill rensa alla dina aviseringar permanent?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "Nya registreringar:", "notifications.column_settings.alert": "Skrivbordsaviseringar", "notifications.column_settings.favourite": "Favoriter:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Tack för att du rapporterar, vi kommer att titta på detta.", "report.unfollow": "Sluta följ @{username}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Sök", "search_popout.search_format": "Avancerat sökformat", "search_popout.tips.full_text": "Enkel text returnerar statusar där du har skrivit, favoriserat, knuffat eller nämnts samt med matchande användarnamn, visningsnamn och hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Bädda in", "status.favourite": "Favorit", "status.filtered": "Filtrerat", + "status.hide": "Hide toot", "status.history.created": "{name} skapade {date}", "status.history.edited": "{name} redigerade {date}", "status.load_more": "Ladda fler", @@ -484,6 +492,7 @@ "status.report": "Rapportera @{name}", "status.sensitive_warning": "Känsligt innehåll", "status.share": "Dela", + "status.show_filter_reason": "Show anyway", "status.show_less": "Visa mindre", "status.show_less_all": "Visa mindre för alla", "status.show_more": "Visa mer", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index 658a3318e..13cb39de8 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 68b11b61b..6491ff7b7 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "விருப்பங்கள்", "navigation_bar.public_timeline": "கூட்டாட்சி காலக்கெடு", "navigation_bar.security": "பத்திரம்", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} ஆர்வம் கொண்டவர், உங்கள் நிலை", "notification.follow": "{name} உங்களைப் பின்தொடர்கிறார்", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "அறிவிப்புகளை அழிக்கவும்", "notifications.clear_confirmation": "உங்கள் எல்லா அறிவிப்புகளையும் நிரந்தரமாக அழிக்க விரும்புகிறீர்களா?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "டெஸ்க்டாப் அறிவிப்புகள்", "notifications.column_settings.favourite": "பிடித்தவை:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "தேடு", "search_popout.search_format": "மேம்பட்ட தேடல் வடிவம்", "search_popout.tips.full_text": "எளிமையான உரை நீங்கள் எழுதப்பட்ட, புகழ், அதிகரித்தது, அல்லது குறிப்பிட்டுள்ள, அதே போல் பயனர் பெயர்கள், காட்சி பெயர்கள், மற்றும் ஹேஸ்டேகைகளை கொண்டுள்ளது என்று நிலைகளை கொடுக்கிறது.", @@ -461,6 +468,7 @@ "status.embed": "கிடத்து", "status.favourite": "விருப்பத்துக்குகந்த", "status.filtered": "வடிகட்டு", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "அதிகமாய் ஏற்று", @@ -484,6 +492,7 @@ "status.report": "@{name} மீது புகாரளி", "status.sensitive_warning": "உணர்திறன் உள்ளடக்கம்", "status.share": "பங்கிடு", + "status.show_filter_reason": "Show anyway", "status.show_less": "குறைவாகக் காண்பி", "status.show_less_all": "அனைத்தையும் குறைவாக காட்டு", "status.show_more": "மேலும் காட்ட", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index 89683cb63..268ce7ef7 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index c84ecd00d..f2312ee12 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "ప్రాధాన్యతలు", "navigation_bar.public_timeline": "సమాఖ్య కాలక్రమం", "navigation_bar.security": "భద్రత", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} మీ స్టేటస్ ను ఇష్టపడ్డారు", "notification.follow": "{name} మిమ్మల్ని అనుసరిస్తున్నారు", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "ప్రకటనలను తుడిచివేయు", "notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "డెస్క్టాప్ నోటిఫికేషన్లు", "notifications.column_settings.favourite": "ఇష్టపడినవి:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "శోధన", "search_popout.search_format": "అధునాతన శోధన ఆకృతి", "search_popout.tips.full_text": "సాధారణ వచనం మీరు వ్రాసిన, ఇష్టపడే, పెంచబడిన లేదా పేర్కొనబడిన, అలాగే యూజర్పేర్లు, ప్రదర్శన పేర్లు, మరియు హ్యాష్ట్యాగ్లను నమోదు చేసిన హోదాలను అందిస్తుంది.", @@ -461,6 +468,7 @@ "status.embed": "ఎంబెడ్", "status.favourite": "ఇష్టపడు", "status.filtered": "వడకట్టబడిన", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "మరిన్ని లోడ్ చేయి", @@ -484,6 +492,7 @@ "status.report": "@{name}పై ఫిర్యాదుచేయు", "status.sensitive_warning": "సున్నితమైన కంటెంట్", "status.share": "పంచుకోండి", + "status.show_filter_reason": "Show anyway", "status.show_less": "తక్కువ చూపించు", "status.show_less_all": "అన్నిటికీ తక్కువ చూపించు", "status.show_more": "ఇంకా చూపించు", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 5bc08533e..3bcae61b8 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -106,7 +106,7 @@ "compose_form.poll.remove_option": "เอาตัวเลือกนี้ออก", "compose_form.poll.switch_to_multiple": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตหลายตัวเลือก", "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว", - "compose_form.publish": "Publish", + "compose_form.publish": "เผยแพร่", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "บันทึกการเปลี่ยนแปลง", "compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}", @@ -198,7 +198,7 @@ "explore.trending_tags": "แฮชแท็ก", "follow_recommendations.done": "เสร็จสิ้น", "follow_recommendations.heading": "ติดตามผู้คนที่คุณต้องการเห็นโพสต์! นี่คือข้อเสนอแนะบางส่วน", - "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", + "follow_recommendations.lead": "โพสต์จากคนที่คุณติดตามจะแสดงตามลำดับเวลาบนฟีดหลักของคุณ อย่ากลัวที่จะทำผิดพลาด คุณสามารถเลิกติดตามผู้คนได้ง่ายๆ ทุกเมื่อ!", "follow_request.authorize": "อนุญาต", "follow_request.reject": "ปฏิเสธ", "follow_requests.unlocked_explanation": "แม้ว่าไม่มีการล็อคบัญชีของคุณ พนักงานของ {domain} คิดว่าคุณอาจต้องการตรวจทานคำขอติดตามจากบัญชีเหล่านี้ด้วยตนเอง", @@ -268,7 +268,7 @@ "lightbox.next": "ถัดไป", "lightbox.previous": "ก่อนหน้า", "limited_account_hint.action": "แสดงโปรไฟล์ต่อไป", - "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", + "limited_account_hint.title": "โปรไฟล์นี้ถูกซ่อนไว้โดยโมเดอเรเตอร์ของเซิร์ฟเวอร์ของคุณ", "lists.account.add": "เพิ่มไปยังรายการ", "lists.account.remove": "เอาออกจากรายการ", "lists.delete": "ลบรายการ", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "การกำหนดลักษณะ", "navigation_bar.public_timeline": "เส้นเวลาที่ติดต่อกับภายนอก", "navigation_bar.security": "ความปลอดภัย", + "notification.admin.report": "{name} ได้รายงาน {target}", "notification.admin.sign_up": "{name} ได้ลงทะเบียน", "notification.favourite": "{name} ได้ชื่นชอบโพสต์ของคุณ", "notification.follow": "{name} ได้ติดตามคุณ", @@ -326,6 +327,7 @@ "notification.update": "{name} ได้แก้ไขโพสต์", "notifications.clear": "ล้างการแจ้งเตือน", "notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?", + "notifications.column_settings.admin.report": "รายงานใหม่:", "notifications.column_settings.admin.sign_up": "การลงทะเบียนใหม่:", "notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป", "notifications.column_settings.favourite": "รายการโปรด:", @@ -358,7 +360,7 @@ "notifications.permission_denied_alert": "ไม่สามารถเปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป เนื่องจากมีการปฏิเสธสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้", "notifications.permission_required": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากไม่ได้ให้สิทธิอนุญาตที่จำเป็น", "notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", + "notifications_permission_banner.how_to_control": "หากต้องการรับการแจ้งเตือนเมื่อไม่ได้เปิด Mastodon ให้เปิดใช้การแจ้งเตือนบนเดสก์ท็อป คุณสามารถควบคุมได้ตามความต้องการด้วยการโต้ตอบประเภทที่สร้างการแจ้งเตือนบนเดสก์ท็อปผ่านปุ่ม {icon} ด้านบนเมื่อเปิดใช้งาน", "notifications_permission_banner.title": "ไม่พลาดสิ่งใด", "picture_in_picture.restore": "นำกลับมา", "poll.closed": "ปิดแล้ว", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "ขอบคุณสำหรับการรายงาน เราจะตรวจสอบสิ่งนี้", "report.unfollow": "เลิกติดตาม @{name}", "report.unfollow_explanation": "คุณกำลังติดตามบัญชีนี้ เพื่อไม่ให้เห็นโพสต์ของเขาในฟีดหน้าแรกของคุณอีกต่อไป เลิกติดตามเขา", + "report_notification.attached_statuses": "{count, plural, other {{count} โพสต์}}ที่แนบมา", + "report_notification.categories.other": "อื่น ๆ", + "report_notification.categories.spam": "สแปม", + "report_notification.categories.violation": "การละเมิดกฎ", + "report_notification.open": "รายงานที่เปิด", "search.placeholder": "ค้นหา", "search_popout.search_format": "รูปแบบการค้นหาขั้นสูง", "search_popout.tips.full_text": "ข้อความแบบง่ายส่งคืนโพสต์ที่คุณได้เขียน ชื่นชอบ ดัน หรือได้รับการกล่าวถึง ตลอดจนชื่อผู้ใช้, ชื่อที่แสดง และแฮชแท็กที่ตรงกัน", @@ -461,6 +468,7 @@ "status.embed": "ฝัง", "status.favourite": "ชื่นชอบ", "status.filtered": "กรองอยู่", + "status.hide": "ซ่อนโพสต์", "status.history.created": "{name} ได้สร้างเมื่อ {date}", "status.history.edited": "{name} ได้แก้ไขเมื่อ {date}", "status.load_more": "โหลดเพิ่มเติม", @@ -484,6 +492,7 @@ "status.report": "รายงาน @{name}", "status.sensitive_warning": "เนื้อหาที่ละเอียดอ่อน", "status.share": "แบ่งปัน", + "status.show_filter_reason": "แสดงต่อไป", "status.show_less": "แสดงน้อยลง", "status.show_less_all": "แสดงน้อยลงทั้งหมด", "status.show_more": "แสดงเพิ่มเติม", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index c813ee1c2..070bdb95b 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Tercihler", "navigation_bar.public_timeline": "Federe zaman tüneli", "navigation_bar.security": "Güvenlik", + "notification.admin.report": "{name}, {target} kişisini bildirdi", "notification.admin.sign_up": "{name} kaydoldu", "notification.favourite": "{name} gönderini favorilerine ekledi", "notification.follow": "{name} seni takip etti", @@ -326,6 +327,7 @@ "notification.update": "{name} bir gönderiyi düzenledi", "notifications.clear": "Bildirimleri temizle", "notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?", + "notifications.column_settings.admin.report": "Yeni bildirimler:", "notifications.column_settings.admin.sign_up": "Yeni kayıtlar:", "notifications.column_settings.alert": "Masaüstü bildirimleri", "notifications.column_settings.favourite": "Favoriler:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Bildirdiğiniz için teşekkürler, konuyu araştıracağız.", "report.unfollow": "@{name} takip etmeyi bırak", "report.unfollow_explanation": "Bu hesabı takip ediyorsunuz. Ana akışınızda gönderilerini görmek istemiyorsanız, onu takip etmeyi bırakın.", + "report_notification.attached_statuses": "{count, plural, one {{count} gönderi} other {{count} gönderi}} eklendi", + "report_notification.categories.other": "Diğer", + "report_notification.categories.spam": "İstenmeyen", + "report_notification.categories.violation": "Kural ihlali", + "report_notification.open": "Bildirim aç", "search.placeholder": "Ara", "search_popout.search_format": "Gelişmiş arama biçimi", "search_popout.tips.full_text": "Basit metin yazdığınız, beğendiğiniz, teşvik ettiğiniz veya söz edilen gönderilerin yanı sıra kullanıcı adlarını, görünen adları ve hashtag'leri eşleştiren gönderileri de döndürür.", @@ -461,6 +468,7 @@ "status.embed": "Gömülü", "status.favourite": "Favorilerine ekle", "status.filtered": "Filtrelenmiş", + "status.hide": "Hide toot", "status.history.created": "{name} oluşturdu {date}", "status.history.edited": "{name} düzenledi {date}", "status.load_more": "Daha fazlasını yükle", @@ -484,6 +492,7 @@ "status.report": "@{name} adlı kişiyi bildir", "status.sensitive_warning": "Hassas içerik", "status.share": "Paylaş", + "status.show_filter_reason": "Yine de göster", "status.show_less": "Daha az göster", "status.show_less_all": "Hepsi için daha az göster", "status.show_more": "Daha fazlasını göster", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 862325f1c..6ace5e763 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Caylaw", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Хәвефсезлек", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Эзләү", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Уртаклашу", + "status.show_filter_reason": "Show anyway", "status.show_less": "Әзрәк күрсәтү", "status.show_less_all": "Show less for all", "status.show_more": "Күбрәк күрсәтү", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 658a3318e..13cb39de8 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 32d5dce84..4b0bc5e70 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Налаштування", "navigation_bar.public_timeline": "Глобальна стрічка", "navigation_bar.security": "Безпека", + "notification.admin.report": "Скарга від {name} на {target}", "notification.admin.sign_up": "{name} приєдналися", "notification.favourite": "{name} вподобали ваш допис", "notification.follow": "{name} підписалися на вас", @@ -326,6 +327,7 @@ "notification.update": "{name} змінює допис", "notifications.clear": "Очистити сповіщення", "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщення?", + "notifications.column_settings.admin.report": "Нові скарги:", "notifications.column_settings.admin.sign_up": "Нові реєстрації:", "notifications.column_settings.alert": "Сповіщення на комп'ютері", "notifications.column_settings.favourite": "Вподобане:", @@ -425,12 +427,17 @@ "report.statuses.title": "Чи є дописи, які належать до цієї скарги?", "report.submit": "Відправити", "report.target": "Скаржимося на {target}", - "report.thanks.take_action": "Ось ваші варіанти управління тим, що ви бачите в Mastodon:", + "report.thanks.take_action": "Ось ваші варіанти керування тим, що ви бачите в Mastodon:", "report.thanks.take_action_actionable": "Поки ми переглядаємо це, ви можете вжити власних заходів проти @{name}:", "report.thanks.title": "Не хочете це бачити?", "report.thanks.title_actionable": "Дякуємо за скаргу, ми розглянемо її.", "report.unfollow": "Відписатися від @{name}", "report.unfollow_explanation": "Ви підписані на цього користувача. Щоб більше не бачити їхні дописи у вашій стрічці, відпишіться від них.", + "report_notification.attached_statuses": "{count, plural, one {{count} допис} few {{count} дописи} other {{counter} дописів}} прикріплено", + "report_notification.categories.other": "Інше", + "report_notification.categories.spam": "Спам", + "report_notification.categories.violation": "Порушення правил", + "report_notification.open": "Відкрити скаргу", "search.placeholder": "Пошук", "search_popout.search_format": "Розширений формат пошуку", "search_popout.tips.full_text": "Пошук за текстом знаходить статуси, які ви написали, вподобали, передмухнули, або в яких вас згадували. Також він знаходить імена користувачів, реальні імена та хештеґи.", @@ -461,6 +468,7 @@ "status.embed": "Вбудувати", "status.favourite": "Подобається", "status.filtered": "Відфільтровано", + "status.hide": "Сховати дмух", "status.history.created": "{name} створює {date}", "status.history.edited": "{name} змінює {date}", "status.load_more": "Завантажити більше", @@ -484,6 +492,7 @@ "status.report": "Поскаржитися на @{name}", "status.sensitive_warning": "Делікатний зміст", "status.share": "Поділитися", + "status.show_filter_reason": "Усе одно показати", "status.show_less": "Згорнути", "status.show_less_all": "Показувати менше для всіх", "status.show_more": "Розгорнути", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index d4daaceb3..9485dbabf 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "ترجیحات", "navigation_bar.public_timeline": "وفاقی ٹائم لائن", "navigation_bar.security": "سیکورٹی", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} آپ کی پیروی کی", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "اطلاعات ہٹائیں", "notifications.clear_confirmation": "کیا آپ واقعی اپنی تمام اطلاعات کو صاف کرنا چاہتے ہیں؟", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "ڈیسک ٹاپ اطلاعات", "notifications.column_settings.favourite": "پسندیدہ:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "Load more", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "Share", + "status.show_filter_reason": "Show anyway", "status.show_less": "Show less", "status.show_less_all": "Show less for all", "status.show_more": "Show more", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index e4e7c233b..1019c342a 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -92,7 +92,7 @@ "community.column_settings.local_only": "Chỉ máy chủ của bạn", "community.column_settings.media_only": "Chỉ xem media", "community.column_settings.remote_only": "Chỉ người dùng ở máy chủ khác", - "compose.language.change": "Đổi ngôn ngữ", + "compose.language.change": "Chọn ngôn ngữ tút", "compose.language.search": "Tìm ngôn ngữ...", "compose_form.direct_message_warning_learn_more": "Tìm hiểu thêm", "compose_form.encryption_warning": "Các tút trên Mastodon không được mã hóa đầu cuối. Không chia sẻ bất kỳ thông tin nhạy cảm nào qua Mastodon.", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Cài đặt", "navigation_bar.public_timeline": "Thế giới", "navigation_bar.security": "Bảo mật", + "notification.admin.report": "{name} đã báo cáo {target}", "notification.admin.sign_up": "{name} đăng ký máy chủ của bạn", "notification.favourite": "{name} thích tút của bạn", "notification.follow": "{name} theo dõi bạn", @@ -326,6 +327,7 @@ "notification.update": "{name} đã viết lại một tút", "notifications.clear": "Xóa hết thông báo", "notifications.clear_confirmation": "Bạn thật sự muốn xóa vĩnh viễn tất cả thông báo của mình?", + "notifications.column_settings.admin.report": "Báo cáo mới:", "notifications.column_settings.admin.sign_up": "Lượt đăng ký mới:", "notifications.column_settings.alert": "Thông báo trên máy tính", "notifications.column_settings.favourite": "Lượt thích:", @@ -372,12 +374,12 @@ "poll_button.remove_poll": "Hủy cuộc bình chọn", "privacy.change": "Thay đổi quyền riêng tư", "privacy.direct.long": "Chỉ người được nhắc đến mới thấy", - "privacy.direct.short": "Chỉ người được nhắc", + "privacy.direct.short": "Nhắn riêng", "privacy.private.long": "Dành riêng cho người theo dõi", "privacy.private.short": "Chỉ người theo dõi", "privacy.public.long": "Hiển thị với mọi người", "privacy.public.short": "Công khai", - "privacy.unlisted.long": "Hiển thị với mọi người, nhưng không hiện trong tính năng khám phá", + "privacy.unlisted.long": "Công khai nhưng không hiện trên bảng tin", "privacy.unlisted.short": "Hạn chế", "refresh": "Làm mới", "regeneration_indicator.label": "Đang tải…", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Cảm ơn đã báo cáo, chúng tôi sẽ xem xét kỹ.", "report.unfollow": "Ngưng theo dõi @{name}", "report.unfollow_explanation": "Bạn đang theo dõi người này. Để không thấy tút của họ trong bảng tin nữa, hãy ngưng theo dõi.", + "report_notification.attached_statuses": "{count, plural, other {{count} tút}} đính kèm", + "report_notification.categories.other": "Khác", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Vi phạm quy tắc", + "report_notification.open": "Mở báo cáo", "search.placeholder": "Tìm kiếm", "search_popout.search_format": "Gợi ý", "search_popout.tips.full_text": "Nội dung trả về bao gồm những tút mà bạn đã viết, thích, đăng lại hoặc những tút có nhắc đến bạn. Bạn cũng có thể tìm địa chỉ người dùng, tên hiển thị và hashtag.", @@ -461,6 +468,7 @@ "status.embed": "Nhúng", "status.favourite": "Thích", "status.filtered": "Bộ lọc", + "status.hide": "Ẩn tút", "status.history.created": "{name} tạo lúc {date}", "status.history.edited": "{name} sửa lúc {date}", "status.load_more": "Tải thêm", @@ -484,6 +492,7 @@ "status.report": "Báo cáo @{name}", "status.sensitive_warning": "Nhạy cảm", "status.share": "Chia sẻ", + "status.show_filter_reason": "Vẫn cứ xem", "status.show_less": "Thu gọn", "status.show_less_all": "Thu gọn toàn bộ", "status.show_more": "Xem thêm", diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index c6528fbe7..7f1965401 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your status", "notification.follow": "ⵉⴹⴼⴼⴰⵔ ⴽ {name}", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "ⵙⴼⴹ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "ⵔⵣⵓ", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -461,6 +468,7 @@ "status.embed": "Embed", "status.favourite": "Favourite", "status.filtered": "Filtered", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "ⵙⵙⵉⵍⵉ ⵓⴳⴳⴰⵔ", @@ -484,6 +492,7 @@ "status.report": "Report @{name}", "status.sensitive_warning": "Sensitive content", "status.share": "ⴱⴹⵓ", + "status.show_filter_reason": "Show anyway", "status.show_less": "ⵙⵎⴰⵍ ⴷⵔⵓⵙ", "status.show_less_all": "ⵙⵎⴰⵍ ⴷⵔⵓⵙ ⵉ ⵎⴰⵕⵕⴰ", "status.show_more": "ⵙⵎⴰⵍ ⵓⴳⴳⴰⵔ", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index a7bf96f9e..dcb54735f 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "首选项", "navigation_bar.public_timeline": "跨站公共时间轴", "navigation_bar.security": "安全", + "notification.admin.report": "{name} 已报告 {target}", "notification.admin.sign_up": "{name} 注册了", "notification.favourite": "{name} 喜欢了你的嘟文", "notification.follow": "{name} 开始关注你", @@ -326,6 +327,7 @@ "notification.update": "{name} 编辑了嘟文", "notifications.clear": "清空通知列表", "notifications.clear_confirmation": "你确定要永久清空通知列表吗?", + "notifications.column_settings.admin.report": "新报告", "notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.alert": "桌面通知", "notifications.column_settings.favourite": "喜欢:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "感谢提交举报,我们将会进行处理。", "report.unfollow": "取消关注 @{name}", "report.unfollow_explanation": "你正在关注此账户。如果要想在你的主页上不再看到他们的帖子,取消对他们的关注即可。", + "report_notification.attached_statuses": "{count, plural, one {{count} 嘟文} other {{count} 嘟文}} 附件", + "report_notification.categories.other": "其他", + "report_notification.categories.spam": "骚扰", + "report_notification.categories.violation": "违反规则", + "report_notification.open": "展开报告", "search.placeholder": "搜索", "search_popout.search_format": "高级搜索格式", "search_popout.tips.full_text": "输入关键词检索所有你发送、喜欢、转嘟过或提及到你的帖子,以及其他用户公开的用户名、昵称和话题标签。", @@ -461,6 +468,7 @@ "status.embed": "嵌入", "status.favourite": "喜欢", "status.filtered": "已过滤", + "status.hide": "屏蔽嘟文", "status.history.created": "{name} 创建于 {date}", "status.history.edited": "{name} 编辑于 {date}", "status.load_more": "加载更多", @@ -484,6 +492,7 @@ "status.report": "举报 @{name}", "status.sensitive_warning": "敏感内容", "status.share": "分享", + "status.show_filter_reason": "继续显示", "status.show_less": "隐藏内容", "status.show_less_all": "隐藏全部内容", "status.show_more": "显示更多", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index d757b9daf..867ced8d5 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -18,7 +18,7 @@ "account.followers": "關注者", "account.followers.empty": "尚未有人關注這位使用者。", "account.followers_counter": "有 {count, plural,one {{counter} 個} other {{counter} 個}}關注者", - "account.following": "Following", + "account.following": "正在關注", "account.following_counter": "正在關注 {count, plural,one {{counter}}other {{counter} 人}}", "account.follows.empty": "這位使用者尚未關注任何人。", "account.follows_you": "關注你", @@ -41,12 +41,12 @@ "account.statuses_counter": "{count, plural,one {{counter} 篇}other {{counter} 篇}}文章", "account.unblock": "解除對 @{name} 的封鎖", "account.unblock_domain": "解除對域名 {domain} 的封鎖", - "account.unblock_short": "Unblock", + "account.unblock_short": "解除封鎖", "account.unendorse": "不再於個人資料頁面推薦對方", "account.unfollow": "取消關注", "account.unmute": "取消 @{name} 的靜音", "account.unmute_notifications": "取消來自 @{name} 通知的靜音", - "account.unmute_short": "Unmute", + "account.unmute_short": "取消靜音", "account_note.placeholder": "按此添加備注", "admin.dashboard.daily_retention": "User retention rate by day after sign-up", "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", @@ -314,6 +314,7 @@ "navigation_bar.preferences": "偏好設定", "navigation_bar.public_timeline": "跨站時間軸", "navigation_bar.security": "安全", + "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} 喜歡你的文章", "notification.follow": "{name} 開始關注你", @@ -326,6 +327,7 @@ "notification.update": "{name} edited a post", "notifications.clear": "清空通知紀錄", "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?", + "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "顯示桌面通知", "notifications.column_settings.favourite": "你最愛的文章:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.other": "Other", + "report_notification.categories.spam": "Spam", + "report_notification.categories.violation": "Rule violation", + "report_notification.open": "Open report", "search.placeholder": "搜尋", "search_popout.search_format": "高級搜索格式", "search_popout.tips.full_text": "輸入簡單的文字,搜索由你發放、收藏、轉推和提及你的文章,以及符合的使用者名稱,顯示名稱和標籤。", @@ -461,6 +468,7 @@ "status.embed": "嵌入", "status.favourite": "最愛", "status.filtered": "已過濾", + "status.hide": "Hide toot", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", "status.load_more": "載入更多", @@ -484,6 +492,7 @@ "status.report": "舉報 @{name}", "status.sensitive_warning": "敏感內容", "status.share": "分享", + "status.show_filter_reason": "Show anyway", "status.show_less": "收起", "status.show_less_all": "全部收起", "status.show_more": "展開", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 17d0b9998..1589ff09a 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -314,6 +314,7 @@ "navigation_bar.preferences": "偏好設定", "navigation_bar.public_timeline": "聯邦時間軸", "navigation_bar.security": "安全性", + "notification.admin.report": "{name} 檢舉了 {target}", "notification.admin.sign_up": "{name} 已經註冊", "notification.favourite": "{name} 把您的嘟文加入了最愛", "notification.follow": "{name} 跟隨了您", @@ -326,6 +327,7 @@ "notification.update": "{name} 編輯了嘟文", "notifications.clear": "清除通知", "notifications.clear_confirmation": "您確定要永久清除您的通知嗎?", + "notifications.column_settings.admin.report": "新檢舉報告:", "notifications.column_settings.admin.sign_up": "新註冊帳號:", "notifications.column_settings.alert": "桌面通知", "notifications.column_settings.favourite": "最愛:", @@ -431,6 +433,11 @@ "report.thanks.title_actionable": "感謝您的檢舉,我們將會著手處理。", "report.unfollow": "取消跟隨 @{name}", "report.unfollow_explanation": "您正在跟隨此帳號。如不欲於首頁時間軸再見到他們的嘟文,請取消跟隨。", + "report_notification.attached_statuses": "{count, plural, one {{count} 則} other {{count} 則}} 嘟文", + "report_notification.categories.other": "其他", + "report_notification.categories.spam": "垃圾訊息", + "report_notification.categories.violation": "違反規則", + "report_notification.open": "開啟檢舉報告", "search.placeholder": "搜尋", "search_popout.search_format": "進階搜尋格式", "search_popout.tips.full_text": "輸入簡單的文字,搜尋由您撰寫、最愛、轉嘟或提您的嘟文,以及與關鍵詞匹配的使用者名稱、帳號顯示名稱和主題標籤。", @@ -461,6 +468,7 @@ "status.embed": "內嵌", "status.favourite": "最愛", "status.filtered": "已過濾", + "status.hide": "隱藏嘟文", "status.history.created": "{name} 於 {date} 建立", "status.history.edited": "{name} 於 {date} 修改", "status.load_more": "載入更多", @@ -484,6 +492,7 @@ "status.report": "檢舉 @{name}", "status.sensitive_warning": "敏感內容", "status.share": "分享", + "status.show_filter_reason": "仍要顯示", "status.show_less": "減少顯示", "status.show_less_all": "減少顯示這類嘟文", "status.show_more": "顯示更多", diff --git a/app/javascript/mastodon/permissions.js b/app/javascript/mastodon/permissions.js new file mode 100644 index 000000000..752ddd6c5 --- /dev/null +++ b/app/javascript/mastodon/permissions.js @@ -0,0 +1,3 @@ +export const PERMISSION_INVITE_USERS = 0x0000000000010000; +export const PERMISSION_MANAGE_USERS = 0x0000000000000400; +export const PERMISSION_MANAGE_REPORTS = 0x0000000000000010; diff --git a/app/javascript/mastodon/reducers/filters.js b/app/javascript/mastodon/reducers/filters.js index 33f0c6732..14b704027 100644 --- a/app/javascript/mastodon/reducers/filters.js +++ b/app/javascript/mastodon/reducers/filters.js @@ -1,10 +1,34 @@ -import { FILTERS_FETCH_SUCCESS } from '../actions/filters'; -import { List as ImmutableList, fromJS } from 'immutable'; +import { FILTERS_IMPORT } from '../actions/importer'; +import { Map as ImmutableMap, is, fromJS } from 'immutable'; -export default function filters(state = ImmutableList(), action) { +const normalizeFilter = (state, filter) => { + const normalizedFilter = fromJS({ + id: filter.id, + title: filter.title, + context: filter.context, + filter_action: filter.filter_action, + expires_at: filter.expires_at ? Date.parse(filter.expires_at) : null, + }); + + if (is(state.get(filter.id), normalizedFilter)) { + return state; + } else { + return state.set(filter.id, normalizedFilter); + } +}; + +const normalizeFilters = (state, filters) => { + filters.forEach(filter => { + state = normalizeFilter(state, filter); + }); + + return state; +}; + +export default function filters(state = ImmutableMap(), action) { switch(action.type) { - case FILTERS_FETCH_SUCCESS: - return fromJS(action.filters); + case FILTERS_IMPORT: + return normalizeFilters(state, action.filters); default: return state; } diff --git a/app/javascript/mastodon/reducers/meta.js b/app/javascript/mastodon/reducers/meta.js index 65becc44f..5040a340f 100644 --- a/app/javascript/mastodon/reducers/meta.js +++ b/app/javascript/mastodon/reducers/meta.js @@ -7,12 +7,13 @@ const initialState = ImmutableMap({ streaming_api_base_url: null, access_token: null, layout: layoutFromWindow(), + permissions: '0', }); export default function meta(state = initialState, action) { switch(action.type) { case STORE_HYDRATE: - return state.merge(action.state.get('meta')); + return state.merge(action.state.get('meta')).set('permissions', action.state.getIn(['role', 'permissions'])); case APP_LAYOUT_CHANGE: return state.set('layout', action.layout); default: diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index b587b6d0f..4b460bc10 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -28,7 +28,7 @@ import { } from '../actions/app'; import { DOMAIN_BLOCK_SUCCESS } from 'mastodon/actions/domain_blocks'; import { TIMELINE_DELETE, TIMELINE_DISCONNECT } from '../actions/timelines'; -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; +import { fromJS, Map as ImmutableMap, List as ImmutableList } from 'immutable'; import compareId from '../compare_id'; const initialState = ImmutableMap({ @@ -52,6 +52,7 @@ const notificationToMap = notification => ImmutableMap({ account: notification.account.id, created_at: notification.created_at, status: notification.status ? notification.status.id : null, + report: notification.report ? fromJS(notification.report) : null, }); const normalizeNotification = (state, notification, usePendingItems) => { diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js index afffce917..f9d3236e4 100644 --- a/app/javascript/mastodon/reducers/settings.js +++ b/app/javascript/mastodon/reducers/settings.js @@ -39,6 +39,7 @@ const initialState = ImmutableMap({ status: false, update: false, 'admin.sign_up': false, + 'admin.report': false, }), quickFilter: ImmutableMap({ @@ -60,6 +61,7 @@ const initialState = ImmutableMap({ status: true, update: true, 'admin.sign_up': true, + 'admin.report': true, }), sounds: ImmutableMap({ @@ -72,6 +74,7 @@ const initialState = ImmutableMap({ status: true, update: true, 'admin.sign_up': true, + 'admin.report': true, }), }), diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js index 3121774b3..187e3306d 100644 --- a/app/javascript/mastodon/selectors/index.js +++ b/app/javascript/mastodon/selectors/index.js @@ -1,5 +1,5 @@ import { createSelector } from 'reselect'; -import { List as ImmutableList, Map as ImmutableMap, is } from 'immutable'; +import { List as ImmutableList, Map as ImmutableMap } from 'immutable'; import { me } from '../initial_state'; const getAccountBase = (state, id) => state.getIn(['accounts', id], null); @@ -37,52 +37,15 @@ const toServerSideType = columnType => { } }; -const escapeRegExp = string => - string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +const getFilters = (state, { contextType }) => { + if (!contextType) return null; -const regexFromFilters = filters => { - if (filters.size === 0) { - return null; - } - - return new RegExp(filters.map(filter => { - let expr = escapeRegExp(filter.get('phrase')); - - if (filter.get('whole_word')) { - if (/^[\w]/.test(expr)) { - expr = `\\b${expr}`; - } - - if (/[\w]$/.test(expr)) { - expr = `${expr}\\b`; - } - } - - return expr; - }).join('|'), 'i'); -}; - -// Memoize the filter regexps for each valid server contextType -const makeGetFiltersRegex = () => { - let memo = {}; + const serverSideType = toServerSideType(contextType); + const now = new Date(); - return (state, { contextType }) => { - if (!contextType) return ImmutableList(); - - const serverSideType = toServerSideType(contextType); - const filters = state.get('filters', ImmutableList()).filter(filter => filter.get('context').includes(serverSideType) && (filter.get('expires_at') === null || Date.parse(filter.get('expires_at')) > (new Date()))); - - if (!memo[serverSideType] || !is(memo[serverSideType].filters, filters)) { - const dropRegex = regexFromFilters(filters.filter(filter => filter.get('irreversible'))); - const regex = regexFromFilters(filters); - memo[serverSideType] = { filters: filters, results: [dropRegex, regex] }; - } - return memo[serverSideType].results; - }; + return state.get('filters').filter((filter) => filter.get('context').includes(serverSideType) && (filter.get('expires_at') === null || filter.get('expires_at') > now)); }; -export const getFiltersRegex = makeGetFiltersRegex(); - export const makeGetStatus = () => { return createSelector( [ @@ -90,10 +53,10 @@ export const makeGetStatus = () => { (state, { id }) => state.getIn(['statuses', state.getIn(['statuses', id, 'reblog'])]), (state, { id }) => state.getIn(['accounts', state.getIn(['statuses', id, 'account'])]), (state, { id }) => state.getIn(['accounts', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'account'])]), - getFiltersRegex, + getFilters, ], - (statusBase, statusReblog, accountBase, accountReblog, filtersRegex) => { + (statusBase, statusReblog, accountBase, accountReblog, filters) => { if (!statusBase) { return null; } @@ -104,18 +67,21 @@ export const makeGetStatus = () => { statusReblog = null; } - const dropRegex = (accountReblog || accountBase).get('id') !== me && filtersRegex[0]; - if (dropRegex && dropRegex.test(statusBase.get('reblog') ? statusReblog.get('search_index') : statusBase.get('search_index'))) { - return null; + let filtered = false; + if ((accountReblog || accountBase).get('id') !== me && filters) { + let filterResults = statusReblog?.get('filtered') || statusBase.get('filtered') || ImmutableList(); + if (filterResults.some((result) => filters.getIn([result.get('filter'), 'filter_action']) === 'hide')) { + return null; + } + if (!filterResults.isEmpty()) { + filtered = filterResults.map(result => filters.getIn([result.get('filter'), 'title'])); + } } - const regex = (accountReblog || accountBase).get('id') !== me && filtersRegex[1]; - const filtered = regex && regex.test(statusBase.get('reblog') ? statusReblog.get('search_index') : statusBase.get('search_index')); - return statusBase.withMutations(map => { map.set('reblog', statusReblog); map.set('account', accountBase); - map.set('filtered', filtered); + map.set('matched_filters', filtered); }); }, ); @@ -152,14 +118,15 @@ export const getAlerts = createSelector([getAlertsBase], (base) => { return arr; }); -export const makeGetNotification = () => { - return createSelector([ - (_, base) => base, - (state, _, accountId) => state.getIn(['accounts', accountId]), - ], (base, account) => { - return base.set('account', account); - }); -}; +export const makeGetNotification = () => createSelector([ + (_, base) => base, + (state, _, accountId) => state.getIn(['accounts', accountId]), +], (base, account) => base.set('account', account)); + +export const makeGetReport = () => createSelector([ + (_, base) => base, + (state, _, targetAccountId) => state.getIn(['accounts', targetAccountId]), +], (base, targetAccount) => base.set('target_account', targetAccount)); export const getAccountGallery = createSelector([ (state, id) => state.getIn(['timelines', `account:${id}:media`, 'items'], ImmutableList()), diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index be467a8e2..4f60f04c1 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -3,6 +3,7 @@ import loadPolyfills from '../mastodon/load_polyfills'; import ready from '../mastodon/ready'; import { start } from '../mastodon/common'; import loadKeyboardExtensions from '../mastodon/load_keyboard_extensions'; +import 'cocoon-js-vanilla'; start(); diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index 910d35ee0..823b65913 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -209,9 +209,9 @@ font-size: 12px; line-height: 12px; font-weight: 500; - color: $ui-secondary-color; - background-color: rgba($ui-secondary-color, 0.1); - border: 1px solid rgba($ui-secondary-color, 0.5); + color: var(--user-role-accent, $ui-secondary-color); + background-color: var(--user-role-background, rgba($ui-secondary-color, 0.1)); + border: 1px solid var(--user-role-border, rgba($ui-secondary-color, 0.5)); &.moderator { color: $success-green; diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index f4f5bf752..08845123a 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -75,6 +75,13 @@ $content-width: 840px; height: 100px; } + .logo--wordmark { + display: inherit; + margin: inherit; + width: inherit; + height: 20px; + } + @media screen and (max-width: $no-columns-breakpoint) { & > a:first-child { display: none; @@ -924,7 +931,8 @@ a.name-tag, text-align: center; } -.applications-list__item { +.applications-list__item, +.filters-list__item { padding: 15px 0; background: $ui-base-color; border: 1px solid lighten($ui-base-color, 4%); @@ -932,7 +940,12 @@ a.name-tag, margin-top: 15px; } -.announcements-list { +.user-role { + color: var(--user-role-accent); +} + +.announcements-list, +.filters-list { border: 1px solid lighten($ui-base-color, 4%); border-radius: 4px; @@ -967,6 +980,17 @@ a.name-tag, &__meta { padding: 0 15px; color: $dark-text-color; + + a { + color: inherit; + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + } } &__action-bar { @@ -985,6 +1009,33 @@ a.name-tag, } } +.filters-list__item { + &__title { + display: flex; + justify-content: space-between; + margin-bottom: 0; + } + + &__permissions { + margin-top: 0; + margin-bottom: 10px; + } + + .expiration { + font-size: 13px; + } + + &.expired { + .expiration { + color: lighten($error-red, 12%); + } + + .permissions-list__item__icon { + color: $dark-text-color; + } + } +} + .dashboard__counters.admin-account-counters { margin-top: 10px; } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 7ae20fbd9..e9e9a2faa 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -959,6 +959,21 @@ width: 100%; clear: both; border-bottom: 1px solid lighten($ui-base-color, 8%); + + &__button { + display: inline; + color: lighten($ui-highlight-color, 8%); + border: 0; + background: transparent; + padding: 0; + font-size: inherit; + line-height: inherit; + + &:hover, + &:active { + text-decoration: underline; + } + } } .status__prepend-icon-wrapper { @@ -1355,6 +1370,8 @@ a .account__avatar { .account__avatar-overlay { @include avatar-size(48px); + position: relative; + &-base { @include avatar-radius; @include avatar-size(36px); @@ -1620,6 +1637,33 @@ a.account__display-name { } } +.notification__report { + padding: 8px 10px; + padding-left: 68px; + position: relative; + border-bottom: 1px solid lighten($ui-base-color, 8%); + min-height: 54px; + + &__details { + display: flex; + justify-content: space-between; + align-items: center; + color: $darker-text-color; + font-size: 15px; + line-height: 22px; + + strong { + font-weight: 500; + } + } + + &__avatar { + position: absolute; + left: 10px; + top: 10px; + } +} + .notification__message { margin: 0 10px 0 68px; padding: 8px 0 0; @@ -1739,10 +1783,14 @@ a.account__display-name { object-fit: contain; } - .loading-bar { + .loading-bar__container { position: relative; } + .loading-bar { + position: absolute; + } + &.image-loader--amorphous .image-loader__preview-canvas { display: none; } @@ -2360,6 +2408,16 @@ a.account__display-name { padding-top: 15px; } + .notification__report { + padding: 15px 15px 15px (48px + 15px * 2); + min-height: 48px + 2px; + + &__avatar { + left: 15px; + top: 17px; + } + } + .status { padding: 15px 15px 15px (48px + 15px * 2); min-height: 48px + 2px; @@ -7185,6 +7243,13 @@ noscript { padding-right: 15px; margin-left: 5px; color: $secondary-text-color; + text-decoration: none; + + &__asterisk { + color: $darker-text-color; + font-size: 18px; + vertical-align: super; + } } &__sparkline { diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 320fa8fef..10bb0b400 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -250,6 +250,10 @@ code { } } + .input.with_block_label.user_role_permissions_as_keys ul { + columns: unset; + } + .input.datetime .label_input select { display: inline-block; width: auto; @@ -1064,3 +1068,34 @@ code { } } } + +.keywords-table { + thead { + th { + white-space: nowrap; + } + + th:first-child { + width: 100%; + } + } + + tfoot { + td { + border: 0; + } + } + + .input.string { + margin-bottom: 0; + } + + .label_input__wrapper { + margin-top: 10px; + } + + .table-action-link { + margin-top: 10px; + white-space: nowrap; + } +} diff --git a/app/lib/activitypub/parser/media_attachment_parser.rb b/app/lib/activitypub/parser/media_attachment_parser.rb index 30bea1f0e..656be84b7 100644 --- a/app/lib/activitypub/parser/media_attachment_parser.rb +++ b/app/lib/activitypub/parser/media_attachment_parser.rb @@ -50,7 +50,7 @@ class ActivityPub::Parser::MediaAttachmentParser components = begin blurhash = @json['blurhash'] - if blurhash.present? && /^[\w#$%*+-.:;=?@\[\]^{|}~]+$/.match?(blurhash) + if blurhash.present? && /^[\w#$%*+,-.:;=?@\[\]^{|}~]+$/.match?(blurhash) Blurhash.components(blurhash) end end diff --git a/app/lib/admin/system_check.rb b/app/lib/admin/system_check.rb index 877a42ef6..f512635ab 100644 --- a/app/lib/admin/system_check.rb +++ b/app/lib/admin/system_check.rb @@ -8,11 +8,11 @@ class Admin::SystemCheck Admin::SystemCheck::ElasticsearchCheck, ].freeze - def self.perform + def self.perform(current_user) ACTIVE_CHECKS.each_with_object([]) do |klass, arr| - check = klass.new + check = klass.new(current_user) - if check.pass? + if check.skip? || check.pass? arr else arr << check.message diff --git a/app/lib/admin/system_check/base_check.rb b/app/lib/admin/system_check/base_check.rb index fcad8daca..c2974c218 100644 --- a/app/lib/admin/system_check/base_check.rb +++ b/app/lib/admin/system_check/base_check.rb @@ -1,6 +1,16 @@ # frozen_string_literal: true class Admin::SystemCheck::BaseCheck + attr_reader :current_user + + def initialize(current_user) + @current_user = current_user + end + + def skip? + false + end + def pass? raise NotImplementedError end diff --git a/app/lib/admin/system_check/database_schema_check.rb b/app/lib/admin/system_check/database_schema_check.rb index b93d1954e..c2f01fd55 100644 --- a/app/lib/admin/system_check/database_schema_check.rb +++ b/app/lib/admin/system_check/database_schema_check.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true class Admin::SystemCheck::DatabaseSchemaCheck < Admin::SystemCheck::BaseCheck + def skip? + !current_user.can?(:view_devops) + end + def pass? !ActiveRecord::Base.connection.migration_context.needs_migration? end diff --git a/app/lib/admin/system_check/elasticsearch_check.rb b/app/lib/admin/system_check/elasticsearch_check.rb index 1b48a5415..8aee18267 100644 --- a/app/lib/admin/system_check/elasticsearch_check.rb +++ b/app/lib/admin/system_check/elasticsearch_check.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck + def skip? + !current_user.can?(:view_devops) + end + def pass? return true unless Chewy.enabled? @@ -32,8 +36,4 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck def compatible_version? Gem::Version.new(running_version) >= Gem::Version.new(required_version) end - - def missing_queues - @missing_queues ||= Sidekiq::ProcessSet.new.reduce(SIDEKIQ_QUEUES) { |queues, process| queues - process['queues'] } - end end diff --git a/app/lib/admin/system_check/rules_check.rb b/app/lib/admin/system_check/rules_check.rb index 1fbdf955d..8206a5df3 100644 --- a/app/lib/admin/system_check/rules_check.rb +++ b/app/lib/admin/system_check/rules_check.rb @@ -3,6 +3,10 @@ class Admin::SystemCheck::RulesCheck < Admin::SystemCheck::BaseCheck include RoutingHelper + def skip? + !current_user.can?(:manage_rules) + end + def pass? Rule.kept.exists? end diff --git a/app/lib/admin/system_check/sidekiq_process_check.rb b/app/lib/admin/system_check/sidekiq_process_check.rb index 22446edaf..648811d6c 100644 --- a/app/lib/admin/system_check/sidekiq_process_check.rb +++ b/app/lib/admin/system_check/sidekiq_process_check.rb @@ -9,6 +9,10 @@ class Admin::SystemCheck::SidekiqProcessCheck < Admin::SystemCheck::BaseCheck scheduler ).freeze + def skip? + !current_user.can?(:view_devops) + end + def pass? missing_queues.empty? end diff --git a/app/lib/ascii_folding.rb b/app/lib/ascii_folding.rb new file mode 100644 index 000000000..1798d3d0e --- /dev/null +++ b/app/lib/ascii_folding.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class ASCIIFolding + NON_ASCII_CHARS = 'ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž' + EQUIVALENT_ASCII_CHARS = 'AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz' + + def fold(str) + str.tr(NON_ASCII_CHARS, EQUIVALENT_ASCII_CHARS) + end +end diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 235d6fedd..c607223fc 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -47,6 +47,8 @@ class FeedManager filter_from_mentions?(status, receiver.id) when :direct filter_from_direct?(status, receiver.id) + when :tags + filter_from_tags?(status, receiver.id, build_crutches(receiver.id, [status])) else false end @@ -58,7 +60,7 @@ class FeedManager # @param [Boolean] update # @return [Boolean] def push_to_home(account, status, update: false) - return false unless add_to_feed(:home, account.id, status, account.user&.aggregates_reblogs?) + return false unless add_to_feed(:home, account.id, status, aggregate_reblogs: account.user&.aggregates_reblogs?) trim(:home, account.id) PushUpdateWorker.perform_async(account.id, status.id, "timeline:#{account.id}", { 'update' => update }) if push_update_required?("timeline:#{account.id}") @@ -71,7 +73,7 @@ class FeedManager # @param [Boolean] update # @return [Boolean] def unpush_from_home(account, status, update: false) - return false unless remove_from_feed(:home, account.id, status, account.user&.aggregates_reblogs?) + return false unless remove_from_feed(:home, account.id, status, aggregate_reblogs: account.user&.aggregates_reblogs?) redis.publish("timeline:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s)) unless update true @@ -83,7 +85,7 @@ class FeedManager # @param [Boolean] update # @return [Boolean] def push_to_list(list, status, update: false) - return false if filter_from_list?(status, list) || !add_to_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?) + return false if filter_from_list?(status, list) || !add_to_feed(:list, list.id, status, aggregate_reblogs: list.account.user&.aggregates_reblogs?) trim(:list, list.id) PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}", { 'update' => update }) if push_update_required?("timeline:list:#{list.id}") @@ -96,7 +98,7 @@ class FeedManager # @param [Boolean] update # @return [Boolean] def unpush_from_list(list, status, update: false) - return false unless remove_from_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?) + return false unless remove_from_feed(:list, list.id, status, aggregate_reblogs: list.account.user&.aggregates_reblogs?) redis.publish("timeline:list:#{list.id}", Oj.dump(event: :delete, payload: status.id.to_s)) unless update true @@ -145,7 +147,7 @@ class FeedManager statuses.each do |status| next if filter_from_home?(status, into_account.id, crutches) - add_to_feed(:home, into_account.id, status, aggregate) + add_to_feed(:home, into_account.id, status, aggregate_reblogs: aggregate) end trim(:home, into_account.id) @@ -171,7 +173,7 @@ class FeedManager statuses.each do |status| next if filter_from_home?(status, list.account_id, crutches) || filter_from_list?(status, list) - add_to_feed(:list, list.id, status, aggregate) + add_to_feed(:list, list.id, status, aggregate_reblogs: aggregate) end trim(:list, list.id) @@ -186,7 +188,7 @@ class FeedManager timeline_status_ids = redis.zrange(timeline_key, 0, -1) from_account.statuses.select('id, reblog_of_id').where(id: timeline_status_ids).reorder(nil).find_each do |status| - remove_from_feed(:home, into_account.id, status, into_account.user&.aggregates_reblogs?) + remove_from_feed(:home, into_account.id, status, aggregate_reblogs: into_account.user&.aggregates_reblogs?) end end @@ -199,7 +201,7 @@ class FeedManager timeline_status_ids = redis.zrange(timeline_key, 0, -1) from_account.statuses.select('id, reblog_of_id').where(id: timeline_status_ids).reorder(nil).find_each do |status| - remove_from_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?) + remove_from_feed(:list, list.id, status, aggregate_reblogs: list.account.user&.aggregates_reblogs?) end end @@ -262,7 +264,7 @@ class FeedManager timeline_key = key(:home, account.id) account.statuses.limit(limit).each do |status| - add_to_feed(:home, account.id, status, aggregate) + add_to_feed(:home, account.id, status, aggregate_reblogs: aggregate) end account.following.includes(:account_stat).find_each do |target_account| @@ -282,7 +284,7 @@ class FeedManager statuses.each do |status| next if filter_from_home?(status, account.id, crutches) - add_to_feed(:home, account.id, status, aggregate) + add_to_feed(:home, account.id, status, aggregate_reblogs: aggregate) end trim(:home, account.id) @@ -401,7 +403,6 @@ class FeedManager def filter_from_home?(status, receiver_id, crutches) return false if receiver_id == status.account_id return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) - return true if phrase_filtered?(status, receiver_id, :home) check_for_blocks = crutches[:active_mentions][status.id] || [] check_for_blocks.concat([status.account_id]) @@ -437,7 +438,6 @@ class FeedManager # @return [Boolean] def filter_from_mentions?(status, receiver_id) return true if receiver_id == status.account_id - return true if phrase_filtered?(status, receiver_id, :notifications) # This filter is called from NotifyService, but already after the sender of # the notification has been checked for mute/block. Therefore, it's not @@ -476,32 +476,14 @@ class FeedManager false end - # Check if the status hits a phrase filter + # Check if a status should not be added to the home feed when it comes + # from a followed hashtag # @param [Status] status # @param [Integer] receiver_id - # @param [Symbol] context + # @param [Hash] crutches # @return [Boolean] - def phrase_filtered?(status, receiver_id, context) - active_filters = Rails.cache.fetch("filters:#{receiver_id}") { CustomFilter.where(account_id: receiver_id).active_irreversible.to_a }.to_a - - active_filters.select! { |filter| filter.context.include?(context.to_s) && !filter.expired? } - - active_filters.map! do |filter| - if filter.whole_word - sb = /\A[[:word:]]/.match?(filter.phrase) ? '\b' : '' - eb = /[[:word:]]\z/.match?(filter.phrase) ? '\b' : '' - - /(?mix:#{sb}#{Regexp.escape(filter.phrase)}#{eb})/ - else - /#{Regexp.escape(filter.phrase)}/i - end - end - - return false if active_filters.empty? - - combined_regex = Regexp.union(active_filters) - - combined_regex.match?(status.proper.searchable_text) + def filter_from_tags?(status, receiver_id, crutches) + receiver_id != status.account_id && (((crutches[:active_mentions][status.id] || []) + [status.account_id]).any? { |target_account_id| crutches[:blocking][target_account_id] || crutches[:muting][target_account_id] } || crutches[:blocked_by][status.account_id] || crutches[:domain_blocking][status.account.domain]) end # Adds a status to an account's feed, returning true if a status was @@ -513,7 +495,7 @@ class FeedManager # @param [Status] status # @param [Boolean] aggregate_reblogs # @return [Boolean] - def add_to_feed(timeline_type, account_id, status, aggregate_reblogs = true) + def add_to_feed(timeline_type, account_id, status, aggregate_reblogs: true) timeline_key = key(timeline_type, account_id) reblog_key = key(timeline_type, account_id, 'reblogs') @@ -561,7 +543,7 @@ class FeedManager # @param [Status] status # @param [Boolean] aggregate_reblogs # @return [Boolean] - def remove_from_feed(timeline_type, account_id, status, aggregate_reblogs = true) + def remove_from_feed(timeline_type, account_id, status, aggregate_reblogs: true) timeline_key = key(timeline_type, account_id) reblog_key = key(timeline_type, account_id, 'reblogs') diff --git a/app/lib/hashtag_normalizer.rb b/app/lib/hashtag_normalizer.rb new file mode 100644 index 000000000..c1f99e163 --- /dev/null +++ b/app/lib/hashtag_normalizer.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class HashtagNormalizer + def normalize(str) + remove_invalid_characters(ascii_folding(lowercase(cjk_width(str)))) + end + + private + + def remove_invalid_characters(str) + str.gsub(/[^[:alnum:]#{Tag::HASHTAG_SEPARATORS}]/, '') + end + + def ascii_folding(str) + ASCIIFolding.new.fold(str) + end + + def lowercase(str) + str.mb_chars.downcase.to_s + end + + def cjk_width(str) + str.unicode_normalize(:nfkc) + end +end diff --git a/app/models/account.rb b/app/models/account.rb index 688e6fabd..9627cc608 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -120,7 +120,7 @@ class Account < ApplicationRecord scope :by_recent_status, -> { order(Arel.sql('(case when account_stats.last_status_at is null then 1 else 0 end) asc, account_stats.last_status_at desc, accounts.id desc')) } scope :by_recent_sign_in, -> { order(Arel.sql('(case when users.current_sign_in_at is null then 1 else 0 end) asc, users.current_sign_in_at desc, accounts.id desc')) } scope :popular, -> { order('account_stats.followers_count desc') } - scope :by_domain_and_subdomains, ->(domain) { where(domain: domain).or(where(arel_table[:domain].matches('%.' + domain))) } + scope :by_domain_and_subdomains, ->(domain) { where(domain: domain).or(where(arel_table[:domain].matches("%.#{domain}"))) } scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) } scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) } @@ -136,9 +136,6 @@ class Account < ApplicationRecord :unconfirmed?, :unconfirmed_or_pending?, :role, - :admin?, - :moderator?, - :staff?, :locale, :shows_application?, to: :user, @@ -456,7 +453,7 @@ class Account < ApplicationRecord DeliveryFailureTracker.without_unavailable(urls) end - def search_for(terms, limit = 10, offset = 0) + def search_for(terms, limit: 10, offset: 0) tsquery = generate_query_for_search(terms) sql = <<-SQL.squish @@ -478,7 +475,7 @@ class Account < ApplicationRecord records end - def advanced_search_for(terms, account, limit = 10, following = false, offset = 0) + def advanced_search_for(terms, account, limit: 10, following: false, offset: 0) tsquery = generate_query_for_search(terms) sql = advanced_search_for_sql_template(following) records = find_by_sql([sql, id: account.id, limit: limit, offset: offset, tsquery: tsquery]) diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb index ec309ce09..e214e0bad 100644 --- a/app/models/account_filter.rb +++ b/app/models/account_filter.rb @@ -4,7 +4,7 @@ class AccountFilter KEYS = %i( origin status - permissions + role_ids username by_domain display_name @@ -26,7 +26,7 @@ class AccountFilter params.each do |key, value| next if key.to_s == 'page' - scope.merge!(scope_for(key, value.to_s.strip)) if value.present? + scope.merge!(scope_for(key, value)) if value.present? end scope @@ -38,18 +38,18 @@ class AccountFilter case key.to_s when 'origin' origin_scope(value) - when 'permissions' - permissions_scope(value) + when 'role_ids' + role_scope(value) when 'status' status_scope(value) when 'by_domain' - Account.where(domain: value) + Account.where(domain: value.to_s) when 'username' - Account.matches_username(value) + Account.matches_username(value.to_s) when 'display_name' - Account.matches_display_name(value) + Account.matches_display_name(value.to_s) when 'email' - accounts_with_users.merge(User.matches_email(value)) + accounts_with_users.merge(User.matches_email(value.to_s)) when 'ip' valid_ip?(value) ? accounts_with_users.merge(User.matches_ip(value).group('users.id, accounts.id')) : Account.none when 'invited_by' @@ -104,13 +104,8 @@ class AccountFilter Account.left_joins(user: :invite).merge(Invite.where(user_id: value.to_s)) end - def permissions_scope(value) - case value.to_s - when 'staff' - accounts_with_users.merge(User.staff) - else - raise "Unknown permissions: #{value}" - end + def role_scope(value) + accounts_with_users.merge(User.where(role_id: Array(value).map(&:to_s))) end def accounts_with_users @@ -118,7 +113,7 @@ class AccountFilter end def valid_ip?(value) - IPAddr.new(value) && true + IPAddr.new(value.to_s) && true rescue IPAddr::InvalidAddressError false end diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index ad1665dc4..a7401362f 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -247,6 +247,19 @@ module AccountInteractions account_pins.where(target_account: account).exists? end + def status_matches_filters(status) + active_filters = CustomFilter.cached_filters_for(id) + + filter_matches = active_filters.filter_map do |filter, rules| + next if rules[:keywords].blank? + + match = rules[:keywords].match(status.proper.searchable_text) + FilterResultPresenter.new(filter: filter, keyword_matches: [match.to_s]) unless match.nil? + end + + filter_matches + end + def followers_for_local_distribution followers.local .joins(:user) diff --git a/app/models/concerns/user_roles.rb b/app/models/concerns/user_roles.rb deleted file mode 100644 index a42b4a172..000000000 --- a/app/models/concerns/user_roles.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true - -module UserRoles - extend ActiveSupport::Concern - - included do - scope :admins, -> { where(admin: true) } - scope :moderators, -> { where(moderator: true) } - scope :staff, -> { admins.or(moderators) } - end - - def staff? - admin? || moderator? - end - - def role=(value) - case value - when 'admin' - self.admin = true - self.moderator = false - when 'moderator' - self.admin = false - self.moderator = true - else - self.admin = false - self.moderator = false - end - end - - def role - if admin? - 'admin' - elsif moderator? - 'moderator' - else - 'user' - end - end - - def role?(role) - case role - when 'user' - true - when 'moderator' - staff? - when 'admin' - admin? - else - false - end - end - - def promote! - if moderator? - update!(moderator: false, admin: true) - elsif !admin? - update!(moderator: true) - end - end - - def demote! - if admin? - update!(admin: false, moderator: true) - elsif moderator? - update!(moderator: false) - end - end -end diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb index 196ae0297..c89bf0586 100644 --- a/app/models/custom_emoji.rb +++ b/app/models/custom_emoji.rb @@ -23,8 +23,8 @@ class CustomEmoji < ApplicationRecord include Attachmentable - LOCAL_LIMIT = (ENV['MAX_EMOJI_SIZE'] || 50.kilobytes).to_i - LIMIT = [LOCAL_LIMIT, (ENV['MAX_REMOTE_EMOJI_SIZE'] || 200.kilobytes).to_i].max + LOCAL_LIMIT = (ENV['MAX_EMOJI_SIZE'] || 256.kilobytes).to_i + LIMIT = [LOCAL_LIMIT, (ENV['MAX_REMOTE_EMOJI_SIZE'] || 256.kilobytes).to_i].max SHORTCODE_RE_FRAGMENT = '[a-zA-Z0-9_]{2,}' diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb index 8e3476794..985eab125 100644 --- a/app/models/custom_filter.rb +++ b/app/models/custom_filter.rb @@ -3,18 +3,22 @@ # # Table name: custom_filters # -# id :bigint(8) not null, primary key -# account_id :bigint(8) -# expires_at :datetime -# phrase :text default(""), not null -# context :string default([]), not null, is an Array -# whole_word :boolean default(TRUE), not null -# irreversible :boolean default(FALSE), not null -# created_at :datetime not null -# updated_at :datetime not null +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# expires_at :datetime +# phrase :text default(""), not null +# context :string default([]), not null, is an Array +# created_at :datetime not null +# updated_at :datetime not null +# action :integer default("warn"), not null # class CustomFilter < ApplicationRecord + self.ignored_columns = %w(whole_word irreversible) + + alias_attribute :title, :phrase + alias_attribute :filter_action, :action + VALID_CONTEXTS = %w( home notifications @@ -26,16 +30,20 @@ class CustomFilter < ApplicationRecord include Expireable include Redisable + enum action: [:warn, :hide], _suffix: :action + belongs_to :account + has_many :keywords, class_name: 'CustomFilterKeyword', foreign_key: :custom_filter_id, inverse_of: :custom_filter, dependent: :destroy + accepts_nested_attributes_for :keywords, reject_if: :all_blank, allow_destroy: true - validates :phrase, :context, presence: true + validates :title, :context, presence: true validate :context_must_be_valid - validate :irreversible_must_be_within_context - - scope :active_irreversible, -> { where(irreversible: true).where(Arel.sql('expires_at IS NULL OR expires_at > NOW()')) } before_validation :clean_up_contexts - after_commit :remove_cache + + before_save :prepare_cache_invalidation! + before_destroy :prepare_cache_invalidation! + after_commit :invalidate_cache! def expires_in return @expires_in if defined?(@expires_in) @@ -44,22 +52,55 @@ class CustomFilter < ApplicationRecord [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].find { |expires_in| expires_in.from_now >= expires_at } end - private + def irreversible=(value) + self.action = value ? :hide : :warn + end - def clean_up_contexts - self.context = Array(context).map(&:strip).filter_map(&:presence) + def irreversible? + hide_action? + end + + def self.cached_filters_for(account_id) + active_filters = Rails.cache.fetch("filters:v3:#{account_id}") do + scope = CustomFilterKeyword.includes(:custom_filter).where(custom_filter: { account_id: account_id }).where(Arel.sql('expires_at IS NULL OR expires_at > NOW()')) + scope.to_a.group_by(&:custom_filter).map do |filter, keywords| + keywords.map! do |keyword| + if keyword.whole_word + sb = /\A[[:word:]]/.match?(keyword.keyword) ? '\b' : '' + eb = /[[:word:]]\z/.match?(keyword.keyword) ? '\b' : '' + + /(?mix:#{sb}#{Regexp.escape(keyword.keyword)}#{eb})/ + else + /#{Regexp.escape(keyword.keyword)}/i + end + end + [filter, { keywords: Regexp.union(keywords) }] + end + end.to_a + + active_filters.select { |custom_filter, _| !custom_filter.expired? } + end + + def prepare_cache_invalidation! + @should_invalidate_cache = true end - def remove_cache - Rails.cache.delete("filters:#{account_id}") + def invalidate_cache! + return unless @should_invalidate_cache + @should_invalidate_cache = false + + Rails.cache.delete("filters:v3:#{account_id}") redis.publish("timeline:#{account_id}", Oj.dump(event: :filters_changed)) + redis.publish("timeline:system:#{account_id}", Oj.dump(event: :filters_changed)) end - def context_must_be_valid - errors.add(:context, I18n.t('filters.errors.invalid_context')) if context.empty? || context.any? { |c| !VALID_CONTEXTS.include?(c) } + private + + def clean_up_contexts + self.context = Array(context).map(&:strip).filter_map(&:presence) end - def irreversible_must_be_within_context - errors.add(:irreversible, I18n.t('filters.errors.invalid_irreversible')) if irreversible? && !context.include?('home') && !context.include?('notifications') + def context_must_be_valid + errors.add(:context, I18n.t('filters.errors.invalid_context')) if context.empty? || context.any? { |c| !VALID_CONTEXTS.include?(c) } end end diff --git a/app/models/custom_filter_keyword.rb b/app/models/custom_filter_keyword.rb new file mode 100644 index 000000000..e0d0289ae --- /dev/null +++ b/app/models/custom_filter_keyword.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true +# == Schema Information +# +# Table name: custom_filter_keywords +# +# id :bigint(8) not null, primary key +# custom_filter_id :bigint(8) not null +# keyword :text default(""), not null +# whole_word :boolean default(TRUE), not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class CustomFilterKeyword < ApplicationRecord + belongs_to :custom_filter + + validates :keyword, presence: true + + alias_attribute :phrase, :keyword + + before_save :prepare_cache_invalidation! + before_destroy :prepare_cache_invalidation! + after_commit :invalidate_cache! + + private + + def prepare_cache_invalidation! + custom_filter.prepare_cache_invalidation! + end + + def invalidate_cache! + custom_filter.invalidate_cache! + end +end diff --git a/app/models/domain_allow.rb b/app/models/domain_allow.rb index 2e14fce25..7a0acbe32 100644 --- a/app/models/domain_allow.rb +++ b/app/models/domain_allow.rb @@ -11,6 +11,7 @@ # class DomainAllow < ApplicationRecord + include Paginable include DomainNormalizable include DomainMaterializable diff --git a/app/models/featured_tag.rb b/app/models/featured_tag.rb index 74d62e777..201ce75f5 100644 --- a/app/models/featured_tag.rb +++ b/app/models/featured_tag.rb @@ -13,17 +13,21 @@ # class FeaturedTag < ApplicationRecord - belongs_to :account, inverse_of: :featured_tags, required: true - belongs_to :tag, inverse_of: :featured_tags, required: true + belongs_to :account, inverse_of: :featured_tags + belongs_to :tag, inverse_of: :featured_tags, optional: true # Set after validation - delegate :name, to: :tag, allow_nil: true - - validates_associated :tag, on: :create - validates :name, presence: true, on: :create + validate :validate_tag_name, on: :create validate :validate_featured_tags_limit, on: :create - def name=(str) - self.tag = Tag.find_or_create_by_names(str.strip)&.first + before_create :set_tag + before_create :reset_data + + delegate :display_name, to: :tag + + attr_writer :name + + def name + tag_id.present? ? tag.name : @name end def increment(timestamp) @@ -34,14 +38,23 @@ class FeaturedTag < ApplicationRecord update(statuses_count: [0, statuses_count - 1].max, last_status_at: account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).where.not(id: deleted_status_id).select(:created_at).first&.created_at) end + private + + def set_tag + self.tag = Tag.find_or_create_by_names(@name)&.first + end + def reset_data self.statuses_count = account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).count self.last_status_at = account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).select(:created_at).first&.created_at end - private - def validate_featured_tags_limit errors.add(:base, I18n.t('featured_tags.errors.limit')) if account.featured_tags.count >= 10 end + + def validate_tag_name + errors.add(:name, :blank) if @name.blank? + errors.add(:name, :invalid) unless @name.match?(/\A(#{Tag::HASHTAG_NAME_RE})\z/i) + end end diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 5627f8a84..4c100ba6b 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -15,11 +15,9 @@ class Form::AdminSettings closed_registrations_message open_deletion timeline_preview - show_staff_badge bootstrap_timeline_accounts flavour skin - min_invite_role activity_api_enabled peers_api_enabled show_known_fediverse_at_about_page @@ -47,7 +45,6 @@ class Form::AdminSettings BOOLEAN_KEYS = %i( open_deletion timeline_preview - show_staff_badge activity_api_enabled peers_api_enabled show_known_fediverse_at_about_page @@ -79,7 +76,6 @@ class Form::AdminSettings validates :site_short_description, :site_description, html: { wrap_with: :p } validates :site_extended_description, :site_terms, :closed_registrations_message, html: true validates :registrations_mode, inclusion: { in: %w(open approved none) } - validates :min_invite_role, inclusion: { in: %w(disabled user moderator admin) } validates :site_contact_email, :site_contact_username, presence: true validates :site_contact_username, existing_username: true validates :bootstrap_timeline_accounts, existing_username: { multiple: true } diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index ef269c659..69feffbf0 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -58,7 +58,7 @@ class MediaAttachment < ApplicationRecord IMAGE_MIME_TYPES = %w(image/jpeg image/png image/gif image/webp).freeze VIDEO_MIME_TYPES = %w(video/webm video/mp4 video/quicktime video/ogg).freeze VIDEO_CONVERTIBLE_MIME_TYPES = %w(video/webm video/quicktime).freeze - AUDIO_MIME_TYPES = %w(audio/wave audio/wav audio/x-wav audio/x-pn-wave audio/ogg audio/vorbis audio/mpeg audio/mp3 audio/webm audio/flac audio/aac audio/m4a audio/x-m4a audio/mp4 audio/3gpp video/x-ms-asf).freeze + AUDIO_MIME_TYPES = %w(audio/wave audio/wav audio/x-wav audio/x-pn-wave audio/vnd.wave audio/ogg audio/vorbis audio/mpeg audio/mp3 audio/webm audio/flac audio/aac audio/m4a audio/x-m4a audio/mp4 audio/3gpp video/x-ms-asf).freeze BLURHASH_OPTIONS = { x_comp: 4, diff --git a/app/models/notification.rb b/app/models/notification.rb index ba94b54d1..bbc63c1c0 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -37,6 +37,7 @@ class Notification < ApplicationRecord poll update admin.sign_up + admin.report ).freeze TARGET_STATUS_INCLUDES_BY_TYPE = { @@ -46,6 +47,7 @@ class Notification < ApplicationRecord favourite: [favourite: :status], poll: [poll: :status], update: :status, + 'admin.report': [report: :target_account], }.freeze belongs_to :account, optional: true @@ -58,6 +60,7 @@ class Notification < ApplicationRecord belongs_to :follow_request, foreign_key: 'activity_id', optional: true belongs_to :favourite, foreign_key: 'activity_id', optional: true belongs_to :poll, foreign_key: 'activity_id', optional: true + belongs_to :report, foreign_key: 'activity_id', optional: true validates :type, inclusion: { in: TYPES } @@ -146,7 +149,7 @@ class Notification < ApplicationRecord return unless new_record? case activity_type - when 'Status', 'Follow', 'Favourite', 'FollowRequest', 'Poll' + when 'Status', 'Follow', 'Favourite', 'FollowRequest', 'Poll', 'Report' self.from_account_id = activity&.account_id when 'Mention' self.from_account_id = activity&.status&.account_id diff --git a/app/models/tag.rb b/app/models/tag.rb index a64042614..8929baf66 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -15,20 +15,25 @@ # last_status_at :datetime # max_score :float # max_score_at :datetime +# display_name :string # class Tag < ApplicationRecord has_and_belongs_to_many :statuses has_and_belongs_to_many :accounts + has_many :passive_relationships, class_name: 'TagFollow', inverse_of: :tag, dependent: :destroy has_many :featured_tags, dependent: :destroy, inverse_of: :tag + has_many :followers, through: :passive_relationships, source: :account HASHTAG_SEPARATORS = "_\u00B7\u200c" HASHTAG_NAME_RE = "([[:word:]_][[:word:]#{HASHTAG_SEPARATORS}]*[[:alpha:]#{HASHTAG_SEPARATORS}][[:word:]#{HASHTAG_SEPARATORS}]*[[:word:]_])|([[:word:]_]*[[:alpha:]][[:word:]_]*)" HASHTAG_RE = /(?:^|[^\/\)\w])#(#{HASHTAG_NAME_RE})/i validates :name, presence: true, format: { with: /\A(#{HASHTAG_NAME_RE})\z/i } + validates :display_name, format: { with: /\A(#{HASHTAG_NAME_RE})\z/i } validate :validate_name_change, if: -> { !new_record? && name_changed? } + validate :validate_display_name_change, if: -> { !new_record? && display_name_changed? } scope :reviewed, -> { where.not(reviewed_at: nil) } scope :unreviewed, -> { where(reviewed_at: nil) } @@ -46,6 +51,10 @@ class Tag < ApplicationRecord name end + def display_name + attributes['display_name'] || name + end + def usable boolean_with_default('usable', true) end @@ -90,8 +99,10 @@ class Tag < ApplicationRecord class << self def find_or_create_by_names(name_or_names) - Array(name_or_names).map(&method(:normalize)).uniq { |str| str.mb_chars.downcase.to_s }.map do |normalized_name| - tag = matching_name(normalized_name).first || create(name: normalized_name) + names = Array(name_or_names).map { |str| [normalize(str), str] }.uniq(&:first) + + names.map do |(normalized_name, display_name)| + tag = matching_name(normalized_name).first || create(name: normalized_name, display_name: display_name.gsub(/[^[:alnum:]#{HASHTAG_SEPARATORS}]/, '')) yield tag if block_given? @@ -129,7 +140,7 @@ class Tag < ApplicationRecord end def normalize(str) - str.gsub(/\A#/, '') + HashtagNormalizer.new.normalize(str) end end @@ -138,4 +149,8 @@ class Tag < ApplicationRecord def validate_name_change errors.add(:name, I18n.t('tags.does_not_match_previous_name')) unless name_was.mb_chars.casecmp(name.mb_chars).zero? end + + def validate_display_name_change + errors.add(:display_name, I18n.t('tags.does_not_match_previous_name')) unless HashtagNormalizer.new.normalize(display_name).casecmp(name.mb_chars).zero? + end end diff --git a/app/models/tag_follow.rb b/app/models/tag_follow.rb new file mode 100644 index 000000000..abe36cd17 --- /dev/null +++ b/app/models/tag_follow.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: tag_follows +# +# id :bigint(8) not null, primary key +# tag_id :bigint(8) not null +# account_id :bigint(8) not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class TagFollow < ApplicationRecord + include RateLimitable + include Paginable + + belongs_to :tag + belongs_to :account + + accepts_nested_attributes_for :tag + + rate_limit by: :account, family: :follows +end diff --git a/app/models/trends.rb b/app/models/trends.rb index 0fff66a9f..5d5f2eb22 100644 --- a/app/models/trends.rb +++ b/app/models/trends.rb @@ -32,7 +32,7 @@ module Trends tags_requiring_review = tags.request_review statuses_requiring_review = statuses.request_review - User.staff.includes(:account).find_each do |user| + User.those_who_can(:manage_taxonomies).includes(:account).find_each do |user| links = user.allows_trending_links_review_emails? ? links_requiring_review : [] tags = user.allows_trending_tags_review_emails? ? tags_requiring_review : [] statuses = user.allows_trending_statuses_review_emails? ? statuses_requiring_review : [] diff --git a/app/models/user.rb b/app/models/user.rb index 6d2d94625..ffad4ae5a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -37,6 +37,7 @@ # sign_in_token_sent_at :datetime # webauthn_id :string # sign_up_ip :inet +# role_id :bigint(8) # class User < ApplicationRecord @@ -50,7 +51,6 @@ class User < ApplicationRecord ) include Settings::Extend - include UserRoles include Redisable include LanguagesHelper @@ -79,6 +79,7 @@ class User < ApplicationRecord belongs_to :account, inverse_of: :user belongs_to :invite, counter_cache: :uses, optional: true belongs_to :created_by_application, class_name: 'Doorkeeper::Application', optional: true + belongs_to :role, class_name: 'UserRole', optional: true accepts_nested_attributes_for :account has_many :applications, class_name: 'Doorkeeper::Application', as: :owner @@ -103,6 +104,7 @@ class User < ApplicationRecord validates_with RegistrationFormTimeValidator, on: :create validates :website, absence: true, on: :create validates :confirm_password, absence: true, on: :create + validate :validate_role_elevation scope :recent, -> { order(id: :desc) } scope :pending, -> { where(approved: false) } @@ -117,6 +119,7 @@ class User < ApplicationRecord scope :emailable, -> { confirmed.enabled.joins(:account).merge(Account.searchable) } before_validation :sanitize_languages + before_validation :sanitize_role before_create :set_approved after_commit :send_pending_devise_notifications after_create_commit :trigger_webhooks @@ -135,8 +138,28 @@ class User < ApplicationRecord :disable_swiping, :always_send_emails, :default_content_type, :system_emoji_font, to: :settings, prefix: :setting, allow_nil: false + delegate :can?, to: :role + attr_reader :invite_code - attr_writer :external, :bypass_invite_request_check + attr_writer :external, :bypass_invite_request_check, :current_account + + def self.those_who_can(*any_of_privileges) + matching_role_ids = UserRole.that_can(*any_of_privileges).map(&:id) + + if matching_role_ids.empty? + none + else + where(role_id: matching_role_ids) + end + end + + def role + if role_id.nil? + UserRole.everyone + else + super + end + end def confirmed? confirmed_at.present? @@ -449,6 +472,11 @@ class User < ApplicationRecord self.chosen_languages = nil if chosen_languages.empty? end + def sanitize_role + return if role.nil? + self.role = nil if role.everyone? + end + def prepare_new_user! BootstrapTimelineWorker.perform_async(account_id) ActivityTracker.increment('activity:accounts:local') @@ -461,7 +489,7 @@ class User < ApplicationRecord end def notify_staff_about_pending_account! - User.staff.includes(:account).find_each do |u| + User.those_who_can(:manage_users).includes(:account).find_each do |u| next unless u.allows_pending_account_emails? AdminMailer.new_pending_account(u.account, self).deliver_later end @@ -479,6 +507,10 @@ class User < ApplicationRecord email_changed? && !external? && !(Rails.env.test? || Rails.env.development?) end + def validate_role_elevation + errors.add(:role_id, :elevated) if defined?(@current_account) && role&.overrides?(@current_account&.user_role) + end + def invite_text_required? Setting.require_invite_text && !invited? && !external? && !bypass_invite_request_check? end diff --git a/app/models/user_role.rb b/app/models/user_role.rb new file mode 100644 index 000000000..57a56c0b0 --- /dev/null +++ b/app/models/user_role.rb @@ -0,0 +1,186 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: user_roles +# +# id :bigint(8) not null, primary key +# name :string default(""), not null +# color :string default(""), not null +# position :integer default(0), not null +# permissions :bigint(8) default(0), not null +# highlighted :boolean default(FALSE), not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class UserRole < ApplicationRecord + FLAGS = { + administrator: (1 << 0), + view_devops: (1 << 1), + view_audit_log: (1 << 2), + view_dashboard: (1 << 3), + manage_reports: (1 << 4), + manage_federation: (1 << 5), + manage_settings: (1 << 6), + manage_blocks: (1 << 7), + manage_taxonomies: (1 << 8), + manage_appeals: (1 << 9), + manage_users: (1 << 10), + manage_invites: (1 << 11), + manage_rules: (1 << 12), + manage_announcements: (1 << 13), + manage_custom_emojis: (1 << 14), + manage_webhooks: (1 << 15), + invite_users: (1 << 16), + manage_roles: (1 << 17), + manage_user_access: (1 << 18), + delete_user_data: (1 << 19), + }.freeze + + module Flags + NONE = 0 + ALL = FLAGS.values.reduce(&:|) + + DEFAULT = FLAGS[:invite_users] + + CATEGORIES = { + invites: %i( + invite_users + ).freeze, + + moderation: %w( + view_dashboard + view_audit_log + manage_users + manage_user_access + delete_user_data + manage_reports + manage_appeals + manage_federation + manage_blocks + manage_taxonomies + manage_invites + ).freeze, + + administration: %w( + manage_settings + manage_rules + manage_roles + manage_webhooks + manage_custom_emojis + manage_announcements + ).freeze, + + devops: %w( + view_devops + ).freeze, + + special: %i( + administrator + ).freeze, + }.freeze + end + + attr_writer :current_account + + validates :name, presence: true, unless: :everyone? + validates :color, format: { with: /\A#?(?:[A-F0-9]{3}){1,2}\z/i }, unless: -> { color.blank? } + + validate :validate_permissions_elevation + validate :validate_position_elevation + validate :validate_dangerous_permissions + validate :validate_own_role_edition + + before_validation :set_position + + scope :assignable, -> { where.not(id: -99).order(position: :asc) } + + has_many :users, inverse_of: :role, foreign_key: 'role_id', dependent: :nullify + + def self.nobody + @nobody ||= UserRole.new(permissions: Flags::NONE, position: -1) + end + + def self.everyone + UserRole.find(-99) + rescue ActiveRecord::RecordNotFound + UserRole.create!(id: -99, permissions: Flags::DEFAULT) + end + + def self.that_can(*any_of_privileges) + all.select { |role| role.can?(*any_of_privileges) } + end + + def everyone? + id == -99 + end + + def nobody? + id.nil? + end + + def permissions_as_keys + FLAGS.keys.select { |privilege| permissions & FLAGS[privilege] == FLAGS[privilege] }.map(&:to_s) + end + + def permissions_as_keys=(value) + self.permissions = value.map(&:presence).compact.reduce(Flags::NONE) { |bitmask, privilege| FLAGS.key?(privilege.to_sym) ? (bitmask | FLAGS[privilege.to_sym]) : bitmask } + end + + def can?(*any_of_privileges) + any_of_privileges.any? { |privilege| in_permissions?(privilege) } + end + + def overrides?(other_role) + other_role.nil? || position > other_role.position + end + + def computed_permissions + # If called on the everyone role, no further computation needed + return permissions if everyone? + + # If called on the nobody role, no permissions are there to be given + return Flags::NONE if nobody? + + # Otherwise, compute permissions based on special conditions + @computed_permissions ||= begin + permissions = self.class.everyone.permissions | self.permissions + + if permissions & FLAGS[:administrator] == FLAGS[:administrator] + Flags::ALL + else + permissions + end + end + end + + private + + def in_permissions?(privilege) + raise ArgumentError, "Unknown privilege: #{privilege}" unless FLAGS.key?(privilege) + computed_permissions & FLAGS[privilege] == FLAGS[privilege] + end + + def set_position + self.position = -1 if everyone? + end + + def validate_own_role_edition + return unless defined?(@current_account) && @current_account.user_role.id == id + errors.add(:permissions_as_keys, :own_role) if permissions_changed? + errors.add(:position, :own_role) if position_changed? + end + + def validate_permissions_elevation + errors.add(:permissions_as_keys, :elevated) if defined?(@current_account) && @current_account.user_role.computed_permissions & permissions != permissions + end + + def validate_position_elevation + errors.add(:position, :elevated) if defined?(@current_account) && @current_account.user_role.position < position + end + + def validate_dangerous_permissions + errors.add(:permissions_as_keys, :dangerous) if everyone? && Flags::DEFAULT & permissions != permissions + end +end diff --git a/app/policies/account_moderation_note_policy.rb b/app/policies/account_moderation_note_policy.rb index 885411a5b..310ce854c 100644 --- a/app/policies/account_moderation_note_policy.rb +++ b/app/policies/account_moderation_note_policy.rb @@ -2,11 +2,11 @@ class AccountModerationNotePolicy < ApplicationPolicy def create? - staff? + role.can?(:manage_reports) end def destroy? - admin? || owner? + owner? || (role.can?(:manage_reports) && role.overrides?(record.account.user_role)) end private diff --git a/app/policies/account_policy.rb b/app/policies/account_policy.rb index cc23771e7..a744af81d 100644 --- a/app/policies/account_policy.rb +++ b/app/policies/account_policy.rb @@ -2,74 +2,66 @@ class AccountPolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_users) end def show? - staff? + role.can?(:manage_users) end def warn? - staff? && !record.user&.staff? + role.can?(:manage_users, :manage_reports) && role.overrides?(record.user_role) end def suspend? - staff? && !record.user&.staff? && !record.instance_actor? + role.can?(:manage_users, :manage_reports) && role.overrides?(record.user_role) && !record.instance_actor? end def destroy? - record.suspended_temporarily? && admin? + record.suspended_temporarily? && role.can?(:delete_user_data) end def unsuspend? - staff? && record.suspension_origin_local? + role.can?(:manage_users) && record.suspension_origin_local? end def sensitive? - staff? && !record.user&.staff? + role.can?(:manage_users, :manage_reports) && role.overrides?(record.user_role) end def unsensitive? - staff? + role.can?(:manage_users) end def silence? - staff? && !record.user&.staff? + role.can?(:manage_users, :manage_reports) && role.overrides?(record.user_role) end def unsilence? - staff? + role.can?(:manage_users) end def redownload? - admin? + role.can?(:manage_federation) end def remove_avatar? - staff? + role.can?(:manage_users, :manage_reports) && role.overrides?(record.user_role) end def remove_header? - staff? - end - - def subscribe? - admin? - end - - def unsubscribe? - admin? + role.can?(:manage_users, :manage_reports) && role.overrides?(record.user_role) end def memorialize? - admin? && !record.user&.admin? && !record.instance_actor? + role.can?(:delete_user_data) && role.overrides?(record.user_role) && !record.instance_actor? end def unblock_email? - staff? + role.can?(:manage_users) end def review? - staff? + role.can?(:manage_taxonomies) end end diff --git a/app/policies/account_warning_policy.rb b/app/policies/account_warning_policy.rb index 65707dfa7..4f8df7420 100644 --- a/app/policies/account_warning_policy.rb +++ b/app/policies/account_warning_policy.rb @@ -2,7 +2,7 @@ class AccountWarningPolicy < ApplicationPolicy def show? - target? || staff? + target? || role.can?(:manage_appeals) end def appeal? diff --git a/app/policies/account_warning_preset_policy.rb b/app/policies/account_warning_preset_policy.rb index bccbd33ef..59514e951 100644 --- a/app/policies/account_warning_preset_policy.rb +++ b/app/policies/account_warning_preset_policy.rb @@ -2,18 +2,18 @@ class AccountWarningPresetPolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_settings) end def create? - staff? + role.can?(:manage_settings) end def update? - staff? + role.can?(:manage_settings) end def destroy? - staff? + role.can?(:manage_settings) end end diff --git a/app/policies/announcement_policy.rb b/app/policies/announcement_policy.rb index 0a4e4575c..b5dc6a18a 100644 --- a/app/policies/announcement_policy.rb +++ b/app/policies/announcement_policy.rb @@ -2,18 +2,18 @@ class AnnouncementPolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_announcements) end def create? - admin? + role.can?(:manage_announcements) end def update? - admin? + role.can?(:manage_announcements) end def destroy? - admin? + role.can?(:manage_announcements) end end diff --git a/app/policies/appeal_policy.rb b/app/policies/appeal_policy.rb index a25187172..7466b334b 100644 --- a/app/policies/appeal_policy.rb +++ b/app/policies/appeal_policy.rb @@ -2,12 +2,14 @@ class AppealPolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_appeals) end def approve? - record.pending? && staff? + record.pending? && role.can?(:manage_appeals) end - alias reject? approve? + def reject? + record.pending? && role.can?(:manage_appeals) + end end diff --git a/app/policies/application_policy.rb b/app/policies/application_policy.rb index d1de5e81a..163b81e9e 100644 --- a/app/policies/application_policy.rb +++ b/app/policies/application_policy.rb @@ -8,8 +8,6 @@ class ApplicationPolicy @record = record end - delegate :admin?, :moderator?, :staff?, to: :current_user, allow_nil: true - private def current_user @@ -19,4 +17,8 @@ class ApplicationPolicy def user_signed_in? !current_user.nil? end + + def role + current_user&.role || UserRole.nobody + end end diff --git a/app/policies/audit_log_policy.rb b/app/policies/audit_log_policy.rb new file mode 100644 index 000000000..f78aa9a8e --- /dev/null +++ b/app/policies/audit_log_policy.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AuditLogPolicy < ApplicationPolicy + def index? + role.can?(:view_audit_log) + end +end diff --git a/app/policies/custom_emoji_policy.rb b/app/policies/custom_emoji_policy.rb index a8c3cbc73..18de71c19 100644 --- a/app/policies/custom_emoji_policy.rb +++ b/app/policies/custom_emoji_policy.rb @@ -2,30 +2,30 @@ class CustomEmojiPolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_custom_emojis) end def create? - admin? + role.can?(:manage_custom_emojis) end def update? - admin? + role.can?(:manage_custom_emojis) end def copy? - admin? + role.can?(:manage_custom_emojis) end def enable? - staff? + role.can?(:manage_custom_emojis) end def disable? - staff? + role.can?(:manage_custom_emojis) end def destroy? - admin? + role.can?(:manage_custom_emojis) end end diff --git a/app/policies/dashboard_policy.rb b/app/policies/dashboard_policy.rb new file mode 100644 index 000000000..3df1c3088 --- /dev/null +++ b/app/policies/dashboard_policy.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class DashboardPolicy < ApplicationPolicy + def index? + role.can?(:view_dashboard) + end +end diff --git a/app/policies/delivery_policy.rb b/app/policies/delivery_policy.rb index 24d06c168..f6ba2eb18 100644 --- a/app/policies/delivery_policy.rb +++ b/app/policies/delivery_policy.rb @@ -2,14 +2,14 @@ class DeliveryPolicy < ApplicationPolicy def clear_delivery_errors? - admin? + role.can?(:manage_federation) end def restart_delivery? - admin? + role.can?(:manage_federation) end def stop_delivery? - admin? + role.can?(:manage_federation) end end diff --git a/app/policies/domain_allow_policy.rb b/app/policies/domain_allow_policy.rb index 5030453bb..45c797ecd 100644 --- a/app/policies/domain_allow_policy.rb +++ b/app/policies/domain_allow_policy.rb @@ -1,11 +1,19 @@ # frozen_string_literal: true class DomainAllowPolicy < ApplicationPolicy + def index? + role.can?(:manage_federation) + end + + def show? + role.can?(:manage_federation) + end + def create? - admin? + role.can?(:manage_federation) end def destroy? - admin? + role.can?(:manage_federation) end end diff --git a/app/policies/domain_block_policy.rb b/app/policies/domain_block_policy.rb index 543259cce..0fea2e035 100644 --- a/app/policies/domain_block_policy.rb +++ b/app/policies/domain_block_policy.rb @@ -2,22 +2,22 @@ class DomainBlockPolicy < ApplicationPolicy def index? - admin? + role.can?(:manage_federation) end def show? - admin? + role.can?(:manage_federation) end def create? - admin? + role.can?(:manage_federation) end def update? - admin? + role.can?(:manage_federation) end def destroy? - admin? + role.can?(:manage_federation) end end diff --git a/app/policies/email_domain_block_policy.rb b/app/policies/email_domain_block_policy.rb index 5a75ee183..1a0ddfa87 100644 --- a/app/policies/email_domain_block_policy.rb +++ b/app/policies/email_domain_block_policy.rb @@ -2,14 +2,14 @@ class EmailDomainBlockPolicy < ApplicationPolicy def index? - admin? + role.can?(:manage_blocks) end def create? - admin? + role.can?(:manage_blocks) end def destroy? - admin? + role.can?(:manage_blocks) end end diff --git a/app/policies/follow_recommendation_policy.rb b/app/policies/follow_recommendation_policy.rb index 68cd0e547..9245733ea 100644 --- a/app/policies/follow_recommendation_policy.rb +++ b/app/policies/follow_recommendation_policy.rb @@ -2,14 +2,14 @@ class FollowRecommendationPolicy < ApplicationPolicy def show? - staff? + role.can?(:manage_taxonomies) end def suppress? - staff? + role.can?(:manage_taxonomies) end def unsuppress? - staff? + role.can?(:manage_taxonomies) end end diff --git a/app/policies/instance_policy.rb b/app/policies/instance_policy.rb index 801ca162e..b15e123fe 100644 --- a/app/policies/instance_policy.rb +++ b/app/policies/instance_policy.rb @@ -2,14 +2,14 @@ class InstancePolicy < ApplicationPolicy def index? - admin? + role.can?(:manage_federation) end def show? - admin? + role.can?(:manage_federation) end def destroy? - admin? + role.can?(:manage_federation) end end diff --git a/app/policies/invite_policy.rb b/app/policies/invite_policy.rb index 14236f78b..24eacd08e 100644 --- a/app/policies/invite_policy.rb +++ b/app/policies/invite_policy.rb @@ -2,19 +2,19 @@ class InvitePolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_invites) end def create? - min_required_role? + role.can?(:invite_users) end def deactivate_all? - admin? + role.can?(:manage_invites) end def destroy? - owner? || (Setting.min_invite_role == 'admin' ? admin? : staff?) + owner? || role.can?(:manage_invites) end private @@ -22,8 +22,4 @@ class InvitePolicy < ApplicationPolicy def owner? record.user_id == current_user&.id end - - def min_required_role? - current_user&.role?(Setting.min_invite_role) - end end diff --git a/app/policies/ip_block_policy.rb b/app/policies/ip_block_policy.rb index 34dbd746a..1abc97ad8 100644 --- a/app/policies/ip_block_policy.rb +++ b/app/policies/ip_block_policy.rb @@ -2,14 +2,14 @@ class IpBlockPolicy < ApplicationPolicy def index? - admin? + role.can?(:manage_blocks) end def create? - admin? + role.can?(:manage_blocks) end def destroy? - admin? + role.can?(:manage_blocks) end end diff --git a/app/policies/preview_card_policy.rb b/app/policies/preview_card_policy.rb index 0410987e4..a7bb41634 100644 --- a/app/policies/preview_card_policy.rb +++ b/app/policies/preview_card_policy.rb @@ -2,10 +2,10 @@ class PreviewCardPolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_taxonomies) end def review? - staff? + role.can?(:manage_taxonomies) end end diff --git a/app/policies/preview_card_provider_policy.rb b/app/policies/preview_card_provider_policy.rb index 44d2ad5cf..131ccb5dd 100644 --- a/app/policies/preview_card_provider_policy.rb +++ b/app/policies/preview_card_provider_policy.rb @@ -2,10 +2,10 @@ class PreviewCardProviderPolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_taxonomies) end def review? - staff? + role.can?(:manage_taxonomies) end end diff --git a/app/policies/relay_policy.rb b/app/policies/relay_policy.rb index bd75e2197..4305bcfaa 100644 --- a/app/policies/relay_policy.rb +++ b/app/policies/relay_policy.rb @@ -2,6 +2,6 @@ class RelayPolicy < ApplicationPolicy def update? - admin? + role.can?(:manage_federation) end end diff --git a/app/policies/report_note_policy.rb b/app/policies/report_note_policy.rb index 694bc096b..dc31416e8 100644 --- a/app/policies/report_note_policy.rb +++ b/app/policies/report_note_policy.rb @@ -2,11 +2,11 @@ class ReportNotePolicy < ApplicationPolicy def create? - staff? + role.can?(:manage_reports) end def destroy? - admin? || owner? + owner? || (role.can?(:manage_reports) && role.overrides?(record.account.user_role)) end private diff --git a/app/policies/report_policy.rb b/app/policies/report_policy.rb index 95b5c30c8..c9f7639bd 100644 --- a/app/policies/report_policy.rb +++ b/app/policies/report_policy.rb @@ -2,14 +2,14 @@ class ReportPolicy < ApplicationPolicy def update? - staff? + role.can?(:manage_reports) end def index? - staff? + role.can?(:manage_reports) end def show? - staff? + role.can?(:manage_reports) end end diff --git a/app/policies/rule_policy.rb b/app/policies/rule_policy.rb index 6a4def009..51b2a6977 100644 --- a/app/policies/rule_policy.rb +++ b/app/policies/rule_policy.rb @@ -2,18 +2,18 @@ class RulePolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_rules) end def create? - admin? + role.can?(:manage_rules) end def update? - admin? + role.can?(:manage_rules) end def destroy? - admin? + role.can?(:manage_rules) end end diff --git a/app/policies/settings_policy.rb b/app/policies/settings_policy.rb index 874f97bab..2b052af27 100644 --- a/app/policies/settings_policy.rb +++ b/app/policies/settings_policy.rb @@ -2,14 +2,14 @@ class SettingsPolicy < ApplicationPolicy def update? - admin? + role.can?(:manage_settings) end def show? - admin? + role.can?(:manage_settings) end def destroy? - admin? + role.can?(:manage_settings) end end diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb index 75d95a90b..134721f95 100644 --- a/app/policies/status_policy.rb +++ b/app/policies/status_policy.rb @@ -8,7 +8,7 @@ class StatusPolicy < ApplicationPolicy end def index? - staff? + role.can?(:manage_reports, :manage_users) end def show? @@ -33,17 +33,17 @@ class StatusPolicy < ApplicationPolicy end def destroy? - staff? || owned? + role.can?(:manage_reports) || owned? end alias unreblog? destroy? def update? - staff? || owned? + role.can?(:manage_reports) || owned? end def review? - staff? + role.can?(:manage_taxonomies) end private diff --git a/app/policies/tag_policy.rb b/app/policies/tag_policy.rb index bdfcec0c9..bb1d37d6c 100644 --- a/app/policies/tag_policy.rb +++ b/app/policies/tag_policy.rb @@ -2,18 +2,18 @@ class TagPolicy < ApplicationPolicy def index? - staff? + role.can?(:manage_taxonomies) end def show? - staff? + role.can?(:manage_taxonomies) end def update? - staff? + role.can?(:manage_taxonomies) end def review? - staff? + role.can?(:manage_taxonomies) end end diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb index 140905e1f..6751b8b8f 100644 --- a/app/policies/user_policy.rb +++ b/app/policies/user_policy.rb @@ -2,52 +2,38 @@ class UserPolicy < ApplicationPolicy def reset_password? - staff? && !record.staff? + role.can?(:manage_user_access) && role.overrides?(record.role) end def change_email? - staff? && !record.staff? + role.can?(:manage_user_access) && role.overrides?(record.role) end def disable_2fa? - admin? && !record.staff? + role.can?(:manage_user_access) && role.overrides?(record.role) + end + + def change_role? + role.can?(:manage_roles) && role.overrides?(record.role) end def confirm? - staff? && !record.confirmed? + role.can?(:manage_user_access) && !record.confirmed? end def enable? - staff? + role.can?(:manage_users) end def approve? - staff? && !record.approved? + role.can?(:manage_users) && !record.approved? end def reject? - staff? && !record.approved? + role.can?(:manage_users) && !record.approved? end def disable? - staff? && !record.admin? - end - - def promote? - admin? && promotable? - end - - def demote? - admin? && !record.admin? && demoteable? - end - - private - - def promotable? - record.approved? && (!record.staff? || !record.admin?) - end - - def demoteable? - record.staff? + role.can?(:manage_users) && role.overrides?(record.role) end end diff --git a/app/policies/user_role_policy.rb b/app/policies/user_role_policy.rb new file mode 100644 index 000000000..6144a0ec4 --- /dev/null +++ b/app/policies/user_role_policy.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class UserRolePolicy < ApplicationPolicy + def index? + role.can?(:manage_roles) + end + + def create? + role.can?(:manage_roles) + end + + def update? + role.can?(:manage_roles) && (role.overrides?(record) || role.id == record.id) + end + + def destroy? + !record.everyone? && role.can?(:manage_roles) && role.overrides?(record) && role.id != record.id + end +end diff --git a/app/policies/webhook_policy.rb b/app/policies/webhook_policy.rb index 2c55703a1..a2199a333 100644 --- a/app/policies/webhook_policy.rb +++ b/app/policies/webhook_policy.rb @@ -2,34 +2,34 @@ class WebhookPolicy < ApplicationPolicy def index? - admin? + role.can?(:manage_webhooks) end def create? - admin? + role.can?(:manage_webhooks) end def show? - admin? + role.can?(:manage_webhooks) end def update? - admin? + role.can?(:manage_webhooks) end def enable? - admin? + role.can?(:manage_webhooks) end def disable? - admin? + role.can?(:manage_webhooks) end def rotate_secret? - admin? + role.can?(:manage_webhooks) end def destroy? - admin? + role.can?(:manage_webhooks) end end diff --git a/app/presenters/filter_result_presenter.rb b/app/presenters/filter_result_presenter.rb new file mode 100644 index 000000000..677225f5e --- /dev/null +++ b/app/presenters/filter_result_presenter.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class FilterResultPresenter < ActiveModelSerializers::Model + attributes :filter, :keyword_matches +end diff --git a/app/presenters/initial_state_presenter.rb b/app/presenters/initial_state_presenter.rb index 06482935c..129ea2a46 100644 --- a/app/presenters/initial_state_presenter.rb +++ b/app/presenters/initial_state_presenter.rb @@ -3,4 +3,8 @@ class InitialStatePresenter < ActiveModelSerializers::Model attributes :settings, :push_subscription, :token, :current_account, :admin, :text, :visibility + + def role + current_account&.user_role + end end diff --git a/app/presenters/status_relationships_presenter.rb b/app/presenters/status_relationships_presenter.rb index 4163bb098..d7ffb1954 100644 --- a/app/presenters/status_relationships_presenter.rb +++ b/app/presenters/status_relationships_presenter.rb @@ -2,7 +2,7 @@ class StatusRelationshipsPresenter attr_reader :reblogs_map, :favourites_map, :mutes_map, :pins_map, - :bookmarks_map + :bookmarks_map, :filters_map def initialize(statuses, current_account_id = nil, **options) if current_account_id.nil? @@ -11,12 +11,14 @@ class StatusRelationshipsPresenter @bookmarks_map = {} @mutes_map = {} @pins_map = {} + @filters_map = {} else statuses = statuses.compact status_ids = statuses.flat_map { |s| [s.id, s.reblog_of_id] }.uniq.compact conversation_ids = statuses.filter_map(&:conversation_id).uniq pinnable_status_ids = statuses.map(&:proper).filter_map { |s| s.id if s.account_id == current_account_id && %w(public unlisted private).include?(s.visibility) } + @filters_map = build_filters_map(statuses, current_account_id).merge(options[:filters_map] || {}) @reblogs_map = Status.reblogs_map(status_ids, current_account_id).merge(options[:reblogs_map] || {}) @favourites_map = Status.favourites_map(status_ids, current_account_id).merge(options[:favourites_map] || {}) @bookmarks_map = Status.bookmarks_map(status_ids, current_account_id).merge(options[:bookmarks_map] || {}) @@ -24,4 +26,24 @@ class StatusRelationshipsPresenter @pins_map = Status.pins_map(pinnable_status_ids, current_account_id).merge(options[:pins_map] || {}) end end + + private + + def build_filters_map(statuses, current_account_id) + active_filters = CustomFilter.cached_filters_for(current_account_id) + + @filters_map = statuses.each_with_object({}) do |status, h| + filter_matches = active_filters.filter_map do |filter, rules| + next if rules[:keywords].blank? + + match = rules[:keywords].match(status.proper.searchable_text) + FilterResultPresenter.new(filter: filter, keyword_matches: [match.to_s]) unless match.nil? + end + + unless filter_matches.empty? + h[status.id] = filter_matches + h[status.reblog_of_id] = filter_matches if status.reblog? + end + end + end end diff --git a/app/presenters/tag_relationships_presenter.rb b/app/presenters/tag_relationships_presenter.rb new file mode 100644 index 000000000..c3bdbaf07 --- /dev/null +++ b/app/presenters/tag_relationships_presenter.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class TagRelationshipsPresenter + attr_reader :following_map + + def initialize(tags, current_account_id = nil, **options) + @following_map = begin + if current_account_id.nil? + {} + else + TagFollow.select(:tag_id).where(tag_id: tags.map(&:id), account_id: current_account_id).each_with_object({}) { |f, h| h[f.tag_id] = true }.merge(options[:following_map] || {}) + end + end + end +end diff --git a/app/serializers/activitypub/hashtag_serializer.rb b/app/serializers/activitypub/hashtag_serializer.rb index 1a56e4dfe..90929c57f 100644 --- a/app/serializers/activitypub/hashtag_serializer.rb +++ b/app/serializers/activitypub/hashtag_serializer.rb @@ -10,11 +10,11 @@ class ActivityPub::HashtagSerializer < ActivityPub::Serializer end def name - "##{object.name}" + "##{object.display_name}" end def href - if object.class.name == 'FeaturedTag' + if object.instance_of?(FeaturedTag) short_account_tag_url(object.account, object.tag) else tag_url(object) diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 5eab02dbc..b555be633 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -7,6 +7,7 @@ class InitialStateSerializer < ActiveModel::Serializer :languages has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer + has_one :role, serializer: REST::RoleSerializer def max_toot_chars StatusLengthValidator::MAX_CHARS @@ -33,7 +34,6 @@ class InitialStateSerializer < ActiveModel::Serializer repository: Mastodon::Version.repository, source_url: Mastodon::Version.source_url, version: Mastodon::Version.to_s, - invites_enabled: Setting.min_invite_role == 'user', limited_federation_mode: Rails.configuration.x.whitelist_mode, mascot: instance_presenter.mascot&.file&.url, profile_directory: Setting.profile_directory, @@ -54,7 +54,6 @@ class InitialStateSerializer < ActiveModel::Serializer store[:advanced_layout] = object.current_account.user.setting_advanced_layout store[:use_blurhash] = object.current_account.user.setting_use_blurhash store[:use_pending_items] = object.current_account.user.setting_use_pending_items - store[:is_staff] = object.current_account.user.staff? store[:trends] = Setting.trends && object.current_account.user.setting_trends store[:default_content_type] = object.current_account.user.setting_default_content_type store[:system_emoji_font] = object.current_account.user.setting_system_emoji_font diff --git a/app/serializers/rest/admin/domain_allow_serializer.rb b/app/serializers/rest/admin/domain_allow_serializer.rb new file mode 100644 index 000000000..ebdf33815 --- /dev/null +++ b/app/serializers/rest/admin/domain_allow_serializer.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class REST::Admin::DomainAllowSerializer < ActiveModel::Serializer + attributes :id, :domain, :created_at + + def id + object.id.to_s + end +end diff --git a/app/serializers/rest/admin/report_serializer.rb b/app/serializers/rest/admin/report_serializer.rb index 237f41d8e..44b4726e4 100644 --- a/app/serializers/rest/admin/report_serializer.rb +++ b/app/serializers/rest/admin/report_serializer.rb @@ -2,7 +2,7 @@ class REST::Admin::ReportSerializer < ActiveModel::Serializer attributes :id, :action_taken, :action_taken_at, :category, :comment, - :created_at, :updated_at + :forwarded, :created_at, :updated_at has_one :account, serializer: REST::Admin::AccountSerializer has_one :target_account, serializer: REST::Admin::AccountSerializer diff --git a/app/serializers/rest/credential_account_serializer.rb b/app/serializers/rest/credential_account_serializer.rb index be0d763dc..27e1db207 100644 --- a/app/serializers/rest/credential_account_serializer.rb +++ b/app/serializers/rest/credential_account_serializer.rb @@ -3,6 +3,8 @@ class REST::CredentialAccountSerializer < REST::AccountSerializer attributes :source + has_one :role, serializer: REST::RoleSerializer + def source user = object.user @@ -15,4 +17,8 @@ class REST::CredentialAccountSerializer < REST::AccountSerializer follow_requests_count: FollowRequest.where(target_account: object).limit(40).count, } end + + def role + object.user_role + end end diff --git a/app/serializers/rest/featured_tag_serializer.rb b/app/serializers/rest/featured_tag_serializer.rb index 96adcc7d0..8abcd9b90 100644 --- a/app/serializers/rest/featured_tag_serializer.rb +++ b/app/serializers/rest/featured_tag_serializer.rb @@ -12,4 +12,8 @@ class REST::FeaturedTagSerializer < ActiveModel::Serializer def url short_account_tag_url(object.account, object.tag) end + + def name + object.display_name + end end diff --git a/app/serializers/rest/filter_keyword_serializer.rb b/app/serializers/rest/filter_keyword_serializer.rb new file mode 100644 index 000000000..dd2ebac6e --- /dev/null +++ b/app/serializers/rest/filter_keyword_serializer.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class REST::FilterKeywordSerializer < ActiveModel::Serializer + attributes :id, :keyword, :whole_word + + def id + object.id.to_s + end +end diff --git a/app/serializers/rest/filter_result_serializer.rb b/app/serializers/rest/filter_result_serializer.rb new file mode 100644 index 000000000..0ef4db79a --- /dev/null +++ b/app/serializers/rest/filter_result_serializer.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class REST::FilterResultSerializer < ActiveModel::Serializer + belongs_to :filter, serializer: REST::FilterSerializer + has_many :keyword_matches +end diff --git a/app/serializers/rest/filter_serializer.rb b/app/serializers/rest/filter_serializer.rb index 57205630b..98d7edb17 100644 --- a/app/serializers/rest/filter_serializer.rb +++ b/app/serializers/rest/filter_serializer.rb @@ -1,10 +1,14 @@ # frozen_string_literal: true class REST::FilterSerializer < ActiveModel::Serializer - attributes :id, :phrase, :context, :whole_word, :expires_at, - :irreversible + attributes :id, :title, :context, :expires_at, :filter_action + has_many :keywords, serializer: REST::FilterKeywordSerializer, if: :rules_requested? def id object.id.to_s end + + def rules_requested? + instance_options[:rules_requested] + end end diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index 2c8cd7734..575c6214e 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -106,7 +106,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer end def invites_enabled - Setting.min_invite_role == 'user' + UserRole.everyone.can?(:invite_users) end private diff --git a/app/serializers/rest/notification_serializer.rb b/app/serializers/rest/notification_serializer.rb index 69b81f6de..137fc53dd 100644 --- a/app/serializers/rest/notification_serializer.rb +++ b/app/serializers/rest/notification_serializer.rb @@ -5,6 +5,7 @@ class REST::NotificationSerializer < ActiveModel::Serializer belongs_to :from_account, key: :account, serializer: REST::AccountSerializer belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer + belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer def id object.id.to_s @@ -13,4 +14,8 @@ class REST::NotificationSerializer < ActiveModel::Serializer def status_type? [:favourite, :reblog, :status, :mention, :poll, :update].include?(object.type) end + + def report_type? + object.type == :'admin.report' + end end diff --git a/app/serializers/rest/report_serializer.rb b/app/serializers/rest/report_serializer.rb index ecb88d653..de68dfc6d 100644 --- a/app/serializers/rest/report_serializer.rb +++ b/app/serializers/rest/report_serializer.rb @@ -1,7 +1,10 @@ # frozen_string_literal: true class REST::ReportSerializer < ActiveModel::Serializer - attributes :id, :action_taken + attributes :id, :action_taken, :action_taken_at, :category, :comment, + :forwarded, :created_at, :status_ids, :rule_ids + + has_one :target_account, serializer: REST::AccountSerializer def id object.id.to_s diff --git a/app/serializers/rest/role_serializer.rb b/app/serializers/rest/role_serializer.rb new file mode 100644 index 000000000..5b81c6e04 --- /dev/null +++ b/app/serializers/rest/role_serializer.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class REST::RoleSerializer < ActiveModel::Serializer + attributes :id, :name, :permissions, :color, :highlighted + + def id + object.id.to_s + end + + def permissions + object.computed_permissions.to_s + end +end diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index ef2c6c6e5..659c45b83 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -14,6 +14,7 @@ class REST::StatusSerializer < ActiveModel::Serializer attribute :bookmarked, if: :current_user? attribute :pinned, if: :pinnable? attribute :local_only if :local? + has_many :filtered, serializer: REST::FilterResultSerializer, if: :current_user? attribute :content, unless: :source_requested? attribute :text, if: :source_requested? @@ -122,6 +123,14 @@ class REST::StatusSerializer < ActiveModel::Serializer end end + def filtered + if instance_options && instance_options[:relationships] + instance_options[:relationships].filters_map[object.id] || [] + else + current_user.account.status_matches_filters(object) + end + end + def pinnable? current_user? && current_user.account_id == object.account_id && diff --git a/app/serializers/rest/tag_serializer.rb b/app/serializers/rest/tag_serializer.rb index 74aa571a4..7801e77d1 100644 --- a/app/serializers/rest/tag_serializer.rb +++ b/app/serializers/rest/tag_serializer.rb @@ -5,7 +5,25 @@ class REST::TagSerializer < ActiveModel::Serializer attributes :name, :url, :history + attribute :following, if: :current_user? + def url tag_url(object) end + + def name + object.display_name + end + + def following + if instance_options && instance_options[:relationships] + instance_options[:relationships].following_map[object.id] || false + else + TagFollow.where(tag_id: object.id, account_id: current_user.account_id).exists? + end + end + + def current_user? + !current_user.nil? + end end diff --git a/app/serializers/rest/v1/filter_serializer.rb b/app/serializers/rest/v1/filter_serializer.rb new file mode 100644 index 000000000..455f17efd --- /dev/null +++ b/app/serializers/rest/v1/filter_serializer.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class REST::V1::FilterSerializer < ActiveModel::Serializer + attributes :id, :phrase, :context, :whole_word, :expires_at, + :irreversible + + delegate :context, :expires_at, to: :custom_filter + + def id + object.id.to_s + end + + def phrase + object.keyword + end + + def irreversible + custom_filter.irreversible? + end + + private + + def custom_filter + object.custom_filter + end +end diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index 6fe4b6593..4dcae20eb 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -61,11 +61,11 @@ class AccountSearchService < BaseService end def advanced_search_results - Account.advanced_search_for(terms_for_query, account, limit_for_non_exact_results, options[:following], offset) + Account.advanced_search_for(terms_for_query, account, limit: limit_for_non_exact_results, following: options[:following], offset: offset) end def simple_search_results - Account.search_for(terms_for_query, limit_for_non_exact_results, offset) + Account.search_for(terms_for_query, limit: limit_for_non_exact_results, offset: offset) end def from_elasticsearch diff --git a/app/services/appeal_service.rb b/app/services/appeal_service.rb index cef9be05f..399a053d6 100644 --- a/app/services/appeal_service.rb +++ b/app/services/appeal_service.rb @@ -22,7 +22,7 @@ class AppealService < BaseService end def notify_staff! - User.staff.includes(:account).each do |u| + User.those_who_can(:manage_appeals).includes(:account).each do |u| AdminMailer.new_appeal(u.account, @appeal).deliver_later if u.allows_appeal_emails? end end diff --git a/app/services/bootstrap_timeline_service.rb b/app/services/bootstrap_timeline_service.rb index a02e55a6d..126c0fa2e 100644 --- a/app/services/bootstrap_timeline_service.rb +++ b/app/services/bootstrap_timeline_service.rb @@ -17,7 +17,7 @@ class BootstrapTimelineService < BaseService end def notify_staff! - User.staff.includes(:account).find_each do |user| + User.those_who_can(:manage_users).includes(:account).find_each do |user| LocalNotificationWorker.perform_async(user.account_id, @source_account.id, 'Account', 'admin.sign_up') end end diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index 9d6d7e784..1df522459 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -16,6 +16,7 @@ class FanOutOnWriteService < BaseService check_race_condition! fan_out_to_local_recipients! + fan_out_to_public_recipients! if broadcastable? fan_out_to_public_streams! if broadcastable? end @@ -51,6 +52,10 @@ class FanOutOnWriteService < BaseService end end + def fan_out_to_public_recipients! + deliver_to_hashtag_followers! + end + def fan_out_to_public_streams! broadcast_to_hashtag_streams! broadcast_to_public_streams! @@ -85,6 +90,14 @@ class FanOutOnWriteService < BaseService end end + def deliver_to_hashtag_followers! + TagFollow.where(tag_id: @status.tags.map(&:id)).select(:id, :account_id).reorder(nil).find_in_batches do |follows| + FeedInsertWorker.push_bulk(follows) do |follow| + [@status.id, follow.account_id, 'tags', { 'update' => update? }] + end + end + end + def deliver_to_lists! @account.lists_for_local_distribution.select(:id).reorder(nil).find_in_batches do |lists| FeedInsertWorker.push_bulk(lists) do |list| @@ -108,7 +121,7 @@ class FanOutOnWriteService < BaseService end def broadcast_to_hashtag_streams! - @status.tags.pluck(:name).each do |hashtag| + @status.tags.map(&:name).each do |hashtag| redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}", anonymous_payload) redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}:local", anonymous_payload) if @status.local? end diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index d30b33876..c7454fc60 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -76,7 +76,7 @@ class NotifyService < BaseService end def from_staff? - @notification.from_account.local? && @notification.from_account.user.present? && @notification.from_account.user.staff? + @notification.from_account.local? && @notification.from_account.user.present? && @notification.from_account.user_role&.overrides?(@recipient.user_role) end def optional_non_following_and_direct? diff --git a/app/services/report_service.rb b/app/services/report_service.rb index d251bb33f..8c92cf334 100644 --- a/app/services/report_service.rb +++ b/app/services/report_service.rb @@ -38,9 +38,9 @@ class ReportService < BaseService def notify_staff! return if @report.unresolved_siblings? - User.staff.includes(:account).each do |u| - next unless u.allows_report_emails? - AdminMailer.new_report(u.account, @report).deliver_later + User.those_who_can(:manage_reports).includes(:account).each do |u| + LocalNotificationWorker.perform_async(u.account_id, @report.id, 'Report', 'admin.report') + AdminMailer.new_report(u.account, @report).deliver_later if u.allows_report_emails? end end @@ -57,7 +57,16 @@ class ReportService < BaseService end def reported_status_ids - AccountStatusesFilter.new(@target_account, @source_account).results.with_discarded.find(Array(@status_ids)).pluck(:id) + return AccountStatusesFilter.new(@target_account, @source_account).results.with_discarded.find(Array(@status_ids)).pluck(:id) if @source_account.local? + + # If the account making reports is remote, it is likely anonymized so we have to relax the requirements for attaching statuses. + domain = @source_account.domain.to_s.downcase + has_followers = @target_account.followers.where(Account.arel_table[:domain].lower.eq(domain)).exists? + visibility = has_followers ? %i(public unlisted private) : %i(public unlisted) + scope = @target_account.statuses.with_discarded + scope.merge!(scope.where(visibility: visibility).or(scope.where('EXISTS (SELECT 1 FROM mentions m JOIN accounts a ON m.account_id = a.id WHERE lower(a.domain) = ?)', domain))) + # Allow missing posts to not drop reports that include e.g. a deleted post + scope.where(id: Array(@status_ids)).pluck(:id) end def payload diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index 72e9c6611..7fa688bd3 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -75,7 +75,7 @@ = link_to short_account_tag_path(@account, featured_tag.tag) do %h4 = fa_icon 'hashtag' - = featured_tag.name + = featured_tag.display_name %small - if featured_tag.last_status_at.nil? = t('accounts.nothing_here') diff --git a/app/views/accounts/show.rss.ruby b/app/views/accounts/show.rss.ruby index fd45a8b2b..34e29d483 100644 --- a/app/views/accounts/show.rss.ruby +++ b/app/views/accounts/show.rss.ruby @@ -28,7 +28,7 @@ RSS::Builder.build do |doc| end status.tags.each do |tag| - item.category(tag.name) + item.category(tag.display_name) end end end diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml index 0290df7de..84040e480 100644 --- a/app/views/admin/accounts/index.html.haml +++ b/app/views/admin/accounts/index.html.haml @@ -1,45 +1,36 @@ - content_for :page_title do = t('admin.accounts.title') -.filters - .filter-subset - %strong= t('admin.accounts.location.title') - %ul - %li= filter_link_to t('generic.all'), origin: nil - %li= filter_link_to t('admin.accounts.location.local'), origin: 'local' - %li= filter_link_to t('admin.accounts.location.remote'), origin: 'remote' - .filter-subset - %strong= t('admin.accounts.moderation.title') - %ul - %li= filter_link_to t('generic.all'), status: nil - %li= filter_link_to t('admin.accounts.moderation.active'), status: 'active' - %li= filter_link_to t('admin.accounts.moderation.suspended'), status: 'suspended' - %li= filter_link_to safe_join([t('admin.accounts.moderation.pending'), "(#{number_with_delimiter(User.pending.count)})"], ' '), status: 'pending' - .filter-subset - %strong= t('admin.accounts.role') - %ul - %li= filter_link_to t('admin.accounts.moderation.all'), permissions: nil - %li= filter_link_to t('admin.accounts.roles.staff'), permissions: 'staff' - .filter-subset - %strong= t 'generic.order_by' - %ul - %li= filter_link_to t('relationships.most_recent'), order: nil - %li= filter_link_to t('relationships.last_active'), order: 'active' - = form_tag admin_accounts_url, method: 'GET', class: 'simple_form' do - .fields-group - - (AccountFilter::KEYS - %i(origin status permissions)).each do |key| - - if params[key].present? - = hidden_field_tag key, params[key] + .filters + .filter-subset.filter-subset--with-select + %strong= t('admin.accounts.location.title') + .input.select.optional + = select_tag :origin, options_for_select([[t('admin.accounts.location.local'), 'local'], [t('admin.accounts.location.remote'), 'remote']], params[:origin]), prompt: I18n.t('generic.all') + .filter-subset.filter-subset--with-select + %strong= t('admin.accounts.moderation.title') + .input.select.optional + = select_tag :status, options_for_select([[t('admin.accounts.moderation.active'), 'active'], [t('admin.accounts.moderation.silenced'), 'silenced'], [t('admin.accounts.moderation.suspended'), 'suspended'], [safe_join([t('admin.accounts.moderation.pending'), "(#{number_with_delimiter(User.pending.count)})"], ' '), 'pending']], params[:status]), prompt: I18n.t('generic.all') + .filter-subset.filter-subset--with-select + %strong= t('admin.accounts.role') + .input.select.optional + = select_tag :role_ids, options_from_collection_for_select(UserRole.assignable, :id, :name, params[:role_ids]), prompt: I18n.t('admin.accounts.moderation.all') + .filter-subset.filter-subset--with-select + %strong= t 'generic.order_by' + .input.select + = select_tag :order, options_for_select([[t('relationships.most_recent'), nil], [t('relationships.last_active'), 'active']], params[:order]) + .fields-group - %i(username by_domain display_name email ip).each do |key| - unless key == :by_domain && params[:origin] != 'remote' .input.string.optional = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}") - .actions - %button.button= t('admin.accounts.search') - = link_to t('admin.accounts.reset'), admin_accounts_path, class: 'button negative' + .actions + %button.button= t('admin.accounts.search') + = link_to t('admin.accounts.reset'), admin_accounts_path, class: 'button negative' + +%hr.spacer/ = form_for(@form, url: batch_admin_accounts_path) do |f| = hidden_field_tag :page, params[:page] || 1 diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index a69832b04..dc3b35956 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -92,10 +92,13 @@ %tr %th= t('admin.accounts.role') - %td= t("admin.accounts.roles.#{@account.user&.role}") %td - = table_link_to 'angle-double-up', t('admin.accounts.promote'), promote_admin_account_role_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:promote, @account.user) - = table_link_to 'angle-double-down', t('admin.accounts.demote'), demote_admin_account_role_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:demote, @account.user) + - if @account.user_role&.everyone? + = t('admin.accounts.no_role_assigned') + - else + = @account.user_role&.name + %td + = table_link_to 'vcard', t('admin.accounts.change_role.label'), admin_user_role_path(@account.user) if can?(:change_role, @account.user) %tr %th{ rowspan: can?(:create, :email_domain_block) ? 3 : 2 }= t('admin.accounts.email') diff --git a/app/views/admin/action_logs/index.html.haml b/app/views/admin/action_logs/index.html.haml index 03d5bffb9..7869570e6 100644 --- a/app/views/admin/action_logs/index.html.haml +++ b/app/views/admin/action_logs/index.html.haml @@ -8,7 +8,7 @@ .filter-subset.filter-subset--with-select %strong= t('admin.action_logs.filter_by_user') .input.select.optional - = select_tag :account_id, options_from_collection_for_select(Account.joins(:user).merge(User.staff), :id, :username, params[:account_id]), prompt: I18n.t('admin.accounts.moderation.all') + = select_tag :account_id, options_from_collection_for_select(@auditable_accounts, :id, :username, params[:account_id]), prompt: I18n.t('admin.accounts.moderation.all') .filter-subset.filter-subset--with-select %strong= t('admin.action_logs.filter_by_action') diff --git a/app/views/admin/instances/show.html.haml b/app/views/admin/instances/show.html.haml index e8cc1c400..00c1927df 100644 --- a/app/views/admin/instances/show.html.haml +++ b/app/views/admin/instances/show.html.haml @@ -1,32 +1,33 @@ - content_for :page_title do = @instance.domain -- content_for :heading_actions do - = l(@time_period.first) - = ' - ' - = l(@time_period.last) +- if current_user.can?(:view_dashboard) + - content_for :heading_actions do + = l(@time_period.first) + = ' - ' + = l(@time_period.last) -%p - = fa_icon 'info fw' - = t('admin.instances.totals_time_period_hint_html') + %p + = fa_icon 'info fw' + = t('admin.instances.totals_time_period_hint_html') -.dashboard - .dashboard__item - = react_admin_component :counter, measure: 'instance_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_accounts_measure'), href: admin_accounts_path(origin: 'remote', by_domain: @instance.domain) - .dashboard__item - = react_admin_component :counter, measure: 'instance_statuses', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_statuses_measure') - .dashboard__item - = react_admin_component :counter, measure: 'instance_media_attachments', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_media_attachments_measure') - .dashboard__item - = react_admin_component :counter, measure: 'instance_follows', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_follows_measure') - .dashboard__item - = react_admin_component :counter, measure: 'instance_followers', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_followers_measure') - .dashboard__item - = react_admin_component :counter, measure: 'instance_reports', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_reports_measure'), href: admin_reports_path(by_target_domain: @instance.domain) - .dashboard__item - = react_admin_component :dimension, dimension: 'instance_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, limit: 8, label: t('admin.instances.dashboard.instance_accounts_dimension') - .dashboard__item - = react_admin_component :dimension, dimension: 'instance_languages', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, limit: 8, label: t('admin.instances.dashboard.instance_languages_dimension') + .dashboard + .dashboard__item + = react_admin_component :counter, measure: 'instance_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_accounts_measure'), href: admin_accounts_path(origin: 'remote', by_domain: @instance.domain) + .dashboard__item + = react_admin_component :counter, measure: 'instance_statuses', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_statuses_measure') + .dashboard__item + = react_admin_component :counter, measure: 'instance_media_attachments', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_media_attachments_measure') + .dashboard__item + = react_admin_component :counter, measure: 'instance_follows', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_follows_measure') + .dashboard__item + = react_admin_component :counter, measure: 'instance_followers', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_followers_measure') + .dashboard__item + = react_admin_component :counter, measure: 'instance_reports', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_reports_measure'), href: admin_reports_path(by_target_domain: @instance.domain) + .dashboard__item + = react_admin_component :dimension, dimension: 'instance_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, limit: 8, label: t('admin.instances.dashboard.instance_accounts_dimension') + .dashboard__item + = react_admin_component :dimension, dimension: 'instance_languages', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, limit: 8, label: t('admin.instances.dashboard.instance_languages_dimension') %hr.spacer/ diff --git a/app/views/admin/roles/_form.html.haml b/app/views/admin/roles/_form.html.haml new file mode 100644 index 000000000..9beaf619f --- /dev/null +++ b/app/views/admin/roles/_form.html.haml @@ -0,0 +1,40 @@ += simple_form_for @role, url: @role.new_record? ? admin_roles_path : admin_role_path(@role) do |f| + = render 'shared/error_messages', object: @role + + - if @role.everyone? + .flash-message.info + = t('admin.roles.everyone_full_description_html') + - else + .fields-group + = f.input :name, wrapper: :with_label + + - unless current_user.role.id == @role.id + .fields-group + = f.input :position, wrapper: :with_label, input_html: { max: current_user.role.position - 1 } + + .fields-group + = f.input :color, wrapper: :with_label, input_html: { placeholder: '#000000' } + + %hr.spacer/ + + .fields-group + = f.input :highlighted, wrapper: :with_label + + %hr.spacer/ + + - unless current_user.role.id == @role.id + + .field-group + .input.with_block_label + %label= t('simple_form.labels.user_role.permissions_as_keys') + %span.hint= t('simple_form.hints.user_role.permissions_as_keys') + + - (@role.everyone? ? UserRole::Flags::CATEGORIES.slice(:invites) : UserRole::Flags::CATEGORIES).each do |category, permissions| + %h4= t(category, scope: 'admin.roles.categories') + + = f.input :permissions_as_keys, collection: permissions, wrapper: :with_block_label, include_blank: false, label_method: lambda { |privilege| safe_join([t("admin.roles.privileges.#{privilege}"), content_tag(:span, t("admin.roles.privileges.#{privilege}_description"), class: 'hint')]) }, required: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', label: false, hint: false, disabled: permissions.filter { |privilege| UserRole::FLAGS[privilege] & current_user.role.computed_permissions == 0 } + + %hr.spacer/ + + .actions + = f.button :button, @role.new_record? ? t('admin.roles.add_new') : t('generic.save_changes'), type: :submit diff --git a/app/views/admin/roles/_role.html.haml b/app/views/admin/roles/_role.html.haml new file mode 100644 index 000000000..798d8d8b4 --- /dev/null +++ b/app/views/admin/roles/_role.html.haml @@ -0,0 +1,30 @@ +.announcements-list__item + - if can?(:update, role) + = link_to edit_admin_role_path(role), class: 'announcements-list__item__title' do + %span.user-role{ class: "user-role-#{role.id}" } + = fa_icon 'users fw' + + - if role.everyone? + = t('admin.roles.everyone') + - else + = role.name + - else + %span.announcements-list__item__title + %span.user-role{ class: "user-role-#{role.id}" } + = fa_icon 'users fw' + + - if role.everyone? + = t('admin.roles.everyone') + - else + = role.name + + .announcements-list__item__action-bar + .announcements-list__item__meta + - if role.everyone? + = t('admin.roles.everyone_full_description_html') + - else + = link_to t('admin.roles.assigned_users', count: role.users.count), admin_accounts_path(role_ids: role.id) + • + %abbr{ title: role.permissions_as_keys.map { |privilege| I18n.t("admin.roles.privileges.#{privilege}") }.join(', ') }= t('admin.roles.permissions_count', count: role.permissions_as_keys.size) + %div + = table_link_to 'pencil', t('admin.accounts.edit'), edit_admin_role_path(role) if can?(:update, role) diff --git a/app/views/admin/roles/edit.html.haml b/app/views/admin/roles/edit.html.haml new file mode 100644 index 000000000..659ccb8dc --- /dev/null +++ b/app/views/admin/roles/edit.html.haml @@ -0,0 +1,8 @@ +- content_for :page_title do + = t('admin.roles.edit', name: @role.everyone? ? t('admin.roles.everyone') : @role.name) + +- content_for :heading_actions do + = link_to t('admin.roles.delete'), admin_role_path(@role), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:destroy, @role) + += render partial: 'form' + diff --git a/app/views/admin/roles/index.html.haml b/app/views/admin/roles/index.html.haml new file mode 100644 index 000000000..4f6c511b4 --- /dev/null +++ b/app/views/admin/roles/index.html.haml @@ -0,0 +1,17 @@ +- content_for :page_title do + = t('admin.roles.title') + +- content_for :heading_actions do + = link_to t('admin.roles.add_new'), new_admin_role_path, class: 'button' if can?(:create, :user_role) + +%p= t('admin.roles.description_html') + +%hr.spacer/ + +.applications-list + = render partial: 'role', collection: @roles.select(&:everyone?) + +%hr.spacer/ + +.applications-list + = render partial: 'role', collection: @roles.reject(&:everyone?) diff --git a/app/views/admin/roles/new.html.haml b/app/views/admin/roles/new.html.haml new file mode 100644 index 000000000..821079271 --- /dev/null +++ b/app/views/admin/roles/new.html.haml @@ -0,0 +1,4 @@ +- content_for :page_title do + = t('admin.roles.add_new') + += render partial: 'form' diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml index dd794b727..98af7e718 100644 --- a/app/views/admin/settings/edit.html.haml +++ b/app/views/admin/settings/edit.html.haml @@ -62,9 +62,6 @@ = f.input :show_known_fediverse_at_about_page, as: :boolean, wrapper: :with_label, label: t('admin.settings.show_known_fediverse_at_about_page.title'), hint: t('admin.settings.show_known_fediverse_at_about_page.desc_html') .fields-group - = f.input :show_staff_badge, as: :boolean, wrapper: :with_label, label: t('admin.settings.show_staff_badge.title'), hint: t('admin.settings.show_staff_badge.desc_html') - - .fields-group = f.input :open_deletion, as: :boolean, wrapper: :with_label, label: t('admin.settings.registrations.deletion.title'), hint: t('admin.settings.registrations.deletion.desc_html') - unless whitelist_mode? @@ -103,9 +100,6 @@ %hr.spacer/ - .fields-group - = f.input :min_invite_role, wrapper: :with_label, collection: %i(disabled user moderator admin), label: t('admin.settings.registrations.min_invite_role.title'), label_method: lambda { |role| role == :disabled ? t('admin.settings.registrations.min_invite_role.disabled') : t("admin.accounts.roles.#{role}") }, include_blank: false, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' - .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :show_domain_blocks, wrapper: :with_label, collection: %i(disabled users all), label: t('admin.settings.domain_blocks.title'), label_method: lambda { |value| t("admin.settings.domain_blocks.#{value}") }, include_blank: false, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' diff --git a/app/views/admin/tags/show.html.haml b/app/views/admin/tags/show.html.haml index 5ac57e1f2..71bce0c0c 100644 --- a/app/views/admin/tags/show.html.haml +++ b/app/views/admin/tags/show.html.haml @@ -1,55 +1,56 @@ - content_for :page_title do - = "##{@tag.name}" - -- content_for :heading_actions do - = l(@time_period.first) - = ' - ' - = l(@time_period.last) - -.dashboard - .dashboard__item - = react_admin_component :counter, measure: 'tag_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_accounts_measure'), href: tag_url(@tag), target: '_blank' - .dashboard__item - = react_admin_component :counter, measure: 'tag_uses', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_uses_measure') - .dashboard__item - = react_admin_component :counter, measure: 'tag_servers', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_servers_measure') - .dashboard__item - = react_admin_component :dimension, dimension: 'tag_servers', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, limit: 8, label: t('admin.trends.tags.dashboard.tag_servers_dimension') - .dashboard__item - = react_admin_component :dimension, dimension: 'tag_languages', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, limit: 8, label: t('admin.trends.tags.dashboard.tag_languages_dimension') - .dashboard__item - = link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.usable? ? 'positive' : 'negative'] do - - if @tag.usable? - %span= t('admin.trends.tags.usable') - = fa_icon 'check fw' - - else - %span= t('admin.trends.tags.not_usable') - = fa_icon 'lock fw' - - = link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.trendable? ? 'positive' : 'negative'] do - - if @tag.trendable? - %span= t('admin.trends.tags.trendable') - = fa_icon 'check fw' - - else - %span= t('admin.trends.tags.not_trendable') - = fa_icon 'lock fw' - - - = link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.listable? ? 'positive' : 'negative'] do - - if @tag.listable? - %span= t('admin.trends.tags.listable') - = fa_icon 'check fw' - - else - %span= t('admin.trends.tags.not_listable') - = fa_icon 'lock fw' - -%hr.spacer/ + = "##{@tag.display_name}" + +- if current_user.can?(:view_dashboard) + - content_for :heading_actions do + = l(@time_period.first) + = ' - ' + = l(@time_period.last) + + .dashboard + .dashboard__item + = react_admin_component :counter, measure: 'tag_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_accounts_measure'), href: tag_url(@tag), target: '_blank' + .dashboard__item + = react_admin_component :counter, measure: 'tag_uses', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_uses_measure') + .dashboard__item + = react_admin_component :counter, measure: 'tag_servers', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_servers_measure') + .dashboard__item + = react_admin_component :dimension, dimension: 'tag_servers', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, limit: 8, label: t('admin.trends.tags.dashboard.tag_servers_dimension') + .dashboard__item + = react_admin_component :dimension, dimension: 'tag_languages', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, limit: 8, label: t('admin.trends.tags.dashboard.tag_languages_dimension') + .dashboard__item + = link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.usable? ? 'positive' : 'negative'] do + - if @tag.usable? + %span= t('admin.trends.tags.usable') + = fa_icon 'check fw' + - else + %span= t('admin.trends.tags.not_usable') + = fa_icon 'lock fw' + + = link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.trendable? ? 'positive' : 'negative'] do + - if @tag.trendable? + %span= t('admin.trends.tags.trendable') + = fa_icon 'check fw' + - else + %span= t('admin.trends.tags.not_trendable') + = fa_icon 'lock fw' + + + = link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.listable? ? 'positive' : 'negative'] do + - if @tag.listable? + %span= t('admin.trends.tags.listable') + = fa_icon 'check fw' + - else + %span= t('admin.trends.tags.not_listable') + = fa_icon 'lock fw' + + %hr.spacer/ = simple_form_for @tag, url: admin_tag_path(@tag.id) do |f| = render 'shared/error_messages', object: @tag .fields-group - = f.input :name, wrapper: :with_block_label + = f.input :display_name, wrapper: :with_block_label .fields-group = f.input :usable, as: :boolean, wrapper: :with_label diff --git a/app/views/admin/trends/tags/_tag.html.haml b/app/views/admin/trends/tags/_tag.html.haml index 7bb99b158..a30666a08 100644 --- a/app/views/admin/trends/tags/_tag.html.haml +++ b/app/views/admin/trends/tags/_tag.html.haml @@ -6,7 +6,7 @@ .pending-account__header = link_to admin_tag_path(tag.id) do = fa_icon 'hashtag' - = tag.name + = tag.display_name %br/ diff --git a/app/views/admin/users/roles/show.html.haml b/app/views/admin/users/roles/show.html.haml new file mode 100644 index 000000000..821618060 --- /dev/null +++ b/app/views/admin/users/roles/show.html.haml @@ -0,0 +1,9 @@ +- content_for :page_title do + = t('admin.accounts.change_role.title', username: @user.account.username) + += simple_form_for @user, url: admin_user_role_path(@user) do |f| + .fields-group + = f.association :role, wrapper: :with_block_label, collection: UserRole.assignable, label_method: :name, include_blank: I18n.t('admin.accounts.change_role.no_role') + + .actions + = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/admin_mailer/_new_trending_tags.text.erb b/app/views/admin_mailer/_new_trending_tags.text.erb index cde5af4e4..363df369d 100644 --- a/app/views/admin_mailer/_new_trending_tags.text.erb +++ b/app/views/admin_mailer/_new_trending_tags.text.erb @@ -1,12 +1,12 @@ <%= raw t('admin_mailer.new_trends.new_trending_tags.title') %> <% @tags.each do |tag| %> -- #<%= tag.name %> +- #<%= tag.display_name %> <%= raw t('admin.trends.tags.usage_comparison', today: tag.history.get(Time.now.utc).accounts, yesterday: tag.history.get(Time.now.utc - 1.day).accounts) %> • <%= t('admin.trends.tags.current_score', score: Trends.tags.score(tag.id).round(2)) %> <% end %> <% if @lowest_trending_tag %> -<%= raw t('admin_mailer.new_trends.new_trending_tags.requirements', lowest_tag_name: @lowest_trending_tag.name, lowest_tag_score: Trends.tags.score(@lowest_trending_tag.id).round(2), rank: Trends.tags.options[:review_threshold]) %> +<%= raw t('admin_mailer.new_trends.new_trending_tags.requirements', lowest_tag_name: @lowest_trending_tag.display_name, lowest_tag_score: Trends.tags.score(@lowest_trending_tag.id).round(2), rank: Trends.tags.options[:review_threshold]) %> <% else %> <%= raw t('admin_mailer.new_trends.new_trending_tags.no_approved_tags') %> <% end %> diff --git a/app/views/application/_sidebar.html.haml b/app/views/application/_sidebar.html.haml index 0a952add0..cc157bf47 100644 --- a/app/views/application/_sidebar.html.haml +++ b/app/views/application/_sidebar.html.haml @@ -13,4 +13,4 @@ %h4.emojify= t('footer.trending_now') - trends.each do |tag| - = react_component :hashtag, hashtag: ActiveModelSerializers::SerializableResource.new(tag, serializer: REST::TagSerializer).as_json + = react_component :hashtag, hashtag: ActiveModelSerializers::SerializableResource.new(tag, serializer: REST::TagSerializer, scope: current_user, scope_name: :current_user).as_json diff --git a/app/views/custom_css/show.css.erb b/app/views/custom_css/show.css.erb new file mode 100644 index 000000000..bcbe81962 --- /dev/null +++ b/app/views/custom_css/show.css.erb @@ -0,0 +1,12 @@ +<%- if Setting.custom_css.present? %> +<%= raw Setting.custom_css %> + +<%- end %> +<%- UserRole.where(highlighted: true).select { |role| role.color.present? }.each do |role| %> +.user-role-<%= role.id %> { + --user-role-accent: <%= role.color %>; + --user-role-background: <%= role.color + '19' %>; + --user-role-border: <%= role.color + '80' %>; +} + +<%- end %> diff --git a/app/views/filters/_fields.html.haml b/app/views/filters/_fields.html.haml deleted file mode 100644 index 84dcdcca5..000000000 --- a/app/views/filters/_fields.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -.fields-row - .fields-row__column.fields-row__column-6.fields-group - = f.input :phrase, as: :string, wrapper: :with_label, hint: false - .fields-row__column.fields-row__column-6.fields-group - = f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, include_blank: I18n.t('invites.expires_in_prompt') - -.fields-group - = f.input :context, wrapper: :with_block_label, collection: CustomFilter::VALID_CONTEXTS, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', label_method: lambda { |context| I18n.t("filters.contexts.#{context}") }, include_blank: false - -%hr.spacer/ - -.fields-group - = f.input :irreversible, wrapper: :with_label - -.fields-group - = f.input :whole_word, wrapper: :with_label diff --git a/app/views/filters/_filter.html.haml b/app/views/filters/_filter.html.haml new file mode 100644 index 000000000..2ab014081 --- /dev/null +++ b/app/views/filters/_filter.html.haml @@ -0,0 +1,32 @@ +.filters-list__item{ class: [filter.expired? && 'expired'] } + = link_to edit_filter_path(filter), class: 'filters-list__item__title' do + = filter.title + + - if filter.expires? + .expiration{ title: t('filters.index.expires_on', date: l(filter.expires_at)) } + - if filter.expired? + = t('invites.expired') + - else + = t('filters.index.expires_in', distance: distance_of_time_in_words_to_now(filter.expires_at)) + + .filters-list__item__permissions + %ul.permissions-list + - unless filter.keywords.empty? + %li.permissions-list__item + .permissions-list__item__icon + = fa_icon('paragraph') + .permissions-list__item__text + .permissions-list__item__text__title + = t('filters.index.keywords', count: filter.keywords.size) + .permissions-list__item__text__type + - keywords = filter.keywords.map(&:keyword) + - keywords = keywords.take(5) + ['…'] if keywords.size > 5 # TODO + = keywords.join(', ') + + .announcements-list__item__action-bar + .announcements-list__item__meta + = t('filters.index.contexts', contexts: filter.context.map { |context| I18n.t("filters.contexts.#{context}") }.join(', ')) + + %div + = table_link_to 'pencil', t('filters.edit.title'), edit_filter_path(filter) + = table_link_to 'times', t('filters.index.delete'), filter_path(filter), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } diff --git a/app/views/filters/_filter_fields.html.haml b/app/views/filters/_filter_fields.html.haml new file mode 100644 index 000000000..1a52faa7a --- /dev/null +++ b/app/views/filters/_filter_fields.html.haml @@ -0,0 +1,33 @@ +.fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :title, as: :string, wrapper: :with_label, hint: false + .fields-row__column.fields-row__column-6.fields-group + = f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, include_blank: I18n.t('invites.expires_in_prompt') + +.fields-group + = f.input :context, wrapper: :with_block_label, collection: CustomFilter::VALID_CONTEXTS, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', label_method: lambda { |context| I18n.t("filters.contexts.#{context}") }, include_blank: false + +%hr.spacer/ + +.fields-group + = f.input :filter_action, as: :radio_buttons, collection: %i(warn hide), include_blank: false, wrapper: :with_block_label, label_method: ->(action) { safe_join([t("simple_form.labels.filters.actions.#{action}"), content_tag(:span, t("simple_form.hints.filters.actions.#{action}"), class: 'hint')]) }, hint: t('simple_form.hints.filters.action'), required: true + +%hr.spacer/ + +%h4= t('filters.edit.keywords') + +.table-wrapper + %table.table.keywords-table + %thead + %tr + %th= t('simple_form.labels.defaults.phrase') + %th= t('simple_form.labels.defaults.whole_word') + %th + %tbody + = f.simple_fields_for :keywords do |keyword| + = render 'keyword_fields', f: keyword + %tfoot + %tr + %td{ colspan: 3} + = link_to_add_association f, :keywords, class: 'table-action-link', partial: 'keyword_fields', 'data-association-insertion-node': '.keywords-table tbody', 'data-association-insertion-method': 'append' do + = safe_join([fa_icon('plus'), t('filters.edit.add_keyword')]) diff --git a/app/views/filters/_keyword_fields.html.haml b/app/views/filters/_keyword_fields.html.haml new file mode 100644 index 000000000..eedd514ef --- /dev/null +++ b/app/views/filters/_keyword_fields.html.haml @@ -0,0 +1,8 @@ +%tr.nested-fields + %td= f.input :keyword, as: :string + %td + .label_input__wrapper= f.input_field :whole_word + %td + = f.hidden_field :id if f.object&.persisted? # Required so Rails doesn't put the field outside of the <tr/> + = link_to_remove_association(f, class: 'table-action-link') do + = safe_join([fa_icon('times'), t('filters.index.delete')]) diff --git a/app/views/filters/edit.html.haml b/app/views/filters/edit.html.haml index e971215ac..3dc3f07b7 100644 --- a/app/views/filters/edit.html.haml +++ b/app/views/filters/edit.html.haml @@ -2,7 +2,7 @@ = t('filters.edit.title') = simple_form_for @filter, url: filter_path(@filter), method: :put do |f| - = render 'fields', f: f + = render 'filter_fields', f: f .actions = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/filters/index.html.haml b/app/views/filters/index.html.haml index b4d5333aa..0227526a4 100644 --- a/app/views/filters/index.html.haml +++ b/app/views/filters/index.html.haml @@ -7,18 +7,5 @@ - if @filters.empty? %div.muted-hint.center-text= t 'filters.index.empty' - else - .table-wrapper - %table.table - %thead - %tr - %th= t('simple_form.labels.defaults.phrase') - %th= t('simple_form.labels.defaults.context') - %th - %tbody - - @filters.each do |filter| - %tr - %td= filter.phrase - %td= filter.context.map { |context| I18n.t("filters.contexts.#{context}") }.join(', ') - %td - = table_link_to 'pencil', t('filters.edit.title'), edit_filter_path(filter) - = table_link_to 'times', t('filters.index.delete'), filter_path(filter), method: :delete + .applications-list + = render partial: 'filter', collection: @filters diff --git a/app/views/filters/new.html.haml b/app/views/filters/new.html.haml index 05bec343f..5f400e604 100644 --- a/app/views/filters/new.html.haml +++ b/app/views/filters/new.html.haml @@ -2,7 +2,7 @@ = t('filters.new.title') = simple_form_for @filter, url: filters_path do |f| - = render 'fields', f: f + = render 'filter_fields', f: f .actions - = f.button :button, t('filters.new.title'), type: :submit + = f.button :button, t('filters.new.save'), type: :submit diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index ee444c070..40c38cecb 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -43,8 +43,7 @@ = render partial: 'layouts/theme', object: @core = render partial: 'layouts/theme', object: @theme - - if Setting.custom_css.present? - = stylesheet_link_tag custom_css_path, host: request.host, media: 'all' + = stylesheet_link_tag custom_css_path, host: request.host, media: 'all' %body{ class: body_classes } = content_for?(:content) ? yield(:content) : yield diff --git a/app/views/settings/featured_tags/index.html.haml b/app/views/settings/featured_tags/index.html.haml index 65de7f8f3..5d87e2862 100644 --- a/app/views/settings/featured_tags/index.html.haml +++ b/app/views/settings/featured_tags/index.html.haml @@ -9,7 +9,7 @@ = render 'shared/error_messages', object: @featured_tag .fields-group - = f.input :name, wrapper: :with_block_label, hint: safe_join([t('simple_form.hints.featured_tag.name'), safe_join(@recently_used_tags.map { |tag| link_to("##{tag.name}", settings_featured_tags_path(featured_tag: { name: tag.name }), method: :post) }, ', ')], ' ') + = f.input :name, wrapper: :with_block_label, hint: safe_join([t('simple_form.hints.featured_tag.name'), safe_join(@recently_used_tags.map { |tag| link_to("##{tag.display_name}", settings_featured_tags_path(featured_tag: { name: tag.name }), method: :post) }, ', ')], ' ') .actions = f.button :button, t('featured_tags.add_new'), type: :submit diff --git a/app/views/settings/preferences/notifications/show.html.haml b/app/views/settings/preferences/notifications/show.html.haml index 38e8b171e..943e21b50 100644 --- a/app/views/settings/preferences/notifications/show.html.haml +++ b/app/views/settings/preferences/notifications/show.html.haml @@ -18,14 +18,12 @@ = ff.input :reblog, as: :boolean, wrapper: :with_label = ff.input :favourite, as: :boolean, wrapper: :with_label = ff.input :mention, as: :boolean, wrapper: :with_label - - - if current_user.staff? - = ff.input :report, as: :boolean, wrapper: :with_label - = ff.input :appeal, as: :boolean, wrapper: :with_label - = ff.input :pending_account, as: :boolean, wrapper: :with_label - = ff.input :trending_tag, as: :boolean, wrapper: :with_label - = ff.input :trending_link, as: :boolean, wrapper: :with_label - = ff.input :trending_status, as: :boolean, wrapper: :with_label + = ff.input :report, as: :boolean, wrapper: :with_label if current_user.can?(:manage_reports) + = ff.input :appeal, as: :boolean, wrapper: :with_label if current_user.can?(:manage_appeals) + = ff.input :pending_account, as: :boolean, wrapper: :with_label if current_user.can?(:manage_users) + = ff.input :trending_tag, as: :boolean, wrapper: :with_label if current_user.can?(:manage_taxonomies) + = ff.input :trending_link, as: :boolean, wrapper: :with_label if current_user.can?(:manage_taxonomies) + = ff.input :trending_status, as: :boolean, wrapper: :with_label if current_user.can?(:manage_taxonomies) .fields-group = f.input :setting_always_send_emails, as: :boolean, wrapper: :with_label diff --git a/app/views/tags/_og.html.haml b/app/views/tags/_og.html.haml index a7c289bcb..37f644cf2 100644 --- a/app/views/tags/_og.html.haml +++ b/app/views/tags/_og.html.haml @@ -1,6 +1,6 @@ = opengraph 'og:site_name', t('about.hosted_on', domain: site_hostname) = opengraph 'og:url', tag_url(@tag) = opengraph 'og:type', 'website' -= opengraph 'og:title', "##{@tag.name}" -= opengraph 'og:description', strip_tags(t('about.about_hashtag_html', hashtag: @tag.name)) += opengraph 'og:title', "##{@tag.display_name}" += opengraph 'og:description', strip_tags(t('about.about_hashtag_html', hashtag: @tag.display_name)) = opengraph 'twitter:card', 'summary' diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml index 0e6d4c43d..608989a2b 100644 --- a/app/views/tags/show.html.haml +++ b/app/views/tags/show.html.haml @@ -1,5 +1,5 @@ - content_for :page_title do - = "##{@tag.name}" + = "##{@tag.display_name}" - content_for :header_tags do %meta{ name: 'robots', content: 'noindex' }/ @@ -8,8 +8,8 @@ = render 'og' .page-header - %h1= "##{@tag.name}" - %p= t('about.about_hashtag_html', hashtag: @tag.name) + %h1= "##{@tag.display_name}" + %p= t('about.about_hashtag_html', hashtag: @tag.display_name) #mastodon-timeline{ data: { props: Oj.dump(default_props.merge(hashtag: @tag.name, local: @local)) }} .notranslate#modal-container diff --git a/app/views/tags/show.rss.ruby b/app/views/tags/show.rss.ruby index 9ce71be74..8e0c2327b 100644 --- a/app/views/tags/show.rss.ruby +++ b/app/views/tags/show.rss.ruby @@ -1,6 +1,6 @@ RSS::Builder.build do |doc| - doc.title("##{@tag.name}") - doc.description(I18n.t('rss.descriptions.tag', hashtag: @tag.name)) + doc.title("##{@tag.display_name}") + doc.description(I18n.t('rss.descriptions.tag', hashtag: @tag.display_name)) doc.link(tag_url(@tag)) doc.last_build_date(@statuses.first.created_at) if @statuses.any? doc.generator("Mastodon v#{Mastodon::Version.to_s}") @@ -26,7 +26,7 @@ RSS::Builder.build do |doc| end status.tags.each do |tag| - item.category(tag.name) + item.category(tag.display_name) end end end diff --git a/app/workers/feed_insert_worker.rb b/app/workers/feed_insert_worker.rb index 9483510aa..ee9a3cadc 100644 --- a/app/workers/feed_insert_worker.rb +++ b/app/workers/feed_insert_worker.rb @@ -9,7 +9,7 @@ class FeedInsertWorker @options = options.symbolize_keys case @type - when :home + when :home, :tags @follower = Account.find(id) when :list @list = List.find(id) @@ -38,6 +38,8 @@ class FeedInsertWorker case @type when :home FeedManager.instance.filter?(:home, @status, @follower) + when :tags + FeedManager.instance.filter?(:tags, @status, @follower) when :list FeedManager.instance.filter?(:list, @status, @list) when :direct @@ -53,7 +55,7 @@ class FeedInsertWorker def perform_push case @type - when :home + when :home, :tags FeedManager.instance.push_to_home(@follower, @status, update: update?) when :list FeedManager.instance.push_to_list(@list, @status, update: update?) @@ -64,7 +66,7 @@ class FeedInsertWorker def perform_unpush case @type - when :home + when :home, :tags FeedManager.instance.unpush_from_home(@follower, @status, update: true) when :list FeedManager.instance.unpush_from_list(@list, @status, update: true) diff --git a/app/workers/scheduler/ip_cleanup_scheduler.rb b/app/workers/scheduler/ip_cleanup_scheduler.rb index 7afad2f58..8f607db03 100644 --- a/app/workers/scheduler/ip_cleanup_scheduler.rb +++ b/app/workers/scheduler/ip_cleanup_scheduler.rb @@ -3,7 +3,8 @@ class Scheduler::IpCleanupScheduler include Sidekiq::Worker - IP_RETENTION_PERIOD = 1.year.freeze + IP_RETENTION_PERIOD = ENV.fetch('IP_RETENTION_PERIOD', 1.year).to_i.seconds.freeze + SESSION_RETENTION_PERIOD = ENV.fetch('SESSION_RETENTION_PERIOD', 1.year).to_i.seconds.freeze sidekiq_options retry: 0 @@ -15,7 +16,8 @@ class Scheduler::IpCleanupScheduler private def clean_ip_columns! - SessionActivation.where('updated_at < ?', IP_RETENTION_PERIOD.ago).in_batches.destroy_all + SessionActivation.where('updated_at < ?', SESSION_RETENTION_PERIOD.ago).in_batches.destroy_all + SessionActivation.where('updated_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(ip: nil) User.where('current_sign_in_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(sign_up_ip: nil) LoginActivity.where('created_at < ?', IP_RETENTION_PERIOD.ago).in_batches.destroy_all Doorkeeper::AccessToken.where('last_used_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(last_used_ip: nil) diff --git a/config/application.rb b/config/application.rb index 5b571fc32..32c84d780 100644 --- a/config/application.rb +++ b/config/application.rb @@ -44,6 +44,7 @@ require_relative '../lib/webpacker/helper_extensions' require_relative '../lib/rails/engine_extensions' require_relative '../lib/active_record/database_tasks_extensions' require_relative '../lib/active_record/batches' +require_relative '../lib/simple_navigation/item_extensions' Dotenv::Railtie.load diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 9bc9a54b2..3e5a55617 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -24,6 +24,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect| inflect.acronym 'RSS' inflect.acronym 'REST' inflect.acronym 'URL' + inflect.acronym 'ASCII' inflect.singular 'data', 'data' end diff --git a/config/locales/activerecord.af.yml b/config/locales/activerecord.af.yml index c41e2341d..dff778d57 100644 --- a/config/locales/activerecord.af.yml +++ b/config/locales/activerecord.af.yml @@ -38,3 +38,9 @@ af: email: blocked: maak gebruik van 'n e-pos verskaffer wat nie toegelaat word nie unreachable: blyk nie te bestaan nie + user_role: + attributes: + permissions_as_keys: + own_role: kan nie verander word met jou huidige rol nie + position: + own_role: kan nie verander word met jou huidige rol nie diff --git a/config/locales/activerecord.ca.yml b/config/locales/activerecord.ca.yml index 056137276..ddf3fed4e 100644 --- a/config/locales/activerecord.ca.yml +++ b/config/locales/activerecord.ca.yml @@ -38,3 +38,14 @@ ca: email: blocked: utilitza un proveïdor de correu electrònic no autoritzat unreachable: sembla que no existeix + role_id: + elevated: no pot ser superior que el teu rol actual + user_role: + attributes: + permissions_as_keys: + dangerous: inclou permisos que no són segurs per al rol base + elevated: no pot incloure permisos que el teu rol actual no té + own_role: no es pot canviar amb el teu rol actual + position: + elevated: no pot ser superior al teu rol actual + own_role: no pot ser canviat amb el teu rol actual diff --git a/config/locales/activerecord.da.yml b/config/locales/activerecord.da.yml index 3566abf43..33d86e296 100644 --- a/config/locales/activerecord.da.yml +++ b/config/locales/activerecord.da.yml @@ -38,3 +38,13 @@ da: email: blocked: bruger en ikke-tilladt e-mailudbyder unreachable: ser ikke ud til at eksistere + role_id: + elevated: kan ikke være højere end din aktuelle rolle + user_role: + attributes: + permissions_as_keys: + dangerous: omfat tilladelser, som ikke er sikre for basisrollen + elevated: kan ikke omfatte tilladelser, din aktuelle rolle ikke besidder + own_role: kan ikke ændres med din aktuelle rolle + position: + elevated: kan ikke være højere end din aktuelle rolle diff --git a/config/locales/activerecord.el.yml b/config/locales/activerecord.el.yml index 67ce1758e..77d0c2716 100644 --- a/config/locales/activerecord.el.yml +++ b/config/locales/activerecord.el.yml @@ -30,3 +30,9 @@ el: email: blocked: χρησιμοποιεί μη επιτρεπόμενο πάροχο e-mail unreachable: δεν φαίνεται να υπάρχει + user_role: + attributes: + permissions_as_keys: + own_role: δεν μπορεί να αλλάξει με τον τρέχοντα ρόλο σας + position: + own_role: δεν μπορεί να αλλάξει με τον τρέχοντα ρόλο σας diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml index 720b0f5e3..2dfa3b955 100644 --- a/config/locales/activerecord.en.yml +++ b/config/locales/activerecord.en.yml @@ -38,3 +38,14 @@ en: email: blocked: uses a disallowed e-mail provider unreachable: does not seem to exist + role_id: + elevated: cannot be higher than your current role + user_role: + attributes: + permissions_as_keys: + dangerous: include permissions that are not safe for the base role + elevated: cannot include permissions your current role does not possess + own_role: cannot be changed with your current role + position: + elevated: cannot be higher than your current role + own_role: cannot be changed with your current role diff --git a/config/locales/activerecord.es-AR.yml b/config/locales/activerecord.es-AR.yml index 8a9b75a8c..d1eda3406 100644 --- a/config/locales/activerecord.es-AR.yml +++ b/config/locales/activerecord.es-AR.yml @@ -38,3 +38,14 @@ es-AR: email: blocked: usa un proveedor de correo electrónico no permitido unreachable: no parece existir + role_id: + elevated: no puede ser mayor que tu rol actual + user_role: + attributes: + permissions_as_keys: + dangerous: incluir permisos que no son seguros para el rol base + elevated: no se pueden incluir permisos que tu rol actual no posea + own_role: no se puede cambiar con tu rol actual + position: + elevated: no puede ser mayor que tu rol actual + own_role: no se puede cambiar con tu rol actual diff --git a/config/locales/activerecord.es-MX.yml b/config/locales/activerecord.es-MX.yml index c316a70a7..37b9b05df 100644 --- a/config/locales/activerecord.es-MX.yml +++ b/config/locales/activerecord.es-MX.yml @@ -21,6 +21,14 @@ es-MX: username: invalid: solo puede contener letras, números y guiones bajos reserved: está reservado + admin/webhook: + attributes: + url: + invalid: no es una URL válida + doorkeeper/application: + attributes: + website: + invalid: no es una URL válida status: attributes: reblog: @@ -30,3 +38,12 @@ es-MX: email: blocked: utiliza un proveedor de correo no autorizado unreachable: no parece existir + role_id: + elevated: no puede ser mayor que tu rol actual + user_role: + attributes: + permissions_as_keys: + dangerous: incluir permisos que no son seguros para el rol base + elevated: no se pueden incluir permisos que tu rol actual no posea + position: + elevated: no puede ser mayor que tu rol actual diff --git a/config/locales/activerecord.es.yml b/config/locales/activerecord.es.yml index 805e6b920..4aec0f074 100644 --- a/config/locales/activerecord.es.yml +++ b/config/locales/activerecord.es.yml @@ -38,3 +38,14 @@ es: email: blocked: utiliza un proveedor de correo no autorizado unreachable: no parece existir + role_id: + elevated: no puede ser mayor que tu rol actual + user_role: + attributes: + permissions_as_keys: + dangerous: incluir permisos que no son seguros para el rol base + elevated: no se pueden incluir permisos que tu rol actual no posea + own_role: no se puede cambiar con tu rol actual + position: + elevated: no puede ser mayor que tu rol actual + own_role: no se puede cambiar con tu rol actual diff --git a/config/locales/activerecord.fr.yml b/config/locales/activerecord.fr.yml index 4ab8f6a91..bc063864a 100644 --- a/config/locales/activerecord.fr.yml +++ b/config/locales/activerecord.fr.yml @@ -38,3 +38,12 @@ fr: email: blocked: utilise un fournisseur de courriel interdit unreachable: ne semble pas exister + role_id: + elevated: ne peut pas être supérieur à votre rôle actuel + user_role: + attributes: + permissions_as_keys: + dangerous: inclure des autorisations non sécurisées pour le rôle de base + elevated: ne peut pas inclure des autorisations que votre rôle actuel ne possède pas + position: + elevated: ne peut pas être supérieur à votre rôle actuel diff --git a/config/locales/activerecord.gl.yml b/config/locales/activerecord.gl.yml index 4b039f5af..a80e3ece5 100644 --- a/config/locales/activerecord.gl.yml +++ b/config/locales/activerecord.gl.yml @@ -38,3 +38,14 @@ gl: email: blocked: utiliza un provedor de email non autorizado unreachable: semella que non existe + role_id: + elevated: non pode superar o teu rol actual + user_role: + attributes: + permissions_as_keys: + dangerous: inclúe permisos que non son seguros para o rol básico + elevated: non pode incluir permisos que o teu rol actual non posúe + own_role: non pode ser modificado co teu rol actual + position: + elevated: non pode superar ao teu rol actual + own_role: non pode ser modificado co teu rol actual diff --git a/config/locales/activerecord.hu.yml b/config/locales/activerecord.hu.yml index 442bf3858..44340b3e9 100644 --- a/config/locales/activerecord.hu.yml +++ b/config/locales/activerecord.hu.yml @@ -38,3 +38,14 @@ hu: email: blocked: egy letiltott e-mail szolgáltatót használ unreachable: úgy tűnik, hogy nem létezik + role_id: + elevated: nem lehet magasabb, mint a jelenlegi szereped + user_role: + attributes: + permissions_as_keys: + dangerous: tartalmaz olyan engedélyeket is, melyek az alap szerephez nem biztonságosak + elevated: nem tartalmazhat olyan engedélyeket, melyek nincsenek benne a jelenlegi szerepedben + own_role: nem megváltoztatható a jelenlegi szerepköröddel + position: + elevated: nem lehet magasabb, mint a jelenlegi szereped + own_role: nem megváltoztatható a jelenlegi szerepköröddel diff --git a/config/locales/activerecord.id.yml b/config/locales/activerecord.id.yml index dc90c1322..88fdb3f75 100644 --- a/config/locales/activerecord.id.yml +++ b/config/locales/activerecord.id.yml @@ -21,6 +21,14 @@ id: username: invalid: hanya boleh berisi huruf, angka, dan garis bawah reserved: sudah dipesan + admin/webhook: + attributes: + url: + invalid: bukan URL valid + doorkeeper/application: + attributes: + website: + invalid: bukan URL valid status: attributes: reblog: diff --git a/config/locales/activerecord.io.yml b/config/locales/activerecord.io.yml index 9779cbdd1..5c809ce2e 100644 --- a/config/locales/activerecord.io.yml +++ b/config/locales/activerecord.io.yml @@ -38,3 +38,14 @@ io: email: blocked: uzas nepermisata retpostodomeno unreachable: semblas ne existar + role_id: + elevated: ne povas divenar plu alta kam vua nuna rolo + user_role: + attributes: + permissions_as_keys: + dangerous: inkluzas permisi quo ne esas segura por bazrolo + elevated: ne povas inkluzar permisi quon vua nuna rolo ne havas + own_role: ne povas divenesar kun vua nuna rolo + position: + elevated: ne povas divenar plu alta kam vua nuna rolo + own_role: ne povas divenesar kun vua nuna rolo diff --git a/config/locales/activerecord.is.yml b/config/locales/activerecord.is.yml index 8ecb02e74..1fe540322 100644 --- a/config/locales/activerecord.is.yml +++ b/config/locales/activerecord.is.yml @@ -21,6 +21,14 @@ is: username: invalid: má aðeins innihalda bókstafi, tölur og undirstrik reserved: er frátekið + admin/webhook: + attributes: + url: + invalid: er ekki gild vefslóð + doorkeeper/application: + attributes: + website: + invalid: er ekki gild vefslóð status: attributes: reblog: @@ -30,3 +38,14 @@ is: email: blocked: notar óleyfilega tölvupóstþjónustu unreachable: virðist ekki vera til + role_id: + elevated: getur ekki verið veigameiri en núverandi hlutverk þitt + user_role: + attributes: + permissions_as_keys: + dangerous: hefur heimildir sem ekki eru öruggar fyrir grunnhlutverk + elevated: getur ekki haft heimildir sem núverandi hlutverk þitt er ekki með + own_role: er ekki hægt að breyta með þinu hlutverki + position: + elevated: getur ekki verið veigameiri en núverandi hlutverk þitt + own_role: er ekki hægt að breyta með þinu hlutverki diff --git a/config/locales/activerecord.it.yml b/config/locales/activerecord.it.yml index 307bd801e..388c354ae 100644 --- a/config/locales/activerecord.it.yml +++ b/config/locales/activerecord.it.yml @@ -38,3 +38,14 @@ it: email: blocked: utilizza un provider di posta elettronica non autorizzato unreachable: non sembra esistere + role_id: + elevated: non può essere superiore al tuo ruolo attuale + user_role: + attributes: + permissions_as_keys: + dangerous: include i permessi non sicuri per il ruolo di base + elevated: non è possibile includere i permessi che il tuo ruolo attuale non possiede + own_role: non può essere modificato con il tuo ruolo attuale + position: + elevated: non può essere superiore al tuo ruolo attuale + own_role: non può essere modificato con il tuo ruolo attuale diff --git a/config/locales/activerecord.ko.yml b/config/locales/activerecord.ko.yml index 07f8a39f7..8ce4c0701 100644 --- a/config/locales/activerecord.ko.yml +++ b/config/locales/activerecord.ko.yml @@ -21,6 +21,14 @@ ko: username: invalid: 영문자, 숫자, _만 사용 가능 reserved: 이미 예약되어 있습니다 + admin/webhook: + attributes: + url: + invalid: 올바른 URL이 아닙니다 + doorkeeper/application: + attributes: + website: + invalid: 올바른 URL이 아닙니다 status: attributes: reblog: @@ -30,3 +38,14 @@ ko: email: blocked: 허용되지 않은 이메일 제공자입니다 unreachable: 존재하지 않는 것 같습니다 + role_id: + elevated: 당신의 현재 역할보다 높을 수 없습니다 + user_role: + attributes: + permissions_as_keys: + dangerous: 기본 역할로 사용하기에 안전하지 않은 권한을 포함하고 있습니다 + elevated: 당신의 현재 역할이 가지고 있지 않은 권한은 포함할 수 없습니다 + own_role: 당신의 현재 역할을 변경할 수 없습니다 + position: + elevated: 당신의 현재 역할보다 높을 수 없습니다 + own_role: 당신의 현재 역할을 변경할 수 없습니다 diff --git a/config/locales/activerecord.ku.yml b/config/locales/activerecord.ku.yml index b440181d8..ee8d9a8d8 100644 --- a/config/locales/activerecord.ku.yml +++ b/config/locales/activerecord.ku.yml @@ -38,3 +38,12 @@ ku: email: blocked: dabînkerê e-nameya qedexe bi kar tîne unreachable: xuya ye ku tune ye + role_id: + elevated: nabe ku ji rola te ya heyî bilindtir be + user_role: + attributes: + permissions_as_keys: + dangerous: mafdayînên ku ji bo rola bingehîn ne ewle ne tê de hene + elevated: di rola te ya heyî de nabe mafdayîn tê de hebin + position: + elevated: nabe ku ji rola te ya heyî bilindtir be diff --git a/config/locales/activerecord.lv.yml b/config/locales/activerecord.lv.yml index 89a1fb094..ba31a8b3c 100644 --- a/config/locales/activerecord.lv.yml +++ b/config/locales/activerecord.lv.yml @@ -3,7 +3,7 @@ lv: activerecord: attributes: poll: - expires_at: Deadline + expires_at: Gala termiņš options: Izvēles user: agreement: Pakalpojuma līgums @@ -38,3 +38,14 @@ lv: email: blocked: lieto neatļautu epasta pakalpojuma sniedzēju unreachable: šķiet, ka neeksistē + role_id: + elevated: nevar būt augstāka par tavu pašreizējo lomu + user_role: + attributes: + permissions_as_keys: + dangerous: ietver atļaujas, kas nav drošas pamata lomai + elevated: nevar ietvert atļaujas, kas nepieder tavai pašreizējai lomai + own_role: nevar mainīt pert tavu pašreizējo lomu + position: + elevated: nevar būt augstāka par tavu pašreizējo lomu + own_role: nevar mainīt pert tavu pašreizējo lomu diff --git a/config/locales/activerecord.nl.yml b/config/locales/activerecord.nl.yml index b5a122001..9d3adf290 100644 --- a/config/locales/activerecord.nl.yml +++ b/config/locales/activerecord.nl.yml @@ -21,6 +21,14 @@ nl: username: invalid: alleen letters, nummers en underscores reserved: gereserveerd + admin/webhook: + attributes: + url: + invalid: is een ongeldige URL + doorkeeper/application: + attributes: + website: + invalid: is een ongeldige URL status: attributes: reblog: diff --git a/config/locales/activerecord.pl.yml b/config/locales/activerecord.pl.yml index e9af76244..78ee745e2 100644 --- a/config/locales/activerecord.pl.yml +++ b/config/locales/activerecord.pl.yml @@ -38,3 +38,12 @@ pl: email: blocked: używa niedozwolonego dostawcy poczty elektronicznej unreachable: wydaje się nie istnieć + role_id: + elevated: nie może być wyższa niż twoja bieżąca rola + user_role: + attributes: + permissions_as_keys: + own_role: nie można zmienić z aktualną rolą + position: + elevated: nie może być wyższa niż twoja bieżąca rola + own_role: nie można zmienić z aktualną rolą diff --git a/config/locales/activerecord.pt-BR.yml b/config/locales/activerecord.pt-BR.yml index 8b4d3439a..ad034fdbc 100644 --- a/config/locales/activerecord.pt-BR.yml +++ b/config/locales/activerecord.pt-BR.yml @@ -21,6 +21,14 @@ pt-BR: username: invalid: apenas letras, números e underlines ( "_" ) reserved: já existe + admin/webhook: + attributes: + url: + invalid: não é uma URL válida + doorkeeper/application: + attributes: + website: + invalid: não é uma URL válida status: attributes: reblog: diff --git a/config/locales/activerecord.pt-PT.yml b/config/locales/activerecord.pt-PT.yml index 5b89ee5a2..b730eaf67 100644 --- a/config/locales/activerecord.pt-PT.yml +++ b/config/locales/activerecord.pt-PT.yml @@ -38,3 +38,14 @@ pt-PT: email: blocked: utiliza um provedor de e-mail não permitido unreachable: não parece existir + role_id: + elevated: não pode ser maior que o da sua função atual + user_role: + attributes: + permissions_as_keys: + dangerous: incluir permissões que não são seguras para a função base + elevated: não pode incluir permissões que a sua função atual não possui + own_role: não pode ser alterado com a sua função atual + position: + elevated: não pode ser maior que o da sua função atual + own_role: não pode ser alterado com a sua função atual diff --git a/config/locales/activerecord.ru.yml b/config/locales/activerecord.ru.yml index 758fe7dd4..2a267cfd2 100644 --- a/config/locales/activerecord.ru.yml +++ b/config/locales/activerecord.ru.yml @@ -38,3 +38,10 @@ ru: email: blocked: использует запрещённого провайдера эл. почты unreachable: не существует + role_id: + elevated: не может быть выше вашей текущей роли + user_role: + attributes: + permissions_as_keys: + dangerous: включить разрешения, небезопасные для базовой роли + own_role: невозможно изменить с вашей текущей ролью diff --git a/config/locales/activerecord.sl.yml b/config/locales/activerecord.sl.yml index 7927cb4fc..255f5e1ed 100644 --- a/config/locales/activerecord.sl.yml +++ b/config/locales/activerecord.sl.yml @@ -38,3 +38,14 @@ sl: email: blocked: uporablja nedovoljenega ponudnika e-poštnih storitev unreachable: kot kaže ne obstaja + role_id: + elevated: ne more biti višje od vaše trenutne vloge + user_role: + attributes: + permissions_as_keys: + dangerous: vključi pravice, ki niso varne za osnovno vlogo + elevated: ni mogoče vključiti pravic, ki jih vaša trenutna vloga ne vsebuje + own_role: ni mogoče spremeniti z vašo trenutno vlogo + position: + elevated: ne more biti višje od vaše trenutne vloge + own_role: ni mogoče spremeniti z vašo trenutno vlogo diff --git a/config/locales/activerecord.sq.yml b/config/locales/activerecord.sq.yml index 57de9d3cb..a4c8af15f 100644 --- a/config/locales/activerecord.sq.yml +++ b/config/locales/activerecord.sq.yml @@ -38,3 +38,14 @@ sq: email: blocked: përdor një shërbim email të palejuar unreachable: s’duket se ekziston + role_id: + elevated: s’mund të jetë më i lartë sesa roli juaj i tanishëm + user_role: + attributes: + permissions_as_keys: + dangerous: përfshi leje që s’janë të parrezik për rolin bazë + elevated: s’mund të përfshijë leje të cilat roli juaj i tanishëm s’i përfshin + own_role: s’mund të ndryshohet me rolin tuaj të tanishëm + position: + elevated: s’mund të jetë më i lartë sesa roli juaj i tanishëm + own_role: s’mund të ndryshohet me rolin tuaj të tanishëm diff --git a/config/locales/activerecord.th.yml b/config/locales/activerecord.th.yml index 26604ba5f..716c003e9 100644 --- a/config/locales/activerecord.th.yml +++ b/config/locales/activerecord.th.yml @@ -21,6 +21,14 @@ th: username: invalid: ต้องมีเฉพาะตัวอักษร, ตัวเลข และขีดล่างเท่านั้น reserved: ถูกสงวนไว้ + admin/webhook: + attributes: + url: + invalid: ไม่ใช่ URL ที่ถูกต้อง + doorkeeper/application: + attributes: + website: + invalid: ไม่ใช่ URL ที่ถูกต้อง status: attributes: reblog: @@ -30,3 +38,12 @@ th: email: blocked: ใช้ผู้ให้บริการอีเมลที่ไม่ได้รับอนุญาต unreachable: ดูเหมือนว่าจะไม่มีอยู่ + role_id: + elevated: ไม่สามารถสูงกว่าบทบาทปัจจุบันของคุณ + user_role: + attributes: + permissions_as_keys: + dangerous: รวมสิทธิ์ที่ไม่ปลอดภัยสำหรับบทบาทพื้นฐาน + elevated: ไม่สามารถรวบรวมสิทธิ์ในบทบาทปัจจุบันของคุณไม่ได้ + position: + elevated: ไม่สามารถสูงกว่าบทบาทปัจจุบันของคุณ diff --git a/config/locales/activerecord.tr.yml b/config/locales/activerecord.tr.yml index ac40e0615..e9f8a9fff 100644 --- a/config/locales/activerecord.tr.yml +++ b/config/locales/activerecord.tr.yml @@ -38,3 +38,12 @@ tr: email: blocked: izin verilmeyen bir e-posta sağlayıcı kullanıyor unreachable: mevcut gözükmüyor + role_id: + elevated: mevcut rolünüzden yüksek olamaz + user_role: + attributes: + permissions_as_keys: + dangerous: temel rol için güvenli olmayan izinleri içerir + elevated: mevcut rolünüzün sahip olmadığı izinleri içeremez + position: + elevated: mevcut rolünüzden yüksek olamaz diff --git a/config/locales/activerecord.uk.yml b/config/locales/activerecord.uk.yml index 06967ddc7..159f6d40a 100644 --- a/config/locales/activerecord.uk.yml +++ b/config/locales/activerecord.uk.yml @@ -38,3 +38,14 @@ uk: email: blocked: використовує не дозволенного постачальника електронної пошти unreachable: не існує + role_id: + elevated: не може бути вищою за поточну роль + user_role: + attributes: + permissions_as_keys: + dangerous: включити небезпечні для базової ролі дозволи + elevated: не можна включити права, якими не володіє ваша поточна роль + own_role: не можна змінити у вашій поточній ролі + position: + elevated: не може бути вищою за поточну роль + own_role: не можна змінити у вашій поточній ролі diff --git a/config/locales/activerecord.vi.yml b/config/locales/activerecord.vi.yml index 6c7c41903..aeffa3daf 100644 --- a/config/locales/activerecord.vi.yml +++ b/config/locales/activerecord.vi.yml @@ -38,3 +38,12 @@ vi: email: blocked: sử dụng dịch vụ email bị cấm unreachable: không tồn tại + role_id: + elevated: không thể cao hơn vai trò hiện tại của bạn + user_role: + attributes: + permissions_as_keys: + dangerous: bao gồm các quyền không an toàn cho vai trò cơ bản + elevated: không thể bao gồm các quyền mà vai trò hiện tại của bạn không có + position: + elevated: không thể cao hơn vai trò hiện tại của bạn diff --git a/config/locales/activerecord.zh-CN.yml b/config/locales/activerecord.zh-CN.yml index 855e79de6..27ec73ab9 100644 --- a/config/locales/activerecord.zh-CN.yml +++ b/config/locales/activerecord.zh-CN.yml @@ -25,6 +25,10 @@ zh-CN: attributes: url: invalid: 不是有效的 URL。 + doorkeeper/application: + attributes: + website: + invalid: 网址无效 status: attributes: reblog: @@ -34,3 +38,13 @@ zh-CN: email: blocked: 使用了被封禁的电子邮件提供商 unreachable: 似乎不存在 + role_id: + elevated: 不能高于您当前的角色 + user_role: + attributes: + permissions_as_keys: + dangerous: 包含对基本角色不安全的权限 + elevated: 不能包含您当前角色不拥有的权限 + own_role: 无法以您当前的身份更改 + position: + elevated: 不能高于您当前的角色 diff --git a/config/locales/activerecord.zh-TW.yml b/config/locales/activerecord.zh-TW.yml index bea950ed6..2ebb4460c 100644 --- a/config/locales/activerecord.zh-TW.yml +++ b/config/locales/activerecord.zh-TW.yml @@ -38,3 +38,14 @@ zh-TW: email: blocked: 使用不被允許的電子信箱供應商 unreachable: 似乎不存在 + role_id: + elevated: 不能高於您目前的角色 + user_role: + attributes: + permissions_as_keys: + dangerous: 包含對基本角色不安全的權限 + elevated: 不能包含您目前角色不具備的權限 + own_role: 無法被您目前的角色更改 + position: + elevated: 不能高於您目前的角色 + own_role: 無法被您目前的角色更改 diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 01f55f344..bac1e661d 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -98,10 +98,8 @@ ar: posts_tab_heading: المنشورات posts_with_replies: المنشورات والردود roles: - admin: المدير bot: روبوت group: فريق - moderator: مُشرِف unavailable: الصفحة التعريفية غير متوفرة unfollow: إلغاء المتابعة admin: @@ -120,7 +118,6 @@ ar: avatar: الصورة الرمزية by_domain: النطاق change_email: - changed_msg: تم تعديل عنوان البريد الإلكتروني الخاص بالحساب بنجاح! current_email: عنوان البريد الإلكتروني الحالي label: تعديل عنوان البريد الإلكتروني new_email: عنوان البريد الإلكتروني الجديد @@ -199,12 +196,6 @@ ar: reset: إعادة التعيين reset_password: إعادة ضبط كلمة السر resubscribe: إعادة الاشتراك - role: الصلاحيات - roles: - admin: مدير - moderator: مشرف - staff: الفريق - user: مستخدِم search: البحث search_same_email_domain: مستخدمون آخرون لديهم نفس نطاق البريد الإلكتروني search_same_ip: مستخدِمون آخرون بنفس الـ IP @@ -665,9 +656,6 @@ ar: deletion: desc_html: السماح لأي مستخدم إغلاق حسابه title: السماح بحذف الحسابات - min_invite_role: - disabled: لا أحد - title: المستخدِمون المصرح لهم لإرسال الدعوات require_invite_text: desc_html: عندما تتطلب التسجيلات الموافقة اليدوية، جعل إدخال نص لسؤال "لماذا تريد أن تنضم؟" إلزاميا بدلاً من اختياري title: الطلب من المستخدمين الجدد إدخال سبب للتسجيل @@ -680,9 +668,6 @@ ar: show_known_fediverse_at_about_page: desc_html: عند التعطيل، يُقيّد الخط الزمني العام المرتبط من صفحة الهبوط لعرض المحتوى المحلي فقط title: إظهار الفديفرس الموحَّد في خيط المُعايَنة - show_staff_badge: - desc_html: عرض شارة الموظفين على صفحة المستخدم - title: إظهار شارة الموظفين site_description: desc_html: فقرة تمهيدية على الصفحة الأولى. صف ميزات خادوم ماستدون هذا و ما يميّزه عن الآخرين. يمكنك استخدام علامات HTML ، ولا سيما <code><a></code> و <code><em></code>. title: وصف مثيل الخادوم @@ -1026,7 +1011,6 @@ ar: title: تعديل عامل التصفية errors: invalid_context: لم تقم بتحديد أي مجال أو أنّ المجال غير صالح - invalid_irreversible: إلّا مجالات الإشعارات و الخيط الرئيسي معنية بالتصفية اللارجعية index: delete: إزالة empty: ليست لديك أية عوامل تصفية. diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 1fb1cee90..f4765360e 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -70,11 +70,6 @@ ast: resend_confirmation: already_confirmed: Esti usuariu yá ta confirmáu send: Reunviar les instrucciones - role: Permisos - roles: - admin: Alministrador - moderator: Llendador - user: Usuariu statuses: Estaos title: Cuentes username: Nome d'usuariu @@ -134,10 +129,12 @@ ast: are_you_sure: "¿De xuru?" status: Estáu title: Informes + roles: + everyone: Permisos predeterminaos + permissions_count: + one: "%{count} permisu" + other: "%{count} permisos" settings: - registrations: - min_invite_role: - disabled: Naide site_description: title: Descripción del sirvidor site_title: Nome del sirvidor @@ -353,7 +350,7 @@ ast: followers: Siguidores most_recent: Lo más recién relationship: Rellación - remove_selected_follows: Dexar de siguir a los usuarios esbillaos + remove_selected_follows: Dexar de siguir a los usuarios seleicionaos status: Estáu remote_follow: acct: Introduz el nome_usuariu@dominiu dende'l que lo quies facer diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 04296b342..a7b8ffc23 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -71,10 +71,8 @@ bg: posts_tab_heading: Публикации posts_with_replies: Публикации и отговори roles: - admin: Админ bot: Бот group: Група - moderator: Мод unavailable: Профилът не е наличен unfollow: Не следвай admin: @@ -90,7 +88,6 @@ bg: avatar: Аватар by_domain: Домейн change_email: - changed_msg: Имейлът на акаунта беше успешно променен! current_email: Текущ имейл label: Промяна на имейл new_email: Нов имейл diff --git a/config/locales/bn.yml b/config/locales/bn.yml index ae1ced450..bbeab8655 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -74,10 +74,8 @@ bn: posts_tab_heading: লেখাগুলো posts_with_replies: লেখা এবং মতামত roles: - admin: পরিচালক bot: রোবট group: গোষ্ঠী - moderator: পরিচালক unavailable: প্রোফাইল অনুপলব্ধ unfollow: অনুসরণ বাদ admin: @@ -95,7 +93,6 @@ bn: avatar: অবতার by_domain: ওয়েবসাইট/কার্যক্ষেত্র change_email: - changed_msg: নিবন্ধনের ইমেইল সঠিকভাবে পরিবর্তন হয়েছে! current_email: এখনকার ইমেইল label: ইমেইল পরিবর্তন new_email: নতুন ইমেইল @@ -160,12 +157,6 @@ bn: reset: পুনরায় সেট করুন reset_password: পাসওয়ার্ড পুনঃস্থাপন করুন resubscribe: পুনরায় সদস্যতা নিন - role: অনুমতিসমূহ - roles: - admin: পরিচালক - moderator: নিয়ামক - staff: কর্মী - user: ব্যবহারকারী search: অনুসন্ধান search_same_email_domain: একই ইমেল ডোমেন সহ অন্যান্য ব্যবহারকারীরা search_same_ip: একই IP সহ অন্যান্য ব্যবহারকারীরা diff --git a/config/locales/br.yml b/config/locales/br.yml index f7c060579..61e85d163 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -48,7 +48,6 @@ br: posts_tab_heading: Toudoù posts_with_replies: Toudoù ha respontoù roles: - admin: Merour bot: Robot group: Strollad unavailable: Profil dihegerz @@ -83,10 +82,6 @@ br: remove_header: Dilemel an talbenn reset: Adderaouekaat reset_password: Adderaouekaat ar ger-tremen - roles: - admin: Merour - moderator: Habaskaer·ez - user: Implijer·ez search: Klask suspended: Astalet title: Kontoù diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 8c8fa1ffb..dfc1c1e27 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -83,10 +83,8 @@ ca: posts_tab_heading: Publicacions posts_with_replies: Publicacions i respostes roles: - admin: Administrador bot: Bot group: Grup - moderator: Moderador unavailable: Perfil inaccessible unfollow: Deixa de seguir admin: @@ -111,6 +109,11 @@ ca: new_email: Adreça electrònica nova submit: Canvia l'adreça electrònica title: Canvia l'adreça electrònica de %{username} + change_role: + changed_msg: Els privilegis del compte s'han canviat correctament! + label: Canvia rol + no_role: Sense rol + title: Canvia el rol per a %{username} confirm: Confirma confirmed: Confirmat confirming: Confirmant @@ -154,6 +157,7 @@ ca: active: Actiu all: Tot pending: Pendent + silenced: Limitat suspended: Suspès title: Moderació moderation_notes: Notes de moderació @@ -161,6 +165,7 @@ ca: most_recent_ip: IP més recent no_account_selected: No s'han canviat els comptes perquè no s'han seleccionat no_limits_imposed: Sense límits imposats + no_role_assigned: Cap rol assignat not_subscribed: No subscrit pending: Revisió pendent perform_full_suspension: Suspèn @@ -187,12 +192,7 @@ ca: reset: Reinicialitza reset_password: Restableix la contrasenya resubscribe: Torna a subscriure - role: Permisos - roles: - admin: Administrador - moderator: Moderador - staff: Personal - user: Usuari + role: Rol search: Cerca search_same_email_domain: Altres usuaris amb el mateix domini de correu search_same_ip: Altres usuaris amb la mateixa IP @@ -649,6 +649,67 @@ ca: unresolved: No resolt updated_at: Actualitzat view_profile: Veure perfil + roles: + add_new: Afegir rol + assigned_users: + one: "%{count} usuari" + other: "%{count} usuaris" + categories: + administration: Administració + devops: Operadors de desenvolupament + invites: Invitacions + moderation: Moderació + special: Especial + delete: Esborra + description_html: Amb <strong>rols d'usuari</strong>, pots personalitzar quines funcions i àrees de Mastodon els teus usuaris poden accedir. + edit: Editar el rol %{name} + everyone: Permisos per defecte + everyone_full_description_html: Aquest és el <strong>rol base</strong> que afecta <strong>tots els usuaris</strong>, fins i tot els que no en tenen cap d'assignat. Tots els altres rols n'hereten els permisos. + permissions_count: + one: "%{count} permís" + other: "%{count} permisos" + privileges: + administrator: Administrador + administrator_description: Els usuaris amb aquest permís passaran per alt tots els permisos + delete_user_data: Esborra dades d'usuari + delete_user_data_description: Permet als usuaris suprimir les dades d'altres usuaris sense demora + invite_users: Convida usuaris + invite_users_description: Permet als usuaris convidar persones noves al servidor + manage_announcements: Gestiona els anuncis + manage_announcements_description: Permet als usuaris gestionar els anuncis al servidor + manage_appeals: Gestiona apel·lacions + manage_appeals_description: Permet als usuaris revisar les apel·lacions contra les accions de moderació + manage_blocks: Gestiona blocs + manage_blocks_description: Permet als usuaris bloquejar proveïdors de correu electrònic i adreces IP + manage_custom_emojis: Gestiona emojis personalitzats + manage_custom_emojis_description: Permet als usuaris gestionar emojis personalitzats al servidor + manage_federation: Gestiona federació + manage_federation_description: Permet als usuaris bloquejar o permetre la federació amb altres dominis i controlar la capacitat de lliurament + manage_invites: Gestiona invitacions + manage_invites_description: Permet als usuaris veure i desactivar els enllaços d'invitació + manage_reports: Gestiona informes + manage_reports_description: Permet als usuaris revisar informes i realitzar accions de moderació contra ells + manage_roles: Gestionar rols + manage_roles_description: Permet als usuaris gestionar i assignar rols per sota dels seus + manage_rules: Gestiona normes + manage_rules_description: Permet als usuaris canviar les normes del servidor + manage_settings: Gestiona configuració + manage_settings_description: Permet als usuaris canviar la configuració del lloc + manage_taxonomies: Gestionar taxonomies + manage_taxonomies_description: Permet als usuaris revisar el contingut actual i actualitzar la configuració de l'etiqueta + manage_user_access: Gestionar l'accés dels usuaris + manage_user_access_description: Permet als usuaris desactivar l'autenticació de dos factors d'altres usuaris, canviar la seva adreça de correu electrònic i restablir la seva contrasenya + manage_users: Gestionar usuaris + manage_users_description: Permet als usuaris veure els detalls d'altres usuaris i realitzar accions de moderació contra ells + manage_webhooks: Gestionar Webhooks + manage_webhooks_description: Permet als usuaris configurar webhooks per a esdeveniments administratius + view_audit_log: Veure el registre d'auditoria + view_audit_log_description: Permet als usuaris veure un historial d'accions administratives al servidor + view_dashboard: Veure panell + view_dashboard_description: Permet als usuaris accedir al tauler i a diverses mètriques + view_devops: Operadors de desenvolupament + view_devops_description: Permet als usuaris accedir als taulers de control de Sidekiq i pgHero + title: Rols rules: add_new: Afegir norma delete: Suprimeix @@ -701,9 +762,6 @@ ca: deletion: desc_html: Permet a qualsevol usuari d'esborrar el seu compte title: Obre la supressió del compte - min_invite_role: - disabled: Ningú - title: Permet les invitacions de require_invite_text: desc_html: Quan el registre requereix aprovació manual, fer que sigui obligatori enlloc d'opcions l escriure el text de la solicitud d'invitació "Perquè vols unirte?" title: Requerir als nous usuaris omplir el text de la solicitud d'invitació @@ -716,9 +774,6 @@ ca: show_known_fediverse_at_about_page: desc_html: Quan està desactivat, restringeix la línia de temps pública enllaçada des de la pàgina inicial a mostrar només contingut local title: Inclou el contingut federat a la pàgina no autenticada de la línia de temps pública - show_staff_badge: - desc_html: Mostra una insígnia de personal en la pàgina d'usuari - title: Mostra insígnia de personal site_description: desc_html: Paràgraf introductori a la pàgina principal i en etiquetes meta. Pots utilitzar etiquetes HTML, en particular <code><a></code> i <code><em></code>. title: Descripció del servidor @@ -1124,15 +1179,24 @@ ca: public: Línies de temps públiques thread: Converses edit: + add_keyword: Afegeix paraula clau + keywords: Paraules clau title: Editar filtre errors: + deprecated_api_multiple_keywords: Aquests paràmetres no poden ser canviats des d'aquesta aplicació perquè apliquen a més d'un filtre per paraula clau. Utilitza una aplicació més recent o la interfície web. invalid_context: Cap o el context proporcionat no és vàlid - invalid_irreversible: El filtratge irreversible només funciona amb el contextos inici o notificacions index: + contexts: Filtres en %{contexts} delete: Esborra empty: No hi tens cap filtre. + expires_in: Expira en %{distance} + expires_on: Expira el %{date} + keywords: + one: "%{count} paraula clau" + other: "%{count} paraules clau" title: Filtres new: + save: Desa el nou filtre title: Afegir un nou filtre footer: developers: Desenvolupadors @@ -1251,6 +1315,8 @@ ca: copy_account_note_text: 'Aquest usuari s’ha mogut des de %{acct}, aquí estaven les teves notes prèvies sobre ell:' notification_mailer: admin: + report: + subject: "%{name} ha presentat un informe" sign_up: subject: "%{name} s'ha registrat" digest: @@ -1545,6 +1611,78 @@ ca: tags: does_not_match_previous_name: no coincideix amb el nom anterior terms: + body_html: | + <p> Aquesta pàgina conté els nostres Termes del servei (adaptats de la Bsd.network ToS) i la nostra Política de privadesa. + + <h1>Termes del servei</h1> + + <p> La nostra intenció és que utilitzis aquest servei per al gaudi personal i la interacció respectuosa i amistosa. A aquest efecte, esperem fomentar un entorn favorable i integrador. + + <p> Aquest servidor és de propietat privada i obert als usuaris voluntàriament, no un espai públic. S'espera que els usuaris que vulguin unir-se a aquesta comunitat actuïn sense malícia i de bona fe. Fer-ho d'una altra manera pot conduir a l'eliminació de l'usuari del servei, independentment de si viola qualsevol regla que s'esbossi a continuació. + + <h2>Polítiques i normes</h2> + + <p> La nostra instància està subjecta a un conjunt de normes que regeixen el comportament dels usuaris. Les regles sempre són visibles a la nostra pàgina Quant a. + + <p> Aquestes normes estan dissenyades per a mantenir un ambient amistós i obert, i per a evitar l'assetjament i la discriminació. Per tant, són un conjunt de directrius, però per necessitat incompletes. Els usuaris que violen l'esperit d'aquestes normes no es tractaran de manera diferent que els usuaris que violen una regla específica. + + <p> Si us plau, tingues en compte que les nostres normes contenen una secció sobre les millors pràctiques, i els usuaris que repetidament i que malaurat els advertiments ignoren aquestes millors pràctiques poden veure's violant les nostres normes. + + <p> Els moderadors poden eliminar els comptes que publiquin spam, o si se sospita que un compte és creat només per reservar un nom d'usuari. La violació de les polítiques i les normes també pot portar a l'eliminació de comptes a discreció dels moderadors. + + <h2>Accés a dades</h2> + + <p> El contingut d'aquest servidor no s'ha d'utilitzar per a l'aprenentatge automàtic o altres propòsits de "recerca" sense el consentiment explícit dels usuaris implicats. + + <p> El contingut d'aquest servidor més enllà d'aquesta pàgina no s'ha d'arxivar o indexar a l'engròs per mitjans automatitzats per qualsevol usuari o servei. Els usuaris actius poden exportar les seves llistes i publicacions a través de l'exportació proporcionada a la seva pàgina de configuració, o l'API. + + <h1>Política de privadesa</h1> + + <h2>Recollida d'informació</h2> + + <p> Informació obligatòria del compte: nom d'usuari (sempre públic), adreça de correu electrònic i contrasenya. + + <p> Informació del compte opcional: nom de visualització, biografia, camps d'informació del perfil, imatge de perfil i imatge de capçalera. El nom de visualització, la biografia, la imatge de perfil i la imatge de capçalera sempre seran públics. + + <p> Estat i interaccions: Retenim totes les vostres publicacions, inclosos els adjunts, i altres interaccions (com ara els preferits, els segueix i els impulsos). A més del contingut i les persones implicades, també emmagatzemen els codis de temps per a totes les entrades de dades enumerades. Si aquestes interaccions impacten en un altre servidor (per exemple, seguint, impulsant o missatger a un usuari en un servidor diferent), aquest altre servidor rebrà tota la informació requerida. Les publicacions públiques, no llistades i fitxades són públiques. Els teus seguidors només tenen missatges de seguiment, i els missatges directes estan disponibles per a tu i totes les persones esmentades en el missatge. Tingues en compte que, com que no podem controlar altres servidors, això significa que no podem garantir l'estat de privacitat dels teus missatges tan aviat abandonin aquest servidor. + + <p> Galetes: Utilitzem galetes per mantenir-te registrat i guardar les teves preferències per a futures visites. + + <p> Altres metadades: No registrem ni emmagatzem la teva adreça IP com a norma general. Es faran excepcions quan busquem activament errors. Una vegada que s'hagi finalitzat la cerca d'errors, les adreces IP recollides s'eliminaran. Retenim el nom de l'aplicació del teu navegador per permetre't revisar les sessions actualment iniciades per motius de seguretat. + + <h2>Ús de la informació</h2> + + <p> Tota la informació que recopilem de tu pot ser utilitzada de les maneres següents: + + <p> Per proporcionar la funcionalitat principal d'aquest servidor. Només pots interaccionar amb el contingut d'altres persones i publicar el teu propi contingut quan hagis iniciat la sessió. Per exemple, pots seguir a altres persones per veure les seves publicacions en la teva pròpia línia de temps personalitzada. + + <p> Per a ajudar a la moderació de la comunitat, quan s'informi d'una publicació o un compte, examinarem la qüestió com a part de les nostres tasques de moderació. + + <p> L'adreça de correu electrònic que proporcionis es pot utilitzar per enviar-te informació, notificacions sobre altres persones que interaccionen amb el teu contingut o que t'envien missatges, i per respondre a les investigacions, i/o altres peticions o preguntes. + + <h2>Protecció de la informació</h2> + + <p> Apliquem una varietat de mesures de seguretat per a mantenir la seguretat de la teva informació personal quan entres, presentes o accedeixes a la teva informació personal. Entre altres coses, la teva sessió de navegador, així com el trànsit entre les teves aplicacions i l'API, estan assegurades amb HTTPS, i la teva contrasenya es resumeix mitjançant un algorisme d'un únic sentit. Pots habilitar l'autenticació de doble factor per a un accés més segur al teu compte. + + <h2>Supressió i retenció de la informació</h2> + + <p> Pots sol·licitar i descarregar un arxiu del teu contingut, incloent-hi les entrades, el contingut gràfic, la imatge del perfil i la imatge de capçalera. + + <p> En qualsevol moment pots suprimir el teu compte de manera irreversible. + + <p> Si jutgem que estàs incomplint les nostres normes, pot ser que eliminem de manera irreversible el teu compte en qualsevol moment. + + <h2> Divulgació de la informació</h2> + + <p> La informació no es revela tret que ho permetis explícitament. L'única excepció és el proveïdor d'aquest servidor, que és un tercer de confiança i inevitable. + + <p> Contactar o permetre el contacte d'un usuari d'una instància diferent implica el consentiment que les dades necessàries es comparteixen amb el servidor en qüestió. + + <p> L'autorització d'una aplicació de tercers concedeix accés a la informació en funció de l'abast dels permisos que aprovis. L'aplicació pot accedir a la teva informació de perfil públic, la teva llista següent, els teus seguidors, les teves llistes, tots els teus missatges i els teus preferits. Les aplicacions no poden accedir mai a la teva adreça de correu electrònic o contrasenya. + + <h1>Atribució</h1> + + <p> This text is free to be adapted and remixed under the terms of the CC-BY (Attribution 4.0 International) license. title: "%{instance} Condicions del servei i política de privadesa" themes: contrast: Mastodon (alt contrast) diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 35e826c9c..3e9f414df 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -81,10 +81,8 @@ ckb: posts_tab_heading: تووتەکان posts_with_replies: تووتەکان و وڵامەکان roles: - admin: بەڕێوەبەر bot: بۆت group: گرووپ - moderator: مۆد unavailable: پرۆفایل بەردەست نیە unfollow: بەدوادانەچو admin: @@ -103,7 +101,6 @@ ckb: avatar: وێنۆچکە by_domain: دۆمەین change_email: - changed_msg: ئیمەیڵی ئەژمێر بە سەرکەوتوویی گۆڕا! current_email: ئیمەیلی ئێستا label: گۆڕینی ئیمێڵ new_email: ئیمەیڵی نوێ @@ -182,12 +179,6 @@ ckb: reset: ڕێکخستنەوە reset_password: گەڕانەوەی تێپەڕوشە resubscribe: دووبارە ئابونەبوون - role: مۆڵەتەکان - roles: - admin: بەڕێوەبەر - moderator: بەڕێوەبەر - staff: ستاف - user: بەکارهێنەر search: گەڕان search_same_email_domain: بەکارهێنەرانی دیکە بە ئیمەیلی یەکسان search_same_ip: بەکارهێنەرانی تر بەهەمان ئای پی @@ -621,9 +612,6 @@ ckb: deletion: desc_html: ڕێ بدە بە هەر کەسێک هەژمارەکەی بسڕیتەوە title: سڕینەوەی هەژمارە بکەوە - min_invite_role: - disabled: هیچکەس - title: ڕێپێدانی بانگهێشتەکان لەلایەن require_invite_text: desc_html: کاتێک تۆمارکردنەکان پێویستیان بە ڕەزامەندی دەستی هەیە، "بۆچی دەتەوێت بەشداری بکەیت؟" نووسینی دەق ئیجبارییە نەک ئیختیاری registrations_mode: @@ -635,9 +623,6 @@ ckb: show_known_fediverse_at_about_page: desc_html: کاتێک ناچالاک کرا، هێڵی کاتی گشتی کە بەستراوەتەوە بە لاپەڕەی ئێستا سنووردار دەبن، تەنها ناوەڕۆکی ناوخۆیی پیشاندەدرێن title: نیشاندانی ڕاژەکانی دیکە لە پێشنەمایەشی ئەم ڕاژە - show_staff_badge: - desc_html: پیشاندانی هێمایەک هاوکار لە سەر پەڕەی بەکارهێنەر - title: نیشاندانی هێمای هاوکار site_description: desc_html: کورتە باسیک دەربارەی API، دەربارەی ئەوە چ شتێک دەربارەی ئەم ڕاژەی ماستۆدۆن تایبەتە یان هەر شتێکی گرینگی دیکە. دەتوانن HTML بنووسن، بەتایبەت <code><a></code> وە <code><em></code>. title: دەربارەی ئەم ڕاژە @@ -884,7 +869,6 @@ ckb: title: دەستکاری فلتەر errors: invalid_context: هیچ دەقێکی نادروست نییە یان بێ بڕوایە - invalid_irreversible: فلتەرکردنی بێ گەڕانەوە تەنها کار دەکات لەگەڵ چوارچێوەی ماڵ یان ئاگانامەکان index: delete: سڕینەوە empty: هیچ پالێوەرێکت نیە. diff --git a/config/locales/co.yml b/config/locales/co.yml index 183439447..a71c187fc 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -79,10 +79,8 @@ co: posts_tab_heading: Statuti posts_with_replies: Statuti è risposte roles: - admin: Amministratore bot: Bot group: Gruppu - moderator: Muderatore unavailable: Prufile micca dispunibule unfollow: Ùn siguità più admin: @@ -101,7 +99,6 @@ co: avatar: Ritrattu di prufile by_domain: Duminiu change_email: - changed_msg: Email di u contu cambiatu! current_email: E-mail attuale label: Mudificà l’e-mail new_email: Novu e-mail @@ -178,12 +175,6 @@ co: reset: Riinizializà reset_password: Riinizializà a chjave d’accessu resubscribe: Riabbunassi - role: Auturizazione - roles: - admin: Amministratore - moderator: Muderatore - staff: Squadra - user: Utilizatore search: Cercà search_same_email_domain: Altri utilizatori cù listessu duminiu d'e-mail search_same_ip: Altri utilizatori cù listessa IP @@ -579,9 +570,6 @@ co: deletion: desc_html: Auturizà tuttu u mondu à sguassà u so propiu contu title: Auturizà à sguassà i conti - min_invite_role: - disabled: Nimu - title: Auturizà l’invitazione da require_invite_text: desc_html: Quandu l'arregistramenti necessitanu un'apprubazione manuale, fà chì u testu "Perchè vulete ghjunghje?" sia ubligatoriu invece d'esse facultativu title: Richiede chì i novi utilizatori empiinu una dumanda d'invitazione @@ -594,9 +582,6 @@ co: show_known_fediverse_at_about_page: desc_html: Quandu ghjè selezziunatu, statuti di tuttu l’istanze cunnisciute saranu affissati indè a vista di e linee. Altrimente soli i statuti lucali saranu mustrati title: Vedde tuttu u fediverse cunnisciutu nant’a vista di e linee - show_staff_badge: - desc_html: Mustrerà un badge Squadra nant’à un prufile d’utilizatore - title: Mustrà un badge staff site_description: desc_html: Paragrafu di prisentazione nant’a pagina d’accolta. Parlate di cio chì rende stu servore speziale, o d'altre cose impurtante. Pudete fà usu di marchi HTML, in particulare <code><a></code> è <code><em></code>. title: Discrizzione di u servore @@ -862,7 +847,6 @@ co: title: Mudificà u filtru errors: invalid_context: Micca abbastanza cuntestu - invalid_irreversible: A filtrazione irreversibile marchja solu per l'accolta è e nutificazione index: delete: Toglie empty: Ùn avete manc'un filtru. diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 1868b9dd7..3a58fd23b 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -91,10 +91,8 @@ cs: posts_tab_heading: Příspěvky posts_with_replies: Příspěvky a odpovědi roles: - admin: Administrátor bot: Robot group: Skupina - moderator: Moderátor unavailable: Profil není dostupný unfollow: Přestat sledovat admin: @@ -113,12 +111,16 @@ cs: avatar: Avatar by_domain: Doména change_email: - changed_msg: E-mail k tomuto účtu byl úspěšně změněn! current_email: Současný e-mail label: Změnit e-mail new_email: Nový e-mail submit: Změnit e-mail title: Změnit e-mail uživateli %{username} + change_role: + changed_msg: Role úspěšně změněna! + label: Změnit roli + no_role: Žádná role + title: Změnit roli pro %{username} confirm: Potvrdit confirmed: Potvrzeno confirming: Potvrzuji @@ -197,12 +199,7 @@ cs: reset: Obnovit reset_password: Obnovit heslo resubscribe: Znovu odebírat - role: Oprávnění - roles: - admin: Administrátor - moderator: Moderátor - staff: Personál - user: Uživatel + role: Role search: Hledat search_same_email_domain: Ostatní uživatelé se stejnou e-mailovou doménou search_same_ip: Další uživatelé se stejnou IP adresou @@ -677,6 +674,51 @@ cs: unresolved: Nevyřešeno updated_at: Aktualizováno view_profile: Zobrazit profil + roles: + add_new: Přidat roli + assigned_users: + few: "%{count} uživatelé" + many: "%{count} uživatelů" + one: "%{count} uživatel" + other: "%{count} uživatelů" + categories: + administration: Administrace + devops: Devops + invites: Pozvánky + moderation: Moderování + special: Speciální + delete: Smazat + edit: Upravit roli „%{name}“ + everyone: Výchozí oprávnění + permissions_count: + few: "%{count} oprávnění" + many: "%{count} oprávnění" + one: "%{count} oprávnění" + other: "%{count} oprávnění" + privileges: + administrator: Správce + delete_user_data: Mazat uživatelská data + delete_user_data_description: Umožňuje uživatelům bezodkladně mazat data jiných uživatelů + invite_users: Zvát uživatele + invite_users_description: Umožňuje uživatelům zvát na server nové lidi + manage_announcements: Spravovat oznámení + manage_appeals: Spravovat odvolání + manage_appeals_description: Umožňuje uživatelům posuzovat odvolání proti moderátorským zásahům + manage_blocks: Spravovat blokace + manage_custom_emojis: Spravovat vlastní emoji + manage_custom_emojis_description: Umožňuje uživatelům spravovat vlastní emoji na serveru + manage_invites: Spravovat pozvánky + manage_reports: Spravovat hlášení + manage_roles: Spravovat role + manage_rules: Spravovat pravidla + manage_settings: Spravovat nastavení + manage_user_access: Spravovat uživatelské přístupy + manage_user_access_description: Umožňuje uživatelům rušit jiným uživatelům dvoufázové ověřování, měnit jejich e-mailovou adresu a obnovovat jim hesla + manage_users: Spravovat uživatele + manage_webhooks: Spravovat webhooky + view_audit_log: Zobrazovat protokol auditu + view_devops: Devops + title: Role rules: add_new: Přidat pravidlo delete: Smazat @@ -729,9 +771,6 @@ cs: deletion: desc_html: Povolit komukoliv smazat svůj účet title: Zpřístupnit smazání účtu - min_invite_role: - disabled: Nikdo - title: Povolit pozvánky od require_invite_text: desc_html: Když jsou registrace schvalovány ručně, udělat odpověď na otázku "Proč se chcete připojit?" povinnou title: Požadovat od nových uživatelů zdůvodnění založení @@ -744,9 +783,6 @@ cs: show_known_fediverse_at_about_page: desc_html: Je-li vypnuto, bude veřejná časová osa, na kterou odkazuje hlavní stránka serveru, omezena pouze na místní obsah title: Zahrnout federovaný obsah na neautentizované stránce veřejné časové osy - show_staff_badge: - desc_html: Zobrazit na stránce uživatele odznak personálu - title: Zobrazit odznak personálu site_description: desc_html: Úvodní odstavec v API. Popište, čím se tento server Mastodon odlišuje od ostatních, a cokoliv jiného, co je důležité. Můžete zde používat HTML značky, hlavně <code><a></code> a <code><em></code>. title: Popis serveru @@ -1116,7 +1152,7 @@ cs: invalid_domain: není platné doménové jméno errors: '400': Žádost, kterou jste odeslali, byla neplatná nebo poškozená. - '403': Nemáte povolení zobrazit tuto stránku. + '403': Nejste oprávněni tuto stránku zobrazit. '404': Stránka, kterou hledáte, tu není. '406': Tato stránka není v požadovaném formátu dostupná. '410': Stránka, kterou hledáte, tu již není. @@ -1163,7 +1199,6 @@ cs: title: Upravit filtr errors: invalid_context: Nebyl poskytnut žádný nebo jen neplatný kontext - invalid_irreversible: Nezvratné filtrování funguje pouze v souvislosti s domovskou osou či oznámeními index: delete: Smazat empty: Nemáte žádný filtr. @@ -1291,6 +1326,8 @@ cs: copy_account_note_text: 'Tento účet se přesunul z %{acct}, zde byly Vaše předchozí poznámky o něm:' notification_mailer: admin: + report: + subject: Uživatel %{name} podal hlášení sign_up: subject: Uživatel %{name} se zaregistroval digest: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 913753325..a1e9835d6 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -98,10 +98,8 @@ cy: posts_tab_heading: Postiadau posts_with_replies: Postiadau ac atebion roles: - admin: Gweinyddwr bot: Bot group: Grŵp - moderator: Safonwr unavailable: Proffil ddim ar gael unfollow: Dad-ddilyn admin: @@ -120,7 +118,6 @@ cy: avatar: Afatar by_domain: Parth change_email: - changed_msg: E-bost cyfrif wedi ei newid yn llwyddiannus! current_email: E-bost Cyfredol label: Newid E-bost new_email: E-bost Newydd @@ -197,11 +194,7 @@ cy: reset: Ailosod reset_password: Ailosod cyfrinair resubscribe: Aildanysgrifio - role: Caniatâd - roles: - admin: Gweinyddwr - moderator: Aroglygydd - user: Defnyddiwr + role: Rôl search: Chwilio search_same_email_domain: Defnyddwyr eraill gyda'r un parth ebost search_same_ip: Defnyddwyr eraill gyda'r un IP @@ -488,9 +481,6 @@ cy: deletion: desc_html: Caniatau i unrhywun i ddileu eu cyfrif title: Agor dileu cyfrif - min_invite_role: - disabled: Neb - title: Caniatau gwahoddiadau gan registrations_mode: modes: approved: Mae angen cymeradwyaeth ar gyfer cofrestru @@ -500,9 +490,6 @@ cy: show_known_fediverse_at_about_page: desc_html: Wedi'i ddewis, bydd yn dangos rhagolwg o dŵtiau o'r holl ffedysawd. Fel arall bydd ond yn dangos tŵtiau lleol. title: Dangos ffedysawd hysbys ar ragolwg y ffrwd - show_staff_badge: - desc_html: Dangos bathodyn staff ar dudalen defnyddiwr - title: Dangos bathodyn staff site_description: desc_html: Paragraff agoriadol ar y dudalen flaen. Disgrifiwch yr hyn sy'n arbennig am y gweinydd Mastodon hwn ac unrhywbeth arall o bwys. Mae modd defnyddio tagiau HTML <code><a></code> a <code><em></code>. title: Disgrifiad achos @@ -734,7 +721,6 @@ cy: title: Golygu hidlydd errors: invalid_context: Dim cyd-destun neu cyd-destun annilys wedi ei ddarparu - invalid_irreversible: Mae hidlo anadferadwy ond yn gweithio yng nghyd-destun cartref neu hysbysiadau index: delete: Dileu empty: Nid oes gennych chi hidlyddion. diff --git a/config/locales/da.yml b/config/locales/da.yml index 337005369..a08748deb 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -83,10 +83,8 @@ da: posts_tab_heading: Indlæg posts_with_replies: Indlæg og svar roles: - admin: Admin bot: Bot group: Gruppe - moderator: Moderator unavailable: Profil utilgængelig unfollow: Følg ikke længere admin: @@ -105,12 +103,17 @@ da: avatar: Profilbillede by_domain: Domæne change_email: - changed_msg: Kontoens e-mail er skiftet! + changed_msg: E-mail skiftet! current_email: Nuværende e-mail label: Skift e-mail new_email: Ny e-mail submit: Skift e-mail title: Skift e-mail for %{username} + change_role: + changed_msg: Rolle ændret! + label: Ændr rolle + no_role: Ingen rolle + title: Ændr rolle for %{username} confirm: Bekræft confirmed: Bekræftet confirming: Bekræfter @@ -154,6 +157,7 @@ da: active: Aktiv all: Alle pending: Afventer + silenced: Begrænset suspended: Suspenderet title: Moderation moderation_notes: Moderationsnotater @@ -161,6 +165,7 @@ da: most_recent_ip: Seneste IP no_account_selected: Ingen kontiændringer, da ingen var valgt no_limits_imposed: Ingen begrænsninger pålagt + no_role_assigned: Ingen rolle tildelt not_subscribed: Abonnerer ikke pending: Afventende vurdering perform_full_suspension: Suspendér @@ -187,12 +192,7 @@ da: reset: Nulstil reset_password: Nulstil adgangskode resubscribe: Genabonnér - role: Tilladelser - roles: - admin: Administrator - moderator: Moderator - staff: Personale - user: Bruger + role: Rolle search: Søg search_same_email_domain: Øvrige brugere med samme e-maildomæne search_same_ip: Øvrige brugere med identisk IP @@ -649,6 +649,66 @@ da: unresolved: Uløst updated_at: Opdateret view_profile: Vis profil + roles: + add_new: Tilføj rolle + assigned_users: + one: "%{count} bruger" + other: "%{count} brugere" + categories: + administration: Håndtering + devops: Devops + invites: Invitationer + moderation: Moderering + special: Speciel + delete: Slet + description_html: Med <strong>brugerroller</strong>kan man tilpasse sine brugeres adgang til Mastodon-funktioner og -områder. + edit: Redigér rolle for '%{name} + everyone: Standardtilladelser + everyone_full_description_html: Dette er <strong>basisrollen</strong> med indvirkning på <strong>alle brugere</strong>, selv dem uden rolletildeling. Alle øvrige rolletilladelser nedarves herfra. + permissions_count: + one: "%{count} tilladelse" + other: "%{count} tilladelser" + privileges: + administrator: Administrator + administrator_description: Brugere med denne rolle kan omgå alle tilladelser + delete_user_data: Slet brugerdata + invite_users: Invitere brugere + invite_users_description: Tillader brugere at invitere nye personer til serveren + manage_announcements: Håndtere bekendtgørelser + manage_announcements_description: Tillader brugere at håndtere bekendtgørelser på serveren + manage_appeals: Håndtere appeller + manage_appeals_description: Tillader brugere at vurdere appeller af modereringshandlinger + manage_blocks: Håndtere blokeringer + manage_blocks_description: Tillader brugere at blokere e-mailudbydere og IP-adresser + manage_custom_emojis: Håndtere tilpassede emojier + manage_custom_emojis_description: Tillader brugere at håndtere tilpassede emojier på serveren + manage_federation: Håndtere federation + manage_federation_description: Tillader brugere at blokere eller tillade federation med andre domæner og styre leverbarhed + manage_invites: Håndtere invitationer + manage_invites_description: Tillader brugere at gennemse og deaktivere invitationslinks + manage_reports: Håndtere rapporter + manage_reports_description: Tillader brugere at vurdere rapporter og, i overensstemmelse hermed, at udføre moderationshandlinger + manage_roles: Håndtere roller + manage_roles_description: Tillader brugere at håndtere og tildele roller under deres privilegiestatus + manage_rules: Håndtere regler + manage_rules_description: Tillad brugere at ændre serverregler + manage_settings: Håndtere indstillinger + manage_settings_description: Tillader brugere at ændre webstedsindstillinger + manage_taxonomies: Håndtere taksonomier + manage_taxonomies_description: Tillader brugere at gennemse tenderende indhold og opdatere hashtag-indstillinger + manage_user_access: Håndtere brugeradgang + manage_user_access_description: Tillader brugere at deaktivere andre brugeres tofaktorgodkendelse, skifte deres e-mailadresse og nulstille deres adgangskode + manage_users: Håndtere brugere + manage_users_description: Tillader brugere at se andre brugeres oplysninger og underkaste dem moderationshandlinger + manage_webhooks: Håndtere Webhooks + manage_webhooks_description: Tillader brugere at opsætte webhooks til administrative begivenheder + view_audit_log: Vis revisionslog + view_audit_log_description: Tillader brugere at se en historik over administrative handlinger på serveren + view_dashboard: Vis Dashboard + view_dashboard_description: Tillader brugere at tilgå Dashboard'et og forskellige målinger + view_devops: Devops + view_devops_description: Tillader brugere at tilgå Sidekiq- og pgHero-dashboards + title: Roller rules: add_new: Tilføj regel delete: Slet @@ -701,9 +761,6 @@ da: deletion: desc_html: Tillad enhver at slette sin konto title: Åbn kontosletning - min_invite_role: - disabled: Ingen - title: Tillad invitationer fra require_invite_text: desc_html: Når tilmelding kræver manuel godkendelse, så gør “Hvorfor ønsker du at deltage?” tekstinput obligatorisk i stedet for valgfrit title: Nye brugere afkræves tilmeldingsbegrundelse @@ -716,9 +773,6 @@ da: show_known_fediverse_at_about_page: desc_html: Når deaktiveret, begrænses den fra indgangssiden linkede offentlige tidslinje til kun at vise lokalt indhold title: Medtag federeret indhold på ikke-godkendt, offentlig tidslinjeside - show_staff_badge: - desc_html: Vis et personale-badge på en brugerside - title: Vis personale-badge site_description: desc_html: Introduktionsafsnit på API'en. Beskriv, hvad der gør denne Mastodonserver speciel samt alt andet vigtigt. HTML-tags kan bruges, især <code><a></code> og <code><em></code>. title: Serverbeskrivelse @@ -1124,15 +1178,24 @@ da: public: Offentlig tidslinje thread: Konversationer edit: + add_keyword: Tilføj nøgleord + keywords: Nøgleord title: Redigere filter errors: + deprecated_api_multiple_keywords: Disse parametre kan ikke ændres fra denne applikation, da de gælder for flere end ét filternøgleord. Brug en nyere applikation eller webgrænsefladen. invalid_context: Ingen eller ugyldig kontekst angivet - invalid_irreversible: Uigenkaldelig filtrering virker kun med hjemme- eller notifikationskontekster index: + contexts: Filtre i %{contexts} delete: Slet empty: Du har ingen filtre. + expires_in: Udløber om %{distance} + expires_on: Udløber om %{date} + keywords: + one: "%{count} nøgleord" + other: "%{count} nøgleord" title: Filtre new: + save: Gem nye filter title: Tilføj nyt filter footer: developers: Udviklere @@ -1251,6 +1314,8 @@ da: copy_account_note_text: 'Denne bruger er flyttet fra %{acct}, hvor dine tidligere noter om dem var:' notification_mailer: admin: + report: + subject: "%{name} indsendte en anmeldelse" sign_up: subject: "%{name} tilmeldte sig" digest: diff --git a/config/locales/de.yml b/config/locales/de.yml index d15011a5e..0c8321295 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -83,10 +83,8 @@ de: posts_tab_heading: Beiträge posts_with_replies: Beiträge mit Antworten roles: - admin: Administrator bot: Bot group: Gruppe - moderator: Moderator unavailable: Profil nicht verfügbar unfollow: Entfolgen admin: @@ -105,7 +103,6 @@ de: avatar: Profilbild by_domain: Domain change_email: - changed_msg: E-Mail-Adresse des Kontos erfolgreich geändert! current_email: Aktuelle E-Mail-Adresse label: E-Mail-Adresse ändern new_email: Neue E-Mail-Adresse @@ -187,12 +184,6 @@ de: reset: Zurücksetzen reset_password: Passwort zurücksetzen resubscribe: Wieder abonnieren - role: Berechtigungen - roles: - admin: Administrator - moderator: Moderator_in - staff: Mitarbeiter - user: Nutzer search: Suche search_same_email_domain: Andere Benutzer mit der gleichen E-Mail-Domain search_same_ip: Andere Benutzer mit derselben IP @@ -701,9 +692,6 @@ de: deletion: desc_html: Allen erlauben, ihr Konto eigenmächtig zu löschen title: Kontolöschung erlauben - min_invite_role: - disabled: Niemand - title: Einladungen erlauben von require_invite_text: desc_html: Wenn eine Registrierung manuell genehmigt werden muss, mache den "Warum möchtest du beitreten?" Text eher obligatorisch als optional title: Neue Benutzer müssen einen Einladungstext ausfüllen @@ -716,9 +704,6 @@ de: show_known_fediverse_at_about_page: desc_html: Wenn aktiviert, wird es alle Beiträge aus dem bereits bekannten Teil des Fediversums auf der Startseite anzeigen. Andernfalls werden lokale Beitrage des Servers angezeigt. title: Zeige eine öffentliche Zeitleiste auf der Einstiegsseite - show_staff_badge: - desc_html: Zeige Mitarbeiter-Badge auf Benutzerseite - title: Zeige Mitarbeiter-Badge site_description: desc_html: Einleitungsabschnitt auf der Frontseite. Beschreibe, was diesen Mastodon-Server ausmacht. Du kannst HTML-Tags benutzen, insbesondere <code><a></code> und <code><em></code>. title: Beschreibung des Servers @@ -1127,7 +1112,6 @@ de: title: Filter bearbeiten errors: invalid_context: Ungültiger oder fehlender Kontext übergeben - invalid_irreversible: Unwiderrufliche Filterung funktioniert nur mit Heim- oder Benachrichtigungskontext index: delete: Löschen empty: Du hast keine Filter. diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml index 570377f8a..cd949d772 100644 --- a/config/locales/devise.ko.yml +++ b/config/locales/devise.ko.yml @@ -7,7 +7,7 @@ ko: send_paranoid_instructions: 당신의 이메일이 우리의 DB에 있을 경우 몇 분 이내로 확인 메일이 발송 됩니다. 이메일을 받지 못 한 경우, 스팸 폴더를 확인하세요. failure: already_authenticated: 이미 로그인 된 상태입니다. - inactive: 계정이 활성화 되지 않았습니다. + inactive: 계정이 아직 활성화 되지 않았습니다. invalid: 올바르지 않은 %{authentication_keys} 혹은 패스워드입니다. last_attempt: 계정이 잠기기까지 한 번의 시도가 남았습니다. locked: 계정이 잠겼습니다. diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index bf3b02e3f..2cbbee6cf 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -21,7 +21,7 @@ nl: action: E-mailadres verifiëren action_with_app: Bevestigen en naar %{app} teruggaan explanation: Je hebt een account op %{host} aangemaakt en met één klik kun je deze activeren. Wanneer jij dit account niet hebt aangemaakt, mag je deze e-mail negeren. - explanation_when_pending: Je vroeg met dit e-mailadres een uitnodiging aan voor %{host}. Nadat je jouw e-mailadres hebt bevestigd, beoordelen we jouw aanvraag. Je kunt tot dan nog niet inloggen. Wanneer jouw aanvraag wordt afgekeurd, worden jouw gegevens verwijderd en hoef je daarna verder niets meer te doen. Wanneer jij dit niet was, kun je deze e-mail negeren. + explanation_when_pending: Je vroeg met dit e-mailadres een uitnodiging aan voor %{host}. Nadat je jouw e-mailadres hebt bevestigd, beoordelen we jouw aanvraag. Je kunt tot dan nog niet inloggen. Wanneer jouw aanvraag wordt afgewezen, worden jouw gegevens verwijderd en hoef je daarna verder niets meer te doen. Wanneer jij dit niet was, kun je deze e-mail negeren. extra_html: Bekijk ook de <a href="%{terms_path}">regels van de Mastodonserver</a> en <a href="%{policy_path}">onze gebruiksvoorwaarden</a>. subject: 'Mastodon: E-mail bevestigen voor %{instance}' title: E-mailadres verifiëren diff --git a/config/locales/devise.si.yml b/config/locales/devise.si.yml index b9aa1527c..08b7286cb 100644 --- a/config/locales/devise.si.yml +++ b/config/locales/devise.si.yml @@ -1,42 +1,115 @@ --- si: devise: + confirmations: + confirmed: ඔබගේ විද්යුත් තැපැල් ලිපිනය සාර්ථකව තහවුරු කර ඇත. + send_instructions: මිනිත්තු කිහිපයකින් ඔබගේ විද්යුත් තැපැල් ලිපිනය තහවුරු කරන ආකාරය පිළිබඳ උපදෙස් සහිත විද්යුත් තැපෑලක් ඔබට ලැබෙනු ඇත. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් ෆෝල්ඩරය පරීක්ෂා කරන්න. + send_paranoid_instructions: ඔබගේ විද්යුත් තැපැල් ලිපිනය අපගේ දත්ත ගබඩාවේ තිබේ නම්, මිනිත්තු කිහිපයකින් ඔබගේ විද්යුත් තැපැල් ලිපිනය තහවුරු කරන ආකාරය පිළිබඳ උපදෙස් සහිත විද්යුත් තැපෑලක් ඔබට ලැබෙනු ඇත. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් ෆෝල්ඩරය පරීක්ෂා කරන්න. failure: already_authenticated: ඔබ දැනටමත් පිවිස ඇත. + inactive: ඔබගේ ගිණුම තවම සක්රිය කර නොමැත. + invalid: වලංගු නොවන %{authentication_keys} හෝ මුරපදය. + last_attempt: ඔබගේ ගිණුම අගුලු දැමීමට පෙර ඔබට තවත් එක් උත්සාහයක් ඇත. locked: ඔබගේ ගිණුම අගුළු දමා ඇත. + not_found_in_database: වලංගු නොවන %{authentication_keys} හෝ මුරපදය. + pending: ඔබගේ ගිණුම තවමත් සමාලෝචනය වෙමින් පවතී. + timeout: ඔබේ සැසිය කල් ඉකුත් විය. ඉදිරියට යාමට කරුණාකර නැවත පුරන්න. + unauthenticated: ඉදිරියට යාමට පෙර ඔබ පුරනය වීමට හෝ ලියාපදිංචි වීමට අවශ්ය වේ. + unconfirmed: දිගටම කරගෙන යාමට පෙර ඔබ ඔබේ ඊමේල් ලිපිනය තහවුරු කළ යුතුය. mailer: confirmation_instructions: + action: ඊමේල් ලිපිනය තහවුරු කරන්න + action_with_app: තහවුරු කර %{app}වෙත ආපසු යන්න + explanation: ඔබ මෙම ඊමේල් ලිපිනය සමඟ %{host} හි ගිණුමක් සාදා ඇත. ඔබ එය සක්රිය කිරීමට එක ක්ලික් කිරීමක් ඇත. මේ ඔබ නොවේ නම්, කරුණාකර මෙම විද්යුත් තැපෑල නොසලකා හරින්න. + explanation_when_pending: ඔබ මෙම විද්යුත් තැපැල් ලිපිනය සමඟ %{host} වෙත ආරාධනාවක් සඳහා ඉල්ලුම් කළා. ඔබ ඔබගේ විද්යුත් තැපැල් ලිපිනය තහවුරු කළ පසු, අපි ඔබගේ අයදුම්පත සමාලෝචනය කරන්නෙමු. ඔබගේ විස්තර වෙනස් කිරීමට හෝ ඔබගේ ගිණුම මකා දැමීමට ඔබට පුරනය විය හැක, නමුත් ඔබගේ ගිණුම අනුමත වන තුරු ඔබට බොහෝ කාර්යයන් වෙත ප්රවේශ විය නොහැක. ඔබගේ අයදුම්පත ප්රතික්ෂේප කළහොත්, ඔබගේ දත්ත ඉවත් කරනු ඇත, එබැවින් ඔබෙන් වැඩිදුර ක්රියාමාර්ග අවශ්ය නොවනු ඇත. මේ ඔබ නොවේ නම්, කරුණාකර මෙම විද්යුත් තැපෑල නොසලකා හරින්න. + extra_html: කරුණාකර <a href="%{terms_path}">සේවාදායකයේ නීති</a> සහ <a href="%{policy_path}">අපගේ සේවා කොන්දේසි</a>ද පරීක්ෂා කරන්න. + subject: 'Mastodon: %{instance}සඳහා තහවුරු කිරීමේ උපදෙස්' title: වි. තැපැල් ලිපිනය තහවුරු කරන්න email_changed: + explanation: 'ඔබගේ ගිණුම සඳහා ඊමේල් ලිපිනය වෙනස් වෙමින් පවතී:' + extra: ඔබ ඔබගේ විද්යුත් තැපෑල වෙනස් නොකළේ නම්, යම් අයෙකු ඔබගේ ගිණුමට ප්රවේශය ලබා ගෙන ඇති බව පෙනෙන්නට තිබේ. ඔබගේ ගිණුමෙන් අගුලු දමා ඇත්නම් කරුණාකර ඔබගේ මුරපදය වහාම වෙනස් කරන්න හෝ සේවාදායක පරිපාලක අමතන්න. subject: 'මාස්ටඩන්: වි-තැපෑල වෙනස් විය' title: නව විද්යුත් තැපැල් ලිපිනය password_change: - title: මුරපදය වෙනස් කරන ලදි + explanation: ඔබගේ ගිණුම සඳහා මුරපදය වෙනස් කර ඇත. + extra: ඔබ ඔබගේ මුරපදය වෙනස් නොකළේ නම්, යමෙකු ඔබගේ ගිණුමට ප්රවේශය ලබා ගෙන ඇති බව පෙනෙන්නට තිබේ. ඔබගේ ගිණුමෙන් අගුලු දමා ඇත්නම් කරුණාකර ඔබගේ මුරපදය වහාම වෙනස් කරන්න හෝ සේවාදායක පරිපාලක අමතන්න. + subject: 'Mastodon: මුරපදය වෙනස් විය' + title: මුරපදය වෙනස් කරන ලදී reconfirmation_instructions: + explanation: ඔබගේ ඊමේල් වෙනස් කිරීමට නව ලිපිනය තහවුරු කරන්න. + extra: මෙම වෙනස ඔබ විසින් ආරම්භ කරන ලද්දක් නොවේ නම්, කරුණාකර මෙම විද්යුත් තැපෑල නොසලකා හරින්න. ඔබ ඉහත සබැඳියට ප්රවේශ වන තෙක් Mastodon ගිණුම සඳහා ඊමේල් ලිපිනය වෙනස් නොවේ. + subject: 'Mastodon: %{instance}සඳහා විද්යුත් තැපෑල තහවුරු කරන්න' title: වි. තැපැල් ලිපිනය තහවුරු කරන්න reset_password_instructions: action: මුරපදය වෙනස් කරන්න + explanation: ඔබ ඔබගේ ගිණුම සඳහා නව මුරපදයක් ඉල්ලා ඇත. + extra: ඔබ මෙය ඉල්ලා නොසිටියේ නම්, කරුණාකර මෙම විද්යුත් තැපෑල නොසලකා හරින්න. ඔබ ඉහත සබැඳියට ප්රවේශ වී අලුත් එකක් සාදන තෙක් ඔබේ මුරපදය වෙනස් නොවනු ඇත. + subject: 'Mastodon: මුරපද උපදෙස් යළි පිහිටුවන්න' title: මුරපදය නැවත සැකසීම two_factor_disabled: + explanation: ඔබගේ ගිණුම සඳහා ද්වි-සාධක සත්යාපනය අබල කර ඇත. විද්යුත් තැපැල් ලිපිනය සහ මුරපදය පමණක් භාවිතයෙන් දැන් පුරනය විය හැක. + subject: 'Mastodon: ද්වි සාධක සත්යාපනය අක්රීය කර ඇත' title: ද්විපියවර අබලයි two_factor_enabled: + explanation: ඔබගේ ගිණුම සඳහා ද්වි-සාධක සත්යාපනය සක්රීය කර ඇත. යුගල කළ TOTP යෙදුම මගින් ජනනය කරන ලද ටෝකනයක් පුරනය වීමට අවශ්ය වනු ඇත. + subject: 'Mastodon: ද්වි සාධක සත්යාපනය සක්රීය කර ඇත' title: ද්විපියවර සබලයි two_factor_recovery_codes_changed: - title: ද්විපියවර ප්රතිසාධන කේත වෙනස්විණි + explanation: පෙර ප්රතිසාධන කේත අවලංගු කර නව ඒවා උත්පාදනය කර ඇත. + subject: 'Mastodon: ද්වි-සාධක ප්රතිසාධන කේත නැවත උත්පාදනය කරන ලදී' + title: ද්විපියවර ප්රතිසාධන කේත වෙනස් වේ unlock_instructions: - subject: 'මාස්ටඩන්: අගුලුහැරීමේ උපදේශ' + subject: 'මාස්ටඩන්: අගුලුහැරීමේ උපදේශනය' webauthn_credential: added: + explanation: පහත ආරක්ෂක යතුර ඔබගේ ගිණුමට එක් කර ඇත subject: 'මාස්ටඩන්: නව ආරක්ෂණ යතුර' title: ආරක්ෂණ යතුරක් එකතු කර ඇත + deleted: + explanation: පහත ආරක්ෂක යතුර ඔබගේ ගිණුමෙන් මකා ඇත + subject: 'Mastodon: ආරක්ෂක යතුර මකා ඇත' + title: ඔබගේ ආරක්ෂක යතුරු වලින් එකක් මකා ඇත webauthn_disabled: + explanation: ඔබගේ ගිණුම සඳහා ආරක්ෂක යතුරු සමඟ සත්යාපනය අබල කර ඇත. යුගල කළ TOTP යෙදුම මගින් ජනනය කරන ලද ටෝකනය පමණක් භාවිතයෙන් දැන් පුරනය විය හැක. + subject: 'Mastodon: ආරක්ෂක යතුරු සමඟ සත්යාපනය අක්රිය කර ඇත' title: ආරක්ෂණ යතුරු අබල කර ඇත webauthn_enabled: + explanation: ඔබගේ ගිණුම සඳහා ආරක්ෂක යතුරු සත්යාපනය සක්රීය කර ඇත. ඔබගේ ආරක්ෂක යතුර දැන් පුරනය වීම සඳහා භාවිතා කළ හැක. + subject: 'Mastodon: ආරක්ෂක යතුරු සත්යාපනය සක්රීය කර ඇත' title: ආරක්ෂණ යතුරු සබල කර ඇත + omniauth_callbacks: + failure: '"%{reason}" නිසා %{kind} සිට ඔබව සත්යාපනය කළ නොහැක.' + success: "%{kind} ගිණුමෙන් සාර්ථකව සත්යාපනය කරන ලදී." + passwords: + no_token: මුරපද යළි පිහිටුවීමේ විද්යුත් තැපෑලකින් නොපැමිණ ඔබට මෙම පිටුවට ප්රවේශ විය නොහැක. ඔබ පැමිණෙන්නේ මුරපද යළි පිහිටුවීමේ විද්යුත් තැපෑලකින් නම්, කරුණාකර ඔබ සපයා ඇති සම්පූර්ණ URL භාවිතා කර ඇති බවට වග බලා ගන්න. + send_instructions: ඔබගේ විද්යුත් තැපැල් ලිපිනය අපගේ දත්ත ගබඩාවේ තිබේ නම්, මිනිත්තු කිහිපයකින් ඔබගේ විද්යුත් තැපැල් ලිපිනයට මුරපද ප්රතිසාධන සබැඳියක් ලැබෙනු ඇත. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් ෆෝල්ඩරය පරීක්ෂා කරන්න. + send_paranoid_instructions: ඔබගේ විද්යුත් තැපැල් ලිපිනය අපගේ දත්ත ගබඩාවේ තිබේ නම්, මිනිත්තු කිහිපයකින් ඔබගේ විද්යුත් තැපැල් ලිපිනයට මුරපද ප්රතිසාධන සබැඳියක් ලැබෙනු ඇත. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් ෆෝල්ඩරය පරීක්ෂා කරන්න. + updated: ඔබගේ මුරපදය සාර්ථකව වෙනස් කර ඇත. ඔබ දැන් පුරනය වී ඇත. + updated_not_active: ඔබගේ මුරපදය සාර්ථකව වෙනස් කර ඇත. registrations: - update_needs_confirmation: ඔබ ඔබගේ ගිණුම සාර්ථකව යාවත්කාලීන කළ නමුත් අපට ඔබගේ නව විද්යුත් තැපැල් ලිපිනය තහවුරු කළ යුතුය. කරුණාකර ඔබගේ විද්යුත් තැපෑල පරීක්ෂා කර තහවුරු කිරීමේ සබැඳිය අනුගමනය කර ඔබගේ නව විද්යුත් තැපැල් ලිපිනය තහවුරු කරන්න. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් බහාලුම පරීක්ෂා කරන්න. + destroyed: ආයුබෝවන්! ඔබගේ ගිණුම සාර්ථකව අවලංගු කර ඇත. ඉක්මනින්ම ඔබව නැවත හමුවීමට අපි බලාපොරොත්තු වෙමු. + signed_up: සාදරයෙන් පිළිගනිමු! ඔබ සාර්ථකව ලියාපදිංචි වී ඇත. + signed_up_but_inactive: ඔබ සාර්ථකව ලියාපදිංචි වී ඇත. කෙසේ වෙතත්, ඔබගේ ගිණුම තවමත් සක්රිය කර නොමැති නිසා අපට ඔබව පුරනය වීමට නොහැකි විය. + signed_up_but_locked: ඔබ සාර්ථකව ලියාපදිංචි වී ඇත. කෙසේ වෙතත්, ඔබගේ ගිණුම අගුලු දමා ඇති නිසා අපට ඔබව පුරනය කිරීමට නොහැකි විය. + signed_up_but_pending: තහවුරු කිරීමේ සබැඳියක් සහිත පණිවිඩයක් ඔබගේ විද්යුත් තැපැල් ලිපිනයට යවා ඇත. ඔබ සබැඳිය ක්ලික් කළ පසු, අපි ඔබගේ අයදුම්පත සමාලෝචනය කරන්නෙමු. එය අනුමත වුවහොත් ඔබට දැනුම් දෙනු ලැබේ. + signed_up_but_unconfirmed: තහවුරු කිරීමේ සබැඳියක් සහිත පණිවිඩයක් ඔබගේ විද්යුත් තැපැල් ලිපිනයට යවා ඇත. ඔබගේ ගිණුම සක්රිය කිරීමට කරුණාකර සබැඳිය අනුගමනය කරන්න. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් ෆෝල්ඩරය පරීක්ෂා කරන්න. + update_needs_confirmation: ඔබගේ ගිණුම සාර්ථකව යාවත්කාලීන කළ හැකි නමුත් අපට ඔබගේ නව විද්යුත් තැපැල් ලිපිනය තහවුරු කර ගත යුතුය. කරුණාකර ඔබගේ විද්යුත් තැපෑල පරීක්ෂා කර තහවුරු කිරීමේ සබැඳිය අනුගමනය කරන්න ඔබගේ නව විද්යුත් තැපැල් ලිපිනය තහවුරු කරන්න. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් බහාලුම පරීක්ෂා කරන්න. updated: ඔබගේ ගිණුම සාර්ථකව යාවත්කාලීන කර ඇත. sessions: already_signed_out: සාර්ථකව නික්මුනි. - signed_in: සාර්ථකව පිවිසුනි. + signed_in: සාර්ථකව පිවිසෙන්න. signed_out: සාර්ථකව නික්මුනි. + unlocks: + send_instructions: මිනිත්තු කිහිපයකින් ඔබගේ ගිණුම අගුළු හරින ආකාරය පිළිබඳ උපදෙස් සහිත විද්යුත් තැපෑලක් ඔබට ලැබෙනු ඇත. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් ෆෝල්ඩරය පරීක්ෂා කරන්න. + send_paranoid_instructions: ඔබගේ ගිණුම තිබේ නම්, මිනිත්තු කිහිපයකින් එය අගුළු හරින ආකාරය පිළිබඳ උපදෙස් සහිත විද්යුත් තැපෑලක් ඔබට ලැබෙනු ඇත. ඔබට මෙම විද්යුත් තැපෑල නොලැබුනේ නම් කරුණාකර ඔබගේ අයාචිත තැපැල් ෆෝල්ඩරය පරීක්ෂා කරන්න. + unlocked: ඔබගේ ගිණුම සාර්ථකව අගුලු හැර ඇත. ඉදිරියට යාමට කරුණාකර පුරනය වන්න. + errors: + messages: + already_confirmed: දැනටමත් තහවුරු කර ඇත, කරුණාකර පුරනය වීමට උත්සාහ කරන්න + confirmation_period_expired: "%{period}තුළ තහවුරු කළ යුතුය, කරුණාකර අලුත් එකක් ඉල්ලන්න" + expired: කල් ඉකුත් වී ඇත, කරුණාකර අලුත් එකක් ඉල්ලන්න + not_found: හමු වුණේ නැහැ + not_locked: අගුලු දමා නොතිබුණි + not_saved: + one: '1 දෝෂයක් මෙම %{resource} සුරැකීම තහනම් කර ඇත:' + other: 'දෝෂ %{count} කින් මෙම %{resource} සුරැකීම තහනම් කර ඇත:' diff --git a/config/locales/doorkeeper.cy.yml b/config/locales/doorkeeper.cy.yml index 4dc4b5e0a..85aaccea6 100644 --- a/config/locales/doorkeeper.cy.yml +++ b/config/locales/doorkeeper.cy.yml @@ -69,6 +69,7 @@ cy: confirmations: revoke: Ydych chi'n sicr? index: + scopes: Caniatâd title: Eich rhaglenni awdurdodedig errors: messages: @@ -100,6 +101,12 @@ cy: authorized_applications: destroy: notice: Diddymwyd y cais. + grouped_scopes: + title: + accounts: Cyfrifon + bookmarks: Tudalnodau + filters: Hidlyddion + search: Chwilio layouts: admin: nav: diff --git a/config/locales/doorkeeper.eo.yml b/config/locales/doorkeeper.eo.yml index 1584fddf0..473757a37 100644 --- a/config/locales/doorkeeper.eo.yml +++ b/config/locales/doorkeeper.eo.yml @@ -110,6 +110,7 @@ eo: bookmarks: Legosignoj lists: Listoj mutes: Silentigitaj + reports: Raportoj search: Serĉi statuses: Afiŝoj layouts: diff --git a/config/locales/doorkeeper.si.yml b/config/locales/doorkeeper.si.yml index 6416fd082..4bbfa4e90 100644 --- a/config/locales/doorkeeper.si.yml +++ b/config/locales/doorkeeper.si.yml @@ -4,10 +4,22 @@ si: attributes: doorkeeper/application: name: යෙදුමේ නම + redirect_uri: URI යළි-යොමු කරන්න + scopes: විෂය පථයන් website: යෙදුමේ වියමන අඩවිය + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: කොටසක් අඩංගු විය නොහැක. + invalid_uri: වලංගු URI එකක් විය යුතුය. + relative_uri: නිරපේක්ෂ URI විය යුතුය. + secured_uri: HTTPS/SSL URI එකක් විය යුතුය. doorkeeper: applications: buttons: + authorize: අවසරලත් cancel: අවලංගු destroy: විනාශ කරන්න edit: සංස්කරණය @@ -16,11 +28,20 @@ si: destroy: ඔබට විශ්වාසද? edit: title: යෙදුම සංස්කරණය + form: + error: අපොයි! විය හැකි දෝෂ සඳහා ඔබේ පෝරමය පරීක්ෂා කරන්න + help: + native_redirect_uri: දේශීය පරීක්ෂණ සඳහා %{native_redirect_uri} භාවිතා කරන්න + redirect_uri: URI එකකට එක පේළියක් භාවිතා කරන්න + scopes: අවකාශයන් සහිත විෂය පථයන් වෙන් කරන්න. පෙරනිමි විෂය පථ භාවිතා කිරීමට හිස්ව තබන්න. index: application: යෙදුම + callback_url: ආපසු ඇමතුම් URL + delete: මකන්න empty: ඔබට කිසිම යෙදුමක් නැත. name: නම new: නව යෙදුම + scopes: විෂය පථයන් show: පෙන්වන්න title: ඔබගේ යෙදුම් new: @@ -28,33 +49,137 @@ si: show: actions: ක්රියාමාර්ග application_id: අනුග්රාහක යතුර + callback_urls: ආපසු ඇමතුම් URL + scopes: විෂය පථයන් secret: අනුග්රාහකයේ රහස title: 'යෙදුම: %{name}' authorizations: buttons: authorize: සත්යාපනය + deny: ප්රතික්ෂේප කරන්න + error: + title: දෝෂයක් සිදුවී ඇත + new: + prompt_html: "%{client_name} ඔබගේ ගිණුමට ප්රවේශ වීමට අවසර ලබා ගැනීමට කැමති වේ. එය තෙවන පාර්ශවීය යෙදුමකි. <strong>ඔබ එය විශ්වාස නොකරන්නේ නම්, ඔබ එයට අවසර නොදිය යුතුය.</strong>" + review_permissions: අවසර සමාලෝචනය කරන්න + title: බලය පැවරීමේ අවශ්ය + show: + title: මෙම අවසර කේතය පිටපත් කර එය යෙදුමට අලවන්න. authorized_applications: + buttons: + revoke: අවලංගු කරන්න confirmations: revoke: ඔබට විශ්වාසද? + index: + authorized_at: "%{date}මත අවසර දී ඇත" + description_html: මේවා API භාවිතයෙන් ඔබගේ ගිණුමට ප්රවේශ විය හැකි යෙදුම් වේ. ඔබ මෙහි හඳුනා නොගත් යෙදුම් තිබේ නම්, හෝ යෙදුමක් වැරදි ලෙස හැසිරෙන්නේ නම්, ඔබට එහි ප්රවේශය අවලංගු කළ හැක. + last_used_at: අවසන් වරට භාවිතා කළේ %{date} + never_used: කවදාවත් පාවිච්චි කළේ නැහැ + scopes: අවසර + superapp: අභ්යන්තර + title: ඔබගේ බලයලත් අයදුම්පත් + errors: + messages: + access_denied: සම්පත් හිමිකරු හෝ අවසර සේවාදායකය ඉල්ලීම ප්රතික්ෂේප කළේය. + credential_flow_not_configured: Doorkeeper.configure.resource_owner_from_credentials වින්යාස නොකිරීම හේතුවෙන් සම්පත් හිමිකරුගේ මුරපද අක්තපත්ර ප්රවාහය අසාර්ථක විය. + invalid_client: නොදන්නා සේවාලාභියා නිසා සේවාලාභී සත්යාපනය අසාර්ථක විය, සේවාලාභී සත්යාපනය ඇතුළත් කර නැත, හෝ සහය නොදක්වන සත්යාපන ක්රමයක්. + invalid_grant: සපයා ඇති අවසර දීමනාව වලංගු නැත, කල් ඉකුත් වී ඇත, අවලංගු කර ඇත, අවසර ඉල්ලීමේ භාවිතා කරන ලද යළි-යොමුවීම් URI සමඟ නොගැලපේ, නැතහොත් වෙනත් සේවාදායකයෙකුට නිකුත් කර ඇත. + invalid_redirect_uri: ඇතුළත් කර ඇති යළි-යොමුවීම් uri වලංගු නොවේ. + invalid_request: + missing_param: 'අවශ්ය පරාමිතිය අස්ථානගත වී ඇත: %{value}.' + request_not_authorized: ඉල්ලීම අනුමත කළ යුතුය. අවසර ඉල්ලීම සඳහා අවශ්ය පරාමිතිය අස්ථානගත වී හෝ වලංගු නොවේ. + unknown: ඉල්ලීමට අවශ්ය පරාමිතියක් අස්ථානගත වී ඇත, සහය නොදක්වන පරාමිති අගයක් ඇතුළත් වේ, නැතහොත් වෙනත් ආකාරයකින් විකෘති වී ඇත. + invalid_resource_owner: සපයන ලද සම්පත් හිමිකරු අක්තපත්ර වලංගු නැත, නැතහොත් සම්පත් හිමිකරු සොයාගත නොහැක + invalid_scope: ඉල්ලා සිටින විෂය පථය වලංගු නැත, නොදන්නා, හෝ විකෘති වී ඇත. + invalid_token: + expired: ප්රවේශ ටෝකනය කල් ඉකුත් විය + revoked: ප්රවේශ ටෝකනය අවලංගු කරන ලදී + unknown: ප්රවේශ ටෝකනය වලංගු නොවේ + resource_owner_authenticator_not_configured: Doorkeeper.configure.resource_owner_authenticator වින්යාසගත නොවීම හේතුවෙන් සම්පත් හිමිකරු සොයා ගැනීම අසාර්ථක විය. + server_error: අවසර සේවාදායකයට අනපේක්ෂිත කොන්දේසියක් ඇති වූ අතර එය ඉල්ලීම ඉටු කිරීම වළක්වයි. + temporarily_unavailable: තාවකාලික අධි බර පැටවීමක් හෝ සේවාදායකයේ නඩත්තුවක් හේතුවෙන් අවසර සේවාදායකයට ඉල්ලීම හැසිරවීමට දැනට නොහැක. + unauthorized_client: මෙම ක්රමය භාවිතයෙන් මෙම ඉල්ලීම ඉටු කිරීමට සේවාදායකයාට අවසර නැත. + unsupported_grant_type: අවසර ප්රදාන වර්ගයට බලය පැවරීමේ සේවාදායකය විසින් සහය නොදක්වයි. + unsupported_response_type: අවසර සේවාදායකය මෙම ප්රතිචාර වර්ගයට සහය නොදක්වයි. + flash: + applications: + create: + notice: යෙදුම නිර්මාණය කරන ලදී. + destroy: + notice: යෙදුම මකා ඇත. + update: + notice: යෙදුම යාවත්කාලීන කරන ලදී. + authorized_applications: + destroy: + notice: අයදුම්පත අවලංගු කරන ලදී. + grouped_scopes: + access: + read: කියවීමට පමණක් ප්රවේශය + read/write: කියවීමට සහ ලිවීමට ප්රවේශය + write: ලිවීමට පමණක් ප්රවේශය + title: + accounts: ගිණුම් + admin/accounts: ගිණුම් පරිපාලනය + admin/all: සියලුම පරිපාලන කාර්යයන් + admin/reports: වාර්තා පරිපාලනය + all: සියල්ල + blocks: කුට්ටි + bookmarks: පිටු සලකුණු + conversations: සංවාද + crypto: අන්තයේ සිට අගට සංකේතනය කිරීම + favourites: ප්රියතම + filters: පෙරහන් + follow: සබඳතා + follows: පහත සඳහන් + lists: ලැයිස්තු + media: මාධ්ය ඇමුණුම් + mutes: නිහඬ කරයි + notifications: දැනුම්දීම් + push: තල්ලු දැනුම්දීම් + reports: වාර්තා + search: සොයන්න + statuses: තනතුරු layouts: admin: nav: applications: යෙදුම් oauth2_provider: වි.සත්යා.2 (OAuth) සැපයුම්කරු application: - title: වි.සත්යා. (OAuth) අනුමැතිය අවශ්යයයි + title: වි.සත්යා. (OAuth) තොරතුරු අවශ්යයි scopes: admin:read: සේවාදායකයේ ඇති සියලුම දත්ත කියවන්න admin:read:accounts: සියලුම ගිණුම් වල සංවේදී තොරතුරු කියවන්න admin:read:reports: සියලුම වාර්තා සහ වාර්තා කළ ගිණුම් වල සංවේදී තොරතුරු කියවන්න + admin:write: සේවාදායකයේ සියලුම දත්ත වෙනස් කරන්න + admin:write:accounts: ගිණුම් මත මධ්යස්ථ ක්රියා සිදු කරන්න + admin:write:reports: වාර්තා මත මධ්යස්ථ ක්රියා සිදු කරන්න + crypto: end-to-end encryption භාවිතා කරන්න + follow: ගිණුම් සබඳතා වෙනස් කරන්න + push: ඔබගේ තල්ලු දැනුම්දීම් ලබා ගන්න read: ඔබගේ ගිණුමේ සියලුම දත්ත කියවන්න + read:accounts: ගිණුම් තොරතුරු බලන්න + read:blocks: ඔබගේ වාරණ බලන්න + read:bookmarks: ඔබගේ පිටු සලකුණු බලන්න + read:favourites: ඔබේ ප්රියතම බලන්න read:filters: ඔබගේ පෙරහන් බලන්න + read:follows: ඔබගේ පහත සඳහන් බලන්න read:lists: ඔබගේ ලැයිස්තු බලන්න + read:mutes: ඔබේ ගොළු බලන්න read:notifications: ඔබගේ දැනුම්දීම් බලන්න - read:search: ඔබ වෙනුවට සොයන්න + read:reports: ඔබගේ වාර්තා බලන්න + read:search: ඔබ වෙනුවෙන් සොයන්න + read:statuses: සියලුම පෝස්ට් බලන්න + write: ඔබගේ ගිණුමේ සියලුම දත්ත වෙනස් කරන්න + write:accounts: ඔබගේ පැතිකඩ වෙනස් කරන්න write:blocks: ගිණුම් සහ වසම් අවහිර කරන්න - write:filters: පෙරහන් සාදන්න + write:bookmarks: පිටු සලකුණු සටහන් + write:conversations: සංවාද නිහඬ කිරීම සහ මකා දැමීම + write:favourites: ප්රියතම තනතුරු + write:filters: පෙරහන් කරන්න + write:follows: මිනිසුන් අනුගමනය කරන්න + write:lists: ලැයිස්තු සාදන්න write:media: මාධ්ය ගොනු උඩුගත කරන්න - write:mutes: මිනිසුන් සහ සංවාද නිහඬකරන්න + write:mutes: මිනිසුන් සහ සංවාද කරන්න write:notifications: ඔබගේ දැනුම්දීම් හිස්කරන්න - write:reports: වෙනත් මිනිසුන් වාර්තා කරන්න + write:reports: වෙනත් පුද්ගලයින් වාර්තා කරන්න + write:statuses: පළ කිරීම් පළ කරන්න diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml index 5c1e1582f..963b2361d 100644 --- a/config/locales/doorkeeper.th.yml +++ b/config/locales/doorkeeper.th.yml @@ -81,16 +81,25 @@ th: errors: messages: access_denied: เจ้าของทรัพยากรหรือเซิร์ฟเวอร์การอนุญาตปฏิเสธคำขอ + credential_flow_not_configured: การไหลของข้อมูลรับรองรหัสผ่านเจ้าของทรัพยากรล้มเหลวเนื่องจาก Doorkeeper.configure.resource_owner_from_credentials ไม่ได้ถูกกำหนดค่า + invalid_client: การตรวจสอบสิทธิ์ไคลเอ็นต์ล้มเหลวเนื่องจากไคลเอ็นต์ที่ไม่รู้จัก ไม่รวมการตรวจสอบไคลเอ็นต์ หรือวิธีการตรวจสอบสิทธิ์ที่ไม่รองรับ + invalid_grant: การให้สิทธิ์ที่ระบุไม่ถูกต้อง หมดอายุ เพิกถอน ไม่ตรงกับ URI การเปลี่ยนเส้นทางที่ใช้ในคำขอการให้สิทธิ์ หรือออกให้ไคลเอ็นต์อื่น invalid_redirect_uri: URI การเปลี่ยนเส้นทางที่รวมอยู่ไม่ถูกต้อง invalid_request: missing_param: 'พารามิเตอร์ที่จำเป็นขาดหายไป: %{value}' + request_not_authorized: คำขอต้องได้รับอนุญาต พารามิเตอร์ที่จำเป็นสำหรับการให้สิทธิ์คำขอขาดหายไปหรือไม่ถูกต้อง + unknown: คำขอไม่มีพารามิเตอร์ที่จำเป็น มีค่าพารามิเตอร์ที่ไม่รองรับ หรืออยู่ในรูปแบบที่ไม่ถูกต้อง + invalid_resource_owner: ข้อมูลรับรองเจ้าของทรัพยากรที่ระบุไม่ถูกต้อง หรือไม่พบเจ้าของทรัพยากร invalid_scope: ขอบเขตที่ขอไม่ถูกต้อง ไม่รู้จัก หรือผิดรูปแบบ invalid_token: expired: โทเคนการเข้าถึงหมดอายุแล้ว revoked: เพิกถอนโทเคนการเข้าถึงแล้ว unknown: โทเคนการเข้าถึงไม่ถูกต้อง resource_owner_authenticator_not_configured: การค้นหาเจ้าของทรัพยากรล้มเหลวเนื่องจากไม่ได้กำหนดค่า Doorkeeper.configure.resource_owner_authenticator + server_error: เซิร์ฟเวอร์การให้สิทธิ์พบสภาวะที่ไม่คาดคิดซึ่งทำให้ไม่สามารถดำเนินการตามคำขอได้ + temporarily_unavailable: ขณะนี้เซิร์ฟเวอร์การให้สิทธิ์ไม่สามารถจัดการตามคำขอได้ เนื่องจากการโอเวอร์โหลดหรือมีการบำรุงรักษาเซิร์ฟเวอร์ชั่วคราว unauthorized_client: ไคลเอ็นต์ไม่ได้รับอนุญาตให้ทำคำขอนี้โดยใช้วิธีการนี้ + unsupported_grant_type: ประเภทการให้สิทธิ์ไม่ได้รับการสนับสนุนโดยเซิร์ฟเวอร์การให้สิทธิ์นะ unsupported_response_type: เซิร์ฟเวอร์การอนุญาตไม่รองรับชนิดการตอบสนองนี้ flash: applications: diff --git a/config/locales/el.yml b/config/locales/el.yml index 96ec15247..8bbb02822 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -80,10 +80,8 @@ el: posts_tab_heading: Τουτ posts_with_replies: Τουτ και απαντήσεις roles: - admin: Διαχειριστής bot: Μποτ (αυτόματος λογαριασμός) group: Ομάδα - moderator: Μεσολαβητής unavailable: Το προφίλ δεν είναι διαθέσιμο unfollow: Διακοπή παρακολούθησης admin: @@ -102,12 +100,15 @@ el: avatar: Αβατάρ by_domain: Τομέας change_email: - changed_msg: Επιτυχής αλλαγή email λογαριασμού! current_email: Τρέχον email label: Αλλαγή email new_email: Νέο email submit: Αλλαγή email title: Αλλαγή email για %{username} + change_role: + label: Αλλαγή ρόλου + no_role: Κανένας ρόλος + title: Αλλαγή ρόλου για %{username} confirm: Επιβεβαίωση confirmed: Επιβεβαιώθηκε confirming: Προς επιβεβαίωση @@ -148,6 +149,7 @@ el: active: Ενεργός/ή all: Όλα pending: Εκκρεμούν + silenced: Περιορισμένοι suspended: Σε αναστολή title: Μεσολάβηση moderation_notes: Σημειώσεις μεσολάβησης @@ -155,6 +157,7 @@ el: most_recent_ip: Πιο πρόσφατη IP no_account_selected: Κανείς λογαριασμός δεν ενημερώθηκε αφού κανείς δεν ήταν επιλεγμένος no_limits_imposed: Χωρίς όρια + no_role_assigned: Δεν έχει ανατεθεί ρόλος not_subscribed: Άνευ συνδρομής pending: Εκκρεμεί έγκριση perform_full_suspension: Αναστολή @@ -177,12 +180,7 @@ el: reset: Επαναφορά reset_password: Επαναφορά συνθηματικού resubscribe: Επανεγγραφή - role: Δικαιώματα - roles: - admin: Διαχειριστής - moderator: Συντονιστής - staff: Προσωπικό - user: Χρήστης + role: Ρόλος search: Αναζήτηση search_same_email_domain: Άλλοι χρήστες με τον ίδιο τομέα e-mail search_same_ip: Υπόλοιποι χρήστες με την ίδια διεύθυνση IP @@ -492,6 +490,16 @@ el: unresolved: Άλυτη updated_at: Ενημερωμένη view_profile: Προβολή προφίλ + roles: + add_new: Προσθήκη ρόλου + assigned_users: + one: "%{count} χρήστης" + other: "%{count} χρήστες" + categories: + administration: Διαχείριση + devops: Devops + invites: Προσκλήσεις + delete: Διαγραφή rules: add_new: Προσθήκη κανόνα delete: Διαγραφή @@ -544,9 +552,6 @@ el: deletion: desc_html: Επέτρεψε σε οποιονδήποτε να διαγράψει το λογαριασμό του/της title: Άνοιξε τη διαγραφή λογαριασμού - min_invite_role: - disabled: Κανείς - title: Επέτρεψε προσκλήσεις από registrations_mode: modes: approved: Απαιτείται έγκριση για εγγραφή @@ -556,9 +561,6 @@ el: show_known_fediverse_at_about_page: desc_html: Όταν αντιστραφεί, θα δείχνει τα τουτ από όλο το γνωστό fediverse στην προεπισκόπηση. Διαφορετικά θα δείχνει μόνο τοπικά τουτ. title: Εμφάνιση του γνωστού fediverse στην προεπισκόπηση ροής - show_staff_badge: - desc_html: Δείξε ένα σήμα προσωπικού στη σελίδα ενός χρήστη - title: Δείξε διακριτικό προσωπικού site_description: desc_html: Εισαγωγική παράγραφος στην αρχική σελίδα. Περιέγραψε τι κάνει αυτό τον διακομιστή Mastodon διαφορετικό και ό,τι άλλο ενδιαφέρον. Μπορείς να χρησιμοποιήσεις HTML tags, συγκεκριμένα <code>< a></code> και <code> < em></code>. title: Περιγραφή κόμβου @@ -820,15 +822,20 @@ el: public: Δημόσιες ροές thread: Συζητήσεις edit: + add_keyword: Προσθήκη λέξης-κλειδιού + keywords: Λέξεις-κλειδιά title: Ενημέρωση φίλτρου errors: invalid_context: Έδωσες λάθος ή ανύπαρκτο πλαίσιο - invalid_irreversible: Τα μη αντιστρέψιμα φίλτρα δουλεύουν μόνο στα πλαίσια της αρχικής ροής και των ειδοποιήσεων index: + contexts: Φίλτρα σε %{contexts} delete: Διαγραφή empty: Δεν έχεις φίλτρα. + expires_in: Λήγει σε %{distance} + expires_on: Λήγει στις %{date} title: Φίλτρα new: + save: Αποθήκευση νέου φίλτρου title: Πρόσθεσε νέο φίλτρο footer: developers: Ανάπτυξη @@ -935,6 +942,8 @@ el: copy_account_note_text: 'Ο/Η χρήστης μετακόμισε από το %{acct}, ορίστε οι προηγούμενες σημειώσεις σου:' notification_mailer: admin: + report: + subject: "%{name} υπέβαλε μια αναφορά" sign_up: subject: "%{name} έχει εγγραφεί" digest: diff --git a/config/locales/en.yml b/config/locales/en.yml index cedcc9361..2cd4f45ac 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -83,10 +83,8 @@ en: posts_tab_heading: Posts posts_with_replies: Posts and replies roles: - admin: Admin bot: Bot group: Group - moderator: Mod unavailable: Profile unavailable unfollow: Unfollow admin: @@ -105,12 +103,17 @@ en: avatar: Avatar by_domain: Domain change_email: - changed_msg: Account email successfully changed! + changed_msg: Email successfully changed! current_email: Current email label: Change email new_email: New email submit: Change email title: Change email for %{username} + change_role: + changed_msg: Role successfully changed! + label: Change role + no_role: No role + title: Change role for %{username} confirm: Confirm confirmed: Confirmed confirming: Confirming @@ -154,6 +157,7 @@ en: active: Active all: All pending: Pending + silenced: Limited suspended: Suspended title: Moderation moderation_notes: Moderation notes @@ -161,6 +165,7 @@ en: most_recent_ip: Most recent IP no_account_selected: No accounts were changed as none were selected no_limits_imposed: No limits imposed + no_role_assigned: No role assigned not_subscribed: Not subscribed pending: Pending review perform_full_suspension: Suspend @@ -187,12 +192,7 @@ en: reset: Reset reset_password: Reset password resubscribe: Resubscribe - role: Permissions - roles: - admin: Administrator - moderator: Moderator - staff: Staff - user: User + role: Role search: Search search_same_email_domain: Other users with the same e-mail domain search_same_ip: Other users with the same IP @@ -649,6 +649,67 @@ en: unresolved: Unresolved updated_at: Updated view_profile: View profile + roles: + add_new: Add role + assigned_users: + one: "%{count} user" + other: "%{count} users" + categories: + administration: Administration + devops: Devops + invites: Invites + moderation: Moderation + special: Special + delete: Delete + description_html: With <strong>user roles</strong>, you can customize which functions and areas of Mastodon your users can access. + edit: Edit '%{name}' role + everyone: Default permissions + everyone_full_description_html: This is the <strong>base role</strong> affecting <strong>all users</strong>, even those without an assigned role. All other roles inherit permissions from it. + permissions_count: + one: "%{count} permission" + other: "%{count} permissions" + privileges: + administrator: Administrator + administrator_description: Users with this permission will bypass every permission + delete_user_data: Delete User Data + delete_user_data_description: Allows users to delete other users' data without delay + invite_users: Invite Users + invite_users_description: Allows users to invite new people to the server + manage_announcements: Manage Announcements + manage_announcements_description: Allows users to manage announcements on the server + manage_appeals: Manage Appeals + manage_appeals_description: Allows users to review appeals against moderation actions + manage_blocks: Manage Blocks + manage_blocks_description: Allows users to block e-mail providers and IP addresses + manage_custom_emojis: Manage Custom Emojis + manage_custom_emojis_description: Allows users to manage custom emojis on the server + manage_federation: Manage Federation + manage_federation_description: Allows users to block or allow federation with other domains, and control deliverability + manage_invites: Manage Invites + manage_invites_description: Allows users to browse and deactivate invite links + manage_reports: Manage Reports + manage_reports_description: Allows users to review reports and perform moderation actions against them + manage_roles: Manage Roles + manage_roles_description: Allows users to manage and assign roles below theirs + manage_rules: Manage Rules + manage_rules_description: Allows users to change server rules + manage_settings: Manage Settings + manage_settings_description: Allows users to change site settings + manage_taxonomies: Manage Taxonomies + manage_taxonomies_description: Allows users to review trending content and update hashtag settings + manage_user_access: Manage User Access + manage_user_access_description: Allows users to disable other users' two-factor authentication, change their e-mail address, and reset their password + manage_users: Manage Users + manage_users_description: Allows users to view other users' details and perform moderation actions against them + manage_webhooks: Manage Webhooks + manage_webhooks_description: Allows users to set up webhooks for administrative events + view_audit_log: View Audit Log + view_audit_log_description: Allows users to see a history of administrative actions on the server + view_dashboard: View Dashboard + view_dashboard_description: Allows users to access the dashboard and various metrics + view_devops: Devops + view_devops_description: Allows users to access Sidekiq and pgHero dashboards + title: Roles rules: add_new: Add rule delete: Delete @@ -701,9 +762,6 @@ en: deletion: desc_html: Allow anyone to delete their account title: Open account deletion - min_invite_role: - disabled: No one - title: Allow invitations by require_invite_text: desc_html: When registrations require manual approval, make the “Why do you want to join?” text input mandatory rather than optional title: Require new users to enter a reason to join @@ -716,9 +774,6 @@ en: show_known_fediverse_at_about_page: desc_html: When disabled, restricts the public timeline linked from the landing page to showing only local content title: Include federated content on unauthenticated public timeline page - show_staff_badge: - desc_html: Show a staff badge on a user page - title: Show staff badge site_description: desc_html: Introductory paragraph on the API. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code><a></code> and <code><em></code>. title: Server description @@ -1124,15 +1179,24 @@ en: public: Public timelines thread: Conversations edit: + add_keyword: Add keyword + keywords: Keywords title: Edit filter errors: + deprecated_api_multiple_keywords: These parameters cannot be changed from this application because they apply to more than one filter keyword. Use a more recent application or the web interface. invalid_context: None or invalid context supplied - invalid_irreversible: Irreversible filtering only works with home or notifications context index: + contexts: Filters in %{contexts} delete: Delete empty: You have no filters. + expires_in: Expires in %{distance} + expires_on: Expires on %{date} + keywords: + one: "%{count} keyword" + other: "%{count} keywords" title: Filters new: + save: Save new filter title: Add new filter footer: developers: Developers @@ -1251,6 +1315,8 @@ en: copy_account_note_text: 'This user moved from %{acct}, here were your previous notes about them:' notification_mailer: admin: + report: + subject: "%{name} submitted a report" sign_up: subject: "%{name} signed up" digest: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index d287fb590..5fbde142b 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -2,19 +2,19 @@ eo: about: about_hashtag_html: Ĉi tiuj estas la publikaj mesaĝoj markitaj per <strong>#%{hashtag}</strong>. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse. - about_mastodon_html: Mastodon estas socia reto bazita sur malfermitaj retaj protokoloj kaj sur libera malfermitkoda programo. Ĝi estas sencentra kiel retmesaĝoj. + about_mastodon_html: 'Mastodon estas socia retejo de la estonteco: sen reklamo, sen kompania gvato, etika dezajno kaj malcentraligo! Vi regu viajn datumojn kun Mastodon!' about_this: Pri - active_count_after: aktiva + active_count_after: aktivaj active_footnote: Monate Aktivaj Uzantoj (MAU) administered_by: 'Administrata de:' api: API apps: Poŝtelefonaj aplikaĵoj - apps_platforms: Uzu Mastodon ĉe iOS, Android kaj aliajn platformojn - browse_directory: Esplori profilujo kaj filtri per interesoj + apps_platforms: Uzu Mastodon de iOS, Android, kaj aliaj substratoj + browse_directory: Esplori la profilujon kaj filtri en interesoj browse_local_posts: Vidi vivantan fluon de publikaj mesaĝoj al Mastodon browse_public_posts: Vidi vivantan fluon de publikaj mesaĝoj al Mastodon - contact: Kontakti - contact_missing: Ne elektita + contact: Kontakto + contact_missing: Ne ŝargita contact_unavailable: Ne disponebla continue_to_web: Daŭrigi al la retaplikaĵo discover_users: Malkovri uzantojn @@ -22,9 +22,9 @@ eo: federation_hint_html: Per konto ĉe %{instance}, vi povos sekvi homojn ĉe iu ajn Mastodon nodo kaj preter. get_apps: Provu telefonan aplikaĵon hosted_on: "%{domain} estas nodo de Mastodon" - instance_actor_flash: | - Ĉi tiu konto estas virtuala ulo uzata por reprezenti la servilon mem kaj ne iun apartan uzanton. - Ĝi estas uzata por frataraj celoj kaj ĝi ne devus esti blokita krom se vi volas bloki la tutan servilon, tiuokaze vi devus uzi domajnan blokadon. + instance_actor_flash: 'Ĉi tiu konto estas virtuala agento uzata por reprezenti la servilon mem kaj neniu individua uzanto. Ĝi estas uzata por celoj de la federaĵo kaj devas ne esti brokita se vi ne volas bloki la tutan servilon, en kiu okazo vi devas uzi blokadon de domajno. + + ' learn_more: Lerni pli logout_before_registering: Vi jam salutis. privacy_policy: Privateca politiko @@ -36,14 +36,17 @@ eo: one: mesaĝo other: mesaĝoj status_count_before: Kie skribiĝis - terms: Uzkondiĉoj + terms: Kondiĉoj de la servo unavailable_content: Moderigitaj serviloj unavailable_content_description: domain: Servilo - reason: 'Kialo:' + reason: Motivo + rejecting_media: 'La aŭdovidaj dosieroj de ĉi tiuj serviloj ne estos prilaboritaj aŭ stokitaj, kaj neniu bildeto estos montrita, do necesas klaki permane por vidi la originalan afiŝon:' rejecting_media_title: Filtritaj aŭdovidaĵoj - silenced_title: Silentigitaj serviloj - suspended_title: Haltigitaj serviloj + silenced: 'La mesaĝoj de tiuj serviloj estos kaŝitaj de publikaj templinio kaj konversacioj, kaj la interagoj de la uzantoj donas neniun sciigon, ĝis vi sekvos ilin:' + silenced_title: Limigitaj serviloj + suspended: 'Neniu datumo de ĉi tiuj serviloj estos prilaboritaj, stokitaj, aŭ interŝanĝitaj, neeble fari interagon aŭ komunikon kun la uzantoj de ĉi tiuj serviloj:' + suspended_title: Suspenditaj serviloj user_count_after: one: uzanto other: uzantoj @@ -56,6 +59,7 @@ eo: one: Sekvanto other: Sekvantoj following: Sekvatoj + instance_actor_flash: Ĉi tiu konto estas virtuala agento uzata por reprezenti la servilon mem kaj neniu individua uzanto. Ĝi estas uzata por celoj de la federaĵo kaj devas ne esti suspendita. joined: Aliĝis je %{date} last_active: laste aktiva link_verified_on: Proprieto de ĉi tiu ligilo estis kontrolita je %{date} @@ -73,10 +77,8 @@ eo: posts_tab_heading: Mesaĝoj posts_with_replies: Mesaĝoj kaj respondoj roles: - admin: Administranto bot: Roboto group: Grupo - moderator: Kontrolanto unavailable: Profilo ne disponebla unfollow: Ne plu sekvi admin: @@ -91,10 +93,9 @@ eo: add_email_domain_block: Bloki retadresan domajnon approve: Aprobi are_you_sure: Ĉu vi certas? - avatar: Profilbildo + avatar: Rolfiguro by_domain: Domajno change_email: - changed_msg: Konta retadreso sukcese ŝanĝita! current_email: Nuna retadreso label: Ŝanĝi retadreson new_email: Nova retadreso @@ -131,14 +132,14 @@ eo: remote: Foraj title: Loko login_status: Ensaluta stato - media_attachments: Ligitaj aŭdovidaĵoj + media_attachments: Aŭdovidaj aldonaĵoj memorialize: Ŝanĝi al memoro memorialized: Memorita moderation: active: Aktiva all: Ĉio pending: Pritraktata - suspended: Haltigita + suspended: Suspendita title: Moderigado moderation_notes: Notoj de moderigado most_recent_activity: Lasta ago @@ -154,8 +155,9 @@ eo: push_subscription_expires: Eksvalidiĝo de la abono al PuSH redownload: Aktualigi profilon reject: Malakcepti - remove_avatar: Forigi profilbildon + remove_avatar: Forigi la rolfiguron remove_header: Forigi kapan bildon + removed_avatar_msg: La bildo de la rolfiguro de %{username} estas sukcese forigita resend_confirmation: already_confirmed: Ĉi tiu uzanto jam estas konfirmita send: Resendi konfirman retmesaĝon @@ -163,12 +165,6 @@ eo: reset: Restarigi reset_password: Restarigi pasvorton resubscribe: Reaboni - role: Permesoj - roles: - admin: Administranto - moderator: Moderigisto - staff: Teamo - user: Uzanto search: Serĉi search_same_email_domain: Aliaj uzantoj kun la sama retpoŝta domajno search_same_ip: Aliaj uzantoj kun la sama IP @@ -179,14 +175,15 @@ eo: sensitized: markita tikla shared_inbox_url: URL de kunhavigita leterkesto show: - created_reports: Kreitaj signaloj - targeted_reports: Signalitaj de aliaj - silence: Kaŝi + created_reports: Faritaj raportoj + targeted_reports: Raporitaj de alia + silence: Mutigita silenced: Silentigita statuses: Mesaĝoj subscribe: Aboni suspend: Haltigu - suspended: Haltigita + suspended: Suspendita + suspension_reversible_hint_html: La konto estas suspendita, kaj la datumoj estos komplete forgitaj en la %{date}. Ĝis tiam, la konto povas esti restaŭrita sen malutila efiko. Se vi deziras tuj forigi ĉiujn datumojn de la konto, vi povas fari ĉi-sube. title: Kontoj unblock_email: Malbloki retpoŝtadresojn unblocked_email_msg: Sukcese malblokis la retpoŝtadreson de %{username} @@ -195,6 +192,7 @@ eo: undo_silenced: Malfari kaŝon undo_suspension: Malfari haltigon unsubscribe: Malaboni + unsuspended_msg: La konto de %{username} estas sukcese reaktivigita username: Uzantnomo view_domain: Vidi la resumon de la domajno warn: Averti @@ -206,7 +204,7 @@ eo: assigned_to_self_report: Atribui Raporton change_email_user: Ŝanĝi retadreson de uzanto confirm_user: Konfermi uzanto - create_account_warning: Krei Averton + create_account_warning: Krei averton create_announcement: Krei Anoncon create_custom_emoji: Krei Propran emoĝion create_domain_allow: Krei Domajnan Permeson @@ -226,11 +224,12 @@ eo: disable_custom_emoji: Malebligi Propran Emoĝion disable_user: Malebligi uzanton enable_custom_emoji: Ebligi Propran Emoĝion + enable_sign_in_token_auth_user: Aktivigi la aŭtentigon de peco per retpoŝto por la uzanto enable_user: Ebligi uzanton memorialize_account: Memorigu Konton promote_user: Promocii Uzanton reject_user: Malakcepti Uzanton - remove_avatar_user: Forigi profilbildon + remove_avatar_user: Forigi la rolfiguron reopen_report: Remalfermi signalon reset_password_user: Restarigi pasvorton resolve_report: Solvitaj reporto @@ -274,8 +273,10 @@ eo: memorialize_account_html: "%{name} ŝanĝis la konton de %{target} al memora paĝo" promote_user_html: "%{name} plirangigis uzanton %{target}" reject_user_html: "%{name} malakceptis registriĝon de %{target}" - remove_avatar_user_html: "%{name} forigis profilbildon de %{target}" + remove_avatar_user_html: "%{name} forigis la rolfiguron de %{target}" reopen_report_html: "%{name} remalfermis signalon %{target}" + suspend_account_html: "%{name} suspendis la konton de %{target}" + unsuspend_account_html: "%{name} reaktivigis la konton de %{target}" update_announcement_html: "%{name} ĝisdatigis anoncon %{target}" deleted_status: "(forigita mesaĝo)" empty: Neniu protokolo trovita. @@ -334,7 +335,7 @@ eo: dashboard: active_users: aktivaj uzantoj interactions: interago - media_storage: Aŭdvidaĵa memorilo + media_storage: Memorilo de aŭdovidaĵoj new_users: novaj uzantoj opened_reports: raportoj malfermitaj resolved_reports: raportoj solvitaj @@ -361,13 +362,13 @@ eo: severity: desc_html: "<strong>Kaŝi</strong> igos la mesaĝojn de la konto nevideblaj al tiuj, kiuj ne sekvas tiun. <strong>Haltigi</strong> forigos ĉiujn enhavojn, aŭdovidaĵojn kaj datumojn de la konto. Uzu <strong>Nenio</strong> se vi simple volas malakcepti aŭdovidaĵojn." noop: Nenio - silence: Kaŝi + silence: Mutigi suspend: Haltigi title: Nova domajna blokado obfuscate: Malklara domajna nomo private_comment: Privata komento public_comment: Publika komento - reject_media: Malakcepti aŭdovidajn dosierojn + reject_media: Malakcepti la aŭdovidajn dosierojn reject_media_hint: Forigas aŭdovidaĵojn loke konservitajn kaj rifuzas alŝuti ajnan estonte. Ne koncernas haltigojn reject_reports: Malakcepti signalojn reject_reports_hint: Ignori ĉiujn signalojn el tiu domajno. Ne koncernas haltigojn @@ -398,6 +399,7 @@ eo: by_domain: Domajno content_policies: policies: + reject_media: Malakcepti la aŭdovidaĵojn reject_reports: Malakcepti raportojn silence: Kaŝu policy: Politiko @@ -406,10 +408,12 @@ eo: instance_accounts_measure: konservitaj kontoj instance_followers_measure: niaj sekvantoj tie instance_follows_measure: iliaj sekvantoj ĉi tie + instance_media_attachments_measure: stokitaj aŭdovidaj aldonaĵoj instance_reports_measure: raportoj pri ili instance_statuses_measure: konservitaj afiŝoj delivery: all: Ĉiuj + unavailable: Nedisponebla delivery_available: Liverado disponeblas empty: Neniuj domajnoj trovitaj. moderation: @@ -475,6 +479,8 @@ eo: one: "%{count} noto" other: "%{count} notoj" action_taken_by: Ago farita de + actions: + other_description_html: Vidu pli da elektebloj por kontroli la agadon de la konto kaj personecigi la komunikadon kun la konto pri kiu raporto. add_to_report: Aldoni pli al raporto are_you_sure: Ĉu vi certas? assign_to_self: Asigni al mi @@ -512,6 +518,10 @@ eo: unresolved: Nesolvitaj updated_at: Ĝisdatigita view_profile: Vidi profilon + roles: + everyone: Implicitaj permesoj + privileges: + delete_user_data: Forviŝi la datumojn de la uzanto rules: add_new: Aldoni regulon delete: Forigi @@ -547,7 +557,7 @@ eo: desc_html: Nomoj de domajnoj, kiujn ĉi tiu servilo renkontis en la federauniverso title: Publikigi liston de malkovritaj serviloj preview_sensitive_media: - desc_html: Antaŭvido de ligiloj en aliaj retejoj montros bildeton eĉ se la aŭdovidaĵo estas markita kiel tikla + desc_html: La antaŭmontroj de ligilo al la aliaj retejoj montros bildeton eĉ se la aŭdovidaĵo estas markita kiel tikla title: Montri tiklajn aŭdovidaĵojn en la antaŭvidoj de OpenGraph profile_directory: desc_html: Permesi al uzantoj esti troveblaj @@ -559,21 +569,15 @@ eo: deletion: desc_html: Permesi al iu ajn forigi propran konton title: Permesi forigi konton - min_invite_role: - disabled: Neniu - title: Permesi invitojn de registrations_mode: modes: approved: Bezonas aprobi por aliĝi none: Neniu povas aliĝi open: Iu povas aliĝi - title: Registrado modo + title: Reĝimo de registriĝo show_known_fediverse_at_about_page: desc_html: Kiam ŝaltita, ĝi montros mesaĝojn de la tuta konata fediverse antaŭvide. Aliokaze, ĝi montros nur lokajn mesaĝojn. - title: Montri konatan fediverse en tempolinia antaŭvido - show_staff_badge: - desc_html: Montri teaman insignon en paĝo de uzanto - title: Montri teaman insignon + title: Inkluzivi frataran enhavon en la neaŭtentigita publika antaŭmontro de templinio site_description: desc_html: Enkonduka alineo en la ĉefpaĝo. Priskribu la unikaĵojn de ĉi tiu nodo de Mastodon, kaj ĉiujn aliajn gravaĵojn. Vi povas uzi HTML-etikedojn, kiel <code><a></code> kaj <code><em></code>. title: Priskribo de la servilo @@ -585,14 +589,14 @@ eo: title: Mallonga priskribo de la servilo site_terms: desc_html: Vi povas skribi vian propran privatecan politikon, viajn uzkondiĉojn aŭ aliajn leĝaĵojn. Vi povas uzi HTML-etikedojn - title: Propraj uzkondiĉoj + title: Propraj kondiĉoj de la servo site_title: Nomo de la servilo thumbnail: desc_html: Uzata por antaŭvidoj per OpenGraph kaj per API. 1200x630px rekomendita title: Bildeto de la servilo timeline_preview: desc_html: Montri publikan templinion en komenca paĝo - title: Tempolinia antaŭvido + title: Permesi la neaŭtentigitan aliron al la publika templinio title: Retejaj agordoj trends: desc_html: Publike montri antaŭe kontrolitajn kradvortojn, kiuj nune furoras @@ -615,6 +619,7 @@ eo: actions: delete_statuses: "%{name} forigis afiŝojn de %{target}" disable: "%{name} malebligis la konton de %{target}" + suspend: "%{name} suspendis la konton de %{target}" appeal_approved: Apelaciita system_checks: database_schema_check: @@ -649,8 +654,8 @@ eo: title: Tendencoj warning_presets: add_new: Aldoni novan - delete: Forigi - edit_preset: Redakti avertan antaŭagordon + delete: Forviŝi + edit_preset: Redakti la antaŭagordojn de averto title: Administri avertajn antaŭagordojn admin_mailer: new_appeal: @@ -710,6 +715,7 @@ eo: description: prefix_invited_by_user: "@%{name} invitigi vin aligiĝi ĉi tiu servilo de Mastodon!" prefix_sign_up: Registriĝi ĉe Mastodon hodiaŭ! + suffix: Kun konto, vi povos sekvi aliajn homojn, skribi afiŝojn kaj interŝanĝi mesaĝojn kun la uzantoj de iu ajn Mastodon'a servilo kaj multe pli! didnt_get_confirmation: Ĉu vi ne ricevis la instrukciojn por konfirmi? dont_have_your_security_key: Ne havas vi vian sekurecan ŝlosilon? forgot_password: Pasvorto forgesita? @@ -727,7 +733,7 @@ eo: register: Registriĝi registration_closed: "%{instance} ne estas akcepti nova uzantojn" resend_confirmation: Resendi la instrukciojn por konfirmi - reset_password: Ŝanĝi pasvorton + reset_password: Restarigi pasvorton security: Sekureco set_new_password: Elekti novan pasvorton setup: @@ -759,7 +765,7 @@ eo: invalid_signature: 올바른 Ed25519 시그니처가 아닙니다 date: formats: - default: "%Y-%m-%d " + default: "%d de %b %Y" with_month_name: "%e-a de %B %Y" datetime: distance_in_words: @@ -846,15 +852,23 @@ eo: public: Publika templinio thread: Konversacioj edit: + add_keyword: Aldoni ĉefvorton + keywords: Ĉefvortoj title: Ŝanĝi filtrilojn errors: invalid_context: Neniu aŭ nevalida kunteksto donita - invalid_irreversible: Nemalfarebla filtrado funkcias nur por hejma aŭ sciiga kuntekstoj index: + contexts: Filtri en %{contexts} delete: Forigi empty: Vi havas neniun filtrilon. + expires_in: Eksvalidiĝi en %{distance} + expires_on: Eksvalidiĝi je %{date} + keywords: + one: "%{count} ĉefvorto" + other: "%{count} ĉefvortoj" title: Filtriloj new: + save: Konservi novan filtrilon title: Aldoni novan filtrilon footer: developers: Programistoj @@ -1010,9 +1024,9 @@ eo: wrong_code: La enmetita kodo estis nevalida! Ĉu la servila tempo kaj la aparata tempo ĝustas? pagination: newer: Pli nova - next: Sekva + next: Antaŭen older: Malpli nova - prev: Antaŭa + prev: Malantaŭen truncate: "…" polls: errors: @@ -1027,7 +1041,7 @@ eo: too_many_options: ne povas enhavi pli da %{max} proponoj preferences: other: Aliaj aferoj - posting_defaults: Afiŝadoj defaŭltoj + posting_defaults: Implicitaj agordoj de afiŝado public_timelines: Publikaj templinioj reactions: errors: @@ -1060,13 +1074,15 @@ eo: remote_interaction: favourite: proceed: Konfirmi la stelumon - prompt: 'Vi volas stelumi ĉi tiun mesaĝon:' + prompt: 'Vi volas aldoni ĉi tiun mesaĝon al viaj preferaĵoj:' reblog: proceed: Konfirmi la diskonigon prompt: 'Vi volas diskonigi ĉi tiun mesaĝon:' reply: proceed: Konfirmi la respondon prompt: 'Vi volas respondi al ĉi tiu mesaĝo:' + rss: + content_warning: 'Averto pri enhavo:' scheduled_statuses: over_daily_limit: Vi transpasis la limigon al %{limit} samtage planitaj mesaĝoj over_total_limit: Vi transpasis la limigon al %{limit} planitaj mesaĝoj @@ -1105,7 +1121,7 @@ eo: ios: iOS linux: Linux mac: Mac - other: nekonata platformo + other: nekonata substrato windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone @@ -1125,7 +1141,7 @@ eo: export: Eksporti datumojn featured_tags: Elstarigitaj kradvortoj import: Importi - import_and_export: Alporto kaj elporto + import_and_export: Enporti kaj elporti migrate: Konta migrado notifications: Sciigoj preferences: Preferoj @@ -1146,7 +1162,8 @@ eo: one: "%{count} video" other: "%{count} videoj" boosted_from_html: Diskonigita de %{acct_link} - content_warning: 'Enhava averto: %{warning}' + content_warning: 'Averto de la enhavo: %{warning}' + default_language: Same kiel lingvo de la fasado disallowed_hashtags: one: 'enhavas malpermesitan kradvorton: %{tags}' other: 'enhavis malpermesitan kradvorton: %{tags}' @@ -1164,10 +1181,10 @@ eo: one: "%{count} voĉdono" other: "%{count} voĉdonoj" vote: Voĉdoni - show_more: Malfoldi + show_more: Montri pli show_newer: Montri pli novajn show_older: Montri pli malnovajn - show_thread: Montri la fadenon + show_thread: Montri la mesaĝaron sign_in_to_participate: Ensaluti por partopreni en la konversacio title: "%{name}: “%{quote}”" visibilities: @@ -1181,10 +1198,13 @@ eo: statuses_cleanup: enabled: Aŭtomate forigi malnovajn postojn exceptions: Esceptoj - ignore_favs: Ignori ŝatatajn + ignore_favs: Ignori la preferaĵojn ignore_reblogs: Ignori akcelojn keep_direct: Konservi rektajn mesaĝojn keep_direct_hint: Ne forigos viajn rektajn mesagôjn + keep_media: Konservi la mesaĝojn kun aŭdovidaj aldonaĵoj + keep_media_hint: Ne forviŝi la mesaĝojn kiuj enhavas aŭdovidajn aldonaĵojn + keep_self_fav_hint: Ne forviŝi viajn proprajn afiŝojn, se vi aldonis ilin al viaj preferaĵoj min_age: '1209600': 2 semajnoj '15778476': 6 monatoj @@ -1208,7 +1228,7 @@ eo: mastodon-light: Mastodon (Luma) time: formats: - default: "%Y-%m-%d %H:%M" + default: "%Y.%b.%d, %H:%M" month: "%b %Y" time: "%H:%M" two_factor_authentication: @@ -1238,15 +1258,15 @@ eo: disable: Via konto %{acct} estas frostigita none: Averto por %{acct} silence: Via konto %{acct} estas limigita - suspend: Via konto %{acct} estas haltigita + suspend: Via konto %{acct} estas suspendita title: disable: Konto frostigita none: Averto silence: Konto limigita - suspend: Konto haltigita + suspend: Konto suspendita welcome: edit_profile_action: Agordi profilon - edit_profile_step: Vi povas proprigi vian profilon per alŝuto de profilbildo, fonbildo, ŝanĝo de via afiŝita nomo kaj pli. Se vi ŝatus kontroli novajn sekvantojn antaŭ ol ili rajtas sekvi vin, vi povas ŝlosi vian konton. + edit_profile_step: Vi povas personecigi vian profilon en alŝuto de rolfiguro, paĝokapa bildo, en ŝanĝo de via vidiga nomo kaj pli. Se vi volas ekzameni novajn sekvantojn antaŭ ol permesi al ili aboni vin, vi povas agordi vian konton kiel privata. explanation: Jen kelkaj konsiloj por helpi vin komenci final_action: Ekmesaĝi final_step: 'Ekmesaĝu! Eĉ sen sekvantoj, viaj publikaj mesaĝoj povas esti vidataj de aliaj, ekzemple en la loka templinio kaj en la kradvortoj. Eble vi ŝatus prezenti vin per la kradvorto #introductions.' @@ -1255,9 +1275,9 @@ eo: review_preferences_action: Ŝanĝi preferojn review_preferences_step: Estu certa ke vi agordis viajn preferojn, kiel kiujn retmesaĝojn vi ŝatus ricevi, aŭ kiun dekomencan privatecan nivelon vi ŝatus ke viaj mesaĝoj havu. Se tio ne ĝenas vin, vi povas ebligi aŭtomatan ekigon de GIF-oj. subject: Bonvenon en Mastodon - tip_federated_timeline: La fratara templinio estas antaŭvido de la reto de Mastodon. Sed ĝi enhavas nur homojn, kiuj estas sekvataj de aliaj homoj de via nodo, do ĝi ne estas kompleta. + tip_federated_timeline: La fratara templinio estas rekta montro de la reto de Mastodon. Sed ĝi inkluzivas nur personojn kiujn viaj najbaroj abonas, do ĝi ne estas kompleta. tip_following: Vi dekomence sekvas la administrantojn de via servilo. Por trovi pli da interesaj homoj, rigardu la lokan kaj frataran templiniojn. - tip_local_timeline: La loka templinio estas antaŭvido de la homoj en %{instance}. Ĉi tiuj estas viaj apudaj najbaroj! + tip_local_timeline: La loka templinio estas rekta montro de personoj ĉe %{instance}. Ĉi tiuj estas viaj senperaj najbaroj! tip_mobile_webapp: Se via telefona retumilo proponas al vi aldoni Mastodon al via hejma ekrano, vi povas ricevi puŝsciigojn. Tio multmaniere funkcias kiel operaciuma aplikaĵo! tips: Konsiloj title: Bonvenon, %{name}! diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 79ae68bf4..c4d9ee969 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -83,10 +83,8 @@ es-AR: posts_tab_heading: Mensajes posts_with_replies: Mensajes y respuestas roles: - admin: Administrador bot: Bot group: Grupo - moderator: Moderador unavailable: Perfil no disponible unfollow: Dejar de seguir admin: @@ -105,12 +103,17 @@ es-AR: avatar: Avatar by_domain: Dominio change_email: - changed_msg: "¡Correo electrónico de cuenta cambiado exitosamente!" + changed_msg: "¡Correo electrónico cambiado exitosamente!" current_email: Correo electrónico actual label: Cambiar correo electrónico new_email: Nuevo correo electrónico submit: Cambiar correo electrónico title: Cambiar correo electrónico para %{username} + change_role: + changed_msg: "¡Rol cambiado exitosamente!" + label: Cambiar rol + no_role: Sin rol + title: Cambiar rol para %{username} confirm: Confirmar confirmed: Confirmado confirming: Confirmación @@ -154,6 +157,7 @@ es-AR: active: Activas all: Todas pending: Pendientes + silenced: Limitada suspended: Suspendidas title: Moderación moderation_notes: Notas de moderación @@ -161,6 +165,7 @@ es-AR: most_recent_ip: Dirección IP más reciente no_account_selected: No se cambió ninguna cuenta ya que ninguna fue seleccionada no_limits_imposed: Sin límites impuestos + no_role_assigned: Sin rol asignado not_subscribed: No suscripto pending: Revisión pendiente perform_full_suspension: Suspender @@ -187,12 +192,7 @@ es-AR: reset: Restablecer reset_password: Cambiar contraseña resubscribe: Resuscribir - role: Permisos - roles: - admin: Administrador - moderator: Moderador - staff: Administración - user: Usuario + role: Rol search: Buscar search_same_email_domain: Otros usuarios con el mismo dominio de correo electrónico search_same_ip: Otros usuarios con la misma dirección IP @@ -649,6 +649,67 @@ es-AR: unresolved: No resueltas updated_at: Actualizadas view_profile: Ver perfil + roles: + add_new: Agregar rol + assigned_users: + one: "%{count} usuario" + other: "%{count} usuarios" + categories: + administration: Administración + devops: Operadores de desarrollo + invites: Invitaciones + moderation: Moderación + special: Especial + delete: Eliminar + description_html: Con <strong>roles de usuario</strong>, podés personalizar las funciones y áreas de Mastodon a las que pueden acceder tus usuarios. + edit: Editar rol de «%{name}» + everyone: Permisos predeterminados + everyone_full_description_html: Este es el <strong>rol base</strong> que afecta a <strong>todos los usuarios</strong>, incluso aquellos sin un rol asignado. Todos los otros roles heredan permisos de él. + permissions_count: + one: "%{count} permiso" + other: "%{count} permisos" + privileges: + administrator: Administrador + administrator_description: Los usuarios con este permiso saltarán todos los permisos + delete_user_data: Eliminar datos del usuario + delete_user_data_description: Permite a los usuarios eliminar los datos de otros usuarios sin demora + invite_users: Invitar usuarios + invite_users_description: Permite a los usuarios invitar a nuevas personas al servidor + manage_announcements: Administrar anuncios + manage_announcements_description: Permite a los usuarios administrar anuncios en el servidor + manage_appeals: Administrar apelaciones + manage_appeals_description: Permite a los usuarios revisar apelaciones contra acciones de moderación + manage_blocks: Administrar bloqueos + manage_blocks_description: Permite a los usuarios bloquear proveedores de correo electrónico y direcciones IP + manage_custom_emojis: Administrar emojis personalizados + manage_custom_emojis_description: Permite a los usuarios administrar emojis personalizados en el servidor + manage_federation: Administrar Federación + manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios y controlar las entregas + manage_invites: Administrar invitaciones + manage_invites_description: Permite a los usuarios navegar y desactivar los enlaces de invitación + manage_reports: Administrar denuncias + manage_reports_description: Permite a los usuarios revisar denuncias y realizar acciones de moderación contra ellas + manage_roles: Administrar roles + manage_roles_description: Permite a los usuarios administrar y asignar roles por debajo de los suyos + manage_rules: Administrar reglas + manage_rules_description: Permite a los usuarios cambiar las reglas del servidor + manage_settings: Administrar configuración + manage_settings_description: Permite a los usuarios cambiar la configuración del sitio + manage_taxonomies: Administrar taxonomías + manage_taxonomies_description: Permite a los usuarios revisar el contenido de tendencia y actualizar la configuración de las etiquetas + manage_user_access: Administrar acceso de usuario + manage_user_access_description: Permite a los usuarios deshabilitar la autenticación de dos factores de otros usuarios, cambiar su dirección de correo electrónico y restablecer su contraseña + manage_users: Administrar usuarios + manage_users_description: Permite a los usuarios ver los detalles de otros usuarios y realizar acciones de moderación contra ellos + manage_webhooks: Administrar Webhooks + manage_webhooks_description: Permite a los usuarios configurar webhooks para eventos administrativos + view_audit_log: Ver auditoría + view_audit_log_description: Permite a los usuarios ver un historial de acciones administrativas en el servidor + view_dashboard: Ver panel + view_dashboard_description: Permite a los usuarios acceder al panel de control y varias métricas + view_devops: Operadores de desarrollo + view_devops_description: Permite a los usuarios acceder a los paneles de Sidekiq y pgHero + title: Roles rules: add_new: Agregar regla delete: Eliminar @@ -701,9 +762,6 @@ es-AR: deletion: desc_html: Permitir que cualquiera elimine su cuenta title: Abrir eliminación de cuenta - min_invite_role: - disabled: Nadie - title: Permitir invitaciones de require_invite_text: desc_html: Cuando los registros requieran aprobación manual, hacé que la solicitud de invitación "¿Por qué querés unirte?" sea obligatoria, en vez de opcional title: Requerir que los nuevos usuarios llenen un texto de solicitud de invitación @@ -716,9 +774,6 @@ es-AR: show_known_fediverse_at_about_page: desc_html: Cuando está deshabilitado, restringe la línea temporal pública enlazada desde la página de inicio para mostrar sólo contenido local title: Incluir contenido federado en la página de línea temporal pública no autenticada - show_staff_badge: - desc_html: Mostrar una insignia de administración en la página de un usuario - title: Mostrar insignia de administración site_description: desc_html: Párrafo introductorio en la API. Describe qué hace especial a este servidor de Mastodon y todo lo demás que sea importante. Podés usar etiquetas HTML, en particular <code><a></code> y <code><em></code>. title: Descripción del servidor @@ -1124,15 +1179,24 @@ es-AR: public: Líneas temporales públicas thread: Conversaciones edit: + add_keyword: Agregar palabra clave + keywords: Palabras clave title: Editar filtro errors: + deprecated_api_multiple_keywords: Estos parámetros no se pueden cambiar de esta aplicación porque se aplican a más de una palabra clave de filtro. Usá una aplicación más reciente o la interface web. invalid_context: Se suministró un contexto no válido o vacío - invalid_irreversible: El filtrado irreversible sólo funciona con los contextos de "Principal" o de "Notificaciones" index: + contexts: Filtros en %{contexts} delete: Eliminar empty: No tenés filtros. + expires_in: Caduca en %{distance} + expires_on: Caduca en %{date} + keywords: + one: "%{count} palabra clave" + other: "%{count} palabras clave" title: Filtros new: + save: Guardar nuevo filtro title: Agregar nuevo filtro footer: developers: Desarrolladores @@ -1251,6 +1315,8 @@ es-AR: copy_account_note_text: 'Este usuario se mudó desde %{acct}, acá están tus notas previas sobre él/ella:' notification_mailer: admin: + report: + subject: "%{name} envió una denuncia" sign_up: subject: Se registró %{name} digest: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index f57fb9601..7ba46a89c 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -83,10 +83,8 @@ es-MX: posts_tab_heading: Toots posts_with_replies: Toots con respuestas roles: - admin: Administrador bot: Bot group: Grupo - moderator: Moderador unavailable: Perfil no disponible unfollow: Dejar de seguir admin: @@ -105,7 +103,6 @@ es-MX: avatar: Foto de perfil by_domain: Dominio change_email: - changed_msg: "¡El correo electrónico se ha actualizado correctamente!" current_email: Correo electrónico actual label: Cambiar el correo electrónico new_email: Nuevo correo electrónico @@ -187,12 +184,6 @@ es-MX: reset: Reiniciar reset_password: Reiniciar contraseña resubscribe: Re-suscribir - role: Permisos - roles: - admin: Administrador - moderator: Moderador - staff: Personal - user: Usuario search: Buscar search_same_email_domain: Otros usuarios con el mismo dominio de correo search_same_ip: Otros usuarios con la misma IP @@ -701,9 +692,6 @@ es-MX: deletion: desc_html: Permite a cualquiera a eliminar su cuenta title: Eliminación de cuenta abierta - min_invite_role: - disabled: Nadie - title: Permitir invitaciones de require_invite_text: desc_html: Cuando los registros requieren aprobación manual, haga obligatorio en la invitaciones el campo "¿Por qué quieres unirte?" en lugar de opcional title: Requiere a los nuevos usuarios rellenar un texto de solicitud de invitación @@ -716,9 +704,6 @@ es-MX: show_known_fediverse_at_about_page: desc_html: Cuando esté activado, se mostrarán toots de todo el fediverso conocido en la vista previa. En otro caso, se mostrarán solamente toots locales. title: Mostrar fediverso conocido en la vista previa de la historia - show_staff_badge: - desc_html: Mostrar un parche de staff en la página de un usuario - title: Mostrar parche de staff site_description: desc_html: Párrafo introductorio en la portada y en meta tags. Puedes usar tags HTML, en particular <code><a></code> y <code><em></code>. title: Descripción de instancia @@ -852,6 +837,26 @@ es-MX: edit_preset: Editar aviso predeterminado empty: Aún no has definido ningún preajuste de advertencia. title: Editar configuración predeterminada de avisos + webhooks: + add_new: Añadir endpoint + delete: Eliminar + description_html: Un <strong>webhook</strong> permite a Mastodon enviar <strong>notificaciones en tiempo real</strong> sobre los eventos elegidos a tu propia aplicación, para que tu aplicación pueda <strong>lanzar reacciones automáticamente</strong>. + disable: Deshabilitar + disabled: Deshabilitado + edit: Editar endpoint + empty: Aún no tienes ningún endpoint de webhook configurado. + enable: Habilitar + enabled: Activo + enabled_events: + one: 1 evento habilitado + other: "%{count} eventos habilitados" + events: Eventos + new: Nuevo webhook + rotate_secret: Rotar secreto + secret: Firmando secreto + status: Estado + title: Webhooks + webhook: Webhook admin_mailer: new_appeal: actions: @@ -1104,15 +1109,24 @@ es-MX: public: Timeline público thread: Conversaciones edit: + add_keyword: Añadir palabra clave + keywords: Palabras clave title: Editar filtro errors: + deprecated_api_multiple_keywords: Estos parámetros no se pueden cambiar desde esta aplicación porque se aplican a más de una palabra clave de filtro. Utilice una aplicación más reciente o la interfaz web. invalid_context: Se suminstró un contexto inválido o vacío - invalid_irreversible: El filtrado irreversible solo funciona con los contextos propios o de notificaciones index: + contexts: Filtros en %{contexts} delete: Borrar empty: No tienes filtros. + expires_in: Caduca en %{distance} + expires_on: Expira el %{date} + keywords: + one: "%{count} palabra clave" + other: "%{count} palabras clave" title: Filtros new: + save: Guardar nuevo filtro title: Añadir un nuevo filtro footer: developers: Desarrolladores @@ -1231,6 +1245,8 @@ es-MX: copy_account_note_text: 'Este usuario se mudó desde %{acct}, aquí estaban tus notas anteriores sobre él:' notification_mailer: admin: + report: + subject: "%{name} envió un informe" sign_up: subject: "%{name} se registró" digest: diff --git a/config/locales/es.yml b/config/locales/es.yml index 96d985f53..568ad46d9 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -83,10 +83,8 @@ es: posts_tab_heading: Publicaciones posts_with_replies: Publicaciones y respuestas roles: - admin: Administrador bot: Bot group: Grupo - moderator: Moderador unavailable: Perfil no disponible unfollow: Dejar de seguir admin: @@ -105,12 +103,17 @@ es: avatar: Avatar by_domain: Dominio change_email: - changed_msg: "¡El correo electrónico se ha actualizado correctamente!" + changed_msg: "¡Email cambiado con éxito!" current_email: Correo electrónico actual label: Cambiar el correo electrónico new_email: Nuevo correo electrónico submit: Cambiar el correo electrónico title: Cambiar el correo electrónico de %{username} + change_role: + changed_msg: "¡Rol cambiado con éxito!" + label: Cambiar rol + no_role: Sin rol + title: Cambiar rol para %{username} confirm: Confirmar confirmed: Confirmado confirming: Confirmando @@ -154,6 +157,7 @@ es: active: Activo all: Todos pending: Pendiente + silenced: Limitado suspended: Suspendidos title: Moderación moderation_notes: Notas de moderación @@ -161,6 +165,7 @@ es: most_recent_ip: IP más reciente no_account_selected: Ninguna cuenta se cambió como ninguna fue seleccionada no_limits_imposed: Sin límites impuestos + no_role_assigned: Ningún rol asignado not_subscribed: No se está suscrito pending: Revisión pendiente perform_full_suspension: Suspender @@ -187,12 +192,7 @@ es: reset: Reiniciar reset_password: Reiniciar contraseña resubscribe: Re-suscribir - role: Permisos - roles: - admin: Administrador - moderator: Moderador - staff: Personal - user: Usuario + role: Rol search: Buscar search_same_email_domain: Otros usuarios con el mismo dominio de correo search_same_ip: Otros usuarios con la misma IP @@ -649,6 +649,67 @@ es: unresolved: No resuelto updated_at: Actualizado view_profile: Ver perfil + roles: + add_new: Añadir rol + assigned_users: + one: "%{count} usuario" + other: "%{count} usuarios" + categories: + administration: Administración + devops: DevOps + invites: Invitaciones + moderation: Moderación + special: Especial + delete: Eliminar + description_html: Con <strong>roles de usuario</strong>, puede personalizar las funciones y áreas de Mastodon a las que pueden acceder sus usuarios. + edit: Editar rol '%{name}' + everyone: Permisos por defecto + everyone_full_description_html: Este es el <strong>rol base</strong> que afecta a <strong>todos los usuarios</strong>, incluso aquellos sin un rol asignado. Todos los otros roles heredan permisos de él. + permissions_count: + one: "%{count} permiso" + other: "%{count} permisos" + privileges: + administrator: Administrador + administrator_description: Los usuarios con este permiso saltarán todos los permisos + delete_user_data: Borrar Datos de Usuario + delete_user_data_description: Permite a los usuarios eliminar los datos de otros usuarios sin demora + invite_users: Invitar usuarios + invite_users_description: Permite a los usuarios invitar a nuevas personas al servidor + manage_announcements: Administrar Anuncios + manage_announcements_description: Permite a los usuarios gestionar anuncios en el servidor + manage_appeals: Administrar Apelaciones + manage_appeals_description: Permite a los usuarios revisar apelaciones contra acciones de moderación + manage_blocks: Administrar Bloqueos + manage_blocks_description: Permite a los usuarios bloquear los proveedores de e-mail y las direcciones IP + manage_custom_emojis: Administrar Emojis Personalizados + manage_custom_emojis_description: Permite a los usuarios gestionar emojis personalizados en el servidor + manage_federation: Administrar Federación + manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios, y controlar la entregabilidad + manage_invites: Administrar Invitaciones + manage_invites_description: Permite a los usuarios navegar y desactivar los enlaces de invitación + manage_reports: Administrar Informes + manage_reports_description: Permite a los usuarios revisar informes y realizar acciones de moderación basadas en ellos + manage_roles: Administrar Roles + manage_roles_description: Permite a los usuarios administrar y asignar roles por debajo de los suyos + manage_rules: Gestionar Reglas + manage_rules_description: Permite a los usuarios cambiar las reglas del servidor + manage_settings: Administrar Ajustes + manage_settings_description: Permite a los usuarios cambiar la configuración del sitio + manage_taxonomies: Administrar Taxonomías + manage_taxonomies_description: Permite a los usuarios revisar el contenido en tendencia y actualizar la configuración de las etiquetas + manage_user_access: Administrar Acceso de Usuarios + manage_user_access_description: Permite a los usuarios desactivar la autenticación de dos factores de otros usuarios, cambiar su dirección de correo electrónico y restablecer su contraseña + manage_users: Administrar Usuarios + manage_users_description: Permite a los usuarios ver los detalles de otros usuarios y realizar acciones de moderación contra ellos + manage_webhooks: Administrar Webhooks + manage_webhooks_description: Permite a los usuarios configurar webhooks para eventos administrativos + view_audit_log: Ver Registro de Auditoría + view_audit_log_description: Permite a los usuarios ver un historial de acciones administrativas en el servidor + view_dashboard: Ver Panel de Control + view_dashboard_description: Permite a los usuarios acceder al panel de control y varias métricas + view_devops: DevOps + view_devops_description: Permite a los usuarios acceder a los paneles de control Sidekiq y pgHero + title: Roles rules: add_new: Añadir norma delete: Eliminar @@ -701,9 +762,6 @@ es: deletion: desc_html: Permite a cualquiera a eliminar su cuenta title: Eliminación de cuenta abierta - min_invite_role: - disabled: Nadie - title: Permitir invitaciones de require_invite_text: desc_html: Cuando los registros requieren aprobación manual, haga obligatorio en la invitaciones el campo "¿Por qué quieres unirte?" en lugar de opcional title: Requiere a los nuevos usuarios rellenar un texto de solicitud de invitación @@ -716,9 +774,6 @@ es: show_known_fediverse_at_about_page: desc_html: Cuando esté desactivado, se mostrarán solamente publicaciones locales en la línea temporal pública title: Incluye contenido federado en la página de línea de tiempo pública no autenticada - show_staff_badge: - desc_html: Mostrar un parche de staff en la página de un usuario - title: Mostrar parche de staff site_description: desc_html: Párrafo introductorio en la portada y en meta tags. Puedes usar tags HTML, en particular <code><a></code> y <code><em></code>. title: Descripción de instancia @@ -1124,15 +1179,24 @@ es: public: Líneas de tiempo públicas thread: Conversaciones edit: + add_keyword: Añadir palabra clave + keywords: Palabras clave title: Editar filtro errors: + deprecated_api_multiple_keywords: Estos parámetros no se pueden cambiar desde esta aplicación porque se aplican a más de una palabra clave de filtro. Utilice una aplicación más reciente o la interfaz web. invalid_context: Se suminstró un contexto inválido o vacío - invalid_irreversible: El filtrado irreversible solo funciona con los contextos propios o de notificaciones index: + contexts: Filtros en %{contexts} delete: Borrar empty: No tienes filtros. + expires_in: Caduca en %{distance} + expires_on: Expira el %{date} + keywords: + one: "%{count} palabra clave" + other: "%{count} palabras clave" title: Filtros new: + save: Guardar nuevo filtro title: Añadir nuevo filtro footer: developers: Desarrolladores @@ -1251,6 +1315,8 @@ es: copy_account_note_text: 'Este usuario se mudó desde %{acct}, aquí estaban tus notas anteriores sobre él:' notification_mailer: admin: + report: + subject: "%{name} envió un informe" sign_up: subject: "%{name} se registró" digest: diff --git a/config/locales/et.yml b/config/locales/et.yml index a551ab424..6aab7a219 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -75,10 +75,8 @@ et: posts_tab_heading: Postitused posts_with_replies: Postitused ja vastused roles: - admin: Administraator bot: Robot group: Grupp - moderator: Moderaator unavailable: Profiil pole saadaval unfollow: Lõpeta jälgimine admin: @@ -96,7 +94,6 @@ et: avatar: Profiilipilt by_domain: Domeen change_email: - changed_msg: Konto e-postiaadress edukalt muudetud! current_email: Praegune e-postiaadress label: Muuda e-posti aadressi new_email: Uus е-posti aadress @@ -160,12 +157,6 @@ et: reset: Lähtesta reset_password: Lähtesta salasõna resubscribe: Telli taas - role: Õigused - roles: - admin: Administraator - moderator: Moderaator - staff: Personal - user: Kasutaja search: Otsi search_same_email_domain: Muud kasutajad sama e-posti domeeniga search_same_ip: Teised kasutajad, kellel on sama IP @@ -443,9 +434,6 @@ et: deletion: desc_html: Luba kasutajatel oma konto kustutada title: Ava kontode kustutamine - min_invite_role: - disabled: Mitte keegi - title: Luba kutseid registrations_mode: modes: approved: Kinnitus vajalik konto loomisel @@ -455,9 +443,6 @@ et: show_known_fediverse_at_about_page: desc_html: Kui lubatud, näitab kõiki teatud fediversumi tuututusi. Vastasel juhul näidatakse ainult kohalike tuututusi. title: Näita teatud fediversumit ajajoone eelvaates - show_staff_badge: - desc_html: Näita personalimärki kasutaja profiilil - title: Näita personalimärki site_description: desc_html: Sissejuhatuslik lõik API kohta. Kirjelda, mis teeb selle Mastodoni serveri eriliseks ja ka muud tähtsat. Te saate kasutada HTMLi silte, peamiselt <code><a></code> ja <code><em></code>. title: Serveri kirjeldus @@ -683,7 +668,6 @@ et: title: Muuda filtrit errors: invalid_context: Puudulik või vale kontekst - invalid_irreversible: Taastamatu filter töötab ainult kodu või teavituste kontekstis index: delete: Kustuta empty: Teil pole filtreid. diff --git a/config/locales/eu.yml b/config/locales/eu.yml index a71cd186d..3202b9b9c 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -80,10 +80,8 @@ eu: posts_tab_heading: Bidalketa posts_with_replies: Bidalketak eta erantzunak roles: - admin: Administratzailea bot: Bot-a group: Taldea - moderator: Moderatzailea unavailable: Profila ez dago eskuragarri unfollow: Utzi jarraitzeari admin: @@ -102,7 +100,6 @@ eu: avatar: Abatarra by_domain: Domeinua change_email: - changed_msg: e-mail kontua ongi aldatu da! current_email: Uneko e-mail helbidea label: Aldatu e-mail helbidea new_email: E-mail berria @@ -184,12 +181,6 @@ eu: reset: Berrezarri reset_password: Berrezarri pasahitza resubscribe: Berriro harpidetu - role: Baimenak - roles: - admin: Administratzailea - moderator: Moderatzailea - staff: Langilea - user: Erabiltzailea search: Bilatu search_same_email_domain: E-mail domeinu bera duten beste erabiltzailean search_same_ip: IP bera duten beste erabiltzaileak @@ -674,9 +665,6 @@ eu: deletion: desc_html: Baimendu edonori bere kontua ezabatzea title: Ireki kontu ezabaketa - min_invite_role: - disabled: Inor ez - title: Baimendu hauen gobidapenak require_invite_text: desc_html: Izen emateak eskuz onartu behar direnean, "Zergatik elkartu nahi duzu?" testu sarrera derrigorrezko bezala ezarri, ez hautazko title: Eskatu erabiltzaile berriei bat egiteko arrazoia sartzeko @@ -689,9 +677,6 @@ eu: show_known_fediverse_at_about_page: desc_html: Txandakatzean, fedibertso ezagun osoko tootak bistaratuko ditu aurrebistan. Bestela, toot lokalak besterik ez ditu erakutsiko title: Erakutsi fedibertsu ezagun osoko denbora-lerroa aurrebistan - show_staff_badge: - desc_html: Erakutsi langile banda erabiltzailearen orrian - title: Erakutsi langile banda site_description: desc_html: Azaleko orrian agertuko den sarrera paragrafoa. Azaldu zerk egiten duen berezi Mastodon zerbitzari hau eta garrantzizko beste edozer. HTML etiketak erabili ditzakezu, zehazki <code><a></code> eta <code><em></code>. title: Zerbitzariaren deskripzioa @@ -1020,7 +1005,6 @@ eu: title: Editatu iragazkia errors: invalid_context: Testuinguru baliogabe edo hutsa eman da - invalid_irreversible: Behin betiko iragazketa hasiera edo jakinarazpenen testuinguruan besterik ez dabil index: delete: Ezabatu empty: Ez duzu iragazkirik. diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 93b766859..d6acaf534 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -82,10 +82,8 @@ fa: posts_tab_heading: فرستهها posts_with_replies: فرستهها و پاسخها roles: - admin: مدیر bot: ربات group: گروه - moderator: ناظر unavailable: نمایهٔ ناموجود unfollow: پایان پیگیری admin: @@ -104,7 +102,6 @@ fa: avatar: تصویر نمایه by_domain: دامین change_email: - changed_msg: نشانی رایانامهٔ این حساب با موفقیت تغییر کرد! current_email: رایانامهٔ کنونی label: تغییر رایانامه new_email: رایانامهٔ جدید @@ -183,12 +180,6 @@ fa: reset: بازنشانی reset_password: بازنشانی رمز resubscribe: اشتراک دوباره - role: اجازهها - roles: - admin: مدیر - moderator: ناظر - staff: کارمند - user: کاربر search: جستجو search_same_email_domain: دیگر کاربران با دامنهٔ رایانامهٔ یکسان search_same_ip: دیگر کاربران با IP یکسان @@ -654,9 +645,6 @@ fa: deletion: desc_html: هر کسی بتواند حساب خود را پاک کند title: فعالسازی پاککردن حساب - min_invite_role: - disabled: هیچ کس - title: اجازهٔ دعوت به require_invite_text: desc_html: زمانی که نامنویسی نیازمند تایید دستی است، متن «چرا میخواهید عضو شود؟» بخش درخواست دعوت را به جای اختیاری، اجباری کنید title: نیازمند پر کردن متن درخواست دعوت توسط کاربران جدید @@ -669,9 +657,6 @@ fa: show_known_fediverse_at_about_page: desc_html: اگر از کار انداخته شود، خطزمانی همگانی را محدود میکند؛ تا فقط محتوای محلّی را نمایش دهد. title: نمایش سرورهای دیگر در پیشنمایش این سرور - show_staff_badge: - desc_html: نمایش علامت همکار روی صفحهٔ کاربر - title: نمایش علامت همکار site_description: desc_html: معرفی کوتاهی دربارهٔ رابط برنامهنویسی کاربردی. دربارهٔ این که چه چیزی دربارهٔ این کارساز ماستودون ویژه است یا هر چیز مهم دیگری بنویسید. میتوانید HTML بنویسید، بهویژه <code><a></code> و <code><em></code>. title: دربارهٔ این سرور @@ -983,7 +968,6 @@ fa: title: ویرایش پالایه errors: invalid_context: زمینهای موجود نیست یا نامعتبر است - invalid_irreversible: پالایش برگشتناپذیر تنها در زمینهٔ خانه یا آگاهیها کار میکنند index: delete: پاککردن empty: هیچ پالایهای ندارید. diff --git a/config/locales/fi.yml b/config/locales/fi.yml index ff369f2fe..bbc44d644 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -82,10 +82,8 @@ fi: posts_tab_heading: Julkaisut posts_with_replies: Julkaisut ja vastaukset roles: - admin: Ylläpitäjä bot: Botti group: Ryhmä - moderator: Moderaattori unavailable: Profiili ei saatavilla unfollow: Lopeta seuraaminen admin: @@ -104,7 +102,6 @@ fi: avatar: Profiilikuva by_domain: Verkkotunnus change_email: - changed_msg: Tilin sähköposti vaihdettu onnistuneesti! current_email: Nykyinen sähköposti label: Vaihda sähköposti new_email: Uusi sähköposti @@ -183,12 +180,6 @@ fi: reset: Palauta reset_password: Palauta salasana resubscribe: Tilaa uudelleen - role: Oikeudet - roles: - admin: Ylläpitäjä - moderator: Moderaattori - staff: Henkilöstö - user: Käyttäjä search: Hae search_same_email_domain: Muut käyttäjät, joilla on sama sähköpostiverkkotunnus search_same_ip: Muut käyttäjät samalla IP-osoitteella @@ -657,9 +648,6 @@ fi: deletion: desc_html: Salli jokaisen poistaa oma tilinsä title: Avoin tilin poisto - min_invite_role: - disabled: Ei kukaan - title: Salli kutsut käyttäjältä require_invite_text: desc_html: Kun rekisteröinnit edellyttävät manuaalista hyväksyntää, tee “Miksi haluat liittyä?” teksti pakolliseksi eikä valinnaiseksi title: Vaadi uusia käyttäjiä antamaan liittymisen syy @@ -672,9 +660,6 @@ fi: show_known_fediverse_at_about_page: desc_html: Kun tämä on valittu, esikatselussa näytetään tuuttaukset kaikkialta tunnetusta fediversumista. Muutoin näytetään vain paikalliset tuuttaukset. title: Näytä aikajanan esikatselussa koko tunnettu fediversumi - show_staff_badge: - desc_html: Näytä käyttäjäsivulla henkilöstömerkki - title: Näytä henkilöstömerkki site_description: desc_html: Esittelykappale etusivulla ja metatunnisteissa. HTML-tagit käytössä, tärkeimmät ovat <code><a></code> ja <code><em></code>. title: Instanssin kuvaus @@ -1048,7 +1033,6 @@ fi: title: Muokkaa suodatinta errors: invalid_context: Ei sisältöä tai se on virheellinen - invalid_irreversible: Sen sijaan suodatus toimii vain kodin tai ilmoitusten yhteydessä index: delete: Poista empty: Sinulla ei ole suodattimia. diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 5f74972f9..018dea3af 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -83,10 +83,8 @@ fr: posts_tab_heading: Messages posts_with_replies: Messages et réponses roles: - admin: Admin bot: Robot group: Groupe - moderator: Modérateur·trice unavailable: Profil non disponible unfollow: Ne plus suivre admin: @@ -105,12 +103,17 @@ fr: avatar: Avatar by_domain: Domaine change_email: - changed_msg: Courriel du compte modifié avec succès ! + changed_msg: Courriel modifié avec succès ! current_email: Courriel actuel label: Modifier le courriel new_email: Nouveau courriel submit: Modifier le courriel title: Modifier le courriel pour %{username} + change_role: + changed_msg: Rôle modifié avec succès ! + label: Modifier le rôle + no_role: Aucun rôle + title: Modifier le rôle de %{username} confirm: Confirmer confirmed: Confirmé confirming: Confirmation @@ -154,6 +157,7 @@ fr: active: Actifs all: Tous pending: En cours de traitement + silenced: Limité suspended: Suspendus title: Modération moderation_notes: Notes de modération @@ -161,6 +165,7 @@ fr: most_recent_ip: Adresse IP la plus récente no_account_selected: Aucun compte n’a été modifié, car aucun n’a été sélectionné no_limits_imposed: Aucune limite imposée + no_role_assigned: Aucun rôle assigné not_subscribed: Non abonné pending: En attente d’approbation perform_full_suspension: Suspendre @@ -187,12 +192,7 @@ fr: reset: Réinitialiser reset_password: Réinitialiser le mot de passe resubscribe: Se réabonner - role: Permissions - roles: - admin: Administrateur - moderator: Modérateur - staff: Équipe - user: Utilisateur + role: Rôle search: Rechercher search_same_email_domain: Autres utilisateurs·trices avec le même domaine de courriel search_same_ip: Autres utilisateur·rice·s avec la même IP @@ -234,7 +234,7 @@ fr: approve_appeal: Approuver l'appel approve_user: Approuver l’utilisateur assigned_to_self_report: Affecter le signalement - change_email_user: Modifier le courriel pour + change_email_user: Modifier le courriel pour ce compte confirm_user: Confirmer l’utilisateur create_account_warning: Créer une alerte create_announcement: Créer une annonce @@ -481,8 +481,8 @@ fr: instances: availability: description_html: - one: Si la livraison au domaine échoue pendant <strong>%{count} jour</strong> sans succès, aucune autre tentative de livraison ne sera faite à moins qu'une livraison <em>depuis</em> le domaine soit reçue. - other: Si la livraison au domaine échoue pendant <strong>%{count} jours différents</strong> sans succès, aucune autre tentative de livraison ne sera faite à moins qu'une livraison <em>depuis</em> le domaine soit reçue. + one: Si la livraison au domaine échoue pendant <strong>%{count} jour</strong>, aucune autre tentative de livraison ne sera faite à moins qu'une livraison <em>depuis</em> le domaine ne soit reçue. + other: Si la livraison au domaine échoue pendant <strong>%{count} jours différents</strong>, aucune autre tentative de livraison ne sera faite à moins qu'une livraison <em>depuis</em> le domaine ne soit reçue. failure_threshold_reached: Le seuil de défaillance a été atteint le %{date}. failures_recorded: one: Tentative échouée pendant %{count} jour. @@ -649,6 +649,67 @@ fr: unresolved: Non résolus updated_at: Mis à jour view_profile: Voir le profil + roles: + add_new: Ajouter un rôle + assigned_users: + one: "%{count} utilisateur·rice" + other: "%{count} utilisateur·rice·s" + categories: + administration: Administration + devops: Devops + invites: Invitations + moderation: Modération + special: Spécial + delete: Supprimer + description_html: Les <strong>rôles utilisateur</strong> vous permettent de personnaliser les fonctions et les zones de Mastodon auxquelles vos utilisateur⋅rice⋅s peuvent accéder. + edit: Modifier le rôle '%{name}' + everyone: Autorisations par défaut + everyone_full_description_html: Ceci est le <strong>rôle de base</strong> qui impacte <strong>tou⋅te⋅s les utilisateur⋅rice⋅s</strong>, même celleux sans rôle assigné. Tous les autres rôles héritent des autorisations de celui-ci. + permissions_count: + one: "%{count} autorisation" + other: "%{count} autorisations" + privileges: + administrator: Administrateur·rice + administrator_description: Les utilisateur⋅rice⋅s ayant cette autorisation pourront contourner toutes les autorisations + delete_user_data: Supprimer les données de l'utilisateur⋅rice + delete_user_data_description: Permet aux utilisateur⋅rice⋅s de supprimer sans délai les données des autres utilisateur⋅rice⋅s + invite_users: Inviter des utilisateur⋅rice⋅s + invite_users_description: Permet aux utilisateur⋅rice⋅s d'inviter de nouvelles personnes sur le serveur + manage_announcements: Gérer les annonces + manage_announcements_description: Permet aux utilisateur⋅rice⋅s de gérer les annonces sur le serveur + manage_appeals: Gérer les contestations + manage_appeals_description: Permet aux utilisateur⋅rice⋅s d'examiner les appels contre les actions de modération + manage_blocks: Gérer les blocages + manage_blocks_description: Permet aux utilisateur⋅rice⋅s de bloquer des fournisseurs de courriel et des adresses IP + manage_custom_emojis: Gérer les émojis personnalisés + manage_custom_emojis_description: Permet aux utilisateur⋅rice⋅s de gérer les émoticônes personnalisées sur le serveur + manage_federation: Gérer de la féderation + manage_federation_description: Permet aux utilisateur⋅rice⋅s de bloquer ou d'autoriser la fédération avec d'autres domaines, et de contrôler la capacité de livraison + manage_invites: Gérer les invitations + manage_invites_description: Permet aux utilisateur⋅rice⋅s de parcourir et de désactiver les liens d'invitation + manage_reports: Gérer les rapports + manage_reports_description: Permet aux utilisateur⋅rice⋅s d'examiner les signalements et d'effectuer des actions de modération en conséquence + manage_roles: Gérer les rôles + manage_roles_description: Permet aux utilisateur⋅rice⋅s de gérer et d'assigner des rôles inférieurs au leur + manage_rules: Gérer les règles + manage_rules_description: Permet aux utilisateur·rice·s de modifier les règles du serveur + manage_settings: Gérer les paramètres + manage_settings_description: Permet aux utilisateur·rice·s de modifier les paramètres du site + manage_taxonomies: Gérer les taxonomies + manage_taxonomies_description: Permet aux utilisateur⋅rice⋅s d'examiner les contenus tendance et de mettre à jour les paramètres des hashtags + manage_user_access: Gérer l'accès utilisateur + manage_user_access_description: Permet aux utilisateur⋅rice⋅s de désactiver l'authentification à deux facteurs, de modifier l'adresse courriel et de réinitialiser le mot de passe des autres utilisateur⋅rice⋅s + manage_users: Gérer les utilisateur·rice·s + manage_users_description: Permet aux utilisateur⋅rice⋅s de voir les détails des autres utilisateur⋅rice⋅s et d'effectuer des actions de modération en conséquence + manage_webhooks: Gérer les points d’ancrage web + manage_webhooks_description: Permet aux utilisateur⋅rice⋅s de configurer des webhooks pour des événements d'administration + view_audit_log: Afficher le journal d'audit + view_audit_log_description: Permet aux utilisateur⋅rice⋅s de voir l'historique des opérations d'administration sur le serveur + view_dashboard: Voir le tableau de bord + view_dashboard_description: Permet aux utilisateur⋅rice⋅s d'accéder au tableau de bord et à diverses statistiques + view_devops: Devops + view_devops_description: Permet aux utilisateur⋅rice⋅s d'accéder aux tableaux de bord Sidekiq et pgHero + title: Rôles rules: add_new: Ajouter une règle delete: Supprimer @@ -701,9 +762,6 @@ fr: deletion: desc_html: Permettre à tou·te·s les utilisateur·rice·s de supprimer leur compte title: Autoriser les suppressions de compte - min_invite_role: - disabled: Personne - title: Autoriser les invitations par require_invite_text: desc_html: Lorsque les enregistrements nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif title: Exiger que les nouveaux utilisateurs remplissent un texte de demande d’invitation @@ -716,9 +774,6 @@ fr: show_known_fediverse_at_about_page: desc_html: Lorsque désactivée, restreint le fil public accessible via la page d’accueil de l’instance pour ne montrer que le contenu local title: Inclure le contenu fédéré sur la page de fil public sans authentification - show_staff_badge: - desc_html: Montrer un badge de responsable sur une page utilisateur·rice - title: Montrer un badge de responsable site_description: desc_html: Paragraphe introductif sur l'API. Décrivez les particularités de ce serveur Mastodon et précisez toute autre chose qui vous semble importante. Vous pouvez utiliser des balises HTML, en particulier <code><a></code> et <code><em></code>. title: Description du serveur @@ -868,6 +923,7 @@ fr: events: Événements new: Nouveau point d’ancrage web rotate_secret: Effectuer une rotation du secret + secret: Jeton de connexion status: État title: Points d’ancrage web webhook: Point d’ancrage web @@ -1123,15 +1179,24 @@ fr: public: Fils publics thread: Discussions edit: + add_keyword: Ajouter un mot-clé + keywords: Mots-clés title: Éditer le filtre errors: + deprecated_api_multiple_keywords: Ces paramètres ne peuvent pas être modifiés depuis cette application, car ils s'appliquent à plus d'un filtre de mot-clé. Utilisez une application plus récente ou l'interface web. invalid_context: Contexte invalide ou insuffisant - invalid_irreversible: Le filtrage irréversible ne fonctionne que pour l’accueil et les notifications index: + contexts: Filtres dans %{contexts} delete: Supprimer empty: Vous n'avez aucun filtre. + expires_in: Expire dans %{distance} + expires_on: Expire le %{date} + keywords: + one: "%{count} mot-clé" + other: "%{count} mots-clés" title: Filtres new: + save: Enregistrer le nouveau filtre title: Ajouter un nouveau filtre footer: developers: Développeurs @@ -1250,6 +1315,8 @@ fr: copy_account_note_text: 'Cet·te utilisateur·rice est parti·e de %{acct}, voici vos notes précédentes à son sujet :' notification_mailer: admin: + report: + subject: "%{name} a soumis un signalement" sign_up: subject: "%{name} s'est inscrit·e" digest: @@ -1544,6 +1611,87 @@ fr: tags: does_not_match_previous_name: ne correspond pas au nom précédent terms: + body_html: | + <h2>Politique de confidentialité</h2> + <h3 id="collect">Quelles informations collectons-nous ?</h3> + + <ul> + <li><em>Informations de base sur votre compte </em>: si vous vous inscrivez sur ce serveur, il vous sera demandé de rentrer un identifiant, une adresse électronique et un mot de passe. Vous pourrez également ajouter des informations additionnelles sur votre profil, telles qu’un nom public et une biographie, ainsi que téléverser une image de profil et une image d’en-tête. Vos identifiant, nom public, biographie, image de profil et image d’en-tête seront toujours affichés publiquement.</li> + <li><em>Posts, liste d’abonnements et autres informations publiques </em>: la liste de vos abonnements ainsi que la liste de vos abonné·e·s sont publiques. Quand vous postez un message, la date et l’heure d’envoi ainsi que le nom de l’application utilisée pour sa transmission sont enregistré·e·s. Des médias, tels que des images ou des vidéos, peuvent être joints aux messages. Les posts publics et non listés sont affichés publiquement. Quand vous mettez en avant un post sur votre profil, ce post est également affiché publiquement. Vos messages sont délivrés à vos abonné·e·s, ce qui, dans certains cas, signifie qu’ils sont délivrés à des serveurs tiers et que ces derniers en stockent une copie. Quand vous supprimez un post, il est probable que l'action soit aussi délivrée à vos abonné·e·s. Partager un message ou le marquer comme favori est toujours une action publique.</li> + <li><em>Posts directs et abonné·e·s uniquement </em>: tous les posts sont stockés et traités par le serveur. Les messages abonné·e·s uniquement ne sont transmis qu’à vos abonné·e·s et aux personnes mentionnées dans le corps du message, tandis que les messages directs ne sont transmis qu’aux personnes mentionnées. Dans certains cas, cela signifie qu’ils sont délivrés à des serveurs tiers et que ces derniers en stockent une copie. Nous faisons un effort de bonne foi pour en limiter l’accès uniquement aux personnes autorisées, mais ce n’est pas nécessairement le cas des autres serveurs. Il est donc très important que vous vérifiiez les serveurs auxquels appartiennent vos abonné·e·s. Il vous est possible d’activer une option dans les paramètres afin d’approuver et de rejeter manuellement les nouveaux·lles abonné·e·s. <em>Gardez s’il vous plaît en mémoire que les opérateur·rice·s du serveur ainsi que celles et ceux de n’importe quel serveur récepteur peuvent voir ces messages</em>, et qu’il est possible pour les destinataires de faire des captures d’écran, de copier et plus généralement de repartager ces messages. <em>Ne partagez aucune information sensible à l’aide de Mastodon !</em></li> + <li><em>IP et autres métadonnées </em>: quand vous vous connectez, nous enregistrons votre adresse IP ainsi que le nom de votre navigateur web. Toutes les sessions enregistrées peuvent être consultées dans les paramètres, afin que vous puissiez les surveiller et éventuellement les révoquer. La dernière adresse IP utilisée est conservée pour une durée de 12 mois. Nous sommes également susceptibles de conserver les journaux du serveur, ce qui inclut l’adresse IP de chaque requête reçue.</li> + </ul> + + <hr class="spacer" /> + + <h3 id="use">Que faisons-nous des informations vous concernant ?</h3> + + <p>Toutes les informations que nous collectons sur vous peuvent être utilisées des manières suivantes :</p> + + <ul> + <li>pour vous fournir les fonctionnalités de base de Mastodon. Vous ne pouvez interagir avec le contenu des autres et poster votre propre contenu que lorsque vous êtes connecté·e. Par exemple, vous pouvez vous abonner à plusieurs autres comptes pour voir l’ensemble de leurs posts dans votre fil d’accueil personnalisé ;</li> + <li>pour aider à la modération de la communauté : par exemple, comparer votre adresse IP avec d’autres afin de déterminer si un bannissement a été contourné ou si une autre infraction aux règles a été commise ;</li> + <li>l’adresse électronique que vous nous avez fournie peut être utilisée pour vous envoyer des informations, des notifications lorsque d’autres personnes interagissent avec votre contenu ou vous envoient des messages, pour répondre à des demandes de votre part ainsi que pour toutes autres requêtes ou questions.</li> + </ul> + + <hr class="spacer" /> + + <h3 id="protect">Comment protégeons-nous vos informations ?</h3> + + <p>Nous mettons en œuvre une variété de mesures de sécurité afin de garantir la sécurité de vos informations personnelles quand vous les saisissez, les soumettez et les consultez. Entre autres choses, votre session de navigation ainsi que le trafic entre votre application et l’API sont protégées par un certificat SSL ; tandis que votre mot de passe est haché à l'aide d'un puissant algorithme à sens unique. Vous pouvez également activer l’authentification à deux facteurs pour sécuriser encore plus l’accès à votre compte.</p> + + <hr class="spacer" /> + + <h3 id="data-retention">Quelle est notre politique de conservation des données ?</h3> + + <p>Nous ferons un effort de bonne foi pour :</p> + + <ul> + <li>ne pas conserver plus de 90 jours les journaux systèmes contenant les adresses IP de toutes les requêtes reçues par ce serveur ;</li> + <li>ne pas conserver plus de 12 mois les adresses IP associées aux utilisateur·ice·s enregistré·e·s.</li> + </ul> + + <p>Vous pouvez demander à télécharger une archive de votre contenu, incluant vos posts, vos médias joints, votre image de profil et votre image d’en-tête.</p> + + <p>Vous pouvez supprimer votre compte de manière définitive à tout moment.</p> + + <hr class="spacer"/> + + <h3 id="cookies">Utilisons-nous des témoins de connexion ?</h3> + + <p>Oui. Les témoins de connexion sont de petits fichiers qu’un site ou un service transfère sur le disque dur de votre ordinateur via votre navigateur web (si vous l’y avez autorisé). Ces témoins permettent au site de reconnaître votre navigateur et, dans le cas où vous possédez un compte, de vous associer avec ce dernier.</p> + + <p>Nous utilisons les témoins de connexion afin de comprendre et de sauvegarder vos préférences pour vos prochaines visites.</p> + + <hr class="spacer" /> + + <h3 id="disclose">Divulguons-nous des informations à des tiers ?</h3> + + <p>Nous ne vendons, n’échangeons ou ne transférons d’une quelconque manière que ce soit des informations permettant de vous identifier personnellement. Cela n’inclut pas les tiers de confiance qui nous aident à faire fonctionner ce site, à conduire nos activités commerciales ou à vous servir, du moment qu’ils acceptent de garder ces informations confidentielles. Nous sommes également susceptibles de partager vos informations quand nous pensons que cela est nécessaire pour nous conformer à la loi, pour faire respecter les règles de notre site, ainsi que pour défendre nos droits, notre propriété, notre sécurité, ou ceux d’autres personnes.</p> + + <p>Votre contenu public peut être téléchargé par d’autres serveurs du réseau. Dans le cas où vos abonné·e·s et vos destinataires résident sur des serveurs différents du vôtre, vos posts publics et abonné·e·s uniquement sont délivrés vers les serveurs de vos abonné·e·s tandis que vos messages directs sont délivrés aux serveurs de vos destinataires.</p> + + <p>Quand vous autorisez une application à utiliser votre compte, en fonction de l’étendue des permissions que vous approuvez, il est possible qu’elle puisse accéder aux informations publiques de votre profil, à votre liste d’abonnements, votre liste d’abonné·e·s, vos listes, tous vos posts et vos favoris. Les applications ne peuvent en aucun cas accéder à votre adresse électronique et à votre mot de passe.</p> + + <hr class="spacer" /> + + <h3 id="children">Utilisation de ce site par les enfants</h3> + + <p>Si ce serveur est situé dans l’UE ou l’EEE : notre site, nos produits et nos services sont tous destinés à des personnes âgées de 16 ans ou plus. Si vous avez moins de 16 ans, en application du RGPD (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">Réglement Général sur la Protection des Données</a>), merci de ne pas utiliser ce site.</p> + + <p>Si ce serveur est situé aux États-Unis d’Amérique : notre site, nos produits et nos services sont tous destinés à des personnes âgées de 13 ans ou plus. Si vous avez moins de 13 ans, en application du COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>), merci de ne pas utiliser ce site.</p> + + <p>Les exigences légales peuvent être différentes si ce serveur dépend d'une autre juridiction.</p> + + <hr class="spacer" /> + + <h3 id="changes">Modifications de notre politique de confidentialité</h3> + + <p>Dans le cas où nous déciderions de changer notre politique de confidentialité, nous posterons les modifications sur cette page.</p> + + <p>Ce document est publié sous licence CC-BY-SA. Il a été mis à jour pour la dernière fois le 26 mai 2022.</p> + + <p>Initialement adapté de la <a href="https://github.com/discourse/discourse">politique de confidentialité de Discourse</a>.</p> title: Conditions d’utilisation et politique de confidentialité de %{instance} themes: contrast: Mastodon (Contraste élevé) diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 8a280c001..19a67a8ec 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -11,7 +11,6 @@ ga: roles: bot: Róbat group: Grúpa - moderator: Modhnóir unfollow: Ná lean admin: accounts: @@ -27,11 +26,6 @@ ga: all: Uile public: Poiblí reject: Diúltaigh - roles: - admin: Riarthóir - moderator: Modhnóir - staff: Foireann - user: Úsáideoir search: Cuardaigh statuses: Postálacha title: Cuntais diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 387ba6c2a..bdbd26199 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -90,10 +90,8 @@ gd: posts_tab_heading: Postaichean posts_with_replies: Postaichean ’s freagairtean roles: - admin: Rianaire bot: Bot group: Buidheann - moderator: Maor unavailable: Chan eil a’ phròifil ri làimh unfollow: Na lean tuilleadh admin: @@ -112,7 +110,6 @@ gd: avatar: Avatar by_domain: Àrainn change_email: - changed_msg: Chaidh post-d a’ chunntais atharrachadh! current_email: Am post-d làithreach label: Atharraich am post-d new_email: Post-d ùr @@ -196,12 +193,6 @@ gd: reset: Ath-shuidhich reset_password: Ath-shuidhich am facal-faire resubscribe: Fo-sgrìobh a-rithist - role: Ceadan - roles: - admin: Rianaire - moderator: Maor - staff: Ball dhen sgioba - user: Cleachdaiche search: Lorg search_same_email_domain: Cleachdaichean eile aig a bheil an aon àrainn puist-d search_same_ip: Cleachdaichean eile aig a bheil an t-aon IP @@ -728,9 +719,6 @@ gd: deletion: desc_html: Leig le neach sa bith an cunntas a sguabadh às title: Fosgail sguabadh às chunntasan - min_invite_role: - disabled: Na ceadaich idir - title: Ceadaich cuiridhean le require_invite_text: desc_html: Nuair a bhios aontachadh a làimh riatanach dhan chlàradh, dèan an raon teacsa “Carson a bu mhiann leat ballrachd fhaighinn?” riatanach seach roghainneil title: Iarr air cleachdaichean ùra gun innis iad carson a tha iad ag iarraidh ballrachd @@ -743,9 +731,6 @@ gd: show_known_fediverse_at_about_page: desc_html: Nuair a bhios seo à comas, cha sheall an loidhne-ama phoblach a thèid a cheangal rithe on duilleag-landaidh ach susbaint ionadail title: Gabh a-staigh susbaint cho-naisgte air duilleag na loidhne-ama poblaich gun ùghdarrachadh - show_staff_badge: - desc_html: Seall bràist sgioba air duilleag cleachdaiche - title: Seall bràist sgioba site_description: desc_html: Earrann tuairisgeil air an API. Mìnich dè tha sònraichte mun fhrithealaiche Mastodon seo agus rud sa bith eile a tha cudromach. ’S urrainn dhut tagaichean HTML a chleachdadh agus <code><a></code> ’s <code><em></code> gu sònraichte. title: Tuairisgeul an fhrithealaiche @@ -1140,7 +1125,6 @@ gd: title: Deasaich a’ chriathrag errors: invalid_context: Cha deach co-theacs a sholar no tha e mì-dhligheach - invalid_irreversible: Chan obraich criathradh buan ach ann an co-theacsa na dachaigh no na brathan index: delete: Sguab às empty: Chan eil criathrag agad. diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 5b303b08f..a5baa17f2 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -83,10 +83,8 @@ gl: posts_tab_heading: Publicacións posts_with_replies: Publicacións e respostas roles: - admin: Administradora bot: Bot group: Grupo - moderator: Moderadora unavailable: Perfil non dispoñíbel unfollow: Deixar de seguir admin: @@ -105,12 +103,17 @@ gl: avatar: Imaxe de perfil by_domain: Dominio change_email: - changed_msg: Email da conta mudado de xeito correcto! + changed_msg: Email mudado de xeito correcto! current_email: Email actual label: Mudar email new_email: Novo email submit: Mudar email title: Mudar email de %{username} + change_role: + changed_msg: Rol mudado correctamente! + label: Cambiar rol + no_role: Sen rol + title: Cambiar o rol de %{username} confirm: Confirmar confirmed: Confirmado confirming: Estase a confirmar @@ -154,6 +157,7 @@ gl: active: Activa all: Todo pending: Pendente + silenced: Limitada suspended: Suspendidos title: Moderación moderation_notes: Notas de moderación @@ -161,6 +165,7 @@ gl: most_recent_ip: IP máis recente no_account_selected: Ningunha conta mudou porque ningunha foi seleccionada no_limits_imposed: Sen límites impostos + no_role_assigned: Sen rol asignado not_subscribed: Non subscrita pending: Revisión pendente perform_full_suspension: Suspender @@ -187,12 +192,7 @@ gl: reset: Restabelecer reset_password: Restabelecer contrasinal resubscribe: Resubscribir - role: Permisos - roles: - admin: Administrador - moderator: Moderador - staff: Persoal (staff) - user: Usuaria + role: Rol search: Procurar search_same_email_domain: Outras usuarias co mesmo dominio de email search_same_ip: Outras usuarias co mesmo IP @@ -601,7 +601,7 @@ gl: delete_description_html: As publicacións denunciadas van ser eliminadas e gárdase un aviso para axudarche a xestionar futuras infraccións desta conta. mark_as_sensitive_description_html: Os multimedia das publicacións denunciadas serán marcados como sensibles e engadirase un aviso para axudarche a xestionar futuras infraccións da mesma conta. other_description_html: Mira máis opcións para controlar o comportamento da conta e personalizar as comunicacións coa conta denunciada. - resolve_description_html: Non se van tomar accións contra a conta denunciada, nin se gardan avisos, e a denuncia arquivada. + resolve_description_html: Non se van tomar accións contra a conta denunciada, nin se gardarán avisos, e pecharase a denuncia. silence_description_html: O perfil será visible só para quen xa o está a seguir ou quen o buscou manualmente, limitando moito o seu alcance. Pódese cambiar. suspend_description_html: O perfil e tódolos seus contidos será inaccesbles e finalmente eliminados. A interacción coa conta non será posible. Reversible durante 30 días. actions_description_html: Decide que acción tomar respecto desta denuncia. Se tomas accións punitivas contra a conta denunciada, enviaráselles un email coa notificación, excepto se está seleccionada a categoría <strong>Spam</strong>. @@ -631,7 +631,7 @@ gl: placeholder: Describir que accións foron tomadas ou calquera outra novidade sobre esta denuncia... title: Notas notes_description_html: Ver e deixar unha nota para ti no futuro e outras moderadoras - quick_actions_description_html: 'Tomar unha acción rápida ou desprázate abaixo para ver o contido denunciado:' + quick_actions_description_html: 'Toma unha acción rápida ou desprázate abaixo para ver o contido denunciado:' remote_user_placeholder: a usuaria remota desde %{instance} reopen: Reabrir denuncia report: 'Denuncia #%{id}' @@ -649,6 +649,67 @@ gl: unresolved: Non resolto updated_at: Actualizado view_profile: Ver perfil + roles: + add_new: Engadir rol + assigned_users: + one: "%{count} usuaria" + other: "%{count} usuarias" + categories: + administration: Administración + devops: DevOps + invites: Convites + moderation: Moderación + special: Especial + delete: Eliminar + description_html: Cos <strong>roles das usuarias</strong> podes personalizar as funcións e áreas de Mastodon ás que as usuarias poden acceder. + edit: Editar rol '%{name}' + everyone: Permisos por defecto + everyone_full_description_html: Este é o <strong>rol básico</strong> que afecta a <strong>tódalas usuarias</strong>, incluso aquelas sen un rol asignado. Tódolos outros roles herdan os seus permisos. + permissions_count: + one: "%{count} permiso" + other: "%{count} permisos" + privileges: + administrator: Administradora + administrator_description: As usuarias con este permiso poderán superar calquera restrición + delete_user_data: Eliminar datos de usuarias + delete_user_data_description: Permite eliminar datos doutras usuarias sen demoras + invite_users: Convidar usuarias + invite_users_description: Permite que outras usuarias conviden a xente ao servidor + manage_announcements: Xestionar anuncios + manage_announcements_description: Permite que xestionen os anuncios publicados no servidor + manage_appeals: Xestionar recursos + manage_appeals_description: Permite revisar as apelacións contra as accións de moderación + manage_blocks: Xestionar bloqueos + manage_blocks_description: Permite bloquear provedores de email e enderezos IP + manage_custom_emojis: Xestionar Emojis personalizados + manage_custom_emojis_description: Permite xestionar os emojis personalizados do servidor + manage_federation: Xestionar a federación + manage_federation_description: Permite bloquear ou permitir a federación con outros dominios, e controlar as entregas + manage_invites: Xestionar Convites + manage_invites_description: Permite ver e desactivar ligazóns de convite + manage_reports: Xestionar Denuncias + manage_reports_description: Permite revisar as denuncias e realizar accións de moderación sobre elas + manage_roles: Xestionar Roles + manage_roles_description: Permite xestionar e asignar roles a niveis inferiores + manage_rules: Xestionar Regras + manage_rules_description: Permite cambiar as regras do servidor + manage_settings: Xestionar Axustes + manage_settings_description: Permite cambiar os axustes do sitio web + manage_taxonomies: Xestionar Taxonomías + manage_taxonomies_description: Permite revisar o contido en voga e actualizar os axustes dos cancelos + manage_user_access: Xestionar Acceso das usuarias + manage_user_access_description: Permite desactivar o segundo factor de autenticación doutras usuarias, cambiar o enderezo de email e restablecer o contrasinal + manage_users: Xestionar Usuarias + manage_users_description: Permite ver os detalles doutras usuarias e realizar accións de moderación sobre elas + manage_webhooks: Xestionar Webhooks + manage_webhooks_description: Permite establecer webhooks para eventos administrativos + view_audit_log: Ver Rexistro de auditoría + view_audit_log_description: Permite ver o historial de accións administrativas no servidor + view_dashboard: Ver Taboleiro + view_dashboard_description: Permite acceder ao taboleiro e varias métricas do servidor + view_devops: Devops + view_devops_description: Permite acceder aos taboleiros Sidekiq e phHero + title: Roles rules: add_new: Engadir regra delete: Eliminar @@ -701,9 +762,6 @@ gl: deletion: desc_html: Permitirlle a calquera que elimine a súa conta title: Abrir o borrado da conta - min_invite_role: - disabled: Ninguén - title: Permitir convites por require_invite_text: desc_html: Cando os rexistros requiren aprobación manual, facer que o texto "Por que te queres rexistrar?" do convite sexa obrigatorio en lugar de optativo title: Require que as novas usuarias completen solicitude de texto do convite @@ -716,9 +774,6 @@ gl: show_known_fediverse_at_about_page: desc_html: Si activado, mostraralle os toots de todo o fediverso coñecido nunha vista previa. Si non só mostrará os toots locais. title: Incluír contido federado na páxina da cronoloxía pública sen autenticación - show_staff_badge: - desc_html: Mostrar unha insignia de membresía nunha páxina de usuaria - title: Mostrar insigna de membresía site_description: desc_html: Parágrafo de presentación na páxina principal. Describe o que fai especial a este servidor Mastodon e calquera outra ouca importante. Pode utilizar cancelos HTML, en particular <code><a></code> e <code><em></code>. title: Descrición do servidor @@ -941,7 +996,7 @@ gl: warning: Ten moito tino con estos datos. Non os compartas nunca con ninguén! your_token: O seu testemuño de acceso auth: - apply_for_account: Solicite un convite + apply_for_account: Solicita un convite change_password: Contrasinal checkbox_agreement_html: Acepto as <a href="%{rules_path}" target="_blank">regras do servidor</a> e os <a href="%{terms_path}" target="_blank">termos do servizo</a> checkbox_agreement_without_rules_html: Acepto os <a href="%{terms_path}" target="_blank">termos do servizo</a> @@ -954,7 +1009,7 @@ gl: didnt_get_confirmation: Non recibiches as instruccións de confirmación? dont_have_your_security_key: "¿Non tes a túa chave de seguridade?" forgot_password: Non lembras o contrasinal? - invalid_reset_password_token: O testemuño para restablecer o contrasinal non é válido ou caducou. Por favor solicite un novo. + invalid_reset_password_token: O token para restablecer o contrasinal non é válido ou caducou. Por favor solicita un novo. link_to_otp: Escribe o código do segundo factor do móbil ou un código de recuperación link_to_webauth: Usa o teu dispositivo de chave de seguridade log_in_with: Accede con @@ -1124,15 +1179,24 @@ gl: public: Cronoloxías públicas thread: Conversas edit: + add_keyword: Engadir palabra chave + keywords: Palabras chave title: Editar filtro errors: + deprecated_api_multiple_keywords: Estes parámetros non se poden cambiar desde esta aplicación porque son de aplicación a máis dun filtro de palabras chave. Usa unha aplicación máis recente ou a interface web. invalid_context: Non se proporcionou un contexto válido - invalid_irreversible: O filtrado non reversible só funciona con contexto de avisos ou Inicio index: + contexts: Filtros para %{contexts} delete: Eliminar empty: Non tes filtros. + expires_in: Caduca en %{distance} + expires_on: Caduca o %{date} + keywords: + one: "%{count} palabra chave" + other: "%{count} palabras chave" title: Filtros new: + save: Gardar o novo filtro title: Engadir novo filtro footer: developers: Desenvolvedoras @@ -1251,6 +1315,8 @@ gl: copy_account_note_text: 'Esta usuaria chegou desde %{acct}, aquí están as túas notas previas acerca dela:' notification_mailer: admin: + report: + subject: "%{name} enviou unha denuncia" sign_up: subject: "%{name} rexistrouse" digest: @@ -1279,7 +1345,7 @@ gl: title: Nova petición de seguimento mention: action: Responder - body: 'Foi mencionada por %{name} en:' + body: "%{name} mencionoute en:" subject: Foches mencionada por %{name} title: Nova mención poll: diff --git a/config/locales/he.yml b/config/locales/he.yml index 040034125..4daa4f3b6 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -90,10 +90,8 @@ he: posts_tab_heading: חצרוצים posts_with_replies: חצרוצים ותגובות roles: - admin: מנהל bot: בוט group: קבוצה - moderator: מנחה unavailable: פרופיל לא זמין unfollow: הפסקת מעקב admin: @@ -112,7 +110,6 @@ he: avatar: יַצְגָן by_domain: שם מתחם change_email: - changed_msg: כתובת הדוא"ל המשוייכת לחשבון שונתה בהצלחה ! current_email: כתובת דוא"ל נוכחית label: שינוי כתובת דוא"ל משוייכת לחשבון new_email: כתובת דוא"ל חדשה @@ -196,12 +193,6 @@ he: reset: איפוס reset_password: אתחול סיסמא resubscribe: להרשם מחדש - role: הרשאות - roles: - admin: מנהל מערכת - moderator: מנחה דיונים - staff: צוות - user: משתמש(ת) search: חיפוש search_same_email_domain: משתמשים אחרים מאותו דומיין דוא"ל search_same_ip: משתמשים אחרים מאותה כתובת IP @@ -727,9 +718,6 @@ he: deletion: desc_html: הרשאה לכולם למחוק את חשבונם title: פתיחת מחיקת חשבון - min_invite_role: - disabled: אף אחד - title: אפשר הזמנות לפי require_invite_text: desc_html: כאשר הרשמות דורשות אישור ידני, הפיכת טקסט ה"מדוע את/ה רוצה להצטרף" להכרחי במקום אופציונלי title: אלץ משתמשים חדשים למלא סיבת הצטרפות @@ -742,9 +730,6 @@ he: show_known_fediverse_at_about_page: desc_html: כאשר לא מופעל, מגביל את הפיד הפומבי המקושר מדף הנחיתה להצגת תוכן מקומי בלבד title: הכללת תוכן פדרטיבי בדף הפיד הפומבי הבלתי מאומת - show_staff_badge: - desc_html: הצג תג צוות בדף המשתמש - title: הצג תג צוות site_description: desc_html: מוצג כפסקה על הדף הראשי ומשמש כתגית מטא. ניתן להשתמש בתגיות HTML, ובמיוחד ב־<code> < a> </code> ו־<code> < em> </code> . title: תיאור האתר @@ -1145,7 +1130,6 @@ he: title: ערוך מסנן errors: invalid_context: לא סופק הקשר או הקשר לא תקין - invalid_irreversible: סינון בלתי הפיך עובד רק בהקשר פיד הבית או התראות index: delete: למחוק empty: אין לך מסננים. diff --git a/config/locales/hr.yml b/config/locales/hr.yml index fd90a5ac4..3a2af1662 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -44,7 +44,6 @@ hr: are_you_sure: Jeste li sigurni? by_domain: Domena change_email: - changed_msg: E-pošta računa uspješno je promijenjena! current_email: Trenutna e-pošta label: Promijeni e-poštu new_email: Nova e-pošta diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 5ee01ea2c..9a601c4ca 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -85,10 +85,8 @@ hu: posts_tab_heading: Bejegyzés posts_with_replies: Bejegyzés válaszokkal roles: - admin: Adminisztrátor bot: Bot group: Csoport - moderator: Moderátor unavailable: Nincs ilyen profil unfollow: Követés vége admin: @@ -107,12 +105,17 @@ hu: avatar: Profilkép by_domain: Domain change_email: - changed_msg: A fiókhoz tartozó e-mailt megváltoztattuk! + changed_msg: Az emailt sikeresen megváltoztattuk! current_email: Jelenlegi e-mail label: E-mail megváltoztatása new_email: Új e-mail submit: E-mail megváltoztatása title: "%{username} felhasználó e-mail változás" + change_role: + changed_msg: A szerepet sikeresen megváltoztattuk! + label: Szerep megváltoztatása + no_role: Nincs szerep + title: "%{username} szerepének megváltoztatása" confirm: Megerősítés confirmed: Megerősítve confirming: Megerősítés alatt @@ -156,6 +159,7 @@ hu: active: Aktív all: Összes pending: Függőben + silenced: Korlátozott suspended: Felfüggesztve title: Moderáció moderation_notes: Moderációs bejegyzés @@ -163,6 +167,7 @@ hu: most_recent_ip: Legutóbbi IP-cím no_account_selected: Nem változott meg egy fiók sem, mert semmi sem volt kiválasztva no_limits_imposed: Nincs korlátozás + no_role_assigned: Nincs szerep hozzárendelve not_subscribed: Nincs feliratkozás pending: Engedélyezés alatt perform_full_suspension: Felfüggesztés @@ -189,12 +194,7 @@ hu: reset: Visszaállítás reset_password: Jelszó visszaállítása resubscribe: Feliratkozás ismét - role: Engedélyek - roles: - admin: Adminisztrátor - moderator: Moderátor - staff: Stáb - user: Felhasználó + role: Szerep search: Keresés search_same_email_domain: Felhasználók ugyanezzel az email domainnel search_same_ip: Más felhasználók ugyanezzel az IP-vel @@ -651,6 +651,67 @@ hu: unresolved: Megoldatlan updated_at: Frissítve view_profile: Profil megtekintése + roles: + add_new: Szerep hozzáadása + assigned_users: + one: "%{count} felhasználó" + other: "%{count} felhasználó" + categories: + administration: Adminisztráció + devops: Devops + invites: Meghívások + moderation: Moderáció + special: Speciális + delete: Törlés + description_html: A <strong>felhasználói szerepekkel</strong> testreszabhatod, hogy a felhasználóid milyen Mastodon funkciókat és területeket érjenek el. + edit: "'%{name}' szerep szerkesztése" + everyone: Alapértelmezett engedélyek + everyone_full_description_html: Ez az <strong>alap szerep</strong>, mely <strong>minden felhasználóra</strong> kihat, azokra is, akiknek nincs hozzárendelt szerepük. Minden más szerep ebből örökli az engedélyeit. + permissions_count: + one: "%{count} engedély" + other: "%{count} engedély" + privileges: + administrator: Adminisztrátor + administrator_description: A felhasználók ezzel a szereppel minden jogosultsággal rendelkeznek + delete_user_data: Felhasználói adatok törlése + delete_user_data_description: Lehetővé teszi a felhasználónak, hogy azonnal törölhesse más felhasználó adatait + invite_users: Felhasználók meghívása + invite_users_description: Lehetővé teszi a felhasználónak, hogy új embereket hívjon meg a kiszolgálóra + manage_announcements: Hirdetmények kezelése + manage_announcements_description: Lehetővé teszi a felhasználónak, hogy a kiszolgáló hirdetményeit kezelje + manage_appeals: Fellebbezések kezelése + manage_appeals_description: Lehetővé teszi, hogy a felhasználó átnézze a moderációval kapcsolatos fellebbezéseket + manage_blocks: Letiltások kezelése + manage_blocks_description: Lehetővé teszi, hogy a felhasználó letiltson email szolgáltatókat és IP címeket + manage_custom_emojis: Egyedi emodzsik kezelése + manage_custom_emojis_description: Lehetővé teszi a felhasználó számára, hogy a kiszolgáló egyedi emodzsiait kezelje + manage_federation: Föderáció kezelése + manage_federation_description: Lehetővé teszi a felhasználó számára, hogy más domainnekkel való föderációt engedélyezzen vagy letiltson, illetve szabályozza a kézbesítést + manage_invites: Meghívások kezelése + manage_invites_description: Lehetővé teszi a felhasználó számára, hogy böngéssze és deaktiválja a meghívási hivatkozásokat + manage_reports: Bejelentések kezelése + manage_reports_description: Lehetővé teszi a felhasználó számára, hogy átnézze a bejelentéseket és moderáljon ezek alapján + manage_roles: Szerepek kezelése + manage_roles_description: Lehetővé teszi a felhasználó számára, hogy a sajátjánál alacsonyabb rangú szerepeket kezeljen és hozzárendeljen másokhoz + manage_rules: Szabályok kezelése + manage_rules_description: Lehetővé teszi a felhasználó számára, hogy megváltoztassa a kiszolgáló szabályait + manage_settings: Beállítások kezelése + manage_settings_description: Lehetővé teszi, hogy a felhasználó megváltoztassa az oldal beállításait + manage_taxonomies: Taxonómiák kezelése + manage_taxonomies_description: Lehetővé teszi, hogy a felhasználó átnézze a népszerű tartalmakat és frissítse a hashtag-ek beállításait + manage_user_access: Felhasználói hozzáférések kezelése + manage_user_access_description: Lehetővé teszi, hogy a felhasználó letiltsa mások kétlépcsős azonosítását, megváltoztassa az email címüket, és alaphelyzetbe állítsa a jelszavukat + manage_users: Felhasználók kezelése + manage_users_description: Lehetővé teszi, hogy a felhasználó megtekintse mások részletes adatait és moderálja őket + manage_webhooks: Webhookok kezelése + manage_webhooks_description: Lehetővé teszi, hogy a felhasználó webhookokat állítson be adminisztratív eseményekhez + view_audit_log: Audit napló megtekintése + view_audit_log_description: Lehetővé teszi, hogy a felhasználó megtekintse a kiszolgáló adminisztratív eseményeinek történetét + view_dashboard: Irányítópult megtekintése + view_dashboard_description: Lehetővé teszi, hogy a felhasználó elérje az irányítópultot és vele számos metrikát + view_devops: Devops + view_devops_description: Lehetővé teszi, hogy a felhasználó elérje a Sidekiq és pgHero irányítópultjait + title: Szerepek rules: add_new: Szabály hozzáadása delete: Törlés @@ -703,9 +764,6 @@ hu: deletion: desc_html: Engedélyezed a felhasználóknak, hogy töröljék fiókjukat title: Fiók törlésének engedélyezése - min_invite_role: - disabled: Senki - title: Meghívások engedélyezése require_invite_text: desc_html: Ha a regisztrációhoz kézi jóváhagyásra van szükség, akkor a „Miért akarsz csatlakozni?” válasz kitöltése legyen kötelező, és ne opcionális title: Az új felhasználóktól legyen megkövetelve a meghívási kérés szövegének kitöltése @@ -718,9 +776,6 @@ hu: show_known_fediverse_at_about_page: desc_html: Ha le van tiltva, a nyilvános, főoldalról elérhető idővonalon csak helyi tartalmak jelennek meg title: Mutassuk az általunk ismert föderációt az idővonal előnézetben - show_staff_badge: - desc_html: Stáb-jelvény megjelenítése a felhasználó oldalán - title: Stáb-jelvény megjelenítése site_description: desc_html: Rövid bemutatkozás a főoldalon és a meta fejlécekben. Írd le, mi teszi ezt a szervert különlegessé! Használhatod a <code><a></code> és <code><em></code> HTML tageket. title: Kiszolgáló leírása @@ -1126,15 +1181,24 @@ hu: public: Nyilvános idővonalak thread: Beszélgetések edit: + add_keyword: Kulcsszó hozzáadása + keywords: Kulcsszavak title: Szűrő szerkesztése errors: + deprecated_api_multiple_keywords: Ezek a paraméterek nem módosíthatóak az alkalmazásból, mert több mint egy szűrőkulcsszóra is hatással vannak. Használd az alkalmazás vagy a webes felület újabb verzióját. invalid_context: A megadott kontextus hamis vagy hiányzik - invalid_irreversible: Visszafordíthatatlan szűrést csak saját idővonalon vagy értesítéseken lehet végezni index: + contexts: 'Szűrés helye: %{contexts}' delete: Törlés empty: Nincs szűrés. + expires_in: 'Ennyi idő múlva jár le: %{distance}' + expires_on: 'Lejárat ideje: %{date}' + keywords: + one: "%{count} kulcsszó" + other: "%{count} kulcsszó" title: Szűrők new: + save: Új szűrő mentése title: Új szűrő hozzáadása footer: developers: Fejlesztőknek @@ -1253,6 +1317,8 @@ hu: copy_account_note_text: 'Ez a fiók elköltözött innen %{acct}, itt vannak a bejegyzéseitek róla:' notification_mailer: admin: + report: + subject: "%{name} bejelentést küldött" sign_up: subject: "%{name} feliratkozott" digest: diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 831ca6621..e04f2088c 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -77,10 +77,8 @@ hy: posts_tab_heading: Գրառումներ posts_with_replies: Գրառումներ եւ պատասխաններ roles: - admin: Ադմինիստրատոր bot: Բոտ group: Խումբ - moderator: Մոդերատոր unavailable: Պրոֆիլը հասանելի չի unfollow: Չհետևել admin: @@ -99,7 +97,6 @@ hy: avatar: Աւատար by_domain: Դոմէն change_email: - changed_msg: Հաշուի էլ․ հասցէն բարեյաջող փոփոխուեց current_email: Ներկայիս էլ․ հասցէ label: Փոխել էլ. հասցէն new_email: Նոր էլ․ փոստ @@ -174,12 +171,6 @@ hy: reset: Վերականգնել reset_password: Վերականգնել գաղտանաբառը resubscribe: Կրկին բաժանորդագրուել - role: Թոյլտուութիւններ - roles: - admin: Ադմինիստրատոր - moderator: Մոդերատոր - staff: Անձնակազմ - user: Oգտատէր search: Որոնել search_same_email_domain: Այլ օգտատէրեր նոյն էլ․ փոստի դոմէյնով search_same_ip: Այլ օգտատէրեր նոյն IP֊ով @@ -466,18 +457,12 @@ hy: deletion: desc_html: Բոլորին թոյլատրել ջնջել իրենց հաշիւը title: Բացել հաշուի ջնջումը - min_invite_role: - disabled: Ոչ ոք - title: Թոյլատրել հրաւէրներ registrations_mode: modes: approved: Գրանցման համար անհրաժեշտ է հաստատում none: Ոչ ոք չի կարող գրանցուել open: Բոլորը կարող են գրանցուել title: Գրանցումային ռեժիմ - show_staff_badge: - desc_html: Ցուցադրել անձնակազմի անդամի նշանը օգտատիրոջ էջում - title: Ցուցադրել անձնակազմի անդամի նշանը site_description: title: Կայքի նկարագրութիւն site_short_description: diff --git a/config/locales/id.yml b/config/locales/id.yml index 368b21add..2bf3e7d13 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -77,10 +77,8 @@ id: posts_tab_heading: Toot posts_with_replies: Toot dan balasan roles: - admin: Admin bot: Bot group: Grup - moderator: Moderator unavailable: Profil tidak tersedia unfollow: Berhenti mengikuti admin: @@ -99,7 +97,6 @@ id: avatar: Avatar by_domain: Domian change_email: - changed_msg: Email akun ini berhasil diubah! current_email: Email saat ini label: Ganti email new_email: Email baru @@ -180,12 +177,6 @@ id: reset: Atur ulang reset_password: Reset kata sandi resubscribe: Langganan ulang - role: Hak akses - roles: - admin: Administrator - moderator: Moderator - staff: Staf - user: Pengguna search: Cari search_same_email_domain: Pengguna lain dengan domain email yang sama search_same_ip: Pengguna lain dengan IP yang sama @@ -685,9 +676,6 @@ id: deletion: desc_html: Izinkan siapapun untuk menghapus akun miliknya title: Buka penghapusan akun - min_invite_role: - disabled: Tidak ada satu pun - title: Izinkan undangan oleh require_invite_text: desc_html: Saat pendaftaran harus disetujui manual, buat input teks "Mengapa Anda ingin bergabung?" sebagai hal wajib bukan opsional title: Pengguna baru harus memasukkan alasan bergabung @@ -700,9 +688,6 @@ id: show_known_fediverse_at_about_page: desc_html: Ketika dimatikan, batasi linimasa publik yang ditautkan dari halaman landas untuk menampilkan konten lokal saja title: Masukkan konten gabungan di halaman linimasa publik tanpa autentifikasi - show_staff_badge: - desc_html: Tampilkan lencana staf pada halaman pengguna - title: Tampilkan lencana staf site_description: desc_html: Ditampilkan sebagai sebuah paragraf di halaman depan dan digunakan sebagai tag meta.<br>Anda bisa menggunakan tag HTML, khususnya <code><a></code> dan <code><em></code>. title: Deskripsi situs @@ -1103,7 +1088,6 @@ id: title: Ubah saringan errors: invalid_context: Konteks tidak ada atau invalid - invalid_irreversible: Penyaringan yang tidak dapat dipulihkan hanya bekerja di beranda atau konteks notifikasi index: delete: Hapus empty: Anda tidak memiliki filter. diff --git a/config/locales/io.yml b/config/locales/io.yml index 7cf253089..f88ab4164 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -83,10 +83,8 @@ io: posts_tab_heading: Posti posts_with_replies: Posti e respondi roles: - admin: Administrero bot: Boto group: Grupo - moderator: Jerero unavailable: Profilo esas nedisponebla unfollow: Dessequar admin: @@ -111,6 +109,11 @@ io: new_email: Nova retposto submit: Chanjez retposto title: Chanjez retposto por %{username} + change_role: + changed_msg: Rolo sucesoze chanjesis! + label: Chanjez rolo + no_role: Nula rolo + title: Chanjez rolo por %{username} confirm: Konfirmez confirmed: Konfirmita confirming: Ankore konfirmesas @@ -154,6 +157,7 @@ io: active: Aktiva all: Omna pending: Vartanta + silenced: Limitizita suspended: Restriktita title: Jero moderation_notes: Jernoti @@ -161,6 +165,7 @@ io: most_recent_ip: Maxim recenta IP no_account_selected: Nula konti chanjesis pro ke nulo selektesis no_limits_imposed: Limiti ne fixesis + no_role_assigned: Nula rolo not_subscribed: Ne abonita pending: Vartar kontrolo perform_full_suspension: Perform full suspension @@ -187,12 +192,7 @@ io: reset: Richanjez reset_password: Richanjez pasvorto resubscribe: Riabonez - role: Permisi - roles: - admin: Administrero - moderator: Jerero - staff: Laborero - user: Uzanto + role: Rolo search: Trovez search_same_email_domain: Altra uzanti kun sama retpostodomeno search_same_ip: Altra uzanti kun sama IP @@ -649,6 +649,67 @@ io: unresolved: Nerezolvita updated_at: Novigesis view_profile: Videz profilo + roles: + add_new: Insertez rolo + assigned_users: + one: "%{count} uzanto" + other: "%{count} uzanti" + categories: + administration: Administro + devops: Developeri + invites: Inviti + moderation: Jero + special: Specala + delete: Efacez + description_html: Per <strong>uzantoroli</strong>, vu povas kustumizar funciono e siti di Mastodon quon vua uzanti povas uzar. + edit: Modifikez rolo di '%{name}' + everyone: Originala permisi + everyone_full_description_html: Co esas <strong>bazrolo</strong> quo efektigas <strong>omna uzanti</strong>, mem personi sen rolo. Omna altra roli ganas sama permisi de ol. + permissions_count: + one: "%{count} permiso" + other: "%{count} permisi" + privileges: + administrator: Administrero + administrator_description: Uzanti kun ca permiso ignoros singla permiso + delete_user_data: Efacez uzantinformi + delete_user_data_description: Permisez uzanti efacar informi di altra uzanti sen varto + invite_users: Invitez uzanti + invite_users_description: Permisez uzanti invitar nova personi a la servilo + manage_announcements: Jerez anunci + manage_announcements_description: Permisez uzanti jerar anunci en la servilo + manage_appeals: Jerez apeli + manage_appeals_description: Permisez uzanti kontrolar apeli kontra jero + manage_blocks: Jerez obstrukti + manage_blocks_description: Permisez uzanti obstruktar retpostoservilo e adresi di IP + manage_custom_emojis: Jerez kustumizita emocimaji + manage_custom_emojis_description: Permisez uzanti jerar kustumizita emocimaji en la servilo + manage_federation: Jerez federo + manage_federation_description: Permisez uzanti obstruktar o permisez federo kun altra domeni, e dominacar sendebleso + manage_invites: Jerez inviti + manage_invites_description: Permisez uzanti vidar e desaktivigar invitligili + manage_reports: Jerez raporti + manage_reports_description: Permisez uzanti kontrolar raporti e jerez kontra oli + manage_roles: Jerez roli + manage_roles_description: Permisez uzanti jerar e ajustar plu basa roli di olia + manage_rules: Jerez reguli + manage_rules_description: Permisez uzanti chanjar servilreguli + manage_settings: Jerez opcioni + manage_settings_description: Permisez uzanti chanjar sitopcioni + manage_taxonomies: Jerez nomkategorii + manage_taxonomies_description: Permisez uzanti kontrolar tendencoza kontenajo e novigar hashtagopcioni + manage_user_access: Jerez uzantoeniro + manage_user_access_description: Permisez uzanti desaktivigar 2-faktoryurizeso di altra uzanti, chanjar olia retpostoadreso e richanjar olia pasvorto + manage_users: Jerez uzanti + manage_users_description: Permisez uzanti vidar detali di altra uzanti e jerar kontra oli + manage_webhooks: Jerez interrethoki + manage_webhooks_description: Permisez uzanti igas interrethoki por administrala eventi + view_audit_log: Videz kontrollogo + view_audit_log_description: Permisez uzanti vidar historio di administrala agi en la servilo + view_dashboard: Videz chefpanelo + view_dashboard_description: Permisez uzanti uzar chefpanelo e diversa opcioni + view_devops: Developeri + view_devops_description: Permisez uzanti uzar chefpaneli Sidekiq e pgHero + title: Roli rules: add_new: Insertez regulo delete: Efacez @@ -701,9 +762,6 @@ io: deletion: desc_html: Permisez irgu efacar sua konto title: Apertez kontoefaco - min_invite_role: - disabled: Nulu - title: Permisez inviti da require_invite_text: desc_html: Se registri bezonas manuala aprobo, kauzigar "Por quo vu volas juntar?" textoenpoz divenar obligata title: Bezonez nova uzanti insertar motivo por juntar @@ -716,9 +774,6 @@ io: show_known_fediverse_at_about_page: desc_html: Se desaktivigesis, co permisas publika tempolineo quo ligesas de atingopagino montrar nur lokala kontenajo title: Inkluzez federatita kontenajo che neyurizita publika tempolineopagino - show_staff_badge: - desc_html: Montrez laborerinsigno che uzantopagino - title: Montrez laborerinsigno site_description: desc_html: Displayed as a paragraph on the frontpage and used as a meta tag.<br>You can use HTML tags, in particular <code><a></code> and <code><em></code>. title: Site description @@ -1124,15 +1179,24 @@ io: public: Publika tempolinei thread: Konversi edit: + add_keyword: Insertez klefvorto + keywords: Klefvorti title: Modifikez filtrilo errors: + deprecated_api_multiple_keywords: Ca parametri ne povas chanjesar per ca softwaro pro quo oli efektigas plu kam 1 filtrilklefvorto. Uzez plu recenta softwaro o interretintervizajo. invalid_context: Nula o nevalida kuntexto donesis - invalid_irreversible: Neinversigebla filtro nur funcionas kun hemo- e aviz- kuntexto index: + contexts: Filtrili kun %{contexts} delete: Efacez empty: Vu ne havas filtrili. + expires_in: Expiras ye %{distance} + expires_on: Expiras ye %{date} + keywords: + one: "%{count} klefvorto" + other: "%{count} klefvorti" title: Filtrili new: + save: Salvez nova filtrilo title: Insertez nova filtrilo footer: developers: Developeri @@ -1251,6 +1315,8 @@ io: copy_account_note_text: 'Ca uzanti transferesis de %{acct}, co esas vua antea noti pri ol:' notification_mailer: admin: + report: + subject: "%{name} sendis raporto" sign_up: subject: "%{name} registris" digest: diff --git a/config/locales/is.yml b/config/locales/is.yml index f9d408822..943fff632 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -83,10 +83,8 @@ is: posts_tab_heading: Færslur posts_with_replies: Færslur og svör roles: - admin: Stjóri bot: Róbót group: Hópur - moderator: Umsjón unavailable: Notandasnið ekki tiltækt unfollow: Hætta að fylgja admin: @@ -105,12 +103,17 @@ is: avatar: Auðkennismynd by_domain: Lén change_email: - changed_msg: Tölvupóstfangi notandaaðgangsins hefur verið breytt! + changed_msg: Tókst að breyta tölvupóstfangi! current_email: Núverandi tölvupóstfang label: Breyta tölvupóstfangi new_email: Nýr tölvupóstur submit: Breyta tölvupóstfangi title: Breyta tölvupóstfangi fyrir %{username} + change_role: + changed_msg: Tókst að breyta hlutverki! + label: Breyta hlutverki + no_role: Ekkert hlutverk + title: Breyta hlutverki fyrir %{username} confirm: Staðfesta confirmed: Staðfest confirming: Staðfesti @@ -154,6 +157,7 @@ is: active: Virkur all: Allt pending: Í bið + silenced: Takmarkað suspended: Í bið title: Umsjón moderation_notes: Minnispunktar umsjónarmanna @@ -161,6 +165,7 @@ is: most_recent_ip: Nýjasta IP-vistfang no_account_selected: Engum aðgöngum var breytt þar sem engir voru valdir no_limits_imposed: Engra takmarka krafist + no_role_assigned: Engu hlutverki úthlutað not_subscribed: Ekki í áskrift pending: Bíður eftir yfirlestri perform_full_suspension: Setja í bið @@ -187,12 +192,7 @@ is: reset: Endurstilla reset_password: Endurstilla lykilorð resubscribe: Gerast áskrifandi aftur - role: Heimildir - roles: - admin: Stjórnandi - moderator: Umsjónarmaður - staff: Starfsmaður - user: Notandi + role: Hlutverk 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 @@ -538,7 +538,7 @@ is: public_comment: Opinber athugasemd purge: Henda purge_description_html: Ef þú heldur að þetta lén sé farið endanlega af netinu, geturðu eytt öllum færslum aðganga og tengdum gögnum frá þessu léni úr gagnageymslum þínum. Þetta gæti tekið þó nokkra stund. - title: Samband + title: Netþjónasambönd total_blocked_by_us: Útilokað af okkur total_followed_by_them: Fylgt af þeim total_followed_by_us: Fylgt af okkur @@ -649,6 +649,67 @@ is: unresolved: Óleyst updated_at: Uppfært view_profile: Skoða notandasnið + roles: + add_new: Bæta við hlutverki + assigned_users: + one: "%{count} notandi" + other: "%{count} notendur" + categories: + administration: Stjórnun + devops: Kerfisstjórar + invites: Boðsgestir + moderation: Umsjón + special: Sérstakt + delete: Eyða + description_html: Með <strong>hlutverkum notenda</strong> geturðu sérsniðið að hvaða aðgerðum og hvaða svæðum í Mastodon notendurnir þínir hafa aðgang. + edit: Breyta hlutverki fyrir '%{name}' + everyone: Sjálfgefnar heimildir + everyone_full_description_html: Þetta er <strong>grunnhlutverk</strong> sem <strong>allir notendur</strong> fá, líka þeir sem ekki hafa fengið neitt sérstakt hlutverk. Öll önnur hlutverk erfa heimildir frá þessu. + permissions_count: + one: "%{count} heimild" + other: "%{count} heimildir" + privileges: + administrator: Stjórnandi + administrator_description: Notendur með þessa heimild fara framhjá öllum öðrum heimildum + delete_user_data: Eyða gögnum notanda + delete_user_data_description: Leyfir notendum að eyða gögnum annarra notenda án tafar + invite_users: Bjóða notendum + invite_users_description: Leyfir notendum að bjóða nýju fólki inn á netþjóninn + manage_announcements: Sýsla með tilkynningar + manage_announcements_description: Leyfir notendum að sýsla með tilkynningar á netþjóninum + manage_appeals: Sýsla með áfrýanir + manage_appeals_description: Leyfir notendum að yfirfara áfrýjanir vegna aðgerða umsjónarfólks + manage_blocks: Sýsla með útilokanir + manage_blocks_description: Leyfir notendum að loka á tölvupóstþjónustur og IP-vistföng + manage_custom_emojis: Sýsla með sérsniðin tjáningartákn + manage_custom_emojis_description: Leyfir notendum að sýsla með sérsniðin tjáningartákn á netþjóninum + manage_federation: Sýsla með netþjónasambönd + manage_federation_description: Leyfir notendum að loka á eða leyfa samþættingu við önnur lén (federation) og stýra afhendingu skilaboða + manage_invites: Sýsla með boðsgesti + manage_invites_description: Leyfir notendum að vafra um og gera boðstengla óvirka + manage_reports: Sýsla með kærur + manage_reports_description: Leyfir notendum að yfirfara kærur og framkvæma umsýsluaðgerðir sem byggjast á þeim + manage_roles: Sýsla með hlutverk + manage_roles_description: Leyfir notendum að sýsla með hlutverk og úthluta hlutverkum sem eru réttminni en þeirra eigið + manage_rules: Sýsla með reglur + manage_rules_description: Leyfir notendum að breyta reglum á netþjóninum + manage_settings: Sýsla með stillingar + manage_settings_description: Leyfir notendum að breyta stillingum vefsvæðisins + manage_taxonomies: Sýsla með vægi efnis + manage_taxonomies_description: Leyfir notendum að yfirfara vinsælt efni og uppfæra stillingar myllumerkja + manage_user_access: Sýsla með notendaaðgang + manage_user_access_description: Leyfir notendum að gera tveggja-þátta auðkenningu annarra notenda óvirka, breyta tölvupóstfangi þeirra og endurstilla lykilorð + manage_users: Sýsla með notendur + manage_users_description: Leyfir notendum að sýsla með nánari upplýsingar um aðra notendur og framkvæma umsýsluaðgerðir gagnvart þeim + manage_webhooks: Sýsla með Webhook-vefkrækjur + manage_webhooks_description: Leyfir notendum að setja upp webhook-vefkrækjur vagna stjórnunartengdra atburða + view_audit_log: Skoða atvikaskráningu + view_audit_log_description: Leyfir notendum að skoða feril stjórnunaraðgerða á netþjóninum + view_dashboard: Skoða stjórnborð + view_dashboard_description: Leyfir notendum að skoða stjórnborðið og sjá ýmsar mælingar + view_devops: Kerfisstjórar + view_devops_description: Leyfir notendum að skoða Sidekiq og pgHero stjórnborð + title: Hlutverk rules: add_new: Skrá reglu delete: Eyða @@ -701,9 +762,6 @@ is: deletion: desc_html: Leyfa öllum að eyða aðgangnum sínum title: Opna eyðingu á notandaaðgangi - min_invite_role: - disabled: Enginn - title: Leyfa boð frá require_invite_text: desc_html: Þegar nýskráningar krefjast handvirks samþykkis, skal gera "Hvers vegna viltu taka þátt?" boðstexta að skyldu fremur en valkvæðan title: Krefja nýja notendur um að fylla út boðstexta @@ -716,9 +774,6 @@ is: show_known_fediverse_at_about_page: desc_html: Þegar þetta er óvirkt, takmarkast opinbera tímalínan sem tengt er í af upphafssíðunni við að birta einungis staðvært efni (af sama vefþjóni) title: Hafa með efni úr skýjasambandi á síðu fyrir óauðkennda opinbera tímalínu - show_staff_badge: - desc_html: Sýna starfsmannamerki á síðu notandans - title: Sýna starfsmannamerki site_description: desc_html: Kynningarmálsgrein í API. Lýstu því hvað það er sem geri þennan Mastodon-þjón sérstakan, auk annarra mikilvægra upplýsinga. Þú getur notað HTML-einindi, sér í lagi <code><a></code> og <code><em></code>. title: Lýsing á vefþjóni @@ -853,13 +908,25 @@ is: empty: Þú hefur ekki enn skilgreint neinar aðvaranaforstillingar. title: Sýsla með forstilltar aðvaranir webhooks: + add_new: Bæta við endapunkti delete: Eyða + description_html: "<strong>webhook-vefkrækja</strong> gerir Mastodon kleift að ýta <strong>rauntíma-tilkynningum</strong> um valda atburði til þinna eigin forrita, þannig að þau forrit getir <strong>sett sjálfvirk viðbrögð í gang</strong>." disable: Gera óvirkt disabled: Óvirkt + edit: Breyta endapunkti + empty: Þú ert ekki enn búin/n að stilla neina endapunkta á webhook-vefkrækjum. enable: Virkja enabled: Virkt + enabled_events: + one: 1 virkjaður atburður + other: "%{count} virkjaðir atburðir" events: Atburðir + new: Ný webhook-vefkrækja + rotate_secret: Skipta um leyniteikn + secret: Leyniteikn undirritunar status: Staða + title: Webhook-vefkrækjur + webhook: Webhook-vefkrækja admin_mailer: new_appeal: actions: @@ -1112,15 +1179,24 @@ is: public: Opinberar tímalínur thread: Samtöl edit: + add_keyword: Bæta við stikkorði + keywords: Stikkorð title: Breyta síu errors: + deprecated_api_multiple_keywords: Þessum viðföngum er ekki hægt að breyta úr þessu forriti, þar sem þau eiga við fleiri en eitt stikkorð síu. Notaðu nýrra forrit eða farðu í vefviðmótið. invalid_context: Ekkert eða ógilt samhengi var gefið - invalid_irreversible: Óendurkræf síun virkar bara í sambandi við heimasvæði eða tilkynningar index: + contexts: Síur í %{contexts} delete: Eyða empty: Þú ert ekki með neinar síur. + expires_in: Rennur út %{distance} + expires_on: Rennur út þann %{date} + keywords: + one: "%{count} stikkorð" + other: "%{count} stikkorð" title: Síur new: + save: Vista nýja síu title: Bæta við nýrri síu footer: developers: Forritarar @@ -1239,6 +1315,8 @@ is: copy_account_note_text: 'Þessi notandi fluttist frá %{acct}, hér eru fyrri minnispunktar þínir um hann:' notification_mailer: admin: + report: + subject: "%{name} sendi inn kæru" sign_up: subject: "%{name} nýskráði sig" digest: diff --git a/config/locales/it.yml b/config/locales/it.yml index f97779d26..f269cc542 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -83,10 +83,8 @@ it: posts_tab_heading: Toot posts_with_replies: Toot e risposte roles: - admin: Amministratore bot: Bot group: Gruppo - moderator: Moderatore unavailable: Profilo non disponibile unfollow: Non seguire più admin: @@ -105,12 +103,17 @@ it: avatar: Immagine di profilo by_domain: Dominio change_email: - changed_msg: Account email cambiato con successo! + changed_msg: Email modificata! current_email: Email attuale label: Cambia email new_email: Nuova email submit: Cambia email title: Cambia email per %{username} + change_role: + changed_msg: Ruolo modificato correttamente! + label: Cambia ruolo + no_role: Nessun ruolo + title: Cambia ruolo per %{username} confirm: Conferma confirmed: Confermato confirming: Confermando @@ -154,6 +157,7 @@ it: active: Attivo all: Tutto pending: In attesa + silenced: Limitato suspended: Sospesi title: Moderazione moderation_notes: Note di moderazione @@ -161,6 +165,7 @@ it: most_recent_ip: IP più recente no_account_selected: Nessun account è stato modificato visto che non ne è stato selezionato nessuno no_limits_imposed: Nessun limite imposto + no_role_assigned: Nessun ruolo assegnato not_subscribed: Non sottoscritto pending: Revisioni in attesa perform_full_suspension: Sospendi @@ -187,12 +192,7 @@ it: reset: Reimposta reset_password: Reimposta password resubscribe: Riscriversi - role: Permessi - roles: - admin: Amministratore - moderator: Moderatore - staff: Personale - user: Utente + role: Ruolo search: Cerca search_same_email_domain: Altri utenti con lo stesso dominio e-mail search_same_ip: Altri utenti con lo stesso IP @@ -649,6 +649,67 @@ it: unresolved: Non risolto updated_at: Aggiornato view_profile: Visualizza profilo + roles: + add_new: Aggiungi ruolo + assigned_users: + one: "%{count} utente" + other: "%{count} utenti" + categories: + administration: Amministrazione + devops: Devops + invites: Inviti + moderation: Moderazione + special: Speciale + delete: Cancella + description_html: Con i <strong>ruoli utente</strong>, puoi personalizzare a quali funzioni e aree di Mastodon i tuoi utenti possono accedere. + edit: Modifica il ruolo '%{name}' + everyone: Permessi predefiniti + everyone_full_description_html: Questo è il ruolo <strong>base</strong> che influenza <strong>tutti gli utenti</strong>, anche quelli senza un ruolo assegnato. Tutti gli altri ruoli ereditano i permessi da esso. + permissions_count: + one: "%{count} permesso" + other: "%{count} permessi" + privileges: + administrator: Amministratore + administrator_description: Gli utenti con questo permesso saranno esentati da ogni permesso + delete_user_data: Cancella dati utente + delete_user_data_description: Consente agli utenti di eliminare subito i dati degli altri utenti + invite_users: Invita Utenti + invite_users_description: Consente agli utenti di invitare nuove persone su questo server + manage_announcements: Gestisci Annunci + manage_announcements_description: Consente agli utenti di gestire gli annunci sul server + manage_appeals: Gestisci appelli + manage_appeals_description: Consente agli utenti di esaminare i ricorsi contro le azioni di moderazione + manage_blocks: Gestisci Blocchi + manage_blocks_description: Consente agli utenti di bloccare provider e-mail e indirizzi IP + manage_custom_emojis: Gestisci emoji personalizzate + manage_custom_emojis_description: Consente agli utenti di gestire emoji personalizzate sul server + manage_federation: Gestisci Federazione + manage_federation_description: Consente agli utenti di bloccare o consentire la federazione con altri domini e controllare la consegnabilità + manage_invites: Gestisci Inviti + manage_invites_description: Consente agli utenti di esaminare e disattivare i link di invito + manage_reports: Gestisci report + manage_reports_description: Consente agli utenti di esaminare i report ed eseguire azioni di moderazione su di essi + manage_roles: Gestisci Ruoli + manage_roles_description: Consente agli utenti di gestire e assegnare i ruoli inferiori al loro + manage_rules: Gestisci Regole + manage_rules_description: Consente agli utenti di modificare le regole del server + manage_settings: Gestisci impostazioni + manage_settings_description: Consente agli utenti di modificare le impostazioni del sito + manage_taxonomies: Gestisci Tassonomie + manage_taxonomies_description: Consente agli utenti di esaminare i contenuti di tendenza e aggiornare le impostazioni degli hashtag + manage_user_access: Gestisci accesso utenti + manage_user_access_description: Consente agli utenti di disabilitare l'autenticazione a due fattori degli altri utenti, modificare il loro indirizzo e-mail e reimpostare la password + manage_users: Gestisci utenti + manage_users_description: Consente agli utenti di visualizzare le informazioni sugli altri utenti ed eseguire azioni di moderazione contro di loro + manage_webhooks: Gestisci Webhook + manage_webhooks_description: Consente agli utenti di impostare webhook per eventi amministrativi + view_audit_log: Visualizza Registro Attività + view_audit_log_description: Consente agli utenti di vedere una cronologia delle azioni amministrative sul server + view_dashboard: Mostra dashboard + view_dashboard_description: Consente agli utenti di accedere alla dashboard e alle varie metriche + view_devops: Devops + view_devops_description: Consente agli utenti di accedere alle dashboard Sidekiq e pgHero + title: Ruoli rules: add_new: Aggiungi regola delete: Cancella @@ -701,9 +762,6 @@ it: deletion: desc_html: Consenti a chiunque di cancellare il proprio account title: Apri la cancellazione dell'account - min_invite_role: - disabled: Nessuno - title: Permetti inviti da require_invite_text: desc_html: Quando le iscrizioni richiedono l'approvazione manuale, rendere la richiesta “Perché si desidera iscriversi?” obbligatoria invece che opzionale title: Richiedi ai nuovi utenti di rispondere alla richiesta di motivazione per l'iscrizione @@ -716,9 +774,6 @@ it: show_known_fediverse_at_about_page: desc_html: Quando attivato, mostra nell'anteprima i toot da tutte le istanze conosciute. Altrimenti mostra solo i toot locali. title: Mostra la fediverse conosciuta nell'anteprima della timeline - show_staff_badge: - desc_html: Mostra un distintivo dello staff sulla pagina dell'utente - title: Mostra badge staff site_description: desc_html: Paragrafo introduttivo nella pagina iniziale. Descrive ciò che rende speciale questo server Mastodon e qualunque altra cosa sia importante dire. Potete usare marcatori HTML, in particolare <code><a></code> e <code><em></code>. title: Descrizione del server @@ -1126,15 +1181,24 @@ it: public: Timeline pubbliche thread: Conversazioni edit: + add_keyword: Aggiungi parola chiave + keywords: Parole chiave title: Modifica filtro errors: + deprecated_api_multiple_keywords: Questi parametri non possono essere modificati da questa applicazione perché si applicano a più di una parola chiave che fa da filtro. Utilizzare un'applicazione più recente o l'interfaccia web. invalid_context: Contesto mancante o non valido - invalid_irreversible: Il filtraggio irreversibile funziona solo nei contesti di home o notifiche index: + contexts: Filtri in %{contexts} delete: Cancella empty: Non hai alcun filtro. + expires_in: Scade tra %{distance} + expires_on: Scade il %{date} + keywords: + one: "%{count} parola chiave" + other: "%{count} parole chiave" title: Filtri new: + save: Salva nuovo filtro title: Aggiungi filtro footer: developers: Sviluppatori @@ -1253,6 +1317,8 @@ it: copy_account_note_text: 'Questo utente si è spostato da %{acct}, ecco le tue note precedenti su di loro:' notification_mailer: admin: + report: + subject: "%{name} ha inviato una segnalazione" sign_up: subject: "%{name} si è iscritto" digest: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index b7139523b..cb7a1526c 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -77,10 +77,8 @@ ja: posts_tab_heading: 投稿 posts_with_replies: 投稿と返信 roles: - admin: Admin bot: Bot group: Group - moderator: Mod unavailable: プロフィールは利用できません unfollow: フォロー解除 admin: @@ -99,7 +97,6 @@ ja: avatar: アイコン by_domain: ドメイン change_email: - changed_msg: メールアドレスの変更に成功しました! current_email: 現在のメールアドレス label: メールアドレスを変更 new_email: 新しいメールアドレス @@ -180,12 +177,6 @@ ja: reset: リセット reset_password: パスワード再設定 resubscribe: 再講読 - role: 役割 - roles: - admin: 管理者 - moderator: モデレーター - staff: スタッフ - user: ユーザー search: 検索 search_same_email_domain: 同じドメインのメールアドレスを使用しているユーザー search_same_ip: 同じIPのユーザーを検索 @@ -681,9 +672,6 @@ ja: deletion: desc_html: 誰でも自分のアカウントを削除できるようにします title: アカウント削除を受け付ける - min_invite_role: - disabled: 誰にも許可しない - title: 招待の作成を許可 require_invite_text: desc_html: アカウント登録が承認制の場合、「意気込みをお聞かせください」のテキストを必須入力にする title: 新規ユーザー登録時の理由を必須入力にする @@ -696,9 +684,6 @@ ja: show_known_fediverse_at_about_page: desc_html: チェックを外すと、ランディングページからリンクされた公開タイムラインにローカルの公開投稿のみ表示します。 title: 公開タイムラインに連合先のコンテンツも表示する - show_staff_badge: - desc_html: ユーザーページにスタッフのバッジを表示します - title: スタッフバッジを表示する site_description: desc_html: フロントページへの表示に使用される紹介文です。このMastodonサーバーを特徴付けることやその他重要なことを記述してください。HTMLタグ、特に<code><a></code> と <code><em></code>が使えます。 title: サーバーの説明 @@ -1085,13 +1070,16 @@ ja: public: 公開タイムライン thread: 会話 edit: + add_keyword: キーワードを追加 + keywords: キーワード title: フィルターを編集 errors: invalid_context: 対象がないか無効です - invalid_irreversible: この機能はホームタイムラインまたは通知と一緒に指定する場合のみ機能します index: delete: 削除 empty: フィルターはありません。 + keywords: + other: "%{count}件のキーワード" title: フィルター new: title: 新規フィルターを追加 diff --git a/config/locales/ka.yml b/config/locales/ka.yml index bd02b0f8d..9948ae493 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -34,9 +34,7 @@ ka: following: იმ ადამიანს, ვინც მოგწონთ, უკვე უნდა მიჰყვებოდეთ posts_with_replies: ტუტები და პასუხები roles: - admin: ადმინისტრატორი bot: ბოტი - moderator: მოდერატორი unfollow: ნუღარ მიჰყვები admin: account_moderation_notes: @@ -48,7 +46,6 @@ ka: avatar: ავატარი by_domain: დომენი change_email: - changed_msg: ანგარიშის ელ-ფოსტა წარმატებით შეიცვალა! current_email: მიმდინარე ელ-ფოსტა label: ელ-ფოსტის შეცვლა new_email: ახალი ელ-ფოსტა @@ -102,12 +99,6 @@ ka: reset: გადატვირთვა reset_password: პაროლის გადატვირთვა resubscribe: ხელახალი გამოწერა - role: უფლებები - roles: - admin: ადმინისტრატორი - moderator: მოდერატორი - staff: სტაფი - user: მომხმარებელი search: ძებნა shared_inbox_url: გაზიარებული ინბოქსის ურლ show: @@ -254,15 +245,9 @@ ka: deletion: desc_html: უფლება მიეცით ყველას, გააუქმონ თავიანთი ანგარიში title: ღია ანგარიშის გაუქმება - min_invite_role: - disabled: არავინ - title: ნება დაერთოს მოწვეევებს show_known_fediverse_at_about_page: desc_html: ჩართვისას, ეს გამოაჩენს ტუტებს ყველა ცნობილი ფედივერსისგან პრევიუზე. სხვა შემთხვევაში, გამოაჩენს მხოლოდ ლოკალურ ტუტებს. title: გამოჩნდეს ცნობილი ვედივერსი თაიმლაინ პრევიუში - show_staff_badge: - desc_html: გამოჩნდეს სტაფის ნიშანი მომხმარებლის გვერდზე - title: სტაფის ნიშნის გამოჩენა site_description: desc_html: საშესავლო პარაგრაფი წინა გვერდზე. აღწერეთ თუ რა ხდის ამ მასტოდონის სერვერს განსაკუთრებულს და სხვა მნიშვნელოვანი. შეგიძლიათ გამოიყენოთ ჰტმლ ტეგები, კერძოდ <code><a></code> და <code><em></code>. title: ინსტანციის აღწერილობა @@ -395,7 +380,6 @@ ka: title: ფილტრის ცვლილება errors: invalid_context: მოწოდებულია არასწორი ან ცარიელი კონტექსტი - invalid_irreversible: დაუბრუნებელი ფილტრაცია მუშაობს მხოლოდ სახლის ან ნოტიფიკაციის კონტექსტში index: delete: გაუქმება title: ფილტრები diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 0db4e1c9d..4fac9a796 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -63,10 +63,8 @@ kab: posts_tab_heading: Tijewwiqin posts_with_replies: Tijewwaqin akked tririyin roles: - admin: Anedbal bot: Aṛubut group: Agraw - moderator: Atrar unavailable: Ur nufi ara amaɣnu-a unfollow: Ur ṭṭafaṛ ara admin: @@ -81,7 +79,6 @@ kab: avatar: Tugna n umaɣnu by_domain: Taɣult change_email: - changed_msg: Imayl n umiḍan yettwabeddel mebla ugur! current_email: Imayl n tura label: Beddel imayl new_email: Imayl amaynut @@ -152,12 +149,6 @@ kab: reset: Wennez reset_password: Beddel awal uffir resubscribe: Ales ajerred - role: Tisirag - roles: - admin: Anedbal - moderator: Aseɣyad - 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 @@ -446,9 +437,6 @@ kab: users: Γef yimseqdacen idiganen i yeqqnen profile_directory: title: Rmed akaram n imaγnuten - registrations: - min_invite_role: - disabled: Ula yiwen·t registrations_mode: modes: none: Yiwen·t ur yzmir ad izeddi diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 406f7e3c8..b12f79163 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -72,10 +72,8 @@ kk: posts_tab_heading: Жазба posts_with_replies: Жазбалар және жауаптар roles: - admin: Админ bot: Бот group: Топ - moderator: Мод unavailable: Профиль қолжетімді емес unfollow: Оқымау admin: @@ -92,7 +90,6 @@ kk: avatar: Аватар by_domain: Домен change_email: - changed_msg: Аккаунт email-і сәтті өзгертілді! current_email: Қазіргі email label: email өзгерту new_email: Жаңа email @@ -157,12 +154,6 @@ kk: reset: Қалпына келтіру reset_password: Құпиясөзді қалпына келтіру resubscribe: Resubscribе - role: Рұқсаттар - roles: - admin: Админ - moderator: Модератор - staff: Қызметкерлер - user: Қолданушы search: Іздеу search_same_ip: Осы ІРмен кірген басқа қолданушылар shared_inbox_url: Бөлісілген инбокс URL @@ -385,9 +376,6 @@ kk: deletion: desc_html: Allow anyone to delete their аккаунт title: Open аккаунт deletion - min_invite_role: - disabled: Ешкім - title: Allow шақырулар by registrations_mode: modes: approved: Тіркелу үшін мақұлдау қажет @@ -397,9 +385,6 @@ kk: show_known_fediverse_at_about_page: desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show жергілікті toots. title: Show known fediverse on timeline превью - show_staff_badge: - desc_html: Show a staff badge on a user бет - title: Көрсет staff badge site_description: desc_html: Introductory paragraph on the басты бет. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code><a></code> and <code><em></code>. title: Сервер туралы @@ -618,7 +603,6 @@ kk: title: Фильтр өңдеу errors: invalid_context: Жоқ немесе жарамсыз контекст берілген - invalid_irreversible: Қайтарылмайтын сүзгі тек ішкі немесе ескертпелер контекстімен жұмыс істейді index: delete: Өшіру empty: Сізде ешқандай фильтр жоқ. diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 65bc57e3a..f290318a6 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -79,10 +79,8 @@ ko: posts_tab_heading: 게시물 posts_with_replies: 게시물과 답장 roles: - admin: 관리자 bot: 봇 group: 그룹 - moderator: 중재자 unavailable: 프로필 사용 불가 unfollow: 팔로우 해제 admin: @@ -101,12 +99,17 @@ ko: avatar: 아바타 by_domain: 도메인 change_email: - changed_msg: 이메일이 성공적으로 바뀌었습니다! + changed_msg: 이메일이 성공적으로 변경되었습니다! current_email: 현재 이메일 주소 label: 이메일 주소 변경 new_email: 새 이메일 주소 submit: 이메일 주소 변경 title: "%{username}의 이메일 주소 변경" + change_role: + changed_msg: 역할이 성공적으로 변경되었습니다! + label: 역할 변경 + no_role: 역할 없음 + title: "%{username}의 역할 변경" confirm: 확인 confirmed: 확인됨 confirming: 확인 중 @@ -150,6 +153,7 @@ ko: active: 활동 all: 전체 pending: 대기중 + silenced: 제한됨 suspended: 정지 중 title: 중재 moderation_notes: 중재 기록 @@ -157,6 +161,7 @@ ko: most_recent_ip: 최근 IP no_account_selected: 아무 계정도 선택 되지 않아 아무 것도 변경 되지 않았습니다 no_limits_imposed: 제한 없음 + no_role_assigned: 할당된 역할 없음 not_subscribed: 구독하지 않음 pending: 심사 대기 perform_full_suspension: 정지시키기 @@ -182,12 +187,7 @@ ko: reset: 초기화 reset_password: 암호 초기화 resubscribe: 다시 구독 - role: 권한 - roles: - admin: 관리자 - moderator: 중재자 - staff: 스태프 - user: 사용자 + role: 역할 search: 검색 search_same_email_domain: 같은 이메일 도메인을 가진 다른 사용자들 search_same_ip: 같은 IP의 다른 사용자들 @@ -637,6 +637,65 @@ ko: unresolved: 미해결 updated_at: 업데이트 시각 view_profile: 프로필 보기 + roles: + add_new: 역할 추가 + assigned_users: + other: "%{count} 명의 사용자" + categories: + administration: 관리 + devops: 데브옵스 + invites: 초대 + moderation: 중재 + special: 특수 + delete: 삭제 + description_html: "<strong>사용자 역할</strong>을 통해, 사용자들이 마스토돈의 어떤 기능과 영역에 접근할 수 있을지 설정할 수 있습니다." + edit: "%{name} 역할 수정" + everyone: 기본 권한 + everyone_full_description_html: 이것은 <strong>모든 사용자</strong>에게 적용될 <strong>기본 역할</strong>이며, 역할을 지정하지 않아도 적용됩니다. 다른 모든 역할들은 여기에서 권한을 상속합니다. + permissions_count: + other: "%{count} 개의 권한" + privileges: + administrator: 관리자 + administrator_description: 이 권한을 가진 사용자는 모든 권한을 우회합니다 + delete_user_data: 사용자 데이터 삭제 + delete_user_data_description: 사용자가 다른 사용자의 데이터를 지체 없이 삭제할 수 있도록 허용 + invite_users: 사용자 초대 + invite_users_description: 사용자가 다른 사람들을 서버에 초대할 수 있도록 허용 + manage_announcements: 공지 관리 + manage_announcements_description: 사용자가 서버의 공지사항을 관리할 수 있도록 허용 + manage_appeals: 이의제기 관리 + manage_appeals_description: 사용자가 중재에 대한 이의제기를 리뷰할 수 있도록 허용 + manage_blocks: 차단 관리 + manage_blocks_description: 사용자가 이메일 제공자와 IP 주소를 차단할 수 있도록 허용 + manage_custom_emojis: 커스텀 에모지 관리 + manage_custom_emojis_description: 사용자가 서버의 커스텀 에모지를 관리할 수 있도록 허용 + manage_federation: 연합 관리 + manage_federation_description: 사용자가 다른 도메인과의 연합을 차단하거나 허용할 수 있도록 하고, 전달 가능 여부를 조정할 수 있도록 허용 + manage_invites: 초대 관리 + manage_invites_description: 사용자가 초대 링크를 보고 비활성화 할 수 있도록 허용 + manage_reports: 신고 관리 + manage_reports_description: 사용자가 신고를 리뷰하고 해당 사용자에 대한 중재활동을 수행할 수 있도록 허용 + manage_roles: 역할 관리 + manage_roles_description: 사용자가 그들 이하의 권한에 대해 관리하고 할당할 수 있도록 허용 + manage_rules: 규칙 관리 + manage_rules_description: 사용자가 서버 규칙을 수정할 수 있도록 허용합니다 + manage_settings: 설정 관리 + manage_settings_description: 사용자가 서버 설정을 수정할 수 있도록 허용합니다 + manage_taxonomies: 분류 관리 + manage_taxonomies_description: 사용자가 트렌드를 리뷰하고 해시태그 설정을 수정할 수 있도록 허용합니다 + manage_user_access: 사용자 접근 관리 + manage_user_access_description: 사용자가 다른 사용자의 2차 인증을 비활성화 하거나, 이메일 주소를 바꾸거나, 암호를 초기화 할 수 있도록 허용 + manage_users: 사용자 관리 + manage_users_description: 사용자가 다른 사용자의 상세정보를 보고 해당 사용자에 대한 중재활동을 할 수 있도록 허용 + manage_webhooks: 웹훅 관리 + manage_webhooks_description: 사용자가 관리용 웹훅을 설정할 수 있도록 허용 + view_audit_log: 감사 기록 보기 + view_audit_log_description: 사용자가 서버의 감사 기록을 볼 수 있도록 허용 + view_dashboard: 대시보드 보기 + view_dashboard_description: 사용자가 여러 통계정보를 볼 수 있는 대시보드에 접근할 수 있도록 허용 + view_devops: 데브옵스 + view_devops_description: Sidekiq과 pgHero 대시보드에 접근할 수 있도록 허용 + title: 역할 rules: add_new: 규칙 추가 delete: 삭제 @@ -689,9 +748,6 @@ ko: deletion: desc_html: 사용자가 자신의 계정을 삭제할 수 있도록 허용합니다 title: 계정 삭제를 허가함 - min_invite_role: - disabled: 아무도 못 하게 - title: 초대링크를 만들 수 있는 권한 require_invite_text: desc_html: 가입이 수동 승인을 필요로 할 때, "왜 가입하려고 하나요?" 항목을 선택사항으로 두는 것보다는 필수로 두는 것이 낫습니다 title: 새 사용자가 초대 요청 글을 작성해야 하도록 @@ -704,9 +760,6 @@ ko: show_known_fediverse_at_about_page: desc_html: 활성화 되면 프리뷰 페이지에서 페디버스의 모든 게시물을 표시합니다. 비활성화시 로컬에 있는 게시물만 표시 됩니다. title: 타임라인 프리뷰에 알려진 페디버스 표시하기 - show_staff_badge: - desc_html: 사용자 페이지에 스태프 배지를 표시합니다 - title: 스태프 배지 표시 site_description: desc_html: API의 소개문에 사용 됩니다.이 마스토돈 서버의 특별한 점 등을 설명하세요. HTML 태그, 주로 <code><a></code>, <code><em></code> 같은 것을 사용 가능합니다. title: 서버 설명 @@ -840,11 +893,22 @@ ko: webhooks: add_new: 엔드포인트 추가 delete: 삭제 + description_html: "<strong>웹훅</strong>은 선택한 이벤트에 대해 마스토돈이 <strong>실시간 알림</strong>을 각자의 응용프로그램에게 보냄으로서, 당신의 응용프로그램이 <strong>자동으로 반응</strong>을 할 수 있도록 만듧니다." disable: 비활성화 disabled: 비활성화됨 edit: 엔드포인트 수정 + empty: 아직 설정한 웹훅 엔드포인트가 없습니다. enable: 활성화 enabled: 활성화됨 + enabled_events: + other: "%{count}개의 이벤트가 활성화되어 있습니다" + events: 이벤트 + new: 새 웹훅 + rotate_secret: 비밀키 회전 + secret: 비밀키 서명 + status: 상태 + title: 웹훅 + webhook: 웹훅 admin_mailer: new_appeal: actions: @@ -1097,15 +1161,23 @@ ko: public: 퍼블릭 타임라인 thread: 대화 edit: + add_keyword: 키워드 추가 + keywords: 키워드 title: 필터 편집 errors: + deprecated_api_multiple_keywords: 이 파라미터들은 하나를 초과하는 필터 키워드에 적용되기 때문에 이 응용프로그램에서 수정될 수 없습니다. 더 최신의 응용프로그램이나 웹 인터페이스를 사용하세요. invalid_context: 컨텍스트가 없거나 올바르지 않습니다 - invalid_irreversible: 되돌릴 수 없는 필터링은 홈 타임라인과 알림에서만 동작합니다 index: + contexts: "%{contexts}에 대한 필터" delete: 삭제 empty: 필터가 없습니다. + expires_in: "%{distance} 안에 만료됨" + expires_on: "%{date}에 만료됨" + keywords: + other: "%{count}개의 키워드" title: 필터 new: + save: 새 필터 저장 title: 필터 추가 footer: developers: 개발자 @@ -1222,6 +1294,8 @@ ko: copy_account_note_text: '이 사용자는 %{acct}로부터 이동하였습니다. 당신의 이전 노트는 이렇습니다:' notification_mailer: admin: + report: + subject: "%{name} 님이 신고를 제출했습니다" sign_up: subject: "%{name} 님이 가입했습니다" digest: diff --git a/config/locales/ku.yml b/config/locales/ku.yml index a157dbb4e..ccc70d9c5 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -83,10 +83,8 @@ ku: 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: @@ -105,12 +103,17 @@ ku: avatar: Wêne by_domain: Navper change_email: - changed_msg: E-nameya ajimêr bi awayekî serkeftî hate guhertin! + changed_msg: E-name 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} + change_role: + changed_msg: Rol bi awayekî serkeftî hate guhertin! + label: Rolê biguherîne + no_role: Rol tune + title: Rolê biguherîne ji bo %{username} confirm: Bipejirîne confirmed: Hate pejirandin confirming: Tê pejirandin @@ -154,6 +157,7 @@ ku: active: Çalak all: Hemû pending: Tê nirxandin + silenced: Sînorkirî suspended: Sekinandî title: Çavdêrî moderation_notes: Nîşeyên Rêvebirinê @@ -161,6 +165,7 @@ ku: 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 + no_role_assigned: Ti rol nehatin diyarkirin not_subscribed: Beşdar nebû pending: Li benda nirxandinê ye perform_full_suspension: Sekinî @@ -187,12 +192,7 @@ ku: reset: Ji nû ve saz bike reset_password: Borînpeyvê 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 + role: Rol 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 @@ -651,6 +651,35 @@ ku: unresolved: Neçareserkirî updated_at: Rojanekirî view_profile: Profîlê nîşan bide + roles: + add_new: Rolê tevlî bike + assigned_users: + one: "%{count} bikarhêner" + other: "%{count} bikarhêner" + categories: + administration: Rêvebirî + devops: Devops + invites: Vexwendin + moderation: Çavdêrî + special: Taybet + delete: Jê bibe + description_html: Bi <strong>rolên bikarhêner</strong>, tu dikarî fonksiyon û deverên Mastodon ku bikarhênerên wê dikarin xwe bigihînin kesane bikî. + edit: Rolê '%{name}' serrast bike + everyone: Mafdayînên berdest + everyone_full_description_html: Ev <strong>rola bingehîn</strong> bandorê li <strong>hemû bikarhêneran</strong> dike, tevî yên bêyî rolek diyarkirî jî. Hemû rolên din mafdayînan jê digirin. + permissions_count: + one: "%{count} mafdayîn" + other: "%{count} mafdayîn" + privileges: + administrator: Rêvebir + invite_users: Bikarhêneran vexwîne + manage_custom_emojis: Emojiyên kesane bi rêve bibe + manage_invites: Vexwendinan bi rêve bibe + manage_roles: Rolan bi rêve bibe + manage_rules: Rolan bi rêve bibe + manage_settings: Sazkariyan bi rê ve bibe + manage_users: Bikarhêneran bi rêve bibe + title: Rol rules: add_new: Rêbazekê tevlî bike delete: Jê bibe @@ -703,9 +732,6 @@ ku: 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 @@ -718,9 +744,6 @@ ku: 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 <code><a></code> û <code><em></code> de. title: Danasîna rajekar @@ -1126,10 +1149,10 @@ ku: public: Demnameya gelemperî thread: Axaftin edit: + keywords: Peyvkilît 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. @@ -1253,6 +1276,8 @@ ku: 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: admin: + report: + subject: "%{name} ragihandinek şand" sign_up: subject: "%{name} tomar bû" digest: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 5846f7d5d..96119216d 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -35,9 +35,7 @@ lt: posts_tab_heading: Tootai posts_with_replies: Tootai ir atsakymai roles: - admin: Administratorius bot: Bot'as - moderator: Moderatorius unfollow: Nesekti admin: account_actions: @@ -52,7 +50,6 @@ lt: avatar: Profilio nuotrauka by_domain: Domenas change_email: - changed_msg: Paskyros el paštas sėkmingai pakeistas! current_email: Dabartinis el paštas label: Pakeisti el pašto adresą new_email: Naujas el pašto adresas @@ -112,12 +109,6 @@ lt: reset: Iš naujo reset_password: Atkurti slaptažodį resubscribe: Per prenumeruoti - role: Leidimai - roles: - admin: Administratorius - moderator: Moderatorius - staff: Personalas - user: Vartotojas search: Ieškoti shared_inbox_url: Bendroji gautųjų URL show: @@ -297,15 +288,9 @@ lt: deletion: desc_html: Leisti visiems ištrinti savo paskyrą title: Atidaryti paskyros trynimą - min_invite_role: - disabled: Nei vienas - title: Leisti pakvietimus show_known_fediverse_at_about_page: desc_html: Kai įjungta, rodys įrašus iš visos žinomos fedi-visatos. Kitokiu atvėju, rodys tik lokalius įrašus. title: Rodyti žinoma fedi-visatos laiko juosta peržiūroje - show_staff_badge: - desc_html: Rodyti personalo ženklelį vartotojo puslapyje - title: Rodyti personalo ženklelį site_description: desc_html: Introdukcinis paragrafas pagrindiniame puslapyje. Apibūdink, kas padaro šį Mastodon serverį išskirtiniu ir visa kita, kas svarbu. Nebijok naudoti HTML žymes, pavyzdžiui <code> < a ></code> bei <code><em></code>. title: Serverio apibūdinimas @@ -449,7 +434,6 @@ lt: title: Keisti filtrą errors: invalid_context: Jokio arba netinkamas pateiktas kontekstas - invalid_irreversible: Negrąžinamas filtras veikia tik namų ir priminimų kontekste index: delete: Ištrinti title: Filtrai diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 2ceec30b2..cc7306c09 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -62,7 +62,7 @@ lv: 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 + follow: Sekot followers: one: Sekotājs other: Sekotāji @@ -87,10 +87,8 @@ lv: 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: @@ -109,12 +107,17 @@ lv: avatar: Avatars by_domain: Domēns change_email: - changed_msg: Konta e-pasts veiksmīgi nomainīts! + changed_msg: 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} + change_role: + changed_msg: Loma veiksmīgi nomainīta! + label: Mainīt lomu + no_role: Nav lomas + title: Mainīt lomu %{username} confirm: Apstiprināt confirmed: Apstiprināts confirming: Apstiprina @@ -150,7 +153,7 @@ lv: remote: Attālinātie title: Atrašanās vieta login_status: Pieteikšanās statuss - media_attachments: Mediju pielikumi + media_attachments: Multivides pielikumi memorialize: Pārvērst atmiņās memorialized: Piemiņa saglabāta memorialized_msg: "%{username} veiksmīgi pārvērsts par piemiņas kontu" @@ -158,6 +161,7 @@ lv: active: Aktīvie all: Visi pending: Gaida + silenced: Ierobežotie suspended: Apturētie title: Moderācija moderation_notes: Moderācijas piezīmes @@ -165,6 +169,7 @@ lv: 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 + no_role_assigned: Loma nav piešķirta not_subscribed: Nav abonēts pending: Gaida pārskatīšanu perform_full_suspension: Apturēt @@ -192,12 +197,7 @@ lv: reset: Atiestatīt reset_password: Atiestatīt paroli resubscribe: Pieteikties vēlreiz - role: Privilēģijas - roles: - admin: Administrators - moderator: Moderators - staff: Personāls - user: Lietotājs + role: Loma 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 @@ -663,6 +663,69 @@ lv: unresolved: Neatrisinātie updated_at: Atjaunināts view_profile: Skatīt profilu + roles: + add_new: Pievienot lomu + assigned_users: + one: "%{count} lietotājs" + other: "%{count} lietotāji" + zero: "%{count} lietotāju" + categories: + administration: Administrēšana + devops: Izstrādātāji + invites: Uzaicinājumi + moderation: Moderācija + special: Īpašās + delete: Dzēst + description_html: Izmantojot <strong>lietotāju lomas</strong>, vari pielāgot, kurām Mastodon funkcijām un apgabaliem var piekļūt tavi lietotāji. + edit: Rediģēt lomu '%{name}' + everyone: Noklusētās atļaujas + everyone_full_description_html: Šī ir <strong>pamata loma</strong>, kas ietekmē <strong>visus lietotājus</strong>, pat tos, kuriem nav piešķirta loma. Visas pārējās lomas manto atļaujas no šīs. + permissions_count: + one: "%{count} atļauja" + other: "%{count} atļaujas" + zero: "%{count} atļauju" + privileges: + administrator: Administrators + administrator_description: Lietotāji ar šo atļauju apies visas atļaujas + delete_user_data: Dzēst Lietotāja Datus + delete_user_data_description: Ļauj lietotājiem bez kavēšanās dzēst citu lietotāju datus + invite_users: Uzaicināt Lietotājus + invite_users_description: Ļauj lietotājiem uzaicināt jaunus cilvēkus uz šo serveri + manage_announcements: Pārvaldīt Paziņojumus + manage_announcements_description: Ļauj lietotājiem pārvaldīt paziņojumus serverī + manage_appeals: Pārvaldīt Pārsūdzības + manage_appeals_description: Ļauj lietotājiem izskatīt apelācijas pret regulēšanas darbībām + manage_blocks: Pārvaldīt Bloķus + manage_blocks_description: Ļauj lietotājiem bloķēt e-pasta pakalpojumu sniedzējus un IP adreses + manage_custom_emojis: Pārvaldīt Pielāgotās Emocijzīmes + manage_custom_emojis_description: Ļauj lietotājiem pārvaldīt pielāgotās emocijzīmes serverī + manage_federation: Pārvaldīt Federāciju + manage_federation_description: Ļauj lietotājiem bloķēt vai atļaut federāciju ar citiem domēniem un kontrolēt piegādi + manage_invites: Pārvaldīt Uzaicinājumus + manage_invites_description: Ļauj lietotājiem pārlūkot un deaktivizēt uzaicinājuma saites + manage_reports: Pārvaldīt Pārskatus + manage_reports_description: Ļauj lietotājiem pārskatīt pārskatus un veikt pret tiem regulēšanas darbības + manage_roles: Pārvaldīt Lomas + manage_roles_description: Ļauj lietotājiem pārvaldīt un piešķirt lomas, kas ir zemākas par viņu lomu + manage_rules: Pārvaldīt Noteikumus + manage_rules_description: Ļauj lietotājiem mainīt servera noteikumus + manage_settings: Pārvaldīt Iestatījumus + manage_settings_description: Ļauj lietotājiem mainīt vietnes uzstādījumus + manage_taxonomies: Pārvaldīt Taksonomijas + manage_taxonomies_description: Ļauj lietotājiem pārskatīt aktuālo saturu un atjaunināt atsauces iestatījumus + manage_user_access: Pārvaldīt Lietotāju Piekļuves + manage_user_access_description: Ļauj lietotājiem atspējot citu lietotāju divu faktoru autentifikāciju, mainīt savu e-pasta adresi un atiestatīt paroli + manage_users: Pārvaldīt Lietotājus + manage_users_description: Ļauj lietotājiem skatīt citu lietotāju informāciju un veikt pret viņiem regulēšanas darbības + manage_webhooks: Pārvaldīt Tīmekļa Aizķeres + manage_webhooks_description: Ļauj lietotājiem iestatīt tīmekļa aizķeres administratīviem pasākumiem + view_audit_log: Skatīt Audita Žurnālu + view_audit_log_description: Ļauj lietotājiem redzēt serverī veikto administratīvo darbību vēsturi + view_dashboard: Skatīt Informācijas Paneli + view_dashboard_description: Ļauj lietotājiem piekļūt informācijas panelim un dažādiem rādītājiem + view_devops: Izstrādātāji + view_devops_description: Ļauj lietotājiem piekļūt Sidekiq un pgHero informācijas paneļiem + title: Lomas rules: add_new: Pievienot noteikumu delete: Dzēst @@ -715,9 +778,6 @@ lv: 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 @@ -730,9 +790,6 @@ lv: 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āda personāla emblēmu lietotāja lapā - title: Parādīt personāla emblēmu site_description: desc_html: Ievadpunkts par API. Apraksti, kas padara šo Mastodon serveri īpašu, un jebko citu svarīgu. Vari izmantot HTML tagus, jo īpaši <code><a></code> un <code><em></code>. title: Servera apraksts @@ -1142,15 +1199,25 @@ lv: public: Publiskās ziņu lentas thread: Sarunas edit: + add_keyword: Pievienot atslēgvārdu + keywords: Atslēgvārdi title: Rediģēt filtru errors: + deprecated_api_multiple_keywords: Šos parametrus šajā lietojumprogrammā nevar mainīt, jo tie attiecas uz vairāk nekā vienu filtra atslēgvārdu. Izmanto jaunāku lietojumprogrammu vai tīmekļa saskarni. invalid_context: Nav, vai piegādāts nederīgs konteksts - invalid_irreversible: Neatgriezeniskā filtrēšana darbojas tikai sākuma vai paziņojumu kontekstā index: + contexts: Filtri %{contexts} delete: Dzēst empty: Tev nav filtru. + expires_in: Beidzas %{distance} + expires_on: Beidzas %{date} + keywords: + one: "%{count} atsēgvārds" + other: "%{count} atslēgvārdi" + zero: "%{count} atslēgvārdu" title: Filtri new: + save: Saglabāt jauno filtru title: Pievienot jaunu filtru footer: developers: Izstrādātāji @@ -1271,6 +1338,8 @@ lv: copy_account_note_text: 'Šis lietotājs pārcēlās no %{acct}, šeit bija tavas iepriekšējās piezīmes par viņu:' notification_mailer: admin: + report: + subject: "%{name} iesniedza ziņojumu" sign_up: subject: "%{name} ir pierakstījies" digest: diff --git a/config/locales/ml.yml b/config/locales/ml.yml index f035633ca..76a3ec07c 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -35,7 +35,6 @@ ml: posts_tab_heading: ടൂട്ടുകൾ posts_with_replies: ടൂട്ടുകളും മറുപടികളും roles: - admin: അഡ്മിന് bot: ബോട്ട് group: ഗ്രൂപ്പ് unavailable: പ്രൊഫൈൽ ലഭ്യമല്ല @@ -47,7 +46,6 @@ ml: avatar: അവതാർ by_domain: മേഖല change_email: - changed_msg: അംഗത്തിന്റെ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം വിജയകരമായി മാറ്റിയിരിക്കുന്നു! current_email: ഇപ്പോഴത്തെ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം label: മാറിയ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം new_email: പുതിയ ഇലക്ട്രോണിക് കത്ത് @@ -83,9 +81,6 @@ ml: success: സ്ഥിരീകരണ ഇമെയിൽ വിജയകരമായി അയച്ചു! reset: പുനഃക്രമീകരിക്കുക reset_password: പാസ്വേഡ് പുനഃക്രമീകരിക്കുക - role: അനുമതികൾ - roles: - user: ഉപയോക്താവ് search: തിരയുക title: അക്കൗണ്ടുകൾ unconfirmed_email: സ്ഥിരീകരിക്കാത്ത ഇമെയിൽ diff --git a/config/locales/ms.yml b/config/locales/ms.yml index d400d3256..36aa351d9 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -75,10 +75,8 @@ ms: posts_tab_heading: Hantaran posts_with_replies: Hantaran dan balasan roles: - admin: Pentadbir bot: Bot group: Kumpulan - moderator: Penyederhana unavailable: Profil tidak tersedia unfollow: Nyahikut admin: @@ -97,7 +95,6 @@ ms: avatar: Avatar by_domain: Domain change_email: - changed_msg: E-mel akaun telah berjaya ditukar! current_email: E-mel semasa label: Ubah e-mel new_email: E-mel baharu @@ -172,12 +169,6 @@ ms: reset: Tetapkan semula reset_password: Tetapkan semula kata laluan resubscribe: Langgan semula - role: Kebenaran - roles: - admin: Pentadbir - moderator: Penyederhana - staff: Kakitangan - user: Pengguna search: Cari search_same_email_domain: Pengguna lain dengan domain e-mel yang sama search_same_ip: Pengguna lain dengan alamat IP yang sama @@ -529,9 +520,6 @@ ms: 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 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index db49efbb9..caf3370d8 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -36,7 +36,7 @@ nl: one: toot other: berichten status_count_before: Zij schreven - tagline: Gedecentraliseerd sociaal netwerk + tagline: Decentraal sociaal netwerk terms: Gebruiksvoorwaarden unavailable_content: Gemodereerde servers unavailable_content_description: @@ -81,10 +81,8 @@ nl: posts_tab_heading: Berichten posts_with_replies: Berichten en reacties roles: - admin: Beheerder bot: Bot group: Groep - moderator: Moderator unavailable: Profiel niet beschikbaar unfollow: Ontvolgen admin: @@ -103,12 +101,17 @@ nl: avatar: Avatar by_domain: Domein change_email: - changed_msg: E-mailadres van account succesvol veranderd! + changed_msg: E-mailadres succesvol veranderd! current_email: Huidig e-mailadres label: E-mailadres wijzigen new_email: Nieuw e-mailadres submit: E-mailadres veranderen title: E-mailadres wijzigen voor %{username} + change_role: + changed_msg: Rol succesvol veranderd! + label: Rol veranderen + no_role: Geen rol + title: Rol van %{username} veranderen confirm: Bevestigen confirmed: Bevestigd confirming: Bevestiging @@ -135,7 +138,7 @@ nl: invite_request_text: Redenen om te registreren invited_by: Uitgenodigd door ip: IP - joined: Geregistreerd in + joined: Geregistreerd location: all: Alles local: Lokaal @@ -150,6 +153,7 @@ nl: active: Actief all: Alles pending: In afwachting + silenced: Beperkt suspended: Opgeschort title: Moderatie moderation_notes: Opmerkingen voor moderatoren @@ -157,10 +161,11 @@ nl: most_recent_ip: Laatst gebruikt IP-adres no_account_selected: Er zijn geen accounts veranderd, omdat er geen een was geselecteerd no_limits_imposed: Geen limieten ingesteld + no_role_assigned: Geen rol toegewezen not_subscribed: Niet geabonneerd pending: Moet nog beoordeeld worden perform_full_suspension: Opschorten - previous_strikes: Vorige overtredingen + previous_strikes: Eerdere overtredingen previous_strikes_description_html: one: Dit account heeft <strong>één</strong> overtreding. other: Dit account heeft <strong>%{count}</strong> overtredingen. @@ -170,7 +175,7 @@ nl: push_subscription_expires: PuSH-abonnement verloopt op redownload: Profiel vernieuwen redownloaded_msg: Het herstellen van het oorspronkelijke profiel van %{username} is geslaagd - reject: Afkeuren + reject: Afwijzen rejected_msg: Het afwijzen van het registratieverzoek van %{username} is geslaagd remove_avatar: Avatar verwijderen remove_header: Omslagfoto verwijderen @@ -183,15 +188,13 @@ nl: reset: Opnieuw reset_password: Wachtwoord opnieuw instellen resubscribe: Opnieuw abonneren - role: Bevoegdheden - roles: - admin: Beheerder - moderator: Moderator - staff: Medewerkers - user: Gebruiker + role: Rol search: Zoeken search_same_email_domain: Andere gebruikers met hetzelfde e-maildomein search_same_ip: Andere gebruikers met hetzelfde IP-adres + security_measures: + only_password: Alleen wachtwoord + password_and_2fa: Wachtwoord en tweestapsverificatie sensitive: Gevoelig forceren sensitized: als gevoelig gemarkeerd shared_inbox_url: Gedeelde inbox-URL @@ -201,11 +204,14 @@ nl: silence: Beperken silenced: Beperkt statuses: Berichten + strikes: Eerdere overtredingen subscribe: Abonneren + suspend: Opschorten suspended: Opgeschort suspension_irreversible: De gegevens van dit account zijn onomkeerbaar verwijderd. Je kunt het opschorten van dit account ongedaan maken zodat het weer valt te gebruiken, maar de verwijderde gegevens worden hiermee niet hersteld. suspension_reversible_hint_html: Dit account is opgeschort en de gegevens worden volledig verwijderd op %{date}. Tot die tijd kan dit account worden hersteld zonder nadelige gevolgen. Wanneer je alle gegevens van dit account onmiddellijk wilt verwijderen, kun je dit hieronder doen. title: Accounts + unblock_email: E-mailadres deblokkeren unconfirmed_email: Onbevestigd e-mailadres undo_sensitized: Niet meer als gevoelig forceren undo_silenced: Niet langer beperken @@ -220,6 +226,8 @@ nl: whitelisted: Goedgekeurd voor federatie action_logs: action_types: + approve_appeal: Bezwaar goedkeuren + approve_user: Gebruiker goedkeuren assigned_to_self_report: Rapportage toewijzen change_email_user: E-mailadres van gebruiker wijzigen confirm_user: Gebruiker bevestigen @@ -237,6 +245,7 @@ nl: destroy_domain_allow: Domeingoedkeuring verwijderen destroy_domain_block: Domeinblokkade verwijderen destroy_email_domain_block: Blokkade van e-maildomein verwijderen + destroy_instance: Domein volledig verwijderen destroy_ip_block: IP-regel verwijderen destroy_status: Toot verwijderen destroy_unavailable_domain: Niet beschikbaar domein verwijderen @@ -247,6 +256,8 @@ nl: enable_user: Gebruiker inschakelen memorialize_account: Het account in een In memoriam veranderen promote_user: Gebruiker promoveren + reject_appeal: Bezwaar afwijzen + reject_user: Gebruiker afwijzen remove_avatar_user: Avatar verwijderen reopen_report: Rapportage heropenen reset_password_user: Wachtwoord opnieuw instellen @@ -255,6 +266,7 @@ nl: silence_account: Account beperken suspend_account: Account opschorten unassigned_report: Rapportage niet langer toewijzen + unblock_email_account: E-mailadres deblokkeren unsensitive_account: De media in jouw account niet langer als gevoelig markeren unsilence_account: Account niet langer beperken unsuspend_account: Account niet langer opschorten @@ -263,6 +275,7 @@ nl: update_domain_block: Domeinblokkade bijwerken update_status: Bericht bijwerken actions: + approve_appeal_html: "%{name} heeft het bezwaar tegen de moderatie-actie van %{target} goedgekeurd" 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 @@ -290,6 +303,8 @@ nl: 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 + reject_appeal_html: "%{name} heeft het bezwaar tegen de moderatie-actie van %{target} afgewezen" + reject_user_html: "%{name} heeft de registratie van %{target} afgewezen" 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 @@ -360,9 +375,26 @@ nl: updated_msg: Bijwerken van emoji is geslaagd! upload: Uploaden dashboard: + active_users: actieve gebruikers + interactions: interacties + media_storage: Opgeslagen mediabestanden + new_users: nieuwe gebruikers + opened_reports: aangemaakte rapportages + pending_appeals_html: + one: "<strong>%{count}</strong> bezwaar te beoordelen" + other: "<strong>%{count}</strong> bezwaren te beoordelen" + resolved_reports: opgeloste rapportages software: Software + sources: Locatie van registratie space: Ruimtegebruik title: Dashboard + top_languages: Meest actieve talen + top_servers: Meest actieve servers + website: Website + disputes: + appeals: + empty: Geen bezwaren gevonden. + title: Bezwaren domain_allows: add_new: Federatie met domein goedkeuren created_msg: Federatie met domein is succesvol goedgekeurd @@ -400,6 +432,9 @@ nl: add_new: Nieuwe toevoegen created_msg: Blokkeren e-maildomein geslaagd delete: Verwijderen + dns: + types: + mx: MX-record domain: Domein new: create: Blokkeren @@ -414,13 +449,37 @@ nl: title: Aanbevolen accounts unsuppress: Account weer aanbevelen instances: + availability: + title: Beschikbaarheid + warning: De laatste poging om met deze server te verbinden was onsuccesvol back_to_all: Alles back_to_limited: Beperkt back_to_warning: Waarschuwing by_domain: Domein + content_policies: + comment: Interne reden + description_html: Je kunt het beleid bepalen dat op de accounts van dit domein en alle subdomeinen van toepassing is. + policies: + reject_media: Mediabestanden weigeren + reject_reports: Rapportages weigeren + silence: Beperkt + suspend: Opgeschort + policy: Zwaarte + reason: Publieke reden + title: Beleid + dashboard: + instance_accounts_dimension: Meest door ons gevolgde accounts + instance_accounts_measure: opgeslagen accounts + instance_followers_measure: daar ons daar gevolgd + instance_follows_measure: door hun hier gevolgd + instance_languages_dimension: Meest actieve talen + instance_media_attachments_measure: opgeslagen mediabestanden + instance_reports_measure: rapportages over hun + instance_statuses_measure: opgeslagen berichten delivery: all: Alles clear: Bezorgfouten weghalen + failing: Problemen restart: Bezorging herstarten stop: Bezorging beëindigen unavailable: Niet beschikbaar @@ -434,6 +493,7 @@ nl: title: Moderatie private_comment: Privé-opmerking public_comment: Openbare opmerking + purge: Volledig verwijderen title: Federatie total_blocked_by_us: Door ons geblokkeerd total_followed_by_them: Door hun gevolgd @@ -489,14 +549,17 @@ nl: notes: one: "%{count} opmerking" other: "%{count} opmerkingen" + action_log: Auditlog action_taken_by: Actie uitgevoerd door are_you_sure: Weet je het zeker? assign_to_self: Aan mij toewijzen assigned: Toegewezen moderator by_target_domain: Domein van gerapporteerde account + category: Category comment: none: Geen created_at: Gerapporteerd op + delete_and_resolve: Bericht verwijderen forwarded: Doorgestuurd forwarded_to: Doorgestuurd naar %{domain} mark_as_resolved: Markeer als opgelost @@ -507,17 +570,22 @@ nl: create_and_unresolve: Heropenen met opmerking delete: Verwijderen placeholder: Beschrijf welke acties zijn ondernomen of andere gerelateerde opmerkingen… + title: Opmerkingen reopen: Rapportage heropenen report: 'Rapportage #%{id}' reported_account: Gerapporteerde account reported_by: Gerapporteerd door resolved: Opgelost resolved_msg: Rapportage succesvol opgelost! - status: Bericht + status: Rapportages + target_origin: Herkomst van de gerapporteerde accounts title: Rapportages unassign: Niet langer toewijzen unresolved: Onopgelost updated_at: Bijgewerkt + view_profile: Profiel bekijken + roles: + add_new: Rol toevoegen rules: add_new: Regel toevoegen delete: Verwijderen @@ -570,9 +638,6 @@ nl: deletion: desc_html: Toestaan dat iedereen diens eigen account kan verwijderen title: Verwijderen account toestaan - 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 @@ -585,9 +650,6 @@ nl: show_known_fediverse_at_about_page: desc_html: Wanneer ingeschakeld wordt de globale tijdlijn op de voorpagina getoond en wanneer uitgeschakeld de lokale tijdlijn title: De globale tijdlijn op de openbare tijdlijnpagina tonen - show_staff_badge: - desc_html: Medewerkersbadge op profielpagina tonen - title: Medewerkersbadge tonen site_description: desc_html: Introductie-alinea voor de API. Beschrijf wat er speciaal is aan deze server en andere zaken die van belang zijn. Je kan HTML gebruiken, zoals <code><a></code> en <code><em></code>. title: Omschrijving Mastodonserver (API) @@ -619,12 +681,17 @@ nl: destroyed_msg: Verwijderen website-upload geslaagd! statuses: back_to_account: Terug naar accountpagina + batch: + report: Rapportage deleted: Verwijderd media: title: Media no_status_selected: Er werden geen berichten gewijzigd, omdat er geen enkele werd geselecteerd title: Berichten van account with_media: Met media + strikes: + appeal_approved: Bezwaar ingediend + appeal_pending: Bezwaar in behandeling 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 @@ -637,6 +704,20 @@ nl: review: Status beoordelen updated_msg: Instellingen hashtag succesvol bijgewerkt title: Beheer + trends: + allow: Toestaan + disallow: Weigeren + links: + allow: Link toestaan + allow_provider: Uitgever toestaan + title: Trending links + only_allowed: Alleen toegestaan + pending_review: In afwachting van beoordeling + preview_card_providers: + title: Uitgevers + rejected: Afgewezen + statuses: + allow: Bericht toestaan warning_presets: add_new: Nieuwe toevoegen delete: Verwijderen @@ -644,8 +725,20 @@ nl: empty: Je hebt nog geen presets voor waarschuwingen toegevoegd. title: Presets voor waarschuwingen beheren admin_mailer: + new_appeal: + actions: + delete_statuses: het verwijderen van diens berichten + disable: het bevriezen van diens account + mark_statuses_as_sensitive: het markeren van diens berichten als gevoelig + none: een waarschuwing + sensitive: het gevoelig forceren van diens account + silence: het beperken van diens account + suspend: het opschorten van diens account + body: "%{target} maakt bezwaar tegen een moderatie-actie door %{action_taken_by} op %{date}, betreffende %{type}. De gebruiker schrijft:" + next_steps: Je kunt het bezwaar goedkeuren om daarmee de moderatie-actie ongedaan te maken, of je kunt het verwerpen. + subject: "%{username} maakt bezwaar tegen een moderatie-actie op %{instance}" new_pending_account: - body: Zie hieronder de details van het nieuwe account. Je kunt de aanvraag goedkeuren of afkeuren. + body: Zie hieronder de details van het nieuwe account. Je kunt de aanvraag goedkeuren of afwijzen. subject: Er dient een nieuw account op %{instance} te worden beoordeeld (%{username}) new_report: body: "%{reporter} heeft %{target} gerapporteerd" @@ -789,14 +882,26 @@ nl: explore_mastodon: "%{title} verkennen" disputes: strikes: - appeal: Beroep - appeal_approved: Het aangetekende beroep is goedgekeurd en deze overtreding is niet langer geldig - appeal_rejected: Het aangetekende beroep is afgewezen - appeal_submitted_at: Beroep aangetekend - appealed_msg: Jouw aangetekende beroep is ingediend. Wanneer deze wordt goedgekeurd, krijg je hiervan bericht. + appeal: Bezwaar + appeal_approved: Het ingediende bezwaar is goedgekeurd en de eerder vastgestelde overtreding is niet langer geldig + appeal_rejected: Het ingediende bezwaar is afgewezen + appeal_submitted_at: Bezwaar ingediend + appealed_msg: Jouw bezwaar is ingediend. Wanneer deze wordt goedgekeurd, krijg je hiervan bericht. appeals: - submit: Beroep aantekenen - approve_appeal: Beroep goedkeuren + submit: Bezwaar indienen + approve_appeal: Bezwaar goedkeuren + reject_appeal: Bezwaar afgewezen + title_actions: + delete_statuses: Verwijdering bericht + disable: Bevriezen van account + mark_statuses_as_sensitive: Berichten als gevoelig markeren + none: Waarschuwing + sensitive: Volledige account als gevoelig markeren + silence: Beperking account + suspend: Opschorting account + your_appeal_approved: Jouw bezwaar is goedgekeurd + your_appeal_pending: Je hebt een bezwaar ingediend + your_appeal_rejected: Jouw bezwaar is afgewezen domain_validator: invalid_domain: is een ongeldige domeinnaam errors: @@ -845,15 +950,24 @@ nl: public: Openbare tijdlijnen thread: Gesprekken edit: + add_keyword: Trefwoord toevoegen + keywords: Trefwoorden title: Filter bewerken errors: + deprecated_api_multiple_keywords: Deze instellingen kunnen niet via deze applicatie worden veranderd, omdat er meer dan één trefwoord wordt gebruikt. Gebruik een meer recente applicatie of de webomgeving. invalid_context: Geen of ongeldige context verstrekt - invalid_irreversible: Onomkeerbaar filteren werkt alleen met de starttijdlijn en meldingen index: + contexts: Filters in %{contexts} delete: Verwijderen empty: Je hebt geen filters aangemaakt. + expires_in: Vervalt na %{distance} + expires_on: Vervalt op %{date} + keywords: + one: "%{count} trefwoord" + other: "%{count} trefwoorden" title: Filters new: + save: Nieuwe filter opslaan title: Nieuw filter toevoegen footer: developers: Ontwikkelaars @@ -917,6 +1031,12 @@ nl: lists: errors: limit: Je hebt het maximaal aantal lijsten bereikt + login_activities: + authentication_methods: + otp: tweestapsverificatie-app + password: wachtwoord + sign_in_token: beveiligingscode via e-mail + webauthn: beveiligingssleutels media_attachments: validations: images_and_video: Een video kan niet aan een bericht met afbeeldingen worden gekoppeld @@ -960,6 +1080,9 @@ nl: carry_mutes_over_text: Deze gebruiker is verhuisd vanaf %{acct}. Je hebt dat account genegeerd. copy_account_note_text: 'Deze gebruiker is verhuisd vanaf %{acct}. Je hebt de volgende opmerkingen over dat account gemaakt:' notification_mailer: + admin: + report: + subject: "%{name} heeft een rapportage ingediend" digest: action: Alle meldingen bekijken body: Hier is een korte samenvatting van de berichten die je sinds jouw laatste bezoek op %{since} hebt gemist @@ -1188,10 +1311,23 @@ nl: public_long: Aan iedereen tonen, ook op openbare tijdlijnen unlisted: Minder openbaar unlisted_long: Aan iedereen tonen, maar niet op openbare tijdlijnen + statuses_cleanup: + min_age: + '1209600': 2 weken + '15778476': 6 maanden + '2629746': 1 maand + '31556952': 1 jaar + '5259492': 2 maanden + '604800': 1 week + '63113904': 2 jaar + '7889238': 3 maanden stream_entries: pinned: Vastgemaakt bericht reblogged: boostte sensitive_content: Gevoelige inhoud + strikes: + errors: + too_late: De periode dat je bezwaar kon maken is verstreken tags: does_not_match_previous_name: komt niet overeen met de vorige naam terms: @@ -1301,11 +1437,31 @@ nl: recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. <strong>Zorg ervoor dat je de herstelcodes op een veilige plek bewaard</strong>. Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren. webauthn: Beveiligingssleutels user_mailer: + appeal_approved: + action: Ga naar je account + explanation: Het bezwaar tegen een door een moderator vastgestelde overtreding van jou op %{strike_date}, ingediend op %{appeal_date}, is goedgekeurd. De eerder vastgestelde overtreding is hierbij niet langer geldig. + subject: Jouw bezwaar van %{date} is goedgekeurd + title: Bezwaar goedgekeurd + appeal_rejected: + explanation: Het bezwaar tegen een door een moderator vastgestelde overtreding van jou op %{strike_date}, ingediend op %{appeal_date}, is afgewezen. De vastgestelde overtreding blijft daarom ongewijzigd. + subject: Jouw bezwaar van %{date} is afgewezen + title: Bezwaar afgewezen backup_ready: explanation: Je hebt een volledige back-up van jouw Mastodon-account opgevraagd. Het staat nu klaar om te worden gedownload! subject: Jouw archief staat klaar om te worden gedownload title: Archief ophalen + suspicious_sign_in: + title: Een nieuwe registratie warning: + appeal: Bezwaar indienen + appeal_description: Wanneer je denkt dat dit een fout is, kun je een bezwaar indienen bij de medewerkers van %{instance}. + categories: + spam: Spam + explanation: + mark_statuses_as_sensitive: Sommige van jouw berichten zijn als gevoelig gemarkeerd door de moderatoren van %{instance}. Dit betekent dat mensen op de media in de berichten moeten klikken/tikken om deze weer te geven. Je kunt media in de toekomst ook zelf als gevoelig markeren. + sensitive: Vanaf nu worden al jouw geüploade media als gevoelig gemarkeerd en verborgen achter een waarschuwing. + reason: 'Reden:' + statuses: 'Gerapporteerde berichten:' subject: disable: Jouw account %{acct} is bevroren none: Waarschuwing voor %{acct} diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 5218270da..14f9b95ad 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -74,10 +74,8 @@ nn: posts_tab_heading: Tut posts_with_replies: Tut og svar roles: - admin: Administrator bot: Robot group: Gruppe - moderator: Moderator unavailable: Profil ikkje tilgjengeleg unfollow: Slutt å fylgja admin: @@ -96,7 +94,6 @@ nn: avatar: Bilete by_domain: Domene change_email: - changed_msg: Konto-e-posten er endra! current_email: Noverande e-post label: Byt e-post new_email: Ny e-post @@ -173,12 +170,6 @@ nn: reset: Attstill reset_password: Attstill passord resubscribe: Ting på nytt - role: Løyve - roles: - admin: Administrator - 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 @@ -529,9 +520,6 @@ nn: deletion: desc_html: Tillat alle å sletta kontoen sin title: Åpne kontosletting - 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 @@ -543,9 +531,6 @@ nn: 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 site_description: desc_html: Vises som et avsnitt på forsiden og brukes som en meta-tagg. Du kan bruke HTML-tagger, spesielt <code><a></code> og <code><em></code>. title: Tenarskilding diff --git a/config/locales/no.yml b/config/locales/no.yml index 30b7a56fb..13f13d8bd 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -77,10 +77,8 @@ posts_tab_heading: Tuter posts_with_replies: Tuter med svar roles: - admin: Administrator bot: Bot group: Gruppe - moderator: Moderere unavailable: Profilen er utilgjengelig unfollow: Slutt å følge admin: @@ -99,7 +97,6 @@ avatar: Profilbilde by_domain: Domene change_email: - changed_msg: Konto-E-postadressen ble vellykket endret! current_email: Nåværende E-post label: Endre e-post new_email: Ny E-post @@ -176,12 +173,6 @@ reset: Tilbakestill reset_password: Nullstill passord resubscribe: Abonner på nytt - role: Rettigheter - roles: - admin: Administrator - 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 @@ -529,9 +520,6 @@ deletion: desc_html: Tillat alle å slette sin konto title: Åpne kontosletting - 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 @@ -543,9 +531,6 @@ 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 site_description: desc_html: Vises som et avsnitt på forsiden og brukes som en meta-tagg. Du kan bruke HTML-tagger, spesielt <code><a></code> og <code><em></code>. title: Nettstedsbeskrivelse diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 57cecbdc4..463940567 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -71,10 +71,8 @@ oc: posts_tab_heading: Tuts posts_with_replies: Tuts e responsas roles: - admin: Admin bot: Robòt group: Grop - moderator: Moderador unavailable: Perfil indisponible unfollow: Quitar de sègre admin: @@ -92,7 +90,6 @@ oc: avatar: Avatar by_domain: Domeni change_email: - changed_msg: Adreça corrèctament cambiada ! current_email: Adreça actuala label: Cambiar d’adreça new_email: Novèla adreça @@ -160,12 +157,6 @@ oc: reset: Reïnicializar reset_password: Reïnicializar lo senhal resubscribe: Se tornar abonar - role: Autorizacions - roles: - admin: Administrator - moderator: Moderador - staff: Personnal - user: Uitlizaire search: Cercar search_same_ip: Autres utilizaires amb la meteissa IP security_measures: @@ -475,9 +466,6 @@ oc: deletion: desc_html: Autorizar lo monde a suprimir lor compte title: Possibilitat de suprimir lo compte - min_invite_role: - disabled: Degun - title: Autorizat amb invitacions registrations_mode: modes: approved: Validacion necessària per s’inscriure @@ -487,9 +475,6 @@ oc: show_known_fediverse_at_about_page: desc_html: Un còp activat mostrarà los tuts de totes los fediverse dins l’apercebut. Autrament mostrarà pas que los tuts locals. title: Mostrar los fediverse coneguts dins l’apercebut del flux - show_staff_badge: - desc_html: Mostrar lo badge Personal sus la pagina de perfil - title: Mostrar lo badge personal site_description: desc_html: Paragraf d’introduccion sus la pagina d’acuèlh. Explicatz çò que fa diferent aqueste servidor Mastodon e tot çò qu’es important de dire. Podètz utilizare de balises HTML, en particular <code><a></code> e<code><em></code>. title: Descripcion del servidor @@ -711,7 +696,6 @@ oc: title: Modificar lo filtre errors: invalid_context: Cap de contèxte o contèxte invalid fornit - invalid_irreversible: Lo filtratge irreversible fonciona pas qu’amb lo flux d’actualitat o en contèxte de notificacion index: delete: Suprimir empty: Avètz pas cap de filtre. diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 7557ab83f..2d49d756d 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -40,6 +40,7 @@ pl: one: wpisu other: wpisów status_count_before: Są autorami + tagline: Zdecentralizowana sieć społecznościowa terms: Zasady użytkowania unavailable_content: Niedostępne treści unavailable_content_description: @@ -90,10 +91,8 @@ pl: posts_tab_heading: Wpisy posts_with_replies: Wpisy z odpowiedziami roles: - admin: Administrator bot: Bot group: Grupa - moderator: Moderator unavailable: Profil niedostępny unfollow: Przestań śledzić admin: @@ -112,12 +111,17 @@ pl: avatar: Awatar by_domain: Domena change_email: - changed_msg: Pomyślnie zmieniono adres e-mail konta! + changed_msg: Pomyślnie zmieniono adres e-mail! current_email: Obecny adres e-mail label: Zmień adres e-mail new_email: Nowy adres e-mail submit: Zmień adres e-mail title: Zmień adres e-mail dla %{username} + change_role: + changed_msg: Pomyślnie zmieniono rolę! + label: Zmień rolę + no_role: Brak roli + title: Zmień rolę dla %{username} confirm: Potwierdź confirmed: Potwierdzono confirming: Potwierdzanie @@ -161,6 +165,7 @@ pl: active: Aktywne all: Wszystkie pending: Oczekujące + silenced: Ograniczone suspended: Zawieszone title: Moderacja moderation_notes: Notatki moderacyjne @@ -168,6 +173,7 @@ pl: most_recent_ip: Ostatnie IP no_account_selected: Żadne konto nie zostało zmienione, bo żadne nie zostało wybrane no_limits_imposed: Nie nałożono ograniczeń + no_role_assigned: Nie przypisano żadnej roli not_subscribed: Nie zasubskrybowano pending: Oczekuje na przegląd perform_full_suspension: Zawieś @@ -196,12 +202,7 @@ pl: reset: Resetuj reset_password: Resetuj hasło resubscribe: Ponów subskrypcję - role: Uprawnienia - roles: - admin: Administrator - moderator: Moderator - staff: Ekipa - user: Użytkownik + role: Rola 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 @@ -499,6 +500,11 @@ pl: unsuppress: Przywróć polecenie śledzenia konta instances: availability: + description_html: + few: Jeśli dostarczenie do domeny nie powiedzie się <strong>%{count} dni</strong> bez powodzenia, nie zostaną podjęte dalsze próby dostawy, chyba że otrzymano dostawę <em>od</em> domeny. + many: Jeśli dostarczenie do domeny nie powiedzie się <strong>%{count} dni</strong> bez powodzenia, nie zostaną podjęte dalsze próby dostawy, chyba że otrzymano dostawę <em>od</em> domeny. + one: Jeśli dostarczenie do domeny nie powiedzie się <strong>%{count} dzień</strong> bez powodzenia, nie zostaną podjęte dalsze próby dostawy, chyba że otrzymano dostawę <em>od</em> domeny. + other: Jeśli dostarczenie do domeny nie powiedzie się <strong>%{count} dni</strong> bez powodzenia, nie zostaną podjęte dalsze próby dostawy, chyba że otrzymano dostawę <em>od</em> domeny. failure_threshold_reached: Próg niepowodzenia osiągnięty dnia %{date}. failures_recorded: few: Nieudane próby w %{count} różnych dniach. @@ -671,6 +677,62 @@ pl: unresolved: Nierozwiązane updated_at: Zaktualizowano view_profile: Wyświetl profil + roles: + add_new: Dodaj rolę + assigned_users: + few: "%{count} użytkowników" + many: "%{count} użytkowników" + one: "%{count} użytkownik" + other: "%{count} użytkowników" + categories: + administration: Administracja + devops: DevOps + invites: Zaproszenia + moderation: Moderacja + special: Specjalne + delete: Usuń + description_html: Za pomocą <strong>ról użytkowników</strong>możesz dostosowywać funkcje i obszary Mastodon, do których użytkownicy mogą uzyskać dostęp. + edit: Edytuj rolę '%{name}' + everyone: Domyślnie uprawnienia + everyone_full_description_html: To jest <strong>rola podstawowa</strong> wpływająca na <strong>wszystkich użytkowników</strong>, nawet tych, którzy nie mają przypisanej roli. Wszystkie inne role dziedziczą z niej uprawnienia. + privileges: + administrator: Administrator + administrator_description: Użytkownicy z tym uprawnieniem omijają każde uprawnienie + delete_user_data: Usuń dane użytkownika + delete_user_data_description: Pozwala użytkownikom na bezzwłoczne usuwanie danych innych użytkowników + invite_users: Zaproś użytkowników + invite_users_description: Pozwala użytkownikom zapraszać nowych ludzi na serwer + manage_announcements: Zarządzaj ogłoszeniami + manage_announcements_description: Pozwala użytkownikom zarządzać ogłoszeniami na serwerze + manage_appeals: Zarządzaj odwołaniami + manage_appeals_description: Pozwala użytkownikom przeglądać odwołania od działań moderacyjnych + manage_blocks: Zarządzaj blokami + manage_blocks_description: Pozwala użytkownikom na blokowanie dostawców poczty elektronicznej i adresów IP + manage_custom_emojis: Zarządzaj niestandardowymi emoji + manage_custom_emojis_description: Pozwala użytkownikom zarządzać niestandardowymi emoji na serwerze + manage_federation: Zarządzaj federacją + manage_federation_description: Pozwala użytkownikom na blokowanie lub zezwalanie federacji z innymi domenami i kontrolowanie doręczania + manage_invites: Zarządzaj zaproszeniami + manage_invites_description: Pozwala użytkownikom przeglądać i dezaktywować linki z zaproszeniami + manage_reports: Zarządzaj raportami + manage_reports_description: Pozwala użytkownikom przeglądać raporty i wykonywać przeciwko nim działania moderacyjne + manage_roles: Zarządzaj rolami + manage_roles_description: Pozwala użytkownikom zarządzać rolami i przypisywać role poniżej ich własnych + manage_rules: Zarządzaj regułami + manage_rules_description: Pozwala użytkownikom na zmianę reguł serwera + manage_settings: Zarządzaj ustawieniami + manage_settings_description: Pozwala użytkownikom na zmianę ustawień witryny + manage_taxonomies: Zarządzaj taksonomiami + manage_taxonomies_description: Pozwala użytkownikom przeglądać najpopularniejsze treści i aktualizować ustawienia hasztagów + manage_user_access: Zarządzaj dostępem użytkownika + manage_users: Zarządzanie użytkownikami + manage_webhooks: Zarządzanie webhookami + view_audit_log: Wyświetl dziennik zdarzeń + view_audit_log_description: Pozwala użytkownikom zobaczyć historię działań administracyjnych na serwerze + view_dashboard: Wyświetl panel + view_devops: Devops + view_devops_description: Pozwala użytkownikom na dostęp do paneli Sidekiq i pgHero + title: Role rules: add_new: Dodaj zasadę delete: Usuń @@ -723,9 +785,6 @@ pl: deletion: desc_html: Pozwól każdemu na usunięcie konta title: Możliwość usunięcia - min_invite_role: - disabled: Nikt - title: Kto może zapraszać użytkowników require_invite_text: desc_html: Kiedy rejestracje wymagają ręcznego zatwierdzenia, ustaw pole "Dlaczego chcesz dołączyć?" jako obowiązkowe, a nie opcjonalne title: Wymagaj od nowych użytkowników wypełnienia tekstu prośby o zaproszenie @@ -738,9 +797,6 @@ pl: show_known_fediverse_at_about_page: desc_html: Jeśli włączone, podgląd instancji będzie wyświetlał wpisy z całego Fediwersum. W innym przypadku, będą wyświetlane tylko lokalne wpisy. title: Pokazuj wszystkie znane wpisy na podglądzie instancji - show_staff_badge: - desc_html: Pokazuj odznakę uprawnień na stronie profilu użytkownika - title: Pokazuj odznakę administracji site_description: desc_html: Akapit wprowadzający, widoczny na stronie głównej. Opisz, co czyni tę instancję wyjątkową. Możesz korzystać ze znaczników HTML, w szczególności <code><a></code> i <code><em></code>. title: Opis serwera @@ -820,6 +876,11 @@ pl: description_html: Są to linki, które są obecnie często udostępniane przez konta, z których Twój serwer widzi posty. Może to pomóc Twoim użytkownikom dowiedzieć się, co dzieje się na świecie. Żadne linki nie są wyświetlane publicznie dopóki nie zaakceptujesz wydawcy. Możesz również zezwolić lub odrzucić indywidualne linki. disallow: Nie zezwalaj na link disallow_provider: Nie zezwalaj na wydawcę + shared_by_over_week: + few: Udostępnione przez %{count} osoby w ciągu ostatniego tygodnia + many: Udostępnione przez %{count} osób w ciągu ostatniego tygodnia + one: Udostępnione przez jedną osobę w ciągu ostatniego tygodnia + other: Udostępnione przez %{count} osoby w ciągu ostatniego tygodnia title: Popularne linki usage_comparison: Udostępnione %{today} razy dzisiaj, w porównaniu z %{yesterday} wczoraj only_allowed: Tylko dozwolone @@ -837,6 +898,11 @@ pl: disallow: Nie zezwalaj na post disallow_account: Nie zezwalaj na autora not_discoverable: Autor nie włączył opcji, by być wyświetlany w katalogu + shared_by: + few: Udostępnione i dodane do ulubionych %{friendly_count} razy + many: Udostępnione i dodane do ulubionych %{friendly_count} razy + one: Udostępnione lub dodane do ulubionych jednorazowo + other: Udostępnione i dodane do ulubionych %{friendly_count} razy title: Popularne teraz tags: current_score: Bieżący wynik %{score} @@ -1144,15 +1210,26 @@ pl: public: Publiczne osie czasu thread: Konwersacje edit: + add_keyword: Dodaj słowo kluczowe + keywords: Słowa kluczowe title: Edytuj filtr errors: + deprecated_api_multiple_keywords: Te parametry nie mogą zostać zmienione z tej aplikacji, ponieważ dotyczą więcej niż jednego słowa kluczowego. Użyj nowszej wersji aplikacji lub interfejsu internetowego. invalid_context: Nie podano lub podano nieprawidłową treść - invalid_irreversible: Nieodwracalne filtrowanie działa tylko na stronie głównej i w powiadomieniach index: + contexts: Filtry w %{contexts} delete: Usuń empty: Nie masz żadnych filtrów. + expires_in: Wygasa za %{distance} + expires_on: Wygasa %{date} + keywords: + few: "%{count} słowa kluczowe" + many: "%{count} słów kluczowych" + one: "%{count} słowo kluczowe" + other: "%{count} słów kluczowych" title: Filtry new: + save: Zapisz jako nowy filtr title: Dodaj nowy filtr footer: developers: Dla programistów @@ -1275,6 +1352,8 @@ pl: copy_account_note_text: 'Ten użytkownik przeniósł się z konta %{acct}, oto Twoje poprzednie notatki o nim:' notification_mailer: admin: + report: + subject: "%{name} wysłał raport" sign_up: subject: "%{name} zarejestrował(-a) się" digest: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 7661df9a0..4a7800b60 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -38,6 +38,7 @@ pt-BR: one: toot other: toots status_count_before: Autores de + tagline: Rede social descentralizada terms: Termos de serviço unavailable_content: Conteúdo indisponível unavailable_content_description: @@ -82,10 +83,8 @@ pt-BR: posts_tab_heading: Toots posts_with_replies: Toots e respostas roles: - admin: Admin bot: Robô group: Grupo - moderator: Moderador unavailable: Perfil indisponível unfollow: Deixar de seguir admin: @@ -104,7 +103,6 @@ pt-BR: avatar: Imagem de perfil by_domain: Domínio change_email: - changed_msg: E-mail da conta alterado com sucesso! current_email: E-mail atual label: Alterar e-mail new_email: Novo e-mail @@ -186,12 +184,6 @@ pt-BR: reset: Redefinir reset_password: Redefinir senha resubscribe: Reinscrever-se - role: Permissões - roles: - admin: Administrador - moderator: Moderador - staff: Equipe - user: Usuário search: Pesquisar search_same_email_domain: Outros usuários com o mesmo domínio de e-mail search_same_ip: Outros usuários com o mesmo IP @@ -695,9 +687,6 @@ pt-BR: deletion: desc_html: Permitir que qualquer um exclua a própria conta title: Exclusão aberta de contas - min_invite_role: - disabled: Ninguém - title: Permitir convites de require_invite_text: desc_html: Quando o cadastro de novas contas exigir aprovação manual, tornar obrigatório, ao invés de opcional, o texto de solicitação de convite em "Por que você deseja criar uma conta aqui?" title: Exigir que novos usuários preencham um texto de solicitação de convite @@ -710,9 +699,6 @@ pt-BR: show_known_fediverse_at_about_page: desc_html: Quando ativado, mostra toots globais na prévia da linha, se não, mostra somente toots locais title: Mostrar toots globais na prévia da linha - show_staff_badge: - desc_html: Mostrar uma insígnia de Equipe na página de usuário - title: Mostrar insígnia de equipe site_description: desc_html: Parágrafo introdutório na página inicial. Descreva o que faz esse servidor especial, e qualquer outra coisa de importante. Você pode usar tags HTML, em especial <code><a></code> e <code><em></code>. title: Descrição da instância @@ -746,6 +732,7 @@ pt-BR: back_to_account: Voltar para página da conta back_to_report: Voltar às denúncias batch: + remove_from_report: Remover do relatório report: Denunciar deleted: Excluídos media: @@ -753,9 +740,16 @@ pt-BR: no_status_selected: Nenhum status foi modificado porque nenhum estava selecionado title: Toots da conta with_media: Com mídia + strikes: + appeal_approved: Apelado + appeal_pending: Recurso pendente system_checks: database_schema_check: message_html: Existem migrações de banco de dados pendentes. Por favor, execute-as para garantir que o aplicativo se comporte como esperado + elasticsearch_running_check: + message_html: Não foi possível conectar ao Elasticsearch. Por favor, verifique se está em execução, ou desabilite a pesquisa de texto completo + elasticsearch_version_check: + message_html: 'Versão de Elasticsearch incompatível: %{value}' rules_check: action: Gerenciar regras do servidor message_html: Você não definiu nenhuma regra de servidor. @@ -808,6 +802,14 @@ pt-BR: edit_preset: Editar o aviso pré-definido empty: Você ainda não definiu nenhuma predefinição de alerta. title: Gerenciar os avisos pré-definidos + webhooks: + delete: Excluir + disable: Desabilitar + disabled: Desativado + enable: Habilitar + enabled: Ativo + events: Eventos + status: Status admin_mailer: new_appeal: actions: @@ -979,10 +981,12 @@ pt-BR: appealed_msg: Seu recurso foi enviado. Se ele for aprovado, você será notificado. appeals: submit: Enviar recurso + approve_appeal: Aprovar recurso associated_report: Relatório associado created_at: Datado description_html: Estas são ações tomadas contra sua conta e avisos que foram enviados a você pela equipe de %{instance}. recipient: Endereçado para + reject_appeal: Rejeitar recurso status: 'Postagem #%{id}' status_removed: Postagem já removida do sistema title: "%{action} de %{date}" @@ -1045,15 +1049,17 @@ pt-BR: public: Linhas públicas thread: Conversas edit: + add_keyword: Adicionar palavra-chave + keywords: Palavras-chave title: Editar filtro errors: invalid_context: Contexto inválido ou nenhum contexto informado - invalid_irreversible: O filtro irreversível só funciona com os contextos página inicial e notificações index: delete: Remover empty: Sem filtros. title: Filtros new: + save: Salvar novo filtro title: Adicionar filtro footer: developers: Desenvolvedores @@ -1172,6 +1178,8 @@ pt-BR: copy_account_note_text: 'Este usuário saiu de %{acct}, aqui estão suas notas anteriores sobre ele:' notification_mailer: admin: + report: + subject: "%{name} enviou uma denúncia" sign_up: subject: "%{name} se inscreveu" digest: @@ -1297,6 +1305,8 @@ pt-BR: reports: errors: invalid_rules: não faz referência a regras válidas + rss: + content_warning: 'Aviso de conteúdo:' scheduled_statuses: over_daily_limit: Você excedeu o limite de %{limit} toots agendados para esse dia over_total_limit: Você excedeu o limite de %{limit} toots agendados diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 9607762bb..ac21c330e 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -83,10 +83,8 @@ pt-PT: posts_tab_heading: Publicações posts_with_replies: Posts e Respostas roles: - admin: Administrador(a) bot: Robô group: Grupo - moderator: Moderador unavailable: Perfil indisponível unfollow: Deixar de seguir admin: @@ -105,12 +103,17 @@ pt-PT: avatar: Imagem de Perfil by_domain: Domínio change_email: - changed_msg: E-mail da conta alterado com sucesso! + changed_msg: E-mail alterado com sucesso! current_email: E-mail atual label: Alterar e-mail new_email: Novo e-mail submit: Alterar e-mail title: Alterar e-mail para %{username} + change_role: + changed_msg: Função alterada com sucesso! + label: Alterar função + no_role: Nenhuma função + title: Alterar a função de %{username} confirm: Confirmar confirmed: Confirmado confirming: A confirmar @@ -154,6 +157,7 @@ pt-PT: active: Activo all: Todos pending: Pendente + silenced: Limitadas suspended: Supensos title: Moderação moderation_notes: Notas de moderação @@ -161,6 +165,7 @@ pt-PT: most_recent_ip: IP mais recente no_account_selected: Nenhuma conta foi alterada porque nenhuma foi selecionada no_limits_imposed: Sem limites impostos + no_role_assigned: Nenhuma função atribuída not_subscribed: Não inscrito pending: Pendente de revisão perform_full_suspension: Fazer suspensão completa @@ -187,12 +192,7 @@ pt-PT: reset: Restaurar reset_password: Reset palavra-passe resubscribe: Reinscrever - role: Permissões - roles: - admin: Administrador(a) - moderator: Moderador - staff: Equipa - user: Utilizador + role: Função search: Pesquisar search_same_email_domain: Outros utilizadores com o mesmo domínio de e-mail search_same_ip: Outros utilizadores com o mesmo IP @@ -649,6 +649,67 @@ pt-PT: unresolved: Por resolver updated_at: Atualizado view_profile: Ver perfil + roles: + add_new: Adicionar função + assigned_users: + one: "%{count} utilizador" + other: "%{count} utilizadores" + categories: + administration: Administração + devops: DevOps + invites: Convites + moderation: Moderação + special: Especiais + delete: Eliminar + description_html: Com as <strong>funções de utilizador</strong>, pode personalizar quais funções e áreas do Mastodon os seus utilizadores podem aceder. + edit: Editar função '%{name}' + everyone: Permissões padrão + everyone_full_description_html: Esta é a <strong>função base</strong> que afeta <strong>todos os utilizadores</strong>, mesmo aqueles sem uma função atribuída. Todas as outras funções herdam as permissões desta. + permissions_count: + one: "%{count} permissão" + other: "%{count} permissões" + privileges: + administrator: Administrador + administrator_description: Utilizadores com esta permissão irão contornar todas as permissões + delete_user_data: Eliminar Dados de Utilizador + delete_user_data_description: Permite que os utilizadores eliminem os dados de outros utilizadores sem atraso + invite_users: Convidar Utilizadores + invite_users_description: Permite aos utilizadores convidar pessoas novas para o servidor + manage_announcements: Gerir Anúncios + manage_announcements_description: Permite aos utilizadores gerir anúncios no servidor + manage_appeals: Gerir Recursos + manage_appeals_description: Permite aos utilizadores rever recursos de moderação + manage_blocks: Gerir Bloqueios + manage_blocks_description: Permite aos utilizadores bloquear provedores de e-mail e endereços IP + manage_custom_emojis: Gerir Emojis Personalizados + manage_custom_emojis_description: Permite aos utilizadores gerir os emojis personalizados do servidor + manage_federation: Gerir Federação + manage_federation_description: Permite aos utilizadores bloquear ou permitir federação com outros domínios e controlar a entregabilidade + manage_invites: Gerir Convites + manage_invites_description: Permite aos utilizadores pesquisar e desativar links de convite + manage_reports: Gerir Relatórios + manage_reports_description: Permite aos utilizadores rever relatórios e executar ações de moderação contra eles + manage_roles: Gerir Funções + manage_roles_description: Permite aos usuários gerir e atribuir funções abaixo das deles + manage_rules: Gerir Regras + manage_rules_description: Permite aos utilizadores alterar as regras do servidor + manage_settings: Gerir Configurações + manage_settings_description: Permite aos utilizadores alterar as configurações do site + manage_taxonomies: Gerir Taxonomias + manage_taxonomies_description: Permite aos utilizadores rever o conteúdo em tendência e atualizar as configurações de hashtag + manage_user_access: Gerir Acesso de Utilizador + manage_user_access_description: Permite aos utilizadores desativar a autenticação em duas etapas de outros utilizadores, alterar o seu endereço de e-mail e redefinir a sua palavra-passe + manage_users: Gerir Utilizadores + manage_users_description: Permite aos utilizadores ver os detalhes de outros utilizadores e executar ações de moderação contra eles + manage_webhooks: Gerir Webhooks + manage_webhooks_description: Permite aos utilizadores configurar webhooks para eventos administrativos + view_audit_log: Ver Registo de Auditoria + view_audit_log_description: Permite aos utilizadores ver um histórico de ações administrativas no servidor + view_dashboard: Ver Painel de Controlo + view_dashboard_description: Permite aos utilizadores aceder ao painel de controlo e várias métricas + view_devops: DevOps + view_devops_description: Permite aos utilizadores aceder aos painéis de controlo do Sidekiq e pgHero + title: Funções rules: add_new: Adicionar regra delete: Eliminar @@ -701,9 +762,6 @@ pt-PT: deletion: desc_html: Permitir a qualquer utilizador eliminar a sua conta title: Permitir eliminar contas - min_invite_role: - disabled: Ninguém - title: Permitir convites de require_invite_text: desc_html: Quando os registos exigirem aprovação manual, faça o texto "Porque se quer juntar a nós?" da solicitação de convite obrigatório, em vez de opcional title: Exigir que novos utilizadores preencham um texto de solicitação de convite @@ -716,9 +774,6 @@ pt-PT: show_known_fediverse_at_about_page: desc_html: Quando comutado, irá mostrar a previsualização de publicações de todo o fediverse conhecido. De outro modo só mostrará publicações locais. title: Mostrar o fediverse conhecido na previsualização da cronologia - show_staff_badge: - desc_html: Mostrar um crachá da equipa na página de utilizador - title: Mostrar crachá da equipa site_description: desc_html: Mostrar como parágrafo na página inicial e usado como meta tag.Podes usar tags HTML, em particular <code><a></code> e <code><em></code>. title: Descrição do site @@ -1124,15 +1179,24 @@ pt-PT: public: Cronologias públicas thread: Conversações edit: + add_keyword: Adicionar palavra-chave + keywords: Palavras-chave title: Editar filtros errors: + deprecated_api_multiple_keywords: Estes parâmetros não podem ser alterados a partir deste aplicativo porque se aplicam a mais de um filtro de palavra-chave. Use um aplicativo mais recente ou a interface web. 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: + contexts: Filtros em %{contexts} delete: Eliminar empty: Não tem filtros. + expires_in: Expira em %{distance} + expires_on: Expira em %{date} + keywords: + one: "%{count} palavra-chave" + other: "%{count} palavras-chaves" title: Filtros new: + save: Salvar novo filtro title: Adicionar novo filtro footer: developers: Responsáveis pelo desenvolvimento @@ -1251,6 +1315,8 @@ pt-PT: copy_account_note_text: 'Este utilizador migrou de %{acct}, aqui estão as suas notas anteriores sobre ele:' notification_mailer: admin: + report: + subject: "%{name} submeteu uma denúncia" sign_up: subject: "%{name} inscreveu-se" digest: @@ -1545,6 +1611,87 @@ pt-PT: tags: does_not_match_previous_name: não coincide com o nome anterior terms: + body_html: | + <h2>Política de privacidade</h2> + <h3 id="collect">Que informação nós recolhemos?</h3> + + <ul> + <li><em>Informação básica da conta</em>: Ao registar-se neste servidor, pode ser-lhe pedido que indique um nome de utilizador, um endereço de e-mail e uma palavra-chave. Pode ainda incluir informações adicionais no seu perfil, tais como um nome a exibir e biografia, e carregar uma imagem de perfil e imagem de cabeçalho. O nome de utilizador, nome a exibir, a biografia, a imagem de perfil e a imagem de cabeçalho são sempre listados publicamente.</li> + <li><em>Publicações, seguimento e outra informação pública</em>: A lista de pessoas que segue é pública, o mesmo é verdade para os seus seguidores. Quando publica uma mensagem, a data e a hora são guardados, tal como a aplicação a partir da qual a mensagem foi enviada. As mensagens podem conter anexos de media, tais como fotografias ou vídeos. Publicações públicas e não listadas são acessíveis publicamente. Quando destaca uma publicação no seu perfil, isso é também informação disponível publicamente. As suas publicações são enviadas aos seus seguidores, em alguns casos isso significa que elas são enviadas para servidores diferentes onde são guardadas cópias. Quando elimina publicações, isso também é enviado para os teus seguidores. A ação de partilhar ou adicionar uma publicação aos favoritos é sempre pública.</li> + <li><em>Publicações diretas e exclusivas para seguidores</em>: Todas as publicações são guardadas e processadas no servidor. Publicações exclusivas para seguidores são enviadas para os teus seguidores e para os utilizadores nelas mencionados. As publicações diretas são enviadas apenas para os utilizadores nelas mencionados. Em alguns casos isso significa que são enviadas para diferentes servidores onde são guardadas cópias. Nós fazemos um grande esforço para limitar o acesso a estas publicações aos utilizadores autorizados, mas outros servidores podem falhar neste objetivo. Por isso, deve rever os servidores a que os seus seguidores pertencem. Pode ativar uma opção para aprovar e rejeitar manualmente novos seguidores nas configurações. <em>Por favor, tenha em mente que os gestores do seu servidor e qualquer servidor que receba a publicação pode lê-la</em> e que os destinatários podem fazer uma captura de tela, copiar ou partilhar a publicação.<em> Não partilhe qualquer informação sensível no Mastodon.</em></li> + <li><em>IPs e outros metadados</em>: Quando inicia sessão, nós guardamos o endereço de IP a partir do qual inicou sessão, tal como o nome do seu navegador. Todas as sessões estão disponíveis para verificação e revogação nas configurações. O último endereço de IP usado é guardado até 12 meses. Nós também podemos guardar registos de servidor, os quais incluem o endereço de IP de cada pedido dirigido ao nosso servidor.</li> + </ul> + + <hr class="spacer" /> + + <h3 id="use">Para que utilizamos a sua informação?</h3> + + <p>Qualquer informação que recolhemos sobre sí pode ser utilizada dos seguintes modos:</p> + + <ul> + <li>Para prover a funcionalidade central do Mastodon. Só pode interagir com o conteúdo de outras pessoas e publicar o seu próprio conteúdo depois de ter iniciado sessão. Por exemplo, pode seguir outras pessoas para veres as suas publicações na sua cronologia inicial personalizada.</li> + <li>Para ajudar na moderação da comunidade, por exemplo, para comparar o seu endereço IP com outros conhecidos, para determinar a fuga ao banimento ou outras violações.</li> + <li>O endereço de e-mail que fornece pode ser utilizado para lhe enviar informações e/ou notificações sobre outras pessoas que estão a interagir com o seu conteúdo ou a enviar-lhe mensagens, para responder a inquéritos e/ou outros pedidos ou questões.</li> + </ul> + + <hr class="spacer" /> + + <h3 id="protect">Como protegemos a sua informação?</h3> + + <p>Implementamos uma variedade de medidas para garantir a segurança da sua informação pessoal quando introduz, submete ou acede à mesma. Entre outras coisas, a sua sessão de navegação, tal como o tráfego entre as tuas aplicações e a API, estão seguras por SSL e a sua palavra-passe é codificada utilizando um forte algoritmo de sentido único. Pode activar a autenticação em duas etapas para aumentar ainda mais a segurança do acesso à sua conta.</p> + + <hr class="spacer" /> + + <h3 id="data-retention">>Qual é a nossa política de retenção de dados?</h3> + + <p>Faremos o nosso melhor esforço para:</p> + + <ul> + <li>Reter registos do servidor contendo o endereço de IP de todos os pedidos feitos a este servidor, considerando que estes registos não sejam guardados por mais de 90 dias.</li> + <li>Reter os endereços de IP associados aos utilizadores registados durante um período que não ultrapasse os 12 meses.</li> + </ul> + + <p>Pode requer e descarregar um ficheiro com o seu conteúdo, incluindo as suas publicações, os ficheiros multimédia, a imagem de perfil e a imagem de cabeçalho.</p> + + <p>Pode eliminar a sua conta de modo irreversível a qualquer momento.</p> + + <hr class="spacer"/> + + <h3 id="cookies">Utilizamos cookies?</h3> + + <p>Sim. Cookies são pequenos ficheiros que um site ou o seu fornecedor de serviço transfere para o disco rígido do seu computador através do seu navegador (se você o permitir). Esses cookies possibilitam ao site reconhecer o seu navegador e, se você tiver uma conta registada, associá-lo a ela.</p> + + <p>Nós usamos os cookies para compreender e guardar as suas preferências para visitas futuras.</p> + + <hr class="spacer" /> + + <h3 id="disclose">Divulgamos alguma informação para entidades externas?</h3> + + <p>Nós não vendemos, trocamos ou transferimos de qualquer modo a sua informação pessoal que seja identificável para qualquer entidade externa. Isto não inclui entindades terceiras de confiança que nos ajudam a manter o nosso site, conduzir o nosso negócio ou prestar-lhe este serviço, desde que essas entendidades concordem em manter essa informação confidencial. Poderemos também revelar a sua informação quando acreditarmos que isso é o apropriado para cumprir a lei, forçar a aplicação dos nossos termos de serviço ou proteger os direitos, propriedade e segurança, nossos e de outrem.</p> + + <p>O seu conteúdo público pode ser descarregado por outros servidores na rede. As suas publicações públicas e exclusivas para os seus seguidores são enviadas para os servidores onde os seus seguidores residem e as mensagens diretas são entregues aos servidores dos seus destinatários, no caso desses seguidores ou destinatários residirem num servidor diferente deste.</p> + + <p>Quando autoriza uma aplicação a utilizar a sua conta, dependendo da abrangência das permissões que aprova, ela pode ter acesso à informação pública do seu perfil, à lista de quem segue, aos seus seguidores, às suas listas, a todas as suas publicações e aos seus favoritos. As aplicações nunca terão acesso ao seu endereço de e-mail ou à sua palavra-passe.</p> + + <hr class="spacer" /> + + <h3 id="children">Utilização do site por crianças</h3> + + <p>Se este servidor estiver na UE ou no EEE: O nosso site, produtos e serviços são todos dirigidos a pessoas que tenham, pelo menos, 16 anos de idade. Se você tem menos de 16 anos de idade, em concordância com os requisitos da GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) não utilize este site.</p> + + <p>Se este servidor estiver nos EUA: O nosso site, produtos e serviços são todos dirigidos a pessoas que tenham, pelo menos, 13 anos de idade. Se você tem menos de 13 anos de idade, em concordância com os requisitos da COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) não utilize este site.</p> + + <p>Os requisitos legais poderão ser diferentes se este servidor estiver noutra jurisdição.</p> + + <hr class="spacer" /> + + <h3 id="changes">Alterações à nossa Política de Privacidade</h3> + + <p>Se decidirmos alterar a nossa política de privacidade, iremos publicar essas alterações nesta página.</p> + + <p>Este documento é CC-BY-SA. Ele foi actualizado pela última vez em 26 de Maio 2022.</p> + + <p>Originalmente adaptado de <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p> title: "%{instance} Termos de Serviço e Política de Privacidade" themes: contrast: Mastodon (Elevado contraste) diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 3203e9178..8ed812e5b 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -83,10 +83,8 @@ ro: posts_tab_heading: Postări posts_with_replies: Postări și răspunsuri roles: - admin: Admin bot: Robot group: Grup - moderator: Moderator unavailable: Profil indisponibil unfollow: Nu mai urmării admin: @@ -105,7 +103,6 @@ ro: avatar: Poză de profil by_domain: Domeniu change_email: - changed_msg: E-mail de cont schimbat cu succes! current_email: E-mailul curent label: Schimbă adresa de email new_email: E-mail nou @@ -183,12 +180,6 @@ ro: reset: Resetează reset_password: Resetează parola resubscribe: Resubscrie-te - role: Permisiuni - roles: - admin: Administrator - moderator: Moderator - staff: Personal - user: Utilizator search: Caută search_same_email_domain: Alţi utilizatori cu acelaşi domeniu de e-mail search_same_ip: Alţi utilizatori cu acelaşi IP @@ -417,7 +408,6 @@ ro: title: Editează filtru errors: invalid_context: Lipsa conținut sau acesta este invalid - invalid_irreversible: Filtrarea ireversibilă funcționează dor cu context din fluxul Acasă și notificări index: delete: Șterge title: Filtre diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 47f944129..7cdf1f0c7 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -91,10 +91,8 @@ ru: posts_tab_heading: Посты posts_with_replies: Посты с ответами roles: - admin: Администратор bot: Бот group: Группа - moderator: Модератор unavailable: Профиль недоступен unfollow: Отписаться admin: @@ -113,12 +111,17 @@ ru: avatar: Аватар by_domain: Домен change_email: - changed_msg: E-mail учётной записи успешно изменён! + changed_msg: Адрес эл. почты успешно изменен! current_email: Текущий e-mail label: Сменить e-mail new_email: Новый e-mail submit: Сменить e-mail title: Сменить e-mail для %{username} + change_role: + changed_msg: Роль успешно изменена! + label: Изменить роль + no_role: Нет роли + title: Изменить роль %{username} confirm: Подтвердить confirmed: Подтверждено confirming: Подтверждение @@ -162,6 +165,7 @@ ru: active: Действующие all: Все pending: В ожидании + silenced: Ограниченные suspended: Заблокированные title: Модерация moderation_notes: Заметки модератора @@ -169,6 +173,7 @@ ru: most_recent_ip: Последний IP no_account_selected: Ничего не изменилось, так как ни одна учётная запись не была выделена no_limits_imposed: Без ограничений + no_role_assigned: Роль не присвоена not_subscribed: Не подписаны pending: Ожидает рассмотрения perform_full_suspension: Блокировка @@ -197,12 +202,7 @@ ru: reset: Сбросить reset_password: Сбросить пароль resubscribe: Переподписаться - role: Разрешения - roles: - admin: Администратор - moderator: Модератор - staff: Персонал - user: Пользователь + role: Роль search: Поиск search_same_email_domain: Другие пользователи с тем же доменом электронной почты search_same_ip: Другие пользователи с таким же IP @@ -408,6 +408,11 @@ ru: many: "<strong>%{count}</strong> ожидающих отчетов" one: "<strong>%{count}</strong> ожидающий отчет" other: "<strong>%{count}</strong> ожидающих отчетов" + pending_tags_html: + few: "<strong>%{count}</strong> ожидающих хэштега" + many: "<strong>%{count}</strong> ожидающих хэштегов" + one: "<strong>%{count}</strong> ожидающий хэштег" + other: "<strong>%{count}</strong> ожидающих хэштегов" pending_users_html: few: "<strong>%{count}</strong> ожидающих пользователя" many: "<strong>%{count}</strong> ожидающих пользователей" @@ -494,6 +499,11 @@ ru: unsuppress: Восстановить рекомендацию instances: availability: + failures_recorded: + few: Попытки неудачны уже %{count} дня. + many: Попытки неудачны уже %{count} дней. + one: Попытки неудачны %{count} день. + other: Попытки неудачны уже %{count} дней. no_failures_recorded: Сбоев в записи нет. title: Доступность warning: Последняя попытка подключения к этому серверу не удалась @@ -506,6 +516,7 @@ ru: comment: Внутренняя заметка policies: reject_media: Отклонить медиа + reject_reports: Отклонять жалобы silence: Лимит suspend: Приостановить policy: Политика @@ -650,6 +661,38 @@ ru: unresolved: Нерешённые updated_at: Обновлена view_profile: Открыть профиль + roles: + add_new: Добавить роль + assigned_users: + few: "%{count} пользователя" + many: "%{count} пользователей" + one: "%{count} пользователь" + other: "%{count} пользователей" + categories: + administration: Администрация + devops: DevOps + invites: Приглашения + moderation: Модерация + special: Особые + delete: Удалить + description_html: С помощью <strong>ролей пользователей</strong> вы можете настроить, к каким функциям и областям Mastodon у ваших пользователей будет доступ. + edit: Изменить роль '%{name}' ' + everyone: Разрешения по умолчанию + everyone_full_description_html: Это <strong>базовая роль</strong>, касающаяся <strong>всех пользователей</strong>, даже тех, кто не имеет назначенной роли. Все другие роли наследуют разрешения от нее. + permissions_count: + few: "%{count} разрешения" + many: "%{count} разрешений" + one: "%{count} разрешение" + other: "%{count} разрешений" + privileges: + administrator: Администратор + delete_user_data: Удалить пользовательские данные + delete_user_data_description: Позволяет пользователям удалять данные других пользователей без задержки + invite_users: Пригласить пользователей + invite_users_description: Позволяет пользователям приглашать новых людей на сервер + manage_announcements: Управление объявлениями + manage_announcements_description: Позволяет пользователям управлять объявлениями на сервере + title: Роли rules: add_new: Добавить правило delete: Удалить @@ -702,9 +745,6 @@ ru: deletion: desc_html: Позволяет всем удалять собственные учётные записи title: Разрешить удаление учётных записей - min_invite_role: - disabled: Никого - title: Разрешать приглашения от require_invite_text: desc_html: Когда регистрация требует ручного подтверждения, сделать ответ на вопрос "Почему вы хотите присоединиться?" обязательным, а не опциональным title: Обязать новых пользователей заполнять текст запроса на приглашение @@ -717,9 +757,6 @@ ru: show_known_fediverse_at_about_page: desc_html: Если включено, показывает посты со всех известных узлов в предпросмотре ленты. В противном случае отображаются только локальные посты. title: Показывать контент со всей федерации в публичной ленте неавторизованным пользователям - show_staff_badge: - desc_html: Показывать метку персонала на странице пользователя - title: Показывать метку персонала site_description: desc_html: Отображается в качестве параграфа на титульной странице и используется в качестве мета-тега.<br>Можно использовать HTML-теги, в особенности <code><a></code> и <code><em></code>. title: Описание сайта @@ -816,6 +853,11 @@ ru: allow_account: Разрешить автора disallow: Запретить пост disallow_account: Запретить автора + shared_by: + few: Поделились или добавили в избранное %{friendly_count} раза + many: Поделились или добавили в избранное %{friendly_count} раз + one: Поделились или добавили в избранное один раз + other: Поделились или добавили в избранное %{friendly_count} раз title: Популярные посты tags: current_score: Текущий счет %{score} @@ -893,6 +935,7 @@ ru: new_trending_tags: no_approved_tags: На данный момент популярные подтвержденные хэштеги отсутствуют. title: Популярные хэштеги + subject: Новые тренды для проверки на %{instance} aliases: add_new: Создать псевдоним created_msg: Новый псевдоним установлен. Теперь мы можете начать миграцию со старой учётной записи. @@ -1109,15 +1152,26 @@ ru: public: Публичные ленты thread: Диалоги edit: + add_keyword: Добавить ключевое слово + keywords: Ключевые слова title: Изменить фильтр errors: + deprecated_api_multiple_keywords: Эти параметры нельзя изменить из этого приложения, так как применяются к более чем одному ключевому слову фильтра. Используйте более последнее приложение или веб-интерфейс. invalid_context: Некорректный контекст или ничего - invalid_irreversible: Необратимая фильтрация работает только с лентой уведомлений и домашней лентой index: + contexts: Фильтры по %{contexts} delete: Удалить empty: У вас пока нет фильтров. + expires_in: Истекает через %{distance} + expires_on: Истекает %{date} + keywords: + few: "%{count} ключевых слова" + many: "%{count} ключевых слов" + one: "%{count} ключевое слово" + other: "%{count} ключевых слов" title: Фильтры new: + save: Сохранить новый фильтр title: Добавить фильтр footer: developers: Разработчикам @@ -1240,6 +1294,8 @@ ru: copy_account_note_text: 'Этот пользователь переехал с %{acct}, вот ваша предыдущая заметка о нём:' notification_mailer: admin: + report: + subject: "%{name} отправил жалобу" sign_up: subject: "%{name} зарегистрирован" digest: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 490654143..e6ee2bca9 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -79,10 +79,8 @@ sc: posts_tab_heading: Tuts posts_with_replies: Tuts e rispostas roles: - admin: Admin bot: Bot group: Grupu - moderator: Moderatzione unavailable: Su profilu no est a disponimentu unfollow: Non sigas prus admin: @@ -101,7 +99,6 @@ sc: avatar: Immàgine de profilu by_domain: Domìniu change_email: - changed_msg: As cambiadu s'indiritzu eletrònicu. current_email: Indiritzu eletrònicu atuale label: Muda s'indiritzu eletrònicu new_email: Indiritzu eletrònicu nou @@ -176,12 +173,6 @@ sc: reset: Reseta reset_password: Reseta sa crae resubscribe: Torra a sutascrìere - role: Permissos - roles: - admin: Amministratzione - moderator: Moderatzione - staff: Personale - user: Utente search: Chirca search_same_email_domain: Àteras persones cun su pròpiu domìniu de posta search_same_ip: Àteras persones cun sa pròpiu IP @@ -548,9 +539,6 @@ sc: deletion: desc_html: Permite a chie si siat de cantzellare su contu suo title: Aberi s'eliminatzione de su contu - min_invite_role: - 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 @@ -563,9 +551,6 @@ sc: show_known_fediverse_at_about_page: desc_html: Cando ativu, ammustrat in sa previsualizatzione is tuts de totu is istàntzias connòschidas. Si nono, ammustrat isceti is cuntenutos locales title: Include su cuntenutu federadu in sa pàgina no autenticada de sa lìnia de tempus pùblica - show_staff_badge: - 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 pro ite custu serbidore de Mastodon siat ispetziale e cale si siat àtera cosa de importu. Podes impreare etichetas HTML, mescamente <code><a></code> e <code><em></code>. title: Descritzione de su serbidore @@ -816,7 +801,6 @@ sc: title: Modìfica filtru errors: invalid_context: Cuntestu mancante o non vàlidu - invalid_irreversible: Su filtràgiu non reversìbile funtzionat isceti in is cuntestos printzipale o de notìficas index: delete: Cantzella empty: Non tenes perunu filtru. diff --git a/config/locales/si.yml b/config/locales/si.yml index de029aa50..811cd7a47 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -1,66 +1,140 @@ --- si: about: + about_hashtag_html: මේවා <strong>#%{hashtag}</strong>ටැග් කර ඇති පොදු පළ කිරීම් වේ. ඔබට fediverse හි ඕනෑම තැනක ගිණුමක් තිබේ නම් ඔබට ඔවුන් සමඟ අන්තර් ක්රියා කළ හැක. + about_mastodon_html: 'අනාගත සමාජ ජාලය: දැන්වීම් නැත, ආයතනික නිරීක්ෂණ නැත, සදාචාරාත්මක සැලසුම් සහ විමධ්යගත කිරීම! Mastodon සමඟ ඔබේ දත්ත අයිති කරගන්න!' about_this: පිලිබඳව active_count_after: සක්රීයයි active_footnote: මාසික ක්රියාකාරී පරිශීලකයින් (මාක්රිප) + administered_by: 'පරිපාලනය කරන්නේ:' api: යෙ.ක්ර. මු. (API) apps: ජංගම යෙදුම් + apps_platforms: iOS, Android සහ වෙනත් වේදිකා වලින් Mastodon භාවිතා කරන්න + browse_directory: පැතිකඩ නාමාවලියක් පිරික්සන්න සහ රුචිකත්වයන් අනුව පෙරහන් කරන්න + browse_local_posts: මෙම සේවාදායකයෙන් පොදු පළ කිරීම් වල සජීවී ප්රවාහයක් බ්රවුස් කරන්න + browse_public_posts: Mastodon හි පොදු පළ කිරීම් වල සජීවී ප්රවාහයක් බ්රවුස් කරන්න contact: සබඳතාව - contact_missing: සකසා නැත + contact_missing: සකස් කර නැත contact_unavailable: අ/නොවේ + continue_to_web: වෙබ් යෙදුම වෙත ඉදිරියට යන්න + discover_users: පරිශීලකයන් සොයා ගන්න documentation: ප්රලේඛනය + federation_hint_html: "%{instance} හි ගිණුමක් සමඟින් ඔබට ඕනෑම Mastodon සේවාදායකයක සහ ඉන් ඔබ්බෙහි පුද්ගලයින් අනුගමනය කිරීමට හැකි වනු ඇත." get_apps: ජංගම යෙදුමක් උත්සාහ කරන්න + hosted_on: Mastodon %{domain}හි සත්කාරකත්වය දරයි + instance_actor_flash: | + මෙම ගිණුම සේවාදායකයම නියෝජනය කිරීමට භාවිතා කරන අතථ්ය නළුවෙකු වන අතර කිසිදු තනි පරිශීලකයෙකු නොවේ. + එය ෆෙඩරේෂන් අරමුණු සඳහා භාවිතා කරන අතර ඔබට සම්පූර්ණ අවස්ථාව අවහිර කිරීමට අවශ්ය නම් මිස අවහිර නොකළ යුතුය, මෙම අවස්ථාවේදී ඔබ ඩොමේන් බ්ලොක් එකක් භාවිතා කළ යුතුය. learn_more: තව දැනගන්න + logged_in_as_html: ඔබ දැනට %{username}ලෙස පුරනය වී ඇත. + logout_before_registering: ඔබ දැනටමත් පුරනය වී ඇත. privacy_policy: රහස්යතා ප්රතිපත්තිය rules: සේවාදායකයේ නීති + rules_html: 'ඔබට Mastodon හි මෙම සේවාදායකයේ ගිණුමක් ඇති කර ගැනීමට අවශ්ය නම් ඔබ අනුගමනය කළ යුතු නීති වල සාරාංශයක් පහත දැක්වේ:' + see_whats_happening: මොකද වෙන්නේ කියලා බලන්න + server_stats: 'සේවාදායක සංඛ්යාලේඛන:' source_code: මූල කේතය status_count_after: - one: තත්වය - other: තත්වයන් + one: තත්ත්වය + other: තත්ත්වයන් + status_count_before: කවුද පළ කළේ + tagline: විමධ්යගත සමාජ ජාලය terms: සේවාවේ කොන්දේසි + unavailable_content: මධ්යස්ථ සේවාදායකයන් unavailable_content_description: domain: සේවාදායකය reason: හේතුව + rejecting_media: 'මෙම සේවාදායකයන්ගෙන් මාධ්ය ගොනු සැකසීම හෝ ගබඩා කිරීම සිදු නොවනු ඇති අතර, මුල් ගොනුව වෙත අතින් ක්ලික් කිරීම අවශ්ය වන, සිඟිති රූ නොපෙන්වනු ඇත:' + rejecting_media_title: පෙරූ මාධ්ය + silenced: 'මෙම සේවාදායකයන්ගෙන් පළ කිරීම් පොදු කාලරේඛා සහ සංවාදවල සඟවනු ඇති අතර, ඔබ ඒවා අනුගමනය කරන්නේ නම් මිස, ඔවුන්ගේ පරිශීලක අන්තර්ක්රියාවලින් කිසිදු දැනුම්දීමක් ජනනය නොවේ:' silenced_title: සීමාසහිත සේවාදායක + suspended: 'මෙම සේවාදායකයන්ගෙන් කිසිදු දත්තයක් සැකසීම, ගබඩා කිරීම හෝ හුවමාරු කිරීම සිදු නොවනු ඇත, මෙම සේවාදායකයන්ගෙන් පරිශීලකයින් සමඟ කිසියම් අන්තර්ක්රියා හෝ සන්නිවේදනයක් කළ නොහැක:' suspended_title: අත්හිටවූ සේවාදායකයන් + unavailable_content_html: Mastodon සාමාන්යයෙන් ඔබට ෆෙඩිවර්ස් හි වෙනත් ඕනෑම සේවාදායකයකින් අන්තර්ගතය බැලීමට සහ පරිශීලකයින් සමඟ අන්තර් ක්රියා කිරීමට ඉඩ සලසයි. මෙම විශේෂිත සේවාදායකයේ සිදු කර ඇති ව්යතිරේක මේවාය. user_count_after: one: පරිශීලක other: පරිශීලකයින් + user_count_before: ගෙදරට what_is_mastodon: මාස්ටඩන් යනු කුමක්ද? accounts: + choices_html: "%{name}හි තේරීම්:" + endorsements_hint: ඔබට වෙබ් අතුරු මුහුණතෙන් ඔබ අනුගමනය කරන පුද්ගලයින් අනුමත කළ හැකි අතර, ඔවුන් මෙහි පෙන්වනු ඇත. + featured_tags_hint: ඔබට මෙහි සංදර්ශන කෙරෙන විශේෂිත හැෂ් ටැග් විශේෂාංගගත කළ හැක. + follow: අනුගමනය කරන්න + followers: + one: අනුගාමිකයා + other: අනුගාමිකයින් + following: අනුගමනය + instance_actor_flash: මෙම ගිණුම සේවාදායකයම නියෝජනය කිරීමට භාවිතා කරන අතථ්ය නළුවෙකු වන අතර කිසිදු තනි පරිශීලකයෙකු නොවේ. එය ෆෙඩරේෂන් අරමුණු සඳහා භාවිතා කරන අතර අත්හිටුවිය යුතු නොවේ. joined: "%{date} එක් වී ඇත" + last_active: අවසාන ක්රියාකාරී + link_verified_on: මෙම සබැඳියේ හිමිකාරිත්වය %{date}හි පරීක්ෂා කරන ලදී media: මාධ්යය + moved_html: "%{name} %{new_profile_link}මාරු වී ඇත:" + network_hidden: මෙම තොරතුරු ලබා ගත නොහැක nothing_here: මෙහි කිසිත් නැත! + people_followed_by: "%{name} අනුගමනය කරන පුද්ගලයින්" + people_who_follow: "%{name}අනුගමනය කරන පුද්ගලයින්" + pin_errors: + following: ඔබට අනුමත කිරීමට අවශ්ය පුද්ගලයා ඔබ දැනටමත් අනුගමනය කරමින් සිටිය යුතුය + posts: + one: තැපැල් + other: තනතුරු + posts_tab_heading: තනතුරු + posts_with_replies: පළ කිරීම් සහ පිළිතුරු roles: - admin: පරිපාලක bot: ස්වයං ක්රමලේඛය group: සමූහය + unavailable: පැතිකඩ නොමැත + unfollow: අනුගමනය නොකරන්න admin: + account_actions: + action: ක්රියාව සිදු කරන්න + title: "%{acct}මත මධ්යස්ථ ක්රියාව සිදු කරන්න" account_moderation_notes: create: සටහන හැරයන්න + created_msg: මධ්යස්ථ සටහන සාර්ථකව සාදන ලදී! + destroyed_msg: මධ්යස්ථ සටහන සාර්ථකව විනාශ විය! accounts: add_email_domain_block: වි-තැපැල් වසම අවහිර කරන්න approve: අනුමත කරන්න + approved_msg: "%{username}හි ලියාපදිංචි වීමේ යෙදුම සාර්ථකව අනුමත කරන ලදී" are_you_sure: ඔබට විශ්වාසද? + avatar: අවතාරය by_domain: වසම change_email: - changed_msg: ගිණුමේ වි-තැපෑල සාර්ථකව වෙනස් කෙරිණි! current_email: වත්මන් වි-තැපෑල label: වි-තැපෑල වෙනස් කරන්න new_email: නව විද්යුත් තැපෑල submit: වි-තැපෑල වෙනස් කරන්න title: "%{username} සඳහා වි-තැපෑල වෙනස් කරන්න" confirm: සනාථ කරන්න - confirmed: සනාථ කර ඇත + confirmed: තහවුරු කර ඇත confirming: සනාථ කරමින් + custom: අභිරුචි + delete: දත්ත මකන්න + deleted: මකා දමන ලදී + demote: පහත් කරන්න + destroyed_msg: "%{username}හි දත්ත ඉක්මනින් මකා දැමීමට පෝලිම් කර ඇත" + disable: කැටි කරන්න + disable_sign_in_token_auth: ඊමේල් ටෝකන් සත්යාපනය අක්රීය කරන්න + disable_two_factor_authentication: 2FA අබල කරන්න + disabled: ශීත කළ + display_name: ප්රදර්ශන නාමය domain: වසම edit: සංස්කරණය email: විද්යුත් තැපෑල email_status: වි-තැපෑලෙහි තත්වය + enable: කැටි කිරීම ඉවත් කරන්න + enable_sign_in_token_auth: විද්යුත් තැපෑල ටෝකන් සත්යාපනය සබල කරන්න enabled: සබල කර ඇත + enabled_msg: "%{username}ගේ ගිණුම සාර්ථකව අත්හිටුවා ඇත" + followers: අනුගාමිකයින් + follows: පහත සඳහන් header: ශීර්ෂය - invite_request_text: එක්වීම සඳහා හේතුව + inbox_url: එන ලිපි URL + invite_request_text: එක්වීම සඳහා + invited_by: විසින් ආරාධනා කරන ලදී ip: අ.ජා. කෙ. (IP) joined: එක් වී ඇත location: @@ -70,110 +144,410 @@ si: title: ස්ථානය login_status: පිවිසීමේ තත්වය media_attachments: මාධ්ය ඇමුණුම් + memorialize: මතක සටහන් බවට පත් කරන්න + memorialized: අනුස්මරණය කරන ලදී + memorialized_msg: සාර්ථක ලෙස %{username} අනුස්මරණ ගිණුමක් බවට පත් කරන ලදී moderation: active: සක්රීයයි all: සියල්ල + pending: පොරොත්තුවෙන් suspended: අත්හිටුවන ලදි - most_recent_ip: වඩා මෑත අ.ජා.කෙ.(IP) + title: මධ්යස්ථභාවය + moderation_notes: මධ්යස්ථ සටහන් + most_recent_activity: වඩාත්ම මෑත ක්රියාකාරිත්වය + most_recent_ip: ඊට වඩා අ.ජා.කේ.(IP) + no_account_selected: කිසිවක් තෝරා නොගත් බැවින් ගිණුම් කිසිවක් වෙනස් කර නැත + no_limits_imposed: සීමාවන් පනවා නැත + not_subscribed: දායක වී නැත + pending: පොරොත්තු සමාලෝචනය perform_full_suspension: අත්හිටුවන්න + previous_strikes: පෙර වැඩ වර්ජන + previous_strikes_description_html: + one: මෙම ගිණුමට <strong>එක</strong> වර්ජනයක් ඇත. + other: මෙම ගිණුමේ වර්ජන <strong>%{count}</strong> ඇත. + promote: ප්රවර්ධනය කරන්න protocol: කෙටුම්පත - public: ප්රසිද්ධ + public: ප්රසිද්ධ + push_subscription_expires: පුෂ් දායකත්වය කල් ඉකුත් වේ redownload: පැතිකඩ නැවුම්කරන්න + redownloaded_msg: මූලාරම්භයේ සිට %{username}හි පැතිකඩ සාර්ථකව නැවුම් කරන ලදී reject: ප්රතික්ෂේප + rejected_msg: "%{username}හි ලියාපදිංචි වීමේ අයදුම්පත සාර්ථකව ප්රතික්ෂේප විය" + remove_avatar: අවතාරය ඉවත් කරන්න remove_header: ශීර්ෂය ඉවත්කරන්න + removed_avatar_msg: "%{username}ගේ අවතාර රූපය සාර්ථකව ඉවත් කරන ලදී" + removed_header_msg: "%{username}හි ශීර්ෂ රූපය සාර්ථකව ඉවත් කරන ලදී" + resend_confirmation: + already_confirmed: මෙම පරිශීලකයා දැනටමත් තහවුරු කර ඇත + send: තහවුරුකිරීමේ විද්යුත් තැපැල් පණිවිඩය නැවත එවන්න + success: තහවුරු කිරීමේ විද්යුත් තැපෑල සාර්ථකව යවා ඇත! reset: නැවත සකසන්න reset_password: මුරපදය නැවතසකසන්න - role: අවසරයන් - roles: - admin: පරිපාලක - staff: කාර්ය මණ්ඩලය - user: පරිශීලක + resubscribe: නැවත දායක වන්න search: සොයන්න + search_same_email_domain: එකම විද්යුත් තැපැල් වසම සහිත වෙනත් පරිශීලකයන් + search_same_ip: එකම IP සහිත වෙනත් පරිශීලකයන් security_measures: only_password: මුරපදය පමණි + password_and_2fa: මුරපදය සහ 2FA sensitive: සංවේදී + sensitized: සංවේදී ලෙස සලකුණු කර ඇත + shared_inbox_url: බෙදාගත් එන ලිපි URL + show: + created_reports: වාර්තා හැදුවා + targeted_reports: වෙනත් අය විසින් වාර්තා කරන ලදී silence: සීමාව silenced: සීමාසහිත - statuses: තත්වයන් + statuses: තත්ත්වයන් + strikes: පෙර වැඩ වර්ජන + subscribe: දායක වන්න + suspend: අත්හිටුවන්න suspended: අත්හිටුවන ලදි + suspension_irreversible: මෙම ගිණුමේ දත්ත ආපසු හැරවිය නොහැකි ලෙස මකා ඇත. ඔබට එය භාවිතා කළ හැකි බවට පත් කිරීම සඳහා ගිණුම අත්හිටුවිය හැක නමුත් එය පෙර තිබූ දත්ත කිසිවක් ප්රතිසාධනය නොකරයි. + suspension_reversible_hint_html: ගිණුම අත්හිටුවා ඇති අතර, දත්ත සම්පූර්ණයෙන්ම %{date}දින ඉවත් කරනු ලැබේ. එතෙක් කිසිදු අයහපත් ප්රතිඵලයකින් තොරව ගිණුම යථා තත්ත්වයට පත් කළ හැක. ඔබට ගිණුමේ සියලුම දත්ත වහාම ඉවත් කිරීමට අවශ්ය නම්, ඔබට එය පහතින් කළ හැක. title: ගිණුම් + unblock_email: ඊමේල් ලිපිනය අවහිර කිරීම ඉවත් කරන්න + unblocked_email_msg: "%{username}ගේ විද්යුත් තැපැල් ලිපිනය අවහිර කිරීම සාර්ථකව ඉවත් කරන ලදී" + unconfirmed_email: තහවුරු නොකළ ඊමේල් + undo_sensitized: බල සංවේදී අහෝසි කරන්න + undo_silenced: සීමාව අහෝසි කරන්න + undo_suspension: අත්හිටුවීම අහෝසි කරන්න + unsilenced_msg: "%{username}ගිණුමේ සීමාව සාර්ථකව ඉවත් කරන ලදී" + unsubscribe: දායක නොවන්න + unsuspended_msg: "%{username}ගිණුම සාර්ථකව අත්හිටුවන ලදී" username: පරිශීලක නාමය + view_domain: වසම සඳහා සාරාංශය බලන්න warn: අවවාද web: වියමන + whitelisted: ෆෙඩරේෂන් සඳහා අවසර ඇත action_logs: action_types: - change_email_user: පරිශීලකට වි-තැපෑල වෙනස් කරන්න + approve_appeal: අභියාචනය අනුමත කරන්න + approve_user: පරිශීලක අනුමත කරන්න + assigned_to_self_report: වාර්තාව පැවරීම + change_email_user: පරිශීලකයින්ට වි-තැපෑල වෙනස් කරන්න + confirm_user: පරිශීලක තහවුරු කරන්න create_account_warning: අවවාදයක් සාදන්න create_announcement: නිවේදනය සාදන්න + create_custom_emoji: අභිරුචි ඉමොජි සාදන්න create_domain_allow: වසම් ඉඩදීමක් සාදන්න create_domain_block: වසම් අවහිරයක් සාදන්න + create_email_domain_block: ඊමේල් ඩොමේන් බ්ලොක් එකක් සාදන්න create_ip_block: අ.ජා. කෙ. (IP) නීතියක් සාදන්න - disable_user: පරිශීලක අබල කරන්න + create_unavailable_domain: ලබා ගත නොහැකි වසම සාදන්න + demote_user: පරිශීලකයා පහත් කරන්න + destroy_announcement: නිවේදනය මකන්න + destroy_custom_emoji: අභිරුචි ඉමොජි මකන්න + destroy_domain_allow: වසම මකන්න ඉඩ දෙන්න + destroy_domain_block: වසම් වාරණය මකන්න + destroy_email_domain_block: ඊමේල් ඩොමේන් බ්ලොක් එක මකන්න + destroy_instance: වසම පිරිසිදු කරන්න + 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: පරිශීලක ප්රවර්ධනය කරන්න + reject_appeal: අභියාචනය ප්රතික්ෂේප කරන්න + reject_user: පරිශීලක ප්රතික්ෂේප කරන්න + remove_avatar_user: Avatar ඉවත් කරන්න reopen_report: වාර්තාව නැවත විවෘත කරන්න reset_password_user: මුරපදය නැවතසකසන්න - suspend_account: ගිණුම අත්හිටුවන්න + resolve_report: වාර්තාව විසඳන්න + sensitive_account: බල සංවේදී ගිණුම + silence_account: ගිණුම සීමා කරන්න + suspend_account: සැලකිය යුතු + unassigned_report: වාර්තාව පැවරීම ඉවත් කරන්න + unblock_email_account: ඊමේල් ලිපිනය අවහිර කිරීම ඉවත් කරන්න + unsensitive_account: බල සංවේදී ගිණුම අහෝසි කරන්න + unsilence_account: සීමාව ගිණුම අහෝසි කරන්න + unsuspend_account: ගිණුම අත්හිටුවීම update_announcement: නිවේදනය යාවත්කාල කරන්න - filter_by_action: ක්රියාමාර්ගය අනුව පෙරන්න + update_custom_emoji: අභිරුචි ඉමොජි යාවත්කාලීන කරන්න + update_domain_block: ඩොමේන් බ්ලොක් යාවත්කාලීන කරන්න + update_status: පළ කිරීම යාවත්කාලීන කරන්න + actions: + approve_appeal_html: "%{name} අනුමත මධ්යස්ථ තීරණ අභියාචනය %{target}සිට" + approve_user_html: "%{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: වසම %{target}සමඟ %{name} අවසර නොදුන් සම්මේලනය + destroy_domain_block_html: "%{name} අවහිර නොකළ වසම %{target}" + destroy_email_domain_block_html: "%{name} අවහිර නොකළ විද්යුත් තැපැල් වසම %{target}" + destroy_instance_html: "%{name} පිරිසිදු කරන ලද වසම %{target}" + destroy_ip_block_html: IP %{target}සඳහා %{name} මකා දැමූ රීතිය + 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: පරිශීලක %{target}සඳහා %{name} සක්රීය පුරනය වීම + memorialize_account_html: "%{name} %{target}ගේ ගිණුම සිහිවටන පිටුවක් බවට පත් කළේය" + promote_user_html: "%{name} උසස් පරිශීලක %{target}" + reject_appeal_html: "%{name} %{target}සිට මධ්යස්ථ තීරණ අභියාචනය ප්රතික්ෂේප කරන ලදී" + reject_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}" + unblock_email_account_html: "%{name} %{target}ගේ ඊමේල් ලිපිනය අවහිර කිරීම ඉවත් කරන ලදී" + unsensitive_account_html: "%{name} සලකුණු නොකළ %{target}ගේ මාධ්ය සංවේදී ලෙස" + unsilence_account_html: "%{target}ගිණුමේ %{name} undid සීමාව" + unsuspend_account_html: "%{name} අත්හිටුවන ලද %{target}ගිණුම" + update_announcement_html: "%{name} යාවත්කාලීන නිවේදනය %{target}" + update_custom_emoji_html: "%{name} යාවත්කාලීන කළ ඉමොජි %{target}" + update_domain_block_html: "%{target}සඳහා %{name} යාවත්කාලීන කරන ලද වසම් වාරණ" + update_status_html: "%{name} %{target}යාවත්කාලීන කරන ලද පළ කිරීම" + deleted_status: "(මකා දැමූ පළ කිරීම)" + empty: ලඝු-සටහන් හමු නොවිණි. + filter_by_action: ක්රියාව අනුව පෙරන්න filter_by_user: පරිශීලක අනුව පෙරන්න + title: විගණන සටහන announcements: + destroyed_msg: නිවේදනය සාර්ථකව මකා ඇත! edit: title: නිවේදනය සංස්කරණය + empty: නිවේදන කිසිවක් හමු නොවීය. live: සජීවී new: create: නිවේදනය සාදන්න title: නව නිවේදනය + publish: ප්රකාශ කරන්න published_msg: නිවේදනය සාර්ථකව ප්රකාශයට පත් කරන ලදි! + scheduled_for: "%{time}සඳහා සැලසුම් කර ඇත" + scheduled_msg: නිවේදනය නිකුත් කිරීමට නියමිතයි! title: නිවේදන + unpublish: ප්රකාශනය ඉවත් කරන්න + unpublished_msg: නිවේදනය සාර්ථකව ප්රකාශයට පත් නොකළේය! + updated_msg: නිවේදනය සාර්ථකව යාවත්කාලීන කරන ලදී! custom_emojis: + assign_category: කාණ්ඩය පැවරීම by_domain: වසම + copied_msg: ඉමොජි වල දේශීය පිටපත සාර්ථකව සාදන ලදී copy: පිටපත් + copy_failed_msg: එම ඉමොජියේ දේශීය පිටපතක් සෑදීමට නොහැකි විය create_new_category: නව ප්රවර්ගයක් සාදන්න + created_msg: ඉමොජි සාර්ථකව නිර්මාණය කළා! + delete: මකන්න + destroyed_msg: Emojo සාර්ථකව විනාශ විය! disable: අබල කරන්න disabled: අබල කර ඇත + disabled_msg: එම ඉමොජිය සාර්ථකව අබල කරන ලදී + emoji: ඉමොජි enable: සබල කරන්න enabled: සබල කර ඇත + enabled_msg: එම ඉමොජි සාර්ථකව සබල කරන ලදී + image_hint: PNG හෝ GIF %{size}දක්වා list: ලැයිස්තුව + listed: ලැයිස්තුගත කර ඇත + new: + title: නව අභිරුචි ඉමොජි එක් කරන්න + not_permitted: මෙම ක්රියාව සිදු කිරීමට ඔබට අවසර නැත + overwrite: උඩින් ලියන්න shortcode: කෙටිකේතය + shortcode_hint: අවම වශයෙන් අක්ෂර 2 ක්, අක්ෂරාංක අක්ෂර සහ යටි ඉරි පමණි + title: අභිරුචි ඉමෝජි + uncategorized: වර්ගීකරණය නොකළ + unlist: ලැයිස්තුගත නොකරන්න + unlisted: ලැයිස්තුගත නොකළ + update_failed_msg: එම ඉමොජි යාවත්කාලීන කළ නොහැකි විය + updated_msg: ඉමොජි සාර්ථකව යාවත්කාලීන කරන ලදී! upload: උඩුගත කරන්න dashboard: + active_users: ක්රියාකාරී පරිශීලකයන් + interactions: අන්තර්ක්රියා + media_storage: මාධ්ය ගබඩාව + new_users: නව පරිශීලකයන් + opened_reports: වාර්තා විවෘත විය + pending_appeals_html: + one: "<strong>%{count}</strong> අභියාචනයක් බලාපොරොත්තු වේ" + other: "<strong>%{count}</strong> අභියාචනා පොරොත්තු" + pending_reports_html: + one: "<strong>%{count}</strong> පොරොත්තු වාර්තාව" + other: "<strong>%{count}</strong> පොරොත්තු වාර්තා" + pending_tags_html: + one: "<strong>%{count}</strong> පොරොත්තු හැෂ් ටැගය" + other: "<strong>%{count}</strong> පොරොත්තු හැෂ් ටැග්" + pending_users_html: + one: "<strong>%{count}</strong> අපේක්ෂිත පරිශීලකයා" + other: "<strong>%{count}</strong> අපේක්ෂිත පරිශීලකයින්" + resolved_reports: වාර්තා විසඳා ඇත software: මෘදුකාංගය + sources: ලියාපදිංචි මූලාශ්ර + space: අවකාශය භාවිතය title: උපකරණ පුවරුව + top_languages: ඉහළම ක්රියාකාරී භාෂා + top_servers: ඉහළම ක්රියාකාරී සේවාදායකයන් + website: වෙබ් අඩවිය + disputes: + appeals: + empty: අභියාචනා හමු නොවීය. + title: අභියාචනා + domain_allows: + add_new: වසම සමඟ සම්මේලනයට ඉඩ දෙන්න + created_msg: ෆෙඩරේෂන් සඳහා වසම සාර්ථකව අවසර දී ඇත + destroyed_msg: ෆෙඩරේෂන් වෙතින් වසම අනුමත කර නැත + undo: වසම සමඟ සම්මේලනයට ඉඩ නොදෙන්න domain_blocks: + add_new: නව වසම් වාරණ එක් කරන්න + created_msg: වසම් අවහිර කිරීම දැන් සකසමින් පවතී + destroyed_msg: වසම් අවහිර කිරීම ඉවත් කර ඇත domain: වසම + edit: වසම් වාරණය සංස්කරණය කරන්න + existing_domain_block: ඔබ දැනටමත් %{name}මත දැඩි සීමාවන් පනවා ඇත. + existing_domain_block_html: ඔබ දැනටමත් %{name}මත දැඩි සීමාවන් පනවා ඇත, ඔබට <a href="%{unblock_url}">එය අවහිර කිරීම ඉවත් කිරීමට අවශ්යයි</a>. new: + create: බ්ලොක් එකක් සාදන්න + hint: ඩොමේන් බ්ලොක් එක දත්ත සමුදාය තුල ගිණුම් ඇතුලත් කිරීම් නිර්මාණය වීම වලක්වන්නේ නැත, නමුත් එම ගිණුම් වලට ප්රතික්රියාශීලීව සහ ස්වයංක්රීයව විශේෂිත මධ්යස්ථ ක්රම යොදනු ඇත. severity: + desc_html: "<strong>Silence</strong> ගිණුමේ පළ කිරීම් ඒවා අනුගමනය නොකරන ඕනෑම කෙනෙකුට නොපෙනී යයි. <strong>අත්හිටුවීම</strong> ගිණුමේ අන්තර්ගතය, මාධ්ය සහ පැතිකඩ දත්ත සියල්ල ඉවත් කරයි. ඔබට මාධ්ය ගොනු ප්රතික්ෂේප කිරීමට අවශ්ය නම් <strong>None</strong> භාවිතා කරන්න." noop: කිසිවක් නැත + silence: නිශ්ශබ්දතාව suspend: අත්හිටුවන්න + title: නව වසම් වාරණ + obfuscate: අපැහැදිලි වසම් නාමය + obfuscate_hint: වසම් සීමාවන් ලැයිස්තුව ප්රචාරණය කිරීම සබල කර ඇත්නම් ලැයිස්තුවේ වසම් නාමය අර්ධ වශයෙන් අපැහැදිලි කරන්න private_comment: පුද්ගලික අදහස + private_comment_hint: පරිපාලකයින් විසින් අභ්යන්තර භාවිතය සඳහා මෙම වසම් සීමාව ගැන අදහස් දක්වන්න. public_comment: ප්රසිද්ධ අදහස + public_comment_hint: වසම් සීමාවන් ලැයිස්තුව ප්රචාරණය කිරීම සබල කර ඇත්නම්, සාමාන්ය ජනතාව සඳහා මෙම වසම් සීමාව ගැන අදහස් දක්වන්න. + reject_media: මාධ්ය ගොනු ප්රතික්ෂේප කරන්න + reject_media_hint: දේශීයව ගබඩා කර ඇති මාධ්ය ගොනු ඉවත් කරන අතර අනාගතයේදී ඒවා බාගත කිරීම ප්රතික්ෂේප කරයි. අත්හිටුවීම් සඳහා අදාළ නොවේ reject_reports: වාර්තා ප්රතික්ෂේප කරන්න + reject_reports_hint: මෙම වසමෙන් එන සියලුම වාර්තා නොසලකා හරින්න. අත්හිටුවීම් සඳහා අදාළ නොවේ + undo: වසම් අවහිර කිරීම අහෝසි කරන්න + view: වසම් වාරණය බලන්න email_domain_blocks: + add_new: අලුතින් එකතු කරන්න + attempts_over_week: + one: පසුගිය සතිය පුරා %{count} උත්සාහයක් + other: පසුගිය සතියේ ලියාපදිංචි වීමේ උත්සාහයන් %{count} ක් + created_msg: විද්යුත් තැපැල් වසම සාර්ථකව අවහිර කරන ලදී + delete: මකන්න + dns: + types: + mx: MX වාර්තාව domain: වසම new: create: වසම එකතු කරන්න + resolve: වසම විසඳන්න + title: නව විද්යුත් තැපැල් වසම අවහිර කරන්න + no_email_domain_block_selected: කිසිවක් තෝරා නොගත් බැවින් විද්යුත් තැපැල් වසම් වාරණ කිසිවක් වෙනස් කර නැත + resolved_dns_records_hint_html: ඩොමේන් නාමය පහත දැක්වෙන MX වසම් වලට විසඳයි, ඒවා අවසානයේ ඊමේල් පිළිගැනීම සඳහා වගකිව යුතුය. MX වසමක් අවහිර කිරීම දෘශ්ය වසම් නාමය වෙනස් වුවද, එකම MX වසම භාවිතා කරන ඕනෑම විද්යුත් තැපැල් ලිපිනයකින් ලියාපදිංචි වීම අවහිර කරයි. <strong>ප්රධාන විද්යුත් තැපැල් සපයන්නන් අවහිර නොකිරීමට ප්රවේශම් වන්න.</strong> + resolved_through_html: "%{domain}හරහා විසඳා ඇත" title: අවහිර කළ වි-තැපැල් වසම් follow_recommendations: + description_html: "<strong>නව පරිශීලකයින්ට රසවත් අන්තර්ගතයන් ඉක්මනින් සොයා ගැනීමට උපකාර වන නිර්දේශ අනුගමනය කරන්න</strong>. පෞද්ගලීකරණය කළ පසු විපරම් නිර්දේශ සැකසීමට තරම් පරිශීලකයෙකු අන් අය සමඟ අන්තර් ක්රියා කර නොමැති විට, ඒ වෙනුවට මෙම ගිණුම් නිර්දේශ කෙරේ. දී ඇති භාෂාවක් සඳහා ඉහළම මෑත කාලීන නියැලීම් සහ ඉහළම දේශීය අනුගාමික සංඛ්යාව සහිත ගිණුම් මිශ්රණයකින් ඒවා දෛනික පදනමින් නැවත ගණනය කෙරේ." language: භාෂාව සඳහා - status: තත්වය + status: තත්ත්වය + suppress: අනුගමනය නිර්දේශය යටපත් කරන්න + suppressed: යටපත් කළා + title: නිර්දේශ අනුගමනය කරන්න + unsuppress: නිර්දේශ පිළිපැදීම ප්රතිසාධනය කරන්න instances: + availability: + description_html: + one: වසම වෙත බෙදා හැරීම සාර්ථක නොවී දින <strong>%{count}</strong> අසාර්ථක වුවහොත්, වසම</em> න් <em>බෙදා හැරීමක් ලැබෙන්නේ නම් මිස වැඩිදුර බෙදා හැරීමේ උත්සාහයන් සිදු නොකෙරේ. + other: වසම වෙත බෙදා හැරීම සාර්ථක නොවී <strong>%{count} වෙනස් දින</strong> අසාර්ථක වුවහොත්, වසම</em> සිට <em>බෙදා හැරීමක් නොලැබුනේ නම්, තවදුරටත් බෙදා හැරීමේ උත්සාහයන් සිදු නොකෙරේ. + failure_threshold_reached: අසාර්ථක වීමේ සීමාව %{date}ට ළඟා විය. + failures_recorded: + one: දින %{count} කින් අසාර්ථක උත්සාහයක්. + other: විවිධ දින %{count} ක අසාර්ථක උත්සාහයන්. + no_failures_recorded: වාර්තාගත අසාර්ථක වීම් නොමැත. + title: පවතින බව + warning: මෙම සේවාදායකයට සම්බන්ධ වීමට ගත් අවසන් උත්සාහය අසාර්ථක විය back_to_all: සියල්ල + back_to_limited: සීමා සහිතයි back_to_warning: අවවාදයයි by_domain: වසම + confirm_purge: ඔබට මෙම වසමෙන් දත්ත ස්ථිරවම මැකීමට අවශ්ය බව විශ්වාසද? + content_policies: + comment: අභ්යන්තර සටහන + description_html: ඔබට මෙම වසම සහ එහි ඕනෑම උප වසමකින් සියලුම ගිණුම් වලට අදාළ වන අන්තර්ගත ප්රතිපත්ති නිර්වචනය කළ හැක. + policies: + reject_media: මාධ්ය ප්රතික්ෂේප කරන්න + reject_reports: වාර්තා ප්රතික්ෂේප කරන්න + silence: සීමාව + suspend: අත්හිටුවන්න + policy: ප්රතිපත්ති + reason: පොදු හේතුව + title: අන්තර්ගත ප්රතිපත්ති + dashboard: + instance_accounts_dimension: වැඩිපුරම අනුගමනය කරන ගිණුම් + instance_accounts_measure: ගබඩා කර ඇති ගිණුම් + instance_followers_measure: එතන අපේ අනුගාමිකයෝ + instance_follows_measure: ඔවුන්ගේ අනුගාමිකයන් මෙහි + instance_languages_dimension: ඉහළම භාෂා + instance_media_attachments_measure: ගබඩා කළ මාධ්ය ඇමුණුම් + instance_reports_measure: ඔවුන් ගැන වාර්තා + instance_statuses_measure: ගබඩා කළ තනතුරු delivery: all: සියල්ල + clear: බෙදා හැරීමේ දෝෂ ඉවත් කරන්න + failing: අසාර්ථක වෙනවා + restart: බෙදා හැරීම නැවත ආරම්භ කරන්න + stop: බෙදා හැරීම නවත්වන්න + unavailable: ලබා ගත නොහැක + delivery_available: බෙදා හැරීම ලබා ගත හැකිය + delivery_error_days: බෙදා හැරීමේ දෝෂ සහිත දින + delivery_error_hint: දින %{count} ක් සඳහා බෙදා හැරීම කළ නොහැකි නම්, එය ස්වයංක්රීයව බෙදා හැරිය නොහැකි ලෙස ලකුණු කරනු ලැබේ. + destroyed_msg: "%{domain} සිට දත්ත දැන් ආසන්න මකාදැමීම සඳහා පෝලිම් කර ඇත." + empty: වසම් කිසිවක් හමු නොවීය. + known_accounts: + one: "%{count} දන්නා ගිණුම්" + other: දන්නා ගිණුම් %{count} ක් moderation: all: සියල්ල + limited: සීමා සහිතයි + title: මධ්යස්ථභාවය private_comment: පුද්ගලික අදහස public_comment: ප්රසිද්ධ අදහස + purge: පිරිසිදු කරන්න + purge_description_html: මෙම වසම යහපත සඳහා නොබැඳි බව ඔබ විශ්වාස කරන්නේ නම්, ඔබට ඔබගේ ගබඩාවෙන් මෙම වසමෙන් සියලුම ගිණුම් වාර්තා සහ ආශ්රිත දත්ත මකා දැමිය හැක. මෙයට යම් කාලයක් ගත විය හැක. + title: සම්මේලනය + total_blocked_by_us: අප විසින් අවහිර කරන ලදී + total_followed_by_them: ඔවුන් විසින් අනුගමනය කරන ලදී + total_followed_by_us: අප විසින් අනුගමනය කරන ලදී + total_reported: ඔවුන් ගැන වාර්තා + total_storage: මාධ්ය ඇමුණුම් + totals_time_period_hint_html: පහත දැක්වෙන එකතුවෙහි සියලු කාලය සඳහා දත්ත ඇතුළත් වේ. invites: + deactivate_all: සියල්ල අක්රිය කරන්න filter: all: සියල්ල + available: පවතින expired: කල් ඉකුත් වී ඇත title: පෙරහන title: ඇරයුම් ip_blocks: add_new: නීතිය සාදන්න + created_msg: නව IP රීතිය සාර්ථකව එක් කරන ලදී + delete: මකන්න expires_in: '1209600': සති 2 '15778476': මාස 6 @@ -183,116 +557,608 @@ si: '94670856': අවුරුදු 3 new: title: නව අ.ජා. කෙ.(IP) නීතියක් සාදන්න + no_ip_block_selected: IP රීති කිසිවක් තෝරා නොගත් බැවින් වෙනස් කර නැත title: අ.ජා. කෙ. (IP) නීති + relationships: + title: "%{acct}හි සබඳතා" relays: + add_new: නව රිලේ එක් කරන්න + delete: මකන්න + description_html: "<strong>ෆෙඩරේෂන් රිලේ</strong> යනු එයට දායක වී ප්රකාශයට පත් කරන සේවාදායකයන් අතර විශාල ප්රසිද්ධ පළ කිරීම් හුවමාරු කරන අතරමැදි සේවාදායකයකි. <strong>එය කුඩා සහ මධ්යම සේවාදායකයන්ට fediverse</strong>වෙතින් අන්තර්ගතය සොයා ගැනීමට උදවු කළ හැකි අතර, එසේ නොමැති නම් දේශීය පරිශීලකයින්ට දුරස්ථ සේවාදායකයන් මත වෙනත් පුද්ගලයින් හස්තීයව අනුගමනය කිරීම අවශ්ය වේ." disable: අබල කරන්න disabled: අබල කර ඇත enable: සබල කරන්න + enable_hint: සක්රිය කළ පසු, ඔබේ සේවාදායකය මෙම රිලේ වෙතින් සියලුම පොදු පළ කිරීම් සඳහා දායක වන අතර, මෙම සේවාදායකයේ පොදු පළ කිරීම් එයට යැවීම ආරම්භ කරනු ඇත. enabled: සබල කර ඇත + inbox_url: රිලේ URL + pending: රිලේ අනුමැතිය සඳහා රැඳී සිටිමින් + save_and_enable: සුරකින්න සහ සක්රිය කරන්න + setup: රිලේ සම්බන්ධතාවයක් සකසන්න + signatures_not_enabled: ආරක්ෂිත මාදිලිය හෝ සීමිත ෆෙඩරේෂන් මාදිලිය සබල කර ඇති අතර රිලේ නිවැරදිව ක්රියා නොකරනු ඇත status: තත්වය + title: රිලේස් + report_notes: + created_msg: වාර්තා සටහන සාර්ථකව සාදන ලදී! + destroyed_msg: වාර්තා සටහන සාර්ථකව මකා ඇත! + today_at: අද %{time}ට reports: + account: + notes: + one: "%{count} සටහන" + other: "%{count} සටහන්" + action_log: විගණන සටහන + action_taken_by: විසින් ගන්නා ලද පියවර + actions: + delete_description_html: වාර්තා කරන ලද පළ කිරීම් මකා දැමෙනු ඇති අතර එම ගිණුමේම අනාගත උල්ලංඝනයන් තීව්ර කිරීමට ඔබට උදවු කිරීමට වර්ජනයක් වාර්තා කරනු ඇත. + mark_as_sensitive_description_html: වාර්තා කරන ලද පළ කිරීම් වල මාධ්ය සංවේදී ලෙස සලකුණු කරනු ලබන අතර එම ගිණුම මගින් අනාගත උල්ලංඝනයන් උත්සන්න කිරීමට ඔබට උපකාර කිරීමට වර්ජනයක් වාර්තා කරනු ඇත. + other_description_html: ගිණුමේ හැසිරීම පාලනය කිරීම සහ වාර්තා කළ ගිණුමට සන්නිවේදනය අභිරුචිකරණය කිරීම සඳහා තවත් විකල්ප බලන්න. + resolve_description_html: වාර්තා කරන ලද ගිණුමට එරෙහිව කිසිදු ක්රියාමාර්ගයක් නොගනු ඇත, වැඩ වර්ජනයක් වාර්තා නොකෙරේ, වාර්තාව වසා දමනු ඇත. + silence_description_html: පැතිකඩ දෘශ්යමාන වනු ඇත්තේ දැනටමත් එය අනුගමනය කරන හෝ අතින් බලන අයට පමණක් වන අතර, එහි ළඟාවීම දැඩි ලෙස සීමා කරයි. සෑම විටම ආපසු හැරවිය හැක. + suspend_description_html: එය අවසානයේ මකා දමන තුරු පැතිකඩ සහ එහි සියලුම අන්තර්ගතයන් ප්රවේශ විය නොහැකි වනු ඇත. ගිණුම සමඟ අන්තර් ක්රියා කිරීම කළ නොහැකි වනු ඇත. දින 30 ක් ඇතුළත ආපසු හැරවිය හැකිය. + actions_description_html: මෙම වාර්තාව විසඳීමට ගත යුතු ක්රියාමාර්ගය තීරණය කරන්න. ඔබ වාර්තා කරන ලද ගිණුමට එරෙහිව දණ්ඩනීය ක්රියාමාර්ගයක් ගන්නේ නම්, <strong>Spam</strong> කාණ්ඩය තෝරාගත් විට හැර, ඔවුන්ට විද්යුත් තැපෑලෙන් දැනුම්දීමක් යවනු ලැබේ. + add_to_report: වාර්තා කිරීමට තවත් එක් කරන්න are_you_sure: ඔබට විශ්වාසද? + assign_to_self: මට පවරන්න + assigned: පවරා ඇති උපපරිපාලක by_target_domain: වාර්තා කළ ගිණුමෙහි වසම + category: වර්ගය + category_description_html: මෙම ගිණුම සහ/හෝ අන්තර්ගතය වාර්තා කළ හේතුව වාර්තා කළ ගිණුම සමඟ සන්නිවේදනයේ සඳහන් කරනු ඇත comment: none: කිසිවක් නැත + comment_description_html: 'වැඩි විස්තර සැපයීම සඳහා, %{name} ලිවීය:' + created_at: වාර්තා කර ඇත + delete_and_resolve: පළ කිරීම් මකන්න + forwarded: යොමු කළා + forwarded_to: "%{domain}වෙත යොමු කරන ලදී" + mark_as_resolved: විසඳා ඇති ලෙස ලකුණු කරන්න + mark_as_sensitive: සංවේදී ලෙස ලකුණු කරන්න + mark_as_unresolved: නොවිසඳුනු ලෙස ලකුණු කරන්න + no_one_assigned: කිසි කෙනෙක නැහැ notes: create: සටහන එකතු කරන්න + create_and_resolve: සටහන සමඟ විසඳන්න + create_and_unresolve: සටහනක් සමඟ නැවත විවෘත කරන්න + delete: මකන්න + placeholder: ගෙන ඇති ක්රියාමාර්ග, හෝ වෙනත් අදාළ යාවත්කාලීන විස්තර කරන්න... + title: සටහන් + notes_description_html: අනෙකුත් උපපරිපාලකයින්ට සහ ඔබේ අනාගතයට සටහන් බලන්න සහ තබන්න + quick_actions_description_html: 'වාර්තා කළ අන්තර්ගතය බැලීමට ඉක්මන් ක්රියාමාර්ගයක් ගන්න හෝ පහළට අනුචලනය කරන්න:' + remote_user_placeholder: "%{instance}සිට දුරස්ථ පරිශීලකයා" reopen: වාර්තාව නැවත විවෘත කරන්න report: "@%{id} වාර්තා කරන්න" reported_account: වාර්තා කළ ගිණුම + reported_by: විසින් වාර්තා + resolved: විසඳා ඇත + resolved_msg: වාර්තාව සාර්ථකව විසඳා ඇත! + skip_to_actions: ක්රියාවන් වෙත යන්න status: තත්වය + statuses: වාර්තා කළ අන්තර්ගතය + statuses_description_html: වාර්තා කරන ලද ගිණුම සමඟ සන්නිවේදනය කිරීමේදී වැරදි අන්තර්ගතයන් උපුටා දක්වනු ඇත + target_origin: වාර්තා කළ ගිණුමේ ආරම්භය title: වාර්තා + unassign: පැවරීම ඉවත් කරන්න + unresolved: නොවිසඳී ඇත + updated_at: යාවත්කාලීන කරන ලදී + view_profile: පැතිකඩ බලන්න rules: add_new: නීතිය එකතු කරන්න + delete: මකන්න + description_html: බොහෝ දෙනා සේවා කොන්දේසි කියවා එකඟ වූ බව ප්රකාශ කරන අතර, සාමාන්යයෙන් මිනිසුන් ගැටලුවක් පැනනඟින තුරු කියවා නොගනිති. <strong>පැතලි බුලට් පොයින්ට් ලිස්ට් එකකින් ඒවා ලබා දීමෙන් බැලූ බැල්මට ඔබේ සේවාදායකයේ නීති බැලීම පහසු කරන්න.</strong> තනි නීති කෙටි හා සරලව තබා ගැනීමට උත්සාහ කරන්න, නමුත් ඒවා විවිධ අයිතම වලට බෙදීමට උත්සාහ නොකරන්න. edit: නීතිය සංස්කරණය කරන්න + empty: තවමත් සේවාදායක රීති නිර්වචනය කර නොමැත. title: සේවාදායකයේ නීති settings: + activity_api_enabled: + desc_html: සතිපතා බාල්දිවල දේශීයව ප්රකාශිත පළ කිරීම්, ක්රියාකාරී පරිශීලකයින් සහ නව ලියාපදිංචි කිරීම් ගණන + title: API හි පරිශීලක ක්රියාකාරකම් පිළිබඳ සමස්ත සංඛ්යාලේඛන ප්රකාශයට පත් කරන්න + bootstrap_timeline_accounts: + desc_html: බහු පරිශීලක නාම කොමාවෙන් වෙන් කරන්න. මෙම ගිණුම් පහත සඳහන් නිර්දේශවල පෙන්වීමට සහතික වනු ඇත + title: නව පරිශීලකයින්ට මෙම ගිණුම් නිර්දේශ කරන්න contact_information: email: ව්යාපාරික වි-තැපෑල + username: පරිශීලක නාමය අමතන්න + custom_css: + desc_html: සෑම පිටුවකම පටවා ඇති CSS සමඟ පෙනුම වෙනස් කරන්න + title: අභිරුචි CSS + default_noindex: + desc_html: මෙම සැකසුම තමන් විසින්ම වෙනස් කර නොමැති සියලුම පරිශීලකයින්ට බලපායි + title: පෙරනිමියෙන් සෙවුම් යන්ත්ර සුචිගත කිරීමෙන් පරිශීලකයින් ඉවත් කරන්න + domain_blocks: + all: හැමෝටම + disabled: කාටවත් නෑ + title: වසම් වාරණ පෙන්වන්න + users: පුරනය වී ඇති දේශීය පරිශීලකයින් වෙත + domain_blocks_rationale: + title: තාර්කිකත්වය පෙන්වන්න + hero: + desc_html: මුල් පිටුවේ ප්රදර්ශනය කෙරේ. අවම වශයෙන් 600x100px නිර්දේශිතයි. සකසා නොමැති විට, සේවාදායක සිඟිති රුව වෙත ආපසු වැටේ + title: වීර රූපය + mascot: + desc_html: පිටු කිහිපයක ප්රදර්ශනය කෙරේ. අවම වශයෙන් 293×205px නිර්දේශිතයි. සකසා නොමැති විට, පෙරනිමි මැස්කොට් වෙත ආපසු වැටේ + title: මැස්කොට් රූපය + peers_api_enabled: + desc_html: මෙම සේවාදායකය fediverse තුළ හමු වූ වසම් නම් + title: API හි සොයාගත් සේවාදායක ලැයිස්තුවක් ප්රකාශයට පත් කරන්න + preview_sensitive_media: + desc_html: මාධ්ය සංවේදී ලෙස සලකුණු කළත් වෙනත් වෙබ් අඩවිවල සබැඳි පෙරදසුන් සිඟිති රූපයක් පෙන්වයි + title: OpenGraph පෙරදසුන් තුළ සංවේදී මාධ්ය පෙන්වන්න + profile_directory: + desc_html: පරිශීලකයින්ට සොයාගත හැකි වීමට ඉඩ දෙන්න + title: පැතිකඩ නාමාවලිය සබල කරන්න + registrations: + closed_message: + desc_html: ලියාපදිංචිය වසා ඇති විට මුල් පිටුවේ ප්රදර්ශනය කෙරේ. ඔබට HTML ටැග් භාවිතා කළ හැකිය + title: සංවෘත ලියාපදිංචි පණිවිඩය + deletion: + desc_html: ඕනෑම කෙනෙකුට තම ගිණුම මකා දැමීමට ඉඩ දෙන්න + title: ගිණුම් මකාදැමීම විවෘත කරන්න + require_invite_text: + desc_html: ලියාපදිංචිය සඳහා අතින් අනුමැතිය අවශ්ය වූ විට, "ඔබට සම්බන්ධ වීමට අවශ්ය වන්නේ ඇයි?" විකල්ප වෙනුවට පෙළ ආදානය අනිවාර්ය වේ + title: සම්බන්ධ වීමට හේතුවක් ඇතුළත් කිරීමට නව පරිශීලකයින්ට අවශ්ය වේ + registrations_mode: + modes: + approved: ලියාපදිංචි වීමට අනුමැතිය අවශ්යයි + none: කිසිවෙකුට ලියාපදිංචි විය නොහැක + open: ඕනෑම කෙනෙකුට ලියාපදිංචි විය හැක + title: ලියාපදිංචි කිරීමේ මාදිලිය + show_known_fediverse_at_about_page: + desc_html: අබල කළ විට, ගොඩබෑමේ පිටුවෙන් සම්බන්ධ කර ඇති පොදු කාලරාමුව දේශීය අන්තර්ගතය පමණක් පෙන්වීමට සීමා කරයි + title: සත්යාපනය නොකළ පොදු කාලරේඛා පිටුවේ ෆෙඩරේටඩ් අන්තර්ගතය ඇතුළත් කරන්න site_description: + desc_html: API හි හඳුන්වාදීමේ ඡේදය. මෙම Mastodon සේවාදායකය විශේෂ වන්නේ කුමක්ද සහ වෙනත් වැදගත් දෙයක් විස්තර කරන්න. ඔබට HTML ටැග් භාවිතා කළ හැකිය, විශේෂයෙන් <code><a></code> සහ <code><em></code>. title: සේවාදායකයේ සවිස්තරය + site_description_extended: + 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 නිර්දේශිතයි + title: සේවාදායක සිඟිති රුව + timeline_preview: + desc_html: ගොඩබෑමේ පිටුවේ පොදු කාලරාමුව වෙත සබැඳිය සංදර්ශනය කරන්න සහ සත්යාපනයකින් තොරව පොදු කාලරේඛාවට API ප්රවේශයට ඉඩ දෙන්න + title: පොදු කාලරේඛාවට අනවසර පිවිසීමට ඉඩ දෙන්න title: අඩවියේ සැකසුම් + trendable_by_default: + desc_html: කලින් අවසර නොදුන් හැෂ් ටැග් වලට බලපායි + title: පෙර සමාලෝචනයකින් තොරව හැෂ් ටැග් වලට නැඹුරු වීමට ඉඩ දෙන්න + trends: + desc_html: දැනට ප්රවණතා ඇති කලින් සමාලෝචනය කළ අන්තර්ගතය ප්රසිද්ධියේ සංදර්ශන කරන්න + title: ප්රවණතා + site_uploads: + delete: උඩුගත කළ ගොනුව මකන්න + destroyed_msg: අඩවිය උඩුගත කිරීම සාර්ථකව මකා ඇත! statuses: back_to_account: ගිණුම් පිටුවට ආපසු යන්න + back_to_report: වාර්තා පිටුවට ආපසු යන්න + batch: + remove_from_report: වාර්තාවෙන් ඉවත් කරන්න + report: වාර්තාව + deleted: මකා දමන ලදී media: title: මාධ්යය - with_media: මාධ්ය සමඟ + no_status_selected: කිසිවක් තෝරා නොගත් බැවින් තනතුරු කිසිවක් වෙනස් කර නැත + title: ගිණුම් තනතුරු + with_media: මාධ්ය දායකත්වය + strikes: + actions: + delete_statuses: "%{target}ගේ පළ කිරීම් %{name} මකා දමන ලදී" + disable: "%{name} %{target}ගේ ගිණුම නිශ්චල කළේය" + mark_statuses_as_sensitive: "%{name} %{target}ගේ පළ කිරීම් සංවේදී ලෙස ලකුණු කර ඇත" + none: "%{name} %{target}අනතුරු ඇඟවීමක් යවා ඇත" + sensitive: "%{name} %{target}ගේ ගිණුම සංවේදී ලෙස ලකුණු කර ඇත" + silence: "%{name} සීමිත %{target}ගිණුමක්" + suspend: "%{name} %{target}ගේ ගිණුම අත්හිටුවා ඇත" + appeal_approved: අභියාචනා කළා + appeal_pending: අභියාචනය පොරොත්තුවෙන් + system_checks: + database_schema_check: + message_html: පොරොත්තු දත්ත සමුදා සංක්රමණයන් ඇත. යෙදුම අපේක්ෂිත පරිදි ක්රියා කරන බව සහතික කිරීමට කරුණාකර ඒවා ධාවනය කරන්න + elasticsearch_running_check: + message_html: Elasticsearch වෙත සම්බන්ධ වීමට නොහැකි විය. කරුණාකර එය ක්රියාත්මක වන බව පරීක්ෂා කරන්න, නැතහොත් සම්පූර්ණ පෙළ සෙවීම අක්රීය කරන්න + elasticsearch_version_check: + message_html: 'නොගැලපෙන ඉලාස්ටික් සෙවුම් අනුවාදය: %{value}' + version_comparison: Elasticsearch %{running_version} ක්රියාත්මක වන අතර %{required_version} අවශ්ය වේ + rules_check: + action: සේවාදායක නීති කළමනාකරණය කරන්න + message_html: ඔබ සේවාදායක රීති කිසිවක් නිර්වචනය කර නැත. + sidekiq_process_check: + message_html: "%{value} පෝලිම්(ය) සඳහා Sidekiq ක්රියාවලියක් ක්රියාත්මක නොවේ. කරුණාකර ඔබේ Sidekiq වින්යාසය සමාලෝචනය කරන්න" + tags: + review: තත්ත්වය සමාලෝචනය කරන්න + updated_msg: Hashtag සැකසුම් සාර්ථකව යාවත්කාලීන කරන ලදී title: පරිපාලනය + trends: + allow: ඉඩ දෙන්න + approved: අනුමත කළා + disallow: අවසර නොදෙන්න + links: + allow: සබැඳියට ඉඩ දෙන්න + allow_provider: ප්රකාශකයාට ඉඩ දෙන්න + description_html: මේවා ඔබගේ සේවාදායකය විසින් පළ කිරීම් දකින ගිණුම් මගින් දැනට බොහෝ සෙයින් බෙදා ගන්නා සබැඳි වේ. එය ඔබගේ පරිශීලකයින්ට ලෝකයේ සිදුවෙමින් පවතින දේ සොයා ගැනීමට උදවු කළ හැක. ඔබ ප්රකාශකයා අනුමත කරන තුරු සබැඳි කිසිවක් ප්රසිද්ධියේ ප්රදර්ශනය නොවේ. ඔබට තනි සබැඳිවලට ඉඩ දීමට හෝ ප්රතික්ෂේප කිරීමටද හැකිය. + disallow: සබැඳියට ඉඩ නොදෙන්න + disallow_provider: ප්රකාශකයාට ඉඩ නොදෙන්න + shared_by_over_week: + one: පසුගිය සතිය පුරා එක් පුද්ගලයෙකු විසින් බෙදා ගන්නා ලදී + other: පසුගිය සතිය පුරා පුද්ගලයින් %{count} දෙනෙකු විසින් බෙදා ගන්නා ලදී + title: නැඟී එන සබැඳි + usage_comparison: ඊයේ %{yesterday} හා සසඳන විට අද %{today} වරක් බෙදා ගන්නා ලදී + only_allowed: අවසර දී ඇත + pending_review: පොරොත්තු සමාලෝචනය + preview_card_providers: + allowed: මෙම ප්රකාශකයාගේ සබැඳි නැඹුරු විය හැක + description_html: මේවා බොහෝ විට ඔබගේ සේවාදායකයේ සබැඳි බෙදා ගන්නා වසම් වේ. සබැඳියේ වසම අනුමත කරන්නේ නම් මිස සබැඳි ප්රසිද්ධියේ නැඹුරු නොවේ. ඔබගේ අනුමැතිය (හෝ ප්රතික්ෂේප කිරීම) උපවසම් දක්වා විහිදේ. + rejected: මෙම ප්රකාශකයාගේ සබැඳි නැඹුරු නොවනු ඇත + title: ප්රකාශකයන් + rejected: ප්රතික්ෂේප කළා + statuses: + allow: පළ කිරීමට ඉඩ දෙන්න + allow_account: කතුවරයාට ඉඩ දෙන්න + description_html: මේ වන විට ඔබේ සේවාදායකය දන්නා පෝස්ට් මේ වන විට බොහෝ බෙදාහරින සහ මේ මොහොතේ වැඩි කැමැත්තක් දක්වයි. එය ඔබගේ නව සහ නැවත පැමිණෙන පරිශීලකයින්ට අනුගමනය කිරීමට තවත් පුද්ගලයින් සොයා ගැනීමට උදවු කළ හැක. ඔබ කර්තෘ අනුමත කරන තෙක් පළ කිරීම් කිසිවක් ප්රසිද්ධියේ නොපෙන්වන අතර, කර්තෘ තම ගිණුම අන් අයට යෝජනා කිරීමට ඉඩ දෙයි. ඔබට තනි පළ කිරීම්වලට ඉඩ දීමට හෝ ප්රතික්ෂේප කිරීමටද හැකිය. + disallow: පළ කිරීමට ඉඩ නොදෙන්න + disallow_account: කතුවරයාට ඉඩ නොදෙන්න + not_discoverable: කර්තෘ සොයා ගත හැකි බව තෝරාගෙන නැත + shared_by: + one: එක් වරක් බෙදාගත් හෝ ප්රිය කරන ලදී + other: "%{friendly_count} වරක් බෙදාගෙන ප්රිය කරන ලදී" + title: ප්රවණතා පළ කිරීම් + tags: + current_score: වත්මන් ලකුණු %{score} + dashboard: + tag_accounts_measure: අද්විතීය භාවිතයන් + tag_languages_dimension: ඉහළම භාෂා + tag_servers_dimension: ඉහළම සේවාදායකයන් + tag_servers_measure: විවිධ සේවාදායකයන් + tag_uses_measure: සම්පූර්ණ භාවිතය + description_html: මේවා දැනට ඔබගේ සේවාදායකය දකින බොහෝ පළ කිරීම් වල දිස්වන හැෂ් ටැග් වේ. මේ මොහොතේ මිනිසුන් වැඩිපුරම කතා කරන්නේ කුමක් දැයි සොයා ගැනීමට එය ඔබගේ පරිශීලකයින්ට උදවු කළ හැක. ඔබ ඒවා අනුමත කරන තුරු හෑෂ් ටැග් ප්රසිද්ධියේ නොපෙන්වයි. + listable: යෝජනා කළ හැක + not_listable: යෝජනා නොකරනු ඇත + not_trendable: ප්රවණතා යටතේ දිස් නොවනු ඇත + not_usable: භාවිතා කළ නොහැක + peaked_on_and_decaying: "%{date}හි උච්චතම, දැන් දිරාපත් වෙමින් පවතී" + title: ප්රවණතා හැෂ් ටැග් + trendable: ප්රවණතා යටතේ පෙනී සිටිය හැක + trending_rank: 'නැඹුරු #%{rank}' + usable: භාවිතා කළ හැක + usage_comparison: ඊයේ %{yesterday} හා සසඳන විට අද %{today} වරක් භාවිතා වේ + used_by_over_week: + one: පසුගිය සතිය පුරා එක් පුද්ගලයෙකු විසින් භාවිතා කරන ලදී + other: පසුගිය සතිය පුරා පුද්ගලයින් %{count} දෙනෙකු විසින් භාවිතා කරන ලදී + title: ප්රවණතා + trending: ප්රවණතා + warning_presets: + add_new: අලුතින් එකතු කරන්න + delete: මකන්න + edit_preset: අනතුරු ඇඟවීමේ පෙර සැකසුම සංස්කරණය කරන්න + empty: ඔබ තවම කිසිදු අනතුරු ඇඟවීමේ පෙරසිටුවක් නිර්වචනය කර නැත. + title: අනතුරු ඇඟවීමේ පෙරසිටුවීම් කළමනාකරණය කරන්න + webhooks: + add_new: අන්ත ලක්ෂ්යය එක් කරන්න + delete: මකන්න + description_html: A <strong>webhook</strong> Mastodon හට තෝරාගත් සිදුවීම් පිළිබඳ තත්ය කාලීන දැනුම්දීම් <strong>ක්</strong> ඔබේම යෙදුමට තල්ලු කිරීමට හැකියාව ලබා දෙයි, එම නිසා ඔබේ යෙදුමට <strong>ස්වයංක්රීයව ප්රතික්රියා අවුලුවාලීමට හැකිය</strong>. + disable: අක්රිය කරන්න + disabled: ආබාධිතයි + edit: අන්ත ලක්ෂ්යය සංස්කරණය කරන්න + empty: ඔබට තවම වින්යාස කර ඇති කිසිදු webhook අන්ත ලක්ෂ්යයක් නොමැත. + enable: සබල කරන්න + enabled: ක්රියාකාරී + enabled_events: + one: 1 සබල කළ සිදුවීමක් + other: "%{count} සබල කළ සිදුවීම්" + events: සිදුවීම් + new: නව webhook + rotate_secret: රහස කරකවන්න + secret: අත්සන් කිරීමේ රහස + status: තත්ත්වය + webhook: වෙබ්හුක් + admin_mailer: + new_appeal: + actions: + delete_statuses: ඔවුන්ගේ පළ කිරීම් මකා දැමීමට + disable: ඔවුන්ගේ ගිණුම කැටි කිරීමට + mark_statuses_as_sensitive: ඔවුන්ගේ තනතුරු සංවේදී ලෙස සලකුණු කිරීමට + none: අනතුරු ඇඟවීමක් + sensitive: ඔවුන්ගේ ගිණුම සංවේදී ලෙස සලකුණු කිරීමට + silence: ඔවුන්ගේ ගිණුම සීමා කිරීමට + suspend: ඔවුන්ගේ ගිණුම අත්හිටුවීමට + body: "%{target} යනු %{type}ක් වූ %{date}සිට %{action_taken_by} කින් මධ්යස්ථ තීරණයක් අභියාචනා කරයි. ඔවුන් මෙසේ ලිවීය." + next_steps: ඔබට මධ්යස්ථ තීරණය අවලංගු කිරීමට අභියාචනය අනුමත කළ හැකිය, නැතහොත් එය නොසලකා හරින්න. + subject: "%{username} යනු %{instance}හි මධ්යස්ථ තීරණයකට අභියාචනා කරයි" + new_pending_account: + body: නව ගිණුමේ විස්තර පහතින්. ඔබට මෙම යෙදුම අනුමත කිරීමට හෝ ප්රතික්ෂේප කිරීමට හැකිය. + subject: නව ගිණුම සමාලෝචනය සඳහා %{instance} (%{username}) + new_report: + body: "%{reporter} %{target}වාර්තා කර ඇත" + body_remote: "%{domain} සිට යමෙක් %{target}වාර්තා කර ඇත" + subject: "%{instance} සඳහා නව වාර්තාව (#%{id})" + new_trends: + body: 'පහත අයිතම ප්රසිද්ධියේ ප්රදර්ශනය කිරීමට පෙර සමාලෝචනයක් අවශ්ය වේ:' + new_trending_links: + no_approved_links: දැනට අනුමත නැඹුරු සබැඳි නොමැත. + requirements: 'මෙම ඕනෑම අපේක්ෂකයෙකුට #%{rank} අනුමත ප්රවණතා සබැඳිය ඉක්මවා යා හැකි අතර, එය දැනට ලකුණු %{lowest_link_score}ක් සමඟින් "%{lowest_link_title}" වේ.' + title: නැඟී එන සබැඳි + new_trending_statuses: + no_approved_statuses: දැනට අනුමත ප්රවණතා පළ කිරීම් නොමැත. + requirements: 'මෙම ඕනෑම අපේක්ෂකයෙකුට #%{rank} අනුමත ප්රවණතා පළ කිරීම අභිබවා යා හැකි අතර, එය දැනට ලකුණු %{lowest_status_score}ක් සමඟින් %{lowest_status_url} වේ.' + title: ප්රවණතා පළ කිරීම් + new_trending_tags: + no_approved_tags: දැනට අනුමත ප්රවණතා හැෂ් ටැග් නොමැත. + requirements: 'මෙම ඕනෑම අපේක්ෂකයෙකුට #%{rank} අනුමත ප්රවණතා හැෂ් ටැගය අභිබවා යා හැකිය, එය දැනට ලකුණු %{lowest_tag_score}ක් සමඟ #%{lowest_tag_name} වේ.' + title: ප්රවණතා හැෂ් ටැග් + subject: "%{instance}හි සමාලෝචනය සඳහා නව ප්රවණතා" + aliases: + add_new: අන්වර්ථ නාමයක් සාදන්න + created_msg: නව අන්වර්ථ නාමයක් සාර්ථකව නිර්මාණය කරන ලදී. ඔබට දැන් පැරණි ගිණුමෙන් මාරුවීම ආරම්භ කළ හැක. + deleted_msg: අන්වර්ථය සාර්ථකව ඉවත් කරන ලදී. එම ගිණුමෙන් මෙම ගිණුමට මාරුවීම තවදුරටත් කළ නොහැකි වනු ඇත. + empty: ඔබට අන්වර්ථ නාම නොමැත. + hint_html: ඔබට වෙනත් ගිණුමකින් මෙය වෙත මාරු වීමට අවශ්ය නම්, මෙහිදී ඔබට අන්වර්ථ නාමයක් සෑදිය හැක, එය පැරණි ගිණුමෙන් අනුගාමිකයින් මෙම ගිණුමට ගෙන යාමට පෙර අවශ්ය වේ. මෙම ක්රියාවම <strong>හානිකර නොවන සහ ආපසු හැරවිය හැකි</strong>වේ. <strong>ගිණුම් සංක්රමණය පැරණි ගිණුමෙන් ආරම්භ වේ</strong>. + remove: අන්වර්ථය විසන්ධි කරන්න appearance: advanced_web_interface: උසස් වියමන අතුරුමුහුණත + advanced_web_interface_hint: 'ඔබට ඔබේ සම්පූර්ණ තිරයේ පළල භාවිතා කිරීමට අවශ්ය නම්, උසස් වෙබ් අතුරු මුහුණත ඔබට අවශ්ය පරිදි එකම වේලාවක බොහෝ තොරතුරු බැලීමට විවිධ තීරු වින්යාස කිරීමට ඉඩ දෙයි: නිවස, දැනුම්දීම්, ෆෙඩරේටඩ් කාලරාමුව, ඕනෑම ලැයිස්තු සහ හැෂ් ටැග්.' + animations_and_accessibility: සජීවිකරණ සහ ප්රවේශ්යතාව + confirmation_dialogs: තහවුරු කිරීමේ සංවාද + discovery: සොයාගැනීම localization: + body: Mastodon ස්වේච්ඡා සේවකයන් විසින් පරිවර්තනය කර ඇත. guide_link: https://crowdin.com/project/mastodon - sensitive_content: සංවේදී අන්තර්ගතයකි + guide_link_text: සෑම කෙනෙකුටම දායක විය හැකිය. + sensitive_content: සංවේදී අන්තර්ගතය + toot_layout: පෝස්ට් පිරිසැලසුම application_mailer: + notification_preferences: ඊමේල් මනාප වෙනස් කරන්න salutation: "%{name}," + settings: 'ඊමේල් මනාප වෙනස් කරන්න: %{link}' + view: 'දැක්ම:' + view_profile: පැතිකඩ බලන්න + view_status: පළ කිරීම බලන්න + applications: + created: යෙදුම සාර්ථකව නිර්මාණය කරන ලදී + destroyed: යෙදුම සාර්ථකව මකා ඇත + regenerate_token: ප්රවේශ ටෝකනය නැවත උත්පාදනය කරන්න + token_regenerated: ප්රවේශ ටෝකනය සාර්ථකව ප්රතිජනනය කරන ලදී + warning: මෙම දත්ත සමඟ ඉතා ප්රවේශම් වන්න. එය කිසි විටෙක කිසිවෙකු සමඟ බෙදා නොගන්න! + your_token: ඔබේ ප්රවේශ ටෝකනය auth: + apply_for_account: ආරාධනාවක් ඉල්ලන්න change_password: මුර පදය + checkbox_agreement_html: මම <a href="%{rules_path}" target="_blank">සේවාදායක රීති</a> සහ <a href="%{terms_path}" target="_blank">සේවා නියම</a>ට එකඟ වෙමි + checkbox_agreement_without_rules_html: මම සේවා කොන්දේසි <a href="%{terms_path}" target="_blank"></a>එකඟ වෙමි + delete_account: ගිණුම මකන්න + delete_account_html: ඔබට ඔබගේ ගිණුම මකා දැමීමට අවශ්ය නම්, ඔබට <a href="%{path}">මෙතැනින් ඉදිරියට යා හැක</a>. තහවුරු කිරීම සඳහා ඔබෙන් අසනු ඇත. + description: + prefix_invited_by_user: "@%{name} ඔබට Mastodon හි මෙම සේවාදායකයට සම්බන්ධ වීමට ආරාධනා කරයි!" + prefix_sign_up: අදම Mastodon හි ලියාපදිංචි වන්න! + suffix: ගිණුමක් සමඟ, ඔබට ඕනෑම Mastodon සේවාදායකයකින් සහ තවත් බොහෝ දේ භාවිතා කරන්නන් සමඟ පුද්ගලයින් අනුගමනය කිරීමට, යාවත්කාලීන කිරීම් පළ කිරීමට සහ පණිවිඩ හුවමාරු කර ගැනීමට හැකි වනු ඇත! + didnt_get_confirmation: තහවුරු කිරීමේ උපදෙස් ලැබුණේ නැද්ද? + dont_have_your_security_key: ඔබගේ ආරක්ෂක යතුර නොමැතිද? + forgot_password: මුරපදය අමතක වුනාද? + invalid_reset_password_token: මුරපද යළි පිහිටුවීමේ ටෝකනය අවලංගු හෝ කල් ඉකුත් වී ඇත. කරුණාකර අලුත් එකක් ඉල්ලන්න. + link_to_otp: ඔබගේ දුරකථනයෙන් ද්වි සාධක කේතයක් හෝ ප්රතිසාධන කේතයක් ඇතුළු කරන්න + link_to_webauth: ඔබගේ ආරක්ෂක යතුරු උපාංගය භාවිතා කරන්න + log_in_with: සමඟ ලොග් වන්න login: පිවිසෙන්න logout: නික්මෙන්න - or_log_in_with: හෝ සමඟ පිවිසෙන්න + migrate_account: වෙනත් ගිණුමකට යන්න + migrate_account_html: ඔබට මෙම ගිණුම වෙනත් එකකට හරවා යැවීමට අවශ්ය නම්, ඔබට එය <a href="%{path}">මෙහි වින්යාසගත කළ හැක</a>. + or_log_in_with: හෝ සමඟින් පිවිසෙන්න + register: ලියාපදිංචි වන්න + registration_closed: "%{instance} නව සාමාජිකයින් පිළිගන්නේ නැත" + resend_confirmation: තහවුරු කිරීමේ උපදෙස් නැවත යවන්න + reset_password: මුරපදය නැවත සකසන්න security: ආරක්ෂාව + set_new_password: නව මුරපදය සකසන්න + setup: + email_below_hint_html: පහත විද්යුත් තැපැල් ලිපිනය වැරදි නම්, ඔබට එය මෙතැනින් වෙනස් කර නව තහවුරු කිරීමේ විද්යුත් තැපෑලක් ලබා ගත හැක. + email_settings_hint_html: තහවුරු කිරීමේ විද්යුත් තැපෑල %{email}වෙත යවන ලදී. එම විද්යුත් තැපැල් ලිපිනය නිවැරදි නොවේ නම්, ඔබට එය ගිණුම් සැකසුම් තුළ වෙනස් කළ හැක. + title: සැලසුම status: account_status: ගිණුමේ තත්වය + confirming: විද්යුත් තැපෑල තහවුරු කිරීම සම්පූර්ණ කිරීම සඳහා රැඳී සිටිමින්. + functional: ඔබගේ ගිණුම සම්පුර්ණයෙන්ම ක්රියාත්මකයි. + pending: ඔබගේ අයදුම්පත අපගේ කාර්ය මණ්ඩලය විසින් සමාලෝචනය කිරීමට බලාපොරොත්තු වේ. මෙය යම් කාලයක් ගත විය හැක. ඔබගේ අයදුම්පත අනුමත වුවහොත් ඔබට විද්යුත් තැපෑලක් ලැබෙනු ඇත. + redirecting_to: එය දැනට %{acct}වෙත හරවා යවන බැවින් ඔබගේ ගිණුම අක්රියයි. + view_strikes: ඔබගේ ගිණුමට එරෙහිව පසුගිය වර්ජන බලන්න + too_fast: පෝරමය ඉතා වේගයෙන් ඉදිරිපත් කර ඇත, නැවත උත්සාහ කරන්න. + trouble_logging_in: පුරනය වීමේ ගැටලුවක්ද? + use_security_key: ආරක්ෂක යතුර භාවිතා කරන්න authorize_follow: + already_following: ඔබ දැනටමත් මෙම ගිණුම අනුගමනය කරයි + already_requested: ඔබ දැනටමත් එම ගිණුමට අනුගමනය ඉල්ලීමක් යවා ඇත + error: අවාසනාවකට, දුරස්ථ ගිණුම සෙවීමේදී දෝෂයක් ඇති විය + follow: අනුගමනය කරන්න + follow_request: 'ඔබ පහත ඉල්ලීමක් යවා ඇත:' + following: 'සාර්ථකත්වය! ඔබ දැන් පහත දැක්වේ:' post_follow: close: හෝ ඔබට මෙම කවුළුව වසාදැමිය හැකිය. return: පරිශීලකගේ පැතිකඩ පෙන්වන්න web: වියමන ට යන්න + title: "%{acct}අනුගමනය කරන්න" challenge: confirm: ඉදිරියට - invalid_password: අවලංගු නොවන මුරපදයකි + hint_html: "<strong>ඉඟිය:</strong> අපි ඉදිරි පැය සඳහා නැවත ඔබගේ මුරපදය ඔබෙන් නොඉල්ලමු." + invalid_password: නොවන මුරපදයකි + prompt: ඉදිරියට යාමට මුරපදය තහවුරු කරන්න + crypto: + 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} + half_a_minute: මේ දැන් + less_than_x_minutes: මීටර් %{count} less_than_x_seconds: මේ දැන් + x_minutes: මීටර් %{count} + 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: ඔබට ඔබගේ ගිණුම මකා</a> <a href="%{path}">කළ හැක + email_contact_html: එය තවමත් නොපැමිණියේ නම්, ඔබට උදව් සඳහා <a href="mailto:%{email}">%{email}</a> විද්යුත් තැපෑලෙන් යැවිය හැක + email_reconfirmation_html: ඔබට තහවුරු කිරීමේ විද්යුත් තැපෑල නොලැබුනේ නම්, ඔබට එය <a href="%{path}">නැවත ඉල්ලා සිටිය හැක</a> + irreversible: ඔබට ඔබගේ ගිණුම ප්රතිසාධනය කිරීමට හෝ නැවත සක්රිය කිරීමට නොහැකි වනු ඇත + more_details_html: වැඩි විස්තර සඳහා, <a href="%{terms_path}">පෞද්ගලිකත්ව ප්රතිපත්තිය</a>බලන්න. + username_available: ඔබගේ පරිශීලක නාමය නැවත ලබා ගත හැකි වනු ඇත + username_unavailable: ඔබගේ පරිශීලක නාමය නොතිබෙනු ඇත + directories: + directory: පැතිකඩ නාමාවලිය + explanation: ඔවුන්ගේ රුචිකත්වයන් මත පදනම්ව පරිශීලකයින් සොයා ගන්න + explore_mastodon: "%{title}ගවේෂණය කරන්න" + disputes: + strikes: + action_taken: පියවර ගත්තා + appeal: අභියාචනය + appeal_approved: මෙම වර්ජනය සාර්ථකව අභියාචනා කර ඇති අතර එය තවදුරටත් වලංගු නොවේ + appeal_rejected: අභියාචනය ප්රතික්ෂේප කර ඇත + appeal_submitted_at: අභියාචනය ඉදිරිපත් කරන ලදී + appealed_msg: ඔබගේ අභියාචනය ඉදිරිපත් කර ඇත. එය අනුමත වුවහොත්, ඔබට දැනුම් දෙනු ලැබේ. + appeals: + submit: අභියාචනය ඉදිරිපත් කරන්න + approve_appeal: අභියාචනය අනුමත කරන්න + associated_report: ආශ්රිත වාර්තාව + created_at: දිනැති + description_html: මේවා ඔබගේ ගිණුමට එරෙහිව ගන්නා ලද ක්රියා සහ %{instance}හි කාර්ය මණ්ඩලය විසින් ඔබට එවා ඇති අනතුරු ඇඟවීම් වේ. + recipient: වෙත යොමු කරන ලදී + reject_appeal: අභියාචනය ප්රතික්ෂේප කරන්න + status: 'පළ කිරීම #%{id}' + status_removed: පළ කිරීම දැනටමත් පද්ධතියෙන් ඉවත් කර ඇත + title: "%{action} සිට %{date}" + title_actions: + delete_statuses: පසු ඉවත් කිරීම + disable: ගිණුම කැටි කිරීම + mark_statuses_as_sensitive: තනතුරු සංවේදී ලෙස සලකුණු කිරීම + none: අවවාදයයි + sensitive: ගිණුම සංවේදී ලෙස සලකුණු කිරීම + silence: ගිණුම සීමා කිරීම + suspend: ගිණුම අත්හිටුවීම + your_appeal_approved: ඔබගේ අභියාචනය අනුමත කර ඇත + your_appeal_pending: ඔබ අභියාචනයක් ඉදිරිපත් කර ඇත + your_appeal_rejected: ඔබගේ අභියාචනය ප්රතික්ෂේප කර ඇත + domain_validator: + invalid_domain: වලංගු ඩොමේන් නාමයක් නොවේ 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. + '400': ඔබ ඉදිරිපත් කළ ඉල්ලීම අවලංගු හෝ විකෘති විය. + '403': ඔබට මෙම පිටුව බැලීමට අවසර නැත. + '404': ඔබ සොයන පිටුව මෙහි නොමැත. + '406': මෙම පිටුව ඉල්ලන ලද ආකෘතියෙන් නොමැත. + '410': ඔබ සොයන පිටුව තවදුරටත් මෙහි නොමැත. + '422': + content: ආරක්ෂක සත්යාපනය අසාර්ථක විය. ඔබ කුකීස් අවහිර කරනවාද? + title: ආරක්ෂක සත්යාපනය අසාර්ථක විය + '429': ඉල්ලීම් වැඩියි + '500': + content: අපට කණගාටුයි, නමුත් අපගේ පැත්තෙන් යමක් වැරදී ඇත. + title: මෙම පිටුව නිවැරදි නොවේ + '503': තාවකාලික සේවාදායකයේ අසාර්ථක වීමක් හේතුවෙන් පිටුව සේවය කිරීමට නොහැකි විය. + noscript_html: Mastodon වෙබ් යෙදුම භාවිතා කිරීමට, කරුණාකර JavaScript සක්රීය කරන්න. විකල්පයක් ලෙස, ඔබේ වේදිකාව සඳහා</a> <a href="%{apps_path}">එකක් උත්සාහ කරන්න. + existing_username_validator: + not_found: එම පරිශීලක නාමය සහිත දේශීය පරිශීලකයෙකු සොයා ගැනීමට නොහැකි විය + not_found_multiple: "%{usernames}සොයා ගැනීමට නොහැකි විය" exports: archive_takeout: date: දිනය - download: ඔබගේ සංරක්ෂිතය බාගන්න + download: ඔබගේ සුරක්ෂිතභාවය බාගන්න + hint_html: ඔබට ඔබගේ පළ කිරීම් <strong>සහ උඩුගත කළ මාධ්ය</strong>හි සංරක්ෂිතයක් ඉල්ලා සිටිය හැක. නිර්යාත කළ දත්ත ActivityPub ආකෘතියෙන්, ඕනෑම අනුකූල මෘදුකාංගයකට කියවිය හැකිය. ඔබට දින 7කට වරක් ලේඛනාගාරයක් ඉල්ලා සිටිය හැක. + in_progress: ඔබගේ සංරක්ෂිතය සම්පාදනය කරමින්... + request: ඔබගේ සංරක්ෂිතය ඉල්ලන්න size: ප්රමාණය - bookmarks: පොත් යොමු - lists: ලැයිස්තු + blocks: ඔබ අවහිර කරන්න + bookmarks: පොත් යොමු කරන්න + domain_blocks: වසම් අවහිර කිරීම් + lists: ලැයිස්තුව + mutes: ඔබ නිහඬ කරන්න storage: මාධ්ය ගබඩාව + featured_tags: + add_new: අලුතින් එකතු කරන්න + errors: + limit: ඔබ දැනටමත් උපරිම හෑෂ් ටැග් ප්රමාණය විශේෂාංග කර ඇත + hint_html: "<strong>විශේෂාංගගත හැෂ් ටැග් මොනවාද?</strong> ඒවා ඔබේ පොදු පැතිකඩෙහි ප්රමුඛව ප්රදර්ශනය වන අතර එම හැෂ් ටැග් යටතේ ඔබේ පොදු පළ කිරීම් බ්රවුස් කිරීමට මිනිසුන්ට ඉඩ සලසයි. නිර්මාණාත්මක කෘති හෝ දිගු කාලීන ව්යාපෘති පිළිබඳ වාර්තාවක් තබා ගැනීම සඳහා ඔවුන් විශිෂ්ට මෙවලමක් වේ." filters: contexts: account: පැතිකඩයන් + home: නිවස සහ ලැයිස්තු notifications: දැනුම්දීම් + public: පොදු කාලරේඛා thread: සංවාද edit: + add_keyword: මූල පදය එක් කරන්න + keywords: මූල පද title: පෙරහන සංස්කරණය + errors: + deprecated_api_multiple_keywords: මෙම පරාමිති පෙරහන් මූල පද එකකට වඩා අදාළ වන බැවින් මෙම යෙදුමෙන් වෙනස් කළ නොහැක. වඩාත් මෑත යෙදුමක් හෝ වෙබ් අතුරු මුහුණතක් භාවිතා කරන්න. + invalid_context: කිසිවක් හෝ වලංගු නොවන සන්දර්භයක් සපයා නැත index: + contexts: "%{contexts}හි පෙරහන්" + delete: මකන්න + empty: ඔබට පෙරහන් නොමැත. + expires_in: "%{distance}කින් කල් ඉකුත් වේ" + expires_on: "%{date}දින කල් ඉකුත් වේ" + keywords: + one: "%{count} මූල පදය" + other: "%{count} මූල පද" title: පෙරහන් new: + save: නව පෙරහන සුරකින්න title: නව පෙරහනක් එකතු කරන්න footer: developers: සංවර්ධකයින් more: තව… resources: සම්පත් + trending_now: දැන් ප්රවණතාවය generic: all: සියල්ල + changes_saved_msg: වෙනස්කම් සාර්ථකව සුරකින ලදී! copy: පිටපත් + delete: මකන්න + none: කිසිවක් නැත + order_by: විසින් ඇණවුම් කරන්න save_changes: වෙනස්කම් සුරකින්න + today: අද + validation_errors: + one: යමක් තවමත් හරි නැත! කරුණාකර පහත දෝෂය සමාලෝචනය කරන්න + other: යමක් තවමත් හරි නැත! කරුණාකර පහත දෝෂ %{count} ක් සමාලෝචනය කරන්න + html_validator: + invalid_markup: 'වලංගු නොවන HTML සලකුණු අඩංගු වේ: %{error}' imports: + errors: + over_rows_processing_limit: පේළි %{count} කට වඩා අඩංගු වේ + modes: + merge: ඒකාබද්ධ කරන්න + merge_long: පවතින වාර්තා තබා නව ඒවා එකතු කරන්න + overwrite: උඩින් ලියන්න + overwrite_long: වත්මන් වාර්තා නව ඒවා සමඟ ප්රතිස්ථාපනය කරන්න + preface: ඔබ අනුගමන කරන හෝ අවහිර කරන පුද්ගලයින්ගේ ලැයිස්තුවක් වැනි වෙනත් සේවාදායකයකින් ඔබ නිර්යාත කර ඇති දත්ත ඔබට ආයාත කළ හැක. + success: ඔබගේ දත්ත සාර්ථකව උඩුගත කර ඇති අතර නියමිත වේලාවට සැකසෙනු ඇත types: - bookmarks: පොත් යොමු + blocking: අවහිර කිරීමේ ලැයිස්තුව + bookmarks: පොත් යොමු කරන්න + domain_blocking: වසම් අවහිර කිරීමේ ලැයිස්තුව + following: පහත ලැයිස්තුව + muting: නිහඬ කිරීමේ ලැයිස්තුව upload: උඩුගත කරන්න + in_memoriam_html: මතකය තුළ. invites: + delete: අක්රිය කරන්න + expired: කල් ඉකුත් වී ඇත expires_in: '1800': විනාඩි 30 '21600': හෝරා 6 @@ -300,29 +1166,214 @@ si: '43200': හෝරා 12 '604800': සති 1 '86400': දවස් 1 + expires_in_prompt: කවදාවත් නැහැ + generate: ආරාධනා සබැඳිය උත්පාදනය කරන්න + invited_by: 'ඔබට ආරාධනා කළේ:' + max_uses: + one: 1 භාවිතය + other: "%{count} භාවිතා කරයි" + max_uses_prompt: සීමාවක් නැත + prompt: මෙම සේවාදායකයට ප්රවේශය ලබා දීමට අන් අය සමඟ සබැඳි ජනනය කර බෙදා ගන්න + table: + expires_at: කල් ඉකුත් වේ + uses: භාවිතා කරයි title: මිනිසුන්ට ආරාධනා කරන්න + 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: ඔබ සිසිලනය මත සිටී + followers_count: චලනය වන අවස්ථාවේ අනුගාමිකයන් + incoming_migrations: වෙනත් ගිණුමකින් මාරු වීම + incoming_migrations_html: වෙනත් ගිණුමකින් මෙම ගිණුමට මාරු වීමට, පළමුව ඔබ <a href="%{path}">අන්වර්ථ</a>ගිණුමක් සෑදිය යුතුය. + moved_msg: ඔබගේ ගිණුම දැන් %{acct} වෙත හරවා යවනු ලබන අතර ඔබගේ අනුගාමිකයින් එහා මෙහා ගෙන යමින් පවතී. + not_redirecting: ඔබගේ ගිණුම දැනට වෙනත් කිසිදු ගිණුමකට හරවා යවන්නේ නැත. + on_cooldown: ඔබ මෑතකදී ඔබගේ ගිණුම සංක්රමණය කර ඇත. මෙම කාර්යය දින %{count} කින් නැවත ලබා ගත හැකි වනු ඇත. + past_migrations: අතීත සංක්රමණ + proceed_with_move: අනුගාමිකයන් මාරු කරන්න + redirected_msg: ඔබගේ ගිණුම දැන් %{acct}වෙත හරවා යවනු ලැබේ. + redirecting_to: ඔබගේ ගිණුම %{acct}වෙත හරවා යවනු ලැබේ. + set_redirect: යළි-යොමුවීම් සකසන්න + warning: + backreference_required: නව ගිණුම ප්රථමයෙන් මෙය ආපසු යොමු කිරීමට වින්යාස කළ යුතුය + before: 'ඉදිරියට යාමට පෙර, කරුණාකර මෙම සටහන් හොඳින් කියවන්න:' + cooldown: මාරු වීමෙන් පසු ඔබට නැවත ගමන් කිරීමට නොහැකි වනු ඇති පොරොත්තු කාල සීමාවක් ඇත + disabled_account: ඔබගේ ජංගම ගිණුම පසුව සම්පූර්ණයෙන්ම භාවිතා කළ නොහැක. කෙසේ වෙතත්, ඔබට දත්ත අපනයනයට මෙන්ම නැවත සක්රිය කිරීමට ප්රවේශය ඇත. + followers: මෙම ක්රියාව සියළුම අනුගාමිකයින් ජංගම ගිණුමේ සිට නව ගිණුමට ගෙන යනු ඇත + only_redirect_html: විකල්පයක් ලෙස, ඔබට <a href="%{path}">ඔබගේ පැතිකඩ</a>හි යළි-යොමුවීමක් පමණක් තැබිය හැකිය. + other_data: වෙනත් දත්ත කිසිවක් ස්වයංක්රීයව ගෙන නොයනු ඇත + redirect: ඔබගේ ජංගම ගිණුමේ පැතිකඩ යළි-යොමු කිරීමේ දැන්වීමක් සමඟ යාවත්කාලීන කෙරෙන අතර සෙවුම් වලින් බැහැර කරනු ලැබේ + moderation: + title: මධ්යස්ථභාවය + move_handler: + carry_blocks_over_text: මෙම පරිශීලකයා ඔබ අවහිර කර තිබූ %{acct}සිට මාරු විය. + carry_mutes_over_text: මෙම පරිශීලකයා ඔබ නිශ්ශබ්ද කර තිබූ %{acct}වෙතින් මාරු විය. + copy_account_note_text: 'මෙම පරිශීලකයා %{acct}සිට මාරු විය, මෙන්න ඔවුන් ගැන ඔබේ පෙර සටහන්:' notification_mailer: + admin: + report: + subject: "%{name} වාර්තාවක් ඉදිරිපත් කළේය" + sign_up: + subject: "%{name} අත්සන් කර ඇත" + digest: + action: සියලුම දැනුම්දීම් බලන්න + body: "%{since}වෙනිදා ඔබගේ අවසන් සංචාරයේ සිට ඔබට මග හැරුණු පණිවිඩවල කෙටි සාරාංශයක් මෙන්න" + mention: "%{name} ඔබව සඳහන් කළේ:" + new_followers_summary: + one: එසේම, ඔබ බැහැරව සිටියදී එක් නව අනුගාමිකයෙකු ලබා ගෙන ඇත! Yay! + other: එසේම, ඔබ බැහැරව සිටියදී නව අනුගාමිකයින් %{count} ක් ලබාගෙන ඇත! අරුම පුදුම! + subject: + one: "ඔබගේ අවසන් සංචාරයේ සිට 1 නව දැනුම්දීමක් 🐘" + other: "ඔබගේ අවසන් සංචාරයේ සිට නව දැනුම්දීම් %{count} ක් 🐘" + title: ඔබ නොමැති විට... + favourite: + body: 'ඔබේ පළ කිරීම %{name}විසින් ප්රිය කරන ලදී:' + subject: "%{name} ඔබගේ පළ කිරීම ප්රිය කරන ලදී" + title: නව ප්රියතම + follow: + body: "%{name} දැන් ඔබව අනුගමනය කරයි!" + subject: "%{name} දැන් ඔබව අනුගමනය කරයි" + title: නව අනුගාමිකයෙක් + follow_request: + action: අනුගමනය කරන ඉල්ලීම් කළමනාකරණය කරන්න + body: "%{name} ඔබව අනුගමනය කිරීමට ඉල්ලා ඇත" + subject: 'පොරොත්තු අනුගාමිකයා: %{name}' + title: නව අනුගමනය ඉල්ලීම mention: action: පිළිතුර + body: 'ඔබව මෙහි %{name} කින් සඳහන් කර ඇත:' + subject: ඔබව %{name}මගින් සඳහන් කර ඇත title: නව සඳැහුම + poll: + subject: "%{name} න් මත විමසුමක් අවසන් විය" + reblog: + body: 'ඔබේ පළ කිරීම %{name}කින් වැඩි කරන ලදී:' + subject: "%{name} ඔබේ පළ කිරීම ඉහළ නැංවීය" + title: නව තල්ලුවක් + status: + subject: "%{name} දැන් පළ කළා" + update: + 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: තහවුරු කිරීමට ඔබගේ සත්යාපන යෙදුම මගින් ජනනය කරන ලද කේතය ඇතුළු කරන්න + description_html: ඔබ සත්යාපන යෙදුමක් භාවිතයෙන් <strong>ද්වි-සාධක සත්යාපනය</strong> සක්රීය කරන්නේ නම්, ලොගින් වීමේදී ඔබට ඔබගේ දුරකථනය සන්තකයේ තබා ගැනීමට අවශ්ය වනු ඇත, එය ඔබට ඇතුළු වීමට ටෝකන ජනනය කරයි. enable: සබල කරන්න + instructions_html: "<strong>මෙම QR කේතය ඔබගේ දුරකථනයේ Google Authenticator හෝ එවැනිම TOTP යෙදුමකට පරිලෝකනය කරන්න</strong>. මෙතැන් සිට, එම යෙදුම ඔබට ලොග් වීමේදී ඇතුළත් කළ යුතු ටෝකන ජනනය කරයි." + manual_instructions: 'ඔබට QR කේතය පරිලෝකනය කළ නොහැකි නම් සහ එය අතින් ඇතුල් කිරීමට අවශ්ය නම්, මෙන්න සරල පෙළ රහස:' + setup: සැලසුම + wrong_code: ඇතුළත් කළ කේතය අවලංගුයි! සේවාදායක වේලාව සහ උපාංග වේලාව නිවැරදිද? pagination: - next: ඊළඟ + 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: වෙනත් + posting_defaults: පෙරනිමි පළ කිරීම + public_timelines: පොදු කාලරේඛා + reactions: + errors: + limit_reached: විවිධ ප්රතික්රියා වල සීමාව ළඟා විය + unrecognized_emoji: පිළිගත් ඉමොජියක් නොවේ relationships: activity: ගිණුමේ ක්රියාකාරකම් - status: ගිණුමේ තත්වය + 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: ඔබට ක්රියා කිරීමට අවශ්ය ඔබගේ username@domain ඇතුලත් කරන්න + missing_resource: ඔබගේ ගිණුම සඳහා අවශ්ය යළි-යොමුවීම් URL එක සොයා ගැනීමට නොහැකි විය + no_account_html: ගිණුමක් නැද්ද? ඔබට මෙහි <a href='%{sign_up_path}' target='_blank'>ලියාපදිංචි විය හැක</a> + proceed: අනුගමනය කිරීමට ඉදිරියට යන්න + prompt: 'ඔබ අනුගමනය කිරීමට යන්නේ:' + reason_html: "<strong>මෙම පියවර අවශ්ය වන්නේ ඇයි?</strong> <code>%{instance}</code> ඔබ ලියාපදිංචි වී ඇති සේවාදායකය නොවිය හැක, එබැවින් අපට පළමුව ඔබව ඔබගේ නිවසේ සේවාදායකය වෙත හරවා යැවිය යුතුය." + remote_interaction: + favourite: + proceed: ප්රියතම වෙත ඉදිරියට යන්න + prompt: 'ඔබට මෙම පෝස්ටය ප්රියතම කිරීමට අවශ්යයි:' + reblog: + proceed: වැඩි කිරීමට ඉදිරියට යන්න + prompt: 'ඔබට මෙම පළ කිරීම වැඩි කිරීමට අවශ්යයි:' + reply: + proceed: පිළිතුරු දීමට ඉදිරියට යන්න + prompt: 'ඔබට මෙම පළ කිරීමට පිළිතුරු දීමට අවශ්යයි:' + reports: + errors: + invalid_rules: වලංගු නීති සඳහන් නොකරයි + rss: + content_warning: 'අන්තර්ගත අනතුරු ඇඟවීම:' + descriptions: + account: "@%{acct}සිට පොදු පළ කිරීම්" + tag: "#%{hashtag}ටැග් කර ඇති පොදු පළ කිරීම්" + scheduled_statuses: + over_daily_limit: ඔබ අද දිනට නියමිත පළ කිරීම් %{limit} සීමාව ඉක්මවා ඇත + over_total_limit: ඔබ නියමිත පළ කිරීම් %{limit} සීමාව ඉක්මවා ඇත + too_soon: නියමිත දිනය අනාගතයේ විය යුතුය sessions: + activity: අවසාන ක්රියාකාරකම browser: අතිරික්සුව browsers: alipay: අලිපේ @@ -334,41 +1385,264 @@ si: generic: නොදන්නා අතිරික්සුවකි ie: ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් micro_messenger: මයික්රොමැසෙන්ජර් + nokia: Nokia S40 Ovi බ්රව්සරය opera: ඔපෙරා otter: ඔටර් qq: කියුකියු අතිරික්සුව safari: සෆාරි uc_browser: යූසී අතිරික්සුව weibo: වෙයිබො + current_session: වත්මන් සැසිය + description: "%{browser} මත %{platform}" + explanation: මේවා දැනට ඔබගේ Mastodon ගිණුමට ලොග් වී ඇති වෙබ් බ්රව්සර් වේ. ip: අ.ජා. කෙ. (IP) platforms: adobe_air: ඇඩෝබි එයාර් android: ඇන්ඩ්රොයිඩ් blackberry: බ්ලැක්බෙරි - chrome_os: ක්රෝම් ඕඑස් + chrome_os: ක්රෝම්ස් firefox_os: ෆයර්ෆොක්ස් ඕඑස් ios: අයිඕඑස් linux: ලිනක්ස් mac: මැක්ඕඑස් + other: නොදන්නා වේදිකාව windows: වින්ඩෝස් windows_mobile: වින්ඩෝස් මොබයිල් windows_phone: වින්ඩෝස් පෝන් + revoke: අවලංගු කරන්න + revoke_success: සැසිය සාර්ථකව අවලංගු කරන ලදී + title: සැසිවාර + view_authentication_history: ඔබගේ ගිණුමේ සත්යාපන ඉතිහාසය බලන්න settings: account: ගිණුම account_settings: ගිණුමේ සැකසුම් + aliases: ගිණුම් අන්වර්ථ නාමයන් + appearance: පෙනුම + authorized_apps: අවසර ලත් යෙදුම් + back: Mastodon වෙත නැවත යන්න + delete: ගිණුම මකා දැමීම + development: සංවර්ධනය edit_profile: පැතිකඩ සංස්කරණය export: දත්ත නිර්යාත - import: ආයාත කරන්න + featured_tags: විශේෂාංගගත හැෂ් ටැග් + import: ආයත කරන්න import_and_export: ආයාත සහ නිර්යාත + migrate: ගිණුම් සංක්රමණය notifications: දැනුම්දීම් + preferences: මනාප profile: පැතිකඩ + relationships: අනුගාමිකයින් සහ අනුගාමිකයින් + statuses_cleanup: ස්වයංක්රීය පළ කිරීම් මකාදැමීම + strikes: මධ්යස්ථ වැඩ වර්ජන + two_factor_authentication: ද්වි සාධක Aut + webauthn_authentication: ආරක්ෂක යතුරු statuses: + attached: + audio: + one: "%{count} ශ්රව්ය" + other: "%{count} ශ්රව්ය" + description: 'අමුණා ඇත: %{attached}' + image: + one: "%{count} රූපය" + other: පින්තූර %{count} + video: + one: "%{count} වීඩියෝ" + other: වීඩියෝ %{count} + boosted_from_html: "%{acct_link}සිට වැඩි කරන ලදී" + content_warning: 'අන්තර්ගත අනතුරු ඇඟවීම: %{warning}' + default_language: අතුරු මුහුණත් භාෂාවට සමානයි + disallowed_hashtags: + one: 'අනුමත නොකළ හැෂ් ටැගයක් අඩංගු විය: %{tags}' + other: 'අනුමත නොකළ හැෂ් ටැග් අඩංගු විය: %{tags}' + edited_at_html: සංස්කරණය %{date} + errors: + in_reply_not_found: ඔබ පිළිතුරු දීමට උත්සාහ කරන පළ කිරීම පවතින බවක් නොපෙනේ. + open_in_web: වෙබයේ විවෘත කරන්න + over_character_limit: අක්ෂර සීමාව %{max} ඉක්මවා ඇත + pin_errors: + direct: සඳහන් කළ පරිශීලකයින්ට පමණක් පෙනෙන පළ කිරීම් ඇමිණිය නොහැක + limit: ඔබ දැනටමත් උපරිම පළ කිරීම් සංඛ්යාව අමුණා ඇත + ownership: වෙනත් කෙනෙකුගේ පළ කිරීමක් ඇමිණිය නොහැක + reblog: බූස්ට් එකක් ඇලවිය නොහැක + poll: + total_people: + one: "%{count} පුද්ගලයෙක්" + other: පුද්ගලයන් %{count} + total_votes: + one: "%{count} ඡන්ද" + other: ඡන්ද %{count} යි + vote: ඡන්දය දෙන්න show_more: තව පෙන්වන්න + show_newer: අලුත්ම පෙන්වන්න + show_older: පැරණි පෙන්වන්න + show_thread: නූල් පෙන්වන්න + sign_in_to_participate: සංවාදයට සහභාගී වීමට පුරන්න title: '%{name}: "%{quote}"' visibilities: - public: ප්රසිද්ධ + 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 ක් + '604800': 1 සතිය + '63113904': අවුරුදු 2 ක් + '7889238': මාස 3 යි + min_age_label: වයස් සීමාව + min_favs: අඩුම තරමින් පෝස්ට් ප්රිය කරන ලෙස තබා ගන්න + min_favs_hint: අවම වශයෙන් මෙම ප්රියතම ප්රමාණය ලබා ඇති ඔබේ පළ කිරීම් කිසිවක් මකන්නේ නැත. ඔවුන්ගේ ප්රියතමයන් ගණන නොතකා පළ කිරීම් මැකීමට හිස්ව තබන්න + min_reblogs: අඩුම තරමේ පෝස්ට් බූස්ට් කරගෙන තියාගන්න + min_reblogs_hint: අඩුම තරමින් මෙම වාර ගණන වැඩි කර ඇති ඔබගේ පළ කිරීම් කිසිවක් මකා නොදමන්න. බූස්ට් ගණන නොතකා පළ කිරීම් මැකීමට හිස්ව තබන්න stream_entries: - sensitive_content: සංවේදී අන්තර්ගතයකි + pinned: පින් කළ පළ කිරීම + reblogged: ඉහල නැංවීය + sensitive_content: සංවේදී අන්තර්ගතය + strikes: + errors: + too_late: මෙම වර්ජනයට අභියාචනයක් ඉදිරිපත් කිරීමට ප්රමාද වැඩියි + tags: + does_not_match_previous_name: පෙර නමට නොගැලපේ + terms: + title: "%{instance} සේවා නියම සහ රහස්යතා ප්රතිපත්තිය" + themes: + contrast: Mastodon (ඉහළ වෙනස) + default: මැස්ටෝඩන් (අඳුරු) + mastodon-light: මැස්ටෝඩන් (ආලෝකය) two_factor_authentication: + add: එකතු කරන්න + disable: 2FA අබල කරන්න + disabled_success: ද්වි-සාධක සත්යාපනය සාර්ථකව අබල කර ඇත edit: සංස්කරණය + enabled: ද්වි-සාධක සත්යාපනය සක්රීය කර ඇත + enabled_success: ද්වි-සාධක සත්යාපනය සාර්ථකව සබල කර ඇත + generate_recovery_codes: ප්රතිසාධන කේත ජනනය කරන්න + lost_recovery_codes: ඔබගේ දුරකථනය නැති වුවහොත් ඔබගේ ගිණුමට ප්රවේශය නැවත ලබා ගැනීමට ප්රතිසාධන කේත ඔබට ඉඩ සලසයි. ඔබට ඔබේ ප්රතිසාධන කේත නැති වී ඇත්නම්, ඔබට ඒවා මෙහි නැවත උත්පාදනය කළ හැක. ඔබගේ පැරණි ප්රතිසාධන කේත අවලංගු වනු ඇත. + methods: ද්වි සාධක ක්රම + otp: Authenticator යෙදුම + recovery_codes: උපස්ථ ප්රතිසාධන කේත + recovery_codes_regenerated: ප්රතිසාධන කේත සාර්ථකව ප්රතිජනනය කරන ලදී + recovery_instructions_html: ඔබට කවදා හෝ ඔබගේ දුරකථනයට ප්රවේශය අහිමි වුවහොත්, ඔබගේ ගිණුමට ප්රවේශය නැවත ලබා ගැනීමට පහත ප්රතිසාධන කේත වලින් එකක් භාවිතා කළ හැක. <strong>ප්රතිසාධන කේත ආරක්ෂිතව තබා ගන්න</strong>. උදාහරණයක් ලෙස, ඔබට ඒවා මුද්රණය කර වෙනත් වැදගත් ලේඛන සමඟ ගබඩා කළ හැකිය. webauthn: ආරක්ෂණ යතුරු + user_mailer: + appeal_approved: + action: ඔබගේ ගිණුමට යන්න + explanation: ඔබ %{appeal_date} දින ඉදිරිපත් කළ %{strike_date} හි ඔබේ ගිණුමට එරෙහි වර්ජනයේ අභියාචනය අනුමත කර ඇත. ඔබගේ ගිණුම නැවත වරක් හොඳ තත්වයක පවතී. + subject: "%{date} සිට ඔබගේ අභියාචනය අනුමත කර ඇත" + title: අභියාචනය අනුමත කර ඇත + appeal_rejected: + explanation: "%{strike_date} දින ඔබේ ගිණුමට එරෙහිව ඔබ %{appeal_date} දින ඉදිරිපත් කළ වර්ජනයේ අභියාචනය ප්රතික්ෂේප කර ඇත." + subject: "%{date} සිට ඔබගේ අභියාචනය ප්රතික්ෂේප කර ඇත" + title: අභියාචනය ප්රතික්ෂේප විය + backup_ready: + explanation: ඔබ ඔබේ Mastodon ගිණුමේ සම්පූර්ණ උපස්ථයක් ඉල්ලා ඇත. එය දැන් බාගත කිරීම සඳහා සූදානම්! + subject: ඔබගේ සංරක්ෂිතය බාගැනීමට සූදානම්ය + title: සංරක්ෂිත රැගෙන යාම + suspicious_sign_in: + change_password: ඔබගේ මුරපදය වෙනස් කරන්න + details: 'පුරනය වීමේ විස්තර මෙන්න:' + explanation: අපි නව IP ලිපිනයකින් ඔබගේ ගිණුමට පුරනය වීමක් අනාවරණය කරගෙන ඇත. + further_actions_html: මෙය ඔබ නොවේ නම්, අපි ඔබට වහාම %{action} ලෙස නිර්දේශ කර ඔබගේ ගිණුම සුරක්ෂිතව තබා ගැනීමට සාධක දෙකක සත්යාපනය සබල කරන්න. + subject: ඔබගේ ගිණුම නව IP ලිපිනයකින් ප්රවේශ වී ඇත + title: නව පුරනය වීමක් + warning: + appeal: අභියාචනයක් ඉදිරිපත් කරන්න + appeal_description: මෙය දෝෂයක් බව ඔබ විශ්වාස කරන්නේ නම්, ඔබට %{instance}හි කාර්ය මණ්ඩලයට අභියාචනයක් ඉදිරිපත් කළ හැක. + categories: + spam: ආයාචිත තැපැල් + violation: අන්තර්ගතය පහත ප්රජා මාර්ගෝපදේශ උල්ලංඝනය කරයි + explanation: + delete_statuses: ඔබගේ සමහර පළ කිරීම් ප්රජා මාර්ගෝපදේශ එකක් හෝ කිහිපයක් උල්ලංඝනය කරන බව සොයා ගෙන ඇති අතර පසුව %{instance}හි උපපරිපාලකයින් විසින් ඉවත් කර ඇත. + disable: ඔබට තවදුරටත් ඔබගේ ගිණුම භාවිතා කළ නොහැක, නමුත් ඔබගේ පැතිකඩ සහ අනෙකුත් දත්ත නොවෙනස්ව පවතී. ඔබට ඔබගේ දත්තවල උපස්ථයක් ඉල්ලා සිටීමට, ගිණුම් සැකසීම් වෙනස් කිරීමට හෝ ඔබගේ ගිණුම මකා දැමීමට හැකිය. + mark_statuses_as_sensitive: ඔබගේ සමහර පළ කිරීම් %{instance}හි පරිපාලකයින් විසින් සංවේදී ලෙස සලකුණු කර ඇත. මෙයින් අදහස් කරන්නේ පෙරදසුනක් දර්ශනය වීමට පෙර පුද්ගලයින්ට පළ කිරීම් වල මාධ්ය තට්ටු කිරීමට අවශ්ය වනු ඇති බවයි. අනාගතයේදී පළ කිරීමේදී ඔබට මාධ්ය සංවේදී ලෙස සලකුණු කළ හැක. + sensitive: මෙතැන් සිට, ඔබගේ උඩුගත කරන ලද සියලුම මාධ්ය ගොනු සංවේදී ලෙස සලකුණු කර ක්ලික්-හරහා අනතුරු ඇඟවීමක් පිටුපස සඟවනු ඇත. + silence: ඔබට තවමත් ඔබගේ ගිණුම භාවිතා කළ හැකි නමුත් දැනටමත් ඔබව අනුගමනය කරන පුද්ගලයින් පමණක් මෙම සේවාදායකයේ ඔබගේ පළ කිරීම් දකිනු ඇති අතර, විවිධ සොයාගැනීම් විශේෂාංග වලින් ඔබව බැහැර කරනු ලැබිය හැක. කෙසේ වෙතත්, අනෙක් අය තවමත් ඔබව අතින් අනුගමනය කළ හැක. + suspend: ඔබට තවදුරටත් ඔබගේ ගිණුම භාවිතා කළ නොහැකි අතර, ඔබගේ පැතිකඩ සහ අනෙකුත් දත්ත තවදුරටත් ප්රවේශ විය නොහැක. දින 30කින් පමණ දත්ත සම්පූර්ණයෙන් ඉවත් කරන තෙක් ඔබට තවමත් ඔබේ දත්තවල උපස්ථයක් ඉල්ලා සිටීමට පුරනය විය හැක, නමුත් ඔබව අත්හිටුවීම මගහැර යාම වැළැක්වීමට අපි මූලික දත්ත කිහිපයක් රඳවා ගන්නෙමු. + reason: 'හේතුව:' + statuses: 'උපුටා දක්වන ලද පළ කිරීම්:' + subject: + delete_statuses: "%{acct} හි ඔබගේ පළ කිරීම් ඉවත් කර ඇත" + disable: ඔබගේ ගිණුම %{acct} කර ඇත + mark_statuses_as_sensitive: "%{acct} හි ඔබගේ පළ කිරීම් සංවේදී ලෙස සලකුණු කර ඇත" + none: "%{acct}සඳහා අනතුරු ඇඟවීම" + sensitive: "%{acct} හි ඔබගේ පළ කිරීම් මෙතැන් සිට සංවේදී ලෙස සලකුණු කෙරේ" + silence: ඔබගේ ගිණුම %{acct} සීමා කර ඇත + suspend: ඔබගේ ගිණුම %{acct} අත්හිටුවා ඇත + title: + delete_statuses: පළ කිරීම් ඉවත් කරන ලදී + disable: ගිණුම නිශ්චල කර ඇත + mark_statuses_as_sensitive: පළ කිරීම් සංවේදී ලෙස ලකුණු කර ඇත + none: අවවාදයයි + sensitive: ගිණුම සංවේදී ලෙස ලකුණු කර ඇත + silence: ගිණුම සීමා සහිතයි + suspend: ගිණුම අත්හිටුවා ඇත + welcome: + edit_profile_action: සැකසුම් පැතිකඩ + edit_profile_step: ඔබට අවතාරයක්, ශීර්ෂයක් උඩුගත කිරීමෙන්, ඔබේ සංදර්ශක නම වෙනස් කිරීමෙන් සහ තවත් දේ මඟින් ඔබේ පැතිකඩ අභිරුචිකරණය කළ හැකිය. නව අනුගාමිකයින්ට ඔබව අනුගමනය කිරීමට ඉඩ දීමට පෙර ඔවුන් සමාලෝචනය කිරීමට ඔබ කැමති නම්, ඔබට ඔබගේ ගිණුම අගුළු දැමිය හැක. + explanation: ඔබ ආරම්භ කිරීමට උපදෙස් කිහිපයක් මෙන්න + final_action: පළ කිරීම ආරම්භ කරන්න + final_step: 'පළ කිරීම ආරම්භ කරන්න! අනුගාමිකයින් නොමැතිව වුවද, ඔබගේ පොදු පළ කිරීම් වෙනත් අය විසින් දැකිය හැකිය, උදාහරණයක් ලෙස දේශීය කාලරේඛාවේ සහ හැෂ් ටැග් වල. ඔබට #introductions හැෂ් ටැගය මත ඔබව හඳුන්වා දීමට අවශ්ය විය හැක.' + full_handle: ඔබේ සම්පූර්ණ හසුරුව + full_handle_hint: මෙය ඔබ ඔබේ මිතුරන්ට පවසනු ඇත, එවිට ඔවුන්ට වෙනත් සේවාදායකයකින් ඔබට පණිවිඩ යැවීමට හෝ අනුගමනය කිරීමට හැකිය. + review_preferences_action: මනාප වෙනස් කරන්න + review_preferences_step: ඔබට ලැබීමට කැමති ඊමේල්, හෝ ඔබේ පළ කිරීම් පෙරනිමි කිරීමට ඔබ කැමති පුද්ගලිකත්ව මට්ටම වැනි ඔබේ මනාප සැකසීමට වග බලා ගන්න. ඔබට චලන අසනීපයක් නොමැති නම්, ඔබට GIF ස්වයංක්රීය ධාවනය සබල කිරීමට තෝරා ගත හැකිය. + subject: Mastodon වෙත සාදරයෙන් පිළිගනිමු + tip_federated_timeline: ෆෙඩරේටඩ් කාලරාමුව යනු මැස්ටෝඩන් ජාලයේ ගිනි හෝස් දසුනකි. නමුත් එයට ඇතුළත් වන්නේ ඔබේ අසල්වැසියන් දායක වී ඇති පුද්ගලයින් පමණි, එබැවින් එය සම්පූර්ණ නොවේ. + tip_following: ඔබ පෙරනිමියෙන් ඔබගේ සේවාදායකයේ පරිපාලක(න්) අනුගමනය කරයි. වඩාත් සිත්ගන්නා පුද්ගලයින් සොයා ගැනීමට, දේශීය සහ ෆෙඩරල් කාලරේඛා පරීක්ෂා කරන්න. + tip_local_timeline: ප්රාදේශීය කාලරේඛාව යනු %{instance}හි පුද්ගලයින්ගේ ගිනි හෝස් දසුනකි. මේ ඔබේ ආසන්න අසල්වැසියන්! + tip_mobile_webapp: ඔබගේ ජංගම බ්රවුසරය ඔබගේ මුල් තිරයට Mastodon එක් කිරීමට ඉදිරිපත් කරන්නේ නම්, ඔබට තල්ලු දැනුම්දීම් ලැබිය හැක. එය බොහෝ ආකාරවලින් ස්වදේශීය යෙදුමක් ලෙස ක්රියා කරයි! + tips: ඉඟි + title: නැවට සාදරයෙන් පිළිගනිමු, %{name}! + users: + follow_limit_reached: ඔබට පුද්ගලයින් %{limit} කට වඩා අනුගමනය කළ නොහැක + invalid_otp_token: වලංගු නොවන ද්වි-සාධක කේතය + otp_lost_help_html: ඔබට දෙකටම ප්රවේශය අහිමි වුවහොත්, ඔබට %{email}සමඟ සම්බන්ධ විය හැක + seamless_external_login: ඔබ බාහිර සේවාවක් හරහා ලොග් වී ඇත, එබැවින් මුරපදය සහ ඊමේල් සැකසුම් නොමැත. + signed_in_as: 'මෙසේ පුරනය වී ඇත:' + verification: + explanation_html: 'ඔබගේ පැතිකඩ පාරදත්ත</strong>හි ඇති සබැඳි වල හිමිකරු ලෙස ඔබට <strong>සත්යාපනය කළ හැක. ඒ සඳහා, සම්බන්ධිත වෙබ් අඩවියේ ඔබේ Mastodon පැතිකඩ වෙත ආපසු සබැඳියක් තිබිය යුතුය. සබැඳිය ආපසු <strong></code> </strong> <code>යුතුය. සබැඳියේ පෙළ අන්තර්ගතය වැදගත් නොවේ. මෙන්න උදාහරණයක්:' + verification: සත්යාපනය + webauthn_credentials: + add: නව ආරක්ෂක යතුර එක් කරන්න + create: + error: ඔබගේ ආරක්ෂක යතුර එක් කිරීමේ ගැටලුවක් ඇති විය. කරුණාකර නැවත උත්සාහ කරන්න. + success: ඔබගේ ආරක්ෂක යතුර සාර්ථකව එක් කරන ලදී. + delete: මකන්න + delete_confirmation: ඔබට මෙම ආරක්ෂක යතුර මැකීමට අවශ්ය බව විශ්වාසද? + description_html: ඔබ <strong>ආරක්ෂක යතුරු සත්යාපනය</strong>සක්රීය කරන්නේ නම්, පුරනය වීමේදී ඔබගේ ආරක්ෂක යතුරු වලින් එකක් භාවිතා කිරීම අවශ්ය වේ. + destroy: + error: ඔබගේ ආරක්ෂක යතුර මැකීමේ ගැටලුවක් ඇති විය. කරුණාකර නැවත උත්සාහ කරන්න. + success: ඔබගේ ආරක්ෂක යතුර සාර්ථකව මකා ඇත. + invalid_credential: වලංගු නොවන ආරක්ෂක යතුර + nickname_hint: ඔබගේ නව ආරක්ෂක යතුරේ අන්වර්ථ නාමය ඇතුළත් කරන්න + not_enabled: ඔබ තවමත් WebAuthn සබල කර නැත + not_supported: මෙම බ්රවුසරය ආරක්ෂක යතුරු සඳහා සහය නොදක්වයි + otp_required: ආරක්ෂක යතුරු භාවිතා කිරීමට කරුණාකර පළමුව ද්වි-සාධක සත්යාපනය සක්රීය කරන්න. + registered_on: "%{date}හි ලියාපදිංචි වී ඇත" diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index 401dd12df..dddc8f378 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -96,6 +96,10 @@ ast: reblog: Daquién compartió dalgún estáu de to tag: name: Etiqueta + user_role: + name: Nome + permissions_as_keys: Permisos + position: Prioridá 'no': Non required: mark: "*" diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index ccbb90282..f13624403 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -68,6 +68,11 @@ ca: with_dns_records: Es procurarà resoldre els registres DNS del domini determinat i els resultats també es llistaran a la llista negra featured_tag: name: 'És possible que vulguis utilitzar una d''aquestes:' + filters: + action: Tria quina acció cal executar quan una publicació coincideixi amb el filtre + actions: + hide: Ocultar completament el contingut filtrat, comportant-se com si no existís + warn: Oculta el contingut filtrat rera un avís mencionant el títol del filtre form_challenge: current_password: Estàs entrant en una àrea segura imports: @@ -91,6 +96,13 @@ ca: name: Només pots canviar la caixa de les lletres, per exemple, per fer-la més llegible user: chosen_languages: Quan estigui marcat, només es mostraran les publicacions en les llengües seleccionades en les línies de temps públiques + role: El rol controla quines permissions té l'usuari + user_role: + color: Color que s'utilitzarà per al rol a tota la interfície d'usuari, com a RGB en format hexadecimal + highlighted: Això torno el rol visibile publicament + name: Nom públic del rol, si el rol està configurat per a ser mostrat com a insígnia + permissions_as_keys: Els usuaris amb aquest rol tingran accés a... + position: El rol superior decideix la resolució de conflictes en certes situacions. Certes accions només es poden realitzar amb rols amb menor prioritat webhook: events: Selecciona esdeveniments a enviar url: On els esdeveniments seran enviats @@ -181,6 +193,7 @@ ca: setting_use_pending_items: Mode lent severity: Severitat sign_in_token_attempt: Codi de seguretat + title: Títol type: Importa el tipus username: Nom d'usuari username_or_email: Nom d'usuari o adreça electrònica @@ -189,6 +202,10 @@ ca: with_dns_records: Incloure registres MX i IP del domini featured_tag: name: Etiqueta + filters: + actions: + hide: Oculta completament + warn: Oculta amb un avís interactions: must_be_follower: Bloqueja les notificacions de persones que no em segueixen must_be_following: Bloqueja les notificacions de persones no seguides @@ -222,6 +239,14 @@ ca: name: Etiqueta trendable: Permet que aquesta etiqueta aparegui en les tendències usable: Permetre a les publicacions emprar aquesta etiqueta + user: + role: Rol + user_role: + color: Color de la insígnia + highlighted: Motra el rol com a insígnia en el perfil dels usuaris + name: Nom + permissions_as_keys: Permisos + position: Prioritat webhook: events: Esdeveniments activats url: URL del extrem diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 9221152f4..47bf13b6c 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -91,6 +91,9 @@ cs: 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 příspěvky ve zvolených jazycích + user_role: + highlighted: Toto roli učiní veřejně viditelnou + permissions_as_keys: Uživatelé s touto rolí budou moci... webhook: events: Zvolte odesílané události url: Kam budou události odesílány @@ -222,6 +225,14 @@ cs: name: Hashtag trendable: Povolit zobrazení tohoto hashtagu mezi populárními usable: Povolit používat tento hashtag v příspěvcích + user: + role: Role + user_role: + color: Barva odznaku + highlighted: Zobrazit roli jako odznak na profilech uživatelů + name: Název + permissions_as_keys: Oprávnění + position: Priorita webhook: events: Zapnuté události url: URL koncového bodu diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 472a44201..425f62efc 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -73,6 +73,7 @@ cy: labels: account: fields: + name: Label value: Cynnwys account_alias: acct: Enw'r hen gyfrif @@ -89,6 +90,7 @@ cy: types: disable: Analluogi none: Gwneud dim + sensitive: Sensitif silence: Tawelwch suspend: Dileu data cyfrif warning_preset_id: Defnyddiwch ragnod rhag rhybudd @@ -107,6 +109,7 @@ 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 @@ -149,6 +152,7 @@ cy: setting_use_pending_items: Modd araf severity: Difrifoldeb sign_in_token_attempt: Cod dioelwch + title: Teitl type: Modd mewnforio username: Enw defnyddiwr username_or_email: Enw defnyddiwr neu e-bost @@ -166,6 +170,8 @@ cy: invite_request: text: Pam hoffech ymuno? ip_block: + comment: Sylw + ip: IP severity: Rheol notification_emails: digest: Anfonwch e-byst crynhoi @@ -183,6 +189,11 @@ cy: name: Hashnod trendable: Gadewch i'r hashnod hwn ymddangos o dan dueddiadau usable: Caniatáu i tŵtiau ddefnyddio'r hashnod hwn + user: + role: Rôl + user_role: + name: Enw + permissions_as_keys: Caniatâd 'no': Na required: mark: "*" diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index bf735091f..021ff6bdf 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -68,6 +68,11 @@ da: with_dns_records: Et forsøg på at opløse det givne domænes DNS-poster foretages, og resultaterne blokeres ligeledes featured_tag: name: 'Et af flg. ønskes måske anvendt:' + filters: + action: Vælg handlingen til eksekvering, når et indlæg matcher filteret + actions: + hide: Skjul filtreret indhold helt (adfærd som om, det ikke fandtes) + warn: Skjul filtreret indhold bag en advarsel, der nævner filterets titel form_challenge: current_password: Du bevæger dig ind på et sikkert område imports: @@ -91,6 +96,13 @@ da: name: Kun bogstavtyper (store/små) kan ændres, eksempelvis for at gøre det mere læsbart user: chosen_languages: Når markeret, vil kun indlæg på de valgte sprog fremgå på offentlige tidslinjer + role: Rollen styrer, hvilke tilladelser brugeren har + user_role: + color: Farven, i RGB hex-format, der skal bruges til rollen i hele UI'en + highlighted: Dette gør rollen offentligt synlig + name: Offentligt rollennavn, hvis rollen er opsat til fremstå som et badge + permissions_as_keys: Brugere med denne rolle vil kunne tilgå... + position: Højere rolle bestemmer konfliktløsning i visse situationer. Visse handlinger kan kun udføres på roller med lavere prioritet webhook: events: Vælg begivenheder at sende url: Hvor begivenheder sendes til @@ -181,6 +193,7 @@ da: setting_use_pending_items: Langsom tilstand severity: Alvorlighed sign_in_token_attempt: Sikkerhedskode + title: Titel type: Importtype username: Brugernavn username_or_email: Brugernavn eller e-mail @@ -189,6 +202,10 @@ da: with_dns_records: Inkludér domænets MX-poster og IP'er featured_tag: name: Hashtag + filters: + actions: + hide: Skjul helt + warn: Skjul bag en advarsel interactions: must_be_follower: Blokér notifikationer fra ikke-følgere must_be_following: Blokér notifikationer fra folk, som ikke følges @@ -222,6 +239,14 @@ da: name: Hashtag trendable: Tillad visning af dette hashtag under trends usable: Tillad indlæg at benytte dette hashtag + user: + role: Rolle + user_role: + color: Badge-farve + highlighted: Vis rolle som badge på brugerprofiler + name: Navn + permissions_as_keys: Tilladelser + position: Prioritet webhook: events: Aktive begivenheder url: Endepunkts-URL diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index d7dd4ae5d..72c98d8d5 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -172,6 +172,7 @@ el: setting_use_pending_items: Αργή λειτουργία severity: Αυστηρότητα sign_in_token_attempt: Κωδικός ασφαλείας + title: Τίτλος type: Τύπος εισαγωγής username: Όνομα χρηστη username_or_email: Όνομα ή διεύθυνση email χρήστη @@ -180,6 +181,10 @@ el: with_dns_records: Συμπερίληψη εγγραφών MX και διευθύνσεων IP του τομέα featured_tag: name: Ετικέτα + filters: + actions: + hide: Πλήρης απόκρυψη + warn: Απόκρυψη με προειδοποίηση interactions: must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν σε ακολουθούν must_be_following: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index ae97c4d8d..1e0ab617e 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -68,6 +68,11 @@ en: with_dns_records: An attempt to resolve the given domain's DNS records will be made and the results will also be blocked featured_tag: name: 'You might want to use one of these:' + filters: + action: Chose which action to perform when a post matches the filter + actions: + hide: Completely hide the filtered content, behaving as if it did not exist + warn: Hide the filtered content behind a warning mentioning the filter's title form_challenge: current_password: You are entering a secure area imports: @@ -91,6 +96,13 @@ en: name: You can only change the casing of the letters, for example, to make it more readable user: chosen_languages: When checked, only posts in selected languages will be displayed in public timelines + role: The role controls which permissions the user has + user_role: + color: Color to be used for the role throughout the UI, as RGB in hex format + highlighted: This makes the role publicly visible + name: Public name of the role, if role is set to be displayed as a badge + permissions_as_keys: Users with this role will have access to... + position: Higher role decides conflict resolution in certain situations. Certain actions can only be performed on roles with a lower priority webhook: events: Select events to send url: Where events will be sent to @@ -181,6 +193,7 @@ en: setting_use_pending_items: Slow mode severity: Severity sign_in_token_attempt: Security code + title: Title type: Import type username: Username username_or_email: Username or Email @@ -189,6 +202,10 @@ en: with_dns_records: Include MX records and IPs of the domain featured_tag: name: Hashtag + filters: + actions: + hide: Hide completely + warn: Hide with a warning interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow @@ -222,6 +239,14 @@ en: name: Hashtag trendable: Allow this hashtag to appear under trends usable: Allow posts to use this hashtag + user: + role: Role + user_role: + color: Badge color + highlighted: Display role as badge on user profiles + name: Name + permissions_as_keys: Permissions + position: Priority webhook: events: Enabled events url: Endpoint URL diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 8aeab6069..e3089d47d 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -10,7 +10,7 @@ eo: text: Vi povas uzi skribmanierojn de mesaĝoj, kiel URL-ojn, kradvortojn kaj menciojn title: Laŭvola. Ne videbla por la ricevanto admin_account_action: - include_statuses: La uzanto vidos, kiujn afiŝojn estas kaŭzintaj la moderigan agon aŭ averton + include_statuses: La uzanto vidos, kiujn afiŝojn kaŭzis la agon de moderigo aŭ de averto 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 <a href="%{path}">aldoni avertajn antaŭagordojn</a> por ŝpari tempon type_html: Elektu kion fari kun <strong>%{acct}</strong> @@ -35,32 +35,36 @@ eo: current_password: Pro sekuraj kialoj, bonvolu enigi la pasvorton de la nuna konto current_username: Por konfirmi, bonvolu enigi la uzantnomon de la nuna konto digest: Sendita nur post longa tempo de neaktiveco, kaj nur se vi ricevis personan mesaĝon en via foresto - email: Vi ricevos konfirman retmesaĝon + email: Vi ricevos retpoŝtaĵon de konfirmo fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo header: Formato PNG, GIF aŭ JPG. Ĝis %{size}. Estos malgrandigita al %{dimensions}px inbox_url: Kopiu la URL de la ĉefpaĝo de la ripetilo, kiun vi volas uzi - irreversible: Elfiltritaj mesaĝoj malaperos por ĉiam, eĉ se la filtrilo estas poste forigita - locale: La lingvo de la uzant-interfaco, retmesaĝoj kaj puŝ-sciigoj + irreversible: La filtritaj mesaĝoj malaperos por eterne, eĉ se la filtrilo estas forigita poste + locale: La lingvo de la fasado, de retpoŝtaĵoj, kaj de sciigoj locked: Vi devos aprobi ĉiun peton de sekvado mane password: Uzu almenaŭ 8 signojn phrase: Estos provita senzorge pri la uskleco de teksto aŭ averto pri enhavo de mesaĝo scopes: Kiujn API-ojn la aplikaĵo permesiĝos atingi. Se vi elektas supran amplekson, vi ne bezonas elekti la individuajn. - setting_aggregate_reblogs: Ne montri novajn diskonigojn de mesaĝoj laste diskonigitaj (nur efikas al novaj diskonigoj) - setting_default_sensitive: Tiklaj aŭdovidaĵoj estas defaŭlte kaŝita kaj povas esti malkiŝita per klako - setting_display_media_default: Kaŝi aŭdovidaĵojn markitajn kiel tiklaj - setting_display_media_hide_all: Ĉiam kaŝi ĉiujn aŭdovidaĵojn - setting_display_media_show_all: Ĉiam montri aŭdovidaĵojn markitajn kiel tiklaj - setting_hide_network: Tiuj, kiujn vi sekvas, kaj tiuj, kiuj sekvas vin ne estos videblaj en via profilo + setting_aggregate_reblogs: Ne montri novajn plusendojn de mesaĝoj lastatempe plusenditaj (nur efikas al nove ricevitaj plusendoj) + setting_always_send_emails: Normale, la sciigoj per retpoŝto ne estos senditaj kiam vi uzas Mastodon aktive + setting_default_sensitive: La tiklaj aŭdovidaĵoj estas kaŝitaj implicite, kaj povas esti montritaj per klako + setting_display_media_default: Kaŝi aŭdovidaĵojn markitajn kiel tikla + setting_display_media_hide_all: Ĉiam kaŝi la aŭdovidaĵojn + setting_display_media_show_all: Ĉiam montri la aŭdovidaĵojn + setting_hide_network: Tiuj kiujn vi sekvas, kaj tiuj kiuj sekvas vin estos kaŝitaj en via profilo setting_noindex: Influas vian publikan profilon kaj mesaĝajn paĝojn setting_show_application: La aplikaĵo, kiun vi uzas por afiŝi, estos montrita en la detala vido de viaj mesaĝoj setting_use_blurhash: Transirojn estas bazita sur la koloroj de la kaŝitaj aŭdovidaĵoj sed ne montri iun ajn detalon setting_use_pending_items: Kaŝi tempoliniajn ĝisdatigojn malantaŭ klako anstataŭ aŭtomate rulumi la fluon - username: Via uzantnomo estos unika ĉe %{domain} + username: Via uzantnomo estos unika en %{domain} whole_word: Kiam la vorto aŭ frazo estas nur litera aŭ cifera, ĝi estos uzata nur se ĝi kongruas kun la tuta vorto domain_allow: domain: Ĉi tiu domajno povos akiri datumon de ĉi tiu servilo kaj envenanta datumo estos prilaborita kaj konservita featured_tag: name: 'Vi povus uzi iun el la jenaj:' + filters: + actions: + warn: Kaŝi la enhavon filtritan malantaŭ averto mencianta la nomon de la filtro form_challenge: current_password: Vi eniras sekuran areon imports: @@ -114,7 +118,7 @@ eo: text: Anonco defaults: autofollow: Inviti al sekvi vian konton - avatar: Profilbildo + avatar: Rolfiguro bot: Tio estas robota konto chosen_languages: Filtri lingvojn confirm_new_password: Konfirmi novan pasvorton @@ -138,9 +142,10 @@ eo: note: Sinprezento otp_attempt: Kodo de dufaktora aŭtentigo password: Pasvorto - phrase: Vorto aŭ frazo + phrase: Ĉefvorto aŭ frazo setting_advanced_layout: Ebligi altnivelan retpaĝan interfacon setting_aggregate_reblogs: Grupigi diskonigojn en templinioj + setting_always_send_emails: Ĉiam sendi la sciigojn per retpoŝto 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 @@ -150,7 +155,7 @@ eo: setting_delete_modal: Montri konfirman fenestron antaŭ ol forigi mesaĝon setting_disable_swiping: Malebligi svingajn movojn setting_display_media: Aŭdovidaĵa montrado - setting_display_media_default: Dekomenca + setting_display_media_default: Implicita setting_display_media_hide_all: Kaŝi ĉiujn setting_display_media_show_all: Montri ĉiujn setting_expand_spoilers: Ĉiam malfoldas mesaĝojn markitajn per averto pri enhavo @@ -159,19 +164,24 @@ eo: setting_reduce_motion: Redukti la movecojn de la animacioj setting_show_application: Publikigi la aplikaĵon uzatan por sendi mesaĝojn setting_system_font_ui: Uzi la dekomencan tiparon de la sistemo - setting_theme: Reteja etoso + setting_theme: Etoso de la retejo setting_trends: Montri hodiaŭajn furoraĵojn setting_unfollow_modal: Montri konfirman fenestron antaŭ ol ĉesi sekvi iun setting_use_blurhash: Montri buntajn transirojn por kaŝitaj aŭdovidaĵoj setting_use_pending_items: Malrapida modo severity: Graveco sign_in_token_attempt: Sekureca kodo + title: Titolo type: Importa tipo username: Uzantnomo username_or_email: Uzantnomo aŭ Retadreso whole_word: Tuta vorto featured_tag: name: Kradvorto + filters: + actions: + hide: Kaŝi komplete + warn: Kaŝi malantaŭ averto interactions: must_be_follower: Bloki sciigojn de nesekvantoj must_be_following: Bloki sciigojn de homoj, kiujn vi ne sekvas diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index a6e070fd0..9e51c4d51 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -68,6 +68,11 @@ es-AR: with_dns_records: Se hará un intento de resolver los registros DNS del dominio dado y los resultados serán también bloqueados featured_tag: name: 'Puede que quieras usar una de estas:' + filters: + action: Elegir qué acción realizar cuando un mensaje coincide con el filtro + actions: + hide: Ocultar completamente el contenido filtrado, comportándose como si no existiera + warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro form_challenge: current_password: Estás ingresando en un área segura imports: @@ -91,6 +96,13 @@ es-AR: 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én marcados, sólo se mostrarán los mensajes en los idiomas seleccionados en las líneas temporales públicas + role: El rol controla qué permisos tiene el usuario + user_role: + color: Color que se utilizará para el rol a lo largo de la interface de usuario, como RGB en formato hexadecimal + highlighted: Esto hace que el rol sea públicamente visible + name: Nombre público del rol, si el rol se establece para que se muestre como una insignia + permissions_as_keys: Los usuarios con este rol tendrán acceso a… + position: Un rol más alto decide la resolución de conflictos en ciertas situaciones. Ciertas acciones sólo pueden llevarse a cabo en roles con prioridad inferior webhook: events: Seleccionar eventos para enviar url: Adónde serán enviados los eventos @@ -181,6 +193,7 @@ es-AR: setting_use_pending_items: Modo lento severity: Severidad sign_in_token_attempt: Código de seguridad + title: Título type: Tipo de importación username: Nombre de usuario username_or_email: Nombre de usuario o correo electrónico @@ -189,6 +202,10 @@ es-AR: with_dns_records: Incluir los registros MX y las direcciones IP del dominio featured_tag: name: Etiqueta + filters: + actions: + hide: Ocultar completamente + warn: Ocultar con una advertencia interactions: must_be_follower: Bloquear notificaciones de cuentas que no te siguen must_be_following: Bloquear notificaciones de cuentas que no seguís @@ -222,6 +239,14 @@ es-AR: name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias usable: Permitir a los mensajes usar esta etiqueta + user: + role: Rol + user_role: + color: Color de Insignia + highlighted: Mostrar rol como insignia en perfiles de usuario + name: Nombre + permissions_as_keys: Permisos + position: Prioridad webhook: events: Eventos habilitados url: Dirección web del punto final diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 66efd68ab..582295abb 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -68,6 +68,11 @@ es-MX: 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:' + filters: + action: Elegir qué acción realizar cuando una publicación coincide con el filtro + actions: + hide: Ocultar completamente el contenido filtrado, comportándose como si no existiera + warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro form_challenge: current_password: Estás entrando en un área segura imports: @@ -91,6 +96,15 @@ es-MX: 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 + role: El rol controla qué permisos tiene el usuario + user_role: + color: Color que se utilizará para el rol a lo largo de la interfaz de usuario, como RGB en formato hexadecimal + highlighted: Esto hace que el rol sea públicamente visible + name: Nombre público del rol, si el rol se establece para que se muestre como una insignia + permissions_as_keys: Los usuarios con este rol tendrán acceso a... + webhook: + events: Seleccionar eventos para enviar + url: Donde los eventos serán enviados labels: account: fields: @@ -178,6 +192,7 @@ es-MX: setting_use_pending_items: Modo lento severity: Severidad sign_in_token_attempt: Código de seguridad + title: Título type: Importar tipo username: Nombre de usuario username_or_email: Usuario o Email @@ -186,6 +201,10 @@ es-MX: with_dns_records: Incluye los registros MX y las IP del dominio featured_tag: name: Etiqueta + filters: + actions: + hide: Ocultar completamente + warn: Ocultar con una advertencia interactions: must_be_follower: Bloquear notificaciones de personas que no te siguen must_be_following: Bloquear notificaciones de personas que no sigues @@ -219,6 +238,17 @@ es-MX: name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias usable: Permitir a los toots usar esta etiqueta + user: + role: Rol + user_role: + color: Color de insignia + highlighted: Mostrar rol como insignia en perfiles de usuario + name: Nombre + permissions_as_keys: Permisos + position: Prioridad + webhook: + events: Eventos habilitados + url: URL de Endpoint 'no': 'No' recommended: Recomendado required: diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 53863ba31..cd390493c 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -68,6 +68,11 @@ es: 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:' + filters: + action: Elegir qué acción realizar cuando una publicación coincide con el filtro + actions: + hide: Ocultar completamente el contenido filtrado, comportándose como si no existiera + warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro form_challenge: current_password: Estás entrando en un área segura imports: @@ -91,6 +96,13 @@ es: 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 las publicaciones en los idiomas seleccionados en las líneas de tiempo públicas + role: El rol controla qué permisos tiene el usuario + user_role: + color: Color que se utilizará para el rol a lo largo de la interfaz de usuario, como RGB en formato hexadecimal + highlighted: Esto hace que el rol sea públicamente visible + name: Nombre público del rol, si el rol se establece para que se muestre como una insignia + permissions_as_keys: Los usuarios con este rol tendrán acceso a... + position: Un rol superior decide la resolución de conflictos en ciertas situaciones. Ciertas acciones sólo pueden llevarse a cabo en roles con menor prioridad webhook: events: Seleccionar eventos para enviar url: Donde los eventos serán enviados @@ -181,6 +193,7 @@ es: setting_use_pending_items: Modo lento severity: Severidad sign_in_token_attempt: Código de seguridad + title: Título type: Importar tipo username: Nombre de usuario username_or_email: Usuario o Email @@ -189,6 +202,10 @@ es: with_dns_records: Incluye los registros MX y las IP del dominio featured_tag: name: Etiqueta + filters: + actions: + hide: Ocultar completamente + warn: Ocultar con una advertencia interactions: must_be_follower: Bloquear notificaciones de personas que no te siguen must_be_following: Bloquear notificaciones de personas que no sigues @@ -222,6 +239,14 @@ es: name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias usable: Permitir a las publicaciones usar esta etiqueta + user: + role: Rol + user_role: + color: Color de insignia + highlighted: Mostrar rol como insignia en perfiles de usuario + name: Nombre + permissions_as_keys: Permisos + position: Prioridad webhook: events: Eventos habilitados url: URL de Endpoint diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 672ad34b7..3c7780b57 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -68,6 +68,11 @@ fr: with_dns_records: Une tentative de résolution des enregistrements DNS du domaine donné sera effectuée et les résultats seront également mis sur liste noire featured_tag: name: 'Vous pourriez vouloir utiliser l’un d’entre eux :' + filters: + action: Choisir l'action à effectuer quand un message correspond au filtre + actions: + hide: Cacher complètement le contenu filtré, faire comme s'il n'existait pas + warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre form_challenge: current_password: Vous entrez une zone sécurisée imports: @@ -91,6 +96,13 @@ fr: name: Vous ne pouvez modifier que la casse des lettres, par exemple, pour le rendre plus lisible user: chosen_languages: Lorsque coché, seuls les messages dans les langues sélectionnées seront affichés sur les fils publics + role: Le rôle définit quelles autorisations a l'utilisateur⋅rice + user_role: + color: Couleur à attribuer au rôle dans l'interface, au format hexadécimal RVB + highlighted: Cela rend le rôle visible publiquement + name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge + permissions_as_keys: Les utilisateur·rice·s ayant ce rôle auront accès à … + position: Dans certaines situations, un rôle supérieur peut trancher la résolution d'un conflit. Mais certaines opérations ne peuvent être effectuées que sur des rôles ayant une priorité inférieure webhook: events: Sélectionnez les événements à envoyer url: Là où les événements seront envoyés @@ -181,6 +193,7 @@ fr: setting_use_pending_items: Mode lent severity: Sévérité sign_in_token_attempt: Code de sécurité + title: Nom type: Type d’import username: Identifiant username_or_email: Nom d’utilisateur·rice ou courriel @@ -189,6 +202,10 @@ fr: with_dns_records: Inclure les enregistrements MX et IP du domaine featured_tag: name: Hashtag + filters: + actions: + hide: Cacher complètement + warn: Cacher derrière un avertissement interactions: must_be_follower: Bloquer les notifications des personnes qui ne vous suivent pas must_be_following: Bloquer les notifications des personnes que vous ne suivez pas @@ -222,6 +239,14 @@ fr: name: Hashtag trendable: Autoriser ce hashtag à apparaitre dans les tendances usable: Autoriser les messages à utiliser ce hashtag + user: + role: Rôle + user_role: + color: Couleur du badge + highlighted: Afficher le rôle avec un badge sur les profils des utilisateur·rice·s + name: Nom + permissions_as_keys: Autorisations + position: Priorité webhook: events: Événements activés url: URL du point de terminaison diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 4d28b2f2a..54e2b3e43 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -49,7 +49,7 @@ gl: 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 publicacións que foron promovidas recentemente (só afecta a promocións recén recibidas) - setting_always_send_emails: Como norma xeral non che enviamos emails se usas activamente Mastodon + setting_always_send_emails: Como norma xeral non che enviamos correos electrónicos se usas activamente Mastodon 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 @@ -57,7 +57,7 @@ gl: 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 publicación 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_blurhash: Os gradientes toman as cores da imaxe oculta pero esvaecendo tódolos detalles 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 @@ -68,6 +68,11 @@ gl: with_dns_records: Vaise facer un intento de resolver os rexistros DNS proporcionados e os resultados tamén irán a lista de bloqueo featured_tag: name: 'Poderías usar algún destos:' + filters: + action: Elixe a acción a realizar cando algunha publicación coincida co filtro + actions: + hide: Agochar todo o contido filtrado, facer coma se non existise + warn: Agochar o contido filtrado tras un aviso que conteña o nome do filtro form_challenge: current_password: Estás entrando nun área segura imports: @@ -91,9 +96,16 @@ gl: name: Só podes cambiar maiús/minúsculas, por exemplo, mellorar a lexibilidade user: chosen_languages: Se ten marca, só as publicacións nos idiomas seleccionados serán mostrados en cronoloxías públicas + role: O control dos roles adxudicados ás usuarias + user_role: + color: Cor que se usará para o rol a través da IU, como RGB en formato hex + highlighted: Esto fai o rol públicamente visible + name: Nome público do rol, se o rol se mostra como unha insignia + permissions_as_keys: As usuarias con este rol terá acceso a... + position: O rol superior decide nos conflitos en certas situacións. Algunhas accións só poden aplicarse sobre roles cunha prioridade menor webhook: - events: Elexir eventos a enviar - url: Cando serán enviados os eventos + events: Elixir eventos a enviar + url: A onde se enviarán os eventos labels: account: fields: @@ -108,7 +120,7 @@ gl: title: Título admin_account_action: include_statuses: Incluír no correo as publicacións denunciadas - send_email_notification: Notificar a usuaria por correo-e + send_email_notification: Notificar á usuaria por email text: Aviso personalizado type: Acción types: @@ -155,7 +167,7 @@ gl: phrase: Palabra chave ou frase setting_advanced_layout: Activar interface web avanzada setting_aggregate_reblogs: Agrupar promocións nas cronoloxías - setting_always_send_emails: Enviar sempre notificacións por email + setting_always_send_emails: Enviar sempre notificacións por correo electrónico 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 publicacións non despregadas @@ -177,18 +189,23 @@ gl: setting_theme: Decorado da instancia setting_trends: Mostrar as tendencias de hoxe setting_unfollow_modal: Solicitar confirmación antes de deixar de seguir alguén - setting_use_blurhash: Mostrar gradientes coloridos para medios ocultos + setting_use_blurhash: Mostrar gradientes coloridos para multimedia oculto setting_use_pending_items: Modo lento severity: Severidade sign_in_token_attempt: Código de seguridade + title: Título type: Tipo de importación username: Nome de usuaria - username_or_email: Nome de usuaria ou Correo-e + username_or_email: Identificador ou Email whole_word: Palabra completa email_domain_block: with_dns_records: Incluír rexistros MX e IPs do dominio featured_tag: name: Cancelo + filters: + actions: + hide: Agochar completamente + warn: Agochar tras un aviso interactions: must_be_follower: Bloquear as notificacións de non-seguidoras must_be_following: Bloquea as notificacións de persoas que non segues @@ -222,6 +239,14 @@ gl: name: Cancelo trendable: Permitir que este cancelo apareza en tendencias usable: Permitir que as publicacións utilicen este cancelo + user: + role: Rol + user_role: + color: Cor da insignia + highlighted: Mostrar rol como insignia en perfís de usuarias + name: Nome + permissions_as_keys: Permisos + position: Prioridade webhook: events: Eventos activados url: URL do extremo diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index fa8ea5755..7d4cd5584 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -68,6 +68,11 @@ hu: with_dns_records: Megpróbáljuk a megadott domain DNS rekordjait lekérni, és az eredményeket hozzáadjuk a tiltólistához featured_tag: name: 'Ezeket esetleg használhatod:' + filters: + action: A végrehajtandó műveletet, ha a bejegyzés megfelel a szűrőnek + actions: + hide: A szűrt tartalom teljes elrejtése, mintha nem is létezne + warn: A szűrt tartalom a szűrő címét említő figyelmeztetés mögé rejtése form_challenge: current_password: Beléptél egy biztonsági térben imports: @@ -91,6 +96,13 @@ hu: 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ű bejegyzések jelennek majd meg a nyilvános idővonalon + role: A szerep szabályozza, hogy a felhasználó milyen jogosultságokkal rendelkezik + user_role: + color: A szerephez használandó szín mindenhol a felhasználói felületen, hexa RGB formátumban + highlighted: Ez nyilvánosan láthatóvá teszi a szerepet + name: A szerep nyilvános neve, ha a szerepet úgy állították be, hogy jelvényként látható legyen + permissions_as_keys: A felhasználók ezzel a szereppel elérhetik a... + position: A magasabb szerepkör oldja fel az ütközéseket bizonyos helyzetekben. Bizonyos műveleteket csak alacsonyabb prioritású szerepkörrel lehet elvégezni. webhook: events: Válaszd ki a küldendő eseményeket url: Ahová az eseményket küldjük @@ -181,6 +193,7 @@ hu: setting_use_pending_items: Lassú mód severity: Súlyosság sign_in_token_attempt: Biztonsági kód + title: Cím type: Importálás típusa username: Felhasználónév username_or_email: Felhasználónév vagy e-mail cím @@ -189,6 +202,10 @@ hu: with_dns_records: Domain MX rekordjainak és IP-címeinek hozzávétele featured_tag: name: Hashtag + filters: + actions: + hide: Teljes elrejtés + warn: Elrejtés figyelmeztetéssel interactions: must_be_follower: Nem követőidtől érkező értesítések tiltása must_be_following: Nem követettjeidtől érkező értesítések tiltása @@ -222,6 +239,14 @@ hu: name: Hashtag trendable: A hashtag megjelenhet a felkapottak között usable: Bejegyzések használhatják ezt a hashtaget + user: + role: Szerep + user_role: + color: Jelvény színe + highlighted: Szerep megjelenítése jelvényként a felhasználói profilokon + name: Név + permissions_as_keys: Engedélyek + position: Prioritás webhook: events: Engedélyezett események url: Végponti URL diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 1132eff7a..6407ca89b 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -178,6 +178,7 @@ id: setting_use_pending_items: Mode pelan severity: Keparahan sign_in_token_attempt: Kode keamanan + title: Judul type: Tipe impor username: Nama pengguna username_or_email: Nama pengguna atau Email @@ -186,6 +187,10 @@ id: with_dns_records: Termasuk data MX dan IP domain featured_tag: name: Tagar + filters: + actions: + hide: Sembunyikan seluruhnya + warn: Sembunyikan dengan peringatan interactions: must_be_follower: Blokir notifikasi dari non-pengikut must_be_following: Blokir notifikasi dari orang yang tidak anda ikuti @@ -219,6 +224,8 @@ id: name: Tagar trendable: Izinkan tagar ini muncul di bawah tren usable: Izinkan toot memakai tagar ini + webhook: + events: Acara yang diaktifkan 'no': Tidak required: mark: "*" diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 5f72276b7..743c8964a 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -68,6 +68,11 @@ io: with_dns_records: Probo di rezolvar registri DNS di la domeno agesos e rezulti anke preventesos featured_tag: name: 'Vu forsan volas uzar 1 de co:' + filters: + action: Selektez ago kande posto parigas filtrilo + actions: + hide: Komplete celez filtrita kontenajo quale ol ne existas + warn: Celez filtrita kontenajo dop avert quo montras titulo di filtrilo form_challenge: current_password: Vu eniras sekura areo imports: @@ -91,6 +96,13 @@ io: name: Vu povas nur chanjar literkaso, por exemplo, por kauzigar lu divenar plu lektebla user: chosen_languages: Kande marketigesis, nur posti en selektesis lingui montresos en publika tempolinei + role: Rolo dominacas permisi quon uzanto havas + user_role: + color: Koloro quo uzesas por rolo en tota UI, quale RGB kun hexformato + highlighted: Co kauzigas rolo divenar publike videbla + name: Publika nomo di ca rolo, se rolo ajustesas quale montresas quale insigno + permissions_as_keys: Uzanti kun ca rolo povas... + position: Plu alta rolo decidas problemsolvo en kelka situeso. Kelka agi povas nur eventar a roli kun plu basa prioreso webhook: events: Selektigez eventi por sendar url: Ibe eventi sendesos @@ -181,6 +193,7 @@ io: setting_use_pending_items: Modo lenta severity: Severeso sign_in_token_attempt: Sekureskodexo + title: Titulo type: Tipo di importaco username: Uzernomo username_or_email: Uzantonomo o retposto @@ -189,6 +202,10 @@ io: with_dns_records: Inkluzez registraji MX e IPi di domeno featured_tag: name: Hashtago + filters: + actions: + hide: Tote celez + warn: Celez kun averto interactions: must_be_follower: Celar la savigi da homi, qui ne sequas tu must_be_following: Celar la savigi da homi, quin tu ne sequas @@ -222,6 +239,14 @@ io: name: Hashtago trendable: Permisez ca hashtago aparar che tendenci usable: Permisez posti uzar ca hashtago + user: + role: Rolo + user_role: + color: Insignokoloro + highlighted: Montrez rolo quale insigno en uzantoprofili + name: Nomo + permissions_as_keys: Permisi + position: Prioreso webhook: events: Aktivigita eventi url: URL di finpunto diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 998df1c0c..fb0233572 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -68,6 +68,11 @@ is: with_dns_records: Tilraun verður gerð til að leysa DNS-færslur uppgefins léns og munu niðurstöðurnar einnig verða útilokaðar featured_tag: name: 'Þú gætir viljað nota eitt af þessum:' + filters: + action: Veldu hvaða aðgerð á að framkvæma þegar færsla samsvarar síunni + actions: + hide: Fela síað efni algerlega, rétt eins og það sé ekki til staðar + warn: Fela síað efni á bakvið aðvörun sem tekur fram titil síunnar form_challenge: current_password: Þú ert að fara inn á öryggissvæði imports: @@ -91,6 +96,16 @@ is: name: Þú getur aðeins breytt stafstöði mill há-/lágstafa, til gæmis til að gera þetta læsilegra user: chosen_languages: Þegar merkt er við þetta, birtast einungis færslur á völdum tungumálum á opinberum tímalínum + role: Hlutverk stýrir hvaða heimildir notandinn hefur + user_role: + color: Litur sem notaður er fyrir hlutverkið allsstaðar í viðmótinu, sem RGB-gildi á hex-sniði + highlighted: Þetta gerir hlutverk sýnilegt opinberlega + name: Opinbert heiti hlutverks, ef birta á hlutverk sem merki + permissions_as_keys: Notendur með þetta hlutverk munu hafa aðgang að... + position: Rétthærra hlutverk ákvarðar lausn árekstra í ákveðnum tilfellum. Sumar aðgerðir er aðeins hægt að framkvæma á hlutverk með lægri forgangi + webhook: + events: Veldu atburði sem á að senda + url: Hvert atburðir verða sendir labels: account: fields: @@ -178,6 +193,7 @@ is: setting_use_pending_items: Rólegur hamur severity: Mikilvægi sign_in_token_attempt: Öryggiskóði + title: Titill type: Tegund innflutnings username: Notandanafn username_or_email: Notandanafn eða tölvupóstfang @@ -186,6 +202,10 @@ is: with_dns_records: Hafa með MX-færslur og IP-vistföng lénsins featured_tag: name: Myllumerki + filters: + actions: + hide: Fela alveg + warn: Fela með aðvörun interactions: must_be_follower: Loka á tilkynningar frá þeim sem ekki eru fylgjendur must_be_following: Loka á tilkynningar frá þeim sem þú fylgist ekki með @@ -219,6 +239,17 @@ is: name: Myllumerki trendable: Leyfa þessu myllumerki að birtast undir tilhneigingum usable: Leyfa færslum að nota þetta myllumerki + user: + role: Hlutverk + user_role: + color: Litur merkis + highlighted: Birta hlutverk sem merki á notandaauðkenni + name: Nafn + permissions_as_keys: Heimildir + position: Forgangur + webhook: + events: Virkjaðir atburðir + url: Slóð á endapunkt 'no': Nei required: mark: "*" diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 01c657bd1..df8a25396 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -68,6 +68,11 @@ it: with_dns_records: Sarà effettuato un tentativo di risolvere i record DNS del dominio in questione e i risultati saranno inseriti anche nella blacklist featured_tag: name: 'Eccone alcuni che potresti usare:' + filters: + action: Scegli quale azione eseguire quando un post corrisponde al filtro + actions: + hide: Nascondi completamente il contenuto filtrato, come se non esistesse + warn: Nascondi il contenuto filtrato e mostra invece un avviso, citando il titolo del filtro form_challenge: current_password: Stai entrando in un'area sicura imports: @@ -91,6 +96,13 @@ it: name: Puoi cambiare solo il minuscolo/maiuscolo delle lettere, ad esempio, per renderlo più leggibile user: chosen_languages: Quando una o più lingue sono contrassegnate, nelle timeline pubbliche vengono mostrati solo i toot nelle lingue selezionate + role: Il ruolo controlla quali permessi ha l'utente + user_role: + color: Colore da usare per il ruolo in tutta l'UI, come RGB in formato esadecimale + highlighted: Rende il ruolo visibile + name: Nome pubblico del ruolo, se il ruolo è impostato per essere visualizzato come distintivo + permissions_as_keys: Gli utenti con questo ruolo avranno accesso a... + position: Un ruolo più alto decide la risoluzione dei conflitti in determinate situazioni. Alcune azioni possono essere eseguite solo su ruoli con priorità più bassa webhook: events: Seleziona eventi da inviare url: Dove gli eventi saranno inviati @@ -181,6 +193,7 @@ it: setting_use_pending_items: Modalità lenta severity: Severità sign_in_token_attempt: Codice di sicurezza + title: Titolo type: Tipo importazione username: Nome utente username_or_email: Nome utente o email @@ -189,6 +202,10 @@ it: with_dns_records: Includi record MX e indirizzi IP del dominio featured_tag: name: Etichetta + filters: + actions: + hide: Nascondi completamente + warn: Nascondi con avviso interactions: must_be_follower: Blocca notifiche da chi non ti segue must_be_following: Blocca notifiche dalle persone che non segui @@ -222,6 +239,14 @@ it: name: Hashtag trendable: Permetti a questo hashtag di apparire nelle tendenze usable: Permetti ai post di usare questo hashtag + user: + role: Ruolo + user_role: + color: Colore distintivo + highlighted: Mostra il ruolo come distintivo sui profili utente + name: Nome + permissions_as_keys: Permessi + position: Priorità webhook: events: Eventi abilitati url: URL endpoint diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index d785f30b3..0140e7812 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -68,6 +68,11 @@ ko: with_dns_records: 입력한 도메인의 DNS를 조회를 시도하여 나온 값도 차단됩니다 featured_tag: name: '이것들을 사용하면 좋을 것 같습니다:' + filters: + action: 게시물이 필터에 걸러질 때 어떤 동작을 수행할 지 고르세요 + actions: + hide: 필터에 걸러진 글을 처음부터 없었던 것처럼 완전히 가리기 + warn: 필터에 걸러진 글을 필터 제목과 함께 경고 뒤에 가리기 form_challenge: current_password: 당신은 보안 구역에 진입하고 있습니다 imports: @@ -91,6 +96,16 @@ ko: name: 읽기 쉽게하기 위한 글자의 대소문자만 변경할 수 있습니다. user: chosen_languages: 체크하면, 선택 된 언어로 작성된 게시물들만 공개 타임라인에 보여집니다 + role: 역할은 사용자가 어떤 권한을 가지게 될 지 결정합니다 + user_role: + color: 색상은 사용자 인터페이스에서 역할을 나타내기 위해 사용되며, RGB 16진수 형식입니다 + highlighted: 이 역할이 공개적으로 보이도록 설정합니다 + name: 역할이 배지로 표시될 경우, 그 역할에 대한 공개적인 이름입니다 + permissions_as_keys: 이 역할을 가진 사용자는 다음에 접근할 수 있게 됩니다... + position: 특정 상황에서 충돌이 발생할 경우 더 높은 역할이 충돌을 해결합니다. 특정 작업은 우선순위가 낮은 역할에 대해서만 수행될 수 있습니다 + webhook: + events: 전송할 이벤트를 선택하세요 + url: 이벤트가 어디로 전송될 지 labels: account: fields: @@ -178,6 +193,7 @@ ko: setting_use_pending_items: 느린 모드 severity: 심각도 sign_in_token_attempt: 보안 코드 + title: 제목 type: 불러오기 종류 username: 사용자명 username_or_email: 사용자명 또는 이메일 @@ -186,6 +202,10 @@ ko: with_dns_records: 도메인의 IP와 MX 레코드 값을 포함 featured_tag: name: 해시태그 + filters: + actions: + hide: 완전히 숨기기 + warn: 경고와 함께 숨기기 interactions: must_be_follower: 나를 팔로우 하지 않는 사람에게서 온 알림을 차단 must_be_following: 내가 팔로우 하지 않는 사람에게서 온 알림을 차단 @@ -219,6 +239,17 @@ ko: name: 해시태그 trendable: 이 해시태그가 유행에 보여지도록 허용 usable: 이 해시태그를 게시물에 사용 가능하도록 허용 + user: + role: 역할 + user_role: + color: 배지 색상 + highlighted: 역할 배지를 사용자 프로필에 표시 + name: 이름 + permissions_as_keys: 권한 + position: 우선순위 + webhook: + events: 활성화된 이벤트 + url: 엔드포인트 URL 'no': 아니오 required: mark: "*" diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index 9cfe371b5..ea6db0972 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -93,6 +93,8 @@ ku: 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 + user_role: + position: Rola bilind di hinek rewşan de biryara çareserkirina nakokiyan dide. Hinej çalakî tenê dikarin li ser rolên bi pêşanînek kêmtir bêne kirin webhook: events: Bûyeran hilbijêre bo şandinê url: Cihê ku bûyer wê werin şandin @@ -224,6 +226,12 @@ ku: 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 + user: + role: Rol + user_role: + name: Nav + permissions_as_keys: Maf + position: Pêşikî webhook: events: Bûyerên çalakkirî url: Girêdana xala dawîbûnê diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 97fa2bff4..ad8f3bd4d 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -68,6 +68,11 @@ lv: 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:' + filters: + action: Izvēlies, kuru darbību veikt, ja ziņa atbilst filtram + actions: + hide: Paslēp filtrēto saturu pilnībā, izturoties tā, it kā tas neeksistētu + warn: Paslēp filtrēto saturu aiz brīdinājuma, kurā minēts filtra nosaukums form_challenge: current_password: Tu ieej drošā zonā imports: @@ -91,6 +96,13 @@ lv: 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 + role: Loma kontrolē, kādas atļaujas ir lietotājam + user_role: + color: Krāsa, kas jāizmanto lomai visā lietotāja interfeisā, kā RGB hex formātā + highlighted: Tas padara lomu publiski redzamu + name: Lomas publiskais nosaukums, ja loma ir iestatīta rādīšanai kā emblēma + permissions_as_keys: Lietotājiem ar šo lomu būs piekļuve... + position: What is "alower"? webhook: events: Atlasi nosūtāmos notikums url: Kur notikumi tiks nosūtīti @@ -181,6 +193,7 @@ lv: setting_use_pending_items: Lēnais režīms severity: Smagums sign_in_token_attempt: Drošības kods + title: Virsraksts type: Importa veids username: Lietotājvārds username_or_email: Lietotājvārds vai e-pasts @@ -189,6 +202,10 @@ lv: with_dns_records: Ietvert domēna MX ierakstus un IP adreses featured_tag: name: Tēmturis + filters: + actions: + hide: Paslēpt pilnībā + warn: Paslēpt ar brīdinājumu 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 @@ -222,6 +239,14 @@ lv: name: Tēmturis trendable: Atļaut šim tēmturim parādīties zem tendencēm usable: Atļaut lietot ziņās šo tēmturi + user: + role: Loma + user_role: + color: Emblēmas krāsa + highlighted: Atainot lomu kā emblēmu lietotāju profilos + name: Nosaukums + permissions_as_keys: Atļaujas + position: Prioritāte webhook: events: Iespējotie notikumi url: Galapunkta URL diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 4ecbe1c9d..3dd55c8b3 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -27,6 +27,8 @@ nl: scheduled_at: Laat leeg om de mededeling meteen te publiceren starts_at: Optioneel. In het geval dat jouw mededeling aan een bepaald tijdvak is gebonden text: Je kunt specifieke tekst voor berichten gebruiken. Let op de ruimte die de mededeling op het scherm van de gebruiker inneemt + appeal: + text: Je kunt maar eenmalig bezwaar indienen tegen een vastgestelde overtreding 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 @@ -63,6 +65,11 @@ nl: with_dns_records: Er wordt een poging gewaagd om de desbetreffende DNS-records op te zoeken, waarna de resultaten ook worden geblokkeerd featured_tag: name: 'Je wilt misschien een van deze gebruiken:' + filters: + action: Kies welke acties uitgevoerd moeten wanneer een bericht overeenkomt met het filter + actions: + hide: Verberg de gefilterde inhoud volledig, alsof het niet bestaat + warn: Verberg de gefilterde inhoud achter een waarschuwing, met de titel van het filter als waarschuwingstekst form_challenge: current_password: Je betreedt een veilige omgeving imports: @@ -116,6 +123,8 @@ nl: scheduled_at: Mededeling inplannen starts_at: Begint text: Mededeling + appeal: + text: Leg uit waarom deze beslissing volgens jou teruggedraaid moet worden defaults: autofollow: Uitnodigen om jouw account te volgen avatar: Avatar @@ -145,6 +154,7 @@ nl: phrase: Trefwoord of zinsdeel setting_advanced_layout: Geavanceerde webomgeving inschakelen setting_aggregate_reblogs: Boosts in tijdlijnen groeperen + setting_always_send_emails: Altijd e-mailmeldingen verzenden setting_auto_play_gif: Speel geanimeerde GIF's automatisch af setting_boost_modal: Vraag voor het boosten van een bericht een bevestiging setting_crop_images: Afbeeldingen bijsnijden tot 16x9 in berichten op tijdlijnen @@ -170,6 +180,7 @@ nl: setting_use_pending_items: Langzame modus severity: Zwaarte sign_in_token_attempt: Beveiligingscode + title: Titel type: Importtype username: Gebruikersnaam username_or_email: Gebruikersnaam of e-mailadres @@ -178,6 +189,10 @@ nl: with_dns_records: MX-records en IP-adressen van het domein toevoegen featured_tag: name: Hashtag + filters: + actions: + hide: Volledig verbergen + warn: Met een waarschuwing verbergen interactions: must_be_follower: Meldingen van mensen die jou niet volgen blokkeren must_be_following: Meldingen van mensen die jij niet volgt blokkeren @@ -194,6 +209,7 @@ nl: sign_up_requires_approval: Registraties beperken severity: Regel notification_emails: + appeal: Iemand heeft bezwaar ingediend tegen een beslissing van een moderator digest: Periodiek e-mails met een samenvatting versturen favourite: Wanneer iemand jouw bericht aan diens favorieten heeft toegevoegd follow: Wanneer iemand jou is gaan volgen @@ -201,6 +217,8 @@ nl: mention: Wanneer iemand jou heeft vermeld pending_account: Wanneer een nieuw account moet worden beoordeeld reblog: Wanneer iemand jouw bericht heeft geboost + report: Nieuwe rapportage is ingediend + trending_tag: Nieuwe trend vereist beoordeling rule: text: Regel tag: @@ -208,6 +226,15 @@ nl: name: Hashtag trendable: Toestaan dat deze hashtag onder trends te zien valt usable: Toestaan dat deze hashtag in berichten gebruikt mag worden + user: + role: Rol + user_role: + color: Kleur van badge + name: Naam + permissions_as_keys: Rechten + position: Prioriteit + webhook: + url: Eindpunt URL 'no': Nee required: mark: "*" diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index ad3490867..9ff1e302a 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -68,6 +68,11 @@ pl: with_dns_records: Zostanie wykonana próba rozwiązania rekordów DNS podanej domeny, a wyniki również zostaną dodane na czarną listę featured_tag: name: 'Sugerujemy użycie jednego z następujących:' + filters: + action: Wybierz akcję do wykonania, gdy post pasuje do filtra + actions: + hide: Całkowicie ukryj przefiltrowaną zawartość, jakby nie istniała + warn: Ukryj filtrowaną zawartość za ostrzeżeniem wskazującym tytuł filtra form_challenge: current_password: Wchodzisz w strefę bezpieczną imports: @@ -91,6 +96,8 @@ pl: name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne user: chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu + user_role: + position: Wyższa rola decyduje o rozwiązywaniu konfliktów w pewnych sytuacjach. Niektóre działania mogą być wykonywane tylko na rolach z niższym priorytetem webhook: events: Wybierz zdarzenia do wysłania url: Dokąd będą wysłane zdarzenia @@ -181,6 +188,7 @@ pl: setting_use_pending_items: Tryb spowolniony severity: Priorytet sign_in_token_attempt: Kod zabezpieczający + title: Tytuł type: Importowane dane username: Nazwa użytkownika username_or_email: Nazwa użytkownika lub adres e-mail @@ -189,6 +197,10 @@ pl: with_dns_records: Uwzględnij rekordy MX i adresy IP domeny featured_tag: name: Hasztag + filters: + actions: + hide: Ukryj całkowicie + warn: Ukryj z ostrzeżeniem interactions: must_be_follower: Nie wyświetlaj powiadomień od osób, które Cię nie śledzą must_be_following: Nie wyświetlaj powiadomień od osób, których nie śledzisz @@ -222,6 +234,14 @@ pl: name: Hashtag trendable: Pozwól na wyświetlanie tego hashtagu w „Na czasie” usable: Pozwól na umieszczanie tego hashtagu we wpisach + user: + role: Rola + user_role: + color: Kolor odznaki + highlighted: Wyświetl rolę jako odznakę na profilach użytkowników + name: Nazwa + permissions_as_keys: Uprawnienia + position: Priorytet webhook: events: Włączone zdarzenia url: Endpoint URL diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 4260723c4..a6bb43b90 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -27,6 +27,8 @@ pt-BR: 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 + appeal: + text: Você só pode recorrer uma vez 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 @@ -35,6 +37,7 @@ pt-BR: current_password: Para fins de segurança, por favor, digite a senha da conta atual current_username: Para confirmar, por favor, digite o nome de usuário da conta atual digest: Enviado apenas após um longo período de inatividade com um resumo das menções recebidas durante ausência + discoverable: Permita que a sua conta seja descoberta por estranhos através de recomendações, tendências e outros recursos email: Você receberá um e-mail de confirmação fields: Você pode ter até 4 itens mostrados em forma de tabela no seu perfil header: PNG, GIF or JPG. Arquivos de até %{size}. Serão redimensionados para %{dimensions}px @@ -46,6 +49,7 @@ pt-BR: 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_always_send_emails: Normalmente, as notificações por e-mail não serão enviadas enquanto você estiver usando ativamente o Mastodon setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique setting_display_media_default: Sempre ocultar mídia sensível setting_display_media_hide_all: Sempre ocultar todas as mídias @@ -64,6 +68,11 @@ pt-BR: 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 featured_tag: name: 'Você pode querer usar um destes:' + filters: + action: Escolher qual ação executar quando um post corresponder ao filtro + actions: + hide: Esconder completamente o conteúdo filtrado, comportando-se como se ele não existisse + warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro form_challenge: current_password: Você está entrando em uma área segura imports: @@ -87,6 +96,9 @@ pt-BR: name: Você pode mudar a capitalização das letras, por exemplo, para torná-la mais legível user: chosen_languages: Apenas toots dos idiomas selecionados serão mostrados nas linhas públicas + webhook: + events: Selecione eventos para enviar + url: Aonde os eventos serão enviados labels: account: fields: @@ -148,6 +160,7 @@ pt-BR: phrase: Palavra-chave ou frase setting_advanced_layout: Ativar interface web avançada setting_aggregate_reblogs: Agrupar boosts nas linhas + setting_always_send_emails: Sempre enviar notificações por e-mail setting_auto_play_gif: Reproduzir GIFs automaticamente setting_boost_modal: Solicitar confirmação antes de dar boost setting_crop_images: Cortar imagens no formato 16x9 em toots não expandidos @@ -173,6 +186,7 @@ pt-BR: setting_use_pending_items: Modo lento severity: Gravidade sign_in_token_attempt: Código de segurança + title: Título type: Tipo de importação username: Nome de usuário username_or_email: Nome de usuário ou e-mail @@ -181,6 +195,10 @@ pt-BR: with_dns_records: Incluir registros MX e IPs do domínio featured_tag: name: Hashtag + filters: + actions: + hide: Ocultar completamente + warn: Ocultar com um aviso interactions: must_be_follower: Bloquear notificações de não-seguidores must_be_following: Bloquear notificações de não-seguidos @@ -197,6 +215,7 @@ pt-BR: sign_up_requires_approval: Limitar novas contas severity: Regra notification_emails: + appeal: Alguém recorre de uma decisão moderadora digest: Enviar e-mails de resumo favourite: Enviar e-mail quando alguém favoritar teus toots follow: Enviar e-mail quando alguém te seguir @@ -213,6 +232,9 @@ pt-BR: name: Hashtag trendable: Permitir que esta hashtag fique em alta usable: Permitir que toots usem esta hashtag + webhook: + events: Eventos habilitados + url: URL do Endpoint 'no': Não required: mark: "*" diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 9e1bbf85f..f4ff925f1 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -68,6 +68,11 @@ pt-PT: 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:' + filters: + action: Escolha qual a ação a executar quando uma publicação corresponde ao filtro + actions: + hide: Ocultar completamente o conteúdo filtrado, comportando-se como se não existisse + warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro form_challenge: current_password: Está a entrar numa área restrita imports: @@ -91,6 +96,13 @@ pt-PT: name: Só pode alterar a capitalização das letras, por exemplo, para torná-las mais legíveis user: chosen_languages: Quando seleccionado, só publicações nas línguas escolhidas serão mostradas nas cronologias públicas + role: A função controla que permissões o utilizador tem + user_role: + color: Cor a ser utilizada para a função em toda a interface de utilizador, como RGB no formato hexadecimal + highlighted: Isto torna a função visível publicamente + name: Nome público da função, se a função for definida para ser exibida como um distintivo + permissions_as_keys: Utilizadores com esta função terão acesso a... + position: Função mais alta decidem a resolução de conflitos em certas situações. Certas ações só podem ser executadas em funções com uma menor prioridade webhook: events: Selecione os eventos a enviar url: Para onde os eventos serão enviados @@ -181,6 +193,7 @@ pt-PT: setting_use_pending_items: Modo lento severity: Gravidade sign_in_token_attempt: Código de segurança + title: Título type: Tipo de importação username: Nome de utilizador username_or_email: Nome de utilizador ou e-mail @@ -189,6 +202,10 @@ pt-PT: with_dns_records: Incluir registos MX e IPs do domínio featured_tag: name: Hashtag + filters: + actions: + hide: Ocultar por completo + warn: Ocultar com um aviso interactions: must_be_follower: Bloquear notificações de não-seguidores must_be_following: Bloquear notificações de pessoas que não segues @@ -222,6 +239,14 @@ pt-PT: name: Hashtag trendable: Permitir que esta hashtag apareça em destaque usable: Permitir que toots utilizem esta hashtag + user: + role: Função + user_role: + color: Cor do distintivo + highlighted: Exibir a função como distintivo nos perfis de utilizador + name: Nome + permissions_as_keys: Permissões + position: Prioridade webhook: events: Eventos ativados url: URL do Endpoint diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index c274eb85d..8f0c65dd6 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -68,6 +68,11 @@ ru: with_dns_records: Будет сделана попытка разрешить DNS-записи данного домена и результаты также будут внесены в чёрный список featured_tag: name: 'Возможно, вы захотите добавить что-то из этого:' + filters: + action: Выберите действие, которое нужно выполнить, когда сообщение соответствует фильтру + actions: + hide: Полностью скрыть отфильтрованный контент так, как будто его не существует + warn: Скрыть отфильтрованный контент за предупреждением с указанием названия фильтра form_challenge: current_password: Вы переходите к настройкам безопасности imports: @@ -91,6 +96,11 @@ ru: name: Вы можете изменить только регистр букв чтобы, например, сделать тег более читаемым user: chosen_languages: Если выбрано, то в публичных лентах будут показаны только посты на выбранных языках. + role: Роль определяет, какие разрешения есть у пользователя + user_role: + color: Цвет, который будет использоваться для роли в интерфейсе (UI), как RGB в формате HEX + permissions_as_keys: Пользователи с этой ролью будут иметь доступ... + position: Повышение роли разрешают конфликты интересов в некоторых ситуациях. Некоторые действия могут выполняться только на ролях с более низким приоритетом webhook: events: Выберите события для отправки url: Куда события будут отправляться @@ -181,6 +191,7 @@ ru: setting_use_pending_items: Медленный режим severity: Накладываемые ограничения sign_in_token_attempt: Код безопасности + title: Название type: Тип импорта username: Имя пользователя username_or_email: Имя пользователя или e-mail @@ -189,6 +200,10 @@ ru: with_dns_records: Включить MX-записи и IP-адреса домена featured_tag: name: Добавить хэштег + filters: + actions: + hide: Скрыть полностью + warn: Скрыть с предупреждением interactions: must_be_follower: Присылать уведомления только от подписчиков must_be_following: Присылать уведомления только от людей на которых вы подписаны @@ -222,6 +237,12 @@ ru: name: Хэштег trendable: Разрешить показ хэштега в трендах usable: Разрешить использовать этот хэштег в постах + user: + role: Роль + user_role: + name: Название + permissions_as_keys: Разрешения + position: Приоритет webhook: events: Включенные события url: Endpoint URL diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index 9f2e0ee31..aa51438a9 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -1,38 +1,246 @@ --- si: simple_form: + hints: + account_alias: + acct: ඔබට ගෙන යාමට අවශ්ය ගිණුමේ username@domain සඳහන් කරන්න + account_migration: + acct: ඔබට යාමට අවශ්ය ගිණුමේ username@domain සඳහන් කරන්න + account_warning_preset: + text: ඔබට URL, හෑෂ් ටැග් සහ සඳහන් කිරීම් වැනි පෝස්ට් සින්ටැක්ස් භාවිතා කළ හැක + title: විකල්ප. ලබන්නාට නොපෙනේ + admin_account_action: + include_statuses: මධ්යස්ථ ක්රියාව හෝ අනතුරු ඇඟවීමට හේතු වී ඇත්තේ කුමන පළ කිරීම්දැයි පරිශීලකයා දකිනු ඇත + send_email_notification: පරිශීලකයාට ඔවුන්ගේ ගිණුම සමඟ සිදු වූ දේ පිළිබඳ පැහැදිලි කිරීමක් ලැබෙනු ඇත + text_html: විකල්ප. ඔබට post syntax භාවිතා කළ හැක. කාලය ඉතිරි කර ගැනීම සඳහා ඔබට අනතුරු ඇඟවීමේ</a> <a href="%{path}">කළ හැක + type_html: "<strong>%{acct}</strong>සමඟ කළ යුතු දේ තෝරන්න" + types: + disable: පරිශීලකයාගේ ගිණුම භාවිතා කිරීමෙන් වළක්වන්න, නමුත් ඔවුන්ගේ අන්තර්ගතය මකා දැමීම හෝ සඟවන්න එපා. + none: වෙනත් ක්රියාවක් අවුලුවාලීමකින් තොරව, පරිශීලකයාට අනතුරු ඇඟවීමක් යැවීමට මෙය භාවිතා කරන්න. + sensitive: මෙම පරිශීලකයාගේ සියලුම මාධ්ය ඇමුණුම් සංවේදී ලෙස සලකුණු කිරීමට බල කරන්න. + silence: පරිශීලකයාට පොදු දෘශ්යතාව සමඟ පළ කිරීමට හැකි වීම වළක්වන්න, ඔවුන් අනුගමනය නොකරන පුද්ගලයින්ගෙන් ඔවුන්ගේ පළ කිරීම් සහ දැනුම්දීම් සඟවන්න. + suspend: මෙම ගිණුමෙන් හෝ මෙම ගිණුමට යම් අන්තර්ක්රියා වළක්වා එහි අන්තර්ගතය මකා දමන්න. දින 30 ක් ඇතුළත ආපසු හැරවිය හැකිය. + warning_preset_id: විකල්ප. ඔබට තවමත් පෙරසිටුවීමේ අවසානයට අභිරුචි පෙළ එක් කළ හැක + announcement: + all_day: පරීක්ෂා කළ විට, කාල පරාසයේ දින පමණක් දර්ශනය වනු ඇත + ends_at: විකල්ප. මෙම අවස්ථාවේදී නිවේදනය ස්වයංක්රීයව ප්රකාශනය කිරීමෙන් ඉවත් වනු ඇත + scheduled_at: නිවේදනය වහාම ප්රකාශයට පත් කිරීමට හිස්ව තබන්න + starts_at: විකල්ප. ඔබගේ නිවේදනය නිශ්චිත කාල පරාසයකට බැඳී ඇත්නම් + text: ඔබට post syntax භාවිතා කළ හැක. කරුණාකර පරිශීලකයාගේ තිරය මත නිවේදනය ලබා ගන්නා ඉඩ ගැන සැලකිලිමත් වන්න + appeal: + text: ඔබට වර්ජනයකට අභියාචනා කළ හැක්කේ එක් වරක් පමණි + defaults: + autofollow: ආරාධනාව හරහා ලියාපදිංචි වන පුද්ගලයින් ස්වයංක්රීයව ඔබව අනුගමනය කරනු ඇත + avatar: PNG, GIF හෝ JPG. වැඩිම %{size}. %{dimensions}px දක්වා අඩු කරනු ඇත + bot: ගිණුම ප්රධාන වශයෙන් ස්වයංක්රීය ක්රියා සිදු කරන බවත් නිරීක්ෂණය නොකළ හැකි බවත් අන් අයට සංඥා කරන්න + context: පෙරහන යෙදිය යුතු සන්දර්භ එකක් හෝ කිහිපයක් + current_password: ආරක්ෂක අරමුණු සඳහා කරුණාකර ජංගම ගිණුමේ මුරපදය ඇතුළත් කරන්න + current_username: තහවුරු කිරීමට, කරුණාකර වත්මන් ගිණුමේ පරිශීලක නාමය ඇතුළත් කරන්න + digest: දිගු කාලයක් අක්රියව සිටීමෙන් පසුව පමණක් යවන ලද අතර ඔබ නොමැති විට ඔබට කිසියම් පුද්ගලික පණිවිඩයක් ලැබී ඇත්නම් පමණි + discoverable: නිර්දේශ, ප්රවණතා සහ වෙනත් විශේෂාංග හරහා ඔබේ ගිණුම ආගන්තුකයන්ට සොයා ගැනීමට ඉඩ දෙන්න + email: ඔබට තහවුරු කිරීමේ විද්යුත් තැපෑලක් එවනු ලැබේ + fields: ඔබට ඔබගේ පැතිකඩෙහි වගුවක් ලෙස අයිතම 4ක් දක්වා පෙන්විය හැක + header: PNG, GIF හෝ JPG. වැඩිම %{size}. %{dimensions}px දක්වා අඩු කරනු ඇත + inbox_url: ඔබට භාවිතා කිරීමට අවශ්ය රිලේ හි මුල් පිටුවෙන් URL එක පිටපත් කරන්න + irreversible: පෙරහන පසුව ඉවත් කළද, පෙරූ පළ කිරීම් ආපසු හැරවිය නොහැකි ලෙස අතුරුදහන් වනු ඇත + locale: පරිශීලක අතුරුමුහුණතේ භාෂාව, ඊමේල් සහ තල්ලු දැනුම්දීම් + locked: අනුගමන ඉල්ලීම් අනුමත කිරීමෙන් ඔබව අනුගමනය කළ හැක්කේ කාටදැයි හස්තීයව පාලනය කරන්න + password: අවම වශයෙන් අක්ෂර 8 ක් භාවිතා කරන්න + phrase: පළ කිරීමක පෙළ හෝ අන්තර්ගත අනතුරු ඇඟවීම නොසලකා ගැලපේ + scopes: යෙදුමට ප්රවේශ වීමට ඉඩ දෙන්නේ කුමන API වලටද. ඔබ ඉහළ මට්ටමේ විෂය පථයක් තෝරා ගන්නේ නම්, ඔබට තනි ඒවා තෝරා ගැනීමට අවශ්ය නොවේ. + setting_aggregate_reblogs: මෑතකදී බූස්ට් කරන ලද පළ කිරීම් සඳහා නව බූස්ට් පෙන්වන්න එපා (අලුතින් ලැබුණු බූස්ට් වලට පමණක් බලපායි) + setting_always_send_emails: සාමාන්යයෙන් ඔබ Mastodon සක්රියව භාවිතා කරන විට විද්යුත් තැපැල් දැනුම්දීම් නොයවනු ඇත + 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_use_blurhash: අනුක්රමණ සැඟවුණු දෘශ්යවල වර්ණ මත පදනම් වන නමුත් ඕනෑම විස්තරයක් අපැහැදිලි කරයි + setting_use_pending_items: සංග්රහය ස්වයංක්රීයව අනුචලනය කරනවා වෙනුවට ක්ලික් කිරීමක් පිටුපස කාලරේඛා යාවත්කාලීන සඟවන්න + username: ඔබගේ පරිශීලක නාමය %{domain}හි අද්විතීය වනු ඇත + whole_word: මූල පදය හෝ වාක්ය ඛණ්ඩය අක්ෂරාංක පමණක් වන විට, එය යෙදෙන්නේ එය සම්පූර්ණ වචනයට ගැලපේ නම් පමණි + domain_allow: + domain: මෙම වසමට මෙම සේවාදායකයෙන් දත්ත ලබා ගැනීමට හැකි වන අතර එයින් ලැබෙන දත්ත සකස් කර ගබඩා කරනු ලැබේ + email_domain_block: + domain: මෙය විද්යුත් තැපැල් ලිපිනයේ හෝ එය භාවිතා කරන MX වාර්තාවේ පෙන්වන ඩොමේන් නාමය විය හැක. ලියාපදිංචි වූ පසු ඒවා පරීක්ෂා කරනු ලැබේ. + with_dns_records: ලබා දී ඇති වසමේ DNS වාර්තා විසඳීමට උත්සාහ කරන අතර ප්රතිඵල ද අවහිර කරනු ලැබේ + featured_tag: + name: 'ඔබට මේවායින් එකක් භාවිතා කිරීමට අවශ්ය විය හැකිය:' + filters: + action: පළ කිරීමක් පෙරහනට ගැළපෙන විට සිදු කළ යුතු ක්රියාව තෝරන්න + actions: + hide: පෙරහන් කළ අන්තර්ගතය සම්පූර්ණයෙන්ම සඟවන්න, එය නොපවතින ලෙස හැසිරෙන්න + warn: පෙරහන මාතෘකාව සඳහන් කරන අනතුරු ඇඟවීමක් පිටුපස පෙරූ අන්තර්ගතය සඟවන්න + form_challenge: + current_password: ඔබ ආරක්ෂිත ප්රදේශයකට ඇතුල් වේ + imports: + 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 යතුරක් නම්, එය ඇතුළු කිරීමට වග බලා ගන්න, අවශ්ය නම්, එය තට්ටු කරන්න. + tag: + name: ඔබට අකුරු වල ආවරණය පමණක් වෙනස් කළ හැකිය, උදාහරණයක් ලෙස, එය වඩාත් කියවිය හැකි කිරීමට + user: + chosen_languages: පරීක්ෂා කළ විට, තෝරාගත් භාෂාවලින් පළ කිරීම් පමණක් පොදු කාලරේඛා තුළ සංදර්ශන කෙරේ + webhook: + events: යැවීමට සිදුවීම් තෝරන්න + url: සිදුවීම් යවනු ලබන ස්ථානය labels: + account: + fields: + name: ලේබලය + value: අන්තර්ගතය + account_alias: + acct: පැරණි ගිණුමේ හැසිරවීම + account_migration: + acct: නව ගිණුමේ හැසිරවීම + account_warning_preset: + text: පෙර සැකසූ පෙළ + title: ශීර්ෂය admin_account_action: - type: ක්රියාමාර්ගය + include_statuses: විද්යුත් තැපෑලෙහි වාර්තා කරන ලද පළ කිරීම් ඇතුළත් කරන්න + send_email_notification: විද්යුත් තැපෑලෙන් පරිශීලකයාට දැනුම් දෙන්න + text: අභිරුචි අනතුරු ඇඟවීම + type: ක්රියාව types: - sensitive: සංවේදීතාව - suspend: අත්හිටුවන්න + disable: කැටි කරන්න + none: අනතුරු ඇඟවීමක් යවන්න + sensitive: පවතී + silence: සීමාව + suspend: අවශ්ය + warning_preset_id: අනතුරු ඇඟවීමේ පෙරසිටුවක් භාවිතා කරන්න + announcement: + all_day: දවස පුරා සිදුවීම + ends_at: සිදුවීමේ අවසානය + scheduled_at: උපලේඛන ප්රකාශනය + starts_at: සිදුවීමේ ආරම්භය + text: නිවේදනය + appeal: + text: මෙම තීරණය ආපසු හැරවිය යුත්තේ මන්දැයි පැහැදිලි කරන්න defaults: + autofollow: ඔබගේ ගිණුම අනුගමනය කිරීමට ආරාධනා කරන්න + avatar: අවතාරය bot: මෙය ස්වයං ක්රමලේඛගත ගිණුමකි + chosen_languages: භාෂා පෙරහන් කරන්න confirm_new_password: නව මුර පදය තහවුරු කරන්න - confirm_password: මුරපදය තහවුරු කරන්න + confirm_password: මුරපදය තහවුරු කර ඇත + context: සන්දර්භ පෙරහන් කරන්න + current_password: වත්මන් මුර පදය data: දත්ත + discoverable: අන් අයට ගිණුමක් යෝජනා කරන්න + display_name: ප්රදර්ශන නාමය email: වි-තැපැල් ලිපිනය + expires_in: පසු කල් ඉකුත් වේ + fields: පැතිකඩ පාරදත්ත + header: ශීර්ෂකය + honeypot: "%{label} (පුරවන්න එපා)" + inbox_url: රිලේ එන ලිපි URL + irreversible: සැඟවීම වෙනුවට අතහරින්න + locale: අතුරු මුහුණත භාෂාව + locked: ඉල්ලීම් අනුගමනය කිරීම අවශ්ය වේ + max_uses: උපරිම භාවිත ගණන new_password: නව මුරපදය + note: ජෛව + otp_attempt: ද්වි සාධක කේතය password: මුර පදය + phrase: මූල පදය හෝ වාක්ය ඛණ්ඩය + setting_advanced_layout: උසස් වෙබ් අතුරු මුහුණත සබල කරන්න + setting_aggregate_reblogs: කණ්ඩායම් කාලරේඛාව වැඩි කරයි + setting_always_send_emails: සෑම විටම විද්යුත් තැපැල් දැනුම්දීම් යවන්න + 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: සියල්ල සඟවන්න setting_display_media_show_all: සියල්ල පෙන්වන්න + setting_expand_spoilers: අන්තර්ගත අනතුරු ඇඟවීම් සමඟ සලකුණු කර ඇති පළ කිරීම් සැමවිටම පුළුල් කරන්න setting_hide_network: ඔබගේ ජාලය සඟවන්න - setting_theme: අඩවියේ තේමාව - sign_in_token_attempt: ආරක්ෂණ කේතය + setting_noindex: සෙවුම් යන්ත්ර සුචිගත කිරීමෙන් ඉවත් වීම + setting_reduce_motion: සජීවිකරණවල චලනය අඩු කරන්න + setting_show_application: පළ කිරීම් යැවීමට භාවිතා කරන යෙදුම හෙළි කරන්න + setting_system_font_ui: පද්ධතියේ පෙරනිමි අකුරු භාවිතා කරන්න + setting_theme: අඩවියේ මාතෘකාව + setting_trends: අද ප්රවණතා පෙන්වන්න + setting_unfollow_modal: යමෙකු අනුගමනය නොකිරීමට පෙර තහවුරු කිරීමේ සංවාදය පෙන්වන්න + setting_use_blurhash: සැඟවුණු මාධ්ය සඳහා වර්ණවත් අනුක්රමික පෙන්වන්න + setting_use_pending_items: මන්දගාමී මාදිලිය + severity: බරපතලකම + sign_in_token_attempt: ආරක්ෂණ කේතය + title: ශීර්ෂය + type: ආයාත වර්ගය username: පරිශීලක නාමය username_or_email: පරිශීලක නාමය හෝ වි-තැපෑල whole_word: සමස්ත වචනය + email_domain_block: + with_dns_records: වසමෙහි MX වාර්තා සහ IP ඇතුළත් කරන්න + featured_tag: + name: හෑෂ් ටැගය + filters: + actions: + hide: සම්පූර්ණයෙන්ම සඟවන්න + warn: අනතුරු ඇඟවීමක් සමඟ සඟවන්න + interactions: + must_be_follower: අනුගාමිකයින් නොවන අයගේ දැනුම්දීම් අවහිර කරන්න + must_be_following: ඔබ අනුගමනය නොකරන පුද්ගලයින්ගේ දැනුම්දීම් අවහිර කරන්න + must_be_following_dm: ඔබ අනුගමනය නොකරන පුද්ගලයින්ගෙන් සෘජු පණිවිඩ අවහිර කරන්න invite: comment: අදහස + invite_request: + text: ඔබට එක් වීමට අවශ්ය ඇයි? ip_block: comment: අදහස ip: අ.ජා. කෙ. (IP) severities: - no_access: ප්රවේශය අවහිර කරන්න + no_access: ප්රවේශය අවහිර කරන්න + sign_up_requires_approval: ලියාපදිංචි වීම සීමා කරන්න severity: නීතිය + notification_emails: + appeal: යමෙක් උපපරිපාලක තීරණයකට අභියාචනා කරයි + digest: digest ඊමේල් යවන්න + favourite: කවුරුහරි ඔබේ පළ කිරීම ප්රිය කළා + follow: කවුරුහරි ඔබව අනුගමනය කළා + follow_request: කවුරුහරි ඔබව අනුගමනය කරන ලෙස ඉල්ලා සිටියේය + mention: කවුරුහරි ඔබව සඳහන් කළා + pending_account: නව ගිණුම සමාලෝචනය අවශ්යයි + reblog: කවුරුහරි ඔබේ පළ කිරීම වැඩි කළා + report: නව වාර්තාවක් ඉදිරිපත් කෙරේ + trending_tag: නව ප්රවණතාවයට සමාලෝචනයක් අවශ්ය වේ + rule: + text: නීතිය + tag: + listable: මෙම හැෂ් ටැගය සෙවීම් සහ යෝජනා වල දිස් වීමට ඉඩ දෙන්න + name: හෑෂ් ටැගය + trendable: මෙම හැෂ් ටැගය ප්රවණතා යටතේ දිස් වීමට ඉඩ දෙන්න + usable: මෙම හැෂ් ටැගය භාවිතා කිරීමට පළ කිරීම් වලට ඉඩ දෙන්න + webhook: + events: සබල කළ සිදුවීම් + url: අන්ත ලක්ෂ්ය URL + 'no': නැත recommended: නිර්දේශිත required: mark: "*" - text: අවශ්යයි + text: අවශ්යයි + title: + sessions: + webauthn: පුරනය වීමට ඔබගේ ආරක්ෂක යතුරු වලින් එකක් භාවිතා කරන්න 'yes': ඔව් diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index c1d67af91..02445e8fb 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -68,6 +68,11 @@ sl: with_dns_records: Poskus razrešitve zapisov DNS danih domen bo izveden in rezultati bodo prav tako blokirani featured_tag: name: 'Morda boste želeli uporabiti eno od teh:' + filters: + action: Izberite, kako naj se program vede, ko se objava sklada s filtrom + actions: + hide: Povsem skrij filtrirano vsebino, kot da ne bi obstajala + warn: Skrij filtrirano vsebino za opozorilom, ki pomenja naslov filtra form_challenge: current_password: Vstopate v varovano območje imports: @@ -91,6 +96,13 @@ sl: name: Spremenite lahko le npr. velikost črk (velike/male), da je bolj berljivo user: chosen_languages: Ko je označeno, bodo v javnih časovnicah prikazane samo objave v izbranih jezikih + role: Vloga nadzira, katere pravice ima uporabnik + user_role: + color: Barva, uporabljena za vlogo po celem up. vmesniku, podana v šestnajstiškem zapisu RGB + highlighted: S tem je vloga javno vidna + name: Javno ime vloge, če naj bo vloga prikazana kot priponka + permissions_as_keys: Uporabniki s to vlogo bodo imeli dostop do ... + position: Višja vloga se odloča o razrešitvi sporov v določenih situacijah. Določena dejanja lahko izvede le na vlogah z nižjo prioriteto webhook: events: Izberite dogodke za pošiljanje url: Kam bodo poslani dogodki @@ -181,6 +193,7 @@ sl: setting_use_pending_items: Počasen način severity: Strogost sign_in_token_attempt: Varnostna koda + title: Naslov type: Vrsta uvoza username: Uporabniško ime username_or_email: Uporabniško ime ali E-pošta @@ -189,6 +202,10 @@ sl: with_dns_records: Vključi zapise MX in IP-številke domene featured_tag: name: Ključnik + filters: + actions: + hide: Povsem skrij + warn: Skrij z opozorilom interactions: must_be_follower: Blokiraj obvestila nesledilcev must_be_following: Blokiraj obvestila oseb, ki jim ne sledite @@ -222,6 +239,14 @@ sl: name: Ključnik trendable: Dovoli, da se ta ključnik pojavi med trendi usable: Dovoli, da objave uporabljajo ta ključnik + user: + role: Vloga + user_role: + color: Barva značke + highlighted: Prikaži vlogo kot značko na uporabniškem profilu + name: Ime + permissions_as_keys: Pravice + position: Prioriteta webhook: events: Omogočeni dogodki url: URL končne točke diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index be348575f..ac295283b 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -68,6 +68,11 @@ sq: with_dns_records: Do të bëhet një përpjekje për ftillimin e zërave DNS të përkatësisë së dhënë dhe do të futen në listë bllokimesh edhe përfundimet featured_tag: name: 'Mund të doni të përdorni një nga këto:' + filters: + action: Zgjidhni cili veprim të kryhet, kur një postim ka përputhje me një filtër + actions: + hide: Fshihe plotësisht lëndën e filtruar, duke u sjellë sikur të mos ekzistonte + warn: Fshihe lëndën e filtruar pas një sinjalizimi që përmend titullin e filtrit form_challenge: current_password: Po hyni në një zonë të sigurt imports: @@ -91,6 +96,13 @@ sq: name: Mund të ndryshoni shkronjat vetëm nga të mëdha në të vogla ose anasjelltas, për shembull, për t’i bërë më të lexueshme user: chosen_languages: Në iu vëntë shenjë, te rrjedha kohore publike do të shfaqen vetëm mesazhe në gjuhët e përzgjedhura + role: Roli kontrollon cilat leje ka përdoruesi + user_role: + color: Ngjyrë për t’u përdorur për rolin nëpër UI, si RGB në format gjashtëmbëdhjetësh + highlighted: Kjo e bën rolin të dukshëm publikisht + name: Emër publik për rolin, nëse roli është ujdisur të shfaqet si një stemë + permissions_as_keys: Përdoruest me këtë rol do të mund të… + position: Role më të lartë vendosin zgjidhje përplasje në disa raste. Disa veprime mund të kryhen vetëm mbi role të një shkalle më të ulët webhook: events: Përzgjidhni akte për dërgim url: Ku do të dërgohen aktet @@ -181,6 +193,7 @@ sq: setting_use_pending_items: Mënyra ngadalë severity: Rëndësi sign_in_token_attempt: Kod sigurie + title: Titull type: Lloj importimi username: Emër përdoruesi username_or_email: Emër përdoruesi ose Email @@ -189,6 +202,10 @@ sq: with_dns_records: Përfshi zëra MX dhe IP-ra të përkatësisë featured_tag: name: Hashtag + filters: + actions: + hide: Fshihe plotësisht + warn: Fshihe me një sinjalizim interactions: must_be_follower: Blloko njoftime nga jo-ndjekës must_be_following: Blloko njoftime nga persona që s’i ndiqni @@ -222,6 +239,14 @@ sq: name: Hashtag trendable: Lejoje këtë hashtag të shfaqet në prirje usable: Lejoji mesazhet të përdorin këtë hashtag + user: + role: Rol + user_role: + color: Ngjyrë steme + highlighted: Shfaqe rolin si një stemë në profile përdoruesish + name: Emër + permissions_as_keys: Leje + position: Përparësi webhook: events: Akte të aktivizuar url: URL pikëmbarimi diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index c9d71ae03..bb524337e 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -64,9 +64,15 @@ th: domain_allow: domain: โดเมนนี้จะสามารถดึงข้อมูลจากเซิร์ฟเวอร์นี้และจะประมวลผลและจัดเก็บข้อมูลขาเข้าจากโดเมน email_domain_block: + domain: อาจเป็นชื่อโดเมนที่แสดงในที่อยู่อีเมลหรือทะเบียน MX ที่ใช้อยู่ พวกเขาอาจจะได้รับการตรวจสอบเมื่อมีการสมัคร with_dns_records: จะทำการพยายามแปลงที่อยู่ระเบียน DNS ของโดเมนที่กำหนดและจะปิดกั้นผลลัพธ์เช่นกัน featured_tag: name: 'คุณอาจต้องการใช้หนึ่งในนี้:' + filters: + action: เลือกการดำเนินการเมื่อโพสต์ตรงกับตัวกรอง + actions: + hide: ซ่อนเนื้อหาที่ถูกกรองโดยสิ้นเชิง ทำตัวราวกับว่าไม่มีอยู่จริง + warn: ซ่อนเนื้อหาที่ถูกกรองไว้ด้านหลังคำเตือนที่กล่าวถึงชื่อตัวกรอง form_challenge: current_password: คุณกำลังเข้าสู่พื้นที่ปลอดภัย imports: @@ -75,6 +81,7 @@ th: text: นี่จะช่วยให้เราตรวจทานใบสมัครของคุณ ip_block: comment: ไม่จำเป็น จดจำเหตุผลที่คุณเพิ่มกฎนี้ + expires_in: ที่อยู่ IP เป็นทรัพยากร บางครั้งมีการแบ่งปันและมักเปลี่ยนมือ ด้วยเหตุผลนี้ จึงไม่แนะนำให้บล็อก IP ip: ป้อนที่อยู่ IPv4 หรือ IPv6 คุณสามารถปิดกั้นทั้งช่วงได้โดยใช้ไวยากรณ์ CIDR ระวังอย่าล็อคตัวคุณเองออก! severities: no_access: ปิดกั้นการเข้าถึงทรัพยากรทั้งหมด @@ -84,10 +91,21 @@ th: text: อธิบายกฎหรือข้อกำหนดสำหรับผู้ใช้ในเซิร์ฟเวอร์นี้ พยายามทำให้กฎหรือข้อกำหนดสั้นและเรียบง่าย sessions: otp: 'ป้อนรหัสสองปัจจัยที่สร้างโดยแอปในโทรศัพท์ของคุณหรือใช้หนึ่งในรหัสกู้คืนของคุณ:' + webauthn: หากเป็นคีย์ USB อย่าลืมเสียบไว้ และหากจำเป็น ให้แตะคีย์นั้นไว้นะ tag: name: คุณสามารถเปลี่ยนได้เฉพาะตัวพิมพ์ใหญ่เล็กของตัวอักษรเท่านั้น ตัวอย่างเช่น เพื่อทำให้ตัวอักษรอ่านได้ง่ายขึ้น user: chosen_languages: เมื่อกาเครื่องหมาย จะแสดงเฉพาะโพสต์ในภาษาที่เลือกในเส้นเวลาสาธารณะเท่านั้น + role: ควบคุมบทบาท ว่าผู้ใช้มีสิทธิใดบ้าง + user_role: + color: สีที่จะใช้สำหรับบทบาทตลอดทั้ง UI เป็น RGB ในรูปแบบฐานสิบหก + highlighted: ทำให้บทบาทนี้ปรากฏต่อสู่สาธารณะ + name: ชื่อสาธารณะของบทบาท หากกำหนดบทบาทให้แสดงเป็นตราสัญลักษณ์ + permissions_as_keys: ผู้ใช้ที่มีบทบาทนี้จะมีสิทธิ์เข้าถึง... + position: บทบาทที่สูงขึ้นอาจจะตัดสินใจแก้ไขข้อขัดแย้งในบางสถานการณ์ การดำเนินการบางอย่างสามารถทำได้เฉพาะกับบทบาทที่มีลำดับความสำคัญต่ำกว่า + webhook: + events: เลือกเหตุการณ์ที่จะส่ง + url: กิจกรรมจะถูกส่งไปที่ labels: account: fields: @@ -118,6 +136,8 @@ th: scheduled_at: จัดกำหนดการเผยแพร่ starts_at: การเริ่มต้นเหตุการณ์ text: ประกาศ + appeal: + text: อธิบายว่าเหตุใดจึงควรกลับคำตัดสินนี้ defaults: autofollow: เชิญให้ติดตามบัญชีของคุณ avatar: ภาพประจำตัว @@ -173,6 +193,7 @@ th: setting_use_pending_items: โหมดช้า severity: ความรุนแรง sign_in_token_attempt: รหัสความปลอดภัย + title: ชื่อเรื่อง type: ชนิดการนำเข้า username: ชื่อผู้ใช้ username_or_email: ชื่อผู้ใช้หรืออีเมล @@ -181,6 +202,10 @@ th: with_dns_records: รวมระเบียน MX และ IP ของโดเมน featured_tag: name: แฮชแท็ก + filters: + actions: + hide: ซ่อนอย่างสมบูรณ์ + warn: ซ่อนพร้อมคำเตือน interactions: must_be_follower: ปิดกั้นการแจ้งเตือนจากผู้ที่ไม่ใช่ผู้ติดตาม must_be_following: ปิดกั้นการแจ้งเตือนจากผู้คนที่คุณไม่ได้ติดตาม @@ -214,6 +239,17 @@ th: name: แฮชแท็ก trendable: อนุญาตให้แฮชแท็กนี้ปรากฏภายใต้แนวโน้ม usable: อนุญาตให้โพสต์ใช้แฮชแท็กนี้ + user: + role: บทบาท + user_role: + color: สีของตรา + highlighted: แสดงบทบาทเป็นเครื่องหมายบนโปรไฟล์ผู้ใช้ + name: ชื่อ + permissions_as_keys: สิทธิอนุญาต + position: ระดับความสำคัญ + webhook: + events: เปิดใช้งานอีเว้น + url: URL ปลายทาง 'no': ไม่ required: mark: "*" diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index b0ba21505..919a31e21 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -68,6 +68,11 @@ tr: with_dns_records: Belirli bir alanın DNS kayıtlarını çözmeyi deneyecek ve sonuçlar kara listeye eklenecek featured_tag: name: 'Bunlardan birini kullanmak isteyebilirsiniz:' + filters: + action: Bir gönderi filtreyle eşleştiğinde hangi eylemin yapılacağını seçin + actions: + hide: Filtrelenmiş içeriği tamamen gizle, sanki varolmamış gibi + warn: Filtrelenmiş içeriği, filtrenin başlığından söz eden bir uyarının arkasında gizle form_challenge: current_password: Güvenli bir bölgeye giriyorsunuz imports: @@ -91,6 +96,12 @@ tr: name: Harflerin, örneğin daha okunabilir yapmak için, sadece büyük/küçük harf durumlarını değiştirebilirsiniz user: chosen_languages: İşaretlendiğinde, yalnızca seçilen dillerdeki tootlar genel zaman çizelgelerinde görüntülenir + role: Rol, kullanıcıların sahip olduğu izinleri denetler + user_role: + color: Arayüz boyunca rol için kullanılacak olan renk, hex biçiminde RGB + highlighted: Bu rolü herkese açık hale getirir + name: Rolün, eğer rozet olarak görüntülenmesi ayarlandıysa kullanılacak herkese açık ismi + permissions_as_keys: Bu role sahip kullanıcıların şunlara erişimi var... webhook: events: Gönderilecek etkinlikleri seçin url: Olayların gönderileceği yer @@ -181,6 +192,7 @@ tr: setting_use_pending_items: Yavaş mod severity: Önem derecesi sign_in_token_attempt: Güvenlik kodu + title: Başlık type: İçeri aktarma türü username: Kullanıcı adı username_or_email: Kullanıcı adı ya da e-posta @@ -189,6 +201,10 @@ tr: with_dns_records: Alan adının MX kayıtlarını ve IP'lerini ekleyin featured_tag: name: Etiket + filters: + actions: + hide: Tamamen gizle + warn: Uyarıyla gizle interactions: must_be_follower: Takipçim olmayan kişilerden gelen bildirimleri engelle must_be_following: Takip etmediğim kişilerden gelen bildirimleri engelle @@ -222,6 +238,14 @@ tr: name: Etiket trendable: Bu etiketin gündem altında görünmesine izin ver usable: Tootların bu etiketi kullanmasına izin ver + user: + role: Rol + user_role: + color: Rozet rengi + highlighted: Rolü kullanıcıların profilinde rozet olarak görüntüle + name: Ad + permissions_as_keys: İzinler + position: Öncelik webhook: events: Etkin olaylar url: Uç nokta URL’si diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 4ab3b3833..812e02855 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -68,6 +68,11 @@ uk: with_dns_records: Спроба визначення DNS-записів заданого домену буде здійснена, а результати також будуть занесені до чорного списку featured_tag: name: 'Можливо, ви захочете використовувати один з цих:' + filters: + action: Виберіть дію для виконання коли допис збігається з фільтром + actions: + hide: Повністю сховати фільтрований вміст, ніби його не існує + warn: Сховати відфільтрований вміст за попередженням, у якому вказано заголовок фільтра form_challenge: current_password: Ви входите до безпечної зони imports: @@ -91,6 +96,13 @@ uk: name: Тут ви можете лише змінювати регістр літер, щоб підвищити читабельність user: chosen_languages: У глобальних стрічках будуть відображатися дмухи тільки обраними мовами + role: Роль визначає права користувача + user_role: + color: Колір, який буде використовуватися для ролі у всьому інтерфейсі, як RGB у форматі hex + highlighted: Це робить роль видимою всім + name: Загальнодоступна назва ролі, якщо роль налаштована бути показаною у вигляді відзнаки + permissions_as_keys: Користувачі з цією роллю матимуть доступ до... + position: Вища роль розв'язує конфлікти у певних ситуаціях. Певні дії можуть бути виконані лише щодо ролей з нижчим пріоритетом webhook: events: Оберіть події для надсилання url: Куди надсилатимуться події @@ -181,6 +193,7 @@ uk: setting_use_pending_items: Повільний режим severity: Серйозність sign_in_token_attempt: Код безпеки + title: Заголовок type: Тип імпорту username: Ім'я користувача username_or_email: Ім'я користувача або електронна пошта @@ -189,6 +202,10 @@ uk: with_dns_records: Включити MX записи та IP-адреси домену featured_tag: name: Хештеґ + filters: + actions: + hide: Сховати повністю + warn: Сховати за попередженням interactions: must_be_follower: Блокувати сповіщення від непідписаних людей must_be_following: Блокувати сповіщення від людей, на яких ви не підписані @@ -222,6 +239,14 @@ uk: name: Хештеґ trendable: Дозволити появу цього хештеґа у списку популярних хештеґів usable: Дозволити дмухам використовувати цей хештеґ + user: + role: Роль + user_role: + color: Колір відзнаки + highlighted: Показувати роль у вигляді відзнаки у профілях користувачів + name: Назва + permissions_as_keys: Дозволи + position: Пріоритет webhook: events: Увімкнені події url: URL кінцевої точки diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index 06485b2ec..6e794a45a 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -68,6 +68,11 @@ vi: with_dns_records: Nếu DNS có vấn đề, nó sẽ bị đưa vào danh sách cấm featured_tag: name: 'Những hashtag gợi ý cho bạn:' + filters: + action: Chọn hành động sẽ thực hiện khi một tút khớp với bộ lọc + actions: + hide: Ẩn hoàn toàn nội dung đã lọc, hoạt động như thể nó không tồn tại + warn: Ẩn nội dung đã lọc đằng sau một cảnh báo đề cập đến tiêu đề của bộ lọc form_challenge: current_password: Biểu mẫu này an toàn imports: @@ -91,6 +96,13 @@ vi: 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ỉ hiển thị những tút viết bằng các ngôn ngữ được chọn sau + role: Vai trò kiểm soát những quyền mà người dùng có + user_role: + color: Màu được sử dụng cho vai trò trong toàn bộ giao diện người dùng, dưới dạng RGB ở định dạng hex + highlighted: Vai trò sẽ hiển thị công khai + name: Tên công khai của vai trò, nếu vai trò được đặt để hiển thị dưới dạng huy hiệu + permissions_as_keys: Người dùng có vai trò này sẽ có quyền truy cập vào... + position: Vai trò cao hơn sẽ có quyền quyết định xung đột trong các tình huống. Các vai trò có mức độ ưu tiên thấp hơn chỉ có thể thực hiện một số hành động nhất định webhook: events: Chọn sự kiện để gửi url: Nơi những sự kiện được gửi đến @@ -181,6 +193,7 @@ vi: setting_use_pending_items: Không tự động cập nhật bảng tin severity: Mức độ nghiêm trọng sign_in_token_attempt: Mã an toàn + title: Tựa đề type: Kiểu nhập username: Tên người dùng username_or_email: Tên người dùng hoặc email @@ -189,6 +202,10 @@ vi: with_dns_records: Bao gồm bản ghi MX và địa chỉ IP của máy chủ featured_tag: name: Hashtag + filters: + actions: + hide: Ẩn toàn bộ + warn: Ẩn kèm theo cảnh báo interactions: must_be_follower: Chặn thông báo từ những người không theo dõi bạn must_be_following: Chặn thông báo từ những người bạn không theo dõi @@ -222,6 +239,14 @@ vi: name: Hashtag trendable: Cho phép xuất hiện trong xu hướng usable: Cho phép dùng trong tút + user: + role: Vai trò + user_role: + color: Màu huy hiệu + highlighted: Hiển thị huy hiệu vai trò trên hồ sơ người dùng + name: Tên + permissions_as_keys: Quyền + position: Mức độ ưu tiên webhook: events: Những sự kiện đã bật url: URL endpoint diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 466da4180..eae4be245 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -68,6 +68,11 @@ zh-CN: with_dns_records: Mastodon 会尝试解析所给域名的 DNS 记录,然后把解析结果一并封禁 featured_tag: name: 你可能想要使用以下之一: + filters: + action: 选择在帖子匹配过滤器时要执行的操作 + actions: + hide: 彻底屏蔽过滤内容,犹如它不曾存在过一般 + warn: 在警告中提及过滤器标题后,隐藏过滤内容 form_challenge: current_password: 你正在进入安全区域 imports: @@ -91,6 +96,16 @@ zh-CN: name: 你只能改变字母的大小写,让它更易读 user: chosen_languages: 仅选中语言的嘟文会出现在公共时间轴上(全不选则显示所有语言的嘟文) + role: 角色决定该用户拥有的权限 + user_role: + color: 整个用户界面中,该角色使用的颜色,以RGB 十六进制格式 + highlighted: 这使角色公开可见 + name: 角色的公开名称,如果角色设置为展示的徽章 + permissions_as_keys: 具有此角色的用户将有权访问... + position: 较高的角色决定在某些情况下解决冲突。某些行动只能对优先级较低的角色执行 + webhook: + events: 选择要发送的事件 + url: 事件将发送到哪个地点 labels: account: fields: @@ -178,6 +193,7 @@ zh-CN: setting_use_pending_items: 慢速模式 severity: 级别 sign_in_token_attempt: 安全码 + title: 标题 type: 导入数据类型 username: 用户名 username_or_email: 用户名或电子邮件地址 @@ -186,6 +202,10 @@ zh-CN: with_dns_records: 包括该域名的 MX 记录和 IP 地址 featured_tag: name: 话题标签 + filters: + actions: + hide: 完全隐藏 + warn: 隐藏时显示警告信息 interactions: must_be_follower: 屏蔽来自未关注我的用户的通知 must_be_following: 屏蔽来自我未关注的用户的通知 @@ -219,6 +239,17 @@ zh-CN: name: 话题标签 trendable: 允许在热门下显示此话题 usable: 允许嘟文使用此话题标签 + user: + role: 角色 + user_role: + color: 徽章颜色 + highlighted: 用户配置中以徽章显示角色 + name: 名称 + permissions_as_keys: 权限设置 + position: 优先权 + webhook: + events: 已启用事件 + url: 端点网址 'no': 否 required: mark: "*" diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index f54157e28..b4aef1bd2 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -68,6 +68,11 @@ zh-TW: with_dns_records: Mastodon 會嘗試解析所給域名的 DNS 記錄,解析結果一致者將一併封鎖 featured_tag: name: 您可能想使用其中一個: + filters: + action: 請選擇當嘟文符合該過濾器時將被執行之動作 + actions: + hide: 完全隱藏過濾內容,當作它似乎不曾存在過 + warn: 隱藏過濾內容於過濾器標題之警告後 form_challenge: current_password: 您正要進入安全區域 imports: @@ -91,6 +96,13 @@ zh-TW: name: 您只能變更大小寫,例如,以使其更易讀。 user: chosen_languages: 當核取時,只有選取語言的嘟文會在公開時間軸中顯示 + role: 角色控制使用者有哪些權限 + user_role: + color: 在整個使用者介面中用於角色的顏色,十六進位格式的 RGB + highlighted: 這會讓角色公開可見 + name: 角色的公開名稱,如果角色設定為顯示為徽章 + permissions_as_keys: 有此角色的使用者將有權存取…… + position: 在某些情況下,衝突的解決方式由更高階的角色決定。某些動作只能由優先程度較低的角色執行 webhook: events: 請選擇要傳送的事件 url: 事件會被傳送至何處 @@ -181,6 +193,7 @@ zh-TW: setting_use_pending_items: 限速模式 severity: 優先級 sign_in_token_attempt: 安全代碼 + title: 標題 type: 匯入類型 username: 使用者名稱 username_or_email: 使用者名稱或電子信箱地址 @@ -189,6 +202,10 @@ zh-TW: with_dns_records: 包括網域的 MX 記錄和 IP 位址 featured_tag: name: "「#」標籤" + filters: + actions: + hide: 完全隱藏 + warn: 隱藏於警告之後 interactions: must_be_follower: 封鎖非跟隨者的通知 must_be_following: 封鎖您未跟隨之使用者的通知 @@ -222,6 +239,14 @@ zh-TW: name: 主題標籤 trendable: 允許此主題標籤在趨勢下顯示 usable: 允許嘟文使用此主題標籤 + user: + role: 角色 + user_role: + color: 識別顏色 + highlighted: 在使用者個人資料上將角色顯示為徽章 + name: 名稱 + permissions_as_keys: 權限 + position: 優先權 webhook: events: 已啟用的事件 url: 端點 URL diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 1f64c78c7..5fefb4e09 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -87,9 +87,7 @@ sk: posts_tab_heading: Príspevky posts_with_replies: Príspevky s odpoveďami roles: - admin: Správca group: Skupina - moderator: Moderátor unavailable: Profil nieje dostupný unfollow: Prestaň sledovať admin: @@ -107,7 +105,6 @@ sk: avatar: Maskot by_domain: Doména change_email: - changed_msg: Email pre tento účet bol úspešne zmenený! current_email: Súčasný email label: Zmeň email new_email: Nový email @@ -174,12 +171,6 @@ sk: reset: Resetuj reset_password: Obnov heslo resubscribe: Znovu odoberaj - role: Oprávnenia - roles: - admin: Správca - moderator: Moderátor - staff: Člen - user: Užívateľ 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 @@ -374,8 +365,11 @@ sk: back_to_warning: Upozornenie by_domain: Doména content_policies: + comment: Interná poznámka policies: + reject_media: Zamietni médiá suspend: Vylúč + reason: Verejné odôvodnenie delivery: all: Všetko unavailable: Nedostupné @@ -473,6 +467,9 @@ sk: unassign: Odober unresolved: Nevyriešené updated_at: Aktualizované + rules: + empty: Žiadne pravidlá servera ešte neboli určené. + title: Serverové pravidlá settings: activity_api_enabled: desc_html: Sčítanie miestne uverejnených príspevkov, aktívnych užívateľov, a nových registrácii, v týždenných intervaloch @@ -518,9 +515,6 @@ sk: deletion: desc_html: Dovoľ každému, aby si mohli vymazať svok účet title: Sprístupni možnosť vymazať si účet - min_invite_role: - disabled: Nikto - title: Povoľ pozvánky od registrations_mode: modes: approved: Pre registráciu je nutné povolenie @@ -530,9 +524,6 @@ sk: show_known_fediverse_at_about_page: desc_html: Ak je zapnuté, bude v ukážke osi možné nahliadnúť príspevky z celého známeho fediversa. Inak budú ukázané iba príspevky z miestnej osi. title: Ukáž celé známe fediverse na náhľade osi - show_staff_badge: - desc_html: Ukáž moderátorsky odznak na užívateľovom profile - title: Ukáž značku moderátora site_description: desc_html: Oboznamujúci paragraf na hlavnej stránke a pri meta tagoch. Opíš, čo robí tento Mastodon server špecifickým, a ďalej hocičo iné, čo považuješ za dôležité. Môžeš použiť HTML kód, hlavne <code><a></code> a <code><em></code>. title: Popis servera @@ -774,7 +765,6 @@ sk: title: Uprav triedenie errors: invalid_context: Nebola poskytnutá žiadna, alebo ide o neplatnú súvislosť - invalid_irreversible: Nezvratné filtrovanie funguje iba so súvislostiami domovskej osi a oboznámení index: delete: Vymaž empty: Nemáš žiadné filtrovanie. diff --git a/config/locales/sl.yml b/config/locales/sl.yml index ff3492d60..e4c510308 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -91,10 +91,8 @@ sl: posts_tab_heading: Objave posts_with_replies: Objave in odgovori roles: - admin: Skrbnik bot: Robot group: Skupina - moderator: Mod unavailable: Profil ni na voljo unfollow: Prenehaj slediti admin: @@ -113,12 +111,17 @@ sl: avatar: Podoba by_domain: Domena change_email: - changed_msg: E-pošta računa je uspešno spremenjena! + changed_msg: E-pošni naslov uspešno spremenjen! current_email: Trenutna e-pošta label: Spremeni e-pošto new_email: Nova e-pošta submit: Spremeni e-pošto title: Spremeni e-pošto za %{username} + change_role: + changed_msg: Vloga uspešno spremenjena! + label: Spremeni vlogo + no_role: Ni vloge + title: Spremeni vlogo za %{username} confirm: Potrdi confirmed: Potrjeno confirming: Potrjujem @@ -162,6 +165,7 @@ sl: active: Dejaven all: Vse pending: Na čakanju + silenced: Omejeno suspended: Suspendiran title: Moderiranje moderation_notes: Opombe moderiranja @@ -169,6 +173,7 @@ sl: most_recent_ip: Zadnji IP no_account_selected: Noben račun ni bil spremenjen, ker ni bil izbran noben no_limits_imposed: Brez omejitev + no_role_assigned: Dodeljena ni nobena vloga not_subscribed: Ni naročen pending: Čakanje na pregled perform_full_suspension: Suspendiraj @@ -197,12 +202,7 @@ sl: reset: Ponastavi reset_password: Ponastavi geslo resubscribe: Ponovno se naroči - role: Dovoljenja - roles: - admin: Skrbnik - moderator: Moderator - staff: Osebje - user: Uporabnik + role: Vloga search: Iskanje search_same_email_domain: Drugi uporabniki z isto domeno e-pošte search_same_ip: Drugi uporabniki z istim IP @@ -677,6 +677,71 @@ sl: unresolved: Nerešeni updated_at: Posodobljeni view_profile: Pokaži profil + roles: + add_new: Dodaj vlogo + assigned_users: + few: "%{count} uporabniki" + one: "%{count} uporabnik" + other: "%{count} uporabnikov" + two: "%{count} uporabnika" + categories: + administration: Upravljanje + devops: Razvojniki + invites: Povabila + moderation: Moderiranje + special: Posebno + delete: Izbriši + description_html: Z <strong>uporabniškimi vlogami</strong> lahko prilagodite, do katerih funkcij in področij Mastodona lahko dostopajo vaši uporabniki. + edit: Uredi vlogo %{name} + everyone: Privzete pravice + everyone_full_description_html: To je <strong>osnovna vloga</strong>, ki vpliva na <strong>vse uporabnike</strong>, celo na tiste brez dodeljene vloge. Vse druge vloge dedujejo njene pravice. + permissions_count: + few: "%{count} pravice" + one: "%{count} pravica" + other: "%{count} pravic" + two: "%{count} pravici" + privileges: + administrator: Skrbnik + administrator_description: Uporabniki s temi pravicami bodo zaobšli vse pravice + delete_user_data: Izbriši uporabniške podatke + delete_user_data_description: Omogoča uporabnikom, da izbrišejo podatke drugih uporabnikov brez časvnega zamika + invite_users: Povabi uporabnike + invite_users_description: Omogoča uporabnikom, da povabi nove osebe na strežnik + manage_announcements: Upravljaj obvestila + manage_announcements_description: Omogoča uporabnikom, da upravljajo obvestila na strežniku + manage_appeals: Upravljaj pritožbe + manage_appeals_description: Omogoča uporabnikom, da pregledajo pritožbe glede dejanj moderiranja + manage_blocks: Upravljaj blokirano + manage_blocks_description: Omogoča uporabnikom, da blokirajo ponudnike e-pošte in naslove IP + manage_custom_emojis: Upravljaj emodžije po meri + manage_custom_emojis_description: Omogoča uporabnikom, da upravljajo emodžije po meri na strežniku + manage_federation: Upravljaj beli seznam + manage_federation_description: Omogoča uporabnikom blokirati ali dovoljevati vstop na beli seznam z druimi domenami ter nadzirati dostavljivost + manage_invites: Upravljaj vabila + manage_invites_description: Omogoča uporabnikom, da brskajo in deaktivirajo povezave povabil + manage_reports: Upravljaj poročila + manage_reports_description: Omogoča uporabnikom, da pregledajo poročila in glede le-teh opravijo dejanja moderiranja + manage_roles: Upravljaj vloge + manage_roles_description: Omogoča uporabnikom upravljati in dodeljevati vloge pod svojo + manage_rules: Upravljaj pravila + manage_rules_description: Omogoča uporabnikom, da spremenijo pravila strežnika + manage_settings: Upravljaj nastavitve + manage_settings_description: Omogoča uporabnikom, da spremenijo nastavitve spletišča + manage_taxonomies: Upravljaj taksonomije + manage_taxonomies_description: Omogoča uporabnikom, da preverijo vsebino v trendu in posodobijo nastavitve ključnikov + manage_user_access: Upravljaj dostop uporabnikov + manage_user_access_description: Omogoča uporabnikom, da onemogočijo drugim uporabnikom dvofazno overjanje, spremenijo njihov e-naslov ter ponastavijo njihovo geslo + manage_users: Upravljaj uporabnike + manage_users_description: Omogoča uporabnikom, da vidijo podrobnosti drugih uporabnikov in nad njimi izvedejo dejanja moderiranja + manage_webhooks: Upravljaj spletne zanke + manage_webhooks_description: Omogoča uporabnikom, da vzpostavijo nove spletne zanke za skrbniške dogodke + view_audit_log: Pokaži revizijski zapisnik + view_audit_log_description: Omogoča, da uporabnik vidi zgodovino skrbniških opravil na strežniku + view_dashboard: Pokaži nadzorno ploščo + view_dashboard_description: Omogoča uporabnikom, da dostopajo do nadzorne plošče in različnih meritev + view_devops: Razvojniki + view_devops_description: Omogoča uporabnikom, da dostopajo do nadzornih plošč Sidekiq in phHero + title: Vloge rules: add_new: Dodaj pravilo delete: Izbriši @@ -729,9 +794,6 @@ sl: deletion: desc_html: Dovoli vsakomur, da izbriše svoj račun title: Odpri brisanje računa - min_invite_role: - disabled: Nihče - title: Dovoli vabila od require_invite_text: desc_html: Če registracije zahtevajo ročno potrditev, nastavite vnos besedila pod »Zakaj se želite pridružiti?« za obveznega title: Zahteva, da novi uprorabniki navedejo razlog, zakaj se želijo registrirati @@ -744,9 +806,6 @@ sl: show_known_fediverse_at_about_page: desc_html: Ko preklopite, bo prikazal objave vseh znanih fediverzumov v predogledu. V nasprotnem primeru bodo prikazane samo krajevne objave. title: Pokaži znane fediverse-e v predogledu časovnice - show_staff_badge: - desc_html: Prikaži značko osebja na uporabniški strani - title: Prikaži značko osebja site_description: desc_html: Uvodni odstavek na API-ju. Opišite, zakaj je ta Mastodon strežnik poseben in karkoli pomembnega. Lahko uporabite HTML oznake, zlasti <code><a></code> in <code><em></code>. title: Opis strežnika @@ -896,6 +955,11 @@ sl: empty: Zaenkrat še nimate prilagojenih končnih točk spletnih zank. enable: Omogoči enabled: Dejaven + enabled_events: + few: "%{count} omogočeni dogodki" + one: "%{count} omogočen dogodek" + other: "%{count} omogočenih dogodkov" + two: "%{count} omogočena dogodka" events: Dogodki new: Nova spletna zanka rotate_secret: Zasukaj skrivnost @@ -1155,15 +1219,26 @@ sl: public: Javne časovnice thread: Pogovori edit: + add_keyword: Dodaj ključno besedo + keywords: Ključne besede title: Uredite filter errors: + deprecated_api_multiple_keywords: Teh parametrov ni mogoče spremeniti iz tega programa, ker veljajo za več kot eno ključno besedo filtra. Uporabite novejšo izdaj programa ali spletni vmesnik. invalid_context: Ne vsebuje nobenega ali vsebuje neveljaven kontekst - invalid_irreversible: Nepovratno filtriranje deluje le v kontekstu doma ali obvestil index: + contexts: Filtri v %{contexts} delete: Izbriši empty: Nimate filtrov. + expires_in: Poteče čez %{distance} + expires_on: Poteče %{date} + keywords: + few: "%{count} ključne besede" + one: "%{count} ključna beseda" + other: "%{count} ključnih besed" + two: "%{count} ključni besedi" title: Filtri new: + save: Shrani nov filter title: Dodaj nov filter footer: developers: Razvijalci @@ -1286,6 +1361,8 @@ sl: copy_account_note_text: 'Ta uporabnik se je preselil iz %{acct}, tukaj so vaše poprejšnje opombe o njem:' notification_mailer: admin: + report: + subject: "%{name} je oddal/a prijavo" sign_up: subject: "%{name} se je vpisal/a" digest: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 0e4d9871e..8a91cc6f4 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -83,10 +83,8 @@ sq: posts_tab_heading: Mesazhe posts_with_replies: Mesazhe dhe përgjigje roles: - admin: Përgjegjës bot: Robot group: Grup - moderator: Moderator unavailable: Profil jashtë funksionimi unfollow: Resht së ndjekuri admin: @@ -105,12 +103,17 @@ sq: avatar: Avatar by_domain: Përkatësi change_email: - changed_msg: Email-i i llogarisë u ndryshua me sukses! + changed_msg: Email-i u ndryshua me sukses! current_email: Email-i i tanishëm label: Ndrysho email-in new_email: Email i ri submit: Ndrysho email-in title: Ndrysho email-in për %{username} + change_role: + changed_msg: Roli u ndryshua me sukses! + label: Ndryshoni rol + no_role: Pa rol + title: Ndryshoni rolin për %{username} confirm: Ripohojeni confirmed: U ripohua confirming: Po ripohohet @@ -154,6 +157,7 @@ sq: active: Aktiv all: Krejt pending: Pezull + silenced: I kufizuar suspended: Të pezulluara title: Moderim moderation_notes: Shënime moderimesh @@ -161,6 +165,7 @@ sq: most_recent_ip: IP-ja më e freskët no_account_selected: S’u ndryshua ndonjë llogari, ngaqë s’u përzgjodh ndonjë no_limits_imposed: Pa imponim kufijsh + no_role_assigned: Pa rol të caktuar not_subscribed: Jo i pajtuar pending: Në pritje të shqyrtimit perform_full_suspension: Pezulloje @@ -187,12 +192,7 @@ sq: reset: Riktheje te parazgjedhjet reset_password: Ricaktoni fjalëkalimin resubscribe: Ripajtohuni - role: Leje - roles: - admin: Përgjegjës - moderator: Moderator - staff: Staf - user: Përdorues + role: Rol 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 @@ -648,6 +648,65 @@ sq: unresolved: Të pazgjidhur updated_at: U përditësua më view_profile: Shihni profilin + roles: + add_new: Shtoni rol + assigned_users: + one: "%{count} përdorues" + other: "%{count} përdorues" + categories: + administration: Administrim + invites: Ftesa + moderation: Moderim + special: Special + delete: Fshije + description_html: Me <strong>role përdoruesi</strong>, mund të përshtatni cilat funksione dhe fusha të Mastodon-it mund të përdorin përdoruesit tuaj. + edit: Përpunoni rolin e '%{name}' + everyone: Leje parazgjedhje + everyone_full_description_html: Ky është <strong>roli bazë</strong> që prek <strong>krejt përdoruesit</strong>, madje edhe ata pa një rol të caktuar. Krejt rolet e tjerë trashëgojnë lejet prej tij. + permissions_count: + one: "%{count} leje" + other: "%{count} leje" + privileges: + administrator: Përgjegjës + administrator_description: Përdoruesit me këtë leje do të anashkalojnë çdo leje + delete_user_data: Të Fshijë të Dhëna Përdoruesi + delete_user_data_description: U lejon përdoruesve të fshijnë pa humbur kohë të dhëna përdoruesish të tjerë + invite_users: Të Ftojë Përdorues + invite_users_description: U lejon përdruesve të ftojë te shërbyesi persona të rinj + manage_announcements: Të Administrojë Njoftime + manage_announcements_description: U lejon përdoruesve të administrojë njoftime te shërbyesi + manage_appeals: Të Administrojë Apelime + manage_appeals_description: U lejon përdoruesve të shqyrtojnë apelime kundër veprimesh moderimi + manage_blocks: Të Administrojë Bllokim + manage_blocks_description: U lejon përdoruesve të bllokojnë shërbime email dhe adresa IP + manage_custom_emojis: Të Administrojë Emoxhi Vetjake + manage_custom_emojis_description: U lejon përdoruesve të administrojnë te shërbyesi emoxhi vetjake + manage_federation: Të Administrjë Federim + manage_federation_description: U lejon përdoruesve të bllokojnë ose lejojnë federim me përkatësi të tjera dhe të kontrollojnë shpërndarjen + manage_invites: Të Administrojë Ftesa + manage_invites_description: U lejon përdoruesve të shfletojnë dhe çaktivizojnë lidhje ftesash + manage_reports: Të Administrojë Raportime + manage_reports_description: U lejon përdruesve të shqyrtojnë raportime dhe kryejnë veprime moderimi ndaj tyre + manage_roles: Të Administrojë Role + manage_roles_description: U lejon përdoruesve të administrojnë dhe caktojnë role nën të tyret + manage_rules: Të Administrojë Rregulla + manage_rules_description: U lejon përdoruesve të ndryshojnë rregulla shërbyesi + manage_settings: Të Administrojë Rregullime + manage_settings_description: U lejon përdoruesve të ndryshojnë rregullime sajti + manage_taxonomies: Të Administrojë Klasifikime + manage_taxonomies_description: U lejon përdoruesve të shqyrtojnë lëndë në modë dhe të përditësojnë rregullime hashtag-ësh + manage_user_access: Të Administrojë Hyrje Përdoruesi + manage_user_access_description: U lejon përdoruesve të çaktivizojnë mirëfilltësim dyfaktorësh për përdorues të tjerë, të ndryshojnë adresa të tyret email dhe të ricaktojnë fjalëkalimet e tyre + manage_users: Të Administrojë Përdorues + manage_users_description: U lejon përdoruesve të shohin hollësi përdoruesish të tjerë dhe të kryejnë veprime moderimi mbi ta + manage_webhooks: Të Administrojë Webhook-e + manage_webhooks_description: U lejon përdoruesve të ujdisin webhook-e për veprime administrative + view_audit_log: Shihni Regjistër Auditimesh + view_audit_log_description: U lejon përdoruesve të shohin një historik veprimesh administrative te shërbyesi + view_dashboard: Shihni Pultin + view_dashboard_description: U lejon përdoruesve të hyjnë te pulti dhe shohin shifra të ndryshme matjesh + view_devops_description: U lejon përdoruesve të hyjnë në pultet Sidekiq dhe pgHero + title: Role rules: add_new: Shtoni rregull delete: Fshije @@ -700,9 +759,6 @@ sq: deletion: desc_html: Lejo këdo të fshijë llogarinë e vet title: Hapni fshirje llogarie - min_invite_role: - disabled: Asnjë - title: Lejo ftesa nga require_invite_text: desc_html: Kur regjistrimet lypin miratim dorazi, tekstin e kërkesës për ftesë “Pse doni të merrni pjesë?” bëje të detyrueshëm, në vend se opsional title: Kërkoju përdoruesve të rinj të plotësojnë doemos një tekst kërkese për ftesë @@ -715,9 +771,6 @@ sq: 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 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 - title: Shfaq stemë stafi site_description: desc_html: Paragraf hyrës te faqja ballore. Përshkruani ç’e bën special këtë shërbyes Mastodon dhe çfarëdo gjëje tjetër të rëndësishme. Mund të përdorni etiketa HTML, veçanërisht <code><a></code> dhe <code><em></code>. title: Përshkrim shërbyesi @@ -867,6 +920,7 @@ sq: secret: E fshehtë nënshkrimesh status: Gjendje title: Webhook-ë + webhook: Webhook admin_mailer: new_appeal: actions: @@ -1116,15 +1170,24 @@ sq: public: Rrjedha kohore publike thread: Biseda edit: + add_keyword: Shtoni fjalëkyç + keywords: Fjalëkyçe title: Përpunoni filtër errors: + deprecated_api_multiple_keywords: Këta parametra s’mund të ndryshohen nga ky aplikacion, ngaqë aplikohen mbi më shumë se një fjalëkyç filtri. Përdorni një aplikacion më të ri, ose ndërfaqen web. invalid_context: Ose s’u dha fare, ose u dha kontekst i pavlefshëm - invalid_irreversible: Filtrim i pakthyeshëm funksionon vetëm me kontekste <em>home</em> ose njoftimesh index: + contexts: Filtra në %{contexts} delete: Fshije empty: S’keni filtra. + expires_in: Skadon për %{distance} + expires_on: Skadon më %{date} + keywords: + one: "%{count} fjalëkyç" + other: "%{count} fjalëkyçe" title: Filtra new: + save: Ruani filtër të ri title: Shtoni filtër të ri footer: developers: Zhvillues @@ -1243,6 +1306,8 @@ sq: copy_account_note_text: 'Ky përdorues ka ikur prej %{acct}, ja ku janë shënimet tuaja të mëparshme mbi të:' notification_mailer: admin: + report: + subject: "%{name} parashtroi një raportim" sign_up: subject: "%{name} u regjistrua" digest: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index cfea20c55..a94893b9e 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -19,9 +19,6 @@ sr-Latn: people_followed_by: Ljudi koje %{name} prati people_who_follow: Ljudi koji prate %{name} posts_with_replies: Tutovi i odgovori - roles: - admin: Administrator - moderator: Moderator unfollow: Otprati admin: account_moderation_notes: @@ -76,10 +73,6 @@ sr-Latn: reset: Resetuj reset_password: Resetuj lozinku resubscribe: Ponovo se pretplati - role: Ovlašćenja - roles: - staff: Osoblje - user: Korisnik search: Pretraga shared_inbox_url: Adresa deljenog sandučeta show: @@ -180,12 +173,6 @@ sr-Latn: deletion: desc_html: Dozvoli svima da mogu da obrišu svoj nalog title: Otvori brisanje naloga - min_invite_role: - disabled: Niko - title: Samo preko pozivnice - show_staff_badge: - desc_html: Prikaži bedž osoblja na korisničkoj strani - title: Prikaži bedž osoblja site_description: desc_html: Uvodni pasus na naslovnoj strani i u meta HTML tagovima. Možete koristiti HTML tagove, konkretno <code><a></code> i <code><em></code>. title: Opis instance diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 445f8f326..2042fc440 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -52,9 +52,7 @@ sr: posts_tab_heading: Трубе posts_with_replies: Трубе и одговори roles: - admin: Администратор bot: Бот - moderator: Модератор unavailable: Налог је недоступан unfollow: Отпрати admin: @@ -70,7 +68,6 @@ sr: avatar: Аватар by_domain: Домен change_email: - changed_msg: Е-пошта налога успешно промењена! current_email: Тренутна е-пошта label: Промените е-пошту new_email: Нова e-пошта @@ -130,12 +127,6 @@ sr: reset: Ресетуј reset_password: Ресетуј лозинку resubscribe: Поново се претплати - role: Овлашћења - roles: - admin: Администратор - moderator: Модератор - staff: Особље - user: Корисник search: Претрага shared_inbox_url: Адреса дељеног сандучета show: @@ -312,15 +303,9 @@ sr: deletion: desc_html: Дозволи свима да могу да обришу свој налог title: Отвори брисање налога - min_invite_role: - disabled: Нико - title: Само преко позивнице show_known_fediverse_at_about_page: desc_html: Када се упали, показаће трубе из свих знаних федиверса на преглед. У супротном ће само показати локалне трубе. title: Покажи познате здружене инстанце у прегледнику временске линије - show_staff_badge: - desc_html: Прикажи беџ особља на корисничкој страни - title: Прикажи беџ особља site_description: desc_html: Уводни пасус на насловној страни и у meta HTML таговима. Можете користити HTML тагове, конкретно <code><a></code> и <code><em></code>. title: Опис инстанце @@ -459,7 +444,6 @@ sr: title: Измени филтер errors: invalid_context: Ниједан или неважећи контекст испоручен - invalid_irreversible: Неповратно филтрирање функционише само са почетном или контекстом обавештења index: delete: Избриши title: Филтери diff --git a/config/locales/sv.yml b/config/locales/sv.yml index a84ae6cfe..1e238b196 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -80,10 +80,8 @@ sv: posts_tab_heading: Tutor posts_with_replies: Toots med svar roles: - admin: Administratör bot: Robot group: Grupp - moderator: Moderator unavailable: Profilen är inte tillgänglig unfollow: Sluta följa admin: @@ -101,7 +99,6 @@ sv: avatar: Profilbild by_domain: Domän change_email: - changed_msg: E-postadressen har ändrats! current_email: Nuvarande E-postadress label: Byt E-postadress new_email: Ny E-postadress @@ -177,12 +174,6 @@ sv: reset: Återställ reset_password: Återställ lösenord resubscribe: Starta en ny prenumeration - role: Behörigheter - roles: - admin: Administratör - moderator: Moderator - staff: Personal - user: Användare 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 @@ -565,9 +556,6 @@ sv: deletion: desc_html: Tillåt vem som helst att radera sitt konto title: Öppen kontoradering - min_invite_role: - disabled: Ingen - title: Tillåt inbjudningar av 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 @@ -580,9 +568,6 @@ sv: 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 - show_staff_badge: - desc_html: Visa en personalbricka på en användarsida - title: Visa personalbricka site_description: desc_html: Inledande stycke på framsidan och i metataggar. Du kan använda HTML-taggar, i synnerhet <code><a></code> och <code><em></code>. title: Instansbeskrivning diff --git a/config/locales/ta.yml b/config/locales/ta.yml index 3016250cc..d2b753cf3 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -62,10 +62,8 @@ ta: posts_tab_heading: பிளிறல்கள் posts_with_replies: பிளிறல்கள் மற்றும் மறுமொழிகள் roles: - admin: நிர்வாகி bot: பொறி group: குழு - moderator: மட்டுறுத்துநர் unavailable: சுயவிவரம் கிடைக்கவில்லை unfollow: பின்தொடராதே admin: @@ -83,7 +81,6 @@ ta: avatar: அவதாரம் by_domain: தளம் change_email: - changed_msg: உறிமை மின் அஞ்சல் வெற்றிகரமாக மாற்ற்ப்பட்டது! current_email: தற்கால மின் அஞ்சல் label: மின் அஞ்சலை மற்றுக new_email: புதிய மின் அஞ்சல் @@ -139,12 +136,6 @@ ta: already_confirmed: இப்பயனர் ஏற்கனவே உறுதி படுத்திவிட்டார் reset: மீட்டமைக்கவும் reset_password: கடவுச்சொல்லை மீளமைத்திடுக - role: அனுமதி - roles: - admin: நிர்வாகி - moderator: நடுவர் - staff: பணியாளர் - user: பயனர் search: தேடு search_same_email_domain: இம்மின்னஞ்சல் களத்தில் உள்ள மற்ற பயனர்கள் shared_inbox_url: குழு மின்னஞ்சல் முகவரி diff --git a/config/locales/te.yml b/config/locales/te.yml index 7f6aa0f09..fe39bb752 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -48,9 +48,7 @@ te: posts_tab_heading: టూట్లు posts_with_replies: టూట్లు మరియు ప్రత్యుత్తరాలు roles: - admin: నిర్వాహకులు bot: బోట్ - moderator: నియంత్రికుడు unfollow: అనుసరించవద్దు admin: account_actions: @@ -65,7 +63,6 @@ te: avatar: అవతారం by_domain: డొమైను change_email: - changed_msg: ఖాతా యొక్క ఈమెయిల్ విజయవంతంగా మార్చబడింది! current_email: ప్రస్తుత ఈమెయిల్ label: ఈమెయిల్ ను మార్చు new_email: కొత్త ఈమెయిల్ diff --git a/config/locales/th.yml b/config/locales/th.yml index c5f70753d..e2f1db855 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -22,6 +22,9 @@ th: federation_hint_html: ด้วยบัญชีที่ %{instance} คุณจะสามารถติดตามผู้คนในเซิร์ฟเวอร์ Mastodon และอื่น ๆ get_apps: ลองแอปมือถือ hosted_on: Mastodon ที่โฮสต์ที่ %{domain} + instance_actor_flash: 'บัญชีนี้เป็นนักแสดงเสมือนที่ใช้เพื่อเป็นตัวแทนของเซิร์ฟเวอร์เอง ไม่ใช่ผู้ใช้รายบุคคล แต่มันก็ถูกใช้เพื่อวัตถุประสงค์ในการรวมกลุ่มและไม่ควรถูกบล็อก เว้นแต่คุณต้องการบล็อกทั้งอินสแตนซ์นั้น ซึ่งในกรณีนี้คุณควรใช้บล็อกโดเมนนะ + + ' learn_more: เรียนรู้เพิ่มเติม logged_in_as_html: คุณกำลังเข้าสู่ระบบเป็น %{username} ในปัจจุบัน logout_before_registering: คุณได้เข้าสู่ระบบอยู่แล้ว @@ -34,6 +37,7 @@ th: status_count_after: other: โพสต์ status_count_before: ผู้เผยแพร่ + tagline: เครือข่ายสังคมแบบกระจายศูนย์ terms: เงื่อนไขการให้บริการ unavailable_content: เซิร์ฟเวอร์ที่มีการควบคุม unavailable_content_description: @@ -45,6 +49,7 @@ th: silenced_title: เซิร์ฟเวอร์ที่จำกัดอยู่ suspended: 'จะไม่ประมวลผล จัดเก็บ หรือแลกเปลี่ยนข้อมูลจากเซิร์ฟเวอร์เหล่านี้ ทำให้การโต้ตอบหรือการสื่อสารใด ๆ กับผู้ใช้จากเซิร์ฟเวอร์เหล่านี้เป็นไปไม่ได้:' suspended_title: เซิร์ฟเวอร์ที่ระงับอยู่ + unavailable_content_html: โดยทั่วไปแล้ว Mastodon อนุญาตให้คุณดูเนื้อหาและโต้ตอบกับผู้ใช้งานจากเซิร์ฟเวอร์อื่นใน fediverse เหล่านี้เป็นข้อยกเว้นที่เกิดขึ้นบนเซิร์ฟเวอร์นี้โดยเฉพาะ user_count_after: other: ผู้ใช้ user_count_before: บ้านของ @@ -57,6 +62,7 @@ th: followers: other: ผู้ติดตาม following: กำลังติดตาม + instance_actor_flash: บัญชีนี้เป็นนักแสดงเสมือนที่ใช้เพื่อเป็นตัวแทนของเซิร์ฟเวอร์เอง แต่ก็ไม่ใช่ผู้ใช้รายบุคคล แต่มันถูกใช้เพื่อวัตถุประสงค์ของการรวมกลุ่มและไม่ควรถูกระงับ joined: เข้าร่วมเมื่อ %{date} last_active: ใช้งานล่าสุด link_verified_on: ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ %{date} @@ -73,10 +79,8 @@ th: posts_tab_heading: โพสต์ posts_with_replies: โพสต์และการตอบกลับ roles: - admin: ผู้ดูแล bot: บอต group: กลุ่ม - moderator: ผู้ควบคุม unavailable: โปรไฟล์ไม่พร้อมใช้งาน unfollow: เลิกติดตาม admin: @@ -95,12 +99,17 @@ th: avatar: ภาพประจำตัว by_domain: โดเมน change_email: - changed_msg: เปลี่ยนอีเมลบัญชีสำเร็จ! + changed_msg: เปลี่ยนอีเมลสำเร็จ! current_email: อีเมลปัจจุบัน label: เปลี่ยนอีเมล new_email: อีเมลใหม่ submit: เปลี่ยนอีเมล title: เปลี่ยนอีเมลสำหรับ %{username} + change_role: + changed_msg: เปลี่ยนบทบาทสำเร็จ! + label: เปลี่ยนบทบาท + no_role: ไม่มีบทบาท + title: เปลี่ยนบทบาทสำหรับ %{username} confirm: ยืนยัน confirmed: ยืนยันแล้ว confirming: กำลังยืนยัน @@ -144,6 +153,7 @@ th: active: ใช้งานอยู่ all: ทั้งหมด pending: รอดำเนินการ + silenced: จำกัดอยู่ suspended: ระงับอยู่ title: การควบคุม moderation_notes: หมายเหตุการควบคุม @@ -151,6 +161,7 @@ th: most_recent_ip: IP ล่าสุด no_account_selected: ไม่มีการเปลี่ยนแปลงบัญชีเนื่องจากไม่มีการเลือก no_limits_imposed: ไม่มีการกำหนดขีดจำกัด + no_role_assigned: ไม่มีการกำหนดบทบาท not_subscribed: ไม่ได้บอกรับ pending: การตรวจทานที่รอดำเนินการ perform_full_suspension: ระงับ @@ -176,12 +187,7 @@ th: reset: รีเซ็ต reset_password: ตั้งรหัสผ่านใหม่ resubscribe: บอกรับใหม่ - role: สิทธิอนุญาต - roles: - admin: ผู้ดูแล - moderator: ผู้ควบคุม - staff: พนักงาน - user: ผู้ใช้ + role: บทบาท search: ค้นหา search_same_email_domain: ผู้ใช้อื่น ๆ ที่มีโดเมนอีเมลเดียวกัน search_same_ip: ผู้ใช้อื่น ๆ ที่มี IP เดียวกัน @@ -201,6 +207,8 @@ th: subscribe: บอกรับ suspend: ระงับ suspended: ระงับอยู่ + suspension_irreversible: ข้อมูลของบัญชีนี้ถูกลบไม่สามารถย้อนกลับได้ คุณสามารถระงับบัญชีเพื่อให้ใช้งานได้ แต่จะไม่กู้คืนข้อมูลใดๆทั้งสิ้น ที่เคยมีอยู่ก่อนหน้านี้ + suspension_reversible_hint_html: บัญชีถูกระงับ และข้อมูลจะถูกลบออกอย่างสมบูรณ์ในวันที่ %{date} ก่อนหน้านั้น บัญชีสามารถกู้คืนได้โดยไม่มีผลร้ายใดๆทั้งสิ้น ถ้าหากคุณต้องการลบข้อมูลของบัญชีทั้งหมดในทันที คุณสามารถทำได้ด้านล่างนี้ title: บัญชี unblock_email: เลิกปิดกั้นที่อยู่อีเมล unblocked_email_msg: เลิกปิดกั้นที่อยู่อีเมลของ %{username} สำเร็จ @@ -291,6 +299,7 @@ th: destroy_instance_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}" @@ -410,6 +419,8 @@ th: destroyed_msg: เลิกทำการปิดกั้นโดเมนแล้ว domain: โดเมน edit: แก้ไขการปิดกั้นโดเมน + existing_domain_block: คุณได้กำหนดขีดจำกัดที่เข้มงวดขึ้นแล้วบน %{name} + existing_domain_block_html: คุณได้กำหนดขีดจำกัดที่เข้มงวดขึ้นใน %{name} แล้วคุณต้อง <a href="%{unblock_url}">unblock</a> ก่อน new: create: สร้างการปิดกั้น hint: การปิดกั้นโดเมนจะไม่ป้องกันการสร้างรายการบัญชีในฐานข้อมูล แต่จะใช้วิธีการควบคุมที่เฉพาะเจาะจงกับบัญชีเหล่านั้นย้อนหลังและโดยอัตโนมัติ @@ -420,8 +431,11 @@ th: suspend: ระงับ title: การปิดกั้นโดเมนใหม่ obfuscate: ทำให้ชื่อโดเมนคลุมเครือ + obfuscate_hint: อาจมีผลทำให้ชื่อโดเมนสับสนบางส่วนในรายการหากเปิดใช้งานการโฆษณารายการข้อจำกัดของโดเมน private_comment: ความคิดเห็นส่วนตัว + private_comment_hint: แสดงความคิดเห็นเกี่ยวกับข้อจำกัดของโดเมนนี้สำหรับการใช้งานภายในโดยผู้ดูแล public_comment: ความคิดเห็นสาธารณะ + public_comment_hint: แสดงความคิดเห็นเกี่ยวกับข้อจำกัดโดเมนนี้สำหรับบุคคลทั่วไป หากต้องการโฆษณารายการข้อจำกัดโดเมนเปิดใช้งานอยู่ reject_media: ปฏิเสธไฟล์สื่อ reject_media_hint: เอาไฟล์สื่อที่จัดเก็บไว้ในเซิร์ฟเวอร์ออกและปฏิเสธที่จะดาวน์โหลดไฟล์ใด ๆ ในอนาคต ไม่เกี่ยวข้องกับการระงับ reject_reports: ปฏิเสธรายงาน @@ -595,6 +609,23 @@ th: unresolved: ยังไม่ได้แก้ปัญหา updated_at: อัปเดตเมื่อ view_profile: ดูโปรไฟล์ + roles: + add_new: เพิ่มบทบาท + assigned_users: + other: "%{count} ผู้ใช้" + categories: + administration: การดูแล + invites: คำเชิญ + moderation: การควบคุม + special: พิเศษ + delete: ลบ + edit: แก้ไขบทบาท '%{name}' + everyone: สิทธิอนุญาตเริ่มต้น + permissions_count: + other: "%{count} สิทธิอนุญาต" + privileges: + manage_roles: จัดการบทบาท + title: บทบาท rules: add_new: เพิ่มกฎ delete: ลบ @@ -646,9 +677,6 @@ th: deletion: desc_html: อนุญาตให้ใครก็ตามลบบัญชีของเขา title: เปิดการลบบัญชี - min_invite_role: - disabled: ไม่มีใคร - title: อนุญาตคำเชิญโดย require_invite_text: title: ต้องให้ผู้ใช้ใหม่ป้อนเหตุผลที่จะเข้าร่วม registrations_mode: @@ -660,9 +688,6 @@ th: show_known_fediverse_at_about_page: desc_html: เมื่อปิดใช้งาน จำกัดเส้นเวลาสาธารณะที่เชื่อมโยงจากหน้าเริ่มต้นให้แสดงเฉพาะเนื้อหาในเซิร์ฟเวอร์เท่านั้น title: รวมเนื้อหาที่ติดต่อกับภายนอกไว้ในหน้าเส้นเวลาสาธารณะที่ไม่ได้รับรองความถูกต้อง - show_staff_badge: - desc_html: แสดงป้ายพนักงานในหน้าผู้ใช้ - title: แสดงป้ายพนักงาน site_description: desc_html: ย่อหน้าเกริ่นนำใน API อธิบายถึงสิ่งที่ทำให้เซิร์ฟเวอร์ Mastodon นี้พิเศษและสิ่งอื่นใดที่สำคัญ คุณสามารถใช้แท็ก HTML โดยเฉพาะอย่างยิ่ง <code><a></code> และ <code><em></code> title: คำอธิบายเซิร์ฟเวอร์ @@ -782,6 +807,16 @@ th: edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า empty: คุณยังไม่ได้กำหนดคำเตือนที่ตั้งไว้ล่วงหน้าใด ๆ title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า + webhooks: + add_new: เพิ่มปลายทาง + delete: ลบ + disable: ปิดใช้งาน + disabled: ปิดใช้งานอยู่ + edit: แก้ไขปลายทาง + enable: เปิดใช้งาน + enabled: ใช้งานอยู่ + events: เหตุการณ์ + status: สถานะ admin_mailer: new_appeal: actions: @@ -1021,12 +1056,20 @@ th: public: เส้นเวลาสาธารณะ thread: การสนทนา edit: + add_keyword: เพิ่มคำสำคัญ + keywords: คำสำคัญ title: แก้ไขตัวกรอง index: + contexts: กรองใน %{contexts} delete: ลบ empty: คุณไม่มีตัวกรอง + expires_in: หมดอายุใน %{distance} + expires_on: หมดอายุเมื่อ %{date} + keywords: + other: "%{count} คำสำคัญ" title: ตัวกรอง new: + save: บันทึกตัวกรองใหม่ title: เพิ่มตัวกรองใหม่ footer: developers: นักพัฒนา @@ -1131,6 +1174,8 @@ th: copy_account_note_text: 'ผู้ใช้นี้ได้ย้ายจาก %{acct} นี่คือหมายเหตุก่อนหน้านี้ของคุณเกี่ยวกับผู้ใช้:' notification_mailer: admin: + report: + subject: "%{name} ได้ส่งรายงาน" sign_up: subject: "%{name} ได้ลงทะเบียน" digest: @@ -1248,6 +1293,10 @@ th: reports: errors: invalid_rules: ไม่ได้อ้างอิงกฎที่ถูกต้อง + rss: + content_warning: 'คำเตือนเนื้อหา:' + descriptions: + account: โพสต์สาธารณะจาก @%{acct} scheduled_statuses: too_soon: วันที่ตามกำหนดการต้องอยู่ในอนาคต sessions: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 9159acba3..bc2b730f8 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -83,10 +83,8 @@ tr: posts_tab_heading: Tootlar posts_with_replies: Tootlar ve yanıtlar roles: - admin: Yönetici bot: Bot group: Grup - moderator: Denetleyici unavailable: Profil kullanılamıyor unfollow: Takibi bırak admin: @@ -105,12 +103,17 @@ tr: avatar: Profil resmi by_domain: Alan adı change_email: - changed_msg: Hesap e-postası başarıyla değiştirildi! + changed_msg: E-posta başarıyla değiştirildi! current_email: Mevcut e-posta label: E-postayı değiştir new_email: Yeni e-posta submit: E-postayı değiştir title: "%{username} için e-postayı değiştir" + change_role: + changed_msg: Rol başarıyla değiştirildi! + label: Rolü değiştir + no_role: Rol yok + title: "%{username} için rolü değiştir" confirm: Onayla confirmed: Onaylandı confirming: Onaylanıyor @@ -154,6 +157,7 @@ tr: active: Etkin all: Hepsi pending: Bekliyor + silenced: Sınırlı suspended: Uzaklaştırılanlar title: Denetim moderation_notes: Denetleme notları @@ -161,6 +165,7 @@ tr: most_recent_ip: Son IP no_account_selected: Hiçbiri seçilmediğinden hiçbir hesap değiştirilmedi no_limits_imposed: Sınır koymaz + no_role_assigned: Rol atanmamış not_subscribed: Abone edilmedi pending: Bekleyen yorum perform_full_suspension: Askıya al @@ -187,12 +192,7 @@ tr: reset: Sıfırla reset_password: Parolayı sıfırla resubscribe: Yeniden abone ol - role: İzinler - roles: - admin: Yönetici - moderator: Denetleyici - staff: Personel - user: Kullanıcı + role: Rol 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 @@ -649,6 +649,67 @@ tr: unresolved: Giderilmedi updated_at: Güncellendi view_profile: Profili görüntüle + roles: + add_new: Rol ekle + assigned_users: + one: "%{count} kullanıcı" + other: "%{count} kullanıcı" + categories: + administration: Yönetim + devops: Devops + invites: Davetler + moderation: Denetim + special: Özel + delete: Sil + description_html: "<strong>Kullanıcı rolleri</strong> ile, kullanıcılarınızın Mastodon'un hangi işlevlerine ve alanlarına erişebileceğini düzenleyebilirsiniz." + edit: "'%{name}' rolünü düzenle" + everyone: Varsayılan izinler + everyone_full_description_html: Bu, herhangi bir rol atanmamış olanlar da olmak üzere <strong>tüm kullanıcıları</strong> etkileyen <strong>temel rol</strong>dür. Diğer tüm roller izinleri bu rolden alıyorlar. + permissions_count: + one: "%{count} izin" + other: "%{count} izin" + privileges: + administrator: Yönetici + administrator_description: Bu izne sahip kullanıcılar tüm diğer izinleri atlıyorlar + delete_user_data: Kullanıcı Verilerini Silme + delete_user_data_description: Kullanıcıların, diğer kullanıcıların verisini gecikme olmaksızın silmesine izin verir + invite_users: Kullanıcıları Davet Etme + invite_users_description: Kullanıcıların yeni kişileri sunucuya davet etmesine izin verir + manage_announcements: Duyuruları Yönetme + manage_announcements_description: Kullanıcıların sunucudaki duyuruları yönetmesine izin verir + manage_appeals: İtirazları Yönetme + manage_appeals_description: Kullanıcıların denetleme eylemlerine itirazları gözden geçirmesine izin verir + manage_blocks: Engelleri Yönetme + manage_blocks_description: Kullanıcıların e-posta sağlayıcıları ve IP adreslerini engellemesine izin verir + manage_custom_emojis: Özel İfadeleri Yönetme + manage_custom_emojis_description: Kullanıcıların sunucudaki özel ifadeleri yönetmesine izin verir + manage_federation: Birleştirme Yönetme + manage_federation_description: Kullanıcıların diğer alan adlarıyla birleştirmeye izin vermesi veya engellemesine ve teslim edilebilirliği denetlemesine izin verir + manage_invites: Davetleri Yönetme + manage_invites_description: Kullanıcıların davet bağlantılarını görüntüleme ve etkisizleştirmesine izin verir + manage_reports: Raporları Yönetme + manage_reports_description: Kullanıcıların bildirimleri incelemesine ve onlara yönelik denetim eylemleri gerçekleştirmesine izin verir + manage_roles: Rolleri Yönetme + manage_roles_description: Kullanıcıların kendi rollerinden düşük rolleri atamasına izin verir + manage_rules: Kuralları Yönetme + manage_rules_description: Kullanıcıların sunucu kurallarını değiştirmesine izin ver + manage_settings: Ayarları Yönetme + manage_settings_description: Kullanıcıların site ayarlarını değiştirmesine izin verir + manage_taxonomies: Kategorileri Yönetme + manage_taxonomies_description: Kullanıcıların öne çıkan içeriği incelemesine ve etiket ayarlarını güncellemesine izin verir + manage_user_access: Kullanıcı Erişimini Yönetme + manage_user_access_description: Kullanıcıların, diğer kullanıcıların işi aşamalı yetkilendirme, e-posta adreslerini değiştirme ve parolalarını sıfırlama eylemlerini etkisizleştirmesine izin verir + manage_users: Kullanıcıları Yönetme + manage_users_description: Kullanıcıların, diğer kullanıcıların ayrıntılarını görüntülemesine ve onlara karşı denetim eylemleri gerçekleştirmesine izin verir + manage_webhooks: Webhookları Yönetme + manage_webhooks_description: Kullanıcıların yönetsel olaylar için webhook kurmasına izin verir + view_audit_log: Denetim Kaydını Görüntüleme + view_audit_log_description: Kullanıcıların sunucudaki yönetsel eylemlerin bir tarihçesini görüntülemesine izin verir + view_dashboard: Ana Paneli Görüntüleme + view_dashboard_description: Kullanıcıların ana panele ve çeşitli ölçütlere erişmesine izin verir + view_devops: Devops + view_devops_description: Kullanıcıların Sidekiq ve pgHero panellerine erişmesine izin verir + title: Roller rules: add_new: Kural ekle delete: Sil @@ -701,9 +762,6 @@ tr: deletion: desc_html: Herkese hesabını silme izni ver title: Hesap silmeyi aç - 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 @@ -716,9 +774,6 @@ tr: show_known_fediverse_at_about_page: desc_html: Değiştirildiğinde, bilinen bütün fediverse'lerden gönderileri ön izlemede gösterir. Diğer türlü sadece yerel gönderileri gösterecektir. title: Zaman çizelgesi ön izlemesinde bilinen fediverse'i göster - show_staff_badge: - desc_html: Kullanıcının sayfasında bir personel rozeti göster - title: Personel rozeti göster site_description: desc_html: Ana sayfada paragraf olarak görüntülenecek bilgidir.<br>Özellikle <code><a></code> ve <code><em></code> olmak suretiyle HTML etiketlerini kullanabilirsiniz. title: Site açıklaması @@ -862,6 +917,9 @@ tr: empty: Henüz yapılandırılmış bir web kancanız yok. enable: Etkinleştir enabled: Etkin + enabled_events: + one: 1 aktif etkinlik + other: "%{count} aktif etkinlik" events: Olaylar new: Yeni web kancası rotate_secret: Gizi döndür @@ -1121,15 +1179,24 @@ tr: public: Genel zaman çizelgesi thread: Sohbetler edit: + add_keyword: Anahtar sözcük ekle + keywords: Anahtar Sözcükler title: Filtreyi düzenle errors: + deprecated_api_multiple_keywords: Bu parametreler, birden fazla filtre anahtar sözcüğü için geçerli olduğundan dolayı bu uygulama içerisinden değiştirilemezler. Daha yeni bir uygulama veya web arayüzünü kullanın. invalid_context: Sıfır ya da geçersiz içerik sağlandı - invalid_irreversible: Geri dönüşümsüz filtreleme sadece anasayfa ya da bildirim bağlamında çalışır index: + contexts: "%{contexts} içindeki filtreler" delete: Sil empty: Hiç filtreniz yok. + expires_in: "%{distance} sürede sona eriyor" + expires_on: "%{date} tarihinde sona eriyor" + keywords: + one: "%{count} anahtar sözcük" + other: "%{count} anahtar sözcük" title: Filtreler new: + save: Yeni filtre kaydet title: Yeni filtre ekle footer: developers: Geliştiriciler @@ -1248,6 +1315,8 @@ tr: copy_account_note_text: 'Bu kullanıcı %{acct} adresinden taşındı, işte onlarla ilgili önceki notlarınız:' notification_mailer: admin: + report: + subject: "%{name} bir bildirim gönderdi" sign_up: subject: "%{name} kaydoldu" digest: diff --git a/config/locales/tt.yml b/config/locales/tt.yml index e23533828..a520e4d2b 100644 --- a/config/locales/tt.yml +++ b/config/locales/tt.yml @@ -14,7 +14,6 @@ tt: following: Язылгансыз media: Медиа roles: - admin: Админ bot: Бот group: Törkem unfollow: Язылынмау @@ -41,10 +40,6 @@ tt: all: Бөтенесе perform_full_suspension: Искә алмау reset: Ташлату - role: Рөхсәтләр - roles: - moderator: Модератор - user: Кулланучы search: Эзләү sensitive: Sizmäle username: Кулланучы исеме diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 53a4b3567..708ce998e 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -89,10 +89,8 @@ uk: posts_tab_heading: Дмухи posts_with_replies: Дмухи та відповіді roles: - admin: Адміністратор bot: Бот group: Група - moderator: Мод unavailable: Профіль недоступний unfollow: Відписатися admin: @@ -111,12 +109,17 @@ uk: avatar: Аватар by_domain: Домен change_email: - changed_msg: Адресу електронної пошти облікового запису успішно змінено! + changed_msg: Адресу електронної пошти успішно змінено! current_email: Поточна адреса електронної пошти label: Змінити адресу електронної пошти new_email: Нова адреса електронної пошти submit: Змінити адресу електронної пошти title: Змінити адресу електронної пошти для %{username} + change_role: + changed_msg: Роль успішно змінено! + label: Змінити роль + no_role: Немає ролі + title: Змінити роль для %{username} confirm: Зберегти confirmed: Збережено confirming: Зберігається @@ -160,6 +163,7 @@ uk: active: Активний all: Усі pending: Очікують + silenced: Обмежені suspended: Призупинені title: Модерація moderation_notes: Нотатки модераторів @@ -167,6 +171,7 @@ uk: most_recent_ip: Останній IP no_account_selected: Жоден обліковий запис не було змінено, оскільки жоден не було вибрано no_limits_imposed: Жодних обмежень не накладено + no_role_assigned: Роль не призначено not_subscribed: Не підписані pending: Відгук в очікуванні perform_full_suspension: Призупинити @@ -195,12 +200,7 @@ uk: reset: Скинути reset_password: Скинути пароль resubscribe: Перепідписатися - role: Дозволи - roles: - admin: Адміністратор - moderator: Модератор - staff: Персонал - user: Користувач + role: Роль search: Пошук search_same_email_domain: Інші користувачі з тим самим поштовим доменом search_same_ip: Інші користувачі з тим самим IP @@ -646,6 +646,7 @@ uk: placeholder: Опишіть, які дії були виконані, або інші зміни, що стосуються справи... title: Примітки notes_description_html: Переглядайте та залишайте примітки для інших модераторів та для себе на майбутнє + quick_actions_description_html: 'Виберіть швидку дію або гортайте вниз, щоб побачити матеріал, на який надійшла скарга:' remote_user_placeholder: віддалений користувач із %{instance} reopen: Перевідкрити скаргу report: 'Скарга #%{id}' @@ -663,6 +664,71 @@ uk: unresolved: Невирішені updated_at: Оновлені view_profile: Переглянути профіль + roles: + add_new: Додати роль + assigned_users: + few: "%{count} користувачі" + many: "%{count} користувачів" + one: "%{count} користувач" + other: "%{count} користувача" + categories: + administration: Адміністрування + devops: DevOps + invites: Запрошення + moderation: Модерація + special: Спеціальні + delete: Видалити + description_html: За допомогою <strong>ролі користувача</strong>, ви можете налаштувати, до яких функцій і місць можуть доступатися ваші користувачі Mastodon. + edit: Змінити роль «%{name}» + everyone: Типові дозволи + everyone_full_description_html: Це <strong>базова роль</strong>, яка впливає на <strong>всіх користувачів</strong>, навіть ті, яким не призначені ролі. Усі інші ролі успадковують її дозволи. + permissions_count: + few: "%{count} дозволи" + many: "%{count} дозволів" + one: "%{count} дозвіл" + other: "%{count} дозволи" + privileges: + administrator: Адміністратор + administrator_description: Користувачі з цим дозволом обходять усі дозволи + delete_user_data: Видаляти дані користувача + delete_user_data_description: Дозволяє користувачам видаляти дані інших користувачів без затримок + invite_users: Запрошувати користувачів + invite_users_description: Дозволяє користувачам запрошувати нових людей на сервер + manage_announcements: Керувати оголошеннями + manage_announcements_description: Дозволяє користувачам керувати оголошеннями на сервері + manage_appeals: Керувати оскарженнями + manage_appeals_description: Дозволяє користувачам розглядати оскарження дій модерації + manage_blocks: Керувати блокуваннями + manage_blocks_description: Дозволяє користувачам блокувати постачальників е-пошти та IP-адреси + manage_custom_emojis: Керувати користувацькими емоджі + manage_custom_emojis_description: Дозволяє користувачам керувати користувацькими емоджі на сервері + manage_federation: Керувати федерацією + manage_federation_description: Дозволяє користувачам блокувати або дозволяти федерацію з іншими доменами й керувати можливостями доставлення + manage_invites: Керувати запрошеннями + manage_invites_description: Дозволяє користувачам переглядати й деактивувати запрошувальні посилання + manage_reports: Керувати скаргами + manage_reports_description: Дозволяє користувачам переглядати скарги та виконувати відповідні дії модерації + manage_roles: Керувати ролями + manage_roles_description: Дозволяє користувачам керувати та призначати ролі, нижчі за свій рівень + manage_rules: Керувати правилами + manage_rules_description: Дозволяє користувачам змінювати правила сервера + manage_settings: Керування налаштуваннями + manage_settings_description: Дозволяє користувачам змінювати налаштування сайту + manage_taxonomies: Керувати таксономіями + manage_taxonomies_description: Дозволяє користувачам переглядати актуальні налаштування вмісту й оновити хештеґ + manage_user_access: Керувати доступом користувачів + manage_user_access_description: Дозволяє користувачам вимкнути двоетапну перевірку інших користувачів, змінити їхню адресу електронної пошти та відновити пароль + manage_users: Керувати користувачами + manage_users_description: Дозволяє користувачам переглядати подробиці інших користувачів і виконувати їхню модерацію + manage_webhooks: Керувати Webhooks + manage_webhooks_description: Дозволяє користувачам налаштовувати вебхуки для адміністративних подій + view_audit_log: Переглядати журнал перевірки + view_audit_log_description: Дозволяє користувачам бачити історію адміністративних дій на сервері + view_dashboard: Переглядати панель керування + view_dashboard_description: Дозволяє користувачам доступ до панелі керування та різних метрик + view_devops: DevOps + view_devops_description: Дозволяє користувачам доступ до Sidekiq і панелі pgHero + title: Ролі rules: add_new: Додати правило delete: Видалити @@ -715,9 +781,6 @@ uk: deletion: desc_html: Дозволити будь-кому видаляти свій обліковий запис title: Видалення відкритого облікового запису - min_invite_role: - disabled: Ніхто - title: Дозволити запрошення від require_invite_text: desc_html: Якщо реєстрація вимагає власноручного затвердження, зробіть текстове поле «Чому ви хочете приєднатися?» обов'язковим, а не додатковим title: Вимагати повідомлення причини приєднання від нових користувачів @@ -730,9 +793,6 @@ uk: show_known_fediverse_at_about_page: desc_html: Коли увімкнено, будуть показані пости з усього відомого федисвіту у передпоказі. Інакше будуть показані лише локальні дмухи. title: Показувати доступний федисвіт у передпоказі стрічки - show_staff_badge: - desc_html: Відмічати персонал на сторінці користувачів - title: Показувати персонал site_description: desc_html: Відображається у якості параграфа на титульній сторінці та використовується у якості мета-тега.<br>Можна використовувати HTML-теги, особливо <code><a></code> і <code><em></code>. title: Опис сервера @@ -863,7 +923,7 @@ uk: delete: Видалити edit_preset: Редагувати шаблон попередження empty: Ви ще не визначили жодних попереджень. - title: Управління шаблонами попереджень + title: Керування шаблонами попереджень webhooks: add_new: Додати кінцеву точку delete: Видалити @@ -896,6 +956,7 @@ uk: sensitive: щоб позначати їхній обліковий запис делікатним silence: щоб обмежити їхній обліковий запис suspend: щоб призупинити їхній обліковий запис + body: "%{target} оскаржує модерацію %{action_taken_by} від %{date}, яка була %{type}. Вони написали:" next_steps: Ви можете схвалити апеляцію, щоб скасувати рішення про модерацію або проігнорувати її. subject: "%{username} апелює до рішення про модерацію на %{instance}" new_pending_account: @@ -991,6 +1052,7 @@ uk: functional: Ваш обліковий запис повністю робочий. pending: Ваша заява очікує на розгляд нашим персоналом. Це може зайняти деякий час. Ви отримаєте електронний лист, якщо ваша заява буде схвалена. redirecting_to: Ваш обліковий запис наразі неактивний, тому що він перенаправлений до %{acct}. + view_strikes: Переглянути попередні попередження вашому обліковому запису too_fast: Форму подано занадто швидко, спробуйте ще раз. trouble_logging_in: Проблема під час входу? use_security_key: Використовувати ключ безпеки @@ -1058,6 +1120,7 @@ uk: strikes: action_taken: Дію виконано appeal: Апеляція + appeal_approved: Це попередження було успішно оскаржене і більше не дійсне appeal_rejected: Апеляцію було відхилено appeal_submitted_at: Апеляцію надіслано appealed_msg: Вашу апеляцію було надіслано. Якщо її погодять, вам буде повідомлено про це. @@ -1130,15 +1193,26 @@ uk: public: Глобальні стрічки thread: Повідомлення edit: + add_keyword: Додати ключове слово + keywords: Ключові слова title: Редагувати фільтр errors: + deprecated_api_multiple_keywords: Ці параметри не можна змінити з цього застосунку, тому що вони застосовуються до більш ніж одного ключового слова. Використовуйте новішу версію застосунку або вебінтерфейс. invalid_context: Контекст неправильний або не був наданий - invalid_irreversible: Незворотне фільтрування працює тільки в контексті свого фіду або сповіщень index: + contexts: Фільтри в %{contexts} delete: Видалити empty: У вас немає фільтрів. + expires_in: Закінчується %{distance} + expires_on: Закінчується %{date} + keywords: + few: "%{count} ключові слова" + many: "%{count} ключових слів" + one: "%{count} ключове слово" + other: "%{count} ключових слів" title: Фільтри new: + save: Зберегти новий фільтр title: Додати фільтр footer: developers: Розробникам @@ -1261,6 +1335,8 @@ uk: copy_account_note_text: 'Цей користувач був переміщений з %{acct}, ось ваші попередні нотатки:' notification_mailer: admin: + report: + subject: "%{name} подає скаргу" sign_up: subject: "%{name} приєднується" digest: @@ -1392,6 +1468,9 @@ uk: invalid_rules: не посилається на чинні правила rss: content_warning: 'Попередження про матеріали:' + descriptions: + account: Загальнодоступні дописи від @%{acct} + tag: 'Загальнодоступні дописи позначені #%{hashtag}' scheduled_statuses: over_daily_limit: Ви перевищили ліміт в %{limit} запланованих дмухів на сьогодні over_total_limit: Ви перевищили ліміт в %{limit} запланованих дмухів @@ -1562,6 +1641,9 @@ uk: pinned: Закріплений пост reblogged: передмухнув(-ла) sensitive_content: Дражливий зміст + strikes: + errors: + too_late: Запізно оскаржувати це попередження tags: does_not_match_previous_name: не збігається з попереднім ім'ям terms: @@ -1593,9 +1675,11 @@ uk: user_mailer: appeal_approved: action: Перейти у ваш обліковий запис + explanation: Оскарження попередження вашому обліковому запису %{strike_date}, яке ви надіслали %{appeal_date} було схвалено. Ваш обліковий запис знову вважається добропорядним. subject: Вашу апеляцію від %{date} було схвалено title: Апеляцію схвалено appeal_rejected: + explanation: Оскарження попередження вашому обліковому запису %{strike_date}, яке ви надіслали %{appeal_date} було відхилено. subject: Вашу апеляцію від %{date} було відхилено title: Апеляцію відхилено backup_ready: @@ -1611,12 +1695,14 @@ uk: title: Новий вхід warning: appeal: Подати апеляцію + appeal_description: Якщо ви вважаєте, що це помилка, ви можете надіслати оскаржити дії персоналу %{instance}. categories: spam: Спам violation: Вміст порушує такі правила спільноти explanation: delete_statuses: Деякі з ваших дописів порушили одне або кілька правил спільноти, і модератори %{instance} видалили їх. disable: Ви можете більше не використовувати свій обліковий запис, але ваш профіль та інші дані залишаються недоторканими. Ви можете надіслати запит на створення резервної копії ваших даних, змінити налаштування облікового запису або видалити свій обліковий запис. + mark_statuses_as_sensitive: Деякі з ваших дописів модератори %{instance} позначили делікатними. Це означає, що людям потрібно буде торкнутися медіа у дописах перед тим, як буде показано попередній перегляд. Ви можете самостійно позначити медіа делікатним, коли розміщуватимете його в майбутньому. sensitive: Відтепер усі ваші завантажені медіафайли будуть позначені делікатними й приховані за попередженням. silence: Ви й надалі можете користуватися своїм обліковим записом, але ваші дописи на цьому сервері бачитимуть лише ті люди, які вже стежать за вами, а вас може бути виключено з різних можливостей виявлення. Проте, інші можуть почати стежити за вами вручну. suspend: Ви більше не можете користуватися своїм обліковим записом, а ваші інші дані більше недоступні. Ви досі можете увійти, щоб надіслати запит на отримання резервної копії своїх даних до повного видалення впродовж приблизно 30 днів, але ми збережемо деякі основні дані, щоб унеможливити ухилення вами від призупинення. @@ -1625,7 +1711,9 @@ uk: subject: delete_statuses: Ваші дописи на %{acct} були вилучені disable: Ваш обліковий запис %{acct} було заморожено + mark_statuses_as_sensitive: Ваші дописи на %{acct} позначені делікатними none: Попередження для %{acct} + sensitive: Ваші дописи на %{acct} відтепер будуть позначені делікатними silence: Ваш обліковий запис %{acct} було обмежено suspend: Ваш обліковий запис %{acct} було призупинено title: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 72d06ab55..b471cc153 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -77,10 +77,8 @@ vi: posts_tab_heading: Tút posts_with_replies: Trả lời roles: - admin: Quản trị viên bot: Tài khoản Bot group: Nhóm - moderator: Kiểm duyệt viên unavailable: Tài khoản bị đình chỉ unfollow: Ngưng theo dõi admin: @@ -99,12 +97,17 @@ vi: avatar: Ảnh đại diện by_domain: Máy chủ change_email: - changed_msg: Email tài khoản đã thay đổi thành công! + changed_msg: Email đã thay đổi thành công! current_email: Email hiện tại label: Thay đổi email new_email: Email mới submit: Thay đổi email title: Thay đổi email cho %{username} + change_role: + changed_msg: Vai trò đã thay đổi thành công! + label: Đổi vai trò + no_role: Chưa có vai trò + title: Thay đổi vai trò %{username} confirm: Phê duyệt confirmed: Đã xác minh confirming: Chờ xác nhận @@ -116,7 +119,7 @@ vi: disable: Khóa disable_sign_in_token_auth: Vô hiệu hóa xác minh bằng email disable_two_factor_authentication: Vô hiệu hóa xác minh 2 bước - disabled: Đã vô hiệu hóa + disabled: Tạm khóa display_name: Tên hiển thị domain: Máy chủ edit: Chỉnh sửa @@ -148,6 +151,7 @@ vi: active: Hoạt động all: Toàn bộ pending: Chờ xử lý + silenced: Hạn chế suspended: Vô hiệu hóa title: Trạng thái moderation_notes: Nhật ký kiểm duyệt @@ -155,6 +159,7 @@ vi: most_recent_ip: IP gần nhất no_account_selected: Không có tài khoản nào thay đổi vì không có tài khoản nào được chọn no_limits_imposed: Bình thường + no_role_assigned: Chưa có vai trò not_subscribed: Chưa đăng ký pending: Chờ duyệt perform_full_suspension: Vô hiệu hóa @@ -181,11 +186,6 @@ vi: reset_password: Đặt lại mật khẩu resubscribe: Đăng ký lại role: Vai trò - roles: - admin: Quản trị viên - moderator: Kiểm duyệt viên - staff: Đội ngũ - 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 @@ -198,7 +198,7 @@ vi: show: created_reports: Gửi báo cáo targeted_reports: Bị báo cáo - silence: Ẩn + silence: Hạn chế silenced: Hạn chế statuses: Tút strikes: Lịch sử kiểm duyệt @@ -633,6 +633,65 @@ vi: unresolved: Chờ xử lý updated_at: Cập nhật lúc view_profile: Xem trang hồ sơ + roles: + add_new: Thêm vai trò + assigned_users: + other: "%{count} người" + categories: + administration: Quản trị viên + devops: Nhà phát triển + invites: Lời mời + moderation: Kiểm duyệt + special: Đặc biệt + delete: Xóa + description_html: Thông qua <strong>vai trò người dùng</strong>, bạn có thể tùy chỉnh những tính năng và vị trí của Mastodon mà người dùng có thể truy cập. + edit: Sửa vai trò '%{name}' + everyone: Quyền hạn mặc định + everyone_full_description_html: Đây <strong>vai trò cơ bản</strong> ảnh hưởng tới <strong>mọi người dùng khác</strong>, kể cả những người không có vai trò được chỉ định. Tất cả các vai trò khác đều kế thừa quyền từ vai trò đó. + permissions_count: + other: "%{count} quyền hạn" + privileges: + administrator: Quản trị viên + administrator_description: Người dùng này có thể truy cập mọi quyền hạn + delete_user_data: Xóa dữ liệu người dùng + delete_user_data_description: Cho phép xóa dữ liệu của người dùng khác lập tức + invite_users: Mời người dùng + invite_users_description: Cho phép mời những người mới vào máy chủ + manage_announcements: Quản lý thông báo + manage_announcements_description: Cho phép quản lý thông báo trên máy chủ + manage_appeals: Quản lý kháng cáo + manage_appeals_description: Cho phép xem xét kháng cáo đối với các hành động kiểm duyệt + manage_blocks: Quản lý chặn + manage_blocks_description: Cho phép chặn các nhà cung cấp e-mail và địa chỉ IP + manage_custom_emojis: Quản lý emoji + manage_custom_emojis_description: Cho phép quản lý các emoji tùy chỉnh trên máy chủ + manage_federation: Quản lý liên hợp + manage_federation_description: Cho phép chặn hoặc liên hợp với các máy chủ khác và kiểm soát khả năng phân phối + manage_invites: Quản lý lời mời + manage_invites_description: Cho phép mở và đóng các lời mời đăng ký + manage_reports: Quản lý báo cáo + manage_reports_description: Cho phép xem xét các báo cáo và thực hiện hành động kiểm duyệt đối với chúng + manage_roles: Quản lý vai trò + manage_roles_description: Cho phép quản lý và chỉ định các vai trò nhỏ hơn họ + manage_rules: Quản lý quy tắc máy chủ + manage_rules_description: Cho phép thay đổi quy tắc máy chủ + manage_settings: Quản lý thiết lập + manage_settings_description: Cho phép thay đổi thiết lập máy chủ + manage_taxonomies: Quản lý phân loại + manage_taxonomies_description: Cho phép đánh giá nội dung xu hướng và cập nhật cài đặt hashtag + manage_user_access: Quản lý người dùng truy cập + manage_user_access_description: Cho phép vô hiệu hóa xác thực hai bước của người dùng khác, thay đổi địa chỉ email và đặt lại mật khẩu của họ + manage_users: Quản lý người dùng + manage_users_description: Cho phép xem thông tin chi tiết của người dùng khác và thực hiện các hành động kiểm duyệt đối với họ + manage_webhooks: Quản lý Webhook + manage_webhooks_description: Cho phép thiết lập webhook cho các sự kiện quản trị + view_audit_log: Xem nhật ký + view_audit_log_description: Cho phép xem lịch sử của các hành động quản trị trên máy chủ + view_dashboard: Xem quản trị + view_dashboard_description: Cho phép truy cập trang tổng quan và các chỉ số khác + view_devops: Nhà phát triển + view_devops_description: Cho phép truy cập trang tổng quan Sidekiq và pgHero + title: Danh sách vai trò rules: add_new: Thêm quy tắc delete: Xóa bỏ @@ -685,9 +744,6 @@ vi: deletion: desc_html: Cho phép mọi người xóa tài khoản của họ title: Xóa tài khoản - min_invite_role: - disabled: Không một ai - title: Cho phép lời mời bằng cách require_invite_text: desc_html: Khi chọn phê duyệt người dùng thủ công, hiện “Tại sao bạn muốn đăng ký?” thay cho tùy chọn nhập title: Người đăng ký mới phải nhập mã mời tham gia @@ -700,9 +756,6 @@ vi: show_known_fediverse_at_about_page: desc_html: Nếu tắt, bảng tin sẽ chỉ hiển thị nội dung do người dùng của máy chủ này tạo ra title: Bao gồm nội dung từ mạng liên hợp trên bảng tin không được cho phép - show_staff_badge: - desc_html: Hiện huy hiệu đội ngũ trên trang người dùng - title: Hiện huy hiệu đội ngũ site_description: desc_html: Nội dung giới thiệu về máy chủ. Mô tả những gì làm cho máy chủ Mastodon này đặc biệt và bất cứ điều gì quan trọng khác. Bạn có thể dùng các thẻ HTML, đặc biệt là <code><a></code> và <code><em></code>. title: Mô tả máy chủ @@ -1104,15 +1157,23 @@ vi: public: Tin công khai thread: Thảo luận edit: + add_keyword: Thêm từ khoá + keywords: Từ khóa title: Chỉnh sửa bộ lọc errors: + deprecated_api_multiple_keywords: Không thể thay đổi các tham số này từ ứng dụng này vì chúng áp dụng cho nhiều hơn một từ khóa bộ lọc. Sử dụng ứng dụng mới hơn hoặc giao diện web. invalid_context: Bối cảnh không hợp lệ hoặc không có - invalid_irreversible: Bộ lọc chỉ hoạt động với bảng tin hoặc nội dung thông báo index: + contexts: Bộ lọc %{contexts} delete: Xóa bỏ empty: Chưa có bộ lọc nào. + expires_in: Hết hạn trong %{distance} + expires_on: Hết hạn vào %{date} + keywords: + other: "%{count} từ khóa" title: Bộ lọc new: + save: Lưu thành bộ lọc mới title: Thêm bộ lọc mới footer: developers: Phát triển @@ -1229,6 +1290,8 @@ vi: copy_account_note_text: 'Tài khoản này chuyển từ %{acct}, đây là lịch sử kiểm duyệt của họ:' notification_mailer: admin: + report: + subject: "%{name} đã gửi báo cáo" sign_up: subject: "%{name} đã được đăng ký" digest: diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml index 83b5866df..36240355b 100644 --- a/config/locales/zgh.yml +++ b/config/locales/zgh.yml @@ -40,8 +40,6 @@ zgh: all: ⵎⴰⵕⵕⴰ public: ⴰⴳⴷⵓⴷⴰⵏ reject: ⴰⴳⵢ - roles: - user: ⵓⵏⵙⵙⵓⵎⵔⵙ title: ⵉⵎⵉⴹⴰⵏⵏ web: ⵡⵉⴱ action_logs: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 475d03a2a..47a1ab29f 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -79,10 +79,8 @@ zh-CN: posts_tab_heading: 嘟文 posts_with_replies: 嘟文和回复 roles: - admin: 管理员 bot: 机器人 group: 群组 - moderator: 监察员 unavailable: 个人资料不可用 unfollow: 取消关注 admin: @@ -101,12 +99,17 @@ zh-CN: avatar: 头像 by_domain: 域名 change_email: - changed_msg: 已成功更改账号的电子邮箱! + changed_msg: 已成功更改电子邮件地址! current_email: 当前的电子邮箱 label: 更改电子邮箱 new_email: 新的电子邮箱 submit: 更改电子邮件地址 title: 为 %{username} 更改电子邮箱 + change_role: + changed_msg: 已成功更改角色! + label: 更改角色 + no_role: 未设置角色 + title: 为 %{username} 更改角色 confirm: 确认 confirmed: 已确认 confirming: 等待确认 @@ -150,6 +153,7 @@ zh-CN: active: 活跃 all: 全部 pending: 待审核 + silenced: 受限 suspended: 已封禁 title: 管理 moderation_notes: 管理员备注 @@ -157,6 +161,7 @@ zh-CN: most_recent_ip: 最后一次活跃的 IP 地址 no_account_selected: 因为没有选中任何账号,所以没有更改 no_limits_imposed: 无限制 + no_role_assigned: 未定角色 not_subscribed: 未订阅 pending: 待审核 perform_full_suspension: 封禁 @@ -182,12 +187,7 @@ zh-CN: reset: 重置 reset_password: 重置密码 resubscribe: 重新订阅 - role: 用户组 - roles: - admin: 管理员 - moderator: 监察员 - staff: 站务人员 - user: 普通用户 + role: 角色 search: 搜索 search_same_email_domain: 其他具有相同电子邮箱域名的用户 search_same_ip: 具有相同IP的其他用户 @@ -635,6 +635,57 @@ zh-CN: unresolved: 未处理 updated_at: 更新时间 view_profile: 查看资料 + roles: + add_new: 添加角色 + assigned_users: + other: "%{count} 用户" + categories: + administration: 管理 + devops: 开发运维 + invites: 邀请 + moderation: 监察 + special: 特殊 + delete: 刪除 + description_html: 使用 <strong>用户角色</strong>,您可以自定义您的用户可以访问的功能和区域。 + edit: 编辑 '%{name}' 角色 + everyone: 默认权限 + everyone_full_description_html: 这是影响到 <strong>所有用户</strong>的<strong>基础角色</strong>,包括未指定角色的用户。 其他所有的角色都继承着它的权限。 + permissions_count: + other: "%{count} 权限" + privileges: + administrator: 管理员 + administrator_description: 拥有此权限的用户将绕过每个权限 + delete_user_data: 删除用户数据 + delete_user_data_description: 允许用户立即删除其他用户的数据 + invite_users: 邀请用户 + invite_users_description: 允许用户邀请新人加入服务器 + manage_announcements: 管理公告 + manage_announcements_description: 允许用户管理服务器上的通知 + manage_appeals: 管理申诉 + manage_appeals_description: 允许用户审查对适度动作的上诉 + manage_blocks: 管理版块 + manage_blocks_description: 允许用户屏蔽电子邮件提供商和IP地址 + manage_custom_emojis: 管理自定义表情 + manage_custom_emojis_description: 允许用户管理服务器上的自定义表情 + manage_federation: 管理联邦 + manage_invites: 管理邀请 + manage_invites_description: 允许用户浏览和停用邀请链接 + manage_reports: 管理报告 + manage_reports_description: 允许用户查看报告并对其执行审核操作 + manage_roles: 管理角色 + manage_roles_description: 允许用户管理和分配比他们权限低的角色 + manage_rules: 管理规则 + manage_rules_description: 允许用户更改服务器规则 + manage_settings: 管理设置 + manage_settings_description: 允许用户更改站点设置 + manage_users: 管理用户 + manage_users_description: 允许用户查看其他用户信息并对他们执行审核操作 + manage_webhooks: 管理网钩 + manage_webhooks_description: 允许用户为管理事件设置网钩 + view_audit_log: 查看审核日志 + view_audit_log_description: 允许用户在服务器上查看管理操作历史 + view_dashboard: 查看仪表板 + view_dashboard_description: 允许用户访问仪表盘和各种指标 rules: add_new: 添加规则 delete: 删除 @@ -687,9 +738,6 @@ zh-CN: deletion: desc_html: 允许所有人删除自己的帐户 title: 开放删除帐户权限 - min_invite_role: - disabled: 没有人 - title: 允许发送邀请的用户组 require_invite_text: desc_html: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项 title: 要求新用户填写申请注册的原因 @@ -702,9 +750,6 @@ zh-CN: show_known_fediverse_at_about_page: desc_html: 如果开启,就会在时间轴预览显示其他站点嘟文,否则就只会只显示本站嘟文。 title: 在时间轴预览中显示其他站点嘟文 - show_staff_badge: - desc_html: 在个人资料页上显示管理人员标志 - title: 显示管理人员标志 site_description: desc_html: 首页上的介绍文字。 描述一下本 Mastodon 实例的特殊之处以及其他重要信息。可以使用 HTML 标签,包括 <code><a></code> 和 <code><em></code> 。 title: 本站简介 @@ -838,7 +883,11 @@ zh-CN: webhooks: delete: 删除 disable: 禁用 + disabled: 已禁用 enable: 启用 + status: 状态 + title: 网钩 + webhook: 网钩 admin_mailer: new_appeal: actions: @@ -1091,15 +1140,19 @@ zh-CN: public: 公共时间轴 thread: 对话 edit: + add_keyword: 添加关键词 + keywords: 关键词 title: 编辑过滤器 errors: invalid_context: 过滤器场景没有或无效 - invalid_irreversible: 此功能只适用于主页时间轴或通知 index: delete: 删除 empty: 你没有过滤器。 + keywords: + other: "%{count} 关键词" title: 过滤器 new: + save: 保存新过滤器 title: 添加新的过滤器 footer: developers: 开发者 @@ -1216,6 +1269,8 @@ zh-CN: copy_account_note_text: 这个用户迁移自 %{acct},你曾为其添加备注: notification_mailer: admin: + report: + subject: "%{name} 提交了报告" sign_up: subject: "%{name} 注册了" digest: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 5b6e0b83a..e375bb4c8 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -75,10 +75,8 @@ zh-HK: posts_tab_heading: 文章 posts_with_replies: 包含回覆的文章 roles: - admin: 管理員 bot: 機械人 group: 群組 - moderator: 板主 unavailable: 無法取得個人檔案 unfollow: 取消關注 admin: @@ -97,7 +95,6 @@ zh-HK: avatar: 頭像 by_domain: 域名 change_email: - changed_msg: 帳號電郵更新成功! current_email: 現時電郵 label: 更改電郵 new_email: 新的電郵 @@ -174,12 +171,6 @@ zh-HK: reset: 重設 reset_password: 重設密碼 resubscribe: 重新訂閱 - role: 權限 - roles: - admin: 管理員 - moderator: 管理員 - staff: 工作人員 - user: 普通使用者 search: 搜尋 search_same_email_domain: 其他有相同電郵網域的使用者 search_same_ip: 其他有相同 IP 位址的使用者 @@ -568,9 +559,6 @@ zh-HK: deletion: desc_html: 允許所有人刪除自己的帳號 title: 容許刪除帳號 - min_invite_role: - disabled: 沒有人 - title: 允許發送邀請的身份 require_invite_text: desc_html: 如果已設定為手動審核注冊,請把「加入的原因」設定為必填項目。 title: 要求新用戶填寫注冊申請 @@ -583,9 +571,6 @@ zh-HK: show_known_fediverse_at_about_page: desc_html: 如果停用,將會只在本站的歡迎頁顯示本站的文章。 title: 在訪客預覽本站的時間軸上,顯示跨站文章 - show_staff_badge: - desc_html: 在個人資料頁上顯示工作人員標誌 - title: 顯示工作人員標誌 site_description: desc_html: 在首頁顯示,及在 meta 標籤使用作網站介紹。<br/> 你可以在此使用 <code><a></code> 和 <code><em></code> 等 HTML 標籤。 title: 本站介紹 @@ -836,7 +821,6 @@ zh-HK: title: 編輯篩選器 errors: invalid_context: 沒有提供內文或內文無效 - invalid_irreversible: 不可逆的篩選器只適用放主頁或通知頁面 index: delete: 刪除 empty: 你沒有過濾器。 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 7d2bb80cb..1490aeef1 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1,7 +1,7 @@ --- zh-TW: about: - about_hashtag_html: 這些是包含「<strong>#%{hashtag}</strong>」標籤的公開文章。只要您有任何 Mastodon 站點、或者其他站點的使用者,便可以與他們互動。 + about_hashtag_html: 這些是包含「<strong>#%{hashtag}</strong>」標籤的公開文章。只要您有任何 Mastodon 站點、或者其他聯邦宇宙的使用者,便可以與他們互動。 about_mastodon_html: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 站點,在上面建立帳號,然後您就可以和任一 Mastodon 站點上的使用者互通,享受無縫的<em>社群網路</em>交流。 about_this: 關於本站 active_count_after: 活躍 @@ -22,7 +22,9 @@ zh-TW: federation_hint_html: 您只需要擁有 %{instance} 的帳號,就可以追蹤任何一台 Mastodon 伺服器上的人等等。 get_apps: 嘗試行動應用程式 hosted_on: 在 %{domain} 運作的 Mastodon 站點 - instance_actor_flash: "這個帳戶是個用來代表伺服器自已的虛擬角色,而不是實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。 \n" + instance_actor_flash: '這個帳戶是個用來代表伺服器本身的虛擬角色,而非實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。 + + ' learn_more: 了解詳細 logged_in_as_html: 您目前登入使用的帳號是 %{username} logout_before_registering: 您已經登入了! @@ -60,7 +62,7 @@ zh-TW: followers: other: 跟隨者 following: 正在跟隨 - instance_actor_flash: 這個帳號是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。 + instance_actor_flash: 這個帳號是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為聯邦宇宙且不應被停權。 joined: 加入於 %{date} last_active: 上次活躍時間 link_verified_on: 此連結的所有權已在 %{date} 檢查過 @@ -77,10 +79,8 @@ zh-TW: posts_tab_heading: 嘟文 posts_with_replies: 嘟文與回覆 roles: - admin: 管理員 bot: 機器人 group: 群組 - moderator: 版主 unavailable: 無法取得個人檔案 unfollow: 取消跟隨 admin: @@ -99,12 +99,17 @@ zh-TW: avatar: 頭像 by_domain: 站點 change_email: - changed_msg: 已成功變更帳號電子信箱地址! + changed_msg: 電子郵件已成功變更! current_email: 目前的電子信箱地址 label: 變更電子信箱地址 new_email: 新的電子信箱地址 submit: 變更電子信箱地址 title: 為 %{username} 變更電子信箱地址 + change_role: + changed_msg: 成功修改角色! + label: 變更角色 + no_role: 沒有角色 + title: 為 %{username} 變更角色 confirm: 確定 confirmed: 已確定 confirming: 確定 @@ -148,13 +153,15 @@ zh-TW: active: 活躍 all: 全部 pending: 等待中 + silenced: 受限的 suspended: 已停權 - title: 版務 + title: 站務 moderation_notes: 管理備忘 most_recent_activity: 最近活動 most_recent_ip: 最近 IP 位址 no_account_selected: 未選取任何帳號,因此未變更 no_limits_imposed: 未受限制 + no_role_assigned: 未指派角色 not_subscribed: 未訂閱 pending: 等待審核中 perform_full_suspension: 停權 @@ -180,12 +187,7 @@ zh-TW: reset: 重設 reset_password: 重設密碼 resubscribe: 重新訂閱 - role: 身份 - roles: - admin: 管理員 - moderator: 版主 - staff: 管理人員 - user: 普通使用者 + role: 角色 search: 搜尋 search_same_email_domain: 其他有同個電子郵件網域的使用者 search_same_ip: 其他有同個 IP 的使用者 @@ -283,7 +285,7 @@ zh-TW: 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_allow_html: "%{name} 允許 %{target} 網域加入聯邦宇宙" create_domain_block_html: "%{name} 封鎖了網域 %{target}" create_email_domain_block_html: "%{name} 封鎖了電子信箱網域 %{target}" create_ip_block_html: "%{name} 已經設定了IP %{target} 的規則" @@ -291,7 +293,7 @@ zh-TW: demote_user_html: "%{name} 將使用者 %{target} 降級" destroy_announcement_html: "%{name} 刪除了公告 %{target}" destroy_custom_emoji_html: "%{name} 停用了自訂表情符號 %{target}" - destroy_domain_allow_html: "%{name} 不允許與網域 %{target} 加入站點聯盟" + destroy_domain_allow_html: "%{name} 不允許與網域 %{target} 加入聯邦宇宙" destroy_domain_block_html: "%{name} 取消了對網域 %{target} 的封鎖" destroy_email_domain_block_html: "%{name} 取消了對電子信箱網域 %{target} 的封鎖" destroy_instance_html: "%{name} 清除了網域 %{target}" @@ -407,10 +409,10 @@ zh-TW: empty: 找不到申訴。 title: 申訴 domain_allows: - add_new: 將網域加入白名單 - created_msg: 網域已成功加入白名單 - destroyed_msg: 網域已成功從白名單移除 - undo: 從白名單移除 + add_new: 將網域加入聯邦宇宙白名單 + created_msg: 網域已成功加入聯邦宇宙白名單 + destroyed_msg: 網域已成功從聯邦宇宙白名單移除 + undo: 從聯邦宇宙白名單移除 domain_blocks: add_new: 新增欲封鎖域名 created_msg: 正在進行站點封鎖 @@ -520,12 +522,12 @@ zh-TW: moderation: all: 全部 limited: 限制 - title: 版主 + title: 管管 private_comment: 私人留言 public_comment: 公開留言 purge: 清除 purge_description_html: 若您相信此網域將永久離線,您可以自儲存空間中刪除該網域所有帳號紀錄及相關資料。這可能花費一些時間。 - title: 聯邦 + title: 聯邦宇宙 total_blocked_by_us: 被我們封鎖 total_followed_by_them: 被他們跟隨 total_followed_by_us: 被我們跟隨 @@ -570,7 +572,7 @@ zh-TW: pending: 等待中繼站審核 save_and_enable: 儲存並啟用 setup: 設定中繼連結 - signatures_not_enabled: 若啟用安全模式或受限的站點聯盟模式,中繼將不會正常運作 + signatures_not_enabled: 若啟用安全模式或受限的聯邦宇宙模式,中繼將不會正常運作 status: 狀態 title: 中繼 report_notes: @@ -635,6 +637,65 @@ zh-TW: unresolved: 未解決 updated_at: 更新 view_profile: 檢視個人資料頁 + roles: + add_new: 新增角色 + assigned_users: + other: "%{count} 個使用者" + categories: + administration: 管理員 + devops: Devops + invites: 邀請 + moderation: 站務 + special: 特殊 + delete: 刪除 + description_html: 透過<strong>使用者角色</strong>,您可以自訂您的使用者可以存取 Mastodon 的哪些功能與區域。 + edit: 編輯「%{name}」角色 + everyone: 預設權限 + everyone_full_description_html: 這是會影響<strong>所有使用者</strong>的<strong>基本角色</strong>,即使是那些沒有被分配角色的使用者也一樣。其他所有的角色都從它繼承權限。 + permissions_count: + other: "%{count} 個權限" + privileges: + administrator: 管理員 + administrator_description: 擁有此權限的使用者將會略過所有權限 + delete_user_data: 刪除使用者資料 + delete_user_data_description: 允許使用者立刻刪除其他使用者的資料 + invite_users: 邀請使用者 + invite_users_description: 允許使用者邀請新人加入伺服器 + manage_announcements: 管理公告 + manage_announcements_description: 允許使用者管理伺服器上的公告 + manage_appeals: 管理解封申訴系統 + manage_appeals_description: 允許使用者審閱針對站務動作的申訴 + manage_blocks: 管理封鎖 + manage_blocks_description: 允許使用者封鎖電子郵件提供者與 IP 位置 + manage_custom_emojis: 管理自訂表情符號 + manage_custom_emojis_description: 允許使用者管理伺服器上的自訂表情符號 + manage_federation: 管理聯邦宇宙 + manage_federation_description: 允許使用者封鎖或允許與其他網域的聯邦宇宙,並控制傳遞能力 + manage_invites: 管理邀請 + manage_invites_description: 允許使用者瀏覽與停用邀請連結 + manage_reports: 管理回報 + manage_reports_description: 允許使用者審閱回報並對回報執行站務動作 + manage_roles: 管理角色 + manage_roles_description: 允許使用者管理並指派低於他們的使用者 + manage_rules: 管理規則 + manage_rules_description: 允許使用者變更伺服器規則 + manage_settings: 管理設定 + manage_settings_description: 允許使用者變更站點設定 + manage_taxonomies: 管理分類方式 + manage_taxonomies_description: 允許使用者審閱熱門內容與更新主題標籤設定 + manage_user_access: 管理使用者存取權 + manage_user_access_description: 允許使用者停用其他人的兩步驟驗證、變更他們的電子郵件地址以及重設他們的密碼 + manage_users: 管理使用者 + manage_users_description: 允許使用者檢視其他使用者的詳細資訊並對回報執行站務動作 + manage_webhooks: 管理 Webhooks + manage_webhooks_description: 允許使用者為管理事件設定 webhooks + view_audit_log: 檢視審核日誌 + view_audit_log_description: 允許使用者檢視伺服器上的管理動作歷史 + view_dashboard: 檢視儀表板 + view_dashboard_description: 允許使用者存取儀表板與各種指標 + view_devops: Devops + view_devops_description: 允許使用者存取 Sidekiq 與 pgHero 儀表板 + title: 角色 rules: add_new: 新增規則 delete: 刪除 @@ -687,9 +748,6 @@ zh-TW: deletion: desc_html: 允許所有人刪除自己的帳號 title: 開放刪除帳號的權限 - min_invite_role: - disabled: 沒有人 - title: 允許發送邀請的身份 require_invite_text: desc_html: 如果已設定為手動審核註冊,請將「加入原因」設定為必填項目。 title: 要求新使用者填申請書以索取邀請 @@ -702,9 +760,6 @@ zh-TW: show_known_fediverse_at_about_page: desc_html: 如果開啟,就會在時間軸預覽顯示其他站點嘟文,否則就只會顯示本站點嘟文。 title: 在時間軸預覽顯示其他站點嘟文 - show_staff_badge: - desc_html: 在個人資料頁面上顯示管理人員標誌 - title: 顯示管理人員標誌 site_description: desc_html: 首頁上的介紹文字,描述此 Mastodon 伺服器的特別之處和其他重要資訊。可使用 HTML 標籤,包括 <code><a></code> 和 <code><em></code>。 title: 伺服器描述 @@ -1106,15 +1161,23 @@ zh-TW: public: 公開時間軸 thread: 會話 edit: + add_keyword: 新增關鍵字 + keywords: 關鍵字 title: 編輯篩選條件 errors: + deprecated_api_multiple_keywords: 這些參數無法從此應用程式中更改,因為它們適用於一或多個過濾器關鍵字。請使用較新的應用程式或是網頁介面。 invalid_context: 沒有提供內文或內文無效 - invalid_irreversible: 此功能僅適用於首頁或通知頁面 index: + contexts: "%{contexts} 中的過濾器" delete: 刪除 empty: 您沒有過濾器。 + expires_in: 於 %{distance} 過期 + expires_on: 於 %{date} 過期 + keywords: + other: "%{count} 個關鍵字" title: 過濾器 new: + save: 儲存新過濾器 title: 新增篩選器 footer: developers: 開發者 @@ -1224,13 +1287,15 @@ zh-TW: other_data: 其他資料並不會自動轉移 redirect: 您目前的帳號將會在個人資料頁面新增重新導向公告,並會被排除在搜尋結果之外 moderation: - title: 營運 + title: 站務 move_handler: carry_blocks_over_text: 此使用者轉移自被您封鎖的 %{acct}。 carry_mutes_over_text: 此使用者轉移自被您靜音的 %{acct}。 copy_account_note_text: 此使用者轉移自 %{acct},以下是您之前關於他們的備註: notification_mailer: admin: + report: + subject: "%{name} 送出了一則檢舉報告" sign_up: subject: "%{name} 已進行註冊" digest: diff --git a/config/navigation.rb b/config/navigation.rb index 2a4bf2d39..7a1aee078 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -2,72 +2,73 @@ SimpleNavigation::Configuration.run do |navigation| navigation.items do |n| - n.item :web, safe_join([fa_icon('chevron-left fw'), t('settings.back')]), root_url + n.item :web, safe_join([fa_icon('chevron-left fw'), t('settings.back')]), root_path - 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 + n.item :profile, safe_join([fa_icon('user fw'), t('settings.profile')]), settings_profile_path, if: -> { current_user.functional? } do |s| + s.item :profile, safe_join([fa_icon('pencil fw'), t('settings.appearance')]), settings_profile_path + s.item :featured_tags, safe_join([fa_icon('hashtag fw'), t('settings.featured_tags')]), settings_featured_tags_path end - n.item :preferences, safe_join([fa_icon('cog fw'), t('settings.preferences')]), settings_preferences_url, if: -> { current_user.functional? } do |s| - s.item :appearance, safe_join([fa_icon('desktop fw'), t('settings.appearance')]), settings_preferences_appearance_url - s.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_preferences_notifications_url - s.item :other, safe_join([fa_icon('cog fw'), t('preferences.other')]), settings_preferences_other_url + n.item :preferences, safe_join([fa_icon('cog fw'), t('settings.preferences')]), settings_preferences_path, if: -> { current_user.functional? } do |s| + s.item :appearance, safe_join([fa_icon('desktop fw'), t('settings.appearance')]), settings_preferences_appearance_path + s.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_preferences_notifications_path + s.item :other, safe_join([fa_icon('cog fw'), t('preferences.other')]), settings_preferences_other_path end - n.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_url do |flavours| + n.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_path do |flavours| Themes.instance.flavours.each do |flavour| - flavours.item flavour.to_sym, safe_join([fa_icon('star fw'), t("flavours.#{flavour}.name", default: flavour)]), settings_flavour_url(flavour) + flavours.item flavour.to_sym, safe_join([fa_icon('star fw'), t("flavours.#{flavour}.name", default: flavour)]), settings_flavour_path(flavour) end end - n.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_url, if: -> { current_user.functional? } + n.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_path, 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 :statuses_cleanup, safe_join([fa_icon('history fw'), t('settings.statuses_cleanup')]), statuses_cleanup_path, 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|/settings/login_activities|^/disputes} - 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 + n.item :security, safe_join([fa_icon('lock fw'), t('settings.account')]), edit_user_registration_path do |s| + s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_path, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases|/settings/login_activities|^/disputes} + s.item :two_factor_authentication, safe_join([fa_icon('mobile fw'), t('settings.two_factor_authentication')]), settings_two_factor_authentication_methods_path, 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_path end - n.item :data, safe_join([fa_icon('cloud-download fw'), t('settings.import_and_export')]), settings_export_url do |s| - s.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url, if: -> { current_user.functional? } - s.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url + n.item :data, safe_join([fa_icon('cloud-download fw'), t('settings.import_and_export')]), settings_export_path do |s| + s.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_path, if: -> { current_user.functional? } + s.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_path end - 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 :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: -> { current_user.can?(:invite_users) && current_user.functional? } + n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_path, 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| + n.item :trends, safe_join([fa_icon('fire fw'), t('admin.trends.title')]), admin_trends_statuses_path, if: -> { current_user.can?(:manage_taxonomies) } do |s| s.item :statuses, safe_join([fa_icon('comments-o fw'), t('admin.trends.statuses.title')]), admin_trends_statuses_path, highlights_on: %r{/admin/trends/statuses} 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(origin: 'local'), highlights_on: %r{/admin/accounts|/admin/pending_accounts|/admin/disputes} - s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path - 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? } + n.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) } do |s| + s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports}, if: -> { current_user.can?(:manage_reports) } + s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) } + s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path, if: -> { current_user.can?(:manage_invites) } + 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}, if: -> { current_user.can?(:manage_taxonomies) } + s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_path(limited: whitelist_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) } + s.item :email_domain_blocks, safe_join([fa_icon('envelope fw'), t('admin.email_domain_blocks.title')]), admin_email_domain_blocks_path, highlights_on: %r{/admin/email_domain_blocks}, if: -> { current_user.can?(:manage_blocks) } + s.item :ip_blocks, safe_join([fa_icon('ban fw'), t('admin.ip_blocks.title')]), admin_ip_blocks_path, highlights_on: %r{/admin/ip_blocks}, if: -> { current_user.can?(:manage_blocks) } + s.item :action_logs, safe_join([fa_icon('bars fw'), t('admin.action_logs.title')]), admin_action_logs_path, if: -> { current_user.can?(:view_audit_log) } end - 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 :webhooks, safe_join([fa_icon('inbox fw'), t('admin.webhooks.title')]), admin_webhooks_path, highlights_on: %r{/admin/webhooks} - 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} - s.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' }, if: -> { current_user.admin? } - s.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' }, if: -> { current_user.admin? } + n.item :admin, safe_join([fa_icon('cogs fw'), t('admin.title')]), nil, if: -> { current_user.can?(:view_dashboard, :manage_settings, :manage_rules, :manage_announcements, :manage_custom_emojis, :manage_webhooks, :manage_federation) } do |s| + s.item :dashboard, safe_join([fa_icon('tachometer fw'), t('admin.dashboard.title')]), admin_dashboard_path, if: -> { current_user.can?(:view_dashboard) } + s.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_path, if: -> { current_user.can?(:manage_settings) }, 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}, if: -> { current_user.can?(:manage_rules) } + s.item :roles, safe_join([fa_icon('vcard fw'), t('admin.roles.title')]), admin_roles_path, highlights_on: %r{/admin/roles}, if: -> { current_user.can?(:manage_roles) } + s.item :announcements, safe_join([fa_icon('bullhorn fw'), t('admin.announcements.title')]), admin_announcements_path, highlights_on: %r{/admin/announcements}, if: -> { current_user.can?(:manage_announcements) } + s.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_path, highlights_on: %r{/admin/custom_emojis}, if: -> { current_user.can?(:manage_custom_emojis) } + s.item :webhooks, safe_join([fa_icon('inbox fw'), t('admin.webhooks.title')]), admin_webhooks_path, highlights_on: %r{/admin/webhooks}, if: -> { current_user.can?(:manage_webhooks) } + s.item :relays, safe_join([fa_icon('exchange fw'), t('admin.relays.title')]), admin_relays_path, highlights_on: %r{/admin/relays}, if: -> { !whitelist_mode? && current_user.can?(:manage_federation) } end - n.item :logout, safe_join([fa_icon('sign-out fw'), t('auth.logout')]), destroy_user_session_url, link_html: { 'data-method' => 'delete' } + n.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_path, link_html: { target: 'sidekiq' }, if: -> { current_user.can?(:view_devops) } + n.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_path, link_html: { target: 'pghero' }, if: -> { current_user.can?(:view_devops) } + n.item :logout, safe_join([fa_icon('sign-out fw'), t('auth.logout')]), destroy_user_session_path, link_html: { 'data-method' => 'delete' } end end diff --git a/config/roles.yml b/config/roles.yml new file mode 100644 index 000000000..f443250d1 --- /dev/null +++ b/config/roles.yml @@ -0,0 +1,35 @@ +moderator: + name: Moderator + position: 10 + permissions: + - view_dashboard + - view_audit_log + - manage_users + - manage_reports + - manage_taxonomies +admin: + name: Admin + position: 100 + permissions: + - view_dashboard + - view_audit_log + - manage_users + - manage_user_access + - delete_user_data + - manage_reports + - manage_taxonomies + - manage_federation + - manage_settings + - manage_blocks + - manage_appeals + - manage_rules + - manage_invites + - manage_announcements + - manage_custom_emojis + - manage_webhooks + - manage_roles +owner: + name: Owner + position: 1000 + permissions: + - administrator diff --git a/config/routes.rb b/config/routes.rb index b8f908ffc..52ba0956a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,7 +10,7 @@ Rails.application.routes.draw do get 'health', to: 'health#show' - authenticate :user, lambda { |u| u.admin? } do + authenticate :user, lambda { |u| u.role&.can?(:view_devops) } do mount Sidekiq::Web, at: 'sidekiq', as: :sidekiq mount PgHero::Engine, at: 'pghero', as: :pghero end @@ -316,17 +316,11 @@ Rails.application.routes.draw do post :resend end end - - resource :role, only: [] do - member do - post :promote - post :demote - end - end end resources :users, only: [] do - resource :two_factor_authentication, only: [:destroy] + resource :two_factor_authentication, only: [:destroy], controller: 'users/two_factor_authentications' + resource :role, only: [:show, :update], controller: 'users/roles' end resources :custom_emojis, only: [:index, :new, :create] do @@ -341,6 +335,7 @@ Rails.application.routes.draw do end end + resources :roles, except: [:show] resources :account_moderation_notes, only: [:create, :destroy] resource :follow_recommendations, only: [:show, :update] resources :tags, only: [:show, :update] @@ -473,10 +468,16 @@ Rails.application.routes.draw do resources :bookmarks, only: [:index] resources :reports, only: [:create] resources :trends, only: [:index], controller: 'trends/tags' - resources :filters, only: [:index, :create, :show, :update, :destroy] + resources :filters, only: [:index, :create, :show, :update, :destroy] do + resources :keywords, only: [:index, :create], controller: 'filters/keywords' + end resources :endorsements, only: [:index] resources :markers, only: [:index, :create] + namespace :filters do + resources :keywords, only: [:show, :update, :destroy] + end + namespace :apps do get :verify_credentials, to: 'credentials#show' end @@ -553,6 +554,15 @@ Rails.application.routes.draw do resource :note, only: :create, controller: 'accounts/notes' end + resources :tags, only: [:show] do + member do + post :follow + post :unfollow + end + end + + resources :followed_tags, only: [:index] + resources :lists, only: [:index, :create, :show, :update, :destroy] do resource :accounts, only: [:show, :create, :destroy], controller: 'lists/accounts' end @@ -594,6 +604,7 @@ Rails.application.routes.draw do end end + resources :domain_allows, only: [:index, :show, :create, :destroy] resources :domain_blocks, only: [:index, :show, :update, :create, :destroy] namespace :trends do @@ -612,6 +623,7 @@ Rails.application.routes.draw do resources :media, only: [:create] get '/search', to: 'search#index', as: :search resources :suggestions, only: [:index] + resources :filters, only: [:index, :create, :show, :update, :destroy] namespace :admin do resources :accounts, only: [:index] diff --git a/db/migrate/20220611210335_create_user_roles.rb b/db/migrate/20220611210335_create_user_roles.rb new file mode 100644 index 000000000..6b7f2b637 --- /dev/null +++ b/db/migrate/20220611210335_create_user_roles.rb @@ -0,0 +1,13 @@ +class CreateUserRoles < ActiveRecord::Migration[6.1] + def change + create_table :user_roles do |t| + t.string :name, null: false, default: '' + t.string :color, null: false, default: '' + t.integer :position, null: false, default: 0 + t.bigint :permissions, null: false, default: 0 + t.boolean :highlighted, null: false, default: false + + t.timestamps + end + end +end diff --git a/db/migrate/20220611212541_add_role_id_to_users.rb b/db/migrate/20220611212541_add_role_id_to_users.rb new file mode 100644 index 000000000..2fda647d4 --- /dev/null +++ b/db/migrate/20220611212541_add_role_id_to_users.rb @@ -0,0 +1,8 @@ +class AddRoleIdToUsers < ActiveRecord::Migration[6.1] + disable_ddl_transaction! + + def change + safety_assured { add_reference :users, :role, foreign_key: { to_table: 'user_roles', on_delete: :nullify }, index: false } + add_index :users, :role_id, algorithm: :concurrently, where: 'role_id IS NOT NULL' + end +end diff --git a/db/migrate/20220613110628_create_custom_filter_keywords.rb b/db/migrate/20220613110628_create_custom_filter_keywords.rb new file mode 100644 index 000000000..353fc334f --- /dev/null +++ b/db/migrate/20220613110628_create_custom_filter_keywords.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class CreateCustomFilterKeywords < ActiveRecord::Migration[6.1] + def change + create_table :custom_filter_keywords do |t| + t.belongs_to :custom_filter, foreign_key: { on_delete: :cascade }, null: false + t.text :keyword, null: false, default: '' + t.boolean :whole_word, null: false, default: true + + t.timestamps + end + end +end diff --git a/db/migrate/20220613110711_migrate_custom_filters.rb b/db/migrate/20220613110711_migrate_custom_filters.rb new file mode 100644 index 000000000..ea6a9b8c6 --- /dev/null +++ b/db/migrate/20220613110711_migrate_custom_filters.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +class MigrateCustomFilters < ActiveRecord::Migration[6.1] + def up + # Preserve IDs as much as possible to not confuse existing clients. + # As long as this migration is irreversible, we do not have to deal with conflicts. + safety_assured do + execute <<-SQL.squish + INSERT INTO custom_filter_keywords (id, custom_filter_id, keyword, whole_word, created_at, updated_at) + SELECT id, id, phrase, whole_word, created_at, updated_at + FROM custom_filters + SQL + end + end + + def down + # Copy back changes from custom filters guaranteed to be from the old API + safety_assured do + execute <<-SQL.squish + UPDATE custom_filters + SET phrase = custom_filter_keywords.keyword, whole_word = custom_filter_keywords.whole_word + FROM custom_filter_keywords + WHERE custom_filters.id = custom_filter_keywords.id AND custom_filters.id = custom_filter_keywords.custom_filter_id + SQL + end + + # Drop every keyword as we can't safely provide a 1:1 mapping + safety_assured do + execute <<-SQL.squish + TRUNCATE custom_filter_keywords RESTART IDENTITY + SQL + end + end +end diff --git a/db/migrate/20220613110834_add_action_to_custom_filters.rb b/db/migrate/20220613110834_add_action_to_custom_filters.rb new file mode 100644 index 000000000..9427a66fc --- /dev/null +++ b/db/migrate/20220613110834_add_action_to_custom_filters.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddActionToCustomFilters < ActiveRecord::Migration[6.1] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured do + add_column_with_default :custom_filters, :action, :integer, allow_null: false, default: 0 + execute 'UPDATE custom_filters SET action = 1 WHERE irreversible IS TRUE' + end + end + + def down + execute 'UPDATE custom_filters SET irreversible = (action = 1)' + remove_column :custom_filters, :action + end +end diff --git a/db/migrate/20220710102457_add_display_name_to_tags.rb b/db/migrate/20220710102457_add_display_name_to_tags.rb new file mode 100644 index 000000000..aa7867645 --- /dev/null +++ b/db/migrate/20220710102457_add_display_name_to_tags.rb @@ -0,0 +1,5 @@ +class AddDisplayNameToTags < ActiveRecord::Migration[6.1] + def change + add_column :tags, :display_name, :string + end +end diff --git a/db/migrate/20220714171049_create_tag_follows.rb b/db/migrate/20220714171049_create_tag_follows.rb new file mode 100644 index 000000000..a393e90f5 --- /dev/null +++ b/db/migrate/20220714171049_create_tag_follows.rb @@ -0,0 +1,12 @@ +class CreateTagFollows < ActiveRecord::Migration[6.1] + def change + create_table :tag_follows do |t| + t.belongs_to :tag, null: false, foreign_key: { on_delete: :cascade } + t.belongs_to :account, null: false, foreign_key: { on_delete: :cascade }, index: false + + t.timestamps + end + + add_index :tag_follows, [:account_id, :tag_id], unique: true + end +end diff --git a/db/post_migrate/20220613110802_remove_whole_word_from_custom_filters.rb b/db/post_migrate/20220613110802_remove_whole_word_from_custom_filters.rb new file mode 100644 index 000000000..7ef0749e5 --- /dev/null +++ b/db/post_migrate/20220613110802_remove_whole_word_from_custom_filters.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class RemoveWholeWordFromCustomFilters < ActiveRecord::Migration[6.1] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured do + remove_column :custom_filters, :whole_word + end + end + + def down + safety_assured do + add_column_with_default :custom_filters, :whole_word, :boolean, default: true, allow_null: false + end + end +end diff --git a/db/post_migrate/20220613110903_remove_irreversible_from_custom_filters.rb b/db/post_migrate/20220613110903_remove_irreversible_from_custom_filters.rb new file mode 100644 index 000000000..6ed8bcfee --- /dev/null +++ b/db/post_migrate/20220613110903_remove_irreversible_from_custom_filters.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class RemoveIrreversibleFromCustomFilters < ActiveRecord::Migration[6.1] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured do + remove_column :custom_filters, :irreversible + end + end + + def down + safety_assured do + add_column_with_default :custom_filters, :irreversible, :boolean, allow_null: false, default: false + end + end +end diff --git a/db/post_migrate/20220617202502_migrate_roles.rb b/db/post_migrate/20220617202502_migrate_roles.rb new file mode 100644 index 000000000..b7a7b2201 --- /dev/null +++ b/db/post_migrate/20220617202502_migrate_roles.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class MigrateRoles < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + class UserRole < ApplicationRecord; end + class User < ApplicationRecord; end + + def up + load Rails.root.join('db', 'seeds', '03_roles.rb') + + admin_role = UserRole.find_by(name: 'Admin') + moderator_role = UserRole.find_by(name: 'Moderator') + + User.where(admin: true).in_batches.update_all(role_id: admin_role.id) + User.where(moderator: true).in_batches.update_all(role_id: moderator_role.id) + end + + def down + admin_role = UserRole.find_by(name: 'Admin') + moderator_role = UserRole.find_by(name: 'Moderator') + + User.where(role_id: admin_role.id).in_batches.update_all(admin: true) if admin_role + User.where(role_id: moderator_role.id).in_batches.update_all(moderator: true) if moderator_role + end +end diff --git a/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb b/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb new file mode 100644 index 000000000..254690cc3 --- /dev/null +++ b/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +class MigrateSettingsToUserRoles < ActiveRecord::Migration[6.1] + disable_ddl_transaction! + + class UserRole < ApplicationRecord; end + + def up + owner_role = UserRole.find_by(name: 'Owner') + admin_role = UserRole.find_by(name: 'Admin') + moderator_role = UserRole.find_by(name: 'Moderator') + everyone_role = UserRole.find_by(id: -99) + + min_invite_role = Setting.min_invite_role + show_staff_badge = Setting.show_staff_badge + + if everyone_role + everyone_role.permissions &= ~::UserRole::FLAGS[:invite_users] unless min_invite_role == 'user' + everyone_role.save + end + + if owner_role + owner_role.highlighted = show_staff_badge + owner_role.save + end + + if admin_role + admin_role.permissions |= ::UserRole::FLAGS[:invite_users] if %w(admin moderator).include?(min_invite_role) + admin_role.highlighted = show_staff_badge + admin_role.save + end + + if moderator_role + moderator_role.permissions |= ::UserRole::FLAGS[:invite_users] if %w(moderator).include?(min_invite_role) + moderator_role.highlighted = show_staff_badge + moderator_role.save + end + end + + def down; end +end diff --git a/db/schema.rb b/db/schema.rb index 526480df4..7a8262dfa 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_06_06_044941) do +ActiveRecord::Schema.define(version: 2022_07_14_171049) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -339,15 +339,23 @@ ActiveRecord::Schema.define(version: 2022_06_06_044941) do t.index ["shortcode", "domain"], name: "index_custom_emojis_on_shortcode_and_domain", unique: true end + create_table "custom_filter_keywords", force: :cascade do |t| + t.bigint "custom_filter_id", null: false + t.text "keyword", default: "", null: false + t.boolean "whole_word", default: true, null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["custom_filter_id"], name: "index_custom_filter_keywords_on_custom_filter_id" + end + create_table "custom_filters", force: :cascade do |t| t.bigint "account_id" t.datetime "expires_at" t.text "phrase", default: "", null: false t.string "context", default: [], null: false, array: true - t.boolean "irreversible", default: false, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.boolean "whole_word", default: true, null: false + t.integer "action", default: 0, null: false t.index ["account_id"], name: "index_custom_filters_on_account_id" end @@ -923,6 +931,15 @@ ActiveRecord::Schema.define(version: 2022_06_06_044941) do t.datetime "updated_at", null: false end + create_table "tag_follows", force: :cascade do |t| + t.bigint "tag_id", null: false + 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", "tag_id"], name: "index_tag_follows_on_account_id_and_tag_id", unique: true + t.index ["tag_id"], name: "index_tag_follows_on_tag_id" + end + create_table "tags", force: :cascade do |t| t.string "name", default: "", null: false t.datetime "created_at", null: false @@ -935,6 +952,7 @@ ActiveRecord::Schema.define(version: 2022_06_06_044941) do t.datetime "last_status_at" t.float "max_score" t.datetime "max_score_at" + t.string "display_name" t.index "lower((name)::text) text_pattern_ops", name: "index_tags_on_name_lower_btree", unique: true end @@ -963,6 +981,16 @@ ActiveRecord::Schema.define(version: 2022_06_06_044941) do t.index ["user_id"], name: "index_user_invite_requests_on_user_id" end + create_table "user_roles", force: :cascade do |t| + t.string "name", default: "", null: false + t.string "color", default: "", null: false + t.integer "position", default: 0, null: false + t.bigint "permissions", default: 0, null: false + t.boolean "highlighted", default: false, null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.datetime "created_at", null: false @@ -998,11 +1026,13 @@ ActiveRecord::Schema.define(version: 2022_06_06_044941) do t.string "webauthn_id" t.inet "sign_up_ip" t.boolean "skip_sign_in_token" + t.bigint "role_id" 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", where: "(created_by_application_id IS NOT NULL)" t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, opclass: :text_pattern_ops, where: "(reset_password_token IS NOT NULL)" + t.index ["role_id"], name: "index_users_on_role_id", where: "(role_id IS NOT NULL)" end create_table "web_push_subscriptions", force: :cascade do |t| @@ -1085,6 +1115,7 @@ ActiveRecord::Schema.define(version: 2022_06_06_044941) do 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_filter_keywords", "custom_filters", on_delete: :cascade add_foreign_key "custom_filters", "accounts", on_delete: :cascade add_foreign_key "devices", "accounts", on_delete: :cascade add_foreign_key "devices", "oauth_access_tokens", column: "access_token_id", on_delete: :cascade @@ -1148,11 +1179,14 @@ ActiveRecord::Schema.define(version: 2022_06_06_044941) do add_foreign_key "statuses", "statuses", column: "reblog_of_id", on_delete: :cascade add_foreign_key "statuses_tags", "statuses", on_delete: :cascade add_foreign_key "statuses_tags", "tags", name: "fk_3081861e21", on_delete: :cascade + add_foreign_key "tag_follows", "accounts", on_delete: :cascade + add_foreign_key "tag_follows", "tags", on_delete: :cascade add_foreign_key "tombstones", "accounts", on_delete: :cascade add_foreign_key "user_invite_requests", "users", on_delete: :cascade add_foreign_key "users", "accounts", name: "fk_50500f500d", on_delete: :cascade add_foreign_key "users", "invites", on_delete: :nullify add_foreign_key "users", "oauth_applications", column: "created_by_application_id", on_delete: :nullify + add_foreign_key "users", "user_roles", column: "role_id", on_delete: :nullify add_foreign_key "web_push_subscriptions", "oauth_access_tokens", column: "access_token_id", on_delete: :cascade add_foreign_key "web_push_subscriptions", "users", on_delete: :cascade add_foreign_key "web_settings", "users", name: "fk_11910667b2", on_delete: :cascade diff --git a/db/seeds.rb b/db/seeds.rb index 0bfb5d0db..1ca300de7 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,11 +1,5 @@ -Doorkeeper::Application.create!(name: 'Web', superapp: true, redirect_uri: Doorkeeper.configuration.native_redirect_uri, scopes: 'read write follow push') +# frozen_string_literal: true -domain = ENV['LOCAL_DOMAIN'] || Rails.configuration.x.local_domain -account = Account.find_or_initialize_by(id: -99, actor_type: 'Application', locked: true, username: domain) -account.save! - -if Rails.env.development? - admin = Account.where(username: 'admin').first_or_initialize(username: 'admin') - admin.save(validate: false) - User.where(email: "admin@#{domain}").first_or_initialize(email: "admin@#{domain}", password: 'mastodonadmin', password_confirmation: 'mastodonadmin', confirmed_at: Time.now.utc, admin: true, account: admin, agreement: true, approved: true).save! +Dir[Rails.root.join('db', 'seeds', '*.rb')].sort.each do |seed| + load seed end diff --git a/db/seeds/01_web_app.rb b/db/seeds/01_web_app.rb new file mode 100644 index 000000000..a457a883b --- /dev/null +++ b/db/seeds/01_web_app.rb @@ -0,0 +1 @@ +Doorkeeper::Application.create_with(name: 'Web', redirect_uri: Doorkeeper.configuration.native_redirect_uri, scopes: 'read write follow push').find_or_create_by(superapp: true) diff --git a/db/seeds/02_instance_actor.rb b/db/seeds/02_instance_actor.rb new file mode 100644 index 000000000..39186b273 --- /dev/null +++ b/db/seeds/02_instance_actor.rb @@ -0,0 +1 @@ +Account.create_with(actor_type: 'Application', locked: true, username: ENV['LOCAL_DOMAIN'] || Rails.configuration.x.local_domain).find_or_create_by(id: -99) diff --git a/db/seeds/03_roles.rb b/db/seeds/03_roles.rb new file mode 100644 index 000000000..7fedf0f71 --- /dev/null +++ b/db/seeds/03_roles.rb @@ -0,0 +1,9 @@ +# Pre-create base role +UserRole.everyone + +# Create default roles defined in config file +default_roles = YAML.load_file(Rails.root.join('config', 'roles.yml')) + +default_roles.each do |_, config| + UserRole.create_with(position: config['position'], permissions_as_keys: config['permissions'], highlighted: true).find_or_create_by(name: config['name']) +end diff --git a/db/seeds/04_admin.rb b/db/seeds/04_admin.rb new file mode 100644 index 000000000..a67040e4e --- /dev/null +++ b/db/seeds/04_admin.rb @@ -0,0 +1,8 @@ +if Rails.env.development? + domain = ENV['LOCAL_DOMAIN'] || Rails.configuration.x.local_domain + + admin = Account.where(username: 'admin').first_or_initialize(username: 'admin') + admin.save(validate: false) + + User.where(email: "admin@#{domain}").first_or_initialize(email: "admin@#{domain}", password: 'mastodonadmin', password_confirmation: 'mastodonadmin', confirmed_at: Time.now.utc, role: UserRole.find_by(name: 'Owner'), account: admin, agreement: true, approved: true).save! +end diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 7256d1da9..29c934453 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -54,7 +54,7 @@ module Mastodon option :email, required: true option :confirmed, type: :boolean - option :role, default: 'user', enum: %w(user moderator admin) + option :role option :reattach, type: :boolean option :force, type: :boolean desc 'create USERNAME', 'Create a new user' @@ -65,8 +65,7 @@ module Mastodon With the --confirmed option, the confirmation e-mail will be skipped and the account will be active straight away. - With the --role option one of "user", "admin" or "moderator" - can be supplied. Defaults to "user" + With the --role option, the role can be supplied. With the --reattach option, the new user will be reattached to a given existing username of an old account. If the old @@ -75,9 +74,22 @@ module Mastodon username to the new account anyway. LONG_DESC def create(username) + role_id = nil + + if options[:role] + role = UserRole.find_by(name: options[:role]) + + if role.nil? + say('Cannot find user role with that name', :red) + exit(1) + end + + role_id = role.id + end + 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, role_id: role_id, confirmed_at: options[:confirmed] ? Time.now.utc : nil, bypass_invite_request_check: true) if options[:reattach] account = Account.find_local(username) || Account.new(username: username) @@ -106,14 +118,14 @@ module Mastodon user.errors.to_h.each do |key, error| say('Failure/Error: ', :red) say(key) - say(' ' + error, :red) + say(" #{error}", :red) end exit(1) end end - option :role, enum: %w(user moderator admin) + option :role option :email option :confirm, type: :boolean option :enable, type: :boolean @@ -125,8 +137,7 @@ module Mastodon long_desc <<-LONG_DESC Modify a user account. - With the --role option, update the user's role to one of "user", - "moderator" or "admin". + With the --role option, update the user's role. With the --email option, update the user's e-mail address. With the --confirm option, mark the user's e-mail as confirmed. @@ -152,8 +163,14 @@ module Mastodon end if options[:role] - user.admin = options[:role] == 'admin' - user.moderator = options[:role] == 'moderator' + role = UserRole.find_by(name: options[:role]) + + if role.nil? + say('Cannot find user role with that name', :red) + exit(1) + end + + user.role_id = role.id end password = SecureRandom.hex if options[:reset_password] @@ -172,7 +189,7 @@ module Mastodon user.errors.to_h.each do |key, error| say('Failure/Error: ', :red) say(key) - say(' ' + error, :red) + say(" #{error}", :red) end exit(1) @@ -319,7 +336,7 @@ module Mastodon unless skip_domains.empty? say('The following domains were not available during the check:', :yellow) - skip_domains.each { |domain| say(' ' + domain) } + skip_domains.each { |domain| say(" #{domain}") } end end diff --git a/lib/simple_navigation/item_extensions.rb b/lib/simple_navigation/item_extensions.rb new file mode 100644 index 000000000..28af37a18 --- /dev/null +++ b/lib/simple_navigation/item_extensions.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module SimpleNavigation + module ItemExtensions + def url + if @url.nil? && @sub_navigation + @sub_navigation.items.first.url + else + @url + end + end + end +end + +SimpleNavigation::Item.prepend(SimpleNavigation::ItemExtensions) diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 0f3b44a74..65bff6a8e 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -38,10 +38,26 @@ namespace :tests do puts 'Instance actor does not have a private key' exit(1) end + + unless Account.find_by(username: 'user', domain: nil).custom_filters.map { |filter| filter.keywords.pluck(:keyword) } == [['test'], ['take']] + puts 'CustomFilterKeyword records not created as expected' + exit(1) + end + end + + desc 'Populate the database with test data for 2.4.3' + task populate_v2_4_3: :environment do # rubocop:disable Naming/VariableNumber + ActiveRecord::Base.connection.execute(<<~SQL) + INSERT INTO "custom_filters" + (id, account_id, phrase, context, whole_word, irreversible, created_at, updated_at) + VALUES + (1, 2, 'test', '{ "home", "public" }', true, true, now(), now()), + (2, 2, 'take', '{ "home" }', false, false, now(), now()); + SQL end desc 'Populate the database with test data for 2.4.0' - task populate_v2_4: :environment do + task populate_v2_4: :environment do # rubocop:disable Naming/VariableNumber ActiveRecord::Base.connection.execute(<<~SQL) INSERT INTO "settings" (id, thing_type, thing_id, var, value, created_at, updated_at) diff --git a/package.json b/package.json index 620c8c17c..0a83c1496 100644 --- a/package.json +++ b/package.json @@ -24,13 +24,13 @@ }, "private": true, "dependencies": { - "@babel/core": "^7.18.5", - "@babel/plugin-proposal-decorators": "^7.18.2", - "@babel/plugin-transform-react-inline-elements": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.18.5", - "@babel/preset-env": "^7.18.2", - "@babel/preset-react": "^7.17.12", - "@babel/runtime": "^7.18.3", + "@babel/core": "^7.18.9", + "@babel/plugin-proposal-decorators": "^7.18.9", + "@babel/plugin-transform-react-inline-elements": "^7.18.6", + "@babel/plugin-transform-runtime": "^7.18.9", + "@babel/preset-env": "^7.18.9", + "@babel/preset-react": "^7.18.6", + "@babel/runtime": "^7.18.9", "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^0.5.7", "@rails/ujs": "^6.1.6", @@ -47,6 +47,7 @@ "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "blurhash": "^1.1.5", "classnames": "^2.3.1", + "cocoon-js-vanilla": "^1.2.0", "color-blend": "^3.0.1", "compression-webpack-plugin": "^6.1.1", "cross-env": "^7.0.3", @@ -65,7 +66,7 @@ "fuzzysort": "^1.9.0", "glob": "^8.0.3", "history": "^4.10.1", - "http-link-header": "^1.0.4", + "http-link-header": "^1.0.5", "immutable": "^4.1.0", "imports-loader": "^1.2.0", "intersection-observer": "^0.12.2", @@ -74,9 +75,10 @@ "intl-relativeformat": "^6.4.3", "is-nan": "^1.3.2", "js-yaml": "^4.1.0", + "jsdom": "^20.0.0", "lodash": "^4.17.21", "mark-loader": "^0.1.6", - "marky": "^1.2.4", + "marky": "^1.2.5", "mini-css-extract-plugin": "^1.6.2", "mkdirp": "^1.0.4", "npmlog": "^6.0.2", @@ -103,14 +105,14 @@ "react-notification": "^6.8.5", "react-overlays": "^0.9.3", "react-redux": "^7.2.8", - "react-redux-loading-bar": "^4.0.8", + "react-redux-loading-bar": "^5.0.4", "react-router-dom": "^4.1.1", "react-router-scroll-4": "^1.0.0-beta.1", - "react-select": "^5.3.2", + "react-select": "^5.4.0", "react-sparklines": "^1.7.0", "react-swipeable-views": "^0.14.0", "react-textarea-autosize": "^8.3.4", - "react-toggle": "^4.1.2", + "react-toggle": "^4.1.3", "redis": "^4.0.6 <4.1.0", "redux": "^4.2.0", "redux-immutable": "^4.0.0", @@ -120,7 +122,7 @@ "requestidlecallback": "^0.3.0", "reselect": "^4.1.6", "rimraf": "^3.0.2", - "sass": "^1.52.3", + "sass": "^1.53.0", "sass-loader": "^10.2.0", "stacktrace-js": "^2.0.2", "stringz": "^2.1.0", @@ -137,20 +139,20 @@ "webpack-cli": "^3.3.12", "webpack-merge": "^5.8.0", "wicg-inert": "^3.1.2", - "ws": "^8.8.0" + "ws": "^8.8.1" }, "devDependencies": { - "@babel/eslint-parser": "^7.18.2", + "@babel/eslint-parser": "^7.18.9", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^12.1.5", - "babel-jest": "^28.1.1", + "babel-jest": "^28.1.3", "eslint": "^7.32.0", "eslint-plugin-import": "~2.26.0", - "eslint-plugin-jsx-a11y": "~6.5.1", + "eslint-plugin-jsx-a11y": "~6.6.0", "eslint-plugin-promise": "~6.0.0", - "eslint-plugin-react": "~7.30.0", - "jest": "^28.1.1", - "jest-environment-jsdom": "^28.1.1", + "eslint-plugin-react": "~7.30.1", + "jest": "^28.1.3", + "jest-environment-jsdom": "^28.1.3", "postcss-scss": "^4.0.4", "prettier": "^2.7.1", "raf": "^3.4.1", diff --git a/spec/controllers/admin/account_moderation_notes_controller_spec.rb b/spec/controllers/admin/account_moderation_notes_controller_spec.rb index 410ce6543..d3f3263f8 100644 --- a/spec/controllers/admin/account_moderation_notes_controller_spec.rb +++ b/spec/controllers/admin/account_moderation_notes_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Admin::AccountModerationNotesController, type: :controller do render_views - let(:user) { Fabricate(:user, admin: true) } + let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } let(:target_account) { Fabricate(:account) } before do diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index 1779fb7c0..1bd51a0c8 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Admin::AccountsController, type: :controller do before { sign_in current_user, scope: :user } describe 'GET #index' do - let(:current_user) { Fabricate(:user, admin: true) } + let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } around do |example| default_per_page = Account.default_per_page @@ -60,7 +60,7 @@ RSpec.describe Admin::AccountsController, type: :controller do end describe 'GET #show' do - let(:current_user) { Fabricate(:user, admin: true) } + let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } let(:account) { Fabricate(:account) } it 'returns http success' do @@ -72,15 +72,15 @@ RSpec.describe Admin::AccountsController, type: :controller do describe 'POST #memorialize' do subject { post :memorialize, params: { id: account.id } } - let(:current_user) { Fabricate(:user, admin: current_user_admin) } + let(:current_user) { Fabricate(:user, role: current_role) } let(:account) { user.account } - let(:user) { Fabricate(:user, admin: target_user_admin) } + let(:user) { Fabricate(:user, role: target_role) } context 'when user is admin' do - let(:current_user_admin) { true } + let(:current_role) { UserRole.find_by(name: 'Admin') } context 'when target user is admin' do - let(:target_user_admin) { true } + let(:target_role) { UserRole.find_by(name: 'Admin') } it 'fails to memorialize account' do is_expected.to have_http_status :forbidden @@ -89,7 +89,7 @@ RSpec.describe Admin::AccountsController, type: :controller do end context 'when target user is not admin' do - let(:target_user_admin) { false } + let(:target_role) { UserRole.find_by(name: 'Moderator') } it 'succeeds in memorializing account' do is_expected.to redirect_to admin_account_path(account.id) @@ -99,10 +99,10 @@ RSpec.describe Admin::AccountsController, type: :controller do end context 'when user is not admin' do - let(:current_user_admin) { false } + let(:current_role) { UserRole.find_by(name: 'Moderator') } context 'when target user is admin' do - let(:target_user_admin) { true } + let(:target_role) { UserRole.find_by(name: 'Admin') } it 'fails to memorialize account' do is_expected.to have_http_status :forbidden @@ -111,7 +111,7 @@ RSpec.describe Admin::AccountsController, type: :controller do end context 'when target user is not admin' do - let(:target_user_admin) { false } + let(:target_role) { UserRole.find_by(name: 'Moderator') } it 'fails to memorialize account' do is_expected.to have_http_status :forbidden @@ -124,12 +124,12 @@ RSpec.describe Admin::AccountsController, type: :controller do describe 'POST #enable' do subject { post :enable, params: { id: account.id } } - let(:current_user) { Fabricate(:user, admin: admin) } + let(:current_user) { Fabricate(:user, role: role) } let(:account) { user.account } let(:user) { Fabricate(:user, disabled: true) } context 'when user is admin' do - let(:admin) { true } + let(:role) { UserRole.find_by(name: 'Admin') } it 'succeeds in enabling account' do is_expected.to redirect_to admin_account_path(account.id) @@ -138,7 +138,7 @@ RSpec.describe Admin::AccountsController, type: :controller do end context 'when user is not admin' do - let(:admin) { false } + let(:role) { UserRole.everyone } it 'fails to enable account' do is_expected.to have_http_status :forbidden @@ -150,19 +150,23 @@ RSpec.describe Admin::AccountsController, type: :controller do describe 'POST #redownload' do subject { post :redownload, params: { id: account.id } } - let(:current_user) { Fabricate(:user, admin: admin) } - let(:account) { Fabricate(:account) } + let(:current_user) { Fabricate(:user, role: role) } + let(:account) { Fabricate(:account, domain: 'example.com') } + + before do + allow_any_instance_of(ResolveAccountService).to receive(:call) + end context 'when user is admin' do - let(:admin) { true } + let(:role) { UserRole.find_by(name: 'Admin') } - it 'succeeds in redownloadin' do + it 'succeeds in redownloading' do is_expected.to redirect_to admin_account_path(account.id) end end context 'when user is not admin' do - let(:admin) { false } + let(:role) { UserRole.everyone } it 'fails to redownload' do is_expected.to have_http_status :forbidden @@ -173,11 +177,11 @@ RSpec.describe Admin::AccountsController, type: :controller do describe 'POST #remove_avatar' do subject { post :remove_avatar, params: { id: account.id } } - let(:current_user) { Fabricate(:user, admin: admin) } + let(:current_user) { Fabricate(:user, role: role) } let(:account) { Fabricate(:account) } context 'when user is admin' do - let(:admin) { true } + let(:role) { UserRole.find_by(name: 'Admin') } it 'succeeds in removing avatar' do is_expected.to redirect_to admin_account_path(account.id) @@ -185,7 +189,7 @@ RSpec.describe Admin::AccountsController, type: :controller do end context 'when user is not admin' do - let(:admin) { false } + let(:role) { UserRole.everyone } it 'fails to remove avatar' do is_expected.to have_http_status :forbidden @@ -196,12 +200,12 @@ RSpec.describe Admin::AccountsController, type: :controller do describe 'POST #unblock_email' do subject { post :unblock_email, params: { id: account.id } } - let(:current_user) { Fabricate(:user, admin: admin) } + let(:current_user) { Fabricate(:user, role: role) } 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 } + let(:role) { UserRole.find_by(name: 'Admin') } it 'succeeds in removing email blocks' do expect { subject }.to change { CanonicalEmailBlock.where(reference_account: account).count }.from(1).to(0) @@ -214,7 +218,7 @@ RSpec.describe Admin::AccountsController, type: :controller do end context 'when user is not admin' do - let(:admin) { false } + let(:role) { UserRole.everyone } it 'fails to remove avatar' do subject diff --git a/spec/controllers/admin/action_logs_controller_spec.rb b/spec/controllers/admin/action_logs_controller_spec.rb index 4720ed2e2..c1957258f 100644 --- a/spec/controllers/admin/action_logs_controller_spec.rb +++ b/spec/controllers/admin/action_logs_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Admin::ActionLogsController, type: :controller do describe 'GET #index' do it 'returns 200' do - sign_in Fabricate(:user, admin: true) + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) get :index, params: { page: 1 } expect(response).to have_http_status(200) diff --git a/spec/controllers/admin/base_controller_spec.rb b/spec/controllers/admin/base_controller_spec.rb index 9ac833623..44be91951 100644 --- a/spec/controllers/admin/base_controller_spec.rb +++ b/spec/controllers/admin/base_controller_spec.rb @@ -5,13 +5,14 @@ require 'rails_helper' describe Admin::BaseController, type: :controller do controller do def success + authorize :dashboard, :index? render 'admin/reports/show' end end it 'requires administrator or moderator' do routes.draw { get 'success' => 'admin/base#success' } - sign_in(Fabricate(:user, admin: false, moderator: false)) + sign_in(Fabricate(:user)) get :success expect(response).to have_http_status(:forbidden) @@ -19,14 +20,14 @@ describe Admin::BaseController, type: :controller do it 'renders admin layout as a moderator' do routes.draw { get 'success' => 'admin/base#success' } - sign_in(Fabricate(:user, moderator: true)) + sign_in(Fabricate(:user, role: UserRole.find_by(name: 'Moderator'))) get :success expect(response).to render_template layout: 'admin' end it 'renders admin layout as an admin' do routes.draw { get 'success' => 'admin/base#success' } - sign_in(Fabricate(:user, admin: true)) + sign_in(Fabricate(:user, role: UserRole.find_by(name: 'Admin'))) get :success expect(response).to render_template layout: 'admin' end diff --git a/spec/controllers/admin/change_email_controller_spec.rb b/spec/controllers/admin/change_email_controller_spec.rb index e7f3f7c97..cf8a27d39 100644 --- a/spec/controllers/admin/change_email_controller_spec.rb +++ b/spec/controllers/admin/change_email_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Admin::ChangeEmailsController, type: :controller do render_views - let(:admin) { Fabricate(:user, admin: true) } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do sign_in admin diff --git a/spec/controllers/admin/confirmations_controller_spec.rb b/spec/controllers/admin/confirmations_controller_spec.rb index 5b4f7e925..6268903c4 100644 --- a/spec/controllers/admin/confirmations_controller_spec.rb +++ b/spec/controllers/admin/confirmations_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Admin::ConfirmationsController, type: :controller do render_views before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'POST #create' do diff --git a/spec/controllers/admin/custom_emojis_controller_spec.rb b/spec/controllers/admin/custom_emojis_controller_spec.rb index a8d96948c..06cd0c22d 100644 --- a/spec/controllers/admin/custom_emojis_controller_spec.rb +++ b/spec/controllers/admin/custom_emojis_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Admin::CustomEmojisController do render_views - let(:user) { Fabricate(:user, admin: true) } + let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do sign_in user, scope: :user diff --git a/spec/controllers/admin/dashboard_controller_spec.rb b/spec/controllers/admin/dashboard_controller_spec.rb index 7824854f9..6231a09a2 100644 --- a/spec/controllers/admin/dashboard_controller_spec.rb +++ b/spec/controllers/admin/dashboard_controller_spec.rb @@ -12,7 +12,7 @@ describe Admin::DashboardController, type: :controller do 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) + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) end it 'returns 200' do diff --git a/spec/controllers/admin/disputes/appeals_controller_spec.rb b/spec/controllers/admin/disputes/appeals_controller_spec.rb index 6a06f9406..712657791 100644 --- a/spec/controllers/admin/disputes/appeals_controller_spec.rb +++ b/spec/controllers/admin/disputes/appeals_controller_spec.rb @@ -14,7 +14,7 @@ RSpec.describe Admin::Disputes::AppealsController, type: :controller do end describe 'POST #approve' do - let(:current_user) { Fabricate(:user, admin: true) } + let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do allow(UserMailer).to receive(:appeal_approved).and_return(double('email', deliver_later: nil)) @@ -35,7 +35,7 @@ RSpec.describe Admin::Disputes::AppealsController, type: :controller do end describe 'POST #reject' do - let(:current_user) { Fabricate(:user, admin: true) } + let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do allow(UserMailer).to receive(:appeal_rejected).and_return(double('email', deliver_later: nil)) diff --git a/spec/controllers/admin/domain_allows_controller_spec.rb b/spec/controllers/admin/domain_allows_controller_spec.rb index 8bacdd3e4..6c4e67787 100644 --- a/spec/controllers/admin/domain_allows_controller_spec.rb +++ b/spec/controllers/admin/domain_allows_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Admin::DomainAllowsController, type: :controller do render_views before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'GET #new' do diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb index a35b2fb3b..98cda5004 100644 --- a/spec/controllers/admin/domain_blocks_controller_spec.rb +++ b/spec/controllers/admin/domain_blocks_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do render_views before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'GET #new' do diff --git a/spec/controllers/admin/email_domain_blocks_controller_spec.rb b/spec/controllers/admin/email_domain_blocks_controller_spec.rb index cf194579d..e9cef4a94 100644 --- a/spec/controllers/admin/email_domain_blocks_controller_spec.rb +++ b/spec/controllers/admin/email_domain_blocks_controller_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Admin::EmailDomainBlocksController, type: :controller do render_views before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'GET #index' do diff --git a/spec/controllers/admin/export_domain_allows_controller_spec.rb b/spec/controllers/admin/export_domain_allows_controller_spec.rb index f6275c2d6..1e1a5ae7d 100644 --- a/spec/controllers/admin/export_domain_allows_controller_spec.rb +++ b/spec/controllers/admin/export_domain_allows_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Admin::ExportDomainAllowsController, type: :controller do render_views before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'GET #export' do diff --git a/spec/controllers/admin/export_domain_blocks_controller_spec.rb b/spec/controllers/admin/export_domain_blocks_controller_spec.rb index 0493df859..8697e0c21 100644 --- a/spec/controllers/admin/export_domain_blocks_controller_spec.rb +++ b/spec/controllers/admin/export_domain_blocks_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Admin::ExportDomainBlocksController, type: :controller do render_views before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'GET #export' do diff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb index 53427b874..337f7a80c 100644 --- a/spec/controllers/admin/instances_controller_spec.rb +++ b/spec/controllers/admin/instances_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Admin::InstancesController, type: :controller do render_views - let(:current_user) { Fabricate(:user, admin: true) } + let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } let!(:account) { Fabricate(:account, domain: 'popular') } let!(:account2) { Fabricate(:account, domain: 'popular') } @@ -35,11 +35,11 @@ RSpec.describe Admin::InstancesController, type: :controller do describe 'DELETE #destroy' do subject { delete :destroy, params: { id: Instance.first.id } } - let(:current_user) { Fabricate(:user, admin: admin) } + let(:current_user) { Fabricate(:user, role: role) } let(:account) { Fabricate(:account) } context 'when user is admin' do - let(:admin) { true } + let(:role) { UserRole.find_by(name: 'Admin') } it 'succeeds in purging instance' do is_expected.to redirect_to admin_instances_path @@ -47,7 +47,7 @@ RSpec.describe Admin::InstancesController, type: :controller do end context 'when user is not admin' do - let(:admin) { false } + let(:role) { nil } it 'fails to purge instance' do is_expected.to have_http_status :forbidden diff --git a/spec/controllers/admin/invites_controller_spec.rb b/spec/controllers/admin/invites_controller_spec.rb index 449a699e4..1fb488742 100644 --- a/spec/controllers/admin/invites_controller_spec.rb +++ b/spec/controllers/admin/invites_controller_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe Admin::InvitesController do render_views - let(:user) { Fabricate(:user, admin: true) } + let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do sign_in user, scope: :user diff --git a/spec/controllers/admin/report_notes_controller_spec.rb b/spec/controllers/admin/report_notes_controller_spec.rb index c0013f41a..fa7572d18 100644 --- a/spec/controllers/admin/report_notes_controller_spec.rb +++ b/spec/controllers/admin/report_notes_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Admin::ReportNotesController do render_views - let(:user) { Fabricate(:user, admin: true) } + let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do sign_in user, scope: :user diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb index d421f0739..4cd1524bf 100644 --- a/spec/controllers/admin/reports_controller_spec.rb +++ b/spec/controllers/admin/reports_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Admin::ReportsController do render_views - let(:user) { Fabricate(:user, admin: true) } + let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do sign_in user, scope: :user end diff --git a/spec/controllers/admin/resets_controller_spec.rb b/spec/controllers/admin/resets_controller_spec.rb index 28510b5af..aeb172318 100644 --- a/spec/controllers/admin/resets_controller_spec.rb +++ b/spec/controllers/admin/resets_controller_spec.rb @@ -5,7 +5,7 @@ describe Admin::ResetsController do let(:account) { Fabricate(:account) } before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'POST #create' do diff --git a/spec/controllers/admin/roles_controller_spec.rb b/spec/controllers/admin/roles_controller_spec.rb index 8e0de73cb..8ff891205 100644 --- a/spec/controllers/admin/roles_controller_spec.rb +++ b/spec/controllers/admin/roles_controller_spec.rb @@ -3,31 +3,247 @@ require 'rails_helper' describe Admin::RolesController do render_views - let(:admin) { Fabricate(:user, admin: true) } + let(:permissions) { UserRole::Flags::NONE } + let(:current_role) { UserRole.create(name: 'Foo', permissions: permissions, position: 10) } + let(:current_user) { Fabricate(:user, role: current_role) } before do - sign_in admin, scope: :user + sign_in current_user, scope: :user end - describe 'POST #promote' do - subject { post :promote, params: { account_id: user.account_id } } + describe 'GET #index' do + before do + get :index + end + + context 'when user does not have permission to manage roles' do + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + end - let(:user) { Fabricate(:user, moderator: false, admin: false) } + context 'when user has permission to manage roles' do + let(:permissions) { UserRole::FLAGS[:manage_roles] } - it 'promotes user' do - expect(subject).to redirect_to admin_account_path(user.account_id) - expect(user.reload).to be_moderator + it 'returns http success' do + expect(response).to have_http_status(:success) + end end end - describe 'POST #demote' do - subject { post :demote, params: { account_id: user.account_id } } + describe 'GET #new' do + before do + get :new + end + + context 'when user does not have permission to manage roles' do + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + end + + context 'when user has permission to manage roles' do + let(:permissions) { UserRole::FLAGS[:manage_roles] } + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + end + end + + describe 'POST #create' do + let(:selected_position) { 1 } + let(:selected_permissions_as_keys) { %w(manage_roles) } + + before do + post :create, params: { user_role: { name: 'Bar', position: selected_position, permissions_as_keys: selected_permissions_as_keys } } + end + + context 'when user has permission to manage roles' do + let(:permissions) { UserRole::FLAGS[:manage_roles] } + + context 'when new role\'s does not elevate above the user\'s role' do + let(:selected_position) { 1 } + let(:selected_permissions_as_keys) { %w(manage_roles) } + + it 'redirects to roles page' do + expect(response).to redirect_to(admin_roles_path) + end + + it 'creates new role' do + expect(UserRole.find_by(name: 'Bar')).to_not be_nil + end + end + + context 'when new role\'s position is higher than user\'s role' do + let(:selected_position) { 100 } + let(:selected_permissions_as_keys) { %w(manage_roles) } + + it 'renders new template' do + expect(response).to render_template(:new) + end + + it 'does not create new role' do + expect(UserRole.find_by(name: 'Bar')).to be_nil + end + end + + context 'when new role has permissions the user does not have' do + let(:selected_position) { 1 } + let(:selected_permissions_as_keys) { %w(manage_roles manage_users manage_reports) } + + it 'renders new template' do + expect(response).to render_template(:new) + end + + it 'does not create new role' do + expect(UserRole.find_by(name: 'Bar')).to be_nil + end + end + + context 'when user has administrator permission' do + let(:permissions) { UserRole::FLAGS[:administrator] } + + let(:selected_position) { 1 } + let(:selected_permissions_as_keys) { %w(manage_roles manage_users manage_reports) } + + it 'redirects to roles page' do + expect(response).to redirect_to(admin_roles_path) + end + + it 'creates new role' do + expect(UserRole.find_by(name: 'Bar')).to_not be_nil + end + end + end + end + + describe 'GET #edit' do + let(:role_position) { 8 } + let(:role) { UserRole.create(name: 'Bar', permissions: UserRole::FLAGS[:manage_users], position: role_position) } + + before do + get :edit, params: { id: role.id } + end + + context 'when user does not have permission to manage roles' do + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + end + + context 'when user has permission to manage roles' do + let(:permissions) { UserRole::FLAGS[:manage_roles] } + + context 'when user outranks the role' do + it 'returns http success' do + expect(response).to have_http_status(:success) + end + end + + context 'when role outranks user' do + let(:role_position) { current_role.position + 1 } + + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + end + end + end + + describe 'PUT #update' do + let(:role_position) { 8 } + let(:role_permissions) { UserRole::FLAGS[:manage_users] } + let(:role) { UserRole.create(name: 'Bar', permissions: role_permissions, position: role_position) } + + let(:selected_position) { 8 } + let(:selected_permissions_as_keys) { %w(manage_users) } + + before do + put :update, params: { id: role.id, user_role: { name: 'Baz', position: selected_position, permissions_as_keys: selected_permissions_as_keys } } + end + + context 'when user does not have permission to manage roles' do + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + + it 'does not update the role' do + expect(role.reload.name).to eq 'Bar' + end + end + + context 'when user has permission to manage roles' do + let(:permissions) { UserRole::FLAGS[:manage_roles] } + + context 'when role has permissions the user doesn\'t' do + it 'renders edit template' do + expect(response).to render_template(:edit) + end + + it 'does not update the role' do + expect(role.reload.name).to eq 'Bar' + end + end + + context 'when user has all permissions of the role' do + let(:permissions) { UserRole::FLAGS[:manage_roles] | UserRole::FLAGS[:manage_users] } + + context 'when user outranks the role' do + it 'redirects to roles page' do + expect(response).to redirect_to(admin_roles_path) + end + + it 'updates the role' do + expect(role.reload.name).to eq 'Baz' + end + end + + context 'when role outranks user' do + let(:role_position) { current_role.position + 1 } + + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + + it 'does not update the role' do + expect(role.reload.name).to eq 'Bar' + end + end + end + end + end + + describe 'DELETE #destroy' do + let(:role_position) { 8 } + let(:role) { UserRole.create(name: 'Bar', permissions: UserRole::FLAGS[:manage_users], position: role_position) } + + before do + delete :destroy, params: { id: role.id } + end + + context 'when user does not have permission to manage roles' do + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + end + + context 'when user has permission to manage roles' do + let(:permissions) { UserRole::FLAGS[:manage_roles] } + + context 'when user outranks the role' do + it 'redirects to roles page' do + expect(response).to redirect_to(admin_roles_path) + end + end - let(:user) { Fabricate(:user, moderator: true, admin: false) } + context 'when role outranks user' do + let(:role_position) { current_role.position + 1 } - it 'demotes user' do - expect(subject).to redirect_to admin_account_path(user.account_id) - expect(user.reload).not_to be_moderator + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + end end end end diff --git a/spec/controllers/admin/settings_controller_spec.rb b/spec/controllers/admin/settings_controller_spec.rb index 6cf0ee20a..46749f76c 100644 --- a/spec/controllers/admin/settings_controller_spec.rb +++ b/spec/controllers/admin/settings_controller_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Admin::SettingsController, type: :controller do describe 'When signed in as an admin' do before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'GET #edit' do diff --git a/spec/controllers/admin/statuses_controller_spec.rb b/spec/controllers/admin/statuses_controller_spec.rb index de32fd18e..227688e23 100644 --- a/spec/controllers/admin/statuses_controller_spec.rb +++ b/spec/controllers/admin/statuses_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Admin::StatusesController do render_views - let(:user) { Fabricate(:user, admin: true) } + let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } let(:account) { Fabricate(:account) } let!(:status) { Fabricate(:status, account: account) } let(:media_attached_status) { Fabricate(:status, account: account, sensitive: !sensitive) } diff --git a/spec/controllers/admin/tags_controller_spec.rb b/spec/controllers/admin/tags_controller_spec.rb index 85c801a9c..52fd09eb1 100644 --- a/spec/controllers/admin/tags_controller_spec.rb +++ b/spec/controllers/admin/tags_controller_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Admin::TagsController, type: :controller do render_views before do - sign_in Fabricate(:user, admin: true) + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) end describe 'GET #show' do diff --git a/spec/controllers/admin/users/roles_controller.rb b/spec/controllers/admin/users/roles_controller.rb new file mode 100644 index 000000000..bd6a3fa67 --- /dev/null +++ b/spec/controllers/admin/users/roles_controller.rb @@ -0,0 +1,81 @@ +require 'rails_helper' + +describe Admin::Users::RolesController do + render_views + + let(:current_role) { UserRole.create(name: 'Foo', permissions: UserRole::FLAGS[:manage_roles], position: 10) } + let(:current_user) { Fabricate(:user, role: current_role) } + + let(:previous_role) { nil } + let(:user) { Fabricate(:user, role: previous_role) } + + before do + sign_in current_user, scope: :user + end + + describe 'GET #show' do + before do + get :show, params: { user_id: user.id } + end + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + + context 'when target user is higher ranked than current user' do + let(:previous_role) { UserRole.create(name: 'Baz', permissions: UserRole::FLAGS[:administrator], position: 100) } + + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + end + end + + describe 'PUT #update' do + let(:selected_role) { UserRole.create(name: 'Bar', permissions: permissions, position: position) } + + before do + put :update, params: { user_id: user.id, user: { role_id: selected_role.id } } + end + + context do + let(:permissions) { UserRole::FLAGS[:manage_roles] } + let(:position) { 1 } + + it 'updates user role' do + expect(user.reload.role_id).to eq selected_role&.id + end + + it 'redirects back to account page' do + expect(response).to redirect_to(admin_account_path(user.account_id)) + end + end + + context 'when selected role has higher position than current user\'s role' do + let(:permissions) { UserRole::FLAGS[:administrator] } + let(:position) { 100 } + + it 'does not update user role' do + expect(user.reload.role_id).to eq previous_role&.id + end + + it 'renders edit form' do + expect(response).to render_template(:show) + end + end + + context 'when target user is higher ranked than current user' do + let(:previous_role) { UserRole.create(name: 'Baz', permissions: UserRole::FLAGS[:administrator], position: 100) } + let(:permissions) { UserRole::FLAGS[:manage_roles] } + let(:position) { 1 } + + it 'does not update user role' do + expect(user.reload.role_id).to eq previous_role&.id + end + + it 'returns http forbidden' do + expect(response).to have_http_status(:forbidden) + end + end + end +end diff --git a/spec/controllers/admin/two_factor_authentications_controller_spec.rb b/spec/controllers/admin/users/two_factor_authentications_controller_spec.rb index c65095729..e56264ef6 100644 --- a/spec/controllers/admin/two_factor_authentications_controller_spec.rb +++ b/spec/controllers/admin/users/two_factor_authentications_controller_spec.rb @@ -1,12 +1,13 @@ require 'rails_helper' require 'webauthn/fake_client' -describe Admin::TwoFactorAuthenticationsController do +describe Admin::Users::TwoFactorAuthenticationsController do render_views let(:user) { Fabricate(:user) } + before do - sign_in Fabricate(:user, admin: true), scope: :user + sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end describe 'DELETE #destroy' do 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 601290b82..199395f55 100644 --- a/spec/controllers/api/v1/admin/account_actions_controller_spec.rb +++ b/spec/controllers/api/v1/admin/account_actions_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::Admin::AccountActionsController, type: :controller do render_views - let(:role) { 'moderator' } + let(:role) { UserRole.find_by(name: 'Moderator') } 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) } @@ -22,7 +22,7 @@ RSpec.describe Api::V1::Admin::AccountActionsController, type: :controller do end shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { wrong_role } + let(:role) { UserRole.find_by(name: wrong_role) } it 'returns http forbidden' do expect(response).to have_http_status(403) @@ -35,7 +35,7 @@ RSpec.describe Api::V1::Admin::AccountActionsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) diff --git a/spec/controllers/api/v1/admin/accounts_controller_spec.rb b/spec/controllers/api/v1/admin/accounts_controller_spec.rb index b69595f7e..cd38030e0 100644 --- a/spec/controllers/api/v1/admin/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/admin/accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::Admin::AccountsController, type: :controller do render_views - let(:role) { 'moderator' } + let(:role) { UserRole.find_by(name: 'Moderator') } 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) } @@ -22,7 +22,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { wrong_role } + let(:role) { UserRole.find_by(name: wrong_role) } it 'returns http forbidden' do expect(response).to have_http_status(403) @@ -46,7 +46,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' [ [{ active: 'true', local: 'true', staff: 'true' }, [:admin_account]], @@ -77,7 +77,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -91,7 +91,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -109,7 +109,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -127,7 +127,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -145,7 +145,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -163,7 +163,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -181,7 +181,7 @@ RSpec.describe Api::V1::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) diff --git a/spec/controllers/api/v1/admin/domain_allows_controller_spec.rb b/spec/controllers/api/v1/admin/domain_allows_controller_spec.rb new file mode 100644 index 000000000..26a391a60 --- /dev/null +++ b/spec/controllers/api/v1/admin/domain_allows_controller_spec.rb @@ -0,0 +1,118 @@ +require 'rails_helper' + +RSpec.describe Api::V1::Admin::DomainAllowsController, type: :controller do + render_views + + let(:role) { UserRole.find_by(name: 'Admin') } + 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) } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + expect(response).to have_http_status(403) + end + end + + shared_examples 'forbidden for wrong role' do |wrong_role| + let(:role) { UserRole.find_by(name: wrong_role) } + + it 'returns http forbidden' do + expect(response).to have_http_status(403) + end + end + + describe 'GET #index' do + let!(:domain_allow) { Fabricate(:domain_allow) } + + before do + get :index + end + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'returns the expected domain allows' do + json = body_as_json + expect(json.length).to eq 1 + expect(json[0][:id].to_i).to eq domain_allow.id + end + end + + describe 'GET #show' do + let!(:domain_allow) { Fabricate(:domain_allow) } + + before do + get :show, params: { id: domain_allow.id } + end + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'returns expected domain name' do + json = body_as_json + expect(json[:domain]).to eq domain_allow.domain + end + end + + describe 'DELETE #destroy' do + let!(:domain_allow) { Fabricate(:domain_allow) } + + before do + delete :destroy, params: { id: domain_allow.id } + end + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'deletes the block' do + expect(DomainAllow.find_by(id: domain_allow.id)).to be_nil + end + end + + describe 'POST #create' do + let!(:domain_allow) { Fabricate(:domain_allow, domain: 'example.com') } + + before do + post :create, params: { domain: 'foo.bar.com' } + end + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'returns expected domain name' do + json = body_as_json + expect(json[:domain]).to eq 'foo.bar.com' + end + + it 'creates a domain block' do + expect(DomainAllow.find_by(domain: 'foo.bar.com')).to_not be_nil + end + end +end diff --git a/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb b/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb index 196f6dc28..f12285b2a 100644 --- a/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb +++ b/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do render_views - let(:role) { 'admin' } + let(:role) { UserRole.find_by(name: 'Admin') } 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) } @@ -21,7 +21,7 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do end shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { wrong_role } + let(:role) { UserRole.find_by(name: wrong_role) } it 'returns http forbidden' do expect(response).to have_http_status(403) @@ -36,8 +36,8 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' - it_behaves_like 'forbidden for wrong role', 'moderator' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' it 'returns http success' do expect(response).to have_http_status(200) @@ -58,8 +58,8 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' - it_behaves_like 'forbidden for wrong role', 'moderator' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' it 'returns http success' do expect(response).to have_http_status(200) @@ -79,8 +79,8 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' - it_behaves_like 'forbidden for wrong role', 'moderator' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' it 'returns http success' do expect(response).to have_http_status(200) @@ -100,8 +100,8 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' - it_behaves_like 'forbidden for wrong role', 'moderator' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' it 'returns http success' do expect(response).to have_http_status(200) diff --git a/spec/controllers/api/v1/admin/reports_controller_spec.rb b/spec/controllers/api/v1/admin/reports_controller_spec.rb index b6df53048..880e72030 100644 --- a/spec/controllers/api/v1/admin/reports_controller_spec.rb +++ b/spec/controllers/api/v1/admin/reports_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V1::Admin::ReportsController, type: :controller do render_views - let(:role) { 'moderator' } + let(:role) { UserRole.find_by(name: 'Moderator') } 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) } @@ -22,7 +22,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do end shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { wrong_role } + let(:role) { UserRole.find_by(name: wrong_role) } it 'returns http forbidden' do expect(response).to have_http_status(403) @@ -35,7 +35,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -48,7 +48,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -61,7 +61,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -74,7 +74,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -87,7 +87,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) @@ -100,7 +100,7 @@ RSpec.describe Api::V1::Admin::ReportsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' it 'returns http success' do expect(response).to have_http_status(200) diff --git a/spec/controllers/api/v1/filters/keywords_controller_spec.rb b/spec/controllers/api/v1/filters/keywords_controller_spec.rb new file mode 100644 index 000000000..aecb4e41c --- /dev/null +++ b/spec/controllers/api/v1/filters/keywords_controller_spec.rb @@ -0,0 +1,142 @@ +require 'rails_helper' + +RSpec.describe Api::V1::Filters::KeywordsController, type: :controller do + render_views + + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:filter) { Fabricate(:custom_filter, account: user.account) } + let(:other_user) { Fabricate(:user) } + let(:other_filter) { Fabricate(:custom_filter, account: other_user.account) } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'GET #index' do + let(:scopes) { 'read:filters' } + let!(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } + + it 'returns http success' do + get :index, params: { filter_id: filter.id } + expect(response).to have_http_status(200) + end + + context "when trying to access another's user filters" do + it 'returns http not found' do + get :index, params: { filter_id: other_filter.id } + expect(response).to have_http_status(404) + end + end + end + + describe 'POST #create' do + let(:scopes) { 'write:filters' } + let(:filter_id) { filter.id } + + before do + post :create, params: { filter_id: filter_id, keyword: 'magic', whole_word: false } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'returns a keyword' do + json = body_as_json + expect(json[:keyword]).to eq 'magic' + expect(json[:whole_word]).to eq false + end + + it 'creates a keyword' do + filter = user.account.custom_filters.first + expect(filter).to_not be_nil + expect(filter.keywords.pluck(:keyword)).to eq ['magic'] + end + + context "when trying to add to another another's user filters" do + let(:filter_id) { other_filter.id } + + it 'returns http not found' do + expect(response).to have_http_status(404) + end + end + end + + describe 'GET #show' do + let(:scopes) { 'read:filters' } + let(:keyword) { Fabricate(:custom_filter_keyword, keyword: 'foo', whole_word: false, custom_filter: filter) } + + before do + get :show, params: { id: keyword.id } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'returns expected data' do + json = body_as_json + expect(json[:keyword]).to eq 'foo' + expect(json[:whole_word]).to eq false + end + + context "when trying to access another user's filter keyword" do + let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: other_filter) } + + it 'returns http not found' do + expect(response).to have_http_status(404) + end + end + end + + describe 'PUT #update' do + let(:scopes) { 'write:filters' } + let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } + + before do + get :update, params: { id: keyword.id, keyword: 'updated' } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'updates the keyword' do + expect(keyword.reload.keyword).to eq 'updated' + end + + context "when trying to update another user's filter keyword" do + let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: other_filter) } + + it 'returns http not found' do + expect(response).to have_http_status(404) + end + end + end + + describe 'DELETE #destroy' do + let(:scopes) { 'write:filters' } + let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } + + before do + delete :destroy, params: { id: keyword.id } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'removes the filter' do + expect { keyword.reload }.to raise_error ActiveRecord::RecordNotFound + end + + context "when trying to update another user's filter keyword" do + let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: other_filter) } + + it 'returns http not found' do + expect(response).to have_http_status(404) + end + end + end +end diff --git a/spec/controllers/api/v1/filters_controller_spec.rb b/spec/controllers/api/v1/filters_controller_spec.rb index 5948809e3..af1951f0b 100644 --- a/spec/controllers/api/v1/filters_controller_spec.rb +++ b/spec/controllers/api/v1/filters_controller_spec.rb @@ -34,7 +34,7 @@ RSpec.describe Api::V1::FiltersController, type: :controller do it 'creates a filter' do filter = user.account.custom_filters.first expect(filter).to_not be_nil - expect(filter.phrase).to eq 'magic' + expect(filter.keywords.pluck(:keyword)).to eq ['magic'] expect(filter.context).to eq %w(home) expect(filter.irreversible?).to be true expect(filter.expires_at).to be_nil @@ -42,21 +42,23 @@ RSpec.describe Api::V1::FiltersController, type: :controller do end describe 'GET #show' do - let(:scopes) { 'read:filters' } - let(:filter) { Fabricate(:custom_filter, account: user.account) } + let(:scopes) { 'read:filters' } + let(:filter) { Fabricate(:custom_filter, account: user.account) } + let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } it 'returns http success' do - get :show, params: { id: filter.id } + get :show, params: { id: keyword.id } expect(response).to have_http_status(200) end end describe 'PUT #update' do - let(:scopes) { 'write:filters' } - let(:filter) { Fabricate(:custom_filter, account: user.account) } + let(:scopes) { 'write:filters' } + let(:filter) { Fabricate(:custom_filter, account: user.account) } + let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } before do - put :update, params: { id: filter.id, phrase: 'updated' } + put :update, params: { id: keyword.id, phrase: 'updated' } end it 'returns http success' do @@ -64,16 +66,17 @@ RSpec.describe Api::V1::FiltersController, type: :controller do end it 'updates the filter' do - expect(filter.reload.phrase).to eq 'updated' + expect(keyword.reload.phrase).to eq 'updated' end end describe 'DELETE #destroy' do - let(:scopes) { 'write:filters' } - let(:filter) { Fabricate(:custom_filter, account: user.account) } + let(:scopes) { 'write:filters' } + let(:filter) { Fabricate(:custom_filter, account: user.account) } + let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } before do - delete :destroy, params: { id: filter.id } + delete :destroy, params: { id: keyword.id } end it 'returns http success' do @@ -81,7 +84,7 @@ RSpec.describe Api::V1::FiltersController, type: :controller do end it 'removes the filter' do - expect { filter.reload }.to raise_error ActiveRecord::RecordNotFound + expect { keyword.reload }.to raise_error ActiveRecord::RecordNotFound end end end diff --git a/spec/controllers/api/v1/followed_tags_controller_spec.rb b/spec/controllers/api/v1/followed_tags_controller_spec.rb new file mode 100644 index 000000000..2191350ef --- /dev/null +++ b/spec/controllers/api/v1/followed_tags_controller_spec.rb @@ -0,0 +1,23 @@ +require 'rails_helper' + +RSpec.describe Api::V1::FollowedTagsController, type: :controller do + render_views + + let(:user) { Fabricate(:user) } + let(:scopes) { 'read:follows' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + + before { allow(controller).to receive(:doorkeeper_token) { token } } + + describe 'GET #index' do + let!(:tag_follows) { Fabricate.times(5, :tag_follow, account: user.account) } + + before do + get :index, params: { limit: 1 } + end + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + end +end diff --git a/spec/controllers/api/v1/reports_controller_spec.rb b/spec/controllers/api/v1/reports_controller_spec.rb index b5baf60e1..dbc64e704 100644 --- a/spec/controllers/api/v1/reports_controller_spec.rb +++ b/spec/controllers/api/v1/reports_controller_spec.rb @@ -13,7 +13,7 @@ RSpec.describe Api::V1::ReportsController, type: :controller do end describe 'POST #create' do - let!(:admin) { Fabricate(:user, admin: true) } + let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } let(:scopes) { 'write:reports' } let(:status) { Fabricate(:status) } diff --git a/spec/controllers/api/v1/statuses_controller_spec.rb b/spec/controllers/api/v1/statuses_controller_spec.rb index 2eb30af74..4d104a198 100644 --- a/spec/controllers/api/v1/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/statuses_controller_spec.rb @@ -20,6 +20,58 @@ RSpec.describe Api::V1::StatusesController, type: :controller do get :show, params: { id: status.id } expect(response).to have_http_status(200) end + + context 'when post includes filtered terms' do + let(:status) { Fabricate(:status, text: 'this toot is about that banned word') } + + before do + user.account.custom_filters.create!(phrase: 'filter1', context: %w(home), action: :hide, keywords_attributes: [{ keyword: 'banned' }, { keyword: 'irrelevant' }]) + end + + it 'returns http success' do + get :show, params: { id: status.id } + expect(response).to have_http_status(200) + end + + it 'returns filter information' do + get :show, params: { id: status.id } + json = body_as_json + expect(json[:filtered][0]).to include({ + filter: a_hash_including({ + id: user.account.custom_filters.first.id.to_s, + title: 'filter1', + filter_action: 'hide', + }), + keyword_matches: ['banned'], + }) + end + end + + context 'when reblog includes filtered terms' do + let(:status) { Fabricate(:status, reblog: Fabricate(:status, text: 'this toot is about that banned word')) } + + before do + user.account.custom_filters.create!(phrase: 'filter1', context: %w(home), action: :hide, keywords_attributes: [{ keyword: 'banned' }, { keyword: 'irrelevant' }]) + end + + it 'returns http success' do + get :show, params: { id: status.id } + expect(response).to have_http_status(200) + end + + it 'returns filter information' do + get :show, params: { id: status.id } + json = body_as_json + expect(json[:reblog][:filtered][0]).to include({ + filter: a_hash_including({ + id: user.account.custom_filters.first.id.to_s, + title: 'filter1', + filter_action: 'hide', + }), + keyword_matches: ['banned'], + }) + end + end end describe 'GET #context' do diff --git a/spec/controllers/api/v1/tags_controller_spec.rb b/spec/controllers/api/v1/tags_controller_spec.rb new file mode 100644 index 000000000..ac42660df --- /dev/null +++ b/spec/controllers/api/v1/tags_controller_spec.rb @@ -0,0 +1,82 @@ +require 'rails_helper' + +RSpec.describe Api::V1::TagsController, type: :controller do + render_views + + let(:user) { Fabricate(:user) } + let(:scopes) { 'write:follows' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + + before { allow(controller).to receive(:doorkeeper_token) { token } } + + describe 'GET #show' do + before do + get :show, params: { id: name } + end + + context 'with existing tag' do + let!(:tag) { Fabricate(:tag) } + let(:name) { tag.name } + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + end + + context 'with non-existing tag' do + let(:name) { 'hoge' } + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + end + end + + describe 'POST #follow' do + before do + post :follow, params: { id: name } + end + + context 'with existing tag' do + let!(:tag) { Fabricate(:tag) } + let(:name) { tag.name } + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + + it 'creates follow' do + expect(TagFollow.where(tag: tag, account: user.account).exists?).to be true + end + end + + context 'with non-existing tag' do + let(:name) { 'hoge' } + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + + it 'creates follow' do + expect(TagFollow.where(tag: Tag.find_by!(name: name), account: user.account).exists?).to be true + end + end + end + + describe 'POST #unfollow' do + let!(:tag) { Fabricate(:tag, name: 'foo') } + let!(:tag_follow) { Fabricate(:tag_follow, account: user.account, tag: tag) } + + before do + post :unfollow, params: { id: tag.name } + end + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + + it 'removes the follow' do + expect(TagFollow.where(tag: tag, account: user.account).exists?).to be false + end + end +end diff --git a/spec/controllers/api/v2/admin/accounts_controller_spec.rb b/spec/controllers/api/v2/admin/accounts_controller_spec.rb index 3212ddb84..2508a9e05 100644 --- a/spec/controllers/api/v2/admin/accounts_controller_spec.rb +++ b/spec/controllers/api/v2/admin/accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe Api::V2::Admin::AccountsController, type: :controller do render_views - let(:role) { 'moderator' } + let(:role) { UserRole.find_by(name: 'Moderator') } 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) } @@ -22,7 +22,7 @@ RSpec.describe Api::V2::Admin::AccountsController, type: :controller do end shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { wrong_role } + let(:role) { UserRole.find_by(name: wrong_role) } it 'returns http forbidden' do expect(response).to have_http_status(403) @@ -46,7 +46,7 @@ RSpec.describe Api::V2::Admin::AccountsController, type: :controller do end it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', 'user' + it_behaves_like 'forbidden for wrong role', '' [ [{ status: 'active', origin: 'local', permissions: 'staff' }, [:admin_account]], diff --git a/spec/controllers/api/v2/filters_controller_spec.rb b/spec/controllers/api/v2/filters_controller_spec.rb new file mode 100644 index 000000000..cc0070d57 --- /dev/null +++ b/spec/controllers/api/v2/filters_controller_spec.rb @@ -0,0 +1,121 @@ +require 'rails_helper' + +RSpec.describe Api::V2::FiltersController, type: :controller do + render_views + + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'GET #index' do + let(:scopes) { 'read:filters' } + let!(:filter) { Fabricate(:custom_filter, account: user.account) } + + it 'returns http success' do + get :index + expect(response).to have_http_status(200) + end + end + + describe 'POST #create' do + let(:scopes) { 'write:filters' } + + before do + post :create, params: { title: 'magic', context: %w(home), filter_action: 'hide', keywords_attributes: [keyword: 'magic'] } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'returns a filter with keywords' do + json = body_as_json + expect(json[:title]).to eq 'magic' + expect(json[:filter_action]).to eq 'hide' + expect(json[:context]).to eq ['home'] + expect(json[:keywords].map { |keyword| keyword.slice(:keyword, :whole_word) }).to eq [{ keyword: 'magic', whole_word: true }] + end + + it 'creates a filter' do + filter = user.account.custom_filters.first + expect(filter).to_not be_nil + expect(filter.keywords.pluck(:keyword)).to eq ['magic'] + expect(filter.context).to eq %w(home) + expect(filter.irreversible?).to be true + expect(filter.expires_at).to be_nil + end + end + + describe 'GET #show' do + let(:scopes) { 'read:filters' } + let(:filter) { Fabricate(:custom_filter, account: user.account) } + + it 'returns http success' do + get :show, params: { id: filter.id } + expect(response).to have_http_status(200) + end + end + + describe 'PUT #update' do + let(:scopes) { 'write:filters' } + let!(:filter) { Fabricate(:custom_filter, account: user.account) } + let!(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } + + context 'updating filter parameters' do + before do + put :update, params: { id: filter.id, title: 'updated', context: %w(home public) } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'updates the filter title' do + expect(filter.reload.title).to eq 'updated' + end + + it 'updates the filter context' do + expect(filter.reload.context).to eq %w(home public) + end + end + + context 'updating keywords in bulk' do + before do + allow(redis).to receive_messages(publish: nil) + put :update, params: { id: filter.id, keywords_attributes: [{ id: keyword.id, keyword: 'updated' }] } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'updates the keyword' do + expect(keyword.reload.keyword).to eq 'updated' + end + + it 'sends exactly one filters_changed event' do + expect(redis).to have_received(:publish).with("timeline:#{user.account.id}", Oj.dump(event: :filters_changed)).once + end + end + end + + describe 'DELETE #destroy' do + let(:scopes) { 'write:filters' } + let(:filter) { Fabricate(:custom_filter, account: user.account) } + + before do + delete :destroy, params: { id: filter.id } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'removes the filter' do + expect { filter.reload }.to raise_error ActiveRecord::RecordNotFound + end + end +end diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 851e58d60..2af12376d 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -187,70 +187,6 @@ describe ApplicationController, type: :controller do end end - describe 'require_admin!' do - controller do - before_action :require_admin! - - def success - head 200 - end - end - - before do - routes.draw { get 'success' => 'anonymous#success' } - end - - it 'returns a 403 if current user is not admin' do - sign_in(Fabricate(:user, admin: false)) - get 'success' - expect(response).to have_http_status(403) - end - - it 'returns a 403 if current user is only a moderator' do - sign_in(Fabricate(:user, moderator: true)) - get 'success' - expect(response).to have_http_status(403) - end - - it 'does nothing if current user is admin' do - sign_in(Fabricate(:user, admin: true)) - get 'success' - expect(response).to have_http_status(200) - end - end - - describe 'require_staff!' do - controller do - before_action :require_staff! - - def success - head 200 - end - end - - before do - routes.draw { get 'success' => 'anonymous#success' } - end - - it 'returns a 403 if current user is not admin or moderator' do - sign_in(Fabricate(:user, admin: false, moderator: false)) - get 'success' - expect(response).to have_http_status(403) - end - - it 'does nothing if current user is moderator' do - sign_in(Fabricate(:user, moderator: true)) - get 'success' - expect(response).to have_http_status(200) - end - - it 'does nothing if current user is admin' do - sign_in(Fabricate(:user, admin: true)) - get 'success' - expect(response).to have_http_status(200) - end - end - describe 'forbidden' do controller do def route_forbidden diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index 1b8fd0b7b..d3db7aa1a 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -119,6 +119,32 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using a valid password on a previously-used account with a new IP address' do + let(:previous_ip) { '1.2.3.4' } + let(:current_ip) { '4.3.2.1' } + + let!(:previous_login) { Fabricate(:login_activity, user: user, ip: previous_ip) } + + before do + allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return(current_ip) + allow(UserMailer).to receive(:suspicious_sign_in).and_return(double('email', 'deliver_later!': nil)) + user.update(current_sign_in_at: 1.month.ago) + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'redirects to home' do + expect(response).to redirect_to(root_path) + end + + it 'logs the user in' do + expect(controller.current_user).to eq user + end + + it 'sends a suspicious sign-in mail' do + expect(UserMailer).to have_received(:suspicious_sign_in).with(user, current_ip, anything, anything) + end + end + context 'using email with uppercase letters' do before do post :create, params: { user: { email: user.email.upcase, password: user.password } } diff --git a/spec/controllers/disputes/appeals_controller_spec.rb b/spec/controllers/disputes/appeals_controller_spec.rb index faa571fc9..90f222f49 100644 --- a/spec/controllers/disputes/appeals_controller_spec.rb +++ b/spec/controllers/disputes/appeals_controller_spec.rb @@ -5,7 +5,7 @@ RSpec.describe Disputes::AppealsController, type: :controller do before { sign_in current_user, scope: :user } - let!(:admin) { Fabricate(:user, admin: true) } + let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } describe '#create' do let(:current_user) { Fabricate(:user) } diff --git a/spec/controllers/invites_controller_spec.rb b/spec/controllers/invites_controller_spec.rb index 76e617e6b..23b98fb12 100644 --- a/spec/controllers/invites_controller_spec.rb +++ b/spec/controllers/invites_controller_spec.rb @@ -7,30 +7,30 @@ describe InvitesController do sign_in user end - around do |example| - min_invite_role = Setting.min_invite_role - example.run - Setting.min_invite_role = min_invite_role - end - describe 'GET #index' do subject { get :index } - let(:user) { Fabricate(:user, moderator: false, admin: false) } + let(:user) { Fabricate(:user) } let!(:invite) { Fabricate(:invite, user: user) } - context 'when user is a staff' do + context 'when everyone can invite' do + before do + UserRole.everyone.update(permissions: UserRole.everyone.permissions | UserRole::FLAGS[:invite_users]) + end + it 'renders index page' do - Setting.min_invite_role = 'user' expect(subject).to render_template :index expect(assigns(:invites)).to include invite expect(assigns(:invites).count).to eq 1 end end - context 'when user is not a staff' do + context 'when not everyone can invite' do + before do + UserRole.everyone.update(permissions: UserRole.everyone.permissions & ~UserRole::FLAGS[:invite_users]) + end + it 'returns 403' do - Setting.min_invite_role = 'modelator' expect(subject).to have_http_status 403 end end @@ -39,8 +39,12 @@ describe InvitesController do describe 'POST #create' do subject { post :create, params: { invite: { max_uses: '10', expires_in: 1800 } } } - context 'when user is an admin' do - let(:user) { Fabricate(:user, moderator: false, admin: true) } + context 'when everyone can invite' do + let(:user) { Fabricate(:user) } + + before do + UserRole.everyone.update(permissions: UserRole.everyone.permissions | UserRole::FLAGS[:invite_users]) + end it 'succeeds to create a invite' do expect { subject }.to change { Invite.count }.by(1) @@ -49,8 +53,12 @@ describe InvitesController do end end - context 'when user is not an admin' do - let(:user) { Fabricate(:user, moderator: true, admin: false) } + context 'when not everyone can invite' do + let(:user) { Fabricate(:user) } + + before do + UserRole.everyone.update(permissions: UserRole.everyone.permissions & ~UserRole::FLAGS[:invite_users]) + end it 'returns 403' do expect(subject).to have_http_status 403 @@ -61,8 +69,8 @@ describe InvitesController do describe 'DELETE #create' do subject { delete :destroy, params: { id: invite.id } } + let(:user) { Fabricate(:user) } let!(:invite) { Fabricate(:invite, user: user, expires_at: nil) } - let(:user) { Fabricate(:user, moderator: false, admin: true) } it 'expires invite' do expect(subject).to redirect_to invites_path diff --git a/spec/fabricators/custom_filter_keyword_fabricator.rb b/spec/fabricators/custom_filter_keyword_fabricator.rb new file mode 100644 index 000000000..0f101dcd1 --- /dev/null +++ b/spec/fabricators/custom_filter_keyword_fabricator.rb @@ -0,0 +1,4 @@ +Fabricator(:custom_filter_keyword) do + custom_filter + keyword 'discourse' +end diff --git a/spec/fabricators/login_activity_fabricator.rb b/spec/fabricators/login_activity_fabricator.rb index 931d3082c..686fd6483 100644 --- a/spec/fabricators/login_activity_fabricator.rb +++ b/spec/fabricators/login_activity_fabricator.rb @@ -1,8 +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 } + authentication_method 'password' + success true + failure_reason nil + ip { Faker::Internet.ip_v4_address } + user_agent { Faker::Internet.user_agent } end diff --git a/spec/fabricators/tag_follow_fabricator.rb b/spec/fabricators/tag_follow_fabricator.rb new file mode 100644 index 000000000..a2cccb07a --- /dev/null +++ b/spec/fabricators/tag_follow_fabricator.rb @@ -0,0 +1,4 @@ +Fabricator(:tag_follow) do + tag + account +end diff --git a/spec/fabricators/user_role_fabricator.rb b/spec/fabricators/user_role_fabricator.rb new file mode 100644 index 000000000..28f76c8c4 --- /dev/null +++ b/spec/fabricators/user_role_fabricator.rb @@ -0,0 +1,5 @@ +Fabricator(:user_role) do + name "MyString" + color "MyString" + permissions "" +end \ No newline at end of file diff --git a/spec/lib/activitypub/activity/flag_spec.rb b/spec/lib/activitypub/activity/flag_spec.rb index ec7359f2f..2f2d13876 100644 --- a/spec/lib/activitypub/activity/flag_spec.rb +++ b/spec/lib/activitypub/activity/flag_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Flag do - let(:sender) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/account') } + let(:sender) { Fabricate(:account, username: 'example.com', domain: 'example.com', uri: 'http://example.com/actor') } let(:flagged) { Fabricate(:account) } let(:status) { Fabricate(:status, account: flagged, uri: 'foobar') } let(:flag_id) { nil } @@ -23,16 +23,88 @@ RSpec.describe ActivityPub::Activity::Flag do describe '#perform' do subject { described_class.new(json, sender) } - before do - subject.perform + context 'when the reported status is public' do + before do + subject.perform + end + + it 'creates a report' do + report = Report.find_by(account: sender, target_account: flagged) + + expect(report).to_not be_nil + expect(report.comment).to eq 'Boo!!' + expect(report.status_ids).to eq [status.id] + end end - it 'creates a report' do - report = Report.find_by(account: sender, target_account: flagged) + context 'when the reported status is private and should not be visible to the remote server' do + let(:status) { Fabricate(:status, account: flagged, uri: 'foobar', visibility: :private) } - expect(report).to_not be_nil - expect(report.comment).to eq 'Boo!!' - expect(report.status_ids).to eq [status.id] + before do + subject.perform + end + + it 'creates a report with no attached status' do + report = Report.find_by(account: sender, target_account: flagged) + + expect(report).to_not be_nil + expect(report.comment).to eq 'Boo!!' + expect(report.status_ids).to eq [] + end + end + + context 'when the reported status is private and the author has a follower on the remote instance' do + let(:status) { Fabricate(:status, account: flagged, uri: 'foobar', visibility: :private) } + let(:follower) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/users/account') } + + before do + follower.follow!(flagged) + subject.perform + end + + it 'creates a report with the attached status' do + report = Report.find_by(account: sender, target_account: flagged) + + expect(report).to_not be_nil + expect(report.comment).to eq 'Boo!!' + expect(report.status_ids).to eq [status.id] + end + end + + context 'when the reported status is private and the author mentions someone else on the remote instance' do + let(:status) { Fabricate(:status, account: flagged, uri: 'foobar', visibility: :private) } + let(:mentioned) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/users/account') } + + before do + status.mentions.create(account: mentioned) + subject.perform + end + + it 'creates a report with the attached status' do + report = Report.find_by(account: sender, target_account: flagged) + + expect(report).to_not be_nil + expect(report.comment).to eq 'Boo!!' + expect(report.status_ids).to eq [status.id] + end + end + + context 'when the reported status is private and the author mentions someone else on the local instance' do + let(:status) { Fabricate(:status, account: flagged, uri: 'foobar', visibility: :private) } + let(:mentioned) { Fabricate(:account) } + + before do + status.mentions.create(account: mentioned) + subject.perform + end + + it 'creates a report with no attached status' do + report = Report.find_by(account: sender, target_account: flagged) + + expect(report).to_not be_nil + expect(report.comment).to eq 'Boo!!' + expect(report.status_ids).to eq [] + end end end diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index 1b04916a1..4a43ae7e5 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -134,38 +134,6 @@ RSpec.describe FeedManager do reblog = Fabricate(:status, reblog: status, account: jeff) expect(FeedManager.instance.filter?(:home, reblog, alice)).to be true end - - context 'for irreversibly muted phrases' do - it 'considers word boundaries when matching' do - alice.custom_filters.create!(phrase: 'bob', context: %w(home), irreversible: true) - alice.follow!(jeff) - status = Fabricate(:status, text: 'bobcats', account: jeff) - expect(FeedManager.instance.filter?(:home, status, alice)).to be_falsy - end - - it 'returns true if phrase is contained' do - alice.custom_filters.create!(phrase: 'farts', context: %w(home public), irreversible: true) - alice.custom_filters.create!(phrase: 'pop tarts', context: %w(home), irreversible: true) - alice.follow!(jeff) - status = Fabricate(:status, text: 'i sure like POP TARts', account: jeff) - expect(FeedManager.instance.filter?(:home, status, alice)).to be true - end - - it 'matches substrings if whole_word is false' do - alice.custom_filters.create!(phrase: 'take', context: %w(home), whole_word: false, irreversible: true) - alice.follow!(jeff) - status = Fabricate(:status, text: 'shiitake', account: jeff) - expect(FeedManager.instance.filter?(:home, status, alice)).to be true - end - - it 'returns true if phrase is contained in a poll option' do - alice.custom_filters.create!(phrase: 'farts', context: %w(home public), irreversible: true) - alice.custom_filters.create!(phrase: 'pop tarts', context: %w(home), irreversible: true) - alice.follow!(jeff) - status = Fabricate(:status, text: 'what do you prefer', poll: Fabricate(:poll, options: %w(farts POP TARts)), account: jeff) - expect(FeedManager.instance.filter?(:home, status, alice)).to be true - end - end end context 'for mentions feed' do diff --git a/spec/lib/hashtag_normalizer_spec.rb b/spec/lib/hashtag_normalizer_spec.rb new file mode 100644 index 000000000..fbb9f37c0 --- /dev/null +++ b/spec/lib/hashtag_normalizer_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe HashtagNormalizer do + subject { described_class.new } + + describe '#normalize' do + it 'converts full-width Latin characters into basic Latin characters' do + expect(subject.normalize('Synthwave')).to eq 'synthwave' + end + + it 'converts half-width Katakana into Kana characters' do + expect(subject.normalize('シーサイドライナー')).to eq 'シーサイドライナー' + end + + it 'converts modified Latin characters into basic Latin characters' do + expect(subject.normalize('BLÅHAJ')).to eq 'blahaj' + end + + it 'strips out invalid characters' do + expect(subject.normalize('#foo')).to eq 'foo' + end + + it 'keeps valid characters' do + expect(subject.normalize('a·b')).to eq 'a·b' + end + end +end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index dc0ca3da3..467d41836 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -445,7 +445,7 @@ RSpec.describe Account, type: :model do it 'accepts arbitrary limits' do 2.times.each { Fabricate(:account, display_name: "Display Name") } - results = Account.search_for("display", 1) + results = Account.search_for("display", limit: 1) expect(results.size).to eq 1 end @@ -473,7 +473,7 @@ RSpec.describe Account, type: :model do ) account.follow!(match) - results = Account.advanced_search_for('A?l\i:c e', account, 10, true) + results = Account.advanced_search_for('A?l\i:c e', account, limit: 10, following: true) expect(results).to eq [match] end @@ -485,7 +485,7 @@ RSpec.describe Account, type: :model do domain: 'example.com' ) - results = Account.advanced_search_for('A?l\i:c e', account, 10, true) + results = Account.advanced_search_for('A?l\i:c e', account, limit: 10, following: true) expect(results).to eq [] end @@ -498,7 +498,7 @@ RSpec.describe Account, type: :model do suspended: true ) - results = Account.advanced_search_for('username', account, 10, true) + results = Account.advanced_search_for('username', account, limit: 10, following: true) expect(results).to eq [] end @@ -511,7 +511,7 @@ RSpec.describe Account, type: :model do match.user.update(approved: false) - results = Account.advanced_search_for('username', account, 10, true) + results = Account.advanced_search_for('username', account, limit: 10, following: true) expect(results).to eq [] end @@ -524,7 +524,7 @@ RSpec.describe Account, type: :model do match.user.update(confirmed_at: nil) - results = Account.advanced_search_for('username', account, 10, true) + results = Account.advanced_search_for('username', account, limit: 10, following: true) expect(results).to eq [] end end @@ -588,7 +588,7 @@ RSpec.describe Account, type: :model do it 'accepts arbitrary limits' do 2.times { Fabricate(:account, display_name: "Display Name") } - results = Account.advanced_search_for("display", account, 1) + results = Account.advanced_search_for("display", account, limit: 1) expect(results.size).to eq 1 end diff --git a/spec/models/admin/account_action_spec.rb b/spec/models/admin/account_action_spec.rb index 809c7fc46..b6a052b76 100644 --- a/spec/models/admin/account_action_spec.rb +++ b/spec/models/admin/account_action_spec.rb @@ -5,7 +5,7 @@ RSpec.describe Admin::AccountAction, type: :model do describe '#save!' do subject { account_action.save! } - let(:account) { Fabricate(:user, admin: true).account } + let(:account) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:target_account) { Fabricate(:account) } let(:type) { 'disable' } diff --git a/spec/models/custom_filter_keyword_spec.rb b/spec/models/custom_filter_keyword_spec.rb new file mode 100644 index 000000000..e15b9dad5 --- /dev/null +++ b/spec/models/custom_filter_keyword_spec.rb @@ -0,0 +1,4 @@ +require 'rails_helper' + +RSpec.describe CustomFilterKeyword, type: :model do +end diff --git a/spec/models/tag_follow_spec.rb b/spec/models/tag_follow_spec.rb new file mode 100644 index 000000000..50c04d2e4 --- /dev/null +++ b/spec/models/tag_follow_spec.rb @@ -0,0 +1,4 @@ +require 'rails_helper' + +RSpec.describe TagFollow, type: :model do +end diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index 3949dbce5..b16f99a79 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -91,7 +91,7 @@ RSpec.describe Tag, type: :model do upcase_string = 'abcABCabcABCやゆよ' downcase_string = 'abcabcabcabcやゆよ'; - tag = Fabricate(:tag, name: downcase_string) + tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(downcase_string)) expect(Tag.find_normalized(upcase_string)).to eq tag end end @@ -101,12 +101,12 @@ RSpec.describe Tag, type: :model do upcase_string = 'abcABCabcABCやゆよ' downcase_string = 'abcabcabcabcやゆよ'; - tag = Fabricate(:tag, name: downcase_string) + tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(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%')] + expect(Tag.matches_name('100%abc').to_sql).to eq %q[SELECT "tags".* FROM "tags" WHERE LOWER("tags"."name") LIKE LOWER('100abc%')] end end @@ -115,7 +115,7 @@ RSpec.describe Tag, type: :model do upcase_string = 'abcABCabcABCやゆよ' downcase_string = 'abcabcabcabcやゆよ'; - tag = Fabricate(:tag, name: downcase_string) + tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(downcase_string)) expect(Tag.matching_name(upcase_string)).to eq [tag] end end diff --git a/spec/models/user_role_spec.rb b/spec/models/user_role_spec.rb new file mode 100644 index 000000000..28019593e --- /dev/null +++ b/spec/models/user_role_spec.rb @@ -0,0 +1,189 @@ +require 'rails_helper' + +RSpec.describe UserRole, type: :model do + subject { described_class.create(name: 'Foo', position: 1) } + + describe '#can?' do + context 'with a single flag' do + it 'returns true if any of them are present' do + subject.permissions = UserRole::FLAGS[:manage_reports] + expect(subject.can?(:manage_reports)).to be true + end + + it 'returns false if it is not set' do + expect(subject.can?(:manage_reports)).to be false + end + end + + context 'with multiple flags' do + it 'returns true if any of them are present' do + subject.permissions = UserRole::FLAGS[:manage_users] + expect(subject.can?(:manage_reports, :manage_users)).to be true + end + + it 'returns false if none of them are present' do + expect(subject.can?(:manage_reports, :manage_users)).to be false + end + end + + context 'with an unknown flag' do + it 'raises an error' do + expect { subject.can?(:foo) }.to raise_error ArgumentError + end + end + end + + describe '#overrides?' do + it 'returns true if other role has lower position' do + expect(subject.overrides?(described_class.new(position: subject.position - 1))).to be true + end + + it 'returns true if other role is nil' do + expect(subject.overrides?(nil)).to be true + end + + it 'returns false if other role has higher position' do + expect(subject.overrides?(described_class.new(position: subject.position + 1))).to be false + end + end + + describe '#permissions_as_keys' do + before do + subject.permissions = UserRole::FLAGS[:invite_users] | UserRole::FLAGS[:view_dashboard] | UserRole::FLAGS[:manage_reports] + end + + it 'returns an array' do + expect(subject.permissions_as_keys).to match_array %w(invite_users view_dashboard manage_reports) + end + end + + describe '#permissions_as_keys=' do + let(:input) { } + + before do + subject.permissions_as_keys = input + end + + context 'with a single value' do + let(:input) { %w(manage_users) } + + it 'sets permission flags' do + expect(subject.permissions).to eq UserRole::FLAGS[:manage_users] + end + end + + context 'with multiple values' do + let(:input) { %w(manage_users manage_reports) } + + it 'sets permission flags' do + expect(subject.permissions).to eq UserRole::FLAGS[:manage_users] | UserRole::FLAGS[:manage_reports] + end + end + + context 'with an unknown value' do + let(:input) { %w(foo) } + + it 'does not set permission flags' do + expect(subject.permissions).to eq UserRole::Flags::NONE + end + end + end + + describe '#computed_permissions' do + context 'when the role is nobody' do + let(:subject) { described_class.nobody } + + it 'returns none' do + expect(subject.computed_permissions).to eq UserRole::Flags::NONE + end + end + + context 'when the role is everyone' do + let(:subject) { described_class.everyone } + + it 'returns permissions' do + expect(subject.computed_permissions).to eq subject.permissions + end + end + + context 'when role has the administrator flag' do + before do + subject.permissions = UserRole::FLAGS[:administrator] + end + + it 'returns all permissions' do + expect(subject.computed_permissions).to eq UserRole::Flags::ALL + end + end + + context do + it 'returns permissions combined with the everyone role' do + expect(subject.computed_permissions).to eq described_class.everyone.permissions + end + end + end + + describe '.everyone' do + subject { described_class.everyone } + + it 'returns a role' do + expect(subject).to be_kind_of(described_class) + end + + it 'is identified as the everyone role' do + expect(subject.everyone?).to be true + end + + it 'has default permissions' do + expect(subject.permissions).to eq UserRole::FLAGS[:invite_users] + end + + it 'has negative position' do + expect(subject.position).to eq -1 + end + end + + describe '.nobody' do + subject { described_class.nobody } + + it 'returns a role' do + expect(subject).to be_kind_of(described_class) + end + + it 'is identified as the nobody role' do + expect(subject.nobody?).to be true + end + + it 'has no permissions' do + expect(subject.permissions).to eq UserRole::Flags::NONE + end + + it 'has negative position' do + expect(subject.position).to eq -1 + end + end + + describe '#everyone?' do + it 'returns true when id is -99' do + subject.id = -99 + expect(subject.everyone?).to be true + end + + it 'returns false when id is not -99' do + subject.id = 123 + expect(subject.everyone?).to be false + end + end + + describe '#nobody?' do + it 'returns true when id is nil' do + subject.id = nil + expect(subject.nobody?).to be true + end + + it 'returns false when id is not nil' do + subject.id = 123 + expect(subject.nobody?).to be false + end + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 1645ab59e..a7da31e60 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -56,14 +56,6 @@ RSpec.describe User, type: :model do end end - describe 'admins' do - it 'returns an array of users who are admin' do - user_1 = Fabricate(:user, admin: false) - user_2 = Fabricate(:user, admin: true) - expect(User.admins).to match_array([user_2]) - end - end - describe 'confirmed' do it 'returns an array of users who are confirmed' do user_1 = Fabricate(:user, confirmed_at: nil) @@ -289,49 +281,6 @@ RSpec.describe User, type: :model do end end - describe '#role' do - it 'returns admin for admin' do - user = User.new(admin: true) - expect(user.role).to eq 'admin' - end - - it 'returns moderator for moderator' do - user = User.new(moderator: true) - expect(user.role).to eq 'moderator' - end - - it 'returns user otherwise' do - user = User.new - expect(user.role).to eq 'user' - end - end - - describe '#role?' do - it 'returns false when invalid role requested' do - user = User.new(admin: true) - expect(user.role?('disabled')).to be false - end - - it 'returns true when exact role match' do - user = User.new - mod = User.new(moderator: true) - admin = User.new(admin: true) - - expect(user.role?('user')).to be true - expect(mod.role?('moderator')).to be true - expect(admin.role?('admin')).to be true - end - - it 'returns true when role higher than needed' do - mod = User.new(moderator: true) - admin = User.new(admin: true) - - expect(mod.role?('user')).to be true - expect(admin.role?('user')).to be true - expect(admin.role?('moderator')).to be true - end - end - describe '#disable!' do subject(:user) { Fabricate(:user, disabled: false, current_sign_in_at: current_sign_in_at, last_sign_in_at: nil) } let(:current_sign_in_at) { Time.zone.now } @@ -420,110 +369,6 @@ RSpec.describe User, type: :model do end end - describe '#promote!' do - subject(:user) { Fabricate(:user, admin: is_admin, moderator: is_moderator) } - - before do - user.promote! - end - - context 'when user is an admin' do - let(:is_admin) { true } - - context 'when user is a moderator' do - let(:is_moderator) { true } - - it 'changes moderator filed false' do - expect(user).to be_admin - expect(user).not_to be_moderator - end - end - - context 'when user is not a moderator' do - let(:is_moderator) { false } - - it 'does not change status' do - expect(user).to be_admin - expect(user).not_to be_moderator - end - end - end - - context 'when user is not admin' do - let(:is_admin) { false } - - context 'when user is a moderator' do - let(:is_moderator) { true } - - it 'changes user into an admin' do - expect(user).to be_admin - expect(user).not_to be_moderator - end - end - - context 'when user is not a moderator' do - let(:is_moderator) { false } - - it 'changes user into a moderator' do - expect(user).not_to be_admin - expect(user).to be_moderator - end - end - end - end - - describe '#demote!' do - subject(:user) { Fabricate(:user, admin: admin, moderator: moderator) } - - before do - user.demote! - end - - context 'when user is an admin' do - let(:admin) { true } - - context 'when user is a moderator' do - let(:moderator) { true } - - it 'changes user into a moderator' do - expect(user).not_to be_admin - expect(user).to be_moderator - end - end - - context 'when user is not a moderator' do - let(:moderator) { false } - - it 'changes user into a moderator' do - expect(user).not_to be_admin - expect(user).to be_moderator - end - end - end - - context 'when user is not an admin' do - let(:admin) { false } - - context 'when user is a moderator' do - let(:moderator) { true } - - it 'changes user into a plain user' do - expect(user).not_to be_admin - expect(user).not_to be_moderator - end - end - - context 'when user is not a moderator' do - let(:moderator) { false } - - it 'does not change any fields' do - expect(user).not_to be_admin - expect(user).not_to be_moderator - end - end - end - end - describe '#active_for_authentication?' do subject { user.active_for_authentication? } let(:user) { Fabricate(:user, disabled: disabled, confirmed_at: confirmed_at) } @@ -560,4 +405,8 @@ RSpec.describe User, type: :model do end end end + + describe '.those_who_can' do + pending + end end diff --git a/spec/policies/account_moderation_note_policy_spec.rb b/spec/policies/account_moderation_note_policy_spec.rb index 39ec2008a..846747346 100644 --- a/spec/policies/account_moderation_note_policy_spec.rb +++ b/spec/policies/account_moderation_note_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe AccountModerationNotePolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :create? do @@ -31,7 +31,7 @@ RSpec.describe AccountModerationNotePolicy do context 'admin' do it 'grants to destroy' do - expect(subject).to permit(admin, AccountModerationNotePolicy) + expect(subject).to permit(admin, account_moderation_note) end end diff --git a/spec/policies/account_policy_spec.rb b/spec/policies/account_policy_spec.rb index b55eb65a7..0f23fd97e 100644 --- a/spec/policies/account_policy_spec.rb +++ b/spec/policies/account_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe AccountPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } let(:alice) { Fabricate(:account) } @@ -55,7 +55,7 @@ RSpec.describe AccountPolicy do end end - permissions :redownload?, :subscribe?, :unsubscribe? do + permissions :redownload? do context 'admin' do it 'permits' do expect(subject).to permit(admin) @@ -70,7 +70,7 @@ RSpec.describe AccountPolicy do end permissions :suspend?, :silence? do - let(:staff) { Fabricate(:user, admin: true).account } + let(:staff) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } context 'staff' do context 'record is staff' do @@ -94,7 +94,7 @@ RSpec.describe AccountPolicy do end permissions :memorialize? do - let(:other_admin) { Fabricate(:user, admin: true).account } + let(:other_admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } context 'admin' do context 'record is admin' do diff --git a/spec/policies/custom_emoji_policy_spec.rb b/spec/policies/custom_emoji_policy_spec.rb index e4f1af3c1..6a6ef6694 100644 --- a/spec/policies/custom_emoji_policy_spec.rb +++ b/spec/policies/custom_emoji_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe CustomEmojiPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :index?, :enable?, :disable? do diff --git a/spec/policies/domain_block_policy_spec.rb b/spec/policies/domain_block_policy_spec.rb index b24ed9e3a..01b97e823 100644 --- a/spec/policies/domain_block_policy_spec.rb +++ b/spec/policies/domain_block_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe DomainBlockPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :index?, :show?, :create?, :destroy? do diff --git a/spec/policies/email_domain_block_policy_spec.rb b/spec/policies/email_domain_block_policy_spec.rb index 1ff55af8e..913075c3d 100644 --- a/spec/policies/email_domain_block_policy_spec.rb +++ b/spec/policies/email_domain_block_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe EmailDomainBlockPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :index?, :create?, :destroy? do diff --git a/spec/policies/instance_policy_spec.rb b/spec/policies/instance_policy_spec.rb index 71ef1fe50..f6f51af06 100644 --- a/spec/policies/instance_policy_spec.rb +++ b/spec/policies/instance_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe InstancePolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :index?, :show?, :destroy? do diff --git a/spec/policies/invite_policy_spec.rb b/spec/policies/invite_policy_spec.rb index 122137804..01660322f 100644 --- a/spec/policies/invite_policy_spec.rb +++ b/spec/policies/invite_policy_spec.rb @@ -5,8 +5,8 @@ require 'pundit/rspec' RSpec.describe InvitePolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } - let(:john) { Fabricate(:account) } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } + let(:john) { Fabricate(:user).account } permissions :index? do context 'staff?' do @@ -17,16 +17,22 @@ RSpec.describe InvitePolicy do end permissions :create? do - context 'min_required_role?' do + context 'has privilege' do + before do + UserRole.everyone.update(permissions: UserRole::FLAGS[:invite_users]) + end + it 'permits' do - allow_any_instance_of(described_class).to receive(:min_required_role?) { true } expect(subject).to permit(john, Invite) end end - context 'not min_required_role?' do + context 'does not have privilege' do + before do + UserRole.everyone.update(permissions: UserRole::Flags::NONE) + end + it 'denies' do - allow_any_instance_of(described_class).to receive(:min_required_role?) { false } expect(subject).to_not permit(john, Invite) end end @@ -54,39 +60,15 @@ RSpec.describe InvitePolicy do end context 'not owner?' do - context 'Setting.min_invite_role == "admin"' do - before do - Setting.min_invite_role = 'admin' - end - - context 'admin?' do - it 'permits' do - expect(subject).to permit(admin, Fabricate(:invite)) - end - end - - context 'not admin?' do - it 'denies' do - expect(subject).to_not permit(john, Fabricate(:invite)) - end + context 'admin?' do + it 'permits' do + expect(subject).to permit(admin, Fabricate(:invite)) end end - context 'Setting.min_invite_role != "admin"' do - before do - Setting.min_invite_role = 'else' - end - - context 'staff?' do - it 'permits' do - expect(subject).to permit(admin, Fabricate(:invite)) - end - end - - context 'not staff?' do - it 'denies' do - expect(subject).to_not permit(john, Fabricate(:invite)) - end + context 'not admin?' do + it 'denies' do + expect(subject).to_not permit(john, Fabricate(:invite)) end end end diff --git a/spec/policies/relay_policy_spec.rb b/spec/policies/relay_policy_spec.rb index 139d945dc..2c50ba1e9 100644 --- a/spec/policies/relay_policy_spec.rb +++ b/spec/policies/relay_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe RelayPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :update? do diff --git a/spec/policies/report_note_policy_spec.rb b/spec/policies/report_note_policy_spec.rb index c34f99b71..99f5ffb8e 100644 --- a/spec/policies/report_note_policy_spec.rb +++ b/spec/policies/report_note_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe ReportNotePolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :create? do @@ -25,7 +25,8 @@ RSpec.describe ReportNotePolicy do permissions :destroy? do context 'admin?' do it 'permit' do - expect(subject).to permit(admin, ReportNote) + report_note = Fabricate(:report_note, account: john) + expect(subject).to permit(admin, report_note) end end diff --git a/spec/policies/report_policy_spec.rb b/spec/policies/report_policy_spec.rb index 84c366d7f..8b005d8dd 100644 --- a/spec/policies/report_policy_spec.rb +++ b/spec/policies/report_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe ReportPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :update?, :index?, :show? do diff --git a/spec/policies/settings_policy_spec.rb b/spec/policies/settings_policy_spec.rb index 3fa183c50..e16ee51a4 100644 --- a/spec/policies/settings_policy_spec.rb +++ b/spec/policies/settings_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe SettingsPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :update?, :show? do diff --git a/spec/policies/status_policy_spec.rb b/spec/policies/status_policy_spec.rb index 865c693aa..c2dcc50df 100644 --- a/spec/policies/status_policy_spec.rb +++ b/spec/policies/status_policy_spec.rb @@ -6,7 +6,7 @@ require 'pundit/rspec' RSpec.describe StatusPolicy, type: :model do subject { described_class } - let(:admin) { Fabricate(:user, admin: true) } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } let(:alice) { Fabricate(:account, username: 'alice') } let(:bob) { Fabricate(:account, username: 'bob') } let(:status) { Fabricate(:status, account: alice) } diff --git a/spec/policies/tag_policy_spec.rb b/spec/policies/tag_policy_spec.rb index 256e6786a..9be7140fc 100644 --- a/spec/policies/tag_policy_spec.rb +++ b/spec/policies/tag_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe TagPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :index?, :show?, :update? do diff --git a/spec/policies/user_policy_spec.rb b/spec/policies/user_policy_spec.rb index 731c041d1..ff0916674 100644 --- a/spec/policies/user_policy_spec.rb +++ b/spec/policies/user_policy_spec.rb @@ -5,7 +5,7 @@ require 'pundit/rspec' RSpec.describe UserPolicy do let(:subject) { described_class } - let(:admin) { Fabricate(:user, admin: true).account } + let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } permissions :reset_password?, :change_email? do @@ -111,57 +111,4 @@ RSpec.describe UserPolicy do end end end - - permissions :promote? do - context 'admin?' do - context 'promotable?' do - it 'permits' do - expect(subject).to permit(admin, john.user) - end - end - - context '!promotable?' do - it 'denies' do - expect(subject).to_not permit(admin, admin.user) - end - end - end - - context '!admin?' do - it 'denies' do - expect(subject).to_not permit(john, User) - end - end - end - - permissions :demote? do - context 'admin?' do - context '!record.admin?' do - context 'demoteable?' do - it 'permits' do - john.user.update(moderator: true) - expect(subject).to permit(admin, john.user) - end - end - - context '!demoteable?' do - it 'denies' do - expect(subject).to_not permit(admin, john.user) - end - end - end - - context 'record.admin?' do - it 'denies' do - expect(subject).to_not permit(admin, admin.user) - end - end - end - - context '!admin?' do - it 'denies' do - expect(subject).to_not permit(john, User) - end - end - end end diff --git a/spec/presenters/status_relationships_presenter_spec.rb b/spec/presenters/status_relationships_presenter_spec.rb index 03296bd17..5cd4929a6 100644 --- a/spec/presenters/status_relationships_presenter_spec.rb +++ b/spec/presenters/status_relationships_presenter_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' RSpec.describe StatusRelationshipsPresenter do describe '.initialize' do before do - allow(Status).to receive(:reblogs_map).with(status_ids, current_account_id).and_return(default_map) + allow(Status).to receive(:reblogs_map).with(match_array(status_ids), current_account_id).and_return(default_map) allow(Status).to receive(:favourites_map).with(status_ids, current_account_id).and_return(default_map) allow(Status).to receive(:bookmarks_map).with(status_ids, current_account_id).and_return(default_map) allow(Status).to receive(:mutes_map).with(anything, current_account_id).and_return(default_map) @@ -15,7 +15,7 @@ RSpec.describe StatusRelationshipsPresenter do let(:presenter) { StatusRelationshipsPresenter.new(statuses, current_account_id, **options) } let(:current_account_id) { Fabricate(:account).id } let(:statuses) { [Fabricate(:status)] } - let(:status_ids) { statuses.map(&:id) } + let(:status_ids) { statuses.map(&:id) + statuses.map(&:reblog_of_id).compact } let(:default_map) { { 1 => true } } context 'options are not set' do @@ -69,5 +69,30 @@ RSpec.describe StatusRelationshipsPresenter do expect(presenter.pins_map).to eq default_map.merge(options[:pins_map]) end end + + context 'when post includes filtered terms' do + let(:statuses) { [Fabricate(:status, text: 'this toot is about that banned word'), Fabricate(:status, reblog: Fabricate(:status, text: 'this toot is about an irrelevant word'))] } + let(:options) { {} } + + before do + Account.find(current_account_id).custom_filters.create!(phrase: 'filter1', context: %w(home), action: :hide, keywords_attributes: [{ keyword: 'banned' }, { keyword: 'irrelevant' }]) + end + + it 'sets @filters_map to filter top-level status' do + matched_filters = presenter.filters_map[statuses[0].id] + expect(matched_filters.size).to eq 1 + + expect(matched_filters[0].filter.title).to eq 'filter1' + expect(matched_filters[0].keyword_matches).to eq ['banned'] + end + + it 'sets @filters_map to filter reblogged status' do + matched_filters = presenter.filters_map[statuses[1].reblog_of_id] + expect(matched_filters.size).to eq 1 + + expect(matched_filters[0].filter.title).to eq 'filter1' + expect(matched_filters[0].keyword_matches).to eq ['irrelevant'] + end + end end end diff --git a/spec/services/report_service_spec.rb b/spec/services/report_service_spec.rb index 7e6a113e0..ea68b3344 100644 --- a/spec/services/report_service_spec.rb +++ b/spec/services/report_service_spec.rb @@ -28,6 +28,31 @@ RSpec.describe ReportService, type: :service do end end + context 'when the reported status is a DM' do + let(:target_account) { Fabricate(:account) } + let(:status) { Fabricate(:status, account: target_account, visibility: :direct) } + + subject do + -> { described_class.new.call(source_account, target_account, status_ids: [status.id]) } + end + + context 'when it is addressed to the reporter' do + before do + status.mentions.create(account: source_account) + end + + it 'creates a report' do + is_expected.to change { target_account.targeted_reports.count }.from(0).to(1) + end + end + + context 'when it is not addressed to the reporter' do + it 'errors out' do + is_expected.to raise_error + end + end + end + context 'when other reports already exist for the same target' do let!(:target_account) { Fabricate(:account) } let!(:other_report) { Fabricate(:report, target_account: target_account) } diff --git a/streaming/index.js b/streaming/index.js index e68f85c17..ff7d48250 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -12,6 +12,7 @@ const url = require('url'); const uuid = require('uuid'); const fs = require('fs'); const WebSocket = require('ws'); +const { JSDOM } = require('jsdom'); 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'; @@ -504,6 +505,9 @@ const startWorker = async (workerId) => { if (event === 'kill') { log.verbose(req.requestId, `Closing connection for ${req.accountId} due to expired access token`); eventHandlers.onKill(); + } else if (event === 'filters_changed') { + log.verbose(req.requestId, `Invalidating filters cache for ${req.accountId}`); + req.cachedFilters = null; } }; }; @@ -513,7 +517,8 @@ const startWorker = async (workerId) => { * @param {any} res */ const subscribeHttpToSystemChannel = (req, res) => { - const systemChannelId = `timeline:access_token:${req.accessTokenId}`; + const accessTokenChannelId = `timeline:access_token:${req.accessTokenId}`; + const systemChannelId = `timeline:system:${req.accountId}`; const listener = createSystemMessageListener(req, { @@ -524,9 +529,11 @@ const startWorker = async (workerId) => { }); res.on('close', () => { + unsubscribe(`${redisPrefix}${accessTokenChannelId}`, listener); unsubscribe(`${redisPrefix}${systemChannelId}`, listener); }); + subscribe(`${redisPrefix}${accessTokenChannelId}`, listener); subscribe(`${redisPrefix}${systemChannelId}`, listener); }; @@ -682,17 +689,84 @@ const startWorker = async (workerId) => { queries.push(client.query('SELECT 1 FROM account_domain_blocks WHERE account_id = $1 AND domain = $2', [req.accountId, accountDomain])); } + if (!unpackedPayload.filter_results && !req.cachedFilters) { + queries.push(client.query('SELECT filter.id AS id, filter.phrase AS title, filter.context AS context, filter.expires_at AS expires_at, filter.action AS filter_action, keyword.keyword AS keyword, keyword.whole_word AS whole_word FROM custom_filter_keywords keyword JOIN custom_filters filter ON keyword.custom_filter_id = filter.id WHERE filter.account_id = $1 AND filter.expires_at IS NULL OR filter.expires_at > NOW()', [req.accountId])); + } + Promise.all(queries).then(values => { done(); - if (values[0].rows.length > 0 || (values.length > 1 && values[1].rows.length > 0)) { + if (values[0].rows.length > 0 || (accountDomain && values[1].rows.length > 0)) { return; } + if (!unpackedPayload.filter_results && !req.cachedFilters) { + const filterRows = values[accountDomain ? 2 : 1].rows; + + req.cachedFilters = filterRows.reduce((cache, row) => { + if (cache[row.id]) { + cache[row.id].keywords.push([row.keyword, row.whole_word]); + } else { + cache[row.id] = { + keywords: [[row.keyword, row.whole_word]], + expires_at: row.expires_at, + repr: { + id: row.id, + title: row.title, + context: row.context, + expires_at: row.expires_at, + filter_action: row.filter_action, + }, + }; + } + + return cache; + }, {}); + + Object.keys(req.cachedFilters).forEach((key) => { + req.cachedFilters[key].regexp = new RegExp(req.cachedFilters[key].keywords.map(([keyword, whole_word]) => { + let expr = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');; + + if (whole_word) { + if (/^[\w]/.test(expr)) { + expr = `\\b${expr}`; + } + + if (/[\w]$/.test(expr)) { + expr = `${expr}\\b`; + } + } + + return expr; + }).join('|'), 'i'); + }); + } + + // Check filters + if (req.cachedFilters && !unpackedPayload.filter_results) { + const status = unpackedPayload; + const searchContent = ([status.spoiler_text || '', 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(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n'); + const searchIndex = JSDOM.fragment(searchContent).textContent; + + const now = new Date(); + payload.filter_results = []; + Object.values(req.cachedFilters).forEach((cachedFilter) => { + if ((cachedFilter.expires_at === null || cachedFilter.expires_at > now)) { + const keyword_matches = searchIndex.match(cachedFilter.regexp); + if (keyword_matches) { + payload.filter_results.push({ + filter: cachedFilter.repr, + keyword_matches, + }); + } + } + }); + } + transmit(); }).catch(err => { - done(); log.error(err); + done(); }); }); }; @@ -827,6 +901,34 @@ const startWorker = async (workerId) => { }; /** + * See app/lib/ascii_folder.rb for the canon definitions + * of these constants + */ + const NON_ASCII_CHARS = 'ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž'; + const EQUIVALENT_ASCII_CHARS = 'AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz'; + + /** + * @param {string} str + * @return {string} + */ + const foldToASCII = str => { + const regex = new RegExp(NON_ASCII_CHARS.split('').join('|'), 'g'); + + return str.replace(regex, match => { + const index = NON_ASCII_CHARS.indexOf(match); + return EQUIVALENT_ASCII_CHARS[index]; + }); + }; + + /** + * @param {string} str + * @return {string} + */ + const normalizeHashtag = str => { + return foldToASCII(str.normalize('NFKC').toLowerCase()).replace(/[^\p{L}\p{N}_\u00b7\u200c]/gu, ''); + }; + + /** * @param {any} req * @param {string} name * @param {StreamParams} params @@ -916,7 +1018,7 @@ const startWorker = async (workerId) => { reject('No tag for stream provided'); } else { resolve({ - channelIds: [`timeline:hashtag:${params.tag.toLowerCase()}`], + channelIds: [`timeline:hashtag:${normalizeHashtag(params.tag)}`], options: { needsFiltering: true, allowLocalOnly: true }, }); } @@ -927,7 +1029,7 @@ const startWorker = async (workerId) => { reject('No tag for stream provided'); } else { resolve({ - channelIds: [`timeline:hashtag:${params.tag.toLowerCase()}:local`], + channelIds: [`timeline:hashtag:${normalizeHashtag(params.tag)}:local`], options: { needsFiltering: true, allowLocalOnly: true }, }); } @@ -1031,7 +1133,8 @@ const startWorker = async (workerId) => { * @param {WebSocketSession} session */ const subscribeWebsocketToSystemChannel = ({ socket, request, subscriptions }) => { - const systemChannelId = `timeline:access_token:${request.accessTokenId}`; + const accessTokenChannelId = `timeline:access_token:${request.accessTokenId}`; + const systemChannelId = `timeline:system:${request.accountId}`; const listener = createSystemMessageListener(request, { @@ -1041,8 +1144,15 @@ const startWorker = async (workerId) => { }); + subscribe(`${redisPrefix}${accessTokenChannelId}`, listener); subscribe(`${redisPrefix}${systemChannelId}`, listener); + subscriptions[accessTokenChannelId] = { + listener, + stopHeartbeat: () => { + }, + }; + subscriptions[systemChannelId] = { listener, stopHeartbeat: () => { diff --git a/yarn.lock b/yarn.lock index 1e0ca6547..c3c8a1670 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,132 +16,110 @@ dependencies: "@babel/highlight" "^7.10.4" -"@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.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" - integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.7.2": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" - integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.7.2": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helpers" "^7.18.2" - "@babel/parser" "^7.18.5" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.5" - "@babel/types" "^7.18.4" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/eslint-parser@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz#e14dee36c010edfb0153cf900c2b0815e82e3245" - integrity sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A== +"@babel/eslint-parser@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz#255a63796819a97b7578751bb08ab9f2a375a031" + integrity sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ== dependencies: eslint-scope "^5.1.1" eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.18.2", "@babel/generator@^7.7.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== +"@babel/generator@^7.18.9", "@babel/generator@^7.7.2": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" + integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" + "@babel/types" "^7.18.9" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz#f14d640ed1ee9246fb33b8255f08353acfe70e6a" + integrity sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.6" -"@babel/helper-builder-react-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.16.7.tgz" - integrity sha512-XKorXOl2868Un8/XK2o4GLlXr8Q08KthWI5W3qyCkh6tCGf5Ncg3HR4oN2UO+sqPoAlcMgz9elFW/FZvAHYotA== +"@babel/helper-builder-react-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.18.6.tgz#b3a302c0eb4949e5356b400cb752a91e93bf9b79" + integrity sha512-2ndBVP5f9zwHWQeBr5EgqTAvFhPDViMW969bbJzRhKUUylnC39CdFZdVmqk+UtkxIpwm/efPgm3SzXUSlJnjAw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/types" "^7.18.6" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" - integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" browserslist "^4.20.2" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" - integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" + integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-member-expression-to-functions" "^7.17.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-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz" - integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== +"@babel/helper-create-regexp-features-plugin@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" + integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^4.7.1" - -"@babel/helper-create-regexp-features-plugin@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" - integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" - -"@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-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-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" "@babel/helper-define-polyfill-provider@^0.3.1": version "0.3.1" @@ -157,342 +135,340 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-environment-visitor@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" - integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== - -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/helper-environment-visitor@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz#b7eee2b5b9d70602e59d1a6cad7dd24de7ca6cd7" + integrity sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q== + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz#8334fecb0afba66e6d87a7e8c6bb7fed79926b83" + integrity sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw== dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-member-expression-to-functions@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" - integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@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.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-remap-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz#fa1f81acd19daee9d73de297c0308783cd3cfc23" + integrity sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.6" + "@babel/helper-wrap-function" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.18.9" -"@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.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" - integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" - -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" -"@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.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" - integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz#41fdfcc9abaf900e18ba6e5931816d9062a7b2e0" - integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q== - dependencies: - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - -"@babel/helper-simple-access@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" - integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== - dependencies: - "@babel/types" "^7.17.0" - -"@babel/helper-simple-access@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" - integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== - dependencies: - "@babel/types" "^7.18.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@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.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" - integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== +"@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-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz#ec44ea4ad9d8988b90c3e465ba2382f4de81a073" + integrity sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw== + dependencies: + "@babel/helper-function-name" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.10.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz" - integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" - integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" + integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": - version "7.17.12" - 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.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" - integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + 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.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" - integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" - integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== +"@babel/plugin-proposal-async-generator-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17" + integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" - integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710" - integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA== +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-decorators@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.2.tgz#dbe4086d2d42db489399783c3aa9272e9700afd4" - integrity sha512-kbDISufFOxeczi0v4NQP3p5kIeW6izn/6klfWBrIIdGZZe4UpHR+QU03FAoWjGGd9SUXAwbw2pup1kaL4OQsJQ== +"@babel/plugin-proposal-decorators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.9.tgz#d09d41ffc74af8499d2ac706ed0dbd5474711665" + integrity sha512-KD7zDNaD14CRpjQjVbV4EnH9lsKYlcpUrhZH37ei2IY+AlXrfAPy5pTmRUE4X6X1k8EsKXPraykxeaogqQvSGA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-replace-supers" "^7.18.2" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.17.12" - charcodes "^0.2.0" + "@babel/helper-create-class-features-plugin" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/plugin-syntax-decorators" "^7.18.6" -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" - integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" - integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" - integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" - integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8" - integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw== +"@babel/plugin-proposal-object-rest-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" + integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.17.12" + "@babel/plugin-transform-parameters" "^7.18.8" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" - integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== +"@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" - integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" - integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" + integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" - integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -522,12 +498,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz#02e8f678602f0af8222235271efea945cfdb018a" - integrity sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw== +"@babel/plugin-syntax-decorators@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz#2e45af22835d0b0f8665da2bfd4463649ce5dbc1" + integrity sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -543,12 +519,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd" - integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw== +"@babel/plugin-syntax-import-assertions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" + integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -571,12 +547,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-syntax-jsx@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz#834035b45061983a491f60096f61a2e7c5674a47" - integrity sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog== +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -641,343 +617,343 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" - integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" - integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz#68fc3c4b3bb7dfd809d97b7ed19a584052a2725c" - integrity sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-classes@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz#da889e89a4d38375eeb24985218edeab93af4f29" - integrity sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-classes@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" + integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" - integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" - integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw== +"@babel/plugin-transform-destructuring@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292" + integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" - integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-for-of@^7.18.1": - version "7.18.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036" - integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg== +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" - integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed" - integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA== +"@babel/plugin-transform-modules-amd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" + integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e" - integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ== +"@babel/plugin-transform-modules-commonjs@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" + integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-simple-access" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz#50ecdb43de97c8483824402f7125edb94cddb09a" - integrity sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ== +"@babel/plugin-transform-modules-systemjs@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" + integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-identifier" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f" - integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA== +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" - integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" + integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-new-target@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3" - integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w== +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" - integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== +"@babel/plugin-transform-parameters@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" + integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-inline-elements@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.16.7.tgz" - integrity sha512-jFGuZSebHob02zhrXsJhnI8xcemiDfdlJa1KR2LUfVj/4y9G2iwbJNGVsiH8mW6HEQVh5XwzWWbo/YoroDlQRg== +"@babel/plugin-transform-react-inline-elements@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.18.6.tgz#d0676948eb5a11d547de6add7e8a2c522ec708f5" + integrity sha512-uo3yD1EXhDxmk1Y/CeFDdHS5t22IOUBooLPFOrrjfpYmDM9Vg61xbIaWeWkbYQ7Aq0zMf30/FfKoQgFwyqw6Bg== dependencies: - "@babel/helper-builder-react-jsx" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-builder-react-jsx" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.18.6" -"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz#2aa20022709cd6a3f40b45d60603d5f269586dba" - integrity sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ== +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz#2721e96d31df96e3b7ad48ff446995d26bc028ff" + integrity sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-jsx" "^7.17.12" - "@babel/types" "^7.17.12" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.18.6" -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5" - integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw== +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" + integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" regenerator-transform "^0.15.0" -"@babel/plugin-transform-reserved-words@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" - integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-runtime@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.5.tgz#f4d3188ba6a8815793993c71c2c225d0ee1d7743" - integrity sha512-Q17hHxXr2fplrE+5BSC1j1Fo5cOA8YeP8XW3/1paI8MzF/faZGh0MaH1KC4jLAvqLPamQWHB5/B7KqSLY1kuHA== +"@babel/plugin-transform-runtime@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz#d9e4b1b25719307bfafbf43065ed7fb3a83adb8f" + integrity sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-spread@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" - integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-template-literals@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28" - integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-typeof-symbol@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" - integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/preset-env@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a" - integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-async-generator-functions" "^7.17.12" - "@babel/plugin-proposal-class-properties" "^7.17.12" - "@babel/plugin-proposal-class-static-block" "^7.18.0" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.17.12" - "@babel/plugin-proposal-json-strings" "^7.17.12" - "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.18.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-private-methods" "^7.17.12" - "@babel/plugin-proposal-private-property-in-object" "^7.17.12" - "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" + integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-escapes@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27" + integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.9.tgz#9b3425140d724fbe590322017466580844c7eaff" + integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.18.6" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@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-import-assertions" "^7.17.12" + "@babel/plugin-syntax-import-assertions" "^7.18.6" "@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.3" @@ -987,43 +963,43 @@ "@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.17.12" - "@babel/plugin-transform-async-to-generator" "^7.17.12" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.17.12" - "@babel/plugin-transform-classes" "^7.17.12" - "@babel/plugin-transform-computed-properties" "^7.17.12" - "@babel/plugin-transform-destructuring" "^7.18.0" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.17.12" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.18.1" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.17.12" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.18.0" - "@babel/plugin-transform-modules-commonjs" "^7.18.2" - "@babel/plugin-transform-modules-systemjs" "^7.18.0" - "@babel/plugin-transform-modules-umd" "^7.18.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" - "@babel/plugin-transform-new-target" "^7.17.12" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.17.12" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.18.0" - "@babel/plugin-transform-reserved-words" "^7.17.12" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.17.12" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.18.2" - "@babel/plugin-transform-typeof-symbol" "^7.17.12" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.9" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.18.6" + "@babel/plugin-transform-modules-commonjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.18.9" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.6" + "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.2" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + "@babel/types" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" core-js-compat "^3.22.1" semver "^6.3.0" @@ -1038,17 +1014,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.17.12.tgz#62adbd2d1870c0de3893095757ed5b00b492ab3d" - integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA== +"@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.17.12" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": version "7.10.3" @@ -1065,10 +1041,10 @@ dependencies: regenerator-runtime "^0.12.0" -"@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.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" - integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== +"@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.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== dependencies: regenerator-runtime "^0.13.4" @@ -1079,37 +1055,37 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5", "@babel/traverse@^7.7.2": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" - integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.5" - "@babel/types" "^7.18.4" +"@babel/template@^7.18.6", "@babel/template@^7.3.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" + integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.18.6", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" + integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.9" + "@babel/types" "^7.18.9" debug "^4.1.0" globals "^11.1.0" -"@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.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" - integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" + integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1277,110 +1253,110 @@ resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.1.tgz#305f8ca50b6e70413839f54c0e002b60a0f2fd7d" - integrity sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA== +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^28.1.1" - jest-util "^28.1.1" + jest-message-util "^28.1.3" + jest-util "^28.1.3" slash "^3.0.0" -"@jest/core@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.1.tgz#086830bec6267accf9af5ca76f794858e9f9f092" - integrity sha512-3pYsBoZZ42tXMdlcFeCc/0j9kOlK7MYuXs2B1QbvDgMoW1K9NJ4G/VYvIbMb26iqlkTfPHo7SC2JgjDOk/mxXw== - dependencies: - "@jest/console" "^28.1.1" - "@jest/reporters" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" +"@jest/core@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/reporters" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^28.0.2" - jest-config "^28.1.1" - jest-haste-map "^28.1.1" - jest-message-util "^28.1.1" + jest-changed-files "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-resolve-dependencies "^28.1.1" - jest-runner "^28.1.1" - jest-runtime "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" - jest-watcher "^28.1.1" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" micromatch "^4.0.4" - pretty-format "^28.1.1" + pretty-format "^28.1.3" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.1.tgz#c4cbf85283278d768f816ebd1a258ea6f9e39d4f" - integrity sha512-9auVQ2GzQ7nrU+lAr8KyY838YahElTX9HVjbQPPS2XjlxQ+na18G113OoBhyBGBtD6ZnO/SrUy5WR8EzOj1/Uw== +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== dependencies: - "@jest/fake-timers" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^28.1.1" + jest-mock "^28.1.3" -"@jest/expect-utils@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.1.tgz#d84c346025b9f6f3886d02c48a6177e2b0360587" - integrity sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw== +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== dependencies: jest-get-type "^28.0.2" -"@jest/expect@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.1.tgz#ea4fcc8504b45835029221c0dc357c622a761326" - integrity sha512-/+tQprrFoT6lfkMj4mW/mUIfAmmk/+iQPmg7mLDIFOf2lyf7EBHaS+x3RbeR0VZVMe55IvX7QRoT/2aK3AuUXg== +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== dependencies: - expect "^28.1.1" - jest-snapshot "^28.1.1" + expect "^28.1.3" + jest-snapshot "^28.1.3" -"@jest/fake-timers@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.1.tgz#47ce33296ab9d680c76076d51ddbe65ceb3337f1" - integrity sha512-BY/3+TyLs5+q87rGWrGUY5f8e8uC3LsVHS9Diz8+FV3ARXL4sNnkLlIB8dvDvRrp+LUCGM+DLqlsYubizGUjIA== +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== dependencies: - "@jest/types" "^28.1.1" - "@sinonjs/fake-timers" "^9.1.1" + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" "@types/node" "*" - jest-message-util "^28.1.1" - jest-mock "^28.1.1" - jest-util "^28.1.1" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" -"@jest/globals@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.1.tgz#c0a7977f85e26279cc090d9adcdf82b8a34c4061" - integrity sha512-dEgl/6v7ToB4vXItdvcltJBgny0xBE6xy6IYQrPJAJggdEinGxCDMivNv7sFzPcTITGquXD6UJwYxfJ/5ZwDSg== +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== dependencies: - "@jest/environment" "^28.1.1" - "@jest/expect" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" -"@jest/reporters@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" - integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg== +"@jest/reporters@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - "@jridgewell/trace-mapping" "^0.3.7" + "@jest/console" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -1392,67 +1368,67 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^28.1.1" - jest-util "^28.1.1" - jest-worker "^28.1.1" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" terminal-link "^2.0.0" - v8-to-istanbul "^9.0.0" + v8-to-istanbul "^9.0.1" -"@jest/schemas@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" - integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== dependencies: - "@sinclair/typebox" "^0.23.3" + "@sinclair/typebox" "^0.24.1" -"@jest/source-map@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90" - integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw== +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.13" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" - integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== dependencies: - "@jest/console" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.1.tgz#f594ee2331df75000afe0d1ae3237630ecec732e" - integrity sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA== +"@jest/test-sequencer@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== dependencies: - "@jest/test-result" "^28.1.1" + "@jest/test-result" "^28.1.3" graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" + jest-haste-map "^28.1.3" slash "^3.0.0" -"@jest/transform@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.1.tgz#83541f2a3f612077c8501f49cc4e205d4e4a6b27" - integrity sha512-PkfaTUuvjUarl1EDr5ZQcCA++oXkFCP9QFUkG0yVKVmNObjhrqDy0kbMpMebfHWm3CCDHjYNem9eUSH8suVNHQ== +"@jest/transform@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^28.1.1" - "@jridgewell/trace-mapping" "^0.3.7" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" 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.9" - jest-haste-map "^28.1.1" + jest-haste-map "^28.1.3" jest-regex-util "^28.0.2" - jest-util "^28.1.1" + jest-util "^28.1.3" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" @@ -1479,24 +1455,24 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b" - integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw== +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== dependencies: - "@jest/schemas" "^28.0.2" + "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" @@ -1505,10 +1481,10 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz#b876e3feefb9c8d3aa84014da28b5e52a0640d72" integrity sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg== -"@jridgewell/set-array@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" - integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.10" @@ -1523,10 +1499,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.7": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1612,10 +1588,10 @@ resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.6.tgz#de486ae0a663e1bed637a012cbb2739bfcfa2031" integrity sha512-2M4zlthYmOC6X/tcPcFd//sIL26a7JbCpGNl8uIrQf+pR1Z47uhYt9cOwVqJTJZPurdy2k+YY3Pn64pqruAPEA== -"@sinclair/typebox@^0.23.3": - version "0.23.5" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" - integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== +"@sinclair/typebox@^0.24.1": + version "0.24.20" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.20.tgz#11a657875de6008622d53f56e063a6347c51a6dd" + integrity sha512-kVaO5aEFZb33nPMTZBxiPEkY+slxiPtqC7QX8f9B3eGOMBvEfuMfxp9DSTTCsRJPumPKjrge4yagyssO4q6qzQ== "@sinonjs/commons@^1.7.0": version "1.8.1" @@ -1624,7 +1600,7 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.1": +"@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== @@ -2151,7 +2127,7 @@ acorn@^8.0.4: resolved "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz" integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== -acorn@^8.5.0: +acorn@^8.5.0, acorn@^8.7.1: version "8.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== @@ -2352,7 +2328,7 @@ array-flatten@^2.1.0: resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.3, array-includes@^3.1.4, array-includes@^3.1.5: +array-includes@^3.1.4, array-includes@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== @@ -2492,10 +2468,10 @@ autoprefixer@^9.8.8: postcss "^7.0.32" postcss-value-parser "^4.1.0" -axe-core@^4.3.5: - version "4.3.5" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz" - integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA== +axe-core@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.2.tgz#dcf7fb6dea866166c3eab33d68208afe4d5f670c" + integrity sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA== axios@^0.27.2: version "0.27.2" @@ -2510,15 +2486,15 @@ axobject-query@^2.2.0: resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-jest@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.1.tgz#2a3a4ae50964695b2d694ccffe4bec537c5a3586" - integrity sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw== +babel-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== dependencies: - "@jest/transform" "^28.1.1" + "@jest/transform" "^28.1.3" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.1" + babel-preset-jest "^28.1.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -2551,10 +2527,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz#5e055cdcc47894f28341f87f5e35aad2df680b11" - integrity sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw== +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2590,29 +2566,29 @@ babel-plugin-macros@^3.0.1: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz" - integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== +babel-plugin-polyfill-corejs2@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.0" + "@babel/helper-define-polyfill-provider" "^0.3.1" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz" - integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== +babel-plugin-polyfill-corejs3@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.20.0" + core-js-compat "^3.21.0" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz" - integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== +babel-plugin-polyfill-regenerator@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" + "@babel/helper-define-polyfill-provider" "^0.3.1" babel-plugin-preval@^5.1.0: version "5.1.0" @@ -2660,12 +2636,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@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz#5b6e5e69f963eb2d70f739c607b8f723c0ee75e4" - integrity sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g== +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== dependencies: - babel-plugin-jest-hoist "^28.1.1" + babel-plugin-jest-hoist "^28.1.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -2920,7 +2896,7 @@ browserslist@^4.0.0, browserslist@^4.12.0: escalade "^3.1.1" node-releases "^1.1.71" -browserslist@^4.20.2, browserslist@^4.20.3: +browserslist@^4.20.2: version "4.20.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== @@ -2931,6 +2907,16 @@ browserslist@^4.20.2, browserslist@^4.20.3: node-releases "^2.0.3" picocolors "^1.0.0" +browserslist@^4.21.0: + version "4.21.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.0.tgz#7ab19572361a140ecd1e023e2c1ed95edda0cefe" + integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA== + dependencies: + caniuse-lite "^1.0.30001358" + electron-to-chromium "^1.4.164" + node-releases "^2.0.5" + update-browserslist-db "^1.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" @@ -2939,9 +2925,9 @@ bser@2.1.1: node-int64 "^0.4.0" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: version "1.1.1" @@ -3119,6 +3105,11 @@ caniuse-lite@^1.0.30001332: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz#899254a0b70579e5a957c32dced79f0727c61f2a" integrity sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w== +caniuse-lite@^1.0.30001358: + version "1.0.30001359" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz#a1c1cbe1c2da9e689638813618b4219acbd4925e" + integrity sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw== + chalk@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" @@ -3160,11 +3151,6 @@ char-regex@^1.0.2: resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -charcodes@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" - integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== - "chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" @@ -3305,6 +3291,11 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" +cocoon-js-vanilla@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cocoon-js-vanilla/-/cocoon-js-vanilla-1.2.0.tgz#595348499d315d3b5828dd77a20974756cf59321" + integrity sha512-qLomIVL0Krfc983WLgaYPPktMjMtBN+F/CV15NPVDc9U9BCe2OL5WyAIYkPrVhDRphoYBmHCdIlZkq+vSBI4xg== + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" @@ -3522,12 +3513,12 @@ copy-descriptor@^0.1.0: resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.20.0, core-js-compat@^3.22.1: - version "3.22.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.4.tgz#d700f451e50f1d7672dcad0ac85d910e6691e579" - integrity sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA== +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.23.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.3.tgz#7d8503185be76bb6d8d592c291a4457a8e440aa9" + integrity sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw== dependencies: - browserslist "^4.20.3" + browserslist "^4.21.0" semver "7.0.0" core-js-pure@^3.0.0: @@ -3888,12 +3879,12 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" -damerau-levenshtein@^1.0.7: +damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -data-urls@^3.0.1: +data-urls@^3.0.1, data-urls@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== @@ -4254,6 +4245,11 @@ electron-to-chromium@^1.4.118: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz#c675793885721beefff99da50f57c6525c2cd238" integrity sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ== +electron-to-chromium@^1.4.164: + version "1.4.170" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.170.tgz#0415fc489402e09bfbe1f0c99bbf4d73f31d48d4" + integrity sha512-rZ8PZLhK4ORPjFqLp9aqC4/S1j4qWFsPPz13xmWdrbBkU/LlxMcok+f+6f8YnQ57MiZwKtOaW15biZZsY5Igvw== + elliptic@^6.5.3: version "6.5.4" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" @@ -4339,6 +4335,11 @@ entities@^2.0.0: resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.0.tgz#62915f08d67353bb4eb67e3d62641a4059aec656" + integrity sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg== + errno@^0.1.3, errno@~0.1.7: version "0.1.8" resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" @@ -4532,33 +4533,34 @@ eslint-plugin-import@~2.26.0: resolve "^1.22.0" tsconfig-paths "^3.14.1" -eslint-plugin-jsx-a11y@~6.5.1: - version "6.5.1" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz" - integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== +eslint-plugin-jsx-a11y@~6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz#2c5ac12e013eb98337b9aa261c3b355275cc6415" + integrity sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw== dependencies: - "@babel/runtime" "^7.16.3" + "@babel/runtime" "^7.18.3" aria-query "^4.2.2" - array-includes "^3.1.4" + array-includes "^3.1.5" ast-types-flow "^0.0.7" - axe-core "^4.3.5" + axe-core "^4.4.2" axobject-query "^2.2.0" - damerau-levenshtein "^1.0.7" + damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.2.1" + jsx-ast-utils "^3.3.1" language-tags "^1.0.5" - minimatch "^3.0.4" + minimatch "^3.1.2" + semver "^6.3.0" eslint-plugin-promise@~6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz" integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== -eslint-plugin-react@~7.30.0: - version "7.30.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz#8e7b1b2934b8426ac067a0febade1b13bd7064e3" - integrity sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A== +eslint-plugin-react@~7.30.1: + version "7.30.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz#2be4ab23ce09b5949c6631413ba64b2810fd3e22" + integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg== dependencies: array-includes "^3.1.5" array.prototype.flatmap "^1.3.0" @@ -4792,16 +4794,16 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.1.tgz#ca6fff65f6517cf7220c2e805a49c19aea30b420" - integrity sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w== +expect@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== dependencies: - "@jest/expect-utils" "^28.1.1" + "@jest/expect-utils" "^28.1.3" jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-util "^28.1.1" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" express@^4.17.1, express@^4.18.1: version "4.18.1" @@ -5647,10 +5649,10 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-link-header@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.0.4.tgz#f4efc76c6151ed0ba0d1a2d679798a18854a4a99" - integrity sha512-Cnv3Q+FF+35avekdnH/ML8dls++tdnSgrvUIWw0YEszrWeLSuw5Iq1vyCVTb5v0rEUgFTy0x4shxXyrO0MDUzw== +http-link-header@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.0.5.tgz#8e6d9ed1d393e8d5e01aa5c48bd97aa38d7e261c" + integrity sha512-msKrMbv/xHzhdOD4sstbEr+NbGqpv8ZtZliiCeByGENJo1jK1GZ/81zHF9HpWtEH5ihovPpdqHXniwZapJCKEA== http-parser-js@>=0.5.1: version "0.5.5" @@ -5690,7 +5692,7 @@ https-browserify@^1.0.0: resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6381,82 +6383,82 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz#7d7810660a5bd043af9e9cfbe4d58adb05e91531" - integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA== +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== dependencies: execa "^5.0.0" - throat "^6.0.1" + p-limit "^3.1.0" -jest-circus@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.1.tgz#3d27da6a974d85a466dc0cdc6ddeb58daaa57bb4" - integrity sha512-75+BBVTsL4+p2w198DQpCeyh1RdaS2lhEG87HkaFX/UG0gJExVq2skG2pT7XZEGBubNj2CytcWSPan4QEPNosw== +jest-circus@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== dependencies: - "@jest/environment" "^28.1.1" - "@jest/expect" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^28.1.1" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-runtime "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" - pretty-format "^28.1.1" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" slash "^3.0.0" stack-utils "^2.0.3" - throat "^6.0.1" -jest-cli@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.1.tgz#23ddfde8940e1818585ae4a568877b33b0e51cfe" - integrity sha512-+sUfVbJqb1OjBZ0OdBbI6OWfYM1i7bSfzYy6gze1F1w3OKWq8ZTEKkZ8a7ZQPq6G/G1qMh/uKqpdWhgl11NFQQ== +jest-cli@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== dependencies: - "@jest/core" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/core" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f" - integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA== +jest-config@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.1" - "@jest/types" "^28.1.1" - babel-jest "^28.1.1" + "@jest/test-sequencer" "^28.1.3" + "@jest/types" "^28.1.3" + babel-jest "^28.1.3" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.1" - jest-environment-node "^28.1.1" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" jest-get-type "^28.0.2" jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-runner "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.1" + pretty-format "^28.1.3" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -6470,15 +6472,15 @@ jest-diff@^25.2.1: jest-get-type "^25.2.6" pretty-format "^25.5.0" -jest-diff@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c" - integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg== +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== dependencies: chalk "^4.0.0" diff-sequences "^28.1.1" jest-get-type "^28.0.2" - pretty-format "^28.1.1" + pretty-format "^28.1.3" jest-docblock@^28.1.1: version "28.1.1" @@ -6487,42 +6489,42 @@ jest-docblock@^28.1.1: dependencies: detect-newline "^3.0.0" -jest-each@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.1.tgz#ba5238dacf4f31d9fe23ddc2c44c01e7c23885c4" - integrity sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw== +jest-each@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" chalk "^4.0.0" jest-get-type "^28.0.2" - jest-util "^28.1.1" - pretty-format "^28.1.1" + jest-util "^28.1.3" + pretty-format "^28.1.3" -jest-environment-jsdom@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.1.tgz#8bd721915b32f9b196723292c4461a0ad548b55b" - integrity sha512-41ZvgSoPNcKG5q3LuuOcAczdBxRq9DbZkPe24okN6ZCmiZdAfFtPg3z+lOtsT1fM6OAERApKT+3m0MRDQH2zIA== +jest-environment-jsdom@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz#2d4e5d61b7f1d94c3bddfbb21f0308ee506c09fb" + integrity sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg== dependencies: - "@jest/environment" "^28.1.1" - "@jest/fake-timers" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" "@types/jsdom" "^16.2.4" "@types/node" "*" - jest-mock "^28.1.1" - jest-util "^28.1.1" + jest-mock "^28.1.3" + jest-util "^28.1.3" jsdom "^19.0.0" -jest-environment-node@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.1.tgz#1c86c59003a7d319fa06ea3b1bbda6c193715c67" - integrity sha512-2aV/eeY/WNgUUJrrkDJ3cFEigjC5fqT1+fCclrY6paqJ5zVPoM//sHmfgUUp7WLYxIdbPwMiVIzejpN56MxnNA== +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== dependencies: - "@jest/environment" "^28.1.1" - "@jest/fake-timers" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^28.1.1" - jest-util "^28.1.1" + jest-mock "^28.1.3" + jest-util "^28.1.3" jest-get-type@^25.2.6: version "25.2.6" @@ -6534,64 +6536,64 @@ jest-get-type@^28.0.2: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== -jest-haste-map@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz#471685f1acd365a9394745bb97c8fc16289adca3" - integrity sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ== +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^28.0.2" - jest-util "^28.1.1" - jest-worker "^28.1.1" + jest-util "^28.1.3" + jest-worker "^28.1.3" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.1.tgz#537f37afd610a4b3f4cab15e06baf60484548efb" - integrity sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw== +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== dependencies: jest-get-type "^28.0.2" - pretty-format "^28.1.1" + pretty-format "^28.1.3" -jest-matcher-utils@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304" - integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw== +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== dependencies: chalk "^4.0.0" - jest-diff "^28.1.1" + jest-diff "^28.1.3" jest-get-type "^28.0.2" - pretty-format "^28.1.1" + pretty-format "^28.1.3" -jest-message-util@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.1.tgz#60aa0b475cfc08c8a9363ed2fb9108514dd9ab89" - integrity sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ== +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^28.1.1" + pretty-format "^28.1.3" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.1.tgz#37903d269427fa1ef5b2447be874e1c62a39a371" - integrity sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw== +jest-mock@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -6604,149 +6606,149 @@ jest-regex-util@^28.0.2: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-resolve-dependencies@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.1.tgz#3dffaaa56f4b41bc6b61053899d1756401763a27" - integrity sha512-p8Y150xYJth4EXhOuB8FzmS9r8IGLEioiaetgdNGb9VHka4fl0zqWlVe4v7mSkYOuEUg2uB61iE+zySDgrOmgQ== +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== dependencies: jest-regex-util "^28.0.2" - jest-snapshot "^28.1.1" + jest-snapshot "^28.1.3" -jest-resolve@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" - integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== +jest-resolve@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" + jest-haste-map "^28.1.3" jest-pnp-resolver "^1.2.2" - jest-util "^28.1.1" - jest-validate "^28.1.1" + jest-util "^28.1.3" + jest-validate "^28.1.3" resolve "^1.20.0" resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.1.tgz#9ecdb3f27a00059986797aa6b012ba8306aa436c" - integrity sha512-W5oFUiDBgTsCloTAj6q95wEvYDB0pxIhY6bc5F26OucnwBN+K58xGTGbliSMI4ChQal5eANDF+xvELaYkJxTmA== - dependencies: - "@jest/console" "^28.1.1" - "@jest/environment" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" +jest-runner@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" emittery "^0.10.2" graceful-fs "^4.2.9" jest-docblock "^28.1.1" - jest-environment-node "^28.1.1" - jest-haste-map "^28.1.1" - jest-leak-detector "^28.1.1" - jest-message-util "^28.1.1" - jest-resolve "^28.1.1" - jest-runtime "^28.1.1" - jest-util "^28.1.1" - jest-watcher "^28.1.1" - jest-worker "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" source-map-support "0.5.13" - throat "^6.0.1" -jest-runtime@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.1.tgz#569e1dc3c36c6c4c0b29516c1c49b6ad580abdaf" - integrity sha512-J89qEJWW0leOsqyi0D9zHpFEYHwwafFdS9xgvhFHtIdRghbadodI0eA+DrthK/1PebBv3Px8mFSMGKrtaVnleg== - dependencies: - "@jest/environment" "^28.1.1" - "@jest/fake-timers" "^28.1.1" - "@jest/globals" "^28.1.1" - "@jest/source-map" "^28.0.2" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" +jest-runtime@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" - jest-message-util "^28.1.1" - jest-mock "^28.1.1" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.1.tgz#ab825c16c8d8b5e883bd57eee6ca8748c42ab848" - integrity sha512-1KjqHJ98adRcbIdMizjF5DipwZFbvxym/kFO4g4fVZCZRxH/dqV8TiBFCa6rqic3p0karsy8RWS1y4E07b7P0A== +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^28.1.1" + expect "^28.1.3" graceful-fs "^4.2.9" - jest-diff "^28.1.1" + jest-diff "^28.1.3" jest-get-type "^28.0.2" - jest-haste-map "^28.1.1" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-util "^28.1.1" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" natural-compare "^1.4.0" - pretty-format "^28.1.1" + pretty-format "^28.1.3" semver "^7.3.5" -jest-util@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" - integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== +jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.1.tgz#59b7b339b3c85b5144bd0c06ad3600f503a4acc8" - integrity sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug== +jest-validate@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^28.0.2" leven "^3.1.0" - pretty-format "^28.1.1" + pretty-format "^28.1.3" -jest-watcher@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.1.tgz#533597fb3bfefd52b5cd115cd916cffd237fb60c" - integrity sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug== +jest-watcher@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== dependencies: - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.10.2" - jest-util "^28.1.1" + jest-util "^28.1.3" string-length "^4.0.1" jest-worker@^26.5.0: @@ -6758,24 +6760,24 @@ jest-worker@^26.5.0: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28" - integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ== +jest-worker@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e" - integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA== +jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== dependencies: - "@jest/core" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/core" "^28.1.3" + "@jest/types" "^28.1.3" import-local "^3.0.2" - jest-cli "^28.1.1" + jest-cli "^28.1.3" jpeg-autorotate@^7.1.1: version "7.1.1" @@ -6851,6 +6853,39 @@ jsdom@^19.0.0: ws "^8.2.3" xml-name-validator "^4.0.0" +jsdom@^20.0.0: + version "20.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.0.tgz#882825ac9cc5e5bbee704ba16143e1fa78361ebf" + integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA== + dependencies: + abab "^2.0.6" + acorn "^8.7.1" + acorn-globals "^6.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.3.1" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "^7.0.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.8.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -6927,12 +6962,12 @@ jsonify@~0.0.0: resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz" - integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.1.tgz#a3e0f1cb7e230954eab4dcbce9f6288a78f8ba44" + integrity sha512-pxrjmNpeRw5wwVeWyEAk7QJu2GnBO3uzPFmHCKJJFPKK2Cy0cWL23krGtLdnMmbIi6/FjlrQpPyfQI19ByPOhQ== dependencies: - array-includes "^3.1.3" + array-includes "^3.1.5" object.assign "^4.1.2" keycode@^2.1.7: @@ -7211,10 +7246,10 @@ mark-loader@^0.1.6: resolved "https://registry.npmjs.org/mark-loader/-/mark-loader-0.1.6.tgz" integrity sha1-CrtHfcp0IdcOIBKP9kifXK6GdtU= -marky@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.4.tgz#d02bb4c08be2366687c778ecd2a328971ce23d7f" - integrity sha512-zd2/GiSn6U3/jeFVZ0J9CA1LzQ8RfIVvXkb/U0swFHF/zT+dVohTAWjmo2DcIuofmIIIROlwTbd+shSeXmxr0w== +marky@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.5.tgz#55796b688cbd72390d2d399eaaf1832c9413e3c0" + integrity sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q== mathml-tag-names@^2.1.3: version "2.1.3" @@ -7677,6 +7712,11 @@ node-releases@^2.0.3: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== +node-releases@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== + 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" @@ -7984,7 +8024,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -8121,6 +8161,13 @@ parse5@6.0.1: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.0.0.tgz#51f74a5257f5fcc536389e8c2d0b3802e1bfa91a" + integrity sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g== + dependencies: + entities "^4.3.0" + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" @@ -8777,12 +8824,12 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb" - integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw== +pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== dependencies: - "@jest/schemas" "^28.0.2" + "@jest/schemas" "^28.1.3" ansi-regex "^5.0.1" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -9075,7 +9122,7 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== @@ -9117,13 +9164,13 @@ react-overlays@^0.9.3: react-transition-group "^2.2.1" warning "^3.0.0" -react-redux-loading-bar@^4.0.8: - version "4.6.0" - resolved "https://registry.npmjs.org/react-redux-loading-bar/-/react-redux-loading-bar-4.6.0.tgz" - integrity sha512-ehokhN6eq/UXMr0udqoKuvpEUel1q3T5cWGkwKy2Xrt528QeEtjreixCfrSndN+DNr/5yxxnz0ZEhZt4irZEZg== +react-redux-loading-bar@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/react-redux-loading-bar/-/react-redux-loading-bar-5.0.4.tgz#06dffcc53a447828dec1a26903e6b22807dd4254" + integrity sha512-ttLFYETh9zfyxJdTa5a1+KTWquxX3UN7F/XYslNTeCE8cpnWNpBbUOg8TcaZmOoWEWjCe/i5sV/Mvvr0xsGBBw== dependencies: - prop-types "^15.6.2" - react-lifecycles-compat "^3.0.2" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.4" react-redux@^7.2.8: version "7.2.8" @@ -9170,10 +9217,10 @@ react-router@^4.3.1: prop-types "^15.6.1" warning "^4.0.1" -react-select@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.3.2.tgz#ecee0d5c59ed4acb7f567f7de3c75a488d93dacb" - integrity sha512-W6Irh7U6Ha7p5uQQ2ZnemoCQ8mcfgOtHfw3wuMzG6FAu0P+CYicgofSLOq97BhjMx8jS+h+wwWdCBeVVZ9VqlQ== +react-select@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.4.0.tgz#81f6ac73906126706f104751ee14437bd16798f4" + integrity sha512-CjE9RFLUvChd5SdlfG4vqxZd55AZJRrLrHzkQyTYeHlpOztqcgnyftYAolJ0SGsBev6zAs6qFrjm6KU3eo2hzg== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -9240,10 +9287,10 @@ react-textarea-autosize@^8.3.4: use-composed-ref "^1.3.0" use-latest "^1.2.1" -react-toggle@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/react-toggle/-/react-toggle-4.1.2.tgz" - integrity sha512-4Ohw31TuYQdhWfA6qlKafeXx3IOH7t4ZHhmRdwsm1fQREwOBGxJT+I22sgHqR/w8JRdk+AeMCJXPImEFSrNXow== +react-toggle@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.3.tgz#99193392cca8e495710860c49f55e74c4e6cf452" + integrity sha512-WoPrvbwfQSvoagbrDnXPrlsxwzuhQIrs+V0I162j/s+4XPgY/YDAUmHSeWiroznfI73wj+MBydvW95zX8ABbSg== dependencies: classnames "^2.2.5" @@ -9389,13 +9436,6 @@ regenerate-unicode-properties@^10.0.1: dependencies: regenerate "^1.4.2" -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== - dependencies: - regenerate "^1.4.2" - regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -9448,22 +9488,10 @@ regexpp@^3.1.0: resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== +regexpu-core@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" + integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.0.1" @@ -9472,23 +9500,11 @@ regexpu-core@^5.0.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - regjsgen@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== - dependencies: - jsesc "~0.5.0" - regjsparser@^0.8.2: version "0.8.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" @@ -9714,10 +9730,10 @@ sass-loader@^10.2.0: schema-utils "^3.0.0" semver "^7.3.2" -sass@^1.52.3: - version "1.52.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.52.3.tgz#b7cc7ffea2341ccc9a0c4fd372bf1b3f9be1b6cb" - integrity sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA== +sass@^1.53.0: + version "1.53.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.53.0.tgz#eab73a7baac045cc57ddc1d1ff501ad2659952eb" + integrity sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9735,6 +9751,13 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.19.1: version "0.19.1" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz" @@ -10089,15 +10112,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.12: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.20: +source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -10702,9 +10717,9 @@ terser-webpack-plugin@^4.2.3: webpack-sources "^1.4.3" terser@^4.1.2: - version "4.8.0" - resolved "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + version "4.8.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -10757,11 +10772,6 @@ text-table@^0.2.0: resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - throng@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/throng/-/throng-4.0.0.tgz" @@ -11084,6 +11094,14 @@ upath@^1.1.1: resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" + integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" @@ -11198,12 +11216,12 @@ v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1, v8-compile-cache@^2.3.0: resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511" - integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw== +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -11607,10 +11625,10 @@ ws@^7.3.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^8.2.3, ws@^8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" - integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== +ws@^8.2.3, ws@^8.8.0, ws@^8.8.1: + version "8.8.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" + integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== xml-name-validator@^4.0.0: version "4.0.0" @@ -11701,7 +11719,7 @@ yargs@^17.3.1, yargs@^17.5.1: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zlibjs@^0.3.1: |