diff --git a/.devcontainer/codespaces/devcontainer.json b/.devcontainer/codespaces/devcontainer.json index d2358657f6d664..8acffec8259867 100644 --- a/.devcontainer/codespaces/devcontainer.json +++ b/.devcontainer/codespaces/devcontainer.json @@ -39,7 +39,7 @@ }, "onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}", - "postCreateCommand": "bin/setup", + "postCreateCommand": "COREPACK_ENABLE_DOWNLOAD_PROMPT=0 bin/setup", "waitFor": "postCreateCommand", "customizations": { diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml index 6717853304a6c3..18559a62b69021 100644 --- a/.github/workflows/crowdin-upload.yml +++ b/.github/workflows/crowdin-upload.yml @@ -19,6 +19,7 @@ on: jobs: upload-translations: runs-on: ubuntu-latest + if: github.repository == 'mastodon/mastodon' steps: - name: Checkout diff --git a/.nvmrc b/.nvmrc index cecb93628953cd..1bdd901e66fd02 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.15 +20.16 diff --git a/Dockerfile b/Dockerfile index 758db9bcc90b56..bc7cd3b682122d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# syntax=docker/dockerfile:1.8 +# syntax=docker/dockerfile:1.9 # This file is designed for production server deployment, not local development work # For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/README.md#docker diff --git a/Gemfile b/Gemfile index 135b94c7739b37..de9bc45f320e6c 100644 --- a/Gemfile +++ b/Gemfile @@ -100,7 +100,7 @@ gem 'json-ld' gem 'json-ld-preloaded', '~> 3.2' gem 'rdf-normalize', '~> 0.5' -gem 'opentelemetry-api', '~> 1.2.5' +gem 'opentelemetry-api', '~> 1.3.0' group :opentelemetry do gem 'opentelemetry-exporter-otlp', '~> 0.28.0', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 4fddbded4667ae..49bd446d9b1fa2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -289,7 +289,7 @@ GEM ruby-progressbar (~> 1.4) globalid (1.2.1) activesupport (>= 6.1) - google-protobuf (3.25.3) + google-protobuf (3.25.4) googleapis-common-protos-types (1.14.0) google-protobuf (~> 3.18) haml (6.3.0) @@ -357,13 +357,14 @@ GEM aes_key_wrap bindata httpclient - json-ld (3.3.1) + json-ld (3.3.2) htmlentities (~> 4.3) json-canonicalization (~> 1.0) link_header (~> 0.0, >= 0.0.8) multi_json (~> 1.15) rack (>= 2.2, < 4) rdf (~> 3.3) + rexml (~> 3.2) json-ld-preloaded (3.3.0) json-ld (~> 3.3) rdf (~> 3.3) @@ -451,7 +452,7 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.6) + nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) nsa (0.3.0) @@ -492,10 +493,10 @@ GEM openssl (3.2.0) openssl-signature_algorithm (1.3.0) openssl (> 2.0) - opentelemetry-api (1.2.5) + opentelemetry-api (1.3.0) opentelemetry-common (0.20.1) opentelemetry-api (~> 1.0) - opentelemetry-exporter-otlp (0.28.0) + opentelemetry-exporter-otlp (0.28.1) google-protobuf (>= 3.18) googleapis-common-protos-types (~> 1.3) opentelemetry-api (~> 1.1) @@ -512,14 +513,14 @@ GEM opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-rack (~> 0.21) - opentelemetry-instrumentation-action_view (0.7.0) + opentelemetry-instrumentation-action_view (0.7.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.1) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_job (0.7.3) + opentelemetry-instrumentation-active_job (0.7.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_model_serializers (0.20.1) + opentelemetry-instrumentation-active_model_serializers (0.20.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-active_record (0.7.2) @@ -531,32 +532,32 @@ GEM opentelemetry-instrumentation-base (0.22.3) opentelemetry-api (~> 1.0) opentelemetry-registry (~> 0.1) - opentelemetry-instrumentation-concurrent_ruby (0.21.3) + opentelemetry-instrumentation-concurrent_ruby (0.21.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-excon (0.22.3) + opentelemetry-instrumentation-excon (0.22.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-faraday (0.24.5) + opentelemetry-instrumentation-faraday (0.24.6) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-http (0.23.3) + opentelemetry-instrumentation-http (0.23.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-http_client (0.22.6) + opentelemetry-instrumentation-http_client (0.22.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-net_http (0.22.6) + opentelemetry-instrumentation-net_http (0.22.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-pg (0.27.3) + opentelemetry-instrumentation-pg (0.27.4) opentelemetry-api (~> 1.0) opentelemetry-helpers-sql-obfuscation opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rack (0.24.5) + opentelemetry-instrumentation-rack (0.24.6) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rails (0.31.0) + opentelemetry-instrumentation-rails (0.31.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-action_mailer (~> 0.1.0) opentelemetry-instrumentation-action_pack (~> 0.9.0) @@ -565,20 +566,20 @@ GEM opentelemetry-instrumentation-active_record (~> 0.7.0) opentelemetry-instrumentation-active_support (~> 0.6.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-redis (0.25.6) + opentelemetry-instrumentation-redis (0.25.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-sidekiq (0.25.6) + opentelemetry-instrumentation-sidekiq (0.25.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-registry (0.3.1) opentelemetry-api (~> 1.1) - opentelemetry-sdk (1.4.1) + opentelemetry-sdk (1.5.0) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-registry (~> 0.2) opentelemetry-semantic_conventions - opentelemetry-semantic_conventions (1.10.0) + opentelemetry-semantic_conventions (1.10.1) opentelemetry-api (~> 1.0) orm_adapter (0.5.0) ox (2.14.18) @@ -589,7 +590,7 @@ GEM parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) - pg (1.5.6) + pg (1.5.7) pghero (3.6.0) activerecord (>= 6.1) premailer (1.23.0) @@ -613,7 +614,7 @@ GEM pundit (2.3.2) activesupport (>= 3.0.0) raabro (1.4.0) - racc (1.8.0) + racc (1.8.1) rack (2.2.9) rack-attack (6.7.0) rack (>= 1.0, < 4) @@ -675,8 +676,9 @@ GEM zeitwerk (~> 2.6) rainbow (3.1.1) rake (13.2.1) - rdf (3.3.1) + rdf (3.3.2) bcp47_spec (~> 0.2) + bigdecimal (~> 3.1, >= 3.1.5) link_header (~> 0.0, >= 0.0.8) rdf-normalize (0.7.0) rdf (~> 3.3) @@ -696,7 +698,7 @@ GEM responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.3.2) + rexml (3.3.4) strscan rotp (6.3.0) rouge (4.2.1) @@ -733,7 +735,7 @@ GEM rspec-mocks (~> 3.0) sidekiq (>= 5, < 8) rspec-support (3.13.1) - rubocop (1.65.0) + rubocop (1.65.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) @@ -775,7 +777,7 @@ GEM fugit (~> 1.1, >= 1.1.6) safety_net_attestation (0.4.0) jwt (~> 2.0) - sanitize (6.1.1) + sanitize (6.1.2) crass (~> 1.0.2) nokogiri (>= 1.12.0) scenic (1.8.0) @@ -983,7 +985,7 @@ DEPENDENCIES omniauth-rails_csrf_protection (~> 1.0) omniauth-saml (~> 2.0) omniauth_openid_connect (~> 0.6.1) - opentelemetry-api (~> 1.2.5) + opentelemetry-api (~> 1.3.0) opentelemetry-exporter-otlp (~> 0.28.0) opentelemetry-instrumentation-active_job (~> 0.7.1) opentelemetry-instrumentation-active_model_serializers (~> 0.20.1) diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 4f727c398a0be0..4759d15bc4b047 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -2,7 +2,15 @@ module Admin class TagsController < BaseController - before_action :set_tag + before_action :set_tag, except: [:index] + + PER_PAGE = 20 + + def index + authorize :tag, :index? + + @tags = filtered_tags.page(params[:page]).per(PER_PAGE) + end def show authorize @tag, :show? @@ -31,5 +39,13 @@ def set_tag def tag_params params.require(:tag).permit(:name, :display_name, :trendable, :usable, :listable) end + + def filtered_tags + TagFilter.new(filter_params.with_defaults(order: 'newest')).results + end + + def filter_params + params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS) + end end end diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index c1a5e43f882dd0..0980e0ebbc60be 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -30,10 +30,10 @@ def doorkeeper_forbidden_render_options(*) protected - def limit_param(default_limit) + def limit_param(default_limit, max_limit = nil) return default_limit unless params[:limit] - [params[:limit].to_i.abs, default_limit * 2].min + [params[:limit].to_i.abs, max_limit || (default_limit * 2)].min end def params_slice(*keys) diff --git a/app/controllers/api/v1/admin/domain_allows_controller.rb b/app/controllers/api/v1/admin/domain_allows_controller.rb index 0cd5aebd53ad8b..24f68aa1bd8746 100644 --- a/app/controllers/api/v1/admin/domain_allows_controller.rb +++ b/app/controllers/api/v1/admin/domain_allows_controller.rb @@ -5,6 +5,7 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController include AccountableConcern LIMIT = 100 + MAX_LIMIT = 500 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] @@ -47,7 +48,7 @@ def destroy private def set_domain_allows - @domain_allows = DomainAllow.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) + @domain_allows = DomainAllow.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT, MAX_LIMIT), params_slice(:max_id, :since_id, :min_id)) end def set_domain_allow @@ -67,7 +68,7 @@ def pagination_collection end def records_continue? - @domain_allows.size == limit_param(LIMIT) + @domain_allows.size == limit_param(LIMIT, MAX_LIMIT) end def resource_params diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb index 28d91ef93c2148..b44ae2ae2a2130 100644 --- a/app/controllers/api/v1/admin/domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb @@ -5,6 +5,7 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController include AccountableConcern LIMIT = 100 + MAX_LIMIT = 500 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] @@ -59,7 +60,7 @@ def conflicts_with_existing_block?(domain_block, existing_domain_block) end def set_domain_blocks - @domain_blocks = DomainBlock.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) + @domain_blocks = DomainBlock.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT, MAX_LIMIT), params_slice(:max_id, :since_id, :min_id)) end def set_domain_block @@ -83,7 +84,7 @@ def pagination_collection end def records_continue? - @domain_blocks.size == limit_param(LIMIT) + @domain_blocks.size == limit_param(LIMIT, MAX_LIMIT) end def resource_params diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb index 9ae80c28ed0732..b4207147c87104 100644 --- a/app/controllers/api/v1/notifications/requests_controller.rb +++ b/app/controllers/api/v1/notifications/requests_controller.rb @@ -5,7 +5,8 @@ class Api::V1::Notifications::RequestsController < Api::BaseController before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: :index before_action :require_user! - before_action :set_request, except: :index + before_action :set_request, only: [:show, :accept, :dismiss] + before_action :set_requests, only: [:accept_bulk, :dismiss_bulk] after_action :insert_pagination_headers, only: :index @@ -32,6 +33,16 @@ def dismiss render_empty end + def accept_bulk + @requests.each { |request| AcceptNotificationRequestService.new.call(request) } + render_empty + end + + def dismiss_bulk + @requests.each(&:destroy!) + render_empty + end + private def load_requests @@ -53,6 +64,10 @@ def set_request @request = NotificationRequest.where(account: current_account).find(params[:id]) end + def set_requests + @requests = NotificationRequest.where(account: current_account, id: Array(params[:id]).uniq.map(&:to_i)) + end + def next_path api_v1_notifications_requests_url pagination_params(max_id: pagination_max_id) unless @requests.empty? end diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index c82900ef661812..bdc163d4b67036 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -7,6 +7,8 @@ class Api::V1::NotificationsController < Api::BaseController after_action :insert_pagination_headers, only: :index DEFAULT_NOTIFICATIONS_LIMIT = 40 + DEFAULT_NOTIFICATIONS_COUNT_LIMIT = 100 + MAX_NOTIFICATIONS_COUNT_LIMIT = 1_000 def index with_read_replica do @@ -17,6 +19,14 @@ def index render json: @notifications, each_serializer: REST::NotificationSerializer, relationships: @relationships end + def unread_count + limit = limit_param(DEFAULT_NOTIFICATIONS_COUNT_LIMIT, MAX_NOTIFICATIONS_COUNT_LIMIT) + + with_read_replica do + render json: { count: browserable_account_notifications.paginate_by_min_id(limit, notification_marker&.last_read_id).count } + end + end + def show @notification = current_account.notifications.without_suspended.find(params[:id]) render json: @notification, serializer: REST::NotificationSerializer @@ -63,6 +73,10 @@ def browserable_account_notifications ) end + def notification_marker + current_user.markers.find_by(timeline: 'notifications') + end + def target_statuses_from_notifications @notifications.reject { |notification| notification.target_status.nil? }.map(&:target_status) end diff --git a/app/controllers/api/v2_alpha/notifications_controller.rb b/app/controllers/api/v2_alpha/notifications_controller.rb index 83d40a0886f52f..837499e8984a34 100644 --- a/app/controllers/api/v2_alpha/notifications_controller.rb +++ b/app/controllers/api/v2_alpha/notifications_controller.rb @@ -7,6 +7,8 @@ class Api::V2Alpha::NotificationsController < Api::BaseController after_action :insert_pagination_headers, only: :index DEFAULT_NOTIFICATIONS_LIMIT = 40 + DEFAULT_NOTIFICATIONS_COUNT_LIMIT = 100 + MAX_NOTIFICATIONS_COUNT_LIMIT = 1_000 def index with_read_replica do @@ -31,13 +33,23 @@ def index 'app.notification_grouping.status.unique_count' => statuses.uniq.size ) - render json: @grouped_notifications, each_serializer: REST::NotificationGroupSerializer, relationships: @relationships, group_metadata: @group_metadata + presenter = GroupedNotificationsPresenter.new(@grouped_notifications) + render json: presenter, serializer: REST::DedupNotificationGroupSerializer, relationships: @relationships, group_metadata: @group_metadata + end + end + + def unread_count + limit = limit_param(DEFAULT_NOTIFICATIONS_COUNT_LIMIT, MAX_NOTIFICATIONS_COUNT_LIMIT) + + with_read_replica do + render json: { count: browserable_account_notifications.paginate_groups_by_min_id(limit, min_id: notification_marker&.last_read_id).count } end end def show @notification = current_account.notifications.without_suspended.find_by!(group_key: params[:id]) - render json: NotificationGroup.from_notification(@notification), serializer: REST::NotificationGroupSerializer + presenter = GroupedNotificationsPresenter.new([NotificationGroup.from_notification(@notification)]) + render json: presenter, serializer: REST::DedupNotificationGroupSerializer end def clear @@ -92,6 +104,10 @@ def browserable_account_notifications ) end + def notification_marker + current_user.markers.find_by(timeline: 'notifications') + end + def target_statuses_from_notifications @notifications.filter_map(&:target_status) end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1d700fa282e458..9ec50926671eaf 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -23,7 +23,6 @@ class ApplicationController < ActionController::Base helper_method :current_theme helper_method :single_user_mode? helper_method :use_seamless_external_login? - helper_method :omniauth_only? helper_method :sso_account_settings helper_method :limited_federation_mode? helper_method :body_class_string @@ -140,10 +139,6 @@ def use_seamless_external_login? Devise.pam_authentication || Devise.ldap_authentication end - def omniauth_only? - ENV['OMNIAUTH_ONLY'] == 'true' - end - def sso_account_settings ENV.fetch('SSO_ACCOUNT_SETTINGS', nil) end diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index 7ca7be5f8ef8ec..bf5c84ccf45a88 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -5,7 +5,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController layout 'auth' - before_action :set_body_classes before_action :set_confirmation_user!, only: [:show, :confirm_captcha] before_action :redirect_confirmed_user, if: :signed_in_confirmed_user? @@ -73,10 +72,6 @@ def signed_in_confirmed_user? user_signed_in? && current_user.confirmed? && current_user.unconfirmed_email.blank? end - def set_body_classes - @body_classes = 'lighter' - end - def after_resending_confirmation_instructions_path_for(_resource_name) if user_signed_in? if current_user.confirmed? && current_user.approved? diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb index de001f062b04d7..7c1ff59671d94c 100644 --- a/app/controllers/auth/passwords_controller.rb +++ b/app/controllers/auth/passwords_controller.rb @@ -3,7 +3,6 @@ class Auth::PasswordsController < Devise::PasswordsController skip_before_action :check_self_destruct! before_action :redirect_invalid_reset_token, only: :edit, unless: :reset_password_token_is_valid? - before_action :set_body_classes layout 'auth' @@ -24,10 +23,6 @@ def redirect_invalid_reset_token redirect_to new_password_path(resource_name) end - def set_body_classes - @body_classes = 'lighter' - end - def reset_password_token_is_valid? resource_class.with_reset_password_token(params[:reset_password_token]).present? end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index e5a2ac0270f012..c12960934e35e5 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -105,7 +105,7 @@ def invite_code private def set_body_classes - @body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter' + @body_classes = 'admin' if %w(edit update).include?(action_name) end def set_invite diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 6ed7b2baacc7c4..6210e4dbf9a721 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -16,8 +16,6 @@ class Auth::SessionsController < Devise::SessionsController include Auth::TwoFactorAuthenticationConcern - before_action :set_body_classes - content_security_policy only: :new do |p| p.form_action(false) end @@ -103,10 +101,6 @@ def require_no_authentication private - def set_body_classes - @body_classes = 'lighter' - end - def home_paths(resource) paths = [about_path, '/explore'] diff --git a/app/controllers/auth/setup_controller.rb b/app/controllers/auth/setup_controller.rb index 40916d2887702c..ad872dc607285f 100644 --- a/app/controllers/auth/setup_controller.rb +++ b/app/controllers/auth/setup_controller.rb @@ -5,7 +5,6 @@ class Auth::SetupController < ApplicationController before_action :authenticate_user! before_action :require_unconfirmed_or_pending! - before_action :set_body_classes before_action :set_user skip_before_action :require_functional! @@ -35,10 +34,6 @@ def set_user @user = current_user end - def set_body_classes - @body_classes = 'lighter' - end - def user_params params.require(:user).permit(:email) end diff --git a/app/controllers/concerns/auth/two_factor_authentication_concern.rb b/app/controllers/concerns/auth/two_factor_authentication_concern.rb index 404164751a86cb..0fb11428dca520 100644 --- a/app/controllers/concerns/auth/two_factor_authentication_concern.rb +++ b/app/controllers/concerns/auth/two_factor_authentication_concern.rb @@ -83,7 +83,6 @@ def authenticate_with_two_factor_via_otp(user) def prompt_for_two_factor(user) register_attempt_in_session(user) - @body_classes = 'lighter' @webauthn_enabled = user.webauthn_enabled? @scheme_type = if user.webauthn_enabled? && user_params[:otp_attempt].blank? 'webauthn' diff --git a/app/controllers/concerns/challengable_concern.rb b/app/controllers/concerns/challengable_concern.rb index 09874fb4054435..c8d1a0bef7f013 100644 --- a/app/controllers/concerns/challengable_concern.rb +++ b/app/controllers/concerns/challengable_concern.rb @@ -42,7 +42,6 @@ def require_challenge! end def render_challenge - @body_classes = 'lighter' render 'auth/challenges/new', layout: 'auth' end diff --git a/app/controllers/mail_subscriptions_controller.rb b/app/controllers/mail_subscriptions_controller.rb index 1caeaaacf4ce44..34df75f63ad6c4 100644 --- a/app/controllers/mail_subscriptions_controller.rb +++ b/app/controllers/mail_subscriptions_controller.rb @@ -5,7 +5,6 @@ class MailSubscriptionsController < ApplicationController skip_before_action :require_functional! - before_action :set_body_classes before_action :set_user before_action :set_type @@ -25,10 +24,6 @@ def set_user not_found unless @user end - def set_body_classes - @body_classes = 'lighter' - end - def set_type @type = email_type_from_param end diff --git a/app/helpers/admin/tags_helper.rb b/app/helpers/admin/tags_helper.rb new file mode 100644 index 00000000000000..eb928a6db2beb0 --- /dev/null +++ b/app/helpers/admin/tags_helper.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Admin::TagsHelper + def admin_tags_moderation_options + [ + [t('admin.tags.moderation.reviewed'), 'reviewed'], + [t('admin.tags.moderation.review_requested'), 'review_requested'], + [t('admin.tags.moderation.unreviewed'), 'unreviewed'], + [t('admin.tags.moderation.trendable'), 'trendable'], + [t('admin.tags.moderation.not_trendable'), 'not_trendable'], + [t('admin.tags.moderation.usable'), 'usable'], + [t('admin.tags.moderation.not_usable'), 'not_usable'], + ] + end +end diff --git a/app/javascript/flavours/glitch/actions/notification_groups.ts b/app/javascript/flavours/glitch/actions/notification_groups.ts index 3f6d14a978b154..e034792275271f 100644 --- a/app/javascript/flavours/glitch/actions/notification_groups.ts +++ b/app/javascript/flavours/glitch/actions/notification_groups.ts @@ -38,10 +38,6 @@ function dispatchAssociatedRecords( const fetchedStatuses: ApiStatusJSON[] = []; notifications.forEach((notification) => { - if ('sample_accounts' in notification) { - fetchedAccounts.push(...notification.sample_accounts); - } - if (notification.type === 'admin.report') { fetchedAccounts.push(notification.report.target_account); } @@ -75,7 +71,9 @@ export const fetchNotifications = createDataLoadingThunk( : excludeAllTypesExcept(activeFilter), }); }, - ({ notifications }, { dispatch }) => { + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); dispatchAssociatedRecords(dispatch, notifications); const payload: (ApiNotificationGroupJSON | NotificationGap)[] = notifications; @@ -95,7 +93,9 @@ export const fetchNotificationsGap = createDataLoadingThunk( async (params: { gap: NotificationGap }) => apiFetchNotifications({ max_id: params.gap.maxId }), - ({ notifications }, { dispatch }) => { + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); dispatchAssociatedRecords(dispatch, notifications); return { notifications }; diff --git a/app/javascript/flavours/glitch/actions/notification_policies.ts b/app/javascript/flavours/glitch/actions/notification_policies.ts index 76452de324b426..65b9882d3baf14 100644 --- a/app/javascript/flavours/glitch/actions/notification_policies.ts +++ b/app/javascript/flavours/glitch/actions/notification_policies.ts @@ -1,3 +1,5 @@ +import { createAction } from '@reduxjs/toolkit'; + import { apiGetNotificationPolicy, apiUpdateNotificationsPolicy, @@ -14,3 +16,7 @@ export const updateNotificationsPolicy = createDataLoadingThunk( 'notificationPolicy/update', (policy: Partial) => apiUpdateNotificationsPolicy(policy), ); + +export const decreasePendingNotificationsCount = createAction( + 'notificationPolicy/decreasePendingNotificationCount', +); diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js index 7a97e71bdd22e5..fc879dce64ffff 100644 --- a/app/javascript/flavours/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -18,6 +18,7 @@ import { importFetchedStatuses, } from './importer'; import { submitMarkers } from './markers'; +import { decreasePendingNotificationsCount } from './notification_policies'; import { notificationsUpdate } from "./notifications_typed"; import { register as registerPushNotifications } from './push_notifications'; import { saveSettings } from './settings'; @@ -96,6 +97,12 @@ const fetchRelatedRelationships = (dispatch, notifications) => { } }; +const selectNotificationCountForRequest = (state, id) => { + const requests = state.getIn(['notificationRequests', 'items']); + const thisRequest = requests.find(request => request.get('id') === id); + return thisRequest ? thisRequest.get('notifications_count') : 0; +}; + export const loadPending = () => ({ type: NOTIFICATIONS_LOAD_PENDING, }); @@ -521,11 +528,13 @@ export const fetchNotificationRequestFail = (id, error) => ({ error, }); -export const acceptNotificationRequest = id => (dispatch) => { +export const acceptNotificationRequest = (id) => (dispatch, getState) => { + const count = selectNotificationCountForRequest(getState(), id); dispatch(acceptNotificationRequestRequest(id)); api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { dispatch(acceptNotificationRequestSuccess(id)); + dispatch(decreasePendingNotificationsCount(count)); }).catch(err => { dispatch(acceptNotificationRequestFail(id, err)); }); @@ -547,11 +556,13 @@ export const acceptNotificationRequestFail = (id, error) => ({ error, }); -export const dismissNotificationRequest = id => (dispatch) => { +export const dismissNotificationRequest = (id) => (dispatch, getState) => { + const count = selectNotificationCountForRequest(getState(), id); dispatch(dismissNotificationRequestRequest(id)); api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ dispatch(dismissNotificationRequestSuccess(id)); + dispatch(decreasePendingNotificationsCount(count)); }).catch(err => { dispatch(dismissNotificationRequestFail(id, err)); }); diff --git a/app/javascript/flavours/glitch/api/notifications.ts b/app/javascript/flavours/glitch/api/notifications.ts index fe718788220d44..781f4b1ddedbab 100644 --- a/app/javascript/flavours/glitch/api/notifications.ts +++ b/app/javascript/flavours/glitch/api/notifications.ts @@ -1,17 +1,24 @@ import api, { apiRequest, getLinks } from 'flavours/glitch/api'; -import type { ApiNotificationGroupJSON } from 'flavours/glitch/api_types/notifications'; +import type { ApiNotificationGroupsResultJSON } from 'flavours/glitch/api_types/notifications'; export const apiFetchNotifications = async (params?: { exclude_types?: string[]; max_id?: string; }) => { - const response = await api().request({ + const response = await api().request({ method: 'GET', url: '/api/v2_alpha/notifications', params, }); - return { notifications: response.data, links: getLinks(response) }; + const { statuses, accounts, notification_groups } = response.data; + + return { + statuses, + accounts, + notifications: notification_groups, + links: getLinks(response), + }; }; export const apiClearNotifications = () => diff --git a/app/javascript/flavours/glitch/api_types/notifications.ts b/app/javascript/flavours/glitch/api_types/notifications.ts index ea37556d8d0af0..09dc8efe3123ad 100644 --- a/app/javascript/flavours/glitch/api_types/notifications.ts +++ b/app/javascript/flavours/glitch/api_types/notifications.ts @@ -51,7 +51,7 @@ export interface BaseNotificationGroupJSON { group_key: string; notifications_count: number; type: NotificationType; - sample_accounts: ApiAccountJSON[]; + sample_account_ids: string[]; latest_page_notification_at: string; // FIXME: This will only be present if the notification group is returned in a paginated list, not requested directly most_recent_notification_id: string; page_min_id?: string; @@ -60,7 +60,7 @@ export interface BaseNotificationGroupJSON { interface NotificationGroupWithStatusJSON extends BaseNotificationGroupJSON { type: NotificationWithStatusType; - status: ApiStatusJSON; + status_id: string; } interface NotificationWithStatusJSON extends BaseNotificationJSON { @@ -143,3 +143,9 @@ export type ApiNotificationGroupJSON = | AccountRelationshipSeveranceNotificationGroupJSON | NotificationGroupWithStatusJSON | ModerationWarningNotificationGroupJSON; + +export interface ApiNotificationGroupsResultJSON { + accounts: ApiAccountJSON[]; + statuses: ApiStatusJSON[]; + notification_groups: ApiNotificationGroupJSON[]; +} diff --git a/app/javascript/flavours/glitch/components/avatar.tsx b/app/javascript/flavours/glitch/components/avatar.tsx index c45c26981f8089..c8bf388d268d9b 100644 --- a/app/javascript/flavours/glitch/components/avatar.tsx +++ b/app/javascript/flavours/glitch/components/avatar.tsx @@ -11,6 +11,8 @@ interface Props { style?: React.CSSProperties; inline?: boolean; animate?: boolean; + counter?: number | string; + counterBorderColor?: string; } export const Avatar: React.FC = ({ @@ -19,6 +21,8 @@ export const Avatar: React.FC = ({ size = 20, inline = false, style: styleFromParent, + counter, + counterBorderColor, }) => { const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate); @@ -43,7 +47,15 @@ export const Avatar: React.FC = ({ style={style} data-avatar-of={account && `@${account.get('acct')}`} > - {src && {account?.get('acct')}} + {src && } + {counter && ( +
+ {counter} +
+ )} ); }; diff --git a/app/javascript/flavours/glitch/components/domain.tsx b/app/javascript/flavours/glitch/components/domain.tsx index ed5e8e7e4c20ef..e3eec2bd9bfabe 100644 --- a/app/javascript/flavours/glitch/components/domain.tsx +++ b/app/javascript/flavours/glitch/components/domain.tsx @@ -3,6 +3,8 @@ import { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react'; +import { unblockDomain } from 'flavours/glitch/actions/domain_blocks'; +import { useAppDispatch } from 'flavours/glitch/store'; import { IconButton } from './icon_button'; @@ -13,17 +15,15 @@ const messages = defineMessages({ }, }); -interface Props { +export const Domain: React.FC<{ domain: string; - onUnblockDomain: (domain: string) => void; -} - -export const Domain: React.FC = ({ domain, onUnblockDomain }) => { +}> = ({ domain }) => { const intl = useIntl(); + const dispatch = useAppDispatch(); const handleDomainUnblock = useCallback(() => { - onUnblockDomain(domain); - }, [domain, onUnblockDomain]); + dispatch(unblockDomain(domain)); + }, [dispatch, domain]); return (
diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.jsx b/app/javascript/flavours/glitch/components/dropdown_menu.jsx index 26c828fd64f96c..051ae6299a6f32 100644 --- a/app/javascript/flavours/glitch/components/dropdown_menu.jsx +++ b/app/javascript/flavours/glitch/components/dropdown_menu.jsx @@ -20,7 +20,7 @@ let id = 0; class DropdownMenu extends PureComponent { static propTypes = { - items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired, + items: PropTypes.array.isRequired, loading: PropTypes.bool, scrollable: PropTypes.bool, onClose: PropTypes.func.isRequired, @@ -39,6 +39,7 @@ class DropdownMenu extends PureComponent { if (this.node && !this.node.contains(e.target)) { this.props.onClose(); e.stopPropagation(); + e.preventDefault(); } }; @@ -164,7 +165,7 @@ class Dropdown extends PureComponent { children: PropTypes.node, icon: PropTypes.string, iconComponent: PropTypes.func, - items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]), + items: PropTypes.array.isRequired, loading: PropTypes.bool, size: PropTypes.number, title: PropTypes.string, diff --git a/app/javascript/flavours/glitch/components/follow_button.tsx b/app/javascript/flavours/glitch/components/follow_button.tsx index a6b206470327ee..a27872c1aac8dc 100644 --- a/app/javascript/flavours/glitch/components/follow_button.tsx +++ b/app/javascript/flavours/glitch/components/follow_button.tsx @@ -1,12 +1,11 @@ import { useCallback, useEffect } from 'react'; -import { useIntl, defineMessages, FormattedMessage } from 'react-intl'; +import { useIntl, defineMessages } from 'react-intl'; import { useIdentity } from '@/flavours/glitch/identity_context'; import { fetchRelationships, followAccount, - unfollowAccount, } from 'flavours/glitch/actions/accounts'; import { openModal } from 'flavours/glitch/actions/modal'; import { Button } from 'flavours/glitch/components/button'; @@ -59,29 +58,14 @@ export const FollowButton: React.FC<{ if (accountId === me) { return; - } else if (relationship.following || relationship.requested) { + } else if (account && (relationship.following || relationship.requested)) { dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - message: ( - @{account?.acct} }} - /> - ), - confirm: intl.formatMessage(messages.unfollow), - onConfirm: () => { - dispatch(unfollowAccount(accountId)); - }, - }, - }), + openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }), ); } else { dispatch(followAccount(accountId)); } - }, [dispatch, intl, accountId, relationship, account, signedIn]); + }, [dispatch, accountId, relationship, account, signedIn]); let label; diff --git a/app/javascript/flavours/glitch/containers/account_container.jsx b/app/javascript/flavours/glitch/containers/account_container.jsx index f171fcc2fe5d19..7fd186b657a7a7 100644 --- a/app/javascript/flavours/glitch/containers/account_container.jsx +++ b/app/javascript/flavours/glitch/containers/account_container.jsx @@ -1,24 +1,20 @@ -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; +import { openModal } from 'flavours/glitch/actions/modal'; + import { followAccount, - unfollowAccount, blockAccount, unblockAccount, muteAccount, unmuteAccount, } from '../actions/accounts'; -import { openModal } from '../actions/modal'; import { initMuteModal } from '../actions/mutes'; import Account from '../components/account'; import { makeGetAccount } from '../selectors'; -const messages = defineMessages({ - unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, -}); - const makeMapStateToProps = () => { const getAccount = makeGetAccount(); @@ -29,18 +25,11 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onFollow (account) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: @{account.get('acct')} }} />, - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } })); } else { dispatch(followAccount(account.get('id'))); } diff --git a/app/javascript/flavours/glitch/containers/domain_container.jsx b/app/javascript/flavours/glitch/containers/domain_container.jsx deleted file mode 100644 index c719a5775c7c16..00000000000000 --- a/app/javascript/flavours/glitch/containers/domain_container.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; - -import { connect } from 'react-redux'; - -import { blockDomain, unblockDomain } from '../actions/domain_blocks'; -import { openModal } from '../actions/modal'; -import { Domain } from '../components/domain'; - -const messages = defineMessages({ - blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' }, -}); - -const makeMapStateToProps = () => { - const mapStateToProps = () => ({}); - - return mapStateToProps; -}; - -const mapDispatchToProps = (dispatch, { intl }) => ({ - onBlockDomain (domain) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: {domain} }} />, - confirm: intl.formatMessage(messages.blockDomainConfirm), - onConfirm: () => dispatch(blockDomain(domain)), - }, - })); - }, - - onUnblockDomain (domain) { - dispatch(unblockDomain(domain)); - }, -}); - -export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Domain)); diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js index 955adc5fa7d95d..116a3455f786eb 100644 --- a/app/javascript/flavours/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -1,5 +1,3 @@ -import { defineMessages, injectIntl } from 'react-intl'; - import { connect } from 'react-redux'; import { initBlockModal } from 'flavours/glitch/actions/blocks'; @@ -19,7 +17,6 @@ import { pin, unpin, } from 'flavours/glitch/actions/interactions'; -import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; import { openModal } from 'flavours/glitch/actions/modal'; import { initMuteModal } from 'flavours/glitch/actions/mutes'; import { deployPictureInPicture } from 'flavours/glitch/actions/picture_in_picture'; @@ -39,21 +36,6 @@ import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selector import { showAlertForError } from '../actions/alerts'; -const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, - editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' }, - editMessage: { id: 'confirmations.edit.message', defaultMessage: 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, - unfilterConfirm: { id: 'confirmations.unfilter.confirm', defaultMessage: 'Show' }, - author: { id: 'confirmations.unfilter.author', defaultMessage: 'Author' }, - matchingFilters: { id: 'confirmations.unfilter.filters', defaultMessage: 'Matching {count, plural, one {filter} other {filters}}' }, - editFilter: { id: 'confirmations.unfilter.edit_filter', defaultMessage: 'Edit filter' }, -}); - const makeMapStateToProps = () => { const getStatus = makeGetStatus(); const getPictureInPicture = makeGetPictureInPicture(); @@ -88,22 +70,14 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ +const mapDispatchToProps = (dispatch, { contextType }) => ({ onReply (status) { dispatch((_, getState) => { let state = getState(); if (state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)), - onConfirm: () => dispatch(replyCompose(status)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { dispatch(replyCompose(status)); } @@ -148,14 +122,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ if (!deleteModal) { dispatch(deleteStatus(status.get('id'), withRedraft)); } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } })); } }, @@ -163,14 +130,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ dispatch((_, getState) => { let state = getState(); if (state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.editMessage), - confirm: intl.formatMessage(messages.editConfirm), - onConfirm: () => dispatch(editStatus(status.get('id'))), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } })); } else { dispatch(editStatus(status.get('id'))); } @@ -257,4 +217,4 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ }); -export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status)); +export default connect(makeMapStateToProps, mapDispatchToProps)(Status); diff --git a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.jsx b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.jsx index ba1241d8293c53..3ceb201e2f7ddc 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.jsx +++ b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.jsx @@ -1,10 +1,9 @@ -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; import { followAccount, - unfollowAccount, unblockAccount, unmuteAccount, pinAccount, @@ -22,11 +21,6 @@ import { initReport } from '../../../actions/reports'; import { makeGetAccount, getAccountHidden } from '../../../selectors'; import Header from '../components/header'; -const messages = defineMessages({ - unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, - blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' }, -}); - const makeMapStateToProps = () => { const getAccount = makeGetAccount(); @@ -39,18 +33,11 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onFollow (account) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: @{account.get('acct')} }} />, - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } })); } else { dispatch(followAccount(account.get('id'))); } diff --git a/app/javascript/flavours/glitch/features/compose/components/action_bar.jsx b/app/javascript/flavours/glitch/features/compose/components/action_bar.jsx index 7fda25ded59854..43c2899373a0e8 100644 --- a/app/javascript/flavours/glitch/features/compose/components/action_bar.jsx +++ b/app/javascript/flavours/glitch/features/compose/components/action_bar.jsx @@ -7,7 +7,6 @@ import { useDispatch } from 'react-redux'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import { openModal } from 'flavours/glitch/actions/modal'; import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; -import { logOut } from 'flavours/glitch/utils/log_out'; const messages = defineMessages({ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, @@ -23,8 +22,6 @@ const messages = defineMessages({ filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' }, - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, }); export const ActionBar = () => { @@ -32,16 +29,8 @@ export const ActionBar = () => { const intl = useIntl(); const handleLogoutClick = useCallback(() => { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); - }, [dispatch, intl]); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); + }, [dispatch]); let menu = []; diff --git a/app/javascript/flavours/glitch/features/compose/index.jsx b/app/javascript/flavours/glitch/features/compose/index.jsx index b59fafe0481676..f9a763ef8befbd 100644 --- a/app/javascript/flavours/glitch/features/compose/index.jsx +++ b/app/javascript/flavours/glitch/features/compose/index.jsx @@ -24,7 +24,6 @@ import { Icon } from 'flavours/glitch/components/icon'; import glitchedElephant1 from 'flavours/glitch/images/mbstobon-ui-0.png'; import glitchedElephant2 from 'flavours/glitch/images/mbstobon-ui-1.png'; import glitchedElephant3 from 'flavours/glitch/images/mbstobon-ui-2.png'; -import { logOut } from 'flavours/glitch/utils/log_out'; import elephantUIPlane from '../../../../images/elephant_ui_plane.svg'; import { changeComposing, mountCompose, unmountCompose } from '../../actions/compose'; @@ -45,8 +44,6 @@ const messages = defineMessages({ settings: { id: 'navigation_bar.app_settings', defaultMessage: 'App settings' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new post' }, - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, }); const mapStateToProps = (state, ownProps) => ({ @@ -88,20 +85,12 @@ class Compose extends PureComponent { } handleLogoutClick = e => { - const { dispatch, intl } = this.props; + const { dispatch } = this.props; e.preventDefault(); e.stopPropagation(); - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); return false; }; diff --git a/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.jsx b/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.jsx index 2c70f48a3740fe..50b2a9d5ab8f83 100644 --- a/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.jsx +++ b/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.jsx @@ -37,8 +37,6 @@ const messages = defineMessages({ delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' }, muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, }); const getAccounts = createSelector( @@ -121,19 +119,12 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown }) let state = getState(); if (state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: () => dispatch(replyCompose(lastStatus)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status: lastStatus } })); } else { dispatch(replyCompose(lastStatus)); } }); - }, [dispatch, lastStatus, intl]); + }, [dispatch, lastStatus]); const handleDelete = useCallback(() => { dispatch(deleteConversation(id)); diff --git a/app/javascript/flavours/glitch/features/directory/components/account_card.tsx b/app/javascript/flavours/glitch/features/directory/components/account_card.tsx index 907dbba9fd8414..8afb9f59d5b0fe 100644 --- a/app/javascript/flavours/glitch/features/directory/components/account_card.tsx +++ b/app/javascript/flavours/glitch/features/directory/components/account_card.tsx @@ -7,7 +7,6 @@ import classNames from 'classnames'; import { followAccount, - unfollowAccount, unblockAccount, unmuteAccount, } from 'flavours/glitch/actions/accounts'; @@ -29,20 +28,12 @@ const messages = defineMessages({ id: 'account.cancel_follow_request', defaultMessage: 'Withdraw follow request', }, - cancelFollowRequestConfirm: { - id: 'confirmations.cancel_follow_request.confirm', - defaultMessage: 'Withdraw request', - }, requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request', }, unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' }, unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' }, - unfollowConfirm: { - id: 'confirmations.unfollow.confirm', - defaultMessage: 'Unfollow', - }, edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, }); @@ -89,48 +80,17 @@ export const AccountCard: React.FC<{ accountId: string }> = ({ accountId }) => { const handleFollow = useCallback(() => { if (!account) return; - if (account.getIn(['relationship', 'following'])) { - dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - message: ( - @{account.get('acct')} }} - /> - ), - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => { - dispatch(unfollowAccount(account.get('id'))); - }, - }, - }), - ); - } else if (account.getIn(['relationship', 'requested'])) { + if ( + account.getIn(['relationship', 'following']) || + account.getIn(['relationship', 'requested']) + ) { dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - message: ( - @{account.get('acct')} }} - /> - ), - confirm: intl.formatMessage(messages.cancelFollowRequestConfirm), - onConfirm: () => { - dispatch(unfollowAccount(account.get('id'))); - }, - }, - }), + openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }), ); } else { dispatch(followAccount(account.get('id'))); } - }, [account, dispatch, intl]); + }, [account, dispatch]); const handleBlock = useCallback(() => { if (account?.relationship?.blocking) { diff --git a/app/javascript/flavours/glitch/features/domain_blocks/index.jsx b/app/javascript/flavours/glitch/features/domain_blocks/index.jsx index 964eada9c1e5b9..67ee801cbff24c 100644 --- a/app/javascript/flavours/glitch/features/domain_blocks/index.jsx +++ b/app/javascript/flavours/glitch/features/domain_blocks/index.jsx @@ -11,16 +11,15 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react'; +import { Domain } from 'flavours/glitch/components/domain'; import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks'; import { LoadingIndicator } from '../../components/loading_indicator'; import ScrollableList from '../../components/scrollable_list'; -import DomainContainer from '../../containers/domain_container'; import Column from '../ui/components/column'; const messages = defineMessages({ heading: { id: 'column.domain_blocks', defaultMessage: 'Blocked domains' }, - unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' }, }); const mapStateToProps = state => ({ @@ -70,7 +69,7 @@ class Blocks extends ImmutablePureComponent { bindToDocument={!multiColumn} > {domains.map(domain => - , + , )} diff --git a/app/javascript/flavours/glitch/features/list_timeline/index.jsx b/app/javascript/flavours/glitch/features/list_timeline/index.jsx index 08ce97f1ba75b0..122e43669d89a8 100644 --- a/app/javascript/flavours/glitch/features/list_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/list_timeline/index.jsx @@ -15,7 +15,7 @@ import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; -import { fetchList, deleteList, updateList } from 'flavours/glitch/actions/lists'; +import { fetchList, updateList } from 'flavours/glitch/actions/lists'; import { openModal } from 'flavours/glitch/actions/modal'; import { connectListStream } from 'flavours/glitch/actions/streaming'; import { expandListTimeline } from 'flavours/glitch/actions/timelines'; @@ -29,8 +29,6 @@ import StatusListContainer from 'flavours/glitch/features/ui/containers/status_l import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router'; const messages = defineMessages({ - deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' }, - deleteConfirm: { id: 'confirmations.delete_list.confirm', defaultMessage: 'Delete' }, followed: { id: 'lists.replies_policy.followed', defaultMessage: 'Any followed user' }, none: { id: 'lists.replies_policy.none', defaultMessage: 'No one' }, list: { id: 'lists.replies_policy.list', defaultMessage: 'Members of the list' }, @@ -125,25 +123,10 @@ class ListTimeline extends PureComponent { }; handleDeleteClick = () => { - const { dispatch, columnId, intl } = this.props; + const { dispatch, columnId } = this.props; const { id } = this.props.params; - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.deleteMessage), - confirm: intl.formatMessage(messages.deleteConfirm), - onConfirm: () => { - dispatch(deleteList(id)); - - if (columnId) { - dispatch(removeColumn(columnId)); - } else { - this.props.history.push('/lists'); - } - }, - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_LIST', modalProps: { listId: id, columnId } })); }; handleRepliesPolicyChange = ({ target }) => { diff --git a/app/javascript/flavours/glitch/features/notifications/components/checkbox_with_label.jsx b/app/javascript/flavours/glitch/features/notifications/components/checkbox_with_label.jsx deleted file mode 100644 index 5a7bb2307be3bc..00000000000000 --- a/app/javascript/flavours/glitch/features/notifications/components/checkbox_with_label.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import PropTypes from 'prop-types'; -import { useCallback } from 'react'; - -import Toggle from 'react-toggle'; - -export const CheckboxWithLabel = ({ checked, disabled, children, onChange }) => { - const handleChange = useCallback(({ target }) => { - onChange(target.checked); - }, [onChange]); - - return ( - - ); -}; - -CheckboxWithLabel.propTypes = { - checked: PropTypes.bool, - disabled: PropTypes.bool, - children: PropTypes.children, - onChange: PropTypes.func, -}; diff --git a/app/javascript/flavours/glitch/features/notifications/components/checkbox_with_label.tsx b/app/javascript/flavours/glitch/features/notifications/components/checkbox_with_label.tsx new file mode 100644 index 00000000000000..9922bc6c7c5923 --- /dev/null +++ b/app/javascript/flavours/glitch/features/notifications/components/checkbox_with_label.tsx @@ -0,0 +1,40 @@ +import type { PropsWithChildren } from 'react'; +import { useCallback } from 'react'; + +import Toggle from 'react-toggle'; + +interface Props { + checked: boolean; + disabled?: boolean; + onChange: (checked: boolean) => void; +} + +export const CheckboxWithLabel: React.FC> = ({ + checked, + disabled, + children, + onChange, +}) => { + const handleChange = useCallback( + ({ target }: React.ChangeEvent) => { + onChange(target.checked); + }, + [onChange], + ); + + return ( + + ); +}; diff --git a/app/javascript/flavours/glitch/features/notifications/components/column_settings.jsx b/app/javascript/flavours/glitch/features/notifications/components/column_settings.jsx index 3423517227da0f..e38a24884a80c2 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/column_settings.jsx +++ b/app/javascript/flavours/glitch/features/notifications/components/column_settings.jsx @@ -8,10 +8,10 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'flavours/glitch/permissions'; -import { CheckboxWithLabel } from './checkbox_with_label'; import ClearColumnButton from './clear_column_button'; import GrantPermissionButton from './grant_permission_button'; import PillBarButton from './pill_bar_button'; +import { PolicyControls } from './policy_controls'; import SettingToggle from './setting_toggle'; class ColumnSettings extends PureComponent { @@ -25,32 +25,14 @@ class ColumnSettings extends PureComponent { alertsEnabled: PropTypes.bool, browserSupport: PropTypes.bool, browserPermission: PropTypes.string, - notificationPolicy: PropTypes.object.isRequired, - onChangePolicy: PropTypes.func.isRequired, }; onPushChange = (path, checked) => { this.props.onChange(['push', ...path], checked); }; - handleFilterNotFollowing = checked => { - this.props.onChangePolicy('filter_not_following', checked); - }; - - handleFilterNotFollowers = checked => { - this.props.onChangePolicy('filter_not_followers', checked); - }; - - handleFilterNewAccounts = checked => { - this.props.onChangePolicy('filter_new_accounts', checked); - }; - - handleFilterPrivateMentions = checked => { - this.props.onChangePolicy('filter_private_mentions', checked); - }; - render () { - const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission, notificationPolicy } = this.props; + const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props; const unreadMarkersShowStr = ; const groupingShowStr = ; @@ -81,31 +63,7 @@ class ColumnSettings extends PureComponent { )} -
-

- -
- - - - - - - - - - - - - - - - - - - -
-
+

diff --git a/app/javascript/flavours/glitch/features/notifications/components/filtered_notifications_banner.tsx b/app/javascript/flavours/glitch/features/notifications/components/filtered_notifications_banner.tsx index 2be6ac84662bba..f4413a8c170d82 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/filtered_notifications_banner.tsx +++ b/app/javascript/flavours/glitch/features/notifications/components/filtered_notifications_banner.tsx @@ -1,18 +1,62 @@ -import { useEffect } from 'react'; +import { useCallback, useEffect } from 'react'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; -import { Link } from 'react-router-dom'; +import { Link, useHistory } from 'react-router-dom'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import { fetchNotificationPolicy } from 'flavours/glitch/actions/notification_policies'; import { Icon } from 'flavours/glitch/components/icon'; +import { selectSettingsNotificationsMinimizeFilteredBanner } from 'flavours/glitch/selectors/settings'; import { useAppSelector, useAppDispatch } from 'flavours/glitch/store'; -import { toCappedNumber } from 'flavours/glitch/utils/numbers'; + +const messages = defineMessages({ + filteredNotifications: { + id: 'notification_requests.title', + defaultMessage: 'Filtered notifications', + }, +}); + +export const FilteredNotificationsIconButton: React.FC<{ + className?: string; +}> = ({ className }) => { + const intl = useIntl(); + const history = useHistory(); + const policy = useAppSelector((state) => state.notificationPolicy); + const minimizeSetting = useAppSelector( + selectSettingsNotificationsMinimizeFilteredBanner, + ); + + const handleClick = useCallback(() => { + history.push('/notifications/requests'); + }, [history]); + + if (policy === null || policy.summary.pending_notifications_count === 0) { + return null; + } + + if (!minimizeSetting) { + return null; + } + + return ( + + ); +}; export const FilteredNotificationsBanner: React.FC = () => { const dispatch = useAppDispatch(); const policy = useAppSelector((state) => state.notificationPolicy); + const minimizeSetting = useAppSelector( + selectSettingsNotificationsMinimizeFilteredBanner, + ); useEffect(() => { void dispatch(fetchNotificationPolicy()); @@ -30,6 +74,10 @@ export const FilteredNotificationsBanner: React.FC = () => { return null; } + if (minimizeSetting) { + return null; + } + return ( {
- -
-
- {toCappedNumber(policy.summary.pending_notifications_count)} -
- -
); }; diff --git a/app/javascript/flavours/glitch/features/notifications/components/notification_request.jsx b/app/javascript/flavours/glitch/features/notifications/components/notification_request.jsx index 6c9e2980deca42..3b32955348cf52 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/notification_request.jsx +++ b/app/javascript/flavours/glitch/features/notifications/components/notification_request.jsx @@ -38,12 +38,11 @@ export const NotificationRequest = ({ id, accountId, notificationsCount }) => { return (
- +
- {toCappedNumber(notificationsCount)}
@{account?.get('acct')} diff --git a/app/javascript/flavours/glitch/features/notifications/components/policy_controls.tsx b/app/javascript/flavours/glitch/features/notifications/components/policy_controls.tsx new file mode 100644 index 00000000000000..58eff3fbcf2d5c --- /dev/null +++ b/app/javascript/flavours/glitch/features/notifications/components/policy_controls.tsx @@ -0,0 +1,141 @@ +import { useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { updateNotificationsPolicy } from 'flavours/glitch/actions/notification_policies'; +import { useAppSelector, useAppDispatch } from 'flavours/glitch/store'; + +import { CheckboxWithLabel } from './checkbox_with_label'; + +export const PolicyControls: React.FC = () => { + const dispatch = useAppDispatch(); + + const notificationPolicy = useAppSelector( + (state) => state.notificationPolicy, + ); + + const handleFilterNotFollowing = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_not_following: checked }), + ); + }, + [dispatch], + ); + + const handleFilterNotFollowers = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_not_followers: checked }), + ); + }, + [dispatch], + ); + + const handleFilterNewAccounts = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_new_accounts: checked }), + ); + }, + [dispatch], + ); + + const handleFilterPrivateMentions = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_private_mentions: checked }), + ); + }, + [dispatch], + ); + + if (!notificationPolicy) return null; + + return ( +
+

+ +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ ); +}; diff --git a/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js index 55dcd4226c9859..3c4c4b30ca1ffa 100644 --- a/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js @@ -2,20 +2,16 @@ import { defineMessages, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; +import { openModal } from 'flavours/glitch/actions/modal'; import { initializeNotifications } from 'flavours/glitch/actions/notifications_migration'; import { showAlert } from '../../../actions/alerts'; -import { openModal } from '../../../actions/modal'; -import { clearNotifications } from '../../../actions/notification_groups'; -import { updateNotificationsPolicy } from '../../../actions/notification_policies'; import { setFilter, requestBrowserPermission } from '../../../actions/notifications'; import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications'; import { changeSetting } from '../../../actions/settings'; import ColumnSettings from '../components/column_settings'; const messages = defineMessages({ - clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' }, - clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' }, permissionDenied: { id: 'notifications.permission_denied_alert', defaultMessage: 'Desktop notifications can\'t be enabled, as browser permission has been denied before' }, }); @@ -28,10 +24,9 @@ const mapStateToProps = state => ({ alertsEnabled: state.getIn(['settings', 'notifications', 'alerts']).includes(true), browserSupport: state.getIn(['notifications', 'browserSupport']), browserPermission: state.getIn(['notifications', 'browserPermission']), - notificationPolicy: state.notificationPolicy, }); -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onChange (path, checked) { if (path[0] === 'push') { @@ -70,26 +65,13 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onClear () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.clearMessage), - confirm: intl.formatMessage(messages.clearConfirm), - onConfirm: () => dispatch(clearNotifications()), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_CLEAR_NOTIFICATIONS' })); }, onRequestNotificationPermission () { dispatch(requestBrowserPermission()); }, - onChangePolicy (param, checked) { - dispatch(updateNotificationsPolicy({ - [param]: checked, - })); - }, - }); export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings)); diff --git a/app/javascript/flavours/glitch/features/notifications/index.jsx b/app/javascript/flavours/glitch/features/notifications/index.jsx index 2d3d4377561e7e..b3b133411aa02f 100644 --- a/app/javascript/flavours/glitch/features/notifications/index.jsx +++ b/app/javascript/flavours/glitch/features/notifications/index.jsx @@ -38,7 +38,10 @@ import { LoadGap } from '../../components/load_gap'; import ScrollableList from '../../components/scrollable_list'; import NotificationPurgeButtonsContainer from '../../containers/notification_purge_buttons_container'; -import { FilteredNotificationsBanner } from './components/filtered_notifications_banner'; +import { + FilteredNotificationsBanner, + FilteredNotificationsIconButton, +} from './components/filtered_notifications_banner'; import NotificationsPermissionBanner from './components/notifications_permission_banner'; import ColumnSettingsContainer from './containers/column_settings_container'; import FilterBarContainer from './containers/filter_bar_container'; @@ -290,7 +293,9 @@ class Notifications extends PureComponent { scrollContainer = ; } - const extraButtons = []; + const extraButtons = [ + , + ]; if (canMarkAsRead) { extraButtons.push( diff --git a/app/javascript/flavours/glitch/features/notifications/request.jsx b/app/javascript/flavours/glitch/features/notifications/request.jsx index 4a6a189b8f8de6..b95533aa3638f5 100644 --- a/app/javascript/flavours/glitch/features/notifications/request.jsx +++ b/app/javascript/flavours/glitch/features/notifications/request.jsx @@ -7,9 +7,9 @@ import { Helmet } from 'react-helmet'; import { useSelector, useDispatch } from 'react-redux'; +import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import DoneIcon from '@/material-icons/400-24px/done.svg?react'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; -import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; import { fetchNotificationRequest, fetchNotificationsForRequest, expandNotificationsForRequest, acceptNotificationRequest, dismissNotificationRequest } from 'flavours/glitch/actions/notifications'; import Column from 'flavours/glitch/components/column'; import ColumnHeader from 'flavours/glitch/components/column_header'; @@ -101,7 +101,7 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => { showBackButton extraButton={!removed && ( <> - + )} diff --git a/app/javascript/flavours/glitch/features/notifications/requests.jsx b/app/javascript/flavours/glitch/features/notifications/requests.jsx index d7a07da152c750..3df8bc2616314e 100644 --- a/app/javascript/flavours/glitch/features/notifications/requests.jsx +++ b/app/javascript/flavours/glitch/features/notifications/requests.jsx @@ -9,16 +9,52 @@ import { useSelector, useDispatch } from 'react-redux'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import { fetchNotificationRequests, expandNotificationRequests } from 'flavours/glitch/actions/notifications'; +import { changeSetting } from 'flavours/glitch/actions/settings'; import Column from 'flavours/glitch/components/column'; import ColumnHeader from 'flavours/glitch/components/column_header'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import { NotificationRequest } from './components/notification_request'; +import { PolicyControls } from './components/policy_controls'; +import SettingToggle from './components/setting_toggle'; const messages = defineMessages({ title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' }, + maximize: { id: 'notification_requests.maximize', defaultMessage: 'Maximize' } }); +const ColumnSettings = () => { + const dispatch = useDispatch(); + const settings = useSelector((state) => state.settings.get('notifications')); + + const onChange = useCallback( + (key, checked) => { + dispatch(changeSetting(['notifications', ...key], checked)); + }, + [dispatch], + ); + + return ( +
+
+
+ + } + /> +
+
+ + +
+ ); +}; + export const NotificationRequests = ({ multiColumn }) => { const columnRef = useRef(); const intl = useIntl(); @@ -48,7 +84,9 @@ export const NotificationRequests = ({ multiColumn }) => { onClick={handleHeaderClick} multiColumn={multiColumn} showBackButton - /> + > + + ); - const extraButton = canMarkAsRead ? ( - - ) : null; + const extraButton = ( + <> + + {canMarkAsRead && ( + + )} + + ); return ( { - const { dispatch, askReplyConfirmation, status, intl } = this.props; + const { dispatch, askReplyConfirmation, status, onClose } = this.props; const { signedIn } = this.props.identity; if (signedIn) { if (askReplyConfirmation) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: this._performReply, - }, - })); + onClose(true); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { this._performReply(); } diff --git a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js index 1c9e3ccce12299..34bde2fc6ed66b 100644 --- a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js +++ b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js @@ -1,4 +1,4 @@ -import { defineMessages, injectIntl } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; @@ -27,15 +27,6 @@ import { deleteModal } from '../../../initial_state'; import { makeGetStatus } from '../../../selectors'; import DetailedStatus from '../components/detailed_status'; -const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, -}); - const makeMapStateToProps = () => { const getStatus = makeGetStatus(); @@ -48,20 +39,13 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onReply (status) { dispatch((_, getState) => { let state = getState(); if (state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: () => dispatch(replyCompose(status)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { dispatch(replyCompose(status)); } @@ -98,14 +82,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ if (!deleteModal) { dispatch(deleteStatus(status.get('id'), withRedraft)); } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } })); } }, diff --git a/app/javascript/flavours/glitch/features/status/index.jsx b/app/javascript/flavours/glitch/features/status/index.jsx index 2fca4b61b6c26f..5bc99c661426df 100644 --- a/app/javascript/flavours/glitch/features/status/index.jsx +++ b/app/javascript/flavours/glitch/features/status/index.jsx @@ -39,7 +39,6 @@ import { pin, unpin, } from '../../actions/interactions'; -import { changeLocalSetting } from '../../actions/local_settings'; import { openModal } from '../../actions/modal'; import { initMuteModal } from '../../actions/mutes'; import { initReport } from '../../actions/reports'; @@ -67,16 +66,10 @@ import DetailedStatus from './components/detailed_status'; const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' }, detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, tootHeading: { id: 'account.posts_with_replies', defaultMessage: 'Posts and replies' }, }); @@ -294,20 +287,12 @@ class Status extends ImmutablePureComponent { }; handleReplyClick = (status) => { - const { askReplyConfirmation, dispatch, intl } = this.props; + const { askReplyConfirmation, dispatch } = this.props; const { signedIn } = this.props.identity; if (signedIn) { if (askReplyConfirmation) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)), - onConfirm: () => dispatch(replyCompose(status)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { dispatch(replyCompose(status)); } @@ -350,24 +335,23 @@ class Status extends ImmutablePureComponent { }; handleDeleteClick = (status, withRedraft = false) => { - const { dispatch, intl } = this.props; + const { dispatch } = this.props; if (!deleteModal) { dispatch(deleteStatus(status.get('id'), withRedraft)); } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } })); } }; handleEditClick = (status) => { - this.props.dispatch(editStatus(status.get('id'))); + const { dispatch, askReplyConfirmation } = this.props; + + if (askReplyConfirmation) { + dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } })); + } else { + dispatch(editStatus(status.get('id'))); + } }; handleDirectClick = (account) => { diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.jsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.jsx deleted file mode 100644 index 51a501595bb6e0..00000000000000 --- a/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.jsx +++ /dev/null @@ -1,83 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { injectIntl, FormattedMessage } from 'react-intl'; - -import { Button } from '../../../components/button'; - -class ConfirmationModal extends PureComponent { - - static propTypes = { - message: PropTypes.node.isRequired, - confirm: PropTypes.string.isRequired, - onClose: PropTypes.func.isRequired, - onConfirm: PropTypes.func.isRequired, - secondary: PropTypes.string, - onSecondary: PropTypes.func, - closeWhenConfirm: PropTypes.bool, - onDoNotAsk: PropTypes.func, - intl: PropTypes.object.isRequired, - }; - - static defaultProps = { - closeWhenConfirm: true, - }; - - handleClick = () => { - if (this.props.closeWhenConfirm) { - this.props.onClose(); - } - this.props.onConfirm(); - if (this.props.onDoNotAsk && this.doNotAskCheckbox.checked) { - this.props.onDoNotAsk(); - } - }; - - handleSecondary = () => { - this.props.onClose(); - this.props.onSecondary(); - }; - - handleCancel = () => { - this.props.onClose(); - }; - - setDoNotAskRef = (c) => { - this.doNotAskCheckbox = c; - }; - - render () { - const { message, confirm, secondary, onDoNotAsk } = this.props; - - return ( -
-
- {message} -
- -
- { onDoNotAsk && ( -
- - -
- )} -
- - {secondary !== undefined && ( -
-
-
- ); - } - -} - -export default injectIntl(ConfirmationModal); diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/clear_notifications.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/clear_notifications.tsx new file mode 100644 index 00000000000000..65604462896db1 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/clear_notifications.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { clearNotifications } from 'flavours/glitch/actions/notification_groups'; +import { useAppDispatch } from 'flavours/glitch/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + clearTitle: { + id: 'notifications.clear_title', + defaultMessage: 'Clear notifications?', + }, + clearMessage: { + id: 'notifications.clear_confirmation', + defaultMessage: + 'Are you sure you want to permanently clear all your notifications?', + }, + clearConfirm: { + id: 'notifications.clear', + defaultMessage: 'Clear notifications', + }, +}); + +export const ConfirmClearNotificationsModal: React.FC< + BaseConfirmationModalProps +> = ({ onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + void dispatch(clearNotifications()); + }, [dispatch]); + + return ( + + ); +}; diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/confirmation_modal.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/confirmation_modal.tsx new file mode 100644 index 00000000000000..429850ef32ce80 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/confirmation_modal.tsx @@ -0,0 +1,87 @@ +import { useCallback } from 'react'; + +import { FormattedMessage, defineMessages } from 'react-intl'; + +import { Button } from 'flavours/glitch/components/button'; + +export interface BaseConfirmationModalProps { + onClose: () => void; +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars -- keep the message around while we find a place to show it +const messages = defineMessages({ + doNotAskAgain: { + id: 'confirmation_modal.do_not_ask_again', + defaultMessage: 'Do not ask for confirmation again', + }, +}); + +export const ConfirmationModal: React.FC< + { + title: React.ReactNode; + message: React.ReactNode; + confirm: React.ReactNode; + secondary?: React.ReactNode; + onSecondary?: () => void; + onConfirm: () => void; + closeWhenConfirm?: boolean; + } & BaseConfirmationModalProps +> = ({ + title, + message, + confirm, + onClose, + onConfirm, + secondary, + onSecondary, + closeWhenConfirm = true, +}) => { + const handleClick = useCallback(() => { + if (closeWhenConfirm) { + onClose(); + } + + onConfirm(); + }, [onClose, onConfirm, closeWhenConfirm]); + + const handleSecondary = useCallback(() => { + onClose(); + onSecondary?.(); + }, [onClose, onSecondary]); + + const handleCancel = useCallback(() => { + onClose(); + }, [onClose]); + + return ( +
+
+
+

{title}

+

{message}

+
+
+ +
+
+ {secondary && ( + <> + + +
+ + )} + + + + +
+
+
+ ); +}; diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/delete_list.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/delete_list.tsx new file mode 100644 index 00000000000000..948b6c83da5734 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/delete_list.tsx @@ -0,0 +1,58 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { useHistory } from 'react-router'; + +import { removeColumn } from 'flavours/glitch/actions/columns'; +import { deleteList } from 'flavours/glitch/actions/lists'; +import { useAppDispatch } from 'flavours/glitch/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + deleteListTitle: { + id: 'confirmations.delete_list.title', + defaultMessage: 'Delete list?', + }, + deleteListMessage: { + id: 'confirmations.delete_list.message', + defaultMessage: 'Are you sure you want to permanently delete this list?', + }, + deleteListConfirm: { + id: 'confirmations.delete_list.confirm', + defaultMessage: 'Delete', + }, +}); + +export const ConfirmDeleteListModal: React.FC< + { + listId: string; + columnId: string; + } & BaseConfirmationModalProps +> = ({ listId, columnId, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const history = useHistory(); + + const onConfirm = useCallback(() => { + dispatch(deleteList(listId)); + + if (columnId) { + dispatch(removeColumn(columnId)); + } else { + history.push('/lists'); + } + }, [dispatch, history, columnId, listId]); + + return ( + + ); +}; diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/delete_status.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/delete_status.tsx new file mode 100644 index 00000000000000..e86cec10c0b015 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/delete_status.tsx @@ -0,0 +1,67 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { deleteStatus } from 'flavours/glitch/actions/statuses'; +import { useAppDispatch } from 'flavours/glitch/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + deleteAndRedraftTitle: { + id: 'confirmations.redraft.title', + defaultMessage: 'Delete & redraft post?', + }, + deleteAndRedraftMessage: { + id: 'confirmations.redraft.message', + defaultMessage: + 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.', + }, + deleteAndRedraftConfirm: { + id: 'confirmations.redraft.confirm', + defaultMessage: 'Delete & redraft', + }, + deleteTitle: { + id: 'confirmations.delete.title', + defaultMessage: 'Delete post?', + }, + deleteMessage: { + id: 'confirmations.delete.message', + defaultMessage: 'Are you sure you want to delete this status?', + }, + deleteConfirm: { + id: 'confirmations.delete.confirm', + defaultMessage: 'Delete', + }, +}); + +export const ConfirmDeleteStatusModal: React.FC< + { + statusId: string; + withRedraft: boolean; + } & BaseConfirmationModalProps +> = ({ statusId, withRedraft, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(deleteStatus(statusId, withRedraft)); + }, [dispatch, statusId, withRedraft]); + + return ( + + ); +}; diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/edit_status.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/edit_status.tsx new file mode 100644 index 00000000000000..4a7e56c2a120d2 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/edit_status.tsx @@ -0,0 +1,45 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { editStatus } from 'flavours/glitch/actions/statuses'; +import { useAppDispatch } from 'flavours/glitch/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + editTitle: { + id: 'confirmations.edit.title', + defaultMessage: 'Overwrite post?', + }, + editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' }, + editMessage: { + id: 'confirmations.edit.message', + defaultMessage: + 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?', + }, +}); + +export const ConfirmEditStatusModal: React.FC< + { + statusId: string; + } & BaseConfirmationModalProps +> = ({ statusId, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(editStatus(statusId)); + }, [dispatch, statusId]); + + return ( + + ); +}; diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/index.ts b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/index.ts new file mode 100644 index 00000000000000..912c99a393a1f0 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/index.ts @@ -0,0 +1,8 @@ +export { ConfirmationModal } from './confirmation_modal'; +export { ConfirmDeleteStatusModal } from './delete_status'; +export { ConfirmDeleteListModal } from './delete_list'; +export { ConfirmReplyModal } from './reply'; +export { ConfirmEditStatusModal } from './edit_status'; +export { ConfirmUnfollowModal } from './unfollow'; +export { ConfirmClearNotificationsModal } from './clear_notifications'; +export { ConfirmLogOutModal } from './log_out'; diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/log_out.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/log_out.tsx new file mode 100644 index 00000000000000..ac9439461f3360 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/log_out.tsx @@ -0,0 +1,40 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { logOut } from 'flavours/glitch/utils/log_out'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + logoutTitle: { id: 'confirmations.logout.title', defaultMessage: 'Log out?' }, + logoutMessage: { + id: 'confirmations.logout.message', + defaultMessage: 'Are you sure you want to log out?', + }, + logoutConfirm: { + id: 'confirmations.logout.confirm', + defaultMessage: 'Log out', + }, +}); + +export const ConfirmLogOutModal: React.FC = ({ + onClose, +}) => { + const intl = useIntl(); + + const onConfirm = useCallback(() => { + logOut(); + }, []); + + return ( + + ); +}; diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/reply.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/reply.tsx new file mode 100644 index 00000000000000..415a4539549fdf --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/reply.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { replyCompose } from 'flavours/glitch/actions/compose'; +import type { Status } from 'flavours/glitch/models/status'; +import { useAppDispatch } from 'flavours/glitch/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + replyTitle: { + id: 'confirmations.reply.title', + defaultMessage: 'Overwrite post?', + }, + replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, + replyMessage: { + id: 'confirmations.reply.message', + defaultMessage: + 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?', + }, +}); + +export const ConfirmReplyModal: React.FC< + { + status: Status; + } & BaseConfirmationModalProps +> = ({ status, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(replyCompose(status)); + }, [dispatch, status]); + + return ( + + ); +}; diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/unfollow.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/unfollow.tsx new file mode 100644 index 00000000000000..fe6f5e362d00e2 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/unfollow.tsx @@ -0,0 +1,50 @@ +import { useCallback } from 'react'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import { unfollowAccount } from 'flavours/glitch/actions/accounts'; +import type { Account } from 'flavours/glitch/models/account'; +import { useAppDispatch } from 'flavours/glitch/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + unfollowTitle: { + id: 'confirmations.unfollow.title', + defaultMessage: 'Unfollow user?', + }, + unfollowConfirm: { + id: 'confirmations.unfollow.confirm', + defaultMessage: 'Unfollow', + }, +}); + +export const ConfirmUnfollowModal: React.FC< + { + account: Account; + } & BaseConfirmationModalProps +> = ({ account, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(unfollowAccount(account.id)); + }, [dispatch, account.id]); + + return ( + @{account.acct}
}} + /> + } + confirm={intl.formatMessage(messages.unfollowConfirm)} + onConfirm={onConfirm} + onClose={onClose} + /> + ); +}; diff --git a/app/javascript/flavours/glitch/features/ui/components/disabled_account_banner.jsx b/app/javascript/flavours/glitch/features/ui/components/disabled_account_banner.jsx index 396127829b5847..7a19983a9c5a76 100644 --- a/app/javascript/flavours/glitch/features/ui/components/disabled_account_banner.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/disabled_account_banner.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -9,29 +9,15 @@ import { connect } from 'react-redux'; import { openModal } from 'flavours/glitch/actions/modal'; import { disabledAccountId, movedToAccountId, domain } from 'flavours/glitch/initial_state'; -import { logOut } from 'flavours/glitch/utils/log_out'; - -const messages = defineMessages({ - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, -}); const mapStateToProps = (state) => ({ disabledAcct: state.getIn(['accounts', disabledAccountId, 'acct']), movedToAcct: movedToAccountId ? state.getIn(['accounts', movedToAccountId, 'acct']) : undefined, }); -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onLogout () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); }, }); diff --git a/app/javascript/flavours/glitch/features/ui/components/link_footer.jsx b/app/javascript/flavours/glitch/features/ui/components/link_footer.jsx index 7c0ece465f0d71..fb07f9e549ebb0 100644 --- a/app/javascript/flavours/glitch/features/ui/components/link_footer.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/link_footer.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -11,24 +11,11 @@ import { openModal } from 'flavours/glitch/actions/modal'; import { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context'; import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'flavours/glitch/initial_state'; import { PERMISSION_INVITE_USERS } from 'flavours/glitch/permissions'; -import { logOut } from 'flavours/glitch/utils/log_out'; -const messages = defineMessages({ - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, -}); - -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onLogout () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); + }, }); diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx b/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx index 063316ef1b7db2..0bc393f7e859f4 100644 --- a/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx @@ -28,7 +28,16 @@ import ActionsModal from './actions_modal'; import AudioModal from './audio_modal'; import { BoostModal } from './boost_modal'; import BundleModalError from './bundle_modal_error'; -import ConfirmationModal from './confirmation_modal'; +import { + ConfirmationModal, + ConfirmDeleteStatusModal, + ConfirmDeleteListModal, + ConfirmReplyModal, + ConfirmEditStatusModal, + ConfirmUnfollowModal, + ConfirmClearNotificationsModal, + ConfirmLogOutModal, +} from './confirmation_modals'; import DeprecatedSettingsModal from './deprecated_settings_modal'; import DoodleModal from './doodle_modal'; import FavouriteModal from './favourite_modal'; @@ -47,6 +56,13 @@ export const MODAL_COMPONENTS = { 'FAVOURITE': () => Promise.resolve({ default: FavouriteModal }), 'DOODLE': () => Promise.resolve({ default: DoodleModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), + 'CONFIRM_DELETE_STATUS': () => Promise.resolve({ default: ConfirmDeleteStatusModal }), + 'CONFIRM_DELETE_LIST': () => Promise.resolve({ default: ConfirmDeleteListModal }), + 'CONFIRM_REPLY': () => Promise.resolve({ default: ConfirmReplyModal }), + 'CONFIRM_EDIT_STATUS': () => Promise.resolve({ default: ConfirmEditStatusModal }), + 'CONFIRM_UNFOLLOW': () => Promise.resolve({ default: ConfirmUnfollowModal }), + 'CONFIRM_CLEAR_NOTIFICATIONS': () => Promise.resolve({ default: ConfirmClearNotificationsModal }), + 'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }), 'MUTE': MuteModal, 'BLOCK': BlockModal, 'DOMAIN_BLOCK': DomainBlockModal, diff --git a/app/javascript/flavours/glitch/locales/en.json b/app/javascript/flavours/glitch/locales/en.json index 5ab92732ce9729..02e44932f8adbf 100644 --- a/app/javascript/flavours/glitch/locales/en.json +++ b/app/javascript/flavours/glitch/locales/en.json @@ -34,10 +34,6 @@ "confirmations.missing_media_description.confirm": "Send anyway", "confirmations.missing_media_description.edit": "Edit media", "confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.", - "confirmations.unfilter.author": "Author", - "confirmations.unfilter.confirm": "Show", - "confirmations.unfilter.edit_filter": "Edit filter", - "confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}", "direct.group_by_conversations": "Group by conversation", "endorsed_accounts_editor.endorsed_accounts": "Featured accounts", "favourite_modal.combo": "You can press {combo} to skip this next time", diff --git a/app/javascript/flavours/glitch/models/notification_group.ts b/app/javascript/flavours/glitch/models/notification_group.ts index 6c8b8eb6e3d555..b29ad35249c2b1 100644 --- a/app/javascript/flavours/glitch/models/notification_group.ts +++ b/app/javascript/flavours/glitch/models/notification_group.ts @@ -14,7 +14,7 @@ import type { ApiReportJSON } from 'flavours/glitch/api_types/reports'; export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8; interface BaseNotificationGroup - extends Omit { + extends Omit { sampleAccountIds: string[]; } @@ -115,8 +115,7 @@ function createAccountRelationshipSeveranceEventFromJSON( export function createNotificationGroupFromJSON( groupJson: ApiNotificationGroupJSON, ): NotificationGroup { - const { sample_accounts, ...group } = groupJson; - const sampleAccountIds = sample_accounts.map((account) => account.id); + const { sample_account_ids: sampleAccountIds, ...group } = groupJson; switch (group.type) { case 'favourite': @@ -125,9 +124,9 @@ export function createNotificationGroupFromJSON( case 'mention': case 'poll': case 'update': { - const { status, ...groupWithoutStatus } = group; + const { status_id: statusId, ...groupWithoutStatus } = group; return { - statusId: status.id, + statusId, sampleAccountIds, ...groupWithoutStatus, }; diff --git a/app/javascript/flavours/glitch/reducers/notification_policy.ts b/app/javascript/flavours/glitch/reducers/notification_policy.ts index 2d5450ce448e39..0ec68f89506601 100644 --- a/app/javascript/flavours/glitch/reducers/notification_policy.ts +++ b/app/javascript/flavours/glitch/reducers/notification_policy.ts @@ -2,17 +2,25 @@ import { createReducer, isAnyOf } from '@reduxjs/toolkit'; import { fetchNotificationPolicy, + decreasePendingNotificationsCount, updateNotificationsPolicy, } from 'flavours/glitch/actions/notification_policies'; import type { NotificationPolicy } from 'flavours/glitch/models/notification_policy'; export const notificationPolicyReducer = createReducer(null, (builder) => { - builder.addMatcher( - isAnyOf( - fetchNotificationPolicy.fulfilled, - updateNotificationsPolicy.fulfilled, - ), - (_state, action) => action.payload, - ); + builder + .addCase(decreasePendingNotificationsCount, (state, action) => { + if (state) { + state.summary.pending_notifications_count -= action.payload; + state.summary.pending_requests_count -= 1; + } + }) + .addMatcher( + isAnyOf( + fetchNotificationPolicy.fulfilled, + updateNotificationsPolicy.fulfilled, + ), + (_state, action) => action.payload, + ); }); diff --git a/app/javascript/flavours/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js index f5768aedc6d0b5..ff4af68752b82f 100644 --- a/app/javascript/flavours/glitch/reducers/settings.js +++ b/app/javascript/flavours/glitch/reducers/settings.js @@ -52,6 +52,7 @@ const initialState = ImmutableMap({ dismissPermissionBanner: false, showUnread: true, + minimizeFilteredBanner: false, shows: ImmutableMap({ follow: true, diff --git a/app/javascript/flavours/glitch/selectors/settings.ts b/app/javascript/flavours/glitch/selectors/settings.ts index ce2b8b15e59cb1..9a1a2c990baa40 100644 --- a/app/javascript/flavours/glitch/selectors/settings.ts +++ b/app/javascript/flavours/glitch/selectors/settings.ts @@ -37,4 +37,9 @@ export const selectNeedsNotificationPermission = (state: RootState) => 'dismissPermissionBanner', ])) as boolean; +export const selectSettingsNotificationsMinimizeFilteredBanner = ( + state: RootState, +) => + state.settings.getIn(['notifications', 'minimizeFilteredBanner']) as boolean; + /* eslint-enable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ diff --git a/app/javascript/flavours/glitch/styles/_mixins.scss b/app/javascript/flavours/glitch/styles/_mixins.scss index a59bb2d4419559..444d2e01609641 100644 --- a/app/javascript/flavours/glitch/styles/_mixins.scss +++ b/app/javascript/flavours/glitch/styles/_mixins.scss @@ -1,15 +1,3 @@ -@mixin avatar-radius() { - border-radius: $ui-avatar-border-size; - background-position: 50%; - background-clip: padding-box; -} - -@mixin avatar-size($size: 48px) { - width: $size; - height: $size; - background-size: $size $size; -} - @mixin fullwidth-gallery { &.full-width { margin-left: -14px; diff --git a/app/javascript/flavours/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss index eba786ff9f6ac5..aa0d739e295004 100644 --- a/app/javascript/flavours/glitch/styles/accounts.scss +++ b/app/javascript/flavours/glitch/styles/accounts.scss @@ -49,8 +49,6 @@ flex: 0 0 auto; width: 48px; height: 48px; - @include avatar-size(48px); - padding-top: 2px; img { @@ -59,8 +57,6 @@ display: block; margin: 0; border-radius: 4px; - @include avatar-radius; - background: darken($ui-base-color, 8%); object-fit: cover; } @@ -359,6 +355,10 @@ color: $primary-text-color; font-weight: 700; } + + .warning-hint { + font-weight: normal !important; + } } &__body { diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index f4289a9ac34afa..110d5f249d7f94 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -1,6 +1,6 @@ @use 'sass:math'; -$no-columns-breakpoint: 600px; +$no-columns-breakpoint: 890px; $sidebar-width: 300px; $content-width: 840px; diff --git a/app/javascript/flavours/glitch/styles/basics.scss b/app/javascript/flavours/glitch/styles/basics.scss index e59dba3b655048..2223893336c30c 100644 --- a/app/javascript/flavours/glitch/styles/basics.scss +++ b/app/javascript/flavours/glitch/styles/basics.scss @@ -66,10 +66,6 @@ body { } } - &.lighter { - background: $ui-base-color; - } - &.with-modals { overflow-x: hidden; overflow-y: scroll; @@ -109,7 +105,6 @@ body { } &.embed { - background: lighten($ui-base-color, 4%); margin: 0; padding-bottom: 0; @@ -122,15 +117,12 @@ body { } &.admin { - background: var(--background-color); padding: 0; } &.error { position: absolute; text-align: center; - color: $darker-text-color; - background: $ui-base-color; width: 100%; height: 100%; padding: 0; diff --git a/app/javascript/flavours/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss index aa96ef6b209628..6506151b283d04 100644 --- a/app/javascript/flavours/glitch/styles/components.scss +++ b/app/javascript/flavours/glitch/styles/components.scss @@ -2162,17 +2162,15 @@ body > [data-popper-placement] { } .account__avatar { - @include avatar-radius; - display: block; position: relative; - overflow: hidden; img { display: block; width: 100%; height: 100%; object-fit: cover; + border-radius: 4px; } &-inline { @@ -2182,8 +2180,6 @@ body > [data-popper-placement] { } &-composite { - @include avatar-radius; - overflow: hidden; position: relative; @@ -2210,6 +2206,29 @@ body > [data-popper-placement] { font-size: 15px; } } + + &__counter { + $height: 16px; + $h-padding: 5px; + + position: absolute; + bottom: -3px; + inset-inline-end: -3px; + padding-left: $h-padding; + padding-right: $h-padding; + height: $height; + border-radius: $height; + min-width: $height - 2 * $h-padding; // to ensure that it is never narrower than a circle + line-height: $height + 1px; // to visually center the numbers + background-color: $ui-button-background-color; + color: $white; + border-width: 1px; + border-style: solid; + border-color: var(--background-color); + font-size: 11px; + font-weight: 500; + text-align: center; + } } a .account__avatar { @@ -6523,6 +6542,25 @@ a.status-card { } } + &__confirmation { + font-size: 14px; + line-height: 20px; + color: $darker-text-color; + + h1 { + font-size: 16px; + line-height: 24px; + color: $primary-text-color; + font-weight: 500; + margin-bottom: 8px; + } + + strong { + font-weight: 700; + color: $primary-text-color; + } + } + &__bullet-points { display: flex; flex-direction: column; @@ -6609,11 +6647,8 @@ a.status-card { .doodle-modal, .boost-modal, -.confirmation-modal, .report-modal, .actions-modal, -.mute-modal, -.block-modal, .compare-history-modal { background: lighten($ui-secondary-color, 8%); color: $inverted-text-color; @@ -6648,10 +6683,7 @@ a.status-card { } .doodle-modal__action-bar, -.boost-modal__action-bar, -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.block-modal__action-bar { +.boost-modal__action-bar { display: flex; justify-content: space-between; align-items: center; @@ -6674,16 +6706,6 @@ a.status-card { } } -.mute-modal, -.block-modal { - line-height: 24px; -} - -.mute-modal .react-toggle, -.block-modal .react-toggle { - vertical-align: middle; -} - .report-modal { width: 90vw; max-width: 700px; @@ -7078,31 +7100,7 @@ a.status-card { } } -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.block-modal__action-bar { - .confirmation-modal__secondary-button { - flex-shrink: 1; - } -} - -.confirmation-modal__secondary-button, -.confirmation-modal__cancel-button, -.mute-modal__cancel-button, -.block-modal__cancel-button { - background-color: transparent; - color: $lighter-text-color; - font-size: 14px; - font-weight: 500; - - &:hover, - &:focus, - &:active { - color: darken($lighter-text-color, 4%); - background-color: transparent; - } -} - +// TODO .confirmation-modal__do_not_ask_again { padding-inline-start: 20px; padding-inline-end: 20px; @@ -7115,9 +7113,6 @@ a.status-card { } } -.confirmation-modal__container, -.mute-modal__container, -.block-modal__container, .report-modal__target { padding: 30px; font-size: 16px; @@ -7151,31 +7146,10 @@ a.status-card { } } -.confirmation-modal__container, .report-modal__target { text-align: center; } -.block-modal, -.mute-modal { - &__explanation { - margin-top: 20px; - } - - .setting-toggle { - margin-top: 20px; - margin-bottom: 24px; - display: flex; - align-items: center; - - &__label { - color: $inverted-text-color; - margin: 0; - margin-inline-start: 8px; - } - } -} - .report-modal__target { padding: 15px; @@ -10775,25 +10749,10 @@ noscript { } &__badge { - display: flex; - align-items: center; - border-radius: 999px; - background: var(--background-border-color); - color: $darker-text-color; - padding: 4px; - padding-inline-end: 8px; - gap: 6px; - font-weight: 500; - font-size: 11px; - line-height: 16px; - word-break: keep-all; - - &__badge { - background: $ui-button-background-color; - color: $white; - border-radius: 100px; - padding: 2px 8px; - } + background: $ui-button-background-color; + color: $white; + border-radius: 100px; + padding: 2px 8px; } } @@ -10834,6 +10793,12 @@ noscript { letter-spacing: 0.5px; line-height: 24px; color: $secondary-text-color; + + bdi { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } } .filtered-notifications-banner__badge { diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss index 5330b5a20a7114..9363e428b3809b 100644 --- a/app/javascript/flavours/glitch/styles/containers.scss +++ b/app/javascript/flavours/glitch/styles/containers.scss @@ -72,12 +72,9 @@ } .avatar { - width: 40px; - height: 40px; + width: 48px; + height: 48px; flex: 0 0 auto; - @include avatar-size(40px); - - margin-inline-end: 10px; img { width: 100%; @@ -85,7 +82,6 @@ display: block; margin: 0; border-radius: 4px; - @include avatar-radius; } } diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss index b7d508cdccd14b..e97b40d3f744f4 100644 --- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss +++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss @@ -298,12 +298,6 @@ html { .directory__tag > div { background: $white; border: 1px solid var(--background-border-color); - - @media screen and (max-width: $no-gap-breakpoint) { - border-left: 0; - border-right: 0; - border-top: 0; - } } .picture-in-picture-placeholder { @@ -318,10 +312,6 @@ html { &:focus { background: $ui-base-color; } - - @media screen and (max-width: $no-gap-breakpoint) { - border: 0; - } } .batch-table { diff --git a/app/javascript/flavours/glitch/styles/tables.scss b/app/javascript/flavours/glitch/styles/tables.scss index caebb952b8511a..dd73f6e2055f1b 100644 --- a/app/javascript/flavours/glitch/styles/tables.scss +++ b/app/javascript/flavours/glitch/styles/tables.scss @@ -286,6 +286,10 @@ a.table-action-link { padding: 0; } + &--padded { + padding: 12px 16px 16px; + } + &--with-image { display: flex; align-items: center; diff --git a/app/javascript/mastodon/actions/notification_groups.ts b/app/javascript/mastodon/actions/notification_groups.ts index 8fdec6e48bb4df..fc5807c8c081df 100644 --- a/app/javascript/mastodon/actions/notification_groups.ts +++ b/app/javascript/mastodon/actions/notification_groups.ts @@ -38,10 +38,6 @@ function dispatchAssociatedRecords( const fetchedStatuses: ApiStatusJSON[] = []; notifications.forEach((notification) => { - if ('sample_accounts' in notification) { - fetchedAccounts.push(...notification.sample_accounts); - } - if (notification.type === 'admin.report') { fetchedAccounts.push(notification.report.target_account); } @@ -75,7 +71,9 @@ export const fetchNotifications = createDataLoadingThunk( : excludeAllTypesExcept(activeFilter), }); }, - ({ notifications }, { dispatch }) => { + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); dispatchAssociatedRecords(dispatch, notifications); const payload: (ApiNotificationGroupJSON | NotificationGap)[] = notifications; @@ -95,7 +93,9 @@ export const fetchNotificationsGap = createDataLoadingThunk( async (params: { gap: NotificationGap }) => apiFetchNotifications({ max_id: params.gap.maxId }), - ({ notifications }, { dispatch }) => { + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); dispatchAssociatedRecords(dispatch, notifications); return { notifications }; diff --git a/app/javascript/mastodon/actions/notification_policies.ts b/app/javascript/mastodon/actions/notification_policies.ts index fcc9919c499f47..b182bcf6996326 100644 --- a/app/javascript/mastodon/actions/notification_policies.ts +++ b/app/javascript/mastodon/actions/notification_policies.ts @@ -1,3 +1,5 @@ +import { createAction } from '@reduxjs/toolkit'; + import { apiGetNotificationPolicy, apiUpdateNotificationsPolicy, @@ -14,3 +16,7 @@ export const updateNotificationsPolicy = createDataLoadingThunk( 'notificationPolicy/update', (policy: Partial) => apiUpdateNotificationsPolicy(policy), ); + +export const decreasePendingNotificationsCount = createAction( + 'notificationPolicy/decreasePendingNotificationCount', +); diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 7e4320c27b7d5b..48afb003ad32c8 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -18,6 +18,7 @@ import { importFetchedStatuses, } from './importer'; import { submitMarkers } from './markers'; +import { decreasePendingNotificationsCount } from './notification_policies'; import { notificationsUpdate } from "./notifications_typed"; import { register as registerPushNotifications } from './push_notifications'; import { saveSettings } from './settings'; @@ -84,6 +85,12 @@ const fetchRelatedRelationships = (dispatch, notifications) => { } }; +const selectNotificationCountForRequest = (state, id) => { + const requests = state.getIn(['notificationRequests', 'items']); + const thisRequest = requests.find(request => request.get('id') === id); + return thisRequest ? thisRequest.get('notifications_count') : 0; +}; + export const loadPending = () => ({ type: NOTIFICATIONS_LOAD_PENDING, }); @@ -433,11 +440,13 @@ export const fetchNotificationRequestFail = (id, error) => ({ error, }); -export const acceptNotificationRequest = id => (dispatch) => { +export const acceptNotificationRequest = (id) => (dispatch, getState) => { + const count = selectNotificationCountForRequest(getState(), id); dispatch(acceptNotificationRequestRequest(id)); api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { dispatch(acceptNotificationRequestSuccess(id)); + dispatch(decreasePendingNotificationsCount(count)); }).catch(err => { dispatch(acceptNotificationRequestFail(id, err)); }); @@ -459,11 +468,13 @@ export const acceptNotificationRequestFail = (id, error) => ({ error, }); -export const dismissNotificationRequest = id => (dispatch) => { +export const dismissNotificationRequest = (id) => (dispatch, getState) => { + const count = selectNotificationCountForRequest(getState(), id); dispatch(dismissNotificationRequestRequest(id)); api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ dispatch(dismissNotificationRequestSuccess(id)); + dispatch(decreasePendingNotificationsCount(count)); }).catch(err => { dispatch(dismissNotificationRequestFail(id, err)); }); diff --git a/app/javascript/mastodon/api/notifications.ts b/app/javascript/mastodon/api/notifications.ts index c1ab6f70cafbde..ed187da5eccae0 100644 --- a/app/javascript/mastodon/api/notifications.ts +++ b/app/javascript/mastodon/api/notifications.ts @@ -1,17 +1,24 @@ import api, { apiRequest, getLinks } from 'mastodon/api'; -import type { ApiNotificationGroupJSON } from 'mastodon/api_types/notifications'; +import type { ApiNotificationGroupsResultJSON } from 'mastodon/api_types/notifications'; export const apiFetchNotifications = async (params?: { exclude_types?: string[]; max_id?: string; }) => { - const response = await api().request({ + const response = await api().request({ method: 'GET', url: '/api/v2_alpha/notifications', params, }); - return { notifications: response.data, links: getLinks(response) }; + const { statuses, accounts, notification_groups } = response.data; + + return { + statuses, + accounts, + notifications: notification_groups, + links: getLinks(response), + }; }; export const apiClearNotifications = () => diff --git a/app/javascript/mastodon/api_types/notifications.ts b/app/javascript/mastodon/api_types/notifications.ts index d7cbbca73b9ec3..ed73ceda6b332d 100644 --- a/app/javascript/mastodon/api_types/notifications.ts +++ b/app/javascript/mastodon/api_types/notifications.ts @@ -51,7 +51,7 @@ export interface BaseNotificationGroupJSON { group_key: string; notifications_count: number; type: NotificationType; - sample_accounts: ApiAccountJSON[]; + sample_account_ids: string[]; latest_page_notification_at: string; // FIXME: This will only be present if the notification group is returned in a paginated list, not requested directly most_recent_notification_id: string; page_min_id?: string; @@ -60,7 +60,7 @@ export interface BaseNotificationGroupJSON { interface NotificationGroupWithStatusJSON extends BaseNotificationGroupJSON { type: NotificationWithStatusType; - status: ApiStatusJSON; + status_id: string; } interface NotificationWithStatusJSON extends BaseNotificationJSON { @@ -143,3 +143,9 @@ export type ApiNotificationGroupJSON = | AccountRelationshipSeveranceNotificationGroupJSON | NotificationGroupWithStatusJSON | ModerationWarningNotificationGroupJSON; + +export interface ApiNotificationGroupsResultJSON { + accounts: ApiAccountJSON[]; + statuses: ApiStatusJSON[]; + notification_groups: ApiNotificationGroupJSON[]; +} diff --git a/app/javascript/mastodon/components/avatar.tsx b/app/javascript/mastodon/components/avatar.tsx index 8f866a3c65645e..8b16296c2c0403 100644 --- a/app/javascript/mastodon/components/avatar.tsx +++ b/app/javascript/mastodon/components/avatar.tsx @@ -11,6 +11,8 @@ interface Props { style?: React.CSSProperties; inline?: boolean; animate?: boolean; + counter?: number | string; + counterBorderColor?: string; } export const Avatar: React.FC = ({ @@ -19,6 +21,8 @@ export const Avatar: React.FC = ({ size = 20, inline = false, style: styleFromParent, + counter, + counterBorderColor, }) => { const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate); @@ -43,6 +47,14 @@ export const Avatar: React.FC = ({ style={style} > {src && } + {counter && ( +
+ {counter} +
+ )}
); }; diff --git a/app/javascript/mastodon/components/domain.tsx b/app/javascript/mastodon/components/domain.tsx index ed5e8e7e4c20ef..aa64f0f8c3dd1d 100644 --- a/app/javascript/mastodon/components/domain.tsx +++ b/app/javascript/mastodon/components/domain.tsx @@ -3,6 +3,8 @@ import { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react'; +import { unblockDomain } from 'mastodon/actions/domain_blocks'; +import { useAppDispatch } from 'mastodon/store'; import { IconButton } from './icon_button'; @@ -13,17 +15,15 @@ const messages = defineMessages({ }, }); -interface Props { +export const Domain: React.FC<{ domain: string; - onUnblockDomain: (domain: string) => void; -} - -export const Domain: React.FC = ({ domain, onUnblockDomain }) => { +}> = ({ domain }) => { const intl = useIntl(); + const dispatch = useAppDispatch(); const handleDomainUnblock = useCallback(() => { - onUnblockDomain(domain); - }, [domain, onUnblockDomain]); + dispatch(unblockDomain(domain)); + }, [dispatch, domain]); return (
diff --git a/app/javascript/mastodon/components/dropdown_menu.jsx b/app/javascript/mastodon/components/dropdown_menu.jsx index 524dbb927b426a..d731a8e2d1f6ef 100644 --- a/app/javascript/mastodon/components/dropdown_menu.jsx +++ b/app/javascript/mastodon/components/dropdown_menu.jsx @@ -20,7 +20,7 @@ let id = 0; class DropdownMenu extends PureComponent { static propTypes = { - items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired, + items: PropTypes.array.isRequired, loading: PropTypes.bool, scrollable: PropTypes.bool, onClose: PropTypes.func.isRequired, @@ -39,6 +39,7 @@ class DropdownMenu extends PureComponent { if (this.node && !this.node.contains(e.target)) { this.props.onClose(); e.stopPropagation(); + e.preventDefault(); } }; @@ -164,7 +165,7 @@ class Dropdown extends PureComponent { children: PropTypes.node, icon: PropTypes.string, iconComponent: PropTypes.func, - items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]), + items: PropTypes.array.isRequired, loading: PropTypes.bool, size: PropTypes.number, title: PropTypes.string, diff --git a/app/javascript/mastodon/components/follow_button.tsx b/app/javascript/mastodon/components/follow_button.tsx index ecc4e1ee175f63..222789318e83ba 100644 --- a/app/javascript/mastodon/components/follow_button.tsx +++ b/app/javascript/mastodon/components/follow_button.tsx @@ -1,13 +1,9 @@ import { useCallback, useEffect } from 'react'; -import { useIntl, defineMessages, FormattedMessage } from 'react-intl'; +import { useIntl, defineMessages } from 'react-intl'; import { useIdentity } from '@/mastodon/identity_context'; -import { - fetchRelationships, - followAccount, - unfollowAccount, -} from 'mastodon/actions/accounts'; +import { fetchRelationships, followAccount } from 'mastodon/actions/accounts'; import { openModal } from 'mastodon/actions/modal'; import { Button } from 'mastodon/components/button'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; @@ -60,29 +56,14 @@ export const FollowButton: React.FC<{ if (accountId === me) { return; - } else if (relationship.following || relationship.requested) { + } else if (account && (relationship.following || relationship.requested)) { dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - message: ( - @{account?.acct} }} - /> - ), - confirm: intl.formatMessage(messages.unfollow), - onConfirm: () => { - dispatch(unfollowAccount(accountId)); - }, - }, - }), + openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }), ); } else { dispatch(followAccount(accountId)); } - }, [dispatch, intl, accountId, relationship, account, signedIn]); + }, [dispatch, accountId, relationship, account, signedIn]); let label; diff --git a/app/javascript/mastodon/containers/account_container.jsx b/app/javascript/mastodon/containers/account_container.jsx index f171fcc2fe5d19..d34962fa4a5f44 100644 --- a/app/javascript/mastodon/containers/account_container.jsx +++ b/app/javascript/mastodon/containers/account_container.jsx @@ -1,24 +1,20 @@ -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; +import { openModal } from 'mastodon/actions/modal'; + import { followAccount, - unfollowAccount, blockAccount, unblockAccount, muteAccount, unmuteAccount, } from '../actions/accounts'; -import { openModal } from '../actions/modal'; import { initMuteModal } from '../actions/mutes'; import Account from '../components/account'; import { makeGetAccount } from '../selectors'; -const messages = defineMessages({ - unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, -}); - const makeMapStateToProps = () => { const getAccount = makeGetAccount(); @@ -29,18 +25,11 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onFollow (account) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: @{account.get('acct')} }} />, - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } })); } else { dispatch(followAccount(account.get('id'))); } diff --git a/app/javascript/mastodon/containers/domain_container.jsx b/app/javascript/mastodon/containers/domain_container.jsx deleted file mode 100644 index c719a5775c7c16..00000000000000 --- a/app/javascript/mastodon/containers/domain_container.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; - -import { connect } from 'react-redux'; - -import { blockDomain, unblockDomain } from '../actions/domain_blocks'; -import { openModal } from '../actions/modal'; -import { Domain } from '../components/domain'; - -const messages = defineMessages({ - blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' }, -}); - -const makeMapStateToProps = () => { - const mapStateToProps = () => ({}); - - return mapStateToProps; -}; - -const mapDispatchToProps = (dispatch, { intl }) => ({ - onBlockDomain (domain) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: {domain} }} />, - confirm: intl.formatMessage(messages.blockDomainConfirm), - onConfirm: () => dispatch(blockDomain(domain)), - }, - })); - }, - - onUnblockDomain (domain) { - dispatch(unblockDomain(domain)); - }, -}); - -export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Domain)); diff --git a/app/javascript/mastodon/containers/status_container.jsx b/app/javascript/mastodon/containers/status_container.jsx index c803822dc057ff..58c5aac8f803cb 100644 --- a/app/javascript/mastodon/containers/status_container.jsx +++ b/app/javascript/mastodon/containers/status_container.jsx @@ -1,4 +1,4 @@ -import { defineMessages, injectIntl } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; @@ -46,18 +46,6 @@ import Status from '../components/status'; import { deleteModal } from '../initial_state'; import { makeGetStatus, makeGetPictureInPicture } from '../selectors'; -const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, - editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' }, - editMessage: { id: 'confirmations.edit.message', defaultMessage: 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, - blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' }, -}); - const makeMapStateToProps = () => { const getStatus = makeGetStatus(); const getPictureInPicture = makeGetPictureInPicture(); @@ -71,20 +59,14 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ +const mapDispatchToProps = (dispatch, { contextType }) => ({ onReply (status) { dispatch((_, getState) => { let state = getState(); if (state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: () => dispatch(replyCompose(status)) }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { dispatch(replyCompose(status)); } @@ -129,14 +111,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ if (!deleteModal) { dispatch(deleteStatus(status.get('id'), withRedraft)); } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } })); } }, @@ -144,14 +119,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ dispatch((_, getState) => { let state = getState(); if (state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.editMessage), - confirm: intl.formatMessage(messages.editConfirm), - onConfirm: () => dispatch(editStatus(status.get('id'))), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } })); } else { dispatch(editStatus(status.get('id'))); } diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx b/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx index 90298879d7c967..8df06bd920a004 100644 --- a/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx +++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.jsx @@ -1,4 +1,4 @@ -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; @@ -6,7 +6,6 @@ import { openURL } from 'mastodon/actions/search'; import { followAccount, - unfollowAccount, unblockAccount, unmuteAccount, pinAccount, @@ -24,11 +23,6 @@ import { initReport } from '../../../actions/reports'; import { makeGetAccount, getAccountHidden } from '../../../selectors'; import Header from '../components/header'; -const messages = defineMessages({ - unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, - blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' }, -}); - const makeMapStateToProps = () => { const getAccount = makeGetAccount(); @@ -41,18 +35,11 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onFollow (account) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: @{account.get('acct')} }} />, - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => dispatch(unfollowAccount(account.get('id'))), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } })); } else { dispatch(followAccount(account.get('id'))); } diff --git a/app/javascript/mastodon/features/compose/components/action_bar.jsx b/app/javascript/mastodon/features/compose/components/action_bar.jsx index be52eac11ea4f2..6c2f27b01bfc97 100644 --- a/app/javascript/mastodon/features/compose/components/action_bar.jsx +++ b/app/javascript/mastodon/features/compose/components/action_bar.jsx @@ -7,7 +7,6 @@ import { useDispatch } from 'react-redux'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import { openModal } from 'mastodon/actions/modal'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; -import { logOut } from 'mastodon/utils/log_out'; const messages = defineMessages({ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, @@ -23,8 +22,6 @@ const messages = defineMessages({ filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' }, - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, }); export const ActionBar = () => { @@ -32,16 +29,8 @@ export const ActionBar = () => { const intl = useIntl(); const handleLogoutClick = useCallback(() => { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); - }, [dispatch, intl]); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); + }, [dispatch]); let menu = []; diff --git a/app/javascript/mastodon/features/compose/index.jsx b/app/javascript/mastodon/features/compose/index.jsx index 83c741fd19119e..3a96ab49c38dc3 100644 --- a/app/javascript/mastodon/features/compose/index.jsx +++ b/app/javascript/mastodon/features/compose/index.jsx @@ -21,7 +21,6 @@ import SettingsIcon from '@/material-icons/400-24px/settings-fill.svg?react'; import { openModal } from 'mastodon/actions/modal'; import Column from 'mastodon/components/column'; import { Icon } from 'mastodon/components/icon'; -import { logOut } from 'mastodon/utils/log_out'; import elephantUIPlane from '../../../images/elephant_ui_plane.svg'; import { changeComposing, mountCompose, unmountCompose } from '../../actions/compose'; @@ -42,8 +41,6 @@ const messages = defineMessages({ preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new post' }, - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, }); const mapStateToProps = (state, ownProps) => ({ @@ -72,20 +69,12 @@ class Compose extends PureComponent { } handleLogoutClick = e => { - const { dispatch, intl } = this.props; + const { dispatch } = this.props; e.preventDefault(); e.stopPropagation(); - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); return false; }; diff --git a/app/javascript/mastodon/features/direct_timeline/components/conversation.jsx b/app/javascript/mastodon/features/direct_timeline/components/conversation.jsx index 326ea3e5ac4502..6588c8b763aee6 100644 --- a/app/javascript/mastodon/features/direct_timeline/components/conversation.jsx +++ b/app/javascript/mastodon/features/direct_timeline/components/conversation.jsx @@ -36,8 +36,6 @@ const messages = defineMessages({ delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' }, muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, }); const getAccounts = createSelector( @@ -103,19 +101,12 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown }) let state = getState(); if (state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: () => dispatch(replyCompose(lastStatus)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status: lastStatus } })); } else { dispatch(replyCompose(lastStatus)); } }); - }, [dispatch, lastStatus, intl]); + }, [dispatch, lastStatus]); const handleDelete = useCallback(() => { dispatch(deleteConversation(id)); diff --git a/app/javascript/mastodon/features/directory/components/account_card.tsx b/app/javascript/mastodon/features/directory/components/account_card.tsx index 7201f6135b440e..2a0470bb728bf9 100644 --- a/app/javascript/mastodon/features/directory/components/account_card.tsx +++ b/app/javascript/mastodon/features/directory/components/account_card.tsx @@ -8,7 +8,6 @@ import { Link } from 'react-router-dom'; import { followAccount, - unfollowAccount, unblockAccount, unmuteAccount, } from 'mastodon/actions/accounts'; @@ -29,20 +28,12 @@ const messages = defineMessages({ id: 'account.cancel_follow_request', defaultMessage: 'Withdraw follow request', }, - cancelFollowRequestConfirm: { - id: 'confirmations.cancel_follow_request.confirm', - defaultMessage: 'Withdraw request', - }, requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request', }, unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' }, unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' }, - unfollowConfirm: { - id: 'confirmations.unfollow.confirm', - defaultMessage: 'Unfollow', - }, edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, }); @@ -89,48 +80,17 @@ export const AccountCard: React.FC<{ accountId: string }> = ({ accountId }) => { const handleFollow = useCallback(() => { if (!account) return; - if (account.getIn(['relationship', 'following'])) { - dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - message: ( - @{account.get('acct')} }} - /> - ), - confirm: intl.formatMessage(messages.unfollowConfirm), - onConfirm: () => { - dispatch(unfollowAccount(account.get('id'))); - }, - }, - }), - ); - } else if (account.getIn(['relationship', 'requested'])) { + if ( + account.getIn(['relationship', 'following']) || + account.getIn(['relationship', 'requested']) + ) { dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - message: ( - @{account.get('acct')} }} - /> - ), - confirm: intl.formatMessage(messages.cancelFollowRequestConfirm), - onConfirm: () => { - dispatch(unfollowAccount(account.get('id'))); - }, - }, - }), + openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }), ); } else { dispatch(followAccount(account.get('id'))); } - }, [account, dispatch, intl]); + }, [account, dispatch]); const handleBlock = useCallback(() => { if (account?.relationship?.blocking) { diff --git a/app/javascript/mastodon/features/domain_blocks/index.jsx b/app/javascript/mastodon/features/domain_blocks/index.jsx index 964eada9c1e5b9..3656596806127d 100644 --- a/app/javascript/mastodon/features/domain_blocks/index.jsx +++ b/app/javascript/mastodon/features/domain_blocks/index.jsx @@ -11,16 +11,15 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react'; +import { Domain } from 'mastodon/components/domain'; import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks'; import { LoadingIndicator } from '../../components/loading_indicator'; import ScrollableList from '../../components/scrollable_list'; -import DomainContainer from '../../containers/domain_container'; import Column from '../ui/components/column'; const messages = defineMessages({ heading: { id: 'column.domain_blocks', defaultMessage: 'Blocked domains' }, - unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' }, }); const mapStateToProps = state => ({ @@ -70,7 +69,7 @@ class Blocks extends ImmutablePureComponent { bindToDocument={!multiColumn} > {domains.map(domain => - , + , )} diff --git a/app/javascript/mastodon/features/list_timeline/index.jsx b/app/javascript/mastodon/features/list_timeline/index.jsx index f640e503c270e4..59d9f869778de9 100644 --- a/app/javascript/mastodon/features/list_timeline/index.jsx +++ b/app/javascript/mastodon/features/list_timeline/index.jsx @@ -15,7 +15,7 @@ import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns'; -import { fetchList, deleteList, updateList } from 'mastodon/actions/lists'; +import { fetchList, updateList } from 'mastodon/actions/lists'; import { openModal } from 'mastodon/actions/modal'; import { connectListStream } from 'mastodon/actions/streaming'; import { expandListTimeline } from 'mastodon/actions/timelines'; @@ -29,8 +29,6 @@ import StatusListContainer from 'mastodon/features/ui/containers/status_list_con import { WithRouterPropTypes } from 'mastodon/utils/react_router'; const messages = defineMessages({ - deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' }, - deleteConfirm: { id: 'confirmations.delete_list.confirm', defaultMessage: 'Delete' }, followed: { id: 'lists.replies_policy.followed', defaultMessage: 'Any followed user' }, none: { id: 'lists.replies_policy.none', defaultMessage: 'No one' }, list: { id: 'lists.replies_policy.list', defaultMessage: 'Members of the list' }, @@ -125,25 +123,10 @@ class ListTimeline extends PureComponent { }; handleDeleteClick = () => { - const { dispatch, columnId, intl } = this.props; + const { dispatch, columnId } = this.props; const { id } = this.props.params; - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.deleteMessage), - confirm: intl.formatMessage(messages.deleteConfirm), - onConfirm: () => { - dispatch(deleteList(id)); - - if (columnId) { - dispatch(removeColumn(columnId)); - } else { - this.props.history.push('/lists'); - } - }, - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_LIST', modalProps: { listId: id, columnId } })); }; handleRepliesPolicyChange = ({ target }) => { diff --git a/app/javascript/mastodon/features/notifications/components/checkbox_with_label.jsx b/app/javascript/mastodon/features/notifications/components/checkbox_with_label.jsx deleted file mode 100644 index 5a7bb2307be3bc..00000000000000 --- a/app/javascript/mastodon/features/notifications/components/checkbox_with_label.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import PropTypes from 'prop-types'; -import { useCallback } from 'react'; - -import Toggle from 'react-toggle'; - -export const CheckboxWithLabel = ({ checked, disabled, children, onChange }) => { - const handleChange = useCallback(({ target }) => { - onChange(target.checked); - }, [onChange]); - - return ( - - ); -}; - -CheckboxWithLabel.propTypes = { - checked: PropTypes.bool, - disabled: PropTypes.bool, - children: PropTypes.children, - onChange: PropTypes.func, -}; diff --git a/app/javascript/mastodon/features/notifications/components/checkbox_with_label.tsx b/app/javascript/mastodon/features/notifications/components/checkbox_with_label.tsx new file mode 100644 index 00000000000000..9922bc6c7c5923 --- /dev/null +++ b/app/javascript/mastodon/features/notifications/components/checkbox_with_label.tsx @@ -0,0 +1,40 @@ +import type { PropsWithChildren } from 'react'; +import { useCallback } from 'react'; + +import Toggle from 'react-toggle'; + +interface Props { + checked: boolean; + disabled?: boolean; + onChange: (checked: boolean) => void; +} + +export const CheckboxWithLabel: React.FC> = ({ + checked, + disabled, + children, + onChange, +}) => { + const handleChange = useCallback( + ({ target }: React.ChangeEvent) => { + onChange(target.checked); + }, + [onChange], + ); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.jsx b/app/javascript/mastodon/features/notifications/components/column_settings.jsx index d35e62f8f9fb8a..d511c5365fcc96 100644 --- a/app/javascript/mastodon/features/notifications/components/column_settings.jsx +++ b/app/javascript/mastodon/features/notifications/components/column_settings.jsx @@ -8,9 +8,9 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions'; -import { CheckboxWithLabel } from './checkbox_with_label'; import ClearColumnButton from './clear_column_button'; import GrantPermissionButton from './grant_permission_button'; +import { PolicyControls } from './policy_controls'; import SettingToggle from './setting_toggle'; class ColumnSettings extends PureComponent { @@ -24,32 +24,14 @@ class ColumnSettings extends PureComponent { alertsEnabled: PropTypes.bool, browserSupport: PropTypes.bool, browserPermission: PropTypes.string, - notificationPolicy: PropTypes.object.isRequired, - onChangePolicy: PropTypes.func.isRequired, }; onPushChange = (path, checked) => { this.props.onChange(['push', ...path], checked); }; - handleFilterNotFollowing = checked => { - this.props.onChangePolicy('filter_not_following', checked); - }; - - handleFilterNotFollowers = checked => { - this.props.onChangePolicy('filter_not_followers', checked); - }; - - handleFilterNewAccounts = checked => { - this.props.onChangePolicy('filter_new_accounts', checked); - }; - - handleFilterPrivateMentions = checked => { - this.props.onChangePolicy('filter_private_mentions', checked); - }; - render () { - const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission, notificationPolicy } = this.props; + const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props; const filterAdvancedStr = ; const unreadMarkersShowStr = ; @@ -79,31 +61,7 @@ class ColumnSettings extends PureComponent { )} -
-

- -
- - - - - - - - - - - - - - - - - - - -
-
+

diff --git a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.tsx b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.tsx index be1ea2c556e1d2..d9e60d48cdbca4 100644 --- a/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.tsx +++ b/app/javascript/mastodon/features/notifications/components/filtered_notifications_banner.tsx @@ -1,18 +1,62 @@ -import { useEffect } from 'react'; +import { useCallback, useEffect } from 'react'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; -import { Link } from 'react-router-dom'; +import { Link, useHistory } from 'react-router-dom'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import { fetchNotificationPolicy } from 'mastodon/actions/notification_policies'; import { Icon } from 'mastodon/components/icon'; +import { selectSettingsNotificationsMinimizeFilteredBanner } from 'mastodon/selectors/settings'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; -import { toCappedNumber } from 'mastodon/utils/numbers'; + +const messages = defineMessages({ + filteredNotifications: { + id: 'notification_requests.title', + defaultMessage: 'Filtered notifications', + }, +}); + +export const FilteredNotificationsIconButton: React.FC<{ + className?: string; +}> = ({ className }) => { + const intl = useIntl(); + const history = useHistory(); + const policy = useAppSelector((state) => state.notificationPolicy); + const minimizeSetting = useAppSelector( + selectSettingsNotificationsMinimizeFilteredBanner, + ); + + const handleClick = useCallback(() => { + history.push('/notifications/requests'); + }, [history]); + + if (policy === null || policy.summary.pending_notifications_count === 0) { + return null; + } + + if (!minimizeSetting) { + return null; + } + + return ( + + ); +}; export const FilteredNotificationsBanner: React.FC = () => { const dispatch = useAppDispatch(); const policy = useAppSelector((state) => state.notificationPolicy); + const minimizeSetting = useAppSelector( + selectSettingsNotificationsMinimizeFilteredBanner, + ); useEffect(() => { void dispatch(fetchNotificationPolicy()); @@ -30,6 +74,10 @@ export const FilteredNotificationsBanner: React.FC = () => { return null; } + if (minimizeSetting) { + return null; + } + return ( {

- -
-
- {toCappedNumber(policy.summary.pending_notifications_count)} -
- -
); }; diff --git a/app/javascript/mastodon/features/notifications/components/notification_request.jsx b/app/javascript/mastodon/features/notifications/components/notification_request.jsx index 3a77ef4e2e14ad..fc96bd2ee73c46 100644 --- a/app/javascript/mastodon/features/notifications/components/notification_request.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification_request.jsx @@ -38,12 +38,11 @@ export const NotificationRequest = ({ id, accountId, notificationsCount }) => { return (
- +
- {toCappedNumber(notificationsCount)}
@{account?.get('acct')} diff --git a/app/javascript/mastodon/features/notifications/components/policy_controls.tsx b/app/javascript/mastodon/features/notifications/components/policy_controls.tsx new file mode 100644 index 00000000000000..1647bf6b45682a --- /dev/null +++ b/app/javascript/mastodon/features/notifications/components/policy_controls.tsx @@ -0,0 +1,141 @@ +import { useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { updateNotificationsPolicy } from 'mastodon/actions/notification_policies'; +import { useAppSelector, useAppDispatch } from 'mastodon/store'; + +import { CheckboxWithLabel } from './checkbox_with_label'; + +export const PolicyControls: React.FC = () => { + const dispatch = useAppDispatch(); + + const notificationPolicy = useAppSelector( + (state) => state.notificationPolicy, + ); + + const handleFilterNotFollowing = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_not_following: checked }), + ); + }, + [dispatch], + ); + + const handleFilterNotFollowers = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_not_followers: checked }), + ); + }, + [dispatch], + ); + + const handleFilterNewAccounts = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_new_accounts: checked }), + ); + }, + [dispatch], + ); + + const handleFilterPrivateMentions = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_private_mentions: checked }), + ); + }, + [dispatch], + ); + + if (!notificationPolicy) return null; + + return ( +
+

+ +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ ); +}; diff --git a/app/javascript/mastodon/features/notifications/containers/column_settings_container.js b/app/javascript/mastodon/features/notifications/containers/column_settings_container.js index 2434c3982d582b..8bcc7ab4ef79ab 100644 --- a/app/javascript/mastodon/features/notifications/containers/column_settings_container.js +++ b/app/javascript/mastodon/features/notifications/containers/column_settings_container.js @@ -2,20 +2,16 @@ import { defineMessages, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; +import { openModal } from 'mastodon/actions/modal'; import { initializeNotifications } from 'mastodon/actions/notifications_migration'; import { showAlert } from '../../../actions/alerts'; -import { openModal } from '../../../actions/modal'; -import { clearNotifications } from '../../../actions/notification_groups'; -import { updateNotificationsPolicy } from '../../../actions/notification_policies'; import { setFilter, requestBrowserPermission } from '../../../actions/notifications'; import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications'; import { changeSetting } from '../../../actions/settings'; import ColumnSettings from '../components/column_settings'; const messages = defineMessages({ - clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' }, - clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' }, permissionDenied: { id: 'notifications.permission_denied_alert', defaultMessage: 'Desktop notifications can\'t be enabled, as browser permission has been denied before' }, }); @@ -28,10 +24,9 @@ const mapStateToProps = state => ({ alertsEnabled: state.getIn(['settings', 'notifications', 'alerts']).includes(true), browserSupport: state.getIn(['notifications', 'browserSupport']), browserPermission: state.getIn(['notifications', 'browserPermission']), - notificationPolicy: state.notificationPolicy, }); -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onChange (path, checked) { if (path[0] === 'push') { @@ -70,26 +65,13 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onClear () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.clearMessage), - confirm: intl.formatMessage(messages.clearConfirm), - onConfirm: () => dispatch(clearNotifications()), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_CLEAR_NOTIFICATIONS' })); }, onRequestNotificationPermission () { dispatch(requestBrowserPermission()); }, - onChangePolicy (param, checked) { - dispatch(updateNotificationsPolicy({ - [param]: checked, - })); - }, - }); export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings)); diff --git a/app/javascript/mastodon/features/notifications/index.jsx b/app/javascript/mastodon/features/notifications/index.jsx index f5ebe6fe91c0e5..cefbd544b0a781 100644 --- a/app/javascript/mastodon/features/notifications/index.jsx +++ b/app/javascript/mastodon/features/notifications/index.jsx @@ -34,7 +34,10 @@ import ColumnHeader from '../../components/column_header'; import { LoadGap } from '../../components/load_gap'; import ScrollableList from '../../components/scrollable_list'; -import { FilteredNotificationsBanner } from './components/filtered_notifications_banner'; +import { + FilteredNotificationsBanner, + FilteredNotificationsIconButton, +} from './components/filtered_notifications_banner'; import NotificationsPermissionBanner from './components/notifications_permission_banner'; import ColumnSettingsContainer from './containers/column_settings_container'; import FilterBarContainer from './containers/filter_bar_container'; @@ -255,20 +258,21 @@ class Notifications extends PureComponent { scrollContainer = ; } - let extraButton = null; - - if (canMarkAsRead) { - extraButton = ( - - ); - } + const extraButton = ( + <> + + {canMarkAsRead && ( + + )} + + ); return ( diff --git a/app/javascript/mastodon/features/notifications/request.jsx b/app/javascript/mastodon/features/notifications/request.jsx index 09bef3beab8cf0..7cba9461659ab1 100644 --- a/app/javascript/mastodon/features/notifications/request.jsx +++ b/app/javascript/mastodon/features/notifications/request.jsx @@ -7,9 +7,9 @@ import { Helmet } from 'react-helmet'; import { useSelector, useDispatch } from 'react-redux'; +import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import DoneIcon from '@/material-icons/400-24px/done.svg?react'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; -import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; import { fetchNotificationRequest, fetchNotificationsForRequest, expandNotificationsForRequest, acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; @@ -101,7 +101,7 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => { showBackButton extraButton={!removed && ( <> - + )} diff --git a/app/javascript/mastodon/features/notifications/requests.jsx b/app/javascript/mastodon/features/notifications/requests.jsx index 2d10c6a06c0771..66db35b588e605 100644 --- a/app/javascript/mastodon/features/notifications/requests.jsx +++ b/app/javascript/mastodon/features/notifications/requests.jsx @@ -9,16 +9,52 @@ import { useSelector, useDispatch } from 'react-redux'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import { fetchNotificationRequests, expandNotificationRequests } from 'mastodon/actions/notifications'; +import { changeSetting } from 'mastodon/actions/settings'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import ScrollableList from 'mastodon/components/scrollable_list'; import { NotificationRequest } from './components/notification_request'; +import { PolicyControls } from './components/policy_controls'; +import SettingToggle from './components/setting_toggle'; const messages = defineMessages({ title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' }, + maximize: { id: 'notification_requests.maximize', defaultMessage: 'Maximize' } }); +const ColumnSettings = () => { + const dispatch = useDispatch(); + const settings = useSelector((state) => state.settings.get('notifications')); + + const onChange = useCallback( + (key, checked) => { + dispatch(changeSetting(['notifications', ...key], checked)); + }, + [dispatch], + ); + + return ( +
+
+
+ + } + /> +
+
+ + +
+ ); +}; + export const NotificationRequests = ({ multiColumn }) => { const columnRef = useRef(); const intl = useIntl(); @@ -48,7 +84,9 @@ export const NotificationRequests = ({ multiColumn }) => { onClick={handleHeaderClick} multiColumn={multiColumn} showBackButton - /> + > + + ); - const extraButton = canMarkAsRead ? ( - - ) : null; + const extraButton = ( + <> + + {canMarkAsRead && ( + + )} + + ); return ( { - const { dispatch, askReplyConfirmation, status, intl } = this.props; + const { dispatch, askReplyConfirmation, status, onClose } = this.props; const { signedIn } = this.props.identity; if (signedIn) { if (askReplyConfirmation) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: this._performReply, - }, - })); + onClose(true); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { this._performReply(); } diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js index 5ab1013700adbd..0e73697fef70c5 100644 --- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js +++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js @@ -1,4 +1,4 @@ -import { defineMessages, injectIntl } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; @@ -28,15 +28,6 @@ import { deleteModal } from '../../../initial_state'; import { makeGetStatus, makeGetPictureInPicture } from '../../../selectors'; import DetailedStatus from '../components/detailed_status'; -const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, -}); - const makeMapStateToProps = () => { const getStatus = makeGetStatus(); const getPictureInPicture = makeGetPictureInPicture(); @@ -50,20 +41,13 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onReply (status) { dispatch((_, getState) => { let state = getState(); if (state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: () => dispatch(replyCompose(status)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { dispatch(replyCompose(status)); } @@ -100,14 +84,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ if (!deleteModal) { dispatch(deleteStatus(status.get('id'), withRedraft)); } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } })); } }, diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index e9df3697a2ba9f..7f3044c5c9be0b 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -72,17 +72,10 @@ import DetailedStatus from './components/detailed_status'; const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' }, detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, - blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' }, }); const makeMapStateToProps = () => { @@ -264,19 +257,12 @@ class Status extends ImmutablePureComponent { }; handleReplyClick = (status) => { - const { askReplyConfirmation, dispatch, intl } = this.props; + const { askReplyConfirmation, dispatch } = this.props; const { signedIn } = this.props.identity; if (signedIn) { if (askReplyConfirmation) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: () => dispatch(replyCompose(status)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { dispatch(replyCompose(status)); } @@ -319,24 +305,23 @@ class Status extends ImmutablePureComponent { }; handleDeleteClick = (status, withRedraft = false) => { - const { dispatch, intl } = this.props; + const { dispatch } = this.props; if (!deleteModal) { dispatch(deleteStatus(status.get('id'), withRedraft)); } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } })); } }; handleEditClick = (status) => { - this.props.dispatch(editStatus(status.get('id'))); + const { dispatch, askReplyConfirmation } = this.props; + + if (askReplyConfirmation) { + dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } })); + } else { + dispatch(editStatus(status.get('id'))); + } }; handleDirectClick = (account) => { diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modal.jsx b/app/javascript/mastodon/features/ui/components/confirmation_modal.jsx deleted file mode 100644 index 5080c0bf85836d..00000000000000 --- a/app/javascript/mastodon/features/ui/components/confirmation_modal.jsx +++ /dev/null @@ -1,65 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { injectIntl, FormattedMessage } from 'react-intl'; - -import { Button } from '../../../components/button'; - -class ConfirmationModal extends PureComponent { - - static propTypes = { - message: PropTypes.node.isRequired, - confirm: PropTypes.string.isRequired, - onClose: PropTypes.func.isRequired, - onConfirm: PropTypes.func.isRequired, - secondary: PropTypes.string, - onSecondary: PropTypes.func, - closeWhenConfirm: PropTypes.bool, - intl: PropTypes.object.isRequired, - }; - - static defaultProps = { - closeWhenConfirm: true, - }; - - handleClick = () => { - if (this.props.closeWhenConfirm) { - this.props.onClose(); - } - this.props.onConfirm(); - }; - - handleSecondary = () => { - this.props.onClose(); - this.props.onSecondary(); - }; - - handleCancel = () => { - this.props.onClose(); - }; - - render () { - const { message, confirm, secondary } = this.props; - - return ( -
-
- {message} -
- -
- - {secondary !== undefined && ( -
-
- ); - } - -} - -export default injectIntl(ConfirmationModal); diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/clear_notifications.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/clear_notifications.tsx new file mode 100644 index 00000000000000..312ec600a649e9 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/clear_notifications.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { clearNotifications } from 'mastodon/actions/notification_groups'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + clearTitle: { + id: 'notifications.clear_title', + defaultMessage: 'Clear notifications?', + }, + clearMessage: { + id: 'notifications.clear_confirmation', + defaultMessage: + 'Are you sure you want to permanently clear all your notifications?', + }, + clearConfirm: { + id: 'notifications.clear', + defaultMessage: 'Clear notifications', + }, +}); + +export const ConfirmClearNotificationsModal: React.FC< + BaseConfirmationModalProps +> = ({ onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + void dispatch(clearNotifications()); + }, [dispatch]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx new file mode 100644 index 00000000000000..c3a0c0aa76d297 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx @@ -0,0 +1,79 @@ +import { useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { Button } from 'mastodon/components/button'; + +export interface BaseConfirmationModalProps { + onClose: () => void; +} + +export const ConfirmationModal: React.FC< + { + title: React.ReactNode; + message: React.ReactNode; + confirm: React.ReactNode; + secondary?: React.ReactNode; + onSecondary?: () => void; + onConfirm: () => void; + closeWhenConfirm?: boolean; + } & BaseConfirmationModalProps +> = ({ + title, + message, + confirm, + onClose, + onConfirm, + secondary, + onSecondary, + closeWhenConfirm = true, +}) => { + const handleClick = useCallback(() => { + if (closeWhenConfirm) { + onClose(); + } + + onConfirm(); + }, [onClose, onConfirm, closeWhenConfirm]); + + const handleSecondary = useCallback(() => { + onClose(); + onSecondary?.(); + }, [onClose, onSecondary]); + + const handleCancel = useCallback(() => { + onClose(); + }, [onClose]); + + return ( +
+
+
+

{title}

+

{message}

+
+
+ +
+
+ {secondary && ( + <> + + +
+ + )} + + + + +
+
+
+ ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_list.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_list.tsx new file mode 100644 index 00000000000000..8fd9d8da01207f --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_list.tsx @@ -0,0 +1,58 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { useHistory } from 'react-router'; + +import { removeColumn } from 'mastodon/actions/columns'; +import { deleteList } from 'mastodon/actions/lists'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + deleteListTitle: { + id: 'confirmations.delete_list.title', + defaultMessage: 'Delete list?', + }, + deleteListMessage: { + id: 'confirmations.delete_list.message', + defaultMessage: 'Are you sure you want to permanently delete this list?', + }, + deleteListConfirm: { + id: 'confirmations.delete_list.confirm', + defaultMessage: 'Delete', + }, +}); + +export const ConfirmDeleteListModal: React.FC< + { + listId: string; + columnId: string; + } & BaseConfirmationModalProps +> = ({ listId, columnId, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const history = useHistory(); + + const onConfirm = useCallback(() => { + dispatch(deleteList(listId)); + + if (columnId) { + dispatch(removeColumn(columnId)); + } else { + history.push('/lists'); + } + }, [dispatch, history, columnId, listId]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_status.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_status.tsx new file mode 100644 index 00000000000000..39e80cf7410455 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_status.tsx @@ -0,0 +1,67 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { deleteStatus } from 'mastodon/actions/statuses'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + deleteAndRedraftTitle: { + id: 'confirmations.redraft.title', + defaultMessage: 'Delete & redraft post?', + }, + deleteAndRedraftMessage: { + id: 'confirmations.redraft.message', + defaultMessage: + 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.', + }, + deleteAndRedraftConfirm: { + id: 'confirmations.redraft.confirm', + defaultMessage: 'Delete & redraft', + }, + deleteTitle: { + id: 'confirmations.delete.title', + defaultMessage: 'Delete post?', + }, + deleteMessage: { + id: 'confirmations.delete.message', + defaultMessage: 'Are you sure you want to delete this status?', + }, + deleteConfirm: { + id: 'confirmations.delete.confirm', + defaultMessage: 'Delete', + }, +}); + +export const ConfirmDeleteStatusModal: React.FC< + { + statusId: string; + withRedraft: boolean; + } & BaseConfirmationModalProps +> = ({ statusId, withRedraft, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(deleteStatus(statusId, withRedraft)); + }, [dispatch, statusId, withRedraft]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/edit_status.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/edit_status.tsx new file mode 100644 index 00000000000000..fb958518c2537f --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/edit_status.tsx @@ -0,0 +1,45 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { editStatus } from 'mastodon/actions/statuses'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + editTitle: { + id: 'confirmations.edit.title', + defaultMessage: 'Overwrite post?', + }, + editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' }, + editMessage: { + id: 'confirmations.edit.message', + defaultMessage: + 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?', + }, +}); + +export const ConfirmEditStatusModal: React.FC< + { + statusId: string; + } & BaseConfirmationModalProps +> = ({ statusId, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(editStatus(statusId)); + }, [dispatch, statusId]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts b/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts new file mode 100644 index 00000000000000..912c99a393a1f0 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts @@ -0,0 +1,8 @@ +export { ConfirmationModal } from './confirmation_modal'; +export { ConfirmDeleteStatusModal } from './delete_status'; +export { ConfirmDeleteListModal } from './delete_list'; +export { ConfirmReplyModal } from './reply'; +export { ConfirmEditStatusModal } from './edit_status'; +export { ConfirmUnfollowModal } from './unfollow'; +export { ConfirmClearNotificationsModal } from './clear_notifications'; +export { ConfirmLogOutModal } from './log_out'; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/log_out.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/log_out.tsx new file mode 100644 index 00000000000000..48d24182ed6d45 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/log_out.tsx @@ -0,0 +1,40 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { logOut } from 'mastodon/utils/log_out'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + logoutTitle: { id: 'confirmations.logout.title', defaultMessage: 'Log out?' }, + logoutMessage: { + id: 'confirmations.logout.message', + defaultMessage: 'Are you sure you want to log out?', + }, + logoutConfirm: { + id: 'confirmations.logout.confirm', + defaultMessage: 'Log out', + }, +}); + +export const ConfirmLogOutModal: React.FC = ({ + onClose, +}) => { + const intl = useIntl(); + + const onConfirm = useCallback(() => { + logOut(); + }, []); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/reply.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/reply.tsx new file mode 100644 index 00000000000000..cccd62e4b41b7a --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/reply.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { replyCompose } from 'mastodon/actions/compose'; +import type { Status } from 'mastodon/models/status'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + replyTitle: { + id: 'confirmations.reply.title', + defaultMessage: 'Overwrite post?', + }, + replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, + replyMessage: { + id: 'confirmations.reply.message', + defaultMessage: + 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?', + }, +}); + +export const ConfirmReplyModal: React.FC< + { + status: Status; + } & BaseConfirmationModalProps +> = ({ status, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(replyCompose(status)); + }, [dispatch, status]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/unfollow.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/unfollow.tsx new file mode 100644 index 00000000000000..58e39da07bf95a --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/unfollow.tsx @@ -0,0 +1,50 @@ +import { useCallback } from 'react'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import { unfollowAccount } from 'mastodon/actions/accounts'; +import type { Account } from 'mastodon/models/account'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + unfollowTitle: { + id: 'confirmations.unfollow.title', + defaultMessage: 'Unfollow user?', + }, + unfollowConfirm: { + id: 'confirmations.unfollow.confirm', + defaultMessage: 'Unfollow', + }, +}); + +export const ConfirmUnfollowModal: React.FC< + { + account: Account; + } & BaseConfirmationModalProps +> = ({ account, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(unfollowAccount(account.id)); + }, [dispatch, account.id]); + + return ( + @{account.acct}
}} + /> + } + confirm={intl.formatMessage(messages.unfollowConfirm)} + onConfirm={onConfirm} + onClose={onClose} + /> + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/disabled_account_banner.jsx b/app/javascript/mastodon/features/ui/components/disabled_account_banner.jsx index 6a71bb2465ea54..3d1380f66699bd 100644 --- a/app/javascript/mastodon/features/ui/components/disabled_account_banner.jsx +++ b/app/javascript/mastodon/features/ui/components/disabled_account_banner.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -9,29 +9,15 @@ import { connect } from 'react-redux'; import { openModal } from 'mastodon/actions/modal'; import { disabledAccountId, movedToAccountId, domain } from 'mastodon/initial_state'; -import { logOut } from 'mastodon/utils/log_out'; - -const messages = defineMessages({ - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, -}); const mapStateToProps = (state) => ({ disabledAcct: state.getIn(['accounts', disabledAccountId, 'acct']), movedToAcct: movedToAccountId ? state.getIn(['accounts', movedToAccountId, 'acct']) : undefined, }); -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onLogout () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); }, }); diff --git a/app/javascript/mastodon/features/ui/components/link_footer.jsx b/app/javascript/mastodon/features/ui/components/link_footer.jsx index 08af6fa4442658..49b21c2e487aef 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.jsx +++ b/app/javascript/mastodon/features/ui/components/link_footer.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -11,24 +11,11 @@ import { openModal } from 'mastodon/actions/modal'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'mastodon/initial_state'; import { PERMISSION_INVITE_USERS } from 'mastodon/permissions'; -import { logOut } from 'mastodon/utils/log_out'; -const messages = defineMessages({ - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, -}); - -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onLogout () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); + }, }); diff --git a/app/javascript/mastodon/features/ui/components/modal_root.jsx b/app/javascript/mastodon/features/ui/components/modal_root.jsx index 404b53c7429ae6..3e900a06670a26 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.jsx +++ b/app/javascript/mastodon/features/ui/components/modal_root.jsx @@ -26,7 +26,16 @@ import ActionsModal from './actions_modal'; import AudioModal from './audio_modal'; import { BoostModal } from './boost_modal'; import BundleModalError from './bundle_modal_error'; -import ConfirmationModal from './confirmation_modal'; +import { + ConfirmationModal, + ConfirmDeleteStatusModal, + ConfirmDeleteListModal, + ConfirmReplyModal, + ConfirmEditStatusModal, + ConfirmUnfollowModal, + ConfirmClearNotificationsModal, + ConfirmLogOutModal, +} from './confirmation_modals'; import FocalPointModal from './focal_point_modal'; import ImageModal from './image_modal'; import MediaModal from './media_modal'; @@ -40,6 +49,13 @@ export const MODAL_COMPONENTS = { 'IMAGE': () => Promise.resolve({ default: ImageModal }), 'BOOST': () => Promise.resolve({ default: BoostModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), + 'CONFIRM_DELETE_STATUS': () => Promise.resolve({ default: ConfirmDeleteStatusModal }), + 'CONFIRM_DELETE_LIST': () => Promise.resolve({ default: ConfirmDeleteListModal }), + 'CONFIRM_REPLY': () => Promise.resolve({ default: ConfirmReplyModal }), + 'CONFIRM_EDIT_STATUS': () => Promise.resolve({ default: ConfirmEditStatusModal }), + 'CONFIRM_UNFOLLOW': () => Promise.resolve({ default: ConfirmUnfollowModal }), + 'CONFIRM_CLEAR_NOTIFICATIONS': () => Promise.resolve({ default: ConfirmClearNotificationsModal }), + 'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }), 'MUTE': MuteModal, 'BLOCK': BlockModal, 'DOMAIN_BLOCK': DomainBlockModal, diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index 77e15eb2c669fc..fee553e22d56ec 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -119,8 +119,6 @@ "compose_form.spoiler.unmarked": "Voeg inhoudswaarskuwing by", "confirmation_modal.cancel": "Kanselleer", "confirmations.block.confirm": "Blokkeer", - "confirmations.cancel_follow_request.confirm": "Herroep versoek", - "confirmations.cancel_follow_request.message": "Is jy seker jy wil jou versoek om {name} te volg, terugtrek?", "confirmations.delete.confirm": "Wis uit", "confirmations.delete.message": "Is jy seker jy wil hierdie plasing uitvee?", "confirmations.delete_list.confirm": "Wis uit", diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index d8f41b29bd153e..0757b9e597db1e 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -130,15 +130,12 @@ "compose_form.spoiler.unmarked": "Texto no amagau", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Blocar", - "confirmations.cancel_follow_request.confirm": "Retirar solicitut", - "confirmations.cancel_follow_request.message": "Yes seguro que deseyas retirar la tuya solicitut pa seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "Yes seguro que quiers borrar esta publicación?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "Seguro que quiers borrar esta lista permanentment?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tiens cambios sin alzar en a descripción u vista previa d'o fichero audiovisual, descartar-los de totz modos?", - "confirmations.domain_block.message": "Yes seguro que quiers blocar lo dominio {domain} entero? En cheneral ye prou, y preferible, fer uns quantos bloqueyos y silenciaus concretos. Los tuyos seguidros d'ixe dominio serán eliminaus.", "confirmations.logout.confirm": "Zarrar sesión", "confirmations.logout.message": "Yes seguro de querer zarrar la sesión?", "confirmations.mute.confirm": "Silenciar", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 9cfda3cbc2f2ef..5cfd587e088341 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -167,16 +167,12 @@ "compose_form.spoiler_placeholder": "تحذير المحتوى (اختياري)", "confirmation_modal.cancel": "إلغاء", "confirmations.block.confirm": "حظر", - "confirmations.cancel_follow_request.confirm": "إلغاء الطلب", - "confirmations.cancel_follow_request.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": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، أتريد تجاهلها على أي حال؟", - "confirmations.domain_block.confirm": "حظر الخادم", - "confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.", "confirmations.edit.confirm": "تعديل", "confirmations.edit.message": "التعديل في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد تحريرها. متأكد من أنك تريد المواصلة؟", "confirmations.logout.confirm": "خروج", @@ -295,8 +291,6 @@ "filter_modal.select_filter.subtitle": "استخدم فئة موجودة أو قم بإنشاء فئة جديدة", "filter_modal.select_filter.title": "تصفية هذا المنشور", "filter_modal.title.status": "تصفية منشور", - "filtered_notifications_banner.mentions": "{count, plural, one {إشارة} two {إشارتين} few {# إشارات} other {# إشارة}}", - "filtered_notifications_banner.pending_requests": "إشعارات من {count, plural, zero {}=0 {لا أحد} one {شخص واحد قد تعرفه} two {شخصين قد تعرفهما} few {# أشخاص قد تعرفهم} many {# شخص قد تعرفهم} other {# شخص قد تعرفهم}}", "filtered_notifications_banner.title": "الإشعارات المصفاة", "firehose.all": "الكل", "firehose.local": "هذا الخادم", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 883737eb4aa96c..3843ec69dc8523 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -111,8 +111,6 @@ "compose_form.publish_form": "Artículu nuevu", "confirmation_modal.cancel": "Encaboxar", "confirmations.block.confirm": "Bloquiar", - "confirmations.cancel_follow_request.confirm": "Retirala", - "confirmations.cancel_follow_request.message": "¿De xuru que quies retirar la solicitú pa siguir a {name}?", "confirmations.delete.confirm": "Desaniciar", "confirmations.delete.message": "¿De xuru que quies desaniciar esti artículu?", "confirmations.delete_list.confirm": "Desaniciar", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index e2120d80d9fcb7..bb59001273a373 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Папярэджанне аб змесціве (неабавязкова)", "confirmation_modal.cancel": "Скасаваць", "confirmations.block.confirm": "Заблакіраваць", - "confirmations.cancel_follow_request.confirm": "Скасаваць запыт", - "confirmations.cancel_follow_request.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": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?", - "confirmations.domain_block.confirm": "Заблакіраваць сервер", - "confirmations.domain_block.message": "Вы абсалютна дакладна ўпэўнены, што хочаце заблакіраваць {domain} зусім? У большасці выпадкаў, дастаткова некалькіх мэтавых блакіровак ці ігнараванняў. Вы перастанеце бачыць змесціва з гэтага дамену ва ўсіх стужках і апавяшчэннях. Вашы падпіскі з гэтага дамену будуць выдаленыя.", "confirmations.edit.confirm": "Рэдагаваць", "confirmations.edit.message": "Калі вы зменіце зараз, гэта ператрэ паведамленне, якое вы пішаце. Вы ўпэўнены, што хочаце працягнуць?", "confirmations.logout.confirm": "Выйсці", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Скарыстайцеся існуючай катэгорыяй або стварыце новую", "filter_modal.select_filter.title": "Фільтраваць гэты допіс", "filter_modal.title.status": "Фільтраваць допіс", - "filtered_notifications_banner.mentions": "{count, plural, one {згадванне} few {згадванні} many {згадванняў} other {згадвання}}", - "filtered_notifications_banner.pending_requests": "Апавяшчэнні ад {count, plural, =0 {# людзей якіх} one {# чалавека якіх} few {# чалавек якіх} many {# людзей якіх} other {# чалавека якіх}} вы магчыма ведаеце", "filtered_notifications_banner.title": "Адфільтраваныя апавяшчэнні", "firehose.all": "Усе", "firehose.local": "Гэты сервер", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index b2dff17407f4b0..657341d253e3ac 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Предупреждение за съдържание (по избор)", "confirmation_modal.cancel": "Отказ", "confirmations.block.confirm": "Блокиране", - "confirmations.cancel_follow_request.confirm": "Оттегляне на заявката", - "confirmations.cancel_follow_request.message": "Наистина ли искате да оттеглите заявката си за последване на {name}?", "confirmations.delete.confirm": "Изтриване", "confirmations.delete.message": "Наистина ли искате да изтриете публикацията?", + "confirmations.delete.title": "Изтривате ли публикацията?", "confirmations.delete_list.confirm": "Изтриване", "confirmations.delete_list.message": "Наистина ли искате да изтриете завинаги списъка?", + "confirmations.delete_list.title": "Изтривате ли списъка?", "confirmations.discard_edit_media.confirm": "Отхвърляне", "confirmations.discard_edit_media.message": "Не сте запазили промени на описанието или огледа на мултимедията, отхвърляте ли ги?", - "confirmations.domain_block.confirm": "Блокиране на сървър", - "confirmations.domain_block.message": "Наистина ли искате да блокирате целия {domain}? В повечето случаи няколко блокирания или заглушавания са достатъчно и за предпочитане. Няма да виждате съдържание от домейна из публични часови оси или известията си. Вашите последователи от този домейн ще се премахнат.", "confirmations.edit.confirm": "Редактиране", "confirmations.edit.message": "Редактирането сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?", + "confirmations.edit.title": "Презаписвате ли публикацията?", "confirmations.logout.confirm": "Излизане", "confirmations.logout.message": "Наистина ли искате да излезете?", + "confirmations.logout.title": "Излизате ли от системата?", "confirmations.mute.confirm": "Заглушаване", "confirmations.redraft.confirm": "Изтриване и преработване", "confirmations.redraft.message": "Наистина ли искате да изтриете тази публикация и да я направите чернова? Означаванията като любими и подсилванията ще се изгубят, а и отговорите към първоначалната публикация ще осиротеят.", + "confirmations.redraft.title": "Изтривате и преработвате ли публикацията?", "confirmations.reply.confirm": "Отговор", "confirmations.reply.message": "Отговарянето сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?", + "confirmations.reply.title": "Презаписвате ли публикацията?", "confirmations.unfollow.confirm": "Без следване", "confirmations.unfollow.message": "Наистина ли искате да не следвате {name}?", + "confirmations.unfollow.title": "Спирате ли да следвате потребителя?", "conversation.delete": "Изтриване на разговора", "conversation.mark_as_read": "Маркиране като прочетено", "conversation.open": "Преглед на разговора", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Изберете съществуваща категория или създайте нова", "filter_modal.select_filter.title": "Филтриране на публ.", "filter_modal.title.status": "Филтриране на публ.", - "filtered_notifications_banner.mentions": "{count, plural, one {споменаване} other {споменавания}}", - "filtered_notifications_banner.pending_requests": "Известията от {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}", + "filtered_notifications_banner.pending_requests": "От {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}", "filtered_notifications_banner.title": "Филтрирани известия", "firehose.all": "Всичко", "firehose.local": "Този сървър", @@ -507,6 +509,7 @@ "notification_requests.title": "Филтрирани известия", "notifications.clear": "Изчистване на известията", "notifications.clear_confirmation": "Наистина ли искате да изчистите завинаги всичките си известия?", + "notifications.clear_title": "Изчиствате ли известията?", "notifications.column_settings.admin.report": "Нови доклади:", "notifications.column_settings.admin.sign_up": "Нови регистрации:", "notifications.column_settings.alert": "Известия на работния плот", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 6d64c00a2f57a4..7787c1b9cfd76b 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -146,15 +146,12 @@ "compose_form.spoiler.unmarked": "লেখাটি লুকানো নেই", "confirmation_modal.cancel": "বাতিল করুন", "confirmations.block.confirm": "ব্লক করুন", - "confirmations.cancel_follow_request.confirm": "অনুরোধ বাতিল করুন", - "confirmations.cancel_follow_request.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": "মিডিয়া Description বা Preview তে আপনার আপনার অসংরক্ষিত পরিবর্তন আছে, সেগুলো বাতিল করবেন?", - "confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।", "confirmations.edit.confirm": "সম্পাদন", "confirmations.edit.message": "এখন সম্পাদনা করলে আপনি যে মেসেজ লিখছেন তা overwrite করবে, চালিয়ে যেতে চান?", "confirmations.logout.confirm": "প্রস্থান", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 76cd9d45743458..b38f43631641b0 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -159,15 +159,12 @@ "compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn", "confirmation_modal.cancel": "Nullañ", "confirmations.block.confirm": "Stankañ", - "confirmations.cancel_follow_request.confirm": "Nullañ ar reked", - "confirmations.cancel_follow_request.message": "Ha sur oc'h e fell deoc'h nullañ ho reked evit heuliañ {name} ?", "confirmations.delete.confirm": "Dilemel", "confirmations.delete.message": "Ha sur oc'h e fell deoc'h dilemel an toud-mañ ?", "confirmations.delete_list.confirm": "Dilemel", "confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?", "confirmations.discard_edit_media.confirm": "Nac'hañ", "confirmations.discard_edit_media.message": "Bez ez eus kemmoù n'int ket enrollet e deskrivadur ar media pe ar rakwel, nullañ anezho evelato?", - "confirmations.domain_block.message": "Ha sur oc'h e fell deoc'h berzañ an {domain} a-bezh? Peurvuiañ eo trawalc'h berzañ pe mudañ un nebeud implijer·ezed·ien. Ne welot danvez ebet o tont eus an domani-mañ. Dilamet e vo ar c'houmanantoù war an domani-mañ.", "confirmations.edit.confirm": "Kemmañ", "confirmations.logout.confirm": "Digevreañ", "confirmations.logout.message": "Ha sur oc'h e fell deoc'h digevreañ ?", @@ -255,7 +252,6 @@ "filter_modal.select_filter.subtitle": "Implijout ur rummad a zo anezhañ pe krouiñ unan nevez", "filter_modal.select_filter.title": "Silañ an toud-mañ", "filter_modal.title.status": "Silañ un toud", - "filtered_notifications_banner.mentions": "{count, plural, one {meneg} two {veneg} few {meneg} other {a venegoù}}", "firehose.all": "Pep tra", "firehose.local": "Ar servijer-mañ", "firehose.remote": "Servijerioù all", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 80c85ce178eb67..2ef926054ef42e 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Avís de contingut (opcional)", "confirmation_modal.cancel": "Cancel·la", "confirmations.block.confirm": "Bloca", - "confirmations.cancel_follow_request.confirm": "Retirar la sol·licitud", - "confirmations.cancel_follow_request.message": "Segur que vols retirar la sol·licitud de seguiment de {name}?", "confirmations.delete.confirm": "Elimina", "confirmations.delete.message": "Segur que vols eliminar aquest tut?", + "confirmations.delete.title": "Eliminar la publicació?", "confirmations.delete_list.confirm": "Elimina", "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?", + "confirmations.delete_list.title": "Eliminar la llista?", "confirmations.discard_edit_media.confirm": "Descarta", "confirmations.discard_edit_media.message": "Tens canvis no desats en la descripció del contingut o en la previsualització, els vols descartar?", - "confirmations.domain_block.confirm": "Bloca el servidor", - "confirmations.domain_block.message": "Segur que vols blocar {domain} del tot? En la majoria dels casos, només amb blocar o silenciar uns pocs comptes n'hi ha prou i és millor. No veuràs el contingut d’aquest domini en cap de les línies de temps ni en les notificacions. S'eliminaran els teus seguidors d’aquest domini.", "confirmations.edit.confirm": "Edita", "confirmations.edit.message": "Editant ara sobreescriuràs el missatge que estàs editant. Segur que vols continuar?", + "confirmations.edit.title": "Sobreescriure la publicació?", "confirmations.logout.confirm": "Tanca la sessió", "confirmations.logout.message": "Segur que vols tancar la sessió?", + "confirmations.logout.title": "Tancar la sessió?", "confirmations.mute.confirm": "Silencia", "confirmations.redraft.confirm": "Esborra i reescriu", "confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.", + "confirmations.redraft.title": "Esborrar i reescriure la publicació?", "confirmations.reply.confirm": "Respon", "confirmations.reply.message": "Si respons ara, sobreescriuràs el missatge que estàs editant. Segur que vols continuar?", + "confirmations.reply.title": "Sobreescriure la publicació?", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?", + "confirmations.unfollow.title": "Deixar de seguir l'usuari?", "conversation.delete": "Elimina la conversa", "conversation.mark_as_read": "Marca com a llegida", "conversation.open": "Mostra la conversa", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova", "filter_modal.select_filter.title": "Filtra aquest tut", "filter_modal.title.status": "Filtra un tut", - "filtered_notifications_banner.mentions": "{count, plural, one {menció} other {mencions}}", - "filtered_notifications_banner.pending_requests": "Notificacions {count, plural, =0 {de ningú} one {d'una persona} other {de # persones}} que potser coneixes", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {De ningú} one {D'una persona} other {De # persones}} que potser coneixes", "filtered_notifications_banner.title": "Notificacions filtrades", "firehose.all": "Tots", "firehose.local": "Aquest servidor", @@ -507,6 +509,7 @@ "notification_requests.title": "Notificacions filtrades", "notifications.clear": "Esborra les notificacions", "notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?", + "notifications.clear_title": "Esborrar les notificacions?", "notifications.column_settings.admin.report": "Nous informes:", "notifications.column_settings.admin.sign_up": "Registres nous:", "notifications.column_settings.alert": "Notificacions d'escriptori", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 379706a3e08c7b..3c11ffc7155874 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -158,15 +158,12 @@ "compose_form.spoiler_placeholder": "ئاگادارکردنەوەی ناوەڕۆک (ئیختیاری)", "confirmation_modal.cancel": "هەڵوەشاندنەوه", "confirmations.block.confirm": "بلۆک", - "confirmations.cancel_follow_request.confirm": "داواکاری کشانەوە", - "confirmations.cancel_follow_request.message": "ئایا دڵنیای کە دەتەوێت داواکارییەکەت بۆ شوێنکەوتنی {ناو} بکشێنیتەوە؟", "confirmations.delete.confirm": "سڕینەوە", "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?", "confirmations.delete_list.confirm": "سڕینەوە", "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?", "confirmations.discard_edit_media.confirm": "ڕەتکردنەوە", "confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟", - "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.", "confirmations.edit.confirm": "دەستکاری", "confirmations.edit.message": "دەستکاری کردنی ئێستا: دەبێتە هۆی نووسینەوەی ئەو پەیامەی، کە ئێستا داتدەڕشت. ئایا دڵنیای، کە دەتەوێت بەردەوام بیت؟", "confirmations.logout.confirm": "چوونە دەرەوە", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 4520663b52b022..d95213f9c1064b 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -89,7 +89,6 @@ "confirmations.delete_list.confirm": "Toglie", "confirmations.delete_list.message": "Site sicuru·a che vulete toglie sta lista?", "confirmations.discard_edit_media.confirm": "Scartà", - "confirmations.domain_block.message": "Site veramente sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà. Ùn viderete più nunda da quallà indè e linee pubbliche o e nutificazione. I vostri abbunati da stu duminiu saranu tolti.", "confirmations.logout.confirm": "Scunnettassi", "confirmations.logout.message": "Site sicuru·a che vulete scunnettà vi?", "confirmations.mute.confirm": "Piattà", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 213fe5e530e392..a5c90befe366ea 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Upozornění na obsah (nepovinné)", "confirmation_modal.cancel": "Zrušit", "confirmations.block.confirm": "Blokovat", - "confirmations.cancel_follow_request.confirm": "Zrušit žádost", - "confirmations.cancel_follow_request.message": "Opravdu chcete zrušit svou žádost o sledování {name}?", "confirmations.delete.confirm": "Smazat", "confirmations.delete.message": "Opravdu chcete smazat tento příspěvek?", "confirmations.delete_list.confirm": "Smazat", "confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?", "confirmations.discard_edit_media.confirm": "Zahodit", "confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, chcete je přesto zahodit?", - "confirmations.domain_block.confirm": "Blokovat server", - "confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí blokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.", "confirmations.edit.confirm": "Upravit", "confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?", "confirmations.logout.confirm": "Odhlásit se", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Použít existující kategorii nebo vytvořit novou kategorii", "filter_modal.select_filter.title": "Filtrovat tento příspěvek", "filter_modal.title.status": "Filtrovat příspěvek", - "filtered_notifications_banner.mentions": "{count, plural, one {zmínka} few {zmínky} many {zmínek} other {zmínek}}", - "filtered_notifications_banner.pending_requests": "Oznámení od {count, plural, =0 {nikoho} one {jednoho člověka, kterého znáte} few {# lidí, které znáte} many {# lidí, které znáte} other {# lidí, které znáte}}", "filtered_notifications_banner.title": "Filtrovaná oznámení", "firehose.all": "Vše", "firehose.local": "Tento server", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index e4c10cc14269e6..45fdbfef3ab034 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -9,7 +9,7 @@ "about.domain_blocks.suspended.explanation": "Ni fydd data o'r gweinydd hwn yn cael ei brosesu, ei gadw na'i gyfnewid, gan wneud unrhyw ryngweithio neu gyfathrebu gyda defnyddwyr o'r gweinydd hwn yn amhosibl.", "about.domain_blocks.suspended.title": "Ataliwyd", "about.not_available": "Nid yw'r wybodaeth hon ar gael ar y gweinydd hwn.", - "about.powered_by": "Cyfrwng cymdeithasol datganoledig sy'n cael ei yrru gan {mastodon}", + "about.powered_by": "Cyfrwng cymdeithasol datganoledig wedi ei yrru gan {mastodon}", "about.rules": "Rheolau'r gweinydd", "account.account_note_header": "Nodyn", "account.add_or_remove_from_list": "Ychwanegu neu Ddileu o'r rhestrau", @@ -35,7 +35,9 @@ "account.follow_back": "Dilyn yn ôl", "account.followers": "Dilynwyr", "account.followers.empty": "Does neb yn dilyn y defnyddiwr hwn eto.", + "account.followers_counter": "{count, plural, one {{counter} dilynwr} two {{counter} ddilynwr} other {{counter} dilynwyr}}", "account.following": "Yn dilyn", + "account.following_counter": "{count, plural, one {Yn dilyn {counter}} other {Yn dilyn {counter}}}", "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.", "account.go_to_profile": "Mynd i'r proffil", "account.hide_reblogs": "Cuddio hybiau gan @{name}", @@ -61,6 +63,7 @@ "account.requested_follow": "Mae {name} wedi gwneud cais i'ch dilyn", "account.share": "Rhannwch broffil @{name}", "account.show_reblogs": "Dangos hybiau gan @{name}", + "account.statuses_counter": "{count, plural, one {{counter} post} two {{counter} bost} few {{counter} phost} many {{counter} post} other {{counter} post}}", "account.unblock": "Dadflocio @{name}", "account.unblock_domain": "Dadflocio parth {domain}", "account.unblock_short": "Dadflocio", @@ -166,27 +169,30 @@ "compose_form.spoiler_placeholder": "Rhybudd cynnwys (dewisol)", "confirmation_modal.cancel": "Canslo", "confirmations.block.confirm": "Blocio", - "confirmations.cancel_follow_request.confirm": "Tynnu'r cais yn ôl", - "confirmations.cancel_follow_request.message": "Ydych chi'n siŵr eich bod am dynnu'ch cais i ddilyn {name} yn ôl?", "confirmations.delete.confirm": "Dileu", "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y post hwn?", + "confirmations.delete.title": "Dileu post?", "confirmations.delete_list.confirm": "Dileu", "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?", + "confirmations.delete_list.title": "Dileu rhestr?", "confirmations.discard_edit_media.confirm": "Dileu", "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?", - "confirmations.domain_block.confirm": "Blocio gweinydd", - "confirmations.domain_block.message": "Ydych chi wir, wir eisiau blocio'r holl {domain}? Fel arfer, mae blocio neu dewi pobl penodol yn broses mwy effeithiol. Fyddwch chi ddim yn gweld cynnwys o'r parth hwnnw mewn ffrydiau cyhoeddus neu yn eich hysbysiadau. Bydd eich dilynwyr o'r parth hwnnw yn cael eu ddileu.", "confirmations.edit.confirm": "Golygu", "confirmations.edit.message": "Bydd golygu nawr yn trosysgrifennu'r neges rydych yn ei ysgrifennu ar hyn o bryd. Ydych chi'n siŵr eich bod eisiau gwneud hyn?", + "confirmations.edit.title": "Trosysgrifo post?", "confirmations.logout.confirm": "Allgofnodi", "confirmations.logout.message": "Ydych chi'n siŵr eich bod am allgofnodi?", + "confirmations.logout.title": "Allgofnodi?", "confirmations.mute.confirm": "Tewi", "confirmations.redraft.confirm": "Dileu ac ailddrafftio", "confirmations.redraft.message": "Ydych chi'n siŵr eich bod am ddileu'r postiad hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r post gwreiddiol yn mynd yn amddifad.", + "confirmations.redraft.title": "Dileu & ailddraftio post?", "confirmations.reply.confirm": "Ateb", "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n siŵr eich bod am barhau?", + "confirmations.reply.title": "Trosysgrifo post?", "confirmations.unfollow.confirm": "Dad-ddilyn", "confirmations.unfollow.message": "Ydych chi'n siŵr eich bod am ddad-ddilyn {name}?", + "confirmations.unfollow.title": "Dad-ddilyn defnyddiwr?", "conversation.delete": "Dileu sgwrs", "conversation.mark_as_read": "Nodi fel wedi'i ddarllen", "conversation.open": "Gweld sgwrs", @@ -294,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd", "filter_modal.select_filter.title": "Hidlo'r postiad hwn", "filter_modal.title.status": "Hidlo postiad", - "filtered_notifications_banner.mentions": "{count, plural, one {crybwylliad} other {crybwylliad}}", - "filtered_notifications_banner.pending_requests": "Hysbysiadau gan {count, plural, =0 {neb} one {un person} other {# person}} efallai y gwyddoch amdanyn nhw", "filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo", "firehose.all": "Popeth", "firehose.local": "Gweinydd hwn", @@ -412,6 +416,7 @@ "limited_account_hint.title": "Mae'r proffil hwn wedi cael ei guddio gan gymedrolwyr {domain}.", "link_preview.author": "Gan {name}", "link_preview.more_from_author": "Mwy gan {name}", + "link_preview.shares": "{count, plural, one {{counter} post} two {{counter} bost} few {{counter} phost} many {{counter} post} other {{counter} post}}", "lists.account.add": "Ychwanegu at restr", "lists.account.remove": "Tynnu o'r rhestr", "lists.delete": "Dileu rhestr", @@ -439,6 +444,8 @@ "mute_modal.title": "Tewi defnyddiwr?", "mute_modal.you_wont_see_mentions": "Welwch chi ddim postiadau sy'n sôn amdanyn nhw.", "mute_modal.you_wont_see_posts": "Gallan nhw weld eich postiadau o hyd, ond fyddwch chi ddim yn gweld eu rhai hwy.", + "name_and_others": "{name} a(c) {count, plural, one {# arall} other {# eraill}}", + "name_and_others_with_link": "{name} a{count, plural, zero {}one {c # arall} two { # eraill} few { # eraill} many { # eraill} other { # eraill}}", "navigation_bar.about": "Ynghylch", "navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch", "navigation_bar.blocks": "Defnyddwyr wedi eu blocio", @@ -466,6 +473,9 @@ "navigation_bar.security": "Diogelwch", "not_signed_in_indicator.not_signed_in": "Rhaid i chi fewngofnodi i weld yr adnodd hwn.", "notification.admin.report": "Adroddwyd ar {name} {target}", + "notification.admin.report_account_other": "Adroddodd {name} {count, plural, one {un post} two {# bost} few {# phost} other {# post}} gan {target}", + "notification.admin.report_statuses": "Adroddodd {name} {target} ar gyfer {category}", + "notification.admin.report_statuses_other": "Adroddodd {name} {target}", "notification.admin.sign_up": "Cofrestrodd {name}", "notification.favourite": "Hoffodd {name} eich postiad", "notification.follow": "Dilynodd {name} chi", @@ -481,6 +491,8 @@ "notification.moderation_warning.action_silence": "Mae eich cyfrif wedi'i gyfyngu.", "notification.moderation_warning.action_suspend": "Mae eich cyfrif wedi'i hatal.", "notification.own_poll": "Mae eich pleidlais wedi dod i ben", + "notification.poll": "Mae arolwg y gwnaethoch bleidleisio ynddo wedi dod i ben", + "notification.private_mention": "Mae {name} wedi eich crybwyll yn breifat", "notification.reblog": "Hybodd {name} eich post", "notification.relationships_severance_event": "Wedi colli cysylltiad â {name}", "notification.relationships_severance_event.account_suspension": "Mae gweinyddwr o {from} wedi atal {target}, sy'n golygu na allwch dderbyn diweddariadau ganddynt mwyach na rhyngweithio â nhw.", @@ -495,9 +507,12 @@ "notification_requests.title": "Hysbysiadau wedi'u hidlo", "notifications.clear": "Clirio hysbysiadau", "notifications.clear_confirmation": "Ydych chi'n siŵr eich bod am glirio'ch holl hysbysiadau am byth?", + "notifications.clear_title": "Clirio hysbysiadau?", "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.beta.category": "Nodweddion arbrofol", + "notifications.column_settings.beta.grouping": "Grŵpio hysbysiadau", "notifications.column_settings.favourite": "Ffefrynnau:", "notifications.column_settings.filter_bar.advanced": "Dangos pob categori", "notifications.column_settings.filter_bar.category": "Bar hidlo cyflym", @@ -661,9 +676,13 @@ "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} postiad} arall {{count} postiad}} atodwyd", "report_notification.categories.legal": "Cyfreithiol", + "report_notification.categories.legal_sentence": "cynnwys anghyfreithlon", "report_notification.categories.other": "Arall", + "report_notification.categories.other_sentence": "arall", "report_notification.categories.spam": "Sbam", + "report_notification.categories.spam_sentence": "sbam", "report_notification.categories.violation": "Torri rheol", + "report_notification.categories.violation_sentence": "torri rheolau", "report_notification.open": "Agor adroddiad", "search.no_recent_searches": "Does dim chwiliadau diweddar", "search.placeholder": "Chwilio", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 9316884d7184f6..42deb4f42502c5 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)", "confirmation_modal.cancel": "Afbryd", "confirmations.block.confirm": "Blokér", - "confirmations.cancel_follow_request.confirm": "Annullér anmodning", - "confirmations.cancel_follow_request.message": "Er du sikker på, at anmodningen om at følge {name} skal annulleres?", "confirmations.delete.confirm": "Slet", "confirmations.delete.message": "Er du sikker på, at du vil slette dette indlæg?", + "confirmations.delete.title": "Slet indlæg?", "confirmations.delete_list.confirm": "Slet", "confirmations.delete_list.message": "Er du sikker på, at du vil slette denne liste permanent?", + "confirmations.delete_list.title": "Slet liste?", "confirmations.discard_edit_media.confirm": "Kassér", "confirmations.discard_edit_media.message": "Der er ugemte ændringer i mediebeskrivelsen eller forhåndsvisningen, kassér dem alligevel?", - "confirmations.domain_block.confirm": "Blokér server", - "confirmations.domain_block.message": "Er du fuldstændig sikker på, at du vil blokere hele {domain}-domænet? Oftest vil nogle få målrettede blokeringer eller skjulninger være tilstrækkelige og at foretrække. Du vil ikke se indhold fra dette domæne i nogle offentlige tidslinjer eller i dine notifikationer, og dine følgere herfra fjernes ligeledes.", "confirmations.edit.confirm": "Redigér", "confirmations.edit.message": "Redigeres nu, overskrive den besked, der forfattes pt. Fortsæt alligevel?", + "confirmations.edit.title": "Overskriv indlæg?", "confirmations.logout.confirm": "Log ud", "confirmations.logout.message": "Er du sikker på, at du vil logge ud?", + "confirmations.logout.title": "Log ud?", "confirmations.mute.confirm": "Skjul (mute)", "confirmations.redraft.confirm": "Slet og omformulér", "confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og boosts går tabt, og svar til det oprindelige indlæg mister tilknytningen.", + "confirmations.redraft.title": "Slet og omformulér indlæg?", "confirmations.reply.confirm": "Svar", "confirmations.reply.message": "Hvis du svarer nu, vil det overskrive den besked, du er ved at skrive. Fortsæt alligevel?", + "confirmations.reply.title": "Overskriv indlæg?", "confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.message": "Er du sikker på, at du ikke længere vil følge {name}?", + "confirmations.unfollow.title": "Følg ikke længere bruger?", "conversation.delete": "Slet samtale", "conversation.mark_as_read": "Markér som læst", "conversation.open": "Vis samtale", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Vælg en eksisterende kategori eller opret en ny", "filter_modal.select_filter.title": "Filtrér dette indlæg", "filter_modal.title.status": "Filtrér et indlæg", - "filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}", - "filtered_notifications_banner.pending_requests": "Notifikationer fra {count, plural, =0 {ingen} one {én person} other {# personer}} du måske kender", + "filtered_notifications_banner.pending_requests": "Fra {count, plural, =0 {ingen} one {én person} other {# personer}}, man måske kender", "filtered_notifications_banner.title": "Filtrerede notifikationer", "firehose.all": "Alle", "firehose.local": "Denne server", @@ -507,6 +509,7 @@ "notification_requests.title": "Filtrerede notifikationer", "notifications.clear": "Ryd notifikationer", "notifications.clear_confirmation": "Er du sikker på, at du vil rydde alle dine notifikationer permanent?", + "notifications.clear_title": "Ryd notifikationer?", "notifications.column_settings.admin.report": "Nye anmeldelser:", "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:", "notifications.column_settings.alert": "Computernotifikationer", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 3ba058b9a74618..d718135494c14b 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Inhaltswarnung (optional)", "confirmation_modal.cancel": "Abbrechen", "confirmations.block.confirm": "Blockieren", - "confirmations.cancel_follow_request.confirm": "Anfrage zurückziehen", - "confirmations.cancel_follow_request.message": "Möchtest du deine Anfrage, {name} zu folgen, wirklich zurückziehen?", "confirmations.delete.confirm": "Löschen", "confirmations.delete.message": "Möchtest du diesen Beitrag wirklich löschen?", + "confirmations.delete.title": "Beitrag löschen?", "confirmations.delete_list.confirm": "Löschen", "confirmations.delete_list.message": "Möchtest du diese Liste für immer löschen?", + "confirmations.delete_list.title": "Liste löschen?", "confirmations.discard_edit_media.confirm": "Verwerfen", "confirmations.discard_edit_media.message": "Du hast Änderungen an der Medienbeschreibung oder -vorschau vorgenommen, die noch nicht gespeichert sind. Trotzdem verwerfen?", - "confirmations.domain_block.confirm": "Server blockieren", - "confirmations.domain_block.message": "Möchtest du die gesamte Domain {domain} wirklich blockieren? In den meisten Fällen reichen ein paar gezielte Blockierungen oder Stummschaltungen aus. Du wirst den Inhalt von dieser Domain nicht in irgendwelchen öffentlichen Timelines oder den Benachrichtigungen finden. Auch deine Follower von dieser Domain werden entfernt.", "confirmations.edit.confirm": "Bearbeiten", "confirmations.edit.message": "Das Bearbeiten überschreibt die Nachricht, die du gerade verfasst. Möchtest du wirklich fortfahren?", + "confirmations.edit.title": "Beitrag überschreiben?", "confirmations.logout.confirm": "Abmelden", "confirmations.logout.message": "Möchtest du dich wirklich abmelden?", + "confirmations.logout.title": "Abmelden?", "confirmations.mute.confirm": "Stummschalten", "confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Favoriten und geteilte Beiträge gehen verloren, und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.", + "confirmations.redraft.title": "Beitrag löschen und neu erstellen?", "confirmations.reply.confirm": "Antworten", "confirmations.reply.message": "Wenn du jetzt darauf antwortest, wird der andere Beitrag, an dem du gerade geschrieben hast, verworfen. Möchtest du wirklich fortfahren?", + "confirmations.reply.title": "Beitrag überschreiben?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Möchtest du {name} wirklich entfolgen?", + "confirmations.unfollow.title": "Profil entfolgen?", "conversation.delete": "Unterhaltung löschen", "conversation.mark_as_read": "Als gelesen markieren", "conversation.open": "Unterhaltung anzeigen", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen", "filter_modal.select_filter.title": "Diesen Beitrag filtern", "filter_modal.title.status": "Beitrag per Filter ausblenden", - "filtered_notifications_banner.mentions": "{count, plural, one {Erwähnung} other {Erwähnungen}}", - "filtered_notifications_banner.pending_requests": "Benachrichtigungen von {count, plural, =0 {keinem Profil, das du möglicherweise kennst} one {einem Profil, das du möglicherweise kennst} other {# Profilen, die du möglicherweise kennst}}", + "filtered_notifications_banner.pending_requests": "Von {count, plural, =0 {keinem, den} one {einer Person, die} other {# Personen, die}} du möglicherweise kennst", "filtered_notifications_banner.title": "Gefilterte Benachrichtigungen", "firehose.all": "Alles", "firehose.local": "Dieser Server", @@ -507,6 +509,7 @@ "notification_requests.title": "Gefilterte Benachrichtigungen", "notifications.clear": "Benachrichtigungen löschen", "notifications.clear_confirmation": "Möchtest du wirklich alle Benachrichtigungen für immer löschen?", + "notifications.clear_title": "Benachrichtigungen löschen?", "notifications.column_settings.admin.report": "Neue Meldungen:", "notifications.column_settings.admin.sign_up": "Neue Registrierungen:", "notifications.column_settings.alert": "Desktop-Benachrichtigungen", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index cba2525f37763e..3b181b42a688d3 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Προειδοποίηση περιεχομένου (προαιρετική)", "confirmation_modal.cancel": "Άκυρο", "confirmations.block.confirm": "Αποκλεισμός", - "confirmations.cancel_follow_request.confirm": "Απόσυρση αιτήματος", - "confirmations.cancel_follow_request.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": "Έχεις μη αποθηκευμένες αλλαγές στην περιγραφή πολυμέσων ή στην προεπισκόπηση, απόρριψη ούτως ή άλλως;", - "confirmations.domain_block.confirm": "Αποκλεισμός διακομιστή", - "confirmations.domain_block.message": "Σίγουρα θες να αποκλείσεις ολόκληρο τον {domain}; Συνήθως μερικοί συγκεκρίμένοι αποκλεισμοί ή σιγάσεις επαρκούν και προτιμούνται. Δεν θα βλέπεις περιεχόμενο από αυτό τον τομέα σε καμία δημόσια ροή ή στις ειδοποιήσεις σου. Όσους ακόλουθους έχεις αυτό αυτό τον τομέα θα αφαιρεθούν.", "confirmations.edit.confirm": "Επεξεργασία", "confirmations.edit.message": "Αν το επεξεργαστείς τώρα θα αντικατασταθεί το μήνυμα που συνθέτεις. Είσαι σίγουρος ότι θέλεις να συνεχίσεις;", "confirmations.logout.confirm": "Αποσύνδεση", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα", "filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης", "filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης", - "filtered_notifications_banner.mentions": "{count, plural, one {επισήμανση} other {επισημάνσεις}}", - "filtered_notifications_banner.pending_requests": "Ειδοποιήσεις από {count, plural, =0 {κανένα} one {ένα άτομο} other {# άτομα}} που μπορεί να ξέρεις", "filtered_notifications_banner.title": "Φιλτραρισμένες ειδοποιήσεις", "firehose.all": "Όλα", "firehose.local": "Αυτός ο διακομιστής", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 6143c6e1ca09a2..eaf4f9465b6c76 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Content warning (optional)", "confirmation_modal.cancel": "Cancel", "confirmations.block.confirm": "Block", - "confirmations.cancel_follow_request.confirm": "Withdraw request", - "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?", "confirmations.delete.confirm": "Delete", "confirmations.delete.message": "Are you sure you want to delete this post?", "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", - "confirmations.domain_block.confirm": "Block server", - "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.edit.confirm": "Edit", "confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.logout.confirm": "Log out", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Use an existing category or create a new one", "filter_modal.select_filter.title": "Filter this post", "filter_modal.title.status": "Filter a post", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}", - "filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no one} one {one person} other {# people}} you may know", "filtered_notifications_banner.title": "Filtered notifications", "firehose.all": "All", "firehose.local": "This server", @@ -443,6 +437,8 @@ "mute_modal.title": "Mute user?", "mute_modal.you_wont_see_mentions": "You won't see posts that mention them.", "mute_modal.you_wont_see_posts": "They can still see your posts, but you won't see theirs.", + "name_and_others": "{name} and {count, plural, one {# other} other {# others}}", + "name_and_others_with_link": "{name} and {count, plural, one {# other} other {# others}}", "navigation_bar.about": "About", "navigation_bar.advanced_interface": "Open in advanced web interface", "navigation_bar.blocks": "Blocked users", @@ -470,6 +466,10 @@ "navigation_bar.security": "Security", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", "notification.admin.report": "{name} reported {target}", + "notification.admin.report_account": "{name} reported {count, plural, one {one post} other {# posts}} from {target} for {category}", + "notification.admin.report_account_other": "{name} reported {count, plural, one {one post} other {# posts}} from {target}", + "notification.admin.report_statuses": "{name} reported {target} for {category}", + "notification.admin.report_statuses_other": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your post", "notification.follow": "{name} followed you", @@ -485,6 +485,8 @@ "notification.moderation_warning.action_silence": "Your account has been limited.", "notification.moderation_warning.action_suspend": "Your account has been suspended.", "notification.own_poll": "Your poll has ended", + "notification.poll": "A poll you voted in has ended", + "notification.private_mention": "{name} privately mentioned you", "notification.reblog": "{name} boosted your status", "notification.relationships_severance_event": "Lost connections with {name}", "notification.relationships_severance_event.account_suspension": "An admin from {from} has suspended {target}, which means you can no longer receive updates from them or interact with them.", @@ -502,6 +504,8 @@ "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.beta.category": "Experimental features", + "notifications.column_settings.beta.grouping": "Group notifications", "notifications.column_settings.favourite": "Favourites:", "notifications.column_settings.filter_bar.advanced": "Display all categories", "notifications.column_settings.filter_bar.category": "Quick filter bar", @@ -665,9 +669,13 @@ "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.legal": "Legal", + "report_notification.categories.legal_sentence": "illegal content", "report_notification.categories.other": "Other", + "report_notification.categories.other_sentence": "other", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Rule violation", + "report_notification.categories.violation_sentence": "rule violation", "report_notification.open": "Open report", "search.no_recent_searches": "No recent searches", "search.placeholder": "Search", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 60bdfd1d445471..d5494cadd3eb4f 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Content warning (optional)", "confirmation_modal.cancel": "Cancel", "confirmations.block.confirm": "Block", - "confirmations.cancel_follow_request.confirm": "Withdraw request", - "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?", "confirmations.delete.confirm": "Delete", "confirmations.delete.message": "Are you sure you want to delete this post?", + "confirmations.delete.title": "Delete post?", "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.delete_list.title": "Delete list?", "confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", - "confirmations.domain_block.confirm": "Block server", - "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.edit.confirm": "Edit", "confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.edit.title": "Overwrite post?", "confirmations.logout.confirm": "Log out", "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.title": "Log out?", "confirmations.mute.confirm": "Mute", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.redraft.title": "Delete & redraft post?", "confirmations.reply.confirm": "Reply", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.reply.title": "Overwrite post?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "confirmations.unfollow.title": "Unfollow user?", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Use an existing category or create a new one", "filter_modal.select_filter.title": "Filter this post", "filter_modal.title.status": "Filter a post", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}", - "filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no one} one {one person} other {# people}} you may know", + "filtered_notifications_banner.pending_requests": "From {count, plural, =0 {no one} one {one person} other {# people}} you may know", "filtered_notifications_banner.title": "Filtered notifications", "firehose.all": "All", "firehose.local": "This server", @@ -503,10 +505,13 @@ "notification.update": "{name} edited a post", "notification_requests.accept": "Accept", "notification_requests.dismiss": "Dismiss", + "notification_requests.maximize": "Maximize", + "notification_requests.minimize_banner": "Minimize filtred notifications banner", "notification_requests.notifications_from": "Notifications from {name}", "notification_requests.title": "Filtered notifications", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.clear_title": "Clear notifications?", "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 211f4ad8d91677..de91fb39dce12f 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -150,15 +150,12 @@ "compose_form.spoiler.unmarked": "Aldoni averton de enhavo", "confirmation_modal.cancel": "Nuligi", "confirmations.block.confirm": "Bloki", - "confirmations.cancel_follow_request.confirm": "Eksigi peton", - "confirmations.cancel_follow_request.message": "Ĉu vi certas ke vi volas eksigi vian peton por sekvi {name}?", "confirmations.delete.confirm": "Forigi", "confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun afiŝ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": "Forĵeti", "confirmations.discard_edit_media.message": "Vi havas nekonservitajn ŝanĝojn de la priskribo aŭ la antaŭmontro de la plurmedio, ĉu vi forĵetu ilin malgraŭe?", - "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.edit.confirm": "Redakti", "confirmations.edit.message": "Redakti nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.logout.confirm": "Adiaŭi", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 2e22865493f08a..9a5405edbec972 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar solicitud", - "confirmations.cancel_follow_request.message": "¿Estás seguro que querés retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "¿Estás seguro que querés eliminar este mensaje?", + "confirmations.delete.title": "¿Eliminar mensaje?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?", + "confirmations.delete_list.title": "¿Eliminar lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tenés cambios sin guardar en la descripción de medios o en la vista previa, ¿querés descartarlos de todos modos?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "¿Estás completamente seguro que querés bloquear el {domain} entero? En la mayoría de los casos, unos cuantos bloqueos y silenciados puntuales son suficientes y preferibles. No vas a ver contenido de ese dominio en ninguna de tus líneas temporales o en tus notificaciones. Tus seguidores de ese dominio serán quitados.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", + "confirmations.edit.title": "¿Sobrescribir mensaje?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?", + "confirmations.logout.title": "¿Cerrar sesión?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Eliminar mensaje original y editarlo", "confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.", + "confirmations.redraft.title": "¿Eliminar y volver a redactar mensaje?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", + "confirmations.reply.title": "¿Sobrescribir mensaje?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?", + "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", "conversation.delete": "Eliminar conversación", "conversation.mark_as_read": "Marcar como leída", "conversation.open": "Ver conversación", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar este mensaje", "filter_modal.title.status": "Filtrar un mensaje", - "filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}", - "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todos", "firehose.local": "Este servidor", @@ -507,6 +509,7 @@ "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?", + "notifications.clear_title": "¿Limpiar notificaciones?", "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 837bbbc2cea639..7fe0ae1ba1ad86 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar solicitud", - "confirmations.cancel_follow_request.message": "¿Estás seguro de que deseas retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?", + "confirmations.delete.title": "¿Eliminar publicación?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", + "confirmations.delete_list.title": "¿Eliminar lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo, ¿deseas descartarlos de cualquier manera?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", + "confirmations.edit.title": "¿Sobrescribir publicación?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?", + "confirmations.logout.title": "¿Cerrar sesión?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.", + "confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", + "confirmations.reply.title": "¿Sobrescribir publicación?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", + "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar una publicación", - "filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}", - "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", @@ -507,6 +509,7 @@ "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Seguro de querer borrar permanentemente todas tus notificaciones?", + "notifications.clear_title": "¿Borrar notificaciones?", "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Registros nuevos:", "notifications.column_settings.alert": "Notificaciones de escritorio", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index a6cecf160567a3..3fb1cdf0945fde 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar solicitud", - "confirmations.cancel_follow_request.message": "¿Estás seguro de que deseas retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "¿Estás seguro de que quieres borrar esta publicación?", + "confirmations.delete.title": "¿Eliminar publicación?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", + "confirmations.delete_list.title": "¿Eliminar lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo audiovisual, ¿descartarlos de todos modos?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "¿Seguro que quieres bloquear todo el dominio {domain}? En general, unos cuantos bloqueos y silenciados concretos es suficiente y preferible. No verás contenido del dominio en ninguna cronología pública ni en tus notificaciones. Se eliminarán tus seguidores procedentes de ese dominio.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar ahora reemplazará el mensaje que estás escribiendo. ¿Seguro que quieres proceder?", + "confirmations.edit.title": "¿Sobrescribir publicación?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Seguro que quieres cerrar la sesión?", + "confirmations.logout.title": "¿Cerrar sesión?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.", + "confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Seguro que deseas continuar?", + "confirmations.reply.title": "¿Sobrescribir publicación?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Seguro que quieres dejar de seguir a {name}?", + "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar una publicación", - "filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}", - "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", @@ -507,6 +509,7 @@ "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?", + "notifications.clear_title": "¿Borrar notificaciones?", "notifications.column_settings.admin.report": "Nuevos informes:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index b07229adece46c..7369a89c462518 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -166,16 +166,12 @@ "compose_form.spoiler_placeholder": "Sisuhoiatus (valikuline)", "confirmation_modal.cancel": "Katkesta", "confirmations.block.confirm": "Blokeeri", - "confirmations.cancel_follow_request.confirm": "Tühista taotlus", - "confirmations.cancel_follow_request.message": "Oled kindel, et soovid kasutaja {name} jälgimistaotluse tagasi võtta?", "confirmations.delete.confirm": "Kustuta", "confirmations.delete.message": "Oled kindel, et soovid postituse kustutada?", "confirmations.delete_list.confirm": "Kustuta", "confirmations.delete_list.message": "Oled kindel, et soovid selle loetelu pöördumatult kustutada?", "confirmations.discard_edit_media.confirm": "Hülga", "confirmations.discard_edit_media.message": "Sul on salvestamata muudatusi meediakirjelduses või eelvaates, kas hülgad need?", - "confirmations.domain_block.confirm": "Blokeeri server", - "confirmations.domain_block.message": "Oled ikka päris-päris kindel, et soovid blokeerida terve {domain}? Enamikel juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatavam. Sa ei näe selle domeeni sisu ühelgi avalikul ajajoonel või enda teadetes. Su jälgijad sellest domeenist eemaldatakse.", "confirmations.edit.confirm": "Muuda", "confirmations.edit.message": "Muutes praegu kirjutatakse hetkel loodav sõnum üle. Kas oled kindel, et soovid jätkata?", "confirmations.logout.confirm": "Välju", @@ -294,8 +290,6 @@ "filter_modal.select_filter.subtitle": "Kasuta olemasolevat kategooriat või loo uus", "filter_modal.select_filter.title": "Filtreeri seda postitust", "filter_modal.title.status": "Postituse filtreerimine", - "filtered_notifications_banner.mentions": "{count, plural, one {mainimine} other {mainimist}}", - "filtered_notifications_banner.pending_requests": "Teateid {count, plural, =0 {mitte üheltki} one {ühelt} other {#}} inimeselt, keda võid teada", "filtered_notifications_banner.title": "Filtreeritud teavitused", "firehose.all": "Kõik", "firehose.local": "See server", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index bd1b51ba3e5f1d..a4b502ccc0cbc0 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -166,23 +166,23 @@ "compose_form.spoiler_placeholder": "Edukiaren abisua (aukerakoa)", "confirmation_modal.cancel": "Utzi", "confirmations.block.confirm": "Blokeatu", - "confirmations.cancel_follow_request.confirm": "Baztertu eskaera", - "confirmations.cancel_follow_request.message": "Ziur {name} jarraitzeko eskaera bertan behera utzi nahi duzula?", "confirmations.delete.confirm": "Ezabatu", "confirmations.delete.message": "Ziur bidalketa hau ezabatu nahi duzula?", + "confirmations.delete.title": "Ezabatu bidalketa?", "confirmations.delete_list.confirm": "Ezabatu", "confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?", + "confirmations.delete_list.title": "Ezabatu zerrenda?", "confirmations.discard_edit_media.confirm": "Baztertu", "confirmations.discard_edit_media.message": "Multimediaren deskribapen edo aurrebistan gorde gabeko aldaketak daude, baztertu nahi dituzu?", - "confirmations.domain_block.confirm": "Blokeatu zerbitzaria", - "confirmations.domain_block.message": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da. Ez duzu domeinu horretako edukirik ikusiko denbora lerroetan edo jakinarazpenetan. Domeinu horretako zure jarraitzaileak kenduko dira ere.", "confirmations.edit.confirm": "Editatu", "confirmations.edit.message": "Orain editatzen baduzu, une honetan idazten ari zaren mezua gainidatziko da. Ziur jarraitu nahi duzula?", "confirmations.logout.confirm": "Amaitu saioa", "confirmations.logout.message": "Ziur saioa amaitu nahi duzula?", + "confirmations.logout.title": "Itxi saioa?", "confirmations.mute.confirm": "Mututu", "confirmations.redraft.confirm": "Ezabatu eta berridatzi", "confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.", + "confirmations.redraft.title": "Ezabatu eta berridatzi bidalketa?", "confirmations.reply.confirm": "Erantzun", "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?", "confirmations.unfollow.confirm": "Utzi jarraitzeari", @@ -294,8 +294,6 @@ "filter_modal.select_filter.subtitle": "Hautatu lehendik dagoen kategoria bat edo sortu berria", "filter_modal.select_filter.title": "Iragazi bidalketa hau", "filter_modal.title.status": "Iragazi bidalketa bat", - "filtered_notifications_banner.mentions": "{count, plural, one {aipamen} other {aipamen}}", - "filtered_notifications_banner.pending_requests": "Ezagutu {count, plural, =0 {dezakezun inoren} one {dezakezun pertsona baten} other {ditzakezun # pertsonen}} jakinarazpenak", "filtered_notifications_banner.title": "Iragazitako jakinarazpenak", "firehose.all": "Guztiak", "firehose.local": "Zerbitzari hau", @@ -492,9 +490,12 @@ "notification_requests.title": "Iragazitako jakinarazpenak", "notifications.clear": "Garbitu jakinarazpenak", "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?", + "notifications.clear_title": "Garbitu jakinarazpenak?", "notifications.column_settings.admin.report": "Txosten berriak:", "notifications.column_settings.admin.sign_up": "Izen-emate berriak:", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", + "notifications.column_settings.beta.category": "Ezaugarri esperimentalak", + "notifications.column_settings.beta.grouping": "Multzokatu jakinarazpenak", "notifications.column_settings.favourite": "Gogokoak:", "notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak", "notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra", @@ -659,8 +660,11 @@ "report_notification.attached_statuses": "{count, plural, one {Bidalketa {count}} other {{count} bidalketa}} erantsita", "report_notification.categories.legal": "Legala", "report_notification.categories.other": "Bestelakoak", + "report_notification.categories.other_sentence": "bestelakoak", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spama", "report_notification.categories.violation": "Arau haustea", + "report_notification.categories.violation_sentence": "arau haustea", "report_notification.open": "Ireki salaketa", "search.no_recent_searches": "Duela gutxiko bilaketarik ez", "search.placeholder": "Bilatu", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 9dc429f7de861f..28b4a29cb9efed 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -158,15 +158,12 @@ "compose_form.spoiler_placeholder": "هشدار محتوا (اختیاری)", "confirmation_modal.cancel": "لغو", "confirmations.block.confirm": "انسداد", - "confirmations.cancel_follow_request.confirm": "رد کردن درخواست", - "confirmations.cancel_follow_request.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": "تغییرات ذخیره نشده‌ای در توضیحات یا پیش‌نمایش رسانه دارید. همگی نادیده گرفته شوند؟", - "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدود کردن یا خموشاندن چند حساب خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ محتوایی را از این دامنه در خط زمانی عمومی یا آگاهی‌هایتان نخواهید دید. پی‌گیرانتان از این دامنه هم برداشته خواهند شد.", "confirmations.edit.confirm": "ویرایش", "confirmations.edit.message": "در صورت ویرایش، پیامی که در حال نوشتنش بودید از بین خواهد رفت. می‌خواهید ادامه دهید؟", "confirmations.logout.confirm": "خروج از حساب", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 5ba77dd72e0813..168c2de410268b 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,12 +1,12 @@ { "about.blocks": "Moderoidut palvelimet", - "about.contact": "Ota yhteys:", + "about.contact": "Yhteydenotto:", "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", "about.domain_blocks.preamble": "Mastodonin avulla voidaan yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä, ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", "about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.", "about.domain_blocks.silenced.title": "Rajoitettu", - "about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta tai vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.", + "about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta eikä vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.", "about.domain_blocks.suspended.title": "Jäädytetty", "about.not_available": "Näitä tietoja ei ole julkaistu tällä palvelimella.", "about.powered_by": "Hajautetun sosiaalisen median tarjoaa {mastodon}", @@ -19,7 +19,7 @@ "account.block_domain": "Estä verkkotunnus {domain}", "account.block_short": "Estä", "account.blocked": "Estetty", - "account.browse_more_on_origin_server": "Selaile kattavampaa alkuperäprofiilia", + "account.browse_more_on_origin_server": "Selaa lisää alkuperäisessä profiilissa", "account.cancel_follow_request": "Peruuta seurantapyyntö", "account.copy": "Kopioi linkki profiiliin", "account.direct": "Mainitse @{name} yksityisesti", @@ -30,7 +30,7 @@ "account.endorse": "Suosittele profiilissasi", "account.featured_tags.last_status_at": "Viimeisin julkaisu {date}", "account.featured_tags.last_status_never": "Ei julkaisuja", - "account.featured_tags.title": "Käyttäjän {name} esillä pidettävät aihetunnisteet", + "account.featured_tags.title": "Käyttäjän {name} esille nostamat aihetunnisteet", "account.follow": "Seuraa", "account.follow_back": "Seuraa takaisin", "account.followers": "Seuraajat", @@ -45,7 +45,7 @@ "account.joined_short": "Liittynyt", "account.languages": "Vaihda tilattuja kieliä", "account.link_verified_on": "Linkin omistus tarkistettiin {date}", - "account.locked_info": "Tilin yksityisyystilaksi on määritetty lukittu ja tilin omistaja arvioi erikseen, kuka voi seurata häntä.", + "account.locked_info": "Tilin yksityisyystilaksi on määritetty lukittu. Tilin omistaja arvioi erikseen, kuka voi seurata häntä.", "account.media": "Media", "account.mention": "Mainitse @{name}", "account.moved_to": "{name} on ilmoittanut uudeksi tilikseen", @@ -59,30 +59,30 @@ "account.posts": "Julkaisut", "account.posts_with_replies": "Julkaisut ja vastaukset", "account.report": "Raportoi @{name}", - "account.requested": "Odottaa hyväksyntää. Peruuta seuraamispyyntö napsauttamalla", + "account.requested": "Odottaa hyväksyntää. Peruuta seurantapyyntö napsauttamalla", "account.requested_follow": "{name} on pyytänyt lupaa seurata sinua", "account.share": "Jaa käyttäjän @{name} profiili", "account.show_reblogs": "Näytä käyttäjän @{name} tehostukset", "account.statuses_counter": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}", "account.unblock": "Kumoa käyttäjän @{name} esto", "account.unblock_domain": "Kumoa verkkotunnuksen {domain} esto", - "account.unblock_short": "Poista esto", + "account.unblock_short": "Kumoa esto", "account.unendorse": "Kumoa suosittelu profiilissasi", - "account.unfollow": "Lopeta seuraaminen", + "account.unfollow": "Älä seuraa", "account.unmute": "Poista käyttäjän @{name} mykistys", "account.unmute_notifications_short": "Poista ilmoitusten mykistys", "account.unmute_short": "Poista mykistys", "account_note.placeholder": "Lisää muistiinpano napsauttamalla", - "admin.dashboard.daily_retention": "Käyttäjien pysyvyys rekisteröitymisen jälkeen päivittäin", - "admin.dashboard.monthly_retention": "Käyttäjien pysyvyys rekisteröitymisen jälkeen kuukausittain", - "admin.dashboard.retention.average": "Keskiarvo", + "admin.dashboard.daily_retention": "Käyttäjien pysyvyys päivittäin rekisteröitymisen jälkeen", + "admin.dashboard.monthly_retention": "Käyttäjien pysyvyys kuukausittain rekisteröitymisen jälkeen", + "admin.dashboard.retention.average": "Keskimäärin", "admin.dashboard.retention.cohort": "Rekisteröitymis-kk.", "admin.dashboard.retention.cohort_size": "Uusia käyttäjiä", "admin.impact_report.instance_accounts": "Tilien profiilit, jotka tämä poistaisi", "admin.impact_report.instance_followers": "Seuraajat, jotka käyttäjämme menettäisivät", "admin.impact_report.instance_follows": "Seuraajat, jotka heidän käyttäjänsä menettäisivät", "admin.impact_report.title": "Vaikutusten yhteenveto", - "alert.rate_limited.message": "Yritä uudestaan {retry_time, time, medium} jälkeen.", + "alert.rate_limited.message": "Yritä uudelleen {retry_time, time, medium} jälkeen.", "alert.rate_limited.title": "Pyyntömäärää rajoitettu", "alert.unexpected.message": "Tapahtui odottamaton virhe.", "alert.unexpected.title": "Hups!", @@ -96,14 +96,14 @@ "block_modal.they_cant_see_posts": "Hän ei voi enää nähdä julkaisujasi, etkä sinä voi nähdä hänen.", "block_modal.they_will_know": "Hän voi nähdä, että hänet on estetty.", "block_modal.title": "Estetäänkö käyttäjä?", - "block_modal.you_wont_see_mentions": "Et tule enää näkemään julkaisuja, joissa hänet mainitaan.", + "block_modal.you_wont_see_mentions": "Et näe enää julkaisuja, joissa hänet mainitaan.", "boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}", "bundle_column_error.copy_stacktrace": "Kopioi virheraportti", "bundle_column_error.error.body": "Pyydettyä sivua ei voitu hahmontaa. Se voi johtua virheestä koodissamme tai selaimen yhteensopivuudessa.", "bundle_column_error.error.title": "Voi ei!", "bundle_column_error.network.body": "Sivun lataamisessa tapahtui virhe. Tämä voi johtua tilapäisestä Internet-yhteyden tai tämän palvelimen ongelmasta.", "bundle_column_error.network.title": "Verkkovirhe", - "bundle_column_error.retry": "Yritä uudestaan", + "bundle_column_error.retry": "Yritä uudelleen", "bundle_column_error.return": "Palaa takaisin kotiin", "bundle_column_error.routing.body": "Pyydettyä sivua ei löytynyt. Oletko varma, että osoitepalkin URL-osoite on oikein?", "bundle_column_error.routing.title": "404", @@ -111,7 +111,7 @@ "bundle_modal_error.message": "Jotain meni pieleen komponenttia ladattaessa.", "bundle_modal_error.retry": "Yritä uudelleen", "closed_registrations.other_server_instructions": "Koska Mastodon on hajautettu, voit luoda tilin toiselle palvelimelle ja olla silti vuorovaikutuksessa tämän kanssa.", - "closed_registrations_modal.description": "Tilin luonti palveluun {domain} ei tällä hetkellä ole mahdollista, mutta huomioi, ettei Mastodonin käyttö edellytä juuri kyseisen palvelun tiliä.", + "closed_registrations_modal.description": "Tilin luonti palvelimelle {domain} ei tällä hetkellä ole mahdollista, mutta ota huomioon, ettei Mastodonin käyttö edellytä juuri kyseisen palvelimen tiliä.", "closed_registrations_modal.find_another_server": "Etsi toinen palvelin", "closed_registrations_modal.preamble": "Mastodon on hajautettu, joten riippumatta siitä, missä luot tilisi, voit seurata ja olla vuorovaikutuksessa kenen tahansa kanssa tällä palvelimella. Voit jopa isännöidä palvelinta!", "closed_registrations_modal.title": "Rekisteröityminen Mastodoniin", @@ -119,12 +119,12 @@ "column.blocks": "Estetyt käyttäjät", "column.bookmarks": "Kirjanmerkit", "column.community": "Paikallinen aikajana", - "column.direct": "Yksityiset maininnat", + "column.direct": "Yksityismaininnat", "column.directory": "Selaa profiileja", "column.domain_blocks": "Estetyt verkkotunnukset", "column.favourites": "Suosikit", "column.firehose": "Livesyötteet", - "column.follow_requests": "Seuraamispyynnöt", + "column.follow_requests": "Seurantapyynnöt", "column.home": "Koti", "column.lists": "Listat", "column.mutes": "Mykistetyt käyttäjät", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Sisältövaroitus (valinnainen)", "confirmation_modal.cancel": "Peruuta", "confirmations.block.confirm": "Estä", - "confirmations.cancel_follow_request.confirm": "Peruuta pyyntö", - "confirmations.cancel_follow_request.message": "Haluatko varmasti perua pyyntösi seurata käyttäjätiliä {name}?", "confirmations.delete.confirm": "Poista", "confirmations.delete.message": "Haluatko varmasti poistaa tämän julkaisun?", + "confirmations.delete.title": "Poistetaanko julkaisu?", "confirmations.delete_list.confirm": "Poista", "confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan pysyvästi?", + "confirmations.delete_list.title": "Poistetaanko lista?", "confirmations.discard_edit_media.confirm": "Hylkää", "confirmations.discard_edit_media.message": "Sinulla on tallentamattomia muutoksia median kuvaukseen tai esikatseluun. Hylätäänkö ne silti?", - "confirmations.domain_block.confirm": "Estä palvelin", - "confirmations.domain_block.message": "Haluatko aivan varmasti estää koko verkkotunnuksen {domain}? Useimmiten muutama kohdistettu esto tai mykistys on riittävä ja suositeltava toimi. Et näe sisältöä tästä verkkotunnuksesta millään julkisilla aikajanoilla tai ilmoituksissa. Tähän verkkotunnukseen kuuluvat seuraajasi poistetaan.", "confirmations.edit.confirm": "Muokkaa", "confirmations.edit.message": "Jos muokkaat viestiä nyt, se korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?", + "confirmations.edit.title": "Korvataanko julkaisu?", "confirmations.logout.confirm": "Kirjaudu ulos", "confirmations.logout.message": "Haluatko varmasti kirjautua ulos?", + "confirmations.logout.title": "Kirjaudutaanko ulos?", "confirmations.mute.confirm": "Mykistä", "confirmations.redraft.confirm": "Poista ja palauta muokattavaksi", "confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.", + "confirmations.redraft.title": "Poistetaanko julkaisu ja palautetaanko se muokattavaksi?", "confirmations.reply.confirm": "Vastaa", "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?", + "confirmations.reply.title": "Korvataanko julkaisu?", "confirmations.unfollow.confirm": "Lopeta seuraaminen", "confirmations.unfollow.message": "Haluatko varmasti lopettaa profiilin {name} seuraamisen?", + "confirmations.unfollow.title": "Lopetetaanko käyttäjän seuraaminen?", "conversation.delete": "Poista keskustelu", "conversation.mark_as_read": "Merkitse luetuksi", "conversation.open": "Näytä keskustelu", @@ -197,7 +200,7 @@ "copy_icon_button.copied": "Sisältö kopioitiin leikepöydälle", "copypaste.copied": "Kopioitu", "copypaste.copy_to_clipboard": "Kopioi leikepöydälle", - "directory.federated": "Koko tunnettu fediversumi", + "directory.federated": "Tunnetusta fediversumista", "directory.local": "Vain palvelimelta {domain}", "directory.new_arrivals": "Äskettäin saapuneet", "directory.recently_active": "Hiljattain aktiiviset", @@ -205,29 +208,29 @@ "disabled_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä.", "dismissable_banner.community_timeline": "Nämä ovat tuoreimpia julkaisuja käyttäjiltä, joiden tili on palvelimella {domain}.", "dismissable_banner.dismiss": "Hylkää", - "dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat listauksessa korkeammalle.", - "dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat listauksessa korkeammalle.", - "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat listauksessa korkeammalle.", - "dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.", + "dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat korkeammalle sijalle.", + "dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat korkeammalle sijalle.", + "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat korkeammalle sijalle.", + "dismissable_banner.public_timeline": "Nämä ovat tuoreimpia julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.", "domain_block_modal.block": "Estä palvelin", "domain_block_modal.block_account_instead": "Estä sen sijaan @{name}", - "domain_block_modal.they_can_interact_with_old_posts": "Ihmiset tältä palvelimelta eivät voi olla vuorovaikutuksessa vanhojen julkaisujesi kanssa.", + "domain_block_modal.they_can_interact_with_old_posts": "Tämän palvelimen käyttäjät eivät voi olla vuorovaikutuksessa vanhojen julkaisujesi kanssa.", "domain_block_modal.they_cant_follow": "Kukaan tältä palvelimelta ei voi seurata sinua.", - "domain_block_modal.they_wont_know": "Hän ei saa ilmoitusta tulleensa estetyksi.", + "domain_block_modal.they_wont_know": "Hän ei saa tietää tulleensa estetyksi.", "domain_block_modal.title": "Estetäänkö verkkotunnus?", "domain_block_modal.you_will_lose_followers": "Kaikki seuraajasi tältä palvelimelta poistetaan.", "domain_block_modal.you_wont_see_posts": "Et enää näe julkaisuja etkä ilmoituksia tämän palvelimen käyttäjiltä.", "domain_pill.activitypub_lets_connect": "Sen avulla voit muodostaa yhteyden ja olla vuorovaikutuksessa ihmisten kanssa, ei vain Mastodonissa vaan myös muissa sosiaalisissa sovelluksissa.", "domain_pill.activitypub_like_language": "ActivityPub on kuin kieli, jota Mastodon puhuu muiden sosiaalisten verkostojen kanssa.", "domain_pill.server": "Palvelin", - "domain_pill.their_handle": "Hänen käyttäjänimensä:", + "domain_pill.their_handle": "Hänen käyttäjätunnuksensa:", "domain_pill.their_server": "Hänen digitaalinen kotinsa, jossa kaikki hänen julkaisunsa sijaitsevat.", "domain_pill.their_username": "Hänen yksilöllinen tunnisteensa omalla palvelimellaan. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.", "domain_pill.username": "Käyttäjänimi", - "domain_pill.whats_in_a_handle": "Mitä käyttäjänimessä on?", - "domain_pill.who_they_are": "Koska käyttäjätunnukset kertovat, kuka ja missä joku on, voit olla vuorovaikutuksessa ihmisten kanssa läpi sosiaalisen verkon, joka koostuu .", - "domain_pill.who_you_are": "Koska käyttäjätunnuksesi kertoo, kuka ja missä olet, ihmiset voivat olla vaikutuksessa kanssasi läpi sosiaalisen verkon, joka koostuu .", - "domain_pill.your_handle": "Käyttäjänimesi:", + "domain_pill.whats_in_a_handle": "Mitä käyttäjätunnuksessa on?", + "domain_pill.who_they_are": "Koska käyttäjätunnukset kertovat, kuka ja missä joku on, voit olla vuorovaikutuksessa ihmisten kanssa kaikkialla sosiaalisessa verkossa, joka koostuu .", + "domain_pill.who_you_are": "Koska käyttäjätunnuksesi kertoo, kuka ja missä olet, ihmiset voivat olla vaikutuksessa kanssasi kaikkialla sosiaalisessa verkossa, joka koostuu .", + "domain_pill.your_handle": "Käyttäjätunnuksesi:", "domain_pill.your_server": "Digitaalinen kotisi, jossa kaikki julkaisusi sijaitsevat. Etkö pidä tästä? Siirry palvelimelta toiselle milloin tahansa ja tuo myös seuraajasi mukanasi.", "domain_pill.your_username": "Yksilöllinen tunnisteesi tällä palvelimella. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.", "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.", @@ -243,7 +246,7 @@ "emoji_button.objects": "Esineet", "emoji_button.people": "Ihmiset", "emoji_button.recent": "Usein käytetyt", - "emoji_button.search": "Etsi...", + "emoji_button.search": "Hae...", "emoji_button.search_results": "Hakutulokset", "emoji_button.symbols": "Symbolit", "emoji_button.travel": "Matkailu ja paikat", @@ -254,21 +257,21 @@ "empty_column.blocks": "Et ole vielä estänyt käyttäjiä.", "empty_column.bookmarked_statuses": "Et ole vielä lisännyt julkaisuja kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.", "empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!", - "empty_column.direct": "Yksityisiä mainintoja ei vielä ole. Jos lähetät tai sinulle lähetetään sellaisia, näet ne täällä.", + "empty_column.direct": "Yksityismainintoja ei vielä ole. Jos lähetät tai sinulle lähetetään sellaisia, näet ne täällä.", "empty_column.domain_blocks": "Verkkotunnuksia ei ole vielä estetty.", "empty_column.explore_statuses": "Mikään ei ole nyt suosittua. Tarkista myöhemmin uudelleen!", "empty_column.favourited_statuses": "Sinulla ei ole vielä yhtään suosikkijulkaisua. Kun lisäät sellaisen, näkyy se tässä.", "empty_column.favourites": "Kukaan ei ole vielä lisännyt tätä julkaisua suosikkeihinsa. Kun joku tekee niin, tulee hän tähän näkyviin.", - "empty_column.follow_requests": "Et ole vielä vastaanottanut seuraamispyyntöjä. Saamasi pyynnöt näkyvät täällä.", + "empty_column.follow_requests": "Et ole vielä vastaanottanut seurantapyyntöjä. Saamasi pyynnöt näkyvät täällä.", "empty_column.followed_tags": "Et seuraa vielä yhtäkään aihetunnistetta. Kun alat seurata, ne tulevat tähän näkyviin.", "empty_column.hashtag": "Tällä aihetunnisteella ei löydy vielä sisältöä.", - "empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia henkilöjä, niin näet enemmän sisältöä.", + "empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia käyttäjiä, niin näet enemmän sisältöä.", "empty_column.list": "Tällä listalla ei ole vielä mitään. Kun tämän listan jäsenet lähettävät uusia julkaisuja, ne näkyvät tässä.", "empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.", "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.", "empty_column.notification_requests": "Olet ajan tasalla! Täällä ei ole mitään uutta kerrottavaa. Kun saat uusia ilmoituksia, ne näkyvät täällä asetustesi mukaisesti.", - "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun keskustelet muille, näet sen täällä.", - "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti. Voit myös seurata muiden palvelimien käyttäjiä", + "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun muut ovat vuorovaikutuksessa kanssasi, näet sen täällä.", + "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti tai seuraa muiden palvelinten käyttäjiä, niin saat sisältöä", "error.unexpected_crash.explanation": "Sivua ei voida näyttää oikein ohjelmointivirheen tai selaimen yhteensopivuusvajeen vuoksi.", "error.unexpected_crash.explanation_addons": "Sivua ei voitu näyttää oikein. Tämä virhe johtuu todennäköisesti selaimen lisäosasta tai automaattisista käännöstyökaluista.", "error.unexpected_crash.next_steps": "Kokeile päivittää sivu. Jos se ei auta, voi Mastodonin käyttö ehkä onnistua eri selaimella tai natiivisovelluksella.", @@ -297,21 +300,20 @@ "filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi", "filter_modal.select_filter.title": "Suodata tämä julkaisu", "filter_modal.title.status": "Suodata julkaisu", - "filtered_notifications_banner.mentions": "{count, plural, one {maininta} other {mainintaa}}", - "filtered_notifications_banner.pending_requests": "Ilmoituksia {count, plural, =0 {ei ole} one {1 henkilöltä} other {# henkilöltä}}, jonka saatat tuntea", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Ei keneltäkään, jonka} one {1 käyttäjältä, jonka} other {# käyttäjältä, jotka}} saatat tuntea", "filtered_notifications_banner.title": "Suodatetut ilmoitukset", "firehose.all": "Kaikki", "firehose.local": "Tämä palvelin", "firehose.remote": "Muut palvelimet", "follow_request.authorize": "Valtuuta", "follow_request.reject": "Hylkää", - "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, palvelimen {domain} ylläpito on arvioinut, että saatat olla halukas tarkistamaan nämä seuraamispyynnöt erikseen.", + "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, palvelimen {domain} ylläpito on arvioinut, että saatat olla halukas tarkistamaan nämä seurantapyynnöt erikseen.", "follow_suggestions.curated_suggestion": "Ehdotus ylläpidolta", "follow_suggestions.dismiss": "Älä näytä uudelleen", "follow_suggestions.featured_longer": "Palvelimen {domain} tiimin poimintoja", - "follow_suggestions.friends_of_friends_longer": "Suosittu seuraamiesi ihmisten keskuudessa", + "follow_suggestions.friends_of_friends_longer": "Suosittu seuraamiesi käyttäjien joukossa", "follow_suggestions.hints.featured": "Tämän profiilin on valinnut palvelimen {domain} tiimi.", - "follow_suggestions.hints.friends_of_friends": "Seuraamasi käyttäjät suosivat tätä profiilia.", + "follow_suggestions.hints.friends_of_friends": "Tämä profiili on suosittu seuraamiesi käyttäjien joukossa.", "follow_suggestions.hints.most_followed": "Tämä profiili on palvelimen {domain} seuratuimpia.", "follow_suggestions.hints.most_interactions": "Tämä profiili on viime aikoina saanut paljon huomiota palvelimella {domain}.", "follow_suggestions.hints.similar_to_recently_followed": "Tämä profiili on samankaltainen kuin profiilit, joita olet viimeksi seurannut.", @@ -354,7 +356,7 @@ "home.pending_critical_update.link": "Tutustu päivityssisältöihin", "home.pending_critical_update.title": "Kriittinen tietoturvapäivitys saatavilla!", "home.show_announcements": "Näytä tiedotteet", - "interaction_modal.description.favourite": "Mastodon-tilillä voit lisätä tämän julkaisun suosikkeihisi osoittaaksesi kirjoittajalle arvostavasi sitä ja tallentaaksesi sen tulevaa käyttöä varten.", + "interaction_modal.description.favourite": "Mastodon-tilillä voit lisätä tämän julkaisun suosikkeihisi osoittaaksesi tekijälle arvostavasi sitä ja tallentaaksesi sen tulevaa käyttöä varten.", "interaction_modal.description.follow": "Mastodon-tilillä voit seurata käyttäjää {name} saadaksesi hänen julkaisunsa kotisyötteeseesi.", "interaction_modal.description.reblog": "Mastodon-tilillä voit tehostaa tätä julkaisua jakaaksesi sen seuraajiesi kanssa.", "interaction_modal.description.reply": "Mastodon-tilillä voit vastata tähän julkaisuun.", @@ -364,7 +366,7 @@ "interaction_modal.on_another_server": "Toisella palvelimella", "interaction_modal.on_this_server": "Tällä palvelimella", "interaction_modal.sign_in": "Et ole kirjautunut tälle palvelimelle. Millä palvelimella tilisi sijaitsee?", - "interaction_modal.sign_in_hint": "Vihje: Se on sama verkkosivusto, jolle rekisteröidyit. Jos et muista, etsi tervetulosähköposti saapuneista viesteistäsi. Voit myös syöttää koko käyttäjätunnuksesi! (Esimerkki: @Mastodon@Mastodon.social)", + "interaction_modal.sign_in_hint": "Vihje: Se on sama verkkosivusto, jolle rekisteröidyit. Jos et muista palvelintasi, etsi tervetulosähköposti saapuneista viesteistäsi. Voit syöttää myös koko käyttäjätunnuksesi! (Esimerkki: @Mastodon@Mastodon.social)", "interaction_modal.title.favourite": "Lisää käyttäjän {name} julkaisu suosikkeihin", "interaction_modal.title.follow": "Seuraa käyttäjää {name}", "interaction_modal.title.reblog": "Tehosta käyttäjän {name} julkaisua", @@ -378,7 +380,7 @@ "keyboard_shortcuts.column": "Kohdista sarakkeeseen", "keyboard_shortcuts.compose": "Kohdista kirjoituskenttään", "keyboard_shortcuts.description": "Kuvaus", - "keyboard_shortcuts.direct": "Avaa yksityisten mainintojen sarake", + "keyboard_shortcuts.direct": "Avaa yksityismainintojen sarake", "keyboard_shortcuts.down": "Siirry listassa alaspäin", "keyboard_shortcuts.enter": "Avaa julkaisu", "keyboard_shortcuts.favourite": "Lisää julkaisu suosikkeihin", @@ -389,15 +391,15 @@ "keyboard_shortcuts.hotkey": "Pikanäppäin", "keyboard_shortcuts.legend": "Näytä tämä ohje", "keyboard_shortcuts.local": "Avaa paikallinen aikajana", - "keyboard_shortcuts.mention": "Mainitse julkaisija", + "keyboard_shortcuts.mention": "Mainitse tekijä", "keyboard_shortcuts.muted": "Avaa mykistettyjen käyttäjien luettelo", "keyboard_shortcuts.my_profile": "Avaa profiilisi", "keyboard_shortcuts.notifications": "Avaa ilmoitussarake", "keyboard_shortcuts.open_media": "Avaa media", "keyboard_shortcuts.pinned": "Avaa kiinnitettyjen julkaisujen luettelo", - "keyboard_shortcuts.profile": "Avaa kirjoittajan profiili", + "keyboard_shortcuts.profile": "Avaa tekijän profiili", "keyboard_shortcuts.reply": "Vastaa julkaisuun", - "keyboard_shortcuts.requests": "Avaa seuraamispyyntöjen luettelo", + "keyboard_shortcuts.requests": "Avaa seurantapyyntöjen luettelo", "keyboard_shortcuts.search": "Kohdista hakukenttään", "keyboard_shortcuts.spoilers": "Näytä/piilota sisältövaroituskenttä", "keyboard_shortcuts.start": "Avaa Näin pääset alkuun -sarake", @@ -412,9 +414,9 @@ "lightbox.next": "Seuraava", "lightbox.previous": "Edellinen", "limited_account_hint.action": "Näytä profiili joka tapauksessa", - "limited_account_hint.title": "Palvelimen {domain} valvojat ovat piilottaneet tämän käyttäjätilin.", + "limited_account_hint.title": "Palvelimen {domain} moderaattorit ovat piilottaneet tämän profiilin.", "link_preview.author": "Julkaissut {name}", - "link_preview.more_from_author": "Lisää käyttäjältä {name}", + "link_preview.more_from_author": "Lisää tekijältä {name}", "link_preview.shares": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}", "lists.account.add": "Lisää listalle", "lists.account.remove": "Poista listalta", @@ -428,7 +430,7 @@ "lists.replies_policy.list": "Listan jäsenille", "lists.replies_policy.none": "Ei kellekään", "lists.replies_policy.title": "Näytä vastaukset:", - "lists.search": "Etsi seuraamiesi henkilöiden keskuudesta", + "lists.search": "Hae seuraamistasi käyttäjistä", "lists.subheading": "Omat listasi", "load_pending": "{count, plural, one {# uusi kohde} other {# uutta kohdetta}}", "loading_indicator.label": "Ladataan…", @@ -436,12 +438,12 @@ "moved_to_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä, koska teit siirron tiliin {movedToAccount}.", "mute_modal.hide_from_notifications": "Piilota ilmoituksista", "mute_modal.hide_options": "Piilota vaihtoehdot", - "mute_modal.indefinite": "Kunnes perun häntä koskevan mykistyksen", + "mute_modal.indefinite": "Kunnes kumoan häntä koskevan mykistyksen", "mute_modal.show_options": "Näytä vaihtoehdot", "mute_modal.they_can_mention_and_follow": "Hän voi mainita sinut ja seurata sinua, mutta sinä et näe häntä.", - "mute_modal.they_wont_know": "Hän ei saa ilmoitusta tulleensa mykistetyksi.", + "mute_modal.they_wont_know": "Hän ei saa tietää tulleensa mykistetyksi.", "mute_modal.title": "Mykistetäänkö käyttäjä?", - "mute_modal.you_wont_see_mentions": "Et tule enää näkemään julkaisuja, joissa hänet mainitaan.", + "mute_modal.you_wont_see_mentions": "Et näe enää julkaisuja, joissa hänet mainitaan.", "mute_modal.you_wont_see_posts": "Hän voi yhä nähdä julkaisusi, mutta sinä et näe hänen.", "name_and_others": "{name} ja {count, plural, one {# muu} other {# muuta}}", "name_and_others_with_link": "{name} ja {count, plural, one {# muu} other {# muuta}}", @@ -457,7 +459,7 @@ "navigation_bar.explore": "Selaa", "navigation_bar.favourites": "Suosikit", "navigation_bar.filters": "Mykistetyt sanat", - "navigation_bar.follow_requests": "Seuraamispyynnöt", + "navigation_bar.follow_requests": "Seurantapyynnöt", "navigation_bar.followed_tags": "Seuratut aihetunnisteet", "navigation_bar.follows_and_followers": "Seuratut ja seuraajat", "navigation_bar.lists": "Listat", @@ -468,7 +470,7 @@ "navigation_bar.pins": "Kiinnitetyt julkaisut", "navigation_bar.preferences": "Asetukset", "navigation_bar.public_timeline": "Yleinen aikajana", - "navigation_bar.search": "Hae", + "navigation_bar.search": "Haku", "navigation_bar.security": "Turvallisuus", "not_signed_in_indicator.not_signed_in": "Sinun on kirjauduttava sisään käyttääksesi resurssia.", "notification.admin.report": "{name} raportoi käyttäjän {target}", @@ -479,13 +481,13 @@ "notification.admin.sign_up": "{name} rekisteröityi", "notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa", "notification.follow": "{name} seurasi sinua", - "notification.follow_request": "{name} on pyytänyt lupaa saada seurata sinua", + "notification.follow_request": "{name} on pyytänyt lupaa seurata sinua", "notification.mention": "{name} mainitsi sinut", "notification.moderation-warning.learn_more": "Lue lisää", "notification.moderation_warning": "Olet saanut moderointivaroituksen", - "notification.moderation_warning.action_delete_statuses": "Jotkin julkaisusi on poistettu.", + "notification.moderation_warning.action_delete_statuses": "Julkaisujasi on poistettu.", "notification.moderation_warning.action_disable": "Tilisi on poistettu käytöstä.", - "notification.moderation_warning.action_mark_statuses_as_sensitive": "Jotkin julkaisusi on merkitty arkaluonteisiksi.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Julkaisujasi on merkitty arkaluonteisiksi.", "notification.moderation_warning.action_none": "Tilisi on saanut moderointivaroituksen.", "notification.moderation_warning.action_sensitive": "Tästä lähtien julkaisusi merkitään arkaluonteisiksi.", "notification.moderation_warning.action_silence": "Tiliäsi on rajoitettu.", @@ -498,7 +500,7 @@ "notification.relationships_severance_event.account_suspension": "Palvelimen {from} ylläpitäjä on jäädyttänyt palvelimen {target} vuorovaikutuksen. Enää et voi siis vastaanottaa päivityksiä heiltä tai olla yhteyksissä heidän kanssaan.", "notification.relationships_severance_event.domain_block": "Palvelimen {from} ylläpitäjä on estänyt palvelimen {target} vuorovaikutuksen – mukaan lukien {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.", "notification.relationships_severance_event.learn_more": "Lue lisää", - "notification.relationships_severance_event.user_domain_block": "Olet estänyt palvelimen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.", + "notification.relationships_severance_event.user_domain_block": "Olet estänyt verkkotunnuksen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.", "notification.status": "{name} julkaisi juuri", "notification.update": "{name} muokkasi julkaisua", "notification_requests.accept": "Hyväksy", @@ -507,7 +509,8 @@ "notification_requests.title": "Suodatetut ilmoitukset", "notifications.clear": "Tyhjennä ilmoitukset", "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?", - "notifications.column_settings.admin.report": "Uudet ilmoitukset:", + "notifications.clear_title": "Tyhjennetäänkö ilmoitukset?", + "notifications.column_settings.admin.report": "Uudet raportit:", "notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:", "notifications.column_settings.alert": "Työpöytäilmoitukset", "notifications.column_settings.beta.category": "Kokeelliset ominaisuudet", @@ -516,7 +519,7 @@ "notifications.column_settings.filter_bar.advanced": "Näytä kaikki luokat", "notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki", "notifications.column_settings.follow": "Uudet seuraajat:", - "notifications.column_settings.follow_request": "Uudet seuraamispyynnöt:", + "notifications.column_settings.follow_request": "Uudet seurantapyynnöt:", "notifications.column_settings.mention": "Maininnat:", "notifications.column_settings.poll": "Äänestyksen tulokset:", "notifications.column_settings.push": "Puskuilmoitukset", @@ -530,23 +533,23 @@ "notifications.filter.all": "Kaikki", "notifications.filter.boosts": "Tehostukset", "notifications.filter.favourites": "Suosikit", - "notifications.filter.follows": "Seuraa", + "notifications.filter.follows": "Seuraamiset", "notifications.filter.mentions": "Maininnat", "notifications.filter.polls": "Äänestyksen tulokset", - "notifications.filter.statuses": "Päivitykset henkilöiltä, joita seuraat", - "notifications.grant_permission": "Myönnä lupa.", + "notifications.filter.statuses": "Päivitykset seuraamiltasi käyttäjiltä", + "notifications.grant_permission": "Myönnä käyttöoikeus.", "notifications.group": "{count} ilmoitusta", "notifications.mark_as_read": "Merkitse jokainen ilmoitus luetuksi", "notifications.permission_denied": "Työpöytäilmoitukset eivät ole käytettävissä, koska selaimen käyttöoikeuspyyntö on aiemmin evätty", - "notifications.permission_denied_alert": "Työpöytäilmoituksia ei voi ottaa käyttöön, koska selaimen käyttöoikeus on aiemmin estetty", - "notifications.permission_required": "Työpöytäilmoitukset eivät ole käytettävissä, koska siihen tarvittavaa lupaa ei ole myönnetty.", - "notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viimeisimmän päivän aikana} other {# viime päivän aikana}}", + "notifications.permission_denied_alert": "Työpöytäilmoituksia ei voi ottaa käyttöön, koska selaimen käyttöoikeus on aiemmin evätty", + "notifications.permission_required": "Työpöytäilmoitukset eivät ole käytettävissä, koska siihen tarvittavaa käyttöoikeutta ei ole myönnetty.", + "notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viime päivän} other {viimeisen # päivän}} aikana", "notifications.policy.filter_new_accounts_title": "Uudet tilit", - "notifications.policy.filter_not_followers_hint": "Mukaan lukien alle {days, plural, one {päivän} other {# päivän}} verran sinua seuranneet", - "notifications.policy.filter_not_followers_title": "Henkilöt, jotka eivät seuraa sinua", - "notifications.policy.filter_not_following_hint": "Kunnes hyväksyt ne omin käsin", - "notifications.policy.filter_not_following_title": "Henkilöt, joita et seuraa", - "notifications.policy.filter_private_mentions_hint": "Suodatetaan, ellei se vastaa omaan mainintaasi tai ellet seuraa lähettäjää", + "notifications.policy.filter_not_followers_hint": "Mukaan lukien alle {days, plural, one {päivän} other {# päivää}} sinua seuranneet", + "notifications.policy.filter_not_followers_title": "Käyttäjät, jotka eivät seuraa sinua", + "notifications.policy.filter_not_following_hint": "Kunnes hyväksyt heidät manuaalisesti", + "notifications.policy.filter_not_following_title": "Käyttäjät, joita et seuraa", + "notifications.policy.filter_private_mentions_hint": "Suodatetaan, ellei se ole vastaus omaan mainintaasi tai ellet seuraa lähettäjää", "notifications.policy.filter_private_mentions_title": "Ei-toivotut yksityismaininnat", "notifications.policy.title": "Suodata ilmoitukset pois kohteesta…", "notifications_permission_banner.enable": "Ota työpöytäilmoitukset käyttöön", @@ -569,8 +572,8 @@ "onboarding.profile.note_hint": "Voit @mainita muita käyttäjiä tai #aihetunnisteita…", "onboarding.profile.save_and_continue": "Tallenna ja jatka", "onboarding.profile.title": "Profiilin määritys", - "onboarding.profile.upload_avatar": "Lataa profiilikuva", - "onboarding.profile.upload_header": "Lataa profiilin otsakekuva", + "onboarding.profile.upload_avatar": "Lähetä profiilikuva", + "onboarding.profile.upload_header": "Lähetä profiilin otsakekuva", "onboarding.share.lead": "Kerro ihmisille, kuinka he voivat löytää sinut Mastodonista!", "onboarding.share.message": "Olen {username} #Mastodon⁠issa! Seuraa minua osoitteessa {url}", "onboarding.share.next_steps": "Mahdolliset seuraavat vaiheet:", @@ -586,8 +589,8 @@ "onboarding.steps.setup_profile.title": "Mukauta profiiliasi", "onboarding.steps.share_profile.body": "Kerro kavereillesi, kuinka sinut löytää Mastodonista", "onboarding.steps.share_profile.title": "Jaa Mastodon-profiilisi", - "onboarding.tips.2fa": "Tiesitkö? Voit suojata tilisi ottamalla kaksivaiheisen todennuksen käyttöön tilisi asetuksista. Se toimii millä tahansa TOTP-sovelluksella, eikä sen käyttö edellytä puhelinnumeron antoa!", - "onboarding.tips.accounts_from_other_servers": "Tiesitkö? Koska Mastodon on hajautettu, osa kohtaamistasi profiileista sijaitsee muilla kuin sinun palvelimellasi. Voit silti viestiä saumattomasti heidän kanssaan! Heidän palvelimensa mainitaan käyttäjänimen jälkiosassa!", + "onboarding.tips.2fa": "Tiesitkö? Voit suojata tilisi ottamalla kaksivaiheisen todennuksen käyttöön tilisi asetuksista. Se toimii millä tahansa TOTP-sovelluksella, eikä sen käyttö edellytä puhelinnumeron luovuttamista!", + "onboarding.tips.accounts_from_other_servers": "Tiesitkö? Koska Mastodon on hajautettu, osa kohtaamistasi profiileista sijaitsee muilla kuin sinun palvelimellasi. Voit silti viestiä saumattomasti heidän kanssaan! Heidän palvelimensa mainitaan käyttäjätunnuksen jälkiosassa!", "onboarding.tips.migration": "Tiesitkö? Jos koet, ettei {domain} ole jatkossa itsellesi hyvä palvelinvalinta, voit siirtyä toiselle Mastodon-palvelimelle menettämättä seuraajiasi. Voit jopa isännöidä omaa palvelintasi!", "onboarding.tips.verification": "Tiesitkö? Voit vahvistaa tilisi lisäämällä omalle verkkosivustollesi linkin Mastodon-profiiliisi ja lisäämällä sitten verkkosivustosi osoitteen Mastodon-profiilisi lisäkenttään. Tämä ei maksa mitään, eikä sinun tarvitse lähetellä asiakirjoja!", "password_confirmation.exceeds_maxlength": "Salasanan vahvistus ylittää salasanan enimmäispituuden", @@ -610,12 +613,12 @@ "privacy.private.short": "Seuraajat", "privacy.public.long": "Kuka tahansa Mastodonissa ja sen ulkopuolella", "privacy.public.short": "Julkinen", - "privacy.unlisted.additional": "Tämä on muutoin kuin julkinen julkaisu, mutta sitä ei näytetä livesyöte-, aihetunniste- tai selailunäkymissä eikä Mastodon-hakutuloksissakaan, vaikka ne olisivat käyttäjätililläsi yleisesti sallittuina.", + "privacy.unlisted.additional": "Tämä toimii muuten kuin julkinen, mutta julkaisut eivät näy livesyöte-, aihetunniste- tai selausnäkymissä eivätkä Mastodonin hakutuloksissa, vaikka ne olisivat käyttäjätililläsi yleisesti sallittuina.", "privacy.unlisted.long": "Vähemmän algoritmiperusteista sisältöä", "privacy.unlisted.short": "Vaivihkaisesti julkinen", - "privacy_policy.last_updated": "Viimeksi päivitetty {date}", + "privacy_policy.last_updated": "Päivitetty viimeksi {date}", "privacy_policy.title": "Tietosuojakäytäntö", - "recommended": "Suositeltu", + "recommended": "Suositellaan", "refresh": "Päivitä", "regeneration_indicator.label": "Ladataan…", "regeneration_indicator.sublabel": "Kotisyötettäsi valmistellaan!", @@ -635,24 +638,24 @@ "reply_indicator.poll": "Äänestys", "report.block": "Estä", "report.block_explanation": "Et näe hänen viestejään, eikä hän voi nähdä viestejäsi tai seurata sinua. Hän näkee, että olet estänyt hänet.", - "report.categories.legal": "Juridiset tiedot", + "report.categories.legal": "Lakiseikat", "report.categories.other": "Muu", "report.categories.spam": "Roskaposti", "report.categories.violation": "Sisältö rikkoo yhtä tai useampaa palvelimen säännöistä", "report.category.subtitle": "Valitse sopivin", "report.category.title": "Kerro meille, miksi tämä {type} pitää raportoida", - "report.category.title_account": "profiilissa", - "report.category.title_status": "julkaisussa", + "report.category.title_account": "profiili", + "report.category.title_status": "julkaisu", "report.close": "Valmis", "report.comment.title": "Onko vielä jotain muuta, mitä meidän pitäisi tietää?", - "report.forward": "Välitä kohteeseen {target}", + "report.forward": "Välitä palvelimelle {target}", "report.forward_hint": "Tämä tili on toisella palvelimella. Haluatko lähettää nimettömän raportin myös sinne?", "report.mute": "Mykistä", "report.mute_explanation": "Et näe hänen julkaisujaan. Hän voi silti seurata sinua ja nähdä julkaisusi. Hän ei tiedä, että hänet on mykistetty.", "report.next": "Seuraava", "report.placeholder": "Lisäkommentit", "report.reasons.dislike": "En pidä siitä", - "report.reasons.dislike_description": "Sisältö on sen tyyppistä, ettet halua nähdä sitä", + "report.reasons.dislike_description": "Sisältö on sellaista, jota et halua nähdä", "report.reasons.legal": "Se on laitonta", "report.reasons.legal_description": "Katsot sisällön rikkovan maasi tai palvelimen kotimaan lakeja", "report.reasons.other": "Jotain muuta", @@ -663,18 +666,18 @@ "report.reasons.violation_description": "Tiedät sisällön rikkovan tiettyjä sääntöjä", "report.rules.subtitle": "Valitse kaikki sopivat", "report.rules.title": "Mitä sääntöjä rikotaan?", - "report.statuses.subtitle": "Valitse kaikki soveltuvat julkaisut", + "report.statuses.subtitle": "Valitse kaikki sopivat", "report.statuses.title": "Onko julkaisuja, jotka tukevat tätä raporttia?", "report.submit": "Lähetä", "report.target": "Raportoidaan {target}", "report.thanks.take_action": "Tässä on vaihtoehtosi hallita näkemääsi Mastodonissa:", - "report.thanks.take_action_actionable": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimenpiteisiin käyttäjää @{name} vastaan:", + "report.thanks.take_action_actionable": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimiin käyttäjää @{name} kohtaan:", "report.thanks.title": "Etkö halua nähdä tätä?", - "report.thanks.title_actionable": "Kiitos raportista, tutkimme asiaa.", + "report.thanks.title_actionable": "Kiitos raportista – tutkimme asiaa.", "report.unfollow": "Lopeta käyttäjän @{name} seuraaminen", - "report.unfollow_explanation": "Seuraat tätä tiliä. Estääksesi tilin viestejä näykymästä kotisyötteessäsi, lopeta sen seuraaminen.", + "report.unfollow_explanation": "Seuraat tätä tiliä. Jotta et enää näkisi sen julkaisuja kotisyötteessäsi, lopeta tilin seuraaminen.", "report_notification.attached_statuses": "{count, plural, one {{count} julkaisu} other {{count} julkaisua}} liitteenä", - "report_notification.categories.legal": "Laillinen", + "report_notification.categories.legal": "Lakiseikat", "report_notification.categories.legal_sentence": "laiton sisältö", "report_notification.categories.other": "Muu", "report_notification.categories.other_sentence": "jokin muu", @@ -688,7 +691,7 @@ "search.quick_action.account_search": "Profiilit haulla {x}", "search.quick_action.go_to_account": "Siirry profiiliin {x}", "search.quick_action.go_to_hashtag": "Siirry aihetunnisteeseen {x}", - "search.quick_action.open_url": "Avaa verkko-osoite Mastodonissa", + "search.quick_action.open_url": "Avaa URL-osoite Mastodonissa", "search.quick_action.status_search": "Julkaisut haulla {x}", "search.search_or_paste": "Hae tai liitä URL-osoite", "search_popout.full_text_search_disabled_message": "Ei saatavilla palvelimella {domain}.", @@ -712,18 +715,18 @@ "server_banner.is_one_of_many": "{domain} on yksi monista itsenäisistä Mastodon-palvelimista, joiden välityksellä voit toimia fediversumissa.", "server_banner.server_stats": "Palvelimen tilastot:", "sign_in_banner.create_account": "Luo tili", - "sign_in_banner.follow_anyone": "Seuraa kenen tahansa julkaisuja fediversumissa ja näe ne kaikki aikajärjestyksessä. Ei algoritmeja, mainoksia tai klikkausten kalastelua.", + "sign_in_banner.follow_anyone": "Seuraa kenen tahansa julkaisuja fediversumissa ja näe ne kaikki aikajärjestyksessä. Ei algoritmeja, mainoksia eikä klikkausten kalastelua.", "sign_in_banner.mastodon_is": "Mastodon on paras tapa pysyä ajan tasalla siitä, mitä ympärillä tapahtuu.", "sign_in_banner.sign_in": "Kirjaudu", "sign_in_banner.sso_redirect": "Kirjaudu tai rekisteröidy", - "status.admin_account": "Avaa tilin @{name} valvontanäkymä", - "status.admin_domain": "Avaa palvelimen {domain} valvontanäkymä", - "status.admin_status": "Avaa julkaisu valvontanäkymässä", + "status.admin_account": "Avaa tilin @{name} moderointinäkymä", + "status.admin_domain": "Avaa palvelimen {domain} moderointinäkymä", + "status.admin_status": "Avaa julkaisu moderointinäkymässä", "status.block": "Estä @{name}", "status.bookmark": "Lisää kirjanmerkki", "status.cancel_reblog_private": "Peru tehostus", "status.cannot_reblog": "Tätä julkaisua ei voi tehostaa", - "status.copy": "Kopioi julkaisun linkki", + "status.copy": "Kopioi linkki julkaisuun", "status.delete": "Poista", "status.detailed_status": "Yksityiskohtainen keskustelunäkymä", "status.direct": "Mainitse @{name} yksityisesti", @@ -786,20 +789,20 @@ "time_remaining.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} jäljellä", "time_remaining.moments": "Hetkiä jäljellä", "time_remaining.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} jäljellä", - "timeline_hint.remote_resource_not_displayed": "Muiden palvelinten {resource}-tietoa ei näytetä täällä.", - "timeline_hint.resources.followers": "Seuraajat", - "timeline_hint.resources.follows": "seurattua", - "timeline_hint.resources.statuses": "Vanhemmat julkaisut", + "timeline_hint.remote_resource_not_displayed": "Muiden palvelinten {resource} eivät näy tässä.", + "timeline_hint.resources.followers": "seuraajat", + "timeline_hint.resources.follows": "seuratut", + "timeline_hint.resources.statuses": "vanhemmat julkaisut", "trends.counter_by_accounts": "{count, plural, one {{counter} henkilö} other {{counter} henkilöä}} {days, plural, one {viime päivänä} other {viimeisenä {days} päivänä}}", "trends.trending_now": "Suosittua nyt", "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.", "units.short.billion": "{count} mrd.", "units.short.million": "{count} milj.", "units.short.thousand": "{count} t.", - "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", + "upload_area.title": "Lähetä raahaamalla ja pudottamalla tähän", "upload_button.label": "Lisää kuvia, video tai äänitiedosto", - "upload_error.limit": "Tiedostolatauksien rajoitus ylitetty.", - "upload_error.poll": "Tiedostojen lisääminen ei ole sallittua kyselyjen ohessa.", + "upload_error.limit": "Tiedostolähetysten rajoitus ylitetty.", + "upload_error.poll": "Tiedostojen lisääminen äänestysten oheen ei ole sallittua.", "upload_form.audio_description": "Kuvaile sisältöä kuuroille ja kuulorajoitteisille", "upload_form.description": "Kuvaile sisältöä sokeille ja näkörajoitteisille", "upload_form.edit": "Muokkaa", @@ -815,9 +818,9 @@ "upload_modal.hint": "Napsauta tai vedä ympyrä esikatselussa valitaksesi keskipiste, joka näkyy aina pienoiskuvissa.", "upload_modal.preparing_ocr": "Valmistellaan tekstintunnistusta…", "upload_modal.preview_label": "Esikatselu ({ratio})", - "upload_progress.label": "Tallennetaan...", + "upload_progress.label": "Lähetetään...", "upload_progress.processing": "Käsitellään…", - "username.taken": "Käyttäjänimi on jo varattu. Kokeile toista", + "username.taken": "Tämä käyttäjänimi on jo käytössä. Kokeile toista", "video.close": "Sulje video", "video.download": "Lataa tiedosto", "video.exit_fullscreen": "Poistu koko näytön tilasta", diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index b8a2987ef052f3..1bdcd6f54ec909 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -112,13 +112,10 @@ "compose_form.spoiler.unmarked": "Idagdag ang babala sa nilalaman", "confirmation_modal.cancel": "Pagpaliban", "confirmations.block.confirm": "Harangan", - "confirmations.cancel_follow_request.confirm": "Bawiin ang kahilingan", - "confirmations.cancel_follow_request.message": "Sigurdo ka bang gusto mong bawiin ang kahilingang sundan si/ang {name}?", "confirmations.delete.message": "Sigurado ka bang gusto mong burahin ang post na ito?", "confirmations.delete_list.confirm": "Tanggalin", "confirmations.delete_list.message": "Sigurado ka bang gusto mong burahin ang listahang ito?", "confirmations.discard_edit_media.confirm": "Ipagpaliban", - "confirmations.domain_block.confirm": "Harangan ang serbiro", "confirmations.edit.confirm": "Baguhin", "confirmations.reply.confirm": "Tumugon", "conversation.mark_as_read": "Markahan bilang nabasa na", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index dd3d448834e06a..a9004ea189e3d3 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Innihaldsávaring (valfrí)", "confirmation_modal.cancel": "Strika", "confirmations.block.confirm": "Banna", - "confirmations.cancel_follow_request.confirm": "Tak umbønina aftur", - "confirmations.cancel_follow_request.message": "Er tað tilætlað, at tú tekur umbønina at fylgja {name} aftur?", "confirmations.delete.confirm": "Strika", "confirmations.delete.message": "Er tað tilætlað, at tú strikar hetta uppslagið?", + "confirmations.delete.title": "Strika post?", "confirmations.delete_list.confirm": "Strika", "confirmations.delete_list.message": "Ert tú vís/ur í, at tú vilt strika hetta uppslagið?", + "confirmations.delete_list.title": "Strika lista?", "confirmations.discard_edit_media.confirm": "Vraka", "confirmations.discard_edit_media.message": "Tú hevur broytingar í miðlalýsingini ella undansýningini, sum ikki eru goymdar. Vilt tú kortini vraka?", - "confirmations.domain_block.confirm": "Banna ambætara", - "confirmations.domain_block.message": "Ert tú púra, púra vís/ur í, at tú vilt banna øllum {domain}? Í flestu førum er nóg mikið og betri, bert at banna ella doyva onkrum ávísum. Tú fert eingi evni at síggja frá økisnavninum á nakrari almennari tíðarrás ella í tínum fráboðanum. Tínir fylgjarar undir økisnavninum verða eisini strikaðir.", "confirmations.edit.confirm": "Rætta", "confirmations.edit.message": "Rættingar, sum verða gjørdar nú, skriva yvir boðini, sum tú ert í holt við. Ert tú vís/ur í, at tú vilt halda fram?", + "confirmations.edit.title": "Skriva omaná post?", "confirmations.logout.confirm": "Rita út", "confirmations.logout.message": "Ert tú vís/ur í, at tú vilt útrita teg?", + "confirmations.logout.title": "Rita út?", "confirmations.mute.confirm": "Doyv", "confirmations.redraft.confirm": "Sletta og skriva umaftur", "confirmations.redraft.message": "Vilt tú veruliga strika hendan postin og í staðin gera hann til eina nýggja kladdu? Yndisfrámerki og framhevjanir blíva burtur, og svar til upprunapostin missa tilknýtið.", + "confirmations.redraft.title": "Strika & ger nýtt uppskot um post?", "confirmations.reply.confirm": "Svara", "confirmations.reply.message": "Svarar tú nú, verða boðini, sum tú ert í holt við at skriva yvirskrivað. Ert tú vís/ur í, at tú vilt halda fram?", + "confirmations.reply.title": "Skriva omaná post?", "confirmations.unfollow.confirm": "Fylg ikki", "confirmations.unfollow.message": "Ert tú vís/ur í, at tú vil steðga við at fylgja {name}?", + "confirmations.unfollow.title": "Gevst at fylgja brúkara?", "conversation.delete": "Strika samrøðu", "conversation.mark_as_read": "Merk sum lisið", "conversation.open": "Vís samrøðu", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Brúka ein verandi bólk ella skapa ein nýggjan", "filter_modal.select_filter.title": "Filtrera hendan postin", "filter_modal.title.status": "Filtrera ein post", - "filtered_notifications_banner.mentions": "{count, plural, one {umrøða} other {umrøður}}", - "filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir", + "filtered_notifications_banner.pending_requests": "Frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir", "filtered_notifications_banner.title": "Sáldaðar fráboðanir", "firehose.all": "Allar", "firehose.local": "Hesin ambætarin", @@ -474,7 +476,7 @@ "notification.admin.report": "{name} hevur meldað {target}", "notification.admin.report_account": "{name} meldaði {count, plural, one {ein post} other {# postar}} frá {target} fyri {category}", "notification.admin.report_account_other": "{name} meldaði {count, plural, one {ein post} other {# postar}} frá {target}", - "notification.admin.report_statuses": "{name} melaði {target} fyri {category}", + "notification.admin.report_statuses": "{name} meldaði {target} fyri {category}", "notification.admin.report_statuses_other": "{name} meldaði {target}", "notification.admin.sign_up": "{name} meldaði seg til", "notification.favourite": "{name} dámdi postin hjá tær", @@ -507,6 +509,7 @@ "notification_requests.title": "Sáldaðar fráboðanir", "notifications.clear": "Rudda fráboðanir", "notifications.clear_confirmation": "Ert tú vís/ur í, at tú vilt strika allar tínar fráboðanir?", + "notifications.clear_title": "Rudda fráboðanir?", "notifications.column_settings.admin.report": "Nýggjar fráboðanir:", "notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:", "notifications.column_settings.alert": "Skriviborðsfráboðanir", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 94b73bbf18235d..ad442df778ef5d 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -166,27 +166,30 @@ "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "confirmation_modal.cancel": "Annuler", "confirmations.block.confirm": "Bloquer", - "confirmations.cancel_follow_request.confirm": "Retirer cette demande", - "confirmations.cancel_follow_request.message": "Êtes-vous sûr de vouloir retirer votre demande pour suivre {name}?", "confirmations.delete.confirm": "Supprimer", "confirmations.delete.message": "Voulez-vous vraiment supprimer cette publication?", + "confirmations.delete.title": "Supprimer la publication ?", "confirmations.delete_list.confirm": "Supprimer", "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?", + "confirmations.delete_list.title": "Supprimer la liste ?", "confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, voulez-vous quand même les supprimer?", - "confirmations.domain_block.confirm": "Bloquer le serveur", - "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.edit.confirm": "Éditer", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", + "confirmations.edit.title": "Remplacer le message ?", "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?", + "confirmations.logout.title": "Se déconnecter ?", "confirmations.mute.confirm": "Masquer", "confirmations.redraft.confirm": "Supprimer et réécrire", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses ses mises en favori et boosts seront perdus et ses réponses seront orphelines.", + "confirmations.redraft.title": "Supprimer et réécrire le message ?", "confirmations.reply.confirm": "Répondre", "confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez présentement. Voulez-vous vraiment continuer?", + "confirmations.reply.title": "Remplacer le message ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name}?", + "confirmations.unfollow.title": "Se désabonner de l'utilisateur ?", "conversation.delete": "Supprimer cette conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher cette conversation", @@ -294,7 +297,6 @@ "filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle", "filter_modal.select_filter.title": "Filtrer cette publication", "filter_modal.title.status": "Filtrer une publication", - "filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {d’une personne} other {de # personnes}} que vous pouvez connaitre", "filtered_notifications_banner.title": "Notifications filtrées", "firehose.all": "Tout", "firehose.local": "Ce serveur", @@ -480,6 +482,7 @@ "notification_requests.title": "Notifications filtrées", "notifications.clear": "Effacer notifications", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications?", + "notifications.clear_title": "Effacer les notifications ?", "notifications.column_settings.admin.report": "Nouveaux signalements:", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:", "notifications.column_settings.alert": "Notifications navigateur", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index fd256fe7168688..b849ab8f87aadb 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -166,27 +166,30 @@ "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "confirmation_modal.cancel": "Annuler", "confirmations.block.confirm": "Bloquer", - "confirmations.cancel_follow_request.confirm": "Retirer la demande", - "confirmations.cancel_follow_request.message": "Êtes-vous sûr de vouloir retirer votre demande pour suivre {name} ?", "confirmations.delete.confirm": "Supprimer", "confirmations.delete.message": "Voulez-vous vraiment supprimer ce message ?", + "confirmations.delete.title": "Supprimer la publication ?", "confirmations.delete_list.confirm": "Supprimer", "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste ?", + "confirmations.delete_list.title": "Supprimer la liste ?", "confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, les supprimer quand même ?", - "confirmations.domain_block.confirm": "Bloquer le serveur", - "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.edit.confirm": "Modifier", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", + "confirmations.edit.title": "Remplacer le message ?", "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?", + "confirmations.logout.title": "Se déconnecter ?", "confirmations.mute.confirm": "Masquer", "confirmations.redraft.confirm": "Supprimer et ré-écrire", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire ? Ses partages ainsi que ses mises en favori seront perdus et ses réponses seront orphelines.", + "confirmations.redraft.title": "Supprimer et réécrire le message ?", "confirmations.reply.confirm": "Répondre", "confirmations.reply.message": "Répondre maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", + "confirmations.reply.title": "Remplacer le message ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name} ?", + "confirmations.unfollow.title": "Se désabonner de l'utilisateur ?", "conversation.delete": "Supprimer la conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher la conversation", @@ -294,7 +297,6 @@ "filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle", "filter_modal.select_filter.title": "Filtrer ce message", "filter_modal.title.status": "Filtrer un message", - "filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {d’une personne} other {de # personnes}} que vous pouvez connaitre", "filtered_notifications_banner.title": "Notifications filtrées", "firehose.all": "Tout", "firehose.local": "Ce serveur", @@ -480,6 +482,7 @@ "notification_requests.title": "Notifications filtrées", "notifications.clear": "Effacer les notifications", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications ?", + "notifications.clear_title": "Effacer les notifications ?", "notifications.column_settings.admin.report": "Nouveaux signalements :", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :", "notifications.column_settings.alert": "Notifications du navigateur", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index e3b3a965681583..3045def0282154 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -35,7 +35,9 @@ "account.follow_back": "Weromfolgje", "account.followers": "Folgers", "account.followers.empty": "Noch net ien folget dizze brûker.", + "account.followers_counter": "{count, plural, one {{counter} folger} other {{counter} folgers}}", "account.following": "Folgjend", + "account.following_counter": "{count, plural, one {{counter} folgjend} other {{counter} folgjend}}", "account.follows.empty": "Dizze brûker folget noch net ien.", "account.go_to_profile": "Gean nei profyl", "account.hide_reblogs": "Boosts fan @{name} ferstopje", @@ -61,6 +63,7 @@ "account.requested_follow": "{name} hat dy in folchfersyk stjoerd", "account.share": "Profyl fan @{name} diele", "account.show_reblogs": "Boosts fan @{name} toane", + "account.statuses_counter": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}", "account.unblock": "@{name} deblokkearje", "account.unblock_domain": "Domein {domain} deblokkearje", "account.unblock_short": "Deblokkearje", @@ -166,16 +169,12 @@ "compose_form.spoiler_placeholder": "Ynhâldswarskôging (opsjoneel)", "confirmation_modal.cancel": "Annulearje", "confirmations.block.confirm": "Blokkearje", - "confirmations.cancel_follow_request.confirm": "Fersyk annulearje", - "confirmations.cancel_follow_request.message": "Binne jo wis dat jo jo fersyk om {name} te folgjen annulearje wolle?", "confirmations.delete.confirm": "Fuortsmite", "confirmations.delete.message": "Binne jo wis dat jo dit berjocht fuortsmite wolle?", "confirmations.delete_list.confirm": "Fuortsmite", "confirmations.delete_list.message": "Binne jo wis dat jo dizze list foar permanint fuortsmite wolle?", "confirmations.discard_edit_media.confirm": "Fuortsmite", "confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?", - "confirmations.domain_block.confirm": "Server blokkearje", - "confirmations.domain_block.message": "Binne jo echt wis dat jo alles fan {domain} negearje wolle? Yn de measte gefallen is it blokkearjen of negearjen fan in pear spesifike persoanen genôch en better. Jo sille gjin berjochten fan dizze server op iepenbiere tiidlinen sjen of yn jo meldingen. Jo folgers fan dizze server wurde fuortsmiten.", "confirmations.edit.confirm": "Bewurkje", "confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?", "confirmations.logout.confirm": "Ofmelde", @@ -224,6 +223,7 @@ "domain_pill.whats_in_a_handle": "Wat is in fediverse-adres?", "domain_pill.who_they_are": "Omdat jo oan in fediverse-adres sjen kinne hoe’t ien hjit en op hokker server dy sit, kinne jo mei minsken op it troch sosjale web (fediverse) kommunisearje.", "domain_pill.your_handle": "Jo fediverse-adres:", + "domain_pill.your_username": "Jo unike identifikaasje-adres op dizze server. It is mooglik dat der brûkers mei deselde brûkersnamme op ferskate servers te finen binne.", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Sa komt it der út te sjen:", "emoji_button.activity": "Aktiviteiten", @@ -299,6 +299,8 @@ "follow_requests.unlocked_explanation": "Ek al is jo account net besletten, de meiwurkers fan {domain} tinke dat jo miskien de folgjende folchfersiken hânmjittich kontrolearje.", "follow_suggestions.curated_suggestion": "Spesjaal selektearre", "follow_suggestions.dismiss": "Net mear werjaan", + "follow_suggestions.featured_longer": "Hânmjittich selektearre troch it team fan {domain}", + "follow_suggestions.friends_of_friends_longer": "Populêr ûnder minsken dy’t jo folgje", "follow_suggestions.hints.featured": "Dit profyl is hânmjittich troch it {domain}-team selektearre.", "follow_suggestions.hints.friends_of_friends": "Dit profyl is populêr ûnder de minsken dy’t jo folgje.", "follow_suggestions.hints.most_followed": "Dit profyl is ien fan de meast folge op {domain}.", @@ -306,6 +308,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Dit profyl is hast lyk oan de profilen dy’t jo koartlyn folge hawwe.", "follow_suggestions.personalized_suggestion": "Personalisearre suggestje", "follow_suggestions.popular_suggestion": "Populêre suggestje", + "follow_suggestions.popular_suggestion_longer": "Populêr op {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Fergelykber mei accounts dy’t jo sûnt koart folgje", "follow_suggestions.view_all": "Alles werjaan", "follow_suggestions.who_to_follow": "Wa te folgjen", "followed_tags": "Folge hashtags", @@ -401,6 +405,8 @@ "limited_account_hint.action": "Profyl dochs besjen", "limited_account_hint.title": "Dit profyl is troch de behearders fan {domain} ferstoppe.", "link_preview.author": "Troch {name}", + "link_preview.more_from_author": "Mear fan {name}", + "link_preview.shares": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}", "lists.account.add": "Oan list tafoegje", "lists.account.remove": "Ut list fuortsmite", "lists.delete": "List fuortsmite", @@ -419,10 +425,17 @@ "loading_indicator.label": "Lade…", "media_gallery.toggle_visible": "{number, plural, one {ôfbylding ferstopje} other {ôfbyldingen ferstopje}}", "moved_to_account_banner.text": "Omdat jo nei {movedToAccount} ferhuze binne is jo account {disabledAccount} op dit stuit útskeakele.", + "mute_modal.hide_from_notifications": "Meldingen ferstopje", "mute_modal.hide_options": "Opsjes ferstopje", "mute_modal.indefinite": "Oant ik se net mear negearje", "mute_modal.show_options": "Opsjes toane", + "mute_modal.they_can_mention_and_follow": "De persoan kin jo fermelde en folgje, mar jo sjogge neat mear fan dizze persoan.", + "mute_modal.they_wont_know": "Se krije net te witten dat se negearre wurde.", "mute_modal.title": "Brûker negearje?", + "mute_modal.you_wont_see_mentions": "Jo sjogge gjin berjochten mear dy’t dizze account fermelde.", + "mute_modal.you_wont_see_posts": "De persoan kin jo berjochten noch hieltyd sjen, mar jo sjogge harren berjochten net mear.", + "name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}}", + "name_and_others_with_link": "{name} en {count, plural, one {# oar} other {# oaren}}", "navigation_bar.about": "Oer", "navigation_bar.advanced_interface": "Yn avansearre webomjouwing iepenje", "navigation_bar.blocks": "Blokkearre brûkers", @@ -450,13 +463,31 @@ "navigation_bar.security": "Befeiliging", "not_signed_in_indicator.not_signed_in": "Jo moatte oanmelde om tagong ta dizze ynformaasje te krijen.", "notification.admin.report": "{name} hat {target} rapportearre", + "notification.admin.report_account": "{name} rapportearre {count, plural, one {in berjocht} other {# berjochten}} fan {target} foar {category}", + "notification.admin.report_account_other": "{name} rapportearre {count, plural, one {in berjocht} other {# berjochten}} fan {target}", + "notification.admin.report_statuses": "{name} rapportearre {target} foar {category}", + "notification.admin.report_statuses_other": "{name} hat {target} rapportearre", "notification.admin.sign_up": "{name} hat harren registrearre", "notification.favourite": "{name} hat jo berjocht as favoryt markearre", "notification.follow": "{name} folget dy", "notification.follow_request": "{name} hat dy in folchfersyk stjoerd", "notification.mention": "{name} hat dy fermeld", + "notification.moderation-warning.learn_more": "Mear ynfo", + "notification.moderation_warning": "Jo hawwe in moderaasje-warskôging ûntfongen", + "notification.moderation_warning.action_delete_statuses": "Guon fan jo berjochten binne fuortsmiten.", + "notification.moderation_warning.action_disable": "Jo account is útskeakele.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Guon fan jo berjochten binne as gefoelich markearre.", + "notification.moderation_warning.action_none": "Jo account hat in moderaasje-warskôging ûntfongen.", + "notification.moderation_warning.action_sensitive": "Jo berjochten wurde fan no ôf as gefoelich markearre.", + "notification.moderation_warning.action_silence": "Jo account is beheind.", + "notification.moderation_warning.action_suspend": "Jo account is útsteld.", "notification.own_poll": "Jo poll is beëinige", + "notification.poll": "In enkête dêr’t jo oan meidien hawwe is beëinige", + "notification.private_mention": "{name} hat jo in priveeberjocht stjoerd", "notification.reblog": "{name} hat jo berjocht boost", + "notification.relationships_severance_event": "Ferlerne ferbiningen mei {name}", + "notification.relationships_severance_event.account_suspension": "In behearder fan {from} hat {target} útsteld, wat betsjut dat jo gjin updates mear fan harren ûntfange kinne of mei harren kommunisearje kinne.", + "notification.relationships_severance_event.domain_block": "In behearder fan {from} hat {target} blokkearre, ynklusyf {followersCount} fan jo folgers en {followingCount, plural, one {# account} other {# accounts}} dy’t jo folgje.", "notification.relationships_severance_event.learn_more": "Mear ynfo", "notification.status": "{name} hat in berjocht pleatst", "notification.update": "{name} hat in berjocht bewurke", @@ -623,8 +654,11 @@ "report_notification.attached_statuses": "{count, plural, one {{count} berjocht} other {{count} berjochten}} tafoege", "report_notification.categories.legal": "Juridysk", "report_notification.categories.other": "Oars", + "report_notification.categories.other_sentence": "oars", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Skeinde regels", + "report_notification.categories.violation_sentence": "skeinde regels", "report_notification.open": "Rapport iepenje", "search.no_recent_searches": "Gjin resinte sykopdrachten", "search.placeholder": "Sykje", @@ -669,9 +703,11 @@ "status.direct": "Privee fermelde @{name}", "status.direct_indicator": "Priveefermelding", "status.edit": "Bewurkje", + "status.edited": "Lêst bywurke op {date}", "status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke", "status.embed": "Ynslute", "status.favourite": "Favoryt", + "status.favourites": "{count, plural, one {favoryt} other {favoriten}}", "status.filter": "Dit berjocht filterje", "status.filtered": "Filtere", "status.hide": "Berjocht ferstopje", @@ -692,6 +728,7 @@ "status.reblog": "Booste", "status.reblog_private": "Boost nei oarspronklike ûntfangers", "status.reblogged_by": "{name} hat boost", + "status.reblogs": "{count, plural, one {boost} other {boosts}}", "status.reblogs.empty": "Net ien hat dit berjocht noch boost. Wannear’t ien dit docht, falt dat hjir te sjen.", "status.redraft": "Fuortsmite en opnij opstelle", "status.remove_bookmark": "Blêdwizer fuortsmite", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 711c97f66c7e1a..44bc62c755f8fc 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Rabhadh ábhair (roghnach)", "confirmation_modal.cancel": "Cealaigh", "confirmations.block.confirm": "Bac", - "confirmations.cancel_follow_request.confirm": "Éirigh as iarratas", - "confirmations.cancel_follow_request.message": "An bhfuil tú cinnte gur mhaith leat éirigh as an iarratas leanta {name}?", "confirmations.delete.confirm": "Scrios", "confirmations.delete.message": "An bhfuil tú cinnte gur mhaith leat an phostáil seo a scriosadh?", + "confirmations.delete.title": "Scrios postáil?", "confirmations.delete_list.confirm": "Scrios", "confirmations.delete_list.message": "An bhfuil tú cinnte gur mhaith leat an liosta seo a scriosadh go buan?", + "confirmations.delete_list.title": "Scrios liosta?", "confirmations.discard_edit_media.confirm": "Faigh réidh de", "confirmations.discard_edit_media.message": "Tá athruithe neamhshlánaithe don tuarascáil gné nó réamhamharc agat, faigh réidh dóibh ar aon nós?", - "confirmations.domain_block.confirm": "Bloc freastalaí", - "confirmations.domain_block.message": "An bhfuil tú iontach cinnte gur mhaith leat bac an t-ainm fearainn {domain} in iomlán? I bhformhór na gcásanna, is leor agus is fearr cúpla baic a cur i bhfeidhm nó cúpla úsáideoirí a balbhú. Ní fheicfidh tú ábhair ón t-ainm fearainn sin in amlíne ar bith, nó i d'fhógraí. Scaoilfear do leantóirí ón ainm fearainn sin.", "confirmations.edit.confirm": "Eagar", "confirmations.edit.message": "Má dhéanann tú eagarthóireacht anois, déanfar an teachtaireacht atá á cumadh agat faoi láthair a fhorscríobh. An bhfuil tú cinnte gur mhaith leat leanúint ar aghaidh?", + "confirmations.edit.title": "Forscríobh postáil?", "confirmations.logout.confirm": "Logáil amach", "confirmations.logout.message": "An bhfuil tú cinnte gur mhaith leat logáil amach?", + "confirmations.logout.title": "Logáil Amach?", "confirmations.mute.confirm": "Balbhaigh", "confirmations.redraft.confirm": "Scrios ⁊ athdhréachtaigh", "confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an postáil seo a scriosadh agus é a athdhréachtú? Caillfear ceanáin agus treisithe, agus dílleachtaí freagraí ar an mbunphostála.", + "confirmations.redraft.title": "Scrios & athdhréachtú postáil?", "confirmations.reply.confirm": "Freagair", "confirmations.reply.message": "Scriosfaidh freagra láithreach an teachtaireacht atá a chumadh anois agat. An bhfuil tú cinnte gur mhaith leat leanúint leat?", + "confirmations.reply.title": "Forscríobh postáil?", "confirmations.unfollow.confirm": "Ná lean", "confirmations.unfollow.message": "An bhfuil tú cinnte gur mhaith leat {name} a dhíleanúint?", + "confirmations.unfollow.title": "Dílean ​​an t-úsáideoir?", "conversation.delete": "Scrios comhrá", "conversation.mark_as_read": "Marcáil mar léite", "conversation.open": "Féach ar comhrá", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Bain úsáid as catagóir reatha nó cruthaigh ceann nua", "filter_modal.select_filter.title": "Déan scagadh ar an bpostáil seo", "filter_modal.title.status": "Déan scagadh ar phostáil", - "filtered_notifications_banner.mentions": "{count, plural, one {tagairt} other {tagairtí}}", - "filtered_notifications_banner.pending_requests": "Fógraí ó {count, plural, =0 {duine ar bith} one {duine amháin} two {# daoine} few {# daoine} many {# daoine} other {# daoine}} b'fhéidir go mbeadh a fhios agat", + "filtered_notifications_banner.pending_requests": "Ó {count, plural, =0 {duine ar bith} one {duine amháin} two {# daoine} few {# daoine} many {# daoine} other {# daoine}} b’fhéidir go bhfuil aithne agat orthu", "filtered_notifications_banner.title": "Fógraí scagtha", "firehose.all": "Gach", "firehose.local": "An freastalaí seo", @@ -507,6 +509,7 @@ "notification_requests.title": "Fógraí scagtha", "notifications.clear": "Glan fógraí", "notifications.clear_confirmation": "An bhfuil tú cinnte gur mhaith leat d'fhógraí go léir a ghlanadh go buan?", + "notifications.clear_title": "Glan fógraí?", "notifications.column_settings.admin.report": "Tuairiscí nua:", "notifications.column_settings.admin.sign_up": "Clárúcháin nua:", "notifications.column_settings.alert": "Fógraí deisce", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 93268c2715df0b..440654b0db59f8 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -35,7 +35,9 @@ "account.follow_back": "Lean air ais", "account.followers": "Luchd-leantainn", "account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.", + "account.followers_counter": "{count, plural, one {{counter} neach-leantainn} other {{counter} luchd-leantainn}}", "account.following": "A’ leantainn", + "account.following_counter": "{count, plural, one {Tha {counter} a’ leantainn} other {Tha {counter} a’ leantainn}}", "account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn neach sam bith fhathast.", "account.go_to_profile": "Tadhail air a’ phròifil", "account.hide_reblogs": "Falaich na brosnachaidhean o @{name}", @@ -61,6 +63,7 @@ "account.requested_follow": "Dh’iarr {name} ’gad leantainn", "account.share": "Co-roinn a’ phròifil aig @{name}", "account.show_reblogs": "Seall na brosnachaidhean o @{name}", + "account.statuses_counter": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}", "account.unblock": "Dì-bhac @{name}", "account.unblock_domain": "Dì-bhac an àrainn {domain}", "account.unblock_short": "Dì-bhac", @@ -166,27 +169,30 @@ "compose_form.spoiler_placeholder": "Rabhadh susbainte (roghainneil)", "confirmation_modal.cancel": "Sguir dheth", "confirmations.block.confirm": "Bac", - "confirmations.cancel_follow_request.confirm": "Cuir d’ iarrtas dhan dàrna taobh", - "confirmations.cancel_follow_request.message": "A bheil thu cinnteach gu bheil thu airson d’ iarrtas airson {name} a leantainn a chur dhan dàrna taobh?", "confirmations.delete.confirm": "Sguab às", "confirmations.delete.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às?", + "confirmations.delete.title": "A bheil thu airson am post a sguabadh às?", "confirmations.delete_list.confirm": "Sguab às", "confirmations.delete_list.message": "A bheil thu cinnteach gu bheil thu airson an liosta seo a sguabadh às gu buan?", + "confirmations.delete_list.title": "A bheil thu airson an liosta a sguabadh às?", "confirmations.discard_edit_media.confirm": "Tilg air falbh", "confirmations.discard_edit_media.message": "Tha atharraichean gun sàbhaladh agad ann an tuairisgeul no ro-shealladh a’ mheadhain, a bheil thu airson an tilgeil air falbh co-dhiù?", - "confirmations.domain_block.confirm": "Bac am frithealaiche", - "confirmations.domain_block.message": "A bheil thu cinnteach dha-rìribh gu bheil thu airson an àrainn {domain} a bhacadh uile gu lèir? Mar as trice, foghnaidh gun dèan thu bacadh no mùchadh no dhà gu sònraichte agus bhiodh sin na b’ fheàrr. Chan fhaic thu susbaint on àrainn ud air loidhne-ama phoblach sam bith no am measg nam brathan agad. Thèid an luchd-leantainn agad on àrainn ud a thoirt air falbh.", "confirmations.edit.confirm": "Deasaich", "confirmations.edit.message": "Ma nì thu deasachadh an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", + "confirmations.edit.title": "A bheil thu airson sgrìobhadh thairis air a’ phost?", "confirmations.logout.confirm": "Clàraich a-mach", "confirmations.logout.message": "A bheil thu cinnteach gu bheil thu airson clàradh a-mach?", + "confirmations.logout.title": "A bheil thu airson clàradh a-mach?", "confirmations.mute.confirm": "Mùch", "confirmations.redraft.confirm": "Sguab às ⁊ dèan dreachd ùr", "confirmations.redraft.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às agus dreachd ùr a thòiseachadh? Caillidh tu gach annsachd is brosnachadh air agus thèid freagairtean dhan phost thùsail ’nan dìlleachdanan.", + "confirmations.redraft.title": "A bheil thu airson am post a sguabadh às ⁊ dreachd ùr a dhèanamh dheth?", "confirmations.reply.confirm": "Freagair", "confirmations.reply.message": "Ma bheir thu freagairt an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", + "confirmations.reply.title": "A bheil thu airson sgrìobhadh thairis air a’ phost?", "confirmations.unfollow.confirm": "Na lean tuilleadh", "confirmations.unfollow.message": "A bheil thu cinnteach nach eil thu airson {name} a leantainn tuilleadh?", + "confirmations.unfollow.title": "A bheil thu airson sgur de leantainn a chleachdaiche?", "conversation.delete": "Sguab às an còmhradh", "conversation.mark_as_read": "Cuir comharra gun deach a leughadh", "conversation.open": "Seall an còmhradh", @@ -294,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Cleachd roinn-seòrsa a tha ann no cruthaich tè ùr", "filter_modal.select_filter.title": "Criathraich am post seo", "filter_modal.title.status": "Criathraich post", - "filtered_notifications_banner.mentions": "{count, plural, one {iomradh} two {iomradh} few {iomraidhean} other {iomradh}}", - "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil brath ann o dhaoine} one {Tha brathan ann o # neach} two {Tha brathan ann o # neach} few {Tha brathan ann o # daoine} other {Tha brathan ann o # duine}} air a bheil thu eòlach ’s dòcha", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil gin ann} one {O # neach} two {O # neach} few {O # daoine} other {O # duine}} air a bheil thu eòlach ’s dòcha", "filtered_notifications_banner.title": "Brathan criathraichte", "firehose.all": "Na h-uile", "firehose.local": "Am frithealaiche seo", @@ -305,6 +310,7 @@ "follow_requests.unlocked_explanation": "Ged nach eil an cunntas agad glaiste, tha sgioba {domain} dhen bheachd gum b’ fheàirrde thu lèirmheas a dhèanamh air na h-iarrtasan leantainn o na cunntasan seo a làimh.", "follow_suggestions.curated_suggestion": "Roghainn an sgioba", "follow_suggestions.dismiss": "Na seall seo a-rithist", + "follow_suggestions.featured_longer": "Chaidh a thaghadh a làmh leis an sgioba aig {domain}", "follow_suggestions.friends_of_friends_longer": "Fèill mhòr am measg nan daoine a leanas tu", "follow_suggestions.hints.featured": "Chaidh a’ phròifil seo a thaghadh le sgioba {domain} a làimh.", "follow_suggestions.hints.friends_of_friends": "Tha fèill mhòr air a’ phròifil seo am measg nan daoine a leanas tu.", @@ -314,6 +320,7 @@ "follow_suggestions.personalized_suggestion": "Moladh pearsanaichte", "follow_suggestions.popular_suggestion": "Moladh air a bheil fèill mhòr", "follow_suggestions.popular_suggestion_longer": "Fèill mhòr air {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Tha e coltach ri pròifilean a lean thu o chionn goirid", "follow_suggestions.view_all": "Seall na h-uile", "follow_suggestions.who_to_follow": "Molaidhean leantainn", "followed_tags": "Tagaichean hais ’gan leantainn", @@ -409,6 +416,8 @@ "limited_account_hint.action": "Seall a’ phròifil co-dhiù", "limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir {domain}.", "link_preview.author": "Le {name}", + "link_preview.more_from_author": "Barrachd le {name}", + "link_preview.shares": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}", "lists.account.add": "Cuir ris an liosta", "lists.account.remove": "Thoir air falbh on liosta", "lists.delete": "Sguab às an liosta", @@ -436,6 +445,8 @@ "mute_modal.title": "A bheil thu airson an cleachdaiche a mhùchadh?", "mute_modal.you_wont_see_mentions": "Chan fhaic thu na postaichean a bheir iomradh orra.", "mute_modal.you_wont_see_posts": "Chì iad na postaichean agad fhathast ach chan fhaic thu na postaichean aca-san.", + "name_and_others": "{name} ’s {count, plural, one {# eile} other {# eile}}", + "name_and_others_with_link": "{name} ’s {count, plural, one {# eile} other {# eile}}", "navigation_bar.about": "Mu dhèidhinn", "navigation_bar.advanced_interface": "Fosgail san eadar-aghaidh-lìn adhartach", "navigation_bar.blocks": "Cleachdaichean bacte", @@ -463,13 +474,27 @@ "navigation_bar.security": "Tèarainteachd", "not_signed_in_indicator.not_signed_in": "Feumaidh tu clàradh a-steach mus fhaigh thu cothrom air a’ ghoireas seo.", "notification.admin.report": "Rinn {name} gearan mu {target}", + "notification.admin.report_account": "Rinn {name} gearan mu {count, plural, one {# phost} two {# phost} few {# postaichean} other {# post}} le {target} air adhbhar {category}", + "notification.admin.report_account_other": "Rinn {name} gearan mu {count, plural, one {# phost} two {# phost} few {# postaichean} other {# post}} le {target}", + "notification.admin.report_statuses": "Rinn {name} gearan mu {target} air adhbhar {category}", + "notification.admin.report_statuses_other": "Rinn {name} gearan mu {target}", "notification.admin.sign_up": "Chlàraich {name}", "notification.favourite": "Is annsa le {name} am post agad", "notification.follow": "Tha {name} ’gad leantainn a-nis", "notification.follow_request": "Dh’iarr {name} ’gad leantainn", "notification.mention": "Thug {name} iomradh ort", "notification.moderation-warning.learn_more": "Barrachd fiosrachaidh", + "notification.moderation_warning": "Fhuair thu rabhadh on mhaorsainneachd", + "notification.moderation_warning.action_delete_statuses": "Chaidh cuid dhe na postaichean agad a thoirt air falbh.", + "notification.moderation_warning.action_disable": "Chaidh an cunntas agad a chur à comas.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Chaidh comharra a chur ri cuid dhe na postaichean agad gu bheil iad frionasach.", + "notification.moderation_warning.action_none": "Fhuair an cunntas agad rabhadh on mhaorsainneachd.", + "notification.moderation_warning.action_sensitive": "Thèid comharra na frionasachd a chur ris na postaichean agad o seo a-mach.", + "notification.moderation_warning.action_silence": "Chaidh an cunntas agad a chuingeachadh.", + "notification.moderation_warning.action_suspend": "Chaidh an cunntas agad a chur à rèim.", "notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch", + "notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch", + "notification.private_mention": "Thug {name} iomradh ort gu prìobhaideach", "notification.reblog": "Bhrosnaich {name} am post agad", "notification.relationships_severance_event": "Chaill thu dàimhean le {name}", "notification.relationships_severance_event.account_suspension": "Chuir rianaire aig {from} {target} à rèim agus is ciall dha sin nach fhaigh thu naidheachdan uapa ’s nach urrainn dhut conaltradh leotha.", @@ -484,9 +509,12 @@ "notification_requests.title": "Brathan criathraichte", "notifications.clear": "Falamhaich na brathan", "notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?", + "notifications.clear_title": "A bheil thu airson na brathan fhalamhachadh?", "notifications.column_settings.admin.report": "Gearanan ùra:", "notifications.column_settings.admin.sign_up": "Clàraidhean ùra:", "notifications.column_settings.alert": "Brathan deasga", + "notifications.column_settings.beta.category": "Gleusan deuchainneil", + "notifications.column_settings.beta.grouping": "Buidhnich na brathan", "notifications.column_settings.favourite": "Annsachdan:", "notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa", "notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath", @@ -523,7 +551,7 @@ "notifications.policy.filter_not_following_title": "Daoine nach eil thu a’ leantainn", "notifications.policy.filter_private_mentions_hint": "Criathraichte ach ma tha e a’ freagairt do dh’iomradh agad fhèin no ma tha thu a’ leantainn an t-seòladair", "notifications.policy.filter_private_mentions_title": "Iomraidhean prìobhaideach o choigrich", - "notifications.policy.title": "Falamhaich na brathan o…", + "notifications.policy.title": "Falaich na brathan o…", "notifications_permission_banner.enable": "Cuir brathan deasga an comas", "notifications_permission_banner.how_to_control": "Airson brathan fhaighinn nuair nach eil Mastodon fosgailte, cuir na brathan deasga an comas. Tha an smachd agad fhèin air dè na seòrsaichean de chonaltradh a ghineas brathan deasga leis a’ phutan {icon} gu h-àrd nuair a bhios iad air an cur an comas.", "notifications_permission_banner.title": "Na caill dad gu bràth tuilleadh", @@ -650,9 +678,13 @@ "report.unfollow_explanation": "Tha thu a’ leantainn a’ chunntais seo. Sgur dhen leantainn ach nach fhaic thu na puist aca nad dhachaigh.", "report_notification.attached_statuses": "Tha {count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}} ceangailte ris", "report_notification.categories.legal": "Laghail", + "report_notification.categories.legal_sentence": "susbaint mhì-laghail", "report_notification.categories.other": "Eile", + "report_notification.categories.other_sentence": "eile", "report_notification.categories.spam": "Spama", + "report_notification.categories.spam_sentence": "spama", "report_notification.categories.violation": "Briseadh riaghailte", + "report_notification.categories.violation_sentence": "briseadh riaghailte", "report_notification.open": "Fosgail an gearan", "search.no_recent_searches": "Cha do rinn thu lorg o chionn goirid", "search.placeholder": "Lorg", @@ -680,8 +712,11 @@ "server_banner.about_active_users": "Daoine a chleachd am frithealaiche seo rè an 30 latha mu dheireadh (Cleachdaichean gnìomhach gach mìos)", "server_banner.active_users": "cleachdaichean gnìomhach", "server_banner.administered_by": "Rianachd le:", + "server_banner.is_one_of_many": "Is {domain} fear de dh’iomadh frithealaiche Mastodon neo-eisimeileach as urrainn dhut cleachdadh airson pàirt a ghabhail sa cho-shaoghal.", "server_banner.server_stats": "Stadastaireachd an fhrithealaiche:", "sign_in_banner.create_account": "Cruthaich cunntas", + "sign_in_banner.follow_anyone": "Lean duine sam bith air a’ cho-shaoghal agus faic a h-uile càil a-rèir an ama. Chan eil sgeul air algairimean, sanasachd no clickbait.", + "sign_in_banner.mastodon_is": "Is Mastodon an dòigh as fheàrr airson sùil a chumail air na tha a’ dol.", "sign_in_banner.sign_in": "Clàraich a-steach", "sign_in_banner.sso_redirect": "Clàraich a-steach no clàraich leinn", "status.admin_account": "Fosgail eadar-aghaidh na maorsainneachd dha @{name}", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index d64789b86cb120..ddbf6fa273c0eb 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Aviso sobre o contido (optativo)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar solicitude", - "confirmations.cancel_follow_request.message": "Tes a certeza de querer retirar a solicitude para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "Tes a certeza de querer eliminar esta publicación?", + "confirmations.delete.title": "Eliminar a publicación?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?", + "confirmations.delete_list.title": "Eliminar a lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tes cambios sen gardar para a vista previa ou descrición do multimedia, descartamos os cambios?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. As túas seguidoras deste dominio serán eliminadas.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Ao editar sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", + "confirmations.edit.title": "Editar a publicación?", "confirmations.logout.confirm": "Pechar sesión", "confirmations.logout.message": "Desexas pechar a sesión?", + "confirmations.logout.title": "Pechar sesión?", "confirmations.mute.confirm": "Acalar", "confirmations.redraft.confirm": "Eliminar e reescribir", "confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.", + "confirmations.redraft.title": "Eliminar e reescribir a publicación?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Ao responder sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", + "confirmations.reply.title": "Editar a publicación?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Desexas deixar de seguir a {name}?", + "confirmations.unfollow.title": "Deixar de seguir á usuaria?", "conversation.delete": "Eliminar conversa", "conversation.mark_as_read": "Marcar como lido", "conversation.open": "Ver conversa", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usar unha categoría existente ou crear unha nova", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar unha publicación", - "filtered_notifications_banner.mentions": "{count, plural, one {mención} other {mencións}}", - "filtered_notifications_banner.pending_requests": "Notificacións de {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que poderías coñecer", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que igual coñeces", "filtered_notifications_banner.title": "Notificacións filtradas", "firehose.all": "Todo", "firehose.local": "Este servidor", @@ -507,6 +509,7 @@ "notification_requests.title": "Notificacións filtradas", "notifications.clear": "Limpar notificacións", "notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?", + "notifications.clear_title": "Limpar 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", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 3687df7b87b2b6..0734a9b0221984 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -1,5 +1,5 @@ { - "about.blocks": "שרתים מוגבלים", + "about.blocks": "שרתים שנחסמו על ידי המנהלים", "about.contact": "יצירת קשר:", "about.disclaimer": "מסטודון היא תוכנת קוד פתוח חינמית וסימן מסחרי של Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "הסיבה אינה זמינה", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "אזהרת תוכן (לא חובה)", "confirmation_modal.cancel": "ביטול", "confirmations.block.confirm": "לחסום", - "confirmations.cancel_follow_request.confirm": "ויתור על בקשה", - "confirmations.cancel_follow_request.message": "לבטל את בקשת המעקב אחרי {name}?", "confirmations.delete.confirm": "למחוק", "confirmations.delete.message": "בטוח/ה שאת/ה רוצה למחוק את ההודעה?", + "confirmations.delete.title": "למחוק הודעה?", "confirmations.delete_list.confirm": "למחוק", "confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?", + "confirmations.delete_list.title": "למחוק רשימה?", "confirmations.discard_edit_media.confirm": "השלך", "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?", - "confirmations.domain_block.confirm": "חסימת שרת", - "confirmations.domain_block.message": "בטוחה שברצונך באמת לחסום את קהילת {domain}? ברב המקרים השתקה וחסימה של מספר משתמשים עשוייה להספיק. לא תראי תוכל מכלל שם המתחם בפידים הציבוריים או בהתראות שלך. העוקבים שלך מהקהילה הזאת יוסרו", "confirmations.edit.confirm": "עריכה", "confirmations.edit.message": "עריכה תדרוס את ההודעה שכבר התחלת לכתוב. האם להמשיך?", + "confirmations.edit.title": "לבצע החלפת תוכן?", "confirmations.logout.confirm": "התנתקות", "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?", + "confirmations.logout.title": "להתנתק?", "confirmations.mute.confirm": "להשתיק", "confirmations.redraft.confirm": "מחיקה ועריכה מחדש", "confirmations.redraft.message": "למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות להודעה המקורית ישארו יתומות.", + "confirmations.redraft.title": "מחיקה ועריכה מחדש?", "confirmations.reply.confirm": "תגובה", "confirmations.reply.message": "תגובה עכשיו תמחק את ההודעה שכבר התחלת לכתוב. להמשיך?", + "confirmations.reply.title": "לבצע החלפת תוכן?", "confirmations.unfollow.confirm": "הפסקת מעקב", "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", + "confirmations.unfollow.title": "לבטל מעקב אחר המשתמש.ת?", "conversation.delete": "מחיקת שיחה", "conversation.mark_as_read": "סמן כנקרא", "conversation.open": "צפו בשיחה", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה", "filter_modal.select_filter.title": "סינון ההודעה הזו", "filter_modal.title.status": "סנן הודעה", - "filtered_notifications_banner.mentions": "{count, plural, one {איזכור} other {איזכורים} two {איזכוריים}}", - "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}two {יש התראותיים ממשתמשים }other {יש # התראות ממשתמשים }}מוכרים לך", + "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין בקשות ממשתמשים }one {בקשה אחת ממישהו/מישהי }two {יש בקשותיים ממשתמשים }other {יש # בקשות ממשתמשים }}שאולי מוכרים לך", "filtered_notifications_banner.title": "התראות מסוננות", "firehose.all": "הכל", "firehose.local": "שרת זה", @@ -507,6 +509,7 @@ "notification_requests.title": "התראות מסוננות", "notifications.clear": "הסרת התראות", "notifications.clear_confirmation": "להסיר את כל ההתראות לצמיתות ? ", + "notifications.clear_title": "לנקות התראות?", "notifications.column_settings.admin.report": "דו\"חות חדשים", "notifications.column_settings.admin.sign_up": "הרשמות חדשות:", "notifications.column_settings.alert": "התראות לשולחן העבודה", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 89c71207f003bb..c2a961b32c668a 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -166,16 +166,12 @@ "compose_form.spoiler_placeholder": "सामग्री चेतावनी (वैकल्पिक)", "confirmation_modal.cancel": "रद्द करें", "confirmations.block.confirm": "ब्लॉक", - "confirmations.cancel_follow_request.confirm": "रिक्वेस्ट वापस लें", - "confirmations.cancel_follow_request.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": "लिस्ट में जोड़ें", - "confirmations.domain_block.confirm": "सर्वर ब्लॉक करें", - "confirmations.domain_block.message": "क्या आप वास्तव में, वास्तव में आप पूरे {domain} को ब्लॉक करना चाहते हैं? ज्यादातर मामलों में कुछ लक्षित ब्लॉक या म्यूट पर्याप्त और बेहतर हैं। आप किसी भी सार्वजनिक समय-सीमा या अपनी सूचनाओं में उस डोमेन की सामग्री नहीं देखेंगे। उस डोमेन से आपके फॉलोवर्स को हटा दिया जाएगा।", "confirmations.edit.confirm": "संशोधित करें", "confirmations.edit.message": "अभी संपादन किया तो वो संदेश मिट जायेगा जिसे आप लिख रहे थे। क्या आप जारी रखना चाहते हैं?", "confirmations.logout.confirm": "लॉग आउट करें", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 5d087dae948b7b..5598732465d23e 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -144,14 +144,12 @@ "compose_form.spoiler.unmarked": "Tekst nije skriven", "confirmation_modal.cancel": "Otkaži", "confirmations.block.confirm": "Blokiraj", - "confirmations.cancel_follow_request.confirm": "Povuci zahtjev", "confirmations.delete.confirm": "Obriši", "confirmations.delete.message": "Stvarno želite obrisati ovaj toot?", "confirmations.delete_list.confirm": "Obriši", "confirmations.delete_list.message": "Jeste li sigurni da želite trajno obrisati ovu listu?", "confirmations.discard_edit_media.confirm": "Odbaciti", "confirmations.discard_edit_media.message": "Postoje nespremljene promjene u opisu medija ili u pretpregledu, svejedno ih odbaciti?", - "confirmations.domain_block.message": "Jeste li zaista, zaista sigurni da želite blokirati cijelu domenu {domain}? U većini slučajeva dovoljno je i preferirano nekoliko ciljanih blokiranja ili utišavanja. Nećete vidjeti sadržaj s te domene ni u kojim javnim vremenskim crtama ili Vašim obavijestima. Vaši pratitelji s te domene bit će uklonjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.logout.confirm": "Odjavi se", "confirmations.logout.message": "Jeste li sigurni da se želite odjaviti?", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index fd9ce38eb120ac..9e9a3cd251fcea 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Tartalmi figyelmeztetés (opcionális)", "confirmation_modal.cancel": "Mégsem", "confirmations.block.confirm": "Letiltás", - "confirmations.cancel_follow_request.confirm": "Kérés visszavonása", - "confirmations.cancel_follow_request.message": "Biztos, hogy visszavonod a(z) {name} felhasználóra vonatkozó követési kérésedet?", "confirmations.delete.confirm": "Törlés", "confirmations.delete.message": "Biztos, hogy törölni szeretnéd ezt a bejegyzést?", + "confirmations.delete.title": "Törlöd a bejegyzést?", "confirmations.delete_list.confirm": "Törlés", "confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?", + "confirmations.delete_list.title": "Törlöd a listát?", "confirmations.discard_edit_media.confirm": "Elvetés", "confirmations.discard_edit_media.message": "Mentetlen változtatásaid vannak a média leírásában vagy előnézetében, mindenképp elveted?", - "confirmations.domain_block.confirm": "Kiszolgáló letiltása", - "confirmations.domain_block.message": "Biztos, hogy le szeretnéd tiltani a teljes {domain} domaint? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő, és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se az idővonalakon, se az értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.", "confirmations.edit.confirm": "Szerkesztés", "confirmations.edit.message": "Ha most szerkeszted, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?", + "confirmations.edit.title": "Felülírod a bejegyzést?", "confirmations.logout.confirm": "Kijelentkezés", "confirmations.logout.message": "Biztos, hogy kijelentkezel?", + "confirmations.logout.title": "Kijelentkezel?", "confirmations.mute.confirm": "Némítás", "confirmations.redraft.confirm": "Törlés és újraírás", "confirmations.redraft.message": "Biztos, hogy ezt a bejegyzést szeretnéd törölni és újraírni? Minden megtolást és kedvencnek jelölést elvesztesz, az eredetire adott válaszok pedig elárvulnak.", + "confirmations.redraft.title": "Törlöd és újraírod a bejegyzést?", "confirmations.reply.confirm": "Válasz", "confirmations.reply.message": "Ha most válaszolsz, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?", + "confirmations.reply.title": "Felülírod a bejegyzést?", "confirmations.unfollow.confirm": "Követés visszavonása", "confirmations.unfollow.message": "Biztos, hogy vissza szeretnéd vonni {name} követését?", + "confirmations.unfollow.title": "Megszünteted a felhasználó követését?", "conversation.delete": "Beszélgetés törlése", "conversation.mark_as_read": "Megjelölés olvasottként", "conversation.open": "Beszélgetés megtekintése", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat", "filter_modal.select_filter.title": "E bejegyzés szűrése", "filter_modal.title.status": "Egy bejegyzés szűrése", - "filtered_notifications_banner.mentions": "{count, plural, one {említés} other {említés}}", - "filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {nincsenek} one {egy valósztínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {senkitől} one {egy valószínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}", "filtered_notifications_banner.title": "Szűrt értesítések", "firehose.all": "Összes", "firehose.local": "Ez a kiszolgáló", @@ -507,6 +509,7 @@ "notification_requests.title": "Szűrt értesítések", "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.clear_title": "Törlöd az értesítéseket?", "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", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 4a197185e30c22..e9b9e85ff9ee71 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -121,13 +121,11 @@ "compose_form.spoiler.unmarked": "Տեքստը թաքցուած չէ", "confirmation_modal.cancel": "Չեղարկել", "confirmations.block.confirm": "Արգելափակել", - "confirmations.cancel_follow_request.confirm": "Կասեցնել հայցը", "confirmations.delete.confirm": "Ջնջել", "confirmations.delete.message": "Վստա՞հ ես, որ ուզում ես ջնջել այս գրառումը։", "confirmations.delete_list.confirm": "Ջնջել", "confirmations.delete_list.message": "Վստա՞հ ես, որ ուզում ես մշտապէս ջնջել այս ցանկը։", "confirmations.discard_edit_media.confirm": "Չեղարկել", - "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրոյթը։ Սովորաբար մի երկու թիրախաւորուած արգելափակում կամ լռեցում բաւական է ու նախընտրելի։", "confirmations.edit.confirm": "Խմբագրել", "confirmations.logout.confirm": "Ելք", "confirmations.logout.message": "Համոզո՞ւած ես, որ ուզում ես դուրս գալ", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index db1ead30c82216..60838c3a5dd697 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -169,27 +169,28 @@ "compose_form.spoiler_placeholder": "Advertimento de contento (optional)", "confirmation_modal.cancel": "Cancellar", "confirmations.block.confirm": "Blocar", - "confirmations.cancel_follow_request.confirm": "Retirar requesta", - "confirmations.cancel_follow_request.message": "Es tu secur que tu vole retirar tu requesta de sequer {name}?", "confirmations.delete.confirm": "Deler", "confirmations.delete.message": "Es tu secur que tu vole deler iste message?", + "confirmations.delete.title": "Deler message?", "confirmations.delete_list.confirm": "Deler", "confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?", + "confirmations.delete_list.title": "Deler lista?", "confirmations.discard_edit_media.confirm": "Abandonar", "confirmations.discard_edit_media.message": "Tu ha cambiamentos non salvate in le description o previsualisation del objecto multimedial. Abandonar los?", - "confirmations.domain_block.confirm": "Blocar le servitor", - "confirmations.domain_block.message": "Es tu realmente, absolutemente secur de voler blocar tote le dominio {domain}? In le major parte del casos es preferibile blocar o silentiar alcun personas specific. Si tu bloca tote le dominio, tu non videra alcun contento de ille dominio in alcun chronologia public o in tu notificationes, e tu sequitores de ille dominio essera removite.", "confirmations.edit.confirm": "Modificar", "confirmations.edit.message": "Si tu modifica isto ora, le message in curso de composition essera perdite. Es tu secur de voler continuar?", "confirmations.logout.confirm": "Clauder session", "confirmations.logout.message": "Es tu secur que tu vole clauder le session?", + "confirmations.logout.title": "Clauder session?", "confirmations.mute.confirm": "Silentiar", "confirmations.redraft.confirm": "Deler e rescriber", "confirmations.redraft.message": "Es tu secur de voler deler iste message e rescriber lo? Le favorites e le impulsos essera perdite, e le responsas al message original essera orphanate.", + "confirmations.redraft.title": "Deler e rescriber le message?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Si tu responde ora, le message in curso de composition essera perdite. Es tu secur de voler continuar?", "confirmations.unfollow.confirm": "Non plus sequer", "confirmations.unfollow.message": "Es tu secur que tu vole cessar de sequer {name}?", + "confirmations.unfollow.title": "Cessar de sequer le usator?", "conversation.delete": "Deler conversation", "conversation.mark_as_read": "Marcar como legite", "conversation.open": "Vider conversation", @@ -297,8 +298,6 @@ "filter_modal.select_filter.subtitle": "Usa un categoria existente o crea un nove", "filter_modal.select_filter.title": "Filtrar iste message", "filter_modal.title.status": "Filtrar un message", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentiones}}", - "filtered_notifications_banner.pending_requests": "Notificationes ab {count, plural, =0 {nemo} one {un persona} other {# personas}} tu poterea cognoscer", "filtered_notifications_banner.title": "Notificationes filtrate", "firehose.all": "Toto", "firehose.local": "Iste servitor", @@ -443,6 +442,8 @@ "mute_modal.title": "Silentiar le usator?", "mute_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.", "mute_modal.you_wont_see_posts": "Iste persona pote totevia vider tu messages, ma tu non videra le sues.", + "name_and_others": "{name} e {count, plural, one {# altere} other {# alteres}}", + "name_and_others_with_link": "{name} e {count, plural, one {# altere} other {# alteres}}", "navigation_bar.about": "A proposito", "navigation_bar.advanced_interface": "Aperir in le interfacie web avantiate", "navigation_bar.blocks": "Usatores blocate", @@ -499,9 +500,12 @@ "notification_requests.title": "Notificationes filtrate", "notifications.clear": "Rader notificationes", "notifications.clear_confirmation": "Es tu secur que tu vole rader permanentemente tote tu notificationes?", + "notifications.clear_title": "Rader le notificationes?", "notifications.column_settings.admin.report": "Nove reportos:", "notifications.column_settings.admin.sign_up": "Nove inscriptiones:", "notifications.column_settings.alert": "Notificationes de scriptorio", + "notifications.column_settings.beta.category": "Functionalitates experimental", + "notifications.column_settings.beta.grouping": "Notificationes de gruppo", "notifications.column_settings.favourite": "Favorites:", "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias", "notifications.column_settings.filter_bar.category": "Barra de filtro rapide", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index e139796bf1f290..e740fb009cf3f8 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -166,16 +166,12 @@ "compose_form.spoiler_placeholder": "Peringatan konten (opsional)", "confirmation_modal.cancel": "Batal", "confirmations.block.confirm": "Blokir", - "confirmations.cancel_follow_request.confirm": "Batalkan permintaan", - "confirmations.cancel_follow_request.message": "Apakah Anda yakin ingin membatalkan permintaan Anda untuk mengikuti {name}?", "confirmations.delete.confirm": "Hapus", "confirmations.delete.message": "Apakah Anda yakin untuk menghapus kiriman ini?", "confirmations.delete_list.confirm": "Hapus", "confirmations.delete_list.message": "Apakah Anda yakin untuk menghapus daftar ini secara permanen?", "confirmations.discard_edit_media.confirm": "Buang", "confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan deskripsi atau pratinjau media, buang saja?", - "confirmations.domain_block.confirm": "Blokir server", - "confirmations.domain_block.message": "Apakah Anda benar-benar yakin untuk memblokir keseluruhan {domain}? Dalam kasus tertentu beberapa pemblokiran atau penyembunyian lebih baik.", "confirmations.edit.confirm": "Ubah", "confirmations.edit.message": "Mengubah akan menimpa pesan yang sedang anda tulis. Apakah anda yakin ingin melanjutkan?", "confirmations.logout.confirm": "Keluar", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 3ece43918b19af..27519b4776b050 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -166,16 +166,12 @@ "compose_form.spoiler_placeholder": "Advertiment de contenete (optional)", "confirmation_modal.cancel": "Anullar", "confirmations.block.confirm": "Bloccar", - "confirmations.cancel_follow_request.confirm": "Retraer petition", - "confirmations.cancel_follow_request.message": "Esque tu vermen vole retraer tui petition sequer {name}?", "confirmations.delete.confirm": "Deleter", "confirmations.delete.message": "Esque tu vermen vole deleter ti-ci posta?", "confirmations.delete_list.confirm": "Deleter", "confirmations.delete_list.message": "Esque tu vermen vole permanentmen deleter ti-ci liste?", "confirmations.discard_edit_media.confirm": "Forjettar", "confirmations.discard_edit_media.message": "Tu have ínconservat changes al descrition de medie o al previse, forjettar les sin egarda?", - "confirmations.domain_block.confirm": "Bloccar servitor", - "confirmations.domain_block.message": "Esque tu es certissim que tu vole bloccar li tot {domain}? In mult casus, bloccar o silentiar quelc specific contos es suficent e preferibil. Tu ne va vider contenete de ti dominia in quelcunc public témpor-linea o in tui notificationes. Tui sequitores de ti dominia va esser removet.", "confirmations.edit.confirm": "Redacter", "confirmations.edit.message": "Redacter nu va remplazzar li missage quel tu actualmen composi. Esque tu vermen vole proceder?", "confirmations.logout.confirm": "Exear", @@ -294,8 +290,6 @@ "filter_modal.select_filter.subtitle": "Usar un existent categorie o crear nov", "filter_modal.select_filter.title": "Filtrar ti-ci posta", "filter_modal.title.status": "Filtrar un posta", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentiones}}", - "filtered_notifications_banner.pending_requests": "Notificationes de {count, plural, =0 {nequi} one {un person} other {# persones}} quel tu possibilmen conosse", "filtered_notifications_banner.title": "Filtrat notificationes", "firehose.all": "Omno", "firehose.local": "Ti-ci servitor", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 839939687d219f..6ff957bc800d67 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -147,15 +147,12 @@ "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "Anulez", "confirmations.block.confirm": "Restriktez", - "confirmations.cancel_follow_request.confirm": "Desendez demando", - "confirmations.cancel_follow_request.message": "Ka vu certe volas desendar vua demando di sequar {name}?", "confirmations.delete.confirm": "Efacez", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "Efacez", "confirmations.delete_list.message": "Ka vu certe volas netempale efacar ca listo?", "confirmations.discard_edit_media.confirm": "Efacez", "confirmations.discard_edit_media.message": "Vu havas nesparita chanji di mediodeskript o prevido, vu volas jus efacar?", - "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.", "confirmations.edit.confirm": "Modifikez", "confirmations.edit.message": "Modifikar nun remplasos la mesajo quon vu nune skribas. Ka vu certe volas procedar?", "confirmations.logout.confirm": "Ekirez", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 27d23aafd0e5c8..99d2d98fafac56 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Aðvörun vegna efnis (valkvætt)", "confirmation_modal.cancel": "Hætta við", "confirmations.block.confirm": "Útiloka", - "confirmations.cancel_follow_request.confirm": "Taka beiðni til baka", - "confirmations.cancel_follow_request.message": "Ertu viss um að þú viljir taka til baka beiðnina um að fylgjast með {name}?", "confirmations.delete.confirm": "Eyða", "confirmations.delete.message": "Ertu viss um að þú viljir eyða þessari færslu?", + "confirmations.delete.title": "Eyða færslu?", "confirmations.delete_list.confirm": "Eyða", "confirmations.delete_list.message": "Ertu viss um að þú viljir eyða þessum lista endanlega?", + "confirmations.delete_list.title": "Eyða lista?", "confirmations.discard_edit_media.confirm": "Henda", "confirmations.discard_edit_media.message": "Þú ert með óvistaðar breytingar á lýsingu myndefnis eða forskoðunar, henda þeim samt?", - "confirmations.domain_block.confirm": "Útiloka netþjón", - "confirmations.domain_block.message": "Ertu alveg algjörlega viss um að þú viljir loka á allt {domain}? Í flestum tilfellum er vænlegra að nota færri en markvissari útilokanir eða að þagga niður tiltekna aðila. Þú munt ekki sjá efni frá þessu léni í neinum opinberum tímalínum eða í tilkynningunum þínum. Fylgjendur þínir frá þessu léni verða fjarlægðir.", "confirmations.edit.confirm": "Breyta", "confirmations.edit.message": "Ef þú breytir núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?", + "confirmations.edit.title": "Skrifa yfir færslu?", "confirmations.logout.confirm": "Skrá út", "confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?", + "confirmations.logout.title": "Skrá út?", "confirmations.mute.confirm": "Þagga", "confirmations.redraft.confirm": "Eyða og endurvinna drög", "confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.", + "confirmations.redraft.title": "Eyða og byrja ný drög að færslu?", "confirmations.reply.confirm": "Svara", "confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?", + "confirmations.reply.title": "Skrifa yfir færslu?", "confirmations.unfollow.confirm": "Hætta að fylgja", "confirmations.unfollow.message": "Ertu viss um að þú viljir hætta að fylgjast með {name}?", + "confirmations.unfollow.title": "Hætta að fylgjast með viðkomandi?", "conversation.delete": "Eyða samtali", "conversation.mark_as_read": "Merkja sem lesið", "conversation.open": "Skoða samtal", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Notaðu fyrirliggjandi flokk eða útbúðu nýjan", "filter_modal.select_filter.title": "Sía þessa færslu", "filter_modal.title.status": "Sía færslu", - "filtered_notifications_banner.mentions": "{count, plural, one {tilvísun} other {tilvísanir}}", - "filtered_notifications_banner.pending_requests": "Tilkynningar frá {count, plural, =0 {engum} one {einum aðila} other {# aðilum}} sem þú gætir þekkt", + "filtered_notifications_banner.pending_requests": "Frá {count, plural, =0 {engum} one {einum aðila} other {# manns}} sem þú gætir þekkt", "filtered_notifications_banner.title": "Síaðar tilkynningar", "firehose.all": "Allt", "firehose.local": "þessum netþjóni", @@ -507,6 +509,7 @@ "notification_requests.title": "Síaðar tilkynningar", "notifications.clear": "Hreinsa tilkynningar", "notifications.clear_confirmation": "Ertu viss um að þú viljir endanlega eyða öllum tilkynningunum þínum?", + "notifications.clear_title": "Hreinsa tilkynningar?", "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", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 419b6bcd9f2312..b3194e6a109d35 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Contenuto sensibile (facoltativo)", "confirmation_modal.cancel": "Annulla", "confirmations.block.confirm": "Blocca", - "confirmations.cancel_follow_request.confirm": "Annulla la richiesta", - "confirmations.cancel_follow_request.message": "Sei sicuro di voler annullare la tua richiesta per seguire {name}?", "confirmations.delete.confirm": "Elimina", "confirmations.delete.message": "Sei sicuro di voler eliminare questo post?", + "confirmations.delete.title": "Eliminare il post?", "confirmations.delete_list.confirm": "Elimina", "confirmations.delete_list.message": "Sei sicuro/a di voler eliminare permanentemente questo elenco?", + "confirmations.delete_list.title": "Eliminare la lista?", "confirmations.discard_edit_media.confirm": "Scarta", "confirmations.discard_edit_media.message": "Hai delle modifiche non salvate alla descrizione o anteprima del media, scartarle comunque?", - "confirmations.domain_block.confirm": "Blocca il server", - "confirmations.domain_block.message": "Sei davvero sicuro di voler bloccare l'intero {domain}? In gran parte dei casi, è sufficiente e preferibile bloccare o silenziare alcuni profili. Non visualizzerai i contenuti da quel dominio in alcuna cronologia pubblica o tra le tue notifiche. I tuoi seguaci da quel dominio saranno rimossi.", "confirmations.edit.confirm": "Modifica", "confirmations.edit.message": "Modificare ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?", + "confirmations.edit.title": "Sovrascrivere il post?", "confirmations.logout.confirm": "Disconnettiti", "confirmations.logout.message": "Sei sicuro di volerti disconnettere?", + "confirmations.logout.title": "Uscire?", "confirmations.mute.confirm": "Silenzia", "confirmations.redraft.confirm": "Elimina e riscrivi", "confirmations.redraft.message": "Sei sicuro di voler eliminare questo post e riscriverlo? I preferiti e i boost andranno persi e le risposte al post originale non saranno più collegate.", + "confirmations.redraft.title": "Eliminare e riformulare il post?", "confirmations.reply.confirm": "Rispondi", "confirmations.reply.message": "Rispondere ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?", + "confirmations.reply.title": "Sovrascrivere il post?", "confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.message": "Sei sicuro di voler smettere di seguire {name}?", + "confirmations.unfollow.title": "Smettere di seguire l'utente?", "conversation.delete": "Elimina conversazione", "conversation.mark_as_read": "Segna come letto", "conversation.open": "Visualizza conversazione", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usa una categoria esistente o creane una nuova", "filter_modal.select_filter.title": "Filtra questo post", "filter_modal.title.status": "Filtra un post", - "filtered_notifications_banner.mentions": "{count, plural, one {menzione} other {menzioni}}", - "filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere", + "filtered_notifications_banner.pending_requests": "Da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere", "filtered_notifications_banner.title": "Notifiche filtrate", "firehose.all": "Tutto", "firehose.local": "Questo server", @@ -507,6 +509,7 @@ "notification_requests.title": "Notifiche filtrate", "notifications.clear": "Cancella le notifiche", "notifications.clear_confirmation": "Sei sicuro di voler cancellare permanentemente tutte le tue notifiche?", + "notifications.clear_title": "Cancellare le notifiche?", "notifications.column_settings.admin.report": "Nuove segnalazioni:", "notifications.column_settings.admin.sign_up": "Nuove iscrizioni:", "notifications.column_settings.alert": "Notifiche desktop", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 5168c1c0c0c0c9..77a501843075fa 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "閲覧注意 (オプション)", "confirmation_modal.cancel": "キャンセル", "confirmations.block.confirm": "ブロック", - "confirmations.cancel_follow_request.confirm": "フォローリクエストを取り消す", - "confirmations.cancel_follow_request.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": "メディアの説明またはプレビューに保存されていない変更があります。それでも破棄しますか?", - "confirmations.domain_block.confirm": "サーバーをブロック", - "confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。公開タイムラインにそのドメインのコンテンツが表示されなくなり、通知も届かなくなります。そのドメインのフォロワーはアンフォローされます。", "confirmations.edit.confirm": "編集", "confirmations.edit.message": "今編集すると現在作成中のメッセージが上書きされます。本当に実行しますか?", "confirmations.logout.confirm": "ログアウト", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "既存のカテゴリーを使用するか新規作成します", "filter_modal.select_filter.title": "この投稿をフィルターする", "filter_modal.title.status": "投稿をフィルターする", - "filtered_notifications_banner.mentions": "{count, plural, one {メンション} other {メンション}}", - "filtered_notifications_banner.pending_requests": "{count, plural, =0 {通知がブロックされているアカウントはありません} other {#アカウントからの通知がブロックされています}}", "filtered_notifications_banner.title": "保留中の通知", "firehose.all": "すべて", "firehose.local": "このサーバー", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index b2e67e143ed8c3..d61a29d7a33d18 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -74,7 +74,6 @@ "confirmations.delete.message": "დარწმუნებული ხართ, გსურთ გააუქმოთ ეს სტატუსი?", "confirmations.delete_list.confirm": "გაუქმება", "confirmations.delete_list.message": "დარწმუნებული ხართ, გსურთ სამუდამოდ გააუქმოთ ეს სია?", - "confirmations.domain_block.message": "ნაღდად, ნაღდად, დარწმუნებული ხართ, გსურთ დაბლოკოთ მთელი {domain}? უმეტეს შემთხვევაში რამდენიმე გამიზნული ბლოკი ან გაჩუმება საკმარისი და უკეთესია. კონტენტს ამ დომენიდან ვერ იხილავთ ვერც ერთ ღია თაიმლაინზე ან თქვენს შეტყობინებებში. ამ დომენიდან არსებული მიმდევრები ამოიშლება.", "confirmations.mute.confirm": "გაჩუმება", "confirmations.redraft.confirm": "გაუქმება და გადანაწილება", "confirmations.unfollow.confirm": "ნუღარ მიჰყვები", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 776b3446a2e4c2..b8fd039b8dbffe 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -146,7 +146,6 @@ "confirmations.delete_list.confirm": "Kkes", "confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?", "confirmations.discard_edit_media.confirm": "Sefsex", - "confirmations.domain_block.confirm": "Sewḥel aqeddac", "confirmations.edit.confirm": "Ẓreg", "confirmations.edit.message": "Abeddel tura ad d-yaru izen-nni i d-tegreḍ akka tura. Tetḥeqqeḍ tebɣiḍ ad tkemmleḍ?", "confirmations.logout.confirm": "Ffeɣ", @@ -236,6 +235,8 @@ "follow_request.authorize": "Ssireg", "follow_request.reject": "Agi", "follow_suggestions.dismiss": "Dayen ur t-id-skan ara", + "follow_suggestions.featured_longer": "Yettwafraned s ufus sɣur agraw n {domain}", + "follow_suggestions.hints.featured": "Amaɣnu-a ifren-it-id wegraw n {domain} s ufus.", "follow_suggestions.popular_suggestion_longer": "Yettwassen deg {domain}", "follow_suggestions.view_all": "Wali-ten akk", "follow_suggestions.who_to_follow": "Ad tḍefreḍ?", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 74fb33a91ab42f..fbaa371843a73d 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -107,7 +107,6 @@ "confirmations.delete.message": "Бұл жазбаны өшіресіз бе?", "confirmations.delete_list.confirm": "Өшіру", "confirmations.delete_list.message": "Бұл тізімді жоясыз ба шынымен?", - "confirmations.domain_block.message": "Бұл домендегі {domain} жазбаларды шынымен бұғаттайсыз ба? Кейде үнсіз қылып тастау да жеткілікті.", "confirmations.logout.confirm": "Шығу", "confirmations.logout.message": "Шығатыныңызға сенімдісіз бе?", "confirmations.mute.confirm": "Үнсіз қылу", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 6619cdb2d6014a..a9b634dbaeba37 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "내용 경고 (선택사항)", "confirmation_modal.cancel": "취소", "confirmations.block.confirm": "차단", - "confirmations.cancel_follow_request.confirm": "요청 삭제", - "confirmations.cancel_follow_request.message": "정말 {name}님에 대한 팔로우 요청을 취소하시겠습니까?", "confirmations.delete.confirm": "삭제", "confirmations.delete.message": "정말로 이 게시물을 삭제하시겠습니까?", + "confirmations.delete.title": "게시물을 삭제할까요?", "confirmations.delete_list.confirm": "삭제", "confirmations.delete_list.message": "정말로 이 리스트를 영구적으로 삭제하시겠습니까?", + "confirmations.delete_list.title": "리스트를 삭제할까요?", "confirmations.discard_edit_media.confirm": "저장 안함", "confirmations.discard_edit_media.message": "미디어 설명이나 미리보기에 대한 저장하지 않은 변경사항이 있습니다. 버리시겠습니까?", - "confirmations.domain_block.confirm": "서버 차단", - "confirmations.domain_block.message": "정말로 {domain} 전체를 차단하시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 콘텐츠를 보지 못합니다. 해당 도메인에 속한 팔로워와의 관계가 사라집니다.", "confirmations.edit.confirm": "수정", "confirmations.edit.message": "지금 편집하면 작성 중인 메시지를 덮어씁니다. 진행이 확실한가요?", + "confirmations.edit.title": "게시물을 덮어쓸까요?", "confirmations.logout.confirm": "로그아웃", "confirmations.logout.message": "정말로 로그아웃 하시겠습니까?", + "confirmations.logout.title": "로그아웃 할까요?", "confirmations.mute.confirm": "뮤트", "confirmations.redraft.confirm": "삭제하고 다시 쓰기", "confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 게시물에 대한 부스트와 좋아요를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.", + "confirmations.redraft.title": "삭제하고 다시 작성할까요?", "confirmations.reply.confirm": "답글", "confirmations.reply.message": "지금 답장하면 작성 중인 메시지를 덮어쓰게 됩니다. 정말 진행합니까?", + "confirmations.reply.title": "게시물을 덮어쓸까요?", "confirmations.unfollow.confirm": "팔로우 해제", "confirmations.unfollow.message": "정말로 {name} 님을 팔로우 해제하시겠습니까?", + "confirmations.unfollow.title": "사용자를 언팔로우 할까요?", "conversation.delete": "대화 삭제", "conversation.mark_as_read": "읽은 상태로 표시", "conversation.open": "대화 보기", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다", "filter_modal.select_filter.title": "이 게시물을 필터", "filter_modal.title.status": "게시물 필터", - "filtered_notifications_banner.mentions": "{count, plural, other {멘션}}", - "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터의 알림", + "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터", "filtered_notifications_banner.title": "걸러진 알림", "firehose.all": "모두", "firehose.local": "이 서버", @@ -443,6 +445,8 @@ "mute_modal.title": "사용자를 뮤트할까요?", "mute_modal.you_wont_see_mentions": "그를 멘션하는 게시물을 더는 보지 않게 됩니다.", "mute_modal.you_wont_see_posts": "내가 작성한 게시물을 볼 수는 있지만, 나는 그가 작성한 것을 보지 않게 됩니다.", + "name_and_others": "{name} 외 {count, plural, other {# 명}}", + "name_and_others_with_link": "{name} 외 {count, plural, other {# 명}}", "navigation_bar.about": "정보", "navigation_bar.advanced_interface": "고급 웹 인터페이스에서 열기", "navigation_bar.blocks": "차단한 사용자", @@ -470,6 +474,10 @@ "navigation_bar.security": "보안", "not_signed_in_indicator.not_signed_in": "이 정보에 접근하려면 로그인을 해야 합니다.", "notification.admin.report": "{name} 님이 {target}를 신고했습니다", + "notification.admin.report_account": "{name} 님이 {target}의 게시물 {count, plural, other {# 개}}를 {category}로 신고했습니다", + "notification.admin.report_account_other": "{name} 님이 {target}의 게시물 {count, plural, other {# 개}}를 신고했습니다", + "notification.admin.report_statuses": "{name} 님이 {target}을 {category}로 신고했습니다", + "notification.admin.report_statuses_other": "{name} 님이 {target}을 신고했습니다", "notification.admin.sign_up": "{name} 님이 가입했습니다", "notification.favourite": "{name} 님이 내 게시물을 좋아합니다", "notification.follow": "{name} 님이 나를 팔로우했습니다", @@ -485,6 +493,8 @@ "notification.moderation_warning.action_silence": "계정이 제한되었습니다.", "notification.moderation_warning.action_suspend": "계정이 정지되었습니다.", "notification.own_poll": "설문을 마침", + "notification.poll": "참여한 투표가 끝났습니다", + "notification.private_mention": "{name} 님이 나를 개인적으로 멘션했습니다", "notification.reblog": "{name} 님이 부스트했습니다", "notification.relationships_severance_event": "{name} 님과의 연결이 끊어졌습니다", "notification.relationships_severance_event.account_suspension": "{from}의 관리자가 {target}를 정지시켰기 때문에 그들과 더이상 상호작용 할 수 없고 정보를 받아볼 수 없습니다.", @@ -499,9 +509,12 @@ "notification_requests.title": "걸러진 알림", "notifications.clear": "알림 비우기", "notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?", + "notifications.clear_title": "알림을 모두 지울까요?", "notifications.column_settings.admin.report": "새 신고:", "notifications.column_settings.admin.sign_up": "새로운 가입:", "notifications.column_settings.alert": "데스크탑 알림", + "notifications.column_settings.beta.category": "실험적인 기능", + "notifications.column_settings.beta.grouping": "알림 그룹화", "notifications.column_settings.favourite": "좋아요:", "notifications.column_settings.filter_bar.advanced": "모든 범주 표시", "notifications.column_settings.filter_bar.category": "빠른 필터 막대", @@ -665,9 +678,13 @@ "report.unfollow_explanation": "이 계정을 팔로우하고 있습니다. 홈 피드에서 더 이상 게시물을 받아 보지 않으려면 팔로우를 해제하십시오.", "report_notification.attached_statuses": "{count}개의 게시물 첨부됨", "report_notification.categories.legal": "법령", + "report_notification.categories.legal_sentence": "불법적인 내용", "report_notification.categories.other": "기타", + "report_notification.categories.other_sentence": "기타", "report_notification.categories.spam": "스팸", + "report_notification.categories.spam_sentence": "스팸", "report_notification.categories.violation": "규칙 위반", + "report_notification.categories.violation_sentence": "규칙 위반", "report_notification.open": "신고 열기", "search.no_recent_searches": "최근 검색 기록이 없습니다", "search.placeholder": "검색", @@ -759,7 +776,7 @@ "status.title.with_attachments": "{user} 님이 {attachmentCount, plural, one {첨부파일} other {{attachmentCount}개의 첨부파일}}과 함께 게시함", "status.translate": "번역", "status.translated_from_with": "{provider}에 의해 {lang}에서 번역됨", - "status.uncached_media_warning": "마리보기 허용되지 않음", + "status.uncached_media_warning": "미리보기를 사용할 수 없습니다", "status.unmute_conversation": "이 대화의 뮤트 해제하기", "status.unpin": "고정 해제", "subscribed_languages.lead": "변경 후에는 선택한 언어들로 작성된 게시물들만 홈 타임라인과 리스트 타임라인에 나타나게 됩니다. 아무 것도 선택하지 않으면 모든 언어로 작성된 게시물을 받아봅니다.", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 3821216a9a9d35..3d3c20424cf713 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -133,15 +133,12 @@ "compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike", "confirmation_modal.cancel": "Dev jê berde", "confirmations.block.confirm": "Asteng bike", - "confirmations.cancel_follow_request.confirm": "Daxwazê vekişîne", - "confirmations.cancel_follow_request.message": "Tu dixwazî ​​daxwaza xwe ya şopandina {name} vekşînî?", "confirmations.delete.confirm": "Jê bibe", "confirmations.delete.message": "Ma tu dixwazî vê şandiyê jê bibî?", "confirmations.delete_list.confirm": "Jê bibe", "confirmations.delete_list.message": "Tu ji dil dixwazî vê lîsteyê bi awayekî mayînde jê bibî?", "confirmations.discard_edit_media.confirm": "Biavêje", "confirmations.discard_edit_media.message": "Guhertinên neqedandî di danasîna an pêşdîtina medyayê de hene, wan bi her awayî bavêje?", - "confirmations.domain_block.message": "Tu pê bawerî ku tu dixwazî tevahiya {domain} asteng bikî? Di gelek rewşan de astengkirin an jî bêdengkirin têrê dike û tê hilbijartin. Tu nikarî naveroka vê navperê di demnameyê an jî agahdariyên xwe de bibînî. Şopînerên te yê di vê navperê wê werin jêbirin.", "confirmations.edit.confirm": "Serrast bike", "confirmations.logout.confirm": "Derkeve", "confirmations.logout.message": "Ma tu dixwazî ku derkevî?", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index f59f342cbe051a..7ebe71b24cad9b 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -88,7 +88,6 @@ "confirmations.delete.message": "Owgh hwi sur a vynnes dilea'n post ma?", "confirmations.delete_list.confirm": "Dilea", "confirmations.delete_list.message": "Owgh hwi sur a vynnes dilea'n rol ma yn fast?", - "confirmations.domain_block.message": "Owgh hwi wir, wir sur a vynnes lettya'n {domain} dhien? Y'n brassa rann a gasow, boghes lettyansow medrys po tawheansow yw lowr ha gwell. Ny wrewgh hwi gweles dalgh a'n worfarth na yn py amserlin boblek pynag po yn agas gwarnyansow. Agas holyoryon an worfarth na a vydh diles.", "confirmations.logout.confirm": "Digelmi", "confirmations.logout.message": "Owgh hwi sur a vynnes digelmi?", "confirmations.mute.confirm": "Tawhe", diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json index e35e7112bea950..1e2d54396aa832 100644 --- a/app/javascript/mastodon/locales/la.json +++ b/app/javascript/mastodon/locales/la.json @@ -82,7 +82,6 @@ "empty_column.notification_requests": "Omnia clara sunt! Nihil hic est. Cum novās notificātiōnēs accipīs, hic secundum tua praecepta apparebunt.", "empty_column.notifications": "Nōn adhūc habēs ullo notificātiōnēs. Cum aliī tē interagunt, hīc videbis.", "explore.trending_statuses": "Contributa", - "filtered_notifications_banner.mentions": "{count, plural, one {mentiō} other {mentiōnēs}}", "firehose.all": "Omnis", "footer.about": "De", "generic.saved": "Servavit", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 2dc360f9eda102..96ca615e211e5c 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -164,16 +164,12 @@ "compose_form.spoiler_placeholder": "Avertensya de kontenido (opsyonal)", "confirmation_modal.cancel": "Anula", "confirmations.block.confirm": "Bloka", - "confirmations.cancel_follow_request.confirm": "Anula solisitud", - "confirmations.cancel_follow_request.message": "Estas siguro ke keres anular tu solisitud de segir a {name}?", "confirmations.delete.confirm": "Efasa", "confirmations.delete.message": "Estas siguro ke keres efasar esta publikasyon?", "confirmations.delete_list.confirm": "Efasa", "confirmations.delete_list.message": "Estas siguro ke keres permanentemente efasar esta lista?", "confirmations.discard_edit_media.confirm": "Anula", "confirmations.discard_edit_media.message": "Tienes trokamientos no guadrados en la deskripsion o vista previa. Keres efasarlos entanto?", - "confirmations.domain_block.confirm": "Bloka sirvidor", - "confirmations.domain_block.message": "Estas totalmente siguro ke keres blokar todo el domeno {domain}? En djeneral unos kuantos blokos o silensiamientos son sufisientes i preferavles. No veras kontenido de akel domeno en dinguna linya de tiempo publika ni ent tus avizos. Tus suivantes de akel domeno seran kitados.", "confirmations.edit.confirm": "Edita", "confirmations.edit.message": "Si edites agora, kitaras el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", "confirmations.logout.confirm": "Sal", @@ -282,7 +278,6 @@ "filter_modal.select_filter.subtitle": "Kulanea una kategoria egzistente o kriya mueva", "filter_modal.select_filter.title": "Filtra esta publikasyon", "filter_modal.title.status": "Filtra una publikasyon", - "filtered_notifications_banner.pending_requests": "Avizos de {count, plural, =0 {dingun} one {una persona} other {# personas}} ke puedes koneser", "filtered_notifications_banner.title": "Avizos filtrados", "firehose.all": "Todo", "firehose.local": "Este sirvidor", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index f8a2995c57aafc..2d3626ff9aad20 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Turinio įspėjimas (pasirinktinis)", "confirmation_modal.cancel": "Atšaukti", "confirmations.block.confirm": "Blokuoti", - "confirmations.cancel_follow_request.confirm": "Atšaukti prašymą", - "confirmations.cancel_follow_request.message": "Ar tikrai nori atšaukti savo prašymą sekti {name}?", "confirmations.delete.confirm": "Ištrinti", "confirmations.delete.message": "Ar tikrai nori ištrinti šį įrašą?", + "confirmations.delete.title": "Ištrinti įrašą?", "confirmations.delete_list.confirm": "Ištrinti", "confirmations.delete_list.message": "Ar tikrai nori visam laikui ištrinti šį sąrašą?", + "confirmations.delete_list.title": "Ištrinti sąrašą?", "confirmations.discard_edit_media.confirm": "Atmesti", "confirmations.discard_edit_media.message": "Turi neišsaugotų medijos aprašymo ar peržiūros pakeitimų, vis tiek juos atmesti?", - "confirmations.domain_block.confirm": "Blokuoti serverį", - "confirmations.domain_block.message": "Ar tikrai, tikrai nori užblokuoti visą {domain}? Daugeliu atvejų užtenka kelių tikslinių blokavimų arba nutildymų. Šio domeno turinio nematysi jokiose viešose laiko skalėse ar pranešimuose. Tavo sekėjai iš to domeno bus pašalinti.", "confirmations.edit.confirm": "Redaguoti", "confirmations.edit.message": "Redaguojant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?", + "confirmations.edit.title": "Perrašyti įrašą?", "confirmations.logout.confirm": "Atsijungti", "confirmations.logout.message": "Ar tikrai nori atsijungti?", + "confirmations.logout.title": "Atsijungti?", "confirmations.mute.confirm": "Nutildyti", "confirmations.redraft.confirm": "Ištrinti ir perrašyti", "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parašyti jį iš naujo? Bus prarastos mėgstamai ir pakėlimai, o atsakymai į originalinį įrašą taps liekamojais.", + "confirmations.redraft.title": "Ištrinti ir iš naujo parengti įrašą?", "confirmations.reply.confirm": "Atsakyti", "confirmations.reply.message": "Atsakant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?", + "confirmations.reply.title": "Perrašyti įrašą?", "confirmations.unfollow.confirm": "Nebesekti", "confirmations.unfollow.message": "Ar tikrai nori nebesekti {name}?", + "confirmations.unfollow.title": "Nebesekti naudotoją?", "conversation.delete": "Ištrinti pokalbį", "conversation.mark_as_read": "Žymėti kaip skaitytą", "conversation.open": "Peržiūrėti pokalbį", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.", "filter_modal.select_filter.title": "Filtruoti šį įrašą", "filter_modal.title.status": "Filtruoti įrašą", - "filtered_notifications_banner.mentions": "{count, plural, one {paminėjimas} few {paminėjimai} many {paminėjimo} other {paminėjimų}}", - "filtered_notifications_banner.pending_requests": "Pranešimai iš {count, plural, =0 {nė vieno} one {vienos žmogaus} few {# žmonių} many {# žmonių} other {# žmonių}}, kuriuos galbūt pažįsti", "filtered_notifications_banner.title": "Filtruojami pranešimai", "firehose.all": "Visi", "firehose.local": "Šis serveris", @@ -443,6 +444,8 @@ "mute_modal.title": "Nutildyti naudotoją?", "mute_modal.you_wont_see_mentions": "Nematysi įrašus, kuriuose jie paminimi.", "mute_modal.you_wont_see_posts": "Jie vis tiek gali matyti tavo įrašus, bet tu nematysi jų.", + "name_and_others": "{name} ir {count, plural, one {# kitas} few {# kiti} many {# kito} other {# kitų}}", + "name_and_others_with_link": "{name} ir {count, plural, one {# kitas} few {# kiti} many {# kito} other {# kitų}}", "navigation_bar.about": "Apie", "navigation_bar.advanced_interface": "Atidaryti išplėstinę žiniatinklio sąsają", "navigation_bar.blocks": "Užblokuoti naudotojai", @@ -470,6 +473,10 @@ "navigation_bar.security": "Apsauga", "not_signed_in_indicator.not_signed_in": "Norint pasiekti šį išteklį, reikia prisijungti.", "notification.admin.report": "{name} pranešė {target}", + "notification.admin.report_account": "{name} pranešė {count, plural, one {# įrašą} few {# įrašus} many {# įrašo} other {# įrašų}} iš {target} kategorijai {category}", + "notification.admin.report_account_other": "{name} pranešė {count, plural, one {# įrašą} few {# įrašus} many {# įrašo} other {# įrašų}} iš {target}", + "notification.admin.report_statuses": "{name} pranešė {target} kategorijai {category}", + "notification.admin.report_statuses_other": "{name} pranešė {target}", "notification.admin.sign_up": "{name} užsiregistravo", "notification.favourite": "{name} pamėgo tavo įrašą", "notification.follow": "{name} seka tave", @@ -485,6 +492,8 @@ "notification.moderation_warning.action_silence": "Tavo paskyra buvo apribota.", "notification.moderation_warning.action_suspend": "Tavo paskyra buvo sustabdyta.", "notification.own_poll": "Tavo apklausa baigėsi", + "notification.poll": "Baigėsi apklausa, kurioje balsavai", + "notification.private_mention": "{name} privačiai paminėjo tave", "notification.reblog": "{name} pakėlė tavo įrašą", "notification.relationships_severance_event": "Prarasti sąryšiai su {name}", "notification.relationships_severance_event.learn_more": "Sužinoti daugiau", @@ -497,9 +506,12 @@ "notification_requests.title": "Filtruojami pranešimai", "notifications.clear": "Išvalyti pranešimus", "notifications.clear_confirmation": "Ar tikrai nori visam laikui išvalyti visus pranešimus?", + "notifications.clear_title": "Valyti pranešimus?", "notifications.column_settings.admin.report": "Naujos ataskaitos:", "notifications.column_settings.admin.sign_up": "Naujos registracijos:", "notifications.column_settings.alert": "Darbalaukio pranešimai", + "notifications.column_settings.beta.category": "Eksperimentinės funkcijos", + "notifications.column_settings.beta.grouping": "Grupuoti pranešimus", "notifications.column_settings.favourite": "Mėgstami:", "notifications.column_settings.filter_bar.advanced": "Rodyti visas kategorijas", "notifications.column_settings.filter_bar.category": "Spartaus filtro juosta", @@ -660,9 +672,13 @@ "report.unfollow_explanation": "Tu seki šią paskyrą. Jei nori nebematyti jų įrašų savo pagrindiniame sraute, nebesek jų.", "report_notification.attached_statuses": "Pridėti {count, plural, one {{count} įrašas} few {{count} įrašai} many {{count} įrašo} other {{count} įrašų}}", "report_notification.categories.legal": "Teisinės", + "report_notification.categories.legal_sentence": "nelegalus turinys", "report_notification.categories.other": "Kita", + "report_notification.categories.other_sentence": "kita", "report_notification.categories.spam": "Šlamštas", + "report_notification.categories.spam_sentence": "šlamštas", "report_notification.categories.violation": "Taisyklės pažeidimas", + "report_notification.categories.violation_sentence": "taisyklės pažeidimas", "report_notification.open": "Atidaryti ataskaitą", "search.no_recent_searches": "Nėra naujausių paieškų.", "search.placeholder": "Paieška", @@ -695,7 +711,7 @@ "sign_in_banner.create_account": "Sukurti paskyrą", "sign_in_banner.follow_anyone": "Sek bet kurį asmenį visoje fediverse ir žiūrėk viską chronologine tvarka. Jokių algoritmų, reklamų ar paspaudimų.", "sign_in_banner.mastodon_is": "„Mastodon“ – tai geriausias būdas sekti, kas vyksta.", - "sign_in_banner.sign_in": "Prisijungimas", + "sign_in_banner.sign_in": "Prisijungti", "sign_in_banner.sso_redirect": "Prisijungti arba užsiregistruoti", "status.admin_account": "Atidaryti prižiūrėjimo sąsają @{name}", "status.admin_domain": "Atidaryti prižiūrėjimo sąsają {domain}", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index d4623a8b31a344..86ed6262a933f4 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -163,15 +163,12 @@ "compose_form.spoiler_placeholder": "Satura brīdinājums (pēc izvēles)", "confirmation_modal.cancel": "Atcelt", "confirmations.block.confirm": "Bloķēt", - "confirmations.cancel_follow_request.confirm": "Atsaukt pieprasījumu", - "confirmations.cancel_follow_request.message": "Vai tiešām vēlies atsaukt pieprasījumu sekot {name}?", "confirmations.delete.confirm": "Dzēst", "confirmations.delete.message": "Vai tiešām vēlies dzēst šo ierakstu?", "confirmations.delete_list.confirm": "Dzēst", "confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?", "confirmations.discard_edit_media.confirm": "Atmest", "confirmations.discard_edit_media.message": "Ir nesaglabātas izmaiņas informācijas nesēja aprakstā vai priekšskatījumā. Vēlies tās atmest tik un tā?", - "confirmations.domain_block.message": "Vai tu tiešām vēlies bloķēt visu domēnu {domain}? Parasti pietiek, ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.", "confirmations.edit.confirm": "Labot", "confirmations.edit.message": "Labošana pārrakstīs ziņojumu, kas šobrīd tiek sastādīts. Vai tiešām turpināt?", "confirmations.logout.confirm": "Iziet", @@ -271,7 +268,6 @@ "filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu", "filter_modal.select_filter.title": "Filtrēt šo ziņu", "filter_modal.title.status": "Filtrēt ziņu", - "filtered_notifications_banner.pending_requests": "Paziņojumi no {count, plural, =0 {neviena} one {viena cilvēka} other {# cilvēkiem}}, ko Tu varētu zināt", "firehose.all": "Visi", "firehose.local": "Šis serveris", "firehose.remote": "Citi serveri", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index a09ad98ebf650c..b1f3b9fab948fd 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -84,7 +84,6 @@ "confirmations.delete.message": "Сигурни сте дека го бришите статусот?", "confirmations.delete_list.confirm": "Избриши", "confirmations.delete_list.message": "Дали сте сигурни дека сакате да го избришете списоков?", - "confirmations.domain_block.message": "Дали скроз сте сигурни дека ќе блокирате сѐ од {domain}? Во повеќето случаеви неколку таргетирани блокирања или заќутувања се доволни и предложени. Нема да ја видите содржината од тој домеин во никој јавен времеплов или вашите нотификации. Вашите следбеници од тој домеин ќе бидат остранети.", "confirmations.logout.confirm": "Одјави се", "confirmations.logout.message": "Дали сте сигурни дека сакате да се одјавите?", "confirmations.mute.confirm": "Заќути", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index dc34867106d497..17af770b9b5970 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -158,15 +158,12 @@ "compose_form.spoiler_placeholder": "Amaran kandungan (pilihan)", "confirmation_modal.cancel": "Batal", "confirmations.block.confirm": "Sekat", - "confirmations.cancel_follow_request.confirm": "Tarik balik permintaan", - "confirmations.cancel_follow_request.message": "Adakah anda pasti ingin menarik balik permintaan anda untuk mengikut {name}?", "confirmations.delete.confirm": "Padam", "confirmations.delete.message": "Adakah anda pasti anda ingin memadam hantaran ini?", "confirmations.delete_list.confirm": "Padam", "confirmations.delete_list.message": "Adakah anda pasti anda ingin memadam senarai ini secara kekal?", "confirmations.discard_edit_media.confirm": "Singkir", "confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan pada penerangan atau pratonton media. Anda ingin membuangnya?", - "confirmations.domain_block.message": "Adakah anda betul-betul, sungguh-sungguh pasti anda ingin menyekat keseluruhan {domain}? Selalunya, beberapa sekatan atau pembisuan tersasar sudah memadai dan lebih diutamakan. Anda tidak akan nampak kandungan daripada domain tersebut di mana-mana garis masa awam mahupun pemberitahuan anda. Pengikut anda daripada domain tersebut juga akan dibuang.", "confirmations.edit.confirm": "Sunting", "confirmations.edit.message": "Mengedit sekarang akan menimpa mesej yang sedang anda karang. Adakah anda pasti mahu meneruskan?", "confirmations.logout.confirm": "Log keluar", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index cb3ea9723bd5be..cb08d76bd3011f 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -148,15 +148,12 @@ "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "ပယ်ဖျက်မည်", "confirmations.block.confirm": "ဘလော့မည်", - "confirmations.cancel_follow_request.confirm": "ပန်ကြားချက်ကို ပယ်ဖျက်မည်", - "confirmations.cancel_follow_request.message": "{name} ကို စောင့်ကြည့်ခြင်းအားပယ်ဖျက်ရန် သေချာပါသလား။", "confirmations.delete.confirm": "ဖျက်မည်", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "ဖျက်မည်", "confirmations.delete_list.message": "ဖျက်ရန် သေချာပါသလား?", "confirmations.discard_edit_media.confirm": "ဖယ်ထုတ်ပါ", "confirmations.discard_edit_media.message": "သင်သည် မီဒီယာဖော်ပြချက် သို့မဟုတ် အစမ်းကြည့်ရှုခြင်းတွင် မသိမ်းဆည်းရသေးသော အပြောင်းအလဲများရှိသည်။ မည်သို့ပင်ဖြစ်စေ ဖျက်ပစ်မည်လား။", - "confirmations.domain_block.message": "{domain} တစ်ခုလုံးကို ဘလော့လုပ်ရန် တကယ် သေချာပါသလား? များသောအားဖြင့် အနည်းစုကို ပစ်မှတ်ထား ဘလော့လုပ်ခြင်းသည် လုံလောက်ပါသည်။ ထို ဒိုမိန်းမှ အကြောင်းအရာ တစ်ခုမှ မြင်ရမည်မဟုတ်သည့်အပြင် ထို ဒိုမိန်းတွင်ရှိသော သင်၏ စောင့်ကြည့်သူများပါ ဖယ်ရှားပစ်မည်ဖြစ်သည်။", "confirmations.edit.confirm": "ပြင်ရန်", "confirmations.edit.message": "ယခုပြင်ဆင်ခြင်းတွင် သင်လက်ရှိမက်ဆေ့ချ်ကို ဖျက်ပစ်ပြီး အသစ်ရေးပါမည်။ ရှေ့ဆက်လိုသည်မှာ သေချာပါသလား။", "confirmations.logout.confirm": "အကောင့်မှထွက်မည်", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 027c09280c85a2..803070a094129e 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Inhoudswaarschuwing (optioneel)", "confirmation_modal.cancel": "Annuleren", "confirmations.block.confirm": "Blokkeren", - "confirmations.cancel_follow_request.confirm": "Verzoek annuleren", - "confirmations.cancel_follow_request.message": "Weet je zeker dat je jouw verzoek om {name} te volgen wilt annuleren?", "confirmations.delete.confirm": "Verwijderen", "confirmations.delete.message": "Weet je het zeker dat je dit bericht wilt verwijderen?", + "confirmations.delete.title": "Bericht verwijderen?", "confirmations.delete_list.confirm": "Verwijderen", "confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?", + "confirmations.delete_list.title": "Lijst verwijderen?", "confirmations.discard_edit_media.confirm": "Weggooien", "confirmations.discard_edit_media.message": "Je hebt niet-opgeslagen wijzigingen in de mediabeschrijving of voorvertonning, wil je deze toch weggooien?", - "confirmations.domain_block.confirm": "Server blokkeren", - "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt blokkeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je ziet geen berichten van deze server meer op openbare tijdlijnen of in jouw meldingen. Jouw volgers van deze server worden verwijderd.", "confirmations.edit.confirm": "Bewerken", "confirmations.edit.message": "Door nu te reageren overschrijf je het bericht dat je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", + "confirmations.edit.title": "Bericht overschrijven?", "confirmations.logout.confirm": "Uitloggen", "confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?", + "confirmations.logout.title": "Uitloggen?", "confirmations.mute.confirm": "Negeren", "confirmations.redraft.confirm": "Verwijderen en herschrijven", "confirmations.redraft.message": "Weet je zeker dat je dit bericht wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op het originele bericht raak je kwijt.", + "confirmations.redraft.title": "Bericht verwijderen en herschrijven?", "confirmations.reply.confirm": "Reageren", "confirmations.reply.message": "Door nu te reageren overschrijf je het bericht dat je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", + "confirmations.reply.title": "Bericht overschrijven?", "confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", + "confirmations.unfollow.title": "Gebruiker ontvolgen?", "conversation.delete": "Gesprek verwijderen", "conversation.mark_as_read": "Als gelezen markeren", "conversation.open": "Gesprek tonen", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Een bestaande categorie gebruiken of een nieuwe aanmaken", "filter_modal.select_filter.title": "Dit bericht filteren", "filter_modal.title.status": "Een bericht filteren", - "filtered_notifications_banner.mentions": "{count, plural, one {vermelding} other {vermeldingen}}", - "filtered_notifications_banner.pending_requests": "Meldingen van {count, plural, =0 {niemand} one {één persoon} other {# mensen}} die je misschien kent", + "filtered_notifications_banner.pending_requests": "Van {count, plural, =0 {niemand} one {een persoon} other {# personen}} die je mogelijk kent", "filtered_notifications_banner.title": "Gefilterde meldingen", "firehose.all": "Alles", "firehose.local": "Deze server", @@ -507,6 +509,7 @@ "notification_requests.title": "Gefilterde meldingen", "notifications.clear": "Meldingen verwijderen", "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?", + "notifications.clear_title": "Meldingen verwijderen?", "notifications.column_settings.admin.report": "Nieuwe rapportages:", "notifications.column_settings.admin.sign_up": "Nieuwe registraties:", "notifications.column_settings.alert": "Desktopmeldingen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index f5efedb1aeefe0..26973f830f0094 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Innhaldsåtvaring (valfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.confirm": "Blokker", - "confirmations.cancel_follow_request.confirm": "Trekk attende førespurnad", - "confirmations.cancel_follow_request.message": "Er du sikker på at du vil trekkje attende førespurnaden din om å fylgje {name}?", "confirmations.delete.confirm": "Slett", "confirmations.delete.message": "Er du sikker på at du vil sletta denne statusen?", "confirmations.delete_list.confirm": "Slett", "confirmations.delete_list.message": "Er du sikker på at du vil sletta denne lista for alltid?", "confirmations.discard_edit_media.confirm": "Forkast", "confirmations.discard_edit_media.message": "Du har ulagra endringar i mediaskildringa eller førehandsvisinga. Vil du forkasta dei likevel?", - "confirmations.domain_block.confirm": "Blokker tenaren", - "confirmations.domain_block.message": "Er du heilt, heilt sikker på at du vil skjula heile {domain}? I dei fleste tilfelle er det godt nok og føretrekt med nokre få målretta blokkeringar eller dempingar. Du kjem ikkje til å sjå innhald frå domenet i fødererte tidsliner eller i varsla dine. Fylgjarane dine frå domenet vert fjerna.", "confirmations.edit.confirm": "Rediger", "confirmations.edit.message": "Å redigera no vil overskriva den meldinga du er i ferd med å skriva. Er du sikker på at du vil halda fram?", "confirmations.logout.confirm": "Logg ut", @@ -297,8 +293,7 @@ "filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny", "filter_modal.select_filter.title": "Filtrer dette innlegget", "filter_modal.title.status": "Filtrer eit innlegg", - "filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}", - "filtered_notifications_banner.pending_requests": "Varsel frå {count, plural, =0 {ingen} one {ein person} other {# folk}} du kanskje kjenner", + "filtered_notifications_banner.pending_requests": "Frå {count, plural, =0 {ingen} one {éin person} other {# personar}} du kanskje kjenner", "filtered_notifications_banner.title": "Filtrerte varslingar", "firehose.all": "Alle", "firehose.local": "Denne tenaren", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index f2476bf14cde9d..0f9e0d5a79cbc4 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -158,15 +158,12 @@ "compose_form.spoiler_placeholder": "Innholdsadvarsel (valgfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.confirm": "Blokkèr", - "confirmations.cancel_follow_request.confirm": "Trekk tilbake forespørsel", - "confirmations.cancel_follow_request.message": "Er du sikker på at du vil trekke tilbake forespørselen din for å følge {name}?", "confirmations.delete.confirm": "Slett", "confirmations.delete.message": "Er du sikker på at du vil slette dette innlegget?", "confirmations.delete_list.confirm": "Slett", "confirmations.delete_list.message": "Er du sikker på at du vil slette denne listen permanent?", "confirmations.discard_edit_media.confirm": "Forkast", "confirmations.discard_edit_media.message": "Du har ulagrede endringer i mediebeskrivelsen eller i forhåndsvisning, forkast dem likevel?", - "confirmations.domain_block.message": "Er du sikker på at du vil skjule hele domenet {domain}? I de fleste tilfeller er det bedre med målrettet blokkering eller demping.", "confirmations.edit.confirm": "Redigér", "confirmations.edit.message": "Å redigere nå vil overskrive meldingen du skriver for øyeblikket. Er du sikker på at du vil fortsette?", "confirmations.logout.confirm": "Logg ut", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index c02c821afcec06..00701cbdf9be02 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -135,14 +135,11 @@ "compose_form.spoiler.unmarked": "Lo tèxte es pas rescondut", "confirmation_modal.cancel": "Anullar", "confirmations.block.confirm": "Blocar", - "confirmations.cancel_follow_request.confirm": "Retirar la demandar", - "confirmations.cancel_follow_request.message": "Volètz vertadièrament retirar la demanda de seguiment de {name} ?", "confirmations.delete.confirm": "Escafar", "confirmations.delete.message": "Volètz vertadièrament escafar l’estatut ?", "confirmations.delete_list.confirm": "Suprimir", "confirmations.delete_list.message": "Volètz vertadièrament suprimir aquesta lista per totjorn ?", "confirmations.discard_edit_media.confirm": "Ignorar", - "confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.\nVeiretz pas cap de contengut d’aquel domeni dins cap de flux public o dins vòstras notificacions. Vòstres seguidors d’aquel domeni seràn levats.", "confirmations.edit.confirm": "Modificar", "confirmations.logout.confirm": "Desconnexion", "confirmations.logout.message": "Volètz vertadièrament vos desconnectar ?", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 75987f5d29c67f..efd2d2c156efc7 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Ostrzeżenie o treści (opcjonalne)", "confirmation_modal.cancel": "Anuluj", "confirmations.block.confirm": "Zablokuj", - "confirmations.cancel_follow_request.confirm": "Wycofaj prośbę", - "confirmations.cancel_follow_request.message": "Czy na pewno chcesz wycofać prośbę o możliwość obserwowania {name}?", "confirmations.delete.confirm": "Usuń", "confirmations.delete.message": "Czy na pewno chcesz usunąć ten wpis?", + "confirmations.delete.title": "Usunąć wpis?", "confirmations.delete_list.confirm": "Usuń", "confirmations.delete_list.message": "Czy na pewno chcesz bezpowrotnie usunąć tą listę?", + "confirmations.delete_list.title": "Usunąć listę?", "confirmations.discard_edit_media.confirm": "Odrzuć", "confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?", - "confirmations.domain_block.confirm": "Blokuj serwer", - "confirmations.domain_block.message": "Czy na pewno chcesz zablokować całą domenę {domain}? Zwykle lepszym rozwiązaniem jest blokada lub wyciszenie kilku użytkowników.", "confirmations.edit.confirm": "Edytuj", "confirmations.edit.message": "Edytowanie wpisu nadpisze wiadomość, którą obecnie piszesz. Czy na pewno chcesz to zrobić?", + "confirmations.edit.title": "Nadpisać wpis?", "confirmations.logout.confirm": "Wyloguj", "confirmations.logout.message": "Czy na pewno chcesz się wylogować?", + "confirmations.logout.title": "Wylogować?", "confirmations.mute.confirm": "Wycisz", "confirmations.redraft.confirm": "Usuń i przeredaguj", "confirmations.redraft.message": "Czy na pewno chcesz usunąć i przeredagować ten wpis? Polubienia i podbicia zostaną utracone, a odpowiedzi do oryginalnego wpisu zostaną osierocone.", + "confirmations.redraft.title": "Usunąć i przeredagować wpis?", "confirmations.reply.confirm": "Odpowiedz", "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?", + "confirmations.reply.title": "Nadpisać wpis?", "confirmations.unfollow.confirm": "Przestań obserwować", "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać obserwować {name}?", + "confirmations.unfollow.title": "Przestać obserwować?", "conversation.delete": "Usuń konwersację", "conversation.mark_as_read": "Oznacz jako przeczytane", "conversation.open": "Zobacz konwersację", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Użyj istniejącej kategorii lub utwórz nową", "filter_modal.select_filter.title": "Filtruj ten wpis", "filter_modal.title.status": "Filtruj wpis", - "filtered_notifications_banner.mentions": "{count, plural, one {wzmianka} few {wzmianki} other {wzmianek}}", - "filtered_notifications_banner.pending_requests": "Powiadomienia od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}", + "filtered_notifications_banner.pending_requests": "Od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}", "filtered_notifications_banner.title": "Powiadomienia filtrowane", "firehose.all": "Wszystko", "firehose.local": "Ten serwer", @@ -506,6 +508,7 @@ "notification_requests.title": "Powiadomienia filtrowane", "notifications.clear": "Wyczyść powiadomienia", "notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?", + "notifications.clear_title": "Wyczyścić powiadomienia?", "notifications.column_settings.admin.report": "Nowe zgłoszenia:", "notifications.column_settings.admin.sign_up": "Nowe rejestracje:", "notifications.column_settings.alert": "Powiadomienia na pulpicie", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 9ebde4e6a48dfc..3f831dba250815 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -166,27 +166,30 @@ "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Cancelar a solicitação", - "confirmations.cancel_follow_request.message": "Tem certeza de que deseja cancelar seu pedido para seguir {name}?", "confirmations.delete.confirm": "Excluir", "confirmations.delete.message": "Você tem certeza de que deseja excluir este toot?", + "confirmations.delete.title": "Excluir publicação?", "confirmations.delete_list.confirm": "Excluir", "confirmations.delete_list.message": "Você tem certeza de que deseja excluir esta lista?", + "confirmations.delete_list.title": "Excluir lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Há mudanças não salvas na descrição ou pré-visualização da mídia. Descartar assim mesmo?", - "confirmations.domain_block.confirm": "Servidor de blocos", - "confirmations.domain_block.message": "Você tem certeza de que deseja bloquear tudo de {domain}? Você não verá mais o conteúdo desta instância em nenhuma linha do tempo pública ou nas suas notificações. Seus seguidores desta instância serão removidos.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar agora irá substituir a mensagem que está sendo criando. Tem certeza de que deseja continuar?", + "confirmations.edit.title": "Sobrescrever o post?", "confirmations.logout.confirm": "Sair", "confirmations.logout.message": "Você tem certeza de que deseja sair?", + "confirmations.logout.title": "Sair da sessão?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Excluir e rascunhar", "confirmations.redraft.message": "Você tem certeza de que quer apagar essa postagem e rascunhá-la? Favoritos e impulsos serão perdidos, e respostas à postagem original ficarão órfãs.", + "confirmations.redraft.title": "Excluir e rascunhar publicação?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder agora sobrescreverá o toot que você está compondo. Deseja continuar?", + "confirmations.reply.title": "Sobrescrever o post?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que deseja deixar de seguir {name}?", + "confirmations.unfollow.title": "Deixar de seguir o usuário?", "conversation.delete": "Excluir conversa", "conversation.mark_as_read": "Marcar como lida", "conversation.open": "Ver conversa", @@ -294,8 +297,6 @@ "filter_modal.select_filter.subtitle": "Use uma categoria existente ou crie uma nova", "filter_modal.select_filter.title": "Filtrar esta publicação", "filter_modal.title.status": "Filtrar uma publicação", - "filtered_notifications_banner.mentions": "{count, plural, one {menção} other {menções}}", - "filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {no one} one {one person} other {# people}} que você talvez conheça", "filtered_notifications_banner.title": "Notificações filtradas", "firehose.all": "Tudo", "firehose.local": "Este servidor", @@ -496,6 +497,7 @@ "notification_requests.title": "Notificações filtradas", "notifications.clear": "Limpar notificações", "notifications.clear_confirmation": "Você tem certeza de que deseja limpar todas as suas notificações?", + "notifications.clear_title": "Limpar 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 computador", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index a0359fd8684589..42b9e7c9ecc5df 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar pedido", - "confirmations.cancel_follow_request.message": "Tem a certeza que pretende retirar o pedido para seguir {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "De certeza que quer eliminar esta publicação?", + "confirmations.delete.title": "Eliminar publicação?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "Tens a certeza de que deseja eliminar permanentemente esta lista?", + "confirmations.delete_list.title": "Eliminar lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tem alterações por guardar na descrição ou pré-visualização do conteúdo. Descartar mesmo assim?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "De certeza que queres bloquear completamente o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é suficiente e é o recomendado. Não irás ver conteúdo daquele domínio em cronologia alguma nem nas tuas notificações. Os teus seguidores daquele domínio serão removidos.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar agora irá sobrescrever a mensagem que está a compor. Tem a certeza de que deseja continuar?", + "confirmations.edit.title": "Sobrescrever publicação?", "confirmations.logout.confirm": "Terminar sessão", "confirmations.logout.message": "Tem a certeza de que quer terminar a sessão?", + "confirmations.logout.title": "Terminar sessão?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Eliminar & reescrever", "confirmations.redraft.message": "Tem a certeza de que quer eliminar e reescrever esta publicação? Os favoritos e partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.", + "confirmations.redraft.title": "Eliminar e reescrever publicação?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder agora irá reescrever a mensagem que está a compor actualmente. Tem a certeza que quer continuar?", + "confirmations.reply.title": "Sobrescrever publicação?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", + "confirmations.unfollow.title": "Deixar de seguir utilizador?", "conversation.delete": "Eliminar conversa", "conversation.mark_as_read": "Marcar como lida", "conversation.open": "Ver conversa", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Utilize uma categoria existente ou crie uma nova", "filter_modal.select_filter.title": "Filtrar esta publicação", "filter_modal.title.status": "Filtrar uma publicação", - "filtered_notifications_banner.mentions": "{count, plural, one {menção} other {menções}}", - "filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que talvez conheça", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que pode conhecer", "filtered_notifications_banner.title": "Notificações filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", @@ -443,6 +445,8 @@ "mute_modal.title": "Silenciar utilizador?", "mute_modal.you_wont_see_mentions": "Não verá publicações que os mencionem.", "mute_modal.you_wont_see_posts": "Eles podem continuar a ver as suas publicações, mas você não verá as deles.", + "name_and_others": "{name} e {count, plural, one {# outro} other {# outros}}", + "name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}}", "navigation_bar.about": "Sobre", "navigation_bar.advanced_interface": "Abrir na interface web avançada", "navigation_bar.blocks": "Utilizadores bloqueados", @@ -470,6 +474,10 @@ "navigation_bar.security": "Segurança", "not_signed_in_indicator.not_signed_in": "Necessita de iniciar sessão para utilizar esta funcionalidade.", "notification.admin.report": "{name} denunciou {target}", + "notification.admin.report_account": "{name} denunciou {count, plural, one {uma publicação} other {# publicações}} de {target} por {category}", + "notification.admin.report_account_other": "{name} denunciou {count, plural, one {uma publicação} other {# publicações}} de {target}", + "notification.admin.report_statuses": "{name} denunicou {target} por {category}", + "notification.admin.report_statuses_other": "{name} denunciou {target}", "notification.admin.sign_up": "{name} inscreveu-se", "notification.favourite": "{name} assinalou a sua publicação como favorita", "notification.follow": "{name} começou a seguir-te", @@ -485,6 +493,8 @@ "notification.moderation_warning.action_silence": "A sua conta foi limitada.", "notification.moderation_warning.action_suspend": "A sua conta foi suspensa.", "notification.own_poll": "A sua votação terminou", + "notification.poll": "Uma votação em que participaste chegou ao fim", + "notification.private_mention": "{name} mencionou-o em privado", "notification.reblog": "{name} reforçou a tua publicação", "notification.relationships_severance_event": "Perdeu as ligações com {name}", "notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, o que significa que já não pode receber atualizações dele ou interagir com ele.", @@ -499,9 +509,12 @@ "notification_requests.title": "Notificações filtradas", "notifications.clear": "Limpar notificações", "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?", + "notifications.clear_title": "Limpar 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.beta.category": "Funcionalidades experimentais", + "notifications.column_settings.beta.grouping": "Agrupar notificações", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias", "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos", @@ -665,9 +678,13 @@ "report.unfollow_explanation": "Está a seguir esta conta. Para não voltar a ver as publicações desta conta na sua página inicial, deixe de a seguir.", "report_notification.attached_statuses": "{count, plural,one {{count} publicação} other {{count} publicações}} em anexo", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "conteúdo ilegal", "report_notification.categories.other": "Outro", + "report_notification.categories.other_sentence": "outro", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Violação de regra", + "report_notification.categories.violation_sentence": "violação de regra", "report_notification.open": "Abrir denúncia", "search.no_recent_searches": "Nenhuma pesquisa recente", "search.placeholder": "Pesquisar", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index bbae7112696534..c4d05350202f19 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -153,15 +153,12 @@ "compose_form.spoiler_placeholder": "Atenționare de conținut (opțional)", "confirmation_modal.cancel": "Anulează", "confirmations.block.confirm": "Blochează", - "confirmations.cancel_follow_request.confirm": "Retrage cererea", - "confirmations.cancel_follow_request.message": "Sunteți sigur că doriți să retrageți cererea dvs. de urmărire pentru {name}?", "confirmations.delete.confirm": "Elimină", "confirmations.delete.message": "Ești sigur că vrei să elimini această postare?", "confirmations.delete_list.confirm": "Elimină", "confirmations.delete_list.message": "Ești sigur că vrei să elimini definitiv această listă?", "confirmations.discard_edit_media.confirm": "Renunță", "confirmations.discard_edit_media.message": "Ai modificări nesalvate în descrierea sau previzualizarea media, renunți oricum?", - "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi tot domeniul {domain}? În cele mai multe cazuri, raportarea sau blocarea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea niciun conținut din acest domeniu în vreun flux public sau în vreo notificare. Abonații tăi din acest domeniu vor fi eliminați.", "confirmations.edit.confirm": "Modifică", "confirmations.edit.message": "Editarea acum va suprascrie mesajul pe care îl compuneți în prezent. Sunteți sigur că vreți să continuați?", "confirmations.logout.confirm": "Deconectare", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 971d6c77cadd8e..61395c17abef62 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -166,16 +166,12 @@ "compose_form.spoiler_placeholder": "Предупреждение о контенте (опционально)", "confirmation_modal.cancel": "Отмена", "confirmations.block.confirm": "Заблокировать", - "confirmations.cancel_follow_request.confirm": "Отменить запрос", - "confirmations.cancel_follow_request.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": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?", - "confirmations.domain_block.confirm": "Заблокировать сервер", - "confirmations.domain_block.message": "Вы точно уверены, что хотите заблокировать {domain} полностью? В большинстве случаев нескольких блокировок и игнорирований вполне достаточно. Вы перестанете видеть публичную ленту и уведомления оттуда. Ваши подписчики из этого домена будут удалены.", "confirmations.edit.confirm": "Редактировать", "confirmations.edit.message": "В данный момент, редактирование перезапишет составляемое вами сообщение. Вы уверены, что хотите продолжить?", "confirmations.logout.confirm": "Выйти", @@ -294,8 +290,6 @@ "filter_modal.select_filter.subtitle": "Используйте существующую категорию или создайте новую", "filter_modal.select_filter.title": "Фильтровать этот пост", "filter_modal.title.status": "Фильтровать пост", - "filtered_notifications_banner.mentions": "{count, plural, one {упоминание} other {упоминания}}", - "filtered_notifications_banner.pending_requests": "Уведомления от {count, plural, =0 {никого} one {# человека} other {# других людей, с кем вы можете быть знакомы}}", "filtered_notifications_banner.title": "Отфильтрованные уведомления", "firehose.all": "Все", "firehose.local": "Текущий сервер", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 7f8dae326ef972..ea18ba2091541c 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -133,15 +133,12 @@ "compose_form.spoiler.unmarked": "अप्रच्छन्नाक्षरं विद्यते", "confirmation_modal.cancel": "नश्यताम्", "confirmations.block.confirm": "निषेधः", - "confirmations.cancel_follow_request.confirm": "अनुरोधनमपनय", - "confirmations.cancel_follow_request.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": "माध्यमवर्णनां प्रदर्शनञ्च अरक्षितानि परिवर्तनानि सन्ति, तानि अपासितुमिच्छसि वा?", - "confirmations.domain_block.message": "नूनं निश्चयेनैव विनष्टुमिच्छति पूर्णप्रदेशमेव {domain} ? अधिकांशसन्दर्भेऽस्थायित्वेन निषेधता निःशब्दत्वञ्च पर्याप्तं चयनीयञ्च । न तस्मात् प्रदेशात्सर्वे विषया द्रष्टुमशक्याः किस्यांश्चिदपि सर्वजनिकसमयतालिकायां वा स्वीयसूचनापटले । सर्वेऽनुसर्तारस्ते प्रदेशात् ये सन्ति ते नश्यन्ते ।", "confirmations.edit.confirm": "सम्पादय", "confirmations.edit.message": "सम्पादनमिदानीं लिख्यते तर्हि पूर्वलिखितसन्देशं विनश्य पुनः लिख्यते। निश्चयेनैवं कर्तव्यम्?", "confirmations.logout.confirm": "बहिर्गम्यताम्", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index f13514fd0232d9..050e1e6faefd9c 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -1,43 +1,60 @@ { "about.blocks": "Serbidores moderados", - "about.contact": "Contatu:", - "about.disclaimer": "Mastodon est software de còdigu lìberu e unu màrchiu de Mastodon gGmbH.", - "about.domain_blocks.no_reason_available": "Rasone no a disponimentu", + "about.contact": "Cuntatu:", + "about.disclaimer": "Mastodon est software de còdighe lìberu e unu màrchiu de Mastodon gGmbH.", + "about.domain_blocks.no_reason_available": "Peruna resone a disponimentu", "about.domain_blocks.preamble": "Mastodon ti permitit de bìdere su cuntenutu de utentes de cale si siat àteru serbidore de su fediversu. Custas sunt etzetziones fatas in custu serbidore ispetzìficu.", - "about.domain_blocks.silenced.explanation": "As a bìere perfilos e contenutos dae custu serbidore sceti chi ddos chircas o detzidas de ddu sighere.", + "about.domain_blocks.silenced.explanation": "As a bìdere profilos e cuntenutos dae custu serbidore isceti chi ddos chircas o detzides de ddu sighire.", "about.domain_blocks.silenced.title": "Limitadu", + "about.domain_blocks.suspended.explanation": "Perunu datu de custu serbidore at a èssere protzessadu, immagasinadu o cuncambiadu; est impossìbile duncas cale si siat interatzione o comunicatzione cun is utentes de custu serbidore.", "about.domain_blocks.suspended.title": "Suspèndidu", + "about.not_available": "Custa informatzione no est istada posta a disponimentu in custu serbidore.", + "about.powered_by": "Rete sotziale detzentralizada impulsada dae {mastodon}", "about.rules": "Règulas de su serbidore", "account.account_note_header": "Nota", "account.add_or_remove_from_list": "Agiunghe o boga dae is listas", - "account.badges.bot": "Robot", + "account.badges.bot": "Automatizadu", "account.badges.group": "Grupu", "account.block": "Bloca @{name}", "account.block_domain": "Bloca su domìniu {domain}", "account.block_short": "Bloca", "account.blocked": "Blocadu", "account.browse_more_on_origin_server": "Esplora de prus in su profilu originale", - "account.cancel_follow_request": "Withdraw follow request", + "account.cancel_follow_request": "Annulla sa sighidura", + "account.copy": "Còpia su ligòngiu a su profilu", + "account.direct": "Mèntova a @{name} in privadu", "account.disable_notifications": "Non mi notìfiches prus cando @{name} pùblichet messàgios", "account.domain_blocked": "Domìniu blocadu", "account.edit_profile": "Modìfica profilu", "account.enable_notifications": "Notìfica·mi cando @{name} pùblicat messàgios", "account.endorse": "Cussìgia in su profilu tuo", + "account.featured_tags.last_status_never": "Peruna publicatzione", + "account.featured_tags.title": "Etichetas de {name} in evidèntzia", "account.follow": "Sighi", + "account.follow_back": "Sighi tue puru", "account.followers": "Sighiduras", "account.followers.empty": "Nemos sighit ancora custa persone.", + "account.followers_counter": "{count, plural, one {{counter} sighidura} other {{counter} sighiduras}}", "account.following": "Sighende", + "account.following_counter": "{count, plural, one {sighende a {counter}} other {sighende a {counter}}}", "account.follows.empty": "Custa persone non sighit ancora a nemos.", + "account.go_to_profile": "Bae a su profilu", "account.hide_reblogs": "Cua is cumpartziduras de @{name}", "account.in_memoriam": "In memoriam.", "account.joined_short": "At aderidu", + "account.languages": "Muda is idiomas sutiscritos", "account.link_verified_on": "Sa propiedade de custu ligòngiu est istada controllada su {date}", "account.locked_info": "S'istadu de riservadesa de custu contu est istadu cunfiguradu comente blocadu. Sa persone chi tenet sa propiedade revisionat a manu chie dda podet sighire.", "account.media": "Cuntenutu multimediale", "account.mention": "Mèntova a @{name}", + "account.moved_to": "{name} at indicadu chi su contu nou issoro immoe est:", "account.mute": "Pone a @{name} a sa muda", + "account.mute_notifications_short": "Pone is notìficas a sa muda", "account.mute_short": "A sa muda", "account.muted": "A sa muda", + "account.mutual": "Pari-pari", + "account.no_bio": "Peruna descritzione frunida.", + "account.open_original_page": "Aberi sa pàgina originale", "account.posts": "Publicatziones", "account.posts_with_replies": "Publicatziones e rispostas", "account.report": "Signala @{name}", @@ -45,32 +62,54 @@ "account.requested_follow": "{name} at dimandadu de ti sighire", "account.share": "Cumpartzi su profilu de @{name}", "account.show_reblogs": "Ammustra is cumpartziduras de @{name}", + "account.statuses_counter": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}", "account.unblock": "Isbloca a @{name}", "account.unblock_domain": "Isbloca su domìniu {domain}", + "account.unblock_short": "Isbloca", "account.unendorse": "Non cussiges in su profilu", "account.unfollow": "Non sigas prus", "account.unmute": "Torra a ativare a @{name}", + "account.unmute_notifications_short": "Ativa is notìficas", + "account.unmute_short": "Ativa su sonu", "account_note.placeholder": "Incarca pro agiùnghere una nota", + "admin.dashboard.retention.cohort_size": "Utentes noos", + "admin.impact_report.instance_accounts": "Contos de profilu chi custu diat cantzellare", + "admin.impact_report.instance_followers": "Sighiduras chi is utentes nostros diant pèrdere", + "admin.impact_report.instance_follows": "Sighiduras chi is utentes issoro diant pèrdere", "alert.rate_limited.message": "Torra·bi a proare a pustis de {retry_time, time, medium}.", "alert.rate_limited.title": "Màssimu de rechestas barigadu", "alert.unexpected.message": "Ddoe est istada una faddina.", "alert.unexpected.title": "Oh!", "announcement.announcement": "Annùntziu", + "attachments_list.unprocessed": "(non protzessadu)", "audio.hide": "Cua s'àudio", + "block_modal.show_less": "Ammustra·nde prus pagu", + "block_modal.show_more": "Ammustra·nde prus", + "block_modal.they_cant_mention": "Non ti podent mentovare nen sighire.", + "block_modal.they_cant_see_posts": "Non podent bìdere is publicatziones tuas e tue non podes bìdere cussas issoro.", + "block_modal.they_will_know": "Non podent bìdere chi ddos as blocadu.", + "block_modal.title": "Boles blocare s'utente?", + "block_modal.you_wont_see_mentions": "No as a bìdere is publicatziones chi mèntovent custa persone.", "boost_modal.combo": "Podes incarcare {combo} pro brincare custu sa borta chi benit", + "bundle_column_error.copy_stacktrace": "Còpia s'informe de faddina", "bundle_column_error.error.title": "Oh, no!", "bundle_column_error.network.title": "Faddina de connessione", "bundle_column_error.retry": "Torra·bi a proare", + "bundle_column_error.return": "Torra a sa pàgina printzipale", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Serra", "bundle_modal_error.message": "Faddina in su carrigamentu de custu cumponente.", "bundle_modal_error.retry": "Torra·bi a proare", + "closed_registrations_modal.find_another_server": "Agata un'àteru serbidore", "column.about": "Informatziones", "column.blocks": "Persones blocadas", "column.bookmarks": "Sinnalibros", "column.community": "Lìnia de tempus locale", + "column.direct": "Mentziones privadas", "column.directory": "Nàviga in is profilos", "column.domain_blocks": "Domìnios blocados", + "column.favourites": "Preferidos", + "column.firehose": "Publicatziones in direta", "column.follow_requests": "Rechestas de sighidura", "column.home": "Printzipale", "column.lists": "Listas", @@ -89,31 +128,42 @@ "community.column_settings.local_only": "Isceti locale", "community.column_settings.media_only": "Isceti multimediale", "community.column_settings.remote_only": "Isceti remotu", - "compose.language.change": "Càmbia sa limba", + "compose.language.change": "Càmbia s'idioma", + "compose.language.search": "Chirca idiomas...", + "compose.published.body": "Publicadu.", + "compose.published.open": "Aberi", + "compose.saved.body": "Publicatzione sarvada.", "compose_form.direct_message_warning_learn_more": "Àteras informatziones", - "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 post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", + "compose_form.hashtag_warning": "Custa publicatzione no at a èssere ammustrada in peruna eticheta, dae chi no est pùblica. Isceti is publicatziones pùblicas podent èssere chircadas cun etichetas.", "compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.", "compose_form.lock_disclaimer.lock": "blocadu", "compose_form.placeholder": "A ite ses pensende?", "compose_form.poll.duration": "Longària de su sondàgiu", + "compose_form.poll.option_placeholder": "Optzione {number}", + "compose_form.poll.single": "Sèbera·nde una", "compose_form.poll.switch_to_multiple": "Muda su sondàgiu pro permìtere multi-optziones", "compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti", - "compose_form.publish_form": "Publish", + "compose_form.poll.type": "Istile", + "compose_form.publish": "Pùblica", + "compose_form.publish_form": "Publicatzione noa", + "compose_form.reply": "Risponde", + "compose_form.save_changes": "Atualiza", "compose_form.spoiler.marked": "Boga avisu de cuntenutu", "compose_form.spoiler.unmarked": "Agiunghe avisu de cuntenutu", + "compose_form.spoiler_placeholder": "Avisu de cuntenutu (optzionale)", "confirmation_modal.cancel": "Annulla", "confirmations.block.confirm": "Bloca", "confirmations.delete.confirm": "Cantzella", "confirmations.delete.message": "Seguru chi boles cantzellare custa publicatzione?", "confirmations.delete_list.confirm": "Cantzella", "confirmations.delete_list.message": "Seguru chi boles cantzellare custa lista in manera permanente?", - "confirmations.domain_block.message": "Boles de seguru, ma a beru a beru, blocare {domain}? In sa parte manna de is casos, pagos blocos o silentziamentos de persones sunt sufitzientes e preferìbiles. No as a bìdere cuntenutos dae custu domìniu in peruna lìnia de tempus pùblica o in is notìficas tuas. Sa gente chi ti sighit dae cussu domìniu at a èssere bogada.", + "confirmations.discard_edit_media.confirm": "Iscarta", "confirmations.edit.confirm": "Modìfica", "confirmations.logout.confirm": "Essi·nche", "confirmations.logout.message": "Seguru chi boles essire?", "confirmations.mute.confirm": "A sa muda", "confirmations.redraft.confirm": "Cantzella e torra a fàghere", + "confirmations.redraft.message": "Seguru chi boles cantzellare e torrare a fàghere custa publicatzione? As a pèrdere is preferidos e is cumpartziduras, e is rispostas a su messàgiu originale ant a abarrare òrfanas.", "confirmations.reply.confirm": "Risponde", "confirmations.reply.message": "Rispondende immoe as a subrascrìere su messàgiu chi ses iscriende. Seguru chi boles sighire?", "confirmations.unfollow.confirm": "Non sigas prus", @@ -122,22 +172,30 @@ "conversation.mark_as_read": "Signala comente lèghidu", "conversation.open": "Ammustra arresonada", "conversation.with": "Cun {names}", + "copy_icon_button.copied": "Copiadu in punta de billete", + "copypaste.copied": "Copiadu", + "copypaste.copy_to_clipboard": "Còpia in punta de billete", "directory.federated": "Dae unu fediversu connotu", "directory.local": "Isceti dae {domain}", "directory.new_arrivals": "Arribos noos", "directory.recently_active": "Cun atividade dae pagu", "disabled_account_banner.account_settings": "Cunfiguratziones de su contu", - "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", - "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", + "disabled_account_banner.text": "Su contu tuo {disabledAccount} no est ativu.", + "dismissable_banner.dismiss": "Iscarta", + "domain_block_modal.block": "Bloca su serbidore", + "domain_block_modal.title": "Boles blocare su domìniu?", + "domain_pill.server": "Serbidore", + "domain_pill.username": "Nòmine de utente", "embed.instructions": "Inserta custa publicatzione in su situ web tuo copiende su còdighe de suta.", "embed.preview": "At a aparèssere aici:", "emoji_button.activity": "Atividade", + "emoji_button.clear": "Isbòida", "emoji_button.custom": "Personalizadu", "emoji_button.flags": "Banderas", "emoji_button.food": "Mandigòngiu e bufòngiu", "emoji_button.label": "Inserta un'emoji", "emoji_button.nature": "Natura", - "emoji_button.not_found": "Emojis no!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "Perunu emoji agatadu", "emoji_button.objects": "Ogetos", "emoji_button.people": "Gente", "emoji_button.recent": "Impreadu a fitianu", @@ -168,17 +226,41 @@ "errors.unexpected_crash.report_issue": "Sinnala unu problema", "explore.search_results": "Resurtados de sa chirca", "explore.suggested_follows": "Gente", + "explore.title": "Esplora", + "explore.trending_links": "Noas", "explore.trending_statuses": "Publicatziones", "explore.trending_tags": "Etichetas", + "filter_modal.added.expired_title": "Filtru iscadidu.", + "filter_modal.added.review_and_configure_title": "Cunfiguratziones de filtru", + "filter_modal.added.settings_link": "pàgina de cunfiguratzione", + "filter_modal.added.short_explanation": "Custa publicatzione est istada agiunta a sa categoria de filtros imbeniente: {title}.", + "filter_modal.added.title": "Filtru agiuntu!", "filter_modal.select_filter.expired": "iscadidu", + "filter_modal.select_filter.prompt_new": "Categoria noa: {name}", + "filter_modal.select_filter.search": "Chirca o crea", + "filter_modal.select_filter.subtitle": "Imprea una categoria chi esistit giai o crea·nde una", + "filter_modal.select_filter.title": "Filtra custa publicatzione", + "filter_modal.title.status": "Filtra una publicatzione", + "filtered_notifications_banner.title": "Notìficas filtradas", "firehose.all": "Totus", + "firehose.local": "Custu serbidore", + "firehose.remote": "Àteros serbidores", "follow_request.authorize": "Autoriza", "follow_request.reject": "Refuda", "follow_requests.unlocked_explanation": "Fintzas si su contu tuo no est blocadu, su personale de {domain} at pensadu chi forsis bolias revisionare a manu is rechestas de custos contos.", + "follow_suggestions.curated_suggestion": "Sa seletzione de s'iscuadra de traballu", + "follow_suggestions.dismiss": "No ammustres prus", + "follow_suggestions.featured_longer": "Seberadu a manu dae s'iscuadra de {domain}", + "follow_suggestions.friends_of_friends_longer": "Populare intre persones chi sighis", + "follow_suggestions.hints.featured": "Custu profilu est istadu seberadu a manu dae s'iscuadra {domain}.", + "follow_suggestions.view_all": "Ammustra totu", "footer.about": "Informatziones", + "footer.directory": "Diretòriu de profilos", + "footer.get_app": "Otene s'aplicatzione", "footer.invite": "Invita gente", "footer.keyboard_shortcuts": "Incurtzaduras de tecladu", "footer.privacy_policy": "Polìtica de riservadesa", + "footer.source_code": "Ammustra su còdighe de orìgine", "footer.status": "Istadu", "generic.saved": "Sarvadu", "getting_started.heading": "Comente cumintzare", @@ -191,56 +273,64 @@ "hashtag.column_settings.tag_mode.any": "Cale si siat de custos", "hashtag.column_settings.tag_mode.none": "Perunu de custos", "hashtag.column_settings.tag_toggle": "Include etichetas additzionales pro custa colunna", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} partetzipante} other {{counter} partetzipantes}}", + "hashtag.counter_by_uses": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}", + "hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}} oe", "hashtag.follow": "Sighi su hashtag", + "hashtag.unfollow": "Non sigas prus s'eticheta", "home.column_settings.show_reblogs": "Ammustra is cumpartziduras", "home.column_settings.show_replies": "Ammustra rispostas", "home.hide_announcements": "Cua annùntzios", + "home.pending_critical_update.body": "Atualiza su serbidore Mastodon tuo su prima possìbile.", + "home.pending_critical_update.link": "Ammustra is atualizatziones", + "home.pending_critical_update.title": "Atualizatzione de seguresa crìtica a disponimentu.", "home.show_announcements": "Ammustra annùntzios", - "interaction_modal.description.reply": "Podes arrespondere a custu post con una conta in Mastodon.", + "interaction_modal.description.reply": "Podes rispòndere a custa publicatzione cun unu contu de Mastodon.", "interaction_modal.on_this_server": "In custu serbidore", "interaction_modal.title.follow": "Sighi a {name}", - "interaction_modal.title.reply": "Arresponde a su post de {name}", + "interaction_modal.title.reply": "Risponde a sa publicatzione de {name}", "intervals.full.days": "{number, plural, one {# die} other {# dies}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", "intervals.full.minutes": "{number, plural, one {# minutu} other {# minutos}}", - "keyboard_shortcuts.back": "pro navigare a coa", - "keyboard_shortcuts.blocked": "pro abèrrere sa lista de persones blocadas", - "keyboard_shortcuts.boost": "pro cumpartzire", - "keyboard_shortcuts.column": "pro atzentrare una publicatzione in una de is colunnas", - "keyboard_shortcuts.compose": "pro atzentrare in s'àrea de cumpositzione de testu", + "keyboard_shortcuts.back": "Nàviga a coa", + "keyboard_shortcuts.blocked": "Aberi sa lista de persones blocadas", + "keyboard_shortcuts.boost": "Potèntzia sa publicatzione", + "keyboard_shortcuts.column": "Atzentra sa colunna", + "keyboard_shortcuts.compose": "Atzentra s'àrea de cumpositzione de testu", "keyboard_shortcuts.description": "Descritzione", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "pro mòere in bàsciu in sa lista", - "keyboard_shortcuts.enter": "pro abèrrere una publicatzione", - "keyboard_shortcuts.federated": "pro abèrrere sa lìnia de tempus federada", + "keyboard_shortcuts.direct": "pro abèrrere sa colunna de mèntovos privados", + "keyboard_shortcuts.down": "Move in bàsciu in sa lista", + "keyboard_shortcuts.enter": "Aberi una publicatzione", + "keyboard_shortcuts.favourites": "Aberi sa lista de preferidos", + "keyboard_shortcuts.federated": "Aberi sa lìnia de tempus federada", "keyboard_shortcuts.heading": "Incurtzaduras de tecladu", - "keyboard_shortcuts.home": "pro abèrrere sa lìnia de tempus printzipale", + "keyboard_shortcuts.home": "Aberi sa lìnia de tempus printzipale", "keyboard_shortcuts.hotkey": "Tecla de atzessu diretu", - "keyboard_shortcuts.legend": "pro ammustrare custa didascalia", - "keyboard_shortcuts.local": "pro abèrrere sa lìnia de tempus locale", - "keyboard_shortcuts.mention": "pro mentovare s'atributzione", - "keyboard_shortcuts.muted": "pro abèrrere sa lista de persones a sa muda", - "keyboard_shortcuts.my_profile": "pro abèrrere su profilu tuo", - "keyboard_shortcuts.notifications": "pro abèrrere sa colunna de notificatziones", - "keyboard_shortcuts.open_media": "pro abèrrere elementos multimediales", - "keyboard_shortcuts.pinned": "pro abèrrere sa lista de publicatziones apicadas", - "keyboard_shortcuts.profile": "pro abèrrere su profilu de s'autore", - "keyboard_shortcuts.reply": "pro rispòndere", - "keyboard_shortcuts.requests": "pro abèrrere sa lista de rechestas de sighidura", - "keyboard_shortcuts.search": "pro atzentrare sa chirca", - "keyboard_shortcuts.spoilers": "pro ammustrare/cuare su campu AC", - "keyboard_shortcuts.start": "pro abèrrere sa colunna \"Cumintza\"", - "keyboard_shortcuts.toggle_hidden": "pro ammustrare o cuare testu de is AC", - "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare elementos multimediales", - "keyboard_shortcuts.toot": "pro cumintzare a iscrìere una publicatzione noa", - "keyboard_shortcuts.unfocus": "pro essire de s'àrea de cumpositzione de testu o de chirca", - "keyboard_shortcuts.up": "pro mòere in susu in sa lista", + "keyboard_shortcuts.legend": "Ammustra custa didascalia", + "keyboard_shortcuts.local": "Aberi sa lìnia de tempus locale", + "keyboard_shortcuts.mention": "Mèntova a s'atributzione", + "keyboard_shortcuts.muted": "Aberi sa lista de persones a sa muda", + "keyboard_shortcuts.my_profile": "Aberi su profilu tuo", + "keyboard_shortcuts.notifications": "Aberi sa colunna de notificatziones", + "keyboard_shortcuts.open_media": "Aberi is elementos multimediales", + "keyboard_shortcuts.pinned": "Aberi sa lista de publicatziones apicadas", + "keyboard_shortcuts.profile": "Aberi su profilu de s'autore", + "keyboard_shortcuts.reply": "Risponde a sa publicatzioe", + "keyboard_shortcuts.requests": "Aberi sa lista de rechestas de sighiduras", + "keyboard_shortcuts.search": "Atzentra sa barra de chirca", + "keyboard_shortcuts.spoilers": "Ammustra/cua su campu AC", + "keyboard_shortcuts.start": "Aberi sa colunna \"Cumintza\"", + "keyboard_shortcuts.toggle_hidden": "Ammustra o cua su testu de is AC", + "keyboard_shortcuts.toggle_sensitivity": "Ammustra/cua elementos multimediales", + "keyboard_shortcuts.toot": "Cumintza a iscrìere una publicatzione noa", + "keyboard_shortcuts.unfocus": "Essi de s'àrea de cumpositzione de testu o de chirca", + "keyboard_shortcuts.up": "Move in susu in sa lista", "lightbox.close": "Serra", "lightbox.compress": "Cumprime sa casella de visualizatzione de is immàgines", "lightbox.expand": "Ismànnia sa casella de visualizatzione de is immàgines", "lightbox.next": "Imbeniente", "lightbox.previous": "Pretzedente", - "limited_account_hint.title": "Custu perfilu dd'ant cuadu is moderadores de {domain}.", + "limited_account_hint.title": "Custu profilu est istadu cuadu dae sa moderatzione de {domain}.", "lists.account.add": "Agiunghe a sa lista", "lists.account.remove": "Boga dae sa lista", "lists.delete": "Cantzella sa lista", @@ -262,8 +352,11 @@ "navigation_bar.bookmarks": "Sinnalibros", "navigation_bar.community_timeline": "Lìnia de tempus locale", "navigation_bar.compose": "Cumpone una publicatzione noa", + "navigation_bar.direct": "Mentziones privadas", "navigation_bar.discover": "Iscoberi", "navigation_bar.domain_blocks": "Domìnios blocados", + "navigation_bar.explore": "Esplora", + "navigation_bar.favourites": "Preferidos", "navigation_bar.filters": "Faeddos a sa muda", "navigation_bar.follow_requests": "Rechestas de sighidura", "navigation_bar.follows_and_followers": "Gente chi sighis e sighiduras", @@ -276,17 +369,42 @@ "navigation_bar.public_timeline": "Lìnia de tempus federada", "navigation_bar.search": "Chirca", "navigation_bar.security": "Seguresa", - "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "not_signed_in_indicator.not_signed_in": "Ti depes identificare pro atzèdere a custa resursa.", + "notification.admin.sign_up": "{name} at aderidu", "notification.favourite": "{name} at marcadu comente a preferidu s'istadu tuo", "notification.follow": "{name} ti sighit", "notification.follow_request": "{name} at dimandadu de ti sighire", "notification.mention": "{name} t'at mentovadu", + "notification.moderation-warning.learn_more": "Àteras informatziones", + "notification.moderation_warning": "T'ant imbiadu un'avisu de moderatzione", + "notification.moderation_warning.action_delete_statuses": "Unas cantas de is publicatziones tuas sunt istadas cantzelladas.", + "notification.moderation_warning.action_disable": "Su contu tuo est istadu disativadu.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Unas cantas de is publicatziones tuas sunt istadas marcadas comente sensìbiles.", + "notification.moderation_warning.action_none": "Su contu tuo at retzidu un'avisu de moderatzione.", + "notification.moderation_warning.action_sensitive": "Is publicatziones tuas ant a èssere marcadas comente sensìbiles dae immoe.", + "notification.moderation_warning.action_silence": "Su contu tuo est istadu limitadu.", + "notification.moderation_warning.action_suspend": "Su contu tuo est istadu suspèndidu.", "notification.own_poll": "Sondàgiu acabbadu", + "notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu", + "notification.private_mention": "{name} t'at mentovadu in privadu", "notification.reblog": "{name} at cumpartzidu sa publicatzione tua", + "notification.relationships_severance_event": "Connessiones pèrdidas cun {name}", + "notification.relationships_severance_event.learn_more": "Àteras informatziones", "notification.status": "{name} at publicadu cosa", + "notification.update": "{name} at modificadu una publicatzione", + "notification_requests.accept": "Atzeta", + "notification_requests.dismiss": "Iscarta", + "notification_requests.notifications_from": "Notìficas dae {name}", + "notification_requests.title": "Notìficas filtradas", "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": "Informes noos:", "notifications.column_settings.alert": "Notìficas de iscrivania", + "notifications.column_settings.beta.category": "Funtzionalidades isperimentales", + "notifications.column_settings.beta.grouping": "Notìficas de grupu", + "notifications.column_settings.favourite": "Preferidos:", + "notifications.column_settings.filter_bar.advanced": "Ammustra totu is categorias", + "notifications.column_settings.filter_bar.category": "Barra de filtru lestru", "notifications.column_settings.follow": "Sighiduras noas:", "notifications.column_settings.follow_request": "Rechestas noas de sighidura:", "notifications.column_settings.mention": "Mèntovos:", @@ -296,8 +414,12 @@ "notifications.column_settings.show": "Ammustra in sa colunna", "notifications.column_settings.sound": "Reprodue unu sonu", "notifications.column_settings.status": "Publicatziones noas:", + "notifications.column_settings.unread_notifications.category": "Notìficas de lèghere", + "notifications.column_settings.unread_notifications.highlight": "Evidèntzia is notìficas de lèghere", + "notifications.column_settings.update": "Modìficas:", "notifications.filter.all": "Totus", "notifications.filter.boosts": "Cumpartziduras", + "notifications.filter.favourites": "Preferidos", "notifications.filter.follows": "Sighende", "notifications.filter.mentions": "Mèntovos", "notifications.filter.polls": "Resurtados de su sondàgiu", @@ -308,27 +430,23 @@ "notifications.permission_denied": "Is notìficas de iscrivania non sunt a disponimentu pro neghe de rechestas de permissu chi sunt istadas dennegadas in antis", "notifications.permission_denied_alert": "Is notìficas de iscrivania non podent èssere abilitadas, ca su permissu de su navigadore est istadu dennegadu in antis", "notifications.permission_required": "Is notìficas de iscrivania no sunt a disponimentu ca ammancat su permissu rechèdidu.", + "notifications.policy.filter_new_accounts.hint": "Creadu {days, plural, one {erisero} other {in is ùrtimas # dies}}", + "notifications.policy.filter_new_accounts_title": "Contos noos", + "notifications.policy.filter_not_followers_title": "Gente chi non ti sighit", + "notifications.policy.filter_not_following_hint": "Fintzas a cando no donas s'aprovatzione tua", + "notifications.policy.filter_not_following_title": "Gente chi non sighis", "notifications_permission_banner.enable": "Abilita is notìficas de iscrivania", "notifications_permission_banner.how_to_control": "Pro retzire notìficas cando Mastodon no est abertu, abilita is notìficas de iscrivania. Podes controllare cun pretzisione is castas de interatziones chi ingendrant notìficas de iscrivania pro mèdiu de su butone {icon} in subra, cando sunt abilitadas.", "notifications_permission_banner.title": "Non ti perdas mai nudda", - "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", - "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", + "onboarding.compose.template": "Salude #Mastodon!", "onboarding.profile.display_name": "Nòmine visìbile", "onboarding.profile.note": "Biografia", - "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", - "onboarding.start.skip": "Want to skip right ahead?", - "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", - "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", - "onboarding.steps.publish_status.body": "Say hello to the world.", - "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", - "onboarding.steps.setup_profile.title": "Customize your profile", - "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.steps.setup_profile.title": "Personaliza su profilu tuo", + "onboarding.steps.share_profile.title": "Cumpartzi su profilu tuo", "picture_in_picture.restore": "Torra·ddu a ue fiat", "poll.closed": "Serradu", "poll.refresh": "Atualiza", + "poll.reveal": "Ammustra is resurtados", "poll.total_people": "{count, plural, one {# persone} other {# persones}}", "poll.total_votes": "{count, plural, one {# votu} other {# votos}}", "poll.vote": "Vota", @@ -338,20 +456,30 @@ "poll_button.remove_poll": "Cantzella su sondàgiu", "privacy.change": "Modìfica s'istadu de riservadesa", "privacy.public.short": "Pùblicu", + "privacy_policy.last_updated": "Ùrtima atualizatzione: {date}", + "privacy_policy.title": "Polìtica de riservadesa", "recommended": "Cussigiadu", "refresh": "Atualiza", "regeneration_indicator.label": "Carrighende…", "regeneration_indicator.sublabel": "Preparende sa lìnia de tempus printzipale tua.", "relative_time.days": "{number} dies a oe", - "relative_time.full.just_now": "immoe etotu", + "relative_time.full.days": "{number, plural, one {# die} other {# dies}} a oe", + "relative_time.full.hours": "{number, plural, one {# ora} other {# oras}} a immoe", + "relative_time.full.just_now": "immoe immoe", + "relative_time.full.minutes": "{number, plural, one {# minutu} other {# minutos}} a immoe", + "relative_time.full.seconds": "{number, plural, one {# segundu} other {# segundos}} a immoe", "relative_time.hours": "{number} oras a immoe", "relative_time.just_now": "immoe", "relative_time.minutes": "{number} minutos a immoe", "relative_time.seconds": "{number} segundos a immoe", "relative_time.today": "oe", + "reply_indicator.attachments": "{count, plural, one {# alligongiadu} other {# alligongiados}}", "reply_indicator.cancel": "Annulla", + "reply_indicator.poll": "Sondàgiu", "report.block": "Bloca", + "report.categories.legal": "Giurìdicu", "report.categories.other": "Àteru", + "report.categories.spam": "Àliga", "report.category.title_account": "profilu", "report.category.title_status": "publicatzione", "report.close": "Fatu", @@ -360,19 +488,31 @@ "report.mute": "A sa muda", "report.next": "Imbeniente", "report.placeholder": "Cummentos additzionales", + "report.reasons.dislike": "Non mi praghet", + "report.reasons.dislike_description": "Est una cosa chi non boles bìdere", + "report.reasons.legal": "Illegale", + "report.reasons.other": "Un'àtera cosa", + "report.reasons.spam": "Est àliga", "report.submit": "Imbia", "report.target": "Informende de {target}", + "report.unfollow": "Non sigas prus a @{name}", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", + "report_notification.categories.legal": "Giurìdicu", + "report_notification.categories.legal_sentence": "cuntenutu illegale", "report_notification.categories.other": "Àteru", + "report_notification.categories.other_sentence": "àteru", + "report_notification.categories.spam": "Àliga", "search.placeholder": "Chirca", "search_popout.user": "utente", "search_results.accounts": "Profilos", "search_results.all": "Totus", "search_results.hashtags": "Etichetas", "search_results.statuses": "Publicatziones", + "server_banner.active_users": "utentes ativos", "server_banner.administered_by": "Amministradu dae:", "server_banner.server_stats": "Istatìsticas de su serbidore:", - "sign_in_banner.sign_in": "Sign in", + "sign_in_banner.create_account": "Crea contu", + "sign_in_banner.sign_in": "Identificatzione", "status.admin_account": "Aberi s'interfache de moderatzione pro @{name}", "status.admin_status": "Aberi custa publicatzione in s'interfache de moderatzione", "status.block": "Bloca a @{name}", @@ -383,8 +523,9 @@ "status.delete": "Cantzella", "status.detailed_status": "Visualizatzione de detàlliu de arresonada", "status.edit": "Modìfica", - "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", + "status.edited_x_times": "Modificadu {count, plural, one {{count} # borta} other {{count} bortas}}", "status.embed": "Afissa", + "status.favourites": "{count, plural, one {preferidu} other {preferidos}}", "status.filtered": "Filtradu", "status.load_more": "Càrriga·nde àteros", "status.media_hidden": "Elementos multimediales cuados", @@ -411,7 +552,7 @@ "status.show_less_all": "Ammustra·nde prus pagu pro totus", "status.show_more": "Ammustra·nde prus", "status.show_more_all": "Ammustra·nde prus pro totus", - "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", + "status.title.with_attachments": "{user} at publicadu {attachmentCount, plural, one {un'alligongiadu} other {{attachmentCount} alligongiados}}", "status.unmute_conversation": "Torra a ativare s'arresonada", "status.unpin": "Boga dae pitzu de su profilu", "subscribed_languages.save": "Sarva is modìficas", @@ -422,11 +563,11 @@ "time_remaining.minutes": "{number, plural, one {abarrat # minutu} other {abarrant # minutos}}", "time_remaining.moments": "Abarrant pagu momentos", "time_remaining.seconds": "{number, plural, one {abarrat # segundu} other {abarrant # segundos}}", - "timeline_hint.remote_resource_not_displayed": "{resource} dae àteros serbidores non benint ammustrados.", + "timeline_hint.remote_resource_not_displayed": "Is {resource} dae àteros serbidores non benint ammustradas.", "timeline_hint.resources.followers": "Sighiduras", "timeline_hint.resources.follows": "Sighende", "timeline_hint.resources.statuses": "Publicatziones prus betzas", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", + "trends.counter_by_accounts": "{count, plural, one {{counter} persone} other {{counter} persones}} in {days, plural, one {s'ùrtima die} other {{days} is ùrtimas dies}}", "trends.trending_now": "Est tendèntzia immoe", "ui.beforeunload": "S'abbotzu tuo at a èssere pèrdidu si essis dae Mastodon.", "units.short.billion": "{count}Mrd", @@ -437,10 +578,10 @@ "upload_error.limit": "Lìmite de càrriga de archìvios barigadu.", "upload_error.poll": "Non si permitit s'imbiu de archìvios in is sondàgios.", "upload_form.audio_description": "Descritzione pro persones cun pèrdida auditiva", - "upload_form.description": "Descritzione pro persones cun problemas visuales", + "upload_form.description": "Descritzione pro persones cun pèrdida visuale", "upload_form.edit": "Modìfica", "upload_form.thumbnail": "Càmbia sa miniadura", - "upload_form.video_description": "Descritzione pro persones cun pèrdida auditiva o problemas visuales", + "upload_form.video_description": "Descritzione pro persones cun pèrdida auditiva o visuale", "upload_modal.analyzing_picture": "Analizende immàgine…", "upload_modal.apply": "Àplica", "upload_modal.choose_image": "Sèbera un'immàgine", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index 7c4d1db60ebd9f..99f474ace50f38 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -129,15 +129,12 @@ "compose_form.spoiler.unmarked": "Pit on a content warnin", "confirmation_modal.cancel": "Stap", "confirmations.block.confirm": "Dingie", - "confirmations.cancel_follow_request.confirm": "Tak back yer request", - "confirmations.cancel_follow_request.message": "Ye shair thit ye'r wantin tae tak back yer request fir tae follae {name}?", "confirmations.delete.confirm": "Delete", "confirmations.delete.message": "Ye shair thit ye'r wantin tae delete this post?", "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Ye shair thit ye'r wantin fir tae delete this post fir ever?", "confirmations.discard_edit_media.confirm": "Fling awa", "confirmations.discard_edit_media.message": "Ye'v chynges tae the media description or preview thit ye'v no saved, fling them awa onie weys?", - "confirmations.domain_block.message": "Ye a hunner percent shair thit ye'r wantin tae dingie the hail {domain}? In maist cases a haunfae tairgtit dingies an wheeshts are eneuch an preferit. Ye wullnae see content fae that domain in onie public timelines or in yer notes. Yer follaers fae that domain wull be taen awa.", "confirmations.logout.confirm": "Log oot", "confirmations.logout.message": "Ye shair thit ye'r wantin tae log oot?", "confirmations.mute.confirm": "Wheesht", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index cff79c6b9bb379..2127ab2efbf96f 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -164,27 +164,30 @@ "compose_form.spoiler_placeholder": "Varovanie o obsahu (voliteľné)", "confirmation_modal.cancel": "Zruš", "confirmations.block.confirm": "Zablokovať", - "confirmations.cancel_follow_request.confirm": "Stiahnuť žiadosť", - "confirmations.cancel_follow_request.message": "Určite chcete stiahnuť svoju žiadosť o sledovanie {name}?", "confirmations.delete.confirm": "Vymazať", "confirmations.delete.message": "Určite chcete tento príspevok vymazať?", + "confirmations.delete.title": "Vymazať príspevok?", "confirmations.delete_list.confirm": "Vymazať", "confirmations.delete_list.message": "Určite chcete tento zoznam trvalo vymazať?", + "confirmations.delete_list.title": "Vymazať zoznam?", "confirmations.discard_edit_media.confirm": "Zahodiť", "confirmations.discard_edit_media.message": "Máte neuložené zmeny v popise alebo náhľade média, zahodiť ich aj tak?", - "confirmations.domain_block.confirm": "Blokovať server", - "confirmations.domain_block.message": "Určite chcete blokovať celú doménu {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych účtov, čo aj odporúčame. Obsah z tejto domény neuvidíte v žiadnej verejnej časovej osi ani v upozorneniach. Vaši sledujúci pochádzajúci z tejto domény budú odstránení.", "confirmations.edit.confirm": "Upraviť", "confirmations.edit.message": "Úpravou prepíšete príspevok, ktorý máte rozpísaný. Určite chcete pokračovať?", + "confirmations.edit.title": "Prepísať príspevok?", "confirmations.logout.confirm": "Odhlásiť sa", "confirmations.logout.message": "Určite sa chcete odhlásiť?", + "confirmations.logout.title": "Odhlásiť sa?", "confirmations.mute.confirm": "Stíšiť", "confirmations.redraft.confirm": "Vymazať a prepísať", "confirmations.redraft.message": "Určite chcete tento príspevok vymazať a prepísať? Prídete o jeho zdieľania a ohviezdičkovania a odpovede na pôvodný príspevok budú odlúčené.", + "confirmations.redraft.title": "Vymazať a prepísať príspevok?", "confirmations.reply.confirm": "Odpovedať", "confirmations.reply.message": "Odpovedaním akurát teraz prepíšeš správu, ktorú máš práve rozpísanú. Si si istý/á, že chceš pokračovať?", + "confirmations.reply.title": "Prepísať príspevok?", "confirmations.unfollow.confirm": "Prestať sledovať", "confirmations.unfollow.message": "Určite chcete prestať sledovať {name}?", + "confirmations.unfollow.title": "Prestať sledovať užívateľa?", "conversation.delete": "Vymazať konverzáciu", "conversation.mark_as_read": "Označiť ako prečítanú", "conversation.open": "Zobraziť konverzáciu", @@ -206,7 +209,12 @@ "dismissable_banner.public_timeline": "Toto sú najnovšie verejné príspevky od účtov na sociálnej sieti, ktoré sú sledované účtami z {domain}.", "domain_block_modal.block": "Blokovať server", "domain_block_modal.block_account_instead": "Namiesto toho zablokuj @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Ľudia z tohto servera môžu interaktovať s tvojimi starými príspevkami.", + "domain_block_modal.they_cant_follow": "Nikto z tohoto servera ťa nemôže nasledovať.", + "domain_block_modal.they_wont_know": "Nebude vedieť, že bol/a zablokovaný/á.", "domain_block_modal.title": "Blokovať doménu?", + "domain_block_modal.you_will_lose_followers": "Všetci tvoji nasledovatelia z tohto servera budú odstránení.", + "domain_block_modal.you_wont_see_posts": "Neuvidíš príspevky, ani oboznámenia od užívateľov na tomto serveri.", "domain_pill.server": "Server", "domain_pill.their_server": "Ich digitálny domov, kde žijú všetky ich príspevky.", "domain_pill.username": "Používateľské meno", @@ -277,7 +285,6 @@ "filter_modal.select_filter.subtitle": "Použite existujúcu kategóriu alebo vytvorte novú", "filter_modal.select_filter.title": "Filtrovanie tohto príspevku", "filter_modal.title.status": "Filtrovanie príspevku", - "filtered_notifications_banner.pending_requests": "Oboznámenia od {count, plural, =0 {nikoho} one {jedného človeka} other {# ľudí}} čo môžeš poznať", "filtered_notifications_banner.title": "Filtrované oznámenia", "firehose.all": "Všetko", "firehose.local": "Tento server", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index b8c995b8d1c209..77bd899ad8cfbb 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Opozorilo o vsebini (ni obvezno)", "confirmation_modal.cancel": "Prekliči", "confirmations.block.confirm": "Blokiraj", - "confirmations.cancel_follow_request.confirm": "Umakni zahtevo", - "confirmations.cancel_follow_request.message": "Ali ste prepričani, da želite umakniti svojo zahtevo, da bi sledili {name}?", "confirmations.delete.confirm": "Izbriši", "confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to objavo?", "confirmations.delete_list.confirm": "Izbriši", "confirmations.delete_list.message": "Ali ste prepričani, da želite trajno izbrisati ta seznam?", "confirmations.discard_edit_media.confirm": "Opusti", "confirmations.discard_edit_media.message": "Imate ne shranjene spremembe za medijski opis ali predogled; jih želite kljub temu opustiti?", - "confirmations.domain_block.confirm": "Blokiraj strežnik", - "confirmations.domain_block.message": "Ali ste res, res prepričani, da želite blokirati celotno {domain}? V večini primerov je nekaj ciljnih blokiranj ali utišanj dovolj in boljše. Vsebino iz te domene ne boste videli v javnih časovnicah ali obvestilih. Vaši sledilci iz te domene bodo odstranjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.edit.message": "Urejanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?", "confirmations.logout.confirm": "Odjava", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Uporabite obstoječo kategorijo ali ustvarite novo", "filter_modal.select_filter.title": "Filtriraj to objavo", "filter_modal.title.status": "Filtrirajte objavo", - "filtered_notifications_banner.mentions": "{count, plural, one {omemba} two {omembi} few {omembe} other {omemb}}", - "filtered_notifications_banner.pending_requests": "Obvestila od {count, plural, =0 {nikogar, ki bi ga} one {# človeka, ki bi ga} two {# ljudi, ki bi ju} few {# ljudi, ki bi jih} other {# ljudi, ki bi jih}} lahko poznali", "filtered_notifications_banner.title": "Filtrirana obvestila", "firehose.all": "Vse", "firehose.local": "Ta strežnik", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 6f378b145eaf40..078092b50a1081 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Sinjalizim lënde (opsional)", "confirmation_modal.cancel": "Anuloje", "confirmations.block.confirm": "Bllokoje", - "confirmations.cancel_follow_request.confirm": "Tërhiqeni mbrapsht kërkesën", - "confirmations.cancel_follow_request.message": "Jeni i sigurt se doni të tërhiqni mbrapsht kërkesën tuaj për ndjekje të {name}?", "confirmations.delete.confirm": "Fshije", "confirmations.delete.message": "Jeni i sigurt se doni të fshihet kjo gjendje?", + "confirmations.delete.title": "Të fshihet postimi?", "confirmations.delete_list.confirm": "Fshije", "confirmations.delete_list.message": "Jeni i sigurt se doni të fshihet përgjithmonë kjo listë?", + "confirmations.delete_list.title": "Të fshihet lista?", "confirmations.discard_edit_media.confirm": "Hidhe tej", "confirmations.discard_edit_media.message": "Keni ndryshime të paruajtura te përshkrimi ose paraparja e medias, të hidhen tej, sido qoftë?", - "confirmations.domain_block.confirm": "Bllokoje shërbyesin", - "confirmations.domain_block.message": "Jeni i sigurt, shumë i sigurt se doni të bllokohet krejt {domain}? Në shumicën e rasteve, ndoca bllokime ose heshtime me synim të caktuar janë të mjaftueshme dhe të parapëlqyera. S’keni për të parë lëndë nga kjo përkatësi në ndonjë rrjedhë kohore publike, apo te njoftimet tuaja. Ndjekësit tuaj prej asaj përkatësie do të hiqen.", "confirmations.edit.confirm": "Përpunojeni", "confirmations.edit.message": "Përpunimi tani do të sjellë mbishkrim të mesazhit që po hartoni aktualisht. Jeni i sigurt se doni të vazhdohet?", + "confirmations.edit.title": "Të mbishkruhet postimi?", "confirmations.logout.confirm": "Dilni", "confirmations.logout.message": "Jeni i sigurt se doni të dilet?", + "confirmations.logout.title": "Të dilet?", "confirmations.mute.confirm": "Heshtoje", "confirmations.redraft.confirm": "Fshijeni & rihartojeni", "confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Të parapëlqyerit dhe përforcimet do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.", + "confirmations.redraft.title": "Të fshihet & riharothet postimi?", "confirmations.reply.confirm": "Përgjigjuni", "confirmations.reply.message": "Po të përgjigjeni tani, mesazhi që po hartoni, do të mbishkruhet. Jeni i sigurt se doni të vazhdohet më tej?", + "confirmations.reply.title": "Të mbishkruhet postimi?", "confirmations.unfollow.confirm": "Resht së ndjekuri", "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?", + "confirmations.unfollow.title": "Të ndalet ndjekja e përdoruesit?", "conversation.delete": "Fshije bisedën", "conversation.mark_as_read": "Vëri shenjë si të lexuar", "conversation.open": "Shfaq bisedën", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Përdorni një kategori ekzistuese, ose krijoni një të re", "filter_modal.select_filter.title": "Filtroje këtë postim", "filter_modal.title.status": "Filtroni një postim", - "filtered_notifications_banner.mentions": "{count, plural, one {përmendje} other {përmendje}}", - "filtered_notifications_banner.pending_requests": "Njoftime prej {count, plural, =0 {askujt} one {një personi} other {# vetësh}} që mund të njihni", + "filtered_notifications_banner.pending_requests": "Nga {count, plural, =0 {askush} one {një person} other {# vetë}} që mund të njihni", "filtered_notifications_banner.title": "Njoftime të filtruar", "firehose.all": "Krejt", "firehose.local": "Këtë shërbyes", @@ -507,6 +509,7 @@ "notification_requests.title": "Njoftime të filtruar", "notifications.clear": "Spastroji njoftimet", "notifications.clear_confirmation": "Jeni i sigurt se doni të spastrohen përgjithmonë krejt njoftimet tuaja?", + "notifications.clear_title": "Të spastrohen njoftimet?", "notifications.column_settings.admin.report": "Raportime të reja:", "notifications.column_settings.admin.sign_up": "Regjistrime të reja:", "notifications.column_settings.alert": "Njoftime desktopi", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 38ff12bdcf6021..a58376af041f5b 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Upozorenje o sadržaju (opciono)", "confirmation_modal.cancel": "Otkaži", "confirmations.block.confirm": "Blokiraj", - "confirmations.cancel_follow_request.confirm": "Povuci zahtev", - "confirmations.cancel_follow_request.message": "Da li ste sigurni da želite da povučete zahtev da pratite {name}?", "confirmations.delete.confirm": "Izbriši", "confirmations.delete.message": "Da li ste sigurni da želite da izbrišete ovu objavu?", "confirmations.delete_list.confirm": "Izbriši", "confirmations.delete_list.message": "Da li ste sigurni da želite da trajno izbrišete ovu listu?", "confirmations.discard_edit_media.confirm": "Odbaci", "confirmations.discard_edit_media.message": "Imate nesačuvane promene u opisu ili pregledu medija, da li ipak hoćete da ih odbacite?", - "confirmations.domain_block.confirm": "Blokiraj server", - "confirmations.domain_block.message": "Da li ste zaista sigurni da želite da blokirate ceo domen {domain}? U većini slučajeva, dovoljno je i poželjno nekoliko ciljanih blokiranja ili ignorisanja. Nećete videti sadržaj sa tog domena ni u jednoj javnoj vremenskoj liniji ili u vašim obaveštenjima. Vaši pratioci sa tog domena će biti uklonjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.edit.message": "Uređivanjem će se obrisati poruka koju trenutno sastavljate. Da li ste sigurni da želite da nastavite?", "confirmations.logout.confirm": "Odjava", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Koristite postojeću kategoriju ili kreirajte novu", "filter_modal.select_filter.title": "Filtriraj ovu objavu", "filter_modal.title.status": "Filtriraj objavu", - "filtered_notifications_banner.mentions": "{count, plural, one {pominjanje} few {pominjanja} other {pominjanja}}", - "filtered_notifications_banner.pending_requests": "Obaveštenja od {count, plural, =0 {nikoga koga možda poznajete} one {# osobe koju možda poznajete} few {# osobe koje možda poznajete} other {# osoba koje možda poznajete}}", "filtered_notifications_banner.title": "Filtrirana obaveštenja", "firehose.all": "Sve", "firehose.local": "Ovaj server", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 047e8cf3a8d41c..2c9948299da665 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Упозорење о садржају (опционо)", "confirmation_modal.cancel": "Откажи", "confirmations.block.confirm": "Блокирај", - "confirmations.cancel_follow_request.confirm": "Повуци захтев", - "confirmations.cancel_follow_request.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": "Имате несачуване промене у опису или прегледу медија, да ли ипак хоћете да их одбаците?", - "confirmations.domain_block.confirm": "Блокирај сервер", - "confirmations.domain_block.message": "Да ли сте заиста сигурни да желите да блокирате цео домен {domain}? У већини случајева, довољно је и пожељно неколико циљаних блокирања или игнорисања. Нећете видети садржај са тог домена ни у једној јавној временској линији или у вашим обавештењима. Ваши пратиоци са тог домена ће бити уклоњени.", "confirmations.edit.confirm": "Уреди", "confirmations.edit.message": "Уређивањем ће се обрисати порука коју тренутно састављате. Да ли сте сигурни да желите да наставите?", "confirmations.logout.confirm": "Одјава", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Користите постојећу категорију или креирајте нову", "filter_modal.select_filter.title": "Филтрирај ову објаву", "filter_modal.title.status": "Филтрирај објаву", - "filtered_notifications_banner.mentions": "{count, plural, one {помињање} few {помињања} other {помињања}}", - "filtered_notifications_banner.pending_requests": "Обавештења од {count, plural, =0 {никога кога можда познајете} one {# особе коју можда познајете} few {# особе које можда познајете} other {# особа које можда познајете}}", "filtered_notifications_banner.title": "Филтрирана обавештења", "firehose.all": "Све", "firehose.local": "Овај сервер", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 53e2dde42ea416..b3f70cf2ede5fc 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -37,6 +37,7 @@ "account.followers.empty": "Ingen följer denna användare än.", "account.followers_counter": "{count, plural, one {{counter} följare} other {{counter} följare}}", "account.following": "Följer", + "account.following_counter": "{count, plural, one {{counter} följer} other {{counter} följer}}", "account.follows.empty": "Denna användare följer inte någon än.", "account.go_to_profile": "Gå till profilen", "account.hide_reblogs": "Dölj boostar från @{name}", @@ -168,27 +169,30 @@ "compose_form.spoiler_placeholder": "Innehållsvarning (valfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.confirm": "Blockera", - "confirmations.cancel_follow_request.confirm": "Återkalla förfrågan", - "confirmations.cancel_follow_request.message": "Är du säker på att du vill återkalla din begäran om att följa {name}?", "confirmations.delete.confirm": "Radera", "confirmations.delete.message": "Är du säker på att du vill radera detta inlägg?", + "confirmations.delete.title": "Ta bort inlägg?", "confirmations.delete_list.confirm": "Radera", "confirmations.delete_list.message": "Är du säker på att du vill radera denna lista permanent?", + "confirmations.delete_list.title": "Ta bort listan?", "confirmations.discard_edit_media.confirm": "Kasta", "confirmations.discard_edit_media.message": "Du har osparade ändringar till mediabeskrivningen eller förhandsgranskningen, kasta bort dem ändå?", - "confirmations.domain_block.confirm": "Blockera server", - "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer inte se innehåll från den domänen i den allmänna tidslinjen eller i dina aviseringar. Dina följare från den domänen komer att tas bort.", "confirmations.edit.confirm": "Redigera", "confirmations.edit.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skapa. Är du säker på att du vill fortsätta?", + "confirmations.edit.title": "Skriva över inlägg?", "confirmations.logout.confirm": "Logga ut", "confirmations.logout.message": "Är du säker på att du vill logga ut?", + "confirmations.logout.title": "Logga ut?", "confirmations.mute.confirm": "Tysta", "confirmations.redraft.confirm": "Radera & gör om", "confirmations.redraft.message": "Är du säker på att du vill radera detta inlägg och göra om det? Favoritmarkeringar, boostar och svar till det ursprungliga inlägget kommer förlora sitt sammanhang.", + "confirmations.redraft.title": "Ta bort & gör om inlägget?", "confirmations.reply.confirm": "Svara", "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skapa. Är du säker på att du vill fortsätta?", + "confirmations.reply.title": "Skriva över inlägget?", "confirmations.unfollow.confirm": "Avfölj", "confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?", + "confirmations.unfollow.title": "Avfölj %s?", "conversation.delete": "Radera konversation", "conversation.mark_as_read": "Markera som läst", "conversation.open": "Visa konversation", @@ -296,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Använd en befintlig kategori eller skapa en ny", "filter_modal.select_filter.title": "Filtrera detta inlägg", "filter_modal.title.status": "Filtrera ett inlägg", - "filtered_notifications_banner.mentions": "{count, plural, one {omnämning} other {omnämnanden}}", - "filtered_notifications_banner.pending_requests": "Aviseringar från {count, plural, =0 {ingen} one {en person} other {# personer}} du kanske känner", "filtered_notifications_banner.title": "Filtrerade aviseringar", "firehose.all": "Allt", "firehose.local": "Denna server", @@ -471,6 +473,9 @@ "navigation_bar.security": "Säkerhet", "not_signed_in_indicator.not_signed_in": "Du behöver logga in för att få åtkomst till denna resurs.", "notification.admin.report": "{name} rapporterade {target}", + "notification.admin.report_account": "{name} rapporterade {count, plural, one {ett inlägg} other {# inlägg}} från {target} för {category}", + "notification.admin.report_account_other": "{name} rapporterade {count, plural, one {ett inlägg} other {# inlägg}} från {target}", + "notification.admin.report_statuses": "{name} rapporterade {target} för {category}", "notification.admin.report_statuses_other": "{name} rapporterade {target}", "notification.admin.sign_up": "{name} registrerade sig", "notification.favourite": "{name} favoritmarkerade ditt inlägg", @@ -487,6 +492,7 @@ "notification.moderation_warning.action_silence": "Ditt konto har begränsats.", "notification.moderation_warning.action_suspend": "Ditt konto har stängts av.", "notification.own_poll": "Din röstning har avslutats", + "notification.poll": "En enkät som du röstat i har avslutats", "notification.private_mention": "{name} nämnde dig privat", "notification.reblog": "{name} boostade ditt inlägg", "notification.relationships_severance_event": "Förlorade kontakter med {name}", @@ -502,10 +508,12 @@ "notification_requests.title": "Filtrerade meddelanden", "notifications.clear": "Rensa aviseringar", "notifications.clear_confirmation": "Är du säker på att du vill rensa alla dina aviseringar permanent?", + "notifications.clear_title": "Rensa aviseringar?", "notifications.column_settings.admin.report": "Nya rapporter:", "notifications.column_settings.admin.sign_up": "Nya registreringar:", "notifications.column_settings.alert": "Skrivbordsaviseringar", "notifications.column_settings.beta.category": "Experimentella funktioner", + "notifications.column_settings.beta.grouping": "Gruppera notifikationer", "notifications.column_settings.favourite": "Favoriter:", "notifications.column_settings.filter_bar.advanced": "Visa alla kategorier", "notifications.column_settings.filter_bar.category": "Snabbfilter", @@ -669,6 +677,7 @@ "report.unfollow_explanation": "Du följer detta konto. Avfölj hen för att inte se hens inlägg i ditt hemflöde.", "report_notification.attached_statuses": "bifogade {count, plural, one {{count} inlägg} other {{count} inlägg}}", "report_notification.categories.legal": "Rättsligt", + "report_notification.categories.legal_sentence": "olagligt innehåll", "report_notification.categories.other": "Övrigt", "report_notification.categories.other_sentence": "övrigt", "report_notification.categories.spam": "Skräppost", @@ -702,8 +711,11 @@ "server_banner.about_active_users": "Personer som använt denna server de senaste 30 dagarna (månatligt aktiva användare)", "server_banner.active_users": "aktiva användare", "server_banner.administered_by": "Administrerad av:", + "server_banner.is_one_of_many": "{domain} är en av de många oberoende Mastodon-servrar som du kan använda för att delta i Fediversen.", "server_banner.server_stats": "Serverstatistik:", "sign_in_banner.create_account": "Skapa konto", + "sign_in_banner.follow_anyone": "Följ vem som helst över Fediverse och se allt i kronologisk ordning. Inga algoritmer, inga annonser och inga klickbeten i sikte.", + "sign_in_banner.mastodon_is": "Mastodon är det bästa sättet att hänga med i vad som händer.", "sign_in_banner.sign_in": "Logga in", "sign_in_banner.sso_redirect": "Logga in eller registrera dig", "status.admin_account": "Öppet modereringsgränssnitt för @{name}", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index bb26986b818206..ef3255a7dad623 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -130,7 +130,6 @@ "confirmations.delete_list.message": "இப்பட்டியலை நிரந்தரமாக நீக்க நிச்சயம் விரும்புகிறீர்களா?", "confirmations.discard_edit_media.confirm": "நிராகரி", "confirmations.discard_edit_media.message": "சேமிக்கப்படாத மாற்றங்கள் ஊடக விளக்கம் அல்லது முன்னோட்டத்தில் உள்ளது. அவற்றை நிராகரிக்கவா?", - "confirmations.domain_block.message": "நீங்கள் முழு {domain} களத்தையும் நிச்சயமாக, நிச்சயமாகத் தடுக்க விரும்புகிறீர்களா? பெரும்பாலும் சில குறிப்பிட்ட பயனர்களைத் தடுப்பதே போதுமானது. முழு களத்தையும் தடுத்தால், அதிலிருந்து வரும் எந்தப் பதிவையும் உங்களால் காண முடியாது, மேலும் அப்பதிவுகள் குறித்த அறிவிப்புகளும் உங்களுக்கு வராது. அந்தக் களத்தில் இருக்கும் பின்தொடர்பவர்கள் உங்கள் பக்கத்திலிருந்து நீக்கப்படுவார்கள்.", "confirmations.logout.confirm": "வெளியேறு", "confirmations.logout.message": "நிச்சயமாக நீங்கள் வெளியேற விரும்புகிறீர்களா?", "confirmations.mute.confirm": "அமைதியாக்கு", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 471890b9a36646..d3e1026889fb3e 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -73,7 +73,6 @@ "confirmations.delete.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించాలనుకుంటున్నారా?", "confirmations.delete_list.confirm": "తొలగించు", "confirmations.delete_list.message": "మీరు ఖచ్చితంగా ఈ జాబితాను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", - "confirmations.domain_block.message": "మీరు నిజంగా నిజంగా మొత్తం {domain} ని బ్లాక్ చేయాలనుకుంటున్నారా? చాలా సందర్భాలలో కొన్ని లక్ష్యంగా ఉన్న బ్లాక్స్ లేదా మ్యూట్స్ సరిపోతాయి మరియు ఉత్తమమైనవి. మీరు ఆ డొమైన్ నుండి కంటెంట్ను ఏ ప్రజా కాలక్రమాలలో లేదా మీ నోటిఫికేషన్లలో చూడలేరు. ఆ డొమైన్ నుండి మీ అనుచరులు తీసివేయబడతారు.", "confirmations.mute.confirm": "మ్యూట్ చేయి", "confirmations.redraft.confirm": "తొలగించు & తిరగరాయు", "confirmations.reply.confirm": "ప్రత్యుత్తరమివ్వు", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index ab8179863c1d3d..b4d259f174fb4f 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "คำเตือนเนื้อหา (ไม่จำเป็น)", "confirmation_modal.cancel": "ยกเลิก", "confirmations.block.confirm": "ปิดกั้น", - "confirmations.cancel_follow_request.confirm": "ถอนคำขอ", - "confirmations.cancel_follow_request.message": "คุณแน่ใจหรือไม่ว่าต้องการถอนคำขอเพื่อติดตาม {name} ของคุณ?", "confirmations.delete.confirm": "ลบ", "confirmations.delete.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้?", + "confirmations.delete.title": "ลบโพสต์?", "confirmations.delete_list.confirm": "ลบ", "confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?", + "confirmations.delete_list.title": "ลบรายการ?", "confirmations.discard_edit_media.confirm": "ละทิ้ง", "confirmations.discard_edit_media.message": "คุณมีการเปลี่ยนแปลงคำอธิบายหรือตัวอย่างสื่อที่ยังไม่ได้บันทึก ละทิ้งการเปลี่ยนแปลงเหล่านั้นต่อไป?", - "confirmations.domain_block.confirm": "ปิดกั้นเซิร์ฟเวอร์", - "confirmations.domain_block.message": "คุณแน่ใจจริง ๆ หรือไม่ว่าต้องการปิดกั้นทั้ง {domain}? ในกรณีส่วนใหญ่ การปิดกั้นหรือการซ่อนแบบกำหนดเป้าหมายไม่กี่รายการนั้นเพียงพอและเป็นที่นิยม คุณจะไม่เห็นเนื้อหาจากโดเมนนั้นในเส้นเวลาสาธารณะใด ๆ หรือการแจ้งเตือนของคุณ จะเอาผู้ติดตามของคุณจากโดเมนนั้นออก", "confirmations.edit.confirm": "แก้ไข", "confirmations.edit.message": "การแก้ไขในตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียนในปัจจุบัน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "confirmations.edit.title": "เขียนทับโพสต์?", "confirmations.logout.confirm": "ออกจากระบบ", "confirmations.logout.message": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?", + "confirmations.logout.title": "ออกจากระบบ?", "confirmations.mute.confirm": "ซ่อน", "confirmations.redraft.confirm": "ลบแล้วร่างใหม่", "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะสูญหาย และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน", + "confirmations.redraft.title": "ลบแล้วร่างโพสต์ใหม่?", "confirmations.reply.confirm": "ตอบกลับ", "confirmations.reply.message": "การตอบกลับในตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียนในปัจจุบัน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "confirmations.reply.title": "เขียนทับโพสต์?", "confirmations.unfollow.confirm": "เลิกติดตาม", "confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?", + "confirmations.unfollow.title": "เลิกติดตามผู้ใช้?", "conversation.delete": "ลบการสนทนา", "conversation.mark_as_read": "ทำเครื่องหมายว่าอ่านแล้ว", "conversation.open": "ดูการสนทนา", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "ใช้หมวดหมู่ที่มีอยู่หรือสร้างหมวดหมู่ใหม่", "filter_modal.select_filter.title": "กรองโพสต์นี้", "filter_modal.title.status": "กรองโพสต์", - "filtered_notifications_banner.mentions": "{count, plural, other {การกล่าวถึง}}", - "filtered_notifications_banner.pending_requests": "การแจ้งเตือนจาก {count, plural, =0 {ไม่มีใคร} other {# คน}} ที่คุณอาจรู้จัก", "filtered_notifications_banner.title": "การแจ้งเตือนที่กรองอยู่", "firehose.all": "ทั้งหมด", "firehose.local": "เซิร์ฟเวอร์นี้", @@ -443,7 +444,8 @@ "mute_modal.title": "ซ่อนผู้ใช้?", "mute_modal.you_wont_see_mentions": "คุณจะไม่เห็นโพสต์ที่กล่าวถึงเขา", "mute_modal.you_wont_see_posts": "เขายังคงสามารถเห็นโพสต์ของคุณ แต่คุณจะไม่เห็นโพสต์ของเขา", - "name_and_others": "{name} และ {count, plural, one {# อื่น ๆ } other {# อื่น ๆ}}", + "name_and_others": "{name} และ {count, plural, other {# อื่น ๆ}}", + "name_and_others_with_link": "{name} และ {count, plural, other {# อื่น ๆ}}", "navigation_bar.about": "เกี่ยวกับ", "navigation_bar.advanced_interface": "เปิดในส่วนติดต่อเว็บขั้นสูง", "navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่", @@ -471,7 +473,10 @@ "navigation_bar.security": "ความปลอดภัย", "not_signed_in_indicator.not_signed_in": "คุณจำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงทรัพยากรนี้", "notification.admin.report": "{name} ได้รายงาน {target}", - "notification.admin.report_statuses_other": "{name} รายงาน {target}", + "notification.admin.report_account": "{name} ได้รายงาน {count, plural, other {# โพสต์}}จาก {target} สำหรับ {category}", + "notification.admin.report_account_other": "{name} ได้รายงาน {count, plural, other {# โพสต์}}จาก {target}", + "notification.admin.report_statuses": "{name} ได้รายงาน {target} สำหรับ {category}", + "notification.admin.report_statuses_other": "{name} ได้รายงาน {target}", "notification.admin.sign_up": "{name} ได้ลงทะเบียน", "notification.favourite": "{name} ได้ชื่นชอบโพสต์ของคุณ", "notification.follow": "{name} ได้ติดตามคุณ", @@ -487,7 +492,8 @@ "notification.moderation_warning.action_silence": "จำกัดบัญชีของคุณแล้ว", "notification.moderation_warning.action_suspend": "ระงับบัญชีของคุณแล้ว", "notification.own_poll": "การสำรวจความคิดเห็นของคุณได้สิ้นสุดแล้ว", - "notification.poll": "โพลที่คุณโหวตได้จบลงแล้ว", + "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว", + "notification.private_mention": "{name} ได้กล่าวถึงคุณแบบส่วนตัว", "notification.reblog": "{name} ได้ดันโพสต์ของคุณ", "notification.relationships_severance_event": "สูญเสียการเชื่อมต่อกับ {name}", "notification.relationships_severance_event.account_suspension": "ผู้ดูแลจาก {from} ได้ระงับ {target} ซึ่งหมายความว่าคุณจะไม่สามารถรับการอัปเดตจากเขาหรือโต้ตอบกับเขาได้อีกต่อไป", @@ -502,9 +508,12 @@ "notification_requests.title": "การแจ้งเตือนที่กรองอยู่", "notifications.clear": "ล้างการแจ้งเตือน", "notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?", + "notifications.clear_title": "ล้างการแจ้งเตือน?", "notifications.column_settings.admin.report": "รายงานใหม่:", "notifications.column_settings.admin.sign_up": "การลงทะเบียนใหม่:", "notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป", + "notifications.column_settings.beta.category": "คุณลักษณะการทดลอง", + "notifications.column_settings.beta.grouping": "การแจ้งเตือนกลุ่ม", "notifications.column_settings.favourite": "รายการโปรด:", "notifications.column_settings.filter_bar.advanced": "แสดงหมวดหมู่ทั้งหมด", "notifications.column_settings.filter_bar.category": "แถบตัวกรองด่วน", @@ -668,12 +677,13 @@ "report.unfollow_explanation": "คุณกำลังติดตามบัญชีนี้ เพื่อไม่ให้เห็นโพสต์ของเขาในฟีดหน้าแรกของคุณอีกต่อไป ให้เลิกติดตามเขา", "report_notification.attached_statuses": "{count, plural, other {{count} โพสต์}}ที่แนบมา", "report_notification.categories.legal": "กฎหมาย", + "report_notification.categories.legal_sentence": "เนื้อหาที่ผิดกฎหมาย", "report_notification.categories.other": "อื่น ๆ", "report_notification.categories.other_sentence": "อื่น ๆ", "report_notification.categories.spam": "สแปม", "report_notification.categories.spam_sentence": "สแปม", "report_notification.categories.violation": "การละเมิดกฎ", - "report_notification.categories.violation_sentence": "ละเมิดกฎ", + "report_notification.categories.violation_sentence": "การละเมิดกฎ", "report_notification.open": "รายงานที่เปิด", "search.no_recent_searches": "ไม่มีการค้นหาล่าสุด", "search.placeholder": "ค้นหา", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index e581978f2419a4..cf76b31f927de0 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -130,15 +130,12 @@ "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", "confirmation_modal.cancel": "o pini", "confirmations.block.confirm": "o weka", - "confirmations.cancel_follow_request.confirm": "o weka e wile sina", - "confirmations.cancel_follow_request.message": "sina awen ala awen wile weka e wile kute sina lon {name}?", "confirmations.delete.confirm": "o weka", "confirmations.delete.message": "sina wile ala wile weka e toki ni?", "confirmations.delete_list.confirm": "o weka", "confirmations.delete_list.message": "sina wile ala wile weka e lipu ni?", "confirmations.discard_edit_media.confirm": "o weka", "confirmations.discard_edit_media.message": "toki sitelen anu lukin lili sitelen la ante pi awen ala li lon. sina wile weka e ante ni?", - "confirmations.domain_block.message": "sina wile ala a wile a len e ma {domain} ꞏ ken suli la len jan taso li pona ꞏ len pi ma ni la sina ken ala lukin e ijo pi ma ni lon lipu toki ale anu lukin toki ꞏ len ni la jan kute sina pi ma ni li weka", "confirmations.edit.confirm": "o ante", "confirmations.edit.message": "sina ante e toki sina la toki pali sina li weka. sina wile ala wile e ni?", "confirmations.logout.confirm": "o weka", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index ae7b5ba25dc314..3b8238fe06de3a 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "İçerik uyarısı (isteğe bağlı)", "confirmation_modal.cancel": "İptal", "confirmations.block.confirm": "Engelle", - "confirmations.cancel_follow_request.confirm": "İsteği geri çek", - "confirmations.cancel_follow_request.message": "{name} kişisini takip etme isteğini geri çekmek istediğinden emin misin?", "confirmations.delete.confirm": "Sil", "confirmations.delete.message": "Bu tootu silmek istediğinden emin misin?", + "confirmations.delete.title": "Gönderiyi sil?", "confirmations.delete_list.confirm": "Sil", "confirmations.delete_list.message": "Bu listeyi kalıcı olarak silmek istediğinden emin misin?", + "confirmations.delete_list.title": "Listeyi sil?", "confirmations.discard_edit_media.confirm": "Vazgeç", "confirmations.discard_edit_media.message": "Medya açıklaması veya ön izlemede kaydedilmemiş değişiklikleriniz var, yine de vazgeçmek istiyor musunuz?", - "confirmations.domain_block.confirm": "Sunucuyu engelle", - "confirmations.domain_block.message": "{domain} alanının tamamını engellemek istediğinden gerçekten emin misin? Genellikle hedeflenen birkaç engelleme veya sessize alma yeterlidir ve tercih edilir. Bu alan adından gelen içeriği herhangi bir genel zaman çizelgesinde veya bildirimlerinde görmezsin. Bu alan adındaki takipçilerin kaldırılır.", "confirmations.edit.confirm": "Düzenle", "confirmations.edit.message": "Şimdi düzenlersen şu an oluşturduğun iletinin üzerine yazılır. Devam etmek istediğine emin misin?", + "confirmations.edit.title": "Gönderinin üzerine yaz?", "confirmations.logout.confirm": "Oturumu kapat", "confirmations.logout.message": "Oturumu kapatmak istediğinden emin misin?", + "confirmations.logout.title": "Oturumu kapat?", "confirmations.mute.confirm": "Sessize al", "confirmations.redraft.confirm": "Sil Düzenle ve yeniden paylaş", "confirmations.redraft.message": "Bu gönderiyi silip taslak haline getirmek istediğinize emin misiniz? Mevcut favoriler ve boostlar silinecek ve gönderiye verilen yanıtlar başıboş kalacak.", + "confirmations.redraft.title": "Gönderiyi sil veya taslağa dönüştür?", "confirmations.reply.confirm": "Yanıtla", "confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğun mesajın üzerine yazılır. Devam etmek istediğine emin misin?", + "confirmations.reply.title": "Gönderinin üzerine yaz?", "confirmations.unfollow.confirm": "Takibi bırak", "confirmations.unfollow.message": "{name} adlı kullanıcıyı takibi bırakmak istediğinden emin misin?", + "confirmations.unfollow.title": "Kullanıcıyı takipten çık?", "conversation.delete": "Sohbeti sil", "conversation.mark_as_read": "Okundu olarak işaretle", "conversation.open": "Sohbeti görüntüle", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Mevcut bir kategoriyi kullan veya yeni bir tane oluştur", "filter_modal.select_filter.title": "Bu gönderiyi süzgeçle", "filter_modal.title.status": "Bir gönderi süzgeçle", - "filtered_notifications_banner.mentions": "{count, plural, one {bahsetme} other {bahsetme}}", - "filtered_notifications_banner.pending_requests": "Bildiğiniz {count, plural, =0 {hiç kimseden} one {bir kişiden} other {# kişiden}} bildirim", "filtered_notifications_banner.title": "Filtrelenmiş bildirimler", "firehose.all": "Tümü", "firehose.local": "Bu sunucu", @@ -507,6 +508,7 @@ "notification_requests.title": "Filtrelenmiş bildirimler", "notifications.clear": "Bildirimleri temizle", "notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?", + "notifications.clear_title": "Bildirimleri temizle?", "notifications.column_settings.admin.report": "Yeni bildirimler:", "notifications.column_settings.admin.sign_up": "Yeni kayıtlar:", "notifications.column_settings.alert": "Masaüstü bildirimleri", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index baba3190dc39a6..1c150c99c6c4b9 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -132,15 +132,12 @@ "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "Баш тарту", "confirmations.block.confirm": "Блоклау", - "confirmations.cancel_follow_request.confirm": "Сорауны баш тарту", - "confirmations.cancel_follow_request.message": "Сез абонемент соравыгызны кире кайтарырга телисез {name}?", "confirmations.delete.confirm": "Бетерү", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "Бетерү", "confirmations.delete_list.message": "Сез бу исемлекне мәңгегә бетерергә телисезме?", "confirmations.discard_edit_media.confirm": "Баш тарту", "confirmations.discard_edit_media.message": "Сезнең медиа тасвирламасында яки алдан карау өчен сакланмаган үзгәрешләр бармы? ", - "confirmations.domain_block.message": "Сез чыннан да барысын да блокларга телисез {domain}? Күпчелек очракта берничә максатлы блоклар яки тавышсызлар җитәрлек һәм өстенлекле. Сез бу доменнан эчтәлекне җәмәгать срокларында яки хәбәрләрегездә күрмәячәксез. Бу доменнан сезнең шәкертләр бетереләчәк.", "confirmations.edit.confirm": "Үзгәртү", "confirmations.logout.confirm": "Чыгу", "confirmations.logout.message": "Сез чыгарга телисезме?", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index b5cd1f7b283f6d..9535f1f445f443 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Попередження про вміст (необов'язково)", "confirmation_modal.cancel": "Скасувати", "confirmations.block.confirm": "Заблокувати", - "confirmations.cancel_follow_request.confirm": "Відкликати запит", - "confirmations.cancel_follow_request.message": "Ви дійсно бажаєте відкликати запит на стеження за {name}?", "confirmations.delete.confirm": "Видалити", "confirmations.delete.message": "Ви впевнені, що хочете видалити цей допис?", + "confirmations.delete.title": "Видалити допис?", "confirmations.delete_list.confirm": "Видалити", "confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?", + "confirmations.delete_list.title": "Видалити список?", "confirmations.discard_edit_media.confirm": "Відкинути", "confirmations.discard_edit_media.message": "У вас є незбережені зміни в описі медіа або попереднього перегляду, все одно відкинути їх?", - "confirmations.domain_block.confirm": "Блокувати сервер", - "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або приховати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.", "confirmations.edit.confirm": "Змінити", "confirmations.edit.message": "Редагування перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", + "confirmations.edit.title": "Перезаписати допис?", "confirmations.logout.confirm": "Вийти", "confirmations.logout.message": "Ви впевнені, що хочете вийти?", + "confirmations.logout.title": "Вийти?", "confirmations.mute.confirm": "Приховати", "confirmations.redraft.confirm": "Видалити та виправити", "confirmations.redraft.message": "Ви впевнені, що хочете видалити цей допис та переписати його? Додавання у вибране та поширення буде втрачено, а відповіді на оригінальний допис залишаться без першоджерела.", + "confirmations.redraft.title": "Видалити та переробити допис?", "confirmations.reply.confirm": "Відповісти", "confirmations.reply.message": "Нова відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", + "confirmations.reply.title": "Перезаписати допис?", "confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", + "confirmations.unfollow.title": "Відписатися від користувача?", "conversation.delete": "Видалити бесіду", "conversation.mark_as_read": "Позначити як прочитане", "conversation.open": "Переглянути бесіду", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Використати наявну категорію або створити нову", "filter_modal.select_filter.title": "Фільтрувати цей допис", "filter_modal.title.status": "Фільтрувати допис", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}", - "filtered_notifications_banner.pending_requests": "Сповіщення від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати", "filtered_notifications_banner.title": "Відфільтровані сповіщення", "firehose.all": "Всі", "firehose.local": "Цей сервер", @@ -507,6 +508,7 @@ "notification_requests.title": "Відфільтровані сповіщення", "notifications.clear": "Очистити сповіщення", "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщення?", + "notifications.clear_title": "Очистити сповіщення?", "notifications.column_settings.admin.report": "Нові скарги:", "notifications.column_settings.admin.sign_up": "Нові реєстрації:", "notifications.column_settings.alert": "Сповіщення стільниці", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index 3c61846e9c63a7..d82e52ae505464 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -126,7 +126,6 @@ "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "ڈیلیٹ", "confirmations.delete_list.message": "کیا آپ واقعی اس فہرست کو مستقل طور پر ڈیلیٹ کرنا چاہتے ہیں؟", - "confirmations.domain_block.message": "کیا آپ واقعی، واقعی یقین رکھتے ہیں کہ آپ پورے {domain} کو بلاک کرنا چاہتے ہیں؟ زیادہ تر معاملات میں چند ٹارگٹیڈ بلاکس یا خاموش کرنا کافی اور افضل ہیں۔ آپ اس ڈومین کا مواد کسی بھی عوامی ٹائم لائنز یا اپنی اطلاعات میں نہیں دیکھیں گے۔ اس ڈومین سے آپ کے پیروکاروں کو ہٹا دیا جائے گا۔", "confirmations.logout.confirm": "لاگ آؤٹ", "confirmations.logout.message": "کیا واقعی آپ لاگ آؤٹ ہونا چاہتے ہیں؟", "confirmations.mute.confirm": "خاموش", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index 90ad67d2879903..d0bcb90924cfc3 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -130,15 +130,12 @@ "compose_form.spoiler.unmarked": "Kontent haqida ogohlantirish qo'shing", "confirmation_modal.cancel": "Bekor qilish", "confirmations.block.confirm": "Bloklash", - "confirmations.cancel_follow_request.confirm": "Bekor qilish", - "confirmations.cancel_follow_request.message": "Haqiqatan ham {name}ga obuna boʻlish soʻrovingizni qaytarib olmoqchimisiz?", "confirmations.delete.confirm": "Oʻchirish", "confirmations.delete.message": "Haqiqatan ham bu postni oʻchirib tashlamoqchimisiz?", "confirmations.delete_list.confirm": "Oʻchirish", "confirmations.delete_list.message": "Haqiqatan ham bu roʻyxatni butunlay oʻchirib tashlamoqchimisiz?", "confirmations.discard_edit_media.confirm": "Bekor qilish", "confirmations.discard_edit_media.message": "Sizda media tavsifi yoki oldindan ko‘rishda saqlanmagan o‘zgarishlar bor, ular baribir bekor qilinsinmi?", - "confirmations.domain_block.message": "Haqiqatan ham, {domain} ni butunlay bloklamoqchimisiz? Ko'pgina hollarda bir nechta maqsadli bloklar yoki ovozni o'chirish etarli va afzaldir. Siz oʻsha domendagi kontentni hech qanday umumiy vaqt jadvallarida yoki bildirishnomalaringizda koʻrmaysiz. Bu domendagi obunachilaringiz olib tashlanadi.", "confirmations.logout.confirm": "Chiqish", "confirmations.logout.message": "Chiqishingizga aminmisiz?", "confirmations.mute.confirm": "Ovozsiz", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 0f2cc996a2e4e1..a3cec8185db19d 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Nội dung ẩn (tùy chọn)", "confirmation_modal.cancel": "Hủy bỏ", "confirmations.block.confirm": "Chặn", - "confirmations.cancel_follow_request.confirm": "Thu hồi yêu cầu", - "confirmations.cancel_follow_request.message": "Bạn có chắc muốn thu hồi yêu cầu theo dõi của bạn với {name}?", "confirmations.delete.confirm": "Xóa bỏ", "confirmations.delete.message": "Bạn thật sự muốn xóa tút này?", + "confirmations.delete.title": "Xóa tút?", "confirmations.delete_list.confirm": "Xóa bỏ", "confirmations.delete_list.message": "Bạn thật sự muốn xóa vĩnh viễn danh sách này?", + "confirmations.delete_list.title": "Xóa danh sách?", "confirmations.discard_edit_media.confirm": "Bỏ qua", "confirmations.discard_edit_media.message": "Bạn chưa lưu thay đổi đối với phần mô tả hoặc bản xem trước của media, vẫn bỏ luôn?", - "confirmations.domain_block.confirm": "Chặn máy chủ", - "confirmations.domain_block.message": "Bạn thật sự muốn ẩn toàn bộ nội dung từ {domain}? Sẽ hợp lý hơn nếu bạn chỉ chặn hoặc ẩn một vài tài khoản cụ thể. Ẩn toàn bộ nội dung từ máy chủ sẽ khiến bạn không còn thấy nội dung từ máy chủ đó ở bất kỳ nơi nào, kể cả thông báo. Người quan tâm bạn từ máy chủ đó cũng sẽ bị xóa luôn.", "confirmations.edit.confirm": "Sửa", "confirmations.edit.message": "Nội dung tút cũ sẽ bị ghi đè, bạn có tiếp tục?", + "confirmations.edit.title": "Viết đè lên tút cũ?", "confirmations.logout.confirm": "Đăng xuất", "confirmations.logout.message": "Bạn có thật sự muốn thoát?", + "confirmations.logout.title": "Đăng xuất?", "confirmations.mute.confirm": "Ẩn", "confirmations.redraft.confirm": "Xóa & viết lại", "confirmations.redraft.message": "Bạn thật sự muốn xóa tút và viết lại? Điều này sẽ xóa mất những lượt thích và đăng lại của tút, cũng như những trả lời sẽ không còn nội dung gốc.", + "confirmations.redraft.title": "Xóa & viết lại?", "confirmations.reply.confirm": "Trả lời", "confirmations.reply.message": "Nội dung bạn đang soạn thảo sẽ bị ghi đè, bạn có tiếp tục?", + "confirmations.reply.title": "Viết đè lên tút cũ?", "confirmations.unfollow.confirm": "Bỏ theo dõi", "confirmations.unfollow.message": "Bạn thật sự muốn bỏ theo dõi {name}?", + "confirmations.unfollow.title": "Bỏ theo dõi?", "conversation.delete": "Xóa tin nhắn này", "conversation.mark_as_read": "Đánh dấu là đã đọc", "conversation.open": "Xem toàn bộ tin nhắn", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Sử dụng một danh mục hiện có hoặc tạo một danh mục mới", "filter_modal.select_filter.title": "Lọc tút này", "filter_modal.title.status": "Lọc một tút", - "filtered_notifications_banner.mentions": "{count, plural, other {lượt nhắc}}", - "filtered_notifications_banner.pending_requests": "Thông báo từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết", + "filtered_notifications_banner.pending_requests": "Từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết", "filtered_notifications_banner.title": "Thông báo đã lọc", "firehose.all": "Toàn bộ", "firehose.local": "Máy chủ này", @@ -507,6 +509,7 @@ "notification_requests.title": "Thông báo đã lọc", "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.clear_title": "Xóa hết thông báo?", "notifications.column_settings.admin.report": "Báo cáo mới:", "notifications.column_settings.admin.sign_up": "Người mới tham gia:", "notifications.column_settings.alert": "Báo trên máy tính", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index f6c0feecfdb160..1095502fb9b7f0 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -1,12 +1,12 @@ { - "about.blocks": "服务器被限制", + "about.blocks": "受限服务器", "about.contact": "联系方式:", "about.disclaimer": "Mastodon 是自由的开源软件,商标由 Mastodon gGmbH 持有。", "about.domain_blocks.no_reason_available": "原因不可用", "about.domain_blocks.preamble": "通常来说,在 Mastodon 上,你可以浏览联邦宇宙中任何一台服务器上的内容,并且和上面的用户互动。但其中一些在本服务器上被设置为例外。", "about.domain_blocks.silenced.explanation": "除非明确地搜索并关注对方,否则你不会看到来自此服务器的用户信息与内容。", - "about.domain_blocks.silenced.title": "已隐藏", - "about.domain_blocks.suspended.explanation": "此服务器的数据将不会被处理、存储或者交换,本站也将无法和来自此服务器的用户互动或者交流。", + "about.domain_blocks.silenced.title": "访问受限", + "about.domain_blocks.suspended.explanation": "不处理、存储或交换来自本服务器的任何数据,不可能与本服务器上的用户进行任何交互或通信。", "about.domain_blocks.suspended.title": "已封禁", "about.not_available": "此信息在当前服务器尚不可用。", "about.powered_by": "由 {mastodon} 驱动的去中心化社交媒体", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} 已经向你发送了关注请求", "account.share": "分享 @{name} 的个人资料页", "account.show_reblogs": "显示来自 @{name} 的转嘟", - "account.statuses_counter": "{count, plural, other {{counter} 嘟文}}", + "account.statuses_counter": "{count, plural, other {{counter} 条嘟文}}", "account.unblock": "取消屏蔽 @{name}", "account.unblock_domain": "取消屏蔽 {domain} 域名", "account.unblock_short": "取消屏蔽", @@ -81,7 +81,7 @@ "admin.impact_report.instance_accounts": "将要删除的账户资料", "admin.impact_report.instance_followers": "本实例用户即将丢失的关注者", "admin.impact_report.instance_follows": "对方实例用户将会丢失的关注者", - "admin.impact_report.title": "影响摘要", + "admin.impact_report.title": "权重一览", "alert.rate_limited.message": "请在 {retry_time, time, medium} 后重试。", "alert.rate_limited.title": "频率受限", "alert.unexpected.message": "发生了意外错误。", @@ -89,14 +89,14 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未处理)", "audio.hide": "隐藏音频", - "block_modal.remote_users_caveat": "我们将要求服务器 {domain} 尊重您的决定。然而,无法保证对方一定遵从,因为某些服务器可能会以不同的方式处理屏蔽操作。公开嘟文仍然可能对未登录用户可见。", - "block_modal.show_less": "显示更少", - "block_modal.show_more": "显示更多", + "block_modal.remote_users_caveat": "我们将要求服务器 {domain} 尊重您的决定。然而,我们无法保证对方一定遵从,因为某些服务器可能会以不同的方案处理屏蔽操作。公开嘟文仍然可能对未登录的用户可见。", + "block_modal.show_less": "隐藏", + "block_modal.show_more": "展开", "block_modal.they_cant_mention": "他们不能提及或关注你。", - "block_modal.they_cant_see_posts": "他们看不到你的嘟文,你也看不到他们的嘟文。", - "block_modal.they_will_know": "他们可以看到他们被屏蔽。", - "block_modal.title": "屏蔽用户?", - "block_modal.you_wont_see_mentions": "你不会看到提及他们的嘟文。", + "block_modal.they_cant_see_posts": "嘟文将被设置为互相不可见。", + "block_modal.they_will_know": "他们将会获知他们被屏蔽。", + "block_modal.title": "屏蔽该用户?", + "block_modal.you_wont_see_mentions": "你将无法看到提及他们的嘟文。", "boost_modal.combo": "下次按住 {combo} 即可跳过此提示", "bundle_column_error.copy_stacktrace": "复制错误报告", "bundle_column_error.error.body": "请求的页面无法渲染,可能是代码出现错误或浏览器存在兼容性问题。", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "内容警告 (可选)", "confirmation_modal.cancel": "取消", "confirmations.block.confirm": "屏蔽", - "confirmations.cancel_follow_request.confirm": "撤回请求", - "confirmations.cancel_follow_request.message": "确定撤回关注 {name} 的请求吗?", "confirmations.delete.confirm": "删除", "confirmations.delete.message": "你确定要删除这条嘟文吗?", + "confirmations.delete.title": "删除嘟文?", "confirmations.delete_list.confirm": "删除", "confirmations.delete_list.message": "确定永久删除这个列表吗?", + "confirmations.delete_list.title": "删除列表?", "confirmations.discard_edit_media.confirm": "丢弃", "confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍要丢弃吗?", - "confirmations.domain_block.confirm": "屏蔽服务器", - "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,对几个特定的用户进行屏蔽或禁用对他们的消息提醒就足够了。屏蔽后,来自该域名的内容将不再出现在你任何的公共时间轴或通知列表里,你来自该域名下的关注者也将被移除。", "confirmations.edit.confirm": "编辑", "confirmations.edit.message": "编辑此消息将会覆盖当前正在撰写的信息。仍要继续吗?", + "confirmations.edit.title": "覆盖嘟文?", "confirmations.logout.confirm": "退出登录", "confirmations.logout.message": "确定要退出登录吗?", + "confirmations.logout.title": "退出登录?", "confirmations.mute.confirm": "隐藏", "confirmations.redraft.confirm": "删除并重新编辑", "confirmations.redraft.message": "确定删除这条嘟文并重写吗?所有相关的喜欢和转嘟都将丢失,嘟文的回复也会失去关联。", + "confirmations.redraft.title": "删除并重新嘟文?", "confirmations.reply.confirm": "回复", "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?", + "confirmations.reply.title": "覆盖嘟文?", "confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", + "confirmations.unfollow.title": "取消关注用户?", "conversation.delete": "删除对话", "conversation.mark_as_read": "标记为已读", "conversation.open": "查看对话", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "使用一个已存在类别,或创建一个新类别", "filter_modal.select_filter.title": "过滤此嘟文", "filter_modal.title.status": "过滤一条嘟文", - "filtered_notifications_banner.mentions": "{count, plural, other {提及}}", - "filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}的通知", + "filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}", "filtered_notifications_banner.title": "通知(已过滤)", "firehose.all": "全部", "firehose.local": "此服务器", @@ -507,6 +509,7 @@ "notification_requests.title": "通知(已过滤)", "notifications.clear": "清空通知列表", "notifications.clear_confirmation": "你确定要永久清空通知列表吗?", + "notifications.clear_title": "清空通知?", "notifications.column_settings.admin.report": "新举报:", "notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.alert": "桌面通知", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 4b717a77dab751..389b5c4a3a5a04 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -166,20 +166,18 @@ "compose_form.spoiler_placeholder": "內容警告 (選用)", "confirmation_modal.cancel": "取消", "confirmations.block.confirm": "封鎖", - "confirmations.cancel_follow_request.confirm": "撤回請求", - "confirmations.cancel_follow_request.message": "您確定要撤回追蹤 {name} 的請求嗎?", "confirmations.delete.confirm": "刪除", "confirmations.delete.message": "你確定要刪除這文章嗎?", + "confirmations.delete.title": "刪除帖文?", "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您在媒體描述或預覽有尚未儲存的變更。確定要捨棄它們嗎?", - "confirmations.domain_block.confirm": "封鎖伺服器", - "confirmations.domain_block.message": "你真的真的確定要封鎖整個 {domain} ?多數情況下,封鎖或靜音幾個特定目標就已經有效,也是比較建議的做法。若然封鎖全站,你將不會再在這裏看到該站的內容和通知。來自該站的關注者亦會被移除。", "confirmations.edit.confirm": "編輯", "confirmations.edit.message": "現在編輯將會覆蓋你目前正在撰寫的訊息。你確定要繼續嗎?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "確定要登出嗎?", + "confirmations.logout.title": "登出?", "confirmations.mute.confirm": "靜音", "confirmations.redraft.confirm": "刪除並編輯", "confirmations.redraft.message": "你確定要移除並重新起草這篇帖文嗎?你將會失去最愛和轉推,而回覆也會與原始帖文斷開連接。", @@ -294,8 +292,6 @@ "filter_modal.select_filter.subtitle": "使用既有類別,或創建一個新類別", "filter_modal.select_filter.title": "過濾此帖文", "filter_modal.title.status": "過濾一則帖文", - "filtered_notifications_banner.mentions": "{count, plural, one {則提及} other {則提及}}", - "filtered_notifications_banner.pending_requests": "來自 {count, plural, =0 {0 位} other {# 位}}你可能認識的人的通知", "filtered_notifications_banner.title": "已過濾之通知", "firehose.all": "全部", "firehose.local": "本伺服器", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index dca4cd134a2ab2..bd4f89169f5ff1 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "內容警告 (可選的)", "confirmation_modal.cancel": "取消", "confirmations.block.confirm": "封鎖", - "confirmations.cancel_follow_request.confirm": "收回跟隨請求", - "confirmations.cancel_follow_request.message": "您確定要收回跟隨 {name} 的請求嗎?", "confirmations.delete.confirm": "刪除", "confirmations.delete.message": "您確定要刪除這則嘟文嗎?", + "confirmations.delete.title": "是否刪除該嘟文?", "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "您確定要永久刪除此列表嗎?", + "confirmations.delete_list.title": "是否刪除該列表?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您於媒體描述或預覽區塊有未儲存的變更。是否要捨棄這些變更?", - "confirmations.domain_block.confirm": "封鎖伺服器", - "confirmations.domain_block.message": "您真的非常確定要封鎖整個 {domain} 網域嗎?大部分情況下,封鎖或靜音少數特定的帳號就能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。", "confirmations.edit.confirm": "編輯", "confirmations.edit.message": "編輯嘟文將覆蓋掉您目前正在撰寫之嘟文內容。您是否仍要繼續?", + "confirmations.edit.title": "是否覆寫該嘟文?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "您確定要登出嗎?", + "confirmations.logout.title": "您確定要登出嗎?", "confirmations.mute.confirm": "靜音", "confirmations.redraft.confirm": "刪除並重新編輯", "confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去這則嘟文之轉嘟及最愛,且對此嘟文之回覆會變成獨立的嘟文。", + "confirmations.redraft.title": "是否刪除並重新編輯該嘟文?", "confirmations.reply.confirm": "回覆", "confirmations.reply.message": "回覆嘟文將覆蓋掉您目前正在撰寫之嘟文內容。您是否仍要繼續?", + "confirmations.reply.title": "是否覆寫該嘟文?", "confirmations.unfollow.confirm": "取消跟隨", "confirmations.unfollow.message": "您確定要取消跟隨 {name} 嗎?", + "confirmations.unfollow.title": "是否取消跟隨該使用者?", "conversation.delete": "刪除對話", "conversation.mark_as_read": "標記為已讀", "conversation.open": "檢視對話", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "使用既有的類別或是新增", "filter_modal.select_filter.title": "過濾此嘟文", "filter_modal.title.status": "過濾一則嘟文", - "filtered_notifications_banner.mentions": "{count, plural, other {# 則提及}}", - "filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}} 之通知", + "filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}}", "filtered_notifications_banner.title": "已過濾之通知", "firehose.all": "全部", "firehose.local": "本站", @@ -507,6 +509,7 @@ "notification_requests.title": "已過濾之通知", "notifications.clear": "清除通知", "notifications.clear_confirmation": "您確定要永久清除您的通知嗎?", + "notifications.clear_title": "是否清除推播通知?", "notifications.column_settings.admin.report": "新檢舉報告:", "notifications.column_settings.admin.sign_up": "新註冊帳號:", "notifications.column_settings.alert": "桌面通知", diff --git a/app/javascript/mastodon/models/notification_group.ts b/app/javascript/mastodon/models/notification_group.ts index 5fe1e6f2e43dee..76034e644e9d8d 100644 --- a/app/javascript/mastodon/models/notification_group.ts +++ b/app/javascript/mastodon/models/notification_group.ts @@ -14,7 +14,7 @@ import type { ApiReportJSON } from 'mastodon/api_types/reports'; export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8; interface BaseNotificationGroup - extends Omit { + extends Omit { sampleAccountIds: string[]; } @@ -115,8 +115,7 @@ function createAccountRelationshipSeveranceEventFromJSON( export function createNotificationGroupFromJSON( groupJson: ApiNotificationGroupJSON, ): NotificationGroup { - const { sample_accounts, ...group } = groupJson; - const sampleAccountIds = sample_accounts.map((account) => account.id); + const { sample_account_ids: sampleAccountIds, ...group } = groupJson; switch (group.type) { case 'favourite': @@ -125,9 +124,9 @@ export function createNotificationGroupFromJSON( case 'mention': case 'poll': case 'update': { - const { status, ...groupWithoutStatus } = group; + const { status_id: statusId, ...groupWithoutStatus } = group; return { - statusId: status.id, + statusId, sampleAccountIds, ...groupWithoutStatus, }; diff --git a/app/javascript/mastodon/reducers/notification_policy.ts b/app/javascript/mastodon/reducers/notification_policy.ts index ab111066cc3b3e..ed912dde5d648a 100644 --- a/app/javascript/mastodon/reducers/notification_policy.ts +++ b/app/javascript/mastodon/reducers/notification_policy.ts @@ -2,17 +2,25 @@ import { createReducer, isAnyOf } from '@reduxjs/toolkit'; import { fetchNotificationPolicy, + decreasePendingNotificationsCount, updateNotificationsPolicy, } from 'mastodon/actions/notification_policies'; import type { NotificationPolicy } from 'mastodon/models/notification_policy'; export const notificationPolicyReducer = createReducer(null, (builder) => { - builder.addMatcher( - isAnyOf( - fetchNotificationPolicy.fulfilled, - updateNotificationsPolicy.fulfilled, - ), - (_state, action) => action.payload, - ); + builder + .addCase(decreasePendingNotificationsCount, (state, action) => { + if (state) { + state.summary.pending_notifications_count -= action.payload; + state.summary.pending_requests_count -= 1; + } + }) + .addMatcher( + isAnyOf( + fetchNotificationPolicy.fulfilled, + updateNotificationsPolicy.fulfilled, + ), + (_state, action) => action.payload, + ); }); diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js index 0e353e0d1b7c51..6f55241dc1ce29 100644 --- a/app/javascript/mastodon/reducers/settings.js +++ b/app/javascript/mastodon/reducers/settings.js @@ -51,6 +51,7 @@ const initialState = ImmutableMap({ dismissPermissionBanner: false, showUnread: true, + minimizeFilteredBanner: false, shows: ImmutableMap({ follow: true, diff --git a/app/javascript/mastodon/selectors/settings.ts b/app/javascript/mastodon/selectors/settings.ts index 64d9440bc8d3b0..93276c66920609 100644 --- a/app/javascript/mastodon/selectors/settings.ts +++ b/app/javascript/mastodon/selectors/settings.ts @@ -37,4 +37,9 @@ export const selectNeedsNotificationPermission = (state: RootState) => 'dismissPermissionBanner', ])) as boolean; +export const selectSettingsNotificationsMinimizeFilteredBanner = ( + state: RootState, +) => + state.settings.getIn(['notifications', 'minimizeFilteredBanner']) as boolean; + /* eslint-enable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 635bab546018b2..0ad8e1028ea231 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -298,12 +298,6 @@ html { .directory__tag > div { background: $white; border: 1px solid var(--background-border-color); - - @media screen and (max-width: $no-gap-breakpoint) { - border-left: 0; - border-right: 0; - border-top: 0; - } } .picture-in-picture-placeholder { @@ -318,10 +312,6 @@ html { &:focus { background: $ui-base-color; } - - @media screen and (max-width: $no-gap-breakpoint) { - border: 0; - } } .batch-table { diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss index d7f8586dd29623..899b494e549312 100644 --- a/app/javascript/styles/mastodon/_mixins.scss +++ b/app/javascript/styles/mastodon/_mixins.scss @@ -1,16 +1,3 @@ -@mixin avatar-radius { - border-radius: 4px; - background: transparent no-repeat; - background-position: 50%; - background-clip: padding-box; -} - -@mixin avatar-size($size: 48px) { - width: $size; - height: $size; - background-size: $size $size; -} - @mixin search-input { outline: 0; box-sizing: border-box; diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index e63601fa9f1fd7..894332acb5868d 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -350,6 +350,10 @@ color: $primary-text-color; font-weight: 700; } + + .warning-hint { + font-weight: normal !important; + } } &__body { diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 41ccbc374699a5..4c8e647c54fdc5 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1,6 +1,6 @@ @use 'sass:math'; -$no-columns-breakpoint: 600px; +$no-columns-breakpoint: 890px; $sidebar-width: 300px; $content-width: 840px; diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index 456e042c535357..1f961cb9e1279d 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -66,10 +66,6 @@ body { } } - &.lighter { - background: $ui-base-color; - } - &.with-modals { overflow-x: hidden; overflow-y: scroll; @@ -109,7 +105,6 @@ body { } &.embed { - background: lighten($ui-base-color, 4%); margin: 0; padding-bottom: 0; @@ -122,15 +117,12 @@ body { } &.admin { - background: var(--background-color); padding: 0; } &.error { position: absolute; text-align: center; - color: $darker-text-color; - background: $ui-base-color; width: 100%; height: 100%; padding: 0; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 581ba3c64ab51d..ceaf275ab0b672 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1980,17 +1980,15 @@ body > [data-popper-placement] { } .account__avatar { - @include avatar-radius; - display: block; position: relative; - overflow: hidden; img { display: block; width: 100%; height: 100%; object-fit: cover; + border-radius: 4px; } &-inline { @@ -2027,6 +2025,29 @@ body > [data-popper-placement] { font-size: 15px; } } + + &__counter { + $height: 16px; + $h-padding: 5px; + + position: absolute; + bottom: -3px; + inset-inline-end: -3px; + padding-left: $h-padding; + padding-right: $h-padding; + height: $height; + border-radius: $height; + min-width: $height - 2 * $h-padding; // to ensure that it is never narrower than a circle + line-height: $height + 1px; // to visually center the numbers + background-color: $ui-button-background-color; + color: $white; + border-width: 1px; + border-style: solid; + border-color: var(--background-color); + font-size: 11px; + font-weight: 500; + text-align: center; + } } a .account__avatar { @@ -6055,6 +6076,25 @@ a.status-card { } } + &__confirmation { + font-size: 14px; + line-height: 20px; + color: $darker-text-color; + + h1 { + font-size: 16px; + line-height: 24px; + color: $primary-text-color; + font-weight: 500; + margin-bottom: 8px; + } + + strong { + font-weight: 700; + color: $primary-text-color; + } + } + &__bullet-points { display: flex; flex-direction: column; @@ -6140,11 +6180,8 @@ a.status-card { } .boost-modal, -.confirmation-modal, .report-modal, .actions-modal, -.mute-modal, -.block-modal, .compare-history-modal { background: lighten($ui-secondary-color, 8%); color: $inverted-text-color; @@ -6166,10 +6203,7 @@ a.status-card { } } -.boost-modal__action-bar, -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.block-modal__action-bar { +.boost-modal__action-bar { display: flex; justify-content: space-between; align-items: center; @@ -6192,16 +6226,6 @@ a.status-card { } } -.mute-modal, -.block-modal { - line-height: 24px; -} - -.mute-modal .react-toggle, -.block-modal .react-toggle { - vertical-align: middle; -} - .report-modal { width: 90vw; max-width: 700px; @@ -6596,34 +6620,6 @@ a.status-card { } } -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.block-modal__action-bar { - .confirmation-modal__secondary-button { - flex-shrink: 1; - } -} - -.confirmation-modal__secondary-button, -.confirmation-modal__cancel-button, -.mute-modal__cancel-button, -.block-modal__cancel-button { - background-color: transparent; - color: $lighter-text-color; - font-size: 14px; - font-weight: 500; - - &:hover, - &:focus, - &:active { - color: darken($lighter-text-color, 4%); - background-color: transparent; - } -} - -.confirmation-modal__container, -.mute-modal__container, -.block-modal__container, .report-modal__target { padding: 30px; font-size: 16px; @@ -6657,31 +6653,10 @@ a.status-card { } } -.confirmation-modal__container, .report-modal__target { text-align: center; } -.block-modal, -.mute-modal { - &__explanation { - margin-top: 20px; - } - - .setting-toggle { - margin-top: 20px; - margin-bottom: 24px; - display: flex; - align-items: center; - - &__label { - color: $inverted-text-color; - margin: 0; - margin-inline-start: 8px; - } - } -} - .report-modal__target { padding: 15px; @@ -10217,25 +10192,10 @@ noscript { } &__badge { - display: flex; - align-items: center; - border-radius: 999px; - background: var(--background-border-color); - color: $darker-text-color; - padding: 4px; - padding-inline-end: 8px; - gap: 6px; - font-weight: 500; - font-size: 11px; - line-height: 16px; - word-break: keep-all; - - &__badge { - background: $ui-button-background-color; - color: $white; - border-radius: 100px; - padding: 2px 8px; - } + background: $ui-button-background-color; + color: $white; + border-radius: 100px; + padding: 2px 8px; } } @@ -10276,6 +10236,12 @@ noscript { letter-spacing: 0.5px; line-height: 24px; color: $secondary-text-color; + + bdi { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } } .filtered-notifications-banner__badge { diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index eab79371507f7c..65f42d0467b747 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -286,6 +286,10 @@ a.table-action-link { padding: 0; } + &--padded { + padding: 12px 16px 16px; + } + &--with-image { display: flex; align-items: center; diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index c3845052327121..f69b68392a5a01 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -336,13 +336,15 @@ def resolve_thread(status) def fetch_replies(status) collection = @object['replies'] - return if collection.nil? + return if collection.blank? replies = ActivityPub::FetchRepliesService.new.call(status, collection, allow_synchronous_requests: false, request_id: @options[:request_id]) return unless replies.nil? uri = value_or_id(collection) ActivityPub::FetchRepliesWorker.perform_async(status.id, uri, { 'request_id' => @options[:request_id] }) unless uri.nil? + rescue => e + Rails.logger.warn "Error fetching replies: #{e}" end def conversation_from_uri(uri) diff --git a/app/lib/admin/metrics/dimension/software_versions_dimension.rb b/app/lib/admin/metrics/dimension/software_versions_dimension.rb index a260a66e2af960..84ffc41d7428eb 100644 --- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb +++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb @@ -85,7 +85,14 @@ def libvips_version def imagemagick_version return if Rails.configuration.x.use_vips - version = `convert -version`.match(/Version: ImageMagick ([\d\.]+)/)[1] + imagemagick_binary = Paperclip.options[:is_windows] ? 'magick convert' : 'convert' + + version_output = Terrapin::CommandLine.new(imagemagick_binary, '-version').run + version_match = version_output.match(/Version: ImageMagick (\S+)/)[1].strip + + return nil unless version_match + + version = version_match { key: 'imagemagick', @@ -93,12 +100,13 @@ def imagemagick_version value: version, human_value: version, } - rescue Errno::ENOENT + rescue Terrapin::CommandNotFoundError, Terrapin::ExitStatusError, Paperclip::Errors::CommandNotFoundError, Paperclip::Errors::CommandFailedError nil end def ffmpeg_version - version = `ffmpeg -version`.match(/ffmpeg version ([\d\.]+)/)[1] + version_output = Terrapin::CommandLine.new(Rails.configuration.x.ffprobe_binary, '-show_program_version -v 0 -of json').run + version = Oj.load(version_output, mode: :strict, symbol_keys: true).dig(:program_version, :version) { key: 'ffmpeg', @@ -106,7 +114,7 @@ def ffmpeg_version value: version, human_value: version, } - rescue Errno::ENOENT + rescue Terrapin::CommandNotFoundError, Terrapin::ExitStatusError, Oj::ParseError nil end diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb index d81f4a30622dec..bd78aef7a9f56c 100644 --- a/app/lib/link_details_extractor.rb +++ b/app/lib/link_details_extractor.rb @@ -101,7 +101,7 @@ def root_array(root) end def json - @json ||= root_array(Oj.load(@data)).find { |obj| SUPPORTED_TYPES.include?(obj['@type']) } || {} + @json ||= root_array(Oj.load(@data)).compact.find { |obj| SUPPORTED_TYPES.include?(obj['@type']) } || {} end end diff --git a/app/lib/oauth_pre_authorization_extension.rb b/app/lib/oauth_pre_authorization_extension.rb new file mode 100644 index 00000000000000..1885e0823d8015 --- /dev/null +++ b/app/lib/oauth_pre_authorization_extension.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module OauthPreAuthorizationExtension + extend ActiveSupport::Concern + + included do + validate :code_challenge_method_s256, error: Doorkeeper::Errors::InvalidCodeChallengeMethod + end + + def validate_code_challenge_method_s256 + code_challenge.blank? || code_challenge_method == 'S256' + end +end diff --git a/app/models/account.rb b/app/models/account.rb index f2d042a38d7994..c344a30bbe98b9 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -68,7 +68,7 @@ class Account < ApplicationRecord INSTANCE_ACTOR_ID = -99 USERNAME_RE = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i - MENTION_RE = %r{(? wt.id') + .where.not("COALESCE(notifications.group_key, 'ungrouped-' || notifications.id) = ANY(wt.groups)") + .limit(1) + .arel.lateral('notifications'), + ] + ) + .select('notifications.*', "array_append(wt.groups, COALESCE(notifications.group_key, 'ungrouped-' || notifications.id))"), ] ) .from('grouped_notifications AS notifications') - .order(id: :desc) + .order(id: pagination_order) .limit(limit) end + # This returns notifications from the request page, but with at most one notification per group. + # Notifications that have no `group_key` each count as a separate group. + def paginate_groups_by_max_id(limit, max_id: nil, since_id: nil) + query = reorder(id: :desc) + query = query.where(id: ...max_id) if max_id.present? + query = query.where(id: (since_id + 1)...) if since_id.present? + query.paginate_groups(limit, :desc) + end + # Differs from :paginate_groups_by_max_id in that it gives the results immediately following min_id, # whereas since_id gives the items with largest id, but with since_id as a cutoff. # Results will be in ascending order by id. @@ -172,25 +192,7 @@ def paginate_groups_by_min_id(limit, max_id: nil, min_id: nil) query = reorder(id: :asc) query = query.where(id: (min_id + 1)...) if min_id.present? query = query.where(id: ...max_id) if max_id.present? - - unscoped - .with_recursive( - grouped_notifications: [ - query - .select('notifications.*', "ARRAY[COALESCE(notifications.group_key, 'ungrouped-' || notifications.id)] AS groups") - .limit(1), - query - .joins('CROSS JOIN grouped_notifications') - .where('array_length(grouped_notifications.groups, 1) < :limit', limit: limit) - .where('notifications.id > grouped_notifications.id') - .where.not("COALESCE(notifications.group_key, 'ungrouped-' || notifications.id) = ANY(grouped_notifications.groups)") - .select('notifications.*', "array_append(grouped_notifications.groups, COALESCE(notifications.group_key, 'ungrouped-' || notifications.id))") - .limit(1), - ] - ) - .from('grouped_notifications AS notifications') - .order(id: :asc) - .limit(limit) + query.paginate_groups(limit, :asc) end def to_a_grouped_paginated_by_id(limit, options = {}) diff --git a/app/models/tag.rb b/app/models/tag.rb index 3f88cb06807c73..9006e1f25d9c4b 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -37,7 +37,7 @@ class Tag < ApplicationRecord HASHTAG_LAST_SEQUENCE = '([[:word:]_]*[[:alpha:]][[:word:]_]*)' HASHTAG_NAME_PAT = "#{HASHTAG_FIRST_SEQUENCE}|#{HASHTAG_LAST_SEQUENCE}" - HASHTAG_RE = %r{(? { where(reviewed_at: nil) } scope :pending_review, -> { unreviewed.where.not(requested_review_at: nil) } scope :usable, -> { where(usable: [true, nil]) } + scope :not_usable, -> { where(usable: false) } scope :listable, -> { where(listable: [true, nil]) } scope :trendable, -> { Setting.trendable_by_default ? where(trendable: [true, nil]) : where(trendable: true) } scope :not_trendable, -> { where(trendable: false) } @@ -74,6 +75,10 @@ def display_name attributes['display_name'] || name end + def formatted_name + "##{display_name}" + end + def usable boolean_with_default('usable', true) end @@ -132,8 +137,10 @@ def find_or_create_by_names(name_or_names) def search_for(term, limit = 5, offset = 0, options = {}) stripped_term = term.strip + options.reverse_merge!({ exclude_unlistable: true, exclude_unreviewed: false }) - query = Tag.listable.matches_name(stripped_term) + query = Tag.matches_name(stripped_term) + query = query.merge(Tag.listable) if options[:exclude_unlistable] query = query.merge(matching_name(stripped_term).or(where.not(reviewed_at: nil))) if options[:exclude_unreviewed] query.order(Arel.sql('length(name) ASC, name ASC')) diff --git a/app/models/user.rb b/app/models/user.rb index 3bd87c28178511..70acacf6b52725 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -117,6 +117,7 @@ class User < ApplicationRecord scope :pending, -> { where(approved: false) } scope :approved, -> { where(approved: true) } scope :confirmed, -> { where.not(confirmed_at: nil) } + scope :unconfirmed, -> { where(confirmed_at: nil) } scope :enabled, -> { where(disabled: false) } scope :disabled, -> { where(disabled: true) } scope :active, -> { confirmed.signed_in_recently.account_not_suspended } diff --git a/app/presenters/grouped_notifications_presenter.rb b/app/presenters/grouped_notifications_presenter.rb new file mode 100644 index 00000000000000..f01acfd41c70a2 --- /dev/null +++ b/app/presenters/grouped_notifications_presenter.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class GroupedNotificationsPresenter < ActiveModelSerializers::Model + def initialize(grouped_notifications) + super() + + @grouped_notifications = grouped_notifications + end + + def notification_groups + @grouped_notifications + end + + def statuses + @grouped_notifications.filter_map(&:target_status).uniq(&:id) + end + + def accounts + @grouped_notifications.flat_map(&:sample_accounts).uniq(&:id) + end +end diff --git a/app/presenters/oauth_metadata_presenter.rb b/app/presenters/oauth_metadata_presenter.rb index 546503bfcca22e..1e4d25165c7118 100644 --- a/app/presenters/oauth_metadata_presenter.rb +++ b/app/presenters/oauth_metadata_presenter.rb @@ -7,6 +7,7 @@ class OauthMetadataPresenter < ActiveModelSerializers::Model :revocation_endpoint, :scopes_supported, :response_types_supported, :response_modes_supported, :grant_types_supported, :token_endpoint_auth_methods_supported, + :code_challenge_methods_supported, :service_documentation, :app_registration_endpoint def issuer @@ -59,6 +60,10 @@ def token_endpoint_auth_methods_supported %w(client_secret_basic client_secret_post) end + def code_challenge_methods_supported + %w(S256) + end + private def doorkeeper diff --git a/app/serializers/oauth_metadata_serializer.rb b/app/serializers/oauth_metadata_serializer.rb index 5f3dc7b87e2e05..2afb4208fbc5ae 100644 --- a/app/serializers/oauth_metadata_serializer.rb +++ b/app/serializers/oauth_metadata_serializer.rb @@ -5,5 +5,6 @@ class OauthMetadataSerializer < ActiveModel::Serializer :revocation_endpoint, :scopes_supported, :response_types_supported, :response_modes_supported, :grant_types_supported, :token_endpoint_auth_methods_supported, + :code_challenge_methods_supported, :service_documentation, :app_registration_endpoint end diff --git a/app/serializers/rest/dedup_notification_group_serializer.rb b/app/serializers/rest/dedup_notification_group_serializer.rb new file mode 100644 index 00000000000000..fd0c6b3c415a91 --- /dev/null +++ b/app/serializers/rest/dedup_notification_group_serializer.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class REST::DedupNotificationGroupSerializer < ActiveModel::Serializer + has_many :accounts, serializer: REST::AccountSerializer + has_many :statuses, serializer: REST::StatusSerializer + has_many :notification_groups, serializer: REST::NotificationGroupSerializer +end diff --git a/app/serializers/rest/notification_group_serializer.rb b/app/serializers/rest/notification_group_serializer.rb index 749f71775463e0..b855f1cba9c53b 100644 --- a/app/serializers/rest/notification_group_serializer.rb +++ b/app/serializers/rest/notification_group_serializer.rb @@ -8,12 +8,20 @@ class REST::NotificationGroupSerializer < ActiveModel::Serializer attribute :page_max_id, if: :paginated? attribute :latest_page_notification_at, if: :paginated? - has_many :sample_accounts, serializer: REST::AccountSerializer - belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer + attribute :sample_account_ids + attribute :status_id, if: :status_type? belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer belongs_to :account_relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer belongs_to :account_warning, key: :moderation_warning, if: :moderation_warning_event?, serializer: REST::AccountWarningSerializer + def sample_account_ids + object.sample_accounts.pluck(:id).map(&:to_s) + end + + def status_id + object.target_status&.id&.to_s + end + def status_type? [:favourite, :reblog, :status, :mention, :poll, :update].include?(object.type) end diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index adabb1096e86eb..49b8205574786b 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -45,7 +45,13 @@ def process_url def html return @html if defined?(@html) - @html = Request.new(:get, @url).add_headers('Accept' => 'text/html', 'User-Agent' => "#{Mastodon::Version.user_agent} Bot").perform do |res| + headers = { + 'Accept' => 'text/html', + 'Accept-Language' => "#{I18n.default_locale}, *;q=0.5", + 'User-Agent' => "#{Mastodon::Version.user_agent} Bot", + } + + @html = Request.new(:get, @url).add_headers(headers).perform do |res| next unless res.code == 200 && res.mime_type == 'text/html' # We follow redirects, and ideally we want to save the preview card for diff --git a/app/views/admin/tags/_tag.html.haml b/app/views/admin/tags/_tag.html.haml new file mode 100644 index 00000000000000..322eee0407ff53 --- /dev/null +++ b/app/views/admin/tags/_tag.html.haml @@ -0,0 +1,27 @@ +.batch-table__row{ class: [!tag.requires_review? && !tag.usable? && 'batch-table__row--muted'] } + .batch-table__row__content.batch-table__row__content--padded.pending-account + .pending-account__header + %strong + = link_to tag.formatted_name, admin_tag_path(tag.id) + + %br/ + + - if tag.usable? + = t('admin.tags.moderation.usable') + - else + = t('admin.tags.moderation.not_usable') + + · + - if tag.trendable? + = t('admin.tags.moderation.trendable') + - else + = t('admin.tags.moderation.not_trendable') + + - if tag.requested_review? || tag.requires_review? + · + - if tag.requested_review? + %span.negative-hint + = t('admin.tags.moderation.review_requested') + - else + %span.warning-hint + = t('admin.tags.moderation.pending_review') diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml new file mode 100644 index 00000000000000..8d76d8ffa7469f --- /dev/null +++ b/app/views/admin/tags/index.html.haml @@ -0,0 +1,39 @@ +- content_for :page_title do + = t('admin.tags.title') + += form_with url: admin_tags_url, method: :get, class: :simple_form do |form| + .filters + .filter-subset.filter-subset--with-select + %strong= t('admin.tags.moderation.title') + .input.select.optional + = form.select :status, + options_for_select(admin_tags_moderation_options, params[:status]), + prompt: t('generic.all') + + .filter-subset.filter-subset--with-select + %strong= t 'generic.order_by' + .input.select + = form.select :order, + options_for_select([[t('admin.tags.newest'), 'newest'], [t('admin.tags.oldest'), 'oldest']], params[:order]) + + .fields-group + .input.string.optional + = form.text_field :name, + value: params[:name], + class: 'string optional', + placeholder: t('admin.tags.name') + + .actions + %button.button= t('admin.tags.search') + = link_to t('admin.tags.reset'), admin_tags_path, class: 'button negative' + +%hr.spacer/ + +.batch-table + .batch-table__body + - if @tags.empty? + = nothing_here 'nothing-here--under-tabs' + - else + = render partial: 'tag', collection: @tags + += paginate @tags diff --git a/app/views/admin/tags/show.html.haml b/app/views/admin/tags/show.html.haml index f2d87b54b04378..f6155575ae25d0 100644 --- a/app/views/admin/tags/show.html.haml +++ b/app/views/admin/tags/show.html.haml @@ -1,12 +1,13 @@ - content_for :page_title do - = "##{@tag.display_name}" + = @tag.formatted_name -- if current_user.can?(:view_dashboard) - - content_for :heading_actions do +- content_for :heading_actions do + - if current_user.can?(:view_dashboard) = l(@time_period.first) = ' - ' = l(@time_period.last) +- if current_user.can?(:view_dashboard) .dashboard .dashboard__item = react_admin_component :counter, diff --git a/app/views/admin/trends/tags/_tag.html.haml b/app/views/admin/trends/tags/_tag.html.haml index 8cc0d713b9e178..b1e714a912410f 100644 --- a/app/views/admin/trends/tags/_tag.html.haml +++ b/app/views/admin/trends/tags/_tag.html.haml @@ -4,9 +4,7 @@ .batch-table__row__content.pending-account .pending-account__header - = link_to admin_tag_path(tag.id) do - = material_symbol 'tag' - = tag.display_name + = link_to tag.formatted_name, admin_tag_path(tag.id) %br/ diff --git a/app/views/oauth/authorizations/new.html.haml b/app/views/oauth/authorizations/new.html.haml index c50c224cce6193..d4563b2f01d644 100644 --- a/app/views/oauth/authorizations/new.html.haml +++ b/app/views/oauth/authorizations/new.html.haml @@ -26,6 +26,8 @@ value: @pre_auth.client.uid = form.hidden_field :redirect_uri, value: @pre_auth.redirect_uri + = form.hidden_field :code_challenge, value: @pre_auth.code_challenge + = form.hidden_field :code_challenge_method, value: @pre_auth.code_challenge_method = form.hidden_field :state, value: @pre_auth.state = form.hidden_field :response_type, @@ -40,6 +42,8 @@ value: @pre_auth.client.uid = form.hidden_field :redirect_uri, value: @pre_auth.redirect_uri + = form.hidden_field :code_challenge, value: @pre_auth.code_challenge + = form.hidden_field :code_challenge_method, value: @pre_auth.code_challenge_method = form.hidden_field :state, value: @pre_auth.state = form.hidden_field :response_type, diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb index 74abc2370189af..9f58d9225b3a14 100644 --- a/app/workers/scheduler/user_cleanup_scheduler.rb +++ b/app/workers/scheduler/user_cleanup_scheduler.rb @@ -16,7 +16,7 @@ def perform private def clean_unconfirmed_accounts! - User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch| + User.unconfirmed.where(confirmation_sent_at: ..UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch| # We have to do it separately because of missing database constraints AccountModerationNote.where(target_account_id: batch.map(&:account_id)).delete_all Account.where(id: batch.map(&:account_id)).delete_all diff --git a/config/application.rb b/config/application.rb index 5aca74fd1c60a2..3c62a4922898d4 100644 --- a/config/application.rb +++ b/config/application.rb @@ -118,6 +118,7 @@ class Application < Rails::Application Doorkeeper::Application.include ApplicationExtension Doorkeeper::AccessGrant.include AccessGrantExtension Doorkeeper::AccessToken.include AccessTokenExtension + Doorkeeper::OAuth::PreAuthorization.include OauthPreAuthorizationExtension Devise::FailureApp.include AbstractController::Callbacks Devise::FailureApp.include Localized end diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb index 9ca4eb0da9a8e1..b932e97e2faf1a 100644 --- a/config/initializers/twitter_regex.rb +++ b/config/initializers/twitter_regex.rb @@ -9,7 +9,7 @@ def emoji_parsing_enabled class Regex REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}<>()?]/iou - REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}()?!*"'「」<>;:=,.$%\[\]~&|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou + REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}()?!*"'「」<>;:=,.$%\[\]~&|]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou REGEXEN[:valid_url_balanced_parens] = / \( (?: diff --git a/config/locales/activerecord.fi.yml b/config/locales/activerecord.fi.yml index feb4fbf4c58342..9da69b7dbd0f8b 100644 --- a/config/locales/activerecord.fi.yml +++ b/config/locales/activerecord.fi.yml @@ -28,7 +28,7 @@ fi: doorkeeper/application: attributes: website: - invalid: ei ole kelvollinen verkko-osoite + invalid: ei ole kelvollinen URL-osoite import: attributes: data: @@ -40,15 +40,15 @@ fi: user: attributes: email: - blocked: käyttää kiellettyä sähköpostipalvelun tarjoajaa + blocked: käyttää kiellettyä sähköpostipalveluntarjoajaa unreachable: ei näytä olevan olemassa role_id: elevated: ei voi olla korkeampi kuin nykyinen roolisi user_role: attributes: permissions_as_keys: - dangerous: sisältää oikeuksia, jotka eivät ole turvallisia perusroolille - elevated: ei voi sisältää oikeuksia, joita nykyisellä roolillasi ei ole + dangerous: sisällytä käyttöoikeuksia, jotka eivät ole turvallisia perusroolille + elevated: ei voi sisältää käyttöoikeuksia, joita nykyisellä roolillasi ei ole own_role: ei voi muuttaa nykyisellä roolillasi position: elevated: ei voi olla korkeampi kuin nykyinen roolisi diff --git a/config/locales/activerecord.sc.yml b/config/locales/activerecord.sc.yml index aadd00287f54ad..cd474ea542c068 100644 --- a/config/locales/activerecord.sc.yml +++ b/config/locales/activerecord.sc.yml @@ -24,7 +24,7 @@ sc: status: attributes: reblog: - taken: de s'istadu esistet giai + taken: de sa publicatzione esistet giai user: attributes: email: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index c0abc3c845579d..c71fab2177eb8c 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -12,7 +12,7 @@ bg: one: Последовател other: Последователи following: Следва - instance_actor_flash: Акаунтът е виртуално действащо лице, представляващо сървъра, а не отделен потребител. Използва се за федерацията и не бива да се спира. + instance_actor_flash: Акаунтът е виртуално действащо лице, представляващо сървъра, а не отделен потребител. Използва се за целите на федериране и не бива да се спира. last_active: последна дейност link_verified_on: Собствеността върху тази връзка е проверена на %{date} nothing_here: Тук няма нищо! @@ -471,6 +471,9 @@ bg: title: Препоръки за следване unsuppress: Възстановяване на препоръките за следване instances: + audit_log: + title: Скорошни одитни дневници + view_all: Преглед на пълните одитни дневници availability: description_html: one: Ако доставянето до домейна не е успешно за %{count} ден, няма да има последващи опити, докато не се получи доставка от домейна. @@ -882,7 +885,23 @@ bg: action: Щракнете тук за повече информация message_html: "Вашето съхранение на предмети е погрешно конфигурирано. Поверителността на потребителите ви е изложена на риск." tags: + moderation: + not_trendable: Не изгряващо + not_usable: Не употребимо + pending_review: Чака се преглед + review_requested: Иска се преглед + reviewed: Прегледано + title: Състояние + trendable: Изгряващо + unreviewed: Непрегледано + usable: Употребимо + name: Име + newest: Най-нови + oldest: Най-стари + reset: Нулиране review: Преглед на състояние + search: Търсене + title: Хаштагове updated_msg: Успешно осъвременени настройки на хаштага title: Администрация trends: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 4d0e2ab389d2a4..f3fd91d11f62fa 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -471,6 +471,9 @@ ca: title: Recomanacions de comptes a seguir unsuppress: Restaurar les recomanacions de seguiment instances: + audit_log: + title: Registres recents d'auditoria + view_all: Mostra els registres d'auditoria complets availability: description_html: one: Si la tramesa cap el domini falla %{count} dia sense èxit, no es faran més intents d'entrega a no ser que es rebi una tramesa des de el domini. @@ -882,7 +885,23 @@ ca: action: Consulta aquí per a més informació message_html: "El teu emagatzamatge d'objectes no està ben configurat. La privacitat dels teus usuaris està en risc." tags: + moderation: + not_trendable: No pot ser en tendència + not_usable: No es pot fer servir + pending_review: Pendent de revisió + review_requested: Revisió demanada + reviewed: Revisada + title: Estat + trendable: Pot ser tendència + unreviewed: No revisada + usable: Es pot fer servir + name: Nom + newest: Més nous + oldest: Més vells + reset: Restableix review: Revisar l'estat + search: Cerca + title: Etiquetes updated_msg: Ajustaments d'etiquetes actualitzats amb èxit title: Administració trends: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index cd48b3e3b0ec2f..5f1b0b4bcef1c3 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -238,6 +238,7 @@ cy: update_custom_emoji: Diweddaru Emoji Addasedig update_domain_block: Diweddaru'r Blocio Parth update_ip_block: Diweddaru rheol IP + update_report: Diweddaru Adroddiad update_status: Diweddaru Postiad update_user_role: Diweddaru Rôl actions: @@ -686,6 +687,7 @@ cy: report: 'Adroddiad #%{id}' reported_account: Cyfrif wedi ei adrodd reported_by: Adroddwyd gan + reported_with_application: Adroddwyd gydag ap resolved: Wedi ei ddatrys resolved_msg: Llwyddwyd i ddatrys yr adroddiad! skip_to_actions: Mynd i gamau gweithredu diff --git a/config/locales/da.yml b/config/locales/da.yml index 75da9a0b363fdf..004aea520adc58 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -471,6 +471,9 @@ da: title: Følg-anbefalinger unsuppress: Genopret følg-anbefaling instances: + audit_log: + title: Seneste Revisionslogger + view_all: Vis alle revisionslogger availability: description_html: one: Lykkes det ikke at levere til domænet i løbet af %{count} dag, foretages ingen yderligere leveringsforsøg, medmindre en levering fra domænet modtages. @@ -881,7 +884,23 @@ da: action: Tjek her for flere oplysninger message_html: "Objektlageret er fejlopsat. Brugernes fortrolighed er i fare." tags: + moderation: + not_trendable: Ikke trendegnet + not_usable: Ikke brugbar + pending_review: Afventer revision + review_requested: Revision anmodet + reviewed: Revideret + title: Status + trendable: Trendegnet + unreviewed: Urevideret + usable: Brugbar + name: Navn + newest: Seneste + oldest: Ældste + reset: Nulstil review: Revisionsstatus + search: Søg + title: Hashtags updated_msg: Hashtag-indstillinger opdateret title: Administration trends: diff --git a/config/locales/de.yml b/config/locales/de.yml index 81b7cd172d64fb..b133cf94bcbf8c 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1,7 +1,7 @@ --- de: about: - about_mastodon_html: 'Das soziale Netzwerk der Zukunft: Keine Werbung, keine Überwachung durch Unternehmen – dafür dezentral und mit Anstand! Beherrsche deine Daten mit Mastodon!' + about_mastodon_html: 'Das soziale Netzwerk der Zukunft: Keine Werbung, keine Überwachung durch Unternehmen – dafür dezentral und mit Anstand! Behalte mit Mastodon die Kontrolle über deine Daten!' contact_missing: Nicht festgelegt contact_unavailable: Nicht verfügbar hosted_on: Mastodon, gehostet auf %{domain} @@ -151,7 +151,7 @@ de: subscribe: Abonnieren suspend: Sperren suspended: Gesperrt - suspension_irreversible: Die Daten dieses Kontos wurden unwiderruflich gelöscht. Du kannst das Konto entsperren, um es wieder nutzbar zu machen, aber es wird keine Daten wiederherstellen, die es davor hatte. + suspension_irreversible: Die Daten dieses Kontos wurden unwiderruflich gelöscht. Du kannst das Konto entsperren, um es wieder zu verwenden, aber es wird keine Daten wiederherstellen, die es davor hatte. suspension_reversible_hint_html: Das Konto wurde gesperrt und die Daten werden am %{date} vollständig gelöscht. Bis dahin kann das Konto ohne irgendwelche negativen Auswirkungen wiederhergestellt werden. Wenn du alle Daten des Kontos sofort entfernen möchtest, kannst du das nachfolgend tun. title: Konten unblock_email: E-Mail-Adresse entsperren @@ -293,7 +293,7 @@ de: empty: Protokolle nicht gefunden. filter_by_action: Nach Aktion filtern filter_by_user: Nach Benutzer*in filtern - title: Protokoll + title: Audit-Log unavailable_instance: "(Server nicht verfügbar)" announcements: destroyed_msg: Ankündigung erfolgreich gelöscht! @@ -471,6 +471,9 @@ de: title: Folgeempfehlungen unsuppress: Folgeempfehlung nicht mehr unterbinden instances: + audit_log: + title: Neueste Audit-Logs + view_all: Alle Audit-Logs anzeigen availability: description_html: one: Wenn die Zustellung an die Domain %{count} Tag lang erfolglos bleibt, werden keine weiteren Zustellversuche unternommen, bis eine Zustellung von der Domain empfangen wird. @@ -588,7 +591,7 @@ de: notes: one: "%{count} Notiz" other: "%{count} Notizen" - action_log: Protokoll + action_log: Audit-Log action_taken_by: Maßnahme ergriffen von actions: delete_description_html: Der gemeldete Beitrag wird gelöscht und die ergriffene Maßnahme wird aufgezeichnet, um dir bei zukünftigen Verstößen des gleichen Kontos zu helfen. @@ -882,7 +885,23 @@ de: action: Für weitere Informationen hier klicken message_html: "Die Konfiguration deines Objektspeichers ist fehlerhaft. Die Privatsphäre deiner Benutzer*innen ist gefährdet." tags: + moderation: + not_trendable: Nicht trendfähig + not_usable: Nicht verwendbar + pending_review: Überprüfung ausstehend + review_requested: Überprüfung angefordert + reviewed: Überprüft + title: Status + trendable: Trendfähig + unreviewed: Ungeprüft + usable: Verwendbar + name: Name + newest: Neueste + oldest: Älteste + reset: Zurücksetzen review: Prüfstatus + search: Suchen + title: Hashtags updated_msg: Hashtag-Einstellungen erfolgreich aktualisiert title: Administration trends: @@ -1452,7 +1471,7 @@ de: backreference_required: Das neue Konto muss zuerst auf das alte Konto verweisen before: 'Bevor du fortfährst, lies bitte diese Hinweise sorgfältig durch:' cooldown: Nach dem Umzug wird es eine Weile dauern, bis du erneut umziehen darfst - disabled_account: Dein altes Konto ist nur noch eingeschränkt nutzbar. Du kannst jedoch deine Daten exportieren und das Konto wieder reaktivieren. + disabled_account: Dein altes Konto ist nur noch eingeschränkt verwendbar. Du kannst jedoch deine Daten exportieren und das Konto wieder reaktivieren. followers: Alle Follower werden vom alten zum neuen Konto übertragen only_redirect_html: Alternativ kannst du auch nur eine Weiterleitung zu deinem neuen Konto einrichten, ohne die Follower zu übertragen. other_data: Keine anderen Daten werden automatisch zum neuen Konto übertragen diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml index 8963bf5a45b021..61d58981d84162 100644 --- a/config/locales/devise.fi.yml +++ b/config/locales/devise.fi.yml @@ -2,9 +2,9 @@ fi: devise: confirmations: - confirmed: Sähköpostiosoitteesi on vahvistettu. - send_instructions: Saat pian sähköpostitse ohjeet sähköpostiosoitteesi vahvistamiseen. Jos et saanut viestiä, tarkista roskapostikansiosi. - send_paranoid_instructions: Jos sähköpostiosoitteesi on tiedossammme, saat pian sähköpostiisi ohjeet sen vahvistamiseen. Jos et saanut viestiä, tarkista roskapostikansiosi. + confirmed: Sähköpostiosoitteesi vahvistus onnistui. + send_instructions: Saat pian sähköpostiisi ohjeet sähköpostiosoitteesi vahvistamiseen. Jos viestiä ei kuulu, tarkista roskapostikansiosi. + send_paranoid_instructions: Jos sähköpostiosoitteesi on tiedossammme, saat pian sähköpostiisi ohjeet sen vahvistamiseen. Jos viestiä ei kuulu, tarkista roskapostikansiosi. failure: already_authenticated: Olet jo kirjautunut sisään. inactive: Tiliäsi ei ole vielä aktivoitu. @@ -14,7 +14,7 @@ fi: not_found_in_database: Virheellinen %{authentication_keys} tai salasana. omniauth_user_creation_failure: Virhe luotaessa tiliä tälle henkilöllisyydelle. pending: Tilisi on vielä tarkistamatta. - timeout: Istuntosi on vanhentunut. Jatkaaksesi käyttöä, kirjaudu uudelleen. + timeout: Istuntosi on vanhentunut. Jatka kirjautumalla uudelleen sisään. unauthenticated: Sinun on kirjauduttava tai rekisteröidyttävä ennen kuin voit jatkaa. unconfirmed: Vahvista sähköpostiosoitteesi, ennen kuin jatkat. mailer: @@ -24,34 +24,34 @@ fi: explanation: Olet luonut käyttäjätilin palvelimelle %{host} tätä sähköpostiosoitetta käyttäen. Olet painalluksen päässä tilin aktivoinnista. Jos et luonut tiliä itse, voit jättää tämän viestin huomiotta. explanation_when_pending: Teit hakemuksen kutsusta palvelimelle %{host} tällä sähköpostiosoitteella. Kun olet vahvistanut sähköpostiosoitteesi, tarkistamme hakemuksesi. Voit kirjautua sisään muuttaaksesi hakemuksen sisältöä tai poistaaksesi tilin, mutta et voi käyttää suurinta osaa toiminnallisuudesta ennen kuin hakemuksesi on hyväksytty. Jos hakemuksesi hylätään, tietosi poistetaan eikä sinulta tarvita enempää toimia. Jos sinä et tehnyt hakemusta, voit jättää tämän viestin huomiotta. extra_html: Tutustu myös palvelimen sääntöihin ja palveluehtoihimme. - subject: 'Mastodon: Vahvistusohjeet instanssille %{instance}' + subject: 'Mastodon: vahvistusohjeet palvelimelle %{instance}' title: Vahvista sähköpostiosoite email_changed: explanation: 'Tilin sähköpostiosoitteeksi vaihdetaan:' extra: Jos et vaihtanut sähköpostiosoitettasi, joku muu on todennäköisesti päässyt käyttämään tiliäsi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitoon, ellet pääse sisään käyttäjätilillesi. - subject: 'Mastodon: Sähköpostiosoite vaihdettu' + subject: 'Mastodon: sähköpostiosoite vaihdettu' title: Uusi sähköpostiosoite password_change: explanation: Tilisi salasana on vaihdettu. - extra: Ellet vaihtanut salasanaasi, joku muu on todennäköisesti päässyt käyttäjätilillesi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitoon, jos kirjautuminen käyttäjätilillesi ei onnistu. + extra: Jos et vaihtanut salasanaasi, joku muu on todennäköisesti päässyt käyttämään tiliäsi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitoon, ellet pääse sisään käyttäjätilillesi. subject: 'Mastodon: salasana vaihdettu' title: Salasana vaihdettu reconfirmation_instructions: explanation: Vahvista uusi sähköpostiosoite, niin muutos astuu voimaan. - extra: Jos et tehnyt muutosta itse, voit jättää tämän viestin huomiotta. Mastodon-tilin sähköpostiosoitetta ei vaihdeta, ennen kuin klikkaat yllä olevaa linkkiä. - subject: 'Mastodon: Vahvista sähköpostiosoite palvelimelle %{instance}' + extra: Jos et tehnyt muutosta itse, voit jättää tämän viestin huomiotta. Mastodon-tilin sähköpostiosoitetta ei vaihdeta, ennen kuin painat edellä olevaa linkkiä. + subject: 'Mastodon: vahvista sähköpostiosoite palvelimelle %{instance}' title: Vahvista sähköpostiosoite reset_password_instructions: action: Vaihda salasana explanation: Pyysit tilillesi uuden salasanan. - extra: Jos et tehnyt pyyntöä itse, voit jättää tämän viestin huomiotta. Salasanaasi ei vaihdeta, ennen kuin klikkaat yllä olevaa linkkiä ja luot uuden salasanan. + extra: Jos et tehnyt pyyntöä itse, voit jättää tämän viestin huomiotta. Salasanaasi ei vaihdeta, ennen kuin painat edellä olevaa linkkiä ja luot uuden salasanan. subject: 'Mastodon: ohjeet salasanan vaihtoon' title: Salasanan vaihto two_factor_disabled: explanation: Sisäänkirjautuminen on nyt mahdollista pelkällä sähköpostiosoitteella ja salasanalla. subject: 'Mastodon: kaksivaiheinen todennus poistettu käytöstä' subtitle: Kaksivaiheinen todennus on poistettu käytöstä tililtäsi. - title: 2-vaiheinen todennus pois käytöstä + title: Kaksivaiheinen todennus poissa käytöstä two_factor_enabled: explanation: Sisäänkirjautuminen edellyttää liitetyn TOTP-sovelluksen luomaa aikarajattua kertatunnuslukua. subject: 'Mastodon: kaksivaiheinen todennus otettu käyttöön' @@ -59,37 +59,37 @@ fi: title: Kaksivaiheinen todennus käytössä two_factor_recovery_codes_changed: explanation: Uudet palautuskoodit on nyt luotu ja vanhat mitätöity. - subject: 'Mastodon: Kaksivaihetodennuksen palautuskoodit luotiin uudelleen' + subject: 'Mastodon: kaksivaiheisen todennuksen palautuskoodit luotiin uudelleen' subtitle: Aiemmat palautuskoodit on mitätöity, ja korvaavat uudet koodit on luotu. - title: 2-vaiheisen todennuksen palautuskoodit vaihdettiin + title: Kaksivaiheisen todennuksen palautuskoodit vaihdettiin unlock_instructions: - subject: 'Mastodon: lukituksen poistamisen ohjeet' + subject: 'Mastodon: ohjeet lukituksen poistoon' webauthn_credential: added: explanation: Seuraava suojausavain on lisätty tilillesi - subject: 'Mastodon: Uusi suojausavain' + subject: 'Mastodon: uusi suojausavain' title: Uusi suojausavain on lisätty deleted: explanation: Seuraava suojausavain on poistettu tililtäsi - subject: 'Mastodon: Suojausavain poistettu' + subject: 'Mastodon: suojausavain poistettu' title: Yksi suojausavaimistasi on poistettu webauthn_disabled: - explanation: Turva-avaimin kirjautuminen tilillesi on kytketty pois käytöstä. + explanation: Suojausavaimella todennus on poissa käytöstä tililläsi. extra: Olet nyt mahdollistanut sisäänkirjautumisen käyttäjätilillesi pelkästään palveluun liitetyn TOTP-sovelluksen luomalla aikarajoitteisella kertatunnusluvulla. - subject: 'Mastodon: Turva-avaintodennus on poistettu käytöstä' + subject: 'Mastodon: suojausavaimella todennus poistettu käytöstä' title: Suojausavaimet poistettu käytöstä webauthn_enabled: - explanation: Turva-avaimella kirjautuminen on otettu käyttöön tilillesi. - extra: Voit nyt kirjautua sisään turva-avaimellasi. - subject: 'Mastodon: Todennus suojausavaimella on otettu käyttöön' + explanation: Suojausavaimella todennus on käytössä tililläsi. + extra: Voit nyt kirjautua sisään suojausavaimellasi. + subject: 'Mastodon: suojausavaimella todennus otettu käyttöön' title: Suojausavaimet käytössä omniauth_callbacks: - failure: Tunnistautuminen lähteestä %{kind} ei onnistunut, koska "%{reason}". - success: Tunnistautuminen tililtä %{kind} onnistui. + failure: Todentaminen lähteestä %{kind} ei onnistunut, syynä ”%{reason}”. + success: Todentaminen tililtä %{kind} onnistui. passwords: no_token: Tälle sivulle pääsee vain salasananvaihtoviestin kautta. Jos tiedät tulevasi sen kautta, varmista, että käytät viestissä mainittua URL-osoitetta kokonaisuudessaan. - send_instructions: Jos sähköpostiosoite on tietokannassamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. - send_paranoid_instructions: Jos sähköpostiosoite on tietokannassamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. + send_instructions: Jos sähköpostiosoiteesi on tiedossamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Jos viestiä ei kuulu, tarkista roskapostikansiosi. + send_paranoid_instructions: Jos sähköpostiosoiteesi on tiedossamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Jos viestiä ei kuulu, tarkista roskapostikansiosi. updated: Salasanan vaihto onnistui. Olet nyt kirjautunut sisään. updated_not_active: Salasanan vaihto onnistui. registrations: @@ -98,16 +98,16 @@ fi: signed_up_but_inactive: Rekisteröityminen onnistui. Emme kuitenkaan voi kirjata sinua sisään, sillä käyttäjätiliäsi ei ole vielä aktivoitu. signed_up_but_locked: Rekisteröityminen onnistui. Emme kuitenkaan voi kirjata sinua sisään, sillä käyttäjätilisi on lukittuna. signed_up_but_pending: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Sen avattuasi tarkistamme hakemuksesi, ja ilmoitamme hyväksynnästä. - signed_up_but_unconfirmed: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Aktivoi käyttäjätilisi seuraamalla linkkiä. Mikäli sitä ei kuulu, tarkista myös roskapostisi. - update_needs_confirmation: Tilin päivitys onnistui. Uusi sähköpostiosoite on kuitenkin vahvistettava. Tarkista saapuneet viestisi, ja vahvista uusi sähköpostiosoitteesi vahvistuslinkkiä seuraten. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. + signed_up_but_unconfirmed: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Aktivoi käyttäjätilisi seuraamalla linkkiä. Jos sitä ei kuulu, tarkista roskapostikansiosi. + update_needs_confirmation: Tilin päivitys onnistui. Uusi sähköpostiosoite on kuitenkin vahvistettava. Tarkista saapuneet viestisi, ja vahvista uusi sähköpostiosoitteesi vahvistuslinkkiä seuraten. Jos viestiä ei kuulu, tarkista myös roskapostikansiosi. updated: Käyttäjätilisi tietojen päivittäminen onnistui. sessions: already_signed_out: Uloskirjautuminen onnistui. signed_in: Sisäänkirjautuminen onnistui. signed_out: Uloskirjautuminen onnistui. unlocks: - send_instructions: Saat pian sähköpostitse ohjeet tilin lukituksen poistoon. Jos et saanut viestiä, tarkista roskapostikansio. - send_paranoid_instructions: Jos tili on olemassa, saat pian sähköpostitse ohjeet tilin lukituksen poistoon. Jos et saanut viestiä, tarkista roskapostikansio. + send_instructions: Saat pian sähköpostiisi ohjeet tilin lukituksen poistoon. Jos viestiä ei kuulu, tarkista roskapostikansiosi. + send_paranoid_instructions: Jos tili on olemassa, saat pian sähköpostiisi ohjeet tilin lukituksen poistoon. Jos viestiä ei kuulu, tarkista roskapostikansiosi. unlocked: Tilisi lukituksen poisto onnistui. Jatka kirjautumalla sisään. errors: messages: diff --git a/config/locales/devise.sc.yml b/config/locales/devise.sc.yml index 5486371a4c671a..dde8fd229e9b15 100644 --- a/config/locales/devise.sc.yml +++ b/config/locales/devise.sc.yml @@ -14,7 +14,7 @@ sc: not_found_in_database: "%{authentication_keys} o crae non vàlida." pending: Su contu tuo est ancora in revisione. timeout: Sa sessione tua est iscadida. Torra·bi a intrare pro sighire. - unauthenticated: Tocat a ti autenticare o ti registrare prima de sighire. + unauthenticated: Ti depes identificare o registrare prima de sighire. unconfirmed: Depes cunfirmare s'indiritzu tuo de posta eletrònica prima de sighire. mailer: confirmation_instructions: @@ -74,7 +74,7 @@ sc: subject: 'Mastodon: Autenticatzione cun sa crae de seguresa ativada' title: Craes de seguresa abilitadas omniauth_callbacks: - failure: Faddina in s'autenticatzione dae %{kind}, ca "%{reason}". + failure: 'Faddina in s''autenticatzione dae %{kind}; resone: "%{reason}".' success: Autenticatzione curreta dae su contu de %{kind}. passwords: no_token: No podes intrare a custa pàgina sena passare dae unu messàgiu de posta eletrònica pro resetare sa crae. Si benes dae su messàgiu de posta pro resetare sa crae, faghe in modu de impreare s'URL intreu chi t'ant donadu. diff --git a/config/locales/doorkeeper.bg.yml b/config/locales/doorkeeper.bg.yml index dd536618276155..a1ef1778547c02 100644 --- a/config/locales/doorkeeper.bg.yml +++ b/config/locales/doorkeeper.bg.yml @@ -83,6 +83,7 @@ bg: access_denied: Заявката беше отказана от собственика на ресурса или от сървъра за упълномощаване. credential_flow_not_configured: Resource Owner Password Credentials предизвика грешка, заради това, че настройките за Doorkeeper.configure.resource_owner_from_credentials липсват. invalid_client: Удостоверяването на клиента предизвика грешка, поради непознат клиент, липсващо клиентско удостоверяване, или заради това, че методът на удостоверяване не се поддържа. + invalid_code_challenge_method: Методът на предизвикателството на кода трябва да е S256, обикновен не се поддържа. invalid_grant: Предоставеното удостоверение за достъп е невалидно, изтекло, отхвърлено, не съвпада с пренасочващото URI, използвано в заявката за удостоверение, или е бил издадено от друг клиент. invalid_redirect_uri: Включеният пренасочващ Uri е невалиден. invalid_request: diff --git a/config/locales/doorkeeper.ca.yml b/config/locales/doorkeeper.ca.yml index 0323656dabfadd..85a09b5b433571 100644 --- a/config/locales/doorkeeper.ca.yml +++ b/config/locales/doorkeeper.ca.yml @@ -83,6 +83,7 @@ ca: access_denied: El propietari del recurs o servidor d'autorizació ha denegat la petició. credential_flow_not_configured: Les credencials de contrasenya del propietari del recurs han fallat degut a que Doorkeeper.configure.resource_owner_from_credentials està sense configurar. invalid_client: La autentificació del client ha fallat perquè és un client desconegut o no està inclòsa l'autentificació del client o el mètode d'autenticació no està confirmat. + invalid_code_challenge_method: El mètode de desafiament de codi ha de ser S256, no es permet que sigui pla. invalid_grant: La concessió d'autorizació oferta és invàlida, ha vençut, s'ha revocat, no coincideix amb l'URI de redirecció utilizada en la petició d'autorizació, o fou emesa per a un altre client. invalid_redirect_uri: L'uri de redirecció inclòsa no és vàlida. invalid_request: diff --git a/config/locales/doorkeeper.cy.yml b/config/locales/doorkeeper.cy.yml index e023bc060312c8..f15d74d72146a8 100644 --- a/config/locales/doorkeeper.cy.yml +++ b/config/locales/doorkeeper.cy.yml @@ -83,6 +83,7 @@ cy: access_denied: Mae perchennog yr adnodd neu'r gweinydd awdurdodi wedi atal y cais. credential_flow_not_configured: Llif meini prawf cyfrinair perchennog yr adnodd wedi methu achos fod Doorkeeper.configure.resource_owner_from_credentials heb ei ffurfweddu. invalid_client: Methodd dilysu cleient oherwydd cleient anhysbys, dim dilysiad cleient wedi'i gynnwys, neu ddull dilysu heb ei gefnogi. + invalid_code_challenge_method: Rhaid i'r dull herio cod fod yn S256, nid oes cefnogaeth i'r plaen. invalid_grant: Mae'r grant awdurdodi ar yr amod yn annilys, wedi dod i ben, wedi'i ddirymu, nid yw'n cyfateb i'r URI ailgyfeirio a ddefnyddiwyd yn y cais am awdurdodiad, neu wedi'i roi i gleient arall. invalid_redirect_uri: Nid yw'r uri ailgyfeirio a gynhwysir yn ddilys. invalid_request: diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml index d462f43d3bc051..cd11dcf4e391ff 100644 --- a/config/locales/doorkeeper.da.yml +++ b/config/locales/doorkeeper.da.yml @@ -83,6 +83,7 @@ da: access_denied: Ressourceejeren eller godkendelsesserveren afviste anmodningen. credential_flow_not_configured: Ressourceejeradgangskodeakkreditiver-flow mislykkedes grundet ikke-opsat Doorkeeper.configure.resource_owner_from_credentials. invalid_client: Klientgodkendelse mislykkedes grundet en ukendt klient, ingen inkluderet klientgodkendelse eller uunderstøttet godkendelsesmetode. + invalid_code_challenge_method: Kodeudfordringsmetoden skal være S256, simpel (plain) er uunderstøttet. invalid_grant: Den leverede godkendelse er ugyldig, udløbet, ophævet, matcher ikke omdirigerings-URI'en brugt i godkendelsesanmodningen eller er udstedt til en anden klient. invalid_redirect_uri: Inkluderede ormdirigerings-URI er ugyldig. invalid_request: diff --git a/config/locales/doorkeeper.de.yml b/config/locales/doorkeeper.de.yml index f303aa23a26a01..b29d668b2ed2ef 100644 --- a/config/locales/doorkeeper.de.yml +++ b/config/locales/doorkeeper.de.yml @@ -83,6 +83,7 @@ de: access_denied: Diese Anfrage wurde von den Inhaber*innen oder durch den Autorisierungsserver abgelehnt. credential_flow_not_configured: Das Konto konnte nicht gefunden werden, da Doorkeeper.configure.resource_owner_from_credentials nicht konfiguriert ist. invalid_client: 'Client-Authentisierung ist fehlgeschlagen: Client unbekannt, keine Authentisierung mitgeliefert oder Authentisierungsmethode wird nicht unterstützt.' + invalid_code_challenge_method: Die Code-Challenge-Methode muss „S256“ sein, „plain“ wird nicht unterstützt. invalid_grant: Die beigefügte Autorisierung ist ungültig, abgelaufen, wurde widerrufen oder einem anderen Client ausgestellt, oder der Weiterleitungs-URI stimmt nicht mit der Autorisierungs-Anfrage überein. invalid_redirect_uri: Der beigefügte Weiterleitungs-URI ist ungültig. invalid_request: diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml index b623cc713506fe..e28f6a79664be1 100644 --- a/config/locales/doorkeeper.en.yml +++ b/config/locales/doorkeeper.en.yml @@ -83,6 +83,7 @@ en: access_denied: The resource owner or authorization server denied the request. credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured. invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method. + invalid_code_challenge_method: The code challenge method must be S256, plain is unsupported. invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. invalid_redirect_uri: The redirect uri included is not valid. invalid_request: diff --git a/config/locales/doorkeeper.es-AR.yml b/config/locales/doorkeeper.es-AR.yml index 0b04696b6a14bb..91f41912477480 100644 --- a/config/locales/doorkeeper.es-AR.yml +++ b/config/locales/doorkeeper.es-AR.yml @@ -83,6 +83,7 @@ es-AR: access_denied: El propietario del recurso o servidor de autorización denegó la petición. credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso fallaron debido a que "Doorkeeper.configure.resource_owner_from_credentials" está sin configurar. invalid_client: La autenticación del cliente falló debido a que es un cliente desconocido, o no está incluída la autenticación del cliente, o el método de autenticación no está soportado. + invalid_code_challenge_method: El método de desafío de código debe ser S256, «plain» no está soportado. invalid_grant: La concesión de autorización ofrecida no es válida, venció, se revocó, no coincide con la dirección web de redireccionamiento usada en la petición de autorización, o fue emitida para otro cliente. invalid_redirect_uri: La dirección web de redireccionamiento incluida no es válida. invalid_request: diff --git a/config/locales/doorkeeper.es-MX.yml b/config/locales/doorkeeper.es-MX.yml index 54386c4c3326de..b5987676d2824c 100644 --- a/config/locales/doorkeeper.es-MX.yml +++ b/config/locales/doorkeeper.es-MX.yml @@ -83,6 +83,7 @@ es-MX: access_denied: El propietario del recurso o servidor de autorización denegó la petición. credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_from_credentials está sin configurar. invalid_client: La autentificación del cliente falló ya que es un cliente desconocido, no está incluída la autentificación del cliente o el método de autentificación no es compatible. + invalid_code_challenge_method: El método de desafío de código debe ser S256, «plain» no está soportado. invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente. invalid_redirect_uri: La URI de redirección incluida no es válida. invalid_request: diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml index 9be036a1d46ce6..b3c7ccddd46d89 100644 --- a/config/locales/doorkeeper.es.yml +++ b/config/locales/doorkeeper.es.yml @@ -83,6 +83,7 @@ es: access_denied: El propietario del recurso o servidor de autorización denegó la petición. credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_from_credentials está sin configurar. invalid_client: La autentificación del cliente falló debido o a que es un cliente desconocido o no está incluída la autentificación del cliente o el método de autentificación no está confirmado. + invalid_code_challenge_method: El método de desafío de código debe ser S256, «plain» no está soportado. invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente. invalid_redirect_uri: La URI de redirección incluida no es válida. invalid_request: diff --git a/config/locales/doorkeeper.fi.yml b/config/locales/doorkeeper.fi.yml index b028c10a826270..ce8aef4a9fc6cb 100644 --- a/config/locales/doorkeeper.fi.yml +++ b/config/locales/doorkeeper.fi.yml @@ -4,7 +4,7 @@ fi: attributes: doorkeeper/application: name: Sovelluksen nimi - redirect_uri: Uudelleenohjauksen URI + redirect_uri: Uudelleenohjaus-URI scopes: Oikeudet website: Sovelluksen verkkosivusto errors: @@ -12,10 +12,10 @@ fi: doorkeeper/application: attributes: redirect_uri: - fragment_present: ei voi sisältää osia. + fragment_present: ei voi sisältää ankkuria (#). invalid_uri: on oltava kelvollinen URI. relative_uri: on oltava täysi URI. - secured_uri: on oltava HTTPS/SSL-URI. + secured_uri: on oltava HTTPS-/SSL-URI. doorkeeper: applications: buttons: @@ -31,7 +31,7 @@ fi: form: error: Hupsis! Tarkista, ettei lomakkeessasi ole virheitä help: - native_redirect_uri: Käytä %{native_redirect_uri} paikallisiin testeihin + native_redirect_uri: Käytä tunnistetta %{native_redirect_uri} paikallisiin testeihin redirect_uri: Lisää jokainen URI omalle rivilleen scopes: Erota oikeudet välilyönneillä. Jätä kenttä tyhjäksi, jos haluat käyttää oletusoikeuksia. index: @@ -43,15 +43,15 @@ fi: new: Uusi sovellus scopes: Oikeudet show: Näytä - title: Omat sovellukset + title: Omat sovelluksesi new: title: Uusi sovellus show: actions: Toiminnot - application_id: Ohjelman tunnus + application_id: Asiakasohjelman tunnus callback_urls: Takaisinkutsu-URL:t scopes: Oikeudet - secret: Ohjelman salaisuus + secret: Asiakasohjelman salaisuus title: 'Sovellus: %{name}' authorizations: buttons: @@ -60,14 +60,14 @@ fi: error: title: Tapahtui virhe new: - prompt_html: "%{client_name} pyytää lupaa käyttää tiliäsi. Se on kolmannen osapuolen sovellus. Jos et luota siihen, älä valtuuta sitä." + prompt_html: "%{client_name} pyytää oikeutta käyttää tiliäsi. Se on kolmannen osapuolen sovellus. Jos et luota siihen, älä valtuuta sitä." review_permissions: Tarkista käyttöoikeudet title: Valtuutus vaaditaan show: title: Kopioi tämä valtuutuskoodi ja liitä se sovellukseen. authorized_applications: buttons: - revoke: Hylkää + revoke: Poista confirmations: revoke: Oletko varma? index: @@ -75,19 +75,20 @@ fi: description_html: Nämä sovellukset voivat käyttää tiliäsi ohjelmointirajapinnan kautta. Jos tässä on sovelluksia, joita et tunnista, tai sovellus toimii väärin, voit peruuttaa sen käyttöoikeuden. last_used_at: Käytetty viimeksi %{date} never_used: Ei käytetty - scopes: Oikeudet + scopes: Käyttöoikeudet superapp: Sisäinen - title: Valtuutetut sovellukset + title: Valtuuttamasi sovellukset errors: messages: access_denied: Resurssin omistaja tai valtuutuspalvelin hylkäsi pyynnön. credential_flow_not_configured: Resurssin omistajan salasanatietojen luku epäonnistui, koska asetusta Doorkeeper.configure.resource_owner_from_credentials ei ole konfiguroitu. - invalid_client: Asiakasohjelman valtuutus epäonnistui, koska asiakas on tuntematon, asiakkaan valtuutus ei ollut mukana tai valtuutustapaa ei tueta. - invalid_grant: Valtuutuslupa on virheellinen, umpeutunut, peruttu, valtuutuspyynnössä käytettyä uudelleenohjaus-URI:tä vastaamaton tai myönnetty toiselle asiakkaalle. + invalid_client: Asiakasohjelman todennus epäonnistui, koska asiakas on tuntematon, asiakkaan todennus ei ollut mukana tai todennustapaa ei tueta. + invalid_code_challenge_method: Koodihaastemenetelmän tulee olla S256 – selväkielistä ei tueta. + invalid_grant: Valtuutuslupa on virheellinen, vanhentunut, peruttu, valtuutuspyynnössä käytettyä uudelleenohjaus-URI:tä vastaamaton tai myönnetty toiselle asiakkaalle. invalid_redirect_uri: Uudelleenohjaus-URI on virheellinen. invalid_request: missing_param: 'Vaadittu parametri puuttuu: %{value}.' - request_not_authorized: Pyyntö on hyväksyttävä. Vaadittu parametri pyynnön hyväksymiseksi puuttuu tai on virheellinen. + request_not_authorized: Pyyntö on valtuutettava. Vaadittu parametri pyynnön valtuuttamiseksi puuttuu tai on virheellinen. unknown: Pyynnöstä puuttuu vaadittu parametri, se sisältää tukemattoman parametriarvon tai on muulla tavoin väärin muotoiltu. invalid_resource_owner: Annetut resurssin omistajan tunnnukset ovat virheelliset, tai resurssin omistajaa ei löydy invalid_scope: Pyydetyt oikeudet ovat virheellisiä, tuntemattomia tai väärin muotoiltuja. @@ -129,8 +130,8 @@ fi: crypto: Päästä päähän -salaus favourites: Suosikit filters: Suodattimet - follow: Seuraamiset, mykistykset ja estot - follows: Seuraa + follow: Seuratut, mykistykset ja estot + follows: Seuratut lists: Listat media: Medialiitteet mutes: Mykistykset @@ -139,7 +140,7 @@ fi: push: Puskuilmoitukset reports: Raportit search: Hae - statuses: Viestit + statuses: Julkaisut layouts: admin: nav: @@ -157,18 +158,18 @@ fi: admin:read:ip_blocks: lue arkaluonteisia tietoja kaikista estetyistä IP-osoitteista admin:read:reports: lue arkaluonteisia tietoja kaikista raporteista ja raportoiduista tileistä admin:write: muokkaa kaikkia palvelimen tietoja - admin:write:accounts: suorita valvontatoimia tileille - admin:write:canonical_email_blocks: suorita valvontatoimia estetyille kanonisille sähköpostiosoitteille - admin:write:domain_allows: suorita valvontatoimia sallituille verkkotunnuksille - admin:write:domain_blocks: suorita valvontatoimia estetyille verkkotunnuksille - admin:write:email_domain_blocks: suorita valvontatoimia estetyille sähköpostiverkkotunnuksille - admin:write:ip_blocks: suorita valvontatoimia estetyille IP-osoitteille - admin:write:reports: suorita valvontatoimia raporteille + admin:write:accounts: suorita moderointitoimia tileille + admin:write:canonical_email_blocks: suorita moderointitoimia estetyille kanonisille sähköpostiosoitteille + admin:write:domain_allows: suorita moderointitoimia sallituille verkkotunnuksille + admin:write:domain_blocks: suorita moderointitoimia estetyille verkkotunnuksille + admin:write:email_domain_blocks: suorita moderointitoimia estetyille sähköpostiverkkotunnuksille + admin:write:ip_blocks: suorita moderointitoimia estetyille IP-osoitteille + admin:write:reports: suorita moderointitoimia raporteille crypto: käytä päästä päähän -salausta - follow: muokkaa tilin suhteita + follow: muokkaa tilin seurantasuhteita profile: lue vain tilisi profiilitietoja - push: vastaanota puskuilmoituksiasi - read: lue kaikkia tilin tietoja + push: vastaanota puskuilmoituksesi + read: lue kaikkia tilisi tietoja read:accounts: katso tilien tietoja read:blocks: katso estojasi read:bookmarks: katso kirjanmerkkejäsi @@ -186,7 +187,7 @@ fi: write:blocks: estä tilejä ja verkkotunnuksia write:bookmarks: lisää julkaisuja kirjanmerkkeihin write:conversations: mykistä ja poista keskusteluja - write:favourites: suosikkijulkaisut + write:favourites: lisää julkaisuja suosikkeihin write:filters: luo suodattimia write:follows: seuraa käyttäjiä write:lists: luo listoja diff --git a/config/locales/doorkeeper.fo.yml b/config/locales/doorkeeper.fo.yml index bd9457b620b83f..29f8cd3387ee49 100644 --- a/config/locales/doorkeeper.fo.yml +++ b/config/locales/doorkeeper.fo.yml @@ -83,6 +83,7 @@ fo: access_denied: Tilfarseigarin ella váttanarambætarin noktaðu umbønina. credential_flow_not_configured: Resource Owner Password Credentials floymurin eydnaðist ikki. Orsøkin var, at Doorkeeper.configure.resource_owner_from_credentials var ikki sett upp. invalid_client: Viðskiftaraváttan miseydnaðist. Orsøkin var ein ókendur viðskiftari, at eingin viðskiftaraváttan var við ella at váttanarmannagongdin er ókend. + invalid_code_challenge_method: Koduavbjóðingarmetodan má vera S256, einfalt format riggar ikki. invalid_grant: Veitta váttanarheimildin er antin ógildug, útgingin, tikin aftur, samsvarar ikki við endursendingar-URI'ið, sum bleiv brúkt í váttanarumbønini ella var flýggjað øðrum viðskiftara. invalid_redirect_uri: Endursendingar-URI'ið, sum var viðheft, er ógyldugt. invalid_request: diff --git a/config/locales/doorkeeper.ga.yml b/config/locales/doorkeeper.ga.yml index 09857768e39744..95c3c4d2237449 100644 --- a/config/locales/doorkeeper.ga.yml +++ b/config/locales/doorkeeper.ga.yml @@ -83,6 +83,7 @@ ga: access_denied: Shéan úinéir na hacmhainne nó an freastalaí údaraithe an t-iarratas. credential_flow_not_configured: Theip ar shreabhadh Dintiúir Pasfhocal Úinéir Acmhainne toisc go raibh Doorkeeper.configure.resource_owner_from_credentials díchumraithe. invalid_client: Theip ar fhíordheimhniú cliant de bharr cliant anaithnid, níl fíordheimhniú cliant san áireamh, nó modh fíordheimhnithe nach dtacaítear leis. + invalid_code_challenge_method: Ní mór gur S256 an modh dúshlán cód, ach ní thacaítear leis. invalid_grant: Tá an deonú údaraithe ar choinníoll neamhbhailí, imithe in éag, cúlghairthe, nach ionann é agus an URI atreoraithe a úsáideadh san iarratas ar údarú, nó gur eisíodh é chuig cliant eile. invalid_redirect_uri: Níl an uri atreoraithe atá san áireamh bailí. invalid_request: diff --git a/config/locales/doorkeeper.gd.yml b/config/locales/doorkeeper.gd.yml index 4db4497b4ea25c..1db1a90f8014a3 100644 --- a/config/locales/doorkeeper.gd.yml +++ b/config/locales/doorkeeper.gd.yml @@ -83,6 +83,7 @@ gd: access_denied: Dhiùlt sealbhadair a’ ghoireis no am frithealaiche ùghdarrachaidh an t-iarrtas. credential_flow_not_configured: Dh’fhàillig le sruth cruthachadh teisteas facail-fhaire do shealbhadair a’ ghoireis ri linn Doorkeeper.configure.resource_owner_from_credentials gun rèiteachadh. invalid_client: Dh’fhàillig le dearbhadh a’ chliant ri linn cliant nach aithne dhuinn, dearbhadh cliant nach deach gabhail a-staigh no dòigh dearbhaidh ris nach cuirear taic. + invalid_code_challenge_method: Feumaidh an dòigh an dùbhlain a bhith na S256, chan eil taic ri plain. invalid_grant: Chan eil an t-ùghdarrachadh a chaidh a thoirt seachad dligheach, dh’fhalbh an ùine air, chaidh a chùl-ghairm no chan eil e a-rèir URI an ath-stiùiridh a chaidh a chleachdadh san iarrtas ùghdarrachaidh no chaidh fhoillseachadh le cliant eile. invalid_redirect_uri: Chan eil an URI ath-stiùiridh a chaidh a ghabhail a-staigh dligheach. invalid_request: @@ -135,6 +136,7 @@ gd: media: Ceanglachain mheadhanan mutes: Mùchaidhean notifications: Brathan + profile: A’ phròifil Mastodon agad push: Brathan putaidh reports: Gearanan search: Lorg @@ -165,6 +167,7 @@ gd: admin:write:reports: gnìomhan na maorsainneachd air gearanan crypto: cleachdadh crioptachaidh o cheann gu ceann follow: atharrachadh dàimhean chunntasan + profile: leughadh fiosrachadh pròifil a’ chunntais agad a-mhàin push: faighinn nam brathan putaidh agad read: leughadh dàta sam bith a’ cunntais agad read:accounts: sealltainn fiosrachadh nan cunntasan diff --git a/config/locales/doorkeeper.he.yml b/config/locales/doorkeeper.he.yml index 7a664c486e2b49..16a8fc94cf54d6 100644 --- a/config/locales/doorkeeper.he.yml +++ b/config/locales/doorkeeper.he.yml @@ -83,6 +83,7 @@ he: access_denied: בעלי המשאב או שרת ההרשאה דחו את הבקשה. credential_flow_not_configured: התהליך "Resource Owner Password Credentials" נכשל בשל חוסר בתצורת Doorkeeper.configure.resource_owner_from_credentials. invalid_client: הרשאת הלקוח נכשלה עקב לקוח שאינו ידוע, חוסר בהרשאת לקוח או שיטת הרשאה שאינה נתמכת. + invalid_code_challenge_method: הצופן חייב להיות בשיטת S256, לא תומכים בבלתי מוצפן. invalid_grant: חוזה ההרשאה המצורף אינו חוקי, אינו תקף, מבוטל, או שאינו מתאים לקישורית ההפניה שבשימוש על ידי בקשת ההרשאה, או שהופק על ידי לקוח אחר. invalid_redirect_uri: קישורית ההפניה המצורפת אינה חוקית. invalid_request: diff --git a/config/locales/doorkeeper.is.yml b/config/locales/doorkeeper.is.yml index 84a4d389547f04..01093f44298a42 100644 --- a/config/locales/doorkeeper.is.yml +++ b/config/locales/doorkeeper.is.yml @@ -83,6 +83,7 @@ is: access_denied: Eigandi tilfangs eða auðkenningarþjónn höfnuðu beininni. credential_flow_not_configured: Flæði á lykilorðsauðkennum eiganda tilfangs (Resource Owner) brást vegna þess að Doorkeeper.configure.resource_owner_from_credentials er óskilgreint. invalid_client: Auðkenning á biðlara brást vegna þess að biðlarinn er óþekktur, að auðkenning biðlarans fylgdi ekki með, eða að notuð var óstudd auðkenningaraðferð. + invalid_code_challenge_method: Aðferð við ráðningu kóðans verður að vera í S256, hreinn texti er ekki studdur. invalid_grant: Uppgefin auðkenningarheimild er ógild, útrunnin, afturkölluð, samsvarar ekki endurbirtingarslóðinni í auðkenningarbeiðninni, eða var gefin út til annars biðlara. invalid_redirect_uri: Endurbeiningarslóðin sem fylgdi er ekki gild. invalid_request: diff --git a/config/locales/doorkeeper.it.yml b/config/locales/doorkeeper.it.yml index f5df14deac3373..9654cb2a20b1a3 100644 --- a/config/locales/doorkeeper.it.yml +++ b/config/locales/doorkeeper.it.yml @@ -83,6 +83,7 @@ it: access_denied: Il proprietario della risorsa o il server d'autorizzazione ha negato la richiesta. credential_flow_not_configured: Il processo delle Credenziali Password del Proprietario della Risorsa è fallito a causa della mancata configurazione di Doorkeeper.configure.resource_owner_from_credentials. invalid_client: Autenticazione del client fallita a causa di un client sconosciuto, di nessun'autenticazione del client inclusa o di un metodo d'autenticazione non supportato. + invalid_code_challenge_method: Il metodo di verifica del codice deve essere S256, semplice non è supportato. invalid_grant: L'autorizzazione fornita non è valida, è scaduta, è stata revocata, non corrisponde all'URI di reindirizzamento utilizzato nella richiesta d'autorizzazione o è stata emessa a un altro client. invalid_redirect_uri: L'uri di reindirizzamento incluso non è valido. invalid_request: diff --git a/config/locales/doorkeeper.ko.yml b/config/locales/doorkeeper.ko.yml index 7ec357bf9fdec4..f35333f1df3859 100644 --- a/config/locales/doorkeeper.ko.yml +++ b/config/locales/doorkeeper.ko.yml @@ -83,6 +83,7 @@ ko: access_denied: 리소스 소유자 또는 인증 서버가 요청을 거부했습니다. credential_flow_not_configured: Doorkeeper.configure.resource_owner_from_credentials의 설정이 되어있지 않아 리소스 소유자 암호 자격증명이 실패하였습니다. invalid_client: 클라이언트를 확인할 수 없기 때문에 인증이 실패하였습니다. 클라이언트 자격 증명이 포함되지 않았거나 지원되지 않는 메소드입니다. + invalid_code_challenge_method: 코드 챌린지는 S256이어야 합니다. 평문은 지원되지 않습니다. invalid_grant: 제공된 권한 부여가 잘못되거나, 만료되었거나, 취소되었거나, 권한 부여 요청에 사용된 리디렉션 URI가 일치하지 않거나, 다른 클라이언트에 지정되었습니다. invalid_redirect_uri: 리디렉션 URI가 올바르지 않습니다 invalid_request: diff --git a/config/locales/doorkeeper.lt.yml b/config/locales/doorkeeper.lt.yml index 38bb17ad139918..d04e4c9f2c9610 100644 --- a/config/locales/doorkeeper.lt.yml +++ b/config/locales/doorkeeper.lt.yml @@ -83,6 +83,7 @@ lt: access_denied: Išteklių savininkas (-ė) arba įgaliojimų serveris atmetė užklausą. credential_flow_not_configured: Išteklių savininko slaptažodžio kredencialų srautas nepavyko, nes Doorkeeper.configure.resource_owner_from_credentials nėra nesukonfigūruotas. invalid_client: Kliento tapatybės nustatymas nepavyko dėl nežinomo kliento, neįtraukto kliento tapatybės nustatymo arba nepalaikomo tapatybės nustatymo metodo. + invalid_code_challenge_method: Kodo iššūkio būdas turi būti S256. Paprastas nepalaikomas. invalid_grant: Pateiktas įgaliojimas yra netinkamas, pasibaigęs, panaikintas, neatitinka įgaliojimo užklausoje naudoto nukreipimo URI arba buvo išduotas kitam klientui. invalid_redirect_uri: Nukreipimo uri įtrauktas yra netinkamas. invalid_request: diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml index 0a3d8fd081a81d..65ef826d387d8f 100644 --- a/config/locales/doorkeeper.nl.yml +++ b/config/locales/doorkeeper.nl.yml @@ -83,6 +83,7 @@ nl: access_denied: De resource-eigenaar of autorisatie-server weigerde het verzoek. credential_flow_not_configured: De wachtwoordgegevens-flow van de resource-eigenaar is mislukt omdat Doorkeeper.configure.resource_owner_from_credentials niet is ingesteld. invalid_client: Clientverificatie is mislukt door een onbekende client, ontbrekende client-authenticatie of een niet ondersteunde authenticatie-methode. + invalid_code_challenge_method: De code challenge method moet S256 zijn, plain wordt niet ondersteund. invalid_grant: De verstrekte autorisatie is ongeldig, verlopen, ingetrokken, komt niet overeen met de redirect-URI die is opgegeven of werd uitgegeven aan een andere client. invalid_redirect_uri: De opgegeven redirect-URI is ongeldig. invalid_request: diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml index a18a86e97900ae..bf2da6f8083d76 100644 --- a/config/locales/doorkeeper.pl.yml +++ b/config/locales/doorkeeper.pl.yml @@ -83,6 +83,7 @@ pl: access_denied: Właściciel zasobu lub serwer autoryzujący odrzuciły żądanie. credential_flow_not_configured: Ścieżka "Resource Owner Password Credentials" zakończyła się błędem, ponieważ Doorkeeper.configure.resource_owner_from_credentials nie został skonfigurowany. invalid_client: Autoryzacja klienta nie powiodła się z powodu nieznanego klienta, braku uwierzytelnienia klienta, lub niewspieranej metody uwierzytelniania. + invalid_code_challenge_method: Metodą wyzwania kodowego musi być S256, plain jest nieobsługiwany. invalid_grant: Grant uwierzytelnienia jest niepoprawny, przeterminowany, unieważniony, nie pasuje do URI przekierowwania użytego w żądaniu uwierzytelnienia, lub został wystawiony przez innego klienta. invalid_redirect_uri: URI przekierowania jest nieprawidłowy. invalid_request: diff --git a/config/locales/doorkeeper.pt-PT.yml b/config/locales/doorkeeper.pt-PT.yml index f03cee6b3a61ea..30ea62d9eb5562 100644 --- a/config/locales/doorkeeper.pt-PT.yml +++ b/config/locales/doorkeeper.pt-PT.yml @@ -83,6 +83,7 @@ pt-PT: access_denied: O proprietário do recurso ou servidor de autorização negou o pedido. credential_flow_not_configured: As credenciais da palavra-passe do proprietário do recurso falhou devido a que Doorkeeper.configure.resource_owner_from_credentials não foram configuradas. invalid_client: Autenticação do cliente falhou por causa de um cliente desconhecido, nenhum cliente de autenticação incluído ou método de autenticação não suportado. + invalid_code_challenge_method: O método de validação do código tem de ser S256, o método simples não é suportado. invalid_grant: A concessão de autorização fornecida é inválida, expirou, foi revogada, não corresponde à URI de redirecionamento usada no pedido de autorização ou foi emitida para outro cliente. invalid_redirect_uri: A URI de redirecionamento incluída não é válida. invalid_request: diff --git a/config/locales/doorkeeper.sc.yml b/config/locales/doorkeeper.sc.yml index 297d6bd8f0c3ed..4c18e46197068d 100644 --- a/config/locales/doorkeeper.sc.yml +++ b/config/locales/doorkeeper.sc.yml @@ -110,10 +110,11 @@ sc: accounts: Contos bookmarks: Sinnalibros conversations: Arresonadas + favourites: Preferidos filters: Filtros follows: Sighende lists: Listas - media: Allegados multimediales + media: Elementos multimediales alligongiados notifications: Notìficas push: Notìficas push reports: Informes @@ -139,6 +140,7 @@ sc: read:accounts: bìdere is informatziones in su contu read:blocks: bìdere is blocos tuos read:bookmarks: bìdere is sinnalibros tuos + read:favourites: bide is preferidos tuos read:filters: bìdere is filtros tuos read:follows: bìdere is sighiduras tuas read:lists: bìdere is listas tuas @@ -146,11 +148,11 @@ sc: read:notifications: bìdere is notìficas tuas read:reports: bìdere is sinnalatziones tuas read:search: chircare a nòmine tuo - read:statuses: bìdere totu is istados + read:statuses: bide totu is publicatziones write: modificare totu is datos de su contu tuo write:accounts: modificare su profilu tuo write:blocks: blocare contos e domìnios - write:bookmarks: agiùnghere is istados a is sinnalibros + write:bookmarks: agiunghe is publicatziones a is sinnalibros write:filters: creare filtros write:follows: sighire persones write:lists: creare listas @@ -158,4 +160,4 @@ sc: write:mutes: pònnere persones e arresonadas a sa muda write:notifications: isboidare is notìficas tuas write:reports: sinnalare àteras persones - write:statuses: publicare istados + write:statuses: pùblica diff --git a/config/locales/doorkeeper.sq.yml b/config/locales/doorkeeper.sq.yml index de3415406715fc..651f90b3b4ce42 100644 --- a/config/locales/doorkeeper.sq.yml +++ b/config/locales/doorkeeper.sq.yml @@ -83,6 +83,7 @@ sq: access_denied: I zoti i burimit ose shërbyesi i autorizimit e hodhi poshtë kërkesën. credential_flow_not_configured: Rrjedha për Kredenciale Fjalëkalimi të të Zotit të Burimit dështoi për shkak se Doorkeeper.configure.resource_owner_from_credentials është i paformësuar. invalid_client: Mirëfilltësimi i klientit dështoi për shkak klienti të panjohur, mospërfshirjeje mirëfilltësimi klienti, ose metode të pambuluar mirëfilltësimi. + invalid_code_challenge_method: Metoda me kod duhet të jetë e llojit S256, e thjeshta nuk mbulohet. invalid_grant: Autorizimi i dhënë është i pavlefshëm, ka skaduar, është shfuqizuar, s’përputhet me URI-n e ridrejtimit të përdorur te kërkesa e autorizimit, ose është emetuar për klient tjetër. invalid_redirect_uri: URI e ridrejtimit s’është e vlefshme. invalid_request: diff --git a/config/locales/doorkeeper.sv.yml b/config/locales/doorkeeper.sv.yml index b46c16d4de0f55..83927d10977bd8 100644 --- a/config/locales/doorkeeper.sv.yml +++ b/config/locales/doorkeeper.sv.yml @@ -83,6 +83,7 @@ sv: access_denied: Resursägaren eller behörighetsservern nekade begäran. credential_flow_not_configured: Resurs Ägare Lösenord Credentials flöde misslyckades på grund av att Doorkeeper.configure.resource_owner_from_credentials är okonfigurerad. invalid_client: Klientautentisering misslyckades på grund av okänd klient, ingen klientautentisering inkluderad eller icke godkänd autentiseringsmetod. + invalid_code_challenge_method: Kodutmaningsmetoden måste vara S256, en slät stöds inte. invalid_grant: Det beviljade godkännandetillskottet är ogiltigt, upphört, återkallat, matchar inte den omdirigering URI som användes i auktorisationsförfrågan eller har utfärdats till en annan klient. invalid_redirect_uri: Den omdirigerade uri är inte giltig. invalid_request: diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml index b0d0549d1df2c1..3735386ba3831f 100644 --- a/config/locales/doorkeeper.th.yml +++ b/config/locales/doorkeeper.th.yml @@ -83,6 +83,7 @@ th: access_denied: เจ้าของทรัพยากรหรือเซิร์ฟเวอร์การอนุญาตปฏิเสธคำขอ credential_flow_not_configured: โฟลว์ข้อมูลประจำตัวรหัสผ่านเจ้าของทรัพยากรล้มเหลวเนื่องจากไม่ได้กำหนดค่า Doorkeeper.configure.resource_owner_from_credentials invalid_client: การรับรองความถูกต้องไคลเอ็นต์ล้มเหลวเนื่องจากไคลเอ็นต์ที่ไม่รู้จัก ไม่ได้รวมการรับรองความถูกต้องไคลเอ็นต์ หรือวิธีการรับรองความถูกต้องที่ไม่รองรับ + invalid_code_challenge_method: วิธีการทดสอบรหัสต้องเป็น S256 ไม่รองรับแบบธรรมดา invalid_grant: การให้การรับรองความถูกต้องที่ให้มาไม่ถูกต้อง หมดอายุแล้ว เพิกถอนแล้ว ไม่ตรงกับ URI การเปลี่ยนเส้นทางที่ใช้ในคำขอการรับรองความถูกต้อง หรือออกให้ไคลเอ็นต์อื่น invalid_redirect_uri: URI การเปลี่ยนเส้นทางที่รวมอยู่ไม่ถูกต้อง invalid_request: diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml index 330449b1b5f5e2..41996d96035b32 100644 --- a/config/locales/doorkeeper.tr.yml +++ b/config/locales/doorkeeper.tr.yml @@ -83,6 +83,7 @@ tr: access_denied: Kaynak sahibi veya yetkilendirme sunucusu isteği reddetti. credential_flow_not_configured: Kaynak Sahibi Parolası Kimlik Bilgileri akışı Doorkeeper.configure.resource_owner_from_credentials 'ın yapılandırılmamış olması nedeniyle başarısız oldu. invalid_client: İstemcinin kimlik doğrulaması bilinmeyen istemci, istemci kimlik doğrulamasının dahil olmaması veya desteklenmeyen kimlik doğrulama yöntemi nedeniyle başarısız oldu. + invalid_code_challenge_method: Kod zorluk metodu S256 olmalı, düz yöntem desteklenmiyor. invalid_grant: Sağlanan yetkilendirme izni geçersiz, süresi dolmuş, iptal edilmiş, yetkilendirme isteğinde kullanılan yönlendirme URL'siyle eşleşmiyor veya başka bir istemciye verilmiş. invalid_redirect_uri: Dahil edilmiş yönlendirme uri'si geçersiz. invalid_request: diff --git a/config/locales/doorkeeper.uk.yml b/config/locales/doorkeeper.uk.yml index ca54fcb65a83be..55b91fd69dabdc 100644 --- a/config/locales/doorkeeper.uk.yml +++ b/config/locales/doorkeeper.uk.yml @@ -83,6 +83,7 @@ uk: access_denied: Власник ресурсу або сервер авторизації відхилив Ваш запит. credential_flow_not_configured: Не вдалося перевірити парольні дані клієнту через неналаштований параметр Doorkeeper.configure.resource_owner_from_credentials. invalid_client: Не вдалося аутентифікувати клієнта (клієнт невідомий, аутентифікацію клієнта не увімкнено, або непідтримуваний метод аутентифікації). + invalid_code_challenge_method: Метод виклику коду повинен бути S256, простий не підтримується. invalid_grant: Наданий санкціонований дозвіл недійсний, прострочений, анульований, не відповідає URI перенаправлення, що використовується в запиті авторизації, або був виданий іншому клієнту. invalid_redirect_uri: Включений uri перенаправлення не є дійсним. invalid_request: diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml index d0bdd2cc7b1606..5837961737aa63 100644 --- a/config/locales/doorkeeper.vi.yml +++ b/config/locales/doorkeeper.vi.yml @@ -83,6 +83,7 @@ vi: access_denied: Chủ sở hữu tài nguyên hoặc máy chủ đã từ chối yêu cầu. credential_flow_not_configured: Resource Owner Password Credentials không thành công do Doorkeeper.configure.resource_owner_from_credentials không được định cấu hình. invalid_client: Xác minh ứng dụng khách không thành công do máy khách mơ hồ, không bao gồm xác thực ứng dụng khách hoặc phương thức xác thực không được hỗ trợ. + invalid_code_challenge_method: Phương pháp thử thách mã phải là S256, phương pháp plain không được hỗ trợ. invalid_grant: Yêu cầu không hợp lệ, hết hạn, bị gỡ hoặc không khớp với tài khoản đã cấp phép. Hoặc xung đột với ứng dụng khác. invalid_redirect_uri: URL chuyển hướng không hợp lệ. invalid_request: diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml index 18477bc84581df..36bbe2b8745274 100644 --- a/config/locales/doorkeeper.zh-CN.yml +++ b/config/locales/doorkeeper.zh-CN.yml @@ -83,6 +83,7 @@ zh-CN: access_denied: 资源所有者或验证服务器拒绝了此请求 credential_flow_not_configured: 由于 Doorkeeper.configure.resource_owner_from_credentials 尚未配置,应用验证授权流程失败。 invalid_client: 由于应用信息未知、未提交认证信息或使用了不支持的认证方式,认证失败 + invalid_code_challenge_method: 代码验证方法必须是 S256,不支持明文。 invalid_grant: 授权方式无效、过期或已被撤销、与授权请求中的回调地址不一致,或使用了其他应用的回调地址 invalid_redirect_uri: 无效的登录回调地址 invalid_request: diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml index d12651a6486e2d..1a4c62fdbf6fc9 100644 --- a/config/locales/doorkeeper.zh-TW.yml +++ b/config/locales/doorkeeper.zh-TW.yml @@ -83,6 +83,7 @@ zh-TW: access_denied: 資源持有者或授權伺服器拒絕請求。 credential_flow_not_configured: 因為 Doorkeeper.configure.resource_owner_from_credentials 未設定,所以資源持有者密碼認證程序失敗。 invalid_client: 用戶端驗證失敗,可能是因為未知的用戶端程式、未包含用戶端驗證、或使用了不支援的認證方法。 + invalid_code_challenge_method: code challenge 方式必須為 S256 (SHA256),不支援 plain 方式。 invalid_grant: 授權申請不正確、逾期、已被註銷、與授權請求內的重新導向 URI 不符、或屬於別的用戶端程式。 invalid_redirect_uri: 包含的重新導向 URI 是不正確的。 invalid_request: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index fecdab4c7d7316..a7e6ed7a665e61 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -471,6 +471,9 @@ en-GB: title: Follow recommendations unsuppress: Restore follow recommendation instances: + audit_log: + title: Recent Audit Logs + view_all: View full audit logs availability: description_html: one: If delivering to the domain fails %{count} day without succeeding, no further delivery attempts will be made unless a delivery from the domain is received. diff --git a/config/locales/en.yml b/config/locales/en.yml index 77afb887e5a558..7bc63eaf10d62b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -885,7 +885,23 @@ en: action: Check here for more information message_html: "Your object storage is misconfigured. The privacy of your users is at risk." tags: + moderation: + not_trendable: Not trendable + not_usable: Not usable + pending_review: Pending review + review_requested: Review requested + reviewed: Reviewed + title: Status + trendable: Trendable + unreviewed: Unreviewed + usable: Usable + name: Name + newest: Newest + oldest: Oldest + reset: Reset review: Review status + search: Search + title: Hashtags updated_msg: Hashtag settings updated successfully title: Administration trends: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 5add90ae62c992..8ebe203560a0ad 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -471,6 +471,9 @@ es-AR: title: Recom. de cuentas a seguir unsuppress: Restablecer recomendaciones de cuentas para seguir instances: + audit_log: + title: Registros de auditoría recientes + view_all: Ver registros de auditoría completos availability: description_html: one: Si el envío al dominio falla durante %{count} día sin éxito, no se harán más intentos de entrega a menos que se reciba un envío desde el dominio. @@ -639,7 +642,7 @@ es-AR: report: 'Denuncia #%{id}' reported_account: Cuenta denunciada reported_by: Denunciada por - reported_with_application: Informado a través de la aplicación + reported_with_application: Denunciado con aplicación resolved: Resueltas resolved_msg: "¡Denuncia exitosamente resuelta!" skip_to_actions: Ir directamente a las acciones @@ -882,7 +885,23 @@ es-AR: action: Revisá acá para más información message_html: "El almacenamiento de tu objeto está mal configurado. La privacidad de tus usuarios está en riesgo." tags: + moderation: + not_trendable: No disponible para tendencia + not_usable: No disponible para uso + pending_review: Revisión pendiente + review_requested: Revisión solicitada + reviewed: Revisada + title: Estado + trendable: Disponible para tendencia + unreviewed: No revisada + usable: Disponible para uso + name: Nombre + newest: Lo más reciente + oldest: Lo más antiguo + reset: Restablecer review: Estado de revisión + search: Buscar + title: Etiquetas updated_msg: La configuración de la etiqueta se actualizó exitosamente title: Administración trends: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 22531d2403dfa1..1623d110267590 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -471,6 +471,9 @@ es-MX: title: Recomendaciones de cuentas unsuppress: Restaurar recomendaciones de cuentas instances: + audit_log: + title: Registros de auditoría recientes + view_all: Ver registros de auditoría completos availability: description_html: one: Si el envío al dominio falla %{count} día sin éxito, no se harán más intentos de entrega a menos que se reciba un envío desde el dominio. @@ -882,7 +885,23 @@ es-MX: action: Para más información aquí message_html: "Su almacenamiento no está configurado. Está en riesgo la privacidad de sus usuarios." tags: + moderation: + not_trendable: No puede ser tendencia + not_usable: No disponible + pending_review: Pendientes de revisión + review_requested: Revisión solicitada + reviewed: Revisada + title: Estado + trendable: Puede ser tendencia + unreviewed: Sin revisar + usable: Disponible + name: Nombre + newest: Más reciente + oldest: Menos reciente + reset: Reiniciar review: Estado de revisión + search: Buscar + title: Etiquetas updated_msg: Hashtags actualizados exitosamente title: Administración trends: diff --git a/config/locales/es.yml b/config/locales/es.yml index 567526fe8b7494..9e3689557ac97f 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -471,6 +471,9 @@ es: title: Recomendaciones de cuentas unsuppress: Restaurar recomendaciones de cuentas instances: + audit_log: + title: Registros de auditoría recientes + view_all: Ver registros de auditoría completos availability: description_html: one: Si el envío al dominio falla %{count} día sin éxito, no se harán más intentos de entrega a menos que se reciba un envío desde el dominio. @@ -882,7 +885,23 @@ es: action: Haga clic aquí para obtener más información message_html: "El almacenamiento de su objeto está mal configurado. La privacidad de sus usuarios está en riesgo." tags: + moderation: + not_trendable: No puede ser tendencia + not_usable: No disponible + pending_review: Pendientes de revisión + review_requested: Revisión solicitada + reviewed: Revisada + title: Estado + trendable: Puede ser tendencia + unreviewed: Sin revisar + usable: Disponible + name: Nombre + newest: Más reciente + oldest: Menos reciente + reset: Reiniciar review: Estado de revisión + search: Buscar + title: Etiquetas updated_msg: Hashtags actualizados exitosamente title: Administración trends: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index c93c5edc0e664e..d90de587b7c81f 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -12,7 +12,7 @@ fi: one: seuraaja other: seuraajaa following: seurattu(a) - instance_actor_flash: Tämä tili on virtuaalinen toimija, jota käytetään edustamaan itse palvelinta eikä yksittäistä käyttäjää. Sitä käytetään liittoutumistarkoituksiin, eikä sitä tule jäädyttää. + instance_actor_flash: Tämä tili on virtuaalinen toimija, jota käytetään edustamaan itse palvelinta eikä yksittäistä käyttäjää. Sitä käytetään federointitarkoituksiin, eikä sitä tule jäädyttää. last_active: viimeksi aktiivinen link_verified_on: Tämän linkin omistus on tarkastettu %{date} nothing_here: Täällä ei ole mitään! @@ -24,12 +24,12 @@ fi: posts_tab_heading: Julkaisut admin: account_actions: - action: Suorita toimenpide - title: Suorita valvontatoimi käyttäjälle %{acct} + action: Suorita toimi + title: Suorita moderointitoimi käyttäjälle %{acct} account_moderation_notes: create: Jätä muistiinpano - created_msg: Valvontamuistiinpanon luonti onnistui! - destroyed_msg: Valvontamuistiinpanon poisto onnistui! + created_msg: Moderointimuistiinpanon luonti onnistui! + destroyed_msg: Moderointimuistiinpanon poisto onnistui! accounts: add_email_domain_block: Estä sähköpostiverkkotunnus approve: Hyväksy @@ -38,17 +38,17 @@ fi: avatar: Profiilikuva by_domain: Verkkotunnus change_email: - changed_msg: Sähköpostin vaihto onnistui! - current_email: Nykyinen sähköposti - label: Vaihda sähköposti - new_email: Uusi sähköposti - submit: Vaihda sähköposti + changed_msg: Sähköpostiosoitteen vaihto onnistui! + current_email: Nykyinen sähköpostiosoite + label: Vaihda sähköpostiosoite + new_email: Uusi sähköpostiosoite + submit: Vaihda sähköpostiosoite title: Vaihda käyttäjän %{username} sähköposti-osoite change_role: - changed_msg: Rooli vaihdettu onnistuneesti! - label: Vaihda roolia + changed_msg: Roolin vaihto onnistui! + label: Vaihda rooli no_role: Ei roolia - title: Vaihda käyttäjän %{username} roolia + title: Vaihda käyttäjän %{username} rooli confirm: Vahvista confirmed: Vahvistettu confirming: Vahvistetaan @@ -57,23 +57,23 @@ fi: deleted: Poistettu demote: Alenna destroyed_msg: Käyttäjän %{username} tiedot ovat nyt jonossa poistettavaksi välittömästi - disable: Poista käytöstä - disable_sign_in_token_auth: Poista sähköpostitunnuksen todennus käytöstä - disable_two_factor_authentication: Poista 2FA käytöstä - disabled: Poistettu käytöstä + disable: Jäädytä + disable_sign_in_token_auth: Poista sähköpostitunnuksella todennus käytöstä + disable_two_factor_authentication: Poista kaksivaiheinen todennus käytöstä + disabled: Jäädytetty display_name: Näyttönimi domain: Verkkotunnus edit: Muokkaa - email: Sähköposti - email_status: Sähköpostin tila - enable: Ota käyttöön - enable_sign_in_token_auth: Ota sähköpostitunnuksen todennus käyttöön + email: Sähköpostiosoite + email_status: Sähköpostiosoitteen tila + enable: Kumoa jäädytys + enable_sign_in_token_auth: Ota sähköpostitunnuksella todennus käyttöön enabled: Käytössä - enabled_msg: Käyttäjän %{username} tili palautettu onnistuneesti käyttöön + enabled_msg: Käyttäjän %{username} tilin jäädytys kumottiin onnistuneesti followers: Seuraajat follows: Seuratut header: Otsakekuva - inbox_url: Saapuvan postilaatikon osoite + inbox_url: Postilaatikon osoite invite_request_text: Syitä liittymiseen invited_by: Kutsuja ip: IP-osoite @@ -86,24 +86,24 @@ fi: login_status: Sisäänkirjautumisen tila media_attachments: Medialiitteet memorialize: Muuta muistosivuksi - memorialized: Muutettu muistotiliksi - memorialized_msg: Käyttäjän %{username} tili muutettu onnistuneesti muistotiliksi + memorialized: Muutettu muistosivuksi + memorialized_msg: Käyttäjän %{username} tili muutettiin muistosivuksi onnistuneesti moderation: - active: Aktiivinen + active: Aktiiviset all: Kaikki - disabled: Ei käytössä + disabled: Eivät käytössä pending: Odottavat - silenced: Rajoitettu - suspended: Jäädytetty - title: Valvonta - moderation_notes: Valvontamuistiinpanot + silenced: Rajoitetut + suspended: Jäädytetyt + title: Moderointi + moderation_notes: Moderointimuistiinpanot most_recent_activity: Viimeisin toiminta - most_recent_ip: Viimeisin IP + most_recent_ip: Viimeisin IP-osoite no_account_selected: Tilejä ei muutettu, koska yhtään ei ollut valittuna - no_limits_imposed: Rajoituksia ei ole asetettu - no_role_assigned: Roolia ei ole määritetty + no_limits_imposed: Ei asetettuja rajoituksia + no_role_assigned: Roolia ei asetettu not_subscribed: Ei tilaaja - pending: Odottaa tarkistusta + pending: Odottaa tarkastusta perform_full_suspension: Jäädytä previous_strikes: Aiemmat varoitukset previous_strikes_description_html: @@ -113,34 +113,34 @@ fi: protocol: Protokolla public: Julkinen push_subscription_expires: PuSH-tilaus vanhenee - redownload: Päivitä profiilikuva - redownloaded_msg: Käyttäjän %{username} profiilin päivittäminen alkuperästä onnistui + redownload: Päivitä profiili + redownloaded_msg: Käyttäjän %{username} profiili päivitettiin alkuperästä onnistuneesti reject: Hylkää rejected_msg: Käyttäjän %{username} rekisteröitymishakemus hylättiin remote_suspension_irreversible: Tämän tilin tiedot on poistettu peruuttamattomasti. remote_suspension_reversible_hint_html: Tili on jäädytetty omalla palvelimellaan, ja kaikki tiedot poistetaan %{date}. Sitä ennen etäpalvelin voi palauttaa tilin ongelmitta. Jos haluat poistaa kaikki tilin tiedot heti, onnistuu se alta. remove_avatar: Poista profiilikuva remove_header: Poista otsakekuva - removed_avatar_msg: Käyttäjän %{username} avatar-kuva poistettu onnistuneesti + removed_avatar_msg: Käyttäjän %{username} avatar-kuva poistettiin onnistuneesti removed_header_msg: Käyttäjän %{username} otsakekuva poistettiin onnistuneesti resend_confirmation: already_confirmed: Tämä käyttäjä on jo vahvistettu send: Lähetä vahvistuslinkki uudelleen - success: Vahvistuslinkki on lähetetty! + success: Vahvistuslinkin lähetys onnistui! reset: Palauta reset_password: Palauta salasana resubscribe: Tilaa uudelleen role: Rooli search: Hae - search_same_email_domain: Muut käyttäjät, joilla on sama sähköpostin verkkotunnus + search_same_email_domain: Muut käyttäjät, joilla on sama sähköpostiverkkotunnus search_same_ip: Muut käyttäjät, joilla on sama IP-osoite security: Turvallisuus security_measures: only_password: Vain salasana - password_and_2fa: Salasana ja kaksivaiheinen tunnistautuminen + password_and_2fa: Salasana ja kaksivaiheinen todennus sensitive: Pakota arkaluonteiseksi sensitized: Merkitty arkaluonteiseksi - shared_inbox_url: Jaetun saapuvan postilaatikon osoite + shared_inbox_url: Jaetun postilaatikon osoite show: created_reports: Tämän tilin luomat raportit targeted_reports: Tästä tilistä tehdyt raportit @@ -154,31 +154,31 @@ fi: suspension_irreversible: Tämän tilin tiedot on poistettu peruuttamattomasti. Voit kumota tilin jäädytyksen, jolloin siitä tulee käyttökelpoinen, mutta toiminto ei palauta sillä aiemmin olleita tietoja. suspension_reversible_hint_html: Tili on jäädytetty, ja tiedot poistetaan kokonaan %{date}. Siihen asti tili voidaan palauttaa ongelmitta. Jos haluat poistaa kaikki tilin tiedot heti, onnistuu se alta. title: Tilit - unblock_email: Poista sähköpostiosoitteen esto + unblock_email: Kumoa sähköpostiosoitteen esto unblocked_email_msg: Käyttäjän %{username} sähköpostiosoitteen esto kumottiin - unconfirmed_email: Sähköpostia ei vahvistettu + unconfirmed_email: Vahvistamaton sähköpostiosoite undo_sensitized: Kumoa pakotus arkaluonteiseksi undo_silenced: Kumoa rajoitus - undo_suspension: Peru jäähy - unsilenced_msg: Tilin %{username} rajoituksen kumoaminen onnistui + undo_suspension: Kumoa jäädytys + unsilenced_msg: Tilin %{username} rajoitus kumottiin onnistuneesti unsubscribe: Lopeta tilaus - unsuspended_msg: Tilin %{username} jäädytyksen kumoaminen onnistui + unsuspended_msg: Tilin %{username} jäädytys kumottiin onnistuneesti username: Käyttäjänimi view_domain: Näytä verkkotunnuksen yhteenveto warn: Varoita web: Verkko - whitelisted: Sallittu liittoutua + whitelisted: Salli federointi action_logs: action_types: approve_appeal: Hyväksy valitus approve_user: Hyväksy käyttäjä - assigned_to_self_report: Määritä raportti - change_email_user: Vaihda sähköposti käyttäjälle - change_role_user: Muuta käyttäjän roolia + assigned_to_self_report: Ota raportti käsiteltäväksi + change_email_user: Vaihda käyttäjän sähköpostiosoite + change_role_user: Vaihda käyttäjän rooli confirm_user: Vahvista käyttäjä create_account_warning: Luo varoitus create_announcement: Luo tiedote - create_canonical_email_block: Luo sähköpostin esto + create_canonical_email_block: Luo sähköpostiosoitteen esto create_custom_emoji: Luo mukautettu emoji create_domain_allow: Luo verkkotunnuksen salliminen create_domain_block: Luo verkkotunnuksen esto @@ -188,7 +188,7 @@ fi: create_user_role: Luo rooli demote_user: Alenna käyttäjä destroy_announcement: Poista tiedote - destroy_canonical_email_block: Poista sähköpostin esto + destroy_canonical_email_block: Poista sähköpostiosoitteen esto destroy_custom_emoji: Poista mukautettu emoji destroy_domain_allow: Poista verkkotunnuksen salliminen destroy_domain_block: Poista verkkotunnuksen esto @@ -198,27 +198,27 @@ fi: destroy_status: Poista julkaisu destroy_unavailable_domain: Poista ei-saatavilla oleva verkkotunnus destroy_user_role: Hävitä rooli - disable_2fa_user: Poista kaksivaiheinen tunnistautuminen käytöstä + disable_2fa_user: Poista kaksivaiheinen todennus käytöstä disable_custom_emoji: Poista mukautettu emoji käytöstä - disable_sign_in_token_auth_user: Estä käyttäjältä sähköpostitunnuksen todennus + disable_sign_in_token_auth_user: Poista sähköpostitunnuksella todennus käytöstä käyttäjältä disable_user: Poista tili käytöstä - enable_custom_emoji: Käytä mukautettuja emojeita - enable_sign_in_token_auth_user: Salli käyttäjälle sähköpostitunnuksen todennus + enable_custom_emoji: Ota mukautettu emoji käyttöön + enable_sign_in_token_auth_user: Salli käyttäjälle sähköpostitunnuksella todennus enable_user: Ota tili käyttöön memorialize_account: Muuta muistotiliksi - promote_user: Käyttäjä ylennetty + promote_user: Ylennä käyttäjä reject_appeal: Hylkää valitus reject_user: Hylkää käyttäjä - remove_avatar_user: Profiilikuvan poisto - reopen_report: Uudelleenavaa raportti + remove_avatar_user: Poista profiilikuva + reopen_report: Avaa raportti uudelleen resend_user: Lähetä vahvistusviesti uudelleen - reset_password_user: Nollaa salasana + reset_password_user: Palauta salasana resolve_report: Selvitä raportti - sensitive_account: Pakotus arkaluonteiseksi tiliksi + sensitive_account: Pakota arkaluonteiseksi tiliksi silence_account: Rajoita tiliä suspend_account: Jäädytä tili - unassigned_report: Peruuta raportin määritys - unblock_email_account: Poista sähköpostiosoitteen esto + unassigned_report: Poista raportti käsittelystä + unblock_email_account: Kumoa sähköpostiosoitteen esto unsensitive_account: Kumoa pakotus arkaluonteiseksi tiliksi unsilence_account: Kumoa tilin rajoitus unsuspend_account: Kumoa tilin jäädytys @@ -230,45 +230,45 @@ fi: update_status: Päivitä julkaisu update_user_role: Päivitä rooli actions: - approve_appeal_html: "%{name} hyväksyi valvontapäätöksen valituksen käyttäjältä %{target}" - approve_user_html: "%{name} hyväksyi käyttäjän rekisteröitymisen kohteesta %{target}" - assigned_to_self_report_html: "%{name} otti raportin %{target} tehtäväkseen" + approve_appeal_html: "%{name} hyväksyi käyttäjän %{target} valituksen moderointipäätöksestä" + approve_user_html: "%{name} hyväksyi käyttäjän %{target} rekisteröitymisen" + assigned_to_self_report_html: "%{name} otti raportin %{target} käsiteltäväkseen" change_email_user_html: "%{name} vaihtoi käyttäjän %{target} sähköpostiosoitteen" - change_role_user_html: "%{name} muutti käyttäjän %{target} roolia" + change_role_user_html: "%{name} vaihtoi käyttäjän %{target} roolin" confirm_user_html: "%{name} vahvisti käyttäjän %{target} sähköpostiosoitteen" create_account_warning_html: "%{name} lähetti varoituksen käyttäjälle %{target}" create_announcement_html: "%{name} loi uuden tiedotteen %{target}" - create_canonical_email_block_html: "%{name} esti sähköpostin tiivisteellä %{target}" + create_canonical_email_block_html: "%{name} esti tiivistettä %{target} vastaavan sähköpostiosoitteen" create_custom_emoji_html: "%{name} lähetti uuden emojin %{target}" - create_domain_allow_html: "%{name} salli liittoutumisen verkkotunnuksen %{target} kanssa" + create_domain_allow_html: "%{name} salli federoinnin verkkotunnuksen %{target} kanssa" create_domain_block_html: "%{name} esti verkkotunnuksen %{target}" create_email_domain_block_html: "%{name} esti sähköpostiverkkotunnuksen %{target}" - create_ip_block_html: "%{name} loi IP-säännön %{target}" + create_ip_block_html: "%{name} loi säännön IP-osoitteelle %{target}" create_unavailable_domain_html: "%{name} pysäytti toimituksen verkkotunnukseen %{target}" create_user_role_html: "%{name} loi roolin %{target}" demote_user_html: "%{name} alensi käyttäjän %{target}" destroy_announcement_html: "%{name} poisti tiedotteen %{target}" - destroy_canonical_email_block_html: "%{name} poisti sähköpostin eston tiivisteellä %{target}" + destroy_canonical_email_block_html: "%{name} kumosi eston tiivistettä %{target} vastaavalta sähköpostiosoitteelta" destroy_custom_emoji_html: "%{name} poisti emojin %{target}" - destroy_domain_allow_html: "%{name} kielsi liittoutumisen verkkotunnuksen %{target} kanssa" - destroy_domain_block_html: "%{name} poisti verkkotunnuksen %{target} eston" - destroy_email_domain_block_html: "%{name} poisti sähköpostiverkkotunnuksen %{target} eston" + destroy_domain_allow_html: "%{name} kielsi federoinnin verkkotunnuksen %{target} kanssa" + destroy_domain_block_html: "%{name} kumosi verkkotunnuksen %{target} eston" + destroy_email_domain_block_html: "%{name} kumosi sähköpostiverkkotunnuksen %{target} eston" destroy_instance_html: "%{name} tyhjensi verkkotunnuksen %{target}" - destroy_ip_block_html: "%{name} poisti IP-säännön %{target}" + destroy_ip_block_html: "%{name} poisti säännön IP-osoitteelta %{target}" destroy_status_html: "%{name} poisti käyttäjän %{target} julkaisun" destroy_unavailable_domain_html: "%{name} jatkoi toimitusta verkkotunnukseen %{target}" destroy_user_role_html: "%{name} poisti roolin %{target}" - disable_2fa_user_html: "%{name} poisti käyttäjältä %{target} vaatimuksen kaksivaiheisen todentamiseen" - disable_custom_emoji_html: "%{name} poisti käytöstä emojin %{target}" - disable_sign_in_token_auth_user_html: "%{name} poisti sähköpostitunnuksen %{target} todennuksen käytöstä" - disable_user_html: "%{name} poisti kirjautumisen käyttäjältä %{target}" - enable_custom_emoji_html: "%{name} otti käyttöön emojin %{target}" - enable_sign_in_token_auth_user_html: "%{name} otti todennuksen sähköpostivaltuutuksella käyttöön käyttäjälle %{target}" + disable_2fa_user_html: "%{name} poisti käyttäjältä %{target} vaatimuksen kaksivaiheiseen todentamiseen" + disable_custom_emoji_html: "%{name} poisti emojin %{target} käytöstä" + disable_sign_in_token_auth_user_html: "%{name} poisti sähköpostitunnuksella todennuksen käytöstä käyttäjältä %{target}" + disable_user_html: "%{name} poisti kirjautumisen käytöstä käyttäjältä %{target}" + enable_custom_emoji_html: "%{name} otti emojin %{target} käyttöön" + enable_sign_in_token_auth_user_html: "%{name} otti sähköpostitunnuksella todennuksen käyttöön käyttäjälle %{target}" enable_user_html: "%{name} otti kirjautumisen käyttöön käyttäjälle %{target}" memorialize_account_html: "%{name} muutti käyttäjän %{target} tilin muistosivuksi" promote_user_html: "%{name} ylensi käyttäjän %{target}" - reject_appeal_html: "%{name} hylkäsi valvontapäätöksen valituksen käyttäjältä %{target}" - reject_user_html: "%{name} hylkäsi käyttäjän rekisteröitymisen kohteesta %{target}" + reject_appeal_html: "%{name} hylkäsi käyttäjän %{target} valituksen moderointipäätöksestä" + reject_user_html: "%{name} hylkäsi käyttäjän %{target} rekisteröitymisen" remove_avatar_user_html: "%{name} poisti käyttäjän %{target} profiilikuvan" reopen_report_html: "%{name} avasi uudelleen raportin %{target}" resend_user_html: "%{name} lähetti vahvistussähköpostiviestin uudelleen käyttäjälle %{target}" @@ -277,26 +277,26 @@ fi: sensitive_account_html: "%{name} merkitsi käyttäjän %{target} median arkaluonteiseksi" silence_account_html: "%{name} rajoitti käyttäjän %{target} tiliä" suspend_account_html: "%{name} jäädytti käyttäjän %{target} tilin" - unassigned_report_html: "%{name} peruutti raportin määrityksen %{target}" - unblock_email_account_html: "%{name} poisti käyttäjän %{target} sähköpostiosoitteen eston" + unassigned_report_html: "%{name} poisti raportin %{target} käsittelystä" + unblock_email_account_html: "%{name} kumosi käyttäjän %{target} sähköpostiosoitteen eston" unsensitive_account_html: "%{name} kumosi käyttäjän %{target} median arkaluonteisuusmerkinnän" - unsilence_account_html: "%{name} kumosi käyttäjän %{target} rajoituksen" + unsilence_account_html: "%{name} kumosi käyttäjän %{target} tilin rajoituksen" unsuspend_account_html: "%{name} kumosi käyttäjän %{target} tilin jäädytyksen" update_announcement_html: "%{name} päivitti tiedotteen %{target}" update_custom_emoji_html: "%{name} päivitti emojin %{target}" update_domain_block_html: "%{name} päivitti verkkotunnuksen %{target} eston" - update_ip_block_html: "%{name} muutti sääntöä IP-osoitteelle %{target}" + update_ip_block_html: "%{name} muutti IP-osoitteen %{target} sääntöä" update_report_html: "%{name} päivitti raportin %{target}" update_status_html: "%{name} päivitti käyttäjän %{target} julkaisun" update_user_role_html: "%{name} muutti roolia %{target}" deleted_account: poisti tilin empty: Lokeja ei löytynyt. - filter_by_action: Suodata tapahtuman mukaan + filter_by_action: Suodata toimen mukaan filter_by_user: Suodata käyttäjän mukaan - title: Auditointiloki + title: Tarkastusloki unavailable_instance: "(verkkotunnus ei saatavilla)" announcements: - destroyed_msg: Tiedote poistettu onnistuneesti! + destroyed_msg: Tiedotteen poisto onnistui! edit: title: Muokkaa tiedotetta empty: Tiedotteita ei löytynyt. @@ -305,31 +305,31 @@ fi: create: Luo tiedote title: Uusi tiedote publish: Julkaise - published_msg: Tiedote julkaistu onnistuneesti! + published_msg: Tiedotteen julkaisu onnistui! scheduled_for: Ajoitettu %{time} scheduled_msg: Tiedotteen julkaisu ajoitettu! title: Tiedotteet unpublish: Lopeta julkaisu - unpublished_msg: Tiedotteen julkaisu lopetettu onnistuneesti! - updated_msg: Tiedote päivitetty onnistuneesti! + unpublished_msg: Tiedotteen julkaisun lopetus onnistui! + updated_msg: Tiedotteen päivitys onnistui! critical_update_pending: Kriittinen päivitys odottaa custom_emojis: assign_category: Aseta luokka by_domain: Verkkotunnus - copied_msg: Emojin paikallisen kopion luonti onnistui + copied_msg: Emojista luotiin paikallinen kopio onnistuneesti copy: Kopioi copy_failed_msg: Emojista ei voitu tehdä paikallista kopiota create_new_category: Luo uusi luokka created_msg: Emojin luonti onnistui! delete: Poista - destroyed_msg: Emojon poisto onnistui! + destroyed_msg: Emojon hävitys onnistui! disable: Poista käytöstä disabled: Ei käytössä - disabled_msg: Emojin käytöstäpoisto onnistui + disabled_msg: Emoji poistettiin käytöstä onnistuneesti emoji: Emoji enable: Ota käyttöön enabled: Käytössä - enabled_msg: Emojin käyttöönotto onnistui + enabled_msg: Emoji otettiin käyttöön onnistuneesti image_hint: PNG tai GIF, enintään %{size} list: Lisää listalle listed: Listalla @@ -339,7 +339,7 @@ fi: not_permitted: Sinulla ei ole oikeutta suorittaa tätä toimintoa overwrite: Korvaa shortcode: Lyhennekoodi - shortcode_hint: Vähintään kaksi merkkiä, vain kirjaimia, numeroita ja alaviivoja + shortcode_hint: Vähintään 2 merkkiä, vain kirjaimia, numeroita ja alaviivoja title: Mukautetut emojit uncategorized: Luokittelemattomat unlist: Poista listalta @@ -354,8 +354,8 @@ fi: new_users: uudet käyttäjät opened_reports: avatut raportit pending_appeals_html: - one: "%{count} vireillä oleva valitus" - other: "%{count} vireillä olevaa valitusta" + one: "%{count} odottava valitus" + other: "%{count} odottavaa valitusta" pending_reports_html: one: "%{count} odottava raportti" other: "%{count} odottavaa raporttia" @@ -369,7 +369,7 @@ fi: software: Ohjelmisto sources: Rekisteröitymislähteet space: Tilankäyttö - title: Hallintapaneeli + title: Koontinäyttö top_languages: Aktiivisimmat kielet top_servers: Aktiivisimmat palvelimet website: Sivusto @@ -378,34 +378,34 @@ fi: empty: Valituksia ei löytynyt. title: Valitukset domain_allows: - add_new: Salli liittoutuminen tämän verkkotunnuksen kanssa - created_msg: Verkkotunnuksen on onnistuneesti sallittu liittoutua - destroyed_msg: Verkkotunnusta on kielletty liittoutumasta + add_new: Salli federointi tämän verkkotunnuksen kanssa + created_msg: Verkkotunnuksen kanssa federointi on onnistuneesti sallittu + destroyed_msg: Verkkotunnuksen kanssa federointi on kielletty export: Vie import: Tuo - undo: Kiellä liittoutuminen tämän verkkotunnuksen kanssa + undo: Kiellä federointi tämän verkkotunnuksen kanssa domain_blocks: add_new: Lisää uusi verkkotunnuksen esto confirm_suspension: cancel: Peruuta confirm: Jäädytä - permanent_action: Jäädytyksen kumoaminen ei palauta mitään tietoja tai suhteita. + permanent_action: Jäädytyksen kumoaminen ei palauta mitään tietoja tai seurantasuhteita. preamble_html: Olet jäädyttämässä verkkotunnuksen %{domain} aliverkkotunnuksineen. - remove_all_data: Tämä toiminto poistaa palvelimeltasi kaiken sisällön, median ja profiilitiedot tämän palvelun tileiltä. + remove_all_data: Tämä poistaa palvelimeltasi kaiken sisällön, median ja profiilitiedot tämän verkkotunnuksen tileiltä. stop_communication: Palvelimesi lopettaa viestinnän näiden palvelinten kanssa. title: Vahvista verkkotunnuksen %{domain} esto - undo_relationships: Tämä kumoaa näiden palvelimien ja sinun tilien välisen seurannan. + undo_relationships: Tämä kumoaa näiden palvelinten ja sinun palvelimesi tilien väliset seurantasuhteet. created_msg: Verkkotunnuksen estoa käsitellään - destroyed_msg: Verkkotunnuksen esto on peruttu + destroyed_msg: Verkkotunnuksen esto on kumottu domain: Verkkotunnus edit: Muokkaa verkkotunnuksen estoa existing_domain_block: Olet jo asettanut tiukemmat rajoitukset käyttäjälle %{name}. - existing_domain_block_html: Olet jo asettanut tiukemmat rajoitukset käyttäjälle %{name}, joten sinun täytyy poistaa sen esto ensin. + existing_domain_block_html: Olet jo asettanut tiukemmat rajoitukset käyttäjälle %{name}, joten sinun täytyy kumota sen esto ensin. export: Vie import: Tuo new: create: Luo esto - hint: Verkkotunnuksen esto ei estä tilien lisäämistä tietokantaan, mutta se soveltaa näihin tileihin takautuvasti ja automaattisesti tiettyjä valvontatoimia. + hint: Verkkotunnuksen esto ei estä tilien lisäämistä tietokantaan, mutta se soveltaa näihin tileihin takautuvasti ja automaattisesti tiettyjä moderointitoimia. severity: desc_html: Valinta Rajoita piilottaa tässä verkkotunnuksessa sijaitsevien tilien julkaisut kaikilta, jotka eivät seuraa näitä tilejä. Valinta Jäädytä poistaa palvelimeltasi kaikkien tässä verkkotunnuksessa sijaitsevien tilien sisällön, median ja profiilitiedot. Käytä valintaa Ei mitään, jos haluat vain hylätä mediatiedostot. noop: Ei mitään @@ -413,26 +413,26 @@ fi: suspend: Jäädytä title: Uusi verkkotunnuksen esto no_domain_block_selected: Verkkotunnusten estoja ei muutettu, koska yhtään ei ollut valittuna - not_permitted: Nykyiset käyttöoikeutesi eivät kata tätä toimintoa - obfuscate: Peitä verkkotunnuksen nimi + not_permitted: Sinulla ei ole oikeutta suorittaa tätä toimintoa + obfuscate: Peitä verkkotunnus obfuscate_hint: Peitä verkkotunnus osittain luettelossa, jos julkinen verkkotunnusten rajoitusluettelo on käytössä private_comment: Yksityinen kommentti - private_comment_hint: Kommentoi tätä verkkotunnuksen rajoitusta, valvojien sisäiseen käyttöön. + private_comment_hint: Kommentoi tätä verkkotunnuksen rajoitusta, moderaattorien sisäiseen käyttöön. public_comment: Julkinen kommentti public_comment_hint: Kommentoi tätä verkkotunnuksen rajoitusta suurelle yleisölle, jos julkinen verkkotunnusten rajoitusluettelo on käytössä. reject_media: Hylkää mediatiedostot - reject_media_hint: Poistaa paikallisesti tallennetut mediatiedostot eikä lataa niitä enää jatkossa. Ei merkitystä jäähyn kohdalla + reject_media_hint: Poistaa paikallisesti tallennetut mediatiedostot eikä lataa niitä enää jatkossa. Ei vaikuta jäädytyksiin reject_reports: Hylkää raportit - reject_reports_hint: Ohita kaikki tästä verkkotunnuksesta tulevat raportit. Erottamisen kannalta ei merkitystä - undo: Peru verkkotunnuksen esto + reject_reports_hint: Ohita kaikki tästä verkkotunnuksesta tulevat raportit. Ei vaikuta jäädytyksiin + undo: Kumoa verkkotunnuksen esto view: Näytä verkkotunnuksen esto email_domain_blocks: add_new: Lisää uusi allow_registrations_with_approval: Salli rekisteröitymiset hyväksynnällä attempts_over_week: - one: "%{count} yritystä viimeisen viikon aikana" + one: "%{count} rekisteröitymisyritys viimeisen viikon aikana" other: "%{count} rekisteröitymisyritystä viimeisen viikon aikana" - created_msg: Sähköpostiverkkotunnus estetty onnistuneesti + created_msg: Sähköpostiverkkotunnus estettiin onnistuneesti delete: Poista dns: types: @@ -440,12 +440,12 @@ fi: domain: Verkkotunnus new: create: Lisää verkkotunnus - resolve: Ratkaise verkkotunnus + resolve: Selvitä verkkotunnus title: Estä uusi sähköpostiverkkotunnus no_email_domain_block_selected: Sähköpostin verkkotunnuksia ei muutettu, koska yhtään ei ollut valittuna not_permitted: Ei sallittu resolved_dns_records_hint_html: Verkkotunnuksen nimi määräytyy seuraaviin MX-verkkotunnuksiin, jotka ovat viime kädessä vastuussa sähköpostin vastaanottamisesta. MX-verkkotunnuksen estäminen estää rekisteröitymisen mistä tahansa sähköpostiosoitteesta, joka käyttää samaa MX-verkkotunnusta, vaikka näkyvä verkkotunnuksen nimi olisikin erilainen. Varo estämästä suuria sähköpostin palveluntarjoajia. - resolved_through_html: Ratkaistu %{domain} kautta + resolved_through_html: Ratkaistu verkkotunnuksen %{domain} kautta title: Estetyt sähköpostiverkkotunnukset export_domain_allows: new: @@ -454,8 +454,8 @@ fi: export_domain_blocks: import: description_html: Olet tuomassa verkkotunnusten estoluetteloa. Tarkista luettelo huolella – etenkin, jos et ole laatinut sitä itse. - existing_relationships_warning: Olemassa olevat seuraussuhteet - private_comment_description_html: 'Seurataksesi tuotujen estojen alkuperää lisätään estojen yhteyteen seuraava yksityinen kommentti: %{comment}' + existing_relationships_warning: Olemassa olevat seurantasuhteet + private_comment_description_html: 'Seurataksesi tuotujen estojen alkuperää estojen yhteyteen lisätään seuraava yksityinen kommentti: %{comment}' private_comment_template: Tuotu lähteestä %{source} %{date} title: Tuo verkkotunnusten estoja invalid_domain_block: 'Yksi tai useampi verkkotunnuksen esto ohitettiin seuraavien virheiden vuoksi: %{error}' @@ -463,25 +463,28 @@ fi: title: Tuo verkkotunnusten estoja no_file: Yhtäkään tiedostoa ei ole valittu follow_recommendations: - description_html: "Seuraamissuositukset auttavat uusia käyttäjiä löytämään nopeasti kiinnostavaa sisältöä. Kun käyttäjä ei ole ollut tarpeeksi vuorovaikutuksessa muiden kanssa, jotta hänelle olisi muodostunut henkilökohtaisia seuraamissuosituksia, suositellaan niiden sijaan näitä tilejä. Ne lasketaan päivittäin uudelleen yhdistelmästä tilejä, jotka ovat viime aikoina olleet aktiivisimmin sitoutuneita ja joilla on suurimmat paikalliset seuraajamäärät tietyllä kielellä." + description_html: "Seurantasuositukset auttavat uusia käyttäjiä löytämään nopeasti kiinnostavaa sisältöä. Kun käyttäjä ei ole ollut tarpeeksi vuorovaikutuksessa muiden kanssa, jotta hänelle olisi muodostunut henkilökohtaisia seuraamissuosituksia, suositellaan niiden sijaan näitä tilejä. Ne lasketaan päivittäin uudelleen yhdistelmästä tilejä, jotka ovat viime aikoina olleet aktiivisimmin sitoutuneita ja joilla on suurimmat paikalliset seuraajamäärät tietyllä kielellä." language: Kielelle status: Tila - suppress: Hylkää seuraamissuositus - suppressed: Hylätty - title: Seuraamissuositukset - unsuppress: Palauta seuraamissuositus + suppress: Hylkää seurantasuositus + suppressed: Hylätyt + title: Seurantasuositukset + unsuppress: Palauta seurantasuositus instances: + audit_log: + title: Viimeaikaiset tarkastuslokit + view_all: Näytä kaikki tarkastuslokit availability: description_html: - one: Jos toimitus verkkotunnukseen epäonnistuu %{count} päivä ilman onnistumista, uusia yrityksiä ei tehdä ennen kuin toimitus alkaen verkkotunnukselta on vastaanotettu. - other: Jos toimitus verkkotunnukselle, epäonnistuu %{count} eri päivänä ilman onnistumista, uusia yrityksiä ei tehdä ennen kuin toimitus alkaen verkkotunnuselta on vastaanotettu. - failure_threshold_reached: Epäonnistumisen kynnys saavutettu %{date}. + one: Jos toimitus verkkotunnukseen epäonnistuu päivän ajan, sitä ei yritetä uudelleen ennen kuin verkkotunnuksesta vastaanotetaan toimitus. + other: Jos toimitus verkkotunnukseen epäonnistuu %{count} päivän ajan, sitä ei yritetä uudelleen ennen kuin verkkotunnuksesta vastaanotetaan toimitus. + failure_threshold_reached: Epäonnistumisten yläraja saavutettu %{date}. failures_recorded: - one: Epäonnistuneita yrityksiä %{count} päivässä. - other: Epäonnistuneita yrityksiä %{count} päivää. - no_failures_recorded: Ei epäonnistumisia kirjattu. + one: Epäonnistuneita yrityksiä %{count} päivänä. + other: Epäonnistuneita yrityksiä %{count} päivänä. + no_failures_recorded: Ei kirjattuja epäonnistumisia. title: Saatavuus - warning: Viimeisin yritys yhdistää yhteys tähän palvelimeen on epäonnistunut + warning: Viimeisin yritys yhdistää tähän palvelimeen epäonnistui back_to_all: Kaikki back_to_limited: Rajoitettu back_to_warning: Varoitus @@ -489,67 +492,67 @@ fi: confirm_purge: Haluatko varmasti poistaa pysyvästi tämän verkkotunnuksen tiedot? content_policies: comment: Sisäinen muistiinpano - description_html: Voit määrittää sisältökäytännöt, joita sovelletaan kaikkiin tämän verkkotunnuksen ja sen aliverkkotunnuksien tileihin. + description_html: Voit määritellä sisältökäytännöt, joita sovelletaan kaikkiin tämän verkkotunnuksen ja sen aliverkkotunnusten tileihin. limited_federation_mode_description_html: Voit valita sallitaanko federointi tällä verkkotunnuksella. policies: reject_media: Hylkää media reject_reports: Hylkää raportit silence: Rajoita suspend: Jäädytä - policy: Käytännöt + policy: Käytäntö reason: Julkinen syy - title: Sisällön toimintatavat + title: Sisältökäytännöt dashboard: instance_accounts_dimension: Seuratuimmat tilit instance_accounts_measure: tallennetut tilit instance_followers_measure: seuraajamme siellä instance_follows_measure: heidän seuraajansa täällä instance_languages_dimension: Suosituimmat kielet - instance_media_attachments_measure: tallennetut median liitteet - instance_reports_measure: niitä koskevat raportit + instance_media_attachments_measure: tallennetut medialiitteet + instance_reports_measure: heitä koskevat raportit instance_statuses_measure: tallennetut julkaisut delivery: all: Kaikki clear: Tyhjennä toimitusvirheet - failing: Epäonnistuminen + failing: Epäonnistuneet restart: Käynnistä toimitus uudelleen stop: Lopeta toimitus - unavailable: Ei saatavilla + unavailable: Eivät saatavilla delivery_available: Toimitus on saatavilla delivery_error_days: Toimitusvirheen päivät - delivery_error_hint: Jos toimitus ei ole mahdollista %{count} päivän aikana, se merkitään automaattisesti toimittamattomaksi. - destroyed_msg: Tiedot %{domain} on nyt jonossa välitöntä poistoa varten. + delivery_error_hint: Jos toimitus ei ole mahdollista %{count} päivään, se merkitään automaattisesti toimituskelvottomaksi. + destroyed_msg: Palvelimelta %{domain} peräisin olevat tiedot ovat nyt jonossa poistattaviksi. empty: Verkkotunnuksia ei löytynyt. known_accounts: one: "%{count} tunnettu tili" other: "%{count} tunnettua tiliä" moderation: all: Kaikki - limited: Rajoitettu - title: Valvonta + limited: Rajoitetut + title: Moderointi private_comment: Yksityinen kommentti public_comment: Julkinen kommentti purge: Tyhjennä - purge_description_html: Jos uskot, että tämä verkkotunnus on offline-tilassa tarkoituksella, voit poistaa kaikki verkkotunnuksen tilitietueet ja niihin liittyvät tiedot tallennustilastasi. Tämä voi kestää jonkin aikaa. - title: Liittoutuminen + purge_description_html: Jos uskot, että tämä verkkotunnus on yhteydettömässä tilassa tarkoituksella, voit poistaa kaikki verkkotunnuksen tilitietueet ja niihin liittyvät tiedot tallennustilastasi. Tämä voi kestää jonkin aikaa. + title: Federointi total_blocked_by_us: Estämämme total_followed_by_them: Heidän seuraama total_followed_by_us: Meidän seuraama - total_reported: Niitä koskevat raportit + total_reported: Heitä koskevat raportit total_storage: Medialiitteet - totals_time_period_hint_html: Alla näkyvät yhteenlasketut tiedot sisältävät koko ajan. + totals_time_period_hint_html: Seuraavassa näkyvät määrät sisältävät tiedot koko ajalta. unknown_instance: Tällä palvelimella ei tällä hetkellä ole tähän verkkotunnukseen liittyviä tietueita. invites: deactivate_all: Poista kaikki käytöstä filter: all: Kaikki available: Saatavilla - expired: Vanhentunut - title: Suodata + expired: Vanhentuneet + title: Suodatus title: Kutsut ip_blocks: add_new: Luo sääntö - created_msg: Lisätty uusi IP-sääntö onnistuneesti + created_msg: Uusi IP-sääntö lisättiin onnistuneesti delete: Poista expires_in: '1209600': 2 viikkoa @@ -563,11 +566,11 @@ fi: no_ip_block_selected: IP-sääntöjä ei muutettu, koska yhtään ei ollut valittuna title: IP-säännöt relationships: - title: "%{acct}n suhteet" + title: Tilin %{acct} seurantasuhteet relays: add_new: Lisää uusi välittäjä delete: Poista - description_html: "Liittoutumisvälittäjä on välityspalvelin, joka siirtää suuria määriä julkisia julkaisuja siihen liittyneiden palvelinten välillä. Se voi auttaa pieniä ja keskisuuria palvelimia löytämään fediversumin sisältöä, mikä muutoin vaatisi paikallisia käyttäjiä seuraamaan etäpalvalinten käyttäjiä manuaalisesti." + description_html: "Federoinninvälittäjä on välityspalvelin, joka siirtää suuria määriä julkisia julkaisuja siihen liittyneiden palvelinten välillä. Se voi auttaa pieniä ja keskisuuria palvelimia löytämään fediversumin sisältöä, mikä muutoin vaatisi paikallisia käyttäjiä seuraamaan etäpalvalinten käyttäjiä manuaalisesti." disable: Poista käytöstä disabled: Poissa käytöstä enable: Ota käyttöön @@ -577,12 +580,12 @@ fi: pending: Odotetaan välittäjän hyväksyntää save_and_enable: Tallenna ja ota käyttöön setup: Määritä yhteys välittäjään - signatures_not_enabled: Välittäjät eivät toimi oikein, kun turvallinen tai rajoitettu federaatio -tila on käytössä + signatures_not_enabled: Välittäjät eivät välttämättä toimi oikein, kun turvallinen tai rajoitetun federoinnin tila on käytössä status: Tila title: Välittäjät report_notes: - created_msg: Muistiinpano lisätty raporttiin onnistuneesti! - destroyed_msg: Muistiinpano poistettu raportista onnistuneesti! + created_msg: Muistiinpanon lisäys raporttiin onnistui! + destroyed_msg: Muistiinpanon poisto raportista onnistui! reports: account: notes: @@ -595,17 +598,17 @@ fi: mark_as_sensitive_description_html: Raportoitujen julkaisujen media merkitään arkaluonteiseksi ja kirjataan varoitus, joka auttaa suhtautumaan vakavammin saman tilin tuleviin rikkomuksiin. other_description_html: Katso lisää vaihtoehtoja tilin käytöksen hallitsemiseksi ja raportoidulle tilille kohdistuvan viestinnän mukauttamiseksi. resolve_description_html: Ilmoitettua tiliä kohtaan ei ryhdytä toimiin, varoitusta ei kirjata ja raportti suljetaan. - silence_description_html: Tili näkyy vain niille, jotka jo seuraavat sitä tai etsivät sen manuaalisesti, mikä rajoittaa merkittävästi sen tavoitettavuutta. Voidaan perua milloin vain. Sulkee kaikki tilin vastaiset raportit. - suspend_description_html: Tili ja mikään sen sisältö eivät ole käytettävissä, ja lopulta ne poistetaan, ja vuorovaikutus tilin kanssa on mahdotonta. Peruttavissa 30 päivän ajan. Sulkee kaikki tämän tilin vastaiset raportit. + silence_description_html: Tili näkyy vain niille, jotka jo seuraavat sitä tai etsivät sen manuaalisesti, mikä rajoittaa merkittävästi sen tavoitettavuutta. Voidaan perua milloin vain. Sulkee kaikki tiliin kohdistuvat raportit. + suspend_description_html: Tili ja mikään sen sisältö eivät ole käytettävissä, ja lopulta ne poistetaan ja vuorovaikutus tilin kanssa on mahdotonta. Peruttavissa 30 päivän ajan. Sulkee kaikki tiliin kohdistuvat raportit. actions_description_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Jos ryhdyt rangaistustoimeen ilmoitettua tiliä kohtaan, hänelle lähetetään sähköposti-ilmoitus, paitsi jos Roskaposti-luokka on valittuna. - actions_description_remote_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Tämä vaikuttaa vain siihen, miten palvelimesi kommunikoi tämän etätilin kanssa ja käsittelee sen sisältöä. + actions_description_remote_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Tämä vaikuttaa vain siihen, miten sinun palvelimesi viestii tämän etätilin kanssa ja käsittelee sen sisältöä. add_to_report: Lisää raporttiin already_suspended_badges: local: Jäädytetty jo tällä palvelimella remote: Jäädytetty jo tällä palvelimella are_you_sure: Oletko varma? - assign_to_self: Ota tehtäväksi - assigned: Määritetty valvoja + assign_to_self: Ota käsiteltäväkseni + assigned: Määritetty moderaattori by_target_domain: Raportoidun tilin verkkotunnus cancel: Peruuta category: Luokka @@ -614,12 +617,12 @@ fi: none: Ei mitään comment_description_html: 'Antaakseen lisätietoja %{name} kirjoitti:' confirm: Vahvista - confirm_action: Vahvista valvontatoimi käyttäjää @%{acct} kohtaan + confirm_action: Vahvista moderointitoimi käyttäjää @%{acct} kohtaan created_at: Raportoitu delete_and_resolve: Poista julkaisut forwarded: Välitetty forwarded_replies_explanation: Tämä raportti on etäkäyttäjältä ja koskee etäsisältöä. Se on välitetty sinulle, koska raportoitu sisältö on vastaus jollekin käyttäjällesi. - forwarded_to: Välitetty %{domain} + forwarded_to: Välitetty palvelimelle %{domain} mark_as_resolved: Merkitse ratkaistuksi mark_as_sensitive: Merkitse arkaluonteiseksi mark_as_unresolved: Merkitse ratkaisemattomaksi @@ -629,19 +632,20 @@ fi: create_and_resolve: Ratkaise ja lisää muistiinpano create_and_unresolve: Avaa uudelleen ja lisää muistiinpano delete: Poista - placeholder: Kuvaile mitä toimia on tehty tai muita päivityksiä tähän raporttiin… + placeholder: Kuvaile tehtyjä toimia tai lisää muita käyttäjään liittyviä merkintöjä... title: Muistiinpanot - notes_description_html: Tarkastele ja jätä muistiinpanoja muille valvojille ja itsellesi tulevaisuuteen - processed_msg: 'Raportti #%{id} käsitelty' - quick_actions_description_html: 'Suorita nopea toiminto tai vieritä alas nähdäksesi raportoitu sisältö:' - remote_user_placeholder: etäkäyttäjä instanssista %{instance} - reopen: Avaa raportti uudestaan + notes_description_html: Tarkastele ja jätä muistiinpanoja muille moderaattoreille ja itsellesi tulevaisuuteen + processed_msg: Raportin nro %{id} käsittely onnistui + quick_actions_description_html: 'Suorita pikatoiminto tai vieritä alas nähdäksesi raportoitu sisältö:' + remote_user_placeholder: etäkäyttäjä palvelimelta %{instance} + reopen: Avaa raportti uudelleen report: Raportti nro %{id} reported_account: Raportoitu tili reported_by: Raportoinut + reported_with_application: Raportoitu sovelluksella resolved: Ratkaistut - resolved_msg: Raportti onnistuneesti ratkaistu! - skip_to_actions: Siirry toimintoihin + resolved_msg: Raportin ratkaisu onnistui! + skip_to_actions: Siirry toimiin status: Tila statuses: Raportoitu sisältö statuses_description_html: Loukkaava sisältö mainitaan raportoidun tilin yhteydessä @@ -656,17 +660,17 @@ fi: mark_as_sensitive_html: Merkitse loukkaavien julkaisujen media arkaluonteiseksi silence_html: Rajoita merkittävästi käyttäjän @%{acct} tavoitettavuutta tekemällä profiilista ja sen sisällöstä näkyviä vain niille, jotka jo seuraavat tiliä tai etsivät sen manuaalisesti suspend_html: Jäädytä @%{acct}, jolloin hänen profiilinsa ja sisältönsä ei ole käytettävissä ja hänen kanssaan on mahdotonta olla vuorovaikutuksessa - close_report: 'Merkitse raportti #%{id} selvitetyksi' + close_report: Merkitse raportti nro %{id} ratkaistuksi close_reports_html: Merkitse kaikki käyttäjään @%{acct} kohdistuvat raportit ratkaistuiksi delete_data_html: Poista käyttäjän @%{acct} profiili ja sen sisältö 30 päivän kuluttua, ellei jäädytystä sillä välin kumota preview_preamble_html: "@%{acct} saa varoituksen, jonka sisältö on seuraava:" - record_strike_html: Tallenna varoitus @%{acct} vastaan, joka auttaa sinua selvittämään tulevia rikkomuksia tältä tililtä + record_strike_html: Kirjaa käyttäjään @%{acct} kohdistuva varoitus, joka auttaa suhtautumaan vakavammin tämän tilin tuleviin rikkomuksiin send_email_html: Lähetä käyttäjälle @%{acct} varoitus sähköpostitse - warning_placeholder: Valinnaiset lisäperustelut valvontatoimelle. + warning_placeholder: Valinnaiset lisäperustelut moderointitoimelle. target_origin: Raportoidun tilin alkuperä title: Raportit - unassign: Määrittämätön - unknown_action_msg: 'Tuntematon toiminto: %{action}' + unassign: Poista käsittelystä + unknown_action_msg: 'Tuntematon toimi: %{action}' unresolved: Ratkaisemattomat updated_at: Päivitetty view_profile: Näytä profiili @@ -679,13 +683,13 @@ fi: administration: Ylläpito devops: DevOps invites: Kutsut - moderation: Valvonta + moderation: Moderointi special: Erityistä delete: Poista - description_html: "Käyttäjärooleilla voit muokata, mihin toimintoihin ja alueisiin käyttäjäsi pääsevät käsiksi." + description_html: "Käyttäjärooleilla voit mukauttaa, mihin Mastodonin toimintoihin ja alueisiin käyttäjäsi on pääsy." edit: Muokkaa roolia ”%{name}” everyone: Oletuskäyttöoikeudet - everyone_full_description_html: Tämä on perusrooli, joka vaikuttaa kaikkiin käyttäjiin, jopa ilman määrättyä roolia. Kaikki muut roolit perivät sen käyttöoikeudet. + everyone_full_description_html: Tämä on perusrooli, joka vaikuttaa kaikkiin käyttäjiin, jopa ilman asetettua roolia. Kaikki muut roolit perivät sen käyttöoikeudet. permissions_count: one: "%{count} käyttöoikeus" other: "%{count} käyttöoikeutta" @@ -693,23 +697,23 @@ fi: administrator: Ylläpitäjä administrator_description: Käyttäjät, joilla on tämä käyttöoikeus, ohittavat jokaisen käyttöoikeuden delete_user_data: Poistaa käyttäjän tiedot - delete_user_data_description: Salli käyttäjien poistaa muiden käyttäjien tiedot viipymättä + delete_user_data_description: Sallii käyttäjien poistaa muiden käyttäjien tiedot viipymättä invite_users: Kutsua käyttäjiä invite_users_description: Sallii käyttäjien kutsua uusia ihmisiä palvelimelle manage_announcements: Hallita tiedotteita - manage_announcements_description: Sallii käyttäjien hallita tiedotteita palvelimella + manage_announcements_description: Sallii käyttäjien hallita palvelimen tiedotteita manage_appeals: Hallita valituksia - manage_appeals_description: Sallii käyttäjien tarkistaa valvontatoimia koskevia valituksia + manage_appeals_description: Sallii käyttäjien tarkistaa moderointitoimiin kohdistuvia valituksia manage_blocks: Hallita estoja manage_blocks_description: Sallii käyttäjien estää sähköpostipalveluntarjoajia ja IP-osoitteita manage_custom_emojis: Hallita mukautettuja emojeita manage_custom_emojis_description: Sallii käyttäjien hallita mukautettuja emojeita palvelimella - manage_federation: Hallita liittoutumista - manage_federation_description: Sallii käyttäjien estää tai sallia liittoutuminen muiden verkkotunnusten kanssa ja hallita toimitusta + manage_federation: Hallita federointia + manage_federation_description: Sallii käyttäjien estää tai sallia federointi muiden verkkotunnusten kanssa ja hallita toimitusta manage_invites: Hallita kutsuja - manage_invites_description: Sallii käyttäjien selata ja poistaa kutsulinkkejä käytöstä + manage_invites_description: Sallii käyttäjien selata kutsulinkkejä ja poistaa niitä käytöstä manage_reports: Hallita raportteja - manage_reports_description: Sallii käyttäjien tarkistaa raportteja ja suorittaa valvontatoimia niitä vastaan + manage_reports_description: Sallii käyttäjien tarkistaa raportteja ja suorittaa moderointitoimia niiden perusteella manage_roles: Hallita rooleja manage_roles_description: Sallii käyttäjien hallita ja määrittää rooleja heidän alapuolellaan manage_rules: Hallita sääntöjä @@ -719,15 +723,15 @@ fi: manage_taxonomies: Hallita luokittelua manage_taxonomies_description: Sallii käyttäjien tarkistaa suositun sisällön ja päivittää aihetunnisteiden asetuksia manage_user_access: Hallita käyttäjäoikeuksia - manage_user_access_description: Sallii käyttäjien poistaa muiden käyttäjien kaksivaiheinen todennus käytöstä, vaihtaa heidän sähköpostiosoitteensa ja nollata heidän salasanansa + manage_user_access_description: Sallii käyttäjien poistaa muiden käyttäjien kaksivaiheinen todennus käytöstä, vaihtaa heidän sähköpostiosoitteensa ja palauttaa heidän salasanansa manage_users: Hallita käyttäjiä - manage_users_description: Sallii käyttäjien tarkastella muiden käyttäjien tietoja ja suorittaa valvontatoimia heitä kohtaan + manage_users_description: Sallii käyttäjien tarkastella muiden käyttäjien tietoja ja suorittaa moderointitoimia heitä kohtaan manage_webhooks: Hallita webhookeja manage_webhooks_description: Sallii käyttäjien luoda webhookeja hallinnollisiin tapahtumiin - view_audit_log: Katsoa valvontalokia + view_audit_log: Katsoa tarkastuslokia view_audit_log_description: Sallii käyttäjien nähdä palvelimen hallinnollisten toimien historian view_dashboard: Katsoa koontinäyttöä - view_dashboard_description: Sallii käyttäjien käyttää kojelautaa ja erilaisia mittareita + view_dashboard_description: Sallii käyttäjille pääsyn koontinäyttöön ja erilaisiin mittareihin view_devops: DevOps view_devops_description: Sallii käyttäjille pääsyn Sidekiq- ja pgHero-hallintapaneeleihin title: Roolit @@ -741,40 +745,40 @@ fi: settings: about: manage_rules: Hallitse palvelimen sääntöjä - preamble: Anna perusteellista tietoa siitä, miten palvelinta käytetään, valvotaan ja rahoitetaan. + preamble: Kerro syventävästi siitä, kuinka palvelinta käytetään, moderoidaan ja rahoitetaan. rules_hint: On olemassa erityinen alue sääntöjä, joita käyttäjien odotetaan noudattavan. title: Tietoja appearance: preamble: Mukauta Mastodonin selainkäyttöliittymää. title: Ulkoasu branding: - preamble: Palvelimesi brändäys erottaa sen muista verkon palvelimista. Nämä tiedot voivat näkyä monissa eri ympäristöissä, kuten Mastodonin selainkäyttöliittymässä, natiivisovelluksissa, linkkien esikatseluissa muilla sivustoilla, viestintäsovelluksissa ja niin edelleen. Siksi nämä tiedot kannattaa pitää selkeinä, lyhyinä ja ytimekkäinä. + preamble: Palvelimesi brändäys erottaa sen muista verkon palvelimista. Nämä tiedot voivat näkyä monissa eri ympäristöissä, kuten Mastodonin selainkäyttöliittymässä, natiivisovelluksissa, linkkien esikatseluissa muilla sivustoilla, viestintäsovelluksissa ja niin edelleen. Siksi nämä tiedot kannattaa pitää selvinä, lyhyinä ja ytimekkäinä. title: Brändäys captcha_enabled: - desc_html: Tämä perustuu ulkoisiin skripteihin hCaptchasta, mikä voi olla turvallisuus- ja yksityisyysongelma. Lisäksi tämä voi tehdä rekisteröinnin ihmisille huomattavasti (erityisesti vammaisten) helpommaksi. Harkitse vaihtoehtoisia toimenpiteitä, kuten hyväksymisperusteista tai kutsupohjaista rekisteröintiä. + desc_html: Tämä perustuu ulkoisiin hCaptchan skripteihin, mikä voi olla turvallisuus- ja yksityisyysongelma. Lisäksi tämä voi tehdä rekisteröitymisprosessista joillekin (erityisesti vammaisille) ihmisille huomattavasti vähemmän saavutettavan. Harkitse siksi vaihtoehtoisia toimia, kuten hyväksymis- tai kutsuperusteista rekisteröitymistä. title: Vaadi uusia käyttäjiä vahvistaamaan tilinsä ratkaisemalla CAPTCHA-vahvistus content_retention: danger_zone: Vaaravyöhyke preamble: Määritä, miten käyttäjän luoma sisältö tallennetaan Mastodoniin. - title: Sisällön säilyttäminen + title: Sisällön säilytys default_noindex: desc_html: Vaikuttaa kaikkiin käyttäjiin, jotka eivät ole muuttaneet tätä asetusta itse title: Jätä käyttäjät oletusarvoisesti hakukoneindeksoinnin ulkopuolelle discovery: - follow_recommendations: Seuraamissuositukset + follow_recommendations: Seurantasuositukset preamble: Mielenkiintoisen sisällön esille tuominen auttaa saamaan uusia käyttäjiä, jotka eivät ehkä tunne ketään Mastodonista. Määrittele, kuinka erilaiset löytämisominaisuudet toimivat palvelimellasi. profile_directory: Profiilihakemisto public_timelines: Julkiset aikajanat publish_discovered_servers: Julkaise löydetyt palvelimet publish_statistics: Julkaise tilastot - title: Löytäminen + title: Löydettävyys trends: Trendit domain_blocks: all: Kaikille - disabled: Ei kenellekkään + disabled: Ei kenellekään users: Kirjautuneille paikallisille käyttäjille registrations: - moderation_recommandation: Varmista, että sinulla on riittävä ja toimintavalmis joukko moderaattoreita, ennen kuin vapautat rekisteröitymismenettelyn kaikille! + moderation_recommandation: Varmista, että sinulla on riittävä ja toimintavalmis joukko moderaattoreita, ennen kuin avaat rekisteröitymisen kaikille! preamble: Määritä, kuka voi luoda tilin palvelimellesi. title: Rekisteröityminen registrations_mode: @@ -784,14 +788,14 @@ fi: open: Kaikki voivat rekisteröityä warning_hint: Suosittelemme käyttämään asetusta ”Rekisteröityminen vaatii hyväksynnän”, ellet ole varma siitä, että moderaattorit ovat valmiina käsittelemään roskapostia ja haittarekisteröitymisiä oikea-aikaisesti. security: - authorized_fetch: Vaadi todennus liittoutuvilta palvelimilta - authorized_fetch_hint: Todennuksen vaatiminen liittoutuvilta palvelimilta mahdollistaa sekä käyttäjä- että palvelintason estojen tiukemman valvonnan. Tämä tapahtuu kuitenkin suorituskyvyn kustannuksella, vähentää vastauksiesi tavoittavuutta ja voi aiheuttaa yhteensopivuusongelmia joidenkin liittoutuvien palvelujen kanssa. Tämä ei myöskään estä omistautuneita toimijoita hakemasta julkisia julkaisujasi ja tilejäsi. + authorized_fetch: Vaadi todennus federoivilta palvelimilta + authorized_fetch_hint: Todennuksen vaatiminen federoivilta palvelimilta mahdollistaa sekä käyttäjä- että palvelintason estojen tiukemman valvonnan. Tämä tapahtuu kuitenkin suorituskyvyn kustannuksella, vähentää vastauksiesi tavoittavuutta ja voi aiheuttaa yhteensopivuusongelmia joidenkin federoivien palvelujen kanssa. Tämä ei myöskään estä asialleen omistautuneita toimijoita hakemasta julkisia julkaisujasi ja tilejäsi. authorized_fetch_overridden_hint: Et voi tällä hetkellä muuttaa tätä asetusta, koska se on ohitettu ympäristömuuttujalla. - federation_authentication: Liittoutumisen todentamisen täytäntöönpano + federation_authentication: Federoinnin todennuksen valvonta title: Palvelimen asetukset site_uploads: - delete: Poista ladattu tiedosto - destroyed_msg: Sivuston lataus onnistuneesti poistettu! + delete: Poista lähetetty tiedosto + destroyed_msg: Sivustolatauksen poisto onnistui! software_updates: critical_update: Kriittinen – päivitä viivyttelemättä description: On suositeltavaa pitää Mastodon-asennus ajantasaisena ja siten hyödyntää uusimpia korjauksia sekä ominaisuuksia. Lisäksi joskus on ratkaisevan tärkeää päivittää Mastodon ajoissa tietoturvaongelmien välttämiseksi. Näistä syistä Mastodon tarkistaa päivitykset 30 minuutin välein, ja ilmoittaa sinulle sähköposti-ilmoitusasetustesi mukaisesti. @@ -838,16 +842,16 @@ fi: sensitive: "%{name} merkitsi käyttäjän %{target} tilin arkaluonteiseksi" silence: "%{name} rajoitti käyttäjän %{target} tiliä" suspend: "%{name} jäädytti käyttäjän %{target} tilin" - appeal_approved: Valitti + appeal_approved: Valittanut appeal_pending: Valitus vireillä - appeal_rejected: Vetoomus hylättiin + appeal_rejected: Valitus hylätty system_checks: database_schema_check: message_html: Tietokannan siirto on vireillä. Suorita ne varmistaaksesi, että sovellus toimii odotetulla tavalla elasticsearch_health_red: message_html: Elasticsearch-klusteri on vikatilassa (punainen tila), joten hakuominaisuudet eivät ole käytettävissä elasticsearch_health_yellow: - message_html: Elasticsearch-klusteri on häiriötilassa (keltainen tila), joten suosittelemme tutkimaan syyn + message_html: Elasticsearch-klusteri on vikatilassa (keltainen tila), joten suosittelemme tutkimaan syyn elasticsearch_index_mismatch: message_html: Elasticsearch-indeksin sidokset ovat vanhentuneet. Suorita tootctl search deploy --only=%{value} elasticsearch_preset: @@ -859,13 +863,13 @@ fi: elasticsearch_reset_chewy: message_html: Elasticsearch-järjestelmäindeksi on vanhentunut asetusmuutoksen vuoksi. Suorita tootctl search deploy --reset-chewy päivittääksesi sen. elasticsearch_running_check: - message_html: Ei saatu yhteyttä Elasticsearchiin. Tarkista, että se on käynnissä tai poista kokotekstihaku käytöstä + message_html: Elasticsearchiin ei saatu yhteyttä. Tarkista, että se on käynnissä, tai poista kokotekstihaku käytöstä elasticsearch_version_check: message_html: 'Yhteensopimaton Elasticsearch-versio: %{value}' - version_comparison: Elasticsearch %{running_version} on käynnissä, kun %{required_version} vaaditaan + version_comparison: Käynnissä on Elasticsearch %{running_version}, kun vaaditaan %{required_version} rules_check: action: Hallitse palvelimen sääntöjä - message_html: Et ole määrittänyt lainkaan palvelimen sääntöjä. + message_html: Et ole määritellyt palvelimen sääntöjä lainkaan. sidekiq_process_check: message_html: Ei ole Sidekiq-prosessia käynnissä jonossa %{value}. Tarkista Sidekiq-asetukset software_version_critical_check: @@ -875,79 +879,95 @@ fi: action: Näytä saatavilla olevat päivitykset message_html: Mastodonin virhekorjauspäivitys on saatavilla. upload_check_privacy_error: - action: Katso täältä lisätietoja - message_html: "Verkkopalvelimesi on määritetty väärin. Käyttäjiesi yksityisyys on vaarassa." + action: Katso lisätietoja täältä + message_html: "Verkkopalvelimesi on määritetty väärin. Käyttäjiesi tietosuoja on vaarassa." upload_check_privacy_error_object_storage: - action: Katso täältä lisätietoja - message_html: "Objektivarastosi on määritetty virheellisesti, ja käyttäjiesi yksityisyys on vaarassa." + action: Katso lisätietoja täältä + message_html: "Oliovarastosi on määritetty virheellisesti. Käyttäjiesi tietosuoja on vaarassa." tags: - review: Tarkista tila - updated_msg: Aihetunnisteen asetukset päivitetty onnistuneesti + moderation: + not_trendable: Ei trendattava + not_usable: Ei käytettävissä + pending_review: Odottaa tarkastusta + review_requested: Tarkastus pyydetty + reviewed: Tarkastettu + title: Tila + trendable: Trendattava + unreviewed: Tarkastamaton + usable: Käytettävissä + name: Nimi + newest: Uusimmat + oldest: Vanhimmat + reset: Palauta + review: Tarkastuksen tila + search: Hae + title: Aihetunnisteet + updated_msg: Aihetunnisteiden asetusten päivitys onnistui title: Ylläpito trends: allow: Salli - approved: Hyväksytty - disallow: Estä + approved: Hyväksytyt + disallow: Kiellä links: allow: Salli linkki allow_provider: Salli julkaisija - description_html: Nämä ovat linkkejä, joita jaetaan tällä hetkellä paljon tileillä, joilta palvelimesi näkee viestejä. Se voi auttaa käyttäjiäsi saamaan selville, mitä maailmassa tapahtuu. Linkkejä ei näytetä julkisesti, ennen kuin hyväksyt julkaisijan. Voit myös sallia tai hylätä yksittäiset linkit. - disallow: Hylkää linkki - disallow_provider: Estä julkaisija + description_html: Näitä linkkejä jaetaan parhaillaan paljon tileillä, joiden julkaisuja palvelimesi näkee. Luettelo voi auttaa käyttäjiäsi saamaan selville, mitä maailmassa tapahtuu. Linkit eivät näy julkisesti ennen kuin hyväksyt julkaisijan. Voit myös sallia tai hylätä yksittäisiä linkkejä. + disallow: Kiellä linkki + disallow_provider: Kiellä julkaisija no_link_selected: Linkkejä ei muutettu, koska yhtään ei ollut valittuna publishers: no_publisher_selected: Julkaisijoita ei muutettu, koska yhtään ei ollut valittuna shared_by_over_week: - one: Yksi henkilö jakanut viimeisen viikon aikana + one: Jakanut yksi henkilö viimeisen viikon aikana other: Jakanut %{count} henkilöä viimeisen viikon aikana title: Suositut linkit - usage_comparison: Jaettu %{today} kertaa tänään verrattuna eilen %{yesterday} + usage_comparison: Jaettu tänään %{today} kertaa verrattuna eilisen %{yesterday} kertaan not_allowed_to_trend: Ei saa trendata - only_allowed: Vain sallittu - pending_review: Odottaa tarkistusta + only_allowed: Vain sallitut + pending_review: Odottaa tarkastusta preview_card_providers: - allowed: Tämän julkaisijan linkit voivat trendata - description_html: Nämä ovat verkkotunnuksia, joiden linkkejä jaetaan usein palvelimellasi. Linkit eivät trendaa julkisesti, ellei linkin verkkotunnusta ole hyväksytty. Hyväksyntäsi (tai hylkäys) ulottuu aliverkkotunnuksiin. - rejected: Tämän julkaisijan linkit eivät voi trendata + allowed: Tämän julkaisijan lähettämät linkit voivat trendata + description_html: Näistä verkkotunnuksista lähetettyjä linkkejä jaetaan usein palvelimellasi. Linkit eivät trendaa julkisesti, ellei linkin verkkotunnusta ole hyväksytty. Hyväksyntäsi (tai hylkäyksesi) ulottuu aliverkkotunnuksiin. + rejected: Tämän julkaisijan lähettämät linkit eivät voi trendata title: Julkaisijat - rejected: Hylätty + rejected: Hylätyt statuses: allow: Salli julkaisu allow_account: Salli tekijä - description_html: Nämä ovat julkaisuja, joita palvelimesi tietää jaettavan ja lisättävän suosikkeihin paljon tällä hetkellä. Listaus voi auttaa uusia ja palaavia käyttäjiäsi löytämään lisää seurattavia. Julkaisut eivät näy julkisesti ennen kuin hyväksyt niiden julkaisijan ja julkaisija sallii tilinsä ehdottamisen. Voit myös sallia tai hylätä yksittäisiä julkaisuja. + description_html: Näitä julkaisuja palvelimesi tietää parhaillaan jaettavan ja lisättävän suosikkeihin paljon. Luettelo voi auttaa uusia ja palaavia käyttäjiäsi löytämään lisää seurattavia. Julkaisut eivät näy julkisesti ennen kuin hyväksyt niiden tekijän ja tekijä sallii tilinsä ehdottamisen. Voit myös sallia tai hylätä yksittäisiä julkaisuja. disallow: Kiellä julkaisu - disallow_account: Estä tekijä + disallow_account: Kiellä tekijä no_status_selected: Suosittuja julkaisuja ei muutettu, koska yhtään ei ollut valittuna not_discoverable: Tekijä ei ole ilmoittanut olevansa löydettävissä shared_by: one: Jaettu tai lisätty suosikkeihin kerran - other: Jaettu tai merkitty suosikiksi %{friendly_count} kertaa + other: Jaettu tai lisätty suosikkeihin %{friendly_count} kertaa title: Suositut julkaisut tags: current_score: Nykyinen tulos %{score} dashboard: - tag_accounts_measure: uniikit käyttötarkoitukset + tag_accounts_measure: uniikit käyttökerrat tag_languages_dimension: Suosituimmat kielet tag_servers_dimension: Suosituimmat palvelimet tag_servers_measure: eri palvelimet - tag_uses_measure: käyttökerrat - description_html: Nämä ovat aihetunnisteita, jotka näkyvät tällä hetkellä monissa julkaisuissa, jotka palvelimesi näkee. Tämä voi auttaa käyttäjiäsi selvittämään, mistä ihmiset puhuvat eniten tällä hetkellä. Mitään aihetunnisteita ei näytetä julkisesti, ennen kuin hyväksyt ne. - listable: Voidaan ehdottaa + tag_uses_measure: käyttökerrat yhteensä + description_html: Nämä aihetunnisteet näkyvät parhaillaan monissa julkaisuissa, jotka palvelimesi näkee. Tämä luettelo voi auttaa käyttäjiäsi selvittämään, mistä ihmiset puhuvat eniten juuri nyt. Mitkään aihetunnisteet ei näy julkisesti ennen kuin hyväksyt ne. + listable: Voi ehdottaa no_tag_selected: Tunnisteita ei muutettu, koska yhtään ei ollut valittuna - not_listable: Ei tulla ehdottamaan - not_trendable: Ei näy trendien alla - not_usable: Ei voida käyttää + not_listable: Ei ehdoteta + not_trendable: Ei näy trendeissä + not_usable: Ei voi käyttää peaked_on_and_decaying: Saavutti huipun %{date}, nyt hiipuu title: Suositut aihetunnisteet - trendable: Voi näkyä trendien alla - trending_rank: 'Suosittua #%{rank}' - usable: Voidaan käyttää - usage_comparison: Käytetty %{today} kertaa tänään, verrattuna %{yesterday} eiliseen + trendable: Voi näkyä trendeissä + trending_rank: Suosittu, sijalla %{rank} + usable: Voi käyttää + usage_comparison: Käytetty tänään %{today} kertaa, verrattuna elisen %{yesterday} kertaan used_by_over_week: - one: Yhden henkilön käyttämä viime viikon aikana + one: Käyttänyt yksi henkilö viimeisen viikon aikana other: Käyttänyt %{count} henkilöä viimeisen viikon aikana title: Trendit - trending: Suosittua + trending: Trendaus warning_presets: add_new: Lisää uusi delete: Poista @@ -959,7 +979,7 @@ fi: delete: Poista description_html: "Webhookin avulla Mastodon voi puskea sovellukseesi reaaliaikaisia ilmoituksia valituista tapahtumista, jotta sovelluksesi voi laukaista reaktioita automaattisesti." disable: Poista käytöstä - disabled: Pois käytöstä + disabled: Poissa käytöstä edit: Muokkaa päätepistettä empty: Et ole vielä määrittänyt webhook-päätepisteitä. enable: Ota käyttöön @@ -969,40 +989,40 @@ fi: other: "%{count} aktivoitua tapahtumaa" events: Tapahtumat new: Uusi webhook - rotate_secret: Vaihda salaus - secret: Salainen tunnus + rotate_secret: Vaihda salaisuus + secret: Allekirjoituksen salaisuus status: Tila title: Webhookit webhook: Webhook admin_mailer: auto_close_registrations: - body: Palvelimen %{instance} moderaattorit eivät ole olleet viime aikoina aktiivisia. Tästä syystä rekisteröitymismenettely on automaattisesti vaihdettu erillishyväksyntöjä edellyttäväksi. Näin vähennetään riskiä palvelimen %{instance} käyttöön haitallisten toimijoiden alustana. Voit koska tahansa palauttaa käyttöön vapaat rekisteröitymiset. + body: Palvelimen %{instance} moderaattorit eivät ole olleet viime aikoina aktiivisia. Tästä syystä rekisteröitymismenettely on automaattisesti vaihdettu erillishyväksyntöjä edellyttäväksi. Näin vähennetään riskiä palvelimen %{instance} käyttöön haitallisten toimijoiden alustana. Voit milloin tahansa palauttaa käyttöön vapaat rekisteröitymiset. subject: Rekisteröitymiset palvelimelle %{instance} on automaattisesti vaihdettu vaatimaan hyväksyntää new_appeal: actions: delete_statuses: poistaa hänen julkaisunsa - disable: jäädyttää heidän tilinsä + disable: jäädyttää hänen tilinsä mark_statuses_as_sensitive: merkitä hänen julkaisunsa arkaluonteisiksi none: varoitus - sensitive: merkitä heidän tilinsä arkaluonteiseksi + sensitive: merkitä hänen tilinsä arkaluonteiseksi silence: rajoittaa hänen tiliään suspend: jäädyttää hänen tilinsä - body: "%{target} valittaa valvojan %{action_taken_by} päätöksestä %{date}, joka oli %{type}. Hän kirjoitti:" - next_steps: Voit hyväksyä valituksen, jolloin valvontapäätös kumoutuu, tai sivuuttaa sen. - subject: "%{username} valittaa valvontapäätöksestä, joka koskee instanssia %{instance}" + body: "%{target} valittaa moderaattorin %{action_taken_by} päätöksestä %{date}, joka oli %{type}. Hän kirjoitti:" + next_steps: Voit hyväksyä valituksen, jolloin moderointipäätös kumoutuu, tai sivuuttaa sen. + subject: "%{username} valittaa palvelinta %{instance} koskevasta moderointipäätöksestä" new_critical_software_updates: body: Mastodonin uusia kriittisen tärkeitä versioita on julkaistu, joten saatat haluta päivittää niin pian kuin mahdollista! - subject: Kriittisiä Mastodon-päivityksiä on saatavilla instanssille %{instance}! + subject: Palvelimelle %{instance} on saatavilla kriittisiä Mastodon-päivityksiä! new_pending_account: body: Uuden tilin tiedot ovat alla. Voit hyväksyä tai hylätä tämän hakemuksen. - subject: Uusi tili tarkastettavana instanssissa %{instance} (%{username}) + subject: Uusi tili tarkastettavana palvelimella %{instance} (%{username}) new_report: body: "%{reporter} on raportoinut kohteen %{target}" - body_remote: Joku palvelimelta %{domain} raportoi käyttäjän %{target} - subject: Uusi raportti instanssista %{instance} (nro %{id}) + body_remote: Joku palvelimelta %{domain} raportoi kohteen %{target} + subject: Uusi raportti palvelimesta %{instance} (nro %{id}) new_software_updates: body: Uusia Mastodon-versioita on julkaistu, joten saatat haluta päivittää! - subject: Uusia Mastodon-versioita ovat saatavilla instanssille %{instance}! + subject: Palvelimelle %{instance} ovat saatavilla uusia Mastodon-versioita! new_trends: body: 'Seuraavat kohteet on tarkistettava ennen kuin ne voidaan näyttää julkisesti:' new_trending_links: @@ -1011,20 +1031,20 @@ fi: title: Suositut julkaisut new_trending_tags: title: Suositut aihetunnisteet - subject: Uusia trendejä tarkistettavaksi instanssissa %{instance} + subject: Palvelimella %{instance} on uusia trendejä tarkistettavaksi aliases: add_new: Luo alias - created_msg: Uusi alias luotiin onnistuneesti. Voit nyt aloittaa siirron vanhasta tilistä. - deleted_msg: Alias poistettiin onnistuneesti. Siirtyminen tuolta tililtä tähän ei ole enää mahdollista. + created_msg: Uusi alias luotiin onnistuneesti. Voit nyt aloittaa muuton vanhasta tilistä. + deleted_msg: Alias poistettiin onnistuneesti. Muuttaminen tuolta tililtä tähän ei ole enää mahdollista. empty: Sinulla ei ole aliaksia. - hint_html: Jos haluat muuttaa toiselta tililtä tälle tilille, voit luoda tässä aliaksen, mitä vaaditaan ennen kuin voit edetä siirtämään seuraajat vanhalta tililtä tälle tilille. Tänä toiminto on itsessään vaaraton ja kumottavissa. Tilin muuttaminen aloitetaan vanhalta tililtä. + hint_html: Jos haluat muuttaa toisesta tilistä tähän tiliin, voit luoda tässä aliaksen, mitä vaaditaan ennen kuin voit edetä siirtämään seuraajasi vanhalta tililtä tälle tilille. Tänä toiminto on itsessään vaaraton ja kumottavissa. Tilin muuttaminen aloitetaan vanhalta tililtä. remove: Poista aliaksen linkitys appearance: advanced_web_interface: Edistynyt selainkäyttöliittymä advanced_web_interface_hint: 'Jos haluat hyödyntää näytön koko leveyttä, edistyneen selainkäyttöliittymän avulla voit määrittää useita erilaisia sarakkeita, niin näet kerralla niin paljon tietoa kuin haluat: kotisyöte, ilmoitukset, yleinen aikajana, mikä tahansa määrä listoja ja aihetunnisteita.' animations_and_accessibility: Animaatiot ja saavutettavuus confirmation_dialogs: Vahvistusvalinnat - discovery: Löytäminen + discovery: Löydettävyys localization: body: Mastodonin ovat kääntäneet vapaaehtoiset. guide_link: https://crowdin.com/project/mastodon @@ -1032,7 +1052,7 @@ fi: sensitive_content: Arkaluonteinen sisältö application_mailer: notification_preferences: Muuta sähköpostiasetuksia - salutation: "%{name}," + salutation: "%{name}" settings: 'Muuta sähköpostiasetuksia: %{link}' unsubscribe: Lopeta tilaus view: 'Näytä:' @@ -1042,18 +1062,18 @@ fi: created: Sovelluksen luonti onnistui destroyed: Sovelluksen poisto onnistui logout: Kirjaudu ulos - regenerate_token: Luo pääsytunnus uudelleen - token_regenerated: Pääsytunnuksen uudelleenluonti onnistui - warning: Säilytä tietoa hyvin. Älä milloinkaan jaa sitä muille! - your_token: Pääsytunnus + regenerate_token: Luo uusi käyttöoikeustunnus + token_regenerated: Uuden käyttöoikeustunnuksen luonti onnistui + warning: Ole varovainen näiden tietojen kanssa. Älä koskaan jaa niitä muille! + your_token: Käyttöoikeustunnus auth: apply_for_account: Pyydä tiliä captcha_confirmation: help_html: Jos kohtaat ongelmia CAPTCHAn ratkaisemisessa, voit pyytää meiltä apua osoitteella %{email}. - hint_html: Vielä yksi juttu! Meidän on vahvistettava, että olet ihminen (tämän avulla pidämme roskapostin poissa!). Ratkaise alla oleva CAPTCHA-vahvistus ja paina "Jatka". + hint_html: Vielä yksi asia! Meidän on vahvistettava, että olet ihminen (tämän avulla pidämme roskapostin poissa!). Ratkaise alla oleva CAPTCHA-vahvistus ja paina ”Jatka”. title: Turvatarkastus confirmations: - awaiting_review: Sähköpostiosoitteesi on vahvistettu! Seuraavaksi palvelimen %{domain} ylläpito tarkistaa rekisteröitymisesi, ja saat lopuksi ilmoituksen sähköpostitse, jos tilisi hyväksytään! + awaiting_review: Sähköpostiosoitteesi on vahvistettu! Seuraavaksi palvelimen %{domain} ylläpito tarkastaa rekisteröitymisesi, ja saat lopuksi ilmoituksen sähköpostitse, jos tilisi hyväksytään! awaiting_review_title: Rekisteröitymisesi on tarkistettavana clicking_this_link: napsauttaa tätä linkkiä login_link: kirjautumalla sisään @@ -1080,7 +1100,7 @@ fi: migrate_account: Muuta toiseen tiliin migrate_account_html: Jos haluat ohjata tämän tilin toiseen, voit asettaa toisen tilin tästä. or_log_in_with: Tai käytä kirjautumiseen - privacy_policy_agreement_html: Olen lukenut ja hyväksynyt tietosuojakäytännön + privacy_policy_agreement_html: Olen lukenut ja hyväksyn tietosuojakäytännön progress: confirm: Vahvista sähköpostiosoite details: Omat tietosi @@ -1096,26 +1116,26 @@ fi: rules: accept: Hyväksy back: Takaisin - invited_by: 'Seuraavalta käyttäjältä vastaanottamasi kutsun ansiosta voit liittyä palvelimelle %{domain}:' - preamble: Palvelimen %{domain} valvojat määrittävät ja valvovat sääntöjä. - preamble_invited: Ennen kuin jatkat, ota huomioon palvelimen %{domain} valvojien asettamat perussäännöt. + invited_by: 'Voit liittyä palvelimelle %{domain} kutsulla, jonka sait seuraavalta käyttäjältä:' + preamble: Palvelimen %{domain} moderaattorit määrittävät ja valvovat sääntöjä. + preamble_invited: Ennen kuin jatkat ota huomioon palvelimen %{domain} moderaattorien asettamat perussäännöt. title: Joitakin perussääntöjä. title_invited: Sinut on kutsuttu. - security: Tunnukset + security: Turvallisuus set_new_password: Aseta uusi salasana setup: email_below_hint_html: Tarkista roskapostikansiosi tai pyydä uusi viesti. Voit korjata sähköpostiosoitteesi, jos se oli väärin. email_settings_hint_html: Napsauta lähettämäämme linkkiä vahvistaaksesi osoitteen %{email}. Odotamme täällä. link_not_received: Etkö saanut linkkiä? - new_confirmation_instructions_sent: Saat uuden vahvistuslinkin sisältävän sähköpostiviestin muutamassa minuutissa! + new_confirmation_instructions_sent: Saat pian uuden vahvistuslinkin sisältävän sähköpostiviestin! title: Tarkista sähköpostilaatikkosi sign_in: - preamble_html: Kirjaudu %{domain}-tunnuksellasi. Jos tilisi sijaitsee eri palvelimella, et voi kirjautua tässä. + preamble_html: Kirjaudu %{domain}-tunnuksellasi. Jos tilisi on eri palvelimella, et voi kirjautua tässä. title: Kirjaudu palvelimelle %{domain} sign_up: - manual_review: Palvelimen %{domain} valvojat tarkistavat rekisteröitymiset käsin. Helpottaaksesi rekisteröitymisesi käsittelyä kerro hieman itsestäsi ja miksi haluat luoda käyttäjätilin palvelimelle %{domain}. + manual_review: Palvelimen %{domain} ylläpito tarkastaa rekisteröitymiset käsin. Helpottaaksesi rekisteröitymisesi käsittelyä kerro hieman itsestäsi ja siitä, miksi haluat luoda käyttäjätilin palvelimelle %{domain}. preamble: Kun sinulla on tili tällä Mastodon-palvelimella, voit seurata kaikkia muita verkossa olevia henkilöitä riippumatta siitä, missä heidän tilinsä on. - title: Otetaan sinulle käyttöön %{domain}. + title: Otetaan %{domain} käyttöösi. status: account_status: Tilin tila confirming: Odotetaan sähköpostivahvistuksen valmistumista. @@ -1123,7 +1143,7 @@ fi: pending: Hakemuksesi odottaa palvelimen ylläpidon tarkastusta. Tämä voi kestää jonkin aikaa. Saat sähköpostiviestin, jos hakemuksesi hyväksytään. redirecting_to: Tilisi ei ole aktiivinen, koska se ohjaa tällä hetkellä tilille %{acct}. self_destruct: Koska %{domain} sulkeutuu, voit käyttää tiliäsi vain rajoitetusti. - view_strikes: Näytä tiliäsi koskevia aiempia varoituksia + view_strikes: Näytä aiemmat tiliäsi koskevat varoitukset too_fast: Lomake lähetettiin liian nopeasti, yritä uudelleen. use_security_key: Käytä suojausavainta challenge: @@ -1161,20 +1181,20 @@ fi: success_msg: Tilin poisto onnistui warning: before: 'Ennen kuin etenet, lue nämä huomautukset huolellisesti:' - caches: Muiden palvelimien välimuistiin tallentamaa sisältöä voi vielä löytyä + caches: Muiden palvelinten välimuistiinsa tallentamaa sisältöä voi säilyä data_removal: Julkaisusi ja muut tietosi poistetaan pysyvästi email_change_html: Voit muuttaa sähköpostiosoitettasi poistamatta tiliäsi email_contact_html: Jos ei saavu perille, voit pyytää apua sähköpostilla %{email} email_reconfirmation_html: Jos et saa vahvistuksen sähköpostia, niin voit pyytää sitä uudelleen - irreversible: Et voi palauttaa tiliäsi tai aktivoida sitä uudelleen - more_details_html: Lisätietoja saat tietosuojakäytännöstämme. - username_available: Käyttäjänimesi tulee saataville uudestaan - username_unavailable: Käyttäjänimesi ei tule saataville enää uudestaan + irreversible: Et voi palauttaa tiliäsi etkä aktivoida sitä uudelleen + more_details_html: Tarkempia tietoja saat tietosuojakäytännöstämme. + username_available: Käyttäjänimesi tulee saataville uudelleen + username_unavailable: Käyttäjänimesi ei tule saataville enää uudelleen disputes: strikes: action_taken: Tehty toimi - appeal: Vetoomus - appeal_approved: Tähän valitukseen on haettu muutosta, eikä se ole enää voimassa + appeal: Valitus + appeal_approved: Tähän varoitukseen haettiin onnistuneesti muutosta, eikä se ole enää voimassa appeal_rejected: Valitus on hylätty appeal_submitted_at: Valitus lähetetty appealed_msg: Valituksesi on lähetetty. Jos se hyväksytään, sinulle ilmoitetaan. @@ -1183,10 +1203,10 @@ fi: approve_appeal: Hyväksy valitus associated_report: Liittyvä raportti created_at: Päivätty - description_html: Nämä ovat tiliäsi koskevia toimia ja varoituksia, jotka instanssin %{instance} ylläpito on lähettänyt sinulle. + description_html: Nämä ovat tiliisi kohdistuvia toimia sekä varoituksia, jotka palvelimen %{instance} ylläpito on lähettänyt sinulle. recipient: Osoitettu reject_appeal: Hylkää valitus - status: 'Julkaisu #%{id}' + status: Julkaisu nro %{id} status_removed: Julkaisu on jo poistettu järjestelmästä title: "%{action} alkaen %{date}" title_actions: @@ -1201,14 +1221,14 @@ fi: your_appeal_pending: Olet lähettänyt valituksen your_appeal_rejected: Valituksesi on hylätty domain_validator: - invalid_domain: ei ole kelvollinen toimialueen nimi + invalid_domain: ei ole kelvollinen verkkotunnus edit_profile: basic_information: Perustiedot hint_html: "Mukauta, mitä ihmiset näkevät julkisessa profiilissasi ja julkaisujesi vieressä. Ihmiset seuraavat sinua takaisin ja ovat kanssasi vuorovaikutuksessa todennäköisemmin, kun sinulla on täytetty profiili ja profiilikuva." other: Muut errors: '400': Lähettämäsi pyyntö oli virheellinen tai muotoiltu virheellisesti. - '403': Sinulla ei ole lupaa nähdä tätä sivua. + '403': Sinulla ei ole oikeutta nähdä tätä sivua. '404': Etsimääsi sivua ei ole olemassa. '406': Tämä sivu ei ole saatavilla pyydetyssä muodossa. '410': Etsimääsi sivua ei ole enää olemassa. @@ -1223,7 +1243,7 @@ fi: noscript_html: Käyttääksesi Mastodonin verkkosovellusta, ota JavaScript käyttöön. Vaihtoehtoisesti voit kokeilla käyttämällesi alustalle kehitettyjä Mastodonin natiivisovelluksia. existing_username_validator: not_found: paikallista käyttäjää ei löydy kyseisellä käyttäjänimellä - not_found_multiple: "%{usernames} ei löytynyt" + not_found_multiple: käyttäjänimiä %{usernames} ei löytynyt exports: archive_takeout: date: Päiväys @@ -1237,13 +1257,13 @@ fi: csv: CSV domain_blocks: Verkkotunnusten estot lists: Listat - mutes: Mykistetyt - storage: Media-arkisto + mutes: Mykistykset + storage: Mediatiedostot featured_tags: add_new: Lisää uusi errors: - limit: Pidät jo esillä aihetunnisteiden enimmäismäärää - hint_html: "Pidä tärkeimpiä aihetunnisteitasi esillä profiilissasi. Erinomainen työkalu, jolla pidät kirjaa luovista teoksistasi ja pitkäaikaisista projekteistasi. Esillä pitämäsi aihetunnisteet ovat näyttävällä paikalla profiilissasi ja mahdollistavat nopean pääsyn omiin julkaisuihisi." + limit: Olet nostanut esille jo enimmäismäärän aihetunnisteita + hint_html: "Nosta tärkeimmät aihetunnisteesi esille profiilissasi. Erinomainen työkalu, jolla pidät kirjaa luovista teoksistasi ja pitkäaikaisista projekteistasi. Esille nostamasi aihetunnisteet ovat näyttävällä paikalla profiilissasi ja mahdollistavat nopean pääsyn julkaisuihisi." filters: contexts: account: Profiilit @@ -1261,7 +1281,7 @@ fi: deprecated_api_multiple_keywords: Näitä parametreja ei voi muuttaa tästä sovelluksesta, koska ne koskevat useampaa kuin yhtä suodattimen avainsanaa. Käytä uudempaa sovellusta tai selainkäyttöliittymää. invalid_context: Ei sisältöä tai se on virheellinen index: - contexts: Suodattaa kontektissa %{contexts} + contexts: Suodattaa kontekstissa %{contexts} delete: Poista empty: Sinulla ei ole suodattimia. expires_in: Vanhenee %{distance} @@ -1292,8 +1312,8 @@ fi: one: "%{count} kohde tällä sivulla on valittu." other: Kaikki %{count} kohdetta tällä sivulla on valittu. all_matching_items_selected_html: - one: "%{count} kohde, joka vastaa hakuasi." - other: Kaikki %{count} hakuasi vastaavaa kohdetta. + one: "%{count} hakuasi vastaava kohde on valittuna." + other: Kaikki %{count} hakuasi vastaavat kohteet ovat valittuina. cancel: Peruuta changes_saved_msg: Muutosten tallennus onnistui! confirm: Vahvista @@ -1304,7 +1324,7 @@ fi: order_by: Järjestys save_changes: Tallenna muutokset select_all_matching_items: - one: Valitse %{count} kohde, joka vastaa hakuasi. + one: Valitse %{count} hakuasi vastaava kohde. other: Valitse kaikki %{count} hakuasi vastaavaa kohdetta. today: tänään validation_errors: @@ -1334,20 +1354,20 @@ fi: muting_html: Olet aikeissa korvata mykistettyjen tilien luettelosi kaikkiaan %{total_items} tilillä tiedostosta %{filename}. preambles: blocking_html: Olet aikeissa estää kaikkiaan %{total_items} tiliä tiedostosta %{filename}. - bookmarks_html: Olet lisäämässä kaikkiaan %{total_items} julkaisua tiedostosta %{filename}kirjanmerkkeihisi. + bookmarks_html: Olet aikeissa lisätä kaikkiaan %{total_items} julkaisua tiedostosta %{filename}kirjanmerkkeihisi. domain_blocking_html: Olet aikeissa estää kaikkiaan %{total_items} verkkotunnusta tiedostosta %{filename}. following_html: Olet aikeissa seurata kaikkiaan %{total_items} tiliä tiedostosta %{filename}. - lists_html: Olet lisäämässä listoihisi kaikkiaan %{total_items} tiliä tiedostosta %{filename}. Uusia listoja luodaan, jos sopivaa kohdelistaa ei ole olemassa. + lists_html: Olet aikeissa lisätä listoihisi kaikkiaan %{total_items} tiliä tiedostosta %{filename}. Uusia listoja luodaan, jos sopivaa kohdelistaa ei ole olemassa. muting_html: Olet aikeissa mykistää kaikkiaan %{total_items} tiliä tiedostosta %{filename}. preface: Voit tuoda toiselta palvelimelta viemiäsi tietoja, kuten seuraamiesi tai estämiesi henkilöiden luettelon. recent_imports: Viimeksi tuotu states: finished: Valmis - in_progress: Toiminto käynnissä + in_progress: Käynnissä scheduled: Ajoitettu unconfirmed: Varmistamaton status: Tila - success: Tietojen lähettäminen onnistui, ja ne käsitellään kohtapuoliin + success: Tietojen lähettäminen onnistui, ja ne käsitellään aivan pian time_started: Aloitettu titles: blocking: Tuodaan estettyjä tilejä @@ -1356,7 +1376,7 @@ fi: following: Tuodaan seurattuja tilejä lists: Tuodaan listoja muting: Tuodaan mykistettyjä tilejä - type: Tuonnin tyyppi + type: Tuontityyppi type_groups: constructive: Seuratut ja kirjanmerkit destructive: Estot ja mykistykset @@ -1386,24 +1406,24 @@ fi: one: kertakäyttöinen other: "%{count} käyttökertaa" max_uses_prompt: Ei rajoitusta - prompt: Luo linkkejä ja jaa niiden avulla muille pääsyoikeus tähän instanssiin + prompt: Luo linkkejä ja jaa niiden avulla muille pääsyoikeus tälle palvelimelle table: expires_at: Vanhenee - uses: Käytetty + uses: Käyttökertoja title: Kutsu ihmisiä lists: errors: limit: Sinulla on enimmäismäärä listoja login_activities: authentication_methods: - otp: kaksivaiheisen todennuksen sovellus - password: salasana - sign_in_token: sähköpostin turvakoodi - webauthn: suojausavaimet - description_html: Jos näet toimintaa, jota et tunnista, harkitse salasanan vaihtamista ja kaksivaiheisen todennuksen ottamista käyttöön. + otp: kaksivaiheisen todennuksen sovelluksella + password: salasanalla + sign_in_token: sähköpostin suojauskoodilla + webauthn: suojausavaimella + description_html: Jos näet toimintaa, jota et tunnista, harkitse salasanan vaihtamista ja kaksivaiheisen todennuksen käyttöön ottamista. empty: Todennushistoriaa ei ole saatavilla - failed_sign_in_html: Kirjautumisyritys epäonnistui %{method} - %{ip} (%{browser}) - successful_sign_in_html: Kirjautuminen onnistui %{method} - %{ip} (%{browser}) + failed_sign_in_html: Epäonnistunut kirjautumisyritys %{method} IP-osoitteesta %{ip} (%{browser}) + successful_sign_in_html: Onnistunut kirjautuminen %{method} IP-osoitteesta %{ip} (%{browser}) title: Todennushistoria mail_subscriptions: unsubscribe: @@ -1414,7 +1434,7 @@ fi: notification_emails: favourite: sähköposti-ilmoituksia suosikkeihin lisäämisistä follow: sähköposti-ilmoituksia seuraamisista - follow_request: sähköposti-ilmoituksia seuraamispyynnöistä + follow_request: sähköposti-ilmoituksia seurantapyynnöistä mention: sähköposti-ilmoituksia maininnoista reblog: sähköposti-ilmoituksia tehostuksista resubscribe_html: Jos olet perunut tilauksen erehdyksessä, voit tilata ilmoitusviestejä uudelleen sähköposti-ilmoitusten asetuksista. @@ -1435,9 +1455,9 @@ fi: missing_also_known_as: ei ole tämän tilin alias move_to_self: ei voi olla nykyinen tili not_found: ei voitu löytää - on_cooldown: Sinä olet jäähyllä + on_cooldown: Olet jäähyllä followers_count: Seuraajat muuton aikana - incoming_migrations: Muutto toiselta tililtä + incoming_migrations: Muutto toisesta tilistä incoming_migrations_html: Muuttaaksesi toisesta tilistä tähän, sinun täytyy ensin luoda tilin alias. moved_msg: Tilisi ohjaa nyt kohteeseen %{acct} ja seuraajiasi siirretään. not_redirecting: Tilisi ei ohjaa tällä hetkellä mihinkään muuhun tiliin. @@ -1448,20 +1468,20 @@ fi: redirecting_to: 'Tilisi uudelleenohjaa nyt kohteeseen: %{acct}.' set_redirect: Aseta uudelleenohjaus warning: - backreference_required: Uusi tili on ensin määritettävä viittaamaan tähän tiliin + backreference_required: Uusi tili on ensin määritettävä viittaamaan takaisin tähän tiliin before: 'Ennen kuin etenet, lue nämä huomautukset huolellisesti:' - cooldown: Muuton jälkeen on odotusaika, jonka aikana et pysty enää muuttamaan - disabled_account: Nykyinen tilisi ei ole täysin käytettävissä tämän jälkeen. Sinulla on kuitenkin pääsy tietojen vientiin ja uudelleenaktivointiin. - followers: Tämä toiminto siirtää kaikki seuraajat nykyisestä tilistä uudelle tilille + cooldown: Muuton jälkeen on odotusaika, jonka aikana et voi muuttaa uudelleen + disabled_account: Nykyinen tilisi ei ole täysin käytettävissä tämän jälkeen. Sinulla on kuitenkin pääsy tietojen vientiin ja tilin uudelleenaktivointiin. + followers: Tämä toiminto siirtää kaikki seuraajasi nykyiseltä tililtä uudelle tilille only_redirect_html: Vaihtoehtoisesti voit asettaa vain ohjauksen profiiliisi. other_data: Muita tietoja ei siirretä automaattisesti - redirect: Nykyisen tilisi profiili päivitetään ohjaushuomautuksella ja suljetaan pois hauista + redirect: Nykyisen tilisi profiili päivitetään uudelleenohjaushuomautuksella ja suljetaan pois hauista moderation: - title: Valvonta + title: Moderointi move_handler: carry_blocks_over_text: Tämä käyttäjä siirtyi paikasta %{acct}, jonka olit estänyt. carry_mutes_over_text: Tämä käyttäjä siirtyi tililtä %{acct}, jonka olet mykistänyt. - copy_account_note_text: 'Tämä käyttäjä siirtyi paikasta %{acct}, tässä olivat aiemmat muistiinpanosi niistä:' + copy_account_note_text: 'Tämä käyttäjä siirtyi tililtä %{acct}. Nämä olivat muistiinpanosi hänestä:' navigation: toggle_menu: Avaa/sulje valikko notification_mailer: @@ -1479,10 +1499,10 @@ fi: subject: "%{name} seuraa nyt sinua" title: Uusi seuraaja follow_request: - action: Hallitse seuraamispyyntöjä - body: "%{name} haluaa seurata sinua" + action: Hallitse seurantapyyntöjä + body: "%{name} on pyytänyt lupaa seurata sinua" subject: 'Odottava seuraamispyyntö: %{name}' - title: Uusi seuraamispyyntö + title: Uusi seurantapyyntö mention: action: Vastaa body: "%{name} mainitsi sinut:" @@ -1532,7 +1552,7 @@ fi: duplicate_options: sisältää kaksoiskappaleita duration_too_long: on liian kaukana tulevaisuudessa duration_too_short: on liian aikainen - expired: Äänestys on jo loppunut + expired: Äänestys on jo päättynyt invalid_choice: Valittua äänestysvaihtoehtoa ei ole over_character_limit: voi olla enintään %{max} merkkiä self_vote: Et voi äänestää omissa äänestyksissäsi @@ -1547,8 +1567,8 @@ fi: privacy: Yksityisyys privacy_hint_html: Määritä, kuinka paljon muita avustavia tietoja haluat paljastaa. Käyttäjät löytävät kiinnostavia profiileja ja hienoja sovelluksia, kun he selaavat toisten seuraamia käyttäjiä ja kun he näkevät, millä sovelluksilla nämä julkaisevat. Saatat kuitenkin haluta piilottaa nämä tiedot. reach: Tavoittavuus - reach_hint_html: Määritä, haluatko tulla uusien käyttäjien löytämäksi ja seuraamaksi. Haluatko julkaisujesi näkyvän Selaa-sivulla? Haluatko muiden käyttäjien näkevän sinut seuraamissuosituksissaan? Haluatko hyväksyä kaikki uudet seuraajat automaattisesti vai päättää jokaisesta erikseen? - search: Hae + reach_hint_html: Määritä, haluatko tulla uusien käyttäjien löytämäksi ja seuraamaksi. Haluatko julkaisujesi näkyvän Selaa-sivulla? Haluatko muiden käyttäjien näkevän sinut seurantasuosituksissaan? Haluatko hyväksyä kaikki uudet seuraajat automaattisesti vai päättää jokaisesta erikseen? + search: Haku search_hint_html: Määritä, kuinka haluat tulla löydetyksi. Haluatko, että ihmiset löytävät sinut julkisten julkaisujesi perusteella? Haluatko, että ihmiset Mastodonin ulkopuolella löytävät profiilisi tehdessään hakuja verkossa? Otathan huomioon, ettei julkisten tietojen täyttä kaikista hakukoneista poisjäämistä voi taata. title: Yksityisyys ja tavoittavuus privacy_policy: @@ -1576,7 +1596,7 @@ fi: moved: Muuttaneet mutual: Seuraatte toisianne primary: Ensisijaiset - relationship: Suhde + relationship: Seurantasuhde remove_selected_domains: Poista kaikki seuraajat valituista verkkotunnuksista remove_selected_followers: Poista valitut seuraajat remove_selected_follows: Lopeta valittujen käyttäjien seuraaminen @@ -1605,41 +1625,41 @@ fi: alipay: Alipay blackberry: BlackBerry chrome: Chrome - edge: Microsoft Edge + edge: Edge electron: Electron firefox: Firefox - generic: Tuntematon selain + generic: tuntematon selain huawei_browser: Huawei-selain ie: Internet Explorer micro_messenger: MicroMessenger - nokia: Nokia S40 Ovi -selain + nokia: Nokia S40:n Ovi-selain opera: Opera otter: Otter phantom_js: PhantomJS qq: QQ Browser safari: Safari uc_browser: UC Browser - unknown_browser: Tuntematon selain + unknown_browser: tuntematon selain weibo: Weibo current_session: Nykyinen istunto date: Päiväys - description: "%{browser} alustalla %{platform}" - explanation: Nämä verkkoselaimet ovat tällä hetkellä kirjautuneena Mastodon-tilillesi. + description: "%{browser} %{platform}" + explanation: Nämä verkkoselaimet ovat parhaillaan kirjautuneena Mastodon-tilillesi. ip: IP-osoite platforms: - adobe_air: Adobe AIR - android: Android - blackberry: BlackBerry - chrome_os: ChromeOS - firefox_os: Firefox OS - ios: iOS - kai_os: KaiOS - linux: Linux - mac: macOS - unknown_platform: Tuntematon alusta - windows: Windows - windows_mobile: Windows Mobile - windows_phone: Windows Phone + adobe_air: alustalla Adobe Air + android: alustalla Android + blackberry: alustalla BlackBerry + chrome_os: alustalla ChromeOS + firefox_os: alustalla Firefox OS + ios: alustalla iOS + kai_os: alustalla KaiOS + linux: alustalla Linux + mac: alustalla macOS + unknown_platform: tuntemattomalla alustalla + windows: alustalla Windows + windows_mobile: alustalla Windows Mobile + windows_phone: alustalla Windows Phone revoke: Hylkää revoke_success: Istunnon hylkäys onnistui title: Istunnot @@ -1655,17 +1675,17 @@ fi: development: Kehitys edit_profile: Muokkaa profiilia export: Vie tietoja - featured_tags: Esillä pidettävät aihetunnisteet - import: Tuo + featured_tags: Esille nostetut aihetunnisteet + import: Tuo tietoja import_and_export: Tuonti ja vienti - migrate: Tilin muutto muualle + migrate: Tilin muutto toisaalle notifications: Sähköposti-ilmoitukset preferences: Ominaisuudet profile: Julkinen profiili relationships: Seuratut ja seuraajat severed_relationships: Katkenneet seurantasuhteet statuses_cleanup: Autom. julkaisujen poisto - strikes: Valvontavaroitukset + strikes: Moderointivaroitukset two_factor_authentication: Kaksivaiheinen todennus webauthn_authentication: Suojausavaimet severed_relationships: @@ -1676,7 +1696,7 @@ fi: user_domain_block: Estit käyttäjän %{target_name} lost_followers: Menetetyt seuraajat lost_follows: Menetetyt seuratut - preamble: Voit menettää seurattusi ja seuraajasi, kun estät verkkotunnuksen tai kun valvojasi päättävät jäädyttää etäpalvelimen. Kun näin tapahtuu, voit ladata luetteloita katkenneista seurantasuhteista, jotta voit tarkastella niitä ja mahdollisesti viedä ne toiselle palvelimelle. + preamble: Voit menettää seurattusi ja seuraajasi, kun estät verkkotunnuksen tai kun moderaattorisi päättävät jäädyttää etäpalvelimen. Kun näin tapahtuu, voit ladata luetteloita katkenneista seurantasuhteista, jotta voit tarkastella niitä ja mahdollisesti viedä ne toiselle palvelimelle. purged: Palvelimesi ylläpitäjät ovat tyhjentäneet tämän palvelimen tiedot. type: Tapahtuma statuses: @@ -1728,9 +1748,9 @@ fi: unlisted_long: Kaikki voivat nähdä, mutta ei näytetä julkisilla aikajanoilla statuses_cleanup: enabled: Poista vanhat julkaisut automaattisesti - enabled_hint: Poistaa julkaisusi automaattisesti, kun ne saavuttavat valitun ikärajan, ellei jokin alla olevista poikkeuksista tule kyseeseen + enabled_hint: Poistaa julkaisusi automaattisesti, kun ne saavuttavat valitun ikäkynnyksen, ellei jokin alla olevista poikkeuksista tule kyseeseen exceptions: Poikkeukset - explanation: Koska julkaisujen poistaminen on raskas toimi, se tapahtuu hitaasti ajan mittaan, kun palvelin ei ole muutoin ruuhkainen. Siksi viestejäsi voi poistua vasta tovi sen jälkeen, kun ne ovat saavuttaneet ikärajan. + explanation: Koska julkaisujen poistaminen on raskas toimi, se tapahtuu hitaasti ajan mittaan, kun palvelin ei ole muutoin ruuhkainen. Siksi viestejäsi voi poistua vasta tovi sen jälkeen, kun ne ovat saavuttaneet ikäkynnyksen. ignore_favs: Ohita suosikit ignore_reblogs: Ohita tehostukset interaction_exceptions: Vuorovaikutuksiin perustuvat poikkeukset @@ -1756,9 +1776,9 @@ fi: '604800': 1 viikko '63113904': 2 vuotta '7889238': 3 kuukautta - min_age_label: Ikäraja + min_age_label: Ikäkynnys min_favs: Säilytä julkaisut, joilla on suosikiksi lisäyksiä vähintään - min_favs_hint: Ei poista julkaisujasi, joita on lisätty suosikeihin vähintään näin monta kertaa. Jätä tyhjäksi, jos haluat poistaa julkaisuja riippumatta suosikkeihin lisäysmääristä + min_favs_hint: Ei poista julkaisujasi, joita on lisätty suosikeihin vähintään näin monta kertaa. Jätä tyhjäksi, jos haluat poistaa julkaisuja riippumatta niiden suosikkeihin lisäämisen määrästä min_reblogs: Säilytä julkaisut, joilla on tehostuksia vähintään min_reblogs_hint: Ei poista julkaisujasi, joita on tehostettu vähintään näin monta kertaa. Jätä tyhjäksi, jos haluat poistaa julkaisuja riippumatta niiden tehostusten määrästä stream_entries: @@ -1785,13 +1805,13 @@ fi: too_many_requests: Käännöspalvelulle on hiljattain esitetty liian monta pyyntöä. two_factor_authentication: add: Lisää - disable: Poista 2FA käytöstä - disabled_success: Kaksivaiheinen todennus on poistettu käytöstä + disable: Poista kaksivaiheinen todennus käytöstä + disabled_success: Kaksivaiheisen todennuksen käytöstäpoisto onnistui edit: Muokkaa - enabled: Kaksivaiheinen todennus käytössä + enabled: Kaksivaiheinen todennus on käytössä enabled_success: Kaksivaiheisen todennuksen käyttöönotto onnistui generate_recovery_codes: Luo palautuskoodit - lost_recovery_codes: Palautuskoodien avulla voit käyttää tiliä, jos menetät puhelimesi. Jos olet hukannut palautuskoodisi, voit luoda uudet tästä. Vanhat palautuskoodit poistetaan käytöstä. + lost_recovery_codes: Palautuskoodien avulla saat jälleen pääsyn tilillesi, jos menetät puhelimesi. Jos olet hukannut palautuskoodisi, voit luoda uudet tästä. Vanhat palautuskoodit poistuvat käytöstä. methods: Kaksivaiheisen todennuksen menetelmät otp: Todennussovellus recovery_codes: Ota palautuskoodit talteen @@ -1801,14 +1821,14 @@ fi: user_mailer: appeal_approved: action: Tilin asetukset - explanation: Valitus tiliäsi koskevasta varoituksesta %{strike_date} jonka lähetit %{appeal_date} on hyväksytty. Tilisi on jälleen hyvässä kunnossa. + explanation: "%{appeal_date} lähettämäsi valitus tiliisi kohdistuvasta varoituksesta %{strike_date} on hyväksytty. Tilisi on jälleen hyvässä kunnossa." subject: Valituksesi %{date} on hyväksytty subtitle: Tilisi on jälleen normaalissa tilassa. title: Valitus hyväksytty appeal_rejected: - explanation: Valitus tiliäsi koskevasta varoituksesta %{strike_date} jonka lähetit %{appeal_date} on hylätty. - subject: Valituksesi %{date} on hylätty - subtitle: Vetoomuksesi on hylätty. + explanation: "%{appeal_date} lähettämäsi valitus tiliisi kohdistuvasta varoituksesta %{strike_date} on hylätty." + subject: "%{date} lähettämäsi valitus on hylätty" + subtitle: Valituksesi on hylätty. title: Valitus hylätty backup_ready: explanation: Olet pyytänyt täyden varmuuskopion Mastodon-tilistäsi. @@ -1817,10 +1837,10 @@ fi: title: Arkiston tallennus failed_2fa: details: 'Sisäänkirjautumispyrkimyksen yksityiskohtaiset tiedot:' - explanation: Joku on yrittänyt kirjautua tilillesi antaen väärän toisen todennustunnisteen. + explanation: Joku on yrittänyt kirjautua tilillesi mutta antoi väärän toisen todennustunnisteen. further_actions_html: Jos se et ollut sinä, suosittelemme, että %{action} välittömästi, sillä se on saattanut vaarantua. subject: Kaksivaiheisen todennuksen virhe - title: Kaksivaiheisen kirjautumisen toinen vaihe epäonnistui + title: Kaksivaiheisen todennuksen toinen vaihe epäonnistui suspicious_sign_in: change_password: vaihda salasanasi details: 'Tässä on tiedot kirjautumisesta:' @@ -1830,15 +1850,15 @@ fi: title: Uusi kirjautuminen warning: appeal: Lähetä valitus - appeal_description: Jos uskot, että tämä on virhe, voit hakea muutosta instanssin %{instance} ylläpidolta. + appeal_description: Jos uskot, että tämä on virhe, voit hakea muutosta palvelimen %{instance} ylläpidolta. categories: spam: Roskaposti violation: Sisältö rikkoo seuraavia yhteisön sääntöjä explanation: - delete_statuses: Joidenkin julkaisuistasi on havaittu rikkovan ainakin yhtä yhteisön sääntöä, joten instanssin %{instance} valvojat ovat poistaneet ne. + delete_statuses: Joidenkin julkaisuistasi on havaittu rikkovan ainakin yhtä yhteisön sääntöä, joten palvelimen %{instance} moderaattorit ovat poistaneet ne. disable: Et voi enää käyttää tiliäsi, mutta profiilisi ja muut tiedot pysyvät muuttumattomina. Voit pyytää varmuuskopiota tiedoistasi, vaihtaa tilin asetuksia tai poistaa tilisi. - mark_statuses_as_sensitive: Palvelimen %{instance} valvojat ovat merkinneet osan julkaisuistasi arkaluonteisiksi. Tämä tarkoittaa sitä, että ihmisten täytyy napauttaa mediaa ennen kuin sen esikatselu näytetään. Voit merkitä median itse arkaluonteiseksi, kun julkaiset tulevaisuudessa. - sensitive: Tästä lähtien kaikki ladatut mediatiedostot merkitään arkaluonteisiksi ja piilotetaan napsautusvaroituksen taakse. + mark_statuses_as_sensitive: Palvelimen %{instance} moderaattorit ovat merkinneet osan julkaisuistasi arkaluonteisiksi. Tämä tarkoittaa sitä, että ihmisten täytyy napauttaa mediaa ennen kuin sen esikatselu näytetään. Voit merkitä median itse arkaluonteiseksi, kun julkaiset tulevaisuudessa. + sensitive: Tästä lähtien kaikki lähetetyt mediatiedostot merkitään arkaluonteisiksi ja piilotetaan napsautusvaroituksen taakse. silence: Voit edelleen käyttää tiliäsi, mutta vain sinua jo seuraavat käyttäjät näkevät julkaisusi tällä palvelimella ja sinut voidaan sulkea pois eri löytämisominaisuuksista. Toiset voivat kuitenkin edelleen seurata sinua manuaalisesti. suspend: Et voi enää käyttää tiliäsi, eivätkä profiilisi ja muut tiedot ole enää käytettävissä. Voit silti kirjautua sisään pyytääksesi tietojesi varmuuskopiota, kunnes tiedot on poistettu kokonaan noin 30 päivän kuluttua. Säilytämme kuitenkin joitain perustietoja, jotka estävät sinua kiertämästä jäädytystä. reason: 'Syy:' @@ -1867,11 +1887,11 @@ fi: checklist_subtitle: 'Näin pääset alkuun tällä uudella sosiaalisella alustalla:' checklist_title: Tervetulon tarkistuslista edit_profile_action: Mukauta - edit_profile_step: Tehosta vuorovaikutuksiasi kattavin profiilitiedoin. + edit_profile_step: Täydentämällä profiilisi tietoja tehostat vuorovaikutteisuutta. edit_profile_title: Mukauta profiiliasi explanation: Näillä vinkeillä pääset alkuun feature_action: Lue lisää - feature_audience: Mastodon tarjoaa sinulle ainutlaatuisen mahdollisuuden hallita yleisöäsi ilman välikäsiä. Omassa infrastruktuurissasi toimiva Mastodon on täysin hallinnassasi, ja mahdollistaa sinun seurata mitä tahansa Mastodon-palvelimia sekä niin ikään olla seurattu niiltä päin. + feature_audience: Mastodon tarjoaa sinulle ainutlaatuisen mahdollisuuden hallita yleisöäsi ilman välikäsiä. Omassa infrastruktuurissasi toimiva Mastodon on täysin hallinnassasi ja antaa sinun seurata ja tulla seuratuksi miltä tahansa verkon Mastodon-palvelimelta. feature_audience_title: Rakenna yleisöäsi luottavaisin mielin feature_control: Tiedät itse parhaiten, mitä haluat nähdä kotisyötteessäsi. Ei algoritmeja eikä mainoksia tuhlaamassa aikaasi. Seuraa yhdellä tilillä ketä tahansa, miltä tahansa Mastodon-palvelimelta, vastaanota heidän julkaisunsa aikajärjestyksessä ja tee omasta internetin nurkastasi hieman enemmän omanlaisesi. feature_control_title: Pidä aikajanasi hallussasi @@ -1880,15 +1900,15 @@ fi: feature_moderation: Mastodon palauttaa päätöksenteon käsiisi. Jokainen palvelin luo omat sääntönsä ja määräyksensä, joita valvotaan paikallisesti eikä ylhäältä alas kuten kaupallisessa sosiaalisessa mediassa, mikä tekee siitä joustavimman vastaamaan eri ihmisryhmien tarpeisiin. Liity palvelimelle, jonka säännöt sopivat sinulle, tai ylläpidä omaa palvelinta. feature_moderation_title: Moderointi juuri kuten sen pitäisi olla follow_action: Seuraa - follow_step: Mastodon perustuu sinua kiinnostavien henkilöjen julkaisujen seuraamiseen. + follow_step: Mastodonissa on kyse kiinnostavien ihmisten seuraamisesta. follow_title: Mukauta kotisyötettäsi follows_subtitle: Seuraa tunnettuja tilejä follows_title: Seurantaehdotuksia follows_view_more: Näytä lisää seurattavia henkilöitä hashtags_recent_count: - one: "%{people} henkilö viimeisen 2 päivän aikana" - other: "%{people} henkilöä viimeisen 2 päivän aikana" - hashtags_subtitle: Tutki, mikä on ollut suosittua 2 edeltävän päivän jälkeen + one: "%{people} henkilö viimeisenä 2 päivänä" + other: "%{people} henkilöä viimeisenä 2 päivänä" + hashtags_subtitle: Tutki, mikä on ollut suosittua viimeisenä 2 päivänä hashtags_title: Suositut aihetunnisteet hashtags_view_more: Näytä lisää suosittuja aihetunnisteita post_action: Kirjoita @@ -1912,20 +1932,20 @@ fi: extra_instructions_html: Vinkki: Verkkosivustollasi oleva linkki voi olla myös näkymätön. Olennainen osuus on rel="me", joka estää toiseksi henkilöksi tekeytymisen verkkosivustoilla, joilla on käyttäjien luomaa sisältöä. Voit käyttää jopa link-elementtiä sivun head-osassa elementin a sijaan, mutta HTML:n pitää olla käytettävissä ilman JavaScript-koodin suorittamista. here_is_how: Näin voit tehdä sen hint_html: "Henkilöllisyyden vahvistaminen on Mastodonissa jokaisen käyttäjän ulottuvilla. Se perustuu avoimiin standardeihin ja on maksutonta nyt ja aina. Tarvitset vain henkilökohtaisen verkkosivuston, jonka perusteella sinut voidaan tunnistaa. Kun teet linkin tuolle verkkosivulle profiilistasi, tarkistamme, että verkkosivustolla on linkki takaisin profiiliisi, ja näytämme profiilissasi visuaalisen ilmaisimen." - instructions_html: Kopioi ja liitä alla oleva koodi verkkosivustosi HTML-lähdekoodiin. Lisää sitten verkkosivustosi osoite johonkin profiilisi lisäkentistä ”Muokkaa profiilia” -välilehdellä ja tallenna muutokset. + instructions_html: Kopioi ja liitä seuraava koodi verkkosivustosi HTML-lähdekoodiin. Lisää sitten verkkosivustosi osoite johonkin profiilisi lisäkentistä ”Muokkaa profiilia” -välilehdellä ja tallenna muutokset. verification: Vahvistus verified_links: Vahvistetut linkkisi webauthn_credentials: add: Lisää uusi suojausavain create: error: Suojausavaimen lisäämisessä oli ongelma. Yritä uudelleen. - success: Suojausavaimesi lisääminen onnistui. + success: Suojausavaimesi lisäys onnistui. delete: Poista delete_confirmation: Haluatko varmasti poistaa tämän suojausavaimen? - description_html: Jos otat suojausavaimen todennuksen käyttöön, kirjautuminen edellyttää jonkin suojausavaimen käyttämistä. + description_html: Jos otat suojausavaimella todennuksen käyttöön, kirjautuminen edellyttää jonkin suojausavaimesi käyttämistä. destroy: error: Suojausavaimen poistamisessa oli ongelma. Yritä uudelleen. - success: Suojausavaimesi poistaminen onnistui. + success: Suojausavaimesi poisto onnistui. invalid_credential: Virheellinen suojausavain nickname_hint: Anna uuden suojausaivaimesi lempinimi not_enabled: Et ole vielä ottanut WebAuthn-ohjelmaa käyttöön diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 6a5401ced4882f..74b37c759efd4e 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -471,6 +471,9 @@ fo: title: Tilmæli at fylgja unsuppress: Endurskapa tilmæli at fylgja instances: + audit_log: + title: Feskir kanningarloggar + view_all: Vís fullar kanningarloggar availability: description_html: one: Um veiting til navnaøkið ikki riggar í %{count} dag, so verða ongar royndir at veita gjørdar, uttan so, at ein veiting frá navnaøkinum er móttikin. @@ -882,7 +885,23 @@ fo: action: Kekka her fyri at fáa fleiri upplýsingar message_html: "Objekt-goymslan hjá tær er skeivt uppsett. Privatlívið hjá brúkarunum hjá tær er í vanda." tags: + moderation: + not_trendable: Ikki rákbært + not_usable: Kann ikki brúkast + pending_review: Viðgerð í gongd + review_requested: Viðgerð umbiðin + reviewed: Viðgjørt + title: Støða + trendable: Rákbært + unreviewed: Ikki viðgjørt + usable: Ónýtiligt + name: Navn + newest: Nýggjasta/u + oldest: Elsta/u + reset: Endurstilla review: Eftirkanna støðu + search: Leita + title: Frámerki updated_msg: Frámerkjastillingar dagførdar title: Umsiting trends: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 54e28608efa779..054ae2fab2ac63 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -226,6 +226,7 @@ fy: update_custom_emoji: Lokale emoji bywurkje update_domain_block: Domeinblokkade bywurkje update_ip_block: IP-rigel bywurkje + update_report: Rapportaazje bywurkje update_status: Berjocht bywurkje update_user_role: Rol bywurkje actions: @@ -293,6 +294,7 @@ fy: filter_by_action: Op aksje filterje filter_by_user: Op brûker filterje title: Auditlogboek + unavailable_instance: "(domeinnamme net beskikber)" announcements: destroyed_msg: Fuortsmiten fan meidieling slagge! edit: @@ -469,6 +471,9 @@ fy: title: Oanrekommandearre accounts unsuppress: Account wer oanrekommandearje instances: + audit_log: + title: Resinte auditlochboeken + view_all: Folsleine auditlochboeken besjen availability: description_html: one: As de besoarging oan it domein nei %{count} dag mislearjen bliuwt, dan sille der gjin fierdere besykjen ta besoarging dien wurde oant in besoarging fan it domein ûntfongen is. @@ -637,6 +642,7 @@ fy: report: 'Rapportaazje #%{id}' reported_account: Rapportearre account reported_by: Rapportearre troch + reported_with_application: Mei applikaasje rapportearre resolved: Oplost resolved_msg: Rapportaazje oplosse slagge! skip_to_actions: Gean daliks nei de maatregels @@ -780,6 +786,7 @@ fy: approved: Goedkarring fereaske om te registrearje te kinnen none: Net ien kin harren registrearje open: Elkenien kin harren registrearje + warning_hint: Wy riede jo oan om ‘Goedkarring fereaske om registrearje te kinnen’ te brûken, útsein jo der wis fan binne dat jo moderaasjeteam spam en kweawollende registraasjes tidich ôfhannelje kin. security: authorized_fetch: Ferifikaasje fan fedearre servers fereaskje authorized_fetch_hint: Ferifikaasje fereaskje fan federearre servers, makket in striktere hanthaving fan sawol brûkersnivo as server-levelblokken mooglik. Dit giet wol ten koste fan de prestaasjes, ferminderet it berik fan jo antwurden en kin kompatibiliteitsproblemen mei guon federearre services opleverje. Boppedat sil dit net foarkomme dat tawijde spilers jo iepenbiere artikelen en accounts ophelje. @@ -950,6 +957,7 @@ fy: delete: Fuortsmite edit_preset: Foarynstelling foar warskôging bewurkje empty: Jo hawwe noch gjin foarynstellingen foar warskôgingen tafoege. + title: Foarynstellingen foar warskôgingen webhooks: add_new: Einpunt tafoegje delete: Fuortsmite @@ -971,6 +979,9 @@ fy: title: Webhooks webhook: Webhook admin_mailer: + auto_close_registrations: + body: Yn ferbân mei in gebrek oan resinte moderatoraktiviteit, is de registraasjemodus op %{instance} automatysk wizige nei hânmjittige beoardieling troch moderatoren. Dit om foar te kommen dat %{instance} as platfoarm foar eventueel misbrûk brûkt wurde kin. Jo kinne op elk winske momint werom skeakelje nei iepen registraasjes. + subject: De registraasjemodus op %{instance} is automatysk wizige nei hânmjittige beoardieling troch moderatoren new_appeal: actions: delete_statuses: it fuortsmiten fan harren berjochten @@ -1669,6 +1680,8 @@ fy: user_domain_block: Jo hawwe %{target_name} blokkearre lost_followers: Ferlerne folgers lost_follows: Ferlerne folge accounts + preamble: Jo kinne folge accounts en folgers ferlieze wannear’t jo in domein blokkearje of wannear’t de moderators fan jo server beslisse om in eksterne server út te sluten. Wannear’t dat bart, kinne jo listen fan ferbrutsen folchrelaasjes downloade, dizze ynspektearje en mooglik ymportearje op in oare server. + purged: Ynformaasje oer dizze server is fuortsmiten troch de behearders fan jo server. type: Barren statuses: attached: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 647c46d7cf2726..0de8a2fede8426 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -495,6 +495,9 @@ ga: title: Moltaí leanúna unsuppress: Aischuir moladh leanúna instances: + audit_log: + title: Logchomhaid Iniúchta le Déanaí + view_all: Féach ar logaí iniúchta iomlána availability: description_html: few: Má theipeann ar sheachadadh chuig an bhfearann ​​ar %{count} laethanta éagsúla gan rath, ní dhéanfar aon iarrachtaí seachadta eile mura bhfaightear ó seachadadh ón bhfearann. @@ -924,7 +927,23 @@ ga: action: Seiceáil anseo le haghaidh tuilleadh eolais message_html: "Tá do stór oibiachtaí míchumraithe. Tá príobháideacht d'úsáideoirí i mbaol." tags: + moderation: + not_trendable: Ní trendable + not_usable: Ní inúsáidte + pending_review: Athbhreithniú ar feitheamh + review_requested: Athbhreithniú iarrtha + reviewed: Athbhreithnithe + title: Stádas + trendable: Treocht + unreviewed: Gan athbhreithniú + usable: Inúsáidte + name: Ainm + newest: Is nuaí + oldest: Is sine + reset: Athshocraigh review: Stádas athbhreithnithe + search: Cuardach + title: Haischlibeanna updated_msg: D'éirigh le socruithe hashtag a nuashonrú title: Riar trends: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 52b25e28543dd8..b9f0260f52459e 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -232,6 +232,7 @@ gd: update_custom_emoji: Ùraich an t-Emoji gnàthaichte update_domain_block: Ùraich bacadh na h-àrainne update_ip_block: Ùraich an riaghailt IP + update_report: Ùraich an gearan update_status: Ùraich am post update_user_role: Ùraich an dreuchd actions: @@ -291,6 +292,7 @@ gd: update_custom_emoji_html: Dh’ùraich %{name} an Emoji %{target} update_domain_block_html: Dh’ùraich %{name} bacadh na h-àrainne %{target} update_ip_block_html: Sguab %{name} às riaghailt dhan IP %{target} + update_report_html: Dh’ùraich %{name} an gearan %{target} update_status_html: Dh’ùraich %{name} post le %{target} update_user_role_html: Dh’atharraich %{name} an dreuchd %{target} deleted_account: chaidh an cunntas a sguabadh às @@ -298,6 +300,7 @@ gd: filter_by_action: Criathraich a-rèir gnìomha filter_by_user: Criathraich a-rèir cleachdaiche title: Sgrùd an loga + unavailable_instance: "(chan eil ainm na h-àrainn ri fhaighinn)" announcements: destroyed_msg: Chaidh am brath-fios a sguabadh às! edit: @@ -484,6 +487,9 @@ gd: title: Molaidhean leantainn unsuppress: Aisig am moladh leantainn instances: + audit_log: + title: Logaichean sgrùdaidh o chionn goirid + view_all: Seall na logaichean sgrùdaidh slàna availability: description_html: few: Ma dh’fhàilligeas an lìbhrigeadh dhan àrainn fad %{count} làithean, chan fheuch sinn a-rithist leis an lìbhrigeadh ach às dèidh lìbhrigeadh fhaighinn on àrainn ud fhèin. @@ -660,6 +666,7 @@ gd: report: 'Gearan air #%{id}' reported_account: Cunntas mun a chaidh a ghearan reported_by: Chaidh gearan a dhèanamh le + reported_with_application: Chaidh an gearan a dhèanamh le aplacaid resolved: Air fhuasgladh resolved_msg: Chaidh an gearan fhuasgladh! skip_to_actions: Geàrr leum dha na gnìomhan @@ -779,6 +786,7 @@ gd: desc_html: Tha seo an eisimeil air sgriobtaichean hCaptcha on taobh a-muigh a dh’fhaodadh a bhith ’na dhragh tèarainteachd ’s prìobhaideachd. A bharrachd air sin, nì seo an clàradh mòran nas do-ruigsinn no chuid (gu h-àraidh an fheadhainn air a bheil ciorram). Air na h-adhbharan sin, beachdaich air dòighean eile mar clàradh stèidhichte air aontachadh no cuireadh. title: Iarr air cleachdaichean ùra gum fuasgail iad CAPTCHA gus an cunntas aca a dhearbhadh content_retention: + danger_zone: Earrann chunnartach preamble: Stiùirich mar a tha susbaint an luchd-cleachdaidh ’ga stòradh ann am Mastodon. title: Glèidheadh na susbaint default_noindex: @@ -905,7 +913,23 @@ gd: action: Thoir sùil an-seo airson barrachd fiosrachaidh message_html: "Chaidh stòras nan oibseactan agad a dhroch-rèiteachadh. Tha prìobhaideachd an luchd-cleachdaidh agad fo chunnart." tags: + moderation: + not_trendable: Chan fhaod a threandadh + not_usable: Cha ghabh a chleachdadh + pending_review: A’ feitheamh air lèirmheas + review_requested: Chaidh lèirmheas iarraidh + reviewed: Chaidh lèirmheas a dhèanamh air + title: Staid + trendable: Faodaidh a threandadh + unreviewed: Gun lèirmheas + usable: Gabhaidh a chleachdadh + name: Ainm + newest: As ùire + oldest: As sine + reset: Ath-shuidhich review: Dèan lèirmheas air an staid + search: Lorg + title: Tagaichean hais updated_msg: Chaidh roghainnean an taga hais ùrachadh title: Rianachd trends: @@ -983,6 +1007,7 @@ gd: delete: Sguab às edit_preset: Deasaich rabhadh ro-shuidhichte empty: Cha do mhìnich thu ro-sheataichean rabhaidhean fhathast. + title: Ro-sheataichean rabhaidhean webhooks: add_new: Cuir puing-dheiridh ris delete: Sguab às diff --git a/config/locales/gl.yml b/config/locales/gl.yml index d1c8633badd602..d6c00d205ca5b1 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -471,6 +471,9 @@ gl: title: Recomendacións de seguimento unsuppress: Restablecer recomendación de seguimento instances: + audit_log: + title: Rexistros de Auditoría recentes + view_all: Ver os rexistros de auditoría completos availability: description_html: one: Se fallan as entregas ao dominio por %{count} día, non se farán máis intentos a menos que se reciba unha solicitude desde ese dominio. @@ -882,7 +885,23 @@ gl: action: Mira aquí para máis información message_html: "A almacenaxe de obxectos está mal configurada. A privacidade das usuarias está en risco." tags: + moderation: + not_trendable: Non permitir en voga + not_usable: Non utilizable + pending_review: Pendente de revisión + review_requested: Revisión solicitada + reviewed: Revisada + title: Estado + trendable: Permitir en voga + unreviewed: Sen revisar + usable: Utilizable + name: Nome + newest: Máis recente + oldest: Máis antiga + reset: Restabelecer review: Estado de revisión + search: Buscar + title: Cancelos updated_msg: Actualizaronse os axustes dos cancelos title: Administración trends: diff --git a/config/locales/he.yml b/config/locales/he.yml index 105bd059f23c87..8e09bed939cfd4 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -487,6 +487,9 @@ he: title: המלצות מעקב unsuppress: שחזור המלצות מעקב instances: + audit_log: + title: יומני ביקורת אחרונים + view_all: צפיה ביומני הביקורת המלאים availability: description_html: many: אם משלוח לדומיין נכשל במשך %{count} ימים שונים ולא מצליח, נסיונות משלוח נוספים לא יעשו אלא אם התקבל משלוח מהדומיין. @@ -910,7 +913,23 @@ he: action: למידע נוסף message_html: "שרות אחסון הענן שלך אינו מוגדר כראוי. פרטיות המשתמשות והמשתמשים שלך בסכנה." tags: + moderation: + not_trendable: לא מזוהה כאופנתי + not_usable: בלתי שמיש + pending_review: ממתינים לסקירה + review_requested: התבקשה סקירה + reviewed: נסקר + title: מצב + trendable: ניתן לאפיון כאופנה + unreviewed: לא נסקר + usable: שמיש + name: שם + newest: החדש ביותר + oldest: הישן ביותר + reset: איפוס review: סקירת מצב + search: חיפוש + title: תגיות updated_msg: הגדרות תגיות עודכנו בהצלחה title: ניהול trends: diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 0bfc30027abef7..d6a8e3cc355bcb 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -40,6 +40,23 @@ hi: upload_check_privacy_error_object_storage: action: अधिक जानकारी हेतु यहां क्लिक करें। message_html: " आपके वेब सर्वर का कन्फिगरेशन सही नहीं है। उपयोगकर्ताओं की निजता खतरे में है। " + tags: + moderation: + not_trendable: ट्रेंड नहीं किया जाएगा + not_usable: उपयोगी नहीं + pending_review: लंबित समीक्षा + review_requested: समीक्षा की मांग की गई + reviewed: समीक्षित + title: स्टेटस + trendable: चर्चा में + unreviewed: गैर समीक्षित + usable: उपयुक्त + name: नाम + newest: नवीनतम + oldest: सबसे पुराने + reset: पुनः नियत करें + search: खोजें + title: हैशटैग redirects: prompt: अगर आपको इस लिंक पर भरोसा है तो आगे बढ़ने के लिए इसे क्लिक करें title: आप इस %{instance} को छोड़ने वाले हैं diff --git a/config/locales/hu.yml b/config/locales/hu.yml index df32bd39d116f7..e4f5c1b847b07f 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -471,6 +471,9 @@ hu: title: Követési ajánlatok unsuppress: Követési ajánlatok visszaállítása instances: + audit_log: + title: Legutóbbi auditnapló + view_all: Teljes auditnapló megtekintése availability: description_html: one: Ha a domainre történő kézbesítés %{count} teljes nap sikertelen, további kézbesítéseket már nem kísérlünk meg, hacsak mi nem kapunk kézbesítést a domaintől. @@ -882,7 +885,23 @@ hu: action: Itt találsz több információt message_html: "Az objektumtárolód félre van konfigurálva. Kockázat merül fel a felhasználóid adatainak biztonságával kapcsolatban." tags: + moderation: + not_trendable: Nem lehet felkapott + not_usable: Nem használható + pending_review: Ellenőrzésre vár + review_requested: Ellenőrzés kérve + reviewed: Ellenőrizve + title: Állapot + trendable: Lehet felkapott + unreviewed: Nem ellenőrzött + usable: Használható + name: Név + newest: Legújabb + oldest: Legrégebbi + reset: Visszaállítás review: Engedélyezés állapota + search: Keresés + title: Hashtagek updated_msg: A hashtag beállításokat sikeresen frissítettük title: Karbantartás trends: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 7350ffceeb8a05..964230d5a577e8 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -226,6 +226,7 @@ ia: update_custom_emoji: Actualisar emoji personalisate update_domain_block: Actualisar blocada de dominio update_ip_block: Actualisar le regula IP + update_report: Actualisar le reporto update_status: Actualisar le message update_user_role: Actualisar rolo actions: @@ -638,6 +639,7 @@ ia: report: 'Reporto #%{id}' reported_account: Conto reportate reported_by: Reportate per + reported_with_application: Signalate con le application resolved: Resolvite resolved_msg: Reporto resolvite con successo! skip_to_actions: Saltar al actiones @@ -880,7 +882,10 @@ ia: action: Consulta hic pro plus information message_html: "Tu immagazinage de objectos es mal configurate. Le confidentialitate de tu usatores es in risco." tags: + name: Nomine review: Revide le stato + search: Cercar + title: Hashtags updated_msg: Parametros de hashtag actualisate con successo title: Administration trends: diff --git a/config/locales/is.yml b/config/locales/is.yml index a4cc282d1d770c..4aa05fb10cde85 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -471,6 +471,9 @@ is: title: Fylgja meðmælum unsuppress: Endurheimta að fylgja meðmælum instances: + audit_log: + title: Nýlegar atvikaskráningar + view_all: Skoða heildar-atvikaskráningar availability: description_html: one: Ef afhending til lénsins mistekst í %{count} dag, verður ekki reynt aftur að afhenda til lénsins nema ef afhending frá léninu berst. @@ -884,7 +887,23 @@ is: action: Skoðaðu hér til að fá frekari upplýsingar message_html: "Gagnageymslan þín er ekki rétt stillt. Friðhelgi notendanna þinna gæti verið í hættu." tags: + moderation: + not_trendable: Getur ekki orðið vinsælt + not_usable: Ekki nothæft + pending_review: Bíður eftir yfirferð + review_requested: Beðið um yfirferð + reviewed: Yfirfarið + title: Staða + trendable: Getur orðið vinsælt + unreviewed: Óyfirfarið + usable: Nothæft + name: Nafn + newest: Nýjast + oldest: Elsta + reset: Endurstilla review: Yfirfara stöðufærslu + search: Leita + title: Myllumerki updated_msg: Það tókst að uppfæra stillingar myllumerkja title: Stjórnendur trends: diff --git a/config/locales/it.yml b/config/locales/it.yml index 68e1608d9c1990..d552d08a45cab4 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -471,6 +471,9 @@ it: title: Consigli su chi seguire unsuppress: Ripristina consigli su chi seguire instances: + audit_log: + title: Log di Controllo Recenti + view_all: Visualizza tutti i log availability: description_html: one: Se la consegna al dominio fallisce %{count} giorno, non sarà effettuato alcun tentativo di consegna ulteriore a meno che la consegna dal dominio non sia ricevuta. @@ -882,7 +885,23 @@ it: action: Controlla qui per maggiori informazioni message_html: "La tua archiviazione oggetti è mal configurata. La privacy dei tuoi utenti è a rischio." tags: + moderation: + not_trendable: Non di tendenza + not_usable: Non utilizzabile + pending_review: In attesa di revisione + review_requested: Revisione richiesta + reviewed: Controllato + title: Stato + trendable: Di tendenza + unreviewed: Non revisionato + usable: Utilizzabile + name: Nome + newest: Più recenti + oldest: Più vecchio + reset: Ripristina review: Esamina status + search: Cerca + title: Hashtag updated_msg: Impostazioni hashtag aggiornate con successo title: Amministrazione trends: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 5142b550321c48..0eeb055170ad3d 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -223,6 +223,7 @@ ja: update_custom_emoji: カスタム絵文字を更新 update_domain_block: ドメインブロックを更新 update_ip_block: IPルールを更新 + update_report: 通報の更新 update_status: 投稿を更新 update_user_role: ロールを更新 actions: @@ -626,6 +627,7 @@ ja: report: '通報 #%{id}' reported_account: 報告対象アカウント reported_by: 報告者 + reported_with_application: 報告に使用されたアプリ resolved: 解決済み resolved_msg: 通報を解決済みにしました! skip_to_actions: アクションに移動 diff --git a/config/locales/kab.yml b/config/locales/kab.yml index a094936aaf0b38..d6295ec9ae0981 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -810,7 +810,7 @@ kab: video: one: "%{count} n tbidyutt" other: "%{count} n tbidyutin" - edited_at_html: Tettwaẓreg %{date} + edited_at_html: Tettwaẓreg ass n %{date} open_in_web: Ldi deg Web poll: total_people: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 632bd7c097647f..4d21a7dd3d092c 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -465,6 +465,9 @@ ko: title: 팔로우 추천 unsuppress: 팔로우 추천 복원 instances: + audit_log: + title: 최근 감사 기록 + view_all: 감사 기록 전체 보기 availability: description_html: other: 도메인에 대한 전달이 성공 없이 %{count}일 실패한다면, 이후의 전달 시도는 해당 도메인에서 전달이 오기 전까지는 만들어지지 않습니다. @@ -629,6 +632,7 @@ ko: report: '신고 #%{id}' reported_account: 신고 대상 계정 reported_by: 신고자 + reported_with_application: 신고에 사용된 앱 resolved: 해결 resolved_msg: 신고를 잘 해결했습니다! skip_to_actions: 작업으로 건너뛰기 @@ -869,7 +873,23 @@ ko: action: 더 많은 정보를 보려면 여기를 확인하세요 message_html: "오브젝트 스토리지가 잘못 설정되어 있습니다. 사용자의 개인정보가 위험한 상태입니다." tags: + moderation: + not_trendable: 유행에 오를 수 없음 + not_usable: 사용 불가 + pending_review: 심사 대기 + review_requested: 검토 요청 + reviewed: 검토함 + title: 게시물 + trendable: 유행에 오를 수 있음 + unreviewed: 검토되지 않음 + usable: 사용 가능 + name: 이름 + newest: 최신 + oldest: 오래된 순 + reset: 초기화 review: 심사 상태 + search: 검색 + title: 해시태그 updated_msg: 해시태그 설정이 성공적으로 갱신되었습니다 title: 관리 trends: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 1e717b6c204292..5e18751e0989cc 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -348,7 +348,7 @@ lt: shortcode_hint: Bent du ženklai, tik raidiniai skaitmeniniai ženklai bei akcentai(_) title: Asmeniniai jaustukai uncategorized: Be kategorijos - unlist: Išbraukti iš sąrašo + unlist: Neįtraukti į sąrašą unlisted: Neįtrauktas į sąrašą update_failed_msg: Jaustukas negalėjo būti pakeistas updated_msg: Jaustukas sėkmingai pakeistas! @@ -446,6 +446,9 @@ lt: import: description_html: Netrukus importuosi domenų blokavimų sąrašą. Labai atidžiai peržiūrėk šį sąrašą, ypač jei ne tu jį sudarei. instances: + audit_log: + title: Naujausi audito žurnalai + view_all: Peržiūrėti visus audito žurnalus availability: title: Prieinamumas warning: Paskutinis bandymas prisijungti prie šio serverio buvo nesėkmingas @@ -523,6 +526,7 @@ lt: report: 'Skundas #%{id}' reported_account: Reportuota paskyra reported_by: Skundas sukurtas + reported_with_application: Pranešta su programėle resolved: Išspręsta resolved_msg: Skundas sėkmingai įšspręstas! status: Statusas @@ -607,6 +611,23 @@ lt: message_html: Tavo Elasticsearch klasteris turi tik vieną mazgą, ES_PRESET turėtų būti nustatyta į single_node_cluster. elasticsearch_running_check: message_html: Nepavyko prijungti prie Elasticsearch. Patikrink, ar ji veikia, arba išjunk viso teksto paiešką. + tags: + moderation: + not_trendable: Netendencinga + not_usable: Nenaudojama + pending_review: Laukiama peržiūros + review_requested: Paprašyta peržiūros + reviewed: Peržiūrėta + title: Statusas + trendable: Tendencinga + unreviewed: Neperžiūrėta + usable: Naudojama + name: Pavadinimas + newest: Naujausias + oldest: Seniausias + reset: Atkurti + search: Paieška + title: Saitažodžiai title: Administracija trends: allow: Leisti @@ -1100,7 +1121,7 @@ lt: private_long: rodyti tik sekėjams public: Vieša public_long: visi gali matyti - unlisted: Neįtrauktas į sąrašus + unlisted: Neįtrauktas į sąrašą unlisted_long: matyti gali visi, bet nėra išvardyti į viešąsias laiko skales statuses_cleanup: enabled_hint: Automatiškai ištrina įrašus, kai jie pasiekia nustatytą amžiaus ribą, nebent jie atitinka vieną iš toliau nurodytų išimčių diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 91872754f5cd9b..da1684e8a9b1cc 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -471,6 +471,9 @@ nl: title: Aanbevolen accounts unsuppress: Account weer aanbevelen instances: + audit_log: + title: Recente audit-logboeken + view_all: Volledige audit-logboeken inzien availability: description_html: one: Wanneer de bezorging aan het domein gedurende %{count} dag blijft mislukken dan worden er geen bezorgpogingen meer gedaan, totdat een bezorging van het domein wordt ontvangen. @@ -882,7 +885,23 @@ nl: action: Klik hier voor meer informatie message_html: "Jouw objectopslag is verkeerd geconfigureerd. De privacy van je gebruikers is in gevaar." tags: + moderation: + not_trendable: Niet trendbaar + not_usable: Niet bruikbaar + pending_review: In afwachting van beoordeling + review_requested: Beoordeling aangevraagd + reviewed: Beoordeeld + title: Status + trendable: Trendbaar + unreviewed: Onbeoordeeld + usable: Bruikbaar + name: Naam + newest: Nieuwste + oldest: Oudste + reset: Opnieuw review: Status beoordelen + search: Zoeken + title: Hashtags updated_msg: Instellingen hashtag succesvol bijgewerkt title: Beheer trends: @@ -977,7 +996,7 @@ nl: webhook: Webhook admin_mailer: auto_close_registrations: - body: In verband met een gebrek aan recentelijke moderator-activiteit, is de registratie-modus op %{instance} automatisch veranderd naar handmatige beoordeling door moderatoren. Dit om te voorkomen dat %{instance} als platform voor eventueel misbruik kan worden gebruikt. Je kunt op elk gewenst moment veel terugschakelen naar open registraties. + body: In verband met een gebrek aan recentelijke moderatoractiviteit, is de registratiemodus op %{instance} automatisch gewijzigd naar handmatige beoordeling door moderatoren. Dit om te voorkomen dat %{instance} als platform voor eventueel misbruik kan worden gebruikt. Je kunt op elk gewenst moment weer terugschakelen naar open registraties. subject: De registratie-modus op %{instance} is automatisch veranderd naar handmatige beoordeling door moderatoren new_appeal: actions: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index b0c733102ea886..1477396999f5cc 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -487,6 +487,9 @@ pl: title: Polecane konta unsuppress: Przywróć polecenie obserwacji konta instances: + audit_log: + title: Niedawne zdarzenia z dzienniku + view_all: Pokaż pełny dziennik zdarzeń availability: description_html: few: Jeśli dostarczenie do domeny nie powiedzie się %{count} dni bez powodzenia, nie zostaną podjęte dalsze próby dostawy, chyba że otrzymano dostawę od domeny. @@ -910,7 +913,23 @@ pl: action: Kliknij tutaj, aby dowiedzieć się więcej message_html: "Pamięć obiektu jest nieprawidłowa. Prywatność twoich użytkowników jest zagrożona." tags: + moderation: + not_trendable: Nie mogą trendować + not_usable: Nieużywalne + pending_review: Oczekuje na przejrzenie + review_requested: Prośba o przejrzenie + reviewed: Przejrzane + title: Status + trendable: Mogą trendować + unreviewed: Nieprzejrzane + usable: Używalne + name: Nazwa + newest: Najnowsze + oldest: Najstarsze + reset: Resetuj review: Stan przeglądu + search: Szukaj + title: Hashtagi updated_msg: Pomyślnie uaktualniono ustawienia hashtagów title: Administracja trends: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 1df423bb7de93f..ed6a8a4028caf9 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -471,6 +471,9 @@ pt-PT: title: Seguir recomendações unsuppress: Restaurar recomendações de contas a seguir instances: + audit_log: + title: Registos de auditoria recentes + view_all: Ver registos de auditoria completos availability: description_html: one: Se a transmissão ao domínio falhar ao final de %{count} dia(s), não será feita mais nenhuma tentativa de transmissão a menos que seja recebida uma transmissão proveniente desse domínio. @@ -882,7 +885,23 @@ pt-PT: action: Verifique aqui para mais informações message_html: "O seu armazenamento de objetos está mal configurado. A privacidade dos seus utilizadores está em risco." tags: + moderation: + not_trendable: Não pode ser tendência + not_usable: Não utilizável + pending_review: Pendente de revisão + review_requested: Revisão solicitada + reviewed: Revista + title: Estado + trendable: Pode ser tendência + unreviewed: Não revista + usable: Utilizável + name: Nome + newest: Mais recente + oldest: Mais antiga + reset: Repor review: Estado da revisão + search: Pesquisar + title: Hashtags updated_msg: 'Definições de #etiquetas correctamente actualizadas' title: Administração trends: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 449d8d9c7f3296..6f4fd6eb30da66 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -118,7 +118,7 @@ sc: search_same_ip: Àteras persones cun sa pròpiu IP security: Seguresa sensitive: Sensìbile - sensitized: marcadu comente a sensìbile + sensitized: Marcadu comente sensìbile shared_inbox_url: URL de intrada cumpartzida show: created_reports: Informes creados @@ -127,13 +127,13 @@ sc: silenced: Limitadas statuses: Tuts subscribe: Sutascrie·ti - suspend: Suspensione + suspend: Suspende suspended: Suspèndidu suspension_irreversible: Is datos de custu contu sunt istados cantzellados in manera irreversìbile. Podes bogare sa suspensione a su contu pro chi si potzat impreare, ma no at a recuperare datu perunu de is chi teniat in antis. suspension_reversible_hint_html: Su contu est istadu suspèndidu, e is datos ant a èssere cantzelladu de su totu su %{date}. Finas a tando, su contu si podet ripristinare sena efetu malu perunu. Si boles cantzellare totu is datos de su contu immediatamente ddu podes fàghere inoghe in bassu. title: Contos unconfirmed_email: Posta eletrònica sena cunfirmare - undo_sensitized: Boga sa marcadura comente "sensìbile" + undo_sensitized: Boga sa marcadura comente sensìbile undo_silenced: Non pòngias a sa muda undo_suspension: Iscontza sa suspensione unsilenced_msg: As bogadu is lìmites a su contu de %{username} @@ -280,36 +280,44 @@ sc: updated_msg: Emoji atualizadu upload: Càrriga dashboard: - media_storage: Immagasinamentu + active_users: utentes ativos + interactions: interatziones + media_storage: Immagasinamentu multimèdia + new_users: utentes noos + opened_reports: informes abertos software: Programmas space: Impreu de ispàtziu title: Pannellu + website: Situ web domain_allows: add_new: Permite sa federatzione cun domìniu created_msg: Sa federatzione cun su domìniu est istada permìtida destroyed_msg: Sa federatzione cun su domìniu no est istada permìtida - import: Importatzione + export: Esporta + import: Importa undo: Non permitas sa federatzione cun su domìniu domain_blocks: add_new: Agiunghe blocu de domìniu nou confirm_suspension: cancel: Annulla - confirm: Suspensione + confirm: Suspende + title: Cunfirma su blocu de domìniu de %{domain} created_msg: Protzessende su blocu de domìniu destroyed_msg: Su blocu de domìniu est istadu iscontzadu domain: Domìniu edit: Modìfica su blocu de su domìniu existing_domain_block_html: As giai impostu lìmites prus astrintos a %{name}, ddu dias dèpere isblocare prima. - import: Importatzione + export: Esporta + import: Importa new: create: Crea unu blocu hint: Su blocu de domìniu no at a impedire sa creatzione de contos noos in sa base de datos, ma ant a èssere aplicados in manera retroativa mètodos de moderatzione ispetzìficos subra custos contos. severity: noop: Perunu - silence: A sa muda + silence: Lìmita suspend: Suspensione title: Blocu de domìniu nou - not_permitted: Non tenes su permissu de fàghere custa atzione + not_permitted: Non tenes permissu pro fàghere custa atzione obfuscate: Cua su nòmine de domìniu obfuscate_hint: Cua una parte de su nòmine de domìniu in sa lista si sa visualizatzione de sa lista de domìnios limitados est ativa private_comment: Cummentu privadu @@ -330,7 +338,16 @@ sc: new: create: Agiunghe unu domìniu title: Bloca su domìniu de posta eletrònica nou + not_permitted: Non permìtidu title: Domìnios de posta eletrònica blocados + export_domain_allows: + no_file: Perunu archìviu seletzionadu + export_domain_blocks: + import: + title: Importa blocos de domìniu + new: + title: Importa blocos de domìniu + no_file: Perunu archìviu seletzionadu follow_recommendations: description_html: "Is cussìgios de sighiduras agiudant a is persones noas a agatare deretu cuntenutu interessante. Si una persone at interagidu cun pagu gente e non podet retzire cussìgios de sighiduras personalizados, custos contos ant a èssere ammustrados. Ant a èssere torrados a carculare dae un'ammisturu de contos cun is pertzentuales de cumpromissu prus artos e su nùmeru prus artu de sighiduras pro un'idioma ispetzìficu." language: Pro idioma @@ -341,15 +358,22 @@ sc: unsuppress: Recùpera su cussìgiu de sighidura instances: back_to_all: Totus - back_to_limited: Limitadu + back_to_limited: Limitadas back_to_warning: Atentzione by_domain: Domìniu content_policies: + comment: Apuntu internu policies: + reject_media: Refuda elementos multimediales reject_reports: Refuda informes - silence: A sa muda - suspend: Suspensione + silence: Lìmita + suspend: Suspende + policy: Polìtica + reason: Resone pùblica + title: Polìticas de cuntenutu dashboard: + instance_accounts_dimension: Contos prus sighidos + instance_accounts_measure: contos sarvados instance_reports_measure: informes a subra de àtere delivery: all: Totus @@ -426,10 +450,12 @@ sc: assigned: Moderatzione assignada by_target_domain: Domìniu de su contu signaladu cancel: Annulla + category: Categoria comment: none: Perunu confirm: Cunfirma created_at: Sinnaladu + delete_and_resolve: Cantzella publicatziones forwarded: Torradu a imbiare forwarded_to: Torradu a imbiare a %{domain} mark_as_resolved: Marca comente a isòrvidu @@ -442,12 +468,14 @@ sc: create_and_unresolve: Torra a abèrrere cun una nota delete: Cantzella placeholder: Descrie is atziones chi as pigadu o cale si siat àtera atualizatzione de importu... + title: Notas reopen: Torra a abèrrere s'informe report: 'Informe #%{id}' reported_account: Contu sinnaladu reported_by: Sinnaladu dae resolved: Isòrvidu resolved_msg: Informe isòrvidu. + skip_to_actions: Brinca a is atziones status: Istadu title: Informes unassign: Boga s'assignatzione @@ -455,13 +483,18 @@ sc: updated_at: Atualizadu view_profile: Visualiza profilu roles: + assigned_users: + one: "%{count} utente" + other: "%{count} utentes" categories: administration: Amministratzione invites: Invitos moderation: Moderatzione + special: Ispetziale delete: Cantzella privileges: administrator: Amministratzione + invite_users: Invita gente rules: add_new: Agiunghe règula delete: Cantzella @@ -481,7 +514,8 @@ sc: discovery: follow_recommendations: Cussìgios de sighidura profile_directory: Diretòriu de profilos - public_timelines: Lìnias de tempos pùblicas + public_timelines: Lìnias de tempus pùblicas + publish_statistics: Pùblica istatìsticas title: Iscoberta trends: Tendèntzias domain_blocks: @@ -495,19 +529,32 @@ sc: approved: Aprovatzione rechesta pro si registrare none: Nemos si podet registrare open: Chie si siat si podet registrare + title: Cunfiguratziones de su serbidore site_uploads: delete: Cantzella s'archìviu carrigadu destroyed_msg: Càrriga de su situ cantzellada. software_updates: documentation_link: Àteras informatziones + title: Atualizatziones a disponimentu + type: Casta + version: Versione statuses: + account: Autore application: Aplicatzione back_to_account: Torra a sa pàgina de su contu deleted: Cantzelladu + favourites: Preferidos + language: Idioma media: title: Elementos multimediales + metadata: Metadatos no_status_selected: Perunu istadu est istadu mudadu dae chi non nd'as seletzionadu + open: Aberi sa publicatzione + original_status: Publicatzione originale + status_changed: Publicatzione modificada title: Istados de su contu + trending: Populares + visibility: Visibilidade with_media: Cun elementos multimediales strikes: actions: @@ -515,7 +562,7 @@ sc: suspend: "%{name} at suspèndidu su contu de %{target}" system_checks: database_schema_check: - message_html: Ddoe at tràmudas de base de datos in suspesu. Pone·ddas in esecutzione pro ti assegurare chi s'aplicatzione funtzionet comente si tocat + message_html: Ddoe at tràmudas de bases de datos in suspesu. Pone·ddas in esecutzione pro ti assegurare chi s'aplicatzione funtzionet comente si tocat rules_check: action: Gesti is règulas de su serbidore message_html: No as cunfiguradu peruna règula de su serbidore. @@ -527,6 +574,12 @@ sc: title: Amministratzione trends: pending_review: De revisionare + rejected: Refudadas + statuses: + allow: Permite sa publicatzione + allow_account: Permite a s'autore + disallow: Non permitas sa publicatzione + disallow_account: Non permitas a s'autore tags: title: Etichetas de tendèntzia title: Tendèntzias @@ -541,8 +594,17 @@ sc: disabled: Disativadu enable: Ativa enabled: Ativu + events: Eventos status: Istadu admin_mailer: + new_appeal: + actions: + delete_statuses: cantzellare is publicatziones issoro + mark_statuses_as_sensitive: marcare is publicatziones issoro comente sensìbiles + none: un'avisu + sensitive: marcare su contu issoro comente sensìbile + silence: limitare su contu issoro + suspend: suspèndere su contu issoro new_pending_account: body: Is detàllios de su contu nou sunt a suta. Podes aprovare o refudare custa rechesta. subject: Contu nou de revisionare in %{instance} (%{username}) @@ -551,6 +613,10 @@ sc: body_remote: Una persone de su domìniu %{domain} at sinnaladu %{target} subject: Informe nou pro %{instance} (#%{id}) new_trends: + new_trending_links: + title: Ligòngios populares + new_trending_statuses: + title: Publicatziones populares new_trending_tags: title: Etichetas de tendèntzia aliases: @@ -588,8 +654,11 @@ sc: warning: Dae cara a custos datos. Non ddos cumpartzas mai cun nemos! your_token: S'identificadore tuo de atzessu auth: + apply_for_account: Pedi unu contu confirmations: + clicking_this_link: incarchende custu ligòngiu login_link: intra + welcome_title: Ti donamus su benebènnidu, %{name}! delete_account: Cantzella su contu delete_account_html: Si boles cantzellare su contu, ddu podes fàghere inoghe. T'amus a dimandare una cunfirmatzione. description: @@ -601,21 +670,32 @@ sc: invalid_reset_password_token: Su còdighe de autorizatzione pro resetare sa crae no est vàlidu o est iscadidu. Dimanda·nde un'àteru. link_to_otp: Inserta unu còdighe a duas fases dae su telèfono tuo o unu còdighe de recùperu link_to_webauth: Imprea su dispositivu tuo de crae de seguresa + log_in_with: Intra cun login: Intra logout: Essi migrate_account: Moe a unu contu diferente migrate_account_html: Si boles torrare a indiritzare custu contu a un'àteru, ddu as a pòdere fàghere inoghe. or_log_in_with: O intra cun + progress: + confirm: Cunfirma s'indiritzu de posta eletrònica + details: Is detàllios tuos + review: Sa revisione nostra + rules: Atzeta is règulas providers: cas: CAS saml: SAML register: Registru registration_closed: "%{instance} no atzetat àteras persones" + resend_confirmation: Torra a imbiare su ligòngiu de cunfirmatzione reset_password: Reseta sa crae rules: + accept: Atzeta back: A coa + title_invited: As retzidu un'invitu. security: Seguresa set_new_password: Cunfigura una crae noa + setup: + link_not_received: No as retzidu su ligòngiu? status: account_status: Istadu de su contu confirming: Isetende chi sa posta eletrònica siat cumpletada. @@ -670,11 +750,15 @@ sc: username_unavailable: Su nòmine de utente tuo no at a abarrare a disponimentu disputes: strikes: + status_removed: Sa publicatzione est giai istada cantzellada de su sistema + title: "%{action} de sa data imbeniente: %{date}" title_actions: + delete_statuses: Cantzelladura de publicatziones none: Atentzione domain_validator: invalid_domain: no est unu nòmine de domìniu vàlidu edit_profile: + basic_information: Informatzione bàsica other: Àteru errors: '400': Sa dimanda chi as imbiadu non fiat vàlida o non fiat curreta. @@ -720,15 +804,36 @@ sc: public: Lìnias de tempos pùblicas thread: Arresonadas edit: + add_keyword: Agiunghe paràulas crae + keywords: Paràulas crae + statuses: Publicatziones individuales title: Modìfica filtru errors: invalid_context: Cuntestu mancante o non vàlidu index: delete: Cantzella empty: Non tenes perunu filtru. + expires_in: Iscadit in %{distance} + expires_on: Iscadit su %{date} + keywords: + one: "%{count} paràula crae" + other: "%{count} paràulas crae" + statuses: + one: "%{count} publicatzione" + other: "%{count} publicatziones" + statuses_long: + one: "%{count} publicatzione individuale cuada" + other: "%{count} publicatziones individuales cuadas" title: Filtros new: + save: Sarva filtru nou title: Agiunghe unu filtru nou + statuses: + back_to_filter: Torra a su filtru + batch: + remove: Boga dae su filtru + index: + title: Publicatziones filtradas generic: all: Totus cancel: Annulla @@ -736,6 +841,7 @@ sc: confirm: Cunfirma copy: Còpia delete: Cantzella + deselect: Boga sa seletzione none: Perunu order_by: Òrdina pro save_changes: Sarva is modìficas @@ -745,7 +851,12 @@ sc: other: Calicuna cosa ancora no est andende. Bide is %{count} faddinas in bàsciu imports: errors: + empty: Archìviu CSV bòidu over_rows_processing_limit: cuntenet prus de %{count} filas + too_large: S'archìviu est tropu mannu + failures: Faddinas + imported: Importadu + mismatched_types_warning: Forsis as seletzionadu unu tipu chi no est curretu pro s'importatzione. modes: merge: Uni merge_long: Mantene is registros chi esistint e agiunghe·nde àteros @@ -836,8 +947,8 @@ sc: copy_account_note_text: 'Custa persone s''est tramudada dae %{acct}, custas sunt is notas antepostas tuas chi ddi pertocant:' notification_mailer: favourite: - body: "%{name} at marcadu comente a preferidu s'istadu tuo:" - subject: "%{name} at marcadu comente a preferidu s'istadu tuo" + body: "%{name} at marcadu comente preferida sa publicatzione tua:" + subject: "%{name} at marcadu comente preferida sa publicatzione tua" title: Preferidu nou follow: body: "%{name} t'est sighende!" @@ -904,7 +1015,10 @@ sc: posting_defaults: Valores predefinidos de publicatzione public_timelines: Lìnias de tempos pùblicas privacy: + privacy: Riservadesa search: Chirca + privacy_policy: + title: Polìtica de riservadesa reactions: errors: limit_reached: Lìmite de reatziones diferentes cròmpidu @@ -928,8 +1042,13 @@ sc: status: Istadu de su contu remote_follow: missing_resource: Impossìbile agatare sa rechesta de indiritzamentu URL pro su contu tuo + rss: + content_warning: 'Avisu de cuntenutu:' + descriptions: + account: Publicatziones pùblicas dae @%{acct} + tag: 'Publicatziones pùblicas etichetadas cun #%{hashtag}' scheduled_statuses: - over_daily_limit: As superadu su lìmite de %{limit} tuts programmados pro cudda die + over_daily_limit: As superadu su lìmite de %{limit} publicatziones programmadas pro cudda die over_total_limit: As superadu su lìmite de %{limit} tuts programmados too_soon: Sa data programmada depet èssere benidora sessions: @@ -937,11 +1056,13 @@ sc: browser: Navigadore browsers: alipay: Alipay + blackberry: BlackBerry chrome: Chrome edge: Microsoft Edge electron: Electron firefox: Firefox generic: Navigadore disconnotu + huawei_browser: Navigadore Huawei ie: Internet Explorer micro_messenger: MicroMessenger nokia: Navigadore Nokia S40 Ovi @@ -950,19 +1071,25 @@ sc: phantom_js: PhantomJS qq: QQ Browser safari: Safari + uc_browser: Navigadore UC + unknown_browser: Navigadore disconnotu weibo: Weibo current_session: Sessione atuale + date: Data description: "%{browser} de %{platform}" explanation: Custos sunt is navigadores web de is chi ses intradu in su contu tuo de Mastodon. ip: IP platforms: adobe_air: Adobe Air android: Android + blackberry: BlackBerry chrome_os: ChromeOS firefox_os: Firefox OS ios: iOS + kai_os: KaiOS linux: Linux mac: macOS + unknown_platform: Prataforma disconnota windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone @@ -984,8 +1111,9 @@ sc: import: Importatzione import_and_export: Importatzione e esportatzione migrate: Tràmuda de contu + notifications: Notìficas tràmite posta eletrònica preferences: Preferèntzias - profile: Profilu + profile: Profilu pùblicu relationships: Gente chi sighis e sighiduras two_factor_authentication: Autenticatzione de duos fatores webauthn_authentication: Craes de seguresa @@ -1034,6 +1162,7 @@ sc: unlisted: Esclùidu de sa lista unlisted_long: Podet èssere bidu dae chie si siat, però non podet èssere ammustradu in lìnias de tempus pùblicas statuses_cleanup: + exceptions: Etzetziones min_age: '1209600': 2 chidas '15778476': 6 meses @@ -1055,6 +1184,8 @@ sc: formats: default: "%d %b %Y, %H:%M" month: "%b %Y" + time: "%H:%M" + with_time_zone: "%d %b, %Y, %H:%M %Z" two_factor_authentication: add: Agiunghe disable: Disativa 2FA @@ -1071,23 +1202,47 @@ sc: recovery_instructions_html: Si una die as a pèrdere s'atzessu a su telèfonu tuo, as a pòdere impreare unu de is còdighes de recùperu inoghe in suta pro recuperare s'atzessu a su contu tuo. Cunserva is còdighes in manera segura. Pro esèmpiu, ddos dias pòdere imprentare e archiviare in paris a àteros documentos de importu. webauthn: Craes de seguresa user_mailer: + appeal_approved: + action: Cunfiguratziones de su contu backup_ready: subject: S'archìviu tuo est prontu pro èssere iscarrigadu title: Collida dae s'archìviu + suspicious_sign_in: + change_password: muda sa crae + details: 'Custos sunt is detàllios de s''identificatzione:' warning: + categories: + spam: Àliga reason: 'Resone:' + statuses: 'Publicatziones tzitadas:' subject: disable: Su contu tuo %{acct} est istadu cungeladu none: Avisu pro %{acct} silence: Su contu tuo %{acct} est istadu limitadu suspend: Su contu tuo %{acct} est istadu suspèndidu title: + delete_statuses: Publicatziones cantzelladas disable: Contu congeladu + mark_statuses_as_sensitive: Publicatziones marcadas comente sensìbiles none: Atentzione + sensitive: Contu marcadu comente sensìbile silence: Contu limitadu suspend: Contu suspèndidu welcome: + apps_ios_action: Iscàrriga·dda dae sa butega de aplicatziones + apps_step: Iscàrriga is aplicatziones ufitziales nostras. + apps_title: Aplicatziones de Mastodon + edit_profile_action: Personaliza + edit_profile_title: Personaliza su profilu tuo explanation: Inoghe ddoe at una paja de impòsitos pro cumintzare + feature_action: Àteras informatziones + follow_action: Sighi + follow_title: Personaliza s'ischermu printzipale + post_action: Iscrie + post_title: Pùblica pro sa primu borta + share_action: Cumpartzi + share_title: Cumpartzi su profilu tuo de Mastodon + sign_in_action: Intra subject: Ti donamus su benebènnidu a Mastodon title: Ti donamus su benebènnidu, %{name}! users: @@ -1101,13 +1256,13 @@ sc: webauthn_credentials: add: Agiunghe una crae de seguresa noa create: - error: Ddoe at àpidu unu problema cun s'agiunta de sa crae de seguresa tua. Torra a proare. + error: Ddoe est istadu unu problema cun s'agiunta de sa crae de seguresa tua. Torra a proare. success: Sa crae de seguresa tua est istada agiunta. delete: Cantzella delete_confirmation: Seguru chi boles cantzellare custa crae de seguresa? description_html: Si permites s'autenticatzione cun crae de seguresa, as a tènnere bisòngiu de impreare una de is craes de seguresa tuas pro ti identificare. destroy: - error: Ddoe at àpidu unu problema cun sa cantzelladura de sa crae de seguresa tua. Torra a proare. + error: Ddoe est istadu unu problema cun sa cantzelladura de sa crae de seguresa tua. Torra a proare. success: Sa crae de seguresa tua est istada cantzellada. invalid_credential: Crae de seguresa non vàlida nickname_hint: Inserta su nomìngiu de sa crae de seguresa tua noa diff --git a/config/locales/simple_form.an.yml b/config/locales/simple_form.an.yml index e409c39ae10f29..7119aadba252f7 100644 --- a/config/locales/simple_form.an.yml +++ b/config/locales/simple_form.an.yml @@ -271,7 +271,6 @@ an: listable: Permitir que esta etiqueta amaneixca en as busquedas y en o directorio d'o perfil name: Etiqueta trendable: Permitir que esta etiqueta amaneixca baixo tendencias - usable: Permitir a las publicacions usar esta etiqueta user: role: Rol user_role: diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 370667d48ea5f8..744da9d0554477 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -311,7 +311,6 @@ ar: listable: اسمح لهذا الوسم بالظهور في البحث وفي دليل الصفحات التعريفية name: الوسم trendable: السماح لهذه الكلمة المفتاحية بالظهور تحت المتداوَلة - usable: اسمح للمنشورات استخدام هذا الوسم user: role: الدور time_zone: النطاق الزمني diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index c222c9aef5ba30..5e3f1af89a5299 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -180,7 +180,6 @@ ast: listable: Permitir qu'esta etiqueta apaeza nes busques y nes suxerencies name: Etiqueta trendable: Permitir qu'esta etiqueta apaeza nes tendencies - usable: Permitir que los artículos usen esta etiqueta user: role: Rol time_zone: Fusu horariu diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 101d40f117364c..fca41d3fe3c4ea 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -311,7 +311,6 @@ be: listable: Дазволіць паказ хэштэгу ў пошуку і ў каталозе профіляў name: Хэштэг trendable: Дазволіць паказ гэтага хэштэга ў трэндах - usable: Дазволіць выкарыстанне хэштэгу ў допісах user: role: Роля time_zone: Часавы пояс diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 564f72e8c21231..333ab25c825490 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -314,7 +314,7 @@ bg: listable: Позволяване на хаштага да се появява при търсене и предложения name: Хаштаг trendable: Показване на хаштага да се появява под нашумели - usable: Позволяване на публикациите да употребяват този хаштаг + usable: Позволяване на публикациите да употребяват този хаштаг локално user: role: Роля time_zone: Часова зона diff --git a/config/locales/simple_form.br.yml b/config/locales/simple_form.br.yml index 196711aee97b1a..f4d442cfdab828 100644 --- a/config/locales/simple_form.br.yml +++ b/config/locales/simple_form.br.yml @@ -72,7 +72,6 @@ br: tag: name: Hashtag trendable: Aotren an hashtag-mañ da zont war wel dindan tuadurioù - usable: Aotren an embannadurioù da implijout an hashtag-mañ user: role: Roll time_zone: Gwerzhid eur diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 2e0199d7fd5b06..4daf657234bb73 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -314,7 +314,7 @@ ca: listable: Permet que aquesta etiqueta aparegui en les cerques i en el directori de perfils name: Etiqueta trendable: Permet que aquesta etiqueta aparegui en les tendències - usable: Permet als tuts emprar aquesta etiqueta + usable: Permet a les publicacions emprar aquesta etiqueta localment user: role: Rol time_zone: Zona horària diff --git a/config/locales/simple_form.ckb.yml b/config/locales/simple_form.ckb.yml index 3c1d8315e326f4..cfadea034da4fa 100644 --- a/config/locales/simple_form.ckb.yml +++ b/config/locales/simple_form.ckb.yml @@ -182,7 +182,6 @@ ckb: listable: ڕیگەبدە ئەم هاشتاگە لە پێرستی هەڵبژاردەی بەکارهێنەران و پەڕەی گەڕان نیشان بدرێت name: هەشتاگ trendable: ڕێگەبدە ئەم هەشتاگە لە نووسراوەی بەرچاوکراو نیسان بدرێت - usable: ڕێگەبدە بە توتەکان بۆ بەکارهێنانی ئەم هەشتاگە 'no': نە recommended: پێشنیارکراوە required: diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index dfec033469efb6..06c993f406a72e 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -186,7 +186,6 @@ co: listable: Auturizà stu hashtag à esse vistu nant'à l'annuariu di i prufili name: Hashtag trendable: Auturizà stu hashtag à esse vistu in e tendenze - usable: Auturizà i statuti à utilizà stu hashtag 'no': Nò recommended: Ricumandati required: diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index f8422102f19fff..5a1bd3c88390ea 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -311,7 +311,6 @@ cs: listable: Povolit zobrazení tohoto hashtagu ve vyhledávání a návrzích 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 time_zone: Časové pásmo diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index cd5bc1add788b8..611223ea665bb2 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -211,6 +211,7 @@ cy: setting_default_privacy: Preifatrwydd cyhoeddi setting_default_sensitive: Marcio cyfryngau fel eu bod yn sensitif bob tro setting_delete_modal: Dangos deialog cadarnhau cyn dileu postiad + setting_disable_hover_cards: Analluogi rhagolwg proffil ar lusgo setting_disable_swiping: Analluogi cynigion llusgo setting_display_media: Dangos cyfryngau setting_display_media_default: Rhagosodiad @@ -313,7 +314,6 @@ cy: listable: Caniatáu i'r hashnod hwn ymddangos mewn chwiliadau ac awgrymiadau name: Hashnod trendable: Caniatáu i'r hashnod hwn ymddangos o dan bynciau llosg - usable: Caniatáu i bostiadau ddefnyddio'r hashnod hwn user: role: Rôl time_zone: Cylchfa amser diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 9e949d16839f7d..5763885ac4b5cd 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -314,7 +314,7 @@ da: listable: Tillad visning af dette hashtag i søgninger og forslag name: Hashtag trendable: Tillad visning af dette hashtag under trends - usable: Tillad indlæg at benytte dette hashtag + usable: Tillad indlæg at benytte dette hashtag lokalt user: role: Rolle time_zone: Tidszone diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 332d9513952126..fb7bda94896089 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -314,7 +314,7 @@ de: listable: Erlaube, dass dieser Hashtag in Suchen und Empfehlungen erscheint name: Hashtag trendable: Erlaube, dass dieser Hashtag in den Trends erscheint - usable: Erlaube, dass dieser Hashtag in Beiträgen erscheint + usable: Beiträge dürfen diesen Hashtag lokal verwenden user: role: Rolle time_zone: Zeitzone diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 29b9f59e14a87d..af93f65fecd76e 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -276,7 +276,6 @@ el: listable: Εμφάνιση αυτής της ετικέτας στο δημόσιο κατάλογο name: Ετικέτα trendable: Εμφάνιση της ετικέτας στις τάσεις - usable: Χρήση της ετικέτας σε τουτ user: role: Ρόλος user_role: diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index c1f2a015e94b27..606b9a4d4040b7 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -314,7 +314,6 @@ en-GB: listable: Allow this hashtag to appear in searches and suggestions name: Hashtag trendable: Allow this hashtag to appear under trends - usable: Allow posts to use this hashtag user: role: Role time_zone: Time Zone diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 6bc7c6ac525e9f..fee3a6151ad419 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -314,7 +314,7 @@ en: listable: Allow this hashtag to appear in searches and suggestions name: Hashtag trendable: Allow this hashtag to appear under trends - usable: Allow posts to use this hashtag + usable: Allow posts to use this hashtag locally user: role: Role time_zone: Time zone diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 021be93b5d74cb..3b51c1590867ef 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -303,7 +303,6 @@ eo: listable: Permesi ĉi tiun kradvorton aperi en serĉoj kaj sugestoj name: Kradvorto trendable: Permesi al ĉi tiu kradvorto aperi en furoraĵoj - usable: Permesi mesaĝojn uzi ĉi tiun kradvorton user: role: Rolo time_zone: Horzono diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 71d9726b079423..e26af5b0c60ea4 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -314,7 +314,7 @@ es-AR: listable: Permitir que esta etiqueta aparezca en las búsquedas y en las sugerencias name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias - usable: Permitir a los mensajes usar esta etiqueta + usable: Permitir que los mensajes usen esta etiqueta localmente user: role: Rol time_zone: Zona horaria diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 730e9b265b335a..b2c26020dae5e5 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -314,7 +314,7 @@ es-MX: listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias - usable: Permitir a los toots usar esta etiqueta + usable: Permitir a las publicacions usar esta etiqueta localmente user: role: Rol time_zone: Zona horaria diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index f2d91349adad6b..0e6cc47e366505 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -314,7 +314,7 @@ es: listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias - usable: Permitir a las publicaciones usar esta etiqueta + usable: Permitir a las publicacions usar esta etiqueta localmente user: role: Rol time_zone: Zona horaria diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 4dd74e68a365c7..74660921d2d552 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -311,7 +311,6 @@ et: listable: Luba sellel sildil ilmuda profiilide kataloogis name: Silt trendable: Luba sellel sildil trendida - usable: Luba postitustel seda silti kasutada user: role: Roll time_zone: Ajavöönd diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 8c467bc9bff422..c7e2667cad0111 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -311,7 +311,6 @@ eu: listable: Baimendu traola hau bilaketetan agertzea eta profilen direktorioan name: Traola trendable: Baimendu traola hau joeretan agertzea - usable: Baimendu tootek traola hau erabiltzea user: role: Rola time_zone: Ordu zona diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index dd1c56e3bddaeb..0610f7fced987f 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -286,7 +286,6 @@ fa: listable: اجازه به این برچسب برای ظاهر شدن در جست‌وجوها و پیشنهادها name: برچسب trendable: بگذارید که این برچسب در موضوعات پرطرفدار دیده شود - usable: بگذارید که این برچسب در فرسته‌ها به کار بروند user: role: نقش time_zone: منطقهٔ زمانی diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index de099a21be2e1a..fa1fd49b3815c9 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -9,28 +9,28 @@ fi: indexable: Julkiset julkaisusi voivat näkyä hakutuloksissa Mastodonissa. Ihmiset, jotka ovat olleet vuorovaikutuksessa julkaisujesi kanssa, voivat etsiä niitä asetuksesta riippumatta. note: 'Voit @mainita muita käyttäjiä tai #aihetunnisteita.' show_collections: Käyttäjät voivat selata seurattujasi ja seuraajiasi. Käyttäjät, joita seuraat, näkevät joka tapauksessa, että seuraat heitä. - unlocked: Käyttäjät voivat seurata sinua pyytämättä hyväksyntää. Poista valinta, jos haluat tarkistaa ja hyväksyä tai hylätä vastaanottamasi seuraamispyynnöt. + unlocked: Käyttäjät voivat seurata sinua pyytämättä hyväksyntääsi. Poista valinta, jos haluat tarkistaa sekä hyväksyä tai hylätä vastaanottamasi seurantapyynnöt. account_alias: - acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, josta haluat siirtyä + acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, josta haluat muuttaa account_migration: - acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, johon haluat siirtyä + acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, jonne haluat muuttaa account_warning_preset: text: Voit käyttää julkaisun syntaksia, kuten URL-osoitteita, aihetunnisteita ja mainintoja title: Valinnainen. Ei näy vastaanottajalle admin_account_action: - include_statuses: Käyttäjä näkee, mitkä julkaisut johtivat valvontatoimeen tai varoitukseen + include_statuses: Käyttäjä näkee, mitkä julkaisut johtivat moderointitoimeen tai -varoitukseen send_email_notification: Käyttäjä saa selvityksen siitä, mitä hänen tililleen tapahtui text_html: Valinnainen. Voit käyttää julkaisun syntaksia. Voit lisätä varoitusasetuksia säästääksesi aikaa type_html: Valitse mitä teet käyttäjälle %{acct} types: disable: Estä käyttäjää käyttämästä tiliään, mutta älä poista tai piilota sen sisältöä. - none: Käytä tätä lähettääksesi varoituksen käyttäjälle käynnistämättä mitään muita toimintoja. + none: Käytä tätä lähettääksesi varoitus käyttäjälle käynnistämättä mitään muita toimia. sensitive: Pakota kaikki tämän käyttäjän mediatiedostot arkaluonteisiksi. - silence: Estä käyttäjää lähettämästä viestejä julkisesti, piilota hänen viestinsä ja ilmoituksensa ihmisiltä, jotka eivät seuraa häntä. Sulkee kaikki tämän tilin raportit. - suspend: Estä kaikki vuorovaikutus tältä -tai tälle tilille ja poista sen kaikki sisältö. Päätös voidaan peruuttaa 30 päivän aikana. Sulkee kaikki raportit tätä tiliä vasten. + silence: Estä käyttäjää lähettämästä julkaisuja, joiden näkyvyys on julkinen, sekä piilota hänen julkaisunsa ja häneen liittyvät ilmoitukset niiltä, jotka eivät seuraa häntä. Sulkee kaikki tiliin kohdistuvat raportit. + suspend: Estä kaikki vuorovaikutus tältä tililtä ja tälle tilille sekä poista kaikki sen sisältö. Peruttavissa 30 päivän ajan. Sulkee kaikki tiliin kohdistuvat raportit. warning_preset_id: Valinnainen. Voit silti lisätä mukautetun tekstin esiasetuksen loppuun announcement: - all_day: Kun valittu, vain valittu aikaväli näytetään + all_day: Kun valittuna, vain aikavälin päivät näytetään ends_at: Valinnainen. Tiedote poistetaan automaattisesti tällä hetkellä scheduled_at: Jätä tyhjäksi julkaistaksesi tiedotteen heti starts_at: Valinnainen. Jos tiedotteesi on sidottu tiettyyn aikaväliin @@ -40,19 +40,19 @@ fi: defaults: autofollow: Henkilöt, jotka rekisteröityvät kutsun kautta, seuraavat sinua automaattisesti avatar: WEBP, PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px - bot: Tämä tili suorittaa enimmäkseen automaattisia toimintoja eikä sitä ehkä valvota + bot: Ilmaise muille, että tili suorittaa enimmäkseen automaattisia toimia eikä sitä valvota context: Ainakin yksi konteksti, jossa suodattimen pitäisi olla voimassa current_password: Turvallisuussyistä kirjoita nykyisen tilin salasana current_username: Vahvista kirjoittamalla nykyisen tilin käyttäjänimi digest: Lähetetään vain pitkän poissaolon jälkeen ja vain, jos olet saanut suoria viestejä poissaolosi aikana - email: Sinulle lähetetään vahvistussähköposti + email: Sinulle lähetetään vahvistusviesti header: WEBP, PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px inbox_url: Kopioi URL-osoite haluamasi välittäjän etusivulta - irreversible: Suodatetut julkaisut katoavat lopullisesti, vaikka suodatin poistettaisiin myöhemmin + irreversible: Suodatetut julkaisut katoavat peruuttamattomasti, vaikka suodatin poistettaisiin myöhemmin locale: Käyttöliittymän, sähköpostien ja puskuilmoitusten kieli - password: Käytä vähintään 8 merkkiä + password: Käytä vähintään 8:aa merkkiä phrase: Täsmää riippumatta tekstin aakkoslajista tai julkaisun sisältövaroituksesta - scopes: Mihin sovellusliittymiin sovellus pääsee käsiksi. Jos valitset ylätason laajuuden, sinun ei tarvitse valita yksittäisiä. + scopes: Mihin ohjelmointirajapintoihin sovelluksella on pääsy. Jos valitset ylätason käyttöoikeuden, sinun ei tarvitse valita yksittäisiä. setting_aggregate_reblogs: Älä näytä uusia tehostuksia julkaisuille, joita on äskettäin tehostettu (koskee vain juuri vastaanotettuja tehostuksia) setting_always_send_emails: Yleensä sähköposti-ilmoituksia ei lähetetä, kun käytät Mastodonia aktiivisesti setting_default_sensitive: Arkaluonteinen media piilotetaan oletusarvoisesti, ja se voidaan näyttää yhdellä napsautuksella @@ -64,43 +64,43 @@ fi: username: Voit käyttää kirjaimia, numeroita ja alaviivoja whole_word: Kun avainsana tai -fraasi on täysin aakkosnumeerinen, suodatin aktivoituu vain sen täysvastineille domain_allow: - domain: Tämä verkkotunnus voi noutaa tietoja tältä palvelimelta ja sieltä saapuvat tiedot käsitellään ja tallennetaan + domain: Tämä verkkotunnus voi noutaa tietoja tältä palvelimelta, ja sieltä saapuvat tiedot käsitellään ja tallennetaan email_domain_block: domain: Tämä voi olla verkkotunnus, joka näkyy sähköpostiosoitteessa tai sen käyttämässä MX-tietueessa. Ne tarkistetaan rekisteröitymisen yhteydessä. - with_dns_records: Annetun verkkotunnuksen DNS-tietueet yritetään ratkaista ja tulokset myös estetään + with_dns_records: Annetun verkkotunnuksen DNS-tietueet yritetään selvittää ja myös tulokset estetään featured_tag: name: 'Tässä muutamia hiljattain käyttämiäsi aihetunnisteita:' filters: action: Valitse, mikä toiminto suoritetaan, kun julkaisu vastaa suodatinta actions: - hide: Piilota suodatettu sisältö kokonaan ja käyttäydy ikään kuin sitä ei olisi olemassa + hide: Piilota suodatettu sisältö kokonaan, ikään kuin sitä ei olisi olemassa warn: Piilota suodatettu sisältö varoituksen taakse, jossa mainitaan suodattimen nimi form_admin_settings: activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä - app_icon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen mobiililaitteiden sovelluskuvakkeen omalla kuvakkeella. - backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun arvo on positiivinen, nämä arkistot poistuvat automaattisesti, kun määritetty määrä päiviä on kulunut. - bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun. + app_icon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen mobiililaitteiden sovelluskuvakkeen haluamallasi kuvakkeella. + backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun kentän arvo on positiivinen, nämä arkistot poistuvat automaattisesti, kun määritetty määrä päiviä on kulunut. + bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seurantasuositusten alkuun. closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu - content_cache_retention_period: Kaikki muiden palvelinten julkaisut (mukaan lukien tehostukset ja vastaukset) poistuvat, kun määritetty määrä päiviä on kulunut, ottamatta huomioon paikallisen käyttäjän vuorovaikutusta näiden julkaisujen kanssa. Sisältää julkaisut, jotka paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikiksi. Myös yksityiset maininnat eri palvelinten käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämä asetus on tarkoitettu käytettäväksi erityistapauksissa ja rikkoo monia käyttäjien odotuksia, kun sitä käytetään yleistarkoituksiin. - custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa. - favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin sivustokuvakkeen (favicon) haluamallasi kuvakkeella. - mascot: Ohittaa kuvituksen edistyneessä selainkäyttöliittymässä. - media_cache_retention_period: Käyttäjien tekemien julkaisujen mediatiedostot ovat välimuistissa palvelimellasi. Kun arvo on positiivinen, media poistuu, kun määritetty määrä päiviä on kulunut. Jos mediaa pyydetään sen poistamisen jälkeen, se ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien esikatselun kyselyitä kolmansien osapuolien sivustoille on rajoitettu, on suositeltavaa asettaa tämä arvo vähintään 14 päivään, tai linkkien kortteja ei päivitetä pyynnöstä ennen tätä ajankohtaa. - peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, oletko liitossa tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla. - profile_directory: Profiilihakemisto lueteloi kaikki käyttäjät, jotka ovat ilmoittaneet olevansa löydettävissä. + content_cache_retention_period: Kaikki muiden palvelinten julkaisut (mukaan lukien tehostukset ja vastaukset) poistuvat, kun määritetty määrä päiviä on kulunut, lukuun ottamatta paikallisen käyttäjän vuorovaikutusta näiden julkaisujen kanssa. Tämä sisältää julkaisut, jotka paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikiksi. Myös yksityismaininnat eri palvelinten käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämä asetus on tarkoitettu käytettäväksi erityistapauksissa ja rikkoo monia käyttäjien odotuksia, kun sitä sovelletaan yleiskäyttöön. + custom_css: Voit käyttää mukautettuja tyylejä Mastodonin selainversiossa. + favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin sivustokuvakkeen haluamallasi kuvakkeella. + mascot: Korvaa kuvituksen edistyneessä selainkäyttöliittymässä. + media_cache_retention_period: Etäkäyttäjien tekemien julkaisujen mediatiedostot ovat välimuistissa palvelimellasi. Kun kentän arvo on positiivinen, media poistuu, kun määritetty määrä päiviä on kulunut. Jos mediaa pyydetään sen poistamisen jälkeen, se ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien esikatselun kyselyitä kolmansien osapuolien sivustoille on rajoitettu, on suositeltavaa asettaa tämä arvo vähintään 14 päivään, tai linkkien kortteja ei päivitetä pyynnöstä ennen tätä ajankohtaa. + peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, federoitko tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla. + profile_directory: Profiilihakemisto luetteloi kaikki käyttäjät, jotka ovat valinneet olla löydettävissä. require_invite_text: Kun rekisteröityminen vaatii manuaalisen hyväksynnän, tee ”Miksi haluat liittyä?” -tekstikentästä pakollinen vapaaehtoisen sijaan - site_contact_email: Kuinka ihmiset voivat tavoittaa sinut oikeudellisissa tai tukikysymyksissä. + site_contact_email: Miten ihmiset voivat tavoittaa sinut oikeus- tai tukikysymyksissä. site_contact_username: Miten ihmiset voivat tavoittaa sinut Mastodonissa. site_extended_description: Kaikki lisätiedot, jotka voivat olla hyödyllisiä kävijöille ja käyttäjille. Voidaan jäsentää Markdown-syntaksilla. - site_short_description: Lyhyt kuvaus auttaa yksilöimään palvelimesi. Kuka sitä johtaa, kenelle se on tarkoitettu? + site_short_description: Lyhyt kuvaus, joka auttaa yksilöimään palvelimesi. Kuka sitä johtaa, ja keille se on tarkoitettu? site_terms: Käytä omaa tietosuojakäytäntöä tai jätä tyhjäksi, jos haluat käyttää oletusta. Voidaan jäsentää Markdown-syntaksilla. - site_title: Kuinka ihmiset voivat viitata palvelimeen sen verkkotunnuksen lisäksi. - status_page_url: URL-osoite sivulle, jonka kautta tämän palvelimen tila voidaan ongelmatilanteissa tarkastaa + site_title: Miten ihmiset voivat viitata palvelimeesi sen verkkotunnuksen lisäksi. + status_page_url: URL-osoite sivulle, josta tämän palvelimen tilan voi ongelmatilanteissa tarkistaa theme: Teema, jonka uloskirjautuneet vierailijat ja uudet käyttäjät näkevät. - thumbnail: Noin 2:1 kuva näytetään palvelimen tietojen rinnalla. + thumbnail: Noin 2:1 kuva näkyy palvelimen tietojen ohessa. timeline_preview: Uloskirjautuneet vierailijat voivat selata uusimpia julkisia julkaisuja, jotka ovat saatavilla palvelimella. - trendable_by_default: Ohita suositun sisällön manuaalinen tarkistus. Yksittäisiä kohteita voidaan edelleen poistaa jälkikäteen. - trends: Trendit osoittavat, mitkä julkaisut, aihetunnisteet ja uutiset ovat saamassa vetoa palvelimellasi. + trendable_by_default: Ohita suositun sisällön manuaalinen tarkastus. Yksittäisiä kohteita voidaan edelleen poistaa jälkikäteen. + trends: Trendit osoittavat, mitkä julkaisut, aihetunnisteet ja uutiset keräävät huomiota palvelimellasi. trends_as_landing_page: Näytä vierailijoille ja uloskirjautuneille käyttäjille suosittua sisältöä palvelimen kuvauksen sijaan. Edellyttää, että trendit on otettu käyttöön. form_challenge: current_password: Olet menossa suojatulle alueelle @@ -109,14 +109,14 @@ fi: invite_request: text: Tämä auttaa meitä arvioimaan hakemustasi ip_block: - comment: Valinnainen. Muista miksi lisäsit tämän säännön. - expires_in: IP-osoitteet ovat rajallinen resurssi – joskus niitä jaetaan, ja ne vaihtavat usein omistajaa. Niinpä epämääräisiä IP-lohkoja ei suositella. + comment: Valinnainen. Muista, miksi lisäsit tämän säännön. + expires_in: IP-osoitteet ovat rajallinen resurssi – joskus niitä jaetaan eteenpäin, ja ne vaihtavat usein omistajaa. Niinpä epämääräisiä IP-lohkoja ei suositella. ip: Kirjoita IPv4- tai IPv6-osoite. Voit estää kokonaisia IP-osoitealueita CIDR-syntaksin avulla. Varo lukitsemasta itseäsi ulos! severities: no_access: Estä pääsy kaikkiin resursseihin sign_up_block: Uudet rekisteröitymiset eivät ole mahdollisia sign_up_requires_approval: Uudet rekisteröitymiset edellyttävät hyväksyntääsi - severity: Valitse, mitä tapahtuu tämän IP-osoitteen pyynnöille + severity: Valitse, mitä tapahtuu tästä IP-osoitteesta tuleville pyynnöille rule: hint: Vapaaehtoinen. Anna yksityiskohtaisempia tietoja säännöstä text: Kuvaile sääntöä tai edellytystä palvelimesi käyttäjille. Suosi tiivistä, yksinkertaista ilmaisua @@ -129,14 +129,14 @@ fi: tag: name: Voit esimerkiksi vaihtaa suur- ja pienaakkosten kesken helppolukuistaaksesi tekstiäsi user: - chosen_languages: Jos valitset kieliä oheisesta listauksesta, vain niidenkieliset julkaisut näkyvät julkisilla aikajanoilla sinulle + chosen_languages: Jos valitset kieliä oheisesta luettelosta, vain niidenkieliset julkaisut näkyvät sinulle julkisilla aikajanoilla role: Rooli vaikuttaa käyttäjän käyttöoikeuksiin user_role: color: Väri, jota käytetään roolille kaikkialla käyttöliittymässä, RGB-heksadesimaalimuodossa highlighted: Tämä tekee roolista julkisesti näkyvän name: Roolin julkinen nimi, jos rooli on asetettu näytettäväksi merkkinä permissions_as_keys: Käyttäjillä, joilla on tämä rooli, on käyttöoikeus... - position: Korkeampi rooli ratkaisee konfliktit tietyissä tilanteissa. Tiettyjä toimintoja voidaan suorittaa vain rooleille, joiden prioriteetti on pienempi + position: Korkeampi rooli ratkaisee konfliktit tietyissä tilanteissa. Tiettyjä toimia voidaan suorittaa vain rooleilla, joiden prioriteetti on pienempi webhook: events: Valitse lähetettävät tapahtumat template: Luo oma JSON-hyötykuorma käyttäen muuttujien interpolointia. Jätä kenttä tyhjäksi käyttääksesi vakio-JSON-kuormaa. @@ -151,9 +151,9 @@ fi: show_collections: Näytä seuratut ja seuraajat profiilissa unlocked: Hyväksy uudet seuraajat automaattisesti account_alias: - acct: Vanhan tilin käyttäjänimi + acct: Vanhan tilin käyttäjätunnus account_migration: - acct: Uuden tilin käyttäjänimi + acct: Uuden tilin käyttäjätunnus account_warning_preset: text: Esimääritetty teksti title: Nimi @@ -201,7 +201,7 @@ fi: note: Elämäkerta otp_attempt: Kaksivaiheisen todennuksen tunnusluku password: Salasana - phrase: Avainsana tai -fraasi + phrase: Avainsana tai fraasi setting_advanced_layout: Ota edistynyt selainkäyttöliittymä käyttöön setting_aggregate_reblogs: Ryhmitä tehostukset aikajanoilla setting_always_send_emails: Lähetä sähköposti-ilmoitukset aina @@ -234,7 +234,7 @@ fi: username_or_email: Käyttäjänimi tai sähköpostiosoite whole_word: Koko sana email_domain_block: - with_dns_records: Sisällytä toimialueen MX-tietueet ja IP-osoitteet + with_dns_records: Sisällytä verkkotunnuksen MX-tietueet ja IP-osoitteet featured_tag: name: Aihetunniste filters: @@ -249,16 +249,16 @@ fi: closed_registrations_message: Mukautettu viesti, kun rekisteröityminen ei ole saatavilla content_cache_retention_period: Etäsisällön säilytysaika custom_css: Mukautettu CSS - favicon: Suosikkikuvake - mascot: Mukautettu maskotti (vanhentunut ominaisuus) - media_cache_retention_period: Mediasisältövälimuistin säilytysaika + favicon: Sivustokuvake + mascot: Mukautettu maskotti (vanhentunut) + media_cache_retention_period: Mediasisällön välimuistin säilytysaika peers_api_enabled: Julkaise löydettyjen palvelinten luettelo ohjelmointirajapinnassa profile_directory: Ota profiilihakemisto käyttöön registrations_mode: Kuka voi rekisteröityä - require_invite_text: Vaadi syy liittyä + require_invite_text: Vaadi liittymissyy show_domain_blocks: Näytä verkkotunnusten estot show_domain_blocks_rationale: Näytä, miksi verkkotunnukset on estetty - site_contact_email: Ota yhteys sähköpostitse + site_contact_email: Yhteyshenkilön sähköpostiosoite site_contact_username: Yhteyshenkilön käyttäjänimi site_extended_description: Laajennettu kuvaus site_short_description: Palvelimen kuvaus @@ -268,9 +268,9 @@ fi: theme: Oletusteema thumbnail: Palvelimen pienoiskuva timeline_preview: Salli todentamaton pääsy julkisille aikajanoille - trendable_by_default: Salli suositun sisällön koonti ilman ennakkotarkastusta + trendable_by_default: Salli trendit ilman ennakkotarkastusta trends: Ota trendit käyttöön - trends_as_landing_page: Käytä suosittua sisältöä aloitussivuna + trends_as_landing_page: Käytä trendejä aloitussivuna interactions: must_be_follower: Estä ilmoitukset käyttäjiltä, jotka eivät seuraa sinua must_be_following: Estä ilmoitukset käyttäjiltä, joita et seuraa @@ -288,22 +288,22 @@ fi: sign_up_requires_approval: Rajoita rekisteröitymisiä severity: Sääntö notification_emails: - appeal: Joku valittaa valvojan päätöksestä + appeal: Joku valittaa moderaattorin päätöksestä digest: Lähetä koosteviestejä sähköpostitse favourite: Joku lisäsi julkaisusi suosikkeihinsa follow: Joku seurasi sinua - follow_request: Joku pyysi saada seurata sinua + follow_request: Joku pyysi lupaa seurata sinua mention: Joku mainitsi sinut - pending_account: Uusi tili tarvitsee tarkistusta + pending_account: Uusi tili tarvitsee tarkistuksen reblog: Joku tehosti julkaisuasi - report: Uusi raportti on lähetetty + report: Uusi raportti lähetettiin software_updates: all: Ilmoita kaikista päivityksistä critical: Ilmoita vain kriittisistä päivityksistä label: Uusi Mastodon-versio on saatavilla none: Älä koskaan ilmoita päivityksistä (ei suositeltu) patch: Ilmoita virhekorjauspäivityksistä - trending_tag: Uusi trendi vaatii tarkistusta + trending_tag: Uusi trendi vaatii tarkastuksen rule: hint: Lisätietoja text: Sääntö @@ -311,10 +311,10 @@ fi: indexable: Sisällytä profiilisivu hakukoneisiin show_application: Näytä, mistä sovelluksesta lähetit julkaisun tag: - listable: Salli tämän aihetunnisteen näkyä hauissa ja ehdotuksissa + listable: Salli tämän aihetunnisteen näkyä hakutuloksissa ja ehdotuksissa name: Aihetunniste trendable: Salli tämän aihetunnisteen näkyä trendeissä - usable: Salli julkaisujen käyttää tätä aihetunnistetta + usable: Salli julkaisujen käyttää tätä aihetunnistetta paikallisesti user: role: Rooli time_zone: Aikavyöhyke @@ -322,7 +322,7 @@ fi: color: Merkin väri highlighted: Näytä rooli merkkinä käyttäjäprofiileissa name: Nimi - permissions_as_keys: Oikeudet + permissions_as_keys: Käyttöoikeudet position: Prioriteetti webhook: events: Käytössä olevat tapahtumat @@ -331,11 +331,11 @@ fi: 'no': Ei not_recommended: Ei suositella overridden: Ohitettu - recommended: Suositeltu + recommended: Suositellaan required: mark: "*" text: vaadittu tieto title: sessions: - webauthn: Käytä yhtä turva-avaimistasi kirjautuaksesi sisään + webauthn: Käytä yhtä suojausavaimistasi kirjautuaksesi sisään 'yes': Kyllä diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index b334d4f034ac5f..ecd8402680dfa5 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -314,7 +314,7 @@ fo: listable: Loyva hesum tvíkrossið, at verða vístur í leitingum og uppskotum name: Tvíkrossur trendable: Loyv hesum frámerki at síggjast undir rákum - usable: Loyva uppsløgum at brúka hendan tvíkross + usable: Loyv postum at brúka hetta frámerki lokalt user: role: Leiklutur time_zone: Tíðarsona diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index 4b3f53e22233f7..5edffb49d4bf18 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -305,7 +305,6 @@ fr-CA: listable: Autoriser ce hashtag à apparaître dans les recherches et dans l’annuaire des profils name: Mot-clic trendable: Autoriser ce hashtag à apparaitre dans les tendances - usable: Autoriser les messages à utiliser ce hashtag user: role: Rôle time_zone: Fuseau horaire diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 476f197f417b09..9694b00b48cfda 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -305,7 +305,6 @@ fr: listable: Autoriser ce hashtag à apparaître dans les recherches et dans l’annuaire des profils name: Hashtag trendable: Autoriser ce hashtag à apparaitre dans les tendances - usable: Autoriser les messages à utiliser ce hashtag user: role: Rôle time_zone: Fuseau horaire diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index 9e0f67b70725ac..bde97237f6f393 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -211,6 +211,7 @@ fy: setting_default_privacy: Sichtberheid fan nije berjochten setting_default_sensitive: Media altyd as gefoelich markearje setting_delete_modal: Freegje foar it fuortsmiten fan in berjocht in befêstiging + setting_disable_hover_cards: Profylfoarbylden troch der oerhinne te sweven útskeakelje setting_disable_swiping: Feibewegingen útskeakelje setting_display_media: Mediawerjefte setting_display_media_default: Standert @@ -242,11 +243,13 @@ fy: warn: Mei in warskôging ferstopje form_admin_settings: activity_api_enabled: Publyklik meitsjen fan sammele statistiken oer brûkersaktiviteiten yn de API + app_icon: App-piktogram backups_retention_period: Bewartermyn brûkersargyf bootstrap_timeline_accounts: Accounts dy’t altyd oan nije brûkers oanrekommandearre wurde closed_registrations_message: Oanpast berjocht wannear registraasje útskeakele is content_cache_retention_period: Bewartermyn foar eksterne ynhâld custom_css: Oanpaste CSS + favicon: Favicon mascot: Oanpaste maskotte (legacy) media_cache_retention_period: Bewartermyn mediabuffer peers_api_enabled: Publyklik meitsjen fan ûntdekte servers yn de API @@ -311,7 +314,6 @@ fy: listable: Tastean dat dizze hashtag yn sykopdrachten en oanrekommandaasjes te sjen is name: Hashtag trendable: Goedkarre dat dizze hashtag ûnder trends te sjen is - usable: Tastean dat dizze hashtag yn berjochten brûkt wurde mei user: role: Rol time_zone: Tiidsône diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index 2effe1a10cc7a0..15ea3094b2ff7a 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -314,7 +314,7 @@ ga: listable: Lig don hashchlib seo a bheith le feiceáil i gcuardach agus i moltaí name: Haischlib trendable: Lig don haischlib seo a bheith le feiceáil faoi threochtaí - usable: Lig do phostálacha an hashchlib seo a úsáid + usable: Lig do phostálacha an hashchlib seo a úsáid go háitiúil user: role: Ról time_zone: Crios ama diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 8a36f73dc1de35..4375feb492b696 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -77,10 +77,15 @@ gd: warn: Falaich an t-susbaint chriathraichte air cùlaibh rabhaidh a dh’innseas tiotal na criathraige form_admin_settings: activity_api_enabled: Cunntasan nam postaichean a chaidh fhoillseachadh gu h-ionadail, nan cleachdaichean gnìomhach ’s nan clàraidhean ùra an am bucaidean seachdaineil + app_icon: WEBP, PNG, GIF no JPG. Tar-àithnidh seo ìomhaigheag bhunaiteach na h-aplacaid air uidheaman mobile le ìomhaigheag ghnàthaichte. + backups_retention_period: "’S urrainn do chleachdaichean tasg-lannan dhe na postaichean aca a gintinn airson an luchdadh a-nuas an uairsin. Nuair a bhios luach dearbh air, thèid na tasg-lannan a sguabadh às on stòras agad gu fèin-obrachail às dèidh an àireamh de làithean a shònraich thu." bootstrap_timeline_accounts: Thèid na cunntasan seo a phrìneachadh air bàrr nam molaidhean leantainn dhan luchd-cleachdaidh ùr. closed_registrations_message: Thèid seo a shealltainn nuair a bhios an clàradh dùinte + content_cache_retention_period: Thèid a h-uile post o fhrithealaiche sam bith eile (a’ gabhail a-staigh brosnachaidhean is freagairtean) a sguabadh às às dèidh na h-àireimh de làithean a shònraich thu ’s gun diù a chon air eadar-ghabhail ionadail air na postaichean ud. Gabhaidh seo a-steach na postaichean a chuir cleachdaiche ionadail ris na h-annsachdan aca no comharran-lìn riutha. Thèid iomraidhean prìobhaideach eadar cleachdaichean o ionstansan diofraichte air chall cuideachd agus cha ghabh an aiseag idir. Tha an roghainn seo do dh’ionstansan sònraichte a-mhàin agus briseadh e dùilean an luchd-cleachdaidh nuair a rachadh a chleachdadh gu coitcheann. custom_css: "’S urrainn dhut stoidhlean gnàthaichte a chur an sàs air an tionndadh-lìn de Mhastodon." + favicon: WEBP, PNG, GIF no JPG. Tar-àithnidh seo favicon bunaiteach Mhastodon le ìomhaigheag ghnàthaichte. mascot: Tar-àithnidh seo an sgead-dhealbh san eadar-aghaidh-lìn adhartach. + media_cache_retention_period: Thèid faidhlichean meadhain o phostaichean a chruthaich cleachdaichean cèine a chur ri tasgadan an fhrithealaiche agad. Nuair a shuidhicheas tu seo air luach dearbh, thèid na meadhanan a sguabadh às às dèidh na h-àireimh de làithean a shònraich thu. Ma tha dàta meadhain ga iarraidh às dèidh a sguabaidh às, thèid a luchdadh a-nuas a-rithist ma tha susbaint an tùis ri fhaighinn fhathast. Ri linn cuingeachaidhean air mar a cheasnaicheas cairtean ro-sheallaidh làraichean threas-phàrtaidhean, mholamaid gun suidhich thu an luach seo air 14 làithean ar a char as giorra no cha dèid an ùrachadh nuair a thèid an iarraidh ron àm sin. peers_api_enabled: Seo liosta de dh’ainmean àrainne ris an do thachair am frithealaiche seo sa cho-shaoghal. Chan eil dàta sam bith ’ga ghabhail a-staigh an-seo mu a bheil thu co-naisgte ri frithealaiche sònraichte gus nach eil ach dìreach gu bheil am frithealaiche agad eòlach air. Thèid seo a chleachdadh le seirbheisean a chruinnicheas stadastaireachd air a’ cho-nasgadh san fharsaingeachd. profile_directory: Seallaidh eòlaire nam pròifil liosta dhen luchd-cleachdaidh a dh’aontaich gun gabh an rùrachadh. require_invite_text: 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 @@ -206,6 +211,7 @@ gd: setting_default_privacy: Prìobhaideachd postaidh setting_default_sensitive: Cuir comharra ri meadhanan an-còmhnaidh gu bheil iad frionasach setting_delete_modal: Seall còmhradh dearbhaidh mus sguab thu às post + setting_disable_hover_cards: Na ro-sheall pròifil nuair a dh’fhanas mi os a cionn setting_disable_swiping: Cuir gluasadan grad-shlaighdidh à comas setting_display_media: Sealltainn nam meadhanan setting_display_media_default: Bun-roghainn @@ -237,10 +243,13 @@ gd: warn: Falaich le rabhadh form_admin_settings: activity_api_enabled: Foillsich agragaid dhen stadastaireachd mu ghnìomhachd nan cleachdaichean san API + app_icon: Ìomhaigheag na h-aplacaid backups_retention_period: Ùine glèidhidh aig tasg-lannan an luchd-cleachdaidh bootstrap_timeline_accounts: Mol na cunntasan seo do chleachdaichean ùra an-còmhnaidh closed_registrations_message: Teachdaireachd ghnàthaichte nuair nach eil clàradh ri fhaighinn + content_cache_retention_period: Ùine glèidhidh aig susbaint chèin custom_css: CSS gnàthaichte + favicon: Favicon mascot: Suaichnean gnàthaichte (dìleabach) media_cache_retention_period: Ùine glèidhidh aig tasgadan nam meadhanan peers_api_enabled: Foillsich liosta nam frithealaichean a chaidh a rùrachadh san API @@ -305,7 +314,7 @@ gd: listable: Faodaidh an taga hais seo nochdadh ann an toraidhean luirg ’s am measg nam molaidhean name: Taga hais trendable: Faodaidh an taga hais seo nochdadh am measg nan treandaichean - usable: Faodaidh postaichean an taga hais seo a chleachdadh + usable: Faodaidh postaichean an taga hais seo a chleachdadh gu h-ionadail user: role: Dreuchd time_zone: Roinn-tìde diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 57bf31b42d2851..a7074af0f9bb69 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -314,7 +314,7 @@ gl: listable: Permitir que este cancelo apareza en buscas e no directorio de perfil name: Cancelo trendable: Permitir que este cancelo apareza en tendencias - usable: Permitir que as publicacións utilicen este cancelo + usable: Permitir que as publicacións usen este cancelo localmente user: role: Rol time_zone: Fuso horario diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index f79ddb9b34e832..95a334bb3a538f 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -314,7 +314,7 @@ he: listable: הרשה/י לתגית זו להופיע בחיפושים והצעות name: תגית trendable: הרשה/י לתגית זו להופיע תחת נושאים חמים - usable: הרשה/י להודעות להכיל תגית זו + usable: הרשה/י להודעות להכיל תגית זו באופן מקומי user: role: תפקיד time_zone: אזור זמן diff --git a/config/locales/simple_form.hi.yml b/config/locales/simple_form.hi.yml index d758a5b5357d76..51c0868cdbb616 100644 --- a/config/locales/simple_form.hi.yml +++ b/config/locales/simple_form.hi.yml @@ -1 +1,6 @@ +--- hi: + simple_form: + labels: + tag: + usable: पोस्ट को ये हैशटैग स्थानीय उपयोग करने दें diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 518a82ec163a99..512e13d3af8c13 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -314,7 +314,7 @@ hu: listable: A hashtag megjelenhet a profiladatbázisban name: Hashtag trendable: A hashtag megjelenhet a felkapottak között - usable: Bejegyzések használhatják ezt a hashtaget + usable: A helyi bejegyzések használhatják ezt a hashtaget user: role: Szerep time_zone: Időzóna diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index 0525f2d6fc47c6..36185f73e428c5 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -187,7 +187,6 @@ hy: listable: Թոյլատրել, որ այս պիտակը յայտնուի որոնումների եւ հաշուի մատեանում name: Պիտակ trendable: Թոյլատրել, որ այս պիտակը յայտնուի թրենդներում - usable: Թոյլատրել գրառումներին օգտագործել այս պիտակը 'no': Ոչ recommended: Խորհուրդ է տրվում required: diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 2d0af3001ef69f..00226aee90b4b9 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -242,11 +242,13 @@ ia: warn: Celar con un advertimento form_admin_settings: activity_api_enabled: Publicar statisticas aggregate re le activitate de usator in le API + app_icon: Icone de app backups_retention_period: Periodo de retention del archivo de usator bootstrap_timeline_accounts: Recommenda sempre iste contos a nove usatores closed_registrations_message: Message personalisate quando le inscriptiones non es disponibile content_cache_retention_period: Periodo de retention del contento remote custom_css: CSS personalisate + favicon: Favicon mascot: Personalisar le mascotte (hereditage) media_cache_retention_period: Periodo de retention del cache multimedial peers_api_enabled: Publicar le lista de servitores discoperite in le API @@ -311,7 +313,6 @@ ia: listable: Permitter a iste hashtag apparer in le recercas e suggestiones name: Hashtag trendable: Permitter a iste hashtag de sub tendentias - usable: Permitter al messages usar iste hashtag user: role: Rolo time_zone: Fuso horari diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 1f493435e873c4..99f4372cc15e20 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -268,7 +268,6 @@ id: listable: Izinkan tagar ini muncul di penelusuran dan di direktori profil name: Tagar trendable: Izinkan tagar ini muncul di bawah tren - usable: Izinkan toot memakai tagar ini user: role: Peran user_role: diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index 2b995e7efa5e8a..0828139a4304ba 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -311,7 +311,6 @@ ie: listable: Permisser que ti hashtag apari in serchas e suggestiones name: Hashtag trendable: Permisse que ti-ci hashtag apari sub tendenties - usable: Permisser que postas usa ti hashtag user: role: Rol time_zone: Zone temporal diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 81f298249ee2a2..4de7475b2e8958 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -300,7 +300,6 @@ io: listable: Permisez ca hashtago aparar en trovaji e sugestaji name: Hashtago trendable: Permisez ca hashtago aparar che tendenci - usable: Permisez posti uzar ca hashtago user: role: Rolo time_zone: Klokozono diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 9e28ef9be695b9..a7e2083f4d83a4 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -314,7 +314,7 @@ is: listable: Leyfa þessu myllumerki að birtast í leitum og í persónusniðamöppunni name: Myllumerki trendable: Leyfa þessu myllumerki að birtast undir vinsælu efni - usable: Leyfa færslum að nota þetta myllumerki + usable: Leyfa færslum að nota þetta myllumerki staðvært user: role: Hlutverk time_zone: Tímabelti diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index eddc86b4e11ad8..ea175e2bf567b7 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -314,7 +314,7 @@ it: listable: Permetti a questo hashtag di apparire nella directory dei profili name: Hashtag trendable: Permetti a questo hashtag di apparire nelle tendenze - usable: Permetti ai post di usare questo hashtag + usable: Permetti ai post di utilizzare questo hashtag localmente user: role: Ruolo time_zone: Fuso orario diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index a4bd9565081272..7f4a9daeff85a2 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -314,7 +314,6 @@ ja: listable: 検索とディレクトリへの使用を許可する name: ハッシュタグ trendable: トレンドへの表示を許可する - usable: 投稿への使用を許可する user: role: ロール time_zone: タイムゾーン diff --git a/config/locales/simple_form.kk.yml b/config/locales/simple_form.kk.yml index 5c1854d1886d38..e6ba46fdf87874 100644 --- a/config/locales/simple_form.kk.yml +++ b/config/locales/simple_form.kk.yml @@ -86,7 +86,6 @@ kk: listable: Бұл хештегті барлық жерде көрсетуге рұқсат бер name: Хэштег trendable: Хештегті трендтерде көрсетуге рұқсат бер - usable: Бұл хештегті қолдануға рұқсат бер 'no': Жоқ recommended: Рекоменделген required: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index b94b4b3d40425b..5fa3aee6c4c010 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -314,7 +314,7 @@ ko: listable: 이 해시태그가 검색과 추천에 보여지도록 허용 name: 해시태그 trendable: 이 해시태그가 유행에 나타날 수 있도록 허용 - usable: 이 해시태그를 게시물에 사용 가능하도록 허용 + usable: 이 해시태그를 로컬 게시물에서 사용 가능하도록 허용 user: role: 역할 time_zone: 시간대 diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index 0c4f8721313213..96e047d9371229 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -267,7 +267,6 @@ ku: listable: Bihêle ku ev hashtag werê xuyakirin di lêgerîn û pêşniyaran de name: Hashtag trendable: Bihêle ku ev hashtag werê xuyakirin di bin rojevê de - usable: Bihêle ku şandî ev hashtag bi kar bînin user: role: Rol user_role: diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index 65647a77dbb47e..f7093ff73beb46 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -306,7 +306,6 @@ lad: listable: Permite ke esta etiketa apareska en bushkedas i sujestyones name: Etiketa trendable: Permite ke esta etiketa apareska en trendes - usable: Permite ke publikasyones uzen esta etiketa user: role: Rolo time_zone: Zona de tiempo diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index b31803409b3976..02f0360938107e 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -208,7 +208,7 @@ lt: listable: Leisti šį saitažodį rodyti paieškose ir pasiūlymuose name: Saitažodis trendable: Leisti šį saitažodį rodyti pagal trendus - usable: Leisti įrašams naudoti šį saitažodį + usable: Leisti įrašams naudoti šį saitažodį vietoje user: role: Vaidmuo time_zone: Laiko juosta diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 017acd0a53ccb0..eedae998e40479 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -309,7 +309,6 @@ lv: listable: Atļaut šim tēmturim parādīties meklējumos un ieteikumos name: Tēmturis trendable: Atļaut šim tēmturim parādīties zem tendencēm - usable: Atļaut lietot ziņās šo tēmturi user: role: Loma time_zone: Laika josla diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml index ae375149eb582f..da00e2dc2b05d2 100644 --- a/config/locales/simple_form.ms.yml +++ b/config/locales/simple_form.ms.yml @@ -301,7 +301,6 @@ ms: listable: Benarkan hashtag ini muncul dalam carian dan cadangan name: Tanda pagar trendable: Benarkan hashtag ini muncul di bawah aliran - usable: Benarkan siaran untuk menggunakan tanda pagar ini user: role: Peranan time_zone: Zon masa diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index 20c862ab27a0cd..a44635edd4b4f9 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -301,7 +301,6 @@ my: listable: ရှာဖွေမှုများနှင့် အကြံပြုချက်များတွင် ဤ hashtag ပေါ်လာစေရန် ခွင့်ပြုပါ name: Hashtag trendable: ခေတ်စားနေသောအကြောင်းအရာများအောက်တွင် ဤ hashtag ပေါ်လာစေရန် ခွင့်ပြုပါ - usable: ပို့စ်များကို ဤ hashtag သုံးခွင့်ပြုပါ user: role: အခန်းကဏ္ဍ time_zone: အချိန်ဇုန် diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 56331934064401..91ee9bc3e3b7b9 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -314,7 +314,7 @@ nl: listable: Toestaan dat deze hashtag in zoekopdrachten en aanbevelingen te zien valt name: Hashtag trendable: Goedkeuren dat deze hashtag onder trends te zien valt - usable: Toestaan dat deze hashtag in berichten gebruikt mag worden + usable: Berichten toestaan deze hashtag lokaal te gebruiken user: role: Rol time_zone: Tijdzone diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index c9075a89c210e3..f7551cc313e5bf 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -314,7 +314,6 @@ nn: listable: Tillat denne emneknaggen å synast i søk og i profilmappa name: Emneknagg trendable: Tillat denne emneknaggen til å synast under trendar - usable: Gje tut lov til å nytta denne emneknaggen user: role: Rolle time_zone: Tidssone diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index de3788aa42d256..82de0adb7b5e29 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -303,7 +303,6 @@ listable: Tillat denne emneknaggen å vises i søk og på profilmappen name: Emneknagg trendable: Tillat denne emneknaggen til å vises under trender - usable: Tillat innlegg å bruke denne emneknaggen user: role: Rolle time_zone: Tidssone diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index ba9c260e472e01..05b0508a5151f2 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -217,7 +217,6 @@ oc: listable: Permetre a aquesta etiqueta d’aparéisser a las recèrcas e a l’annuari de perfils name: Etiqueta trendable: Permetre a aquesta etiqueta d’aparéisser a las tendéncias - usable: Permetre als tuts d’utilizar aquesta etiqueta user: role: Ròtle user_role: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 39e1814195f877..1a9051b9510b28 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -314,7 +314,7 @@ pl: listable: Pozwól, aby ten hashtag pojawiał się w wynikach wyszukiwania i katalogu profilów name: Hasztag trendable: Pozwól na wyświetlanie tego hashtagu w „Na czasie” - usable: Pozwól na umieszczanie tego hashtagu we wpisach + usable: Pozwól na umieszczanie tego hashtagu w lokalnych wpisach user: role: Rola time_zone: Strefa czasowa diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 77a0d8cd6f576b..fc3c09cf1d09d0 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -311,7 +311,6 @@ pt-BR: listable: Permitir que esta hashtag apareça em pesquisas e sugestões name: Hashtag trendable: Permitir que esta hashtag fique em alta - usable: Permitir que toots usem esta hashtag user: role: Cargo time_zone: Fuso horário diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index ef7dfd00a80fa2..a76076a5cbc6ee 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -314,7 +314,7 @@ pt-PT: listable: Permitir que esta etiqueta apareça em pesquisas e no diretório de perfis name: Etiqueta trendable: Permitir que esta etiqueta apareça em alta - usable: Permitir que as publicações usem esta etiqueta + usable: Permitir que as publicações usem esta hashtag localmente user: role: Cargo time_zone: Fuso horário diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index 5df411b9512d3e..458638ddec1acb 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -177,7 +177,6 @@ ro: tag: listable: Permite acestui hashtag să apară în căutări și în directorul de profil trendable: Permite acestui hashtag să apară sub tendințe - usable: Permite postărilor să folosească acest hashtag 'no': Nu recommended: Recomandat required: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index a050b5a529fce1..c2effdcb883fd6 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -203,6 +203,7 @@ ru: setting_default_privacy: Видимость постов setting_default_sensitive: Всегда отмечать медиафайлы как «деликатного характера» setting_delete_modal: Всегда спрашивать перед удалении поста + setting_disable_hover_cards: Отключить предпросмотр профиля при наведении setting_disable_swiping: Отключить анимацию смахивания setting_display_media: Отображение медиафайлов setting_display_media_default: По умолчанию @@ -301,7 +302,6 @@ ru: listable: Разрешить показ хэштега в поиске или в каталоге профилей name: Хэштег trendable: Разрешить показ хэштега в трендах - usable: Разрешить использовать этот хэштег в постах user: role: Роль time_zone: Часовой пояс diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml index 792619e6c7b1a1..fc5310395070e3 100644 --- a/config/locales/simple_form.sc.yml +++ b/config/locales/simple_form.sc.yml @@ -52,7 +52,7 @@ sc: email_domain_block: with_dns_records: S'at a fàghere unu tentativu de risòlvere is registros DNS de su domìniu e fintzas is risultados ant a èssere blocados form_admin_settings: - activity_api_enabled: Nùmeru de tuts publicados in locale, utentes ativos e registros noos in perìodos chidajolos + activity_api_enabled: Nùmeru de publicatziones in locale, utentes ativos e registros noos in perìodos chidajolos form_challenge: current_password: Ses intrende in un'àrea segura imports: @@ -191,12 +191,12 @@ sc: severity: Règula notification_emails: digest: Imbia lìteras eletrònicas de resumu - favourite: Una persone at postu s'istadu tuo in is preferidos suos + favourite: Una persone at postu sa publicatzione tua in is preferidos follow: Una persone t'at incumentzadu a sighire follow_request: Una persone at pedidu de ti sighire mention: Una persone t'at mentovadu pending_account: Unu contu nou tenet bisòngiu de una revisione - reblog: Una persone at cumpartzidu s'istadu tuo + reblog: Una persone at potentziadu sa publicatzione tua report: Imbiu de un'informe nou rule: text: Règula @@ -204,7 +204,6 @@ sc: listable: Permite a custa eticheta de apàrrere in is chircas e in sa cartella de is profilos name: Eticheta trendable: Permite a custa eticheta de apàrrere in is tendèntzias - usable: Permite a is tuts de impreare custa eticheta user_role: name: Nòmine permissions_as_keys: Permissos diff --git a/config/locales/simple_form.sco.yml b/config/locales/simple_form.sco.yml index f9dc4ba29118a4..9fc6fd57dbb363 100644 --- a/config/locales/simple_form.sco.yml +++ b/config/locales/simple_form.sco.yml @@ -265,7 +265,6 @@ sco: listable: Alloo this hashtag tae appear in seirches an suggestions name: Hashtag trendable: Alloo this hashtag fir tae appear unner trends - usable: Alloo posts fir tae uise this hashtag user: role: Role user_role: diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index a81ba27bb913f2..41658c76ac29ff 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -207,7 +207,6 @@ si: listable: මෙම හැෂ් ටැගය සෙවීම් සහ යෝජනා වල දිස් වීමට ඉඩ දෙන්න name: හෑෂ් ටැගය trendable: මෙම හැෂ් ටැගය ප්‍රවණතා යටතේ දිස් වීමට ඉඩ දෙන්න - usable: ලිපි සඳහා මෙම පූරක අනන්‍යනය භාවිතයට ඉඩදෙන්න user: role: භූමිකාව time_zone: වේලා කලාපය diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 71bd25d6dfe0c4..fa15a6e3f7f10c 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -165,7 +165,6 @@ sk: listable: Povoľ zobrazovanie tohto haštagu v návrhoch vyhľadávaní name: Haštag trendable: Povoľ zobrazovanie tohto haštagu medzi trendujúcimi - usable: Povoľ používanie tohto haštagu v príspevkoch 'no': Nie recommended: Odporúčané required: diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index a937f17206e465..b558a62fc8367d 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -314,7 +314,6 @@ sl: listable: Dovoli, da se ta ključnik pojavi v iskanjih in predlogih name: Ključnik trendable: Dovoli, da se ta ključnik pojavi med trendi - usable: Dovoli, da objave uporabljajo ta ključnik user: role: Vloga time_zone: Časovni pas diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 4236d7dce2673b..8b00751d98251a 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -314,7 +314,7 @@ sq: listable: Lejoje këtë hashtag të shfaqet në kërkime dhe në drejtori profilesh name: Hashtag trendable: Lejoje këtë hashtag të shfaqet në prirje - usable: Lejoji mesazhet të përdorin këtë hashtag + usable: Lejoji postimet të përdorin lokalisht këtë hashtag user: role: Rol time_zone: Zonë kohore diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 40b710b078e690..e163de2f80a764 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -314,7 +314,6 @@ sr-Latn: listable: Dozvoli da se ova heš oznaka pojavljuje u pretragama i predlozima name: Heš oznaka trendable: Dozvoli da se ova heš oznaka pojavi u okviru trendova - usable: Dozvoli objavama da koriste ovu heš oznaku user: role: Uloga time_zone: Vremenska zona diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index c0a9ac2d8963c6..d7142390c91db0 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -314,7 +314,6 @@ sr: listable: Дозволи да се ова хеш ознака појављује у претрагама и предлозима name: Хеш ознака trendable: Дозволи да се ова хеш ознака појави у оквиру трендова - usable: Дозволи објавама да користе ову хеш ознаку user: role: Улога time_zone: Временска зона diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 2281e4b4abe109..b0b974d7421c49 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -211,6 +211,7 @@ sv: setting_default_privacy: Inläggsintegritet setting_default_sensitive: Markera alltid media som känsligt setting_delete_modal: Visa bekräftelsedialog innan radering av inlägg + setting_disable_hover_cards: Inaktivera profilförhandsgranskning vid hovring setting_disable_swiping: Inaktivera svepande rörelser setting_display_media: Mediavisning setting_display_media_default: Standard @@ -313,7 +314,6 @@ sv: listable: Tillåt denna hashtagg att visas i sökningar och förslag name: Hashtagg trendable: Tillåt denna hashtagg att visas under trender - usable: Tillåt inlägg att använda denna hashtagg user: role: Roll time_zone: Tidszon diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index cdc82367f9346c..387f74e74202ae 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -83,7 +83,7 @@ th: closed_registrations_message: แสดงเมื่อมีการปิดการลงทะเบียน content_cache_retention_period: จะลบโพสต์ทั้งหมดจากเซิร์ฟเวอร์อื่น ๆ (รวมถึงการดันและการตอบกลับ) หลังจากจำนวนวันที่ระบุ โดยไม่คำนึงถึงการโต้ตอบใด ๆ ของผู้ใช้ในเซิร์ฟเวอร์กับโพสต์เหล่านั้น สิ่งนี้รวมถึงโพสต์ที่ผู้ใช้ในเซิร์ฟเวอร์ได้ทำเครื่องหมายโพสต์ว่าเป็นที่คั่นหน้าหรือรายการโปรด การกล่าวถึงแบบส่วนตัวระหว่างผู้ใช้จากอินสแตนซ์ที่แตกต่างกันจะหายไปและไม่สามารถคืนค่าได้เช่นกัน การใช้การตั้งค่านี้มีไว้สำหรับอินสแตนซ์ที่มีวัตถุประสงค์พิเศษและทำลายความคาดหวังของผู้ใช้จำนวนมากเมื่อนำไปใช้สำหรับการใช้งานที่มีวัตถุประสงค์ทั่วไป custom_css: คุณสามารถนำไปใช้ลักษณะที่กำหนดเองใน Mastodon รุ่นเว็บ - favicon: WEBP, PNG, GIF หรือ JPG เขียนทับ Favicon ของ Mastodon เริ่มต้นด้วยไอคอนที่กำหนดเอง + favicon: WEBP, PNG, GIF หรือ JPG เขียนทับไอคอนเว็บของ Mastodon เริ่มต้นด้วยไอคอนที่กำหนดเอง mascot: เขียนทับภาพประกอบในส่วนติดต่อเว็บขั้นสูง media_cache_retention_period: จะแคชไฟล์สื่อจากโพสต์ที่สร้างโดยผู้ใช้ระยะไกลในเซิร์ฟเวอร์ของคุณ เมื่อตั้งเป็นค่าบวก จะลบสื่อหลังจากจำนวนวันที่ระบุ หากมีการขอข้อมูลสื่อหลังจากมีการลบสื่อ จะดาวน์โหลดสื่อใหม่ หากเนื้อหาต้นฉบับยังคงใช้งานได้ เนื่องจากข้อจำกัดเกี่ยวกับความถี่ที่บัตรตัวอย่างลิงก์สำรวจไซต์จากบุคคลที่สาม ขอแนะนำให้ตั้งค่านี้เป็นอย่างน้อย 14 วัน มิฉะนั้นจะไม่อัปเดตบัตรตัวอย่างลิงก์ตามความต้องการก่อนเวลานั้น peers_api_enabled: รายการชื่อโดเมนที่เซิร์ฟเวอร์นี้พบในจักรวาลสหพันธ์ ไม่มีข้อมูลรวมอยู่ที่นี่เกี่ยวกับว่าคุณติดต่อกับเซิร์ฟเวอร์ที่กำหนดหรือไม่ เพียงแค่ว่าเซิร์ฟเวอร์ของคุณทราบเกี่ยวกับเซิร์ฟเวอร์ที่กำหนด มีการใช้สิ่งนี้โดยบริการที่เก็บรวบรวมสถิติในการติดต่อกับภายนอกในความหมายทั่วไป @@ -243,11 +243,13 @@ th: warn: ซ่อนด้วยคำเตือน form_admin_settings: activity_api_enabled: เผยแพร่สถิติรวมเกี่ยวกับกิจกรรมผู้ใช้ใน API + app_icon: ไอคอนแอป backups_retention_period: ระยะเวลาการเก็บรักษาการเก็บถาวรผู้ใช้ bootstrap_timeline_accounts: แนะนำบัญชีเหล่านี้ให้กับผู้ใช้ใหม่เสมอ closed_registrations_message: ข้อความที่กำหนดเองเมื่อการลงทะเบียนไม่พร้อมใช้งาน content_cache_retention_period: ระยะเวลาการเก็บรักษาเนื้อหาระยะไกล custom_css: CSS ที่กำหนดเอง + favicon: ไอคอนเว็บ mascot: มาสคอตที่กำหนดเอง (ดั้งเดิม) media_cache_retention_period: ระยะเวลาการเก็บรักษาแคชสื่อ peers_api_enabled: เผยแพร่รายการเซิร์ฟเวอร์ที่ค้นพบใน API @@ -312,7 +314,6 @@ th: listable: อนุญาตให้แฮชแท็กนี้ปรากฏในการค้นหาและข้อเสนอแนะ name: แฮชแท็ก trendable: อนุญาตให้แฮชแท็กนี้ปรากฏภายใต้แนวโน้ม - usable: อนุญาตให้โพสต์ใช้แฮชแท็กนี้ user: role: บทบาท time_zone: โซนเวลา diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index f098bfd3ca6d32..2cc2c1788e2e3b 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -314,7 +314,6 @@ tr: listable: Bu etiketin aramalarda ve profil dizininde görünmesine izin ver name: Etiket trendable: Bu etiketin gündem altında görünmesine izin ver - usable: Gönderilerin bu etiketi kullanmasına izin ver user: role: Rol time_zone: Zaman dilimi diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 2f494534ea63b9..45478849b28ece 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -314,7 +314,6 @@ uk: listable: Дозволити появу цього хештеґа у каталозі пошуку і пропозицій name: Хештеґ trendable: Дозволити появу цього хештеґа у списку популярних хештеґів - usable: Дозволити дописам використовувати цей хештег user: role: Роль time_zone: Часовий пояс diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index c45da4713718ca..7954bb1e6ff54f 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -314,7 +314,7 @@ vi: listable: Cho phép xuất hiện trong tìm kiếm và đề xuất name: Hashtag trendable: Cho phép hashtag này lên xu hướng - usable: Cho phép dùng trong tút + usable: Cho phép dùng hashtag này khi soạn tút user: role: Vai trò time_zone: Múi giờ diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index ab440e04f43c7f..d059adf0e6bcf1 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -314,7 +314,7 @@ zh-CN: listable: 允许这个话题标签在用户目录中显示 name: 话题标签 trendable: 允许在热门下显示此话题 - usable: 允许嘟文使用此话题标签 + usable: 允许本站嘟文使用此话题标签 user: role: 角色 time_zone: 时区 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 0e2ee81db7f2c8..6a7cd5a2471553 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -309,7 +309,6 @@ zh-HK: listable: 允許此主題標籤在搜尋及個人檔案目錄中顯示 name: 主題標籤 trendable: 允許此主題標籤在趨勢下顯示 - usable: 允許文章使用此主題標籤 user: role: 角色 time_zone: 時區 diff --git a/config/locales/sq.yml b/config/locales/sq.yml index c4bed80cc7cf47..92e182cfda31af 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -470,6 +470,9 @@ sq: title: Rekomandime ndjekjeje unsuppress: Rikthe rekomandime ndjekjeje instances: + audit_log: + title: Regjistra Auditimesh Së Fundi + view_all: Shihni regjistra të plotë auditimesh availability: description_html: one: Nëse dhënia e mesazheve te përkatësia dështon për %{count} ditë pa sukses, s’do të bëhen përpjekje të tjera për dhënie, veç në u marrtë një dërgim prej përkatësisë. @@ -877,7 +880,21 @@ sq: action: Për më tepër hollësi, shihni këtu message_html: "Depozita juaj e objekteve është e formësuar keq. Privatësia e përdoruesve tuaj është në rrezik." tags: + moderation: + not_usable: Të papërdorshme + pending_review: Në pritje të shqyrtimit + review_requested: U kërkua shqyrtim + reviewed: Shqyrtuar + title: Gjendje + unreviewed: Të pashqyrtuar + usable: Të përdorshëm + name: Emër + newest: Më të rejat + oldest: Më të vjetrat + reset: Riktheje te parazgjedhjet review: Gjendje rishikimi + search: Kërkim + title: Hashtag-ë updated_msg: Rregullimet për hashtag-ët u përditësuan me sukses title: Administrim trends: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index de2664f8b5f109..8054c113558a05 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -471,6 +471,9 @@ sv: title: Följ rekommendationer unsuppress: Återställ följrekommendation instances: + audit_log: + title: Senaste revisionsloggar + view_all: Visa fullständiga revisionssloggar availability: description_html: one: Om leveranser till domänen misslyckas i %{count} dag kommer inga ytterligare leveransförsök att göras förrän en leverans från domänen tas emot. @@ -639,6 +642,7 @@ sv: report: 'Rapport #%{id}' reported_account: Anmält konto reported_by: Anmäld av + reported_with_application: Rapporterat med applikation resolved: Löst resolved_msg: Anmälan har lösts framgångsrikt! skip_to_actions: Hoppa till åtgärder @@ -881,7 +885,12 @@ sv: action: Kolla här för mer information message_html: "Din objektlagring är felkonfigurerad. Sekretessen för dina användare är i riskzonen." tags: + moderation: + title: Status + name: Namn + reset: Återställ review: Granskningsstatus + search: Sök updated_msg: Hashtagg-inställningarna har uppdaterats title: Administration trends: diff --git a/config/locales/th.yml b/config/locales/th.yml index df76d97c00a644..678b5ab638fd2d 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -223,6 +223,7 @@ th: update_custom_emoji: อัปเดตอีโมจิที่กำหนดเอง update_domain_block: อัปเดตการปิดกั้นโดเมน update_ip_block: อัปเดตกฎ IP + update_report: อัปเดตรายงาน update_status: อัปเดตโพสต์ update_user_role: อัปเดตบทบาท actions: @@ -462,6 +463,9 @@ th: title: คำแนะนำการติดตาม unsuppress: คืนค่าคำแนะนำการติดตาม instances: + audit_log: + title: รายการบันทึกการตรวจสอบล่าสุด + view_all: ดูรายการบันทึกการตรวจสอบแบบเต็ม availability: description_html: other: หากการจัดส่งไปยังโดเมนล้มเหลวเป็นเวลา %{count} วันที่แตกต่างกัน โดยไม่สำเร็จ จะไม่ทำการพยายามจัดส่งเพิ่มเติมเว้นแต่จะได้รับการจัดส่ง จาก โดเมน @@ -626,6 +630,7 @@ th: report: 'รายงาน #%{id}' reported_account: บัญชีที่ได้รับการรายงาน reported_by: รายงานโดย + reported_with_application: รายงานด้วยแอปพลิเคชัน resolved: แก้ปัญหาแล้ว resolved_msg: แก้ปัญหารายงานสำเร็จ! skip_to_actions: ข้ามไปยังการกระทำ diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 9855b569241153..f561781e59ead9 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -471,6 +471,9 @@ tr: title: Takip önerileri unsuppress: Takip önerisini geri getir instances: + audit_log: + title: En Son Denetim Günlükleri + view_all: Tüm denetim günlüklerini görüntüle availability: description_html: one: Eğer alan adına teslimat %{count} gün boyunca başarısız olursa, alan adından bir teslimat gelmedikçe yeni bir iletim denemesi yapılmayacak. @@ -725,7 +728,7 @@ tr: 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: Denetim Günlüğü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 diff --git a/config/locales/uk.yml b/config/locales/uk.yml index a5cdcfefb4cc0e..31ce3e6b7989fe 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -487,6 +487,9 @@ uk: title: Поради щодо підписок unsuppress: Відновити поради щодо підписок instances: + audit_log: + title: Останні журнали перевірки + view_all: Переглянути повні журнали перевірки availability: description_html: few: Якщо доставлення до домену не вдалася за %{count} інших дні, жодних спроб доставлення не здійснюється, доки доставлення від домену не отримуватиметься. diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 48e026d377ff87..dacaafd7681c18 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -463,6 +463,9 @@ vi: title: Gợi ý theo dõi unsuppress: Mở lại gợi ý theo dõi instances: + audit_log: + title: Kiểm duyệt gần đây + view_all: Xem lịch sử đầy đủ availability: description_html: other: Nếu chuyển đến tên miền %{count} ngày mà không thành công, không chuyển gì nữa cho tới khi sự tiếp nhận từ máy chủ được nhận. @@ -868,7 +871,23 @@ vi: action: Nhấn vào đây để biết thêm thông tin message_html: "Lưu trữ đối tượng của bạn bị cấu hình sai. Có nguy cơ ảnh hưởng bảo mật của người dùng." tags: + moderation: + not_trendable: Không xu hướng + not_usable: Không được dùng + pending_review: Chờ duyệt + review_requested: Yêu cầu duyệt + reviewed: Đã duyệt + title: Trạng thái + trendable: Có thể xu hướng + unreviewed: Chưa duyệt + usable: Có thể dùng + name: Tên + newest: Mới nhất + oldest: Cũ nhất + reset: Đặt lại review: Phê duyệt + search: Tìm kiếm + title: Hashtag updated_msg: Hashtag đã được cập nhật thành công title: Quản trị trends: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index d2d64152fa7bcc..f08142719aac46 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -463,6 +463,9 @@ zh-CN: title: 关注推荐 unsuppress: 恢复推荐关注 instances: + audit_log: + title: 近期审计日志 + view_all: 查看完整审计日志 availability: description_html: other: 如果连续 %{count} 天 均无法成功向该域名投递消息,则将不再尝试向其投递,直至收到来自该域名的消息。 @@ -868,7 +871,23 @@ zh-CN: action: 点击这里查看更多信息 message_html: "您的对象存储空间配置错误,您用户的隐私处于危险中。" tags: + moderation: + not_trendable: 不在趋势中显示 + not_usable: 不可用 + pending_review: 待审核 + review_requested: 已请求审核 + reviewed: 已审核 + title: 状态 + trendable: 可在趋势中显示 + unreviewed: 未审核 + usable: 可用 + name: 名称 + newest: 最新 + oldest: 最早 + reset: 重置 review: 审核状态 + search: 搜索 + title: 话题标签 updated_msg: 话题标签设置更新成功 title: 管理 trends: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index ddc6571e6da9a5..6ec0b098349e56 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1739,7 +1739,7 @@ zh-HK: system: 自動(使用系統主題) time: formats: - default: "%Y年%-m月%d日 %H:%M" + default: "%Y年%b月%d日 %H:%M" month: "%b %Y" time: "%H:%M" with_time_zone: "%b %d, %Y, %H:%M %Z" diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 375c79048a4d71..ef2da39f30b533 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -463,6 +463,9 @@ zh-TW: title: 跟隨建議 unsuppress: 回復跟隨建議 instances: + audit_log: + title: 近期審計紀錄 + view_all: 檢視完整審計紀錄 availability: description_html: other: 若於 %{count} 天向某個網域遞送失敗,除非收到某個網域的遞送表單,否則不會繼續嘗試遞送。 @@ -870,7 +873,23 @@ zh-TW: action: 檢查這裡以取得更多資訊 message_html: "您的物件資料儲存空間 (object storage) 設定錯誤。您的使用者隱私正暴露於風險之中。" tags: + moderation: + not_trendable: 無法作為熱門趨勢 + not_usable: 無法使用 + pending_review: 等待審核中 + review_requested: 需要審核 + reviewed: 已審核 + title: 狀態 + trendable: 可作為熱門趨勢 + unreviewed: 待審核 + usable: 可以使用 + name: 名稱 + newest: 最新 + oldest: 最舊 + reset: 重設 review: 審核嘟文 + search: 搜尋 + title: 主題標籤 updated_msg: 成功更新主題標籤設定 title: 管理介面 trends: diff --git a/config/navigation.rb b/config/navigation.rb index 55ab19cb56bdea..3a3f5c97830cb5 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -46,13 +46,14 @@ n.item :trends, safe_join([fa_icon('fire fw'), t('admin.trends.title')]), admin_trends_statuses_path, if: -> { current_user.can?(:manage_taxonomies) && !self_destruct } 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 :tags, safe_join([fa_icon('hashtag fw'), t('admin.trends.tags.title')]), admin_trends_tags_path, highlights_on: %r{/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')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) && !self_destruct } do |s| s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports|admin/report_notes}, 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/account_moderation_notes|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) } + s.item :tags, safe_join([fa_icon('hashtag fw'), t('admin.tags.title')]), admin_tags_path, highlights_on: %r{/admin/tags}, if: -> { current_user.can?(:manage_taxonomies) } 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: limited_federation_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) } diff --git a/config/routes.rb b/config/routes.rb index 4114db5f43478a..242ca062623bdf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -143,7 +143,11 @@ def redirect_with_vary(path) resource :inbox, only: [:create], module: :activitypub - get '/:encoded_at(*path)', to: redirect('/@%{path}'), constraints: { encoded_at: /%40/ } + constraints(encoded_path: /%40.*/) do + get '/:encoded_path', to: redirect { |params| + "/#{params[:encoded_path].gsub('%40', '@')}" + } + end constraints(username: %r{[^@/.]+}) do with_options to: 'accounts#show' do diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 14695c36c5f43a..78194f578980f8 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -164,7 +164,7 @@ resources :roles, except: [:show] resources :account_moderation_notes, only: [:create, :destroy] resource :follow_recommendations, only: [:show, :update] - resources :tags, only: [:show, :update] + resources :tags, only: [:index, :show, :update] namespace :trends do resources :links, only: [:index] do diff --git a/config/routes/api.rb b/config/routes/api.rb index 7ae621461f06ca..e20d8cc3013d59 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -156,6 +156,11 @@ namespace :notifications do resources :requests, only: [:index, :show] do + collection do + post :accept, to: 'requests#accept_bulk' + post :dismiss, to: 'requests#dismiss_bulk' + end + member do post :accept post :dismiss @@ -169,6 +174,7 @@ collection do post :clear delete :destroy_multiple + get :unread_count end member do @@ -338,6 +344,7 @@ resources :notifications, only: [:index, :show] do collection do post :clear + get :unread_count end member do diff --git a/db/migrate/20240724181224_enable_pkce.rb b/db/migrate/20240724181224_enable_pkce.rb new file mode 100644 index 00000000000000..4816f58f07d36f --- /dev/null +++ b/db/migrate/20240724181224_enable_pkce.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class EnablePkce < ActiveRecord::Migration[7.1] + def change + add_column :oauth_access_grants, :code_challenge, :string, null: true + add_column :oauth_access_grants, :code_challenge_method, :string, null: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 89e63d2e60eeea..8c67b8469c5d05 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[7.1].define(version: 2024_07_13_171909) do +ActiveRecord::Schema[7.1].define(version: 2024_07_24_181224) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -194,8 +194,8 @@ t.integer "avatar_storage_schema_version" t.integer "header_storage_schema_version" t.string "devices_url" - t.integer "suspension_origin" t.datetime "sensitized_at", precision: nil + t.integer "suspension_origin" t.boolean "trendable" t.datetime "reviewed_at", precision: nil t.datetime "requested_review_at", precision: nil @@ -579,12 +579,12 @@ end create_table "ip_blocks", force: :cascade do |t| - t.datetime "created_at", precision: nil, null: false - t.datetime "updated_at", precision: nil, null: false - t.datetime "expires_at", precision: nil t.inet "ip", default: "0.0.0.0", null: false t.integer "severity", default: 0, null: false + t.datetime "expires_at", precision: nil t.text "comment", default: "", null: false + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false t.index ["ip"], name: "index_ip_blocks_on_ip", unique: true end @@ -739,6 +739,8 @@ t.string "scopes" t.bigint "application_id", null: false t.bigint "resource_owner_id", null: false + t.string "code_challenge" + t.string "code_challenge_method" t.index ["resource_owner_id"], name: "index_oauth_access_grants_on_resource_owner_id" t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true end @@ -1424,9 +1426,9 @@ add_index "instances", ["domain"], name: "index_instances_on_domain", unique: true create_view "user_ips", sql_definition: <<-SQL - SELECT t0.user_id, - t0.ip, - max(t0.used_at) AS used_at + SELECT user_id, + ip, + max(used_at) AS used_at FROM ( SELECT users.id AS user_id, users.sign_up_ip AS ip, users.created_at AS used_at @@ -1443,7 +1445,7 @@ login_activities.created_at FROM login_activities WHERE (login_activities.success = true)) t0 - GROUP BY t0.user_id, t0.ip; + GROUP BY user_id, ip; SQL create_view "account_summaries", materialized: true, sql_definition: <<-SQL SELECT accounts.id AS account_id, @@ -1464,9 +1466,9 @@ add_index "account_summaries", ["account_id"], name: "index_account_summaries_on_account_id", unique: true create_view "global_follow_recommendations", materialized: true, sql_definition: <<-SQL - SELECT t0.account_id, - sum(t0.rank) AS rank, - array_agg(t0.reason) AS reason + SELECT account_id, + sum(rank) AS rank, + array_agg(reason) AS reason FROM ( SELECT account_summaries.account_id, ((count(follows.id))::numeric / (1.0 + (count(follows.id))::numeric)) AS rank, 'most_followed'::text AS reason @@ -1490,8 +1492,8 @@ WHERE (follow_recommendation_suppressions.account_id = statuses.account_id))))) GROUP BY account_summaries.account_id HAVING (sum((status_stats.reblogs_count + status_stats.favourites_count)) >= (5)::numeric)) t0 - GROUP BY t0.account_id - ORDER BY (sum(t0.rank)) DESC; + GROUP BY account_id + ORDER BY (sum(rank)) DESC; SQL add_index "global_follow_recommendations", ["account_id"], name: "index_global_follow_recommendations_on_account_id", unique: true diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index aca279a5ac8ac7..0709dfd1d6a5a0 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -65,7 +65,7 @@ def source_url end def user_agent - @user_agent ||= "#{HTTP::Request::USER_AGENT} (Mastodon/#{Version}; +http#{Rails.configuration.x.use_https ? 's' : ''}://#{Rails.configuration.x.web_domain}/)" + @user_agent ||= "Mastodon/#{Version} (#{HTTP::Request::USER_AGENT}; +http#{Rails.configuration.x.use_https ? 's' : ''}://#{Rails.configuration.x.web_domain}/)" end end end diff --git a/package.json b/package.json index 7659d3878589de..52d536d08fe04d 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "arrow-key-navigation": "^1.2.0", "async-mutex": "^0.5.0", "atrament": "0.2.4", - "autoprefixer": "^10.4.14", "axios": "^1.4.0", "babel-loader": "^8.3.0", "babel-plugin-formatjs": "^10.5.1", @@ -183,7 +182,7 @@ "eslint-plugin-import": "~2.29.0", "eslint-plugin-jsdoc": "^48.0.0", "eslint-plugin-jsx-a11y": "~6.9.0", - "eslint-plugin-promise": "~6.4.0", + "eslint-plugin-promise": "~6.6.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "husky": "^9.0.11", diff --git a/postcss.config.js b/postcss.config.js index 63aeafb36d9939..ddcbbbeeec3898 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,8 +1,13 @@ +const postcssPresetEnv = require('postcss-preset-env'); + /** @type {import('postcss-load-config').Config} */ const config = ({ env }) => ({ plugins: [ - require('postcss-preset-env'), - require('autoprefixer'), + postcssPresetEnv({ + features: { + 'logical-properties-and-values': false + } + }), env === 'production' ? require('cssnano') : '', ], }); diff --git a/spec/controllers/admin/tags_controller_spec.rb b/spec/controllers/admin/tags_controller_spec.rb index 4e06adaca6780d..1df2bc400309a0 100644 --- a/spec/controllers/admin/tags_controller_spec.rb +++ b/spec/controllers/admin/tags_controller_spec.rb @@ -9,6 +9,43 @@ sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) end + describe 'GET #index' do + before do + Fabricate(:tag) + + tag_filter = instance_double(Admin::TagFilter, results: Tag.all) + allow(Admin::TagFilter).to receive(:new).and_return(tag_filter) + end + + let(:params) { { order: 'newest' } } + + it 'returns http success' do + get :index + + expect(response).to have_http_status(200) + expect(response).to render_template(:index) + + expect(Admin::TagFilter) + .to have_received(:new) + .with(hash_including(params)) + end + + describe 'with filters' do + let(:params) { { order: 'newest', name: 'test' } } + + it 'returns http success' do + get :index, params: { name: 'test' } + + expect(response).to have_http_status(200) + expect(response).to render_template(:index) + + expect(Admin::TagFilter) + .to have_received(:new) + .with(hash_including(params)) + end + end + end + describe 'GET #show' do let!(:tag) { Fabricate(:tag) } diff --git a/spec/controllers/oauth/authorizations_controller_spec.rb b/spec/controllers/oauth/authorizations_controller_spec.rb index 9b3ae251e6cad8..9bb520211c2cfa 100644 --- a/spec/controllers/oauth/authorizations_controller_spec.rb +++ b/spec/controllers/oauth/authorizations_controller_spec.rb @@ -3,8 +3,6 @@ require 'rails_helper' RSpec.describe Oauth::AuthorizationsController do - render_views - let(:app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: 'http://localhost/', scopes: 'read') } describe 'GET #new' do @@ -36,11 +34,6 @@ expect(response.headers['Cache-Control']).to include('private, no-store') end - it 'gives options to authorize and deny' do - subject - expect(response.body).to match(/Authorize/) - end - include_examples 'stores location for user' context 'when app is already authorized' do @@ -61,7 +54,8 @@ it 'does not redirect to callback with force_login=true' do get :new, params: { client_id: app.uid, response_type: 'code', redirect_uri: 'http://localhost/', scope: 'read', force_login: 'true' } - expect(response.body).to match(/Authorize/) + + expect(response).to have_http_status(:success) end end end diff --git a/spec/lib/link_details_extractor_spec.rb b/spec/lib/link_details_extractor_spec.rb index 2a4df70a8bf226..b1e5cedced3b2d 100644 --- a/spec/lib/link_details_extractor_spec.rb +++ b/spec/lib/link_details_extractor_spec.rb @@ -129,6 +129,24 @@ include_examples 'structured data' end + context 'with the first tag is null' do + let(:html) { <<~HTML } + + + + + + + + HTML + + include_examples 'structured data' + end + context 'with preceding block of unsupported LD+JSON' do let(:html) { <<~HTML } diff --git a/spec/lib/text_formatter_spec.rb b/spec/lib/text_formatter_spec.rb index 8b922c018b0078..bde17bb79c5bd5 100644 --- a/spec/lib/text_formatter_spec.rb +++ b/spec/lib/text_formatter_spec.rb @@ -224,6 +224,14 @@ end end + context 'when given a URL with trailing @ symbol' do + let(:text) { 'https://gta.fandom.com/wiki/TW@ Content' } + + it 'matches the full URL' do + expect(subject).to include 'href="https://gta.fandom.com/wiki/TW@"' + end + end + context 'when given a URL containing unsafe code (XSS attack, visible part)' do let(:text) { 'http://example.com/bb' } diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 7153c7466e69f5..8e5648a0b0e189 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -711,6 +711,14 @@ it 'does not match URL query string' do expect(subject.match('https://example.com/?x=@alice')).to be_nil end + + it 'matches usernames immediately following the letter ß' do + expect(subject.match('Hello toß @alice from me')[1]).to eq 'alice' + end + + it 'matches usernames containing uppercase characters' do + expect(subject.match('Hello to @aLice@Example.com from me')[1]).to eq 'aLice@Example.com' + end end describe 'validations' do diff --git a/spec/models/admin/tag_filter_spec.rb b/spec/models/admin/tag_filter_spec.rb new file mode 100644 index 00000000000000..21dc28affb3209 --- /dev/null +++ b/spec/models/admin/tag_filter_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Admin::TagFilter do + describe 'with invalid params' do + it 'raises with key error' do + filter = described_class.new(wrong: true) + + expect { filter.results }.to raise_error(/wrong/) + end + + it 'raises with status scope error' do + filter = described_class.new(status: 'unknown') + + expect { filter.results }.to raise_error(/Unknown status: unknown/) + end + + it 'raises with order value error' do + filter = described_class.new(order: 'unknown') + + expect { filter.results }.to raise_error(/Unknown order: unknown/) + end + end + + describe '#results' do + let(:listable_tag) { Fabricate(:tag, name: 'test1', listable: true) } + let(:not_listable_tag) { Fabricate(:tag, name: 'test2', listable: false) } + + it 'returns tags filtered by name' do + filter = described_class.new(name: 'test') + + expect(filter.results).to eq([listable_tag, not_listable_tag]) + end + end +end diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index 7799afe44b2708..ff0a0551133102 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -95,6 +95,14 @@ it 'does not match purely-numeric hashtags' do expect(subject.match('hello #0123456')).to be_nil end + + it 'matches hashtags immediately following the letter ß' do + expect(subject.match('Hello toß #ruby').to_s).to eq '#ruby' + end + + it 'matches hashtags containing uppercase characters' do + expect(subject.match('Hello #rubyOnRails').to_s).to eq '#rubyOnRails' + end end describe '#to_param' do @@ -104,6 +112,18 @@ end end + describe '#formatted_name' do + it 'returns name with a proceeding hash symbol' do + tag = Fabricate(:tag, name: 'foo') + expect(tag.formatted_name).to eq '#foo' + end + + it 'returns display_name with a proceeding hash symbol, if display name present' do + tag = Fabricate(:tag, name: 'foobar', display_name: 'FooBar') + expect(tag.formatted_name).to eq '#FooBar' + end + end + describe '.recently_used' do let(:account) { Fabricate(:account) } let(:other_person_status) { Fabricate(:status) } @@ -232,5 +252,23 @@ expect(results).to eq [tag, similar_tag] end + + it 'finds only listable tags' do + tag = Fabricate(:tag, name: 'match') + _miss_tag = Fabricate(:tag, name: 'matchunlisted', listable: false) + + results = described_class.search_for('match') + + expect(results).to eq [tag] + end + + it 'finds non-listable tags as well via option' do + tag = Fabricate(:tag, name: 'match') + unlisted_tag = Fabricate(:tag, name: 'matchunlisted', listable: false) + + results = described_class.search_for('match', 5, 0, exclude_unlistable: false) + + expect(results).to eq [tag, unlisted_tag] + end end end diff --git a/spec/requests/api/v1/notifications/requests_spec.rb b/spec/requests/api/v1/notifications/requests_spec.rb index d3a9753246a2ec..e1fe17426a28a5 100644 --- a/spec/requests/api/v1/notifications/requests_spec.rb +++ b/spec/requests/api/v1/notifications/requests_spec.rb @@ -87,4 +87,37 @@ end end end + + describe 'POST /api/v1/notifications/requests/accept' do + subject do + post '/api/v1/notifications/requests/accept', params: { id: [notification_request.id] }, headers: headers + end + + let!(:notification_request) { Fabricate(:notification_request, account: user.account) } + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'returns http success and creates notification permission', :aggregate_failures do + subject + + expect(NotificationPermission.find_by(account: notification_request.account, from_account: notification_request.from_account)).to_not be_nil + expect(response).to have_http_status(200) + end + end + + describe 'POST /api/v1/notifications/requests/dismiss' do + subject do + post '/api/v1/notifications/requests/dismiss', params: { id: [notification_request.id] }, headers: headers + end + + let!(:notification_request) { Fabricate(:notification_request, account: user.account) } + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'returns http success and destroys the notification request', :aggregate_failures do + expect { subject }.to change(NotificationRequest, :count).by(-1) + + expect(response).to have_http_status(200) + end + end end diff --git a/spec/requests/api/v1/notifications_spec.rb b/spec/requests/api/v1/notifications_spec.rb index c9034c17dcbd97..3d1e8a4787bb6a 100644 --- a/spec/requests/api/v1/notifications_spec.rb +++ b/spec/requests/api/v1/notifications_spec.rb @@ -8,6 +8,83 @@ let(:scopes) { 'read:notifications write:notifications' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + describe 'GET /api/v1/notifications/unread_count', :inline_jobs do + subject do + get '/api/v1/notifications/unread_count', headers: headers, params: params + end + + let(:params) { {} } + + before do + first_status = PostStatusService.new.call(user.account, text: 'Test') + ReblogService.new.call(Fabricate(:account), first_status) + PostStatusService.new.call(Fabricate(:account), text: 'Hello @alice') + FavouriteService.new.call(Fabricate(:account), first_status) + FavouriteService.new.call(Fabricate(:account), first_status) + FollowService.new.call(Fabricate(:account), user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'with no options' do + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 5 + end + end + + context 'with a read marker' do + before do + id = user.account.notifications.browserable.order(id: :desc).offset(2).first.id + user.markers.create!(timeline: 'notifications', last_read_id: id) + end + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 2 + end + end + + context 'with exclude_types param' do + let(:params) { { exclude_types: %w(mention) } } + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 4 + end + end + + context 'with a user-provided limit' do + let(:params) { { limit: 2 } } + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 2 + end + end + + context 'when there are more notifications than the limit' do + before do + stub_const('Api::V1::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT', 2) + end + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq Api::V1::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT + end + end + end + describe 'GET /api/v1/notifications', :inline_jobs do subject do get '/api/v1/notifications', headers: headers, params: params diff --git a/spec/requests/api/v2_alpha/notifications_spec.rb b/spec/requests/api/v2_alpha/notifications_spec.rb index 104651ebe39f44..fc1daef43fe9df 100644 --- a/spec/requests/api/v2_alpha/notifications_spec.rb +++ b/spec/requests/api/v2_alpha/notifications_spec.rb @@ -8,6 +8,83 @@ let(:scopes) { 'read:notifications write:notifications' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + describe 'GET /api/v2_alpha/notifications/unread_count', :inline_jobs do + subject do + get '/api/v2_alpha/notifications/unread_count', headers: headers, params: params + end + + let(:params) { {} } + + before do + first_status = PostStatusService.new.call(user.account, text: 'Test') + ReblogService.new.call(Fabricate(:account), first_status) + PostStatusService.new.call(Fabricate(:account), text: 'Hello @alice') + FavouriteService.new.call(Fabricate(:account), first_status) + FavouriteService.new.call(Fabricate(:account), first_status) + FollowService.new.call(Fabricate(:account), user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'with no options' do + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 4 + end + end + + context 'with a read marker' do + before do + id = user.account.notifications.browserable.order(id: :desc).offset(2).first.id + user.markers.create!(timeline: 'notifications', last_read_id: id) + end + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 2 + end + end + + context 'with exclude_types param' do + let(:params) { { exclude_types: %w(mention) } } + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 3 + end + end + + context 'with a user-provided limit' do + let(:params) { { limit: 2 } } + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 2 + end + end + + context 'when there are more notifications than the limit' do + before do + stub_const('Api::V2Alpha::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT', 2) + end + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq Api::V2Alpha::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT + end + end + end + describe 'GET /api/v2_alpha/notifications', :inline_jobs do subject do get '/api/v2_alpha/notifications', headers: headers, params: params @@ -58,7 +135,7 @@ expect(response).to have_http_status(200) expect(body_json_types.uniq).to eq ['mention'] - expect(body_as_json[0][:page_min_id]).to_not be_nil + expect(body_as_json.dig(:notification_groups, 0, :page_min_id)).to_not be_nil end end @@ -70,7 +147,7 @@ notifications = user.account.notifications - expect(body_as_json.size) + expect(body_as_json[:notification_groups].size) .to eq(params[:limit]) expect(response) @@ -84,7 +161,7 @@ end def body_json_types - body_as_json.pluck(:type) + body_as_json[:notification_groups].pluck(:type) end end diff --git a/spec/requests/well_known/oauth_metadata_spec.rb b/spec/requests/well_known/oauth_metadata_spec.rb index 3350d593156d92..9d2d20228677e4 100644 --- a/spec/requests/well_known/oauth_metadata_spec.rb +++ b/spec/requests/well_known/oauth_metadata_spec.rb @@ -29,7 +29,10 @@ revocation_endpoint: oauth_revoke_url(protocol: protocol), scopes_supported: Doorkeeper.configuration.scopes.map(&:to_s), response_types_supported: Doorkeeper.configuration.authorization_response_types, + response_modes_supported: Doorkeeper.configuration.authorization_response_flows.flat_map(&:response_mode_matches).uniq, + token_endpoint_auth_methods_supported: %w(client_secret_basic client_secret_post), grant_types_supported: grant_types_supported, + code_challenge_methods_supported: ['S256'], # non-standard extension: app_registration_endpoint: api_v1_apps_url(protocol: protocol) ) diff --git a/spec/routing/accounts_routing_spec.rb b/spec/routing/accounts_routing_spec.rb index 8b2c124fd21a72..588855943e64be 100644 --- a/spec/routing/accounts_routing_spec.rb +++ b/spec/routing/accounts_routing_spec.rb @@ -47,6 +47,61 @@ end end + context 'with local username encoded at' do + include RSpec::Rails::RequestExampleGroup + let(:username) { 'alice' } + + it 'routes /%40:username' do + get "/%40#{username}" + expect(response).to redirect_to("/@#{username}") + end + + it 'routes /%40:username.json' do + get("/%40#{username}.json") + expect(response).to redirect_to("/@#{username}.json") + end + + it 'routes /%40:username.rss' do + get("/%40#{username}.rss") + expect(response).to redirect_to("/@#{username}.rss") + end + + it 'routes /%40:username/:id' do + get("/%40#{username}/123") + expect(response).to redirect_to("/@#{username}/123") + end + + it 'routes /%40:username/:id/embed' do + get("/%40#{username}/123/embed") + expect(response).to redirect_to("/@#{username}/123/embed") + end + + it 'routes /%40:username/following' do + get("/%40#{username}/following") + expect(response).to redirect_to("/@#{username}/following") + end + + it 'routes /%40:username/followers' do + get("/%40#{username}/followers") + expect(response).to redirect_to("/@#{username}/followers") + end + + it 'routes /%40:username/with_replies' do + get("/%40#{username}/with_replies") + expect(response).to redirect_to("/@#{username}/with_replies") + end + + it 'routes /%40:username/media' do + get("/%40#{username}/media") + expect(response).to redirect_to("/@#{username}/media") + end + + it 'routes /%40:username/tagged/:tag' do + get("/%40#{username}/tagged/foo") + expect(response).to redirect_to("/@#{username}/tagged/foo") + end + end + context 'with remote username' do let(:username) { 'alice@example.com' } @@ -82,4 +137,50 @@ expect(get("/@#{username}/tagged/foo")).to route_to('home#index', username_with_domain: username, any: 'tagged/foo') end end + + context 'with remote username encoded at' do + include RSpec::Rails::RequestExampleGroup + let(:username) { 'alice%40example.com' } + let(:username_decoded) { 'alice@example.com' } + + it 'routes /%40:username' do + get("/%40#{username}") + expect(response).to redirect_to("/@#{username_decoded}") + end + + it 'routes /%40:username/:id' do + get("/%40#{username}/123") + expect(response).to redirect_to("/@#{username_decoded}/123") + end + + it 'routes /%40:username/:id/embed' do + get("/%40#{username}/123/embed") + expect(response).to redirect_to("/@#{username_decoded}/123/embed") + end + + it 'routes /%40:username/following' do + get("/%40#{username}/following") + expect(response).to redirect_to("/@#{username_decoded}/following") + end + + it 'routes /%40:username/followers' do + get("/%40#{username}/followers") + expect(response).to redirect_to("/@#{username_decoded}/followers") + end + + it 'routes /%40:username/with_replies' do + get("/%40#{username}/with_replies") + expect(response).to redirect_to("/@#{username_decoded}/with_replies") + end + + it 'routes /%40:username/media' do + get("/%40#{username}/media") + expect(response).to redirect_to("/@#{username_decoded}/media") + end + + it 'routes /%40:username/tagged/:tag' do + get("/%40#{username}/tagged/foo") + expect(response).to redirect_to("/@#{username_decoded}/tagged/foo") + end + end end diff --git a/spec/support/matchers/api_pagination.rb b/spec/support/matchers/api_pagination.rb index 81e27e44b80a86..f7d552b242a25f 100644 --- a/spec/support/matchers/api_pagination.rb +++ b/spec/support/matchers/api_pagination.rb @@ -7,7 +7,7 @@ end.all? end - failure_message do |header| - "expected that #{header} would have the same values as #{links}." + failure_message do |response| + "expected that #{response.headers['Link']} would have the same values as #{links}." end end diff --git a/spec/support/stories/profile_stories.rb b/spec/support/stories/profile_stories.rb index f5fc9a441fd698..07eaaca9fb93b0 100644 --- a/spec/support/stories/profile_stories.rb +++ b/spec/support/stories/profile_stories.rb @@ -3,6 +3,12 @@ module ProfileStories attr_reader :bob, :alice, :alice_bio + def fill_in_auth_details(email, password) + fill_in 'user_email', with: email + fill_in 'user_password', with: password + click_on I18n.t('auth.login') + end + def as_a_registered_user @bob = Fabricate( :user, @@ -16,9 +22,7 @@ def as_a_registered_user def as_a_logged_in_user as_a_registered_user visit new_user_session_path - fill_in 'user_email', with: email - fill_in 'user_password', with: password - click_on I18n.t('auth.login') + fill_in_auth_details(email, password) end def as_a_logged_in_admin diff --git a/spec/system/log_in_spec.rb b/spec/system/log_in_spec.rb index c64e19d2b7c43f..8a73c42d2edf00 100644 --- a/spec/system/log_in_spec.rb +++ b/spec/system/log_in_spec.rb @@ -17,17 +17,13 @@ end it 'A valid email and password user is able to log in' do - fill_in 'user_email', with: email - fill_in 'user_password', with: password - click_on I18n.t('auth.login') + fill_in_auth_details(email, password) expect(subject).to have_css('div.app-holder') end it 'A invalid email and password user is not able to log in' do - fill_in 'user_email', with: 'invalid_email' - fill_in 'user_password', with: 'invalid_password' - click_on I18n.t('auth.login') + fill_in_auth_details('invalid_email', 'invalid_password') expect(subject).to have_css('.flash-message', text: failure_message('invalid')) end @@ -36,9 +32,7 @@ let(:confirmed_at) { nil } it 'A unconfirmed user is able to log in' do - fill_in 'user_email', with: email - fill_in 'user_password', with: password - click_on I18n.t('auth.login') + fill_in_auth_details(email, password) expect(subject).to have_css('div.admin-wrapper') end diff --git a/spec/system/oauth_spec.rb b/spec/system/oauth_spec.rb index 1c9aca3114113c..5d06f6111cee79 100644 --- a/spec/system/oauth_spec.rb +++ b/spec/system/oauth_spec.rb @@ -2,8 +2,15 @@ require 'rails_helper' -describe 'Using OAuth from an external app', :js, :streaming do +describe 'Using OAuth from an external app' do + include ProfileStories + + subject { visit "/oauth/authorize?#{params.to_query}" } + let(:client_app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: about_url(host: Rails.application.config.x.local_domain), scopes: 'read') } + let(:params) do + { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } + end context 'when the user is already logged in' do let!(:user) { Fabricate(:user) } @@ -14,8 +21,7 @@ end it 'when accepting the authorization request' do - params = { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } - visit "/oauth/authorize?#{params.to_query}" + subject # It presents the user with an authorization page expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.authorize')) @@ -29,8 +35,7 @@ end it 'when rejecting the authorization request' do - params = { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } - visit "/oauth/authorize?#{params.to_query}" + subject # It presents the user with an authorization page expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.deny')) @@ -42,6 +47,79 @@ # It does not grant the app access to the account expect(Doorkeeper::AccessGrant.exists?(application: client_app, resource_owner_id: user.id)).to be false end + + # The tests in this context ensures that requests without PKCE parameters + # still work; In the future we likely want to force usage of PKCE for + # security reasons, as per: + # + # https://www.ietf.org/archive/id/draft-ietf-oauth-security-topics-27.html#section-2.1.1-9 + context 'when not using PKCE' do + it 'does not include the PKCE values in the hidden inputs' do + subject + + code_challenge_inputs = all('.oauth-prompt input[name=code_challenge]', visible: false) + code_challenge_method_inputs = all('.oauth-prompt input[name=code_challenge_method]', visible: false) + + expect(code_challenge_inputs).to_not be_empty + expect(code_challenge_method_inputs).to_not be_empty + + (code_challenge_inputs.to_a + code_challenge_method_inputs.to_a).each do |input| + expect(input.value).to be_nil + end + end + end + + context 'when using PKCE' do + let(:params) do + { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read', code_challenge_method: pkce_code_challenge_method, code_challenge: pkce_code_challenge } + end + let(:pkce_code_challenge) { SecureRandom.hex(32) } + let(:pkce_code_challenge_method) { 'S256' } + + context 'when using S256 code challenge method' do + it 'includes the PKCE values in the hidden inputs' do + subject + + code_challenge_inputs = all('.oauth-prompt input[name=code_challenge]', visible: false) + code_challenge_method_inputs = all('.oauth-prompt input[name=code_challenge_method]', visible: false) + + expect(code_challenge_inputs).to_not be_empty + expect(code_challenge_method_inputs).to_not be_empty + + code_challenge_inputs.each do |input| + expect(input.value).to eq pkce_code_challenge + end + code_challenge_method_inputs.each do |input| + expect(input.value).to eq pkce_code_challenge_method + end + end + end + + context 'when using plain code challenge method' do + let(:pkce_code_challenge_method) { 'plain' } + + it 'does not include the PKCE values in the response' do + subject + + expect(page).to have_no_css('.oauth-prompt input[name=code_challenge]') + expect(page).to have_no_css('.oauth-prompt input[name=code_challenge_method]') + end + + it 'does not include the authorize button' do + subject + + expect(page).to have_no_css('.oauth-prompt button[type="submit"]') + end + + it 'includes an error message' do + subject + + within '.form-container .flash-message' do + expect(page).to have_content(I18n.t('doorkeeper.errors.messages.invalid_code_challenge_method')) + end + end + end + end end context 'when the user is not already logged in' do @@ -170,12 +248,6 @@ private - def fill_in_auth_details(email, password) - fill_in 'user_email', with: email - fill_in 'user_password', with: password - click_on I18n.t('auth.login') - end - def fill_in_otp_details(value) fill_in 'user_otp_attempt', with: value click_on I18n.t('auth.login') diff --git a/spec/workers/scheduler/user_cleanup_scheduler_spec.rb b/spec/workers/scheduler/user_cleanup_scheduler_spec.rb index c3940901d4e2c8..7952f2c146309c 100644 --- a/spec/workers/scheduler/user_cleanup_scheduler_spec.rb +++ b/spec/workers/scheduler/user_cleanup_scheduler_spec.rb @@ -12,29 +12,31 @@ describe '#perform' do before do - # Need to update the already-existing users because their initialization overrides confirmation_sent_at + # Update already-existing users because initialization overrides `confirmation_sent_at` new_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: Time.now.utc) old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 10.days.ago) confirmed_user.update!(confirmed_at: 1.day.ago) end - it 'deletes the old unconfirmed user, their account, and the moderation note' do + it 'deletes the old unconfirmed user and metadata while preserving confirmed user and newer unconfirmed user' do expect { subject.perform } - .to change { User.exists?(old_unconfirmed_user.id) }.from(true).to(false) - .and change { Account.exists?(old_unconfirmed_user.account_id) }.from(true).to(false) - expect { moderation_note.reload }.to raise_error(ActiveRecord::RecordNotFound) + .to change { User.exists?(old_unconfirmed_user.id) } + .from(true).to(false) + .and change { Account.exists?(old_unconfirmed_user.account_id) } + .from(true).to(false) + expect { moderation_note.reload } + .to raise_error(ActiveRecord::RecordNotFound) + expect_preservation_of(new_unconfirmed_user) + expect_preservation_of(confirmed_user) end - it 'does not delete the new unconfirmed user or their account' do - subject.perform - expect(User.exists?(new_unconfirmed_user.id)).to be true - expect(Account.exists?(new_unconfirmed_user.account_id)).to be true - end + private - it 'does not delete the confirmed user or their account' do - subject.perform - expect(User.exists?(confirmed_user.id)).to be true - expect(Account.exists?(confirmed_user.account_id)).to be true + def expect_preservation_of(user) + expect(User.exists?(user.id)) + .to be true + expect(Account.exists?(user.account_id)) + .to be true end end end diff --git a/streaming/Dockerfile b/streaming/Dockerfile index d9f7615fa80c39..938f1655d15d24 100644 --- a/streaming/Dockerfile +++ b/streaming/Dockerfile @@ -1,4 +1,4 @@ -# syntax=docker/dockerfile:1.8 +# syntax=docker/dockerfile:1.9 # Please see https://docs.docker.com/engine/reference/builder for information about # the extended buildx capabilities used in this file. diff --git a/streaming/index.js b/streaming/index.js index 74121774ccc2af..4419b37c608b66 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -248,6 +248,10 @@ const redisConfigFromEnv = (env) => { const redisParams = { host: env.REDIS_HOST || '127.0.0.1', port: redisPort, + // Force support for both IPv6 and IPv4, by default ioredis sets this to 4, + // only allowing IPv4 connections: + // https://github.com/redis/ioredis/issues/1576 + family: 0, db: redisDatabase, password: env.REDIS_PASSWORD || undefined, }; diff --git a/yarn.lock b/yarn.lock index 62069712e7d562..b7104c1966db00 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,45 +52,45 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/compat-data@npm:7.24.8" - checksum: 10c0/7f465e9d8e44c5b516eeb3001362a3cd9a6df51dd90d3ac9868e1e7fa631ac57fc781cec6700110d4f555ba37fe59c4a71927b445106fe0062e79e79ffe11091 +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/compat-data@npm:7.25.2" + checksum: 10c0/5bf1f14d6e5f0d37c19543e99209ff4a94bb97915e1ce01e5334a144aa08cd56b6e62ece8135dac77e126723d63d4d4b96fc603a12c43b88c28f4b5e070270c5 languageName: node linkType: hard "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1, @babel/core@npm:^7.24.4": - version: 7.24.9 - resolution: "@babel/core@npm:7.24.9" + version: 7.25.2 + resolution: "@babel/core@npm:7.25.2" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.9" - "@babel/helper-compilation-targets": "npm:^7.24.8" - "@babel/helper-module-transforms": "npm:^7.24.9" - "@babel/helpers": "npm:^7.24.8" - "@babel/parser": "npm:^7.24.8" - "@babel/template": "npm:^7.24.7" - "@babel/traverse": "npm:^7.24.8" - "@babel/types": "npm:^7.24.9" + "@babel/generator": "npm:^7.25.0" + "@babel/helper-compilation-targets": "npm:^7.25.2" + "@babel/helper-module-transforms": "npm:^7.25.2" + "@babel/helpers": "npm:^7.25.0" + "@babel/parser": "npm:^7.25.0" + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.2" + "@babel/types": "npm:^7.25.2" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/e104ec6efbf099f55184933e9ab078eb5821c792ddfef3e9c6561986ec4ff103f5c11e3d7d6e5e8929e50e2c58db1cc80e5b6f14b530335b6622095ec4b4124c + checksum: 10c0/a425fa40e73cb72b6464063a57c478bc2de9dbcc19c280f1b55a3d88b35d572e87e8594e7d7b4880331addb6faef641bbeb701b91b41b8806cd4deae5d74f401 languageName: node linkType: hard -"@babel/generator@npm:^7.24.8, @babel/generator@npm:^7.24.9, @babel/generator@npm:^7.7.2": - version: 7.24.9 - resolution: "@babel/generator@npm:7.24.9" +"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.7.2": + version: 7.25.0 + resolution: "@babel/generator@npm:7.25.0" dependencies: - "@babel/types": "npm:^7.24.9" + "@babel/types": "npm:^7.25.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10c0/cd1f7edce7717462546c349e15289d1267a3ed627c6f6583fbf51e78eacacc6500ec2f0024f08f1cc7138989e575635b931acf4549f9e728017a22176a9ea6b6 + checksum: 10c0/d0e2dfcdc8bdbb5dded34b705ceebf2e0bc1b06795a1530e64fb6a3ccf313c189db7f60c1616effae48114e1a25adc75855bc4496f3779a396b3377bae718ce7 languageName: node linkType: hard @@ -123,16 +123,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-compilation-targets@npm:7.24.8" +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-compilation-targets@npm:7.25.2" dependencies: - "@babel/compat-data": "npm:^7.24.8" + "@babel/compat-data": "npm:^7.25.2" "@babel/helper-validator-option": "npm:^7.24.8" browserslist: "npm:^4.23.1" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/2885c44ef6aaf82b7e4352b30089bb09fbe08ed5ec24eb452c2bdc3c021e2a65ab412f74b3d67ec1398da0356c730b33a2ceca1d67d34c85080d31ca6efa9aec + checksum: 10c0/de10e986b5322c9f807350467dc845ec59df9e596a5926a3b5edbb4710d8e3b8009d4396690e70b88c3844fe8ec4042d61436dd4b92d1f5f75655cf43ab07e99 languageName: node linkType: hard @@ -155,16 +155,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.7" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7, @babel/helper-create-regexp-features-plugin@npm:^7.25.0": + version: 7.25.2 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.24.7" regexpu-core: "npm:^5.3.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/ed611a7eb0c71843f9cdc471eeb38767972229f9225f7aaa90d124d7ee0062cf6908fd53ee9c34f731394c429594f06049a7738a71d342e0191d4047b2fc0ac2 + checksum: 10c0/85a7e3639c118856fb1113f54fb7e3bf7698171ddfd0cd6fccccd5426b3727bc1434fe7f69090441dcde327feef9de917e00d35e47ab820047057518dd675317 languageName: node linkType: hard @@ -202,22 +202,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-hoist-variables@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10c0/19ee37563bbd1219f9d98991ad0e9abef77803ee5945fd85aa7aa62a67c69efca9a801696a1b58dda27f211e878b3327789e6fd2a6f6c725ccefe36774b5ce95 - languageName: node - linkType: hard - -"@babel/helper-member-expression-to-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.7" +"@babel/helper-member-expression-to-functions@npm:^7.24.7, @babel/helper-member-expression-to-functions@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/9638c1d33cf6aba028461ccd3db6061c76ff863ca0d5013dd9a088bf841f2f77c46956493f9da18355c16759449d23b74cc1de4da357ade5c5c34c858f840f0a + "@babel/traverse": "npm:^7.24.8" + "@babel/types": "npm:^7.24.8" + checksum: 10c0/7e14a5acc91f6cd26305a4441b82eb6f616bd70b096a4d2099a968f16b26d50207eec0b9ebfc466fefd62bd91587ac3be878117cdfec819b7151911183cb0e5a languageName: node linkType: hard @@ -231,18 +222,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.24.9": - version: 7.24.9 - resolution: "@babel/helper-module-transforms@npm:7.24.9" +"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.0, @babel/helper-module-transforms@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-module-transforms@npm:7.25.2" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" "@babel/helper-module-imports": "npm:^7.24.7" "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" "@babel/helper-validator-identifier": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.2" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/e27bca43bc113731ee4f2b33a4c5bf9c7eebf4d64487b814c305cbd5feb272c29fcd3d79634ba03131ade171e5972bc7ede8dbc83ba0deb02f1e62d318c87770 + checksum: 10c0/adaa15970ace0aee5934b5a633789b5795b6229c6a9cf3e09a7e80aa33e478675eee807006a862aa9aa517935d81f88a6db8a9f5936e3a2a40ec75f8062bc329 languageName: node linkType: hard @@ -262,29 +252,29 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7" +"@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-wrap-function": "npm:^7.24.7" + "@babel/helper-wrap-function": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/4e7fa2cdcbc488e41c27066c16e562857ef3c5c2bfe70d2f1e32e9ee7546b17c3fc1c20d05bf2a7f1c291bd9e7a0a219f6a9fa387209013294be79a26fcfe64d + checksum: 10c0/0d17b5f7bb6a607edc9cc62fff8056dd9f341bf2f919884f97b99170d143022a5e7ae57922c4891e4fc360ad291e708d2f8cd8989f1d3cd7a17600159984f5a6 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-replace-supers@npm:7.24.7" +"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-replace-supers@npm:7.25.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.7" + "@babel/helper-member-expression-to-functions": "npm:^7.24.8" "@babel/helper-optimise-call-expression": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/0e133bb03371dee78e519c334a09c08e1493103a239d9628db0132dfaac3fc16380479ca3c590d278a9b71b624030a338c18ebbfe6d430ebb2e4653775c4b3e3 + checksum: 10c0/b4b6650ab3d56c39a259367cd97f8df2f21c9cebb3716fea7bca40a150f8847bfb82f481e98927c7c6579b48a977b5a8f77318a1c6aeb497f41ecd6dbc3fdfef languageName: node linkType: hard @@ -338,25 +328,24 @@ __metadata: languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-wrap-function@npm:7.24.7" +"@babel/helper-wrap-function@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-wrap-function@npm:7.25.0" dependencies: - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/d5689f031bf0eb38c0d7fad6b7e320ddef4bfbdf08d12d7d76ef41b7ca365a32721e74cb5ed5a9a9ec634bc20f9b7a27314fa6fb08f1576b8f6d8330fcea6f47 + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/d54601a98384c191cbc1ff07b03a19e288ef8d5c6bfafe270b2a303d96e7304eb296002921ed464cc1b105a547d1db146eb86b0be617924dee1ba1b379cdc216 languageName: node linkType: hard -"@babel/helpers@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helpers@npm:7.24.8" +"@babel/helpers@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helpers@npm:7.25.0" dependencies: - "@babel/template": "npm:^7.24.7" - "@babel/types": "npm:^7.24.8" - checksum: 10c0/42b8939b0a0bf72d6df9721973eb0fd7cd48f42641c5c9c740916397faa586255c06d36c6e6a7e091860723096281c620f6ffaee0011a3bb254a6f5475d89a12 + "@babel/template": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/b7fe007fc4194268abf70aa3810365085e290e6528dcb9fbbf7a765d43c74b6369ce0f99c5ccd2d44c413853099daa449c9a0123f0b212ac8d18643f2e8174b8 languageName: node linkType: hard @@ -372,35 +361,48 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/parser@npm:7.24.8" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": + version: 7.25.3 + resolution: "@babel/parser@npm:7.25.3" + dependencies: + "@babel/types": "npm:^7.25.2" bin: parser: ./bin/babel-parser.js - checksum: 10c0/ce69671de8fa6f649abf849be262707ac700b573b8b1ce1893c66cc6cd76aeb1294a19e8c290b0eadeb2f47d3f413a2e57a281804ffbe76bfb9fa50194cf3c52 + checksum: 10c0/874b01349aedb805d6694f867a752fdc7469778fad76aca4548d2cc6ce96087c3ba5fb917a6f8d05d2d1a74aae309b5f50f1a4dba035f5a2c9fcfe6e106d2c4e languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.7" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.3": + version: 7.25.3 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.3" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.3" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/394c30e2b708ad385fa1219528e039066a1f1cb40f47986f283878848fd354c745e6397f588b4e5a046ee8d64bfdf4c208e4c3dfbdcfb2fd34315ec67c64e7af + checksum: 10c0/814b4d3f102e7556a5053d1acf57ef601cfcff39a2c81b8cdc6a5c842e3cb9838f5925d1466a5f1e6416e74c9c83586a3c07fbd7fb8610a396c2becdf9ae5790 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.7" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/9645a1f47b3750acadb1353c02e71cc712d072aafe5ce115ed3a886bc14c5d9200cfb0b5b5e60e813baa549b800cf798f8714019fd246c699053cf68c428e426 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/a36307428ecc1a01b00cf90812335eed1575d13f211ab24fe4d0c55c28a2fcbd4135f142efabc3b277b2a8e09ee05df594a1272353f061b63829495b5dcfdb96 + checksum: 10c0/ed1ce1c90cac46c01825339fd0f2a96fa071b016fb819d8dfaf8e96300eae30e74870cb47e4dc80d4ce2fb287869f102878b4f3b35bc927fec8b1d0d76bcf612 languageName: node linkType: hard @@ -417,15 +419,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/2b52a73e444f6adc73f927b623e53a4cf64397170dd1071268536df1b3db1e02131418c8dc91351af48837a6298212118f4a72d5407f8005cf9a732370a315b0 + checksum: 10c0/45988025537a9d4a27b610fd696a18fd9ba9336621a69b4fb40560eeb10c79657f85c92a37f30c7c8fb29c22970eea0b373315795a891f1a05549a6cfe5a6bfe languageName: node linkType: hard @@ -681,17 +683,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.7" +"@babel/plugin-transform-async-generator-functions@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-remap-async-to-generator": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-remap-async-to-generator": "npm:^7.25.0" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6b5e33ae66dce0afce9b06d8dace6fa052528e60f7622aa6cfd3e71bd372ca5079d426e78336ca564bc0d5f37acbcda1b21f4fe656fcb642f1a93a697ab39742 + checksum: 10c0/5348c3a33d16e0d62f13482c6fa432185ba096d58880b08d42450f7db662d6b03e6149d495c8620897dcd3da35061068cbd6c09da7d0ec95743e55a788809e4e languageName: node linkType: hard @@ -719,14 +721,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoping@npm:7.24.7" +"@babel/plugin-transform-block-scoping@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/dcbc5e385c0ca5fb5736b1c720c90755cffe9f91d8c854f82e61e59217dd3f6c91b3633eeee4b55a89d3f59e5275d0f5b0b1b1363d4fa70c49c468b55aa87700 + checksum: 10c0/382931c75a5d0ea560387e76cb57b03461300527e4784efcb2fb62f36c1eb0ab331327b6034def256baa0cad9050925a61f9c0d56261b6afd6a29c3065fb0bd4 languageName: node linkType: hard @@ -755,21 +757,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-classes@npm:7.24.8" +"@babel/plugin-transform-classes@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-classes@npm:7.25.0" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.24.7" "@babel/helper-compilation-targets": "npm:^7.24.8" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-replace-supers": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" + "@babel/helper-replace-supers": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4423da0f747bdb6aab1995d98a74533fa679f637ec20706810dd57fb4ba2b1885ec8cae6a0b2c3f69f27165de6ff6aa2da9c4061c893848736a8267d0c653079 + checksum: 10c0/4451dccf8a7979427ae042afe381233f30764a8072faf0de1337a4fc297c6d7cb40df9e28931ac096e5b56392d0cd97d3ce10aee68288150a8701624d362a791 languageName: node linkType: hard @@ -819,6 +819,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/1c9b57ddd9b33696e88911d0e7975e1573ebc46219c4b30eb1dc746cbb71aedfac6f6dab7fdfdec54dd58f31468bf6ab56b157661ea4ffe58f906d71f89544c8 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" @@ -867,16 +879,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-function-name@npm:7.24.7" +"@babel/plugin-transform-function-name@npm:^7.25.1": + version: 7.25.1 + resolution: "@babel/plugin-transform-function-name@npm:7.25.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3e9642428d6952851850d89ea9307d55946528d18973784d0e2f04a651b23bd9924dd8a2641c824b483bd4ab1223bab1d2f6a1106a939998f7ced512cb60ac5b + checksum: 10c0/e74912174d5e33d1418b840443c2e226a7b76cc017c1ed20ee30a566e4f1794d4a123be03180da046241576e8b692731807ba1f52608922acf1cb2cb6957593f languageName: node linkType: hard @@ -892,14 +904,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-literals@npm:7.24.7" +"@babel/plugin-transform-literals@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/plugin-transform-literals@npm:7.25.2" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9f3f6f3831929cd2a977748c07addf9944d5cccb50bd3a24a58beb54f91f00d6cacd3d7831d13ffe1ad6f8aba0aefd7bca5aec65d63b77f39c62ad1f2d484a3e + checksum: 10c0/0796883217b0885d37e7f6d350773be349e469a812b6bf11ccf862a6edf65103d3e7c849529d65381b441685c12e756751d8c2489a0fd3f8139bb5ef93185f58 languageName: node linkType: hard @@ -951,17 +963,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.7" +"@babel/plugin-transform-modules-systemjs@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0" dependencies: - "@babel/helper-hoist-variables": "npm:^7.24.7" - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.24.8" "@babel/helper-validator-identifier": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e2a795e0a6baafe26f4a74010622212ddd873170742d673f450e0097f8d984f6e6a95eb8ce41b05071ee9790c4be088b33801aaab3f78ee202c567634e52a331 + checksum: 10c0/fca6198da71237e4bb1274b3b67a0c81d56013c9535361242b6bfa87d70a9597854aadb45d4d8203369be4a655e158be2a5d20af0040b1f8d1bfc47db3ad7b68 languageName: node linkType: hard @@ -1352,17 +1364,18 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": - version: 7.24.8 - resolution: "@babel/preset-env@npm:7.24.8" + version: 7.25.3 + resolution: "@babel/preset-env@npm:7.25.3" dependencies: - "@babel/compat-data": "npm:^7.24.8" - "@babel/helper-compilation-targets": "npm:^7.24.8" + "@babel/compat-data": "npm:^7.25.2" + "@babel/helper-compilation-targets": "npm:^7.25.2" "@babel/helper-plugin-utils": "npm:^7.24.8" "@babel/helper-validator-option": "npm:^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.0" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.0" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" @@ -1383,29 +1396,30 @@ __metadata: "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.0" "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" - "@babel/plugin-transform-block-scoping": "npm:^7.24.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.0" "@babel/plugin-transform-class-properties": "npm:^7.24.7" "@babel/plugin-transform-class-static-block": "npm:^7.24.7" - "@babel/plugin-transform-classes": "npm:^7.24.8" + "@babel/plugin-transform-classes": "npm:^7.25.0" "@babel/plugin-transform-computed-properties": "npm:^7.24.7" "@babel/plugin-transform-destructuring": "npm:^7.24.8" "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.0" "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.24.7" + "@babel/plugin-transform-function-name": "npm:^7.25.1" "@babel/plugin-transform-json-strings": "npm:^7.24.7" - "@babel/plugin-transform-literals": "npm:^7.24.7" + "@babel/plugin-transform-literals": "npm:^7.25.2" "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" "@babel/plugin-transform-modules-amd": "npm:^7.24.7" "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" - "@babel/plugin-transform-modules-systemjs": "npm:^7.24.7" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.0" "@babel/plugin-transform-modules-umd": "npm:^7.24.7" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" "@babel/plugin-transform-new-target": "npm:^7.24.7" @@ -1438,7 +1452,7 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a6f29498ec58989845a61f9c10b1b4e80586f1810a33db461d597cdb0ad2cd847381a993038b09f727512a08b2c1a33a330a5d4e6d65463ee98a1b4302d52ec6 + checksum: 10c0/9287dc2e296fe2aa3367d84c2a799db17c9d1e48bba86525f47c6f51f5ba2e2cce454f45f4ae2ef928f9077c0640b04556b55b94835675ceeca94a0c5133205e languageName: node linkType: hard @@ -1503,51 +1517,48 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.24.8 - resolution: "@babel/runtime@npm:7.24.8" + version: 7.25.0 + resolution: "@babel/runtime@npm:7.25.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/f24b30af6b3ecae19165b3b032f9bc37b2d1769677bd63b69a6f81061967cfc847aa822518402ea6616b1d301d7eb46986b99c9f69cdb5880834fca2e6b34881 + checksum: 10c0/bd3faf246170826cef2071a94d7b47b49d532351360ecd17722d03f6713fd93a3eb3dbd9518faa778d5e8ccad7392a7a604e56bd37aaad3f3aa68d619ccd983d languageName: node linkType: hard -"@babel/template@npm:^7.24.7, @babel/template@npm:^7.3.3": - version: 7.24.7 - resolution: "@babel/template@npm:7.24.7" +"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0, @babel/template@npm:^7.3.3": + version: 7.25.0 + resolution: "@babel/template@npm:7.25.0" dependencies: "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/95b0b3ee80fcef685b7f4426f5713a855ea2cd5ac4da829b213f8fb5afe48a2a14683c2ea04d446dbc7f711c33c5cd4a965ef34dcbe5bc387c9e966b67877ae3 + "@babel/parser": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b languageName: node linkType: hard -"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/traverse@npm:7.24.8" +"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3": + version: 7.25.3 + resolution: "@babel/traverse@npm:7.25.3" dependencies: "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.8" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-hoist-variables": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.8" - "@babel/types": "npm:^7.24.8" + "@babel/generator": "npm:^7.25.0" + "@babel/parser": "npm:^7.25.3" + "@babel/template": "npm:^7.25.0" + "@babel/types": "npm:^7.25.2" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/67a5cc35824455cdb54fb9e196a44b3186283e29018a9c2331f51763921e18e891b3c60c283615a27540ec8eb4c8b89f41c237b91f732a7aa518b2eb7a0d434d + checksum: 10c0/4c8a1966fa90b53a783a4afd2fcdaa6ab1a912e6621dca9fcc6633e80ccb9491620e88caf73b537da4e16cefd537b548c87d7087868d5b0066414dea375c0e9b languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.24.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.24.9 - resolution: "@babel/types@npm:7.24.9" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.25.2 + resolution: "@babel/types@npm:7.25.2" dependencies: "@babel/helper-string-parser": "npm:^7.24.8" "@babel/helper-validator-identifier": "npm:^7.24.7" to-fast-properties: "npm:^2.0.0" - checksum: 10c0/4970b3481cab39c5c3fdb7c28c834df5c7049f3c7f43baeafe121bb05270ebf0da7c65b097abf314877f213baa591109c82204f30d66cdd46c22ece4a2f32415 + checksum: 10c0/e489435856be239f8cc1120c90a197e4c2865385121908e5edb7223cfdff3768cba18f489adfe0c26955d9e7bbb1fb10625bc2517505908ceb0af848989bd864 languageName: node linkType: hard @@ -1598,7 +1609,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.6.3, @csstools/css-parser-algorithms@npm:^2.7.1": +"@csstools/css-parser-algorithms@npm:^2.7.1": version: 2.7.1 resolution: "@csstools/css-parser-algorithms@npm:2.7.1" peerDependencies: @@ -1607,14 +1618,14 @@ __metadata: languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.3.1, @csstools/css-tokenizer@npm:^2.4.1": +"@csstools/css-tokenizer@npm:^2.4.1": version: 2.4.1 resolution: "@csstools/css-tokenizer@npm:2.4.1" checksum: 10c0/fe71cee85ec7372da07083d088b6a704f43e5d3d2d8071c4b8a86fae60408b559a218a43f8625bf2f0be5c7f90c8f3ad20a1aae1921119a1c02b51c310cc2b6b languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.11, @csstools/media-query-list-parser@npm:^2.1.13": +"@csstools/media-query-list-parser@npm:^2.1.13": version: 2.1.13 resolution: "@csstools/media-query-list-parser@npm:2.1.13" peerDependencies: @@ -2153,17 +2164,14 @@ __metadata: languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.43.1": - version: 0.43.1 - resolution: "@es-joy/jsdoccomment@npm:0.43.1" +"@es-joy/jsdoccomment@npm:~0.46.0": + version: 0.46.0 + resolution: "@es-joy/jsdoccomment@npm:0.46.0" dependencies: - "@types/eslint": "npm:^8.56.5" - "@types/estree": "npm:^1.0.5" - "@typescript-eslint/types": "npm:^7.2.0" comment-parser: "npm:1.4.1" - esquery: "npm:^1.5.0" + esquery: "npm:^1.6.0" jsdoc-type-pratt-parser: "npm:~4.0.0" - checksum: 10c0/2a4842b0e37eb937d55e3028ab2cd7ece7097e1f8c878bb9e28c3309371844688c2869d25bb949e2664c9ba63e388ea09b769c9f42f77515d328ec40e6fcfed1 + checksum: 10c0/a7a67936ebf6d9aaf74af018c3ac744769af3552b05ad9b88fca96b2ffdca16e724b0ff497f53634ec4cca81e98d8c471b6b6bde0fa5b725af4222ad9a0707f0 languageName: node linkType: hard @@ -2818,7 +2826,6 @@ __metadata: arrow-key-navigation: "npm:^1.2.0" async-mutex: "npm:^0.5.0" atrament: "npm:0.2.4" - autoprefixer: "npm:^10.4.14" axios: "npm:^1.4.0" babel-jest: "npm:^29.5.0" babel-loader: "npm:^8.3.0" @@ -2846,7 +2853,7 @@ __metadata: eslint-plugin-import: "npm:~2.29.0" eslint-plugin-jsdoc: "npm:^48.0.0" eslint-plugin-jsx-a11y: "npm:~6.9.0" - eslint-plugin-promise: "npm:~6.4.0" + eslint-plugin-promise: "npm:~6.6.0" eslint-plugin-react: "npm:^7.33.2" eslint-plugin-react-hooks: "npm:^4.6.0" exif-js: "npm:^2.3.0" @@ -3375,8 +3382,8 @@ __metadata: linkType: hard "@testing-library/dom@npm:^10.2.0": - version: 10.3.1 - resolution: "@testing-library/dom@npm:10.3.1" + version: 10.4.0 + resolution: "@testing-library/dom@npm:10.4.0" dependencies: "@babel/code-frame": "npm:^7.10.4" "@babel/runtime": "npm:^7.12.5" @@ -3386,13 +3393,13 @@ __metadata: dom-accessibility-api: "npm:^0.5.9" lz-string: "npm:^1.5.0" pretty-format: "npm:^27.0.2" - checksum: 10c0/e898475cd4932225c2962bf9f94353d7d88462c8912881af8e9866cee714c967b21badb0895ec8626123759cddc6663bc40300b1d1bf789957a603086eda6329 + checksum: 10c0/0352487720ecd433400671e773df0b84b8268fb3fe8e527cdfd7c11b1365b398b4e0eddba6e7e0c85e8d615f48257753283fccec41f6b986fd6c85f15eb5f84f languageName: node linkType: hard "@testing-library/jest-dom@npm:^6.0.0": - version: 6.4.6 - resolution: "@testing-library/jest-dom@npm:6.4.6" + version: 6.4.8 + resolution: "@testing-library/jest-dom@npm:6.4.8" dependencies: "@adobe/css-tools": "npm:^4.4.0" "@babel/runtime": "npm:^7.9.2" @@ -3402,24 +3409,7 @@ __metadata: dom-accessibility-api: "npm:^0.6.3" lodash: "npm:^4.17.21" redent: "npm:^3.0.0" - peerDependencies: - "@jest/globals": ">= 28" - "@types/bun": "*" - "@types/jest": ">= 28" - jest: ">= 28" - vitest: ">= 0.32" - peerDependenciesMeta: - "@jest/globals": - optional: true - "@types/bun": - optional: true - "@types/jest": - optional: true - jest: - optional: true - vitest: - optional: true - checksum: 10c0/8f369c1d27f8128b3794c6b9af5f5b794a47af4670819756e9f4e7cf69e277b30e8b89c548277a279918f648c85c6c7874f1a867e52edd4edb0629a2cf377daa + checksum: 10c0/8eececcac1ec7728c038b9d9eabfc8b8dcf4dc1e997c959450bff16d946e3344275862b84bfe0e1d1beb3817368e782464816aca47ab5c94f0ebf66db71df55d languageName: node linkType: hard @@ -3558,7 +3548,7 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:7 || 8, @types/eslint@npm:^8.56.5": +"@types/eslint@npm:7 || 8": version: 8.56.10 resolution: "@types/eslint@npm:8.56.10" dependencies: @@ -3568,7 +3558,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": +"@types/estree@npm:*, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d @@ -4145,14 +4135,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^7.0.0": - version: 7.14.1 - resolution: "@typescript-eslint/eslint-plugin@npm:7.14.1" + version: 7.17.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.17.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.14.1" - "@typescript-eslint/type-utils": "npm:7.14.1" - "@typescript-eslint/utils": "npm:7.14.1" - "@typescript-eslint/visitor-keys": "npm:7.14.1" + "@typescript-eslint/scope-manager": "npm:7.17.0" + "@typescript-eslint/type-utils": "npm:7.17.0" + "@typescript-eslint/utils": "npm:7.17.0" + "@typescript-eslint/visitor-keys": "npm:7.17.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -4163,25 +4153,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/7c2b9b98a38d78326b0ff7348fe001203eda10817ca7834a7a01f492ae7c2508469bbafaa933208d6459f8ff6685277685983cf6f6843e556a6ab2aa5c05080c + checksum: 10c0/654d589531ae45b8ca8f3969e785926b2544100a985968d86c828e2a1ff50331250e19c8b4af83a4ba17847a0047479662eb317e4ad94f6279cac03acd5cda5a languageName: node linkType: hard "@typescript-eslint/parser@npm:^7.0.0": - version: 7.14.1 - resolution: "@typescript-eslint/parser@npm:7.14.1" + version: 7.17.0 + resolution: "@typescript-eslint/parser@npm:7.17.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.14.1" - "@typescript-eslint/types": "npm:7.14.1" - "@typescript-eslint/typescript-estree": "npm:7.14.1" - "@typescript-eslint/visitor-keys": "npm:7.14.1" + "@typescript-eslint/scope-manager": "npm:7.17.0" + "@typescript-eslint/types": "npm:7.17.0" + "@typescript-eslint/typescript-estree": "npm:7.17.0" + "@typescript-eslint/visitor-keys": "npm:7.17.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/db3169d4852685cfb27db741c557f58a3e52104bfacc7621beb7c94ec36ac2a08d4e410ac86745db52f482fbfc87e99fa0a26c1d7a10d37a215cce85e1661f0e + checksum: 10c0/0cf6922412517b4c005609b035119ddd2798e1b6e74e1bccd487aa53119d27067cfd89311f00b8e96b2b044a0fb7373418a16552be86079879158b260c397418 languageName: node linkType: hard @@ -4195,22 +4185,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/scope-manager@npm:7.14.1" +"@typescript-eslint/scope-manager@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/scope-manager@npm:7.17.0" dependencies: - "@typescript-eslint/types": "npm:7.14.1" - "@typescript-eslint/visitor-keys": "npm:7.14.1" - checksum: 10c0/f8c05a0d6f8de4cc19b90a4da308817c66e53f36f7ec48f6cc23e93c7399bc418643d8135933aaf5fc013199cbef0e1ea4223f5147db5ca401b239eaf087011e + "@typescript-eslint/types": "npm:7.17.0" + "@typescript-eslint/visitor-keys": "npm:7.17.0" + checksum: 10c0/e1a693e19dc855fe6d04b46c6c205019bfc937eda5f8b255393f8267ebddd282165568336e37b04aab544b155a807784b9c4a92129dfc7c1eef5a9e9fe052685 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/type-utils@npm:7.14.1" +"@typescript-eslint/type-utils@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/type-utils@npm:7.17.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.14.1" - "@typescript-eslint/utils": "npm:7.14.1" + "@typescript-eslint/typescript-estree": "npm:7.17.0" + "@typescript-eslint/utils": "npm:7.17.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependencies: @@ -4218,7 +4208,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/bd1c4a8db6273e24156fb10da2cbeb52b4eb03f819da193d4b6bd5a95db3b5524c6fe00d088308d8855b9ae60a3b82afa3a06e89982a09a8573561da960758fd + checksum: 10c0/b415cf37c0922cded78735c5049cb5a5b0065e1c0ce4a81ca2a26422763ccacca8945efa45480f40530f2ec414a14d35a88a6798258aa889f7a9cf4ca4a240cd languageName: node linkType: hard @@ -4229,10 +4219,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.14.1, @typescript-eslint/types@npm:^7.2.0": - version: 7.14.1 - resolution: "@typescript-eslint/types@npm:7.14.1" - checksum: 10c0/5b7bda83c47a9b386482e63447c6b0ed7bd4e82eb43f11a180c6e2f3d2e7a2828f57bcbed82196ad761c49e363cccf4c81a89f1fc976e9f5f0a79dcc928fa2d2 +"@typescript-eslint/types@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/types@npm:7.17.0" + checksum: 10c0/8f734294d432b37c534f17eb2befdfe43b76874d09118d6adf7e308e5a586e9e11b7021abe4f6692a6e6226de58a15b3cfe1300939556ce1c908d9af627b7400 languageName: node linkType: hard @@ -4255,12 +4245,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/typescript-estree@npm:7.14.1" +"@typescript-eslint/typescript-estree@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.17.0" dependencies: - "@typescript-eslint/types": "npm:7.14.1" - "@typescript-eslint/visitor-keys": "npm:7.14.1" + "@typescript-eslint/types": "npm:7.17.0" + "@typescript-eslint/visitor-keys": "npm:7.17.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -4270,21 +4260,21 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/a8da9bcc4de3334a225424946abd99374de05c42098455419224bc0f46bb1b66115f8bd6ae268461294b90943ed4a407bcd255c0fa60eb76ba4cdc5fc7c20855 + checksum: 10c0/10967823ce00c9f8cd4a8b56bed3524c098e38cc0e27aaa49ffd8fad4e671c00226bf0330ba858948750b88dc55527ebeb62c74be8a30bac18a106d6c033ab59 languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/utils@npm:7.14.1" +"@typescript-eslint/utils@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/utils@npm:7.17.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.14.1" - "@typescript-eslint/types": "npm:7.14.1" - "@typescript-eslint/typescript-estree": "npm:7.14.1" + "@typescript-eslint/scope-manager": "npm:7.17.0" + "@typescript-eslint/types": "npm:7.17.0" + "@typescript-eslint/typescript-estree": "npm:7.17.0" peerDependencies: eslint: ^8.56.0 - checksum: 10c0/c7f635a3c2c6c085e1d51a52088e55cad9d7e1257b1f60378e5eeb6eb0871db027d42747e9ef60a2f557cf9dd68b2ce014d488d795db8f771506290b164b0e5a + checksum: 10c0/1f3e22820b3ab3e47809c45e576614ad4a965f5c8634856eca5c70981386b9351a77fb172ba32345e7c5667479cf9526c673699dd38dccd0616ad6db21704e72 languageName: node linkType: hard @@ -4315,13 +4305,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/visitor-keys@npm:7.14.1" +"@typescript-eslint/visitor-keys@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.17.0" dependencies: - "@typescript-eslint/types": "npm:7.14.1" + "@typescript-eslint/types": "npm:7.17.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/39ac489990fcfdcee442f27658431a0eb44ccf694f701a45df2a108c47cea9582e0955bff0d449047549149385f72895a5d7e6c1622ece1fe32594b7cecb85f3 + checksum: 10c0/fa6b339d51fc3710288bb2ffaa46d639551d77965cc42c36f96c4f43aed663ff12972e8a28652a280f6ce20b7a92dc2aea14b2b4049012799be2fc2d3cbb2c60 languageName: node linkType: hard @@ -4982,18 +4972,6 @@ __metadata: languageName: node linkType: hard -"array.prototype.toreversed@npm:^1.1.2": - version: 1.1.2 - resolution: "array.prototype.toreversed@npm:1.1.2" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/2b7627ea85eae1e80ecce665a500cc0f3355ac83ee4a1a727562c7c2a1d5f1c0b4dd7b65c468ec6867207e452ba01256910a2c0b41486bfdd11acf875a7a3435 - languageName: node - linkType: hard - "array.prototype.tosorted@npm:^1.1.4": version: 1.1.4 resolution: "array.prototype.tosorted@npm:1.1.4" @@ -5149,7 +5127,7 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.14, autoprefixer@npm:^10.4.19": +"autoprefixer@npm:^10.4.19": version: 10.4.19 resolution: "autoprefixer@npm:10.4.19" dependencies: @@ -5184,13 +5162,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.7.2 - resolution: "axios@npm:1.7.2" + version: 1.7.3 + resolution: "axios@npm:1.7.3" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/cbd47ce380fe045313364e740bb03b936420b8b5558c7ea36a4563db1258c658f05e40feb5ddd41f6633fdd96d37ac2a76f884dad599c5b0224b4c451b3fa7ae + checksum: 10c0/a18cbe559203efa05fb1fec2d1898e23bf6329bd2575784ee32aa11b5bbe1d54b9f472c49a261294125519cf62aa4fe5ef6e647bb7482eafc15bffe15ab314ce languageName: node linkType: hard @@ -6969,15 +6947,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:~4.3.4": + version: 4.3.5 + resolution: "debug@npm:4.3.5" dependencies: ms: "npm:2.1.2" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + checksum: 10c0/082c375a2bdc4f4469c99f325ff458adad62a3fc2c482d59923c260cb08152f34e2659f72b3767db8bb2f21ca81a60a42d1019605a412132d7b9f59363a005cc languageName: node linkType: hard @@ -7958,22 +7936,22 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^48.0.0": - version: 48.5.0 - resolution: "eslint-plugin-jsdoc@npm:48.5.0" + version: 48.8.3 + resolution: "eslint-plugin-jsdoc@npm:48.8.3" dependencies: - "@es-joy/jsdoccomment": "npm:~0.43.1" + "@es-joy/jsdoccomment": "npm:~0.46.0" are-docs-informative: "npm:^0.0.2" comment-parser: "npm:1.4.1" - debug: "npm:^4.3.4" + debug: "npm:^4.3.5" escape-string-regexp: "npm:^4.0.0" - esquery: "npm:^1.5.0" - parse-imports: "npm:^2.1.0" - semver: "npm:^7.6.2" + esquery: "npm:^1.6.0" + parse-imports: "npm:^2.1.1" + semver: "npm:^7.6.3" spdx-expression-parse: "npm:^4.0.0" - synckit: "npm:^0.9.0" + synckit: "npm:^0.9.1" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/1c5eb83df06cb228e44ad2c9da5b31987347a45b99d9e7a68957d178487a81603ad3c4c7db1ecba7e8a62d7ae20d9de1aec18a8cf2aa0e9169731cec54f78ab7 + checksum: 10c0/78d893614b188617de5a03d8163406455e3b739fd7b86192eb05a29cf8e7f06909a6f6a1b9dc2acd31e5ae2bccd94600eaea247d277f58c3c946c0fdb36a57f7 languageName: node linkType: hard @@ -8003,12 +7981,12 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-promise@npm:~6.4.0": - version: 6.4.0 - resolution: "eslint-plugin-promise@npm:6.4.0" +"eslint-plugin-promise@npm:~6.6.0": + version: 6.6.0 + resolution: "eslint-plugin-promise@npm:6.6.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/5d07be976504f92d1d91756b0b0588a4c65e379af2520dd77c8655203085c0ab43e24d4698d1ac4b50926430cd8eb81cd1cc4c3653aae8386c805577bdf57b6c + checksum: 10c0/93a667dbc9ff15c4d586b0d40a31c7828314cbbb31b2b9a75802aa4ef536e9457bb3e1a89b384b07aa336dd61b315ae8b0aadc0870210378023dd018819b59b3 languageName: node linkType: hard @@ -8022,30 +8000,30 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.33.2": - version: 7.34.3 - resolution: "eslint-plugin-react@npm:7.34.3" + version: 7.35.0 + resolution: "eslint-plugin-react@npm:7.35.0" dependencies: array-includes: "npm:^3.1.8" array.prototype.findlast: "npm:^1.2.5" array.prototype.flatmap: "npm:^1.3.2" - array.prototype.toreversed: "npm:^1.1.2" array.prototype.tosorted: "npm:^1.1.4" doctrine: "npm:^2.1.0" es-iterator-helpers: "npm:^1.0.19" estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" minimatch: "npm:^3.1.2" object.entries: "npm:^1.1.8" object.fromentries: "npm:^2.0.8" - object.hasown: "npm:^1.1.4" object.values: "npm:^1.2.0" prop-types: "npm:^15.8.1" resolve: "npm:^2.0.0-next.5" semver: "npm:^6.3.1" string.prototype.matchall: "npm:^4.0.11" + string.prototype.repeat: "npm:^1.0.0" peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/60717e32c9948e2b4ddc53dac7c4b62c68fc7129c3249079191c941c08ebe7d1f4793d65182922d19427c2a6634e05231a7b74ceee34169afdfd0e43d4a43d26 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10c0/eedcc33de4b2cda91d56ae517a4f771a0c76da9c1e26c95543969012871381e11d4d6cffdf6fa8423036585c289eb3500f3f93fb1d314fb2624e0aa1e463305e languageName: node linkType: hard @@ -8145,12 +8123,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2, esquery@npm:^1.5.0": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.4.2, esquery@npm:^1.6.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 languageName: node linkType: hard @@ -9567,11 +9545,11 @@ __metadata: linkType: hard "husky@npm:^9.0.11": - version: 9.0.11 - resolution: "husky@npm:9.0.11" + version: 9.1.3 + resolution: "husky@npm:9.1.3" bin: - husky: bin.mjs - checksum: 10c0/2c787dcf74a837fc9a4fea7da907509d4bd9a289f4ea10ecc9d86279e4d4542b0f5f6443a619bccae19e265f2677172cc2b86aae5c932a35a330cc227d914605 + husky: bin.js + checksum: 10c0/3fb8657ff97f529dab0b9a0afa6b818ec604f60c39abc13e8e3f4263ea30a3aa6fff7a1b625b8a53700899ce0ea2f5f656981c46b8f1837cfd84ddb6da883fb2 languageName: node linkType: hard @@ -11338,10 +11316,10 @@ __metadata: languageName: node linkType: hard -"known-css-properties@npm:^0.31.0": - version: 0.31.0 - resolution: "known-css-properties@npm:0.31.0" - checksum: 10c0/8e643cbed32d7733278ba215c43dfc38fc7e77d391f66b81f07228af97d69ce2cebba03a9bc1ac859479e162aea812e258b30f4c93cb7b7adfd0622a141d36da +"known-css-properties@npm:^0.34.0": + version: 0.34.0 + resolution: "known-css-properties@npm:0.34.0" + checksum: 10c0/8549969f02b1858554e89faf4548ece37625d0d21b42e8d54fa53184e68e1512ef2531bb15941575ad816361ab7447b598c1b18c1b96ce0a868333d1a68f2e2c languageName: node linkType: hard @@ -12559,17 +12537,6 @@ __metadata: languageName: node linkType: hard -"object.hasown@npm:^1.1.4": - version: 1.1.4 - resolution: "object.hasown@npm:1.1.4" - dependencies: - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/f23187b08d874ef1aea060118c8259eb7f99f93c15a50771d710569534119062b90e087b92952b2d0fb1bb8914d61fb0b43c57fb06f622aaad538fe6868ab987 - languageName: node - linkType: hard - "object.pick@npm:^1.3.0": version: 1.3.0 resolution: "object.pick@npm:1.3.0" @@ -12815,13 +12782,13 @@ __metadata: languageName: node linkType: hard -"parse-imports@npm:^2.1.0": - version: 2.1.0 - resolution: "parse-imports@npm:2.1.0" +"parse-imports@npm:^2.1.1": + version: 2.1.1 + resolution: "parse-imports@npm:2.1.1" dependencies: es-module-lexer: "npm:^1.5.3" slashes: "npm:^3.0.12" - checksum: 10c0/18ef58008868d2d09e472bb540d63efc7cc27f2c33607e5d09c256ece7a30062cac292bda96d820438e94f3dbf558c85e4b084c10d238baa858796794e6cf628 + checksum: 10c0/c9bb0b4e1823f84f034d2d7bd2b37415b1715a5c963fda14968c706186b48b02c10e97d04bce042b9dcd679b42f29c391ea120799ddf581c7f54786edd99e3a9 languageName: node linkType: hard @@ -13190,8 +13157,8 @@ __metadata: linkType: hard "pino-pretty@npm:^11.0.0": - version: 11.2.1 - resolution: "pino-pretty@npm:11.2.1" + version: 11.2.2 + resolution: "pino-pretty@npm:11.2.2" dependencies: colorette: "npm:^2.0.7" dateformat: "npm:^4.6.3" @@ -13209,7 +13176,7 @@ __metadata: strip-json-comments: "npm:^3.1.1" bin: pino-pretty: bin.js - checksum: 10c0/6c7f15b5bf8a007c8b7157eae445675b13cd95097ffa512d5ebd661f9e7abd328fa27592b25708756a09f098f87cb03ca81837518cd725c16e3f801129b941d4 + checksum: 10c0/3ce1769907886a5584f6c8123d9bc987712ad10a375797733a0fe95a238df587dac8e2b709bab291c4e30d41b0cf65808c708c96f8eb98b2778b6df60afa7e66 languageName: node linkType: hard @@ -13221,15 +13188,15 @@ __metadata: linkType: hard "pino@npm:^9.0.0": - version: 9.3.1 - resolution: "pino@npm:9.3.1" + version: 9.3.2 + resolution: "pino@npm:9.3.2" dependencies: atomic-sleep: "npm:^1.0.0" fast-redact: "npm:^3.1.1" on-exit-leak-free: "npm:^2.1.0" pino-abstract-transport: "npm:^1.2.0" pino-std-serializers: "npm:^7.0.0" - process-warning: "npm:^3.0.0" + process-warning: "npm:^4.0.0" quick-format-unescaped: "npm:^4.0.3" real-require: "npm:^0.2.0" safe-stable-stringify: "npm:^2.3.1" @@ -13237,7 +13204,7 @@ __metadata: thread-stream: "npm:^3.0.0" bin: pino: bin.js - checksum: 10c0/ab1e81b3e5a91852136d80a592939883eeb81442e5d3a2c070bdbdeb47c5aaa297ead246530b10eb6d5ff59445f4645d1333d342f255d9f002f73aea843e74ee + checksum: 10c0/698eb2ebfcc4252da9d035fcf9c999bf27615b66ebc47f9b3d7e942750e50ebe38429e6457abcf8014d70125964ddf114e696cb8225b480d9930271708e3fb52 languageName: node linkType: hard @@ -14068,14 +14035,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.38": - version: 8.4.39 - resolution: "postcss@npm:8.4.39" +"postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.39": + version: 8.4.40 + resolution: "postcss@npm:8.4.40" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.1" source-map-js: "npm:^1.2.0" - checksum: 10c0/16f5ac3c4e32ee76d1582b3c0dcf1a1fdb91334a45ad755eeb881ccc50318fb8d64047de4f1601ac96e30061df203f0f2e2edbdc0bfc49b9c57bc9fb9bedaea3 + checksum: 10c0/65ed67573e5443beaeb582282ff27a6be7c7fe3b4d9fa15761157616f2b97510cb1c335023c26220b005909f007337026d6e3ff092f25010b484ad484e80ea7f languageName: node linkType: hard @@ -14212,6 +14179,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^4.0.0": + version: 4.0.0 + resolution: "process-warning@npm:4.0.0" + checksum: 10c0/5312a72b69d37a1b82ad03f3dfa0090dab3804a8fd995d06c28e3c002852bd82f5584217d9f4a3f197892bb2afc22d57e2c662c7e906b5abb48c0380c7b0880d + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -15608,12 +15582,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2": - version: 7.6.2 - resolution: "semver@npm:7.6.2" +"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf languageName: node linkType: hard @@ -16399,6 +16373,16 @@ __metadata: languageName: node linkType: hard +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" + dependencies: + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.9": version: 1.2.9 resolution: "string.prototype.trim@npm:1.2.9" @@ -16646,12 +16630,12 @@ __metadata: linkType: hard "stylelint@npm:^16.0.2": - version: 16.6.1 - resolution: "stylelint@npm:16.6.1" + version: 16.7.0 + resolution: "stylelint@npm:16.7.0" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.6.3" - "@csstools/css-tokenizer": "npm:^2.3.1" - "@csstools/media-query-list-parser": "npm:^2.1.11" + "@csstools/css-parser-algorithms": "npm:^2.7.1" + "@csstools/css-tokenizer": "npm:^2.4.1" + "@csstools/media-query-list-parser": "npm:^2.1.13" "@csstools/selector-specificity": "npm:^3.1.1" "@dual-bundle/import-meta-resolve": "npm:^4.1.0" balanced-match: "npm:^2.0.0" @@ -16659,7 +16643,7 @@ __metadata: cosmiconfig: "npm:^9.0.0" css-functions-list: "npm:^3.2.2" css-tree: "npm:^2.3.1" - debug: "npm:^4.3.4" + debug: "npm:^4.3.5" fast-glob: "npm:^3.3.2" fastest-levenshtein: "npm:^1.0.16" file-entry-cache: "npm:^9.0.0" @@ -16670,13 +16654,13 @@ __metadata: ignore: "npm:^5.3.1" imurmurhash: "npm:^0.1.4" is-plain-object: "npm:^5.0.0" - known-css-properties: "npm:^0.31.0" + known-css-properties: "npm:^0.34.0" mathml-tag-names: "npm:^2.1.3" meow: "npm:^13.2.0" micromatch: "npm:^4.0.7" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.0.1" - postcss: "npm:^8.4.38" + postcss: "npm:^8.4.39" postcss-resolve-nested-selector: "npm:^0.1.1" postcss-safe-parser: "npm:^7.0.0" postcss-selector-parser: "npm:^6.1.0" @@ -16690,7 +16674,7 @@ __metadata: write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/8dc9b0024d6fb109380a142171ab8a134c3863aa8b8736f0083310a0d05f173dcda5680f29267697dfa0aaeb2f08aef4ef113e4bb4f8582fcfdd97f35be51d71 + checksum: 10c0/98cb36037684433d991a0c507bbf8155309e96470177487f493e66de098631e5303b235470fc5c8086cd98013385b669c4e3cb68ad01421b898e1da6848e5d78 languageName: node linkType: hard @@ -16822,13 +16806,13 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.9.0": - version: 0.9.0 - resolution: "synckit@npm:0.9.0" +"synckit@npm:^0.9.1": + version: 0.9.1 + resolution: "synckit@npm:0.9.1" dependencies: "@pkgr/core": "npm:^0.1.0" tslib: "npm:^2.6.2" - checksum: 10c0/b5c1e7c03fefe3d36a9ab4e71dd21859cb32be4138712c31a893382a568fd00efc59ede8f521dd7e53d43a2fea92bdf717e987ea9ed6ad94f97ef28d71d0ba2f + checksum: 10c0/d8b89e1bf30ba3ffb469d8418c836ad9c0c062bf47028406b4d06548bc66af97155ea2303b96c93bf5c7c0f0d66153a6fbd6924c76521b434e6a9898982abc2e languageName: node linkType: hard @@ -17315,22 +17299,22 @@ __metadata: linkType: hard "typescript@npm:5, typescript@npm:^5.0.4": - version: 5.5.3 - resolution: "typescript@npm:5.5.3" + version: 5.5.4 + resolution: "typescript@npm:5.5.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/f52c71ccbc7080b034b9d3b72051d563601a4815bf3e39ded188e6ce60813f75dbedf11ad15dd4d32a12996a9ed8c7155b46c93a9b9c9bad1049766fe614bbdd + checksum: 10c0/422be60f89e661eab29ac488c974b6cc0a660fb2228003b297c3d10c32c90f3bcffc1009b43876a082515a3c376b1eefcce823d6e78982e6878408b9a923199c languageName: node linkType: hard "typescript@patch:typescript@npm%3A5#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": - version: 5.5.3 - resolution: "typescript@patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=379a07" + version: 5.5.4 + resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/911c7811d61f57f07df79c4a35f56a0f426a65426a020e5fcd792f66559f399017205f5f10255329ab5a3d8c2d1f1d19530aeceffda70758a521fae1d469432e + checksum: 10c0/73409d7b9196a5a1217b3aaad929bf76294d3ce7d6e9766dd880ece296ee91cf7d7db6b16c6c6c630ee5096eccde726c0ef17c7dfa52b01a243e57ae1f09ef07 languageName: node linkType: hard @@ -17569,11 +17553,11 @@ __metadata: linkType: hard "use-debounce@npm:^10.0.0": - version: 10.0.1 - resolution: "use-debounce@npm:10.0.1" + version: 10.0.2 + resolution: "use-debounce@npm:10.0.2" peerDependencies: react: ">=16.8.0" - checksum: 10c0/377a11814a708f5c392f465cbbe2d119a8a2635c8226cc5e30eba397c4436f8e8234385d069467b369d105ed0d3be733c6a08d8ae1004017c6d6f58f4d4c24d8 + checksum: 10c0/2d992108557a0ad3e59bc35028c0dbc6ad12088a08d992fd52aad3881dd24663606fe71f7fd925327fb98599c6252bfa4c143649351d48e6243d7a3332594fd6 languageName: node linkType: hard