diff --git a/.github/workflows/build-security.yml b/.github/workflows/build-security.yml index 1e2455d3d9..d3cb4e5e0a 100644 --- a/.github/workflows/build-security.yml +++ b/.github/workflows/build-security.yml @@ -24,8 +24,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true cache: false push_to_images: | tootsuite/mastodon @@ -46,8 +44,6 @@ jobs: uses: ./.github/workflows/build-container-image.yml with: file_to_build: streaming/Dockerfile - platforms: linux/amd64,linux/arm64 - use_native_arm64_builder: true cache: false push_to_images: | tootsuite/mastodon-streaming diff --git a/.github/workflows/test-migrations.yml b/.github/workflows/test-migrations.yml index 2e7123cd7e..6f1eeed1d4 100644 --- a/.github/workflows/test-migrations.yml +++ b/.github/workflows/test-migrations.yml @@ -67,7 +67,6 @@ jobs: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres - DISABLE_SIMPLECOV: true RAILS_ENV: test BUNDLE_CLEAN: true BUNDLE_FROZEN: true diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index d52896f13c..fd4c666059 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -110,7 +110,7 @@ jobs: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres - DISABLE_SIMPLECOV: ${{ matrix.ruby-version != '.ruby-version' }} + COVERAGE: ${{ matrix.ruby-version == '.ruby-version' }} RAILS_ENV: test ALLOW_NOPAM: true PAM_ENABLED: true @@ -212,7 +212,7 @@ jobs: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres - DISABLE_SIMPLECOV: ${{ matrix.ruby-version != '.ruby-version' }} + COVERAGE: ${{ matrix.ruby-version == '.ruby-version' }} RAILS_ENV: test ALLOW_NOPAM: true PAM_ENABLED: true @@ -299,7 +299,6 @@ jobs: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres - DISABLE_SIMPLECOV: true RAILS_ENV: test BUNDLE_WITH: test ES_ENABLED: false @@ -416,7 +415,6 @@ jobs: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres - DISABLE_SIMPLECOV: true RAILS_ENV: test BUNDLE_WITH: test ES_ENABLED: true diff --git a/Gemfile b/Gemfile index 89648e8cac..4b702260d4 100644 --- a/Gemfile +++ b/Gemfile @@ -116,7 +116,7 @@ group :opentelemetry do gem 'opentelemetry-instrumentation-net_http', '~> 0.23.0', require: false gem 'opentelemetry-instrumentation-pg', '~> 0.30.0', require: false gem 'opentelemetry-instrumentation-rack', '~> 0.26.0', require: false - gem 'opentelemetry-instrumentation-rails', '~> 0.35.0', require: false + gem 'opentelemetry-instrumentation-rails', '~> 0.36.0', require: false gem 'opentelemetry-instrumentation-redis', '~> 0.26.0', require: false gem 'opentelemetry-instrumentation-sidekiq', '~> 0.26.0', require: false gem 'opentelemetry-sdk', '~> 1.4', require: false @@ -156,7 +156,7 @@ group :test do gem 'shoulda-matchers' - # Coverage formatter for RSpec test if DISABLE_SIMPLECOV is false + # Coverage formatter for RSpec gem 'simplecov', '~> 0.22', require: false gem 'simplecov-lcov', '~> 0.8', require: false @@ -174,7 +174,7 @@ group :development do gem 'rubocop-rspec_rails', require: false # Annotates modules with schema - gem 'annotaterb', '~> 4.13' + gem 'annotaterb', '~> 4.13', require: false # Enhanced error message pages for development gem 'better_errors', '~> 2.9' @@ -197,7 +197,7 @@ end group :development, :test do # Interactive Debugging tools - gem 'debug', '~> 1.8' + gem 'debug', '~> 1.8', require: false # Generate fake data values gem 'faker', '~> 3.2' @@ -209,7 +209,7 @@ group :development, :test do gem 'memory_profiler', require: false gem 'ruby-prof', require: false gem 'stackprof', require: false - gem 'test-prof' + gem 'test-prof', require: false # RSpec runner for rails gem 'rspec-rails', '~> 7.0' diff --git a/Gemfile.lock b/Gemfile.lock index 8547e4fba1..9d0928354b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -220,7 +220,7 @@ GEM erubi (1.13.1) et-orbi (1.2.11) tzinfo - excon (0.112.0) + excon (1.2.3) fabrication (2.31.0) faker (3.5.1) i18n (>= 1.8.11, < 2) @@ -244,15 +244,15 @@ GEM flatware-rspec (2.3.4) flatware (= 2.3.4) rspec (>= 3.6) - fog-core (2.5.0) + fog-core (2.6.0) builder - excon (~> 0.71) + excon (~> 1.0) formatador (>= 0.2, < 2.0) mime-types fog-json (1.2.0) fog-core multi_json (~> 1.10) - fog-openstack (1.1.3) + fog-openstack (1.1.4) fog-core (~> 2.1) fog-json (>= 1.0) formatador (1.1.0) @@ -273,7 +273,7 @@ GEM activesupport (>= 5.1) haml (>= 4.0.6) railties (>= 5.1) - haml_lint (0.59.0) + haml_lint (0.60.0) haml (>= 5.0) parallel (~> 1.10) rainbow @@ -350,7 +350,7 @@ GEM addressable (~> 2.8) bigdecimal (~> 3.1) jsonapi-renderer (0.2.2) - jwt (2.9.3) + jwt (2.10.1) base64 kaminari (1.2.2) activesupport (>= 4.1.0) @@ -407,7 +407,7 @@ GEM mime-types (3.6.0) logger mime-types-data (~> 3.2015) - mime-types-data (3.2025.0107) + mime-types-data (3.2025.0204) mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.4) @@ -461,7 +461,7 @@ GEM validate_email validate_url webfinger (~> 1.2) - openssl (3.2.1) + openssl (3.3.0) openssl-signature_algorithm (1.3.0) openssl (> 2.0) opentelemetry-api (1.4.0) @@ -480,7 +480,7 @@ GEM opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.7) opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-action_pack (0.11.0) + opentelemetry-instrumentation-action_pack (0.12.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-rack (~> 0.21) @@ -498,6 +498,10 @@ GEM opentelemetry-instrumentation-active_record (0.9.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-active_storage (0.1.0) + opentelemetry-api (~> 1.4.0) + opentelemetry-instrumentation-active_support (~> 0.7) + opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-active_support (0.8.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) @@ -530,17 +534,18 @@ GEM opentelemetry-instrumentation-rack (0.26.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-rails (0.35.1) + opentelemetry-instrumentation-rails (0.36.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-action_mailer (~> 0.4.0) - opentelemetry-instrumentation-action_pack (~> 0.11.0) + opentelemetry-instrumentation-action_pack (~> 0.12.0) opentelemetry-instrumentation-action_view (~> 0.9.0) opentelemetry-instrumentation-active_job (~> 0.8.0) opentelemetry-instrumentation-active_record (~> 0.9.0) + opentelemetry-instrumentation-active_storage (~> 0.1.0) opentelemetry-instrumentation-active_support (~> 0.8.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0) - opentelemetry-instrumentation-redis (0.26.0) + opentelemetry-instrumentation-redis (0.26.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-sidekiq (0.26.0) @@ -548,7 +553,7 @@ GEM opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-registry (0.3.1) opentelemetry-api (~> 1.1) - opentelemetry-sdk (1.6.0) + opentelemetry-sdk (1.7.0) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-registry (~> 0.2) @@ -591,7 +596,7 @@ GEM date stringio public_suffix (6.0.1) - puma (6.5.0) + puma (6.6.0) nio4r (~> 2.0) pundit (2.4.0) activesupport (>= 3.0.0) @@ -692,7 +697,7 @@ GEM rspec-core (~> 3.13.0) rspec-expectations (~> 3.13.0) rspec-mocks (~> 3.13.0) - rspec-core (3.13.2) + rspec-core (3.13.3) rspec-support (~> 3.13.0) rspec-expectations (3.13.3) diff-lcs (>= 1.2.0, < 2.0) @@ -702,7 +707,7 @@ GEM rspec-mocks (3.13.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (7.1.0) + rspec-rails (7.1.1) actionpack (>= 7.0) activesupport (>= 7.0) railties (>= 7.0) @@ -716,14 +721,14 @@ GEM rspec-mocks (~> 3.0) sidekiq (>= 5, < 8) rspec-support (3.13.2) - rubocop (1.71.0) + rubocop (1.71.2) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.36.2, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) rubocop-ast (1.38.0) @@ -748,7 +753,7 @@ GEM ruby-saml (1.17.0) nokogiri (>= 1.13.10) rexml - ruby-vips (2.2.2) + ruby-vips (2.2.3) ffi (~> 1.12) logger rubyzip (2.4.1) @@ -763,7 +768,7 @@ GEM activerecord (>= 4.0.0) railties (>= 4.0.0) securerandom (0.4.1) - selenium-webdriver (4.28.0) + selenium-webdriver (4.27.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) @@ -804,8 +809,8 @@ GEM stoplight (4.1.0) redlock (~> 1.0) stringio (3.1.2) - strong_migrations (2.1.0) - activerecord (>= 6.1) + strong_migrations (2.2.0) + activerecord (>= 7) swd (1.3.0) activesupport (>= 3) attr_required (>= 0.0.5) @@ -818,9 +823,9 @@ GEM climate_control test-prof (1.4.4) thor (1.3.2) - tilt (2.5.0) + tilt (2.6.0) timeout (0.4.3) - tpm-key_attestation (0.12.1) + tpm-key_attestation (0.14.0) bindata (~> 2.4) openssl (> 2.0) openssl-signature_algorithm (~> 1.0) @@ -855,18 +860,18 @@ GEM public_suffix warden (1.2.9) rack (>= 2.0.9) - webauthn (3.2.2) + webauthn (3.3.0) android_key_attestation (~> 0.3.0) bindata (~> 2.4) cbor (~> 0.5.9) cose (~> 1.1) openssl (>= 2.2) safety_net_attestation (~> 0.4.0) - tpm-key_attestation (~> 0.12.0) + tpm-key_attestation (~> 0.14.0) webfinger (1.2.0) activesupport httpclient (>= 2.4) - webmock (3.24.0) + webmock (3.25.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -977,7 +982,7 @@ DEPENDENCIES opentelemetry-instrumentation-net_http (~> 0.23.0) opentelemetry-instrumentation-pg (~> 0.30.0) opentelemetry-instrumentation-rack (~> 0.26.0) - opentelemetry-instrumentation-rails (~> 0.35.0) + opentelemetry-instrumentation-rails (~> 0.36.0) opentelemetry-instrumentation-redis (~> 0.26.0) opentelemetry-instrumentation-sidekiq (~> 0.26.0) opentelemetry-sdk (~> 1.4) diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index 3dca3a9614..14338dd293 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -7,17 +7,12 @@ module Admin layout 'admin' - before_action :set_cache_headers before_action :set_referrer_policy_header after_action :verify_authorized private - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end - def set_referrer_policy_header response.headers['Referrer-Policy'] = 'same-origin' end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index 34c7599553..6e34b6b627 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -12,7 +12,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :set_sessions, only: [:edit, :update] before_action :set_strikes, only: [:edit, :update] before_action :require_not_suspended!, only: [:update] - before_action :set_cache_headers, only: [:edit, :update] before_action :set_rules, only: :new before_action :require_rules_acceptance!, only: :new before_action :set_registration_form_time, only: :new @@ -139,10 +138,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController set_locale { render :rules } end - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end - def is_flashing_format? # rubocop:disable Naming/PredicateName if params[:action] == 'create' false # Disable flash messages for sign-up diff --git a/app/controllers/disputes/base_controller.rb b/app/controllers/disputes/base_controller.rb index dd24a1b740..07677fd3f3 100644 --- a/app/controllers/disputes/base_controller.rb +++ b/app/controllers/disputes/base_controller.rb @@ -8,11 +8,4 @@ class Disputes::BaseController < ApplicationController skip_before_action :require_functional! before_action :authenticate_user! - before_action :set_cache_headers - - private - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/filters/statuses_controller.rb b/app/controllers/filters/statuses_controller.rb index ca5205d042..d85b017aaa 100644 --- a/app/controllers/filters/statuses_controller.rb +++ b/app/controllers/filters/statuses_controller.rb @@ -6,7 +6,6 @@ class Filters::StatusesController < ApplicationController before_action :authenticate_user! before_action :set_filter before_action :set_status_filters - before_action :set_cache_headers PER_PAGE = 20 @@ -40,8 +39,4 @@ class Filters::StatusesController < ApplicationController def action_from_button 'remove' if params[:remove] end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb index 6390e1ef10..20b8135908 100644 --- a/app/controllers/filters_controller.rb +++ b/app/controllers/filters_controller.rb @@ -5,7 +5,6 @@ class FiltersController < ApplicationController before_action :authenticate_user! before_action :set_filter, only: [:edit, :update, :destroy] - before_action :set_cache_headers def index @filters = current_account.custom_filters.includes(:keywords, :statuses).order(:phrase) @@ -50,8 +49,4 @@ class FiltersController < ApplicationController def resource_params params.expect(custom_filter: [:title, :expires_in, :filter_action, :exclude_follows, :exclude_localusers, :exclude_quote, :exclude_profile, context: [], keywords_attributes: [[:id, :keyword, :whole_word, :_destroy]]]) end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index c4c52cce11..fc65333ac4 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -6,7 +6,6 @@ class InvitesController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_cache_headers def index authorize :invite, :create? @@ -45,8 +44,4 @@ class InvitesController < ApplicationController def resource_params params.expect(invite: [:max_uses, :expires_in, :autofollow, :comment]) end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb index 66e774425d..deafedeaef 100644 --- a/app/controllers/oauth/authorizations_controller.rb +++ b/app/controllers/oauth/authorizations_controller.rb @@ -5,7 +5,6 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController before_action :store_current_location before_action :authenticate_resource_owner! - before_action :set_cache_headers content_security_policy do |p| p.form_action(false) @@ -32,8 +31,4 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController def truthy_param?(key) ActiveModel::Type::Boolean.new.cast(params[key]) end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 9e541e5e3c..8b11a519ea 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -6,7 +6,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio before_action :store_current_location before_action :authenticate_resource_owner! before_action :require_not_suspended!, only: :destroy - before_action :set_cache_headers before_action :set_last_used_at_by_app, only: :index, unless: -> { request.format == :json } @@ -30,10 +29,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio forbidden if current_account.unavailable? end - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end - def set_last_used_at_by_app @last_used_at_by_app = current_resource_owner.applications_last_used end diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb index 43105d70c8..7e793fc734 100644 --- a/app/controllers/relationships_controller.rb +++ b/app/controllers/relationships_controller.rb @@ -6,7 +6,6 @@ class RelationshipsController < ApplicationController before_action :authenticate_user! before_action :set_accounts, only: :show before_action :set_relationships, only: :show - before_action :set_cache_headers helper_method :following_relationship?, :followed_by_relationship?, :mutual_relationship? @@ -66,8 +65,4 @@ class RelationshipsController < ApplicationController 'remove_domains_from_followers' end end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/settings/applications_controller.rb b/app/controllers/settings/applications_controller.rb index 9785a1b90f..8e39741f89 100644 --- a/app/controllers/settings/applications_controller.rb +++ b/app/controllers/settings/applications_controller.rb @@ -2,7 +2,6 @@ class Settings::ApplicationsController < Settings::BaseController before_action :set_application, only: [:show, :update, :destroy, :regenerate] - before_action :prepare_scopes, only: [:create, :update] def index @applications = current_user.applications.order(id: :desc).page(params[:page]) @@ -60,12 +59,6 @@ class Settings::ApplicationsController < Settings::BaseController end def application_params - params - .expect(doorkeeper_application: [:name, :redirect_uri, :scopes, :website]) - end - - def prepare_scopes - scopes = application_params.fetch(:doorkeeper_application, {}).fetch(:scopes, nil) - params[:doorkeeper_application][:scopes] = scopes.join(' ') if scopes.is_a? Array + params.expect(doorkeeper_application: [:name, :redirect_uri, :website, scopes: []]) end end diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb index 188334ac23..7f2279aa8f 100644 --- a/app/controllers/settings/base_controller.rb +++ b/app/controllers/settings/base_controller.rb @@ -4,14 +4,9 @@ class Settings::BaseController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_cache_headers private - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end - def require_not_suspended! forbidden if current_account.unavailable? end diff --git a/app/controllers/severed_relationships_controller.rb b/app/controllers/severed_relationships_controller.rb index 965753a26f..817abebf62 100644 --- a/app/controllers/severed_relationships_controller.rb +++ b/app/controllers/severed_relationships_controller.rb @@ -4,7 +4,6 @@ class SeveredRelationshipsController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_cache_headers before_action :set_event, only: [:following, :followers] @@ -49,8 +48,4 @@ class SeveredRelationshipsController < ApplicationController def acct(account) account.local? ? account.local_username_and_domain : account.acct end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/controllers/statuses_cleanup_controller.rb b/app/controllers/statuses_cleanup_controller.rb index 583254ec27..a25e544392 100644 --- a/app/controllers/statuses_cleanup_controller.rb +++ b/app/controllers/statuses_cleanup_controller.rb @@ -5,7 +5,6 @@ class StatusesCleanupController < ApplicationController before_action :authenticate_user! before_action :set_policy - before_action :set_cache_headers def show; end @@ -30,8 +29,4 @@ class StatusesCleanupController < ApplicationController def resource_params params.expect(account_statuses_cleanup_policy: [:enabled, :min_status_age, :keep_direct, :keep_pinned, :keep_polls, :keep_media, :keep_self_fav, :keep_self_bookmark, :keep_self_emoji, :min_favs, :min_reblogs, :min_emojis]) end - - def set_cache_headers - response.cache_control.replace(private: true, no_store: true) - end end diff --git a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js index 022c9baaf7..35804de82a 100644 --- a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js +++ b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js @@ -22,23 +22,23 @@ describe('emoji', () => { it('does unicode', () => { expect(emojify('\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66')).toEqual( - '👩‍👩‍👦‍👦'); + '👩‍👩‍👦‍👦'); expect(emojify('👨‍👩‍👧‍👧')).toEqual( - '👨‍👩‍👧‍👧'); - expect(emojify('👩‍👩‍👦')).toEqual('👩‍👩‍👦'); + '👨‍👩‍👧‍👧'); + expect(emojify('👩‍👩‍👦')).toEqual('👩‍👩‍👦'); expect(emojify('\u2757')).toEqual( - '❗'); + '❗'); }); it('does multiple unicode', () => { expect(emojify('\u2757 #\uFE0F\u20E3')).toEqual( - '❗ #️⃣'); + '❗ #️⃣'); expect(emojify('\u2757#\uFE0F\u20E3')).toEqual( - '❗#️⃣'); + '❗#️⃣'); expect(emojify('\u2757 #\uFE0F\u20E3 \u2757')).toEqual( - '❗ #️⃣ ❗'); + '❗ #️⃣ ❗'); expect(emojify('foo \u2757 #\uFE0F\u20E3 bar')).toEqual( - 'foo ❗ #️⃣ bar'); + 'foo ❗ #️⃣ bar'); }); it('ignores unicode inside of tags', () => { @@ -46,16 +46,16 @@ describe('emoji', () => { }); it('does multiple emoji properly (issue 5188)', () => { - expect(emojify('👌🌈💕')).toEqual('👌🌈💕'); - expect(emojify('👌 🌈 💕')).toEqual('👌 🌈 💕'); + expect(emojify('👌🌈💕')).toEqual('👌🌈💕'); + expect(emojify('👌 🌈 💕')).toEqual('👌 🌈 💕'); }); it('does an emoji that has no shortcode', () => { - expect(emojify('👁‍🗨')).toEqual('👁‍🗨'); + expect(emojify('👁‍🗨')).toEqual('👁‍🗨'); }); it('does an emoji whose filename is irregular', () => { - expect(emojify('↙️')).toEqual('↙️'); + expect(emojify('↙️')).toEqual('↙️'); }); it('avoid emojifying on invisible text', () => { @@ -67,11 +67,11 @@ describe('emoji', () => { it('avoid emojifying on invisible text with nested tags', () => { expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); }); it('does not emojify emojis with textual presentation VS15 character', () => { @@ -81,17 +81,17 @@ describe('emoji', () => { it('does a simple emoji properly', () => { expect(emojify('♀♂')) - .toEqual('♀♂'); + .toEqual('♀♂'); }); it('does an emoji containing ZWJ properly', () => { expect(emojify('💂‍♀️💂‍♂️')) - .toEqual('💂\u200D♀️💂\u200D♂️'); + .toEqual('💂\u200D♀️💂\u200D♂️'); }); it('keeps ordering as expected (issue fixed by PR 20677)', () => { expect(emojify('

💕 #foo test: foo.

')) - .toEqual('

💕 #foo test: foo.

'); + .toEqual('

💕 #foo test: foo.

'); }); }); }); diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js index 1f469aced7..66dcd89488 100644 --- a/app/javascript/mastodon/features/emoji/emoji.js +++ b/app/javascript/mastodon/features/emoji/emoji.js @@ -97,30 +97,30 @@ const emojifyTextNode = (node, customEmojis) => { const { filename, shortCode } = unicodeMapping[unicode_emoji]; const title = shortCode ? `:${shortCode}:` : ''; - replacement = document.createElement('picture'); - const isSystemTheme = !!document.body?.classList.contains('theme-system'); - if(isSystemTheme) { - let source = document.createElement('source'); - source.setAttribute('media', '(prefers-color-scheme: dark)'); - source.setAttribute('srcset', `${assetHost}/emoji/${emojiFilename(filename, "dark")}.svg`); - replacement.appendChild(source); - } + const theme = (isSystemTheme || document.body?.classList.contains('theme-mastodon-light')) ? 'light' : 'dark'; - let img = document.createElement('img'); + const imageFilename = emojiFilename(filename, theme); + + const img = document.createElement('img'); img.setAttribute('draggable', 'false'); img.setAttribute('class', 'emojione'); img.setAttribute('alt', unicode_emoji); img.setAttribute('title', title); + img.setAttribute('src', `${assetHost}/emoji/${imageFilename}.svg`); - let theme = "light"; + if (isSystemTheme && imageFilename !== emojiFilename(filename, 'dark')) { + replacement = document.createElement('picture'); - if(!isSystemTheme && !document.body?.classList.contains('theme-mastodon-light')) - theme = "dark"; - - img.setAttribute('src', `${assetHost}/emoji/${emojiFilename(filename, theme)}.svg`); - replacement.appendChild(img); + const source = document.createElement('source'); + source.setAttribute('media', '(prefers-color-scheme: dark)'); + source.setAttribute('srcset', `${assetHost}/emoji/${emojiFilename(filename, 'dark')}.svg`); + replacement.appendChild(source); + replacement.appendChild(img); + } else { + replacement = img; + } } // Add the processed-up-to-now string and the emoji replacement @@ -135,7 +135,7 @@ const emojifyTextNode = (node, customEmojis) => { }; const emojifyNode = (node, customEmojis) => { - for (const child of node.childNodes) { + for (const child of Array.from(node.childNodes)) { switch(child.nodeType) { case Node.TEXT_NODE: emojifyTextNode(child, customEmojis); diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index 5f1efe3d72..a60087890b 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "Bilinməyən bir xəta baş verdi.", "alert.unexpected.title": "Ah!", "alt_text_badge.title": "Alternativ mətn", + "alt_text_modal.add_alt_text": "Alternativ mətn əlavə et", + "alt_text_modal.add_text_from_image": "Şəkildəki mətni əlavə et", + "alt_text_modal.cancel": "İmtina", + "alt_text_modal.change_thumbnail": "Miniatürü dəyişdir", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Eşitmə məhdudiyyətli insanlar üçün bunu izah et…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Görmə məhdudiyyətli insanlar üçün bunu təsvir et…", + "alt_text_modal.done": "Oldu", "announcement.announcement": "Elan", "annual_report.summary.archetype.booster": "Trend ovçusu", "annual_report.summary.archetype.lurker": "Lurker", @@ -211,6 +218,10 @@ "confirmations.logout.confirm": "Çıxış et", "confirmations.logout.message": "Çıxmaq istədiyinizə əminsiniz?", "confirmations.logout.title": "Çıxış edilsin?", + "confirmations.missing_alt_text.confirm": "Alternativ mətn əlavə et", + "confirmations.missing_alt_text.message": "Paylaşımınız alternativ mətn ehtiva etmir. Təsvir əlavə etmək onun daha çox insan üçün əlçatan olmasına kömək edir.", + "confirmations.missing_alt_text.secondary": "Yenə də paylaş", + "confirmations.missing_alt_text.title": "Alternativ mətn əlavə edilsin?", "confirmations.mute.confirm": "Səssizləşdir", "confirmations.redraft.confirm": "Sil və qaralamaya köçür", "confirmations.redraft.message": "Bu paylaşımı silmək və qaralamaya köçürmək istədiyinizə əminsiniz? Bəyənmələr və gücləndirmələr itəcək və orijinal paylaşıma olan cavablar tənha qalacaq.", @@ -241,6 +252,7 @@ "dismissable_banner.dismiss": "Bağla", "dismissable_banner.explore_links": "Bu xəbərlər bu gün fediversedə ən çox paylaşılır. Daha fərqli insanlar tərəfindən dərc edilən daha yeni xəbərlər daha yuxarıda sıralanır.", "dismissable_banner.explore_statuses": "Fediversedən olan bu paylaşımlar bu gün maraq qazanır. Daha çox gücləndirici və bəyənmə olan daha yeni paylaşımlar daha yuxarıda sıralanır.", + "dismissable_banner.explore_tags": "Bu heşteqlər fediverse-də trend olublar. Daha çox fərqli insanlar tərəfindən istifadə olunan heşteqlər daha yuxarıda sıralanır.", "domain_block_modal.block_account_instead": "@{name} istifadəçisini blokla", "domain_block_modal.they_can_interact_with_old_posts": "Bu serverdən olan insanlar köhnə paylaşımlarınızla əlaqə qura bilər." } diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index cdcbddf55a..e01f6dd448 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Излизане", "confirmations.logout.message": "Наистина ли искате да излезете?", "confirmations.logout.title": "Излизате ли от системата?", + "confirmations.missing_alt_text.confirm": "Добавяне на алтернативен текст", + "confirmations.missing_alt_text.message": "Вашата публикация съдържа мултимедия без алтернативен текст. Добавянето на описание помага да направите съдържанието си по-достъпно за повече хора.", + "confirmations.missing_alt_text.secondary": "Все пак да се публикува", + "confirmations.missing_alt_text.title": "Добавяте ли алтернативен текст?", "confirmations.mute.confirm": "Заглушаване", "confirmations.redraft.confirm": "Изтриване и преработване", "confirmations.redraft.message": "Наистина ли искате да изтриете тази публикация и да я направите чернова? Означаванията като любими и подсилванията ще се изгубят, а и отговорите към първоначалната публикация ще осиротеят.", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 74d33c2357..27683a0933 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -180,7 +180,7 @@ "compose.published.open": "Obre", "compose.saved.body": "Tut desat.", "compose_form.direct_message_warning_learn_more": "Més informació", - "compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació sensible mitjançant Mastodon.", + "compose_form.encryption_warning": "Els tuts a Mastodon no estan xifrats punt a punt. No compartiu informació confidencial mitjançant Mastodon.", "compose_form.hashtag_warning": "Aquest tut no apareixerà a les llistes d'etiquetes perquè no és públic. Només els tuts públics apareixen a les cerques per etiqueta.", "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure els tuts de només per a seguidors.", "compose_form.lock_disclaimer.lock": "blocat", @@ -218,7 +218,7 @@ "confirmations.logout.confirm": "Tanca la sessió", "confirmations.logout.message": "Segur que vols tancar la sessió?", "confirmations.logout.title": "Tancar la sessió?", - "confirmations.missing_alt_text.confirm": "Afegiu text alternatiu", + "confirmations.missing_alt_text.confirm": "Afegiu un text alternatiu", "confirmations.missing_alt_text.message": "La vostra publicació té contingut sense text alternatiu. Afegir-hi descripcions la farà accessible a més persones.", "confirmations.missing_alt_text.secondary": "Publica-la igualment", "confirmations.missing_alt_text.title": "Hi voleu afegir text alternatiu?", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 66cc0727b6..62df3be279 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Odhlásit se", "confirmations.logout.message": "Opravdu se chcete odhlásit?", "confirmations.logout.title": "Odhlásit se?", + "confirmations.missing_alt_text.confirm": "Přidat alt text", + "confirmations.missing_alt_text.message": "Váš příspěvek obsahuje média bez alt textu. Přidání popisů pomáhá zpřístupnit váš obsah většímu počtu lidí.", + "confirmations.missing_alt_text.secondary": "Přesto odeslat", + "confirmations.missing_alt_text.title": "Přidat alt text?", "confirmations.mute.confirm": "Skrýt", "confirmations.redraft.confirm": "Smazat a přepsat", "confirmations.redraft.message": "Jste si jistí, že chcete odstranit tento příspěvek a vytvořit z něj koncept? Oblíbené a boosty budou ztraceny a odpovědi na původní příspěvek ztratí kontext.", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index b30ae5e215..c9a22ff8f1 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "Digwyddodd gwall annisgwyl.", "alert.unexpected.title": "Wps!", "alt_text_badge.title": "Testun Amgen", + "alt_text_modal.add_alt_text": "Ychwanegu testun amgen", + "alt_text_modal.add_text_from_image": "Ychwanegu testun o'r ddelwedd", + "alt_text_modal.cancel": "Diddymu", + "alt_text_modal.change_thumbnail": "Newid llun bach", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Disgrifiwch hyn ar gyfer pobl â nam ar eu clyw…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Disgrifiwch hyn ar gyfer pobl â nam ar eu golwg…", + "alt_text_modal.done": "Gorffen", "announcement.announcement": "Cyhoeddiad", "annual_report.summary.archetype.booster": "Y hyrwyddwr", "annual_report.summary.archetype.lurker": "Yr arsylwr", @@ -211,6 +218,10 @@ "confirmations.logout.confirm": "Allgofnodi", "confirmations.logout.message": "Ydych chi'n siŵr eich bod am allgofnodi?", "confirmations.logout.title": "Allgofnodi?", + "confirmations.missing_alt_text.confirm": "Ychwanegu testun amgen", + "confirmations.missing_alt_text.message": "Mae eich postiad yn cynnwys cyfryngau heb destun amgen. Mae ychwanegu disgrifiadau yn helpu i wneud eich cynnwys yn hygyrch i fwy o bobl.", + "confirmations.missing_alt_text.secondary": "Postio beth bynnag", + "confirmations.missing_alt_text.title": "Ychwanegu testun amgen?", "confirmations.mute.confirm": "Tewi", "confirmations.redraft.confirm": "Dileu ac ailddrafftio", "confirmations.redraft.message": "Ydych chi wir eisiau'r dileu'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.", @@ -407,6 +418,8 @@ "ignore_notifications_modal.not_followers_title": "Anwybyddu hysbysiadau gan bobl nad ydynt yn eich dilyn?", "ignore_notifications_modal.not_following_title": "Anwybyddu hysbysiadau gan bobl nad ydych yn eu dilyn?", "ignore_notifications_modal.private_mentions_title": "Anwybyddu hysbysiadau o Grybwylliadau Preifat digymell?", + "info_button.label": "Cymorth", + "info_button.what_is_alt_text": "

Beth yw testun amgen?

Mae Testun Amgen yn darparu disgrifiadau delwedd ar gyfer pobl â nam ar eu golwg, cysylltiadau lled band isel, neu'r rhai sy'n ceisio cyd-destun ychwanegol.

Gallwch wella hygyrchedd a dealltwriaeth i bawb trwy ysgrifennu testun amgen clir, cryno a gwrthrychol.

", "interaction_modal.action.favourite": "I barhau, mae angen i chi hoffi o'ch cyfrif.", "interaction_modal.action.follow": "I barhau, mae angen i chi ddilyn o'ch cyfrif.", "interaction_modal.action.reblog": "I barhau, mae angen i chi ail-flogio o'ch cyfrif.", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 7f198727a9..3fa92cd53e 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -29,7 +29,7 @@ "account.endorse": "Fremhæv på profil", "account.featured_tags.last_status_at": "Seneste indlæg {date}", "account.featured_tags.last_status_never": "Ingen indlæg", - "account.featured_tags.title": "{name}s fremhævede hashtags", + "account.featured_tags.title": "{name}s fremhævede etiketter", "account.follow": "Følg", "account.follow_back": "Følg tilbage", "account.followers": "Følgere", @@ -39,7 +39,7 @@ "account.following_counter": "{count, plural, one {{counter} følger} other {{counter} følger}}", "account.follows.empty": "Denne bruger følger ikke nogen endnu.", "account.go_to_profile": "Gå til profil", - "account.hide_reblogs": "Skjul boosts fra @{name}", + "account.hide_reblogs": "Skjul fremhævelser fra @{name}", "account.in_memoriam": "Til minde om.", "account.joined_short": "Oprettet", "account.languages": "Skift abonnementssprog", @@ -49,9 +49,9 @@ "account.mention": "Nævn @{name}", "account.moved_to": "{name} har angivet, at vedkommendes nye konto nu er:", "account.mute": "Skjul @{name}", - "account.mute_notifications_short": "Slå lyden fra for notifikationer", - "account.mute_short": "Skjul (mute)", - "account.muted": "Skjult (muted)", + "account.mute_notifications_short": "Sluk for notifikationer", + "account.mute_short": "Skjul", + "account.muted": "Skjult", "account.mutual": "Fælles", "account.no_bio": "Ingen beskrivelse til rådighed.", "account.open_original_page": "Åbn oprindelig side", @@ -63,14 +63,14 @@ "account.share": "Del @{name}s profil", "account.show_reblogs": "Vis fremhævelser fra @{name}", "account.statuses_counter": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}", - "account.unblock": "Afblokér @{name}", - "account.unblock_domain": "Afblokér domænet {domain}", - "account.unblock_short": "Afblokér", + "account.unblock": "Fjern blokering af @{name}", + "account.unblock_domain": "Fjern blokering af domænet {domain}", + "account.unblock_short": "Fjern blokering", "account.unendorse": "Fjern visning på din profil", "account.unfollow": "Følg ikke længere", - "account.unmute": "Vis @{name} igen (unmute)", - "account.unmute_notifications_short": "Slå lyden fra for notifikationer", - "account.unmute_short": "Vis igen (unmute)", + "account.unmute": "Vis @{name} igen", + "account.unmute_notifications_short": "Tænd for notifikationer", + "account.unmute_short": "Vis igen", "account_note.placeholder": "Klik for at tilføje notat", "admin.dashboard.daily_retention": "Brugerfastholdelsesrate per dag efter tilmelding", "admin.dashboard.monthly_retention": "Brugerfastholdelsesrate per måned efter tilmelding", @@ -94,38 +94,38 @@ "alt_text_modal.describe_for_people_with_visual_impairments": "Beskriv dette for personer med nedsat syn…", "alt_text_modal.done": "Færdig", "announcement.announcement": "Bekendtgørelse", - "annual_report.summary.archetype.booster": "Cool-hunter", - "annual_report.summary.archetype.lurker": "Lurker", - "annual_report.summary.archetype.oracle": "Oracle", - "annual_report.summary.archetype.pollster": "Pollster", - "annual_report.summary.archetype.replier": "Social butterfly", + "annual_report.summary.archetype.booster": "Fremhæveren", + "annual_report.summary.archetype.lurker": "Lureren", + "annual_report.summary.archetype.oracle": "Oraklet", + "annual_report.summary.archetype.pollster": "Afstemningsmageren", + "annual_report.summary.archetype.replier": "Den social sommerfugl", "annual_report.summary.followers.followers": "følgere", "annual_report.summary.followers.total": "{count} i alt", - "annual_report.summary.here_it_is": "Her er {year} i sammendrag:", + "annual_report.summary.here_it_is": "Her er dit {year} i sammendrag:", "annual_report.summary.highlighted_post.by_favourites": "mest favoritmarkerede indlæg", - "annual_report.summary.highlighted_post.by_reblogs": "mest boostede indlæg", - "annual_report.summary.highlighted_post.by_replies": "indlæg med flest svar", + "annual_report.summary.highlighted_post.by_reblogs": "mest fremhævede indlæg", + "annual_report.summary.highlighted_post.by_replies": "mest besvarede indlæg", "annual_report.summary.highlighted_post.possessive": "{name}s", "annual_report.summary.most_used_app.most_used_app": "mest benyttede app", - "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede hashtag", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede etiket", "annual_report.summary.most_used_hashtag.none": "Intet", "annual_report.summary.new_posts.new_posts": "nye indlæg", "annual_report.summary.percentile.text": "Det betyder, at man er i topaf {domain}-brugere.", - "annual_report.summary.percentile.we_wont_tell_bernie": "Vi fortæller det ikke til Bernie.", + "annual_report.summary.percentile.we_wont_tell_bernie": "Vi fortæller det ikke til Pernille Skipper.", "annual_report.summary.thanks": "Tak for at være en del af Mastodon!", "attachments_list.unprocessed": "(ubehandlet)", "audio.hide": "Skjul lyd", "block_modal.remote_users_caveat": "Serveren {domain} vil blive bedt om at respektere din beslutning. Overholdelse er dog ikke garanteret, da nogle servere kan håndtere blokke forskelligt. Offentlige indlæg kan stadig være synlige for ikke-indloggede brugere.", - "block_modal.show_less": "Vis mindre", + "block_modal.show_less": "Vis færre", "block_modal.show_more": "Vis flere", - "block_modal.they_cant_mention": "Vedkommende kan ikke nævne eller følge dig.", + "block_modal.they_cant_mention": "Vedkommende kan ikke omtale eller følge dig.", "block_modal.they_cant_see_posts": "Vedkommende kan ikke se dine indlæg, og du vil ikke se vedkommendes.", "block_modal.they_will_know": "Vedkommende kan se den aktive blokering.", "block_modal.title": "Blokér bruger?", - "block_modal.you_wont_see_mentions": "Du vil ikke se indlæg, som nævner vedkommende.", + "block_modal.you_wont_see_mentions": "Du vil ikke se indlæg, som omtaler vedkommende.", "boost_modal.combo": "Du kan trykke {combo} for at springe dette over næste gang", - "boost_modal.reblog": "Boost indlæg?", - "boost_modal.undo_reblog": "Fjern boost af indlæg?", + "boost_modal.reblog": "Fremhæv indlæg?", + "boost_modal.undo_reblog": "Fjern fremhævning af indlæg?", "bundle_column_error.copy_stacktrace": "Kopiér fejlrapport", "bundle_column_error.error.body": "Den anmodede side kunne ikke gengives. Dette kan skyldes flere typer fejl.", "bundle_column_error.error.title": "Åh nej!", @@ -153,12 +153,12 @@ "column.domain_blocks": "Blokerede domæner", "column.edit_list": "Redigér liste", "column.favourites": "Favoritter", - "column.firehose": "Live feeds", + "column.firehose": "Realtids-strømme", "column.follow_requests": "Følgeanmodninger", "column.home": "Hjem", "column.list_members": "Håndtér listemedlemmer", "column.lists": "Lister", - "column.mutes": "Skjulte brugere (mutede)", + "column.mutes": "Skjulte brugere", "column.notifications": "Notifikationer", "column.pins": "Fastgjorte indlæg", "column.public": "Fælles tidslinje", @@ -168,7 +168,7 @@ "column_header.moveRight_settings": "Flyt kolonne til højre", "column_header.pin": "Fastgør", "column_header.show_settings": "Vis indstillinger", - "column_header.unpin": "Løsgør", + "column_header.unpin": "Frigør", "column_search.cancel": "Afbryd", "column_subheading.settings": "Indstillinger", "community.column_settings.local_only": "Kun lokalt", @@ -181,7 +181,7 @@ "compose.saved.body": "Indlæg gemt.", "compose_form.direct_message_warning_learn_more": "Få mere at vide", "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende-krypteret. Del derfor ikke sensitiv information via Mastodon.", - "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, da kun offentlige indlæg er søgbare via hashtags.", + "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under nogen etiket, da kun offentlige indlæg er søgbare via etiketter.", "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Hvad tænker du på?", @@ -196,9 +196,9 @@ "compose_form.publish_form": "Publicér", "compose_form.reply": "Svar", "compose_form.save_changes": "Opdatér", - "compose_form.spoiler.marked": "Fjern indholdsadvarsel", - "compose_form.spoiler.unmarked": "Tilføj indholdsadvarsel", - "compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)", + "compose_form.spoiler.marked": "Fjern emnefelt", + "compose_form.spoiler.unmarked": "Tilføj emnefelt", + "compose_form.spoiler_placeholder": "Emnefelt (valgfrit)", "confirmation_modal.cancel": "Afbryd", "confirmations.block.confirm": "Blokér", "confirmations.delete.confirm": "Slet", @@ -222,9 +222,9 @@ "confirmations.missing_alt_text.message": "Indlægget indeholder medier uden alt-tekst. Tilføjelse af beskrivelser bidrager til at gøre indholdet tilgængeligt for flere brugere.", "confirmations.missing_alt_text.secondary": "Læg op alligevel", "confirmations.missing_alt_text.title": "Tilføj alt-tekst?", - "confirmations.mute.confirm": "Skjul (mute)", + "confirmations.mute.confirm": "Skjul", "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.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og fremhævelser 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?", @@ -242,7 +242,7 @@ "copy_icon_button.copied": "Kopieret til udklipsholderen", "copypaste.copied": "Kopieret", "copypaste.copy_to_clipboard": "Kopiér til udklipsholder", - "directory.federated": "Fra kendt fedivers", + "directory.federated": "Fra kendt fødivers", "directory.local": "Kun fra {domain}", "directory.new_arrivals": "Nye ankomster", "directory.recently_active": "Aktive for nyligt", @@ -250,10 +250,10 @@ "disabled_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret.", "dismissable_banner.community_timeline": "Disse er de seneste offentlige indlæg fra personer med konti hostet af {domain}.", "dismissable_banner.dismiss": "Afvis", - "dismissable_banner.explore_links": "Disse nyhedshistorier deles mest på fediverset i dag. Nyere nyhedshistorier lagt op af flere forskellige personer rangeres højere.", - "dismissable_banner.explore_statuses": "Disse indlæg på tværs af fediverset opnår momentum i dag. Nyere indlæg med flere boosts og favoritter rangeres højere.", - "dismissable_banner.explore_tags": "Disse hashtags opnår momentum på fediverset i dag. Hashtags brugt af flere forskellige personer rangeres højere.", - "dismissable_banner.public_timeline": "Dette er de seneste offentlige indlæg fra personer på fediverset, som folk på {domain} følger.", + "dismissable_banner.explore_links": "Disse nyhedshistorier deles mest på fødiverset i dag. Nyere nyhedshistorier lagt op af flere forskellige personer rangeres højere.", + "dismissable_banner.explore_statuses": "Disse indlæg på tværs af fødiverset opnår momentum i dag. Nyere indlæg med flere fremhævninger og favoritmærker rangeres højere.", + "dismissable_banner.explore_tags": "Disse etiketter opnår momentum på fødiverset i dag. Etiketter brugt af flere forskellige personer rangeres højere.", + "dismissable_banner.public_timeline": "Dette er de seneste offentlige indlæg fra personer på fødiverset, som folk på {domain} følger.", "domain_block_modal.block": "Blokér server", "domain_block_modal.block_account_instead": "Blokér i stedet @{name}", "domain_block_modal.they_can_interact_with_old_posts": "Folk fra denne server kan interagere med de gamle indlæg.", @@ -263,20 +263,20 @@ "domain_block_modal.you_will_lose_num_followers": "Man vil miste {followersCount, plural, one {{followersCountDisplay} følger} other {{followersCountDisplay} følgere}} og {followingCount, plural, one {{followingCountDisplay} person, man følger} other {{followingCountDisplay} personer, man følger}}.", "domain_block_modal.you_will_lose_relationships": "Alle følgere og personer som følges på denne server mistes.", "domain_block_modal.you_wont_see_posts": "Indlæg eller notifikationer fra brugere på denne server vises ikke.", - "domain_pill.activitypub_lets_connect": "Det muliggør at komme i forbindelse og interagere med folk ikke kun på Mastodon, men også på tværs af forskellige sociale apps.", - "domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", Mastodon taler med andre sociale netværk.", + "domain_pill.activitypub_lets_connect": "Det muliggører at forbinde og interagere med folk, ikke kun på Mastodon, men også på tværs af forskellige sociale apps.", + "domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", som Mastodon taler med andre sociale netværk.", "domain_pill.server": "Server", - "domain_pill.their_handle": "Vedkommendes handle:", + "domain_pill.their_handle": "Deres greb:", "domain_pill.their_server": "Det digitale hjem, hvor alle indlæggene findes.", "domain_pill.their_username": "Entydig identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.", "domain_pill.username": "Brugernavn", - "domain_pill.whats_in_a_handle": "Hvad er der i et handle (@brugernavn)?", - "domain_pill.who_they_are": "Da et handle fortæller, hvem nogen er, og hvor de er, kan man interagere med folk på tværs af det sociale net af .", - "domain_pill.who_you_are": "Da et handle fortæller, hvem man er, og hvor man er, kan man interagere med folk på tværs af det sociale net af .", - "domain_pill.your_handle": "Dit handle:", - "domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om denne? Overfør til enhver tid servere samt tilhængere også.", + "domain_pill.whats_in_a_handle": "Hvad er der i et greb?", + "domain_pill.who_they_are": "Da et greb fortæller, hvem nogen er, og hvor de er, kan man interagere med folk på tværs af det sociale net af .", + "domain_pill.who_you_are": "Da et greb fortæller, hvem man er, og hvor man er, kan man interagere med folk på tværs af det sociale net af .", + "domain_pill.your_handle": "Dit greb:", + "domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.", "domain_pill.your_username": "Din entydige identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.", - "embed.instructions": "Indlejr dette indlæg på dit websted ved at kopiere nedenstående kode.", + "embed.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.", "embed.preview": "Sådan kommer det til at se ud:", "emoji_button.activity": "Aktivitet", "emoji_button.clear": "Ryd", @@ -295,36 +295,36 @@ "emoji_button.travel": "Rejser og steder", "empty_column.account_hides_collections": "Brugeren har valgt ikke at gøre denne information tilgængelig", "empty_column.account_suspended": "Konto suspenderet", - "empty_column.account_timeline": "Ingen indlæg hér!", + "empty_column.account_timeline": "Ingen indlæg her!", "empty_column.account_unavailable": "Profil utilgængelig", "empty_column.blocks": "Ingen brugere blokeret endnu.", "empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.", "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!", - "empty_column.direct": "Der er endnu ingen private omtaler. Når en sendes eller modtages, dukker den op hér.", + "empty_column.direct": "Der er endnu ingen private omtaler. Når en sendes eller modtages, dukker den op her.", "empty_column.domain_blocks": "Ingen blokerede domæner endnu.", "empty_column.explore_statuses": "Ingen nye tendenser lige nu. Tjek igen senere!", - "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du favoritmarkerer ét, vil det dukke op hér.", - "empty_column.favourites": "Ingen har endnu gjort dette indlæg til favorit. Når nogen gør dét, vil det dukke op hér.", - "empty_column.follow_requests": "Du har endnu ingen følgeanmodninger. Når du modtager én, vil den dukke op hér.", - "empty_column.followed_tags": "Ingen hashtags følges endnu. Når det sker, vil de fremgå hér.", - "empty_column.hashtag": "Der er intet med dette hashtag endnu.", - "empty_column.home": "Din hjemmetidslinje er tom! Følg nogle personer, for at udfylde den. {suggestions}", - "empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå hér.", - "empty_column.mutes": "Du har endnu ikke skjult (muted) nogle brugere.", - "empty_column.notification_requests": "Alt er klar! Der er intet her. Når der modtages nye notifikationer, fremgår de her jf. dine indstillinger.", - "empty_column.notifications": "Du har endnu ingen notifikationer. Når andre interagerer med dig, vil det fremgå hér.", - "empty_column.public": "Der er intet hér! Skriv noget offentligt eller følg manuelt brugere fra andre servere for at se indhold", - "error.unexpected_crash.explanation": "Grundet en fejl i vores kode, eller en browser-kompatibilitetsfejl, kunne siden ikke vises korrekt.", + "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du føjer et opslag til favoritter, vil det dukke op her.", + "empty_column.favourites": "Ingen har endnu føjet dette indlæg til favoritter. Når nogen gør det, vil det dukke op her.", + "empty_column.follow_requests": "Du har endnu ingen følgeanmodninger. Når du modtager én, vil den dukke op her.", + "empty_column.followed_tags": "Ingen etiketter følges endnu. Når det sker, vil de fremgå her.", + "empty_column.hashtag": "Der er intet med denne etiket endnu.", + "empty_column.home": "Din hjemmetidslinje er tom! Følg nogle personer, for at fylde den op.", + "empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå her.", + "empty_column.mutes": "Du har endnu ikke skjult nogle brugere.", + "empty_column.notification_requests": "Alt er klar! Der er intet her. Når der modtages nye notifikationer, fremgår de her jævnfør dine indstillinger.", + "empty_column.notifications": "Du har endnu ingen notifikationer. Når andre interagerer med dig, vil det fremgå her.", + "empty_column.public": "Der er intet her! Skriv noget offentligt eller følg manuelt brugere fra andre servere for at se indhold", + "error.unexpected_crash.explanation": "Grundet en fejl i vores kode, eller en netlæser-kompatibilitetsfejl, kunne siden ikke vises korrekt.", "error.unexpected_crash.explanation_addons": "Denne side kunne ikke vises korrekt. Fejlen skyldes sandsynligvis en browsertilføjelse eller automatiske oversættelsesværktøjer.", - "error.unexpected_crash.next_steps": "Prøv at opfriske siden. Hjælper dette ikke, kan Mastodon muligvis stadig bruges via en anden browser eller app.", - "error.unexpected_crash.next_steps_addons": "Prøv at deaktivere dem og genindlæse siden. Hvis det ikke hjælper, kan Mastodon muligvis stadig bruges via en anden browser eller app.", + "error.unexpected_crash.next_steps": "Prøv at opfriske siden. Hjælper dette ikke, kan Mastodon muligvis stadig bruges via en anden netlæser eller app.", + "error.unexpected_crash.next_steps_addons": "Prøv at deaktivere dem og genindlæse siden. Hvis det ikke hjælper, kan Mastodon muligvis stadig bruges via en anden netlæser eller app.", "errors.unexpected_crash.copy_stacktrace": "Kopiér stacktrace til udklipsholderen", "errors.unexpected_crash.report_issue": "Anmeld problem", "explore.suggested_follows": "Personer", "explore.title": "Udforsk", "explore.trending_links": "Nyheder", "explore.trending_statuses": "Indlæg", - "explore.trending_tags": "Hashtags", + "explore.trending_tags": "Etiketter", "filter_modal.added.context_mismatch_explanation": "Denne filterkategori omfatter ikke konteksten, hvorunder dette indlæg er tilgået. Redigér filteret, hvis indlægget også ønskes filtreret i denne kontekst.", "filter_modal.added.context_mismatch_title": "Kontekstmisforhold!", "filter_modal.added.expired_explanation": "Denne filterkategori er udløbet. Ændr dens udløbsdato, for at anvende den.", @@ -332,7 +332,7 @@ "filter_modal.added.review_and_configure": "Gå til {settings_link} for at gennemse og yderligere opsætte denne filterkategori.", "filter_modal.added.review_and_configure_title": "Filterindstillinger", "filter_modal.added.settings_link": "indstillingsside", - "filter_modal.added.short_explanation": "Dette indlæg er nu føjet til flg. filterkategori: {title}.", + "filter_modal.added.short_explanation": "Dette indlæg er nu føjet til følgende filterkategori: {title}.", "filter_modal.added.title": "Filter tilføjet!", "filter_modal.select_filter.context_mismatch": "gælder ikke for denne kontekst", "filter_modal.select_filter.expired": "udløbet", @@ -365,7 +365,7 @@ "follow_suggestions.similar_to_recently_followed_longer": "Svarende til profiler, som for nylig er fulgt", "follow_suggestions.view_all": "Vis alle", "follow_suggestions.who_to_follow": "Hvem, som skal følges", - "followed_tags": "Hashtag, som følges", + "followed_tags": "Etiketter, som følges", "footer.about": "Om", "footer.directory": "Profiloversigt", "footer.get_app": "Hent appen", @@ -381,7 +381,7 @@ "hashtag.column_header.tag_mode.any": "eller {additional}", "hashtag.column_header.tag_mode.none": "uden {additional}", "hashtag.column_settings.select.no_options_message": "Ingen forslag fundet", - "hashtag.column_settings.select.placeholder": "Angiv hashtags…", + "hashtag.column_settings.select.placeholder": "Angiv etiketter…", "hashtag.column_settings.tag_mode.all": "Alle disse", "hashtag.column_settings.tag_mode.any": "Nogle af disse", "hashtag.column_settings.tag_mode.none": "Ingen af disse", @@ -389,8 +389,8 @@ "hashtag.counter_by_accounts": "{count, plural, one {{counter} deltager} other {{counter} deltagere}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag", - "hashtag.follow": "Følg hashtag", - "hashtag.unfollow": "Stop med at følge hashtag", + "hashtag.follow": "Følg etiket", + "hashtag.unfollow": "Stop med at følge etiket", "hashtags.and_other": "…og {count, plural, one {}other {# flere}}", "hints.profiles.followers_may_be_missing": "Der kan mangle følgere for denne profil.", "hints.profiles.follows_may_be_missing": "Fulgte kan mangle for denne profil.", @@ -400,15 +400,15 @@ "hints.profiles.see_more_posts": "Se flere indlæg på {domain}", "hints.threads.replies_may_be_missing": "Der kan mangle svar fra andre servere.", "hints.threads.see_more": "Se flere svar på {domain}", - "home.column_settings.show_reblogs": "Vis boosts", + "home.column_settings.show_reblogs": "Vis fremhævelser", "home.column_settings.show_replies": "Vis svar", "home.hide_announcements": "Skjul bekendtgørelser", - "home.pending_critical_update.body": "Opdater din Mastodon-server snarest muligt!", + "home.pending_critical_update.body": "Opdatér venligst din Mastodon-server snarest muligt!", "home.pending_critical_update.link": "Se opdateringer", "home.pending_critical_update.title": "Kritisk sikkerhedsopdatering tilgængelig!", "home.show_announcements": "Vis bekendtgørelser", "ignore_notifications_modal.disclaimer": "Mastodon kan ikke informere brugere om, at man har ignoreret deres notifikationer. Ignorerer man notifikationer, forhindrer det ikke selve beskedafsendelsen.", - "ignore_notifications_modal.filter_instead": "Filtrer i stedet", + "ignore_notifications_modal.filter_instead": "Filtrér i stedet", "ignore_notifications_modal.filter_to_act_users": "Man vil stadig kunne acceptere, afvise eller anmelde brugere", "ignore_notifications_modal.filter_to_avoid_confusion": "Filtrering medvirker til at undgå potentiel forvirring", "ignore_notifications_modal.filter_to_review_separately": "Man kan gennemgå filtrerede notifikationer separat", @@ -420,43 +420,43 @@ "ignore_notifications_modal.private_mentions_title": "Ignorér notifikationer fra uopfordrede Private omtaler?", "info_button.label": "Hjælp", "info_button.what_is_alt_text": "

Hvad er alt-tekst?

Alt-tekst leverer billedbeskrivelser til folk med synsnedsættelser, lav båndbredde-forbindelser eller med ønske om ekstra kontekst.

Tilgængelighed og forståelse kan forbedres for alle ved at skrive klar, kortfattet og objektiv alt-tekst.

", - "interaction_modal.action.favourite": "For at fortsætte, skal man vælge Gør til favorit fra sin konto.", + "interaction_modal.action.favourite": "For at fortsætte, skal du føje til favoritter fra din konto.", "interaction_modal.action.follow": "For at fortsætte, skal man vælge Følg fra sin konto.", - "interaction_modal.action.reblog": "For at fortsætte, skal man vælge Genblog fra sin konto.", + "interaction_modal.action.reblog": "For at fortsætte, skal man vælge Fremhæv fra sin konto.", "interaction_modal.action.reply": "For at fortsætte, skal man besvar fra sin konto.", "interaction_modal.action.vote": "For at fortsætte, skal man stemme fra sin konto.", "interaction_modal.go": "Gå", "interaction_modal.no_account_yet": "Har endnu ingen konto?", "interaction_modal.on_another_server": "På en anden server", "interaction_modal.on_this_server": "På denne server", - "interaction_modal.title.favourite": "Gør {name}s indlæg til favorit", + "interaction_modal.title.favourite": "Føj {name}s indlæg til favoritter", "interaction_modal.title.follow": "Følg {name}", - "interaction_modal.title.reblog": "Boost {name}s indlæg", + "interaction_modal.title.reblog": "Fremhæv {name}s indlæg", "interaction_modal.title.reply": "Besvar {name}s indlæg", - "interaction_modal.title.vote": "Deltag i {name}s afstemning", + "interaction_modal.title.vote": "Stem i {name}s afstemning", "interaction_modal.username_prompt": "F.eks. {example}", "intervals.full.days": "{number, plural, one {# dag} other {# dage}}", "intervals.full.hours": "{number, plural, one {# time} other {# timer}}", "intervals.full.minutes": "{number, plural, one {# minut} other {# minutter}}", "keyboard_shortcuts.back": "Gå tilbage", "keyboard_shortcuts.blocked": "Åbn listen over blokerede brugere", - "keyboard_shortcuts.boost": "Boost indlæg", + "keyboard_shortcuts.boost": "Fremhæv indlæg", "keyboard_shortcuts.column": "Fokusér kolonne", "keyboard_shortcuts.compose": "Fokusér skriveområdet", "keyboard_shortcuts.description": "Beskrivelse", "keyboard_shortcuts.direct": "for at åbne kolonnen private omtaler", "keyboard_shortcuts.down": "Flyt nedad på listen", "keyboard_shortcuts.enter": "Åbn indlæg", - "keyboard_shortcuts.favourite": "Favoritmarkér indlæg", + "keyboard_shortcuts.favourite": "Føj indlæg til favoritter", "keyboard_shortcuts.favourites": "Åbn favoritlisten", - "keyboard_shortcuts.federated": "Åbn fælles tidslinje", + "keyboard_shortcuts.federated": "Åbn fødereret tidslinje", "keyboard_shortcuts.heading": "Tastaturgenveje", "keyboard_shortcuts.home": "Åbn hjemmetidslinje", "keyboard_shortcuts.hotkey": "Hurtigtast", "keyboard_shortcuts.legend": "Vis dette symbol", "keyboard_shortcuts.local": "Åbn lokal tidslinje", "keyboard_shortcuts.mention": "Omtal forfatter", - "keyboard_shortcuts.muted": "Åbn listen over skjulte (mutede) brugere", + "keyboard_shortcuts.muted": "Åbn listen over skjulte brugere", "keyboard_shortcuts.my_profile": "Åbn din profil", "keyboard_shortcuts.notifications": "for at åbne notifikationskolonnen", "keyboard_shortcuts.open_media": "Åbn medier", @@ -465,9 +465,9 @@ "keyboard_shortcuts.reply": "Besvar indlægget", "keyboard_shortcuts.requests": "Åbn liste over følgeanmodninger", "keyboard_shortcuts.search": "Fokusér søgebjælke", - "keyboard_shortcuts.spoilers": "Vis/skjul CW-felt", + "keyboard_shortcuts.spoilers": "Vis/skjul emnefelt", "keyboard_shortcuts.start": "Åbn \"komme i gang\"-kolonne", - "keyboard_shortcuts.toggle_hidden": "Vis/skjul tekst bag CW", + "keyboard_shortcuts.toggle_hidden": "Vis/skjul tekst bag emnefelt", "keyboard_shortcuts.toggle_sensitivity": "Vis/skjul medier", "keyboard_shortcuts.toot": "Påbegynd nyt indlæg", "keyboard_shortcuts.translate": "for at oversætte et indlæg", @@ -515,16 +515,16 @@ "moved_to_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret, da du flyttede til {movedToAccount}.", "mute_modal.hide_from_notifications": "Skjul fra notifikationer", "mute_modal.hide_options": "Skjul valgmuligheder", - "mute_modal.indefinite": "Indtil jeg fjerner tavsgørelsen", + "mute_modal.indefinite": "Indtil jeg vælger at se dem igen", "mute_modal.show_options": "Vis valgmuligheder", - "mute_modal.they_can_mention_and_follow": "Vedkommende kan nævne og følge dig, men vil ikke blive vist.", - "mute_modal.they_wont_know": "Vedkommende ser ikke den aktive tavsgørelse.", - "mute_modal.title": "Tavsgør bruger?", - "mute_modal.you_wont_see_mentions": "Indlæg, som nævner vedkommende, vises ikke.", - "mute_modal.you_wont_see_posts": "Vedkommende kan stadig se dine indlæg, med vedkommendes vise ikke.", + "mute_modal.they_can_mention_and_follow": "De kan omtale og følge dig, men du vil ikke se dem.", + "mute_modal.they_wont_know": "De vil ikke vide, at de er blevet skjult.", + "mute_modal.title": "Skjul bruger?", + "mute_modal.you_wont_see_mentions": "Du vil ikke se indlæg som omtaler dem.", + "mute_modal.you_wont_see_posts": "De kan stadig se dine indlæg, men du vil ikke se deres.", "navigation_bar.about": "Om", - "navigation_bar.administration": "Håndtering", - "navigation_bar.advanced_interface": "Åbn i avanceret webgrænseflade", + "navigation_bar.administration": "Administration", + "navigation_bar.advanced_interface": "Åbn i avanceret netgrænseflade", "navigation_bar.blocks": "Blokerede brugere", "navigation_bar.bookmarks": "Bogmærker", "navigation_bar.community_timeline": "Lokal tidslinje", @@ -534,14 +534,14 @@ "navigation_bar.domain_blocks": "Blokerede domæner", "navigation_bar.explore": "Udforsk", "navigation_bar.favourites": "Favoritter", - "navigation_bar.filters": "Skjulte ord (mutede)", + "navigation_bar.filters": "Skjulte ord", "navigation_bar.follow_requests": "Følgeanmodninger", - "navigation_bar.followed_tags": "Hashtag, som følges", + "navigation_bar.followed_tags": "Etiketter, som følges", "navigation_bar.follows_and_followers": "Følges og følgere", "navigation_bar.lists": "Lister", "navigation_bar.logout": "Log af", "navigation_bar.moderation": "Moderering", - "navigation_bar.mutes": "Skjulte brugere (mutede)", + "navigation_bar.mutes": "Skjulte brugere", "navigation_bar.opened_in_classic_interface": "Indlæg, konti og visse andre sider åbnes som standard i den klassiske webgrænseflade.", "navigation_bar.personal": "Personlig", "navigation_bar.pins": "Fastgjorte indlæg", @@ -559,10 +559,10 @@ "notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# anden} other {# andre}} tilmeldte sig", "notification.annual_report.message": "{year} #Wrapstodon venter! Afslør årets højdepunkter og mindeværdige øjeblikke på Mastodon!", "notification.annual_report.view": "Vis #Wrapstodon", - "notification.favourite": "{name} favoritmarkerede dit indlæg", - "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} gjorde dit indlæg til favorit", - "notification.favourite_pm": "{name} favoritmarkerede din private omtale", - "notification.favourite_pm.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} favoritmarkerede dit indlæg", + "notification.favourite": "{name} føjede dit indlæg til favoritter", + "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} føjede dit indlæg til favoritter", + "notification.favourite_pm": "{name} føjede din private omtale til favoritter", + "notification.favourite_pm.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} føjede dit indlæg til favoritter", "notification.follow": "{name} begyndte at følge dig", "notification.follow.name_and_others": "{name} og {count, plural, one {# andre} other {# andre}} begyndte at følge dig", "notification.follow_request": "{name} har anmodet om at følge dig", @@ -570,36 +570,36 @@ "notification.label.mention": "Omtale", "notification.label.private_mention": "Privat omtale", "notification.label.private_reply": "Privat svar", - "notification.label.reply": "Besvar", + "notification.label.reply": "Svar", "notification.mention": "Omtale", - "notification.mentioned_you": "{name} nævnte dig", + "notification.mentioned_you": "{name} omtalte dig", "notification.moderation-warning.learn_more": "Læs mere", - "notification.moderation_warning": "Du er tildelt en moderationsadvarsel", + "notification.moderation_warning": "Du har fået en moderationsadvarsel", "notification.moderation_warning.action_delete_statuses": "Nogle af dine indlæg er blevet fjernet.", "notification.moderation_warning.action_disable": "Din konto er blevet deaktiveret.", - "notification.moderation_warning.action_mark_statuses_as_sensitive": "Nogle af dine indlæg er blevet markeret som sensitive.", - "notification.moderation_warning.action_none": "Din konto er tildelt en moderationsadvarsel.", - "notification.moderation_warning.action_sensitive": "Dine indlæg markeres fra nu af som sensitive.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Nogle af dine indlæg er blevet markeret som følsomme.", + "notification.moderation_warning.action_none": "Din konto har fået en moderationsadvarsel.", + "notification.moderation_warning.action_sensitive": "Dine indlæg markeres fra nu af som følsomme.", "notification.moderation_warning.action_silence": "Din konto er blevet begrænset.", "notification.moderation_warning.action_suspend": "Din konto er suspenderet.", "notification.own_poll": "Din afstemning er afsluttet", "notification.poll": "En afstemning, hvori du har stemt, er slut", - "notification.reblog": "{name} boostede dit indlæg", - "notification.reblog.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} boostede dit indlæg", + "notification.reblog": "{name} fremhævede dit indlæg", + "notification.reblog.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} fremhævede dit indlæg", "notification.relationships_severance_event": "Mistede forbindelser med {name}", - "notification.relationships_severance_event.account_suspension": "En admin fra {from} har suspenderet {target}, hvofor opdateringer herfra eller interaktion hermed ikke længer er mulig.", - "notification.relationships_severance_event.domain_block": "En admin fra {from} har blokeret {target}, herunder {followersCount} tilhængere og {followingCount, plural, one {# konto, der} other {# konti, som}} følges.", + "notification.relationships_severance_event.account_suspension": "En admin fra {from} har suspenderet {target}, så du kan ikke længere få opdateringer fra eller interagere med dem.", + "notification.relationships_severance_event.domain_block": "En admin fra {from} har blokeret {target}, herunder {followersCount} følgere og {followingCount, plural, one {# konto, der} other {# konti, som}} som du følger.", "notification.relationships_severance_event.learn_more": "Læs mere", - "notification.relationships_severance_event.user_domain_block": "{target} er blevet blokeret, og {followersCount} tilhængere samt {followingCount, plural, one {# konto, der} other {# konti, som}} følges, er hermed fjernet.", - "notification.status": "{name} har netop postet", + "notification.relationships_severance_event.user_domain_block": "Du har blokeret {target}. {followersCount} af dine følgere samt {followingCount, plural, one {# konto, der} other {# konti, som}} du følger, er hermed fjernet.", + "notification.status": "{name} har netop slået noget op", "notification.update": "{name} redigerede et indlæg", "notification_requests.accept": "Acceptér", "notification_requests.accept_multiple": "{count, plural, one {Acceptér # anmodning…} other {Acceptér # anmodninger…}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Acceptér anmodning} other {Acceptér anmodninger}}", - "notification_requests.confirm_accept_multiple.message": "{count, plural, one {En notifikationsanmodning} other {# notifikationsanmodninger}} er ved at blive accepteret. Fortsæt, sikker?", + "notification_requests.confirm_accept_multiple.message": "{count, plural, one {En notifikationsanmodning} other {# notifikationsanmodninger}} er ved at blive accepteret. Er du sikker på, at du vil fortsætte?", "notification_requests.confirm_accept_multiple.title": "Acceptér notifikationsanmodninger?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Afvis anmodning} other {Afvis anmodninger}}", - "notification_requests.confirm_dismiss_multiple.message": "{count, plural, one {En notifikationsanmodning} other {# notifikationsanmodninger}} er ved at blive afvist, hvorfor man ikke nemt vil kunne tilgå {count, plural, one {den} other {dem}} igen. Fortsæt, sikker?", + "notification_requests.confirm_dismiss_multiple.message": "{count, plural, one {En notifikationsanmodning} other {# notifikationsanmodninger}} er ved at blive afvist, hvorfor man ikke nemt vil kunne tilgå {count, plural, one {den} other {dem}} igen. Er du sikker på, at du vil fortsætte?", "notification_requests.confirm_dismiss_multiple.title": "Afvis notifikationsanmodninger?", "notification_requests.dismiss": "Afvis", "notification_requests.dismiss_multiple": "{count, plural, one {Afvis # anmodning…} other {Afvis # anmodninger…}}", @@ -615,7 +615,7 @@ "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.report": "Nye rapporteringer:", "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:", "notifications.column_settings.alert": "Computernotifikationer", "notifications.column_settings.favourite": "Favoritter:", @@ -627,7 +627,7 @@ "notifications.column_settings.mention": "Omtaler:", "notifications.column_settings.poll": "Afstemningsresultater:", "notifications.column_settings.push": "Push-notifikationer", - "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.reblog": "Fremhævelser:", "notifications.column_settings.show": "Vis i kolonne", "notifications.column_settings.sound": "Afspil lyd", "notifications.column_settings.status": "Nye indlæg:", @@ -635,7 +635,7 @@ "notifications.column_settings.unread_notifications.highlight": "Fremhæv ulæste notifikationer", "notifications.column_settings.update": "Redigeringer:", "notifications.filter.all": "Alle", - "notifications.filter.boosts": "Boosts", + "notifications.filter.boosts": "Fremhævelser", "notifications.filter.favourites": "Favoritter", "notifications.filter.follows": "Følger", "notifications.filter.mentions": "Omtaler", @@ -644,8 +644,8 @@ "notifications.grant_permission": "Tildel tilladelse.", "notifications.group": "{count} notifikationer", "notifications.mark_as_read": "Markér alle notifikationer som læst", - "notifications.permission_denied": "Computernotifikationer er utilgængelige grundet tidligere afvist browsertilladelsesanmodning", - "notifications.permission_denied_alert": "Computernotifikationer kan ikke aktiveres, da browsertilladelse tidligere blev nægtet", + "notifications.permission_denied": "Computernotifikationer er utilgængelige grundet tidligere afvist netlæser-tilladelsesanmodning", + "notifications.permission_denied_alert": "Computernotifikationer kan ikke aktiveres, da netlæser-tilladelse tidligere blev nægtet", "notifications.permission_required": "Computernotifikationer er utilgængelige, da den krævede tilladelse ikke er tildelt.", "notifications.policy.accept": "Acceptér", "notifications.policy.accept_hint": "Vis notifikationer", @@ -674,14 +674,14 @@ "onboarding.follows.title": "Følg folk for at komme i gang", "onboarding.profile.discoverable": "Gør min profil synlig", "onboarding.profile.discoverable_hint": "Når man vælger at være synlig på Mastodon, kan ens indlæg fremgå i søgeresultater og tendenser, og profilen kan blive foreslået til andre med tilsvarende interesse.", - "onboarding.profile.display_name": "Visningsnavn", - "onboarding.profile.display_name_hint": "Fulde navn eller dit sjove navn…", + "onboarding.profile.display_name": "Vist navn", + "onboarding.profile.display_name_hint": "Dit fulde navn eller dit sjove navn…", "onboarding.profile.note": "Bio", - "onboarding.profile.note_hint": "Man kan @omtale andre personer eller #hashtags…", + "onboarding.profile.note_hint": "Man kan @omtale andre personer eller #etiketter…", "onboarding.profile.save_and_continue": "Gem og fortsæt", "onboarding.profile.title": "Profilopsætning", "onboarding.profile.upload_avatar": "Upload profilbillede", - "onboarding.profile.upload_header": "Upload profiloverskrift", + "onboarding.profile.upload_header": "Upload profilbanner", "password_confirmation.exceeds_maxlength": "Adgangskodebekræftelse overstiger maks. adgangskodelængde", "password_confirmation.mismatching": "Adgangskodebekræftelse matcher ikke", "picture_in_picture.restore": "Indsæt det igen", @@ -696,21 +696,21 @@ "poll_button.add_poll": "Tilføj en afstemning", "poll_button.remove_poll": "Fjern afstemning", "privacy.change": "Tilpas indlægsfortrolighed", - "privacy.direct.long": "Alle nævnt i indlægget", + "privacy.direct.long": "Alle omtalt i indlægget", "privacy.direct.short": "Bestemte personer", "privacy.private.long": "Kun dine følgere", "privacy.private.short": "Følgere", "privacy.public.long": "Alle på og udenfor Mastodon", "privacy.public.short": "Offentlig", - "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i live feeds/hashtags, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.", + "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i realtids-strømme/etiketter, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.", "privacy.unlisted.long": "Færre algoritmiske fanfarer", - "privacy.unlisted.short": "Tavsgøre offentligt", + "privacy.unlisted.short": "Stille offentligt", "privacy_policy.last_updated": "Senest opdateret {date}", "privacy_policy.title": "Privatlivspolitik", "recommended": "Anbefalet", "refresh": "Genindlæs", "regeneration_indicator.please_stand_by": "Vent venligst.", - "regeneration_indicator.preparing_your_home_feed": "Forbereder hjemme-feed'et…", + "regeneration_indicator.preparing_your_home_feed": "Forbereder hjemmestrømmen…", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# dag} other {# dage}} siden", "relative_time.full.hours": "{number, plural, one {# time} other {# timer}} siden", @@ -739,12 +739,12 @@ "report.comment.title": "Er der andet, som vi bør vide?", "report.forward": "Videresend til {target}", "report.forward_hint": "Kontoen er fra en anden server. Send også en anonymiseret kopi af anmeldelsen dertil?", - "report.mute": "Skjul (mute)", - "report.mute_explanation": "Du vil ikke se vedkommendes indlæg. Vedkommende kan stadig se dine indlæg og følge dig. Vedkommende vil ikke kunne se, at de er blevet skjult.", + "report.mute": "Skjul", + "report.mute_explanation": "Du vil ikke se deres indlæg. De kan stadig se dine indlæg og følge dig. De vil ikke kunne se, at de er blevet skjult.", "report.next": "Næste", "report.placeholder": "Yderligere kommentarer", "report.reasons.dislike": "Jeg bryder mig ikke om det", - "report.reasons.dislike_description": "Det er ikke noget, man ønsker at se", + "report.reasons.dislike_description": "Det er ikke noget, du ønsker at se", "report.reasons.legal": "Det er ulovligt", "report.reasons.legal_description": "Du mener, at det er i strid med lovgivningen i dit eller serverens land", "report.reasons.other": "Det er noget andet", @@ -764,7 +764,7 @@ "report.thanks.title": "Ønsker ikke at se dette?", "report.thanks.title_actionable": "Tak for anmeldelsen, der vil blive set nærmere på dette.", "report.unfollow": "Følg ikke længere @{name}", - "report.unfollow_explanation": "Du følger denne konto. For ikke længere at se vedkommendes indlæg i dit hjemmefeed, kan du stoppe med at følge dem.", + "report.unfollow_explanation": "Du følger denne konto. For ikke længere at se vedkommendes indlæg i din hjemmestrøm, kan du stoppe med at følge dem.", "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} poster}} vedhæftet", "report_notification.categories.legal": "Juridisk", "report_notification.categories.legal_sentence": "ikke-tilladt indhold", @@ -779,7 +779,7 @@ "search.placeholder": "Søg", "search.quick_action.account_search": "Profiler matchende {x}", "search.quick_action.go_to_account": "Gå til profilen {x}", - "search.quick_action.go_to_hashtag": "Gå til hashtagget {x}", + "search.quick_action.go_to_hashtag": "Gå til etiketten {x}", "search.quick_action.open_url": "Åbn URL i Mastodon", "search.quick_action.status_search": "Indlæg matchende {x}", "search.search_or_paste": "Søg efter eller angiv URL", @@ -793,19 +793,19 @@ "search_popout.user": "bruger", "search_results.accounts": "Profiler", "search_results.all": "Alle", - "search_results.hashtags": "Hashtags", + "search_results.hashtags": "Etiketter", "search_results.no_results": "Ingen resultater.", - "search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller hashtags.", + "search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller etiketter.", "search_results.see_all": "Vis alle", "search_results.statuses": "Indlæg", "search_results.title": "Søg efter \"{q}\"", "server_banner.about_active_users": "Folk, som brugte denne server de seneste 30 dage (månedlige aktive brugere)", "server_banner.active_users": "aktive brugere", "server_banner.administered_by": "Håndteres af:", - "server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, man kan bruge for at deltage i fediverset.", + "server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, man kan bruge for at deltage i fødiverset.", "server_banner.server_stats": "Serverstatstik:", "sign_in_banner.create_account": "Opret konto", - "sign_in_banner.follow_anyone": "Følg alle på tværs af fediverset og se alt i kronologisk rækkefølge. Ingen algoritmer, annoncer eller clickbait i syne.", + "sign_in_banner.follow_anyone": "Følg alle på tværs af fødiverset og se alt i kronologisk rækkefølge. Ingen algoritmer, annoncer eller clickbait i syne.", "sign_in_banner.mastodon_is": "Mastodon er den bedste måde at holde sig ajour med, hvad der sker.", "sign_in_banner.sign_in": "Log ind", "sign_in_banner.sso_redirect": "Log ind eller Tilmeld", @@ -814,7 +814,7 @@ "status.admin_status": "Åbn dette indlæg i modereringsbrugerfladen", "status.block": "Blokér @{name}", "status.bookmark": "Bogmærk", - "status.cancel_reblog_private": "Fjern boost", + "status.cancel_reblog_private": "Fjern fremhævelse", "status.cannot_reblog": "Dette indlæg kan ikke fremhæves", "status.continued_thread": "Fortsat tråd", "status.copy": "Kopiér link til indlæg", @@ -837,24 +837,24 @@ "status.media_hidden": "Medie skjult", "status.mention": "Nævn @{name}", "status.more": "Mere", - "status.mute": "Skjul @{name} (mute)", - "status.mute_conversation": "Skjul samtale (mute)", + "status.mute": "Skjul @{name}", + "status.mute_conversation": "Skjul samtale", "status.open": "Udvid dette indlæg", "status.pin": "Fastgør til profil", "status.pinned": "Fastgjort indlæg", "status.read_more": "Læs mere", "status.reblog": "Fremhæv", - "status.reblog_private": "Boost med oprindelig synlighed", + "status.reblog_private": "Fremhæv med oprindelig synlighed", "status.reblogged_by": "{name} fremhævede", - "status.reblogs": "{count, plural, one {# boost} other {# boosts}}", + "status.reblogs": "{count, plural, one {# fremhævelse} other {# fremhævelser}}", "status.reblogs.empty": "Ingen har endnu fremhævet dette indlæg. Når nogen gør, vil det fremgå hér.", "status.redraft": "Slet og omformulér", "status.remove_bookmark": "Fjern bogmærke", "status.remove_favourite": "Fjern fra favoritter", "status.replied_in_thread": "Svaret i tråd", - "status.replied_to": "Besvarede {name}", + "status.replied_to": "Svarede {name}", "status.reply": "Besvar", - "status.replyAll": "Besvar alle", + "status.replyAll": "Svar alle", "status.report": "Anmeld @{name}", "status.sensitive_warning": "Følsomt indhold", "status.share": "Del", @@ -903,8 +903,8 @@ "video.expand": "Udvid video", "video.fullscreen": "Fuldskærm", "video.hide": "Skjul video", - "video.mute": "Sluk lyden", - "video.pause": "Pausér", + "video.mute": "Sluk for lyden", + "video.pause": "Sæt på pause", "video.play": "Afspil", "video.unmute": "Tænd for lyden" } diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index e45f973614..45f23dbe84 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Αποσύνδεση", "confirmations.logout.message": "Σίγουρα θέλεις να αποσυνδεθείς;", "confirmations.logout.title": "Αποσύνδεση;", + "confirmations.missing_alt_text.confirm": "Προσθήκη εναλ κειμένου", + "confirmations.missing_alt_text.message": "Η ανάρτησή σου περιέχει πολυμέσα χωρίς εναλλακτικό κείμενο. Η προσθήκη περιγραφών βοηθά να γίνει το περιεχόμενό σου προσβάσιμο σε περισσότερους ανθρώπους.", + "confirmations.missing_alt_text.secondary": "Δημοσίευση όπως και να ΄χει", + "confirmations.missing_alt_text.title": "Προσθήκη alt κειμένου;", "confirmations.mute.confirm": "Αποσιώπηση", "confirmations.redraft.confirm": "Διαγραφή & ξαναγράψιμο", "confirmations.redraft.message": "Σίγουρα θέλεις να σβήσεις αυτή την ανάρτηση και να την ξαναγράψεις; Οι προτιμήσεις και προωθήσεις θα χαθούν και οι απαντήσεις στην αρχική ανάρτηση θα μείνουν ορφανές.", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 70a194e1fb..1974d1e62b 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Log out", "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.logout.title": "Log out?", + "confirmations.missing_alt_text.confirm": "Add alt text", + "confirmations.missing_alt_text.message": "Your post contains media without alt text. Adding descriptions helps make your content accessible to more people.", + "confirmations.missing_alt_text.secondary": "Post anyway", + "confirmations.missing_alt_text.title": "Add alt text?", "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? Favourites and boosts will be lost, and replies to the original post will be orphaned.", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 7da4102920..9ec4c4e8a6 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -45,7 +45,7 @@ "account.languages": "Ŝanĝi la abonitajn lingvojn", "account.link_verified_on": "Propreco de tiu ligilo estis konfirmita je {date}", "account.locked_info": "Tiu konto estas privatigita. La posedanto mane akceptas tiun, kiu povas sekvi rin.", - "account.media": "Plurmedio", + "account.media": "Aŭdovidaĵoj", "account.mention": "Mencii @{name}", "account.moved_to": "{name} indikis, ke ria nova konto estas nun:", "account.mute": "Silentigi @{name}", @@ -172,7 +172,7 @@ "column_search.cancel": "Nuligi", "column_subheading.settings": "Agordoj", "community.column_settings.local_only": "Nur loka", - "community.column_settings.media_only": "Nur plurmedio", + "community.column_settings.media_only": "Nur vidaŭdaĵoj", "community.column_settings.remote_only": "Nur fora", "compose.language.change": "Ŝanĝi lingvon", "compose.language.search": "Serĉi lingvojn...", @@ -208,7 +208,7 @@ "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?", "confirmations.delete_list.title": "Ĉu forigi 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.discard_edit_media.message": "Vi havas nekonservitajn ŝanĝojn de la priskribo aŭ la antaŭvidigo de la vidaŭdaĵo, ĉu vi forĵetu ilin malgraŭe?", "confirmations.edit.confirm": "Redakti", "confirmations.edit.message": "Redakti nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.edit.title": "Ĉu superskribi afiŝon?", @@ -459,7 +459,7 @@ "keyboard_shortcuts.muted": "Malfermu la liston de silentigitaj uzantoj", "keyboard_shortcuts.my_profile": "Malfermu vian profilon", "keyboard_shortcuts.notifications": "Malfermu la sciigajn kolumnon", - "keyboard_shortcuts.open_media": "Malfermu plurmedion", + "keyboard_shortcuts.open_media": "Malfermi vidaŭdaĵon", "keyboard_shortcuts.pinned": "Malfermu alpinglitajn afiŝojn-liston", "keyboard_shortcuts.profile": "Malfermu la profilon de aŭtoroprofilo", "keyboard_shortcuts.reply": "Respondu al afiŝo", @@ -468,7 +468,7 @@ "keyboard_shortcuts.spoilers": "Montri/kaŝi CW-kampon", "keyboard_shortcuts.start": "Malfermu \"por komenci\" kolumnon", "keyboard_shortcuts.toggle_hidden": "Montri/kaŝi tekston malantaŭ CW", - "keyboard_shortcuts.toggle_sensitivity": "Montri/kaŝi plurmedion", + "keyboard_shortcuts.toggle_sensitivity": "Montri/kaŝi vidaŭdaĵojn", "keyboard_shortcuts.toot": "Komencu novan afiŝon", "keyboard_shortcuts.translate": "Traduki afiŝon", "keyboard_shortcuts.unfocus": "Senfokusigi verki tekstareon/serĉon", @@ -540,7 +540,7 @@ "navigation_bar.follows_and_followers": "Sekvatoj kaj sekvantoj", "navigation_bar.lists": "Listoj", "navigation_bar.logout": "Elsaluti", - "navigation_bar.moderation": "Modereco", + "navigation_bar.moderation": "Reguligo", "navigation_bar.mutes": "Silentigitaj uzantoj", "navigation_bar.opened_in_classic_interface": "Afiŝoj, kontoj, kaj aliaj specifaj paĝoj kiuj estas malfermititaj defaulta en la klasika reta interfaco.", "navigation_bar.personal": "Persone", @@ -574,11 +574,11 @@ "notification.mention": "Mencii", "notification.mentioned_you": "{name} menciis vin", "notification.moderation-warning.learn_more": "Lerni pli", - "notification.moderation_warning": "Vi ricevis moderigan averton", + "notification.moderation_warning": "Vi ricevis reguligan averton", "notification.moderation_warning.action_delete_statuses": "Kelkaj el viaj afiŝoj estis forigitaj.", "notification.moderation_warning.action_disable": "Via konto estas malŝaltita.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Kelkaj el viaj afiŝoj estis markitaj kiel sentemaj.", - "notification.moderation_warning.action_none": "Via konto ricevis moderigan averton.", + "notification.moderation_warning.action_none": "Via konto ricevis reguligan averton.", "notification.moderation_warning.action_sensitive": "Viaj afiŝoj estos markitaj kiel sentemaj ekde nun.", "notification.moderation_warning.action_silence": "Via konto estis limigita.", "notification.moderation_warning.action_suspend": "Via konto estas malakceptita.", @@ -605,8 +605,8 @@ "notification_requests.dismiss_multiple": "{count, plural, one {Malakcepti # peton…} other {# Malakcepti # petojn…}}", "notification_requests.edit_selection": "Redakti", "notification_requests.exit_selection": "Farita", - "notification_requests.explainer_for_limited_account": "Sciigoj de ĉi tiu konto estis filtritaj ĉar la konto estis limigita de moderanto.", - "notification_requests.explainer_for_limited_remote_account": "Sciigoj de ĉi tiu konto estis filtritaj ĉar la konto aŭ ĝia servilo estis limigitaj de moderanto.", + "notification_requests.explainer_for_limited_account": "Sciigoj de ĉi tiu konto estis filtritaj ĉar la konto estis limigita de reguligisto.", + "notification_requests.explainer_for_limited_remote_account": "Sciigoj de ĉi tiu konto estis filtritaj ĉar la konto aŭ ĝia servilo estis limigitaj de reguligisto.", "notification_requests.maximize": "Maksimumigi", "notification_requests.minimize_banner": "Minimumigi filtritajn sciigojn-rubandon", "notification_requests.notifications_from": "Sciigoj de {name}", @@ -653,8 +653,8 @@ "notifications.policy.drop_hint": "Sendi al la malpleno, por neniam esti vidita denove", "notifications.policy.filter": "Filtri", "notifications.policy.filter_hint": "Sendi al filtritaj sciigoj-enirkesto", - "notifications.policy.filter_limited_accounts_hint": "Limigita de servilaj moderigantoj", - "notifications.policy.filter_limited_accounts_title": "Moderigitaj kontoj", + "notifications.policy.filter_limited_accounts_hint": "Limigita de servilaj reguligistoj", + "notifications.policy.filter_limited_accounts_title": "Reguligitaj kontoj", "notifications.policy.filter_new_accounts.hint": "Kreite en la {days, plural, one {lasta tago} other {# lastaj tagoj}}", "notifications.policy.filter_new_accounts_title": "Novaj kontoj", "notifications.policy.filter_not_followers_hint": "Inkluzive de homoj, kiuj sekvis vin malpli ol {days, plural, one {unu tago} other {# tagoj}}", @@ -781,7 +781,7 @@ "search.quick_action.go_to_account": "Iri al profilo {x}", "search.quick_action.go_to_hashtag": "Iri al kradvorto {x}", "search.quick_action.open_url": "Malfermi URL en Mastodono", - "search.quick_action.status_search": "Afiŝoj kiuj kongruas kun {x}", + "search.quick_action.status_search": "Afiŝoj kiuj konformas kun {x}", "search.search_or_paste": "Serĉu aŭ algluu URL-on", "search_popout.full_text_search_disabled_message": "Ne havebla sur {domain}.", "search_popout.full_text_search_logged_out_message": "Disponebla nur kiam ensalutinte.", @@ -796,7 +796,7 @@ "search_results.hashtags": "Kradvortoj", "search_results.no_results": "Ne estas rezultoj.", "search_results.no_search_yet": "Provu serĉi afiŝojn, profilojn aŭ kradvortojn.", - "search_results.see_all": "Vidu ĉiujn", + "search_results.see_all": "Vidi ĉiujn", "search_results.statuses": "Afiŝoj", "search_results.title": "Serĉu \"{q}\"", "server_banner.about_active_users": "Personoj uzantaj ĉi tiun servilon dum la lastaj 30 tagoj (Aktivaj Uzantoj Monate)", @@ -809,9 +809,9 @@ "sign_in_banner.mastodon_is": "Mastodon estas la plej bona maniero resti ĝisdata pri aktualaĵoj.", "sign_in_banner.sign_in": "Ensaluti", "sign_in_banner.sso_redirect": "Ensalutu aŭ Registriĝi", - "status.admin_account": "Malfermi fasadon de moderigado por @{name}", - "status.admin_domain": "Malfermu moderigan interfacon por {domain}", - "status.admin_status": "Malfermi ĉi tiun afiŝon en la kontrola interfaco", + "status.admin_account": "Malfermi fasadon de la reguligado por @{name}", + "status.admin_domain": "Malfermi fasadon de la reguligado por {domain}", + "status.admin_status": "Malfermi ĉi tiun afiŝon en la fasado de la reguligado", "status.block": "Bloki @{name}", "status.bookmark": "Aldoni al la legosignoj", "status.cancel_reblog_private": "Ne plu diskonigi", @@ -834,7 +834,7 @@ "status.load_more": "Ŝargi pli", "status.media.open": "Alklaki por malfermi", "status.media.show": "Alklaki por montri", - "status.media_hidden": "Plurmedio kaŝita", + "status.media_hidden": "Vidaŭdaĵo kaŝita", "status.mention": "Mencii @{name}", "status.more": "Pli", "status.mute": "Silentigi @{name}", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 7cdf1f2d6b..d39b778f27 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -218,10 +218,10 @@ "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.missing_alt_text.confirm": "Añadir texto alternativo", - "confirmations.missing_alt_text.message": "Tu publicación contiene medios sin texto alternativo. Añadir descripciones ayuda a que tu contenido sea accesible para más personas.", - "confirmations.missing_alt_text.secondary": "Publicar de todos modos", - "confirmations.missing_alt_text.title": "¿Deseas añadir texto alternativo?", + "confirmations.missing_alt_text.confirm": "Agregar texto alternativo", + "confirmations.missing_alt_text.message": "Tu mensaje contiene medios sin texto alternativo. Agregar descripciones ayuda a que tu contenido sea accesible para más personas.", + "confirmations.missing_alt_text.secondary": "Enviar de todos modos", + "confirmations.missing_alt_text.title": "¿Agregar texto alternativo?", "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.", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 1341bb17f3..b26815f2a4 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -208,6 +208,9 @@ "confirmations.logout.confirm": "Amaitu saioa", "confirmations.logout.message": "Ziur saioa amaitu nahi duzula?", "confirmations.logout.title": "Itxi saioa?", + "confirmations.missing_alt_text.confirm": "Gehitu testu alternatiboa", + "confirmations.missing_alt_text.secondary": "Bidali edonola ere", + "confirmations.missing_alt_text.title": "Testu alternatiboa gehitu?", "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.", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 2fddca9f16..5f6445985c 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?", "confirmations.logout.title": "Se déconnecter ?", + "confirmations.missing_alt_text.confirm": "Ajouter un texte alternatif", + "confirmations.missing_alt_text.message": "Votre post contient des médias sans texte alternatif. Ajouter des descriptions rend votre contenu accessible à un plus grand nombre de personnes.", + "confirmations.missing_alt_text.secondary": "Publier quand-même", + "confirmations.missing_alt_text.title": "Ajouter un texte alternatif?", "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.", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 1660132fed..aeca0aaeab 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?", "confirmations.logout.title": "Se déconnecter ?", + "confirmations.missing_alt_text.confirm": "Ajouter un texte alternatif", + "confirmations.missing_alt_text.message": "Votre post contient des médias sans texte alternatif. Ajouter des descriptions rend votre contenu accessible à un plus grand nombre de personnes.", + "confirmations.missing_alt_text.secondary": "Publier quand-même", + "confirmations.missing_alt_text.title": "Ajouter un texte alternatif?", "confirmations.mute.confirm": "Masquer", "confirmations.redraft.confirm": "Supprimer et ré-écrire", "confirmations.redraft.message": "Voulez-vous vraiment supprimer le message pour le réécrire ? Ses partages ainsi que ses mises en favori seront perdues, et ses réponses seront orphelines.", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 2e899b2804..54bc7fd380 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "Tharla earráid gan choinne.", "alert.unexpected.title": "Hiúps!", "alt_text_badge.title": "Téacs alt", + "alt_text_modal.add_alt_text": "Cuir téacs alt leis", + "alt_text_modal.add_text_from_image": "Cuir téacs ón íomhá leis", + "alt_text_modal.cancel": "Cealaigh", + "alt_text_modal.change_thumbnail": "Athraigh mionsamhail", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Déan cur síos air seo do dhaoine le lagú éisteachta…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Déan cur síos air seo do dhaoine a bhfuil lagú amhairc orthu…", + "alt_text_modal.done": "Déanta", "announcement.announcement": "Fógra", "annual_report.summary.archetype.booster": "An sealgair fionnuar", "annual_report.summary.archetype.lurker": "An lurker", @@ -211,6 +218,10 @@ "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.missing_alt_text.confirm": "Cuir téacs alt leis", + "confirmations.missing_alt_text.message": "Tá meáin gan alt téacs i do phostáil. Má chuirtear tuairiscí leis, cabhraíonn sé seo leat d’inneachar a rochtain do níos mó daoine.", + "confirmations.missing_alt_text.secondary": "Post ar aon nós", + "confirmations.missing_alt_text.title": "Cuir téacs alt leis?", "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.", @@ -407,6 +418,8 @@ "ignore_notifications_modal.not_followers_title": "An dtugann tú aird ar fhógraí ó dhaoine nach leanann tú?", "ignore_notifications_modal.not_following_title": "An ndéanann tú neamhaird de fhógraí ó dhaoine nach leanann tú?", "ignore_notifications_modal.private_mentions_title": "An dtugann tú aird ar fhógraí ó Luaintí Príobháideacha gan iarraidh?", + "info_button.label": "Cabhrú", + "info_button.what_is_alt_text": "

Cad is téacs altach ann?

Soláthraíonn téacs Alt cur síos ar íomhánna do dhaoine le lagú radhairc, naisc íseal-bandaleithead, nó daoine atá ag lorg comhthéacs breise.

Is féidir leat inrochtaineacht agus tuiscint a fheabhsú do chách trí théacs alt soiléir, gonta, oibiachtúil a scríobh.

", "interaction_modal.action.favourite": "Chun leanúint ar aghaidh, ní mór duit an ceann is fearr leat ó do chuntas.", "interaction_modal.action.follow": "Chun leanúint ar aghaidh, ní mór duit leanúint ó do chuntas.", "interaction_modal.action.reblog": "Chun leanúint ar aghaidh, ní mór duit athbhlagáil ó do chuntas.", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index fc3194e4dd..90032b46ad 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -86,9 +86,12 @@ "alert.unexpected.message": "Un error inexpectate ha occurrite.", "alert.unexpected.title": "Ups!", "alt_text_badge.title": "Texto alternative", + "alt_text_modal.add_alt_text": "Adder texto alternative", "alt_text_modal.add_text_from_image": "Adder texto ab imagine", "alt_text_modal.cancel": "Cancellar", "alt_text_modal.change_thumbnail": "Cambiar le miniatura", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Describe isto pro personas con impedimentos auditive…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Describe isto pro personas con impedimentos visual…", "alt_text_modal.done": "Preste", "announcement.announcement": "Annuncio", "annual_report.summary.archetype.booster": "Le impulsator", @@ -215,6 +218,10 @@ "confirmations.logout.confirm": "Clauder session", "confirmations.logout.message": "Es tu secur que tu vole clauder le session?", "confirmations.logout.title": "Clauder session?", + "confirmations.missing_alt_text.confirm": "Adder texto alternative", + "confirmations.missing_alt_text.message": "Tu message contine multimedia sin texto alternative. Adder descriptiones adjuta a render tu contento accessibile a plus personas.", + "confirmations.missing_alt_text.secondary": "Publicar totevia", + "confirmations.missing_alt_text.title": "Adder texto alternative?", "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.", @@ -411,6 +418,8 @@ "ignore_notifications_modal.not_followers_title": "Ignorar notificationes de personas qui non te seque?", "ignore_notifications_modal.not_following_title": "Ignorar notificationes de personas que tu non seque?", "ignore_notifications_modal.private_mentions_title": "Ignorar notificationes de mentiones private non requestate?", + "info_button.label": "Adjuta", + "info_button.what_is_alt_text": "

Que es texto alternative?

Le texto alternative forni descriptiones de imagines a personas con impedimentos visual, con connexiones lente, o qui cerca contexto additional.

Tu pote meliorar le accessibilitate e le comprension pro totes scribente un texto alternative clar, concise e objective.

", "interaction_modal.action.favourite": "Per favor reveni a tu conto pro marcar isto como favorite.", "interaction_modal.action.follow": "Per favor reveni a tu conto pro sequer.", "interaction_modal.action.reblog": "Per favor reveni a tu conto pro impulsar.", @@ -825,7 +834,7 @@ "status.load_more": "Cargar plus", "status.media.open": "Clicca pro aperir", "status.media.show": "Clicca pro monstrar", - "status.media_hidden": "Medios celate", + "status.media_hidden": "Contento multimedial celate", "status.mention": "Mentionar @{name}", "status.more": "Plus", "status.mute": "Silentiar @{name}", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index fc52700692..67acddb446 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Disconnettiti", "confirmations.logout.message": "Sei sicuro di volerti disconnettere?", "confirmations.logout.title": "Uscire?", + "confirmations.missing_alt_text.confirm": "Aggiungi testo alternativo", + "confirmations.missing_alt_text.message": "Il tuo post contiene media senza testo alternativo. L'aggiunta di descrizioni aiuta a rendere i tuoi contenuti accessibili a più persone.", + "confirmations.missing_alt_text.secondary": "Pubblica comunque", + "confirmations.missing_alt_text.title": "Aggiungere testo alternativo?", "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.", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 9ac11c145a..52a02db44d 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -99,8 +99,11 @@ "alert.unexpected.title": "エラー!", "alt_text_badge.title": "代替テキスト", "alt_text_modal.add_alt_text": "代替テキストを追加", + "alt_text_modal.add_text_from_image": "画像からテキストを追加", "alt_text_modal.cancel": "キャンセル", "alt_text_modal.change_thumbnail": "サムネイルを変更", + "alt_text_modal.describe_for_people_with_hearing_impairments": "耳の不自由な方のために説明してください…", + "alt_text_modal.describe_for_people_with_visual_impairments": "目が不自由な方のために説明してください…", "alt_text_modal.done": "完了", "announcement.announcement": "お知らせ", "annual_report.summary.archetype.booster": "トレンドハンター", @@ -334,6 +337,10 @@ "confirmations.logout.confirm": "ログアウト", "confirmations.logout.message": "本当にログアウトしますか?", "confirmations.logout.title": "ログアウトしようとしています", + "confirmations.missing_alt_text.confirm": "代替テキストを追加", + "confirmations.missing_alt_text.message": "あなたの投稿には大体テキストのないメディアが含まれています。説明文を追加することで、より多くの人がコンテンツにアクセスできるようになります。", + "confirmations.missing_alt_text.secondary": "そのまま投稿する", + "confirmations.missing_alt_text.title": "代替テキストを追加しますか?", "confirmations.mute.confirm": "ミュート", "confirmations.redraft.confirm": "削除して下書きに戻す", "confirmations.redraft.message": "投稿を削除して下書きに戻します。この投稿へのお気に入り登録やブーストは失われ、返信は孤立することになります。よろしいですか?", @@ -590,6 +597,7 @@ "keyboard_shortcuts.toggle_hidden": "CWで隠れた文を見る/隠す", "keyboard_shortcuts.toggle_sensitivity": "非表示のメディアを見る/隠す", "keyboard_shortcuts.toot": "新規投稿", + "keyboard_shortcuts.translate": "投稿を翻訳する", "keyboard_shortcuts.unfocus": "投稿の入力欄・検索欄から離れる", "keyboard_shortcuts.up": "カラム内一つ上に移動", "lightbox.close": "閉じる", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 88f35cfc30..df61294e33 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "로그아웃", "confirmations.logout.message": "정말로 로그아웃 하시겠습니까?", "confirmations.logout.title": "로그아웃 할까요?", + "confirmations.missing_alt_text.confirm": "대체 텍스트 추가", + "confirmations.missing_alt_text.message": "대체 텍스트가 없는 미디어를 포함하고 있습니다. 설명을 추가하면 더 많은 사람들이 내 콘텐츠에 접근할 수 있습니다.", + "confirmations.missing_alt_text.secondary": "그냥 게시하기", + "confirmations.missing_alt_text.title": "대체 텍스트를 추가할까요?", "confirmations.mute.confirm": "뮤트", "confirmations.redraft.confirm": "삭제하고 다시 쓰기", "confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 게시물에 대한 부스트와 좋아요를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.", @@ -415,6 +419,7 @@ "ignore_notifications_modal.not_following_title": "내가 팔로우하지 않는 사람들의 알림을 무시할까요?", "ignore_notifications_modal.private_mentions_title": "요청하지 않은 개인 멘션 알림을 무시할까요?", "info_button.label": "도움말", + "info_button.what_is_alt_text": "

대체 텍스트가 무었인가요?

대체 텍스트는 저시력자, 낮은 인터넷 대역폭 사용자, 더 자세한 문맥을 위해 이미지에 대한 설명을 제공하는 것입니다.

깔끔하고 간결하고 객관적인 대체 텍스트를 작성해 모두가 이해하기 쉽게 만들고 접근성이 높아질 수 있습니다.

", "interaction_modal.action.favourite": "계속하려면 내 계정으로 즐겨찾기해야 합니다.", "interaction_modal.action.follow": "계속하려면 내 계정으로 팔로우해야 합니다.", "interaction_modal.action.reblog": "계속하려면 내 계정으로 리블로그해야 합니다.", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 083527f7d5..17541985fd 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Atsijungti", "confirmations.logout.message": "Ar tikrai nori atsijungti?", "confirmations.logout.title": "Atsijungti?", + "confirmations.missing_alt_text.confirm": "Pridėti alternatyvųjį tekstą", + "confirmations.missing_alt_text.message": "Jūsų įrašas turi mediją be alternatyvaus teksto. Pridėjus aprašymus, jūsų turinys taps pasiekiamas daugeliui asmenų.", + "confirmations.missing_alt_text.secondary": "Siųsti vis tiek", + "confirmations.missing_alt_text.title": "Pridėti alternatyvųjį tekstą?", "confirmations.mute.confirm": "Nutildyti", "confirmations.redraft.confirm": "Ištrinti ir iš naujo parengti", "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parengti jį iš naujo? Bus prarasti mėgstami ir pasidalinimai, o atsakymai į originalų įrašą bus panaikinti.", diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json index 110d5a7301..13a11d2999 100644 --- a/app/javascript/mastodon/locales/nan.json +++ b/app/javascript/mastodon/locales/nan.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "發生意外ê錯誤。.", "alert.unexpected.title": "Ai-ioh!", "alt_text_badge.title": "替代文字", + "alt_text_modal.add_alt_text": "加添說明文字", + "alt_text_modal.add_text_from_image": "Tuì圖加說明文字", + "alt_text_modal.cancel": "取消", + "alt_text_modal.change_thumbnail": "改縮小圖", + "alt_text_modal.describe_for_people_with_hearing_impairments": "請替聽有困難ê敘述tsit ê內容…", + "alt_text_modal.describe_for_people_with_visual_impairments": "請替看有困難ê敘述tsit ê內容…", + "alt_text_modal.done": "做好ah", "announcement.announcement": "公告", "annual_report.summary.archetype.booster": "追求趣味ê", "annual_report.summary.archetype.lurker": "有讀無PO ê", @@ -182,7 +189,52 @@ "compose_form.poll.multiple": "Tsē選擇", "compose_form.poll.option_placeholder": "選項 {number}", "compose_form.poll.single": "單選擇", + "compose_form.poll.switch_to_multiple": "Kā投票改做ē當選tsē-tsē ê。", + "compose_form.poll.switch_to_single": "Kā投票改做kan-ta通選tsi̍t-ê", + "compose_form.poll.type": "投票ê方法", + "compose_form.publish": "PO文", + "compose_form.publish_form": "PO出去", + "compose_form.reply": "回應", + "compose_form.save_changes": "更新", + "compose_form.spoiler.marked": "Thâi掉內容警告", + "compose_form.spoiler.unmarked": "加添內容警告", + "compose_form.spoiler_placeholder": "內容警告(m̄是必要)", + "confirmation_modal.cancel": "取消", + "confirmations.block.confirm": "封鎖", + "confirmations.delete.confirm": "Thâi掉", + "confirmations.delete.message": "Lí kám確定beh thâi掉tsit ê PO文?", + "confirmations.delete.title": "Kám beh thâi掉tsit ê PO文?", + "confirmations.delete_list.confirm": "Thâi掉", + "confirmations.delete_list.message": "Lí kám確定beh永永thâi掉tsit ê列單?", + "confirmations.delete_list.title": "Kám beh thâi掉tsit ê列單?", + "confirmations.discard_edit_media.confirm": "棄sak", + "confirmations.discard_edit_media.message": "Lí佇媒體敘述á是先看māi ê所在有iáu buē儲存ê改變,kám beh kā in棄sak?", + "confirmations.edit.confirm": "編輯", + "confirmations.edit.message": "Tsit-má編輯ē khàm掉lí tng-leh編寫ê訊息,lí kám beh繼續án-ne做?", + "confirmations.edit.title": "Kám beh khàm掉PO文?", "confirmations.follow_to_list.confirm": "跟tuè,加入kàu列單", + "confirmations.follow_to_list.message": "Beh kā {name} 加添kàu列單,lí tio̍h先跟tuè伊。", + "confirmations.follow_to_list.title": "Kám beh跟tuè tsit ê用者?", + "confirmations.logout.confirm": "登出", + "confirmations.logout.message": "Lí kám確定beh登出?", + "confirmations.logout.title": "Lí kám beh登出?", + "confirmations.missing_alt_text.confirm": "加添說明文字", + "confirmations.missing_alt_text.message": "Lí ê PO文包含無說明文字ê媒體。加添敘述,ē幫tsān lí ê內容hōo khah tsē lâng接近使用。", + "confirmations.missing_alt_text.secondary": "就按呢PO出去", + "confirmations.missing_alt_text.title": "Kám beh加添說明文字?", + "confirmations.mute.confirm": "消音", + "confirmations.redraft.confirm": "Thâi掉了後重寫", + "confirmations.redraft.message": "Lí kám確定behthâi掉tsit篇PO文了後koh重寫?收藏kap轉PO ē無去,而且原底ê PO文ê回應ē變孤立。", + "confirmations.redraft.title": "Kám beh thâi掉koh重寫PO文?", + "confirmations.reply.confirm": "回應", + "confirmations.reply.message": "Tsit-má回應ē khàm掉lí tng-leh編寫ê訊息。Lí kám確定beh繼續án-ne做?", + "confirmations.reply.title": "Kám beh khàm掉PO文?", + "confirmations.unfollow.confirm": "取消跟tuè", + "confirmations.unfollow.message": "Lí kám確定無愛跟tuè {name}?", + "confirmations.unfollow.title": "Kám beh取消跟tuè tsit ê用者?", + "content_warning.hide": "Am-khàm PO文", + "emoji_button.label": "加入繪文字(emoji)", + "emoji_button.nature": "自然", "notification.favourite_pm": "{name} kah意lí ê私人提起", "notification.favourite_pm.name_and_others_with_link": "{name} kap{count, plural, other {另外 # ê lâng}}kah意lí ê私人提起", "search_popout.language_code": "ISO語言代碼", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index dd5d68dc83..e3850fed39 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -39,7 +39,7 @@ "account.no_bio": "ਕੋਈ ਵਰਣਨ ਨਹੀਂ ਦਿੱਤਾ।", "account.open_original_page": "ਅਸਲ ਸਫ਼ੇ ਨੂੰ ਖੋਲ੍ਹੋ", "account.posts": "ਪੋਸਟਾਂ", - "account.posts_with_replies": "ਪੋਸਤਾਂ ਅਤੇ ਜਵਾਬ", + "account.posts_with_replies": "ਪੋਸਟਾਂ ਅਤੇ ਜਵਾਬ", "account.report": "{name} ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ", "account.requested": "ਮਨਜ਼ੂਰੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। ਫ਼ਾਲੋ ਬੇਨਤੀਆਂ ਨੂੰ ਰੱਦ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ", "account.requested_follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ", @@ -57,6 +57,8 @@ "admin.dashboard.retention.cohort_size": "ਨਵੇਂ ਵਰਤੋਂਕਾਰ", "alert.unexpected.title": "ਓਹੋ!", "alt_text_badge.title": "ਬਦਲੀ ਲਿਖਤ", + "alt_text_modal.cancel": "ਰੱਦ ਕਰੋ", + "alt_text_modal.done": "ਮੁਕੰਮਲ", "announcement.announcement": "ਹੋਕਾ", "annual_report.summary.followers.followers": "ਫ਼ਾਲੋਅਰ", "annual_report.summary.followers.total": "{count} ਕੁੱਲ", @@ -73,6 +75,7 @@ "block_modal.show_more": "ਵੱਧ ਦਿਖਾਓ", "block_modal.title": "ਵਰਤੋਂਕਾਰ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਉਣੀ ਹੈ?", "boost_modal.reblog": "ਪੋਸਟ ਨੂੰ ਬੂਸਟ ਕਰਨਾ ਹੈ?", + "bundle_column_error.copy_stacktrace": "ਗਲਤੀ ਰਿਪੋਰਟ ਨੂੰ ਕਾਪੀ ਕਰੋ", "bundle_column_error.error.title": "ਓਹ ਹੋ!", "bundle_column_error.network.title": "ਨੈੱਟਵਰਕ ਦੀ ਸਮੱਸਿਆ", "bundle_column_error.retry": "ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ", @@ -106,6 +109,7 @@ "column_header.pin": "ਟੰਗੋ", "column_header.show_settings": "ਸੈਟਿੰਗਾਂ ਦਿਖਾਓ", "column_header.unpin": "ਲਾਹੋ", + "column_search.cancel": "ਰੱਦ ਕਰੋ", "column_subheading.settings": "ਸੈਟਿੰਗਾਂ", "community.column_settings.local_only": "ਸਿਰਫ ਲੋਕਲ ਹੀ", "community.column_settings.media_only": "ਸਿਰਫ ਮੀਡੀਆ ਹੀ", @@ -141,9 +145,12 @@ "confirmations.delete_list.title": "ਸੂਚੀ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?", "confirmations.discard_edit_media.confirm": "ਰੱਦ ਕਰੋ", "confirmations.edit.confirm": "ਸੋਧ", + "confirmations.follow_to_list.confirm": "ਫ਼ਾਲੋ ਕਰੋ ਅਤੇ ਲਿਸਟ 'ਚ ਜੋੜੋ", + "confirmations.follow_to_list.title": "ਵਰਤੋਂਕਾਰ ਨੂੰ ਫ਼ਾਲੋ ਕਰਨਾ ਹੈ?", "confirmations.logout.confirm": "ਬਾਹਰ ਹੋਵੋ", "confirmations.logout.message": "ਕੀ ਤੁਸੀਂ ਲਾਗ ਆਉਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", "confirmations.logout.title": "ਲਾਗ ਆਉਟ ਕਰਨਾ ਹੈ?", + "confirmations.missing_alt_text.secondary": "ਕਿਵੇਂ ਵੀ ਪੋਸਟ ਕਰੋ", "confirmations.mute.confirm": "ਮੌਨ ਕਰੋ", "confirmations.redraft.confirm": "ਹਟਾਓ ਤੇ ਮੁੜ-ਡਰਾਫਟ", "confirmations.reply.confirm": "ਜਵਾਬ ਦੇਵੋ", @@ -209,9 +216,12 @@ "filter_modal.select_filter.expired": "ਮਿਆਦ ਪੁੱਗੀ", "filter_modal.select_filter.prompt_new": "ਨਵੀਂ ਕੈਟਾਗਰੀ: {name}", "filter_modal.select_filter.search": "ਖੋਜੋ ਜਾਂ ਬਣਾਓ", + "filter_modal.select_filter.title": "ਇਸ ਪੋਸਟ ਨੂੰ ਫਿਲਟਰ ਕਰੋ", + "filter_modal.title.status": "ਇੱਕ ਪੋਸਟ ਨੂੰ ਫਿਲਟਰ ਕਰੋ", "firehose.all": "ਸਭ", "firehose.local": "ਇਹ ਸਰਵਰ", "firehose.remote": "ਹੋਰ ਸਰਵਰ", + "follow_request.authorize": "ਪਰਮਾਣਿਤ", "follow_request.reject": "ਰੱਦ ਕਰੋ", "follow_suggestions.dismiss": "ਮੁੜ ਨਾ ਵੇਖਾਓ", "follow_suggestions.personalized_suggestion": "ਨਿੱਜੀ ਸੁਝਾਅ", @@ -227,6 +237,7 @@ "footer.privacy_policy": "ਪਰਦੇਦਾਰੀ ਨੀਤੀ", "footer.source_code": "ਸਰੋਤ ਕੋਡ ਵੇਖੋ", "footer.status": "ਹਾਲਤ", + "footer.terms_of_service": "ਸੇਵਾ ਦੀਆਂ ਸ਼ਰਤਾਂ", "generic.saved": "ਸਾਂਭੀ ਗਈ", "getting_started.heading": "ਸ਼ੁਰੂ ਕਰੀਏ", "hashtag.column_header.tag_mode.all": "ਅਤੇ {additional}", @@ -243,11 +254,15 @@ "hints.profiles.see_more_followers": "{domain} ਉੱਤੇ ਹੋਰ ਫ਼ਾਲੋਅਰ ਵੇਖੋ", "hints.profiles.see_more_follows": "{domain} ਉੱਤੇ ਹੋਰ ਫ਼ਾਲੋ ਨੂੰ ਵੇਖੋ", "hints.profiles.see_more_posts": "{domain} ਉੱਤੇ ਹੋਰ ਪੋਸਟਾਂ ਨੂੰ ਵੇਖੋ", + "hints.threads.see_more": "{domain} ਤੋਂ ਹੋਰ ਜਵਾਬਾਂ ਨੂੰ ਵੇਖੋ", "home.column_settings.show_reblogs": "ਬੂਸਟਾਂ ਨੂੰ ਵੇਖੋ", "home.column_settings.show_replies": "ਜਵਾਬਾਂ ਨੂੰ ਵੇਖੋ", "home.hide_announcements": "ਐਲਾਨਾਂ ਨੂੰ ਓਹਲੇ ਕਰੋ", "home.pending_critical_update.link": "ਅੱਪਡੇਟ ਵੇਖੋ", "ignore_notifications_modal.ignore": "ਨੋਟਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰੋ", + "info_button.label": "ਮਦਦ", + "interaction_modal.go": "ਜਾਓ", + "interaction_modal.no_account_yet": "ਹਾਲੇ ਖਾਤਾ ਨਹੀਂ ਹੈ?", "interaction_modal.on_another_server": "ਵੱਖਰੇ ਸਰਵਰ ਉੱਤੇ", "interaction_modal.on_this_server": "ਇਸ ਸਰਵਰ ਉੱਤੇ", "interaction_modal.title.favourite": "{name} ਦੀ ਪੋਸਟ ਨੂੰ ਪਸੰਦ ਕਰੋ", @@ -255,6 +270,7 @@ "interaction_modal.title.reblog": "{name} ਦੀ ਪੋਸਟ ਨੂੰ ਬੂਸਟ ਕਰੋ", "interaction_modal.title.reply": "{name} ਦੀ ਪੋਸਟ ਦਾ ਜਵਾਬ ਦਿਓ", "interaction_modal.title.vote": "{name} ਦੀ ਚੋਣ ਵਾਸਤੇ ਵੋਟ ਪਾਓ", + "interaction_modal.username_prompt": "ਜਿਵੇਂ {example}", "intervals.full.days": "{number, plural, one {# ਦਿਨ} other {# ਦਿਨ}}", "intervals.full.hours": "{number, plural, one {# ਘੰਟਾ} other {# ਘੰਟੇ}}", "intervals.full.minutes": "{number, plural, one {# ਮਿੰਟ} other {# ਮਿੰਟ}}", @@ -268,6 +284,7 @@ "keyboard_shortcuts.down": "ਸੂਚੀ ਵਿੱਚ ਹੇਠਾਂ ਭੇਜੋ", "keyboard_shortcuts.enter": "ਪੋਸਟ ਨੂੰ ਖੋਲ੍ਹੋ", "keyboard_shortcuts.favourite": "ਪੋਸਟ ਨੂੰ ਪਸੰਦ ਕਰੋ", + "keyboard_shortcuts.favourites": "ਮਨਪਸੰਦ ਸੂਚੀ ਨੂੰ ਖੋਲ੍ਹੋ", "keyboard_shortcuts.federated": "", "keyboard_shortcuts.heading": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ", "keyboard_shortcuts.home": "ਮੁੱਖ-ਸਫ਼ਾ ਟਾਈਮ-ਲਾਈਨ ਨੂੰ ਖੋਲ੍ਹੋ", @@ -288,11 +305,13 @@ "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toggle_sensitivity": "ਮੀਡੀਆ ਦਿਖਾਉਣ/ਲੁਕਾਉਣ ਲਈ", "keyboard_shortcuts.toot": "ਨਵੀਂ ਪੋਸਟ ਸ਼ੁਰੂ ਕਰੋ", + "keyboard_shortcuts.translate": "ਪੋਸਟ ਨੂੰ ਅਨੁਵਾਦ ਕਰਨ ਲਈ", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "ਸੂਚੀ ਵਿੱਚ ਉੱਤੇ ਭੇਜੋ", "lightbox.close": "ਬੰਦ ਕਰੋ", "lightbox.next": "ਅਗਲੀ", "lightbox.previous": "ਪਿਛਲੀ", + "limited_account_hint.action": "ਪਰੋਫਾਈਲ ਨੂੰ ਕਿਵੇਂ ਵੀ ਵੇਖਾਓ", "link_preview.author": "{name} ਵਲੋਂ", "link_preview.more_from_author": "{name} ਵਲੋਂ ਹੋਰ", "link_preview.shares": "{count, plural, one {{counter} ਪੋਸਟ} other {{counter} ਪੋਸਟਾਂ}}", @@ -309,13 +328,17 @@ "lists.list_name": "ਸੂਚੀ ਦਾ ਨਾਂ", "lists.new_list_name": "ਨਵੀਂ ਸੂਚੀਂ ਦਾ ਨਾਂ", "lists.no_lists_yet": "ਹਾਲੇ ਕੋਈ ਵੀ ਸੂਚੀ ਨਹੀਂ ਹੈ।", + "lists.no_members_yet": "ਹਾਲੇ ਮੈਂਬਰ ਨਹੀਂ ਹਨ।", + "lists.no_results_found": "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਮਿਲਿਆ।", "lists.remove_member": "ਹਟਾਓ", "lists.replies_policy.followed": "ਕੋਈ ਵੀ ਫ਼ਾਲੋ ਕੀਤਾ ਵਰਤੋਂਕਾਰ", "lists.replies_policy.list": "ਸੂਚੀ ਦੇ ਮੈਂਬਰ", "lists.replies_policy.none": "ਕੋਈ ਨਹੀਂ", "lists.save": "ਸੰਭਾਲੋ", + "lists.search": "ਖੋਜੋ", "loading_indicator.label": "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ…", "media_gallery.hide": "ਲੁਕਾਓ", + "mute_modal.hide_from_notifications": "ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਵਿੱਚੋਂ ਲੁਕਾਓ", "mute_modal.show_options": "ਚੋਣਾਂ ਨੂੰ ਵੇਖਾਓ", "navigation_bar.about": "ਇਸ ਬਾਰੇ", "navigation_bar.administration": "ਪਰਸ਼ਾਸ਼ਨ", @@ -354,6 +377,8 @@ "notification.mentioned_you": "{name} ਨੇ ਤੁਹਾਡਾ ਜ਼ਿਕਰ ਕੀਤਾ", "notification.moderation-warning.learn_more": "ਹੋਰ ਜਾਣੋ", "notification.moderation_warning.action_disable": "ਤੁਹਾਡੇ ਖਾਤੇ ਨੂੰਅਸਮਰੱਥ ਕੀਤਾ ਹੈ।", + "notification.moderation_warning.action_silence": "ਤੁਹਾਡੇ ਖਾਤੇ ਨੂੰ ਸੀਮਿਤ ਕੀਤਾ ਗਿਆ ਹੈ।", + "notification.moderation_warning.action_suspend": "ਤੁਹਾਡੇ ਖਾਤੇ ਨੂੰ ਮੁਅੱਤਲ ਕੀਤਾ ਗਿਆ ਹੈ।", "notification.reblog": "{name} boosted your status", "notification.relationships_severance_event.learn_more": "ਹੋਰ ਜਾਣੋ", "notification.status": "{name} ਨੇ ਹੁਣੇ ਪੋਸਟ ਕੀਤਾ", @@ -393,6 +418,14 @@ "notifications.policy.accept": "ਮਨਜ਼ੂਰ", "notifications.policy.accept_hint": "ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਵਿੱਚ ਵੇਖਾਓ", "notifications.policy.drop": "ਅਣਡਿੱਠਾ", + "notifications.policy.filter": "ਫਿਲਟਰ", + "notifications.policy.filter_new_accounts_title": "ਨਵੇਂ ਖਾਤੇ", + "notifications.policy.filter_not_followers_title": "ਲੋਕ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਨਹੀਂ ਕਰਦੇ", + "notifications.policy.filter_not_following_hint": "ਜਦ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਖੁਦ ਮਨਜ਼ੂਰੀ ਨਹੀਂ ਦਿੰਦੇ", + "notifications_permission_banner.enable": "ਡੈਸਕਟਾਪ ਸੂਚਨਾਵਾਂ ਸਮਰੱਥ ਕਰੋ", + "onboarding.follows.back": "ਪਿੱਛੇ", + "onboarding.follows.done": "ਮੁਕੰਮਲ", + "onboarding.follows.search": "ਖੋਜੋ", "onboarding.profile.note": "ਜਾਣਕਾਰੀ", "onboarding.profile.save_and_continue": "ਸੰਭਾਲੋ ਅਤੇ ਜਾਰੀ ਰੱਖੋ", "onboarding.profile.title": "ਪਰੋਫਾਈਲ ਸੈਟਅੱਪ", @@ -403,11 +436,16 @@ "poll.vote": "ਵੋਟ ਪਾਓ", "poll.voted": "ਤੁਸੀਂ ਇਸ ਜਵਾਬ ਲਈ ਵੋਟ ਕੀਤਾ", "privacy.change": "ਪੋਸਟ ਦੀ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਦਲੋ", + "privacy.direct.long": "ਪੋਸਟ ਵਿੱਚ ਜ਼ਿਕਰ ਕੀਤੇ ਹਰ ਕੋਈ", + "privacy.direct.short": "ਖਾਸ ਲੋਕ", + "privacy.private.long": "ਸਿਰਫ਼ ਤੁਹਾਡੇ ਫ਼ਾਲੋਅਰ ਹੀ", "privacy.private.short": "ਫ਼ਾਲੋਅਰ", "privacy.public.short": "ਜਨਤਕ", + "privacy_policy.last_updated": "ਆਖਰੀ ਵਾਰ {date} ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ", "privacy_policy.title": "ਪਰਦੇਦਾਰੀ ਨੀਤੀ", "recommended": "ਸਿਫ਼ਾਰਸ਼ੀ", "refresh": "ਤਾਜ਼ਾ ਕਰੋ", + "regeneration_indicator.please_stand_by": "ਕਿਰਪਾ ਕਰਕੇ ਉਡੀਕੋ।", "relative_time.days": "{number}ਦਿਨ", "relative_time.full.days": "{number, plural, one {# ਦਿਨ} other {# ਦਿਨ}} ਪਹਿਲਾਂ", "relative_time.full.hours": "{number, plural, one {# ਘੰਟਾ} other {# ਘੰਟੇ}} ਪਹਿਲਾਂ", @@ -431,9 +469,16 @@ "report.next": "ਅਗਲੀ", "report.placeholder": "ਵਧੀਕ ਟਿੱਪਣੀਆਂ", "report.reasons.dislike": "ਮੈਨੂੰ ਇਹ ਪਸੰਦ ਨਹੀਂ ਹੈ", + "report.reasons.legal": "ਇਹ ਗ਼ੈਰ-ਕਨੂੰਨੀ ਹੈ", + "report.reasons.other": "ਇਹ ਕੁਝ ਹੋਰ ਹੈ", "report.reasons.spam": "ਇਹ ਸਪੈਮ ਹੈ", + "report.rules.subtitle": "ਲਾਗੂ ਹੋਣ ਵਾਲੇ ਸਾਰੇ ਚੁਣੋ", + "report.rules.title": "ਕਿਹੜੇ ਨਿਯਮਾਂ ਦਾ ਉਲੰਘਣ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ?", + "report.statuses.subtitle": "ਲਾਗੂ ਹੋਣ ਵਾਲੇ ਸਾਰੇ ਚੁਣੋ", "report.submit": "ਭੇਜੋ", "report.target": "{target} ਰਿਪੋਰਟ", + "report.thanks.title": "ਇਸ ਨੂੰ ਵੇਖਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਹੋ?", + "report.thanks.title_actionable": "ਰਿਪੋਰਟ ਕਰਨ ਲਈ ਧੰਨਵਾਦ ਹੈ। ਅਸੀਂ ਇਸ ਦੀ ਛਾਣਬੀਣ ਕਰਾਂਗੇ।", "report.unfollow": "@{name} ਨੂੰ ਅਣ-ਫ਼ਾਲੋ ਕਰੋ", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", "report_notification.categories.legal": "ਕਨੂੰਨੀ", @@ -444,6 +489,7 @@ "report_notification.categories.violation": "ਨਿਯਮ ਦੀ ਉਲੰਘਣਾ", "report_notification.categories.violation_sentence": "ਨਿਯਮ ਦੀ ਉਲੰਘਣਾ", "report_notification.open": "ਰਿਪੋਰਟ ਨੂੰ ਖੋਲ੍ਹੋ", + "search.no_recent_searches": "ਕੋਈ ਸੱਜਰੀ ਖੋਜ ਨਹੀਂ ਹੈ", "search.placeholder": "ਖੋਜੋ", "search.quick_action.go_to_account": "ਪਰੋਫਾਈਲ {x} ਉੱਤੇ ਜਾਓ", "search.quick_action.go_to_hashtag": "ਹੈਸ਼ਟੈਗ {x} ਉੱਤੇ ਜਾਓ", @@ -456,6 +502,7 @@ "search_results.accounts": "ਪਰੋਫਾਈਲ", "search_results.all": "ਸਭ", "search_results.hashtags": "ਹੈਸ਼ਟੈਗ", + "search_results.no_results": "ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਹਨ।", "search_results.see_all": "ਸਭ ਵੇਖੋ", "search_results.statuses": "ਪੋਸਟਾਂ", "server_banner.active_users": "ਸਰਗਰਮ ਵਰਤੋਂਕਾਰ", @@ -478,31 +525,49 @@ "status.load_more": "ਹੋਰ ਦਿਖਾਓ", "status.media.open": "ਖੋਲ੍ਹਣ ਲਈ ਕਲਿੱਕ ਕਰੋ", "status.media.show": "ਵੇਖਾਉਣ ਲਈ ਕਲਿੱਕ ਕਰੋ", + "status.media_hidden": "ਮੀਡਿਆ ਲੁਕਵਾਂ ਹੈ", "status.mention": "@{name} ਦਾ ਜ਼ਿਕਰ", "status.more": "ਹੋਰ", + "status.mute": "@{name} ਨੂੰ ਮੌਨ ਕਰੋ", + "status.mute_conversation": "ਗੱਲਬਾਤ ਨੂੰ ਮੌਨ ਕਰੋ", "status.open": "ਇਹ ਪੋਸਟ ਨੂੰ ਫੈਲਾਓ", "status.pin": "ਪਰੋਫਾਈਲ ਉੱਤੇ ਟੰਗੋ", "status.pinned": "ਟੰਗੀ ਹੋਈ ਪੋਸਟ", "status.read_more": "ਹੋਰ ਪੜ੍ਹੋ", "status.reblog": "ਵਧਾਓ", + "status.reblogged_by": "{name} ਨੇ ਬੂਸਟ ਕੀਤਾ", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.redraft": "ਹਟਾਓ ਤੇ ਮੁੜ-ਡਰਾਫਟ", + "status.remove_bookmark": "ਬੁੱਕਮਾਰਕ ਨੂੰ ਹਟਾਓ", + "status.remove_favourite": "ਮਨਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ", + "status.replied_in_thread": "ਮਾਮਲੇ ਵਿੱਚ ਜਵਾਬ ਦਿਓ", "status.replied_to": "{name} ਨੂੰ ਜਵਾਬ ਦਿੱਤਾ", "status.reply": "ਜਵਾਬ ਦੇਵੋ", "status.replyAll": "ਮਾਮਲੇ ਨੂੰ ਜਵਾਬ ਦਿਓ", "status.report": "@{name} ਦੀ ਰਿਪੋਰਟ ਕਰੋ", "status.sensitive_warning": "ਸੰਵੇਦਨਸ਼ੀਲ ਸਮੱਗਰੀ", "status.share": "ਸਾਂਝਾ ਕਰੋ", + "status.show_less_all": "ਸਭ ਲਈ ਘੱਟ ਵੇਖਾਓ", + "status.show_more_all": "ਸਭ ਲਈ ਵੱਧ ਵੇਖਾਓ", + "status.show_original": "ਅਸਲ ਨੂੰ ਵੇਖਾਓ", "status.title.with_attachments": "{user} ਨੇ {attachmentCount, plural,one {ਅਟੈਚਮੈਂਟ} other {{attachmentCount}ਅਟੈਚਮੈਂਟਾਂ}} ਪੋਸਟ ਕੀਤੀਆਂ", "status.translate": "ਉਲੱਥਾ ਕਰੋ", + "status.translated_from_with": "{provider} ਵਰਤ ਕੇ {lang} ਤੋਂ ਅਨੁਵਾਦ ਕੀਤਾ", + "status.uncached_media_warning": "ਝਲਕ ਮੌਜੂਦ ਨਹੀਂ ਹੈ", "status.unpin": "ਪਰੋਫਾਈਲ ਤੋਂ ਲਾਹੋ", "subscribed_languages.save": "ਤਬਦੀਲੀਆਂ ਸੰਭਾਲੋ", "tabs_bar.home": "ਘਰ", "tabs_bar.notifications": "ਸੂਚਨਾਵਾਂ", + "terms_of_service.title": "ਸੇਵਾ ਦੀਆਂ ਸ਼ਰਤਾਂ", + "time_remaining.days": "{number, plural, one {# ਦਿਨ} other {# ਦਿਨ}} ਬਾਕੀ", + "time_remaining.hours": "{number, plural, one {# ਘੰਟਾ} other {# ਘੰਟੇ}} ਬਾਕੀ", + "time_remaining.minutes": "{number, plural, one {# ਮਿੰਟ} other {# ਮਿੰਟ}} ਬਾਕੀ", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", "trends.trending_now": "ਹੁਣ ਰੁਝਾਨ ਵਿੱਚ", "units.short.billion": "{count}ਿਬ", "units.short.million": "{count}ਮਿ", "units.short.thousand": "{count}ਹਜ਼ਾਰ", + "upload_button.label": "ਚਿੱਤਰ, ਵੀਡੀਓ ਜਾਂ ਆਡੀਓ ਫਾਇਲ ਨੂੰ ਜੋੜੋ", "upload_form.edit": "ਸੋਧ", "upload_progress.label": "ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...", "upload_progress.processing": "ਕਾਰਵਾਈ ਚੱਲ ਰਹੀ ਹੈ…", @@ -513,6 +578,8 @@ "video.expand": "ਵੀਡੀਓ ਨੂੰ ਫੈਲਾਓ", "video.fullscreen": "ਪੂਰੀ ਸਕਰੀਨ", "video.hide": "ਵੀਡੀਓ ਨੂੰ ਲੁਕਾਓ", + "video.mute": "ਆਵਾਜ਼ ਨੂੰ ਬੰਦ ਕਰੋ", "video.pause": "ਠਹਿਰੋ", - "video.play": "ਚਲਾਓ" + "video.play": "ਚਲਾਓ", + "video.unmute": "ਆਵਾਜ਼ ਨੂੰ ਸੁਣਾਓ" } diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 8e3b8a26fa..f31de0151d 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -218,6 +218,7 @@ "confirmations.logout.confirm": "Wyloguj", "confirmations.logout.message": "Czy na pewno chcesz się wylogować?", "confirmations.logout.title": "Wylogować?", + "confirmations.missing_alt_text.message": "Twój wpis zawiera treści graficzne bez opisu pomocniczego. Dodając opis, sprawisz, że będzie on bardziej dostępny dla większej liczby osób.", "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.", @@ -414,6 +415,8 @@ "ignore_notifications_modal.not_followers_title": "Ignoruj powiadomienia od użytkowników którzy cię nie obserwują?", "ignore_notifications_modal.not_following_title": "Ignoruj powiadomienia od użytkowników których nie obserwujesz?", "ignore_notifications_modal.private_mentions_title": "Ignoruj powiadomienia o nieproszonych wzmiankach prywatnych?", + "info_button.label": "Pomoc", + "info_button.what_is_alt_text": "

Czym jest tekst pomocniczy obrazków?

Tekst pomocniczy zapewnia osobom z zaburzeniem widzenia, słabym łączem internetowym oraz tym, którzy szukają dodatkowego kontekstu opis grafik i zdjęć.

\n

Możesz zwiększyć jego dostępność i zrozumienie poprzez jasne, zwięzłe i obiektywne sformułowanie tekstu pomocniczego.

\n", "interaction_modal.action.favourite": "Aby kontynuować, musisz dodać do ulubionych na swoim koncie.", "interaction_modal.action.follow": "Aby kontynuować, musisz obserwować ze swojego konta.", "interaction_modal.action.reblog": "Aby kontynuować, musisz podać dalej ze swojego konta.", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 801c84f23c..aaa36704d7 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -42,7 +42,7 @@ "account.hide_reblogs": "Esconder partilhas impulsionadas de @{name}", "account.in_memoriam": "Em Memória.", "account.joined_short": "Juntou-se a", - "account.languages": "Alterar línguas subscritas", + "account.languages": "Alterar idiomas subscritos", "account.link_verified_on": "O proprietário desta hiperligação foi verificado em {date}", "account.locked_info": "Esta conta é privada. O proprietário revê manualmente quem o pode seguir.", "account.media": "Multimédia", @@ -219,7 +219,7 @@ "confirmations.logout.message": "Tens a certeza de que queres terminar a sessão?", "confirmations.logout.title": "Terminar sessão?", "confirmations.missing_alt_text.confirm": "Adicionar texto alternativo", - "confirmations.missing_alt_text.message": "A sua publicação contém elementos gráficos sem texto alternativo. Adicionar descrições ajuda a tornar o seu conteúdo acessível a mais pessoas.", + "confirmations.missing_alt_text.message": "A tua publicação contém multimédia sem texto alternativo. A adição de descrições ajuda a tornar o conteúdo acessível a mais pessoas.", "confirmations.missing_alt_text.secondary": "Publicar mesmo assim", "confirmations.missing_alt_text.title": "Adicionar texto alternativo?", "confirmations.mute.confirm": "Ocultar", @@ -817,7 +817,7 @@ "status.cancel_reblog_private": "Retirar impulso", "status.cannot_reblog": "Esta publicação não pode ser impulsionada", "status.continued_thread": "Continuação da conversa", - "status.copy": "Copiar hiperligação para a publicação", + "status.copy": "Copiar hiperligação da publicação", "status.delete": "Eliminar", "status.detailed_status": "Vista pormenorizada da conversa", "status.direct": "Mencionar @{name} em privado", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 116b28e4d4..b6f3a8a95d 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "Произошла непредвиденная ошибка.", "alert.unexpected.title": "Ой!", "alt_text_badge.title": "Альтернативный текст", + "alt_text_modal.add_alt_text": "Альтернативный текст", + "alt_text_modal.add_text_from_image": "Добавить текст из изображения", + "alt_text_modal.cancel": "Отмена", + "alt_text_modal.change_thumbnail": "Изменить обложку", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Опишите то, что слышите, для людей с нарушениями слуха…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Опишите то, что видите, для людей с нарушениями зрения…", + "alt_text_modal.done": "Готово", "announcement.announcement": "Объявление", "annual_report.summary.archetype.booster": "Репостер", "annual_report.summary.archetype.lurker": "Молчун", @@ -211,6 +218,10 @@ "confirmations.logout.confirm": "Выйти", "confirmations.logout.message": "Вы уверены, что хотите выйти?", "confirmations.logout.title": "Выйти?", + "confirmations.missing_alt_text.confirm": "Добавить", + "confirmations.missing_alt_text.message": "Ваш пост содержит медиафайлы без альтернативного текста. Добавляя описания, вы делаете ваш контент доступным для более широкого круга людей.", + "confirmations.missing_alt_text.secondary": "Опубликовать", + "confirmations.missing_alt_text.title": "Добавить альтернативный текст?", "confirmations.mute.confirm": "Игнорировать", "confirmations.redraft.confirm": "Удалить и исправить", "confirmations.redraft.message": "Вы уверены, что хотите удалить и переписать этот пост? Отметки «избранного», продвижения и ответы к оригинальному посту будут потеряны.", @@ -407,6 +418,8 @@ "ignore_notifications_modal.not_followers_title": "Игнорировать уведомления от людей, которые не следят за вами?", "ignore_notifications_modal.not_following_title": "Игнорировать уведомления от людей, за которыми вы не следите?", "ignore_notifications_modal.private_mentions_title": "Игнорировать уведомления о нежелательных личных сообщениях?", + "info_button.label": "Помощь", + "info_button.what_is_alt_text": "

Что это такое?

Альтернативный текст содержит описание изображения для людей с ограничениями зрения, медленным интернетом и для тех, кому нужен дополнительный контекст.

Вы можете улучшить доступность и понимание для всех, написав четкий, краткий и объективный альтернативный текст.

", "interaction_modal.action.favourite": "Вы можете добавить этот пост в избранное со своей учётной записью.", "interaction_modal.action.follow": "Вы можете подписаться со своей учётной записью.", "interaction_modal.action.reblog": "Вы можете продвинуть этот пост со своей учётной записью.", @@ -457,6 +470,7 @@ "keyboard_shortcuts.toggle_hidden": "показать/скрыть текст за предупреждением", "keyboard_shortcuts.toggle_sensitivity": "показать/скрыть медиафайлы", "keyboard_shortcuts.toot": "начать писать новый пост", + "keyboard_shortcuts.translate": "перевести пост", "keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска", "keyboard_shortcuts.up": "вверх по списку", "lightbox.close": "Закрыть", @@ -836,6 +850,7 @@ "status.reblogs.empty": "Никто ещё не продвинул этот пост. Как только кто-то это сделает, они появятся здесь.", "status.redraft": "Создать заново", "status.remove_bookmark": "Убрать из закладок", + "status.remove_favourite": "Убрать из избранного", "status.replied_in_thread": "Ответил в теме", "status.replied_to": "Ответил(а) {name}", "status.reply": "Ответить", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 5e7385bdc4..b9f0fd1b33 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -205,6 +205,7 @@ "confirmations.logout.confirm": "Odhlásiť sa", "confirmations.logout.message": "Určite sa chcete odhlásiť?", "confirmations.logout.title": "Odhlásiť sa?", + "confirmations.missing_alt_text.secondary": "Odošli aj tak", "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é.", @@ -319,6 +320,7 @@ "follow_requests.unlocked_explanation": "Aj keď váš účet nie je uzamknutý, tím domény {domain} si myslel, že môžete chcieť skontrolovať žiadosti o sledovanie z týchto účtov manuálne.", "follow_suggestions.curated_suggestion": "Výber redakcie", "follow_suggestions.dismiss": "Znova nezobrazovať", + "follow_suggestions.featured_longer": "Ručne vybrané tímom {domain}", "follow_suggestions.friends_of_friends_longer": "Populárne medzi ľudmi ktorých nasleduješ", "follow_suggestions.hints.featured": "Tento profil bol ručne zvolený tímom domény {domain}.", "follow_suggestions.hints.friends_of_friends": "Tento profil je obľúbený medzi účtami, ktoré sledujete.", @@ -452,6 +454,8 @@ "lists.delete": "Vymazať zoznam", "lists.done": "Hotovo", "lists.edit": "Upraviť zoznam", + "lists.exclusive": "Skryť členov na Domovskej osi", + "lists.exclusive_hint": "Ak je niekto na tomto zozname, skry ich na tvojej Domácej osi, aby si ich príspevky nevidel/a dvakrát.", "lists.find_users_to_add": "Nájdi užívateľov na pridanie", "lists.list_members": "Členovia zoznamu", "lists.list_name": "Názov zoznamu", @@ -465,6 +469,7 @@ "lists.replies_policy.none": "Nikomu", "lists.save": "Ulož", "lists.search": "Hľadaj", + "lists.show_replies_to": "Zahrnúť odpovede od členov zoznamu na", "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položiek} other {# nových položiek}}", "loading_indicator.label": "Načítavanie…", "media_gallery.hide": "Skryť", @@ -598,6 +603,7 @@ "onboarding.follows.done": "Hotovo", "onboarding.follows.empty": "Žiaľ, momentálne sa nedajú zobraziť žiadne výsledky. Môžete skúsiť použiť vyhľadávanie alebo navštíviť stránku objavovania a nájsť ľudí, ktorých chcete sledovať, alebo to skúste znova neskôr.", "onboarding.follows.search": "Hľadať", + "onboarding.follows.title": "Pre začiatok nasleduj ľudí", "onboarding.profile.discoverable": "Nastavte svoj profil ako objaviteľný", "onboarding.profile.discoverable_hint": "Keď si na Mastodone zapnete objaviteľnosť, vaše príspevky sa môžu zobrazovať vo výsledkoch vyhľadávania a v populárnych. Váš profil môže byť navyše navrhovaný ľuďom, s ktorými máte podobné záujmy.", "onboarding.profile.display_name": "Používateľské meno", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index da6a49b75a..21a620b3ec 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "Ett oväntat fel uppstod.", "alert.unexpected.title": "Hoppsan!", "alt_text_badge.title": "Alt-Text", + "alt_text_modal.add_alt_text": "Lägg till alt-text", + "alt_text_modal.add_text_from_image": "Lägg till text från bild", + "alt_text_modal.cancel": "Avbryt", + "alt_text_modal.change_thumbnail": "Ändra miniatyr", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Beskriv detta för personer med hörselnedsättning…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Beskriv detta för personer med synnedsättning…", + "alt_text_modal.done": "Klar", "announcement.announcement": "Meddelande", "annual_report.summary.archetype.booster": "Häftighetsjägaren", "annual_report.summary.archetype.lurker": "Smygaren", @@ -211,6 +218,7 @@ "confirmations.logout.confirm": "Logga ut", "confirmations.logout.message": "Är du säker på att du vill logga ut?", "confirmations.logout.title": "Logga ut?", + "confirmations.missing_alt_text.confirm": "Lägg till alt-text", "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.", @@ -220,7 +228,7 @@ "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?", + "confirmations.unfollow.title": "Avfölj användare?", "content_warning.hide": "Dölj inlägg", "content_warning.show": "Visa ändå", "content_warning.show_more": "Visa mer", @@ -407,6 +415,7 @@ "ignore_notifications_modal.not_followers_title": "Vill du ignorera aviseringar från personer som inte följer dig?", "ignore_notifications_modal.not_following_title": "Vill du blockera aviseringar från personer som du inte följer dig?", "ignore_notifications_modal.private_mentions_title": "Vill du ignorera aviseringar från oombedda privata omnämnanden?", + "info_button.label": "Hjälp", "interaction_modal.action.favourite": "För att fortsätta, måste du favoritmarkera från ditt konto.", "interaction_modal.action.follow": "För att fortsätta, måste du följa från ditt konto.", "interaction_modal.action.reblog": "För att fortsätta, måste du boosta från ditt konto.", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index ce44f902f9..7274f425ea 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -219,6 +219,7 @@ "confirmations.logout.message": "Ви впевнені, що хочете вийти?", "confirmations.logout.title": "Вийти?", "confirmations.missing_alt_text.confirm": "Додати альтернативний текст", + "confirmations.missing_alt_text.message": "У вашому дописі є медіа без альтернативного тексту. Додавання опису допоможе зробити ваші матеріали доступними для більшої кількості людей.", "confirmations.missing_alt_text.secondary": "Все одно опублікувати", "confirmations.missing_alt_text.title": "Додати альтернативний текст?", "confirmations.mute.confirm": "Приховати", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 2fe4f70950..88e926ffb1 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -218,6 +218,10 @@ "confirmations.logout.confirm": "Đăng xuất", "confirmations.logout.message": "Bạn có chắc muốn thoát?", "confirmations.logout.title": "Đăng xuất", + "confirmations.missing_alt_text.confirm": "Thêm văn bản thay thế", + "confirmations.missing_alt_text.message": "Tút của bạn chứa media không có văn bản thay thế. Thêm mô tả giúp nội dung của bạn dễ tiếp cận với nhiều người hơn.", + "confirmations.missing_alt_text.secondary": "Đăng luôn", + "confirmations.missing_alt_text.title": "Thêm văn bản thay thế?", "confirmations.mute.confirm": "Ẩn", "confirmations.redraft.confirm": "Xóa & viết lại", "confirmations.redraft.message": "Điều này sẽ khiến những lượt thích và đăng lại của tút bị mất, cũng như những trả lời sẽ không còn nội dung gốc.", @@ -414,6 +418,8 @@ "ignore_notifications_modal.not_followers_title": "Bỏ qua thông báo từ những người chưa theo dõi bạn?", "ignore_notifications_modal.not_following_title": "Bỏ qua thông báo từ những người bạn không theo dõi?", "ignore_notifications_modal.private_mentions_title": "Bỏ qua thông báo từ những lượt Nhắn Riêng không mong muốn?", + "info_button.label": "Trợ giúp", + "info_button.what_is_alt_text": "

Văn bản thay thế là gì?

Văn bản thay thế giúp mô tả hình ảnh cho những người khiếm thị, kết nối mạng chậm hoặc những người muốn biết ngữ cảnh bổ sung.

Bạn có thể cải thiện khả năng tiếp cận và giải thích kỹ hơn cho mọi người bằng cách viết văn bản thay thế rõ ràng, ngắn gọn và khách quan.

", "interaction_modal.action.favourite": "Để thích, bạn cần dùng tài khoản của bạn.", "interaction_modal.action.follow": "Để theo dõi, bạn cần dùng tài khoản của bạn.", "interaction_modal.action.reblog": "Để đăng lại, bạn cần dùng tài khoản của bạn.", diff --git a/app/lib/admin/system_check/media_privacy_check.rb b/app/lib/admin/system_check/media_privacy_check.rb index 2ddc8e8b07..378a8ce294 100644 --- a/app/lib/admin/system_check/media_privacy_check.rb +++ b/app/lib/admin/system_check/media_privacy_check.rb @@ -76,7 +76,7 @@ class Admin::SystemCheck::MediaPrivacyCheck < Admin::SystemCheck::BaseCheck def media_attachment @media_attachment ||= begin - attachment = Account.representative.media_attachments.first + attachment = Account.representative.media_attachments.take if attachment.present? attachment.touch attachment diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index df4fc17908..98ae651dff 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -32,6 +32,15 @@ class FeedManager "feed:#{type}:#{id}:#{subtype}" end + # The number of items in the given timeline + # @param [Symbol] type + # @param [Integer] id + # @param [Symbol] subtype + # @return [Integer] + def timeline_size(type, id, subtype = nil) + redis.zcard(key(type, id, subtype)) + end + # The filter result of the status to a particular feed # @param [Symbol] timeline_type # @param [Status] status @@ -42,7 +51,7 @@ class FeedManager when :home filter_from_home(status, receiver.id, build_crutches(receiver.id, [status]), :home) when :list - (filter_from_list?(status, receiver) ? :filter : nil) || filter_from_home(status, receiver.account_id, build_crutches(receiver.account_id, [status]), :list, stl_home: stl_home) + (filter_from_list?(status, receiver) ? :filter : nil) || filter_from_home(status, receiver.account_id, build_crutches(receiver.account_id, [status], list: receiver), :list, stl_home: stl_home) when :mentions filter_from_mentions?(status, receiver.id) ? :filter : nil when :tags @@ -136,7 +145,7 @@ class FeedManager timeline_key = key(:home, into_account.id) aggregate = into_account.user&.aggregates_reblogs? - query = from_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) + query = from_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(FeedManager::MAX_ITEMS / 4) if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4 oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i @@ -164,7 +173,7 @@ class FeedManager timeline_key = key(:list, list.id) aggregate = list.account.user&.aggregates_reblogs? - query = from_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) + query = from_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(FeedManager::MAX_ITEMS / 4) if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4 oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i @@ -172,10 +181,10 @@ class FeedManager end statuses = query.to_a - crutches = build_crutches(list.account_id, statuses) + crutches = build_crutches(list.account_id, statuses, list: list) statuses.each do |status| - next if filter_from_home(status, list.account_id, crutches) || filter_from_list?(status, list) + next if filter_from_home(status, list.account_id, crutches, :list) add_to_feed(:list, list.id, status, aggregate_reblogs: aggregate) end @@ -309,23 +318,32 @@ class FeedManager limit = FeedManager::MAX_ITEMS / 2 aggregate = account.user&.aggregates_reblogs? timeline_key = key(:home, account.id) + over_limit = false account.statuses.limit(limit).each do |status| add_to_feed(:home, account.id, status, aggregate_reblogs: aggregate) end account.following.includes(:account_stat).reorder(nil).find_each do |target_account| - if redis.zcard(timeline_key) >= limit + query = target_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(limit) + + over_limit ||= redis.zcard(timeline_key) >= limit + if over_limit oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i - last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at) + last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at, with_random: false) # If the feed is full and this account has not posted more recently # than the last item on the feed, then we can skip the whole account # because none of its statuses would stay on the feed anyway next if last_status_score < oldest_home_score + + # No need to get older statuses + query = query.where(id: oldest_home_score...) end - statuses = target_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, :account, reblog: :account).limit(limit) + statuses = query.to_a + next if statuses.empty? + crutches = build_crutches(account.id, statuses) statuses.each do |status| @@ -345,23 +363,32 @@ class FeedManager limit = FeedManager::MAX_ITEMS / 2 aggregate = list.account.user&.aggregates_reblogs? timeline_key = key(:list, list.id) + over_limit = false list.active_accounts.includes(:account_stat).reorder(nil).find_each do |target_account| - if redis.zcard(timeline_key) >= limit + query = target_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(limit) + + over_limit ||= redis.zcard(timeline_key) >= limit + if over_limit oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i - last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at) + last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at, with_random: false) # If the feed is full and this account has not posted more recently # than the last item on the feed, then we can skip the whole account # because none of its statuses would stay on the feed anyway next if last_status_score < oldest_home_score + + # No need to get older statuses + query = query.where(id: oldest_home_score...) end - statuses = target_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, :account, reblog: :account).limit(limit) - crutches = build_crutches(list.account_id, statuses) + statuses = query.to_a + next if statuses.empty? + + crutches = build_crutches(list.account_id, statuses, list: list) statuses.each do |status| - next if filter_from_home(status, list.account_id, crutches) || filter_from_list?(status, list) + next if filter_from_home(status, list.account_id, crutches, :list) add_to_feed(:list, list.id, status, aggregate_reblogs: aggregate) end @@ -632,8 +659,9 @@ class FeedManager # are going to be checked by the filtering methods # @param [Integer] receiver_id # @param [Array] statuses + # @param [List] list # @return [Hash] - def build_crutches(receiver_id, statuses) # rubocop:disable Metrics/AbcSize + def build_crutches(receiver_id, statuses, list: nil) crutches = {} crutches[:active_mentions] = crutches_active_mentions(statuses) @@ -650,25 +678,43 @@ class FeedManager arr end - lists = List.where(account_id: receiver_id, exclusive: true) - antennas = Antenna.where(list: lists, insert_feeds: true) - - replied_accounts = statuses.filter_map(&:in_reply_to_account_id) - replied_accounts += statuses.filter { |status| status.limited_visibility? && status.thread.present? }.map { |status| status.thread.account_id } - - crutches[:following] = Follow.where(account_id: receiver_id, target_account_id: replied_accounts).pluck(:target_account_id).index_with(true) + crutches[:following] = crutches_following(receiver_id, statuses, list) crutches[:languages] = Follow.where(account_id: receiver_id, target_account_id: statuses.map(&:account_id)).pluck(:target_account_id, :languages).to_h crutches[:hiding_reblogs] = Follow.where(account_id: receiver_id, target_account_id: statuses.filter_map { |s| s.account_id if s.reblog? }, show_reblogs: false).pluck(:target_account_id).index_with(true) crutches[:blocking] = Block.where(account_id: receiver_id, target_account_id: check_for_blocks).pluck(:target_account_id).index_with(true) crutches[:muting] = Mute.where(account_id: receiver_id, target_account_id: check_for_blocks).pluck(:target_account_id).index_with(true) crutches[:domain_blocking] = AccountDomainBlock.where(account_id: receiver_id, domain: statuses.flat_map { |s| [s.account.domain, s.reblog&.account&.domain] }.compact).pluck(:domain).index_with(true) crutches[:blocked_by] = Block.where(target_account_id: receiver_id, account_id: statuses.map { |s| [s.account_id, s.reblog&.account_id] }.flatten.compact).pluck(:account_id).index_with(true) - crutches[:exclusive_list_users] = ListAccount.where(list: lists, account_id: statuses.map(&:account_id)).pluck(:account_id).index_with(true) - crutches[:exclusive_antenna_users] = AntennaAccount.where(antenna: antennas, account_id: statuses.map(&:account_id)).pluck(:account_id).index_with(true) + crutches[:exclusive_list_users] = crutches_exclusive_list_users(receiver_id, statuses) if list.blank? + crutches[:exclusive_antenna_users] = crutches_exclusive_antenna_users(receiver_id, statuses) crutches end + def crutches_exclusive_list_users(recipient_id, statuses) + lists = List.where(account_id: recipient_id, exclusive: true) + ListAccount.where(list: lists, account_id: statuses.map(&:account_id)).pluck(:account_id).index_with(true) + end + + def crutches_exclusive_antenna_users(recipient_id, statuses) + lists = List.where(account_id: recipient_id, exclusive: true) + antennas = Antenna.where(list: lists, insert_feeds: true) + AntennaAccount.where(antenna: antennas, account_id: statuses.map(&:account_id)).pluck(:account_id).index_with(true) + end + + def crutches_following(recipient_id, statuses, list) + if list.blank? || list.show_followed? + replied_accounts = statuses.filter_map(&:in_reply_to_account_id) + replied_accounts += statuses.filter { |status| status.limited_visibility? && status.thread.present? }.map { |status| status.thread.account_id } + + Follow.where(account_id: recipient_id, target_account_id: replied_accounts).pluck(:target_account_id).index_with(true) + elsif list.show_list? + ListAccount.where(list_id: list.id, account_id: statuses.filter_map(&:in_reply_to_account_id)).pluck(:account_id).index_with(true) + else + {} + end + end + def crutches_active_mentions(statuses) Mention .active diff --git a/app/services/precompute_feed_service.rb b/app/services/precompute_feed_service.rb index 86aad50983..a591c90913 100644 --- a/app/services/precompute_feed_service.rb +++ b/app/services/precompute_feed_service.rb @@ -3,13 +3,21 @@ class PrecomputeFeedService < BaseService include Redisable - def call(account) - FeedManager.instance.populate_home(account) + def call(account, skip_filled_timelines: false) + @skip_filled_timelines = skip_filled_timelines + + FeedManager.instance.populate_home(account) unless skip_timeline?(:home, account.id) account.owned_lists.each do |list| - FeedManager.instance.populate_list(list) + FeedManager.instance.populate_list(list) unless skip_timeline?(:list, list.id) end ensure redis.del("account:#{account.id}:regeneration") end + + private + + def skip_timeline?(type, id) + @skip_filled_timelines && FeedManager.instance.timeline_size(type, id) * 2 > FeedManager::MAX_ITEMS + end end diff --git a/config/initializers/prometheus_exporter.rb b/config/initializers/prometheus_exporter.rb index 197777e3b6..fab095658f 100644 --- a/config/initializers/prometheus_exporter.rb +++ b/config/initializers/prometheus_exporter.rb @@ -2,6 +2,7 @@ if ENV['MASTODON_PROMETHEUS_EXPORTER_ENABLED'] == 'true' if ENV['MASTODON_PROMETHEUS_EXPORTER_LOCAL'] == 'true' + require 'prometheus_exporter' require 'prometheus_exporter/server' require 'prometheus_exporter/client' diff --git a/config/locales/activerecord.ru.yml b/config/locales/activerecord.ru.yml index 8769212d52..79d39a5cdc 100644 --- a/config/locales/activerecord.ru.yml +++ b/config/locales/activerecord.ru.yml @@ -23,6 +23,8 @@ ru: models: account: attributes: + fields: + fields_with_values_missing_labels: содержит значения с отсутствующими ключами username: invalid: только буквы, цифры и символ подчёркивания reserved: зарезервировано diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 432737f8c3..65f6696ee6 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1200,6 +1200,7 @@ bg: too_fast: Образецът подаден пребързо, опитайте пак. use_security_key: Употреба на ключ за сигурност user_agreement_html: Прочетох и се съгласявам с условията на услугата и политиката за поверителност + user_privacy_agreement_html: Прочетох и има съгласието ми за политиката за поверителност author_attribution: example_title: Примерен текст hint_html: Пишете ли новинарски статии или блогове извън Mastodon? Управлявайте как ви приписват авторството, когато са споделени в Mastodon. diff --git a/config/locales/ca.yml b/config/locales/ca.yml index c602b36c8c..53f1dc6815 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -948,6 +948,9 @@ ca: preview: explanation_html: 'Aquest correu-e s''enviarà a %{display_count} usuaris que han signat abans de %{date}. S''hi inclourà aquest text:' send_preview: Envia una vista prèvia a %{email} + send_to_all: + one: Envia %{display_count} correu-e + other: Envia %{display_count} correus-e title: Vista prèvia de la notificació de les condicions de servei publish: Publica published_on_html: Publicada el %{date} @@ -1411,6 +1414,22 @@ ca: merge_long: Mantenir els registres existents i afegir-ne de nous overwrite: Sobreescriu overwrite_long: Reemplaça els registres actuals amb els nous + overwrite_preambles: + blocking_html: + one: Esteu a punt de reemplaçar la vostra llista de blocats amb fins a %{count} compte des de %{filename}. + other: Esteu a punt de reemplaçar la vostra llista de blocats amb fins a %{count} comptes des de %{filename}. + bookmarks_html: + one: Esteu a punt de reemplaçar els vostres marcadors amb fins a %{count} publicació des de %{filename}. + other: Esteu a punt de reemplaçar els vostres marcadors amb fins a %{count} publicacions des de %{filename}. + domain_blocking_html: + one: Esteu a punt de reemplaçar la vostra llista de dominis blocats amb fins a %{count} domini des de %{filename}. + other: Esteu a punt de reemplaçar la vostra llista de dominis blocats amb fins a %{count} dominis des de %{filename}. + following_html: + one: Esteu a punt de seguir fins a %{count} compte des de %{filename} i deixar de seguir la resta. + other: Esteu a punt de seguir fins a %{count} comptes des de %{filename} i deixar de seguir la resta. + lists_html: + one: Esteu a punt de reemplaçar les vostres llistes amb contactes de %{filename}. S'afegirà %{count} compte a les noves llistes. + other: Esteu a punt de reemplaçar les vostres llistes amb contactes de %{filename}. S'afegiran fins a %{count} comptes a les noves llistes. preface: Pots importar algunes les dades que has exportat des d'un altre servidor, com ara el llistat de les persones que estàs seguint o bloquejant. recent_imports: Importacions recents states: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index c2cf685503..f64040a267 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1285,6 +1285,7 @@ cy: too_fast: Cafodd y ffurflen ei chyflwyno'n rhy gyflym, ceisiwch eto. use_security_key: Defnyddiwch allwedd diogelwch user_agreement_html: Rwyf wedi darllen ac yn cytuno i delerau gwasanaeth a'r polisi preifatrwydd + user_privacy_agreement_html: Rwyf wedi darllen ac yn cytuno i'r polisi preifatrwydd author_attribution: example_title: Testun enghreifftiol hint_html: Ydych chi'n ysgrifennu erthyglau newyddion neu flog y tu allan i Mastodon? Rheolwch sut y byddwch yn cael eich cydnabod pan fyddan nhw'n cael eu rhannu ar Mastodon. diff --git a/config/locales/da.yml b/config/locales/da.yml index b567fa016c..3ed9d40db9 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -9,12 +9,12 @@ da: accounts: followers: one: Følger - other: tilhængere + other: Følgere following: Følger instance_actor_flash: Denne konto er en virtuel aktør repræsenterende selve serveren og ikke en individuel bruger. Den anvendes til fællesformål og bør ikke suspenderes. last_active: senest aktiv link_verified_on: Ejerskab af dette link blev tjekket %{date} - nothing_here: Der er intet hér! + nothing_here: Der er intet her! pin_errors: following: Man skal allerede følge den person, man ønsker at støtte posts: @@ -108,11 +108,11 @@ da: not_subscribed: Abonnerer ikke pending: Afventende vurdering perform_full_suspension: Suspendér - previous_strikes: Tidligere anmeldelser (strikes) + previous_strikes: Tidligere anmeldelser previous_strikes_description_html: one: Denne konto har en anmeldelse. other: Denne konto har %{count} anmeldelser. - promote: Fremhæv + promote: Forfrem protocol: Protokol public: Offentlig push_subscription_expires: PuSH-abonnement udløber @@ -123,9 +123,9 @@ da: remote_suspension_irreversible: Denne kontos data er slettet permanent. remote_suspension_reversible_hint_html: Kontoen er suspenderet på den pågældende server, og kontodata fjernes fuldstændig pr. %{date}. Indtil da vil fjernserveren kunne foretage en komplet reetablering af kontoen. Ønskes alle kontodata fjernet straks, kan dette gøres nedenfor. remove_avatar: Fjern profilbillede - remove_header: Fjern overskrift + remove_header: Fjern banner removed_avatar_msg: "%{username}s profilbillede fjernet" - removed_header_msg: "%{username}s overskriftsbillede fjernet" + removed_header_msg: "%{username}s banner fjernet" resend_confirmation: already_confirmed: Denne bruger er allerede bekræftet send: Gensend bekræftelseslink @@ -141,8 +141,8 @@ da: security_measures: only_password: Kun adgangskode password_and_2fa: Adgangskode og 2FA - sensitive: Gennemtving sensitiv - sensitized: Markeret som sensitiv + sensitive: Gennemtving følsom + sensitized: Markeret som følsom shared_inbox_url: Delt indbakke-URL show: created_reports: Indsendte anmeldelser @@ -160,7 +160,7 @@ da: unblock_email: Afblokér e-mailadresse unblocked_email_msg: "%{username}s e-mail-adresse afblokeret" unconfirmed_email: Ubekræftet e-mail - undo_sensitized: Fortryd gennemtving sensitiv + undo_sensitized: Fortryd gennemtving-følsom undo_silenced: Fortryd begrænsning undo_suspension: Fortryd suspendering unsilenced_msg: "%{username}s kontobegrænsning er fjernet" @@ -169,8 +169,8 @@ da: username: Brugernavn view_domain: Vis domæneoversigt warn: Advar - web: Web - whitelisted: Tilladt for federering + web: Net + whitelisted: Tilladt for føderation action_logs: action_types: approve_appeal: Godkend appel @@ -225,8 +225,8 @@ da: sensitive_account: Gennemtving sensitiv konto silence_account: Begræns konto suspend_account: Suspendér konto - unassigned_report: Fjer anmeldelsestildeling - unblock_email_account: Afblokér e-mailadresse + unassigned_report: Fjern anmeldelsestildeling + unblock_email_account: Fjern blokering af e-mailadresse unsensitive_account: Fjern Gennemtving sensitiv konto unsilence_account: Fjern kontobegrænselse unsuspend_account: Afsuspendér konto @@ -374,7 +374,7 @@ da: other: "%{count} verserende anmeldelser" pending_tags_html: one: "%{count} afventende hashtag" - other: "%{count} afventende hashtags" + other: "%{count} afventende etiketter" pending_users_html: one: "%{count} afventende bruger" other: "%{count} afventende brugere" @@ -735,7 +735,7 @@ da: manage_settings: Håndtere indstillinger manage_settings_description: Tillader brugere at ændre webstedsindstillinger manage_taxonomies: Håndtere taksonomier - manage_taxonomies_description: Tillader brugere at gennemse tenderende indhold og opdatere hashtag-indstillinger + manage_taxonomies_description: Tillader brugere at gennemse tenderende indhold og opdatere etiket-indstillinger manage_user_access: Håndtere brugeradgang manage_user_access_description: Tillader brugere at deaktivere andre brugeres tofaktorgodkendelse, skifte deres e-mailadresse og nulstille deres adgangskode manage_users: Håndtere brugere @@ -925,7 +925,7 @@ da: reset: Nulstil review: Gennmgangsstatus search: Søg - title: Hashtags + title: Etiketter updated_msg: Hashtag-indstillinger opdateret terms_of_service: back: Tilbage til Tjenestevilkår @@ -1014,14 +1014,14 @@ da: tag_servers_dimension: Topservere tag_servers_measure: forskellige servere tag_uses_measure: anvendelser i alt - description_html: Disse er hashtags, som pt. vises i en masse indlæg, som serveren ser. Det kan hjælpe brugerne til at finde ud af, hvad folk taler mest om pt. Ingen hashtags vises offentligt, før man godkender dem. + description_html: Disse er etiketter, som pt. vises i en masse indlæg, som serveren ser. Det kan hjælpe brugerne til at finde ud af, hvad folk taler mest om pt. Ingen etiketter vises offentligt, før man godkender dem. listable: Kan foreslås no_tag_selected: Intet tag ændret (da intet var valgt) not_listable: Foreslås ikke not_trendable: Vises ikke under tendenser not_usable: Kan ikke anvendes peaked_on_and_decaying: Toppede pr. %{date}, nu for nedadgående - title: Populære hashtags + title: Populære etiketter trendable: Kan vises under tendenser trending_rank: 'Populær #%{rank}' usable: Kan anvendes @@ -1093,7 +1093,7 @@ da: new_trending_statuses: title: Populære opslag new_trending_tags: - title: Populære hashtags + title: Populære etiketter subject: Nye tendenser klar til gennemgang på %{instance} aliases: add_new: Opret alias @@ -1104,7 +1104,7 @@ da: remove: Fjern aliaslinkning appearance: advanced_web_interface: Avanceret webgrænseflade - advanced_web_interface_hint: 'Ønsker du udnytte hele skærmbredden, lader den avancerede webgrænseflade dig opsætte mange forskellige kolonner for at se så meget information på samme tid som ønsket: Hjem, notifikationer, federeret tidslinje, et hvilket som helst antal lister og hashtags.' + advanced_web_interface_hint: 'Ønsker du udnytte hele skærmbredden, lader den avancerede netgrænseflade dig opsætte mange forskellige kolonner for at se så meget information på samme tid som ønsket: Hjem, notifikationer, fødereret tidslinje, et hvilket som helst antal lister og etiketter.' animations_and_accessibility: Animationer og tilgængelighed confirmation_dialogs: Bekræftelsesdialoger discovery: Opdagelse @@ -1326,13 +1326,13 @@ da: csv: CSV domain_blocks: Domæneblokeringer lists: Lister - mutes: Du tavsgør + mutes: Du skjuler storage: Medielagerplads featured_tags: add_new: Tilføj nyt errors: - limit: Det maksimale antal hashtags er allerede fremhævet - hint_html: "Hvad er fremhævede hashtags? De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse hashtags. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter." + limit: Det maksimale antal etiketter er allerede fremhævet + hint_html: "Hvad er fremhævede etiketter? De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse etiketter. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter." filters: contexts: account: Profiler @@ -1432,7 +1432,7 @@ da: other: Man er ved at erstatte sine lister med indhold fra %{filename}. Op til %{count} konti føjes til nye lister. muting_html: one: Man er ved at sin liste over en tavsgjort konto med %{count} konto fra %{filename}. - other: Man er ved at sin liste over tavsgjorte konti med op til %{count} konti fra %{filename}. + other: Du er ved at erstatte din liste over skjulte kontoer med op til %{count} kontoer fra %{filename}. preambles: blocking_html: one: Man er ved at blokere %{count} konto fra %{filename}. @@ -1451,7 +1451,7 @@ da: other: Man er ved at tilføje %{count} konti fra %{filename} til sine lister. Nye lister oprettes, hvis der ikke findes nogen liste at tilføje til. muting_html: one: Man er ved at tavsgøre %{count} konto fra %{filename}. - other: Man er ved at tavsgøre op til %{count} konto fra %{filename}. + other: Du er ved at skjule op til %{count} kontoer fra %{filename}. preface: Du kan importere data, du har eksporteret fra en anden server, såsom en liste over folk du følger eller blokerer. recent_imports: Seneste importer states: @@ -1468,11 +1468,11 @@ da: domain_blocking: Importerer blokerede konti following: Importerer fulgte konti lists: Import af lister - muting: Importerer tavsgjorte konti + muting: Importerer skjulte kontoer type: Importtype type_groups: constructive: Følger og Bogmærker - destructive: Blokeringer og tavsgjorte + destructive: Blokerede og skjulte kontoer types: blocking: Blokeringsliste bookmarks: Bogmærker @@ -1529,7 +1529,7 @@ da: follow: e-mailnotifikationer om nye følgere follow_request: e-mailnotifikationer om følgeanmodninger mention: e-mailnotifikationer om omtaler - reblog: e-mailnotifikationer om boosts + reblog: e-mailnotifikationer om fremhævelser resubscribe_html: Har man afmeldt sig ved en fejl, kan man gentilmelde sig via indstillingerne E-mailnotifikationer. success_html: Man vil ikke længere modtage %{type} for Mastodon på %{domain} til e-mailen %{email}. title: Opsig abonnement @@ -1574,7 +1574,7 @@ da: title: Moderation move_handler: carry_blocks_over_text: Denne bruger er flyttet fra %{acct}, som du har haft blokeret. - carry_mutes_over_text: Denne bruger er flyttet fra %{acct}, som du har haft tavsgjort. + carry_mutes_over_text: Denne bruger er flyttet fra %{acct}, som du har haft skjult. copy_account_note_text: 'Denne bruger er flyttet fra %{acct}, hvor dine tidligere noter om dem var:' navigation: toggle_menu: Åbn/luk menu @@ -1605,9 +1605,9 @@ da: poll: subject: En afstemning fra %{name} er afsluttet reblog: - body: 'Dit indlæg blev boostet af %{name}:' - subject: "%{name} boostede dit indlæg" - title: Nyt boost + body: 'Dit indlæg blev fremhævet af %{name}:' + subject: "%{name} fremhævede dit indlæg" + title: Ny fremhævelse status: subject: "%{name} har netop postet" update: @@ -1704,7 +1704,7 @@ da: content_warning: 'Indholdsadvarsel:' descriptions: account: Offentlige indlæg fra @%{acct} - tag: 'Offentlige indlæg tagget #%{hashtag}' + tag: 'Offentlige indlæg etiketteret #%{hashtag}' scheduled_statuses: over_daily_limit: Den daglige grænse på %{limit} planlagte indlæg er nået over_total_limit: Grænsen på %{limit} planlagte indlæg er nået @@ -1769,7 +1769,7 @@ da: development: Udvikling edit_profile: Redigér profil export: Eksport - featured_tags: Udvalgte hashtags + featured_tags: Udvalgte etiketter import: Import import_and_export: Import og eksport migrate: Kontomigrering @@ -1805,12 +1805,12 @@ da: video: one: "%{count} video" other: "%{count} videoer" - boosted_from_html: Boostet fra %{acct_link} + boosted_from_html: Fremhævet fra %{acct_link} content_warning: 'Indholdsadvarsel: %{warning}' default_language: Samme som UI-sproget disallowed_hashtags: - one: 'indeholdte et ikke tilladt hashtag: %{tags}' - other: 'indeholdte de ikke tilladte hashtags: %{tags}' + one: 'indeholdte en ikke tilladt etiket: %{tags}' + other: 'indeholdte de ikke tilladte etiketter: %{tags}' edited_at_html: Redigeret %{date} errors: in_reply_not_found: Indlægget, der forsøges besvaret, ser ikke ud til at eksistere. @@ -1819,7 +1819,7 @@ da: direct: Indlæg, som kun kan ses af omtalte brugere, kan ikke fastgøres limit: Maksimalt antal indlæg allerede fastgjort ownership: Andres indlæg kan ikke fastgøres - reblog: Et boost kan ikke fastgøres + reblog: En fremhævelse kan ikke fastgøres title: '%{name}: "%{quote}"' visibilities: direct: Direkte @@ -1835,9 +1835,9 @@ da: exceptions: Undtagelser explanation: Sletning af indlæg er en ressourcekrævende operation, hvorfor dette sker gradvist over tid, når serveren ellers ikke er optaget. Indlæg kan derfor blive slettet efter, at de reelt har passeret aldersgrænsen. ignore_favs: Ignorér favoritter - ignore_reblogs: Ignorér boosts + ignore_reblogs: Ignorér fremhævelser interaction_exceptions: Undtagelser baseret på interaktioner - interaction_exceptions_explanation: Bemærk, at det ikke garanteres, at indlæg slettes, hvis de når under favorit- eller boost-tærsklerne efter én gang at været nået over dem. + interaction_exceptions_explanation: Bemærk, at det ikke garanteres, at indlæg slettes, hvis de når under favorit- eller fremhævelses-tærsklerne efter én gang at været nået over dem. keep_direct: Behold direkte besked keep_direct_hint: Sletter ingen af dine direkte beskeder keep_media: Behold indlæg med medievedhæftninger @@ -1862,8 +1862,8 @@ da: min_age_label: Alderstærskel min_favs: Behold indlæg favoritmarkeret mindst min_favs_hint: Sletter ingen egne indlæg, som har modtaget minimum dette antal favoritmarkeringer. Lad stå tomt for at slette indlæg uanset favoritmarkeringer - min_reblogs: Behold indlæg boostet mindst - min_reblogs_hint: Sletter ingen egne indlæg, som er boostet flere end dette antal gange. Lad stå tomt for at ignorere denne tærskel under sletning + min_reblogs: Behold indlæg fremhævet mindst + min_reblogs_hint: Sletter ingen af egne indlæg, som er fremhævet flere end dette antal gange. Lad stå tomt for at ignorere denne tærskel under sletning stream_entries: sensitive_content: Sensitivt indhold strikes: @@ -2003,8 +2003,8 @@ da: one: "%{people} person de seneste 2 dage" other: "%{people} personer de seneste 2 dage" hashtags_subtitle: Udforsk de seneste 2 dages tendenser - hashtags_title: Populære hashtags - hashtags_view_more: Se flere populære hashtags + hashtags_title: Populære etiketter + hashtags_view_more: Se flere populære etiketter post_action: Skriv post_step: Sig hej til verden med tekst, fotos, videoer eller afstemninger. post_title: Opret det første indlæg diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml index 7ac16e0012..a10bee34df 100644 --- a/config/locales/doorkeeper.da.yml +++ b/config/locales/doorkeeper.da.yml @@ -130,11 +130,11 @@ da: crypto: Ende-til-ende kryptering favourites: Favoritter filters: Filtre - follow: Følger, Tavsgør og Blokerer + follow: Fulgte, skjjulte og blokerede kontoer follows: Følger lists: Lister media: Medievedhæftninger - mutes: Tavsgørelser + mutes: Skjulte kontoer notifications: Notifikationer profile: Din Mastodon-profil push: Push-notifikationer @@ -177,7 +177,7 @@ da: read:filters: se dine filtre read:follows: se dine følger read:lists: se dine lister - read:mutes: se dine tavsgørelser + read:mutes: se dine skjulte kontoer read:notifications: se dine notifikationer read:reports: se dine anmeldelser read:search: søg på dine vegne @@ -186,13 +186,13 @@ da: write:accounts: ændre din profil write:blocks: blokere konti og domæner write:bookmarks: bogmærke indlæg - write:conversations: tavsgøre og slette konversationer + write:conversations: skjul og slet samtaler write:favourites: favoritmarkere indlæg write:filters: oprette filtre write:follows: følge personer write:lists: oprette lister write:media: uploade mediefiler - write:mutes: tavsgøre personer og konversationer + write:mutes: skjul personer og samtaler write:notifications: rydde dine notifikationer write:reports: anmelde personer write:statuses: udgive indlæg diff --git a/config/locales/doorkeeper.eo.yml b/config/locales/doorkeeper.eo.yml index 36a5ed1974..ede1ef815e 100644 --- a/config/locales/doorkeeper.eo.yml +++ b/config/locales/doorkeeper.eo.yml @@ -191,7 +191,7 @@ eo: write:filters: krei filtrilojn write:follows: sekvi homojn write:lists: krei listojn - write:media: alŝuti plurmediojn + write:media: alŝuti aŭdovidaĵojn write:mutes: silentigi homojn kaj konversaciojn write:notifications: forigi viajn sciigojn write:reports: signali aliajn homojn diff --git a/config/locales/eo.yml b/config/locales/eo.yml index d56d67e28e..085081b15a 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -363,7 +363,7 @@ eo: dashboard: active_users: aktivaj uzantoj interactions: interago - media_storage: Konservo de plurmedioj + media_storage: Konservo de aŭdovidaĵoj new_users: novaj uzantoj opened_reports: raportoj malfermitaj pending_appeals_html: @@ -508,7 +508,7 @@ eo: description_html: Vi povas difini enhavopolitikojn al la ĉiuj kontoj. limited_federation_mode_description_html: Vi povas elekti, ĉu permesi federacion kun tiu domajno. policies: - reject_media: Malakcepti plurmediojn + reject_media: Malakcepti la vidaŭdaĵojn reject_reports: Malakcepti raportojn silence: Kaŝu suspend: Suspendi diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 56f66609c3..9945e44c07 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1266,6 +1266,7 @@ ga: too_fast: Cuireadh an fhoirm isteach róthapa, triail arís. use_security_key: Úsáid eochair shlándála user_agreement_html: Léigh mé agus aontaím leis na téarmaí seirbhíse agus polasaí príobháideachais + user_privacy_agreement_html: Léigh mé agus aontaím leis an polasaí príobháideachais author_attribution: example_title: Téacs samplach hint_html: An bhfuil tú ag scríobh altanna nuachta nó blag lasmuigh de Mastodon? Rialú conas a gheobhaidh tú creidmheas nuair a roinntear iad ar Mastodon. diff --git a/config/locales/ia.yml b/config/locales/ia.yml index f42271d16c..838acfd4d6 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -1209,6 +1209,7 @@ ia: too_fast: Formulario inviate troppo rapidemente. Tenta lo de novo. use_security_key: Usar clave de securitate user_agreement_html: Io ha legite e accepta le conditiones de servicio e le politica de confidentialitate + user_privacy_agreement_html: Io ha legite e io accepta le politica de confidentialitate author_attribution: example_title: Texto de exemplo hint_html: Scribe tu articulos de novas o de blog foras de Mastodon? Controla le maniera in que tu recipe attribution quando on los condivide sur Mastodon. diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 5405cabd9b..9937375640 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1673,7 +1673,7 @@ ko: over_total_limit: 예약 게시물 제한 %{limit}을 초과합니다 too_soon: 미래의 날짜여야 합니다 self_destruct: - lead_html: 안타깝게도, %{domain} 도메인을 영구히 폐쇄합니다. 이곳의 계정을 가졌다면, 이제 이용할 수 없으며, 당분간 백업 데이터를 요청할 수 있습니다. + lead_html: 안타깝게도, %{domain}은 영구적으로 폐쇄됩니다. 이곳의 계정을 가지고 있었다면, 이제 이용할 수 없지만 백업 데이터는 요청할 수 있습니다. title: 이 서버는 폐쇄중입니다 sessions: activity: 최근 활동 diff --git a/config/locales/pl.yml b/config/locales/pl.yml index e2e2860059..5770b4ce0c 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1247,6 +1247,7 @@ pl: too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie. use_security_key: Użyj klucza bezpieczeństwa user_agreement_html: Przeczytałem i akceptuję warunki korzystania z usługi oraz politykę prywatności + user_privacy_agreement_html: Przeczytałem/am/o i akceptuję politykę prywatności author_attribution: example_title: Przykładowy tekst hint_html: Piszesz wiadomości albo bloga poza Mastodonem? Kontroluj jak będą ci przypisywane podczas dizielenia się nimi na Mastodonie. diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 2db629cafc..fe0d797ff8 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1247,6 +1247,7 @@ ru: too_fast: Форма отправлена слишком быстро, попробуйте еще раз. use_security_key: Использовать ключ безопасности user_agreement_html: Мной прочитаны и принятыпользовательское соглашение и политика конфиденциальности + user_privacy_agreement_html: Мной прочитана и принята политика конфиденциальности author_attribution: example_title: Образец текста hint_html: Публикуете ли вы свои статьи где-либо ещё кроме Mastodon? Если да, то ваше авторство может быть упомянуто, когда ими делятся в Mastodon. diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 37ad72a7e4..ee0a3ae561 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -233,6 +233,7 @@ cs: setting_display_media_show_all: Zobrazit vše setting_expand_spoilers: Vždy rozbalit příspěvky označené varováními o obsahu setting_hide_network: Skrýt mou síť + setting_missing_alt_text_modal: Zobrazit potvrzovací dialog před odesláním médií bez alt textu setting_reduce_motion: Omezit pohyb v animacích setting_system_font_ui: Použít výchozí písmo systému setting_system_scrollbars_ui: Použít výchozí posuvník systému diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 1220ceabf3..805f8f93af 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -3,6 +3,7 @@ cy: simple_form: hints: account: + attribution_domains: Un i bob llinell. Yn amddiffyn rhag priodoli ffug. discoverable: Mae'n bosibl y bydd eich postiadau cyhoeddus a'ch proffil yn cael sylw neu'n cael eu hargymell mewn gwahanol feysydd o Mastodon ac efallai y bydd eich proffil yn cael ei awgrymu i ddefnyddwyr eraill. display_name: Eich enw llawn neu'ch enw hwyl. fields: Eich tudalen cartref, rhagenwau, oed, neu unrhyw beth. @@ -155,6 +156,7 @@ cy: url: I ble bydd digwyddiadau'n cael eu hanfon labels: account: + attribution_domains: Gwefannau sy'n cael caniatâd i'ch cydnabod chi discoverable: Proffil nodwedd a phostiadau mewn algorithmau darganfod fields: name: Label @@ -231,6 +233,7 @@ cy: setting_display_media_show_all: Dangos popeth setting_expand_spoilers: Dangos postiadau wedi'u marcio â rhybudd cynnwys bob tro setting_hide_network: Cuddio eich graff cymdeithasol + setting_missing_alt_text_modal: Dangos deialog cadarnhau cyn postio cyfrwng heb destun amgen setting_reduce_motion: Lleihau mudiant mewn animeiddiadau setting_system_font_ui: Defnyddio ffont rhagosodedig y system setting_system_scrollbars_ui: Defnyddiwch far sgrolio rhagosodedig y system diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 96bd1b3e70..1548e3e24e 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -8,7 +8,7 @@ da: display_name: Dit fulde navn eller dit sjove navn. fields: Din hjemmeside, dine pronominer, din alder, eller hvad du har lyst til. indexable: Dine offentlige indlæg vil kunne vises i Mastodon-søgeresultater. Folk, som har interageret med dem, vil kunne finde dem uanset. - note: 'Du kan @omtale andre personer eller #hashtags.' + note: 'Du kan @omtale andre personer eller #etiketter.' show_collections: Folk vil ikke kunne tjekke dine Følger og Følgere. Folk, du selv følger, vil stadig kunne se dette. unlocked: Man vil kunne følges af folk uden først at godkende dem. Ønsker man at gennemgå Følg-anmodninger og individuelt acceptere/afvise nye følgere, så fjern markeringen. account_alias: @@ -16,7 +16,7 @@ da: account_migration: acct: Angiv brugernavn@domain for den konto, hvortil du vil flytte account_warning_preset: - text: Du kan bruge indlægssyntaks, såsom URL'er, hashtags og omtaler + text: Du kan bruge indlægssyntaks, såsom URL'er, etiketter og omtaler title: Valgfri. Ikke synlig for modtageren admin_account_action: include_statuses: Brugeren vil se, hvilke indlæg, som har forårsaget modereringen/advarslen @@ -54,7 +54,7 @@ da: password: Brug mindst 8 tegn phrase: Matches uanset uanset brug af store/små bogstaver i teksten eller indholdsadvarsel for et indlæg scopes: De API'er, som applikationen vil kunne tilgå. Vælges en topniveaudstrækning, vil detailvalg være unødvendige. - setting_aggregate_reblogs: Vis ikke nye boosts for nyligt boostede indlæg (påvirker kun nyligt modtagne boosts) + setting_aggregate_reblogs: Vis ikke nye fremhævelser for nyligt fremhævede indlæg (påvirker kun nyligt modtagne fremhævelser) setting_always_send_emails: Normalt sendes ingen e-mailnotifikationer under aktivt brug af Mastodon setting_default_sensitive: Sensitive medier er som standard skjult og kan vises med et klik setting_display_media_default: Skjul medier med sensitiv-markering @@ -71,7 +71,7 @@ da: domain: Dette kan være domænenavnet vist i den benyttede i e-mailadresse eller MX-post. Begge tjekkes under tilmelding. with_dns_records: Et forsøg på at opløse det givne domænes DNS-poster foretages, og resultaterne blokeres ligeledes featured_tag: - name: 'Her er nogle af dine hyppigst brugte hashtags:' + name: 'Her er nogle af dine hyppigst brugte etiketter:' filters: action: Vælg handlingen til eksekvering, når et indlæg matcher filteret actions: @@ -83,7 +83,7 @@ da: backups_retention_period: Brugere har mulighed for at generere arkiver af deres indlæg til senere downloade. Når sat til positiv værdi, vil disse arkiver automatisk blive slettet fra lagerpladsen efter det angivne antal dage. bootstrap_timeline_accounts: Disse konti fastgøres øverst på nye brugeres følg-anbefalinger. closed_registrations_message: Vises, når tilmeldinger er lukket - content_cache_retention_period: Alle indlæg fra andre servere (herunder boosts og besvarelser) slettes efter det angivne antal dage uden hensyn til lokal brugerinteraktion med disse indlæg. Dette omfatter indlæg, hvor en lokal bruger har markeret dem som bogmærker eller favoritter. Private omtaler mellem brugere fra forskellige instanser vil også være tabt og umulige at gendanne. Brugen af denne indstilling er beregnet til særlige formål instanser og bryder mange brugerforventninger ved implementering til almindelig brug. + content_cache_retention_period: Alle indlæg fra andre servere (herunder fremhævelser og besvarelser) slettes efter det angivne antal dage uden hensyn til lokal brugerinteraktion med disse indlæg. Dette omfatter indlæg, hvor en lokal bruger har markeret dem som bogmærker eller favoritter. Private omtaler mellem brugere fra forskellige instanser vil også være tabt og umulige at gendanne. Brugen af denne indstilling er beregnet til særlige formål instanser og bryder mange brugerforventninger ved implementering til almindelig brug. custom_css: Man kan anvende tilpassede stilarter på Mastodon-webversionen. favicon: WEBP, PNG, GIF eller JPG. Tilsidesætter standard Mastodon favikonet på mobilenheder med et tilpasset ikon. mascot: Tilsidesætter illustrationen i den avancerede webgrænseflade. @@ -102,7 +102,7 @@ da: thumbnail: Et ca. 2:1 billede vist sammen med serveroplysningerne. timeline_preview: Udloggede besøgende kan gennemse serverens seneste offentlige indlæg. trendable_by_default: Spring manuel gennemgang af trendindhold over. Individuelle elementer kan stadig fjernes fra trends efter kendsgerningen. - trends: Tendenser viser, hvilke indlæg, hashtags og nyheder opnår momentum på serveren. + trends: Tendenser viser, hvilke indlæg, etiketter og nyheder opnår momentum på serveren. trends_as_landing_page: Vis tendensindhold til udloggede brugere og besøgende i stedet for en beskrivelse af denne server. Kræver, at tendenser er aktiveret. form_challenge: current_password: Du bevæger dig ind på et sikkert område @@ -217,10 +217,10 @@ da: password: Adgangskode phrase: Nøgleord/-sætning setting_advanced_layout: Aktivér avanceret webgrænseflade - setting_aggregate_reblogs: Gruppér boosts på tidslinjer + setting_aggregate_reblogs: Gruppér fremhævelser på tidslinjer setting_always_send_emails: Send altid e-mailnotifikationer setting_auto_play_gif: Autoafspil animerede GIF'er - setting_boost_modal: Vis bekræftelsesdialog inden boosting + setting_boost_modal: Vis bekræftelsesdialog inden fremhævelse setting_default_language: Sprog for indlæg setting_default_privacy: Fortrolighed for indlæg setting_default_sensitive: Markér altid medier som sensitive @@ -311,7 +311,7 @@ da: follow_request: Nogen anmodede om at følge dig mention: Nogen omtalte dig pending_account: Ny konto kræver gennemgang - reblog: Nogen boostede dit indlæg + reblog: Nogen fremhævede dit indlæg report: Ny anmeldelse indsendt software_updates: all: Notificér ved alle opdateringer @@ -327,10 +327,10 @@ da: indexable: Inkludér profilside i søgemaskiner show_application: Vis, fra hvilken app et indlæg er sendt tag: - listable: Tillad visning af dette hashtag i søgninger og forslag + listable: Tillad visning af denne etiket i søgninger og forslag name: Hashtag - trendable: Tillad visning af dette hashtag under trends - usable: Tillad indlæg at benytte dette hashtag lokalt + trendable: Tillad visning af denne etiket under tendenser + usable: Tillad indlæg at benytte denne etiket lokalt terms_of_service: changelog: Hvad der er ændret? text: Tjenestevilkår diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index fa7868cc76..8a4cb247c7 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -233,6 +233,7 @@ en-GB: setting_display_media_show_all: Show all setting_expand_spoilers: Always expand posts marked with content warnings setting_hide_network: Hide your social graph + setting_missing_alt_text_modal: Show confirmation dialogue before posting media without alt text setting_reduce_motion: Reduce motion in animations setting_system_font_ui: Use system's default font setting_system_scrollbars_ui: Use system's default scrollbar diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 7aafd666a5..499b692a28 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -56,10 +56,10 @@ eo: scopes: Kiujn API-ojn la aplikaĵo permesiĝos atingi. Se vi elektas supran amplekson, vi ne bezonas elekti la individuajn. setting_aggregate_reblogs: Ne montri novajn plusendojn de mesaĝoj lastatempe plusenditaj (nur efikas al nove ricevitaj plusendoj) setting_always_send_emails: Normale, la sciigoj per retpoŝto ne estos senditaj kiam vi uzas Mastodon aktive - setting_default_sensitive: Tiklaj plurmedioj estas kaŝitaj implicite, kaj povas esti montritaj per klako + setting_default_sensitive: Tiklaj vidaŭdaĵoj estas kaŝitaj implicite, kaj povas esti montritaj per klako setting_display_media_default: Kaŝi plurmediojn markitajn kiel tiklaj - setting_display_media_hide_all: Ĉiam kaŝi la plurmediojn - setting_display_media_show_all: Ĉiam montri la plurmediojn + setting_display_media_hide_all: Ĉiam kaŝi la vidaŭdaĵojn + setting_display_media_show_all: Ĉiam montri la vidaŭdaĵojn setting_system_scrollbars_ui: Aplikas nur por surtablaj retumiloj baziĝas de Safari kaj Chrome setting_use_blurhash: Transirojn estas bazita sur la koloroj de la kaŝitaj aŭdovidaĵoj sed ne montri iun ajn detalon setting_use_pending_items: Kaŝi tempoliniajn ĝisdatigojn malantaŭ klako anstataŭ aŭtomate rulumi la fluon @@ -223,11 +223,11 @@ eo: setting_boost_modal: Montri konfirman fenestron antaŭ ol diskonigi mesaĝon setting_default_language: Publikada lingvo setting_default_privacy: Privateco de afiŝado - setting_default_sensitive: Ĉiam marki plurmediojn kiel tiklaj + setting_default_sensitive: Ĉiam marki la vidaŭdaĵojn kiel tiklaj setting_delete_modal: Montri konfirman fenestron antaŭ ol forigi mesaĝon setting_disable_hover_cards: Malebligi profilan antaŭmontron kiam oni musumas setting_disable_swiping: Malebligi svingajn movojn - setting_display_media: Montrado de plurmedioj + setting_display_media: Vidigo de vidaŭdaĵoj setting_display_media_default: Implicita setting_display_media_hide_all: Kaŝi ĉiujn setting_display_media_show_all: Montri ĉiujn diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index d9b8e7b6a5..8c582b1f26 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -233,7 +233,7 @@ es-AR: setting_display_media_show_all: Mostrar todo setting_expand_spoilers: Siempre expandir los mensajes marcados con advertencias de contenido setting_hide_network: Ocultá tu gráfica social - setting_missing_alt_text_modal: Mostrar diálogo de confirmación antes de publicar medios sin texto alternativo + setting_missing_alt_text_modal: Mostrar diálogo de confirmación antes de enviar medios sin texto alternativo setting_reduce_motion: Reducir el movimiento de las animaciones setting_system_font_ui: Utilizar la tipografía predeterminada del sistema setting_system_scrollbars_ui: Usar la barra de desplazamiento predeterminada del sistema operativo diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index d229808eae..5cd87c1235 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -233,6 +233,7 @@ fr-CA: setting_display_media_show_all: Montrer tout setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu setting_hide_network: Cacher votre réseau + setting_missing_alt_text_modal: Afficher une fenêtre de confirmation avant de poster un média sans texte alternatif setting_reduce_motion: Réduire la vitesse des animations setting_system_font_ui: Utiliser la police par défaut du système setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 4fa202847b..9572bbf440 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -233,6 +233,7 @@ fr: setting_display_media_show_all: Montrer tout setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu setting_hide_network: Cacher votre réseau + setting_missing_alt_text_modal: Afficher une fenêtre de confirmation avant de poster un média sans texte alternatif setting_reduce_motion: Réduire la vitesse des animations setting_system_font_ui: Utiliser la police par défaut du système setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index 93eff4a89d..93a1090cf8 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -3,6 +3,7 @@ ga: simple_form: hints: account: + attribution_domains: Ceann in aghaidh an líne. Cosnaíonn sé ó sannadh bréagach. discoverable: Seans go mbeidh do phostálacha poiblí agus do phróifíl le feiceáil nó molta i réimsí éagsúla de Mastodon agus is féidir do phróifíl a mholadh d’úsáideoirí eile. display_name: D'ainm iomlán nó d'ainm spraoi. fields: Do leathanach baile, forainmneacha, aois, rud ar bith is mian leat. @@ -155,6 +156,7 @@ ga: url: An áit a seolfar imeachtaí chuig labels: account: + attribution_domains: Tá cead ag suíomhanna Gréasáin creidmheas a thabhairt duit discoverable: Próifíl gné agus postálacha in halgartaim fionnachtana fields: name: Lipéad @@ -231,6 +233,7 @@ ga: setting_display_media_show_all: Taispeáin uile setting_expand_spoilers: Méadaigh postálacha atá marcáilte le rabhaidh inneachair i gcónaí setting_hide_network: Folaigh do ghraf sóisialta + setting_missing_alt_text_modal: Taispeáin dialóg deimhnithe sula bpostálann tú meán gan alt téacs setting_reduce_motion: Laghdú ar an tairiscint i beochan setting_system_font_ui: Úsáid cló réamhshocraithe an chórais setting_system_scrollbars_ui: Bain úsáid as scrollbharra réamhshocraithe an chórais diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 5ede26f9ad..2f9ed5eacc 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -58,8 +58,8 @@ ia: setting_always_send_emails: Normalmente, le notificationes de e-mail non es inviate quando tu activemente usa Mastodon setting_default_sensitive: Le medios sensibile es celate de ordinario e pote esser revelate con un clic setting_display_media_default: Celar le medios marcate como sensibile - setting_display_media_hide_all: Sempre celar le medios - setting_display_media_show_all: Sempre monstrar le medios + setting_display_media_hide_all: Sempre celar contento multimedial + setting_display_media_show_all: Sempre monstrar contento multimedial setting_system_scrollbars_ui: Se applica solmente al navigatores de scriptorio basate sur Safari e Chrome setting_use_blurhash: Le imagines degradate se basa sur le colores del visuales celate, ma illos offusca tote le detalios setting_use_pending_items: Requirer un clic pro monstrar nove messages in vice de rolar automaticamente le fluxo @@ -233,6 +233,7 @@ ia: setting_display_media_show_all: Monstrar toto setting_expand_spoilers: Sempre expander messages marcate con avisos de contento setting_hide_network: Cela tu rete social + setting_missing_alt_text_modal: Monstrar un dialogo de confirmation ante de publicar multimedia sin texto alternative setting_reduce_motion: Reducer movimento in animationes setting_system_font_ui: Usar typo de litteras predefinite del systema setting_system_scrollbars_ui: Usar le barra de rolamento predefinite del systema diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 62fe75e838..96f7881012 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -233,6 +233,7 @@ it: setting_display_media_show_all: Mostra tutti setting_expand_spoilers: Espandi sempre post con content warning setting_hide_network: Nascondi la tua rete + setting_missing_alt_text_modal: Chiedi di confermare prima di pubblicare media senza testo alternativo setting_reduce_motion: Riduci movimento nelle animazioni setting_system_font_ui: Usa il carattere predefinito del sistema setting_system_scrollbars_ui: Utilizza la barra di scorrimento predefinita del sistema diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 92d306224a..9d0b55c9bc 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -219,11 +219,11 @@ ko: setting_aggregate_reblogs: 타임라인의 부스트를 그룹화 setting_always_send_emails: 항상 이메일 알림 보내기 setting_auto_play_gif: 애니메이션 GIF를 자동 재생 - setting_boost_modal: 부스트 전 확인 창을 표시 + setting_boost_modal: 부스트 전 확인창을 띄웁니다 setting_default_language: 게시물 언어 setting_default_privacy: 게시물 프라이버시 setting_default_sensitive: 미디어를 언제나 민감한 콘텐츠로 설정 - setting_delete_modal: 게시물 삭제 전 확인 창을 표시 + setting_delete_modal: 게시물 삭제 전 확인창을 띄웁니다 setting_disable_hover_cards: 호버시 프로필 미리보기를 비활성화 setting_disable_swiping: 스와이프 모션 비활성화 setting_display_media: 미디어 표시 @@ -232,6 +232,7 @@ ko: setting_display_media_show_all: 모두 보이기 setting_expand_spoilers: 내용 경고로 표시된 게시물을 항상 펼치기 setting_hide_network: 내 인맥 숨기기 + setting_missing_alt_text_modal: 대체 텍스트 없이 미디어를 게시하려고 할 때 확인창을 띄웁니다 setting_reduce_motion: 애니메이션 줄이기 setting_system_font_ui: 시스템의 기본 글꼴을 사용 setting_system_scrollbars_ui: 시스템 기본 스크롤바 사용 diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index 73460d2667..454179d0bd 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -160,6 +160,7 @@ lt: setting_display_media_show_all: Rodyti viską setting_expand_spoilers: Visada išplėsti įrašus, pažymėtus turinio įspėjimais setting_hide_network: Slėpti savo socialinę diagramą + setting_missing_alt_text_modal: Rodyti patvirtinimo dialogo langą prieš skelbiant mediją be alternatyvaus teksto. setting_reduce_motion: Sumažinti judėjimą animacijose setting_system_font_ui: Naudoti numatytąjį sistemos šriftą setting_system_scrollbars_ui: Naudoti numatytąją sistemos slankjuostę diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index efa17c1a9b..74dc8218a9 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -137,6 +137,10 @@ pl: admin_email: Zawiadomienia prawne obejmują środki zapobiegawcze, nakazy sądowe, wnioski o popełnienie sprawy oraz wnioski organów ścigania. arbitration_address: Może być taki sam jak adres fizyczny powyżej lub „N/A” jeśli używasz adresu e-mail arbitration_website: Może być formularzem internetowym lub „N/A”, jeśli używasz adresu e-mail + dmca_address: W przypadku operatorów z USA należy użyć adresu zarejestrowanego w DMCA Designated Agent Directory. Lista skrytek pocztowych dostępna jest na bezpośrednią prośbę użytkownika. Użyj DMCA Agent Post Office Box Waiver Request, aby wysłać email do Copyright Office z informacją, że jesteś domowym administratorm treści i z powodu obawy o zemstę lub odwetu za swoje działania, musisz użyć skrytki pocztowej, żeby usunąć swój adres domowy z dostępu publicznego. + dmca_email: Adres email może być taki sam jak wcześniejszy "adres e-mail przeznaczony do celów prawnych" + domain: Unikalny numer identyfikacji świadczonej przez Ciebie usługi online. + jurisdiction: Wymień państwo, w którym mieszkają osoby płacące rachunki. Jeżeli jest to spółka lub inny zarejestrowany podmiot, w zależności od przypadku podaj państwo, w którym jest zarejestrowany, a także miasto, region czy województwo. user: chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu role: Rola kontroluje uprawnienia użytkownika. @@ -152,6 +156,7 @@ pl: url: Dokąd będą wysłane zdarzenia labels: account: + attribution_domains: Strony które mogą ci przypisywać autorstwo discoverable: Udostępniaj profil i wpisy funkcjom odkrywania fields: name: Nazwa @@ -228,6 +233,7 @@ pl: setting_display_media_show_all: Pokaż wszystko setting_expand_spoilers: Zawsze rozwijaj wpisy oznaczone ostrzeżeniem o zawartości setting_hide_network: Ukryj swoją sieć + setting_missing_alt_text_modal: Pokaż okno potwierdzenia przed opublikowaniem materiałów bez pomocniczego opisu obrazów setting_reduce_motion: Ogranicz ruch w animacjach setting_system_font_ui: Używaj domyślnej czcionki systemu setting_system_scrollbars_ui: Używaj domyślnego paska przewijania systemu @@ -329,6 +335,7 @@ pl: changelog: Co się zmieniło? text: Warunki korzystania z usługi terms_of_service_generator: + admin_email: Adres e-mail przeznaczony do celów prawnych arbitration_address: Adres fizyczny powiadomień arbitrażowych arbitration_website: Strona internetowa do składania zgłoszeń arbitrażowych dmca_address: Adres fizyczny dla zgłoszeń naruszenia DMCA/praw autorskich diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 8880b3d892..74edba7cda 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -233,7 +233,7 @@ pt-PT: setting_display_media_show_all: Mostrar todos setting_expand_spoilers: Expandir sempre as publicações marcadas com avisos de conteúdo setting_hide_network: Esconder a tua rede - setting_missing_alt_text_modal: Mostrar janela de confirmação antes de publicar elementos gráficos sem texto alternativo + setting_missing_alt_text_modal: Mostrar janela de confirmação antes de publicar multimédia sem texto alternativo setting_reduce_motion: Reduzir movimento em animações setting_system_font_ui: Usar o tipo de letra padrão do sistema setting_system_scrollbars_ui: Utilizar a barra de deslocação predefinida do sistema diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 64db162ea6..e8a83f06d7 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -3,6 +3,7 @@ ru: simple_form: hints: account: + attribution_domains: По одному на строку. Защищает от ложных атрибуций. discoverable: Ваши публичные сообщения и профиль могут быть показаны или рекомендованы в различных разделах Mastodon, и ваш профиль может быть предложен другим пользователям. display_name: Ваше полное имя или псевдоним. fields: Ваша домашняя страница, местоимения, возраст - все, что угодно. @@ -155,6 +156,7 @@ ru: url: Куда события будут отправляться labels: account: + attribution_domains: Веб-сайты, которым разрешено ссылаться на вас discoverable: Профиль и сообщения в алгоритмах обнаружения fields: name: Пункт @@ -231,6 +233,7 @@ ru: setting_display_media_show_all: Показывать все setting_expand_spoilers: Всегда раскрывать посты, имеющие предупреждение о содержании setting_hide_network: Скрыть свои связи + setting_missing_alt_text_modal: Всегда спрашивать перед публикацией медиафайлов без альтернативного текста setting_reduce_motion: Уменьшить движение в анимации setting_system_font_ui: Использовать шрифт системы по умолчанию setting_system_scrollbars_ui: Использовать системные полосы прокрутки diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 21a3ccce8e..83881a8dfa 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -232,6 +232,7 @@ uk: setting_display_media_show_all: Показати всі setting_expand_spoilers: Завжди розгортати дописи з попередженнями про вміст setting_hide_network: Сховати вашу мережу + setting_missing_alt_text_modal: Запитувати перед розміщенням медіа без альтернативного тексту setting_reduce_motion: Менше руху в анімаціях setting_system_font_ui: Використовувати типовий системний шрифт setting_system_scrollbars_ui: Використовувати системну панель гортання diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index f0015e25a6..e0cafd160a 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -233,6 +233,7 @@ vi: setting_display_media_show_all: Hiện toàn bộ setting_expand_spoilers: Luôn mở rộng tút chứa nội dung ẩn setting_hide_network: Ẩn quan hệ của bạn + setting_missing_alt_text_modal: Hiện xác nhận trước khi đăng media không có văn bản thay thế setting_reduce_motion: Giảm chuyển động ảnh GIF setting_system_font_ui: Dùng phông chữ mặc định hệ thống setting_system_scrollbars_ui: Dùng scrollbar mặc định hệ thống diff --git a/config/locales/sk.yml b/config/locales/sk.yml index e7fb218e2d..afc77db563 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -391,6 +391,7 @@ sk: email_domain_blocks: add_new: Pridaj nový allow_registrations_with_approval: Povoľ registrovanie so schválením + created_msg: Úspešne zablokovaná emailová doména delete: Vymaž dns: types: @@ -399,6 +400,7 @@ sk: new: create: Pridaj doménu resolve: Preveď doménu + title: Blokovať novú emailovú doménu not_permitted: Nepovolená resolved_through_html: Prevedená cez %{domain} title: Blokované e-mailové domény @@ -1365,6 +1367,7 @@ sk: explanation: Tu nájdeš nejaké tipy do začiatku feature_action: Zisti viac follow_action: Nasleduj + follow_title: Prispôsob svoj domáci kanál follows_title: Koho nasledovať post_title: Vytvor svoj prvý príspevok share_action: Zdieľaj diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 33c743188d..2f7ae6752c 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1190,6 +1190,7 @@ vi: too_fast: Nghi vấn đăng ký spam, xin thử lại. use_security_key: Dùng khóa bảo mật user_agreement_html: Tôi đã đọc và đồng ý với điều khoản dịch vụchính sách bảo mật + user_privacy_agreement_html: Tôi đã đọc và đồng ý chính sách bảo mật author_attribution: example_title: Văn bản mẫu hint_html: Bạn là nhà báo hoặc blogger bên ngoài Mastodon? Kiểm soát cách bài viết của bạn được ghi nhận khi chia sẻ trên Mastodon. diff --git a/config/webpacker.yml b/config/webpacker.yml index e07f577c5e..ac4bca2916 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -13,8 +13,8 @@ default: &default # ['app/assets', 'engine/foo/app/assets'] resolved_paths: [] - # Reload manifest.json on all requests so we reload latest compiled packs - cache_manifest: false + # Cache manifest.json for performance + cache_manifest: true # Extract and emit a css file extract_css: true @@ -55,6 +55,9 @@ development: compile: true + # Reload manifest in development environment so we pick up changes + cache_manifest: false + # Reference: https://webpack.js.org/configuration/dev-server/ dev_server: https: false @@ -89,6 +92,3 @@ production: # Production depends on precompilation of packs prior to booting for performance. compile: false - - # Cache manifest.json for performance - cache_manifest: true diff --git a/db/post_migrate/20250129144440_add_new_public_index_to_statuses.rb b/db/post_migrate/20250129144440_add_new_public_index_to_statuses.rb new file mode 100644 index 0000000000..18acb6831a --- /dev/null +++ b/db/post_migrate/20250129144440_add_new_public_index_to_statuses.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddNewPublicIndexToStatuses < ActiveRecord::Migration[8.0] + disable_ddl_transaction! + + def change + add_index :statuses, [:id, :language, :account_id], name: :index_statuses_public_20250210, algorithm: :concurrently, order: { id: :desc }, where: 'deleted_at IS NULL AND visibility IN (0, 10, 11) AND reblog_of_id IS NULL AND ((NOT reply) OR (in_reply_to_account_id = account_id))' # rubocop:disable Naming/VariableNumber + end +end diff --git a/db/post_migrate/20250129144813_remove_old_public_index_to_statuses.rb b/db/post_migrate/20250129144813_remove_old_public_index_to_statuses.rb new file mode 100644 index 0000000000..53b711c204 --- /dev/null +++ b/db/post_migrate/20250129144813_remove_old_public_index_to_statuses.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class RemoveOldPublicIndexToStatuses < ActiveRecord::Migration[8.0] + disable_ddl_transaction! + + def change + remove_index :statuses, [:id, :account_id], name: :index_statuses_public_20231213, algorithm: :concurrently, order: { id: :desc }, where: 'deleted_at IS NULL AND visibility IN (0, 10, 11) AND reblog_of_id IS NULL AND ((NOT reply) OR (in_reply_to_account_id = account_id))' # rubocop:disable Naming/VariableNumber + end +end diff --git a/db/schema.rb b/db/schema.rb index e353c6a8fb..236e847d6d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1425,7 +1425,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_01_30_232529) do t.index ["conversation_id"], name: "index_statuses_on_conversation_id" t.index ["deleted_at"], name: "index_statuses_on_deleted_at", where: "(deleted_at IS NOT NULL)" t.index ["id", "account_id"], name: "index_statuses_local_20231213", order: { id: :desc }, where: "((local OR (uri IS NULL)) AND (deleted_at IS NULL) AND (visibility = ANY (ARRAY[0, 10, 11])) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))" - t.index ["id", "account_id"], name: "index_statuses_public_20231213", order: { id: :desc }, where: "((deleted_at IS NULL) AND (visibility = ANY (ARRAY[0, 10, 11])) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))" + t.index ["id", "language", "account_id"], name: "index_statuses_public_20250210", order: { id: :desc }, where: "((deleted_at IS NULL) AND (visibility = ANY (ARRAY[0, 10, 11])) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))" t.index ["in_reply_to_account_id"], name: "index_statuses_on_in_reply_to_account_id", where: "(in_reply_to_account_id IS NOT NULL)" t.index ["in_reply_to_id"], name: "index_statuses_on_in_reply_to_id", where: "(in_reply_to_id IS NOT NULL)" t.index ["quote_of_id", "account_id"], name: "index_statuses_on_quote_of_id_and_account_id" diff --git a/lib/mastodon/cli/feeds.rb b/lib/mastodon/cli/feeds.rb index c0635bbcde..f594a750ed 100644 --- a/lib/mastodon/cli/feeds.rb +++ b/lib/mastodon/cli/feeds.rb @@ -11,17 +11,21 @@ module Mastodon::CLI option :concurrency, type: :numeric, default: 5, aliases: [:c] option :verbose, type: :boolean, aliases: [:v] option :dry_run, type: :boolean, default: false + option :skip_filled_timelines desc 'build [USERNAME]', 'Build home and list feeds for one or all users' long_desc <<-LONG_DESC Build home and list feeds that are stored in Redis from the database. + With the --skip-filled-timelines, timelines which contain more than half + the maximum number of posts will be skipped. + With the --all option, all active users will be processed. Otherwise, a single user specified by USERNAME. LONG_DESC def build(username = nil) if options[:all] || username.nil? processed, = parallelize_with_progress(active_user_accounts) do |account| - PrecomputeFeedService.new.call(account) unless dry_run? + PrecomputeFeedService.new.call(account, skip_filled_timelines: options[:skip_filled_timelines]) unless dry_run? end say("Regenerated feeds for #{processed} accounts #{dry_run_mode_suffix}", :green, true) @@ -30,7 +34,7 @@ module Mastodon::CLI fail_with_message 'No such account' if account.nil? - PrecomputeFeedService.new.call(account) unless dry_run? + PrecomputeFeedService.new.call(account, skip_filled_timelines: options[:skip_filled_timelines]) unless dry_run? say("OK #{dry_run_mode_suffix}", :green, true) else diff --git a/lib/tasks/dangerous.rake b/lib/tasks/dangerous.rake index 62d000166b..21e5aee110 100644 --- a/lib/tasks/dangerous.rake +++ b/lib/tasks/dangerous.rake @@ -200,9 +200,9 @@ namespace :dangerous do ActiveRecord::Base.connection.execute('UPDATE custom_filters SET action = 0 WHERE action = 2') ActiveRecord::Base.connection.execute('UPDATE account_warnings SET action = 1250 WHERE action = 1200') ActiveRecord::Base.connection.execute('CREATE INDEX IF NOT EXISTS index_statuses_local_20190824 ON statuses USING btree (id DESC, account_id) WHERE (local OR (uri IS NULL)) AND deleted_at IS NULL AND visibility = 0 AND reblog_of_id IS NULL AND ((NOT reply) OR (in_reply_to_account_id = account_id))') - ActiveRecord::Base.connection.execute('CREATE INDEX IF NOT EXISTS index_statuses_public_20200119 ON statuses USING btree (id DESC, account_id) WHERE deleted_at IS NULL AND visibility = 0 AND reblog_of_id IS NULL AND ((NOT reply) OR (in_reply_to_account_id = account_id))') + ActiveRecord::Base.connection.execute('CREATE INDEX IF NOT EXISTS index_statuses_public_20250129 ON statuses USING btree (id DESC, language, account_id) WHERE deleted_at IS NULL AND visibility = 0 AND reblog_of_id IS NULL AND ((NOT reply) OR (in_reply_to_account_id = account_id))') ActiveRecord::Base.connection.execute('DROP INDEX IF EXISTS index_statuses_local_20231213') - ActiveRecord::Base.connection.execute('DROP INDEX IF EXISTS index_statuses_public_20231213') + ActiveRecord::Base.connection.execute('DROP INDEX IF EXISTS index_statuses_public_20250210') ActiveRecord::Base.connection.execute('ALTER TABLE ONLY custom_filter_keywords ALTER COLUMN whole_word SET DEFAULT true') prompt.ok 'Proceed' diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb deleted file mode 100644 index 4012204de1..0000000000 --- a/spec/controllers/admin/reports_controller_spec.rb +++ /dev/null @@ -1,125 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Admin::ReportsController do - render_views - - let(:user) { Fabricate(:admin_user) } - - before do - sign_in user, scope: :user - end - - describe 'GET #index' do - it 'returns http success with no filters' do - specified = Fabricate(:report, action_taken_at: nil, comment: 'First report') - other = Fabricate(:report, action_taken_at: Time.now.utc, comment: 'Second report') - - get :index - - expect(response).to have_http_status(200) - expect(response.body) - .to include(specified.comment) - .and not_include(other.comment) - end - - it 'returns http success with resolved filter' do - specified = Fabricate(:report, action_taken_at: Time.now.utc, comment: 'First report') - other = Fabricate(:report, action_taken_at: nil, comment: 'Second report') - - get :index, params: { resolved: '1' } - - expect(response).to have_http_status(200) - expect(response.body) - .to include(specified.comment) - .and not_include(other.comment) - end - end - - describe 'GET #show' do - it 'renders report' do - report = Fabricate(:report, comment: 'A big problem') - - get :show, params: { id: report } - - expect(response).to have_http_status(200) - expect(response.body) - .to include(report.comment) - end - - describe 'account moderation notes' do - let(:report) { Fabricate(:report) } - - it 'includes moderation notes' do - note1 = Fabricate(:report_note, report: report) - note2 = Fabricate(:report_note, report: report) - - get :show, params: { id: report } - - expect(response).to have_http_status(200) - - report_notes = assigns(:report_notes).to_a - - expect(report_notes.size).to be 2 - expect(report_notes).to eq [note1, note2] - end - end - end - - describe 'POST #resolve' do - it 'resolves the report' do - report = Fabricate(:report) - - put :resolve, params: { id: report } - expect(response).to redirect_to(admin_reports_path) - report.reload - expect(report.action_taken_by_account).to eq user.account - expect(report.action_taken?).to be true - expect(last_action_log.target).to eq(report) - end - end - - describe 'POST #reopen' do - it 'reopens the report' do - report = Fabricate(:report, action_taken_at: 3.days.ago) - - put :reopen, params: { id: report } - expect(response).to redirect_to(admin_report_path(report)) - report.reload - expect(report.action_taken_by_account).to be_nil - expect(report.action_taken?).to be false - expect(last_action_log.target).to eq(report) - end - end - - describe 'POST #assign_to_self' do - it 'reopens the report' do - report = Fabricate(:report) - - put :assign_to_self, params: { id: report } - expect(response).to redirect_to(admin_report_path(report)) - report.reload - expect(report.assigned_account).to eq user.account - expect(last_action_log.target).to eq(report) - end - end - - describe 'POST #unassign' do - it 'reopens the report' do - report = Fabricate(:report, assigned_account_id: Account.last.id) - - put :unassign, params: { id: report } - expect(response).to redirect_to(admin_report_path(report)) - report.reload - expect(report.assigned_account).to be_nil - expect(last_action_log.target).to eq(report) - end - end - - private - - def last_action_log - Admin::ActionLog.last - end -end diff --git a/spec/controllers/auth/passwords_controller_spec.rb b/spec/controllers/auth/passwords_controller_spec.rb deleted file mode 100644 index 90095ac4b8..0000000000 --- a/spec/controllers/auth/passwords_controller_spec.rb +++ /dev/null @@ -1,102 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Auth::PasswordsController do - include Devise::Test::ControllerHelpers - - describe 'GET #new' do - it 'returns http success' do - request.env['devise.mapping'] = Devise.mappings[:user] - get :new - expect(response).to have_http_status(200) - end - end - - describe 'GET #edit' do - let(:user) { Fabricate(:user) } - - before do - request.env['devise.mapping'] = Devise.mappings[:user] - end - - context 'with valid reset_password_token' do - it 'returns http success' do - token = user.send_reset_password_instructions - - get :edit, params: { reset_password_token: token } - - expect(response).to have_http_status(200) - end - end - - context 'with invalid reset_password_token' do - it 'redirects to #new' do - get :edit, params: { reset_password_token: 'some_invalid_value' } - expect(response).to redirect_to subject.new_password_path(subject.send(:resource_name)) - end - end - end - - describe 'POST #update' do - let(:user) { Fabricate(:user) } - let(:password) { 'reset0password' } - - before do - request.env['devise.mapping'] = Devise.mappings[:user] - end - - context 'with valid reset_password_token' do - let!(:session_activation) { Fabricate(:session_activation, user: user) } - let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) } - let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) } - - before do - token = user.send_reset_password_instructions - - post :update, params: { user: { password: password, password_confirmation: password, reset_password_token: token } } - end - - it 'resets the password' do - expect(response) - .to redirect_to '/auth/sign_in' - - # Change password - expect(User.find(user.id)) - .to be_present - .and be_valid_password(password) - - # Deactivate session - expect(user.session_activations.count) - .to eq 0 - expect { session_activation.reload } - .to raise_error(ActiveRecord::RecordNotFound) - - # Revoke tokens - expect(Doorkeeper::AccessToken.active_for(user).count) - .to eq 0 - - # Remove push subs - expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count) - .to eq 0 - expect { web_push_subscription.reload } - .to raise_error(ActiveRecord::RecordNotFound) - end - end - - context 'with invalid reset_password_token' do - before do - post :update, params: { user: { password: password, password_confirmation: password, reset_password_token: 'some_invalid_value' } } - end - - it 'renders reset password and retains password' do - expect(response) - .to render_template(:new) - - expect(User.find(user.id)) - .to be_present - .and be_external_or_valid_password(user.password) - end - end - end -end diff --git a/spec/controllers/concerns/api/rate_limit_headers_spec.rb b/spec/controllers/concerns/api/rate_limit_headers_spec.rb index 74ed81f5da..dd16531350 100644 --- a/spec/controllers/concerns/api/rate_limit_headers_spec.rb +++ b/spec/controllers/concerns/api/rate_limit_headers_spec.rb @@ -40,15 +40,11 @@ RSpec.describe Api::RateLimitHeaders do end end - it 'applies rate limiting limit header' do + it 'provides rate limit information in headers' do expect(response.headers['X-RateLimit-Limit']).to eq '100' - end - it 'applies rate limiting remaining header' do expect(response.headers['X-RateLimit-Remaining']).to eq '80' - end - it 'applies rate limiting reset header' do expect(response.headers['X-RateLimit-Reset']).to eq (start_time + 10.seconds).iso8601(6) end end diff --git a/spec/controllers/filters/statuses_controller_spec.rb b/spec/controllers/filters/statuses_controller_spec.rb index f1fed76fca..7bad403571 100644 --- a/spec/controllers/filters/statuses_controller_spec.rb +++ b/spec/controllers/filters/statuses_controller_spec.rb @@ -23,11 +23,9 @@ RSpec.describe Filters::StatusesController do get :index, params: { filter_id: filter } end - it 'returns http success' do + it 'returns http success and private cache control headers' do expect(response).to have_http_status(200) - end - it 'returns private cache control headers' do expect(response.headers['Cache-Control']).to include('private, no-store') end end diff --git a/spec/controllers/relationships_controller_spec.rb b/spec/controllers/relationships_controller_spec.rb index 323fcc995d..75b5e71f35 100644 --- a/spec/controllers/relationships_controller_spec.rb +++ b/spec/controllers/relationships_controller_spec.rb @@ -14,11 +14,9 @@ RSpec.describe RelationshipsController do get :show, params: { page: 2, relationship: 'followed_by' } end - it 'returns http success' do + it 'returns http success and private cache control headers' do expect(response).to have_http_status(200) - end - it 'returns private cache control headers' do expect(response.headers['Cache-Control']).to include('private, no-store') end end diff --git a/spec/flatware_helper.rb b/spec/flatware_helper.rb index 57a7c1f56a..a1bcb62340 100644 --- a/spec/flatware_helper.rb +++ b/spec/flatware_helper.rb @@ -3,7 +3,7 @@ if defined?(Flatware) Flatware.configure do |config| config.after_fork do |test_env_number| - unless ENV.fetch('DISABLE_SIMPLECOV', nil) == 'true' + if ENV.fetch('COVERAGE', false) require 'simplecov' SimpleCov.at_fork.call(test_env_number) # Combines parallel coverage results end diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index ad7913c758..48defa1f83 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -233,6 +233,28 @@ RSpec.describe FeedManager do end end + context 'with list feed' do + let(:list) { Fabricate(:list, account: bob) } + + before do + bob.follow!(alice) + list.list_accounts.create!(account: alice) + end + + it "returns false for followee's status" do + status = Fabricate(:status, text: 'Hello world', account: alice) + + expect(subject.filter?(:list, status, list)).to be false + end + + it 'returns false for reblog by followee' do + status = Fabricate(:status, text: 'Hello world', account: jeff) + reblog = Fabricate(:status, reblog: status, account: alice) + + expect(subject.filter?(:list, reblog, list)).to be false + end + end + context 'with mentions feed' do it 'returns true for status that mentions blocked account' do bob.block!(jeff) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 6564f17372..7d63ea6300 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -2,7 +2,7 @@ ENV['RAILS_ENV'] ||= 'test' -unless ENV['DISABLE_SIMPLECOV'] == 'true' +if ENV.fetch('COVERAGE', false) require 'simplecov' SimpleCov.start 'rails' do diff --git a/spec/requests/auth/passwords_spec.rb b/spec/requests/auth/passwords_spec.rb new file mode 100644 index 0000000000..feefd94587 --- /dev/null +++ b/spec/requests/auth/passwords_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Auth Passwords' do + describe 'GET /auth/password/edit' do + context 'with invalid reset_password_token' do + it 'redirects to #new' do + get edit_user_password_path, params: { reset_password_token: 'some_invalid_value' } + + expect(response) + .to redirect_to new_user_password_path + end + end + end + + describe 'PUT /auth/password' do + let(:user) { Fabricate(:user) } + let(:password) { 'reset0password' } + + context 'with invalid reset_password_token' do + it 'renders reset password and retains password' do + put user_password_path, params: { user: { password: password, password_confirmation: password, reset_password_token: 'some_invalid_value' } } + + expect(response.body) + .to include(I18n.t('auth.set_new_password')) + + expect(User.find(user.id)) + .to be_present + .and be_external_or_valid_password(user.password) + end + end + end +end diff --git a/spec/requests/well_known/webfinger_spec.rb b/spec/requests/well_known/webfinger_spec.rb index aeff56aebf..b4aeb65320 100644 --- a/spec/requests/well_known/webfinger_spec.rb +++ b/spec/requests/well_known/webfinger_spec.rb @@ -116,19 +116,13 @@ RSpec.describe 'The /.well-known/webfinger endpoint' do perform_request! end - it 'returns http success' do + it 'returns http success with expect headers and media type' do expect(response).to have_http_status(200) - end - it 'sets only a Vary Origin header' do expect(response.headers['Vary']).to eq('Origin') - end - it 'returns application/jrd+json' do expect(response.media_type).to eq 'application/jrd+json' - end - it 'returns links for the internal account' do expect(response.parsed_body) .to include( subject: 'acct:mastodon.internal@cb6e6126.ngrok.io', diff --git a/spec/system/admin/reports_spec.rb b/spec/system/admin/reports_spec.rb new file mode 100644 index 0000000000..90845a02f7 --- /dev/null +++ b/spec/system/admin/reports_spec.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Reports' do + let(:user) { Fabricate(:admin_user) } + + before { sign_in(user) } + + describe 'Viewing existing reports' do + let!(:unresolved_report) { Fabricate(:report, action_taken_at: nil, comment: 'First report') } + let!(:resolved_report) { Fabricate(:report, action_taken_at: Time.now.utc, comment: 'Second report') } + let!(:report_note) { Fabricate :report_note, report: resolved_report, content: 'Note about resolved report' } + + it 'Shows basic report details' do + visit admin_reports_path + + expect(page) + .to have_content(unresolved_report.comment) + .and have_no_content(resolved_report.comment) + + click_on I18n.t('admin.reports.resolved') + expect(page) + .to have_content(resolved_report.comment) + .and have_no_content(unresolved_report.comment) + + click_on resolved_report.comment + expect(page) + .to have_title(I18n.t('admin.reports.report', id: resolved_report.id)) + .and have_content(resolved_report.comment) + .and have_content(report_note.content) + end + end + + describe 'Resolving reports' do + let!(:report) { Fabricate :report } + + it 'resolves an open report' do + visit admin_report_path(report) + within '.content__heading__actions' do + click_on I18n.t('admin.reports.mark_as_resolved') + end + + expect(page) + .to have_title(I18n.t('admin.reports.title')) + .and have_content(I18n.t('admin.reports.resolved_msg')) + + report.reload + expect(report.action_taken_by_account) + .to eq user.account + expect(report) + .to be_action_taken + expect(last_action_log.target) + .to eq(report) + end + end + + describe 'Reopening reports' do + let!(:report) { Fabricate :report, action_taken_at: 3.days.ago } + + it 'reopens a resolved report' do + visit admin_report_path(report) + within '.content__heading__actions' do + click_on I18n.t('admin.reports.mark_as_unresolved') + end + + expect(page) + .to have_title(I18n.t('admin.reports.report', id: report.id)) + + report.reload + expect(report.action_taken_by_account) + .to be_nil + expect(report) + .to_not be_action_taken + expect(last_action_log.target) + .to eq(report) + end + end + + describe 'Assigning reports' do + let!(:report) { Fabricate :report } + + it 'assigns report to user and then unassigns' do + visit admin_report_path(report) + + click_on I18n.t('admin.reports.assign_to_self') + + expect(page) + .to have_title(I18n.t('admin.reports.report', id: report.id)) + report.reload + expect(report.assigned_account) + .to eq user.account + expect(last_action_log.target) + .to eq(report) + + click_on I18n.t('admin.reports.unassign') + expect(page) + .to have_title(I18n.t('admin.reports.report', id: report.id)) + report.reload + expect(report.assigned_account) + .to be_nil + expect(last_action_log.target) + .to eq(report) + end + end + + private + + def last_action_log + Admin::ActionLog.last + end +end diff --git a/spec/system/auth/passwords_spec.rb b/spec/system/auth/passwords_spec.rb new file mode 100644 index 0000000000..42733b2521 --- /dev/null +++ b/spec/system/auth/passwords_spec.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Auth Passwords' do + let(:user) { Fabricate :user } + let!(:session_activation) { Fabricate(:session_activation, user: user) } + let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) } + let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) } + + describe 'Resetting a password', :inline_jobs do + let(:new_password) { 'New.Pass.123' } + + before { allow(Devise).to receive(:pam_authentication).and_return(false) } # Avoid the "seamless external" path + + it 'initiates reset, sends link, resets password from form, clears data' do + visit new_user_password_path + expect(page) + .to have_title(I18n.t('auth.reset_password')) + + submit_email_reset + expect(page) + .to have_title(I18n.t('auth.set_new_password')) + + set_new_password + expect(page) + .to have_title(I18n.t('auth.login')) + + # Change password + expect(User.find(user.id)) + .to be_present + .and be_valid_password(new_password) + + # Deactivate session + expect(user_session_count) + .to eq(0) + expect { session_activation.reload } + .to raise_error(ActiveRecord::RecordNotFound) + + # Revoke tokens + expect(user_token_count) + .to eq(0) + + # Remove push subs + expect(push_subs_count) + .to eq(0) + expect { web_push_subscription.reload } + .to raise_error(ActiveRecord::RecordNotFound) + end + + def submit_email_reset + fill_in 'user_email', with: user.email + click_on I18n.t('auth.reset_password') + open_last_email + visit_in_email(I18n.t('devise.mailer.reset_password_instructions.action')) + end + + def set_new_password + fill_in 'user_password', with: new_password + fill_in 'user_password_confirmation', with: new_password + click_on I18n.t('auth.set_new_password') + end + + def user_session_count + user + .session_activations + .count + end + + def user_token_count + Doorkeeper::AccessToken + .active_for(user) + .count + end + + def push_subs_count + Web::PushSubscription + .where(user: user) + .or(Web::PushSubscription.where(access_token: access_token)) + .count + end + end +end diff --git a/spec/system/settings/applications_spec.rb b/spec/system/settings/applications_spec.rb index ee43da3d5d..737014f42e 100644 --- a/spec/system/settings/applications_spec.rb +++ b/spec/system/settings/applications_spec.rb @@ -38,6 +38,9 @@ RSpec.describe 'Settings applications page' do expect(page) .to have_content(I18n.t('doorkeeper.applications.index.title')) .and have_content('My new app') + .and have_content('read') + .and have_content('write') + .and have_content('follow') end it 'does not save with invalid form values' do @@ -73,10 +76,12 @@ RSpec.describe 'Settings applications page' do fill_in form_app_name_label, with: 'My new app name with a new value' + check 'push', id: :doorkeeper_application_scopes_push submit_form expect(page) .to have_content('My new app name with a new value') + .and have_checked_field('push', id: :doorkeeper_application_scopes_push) end it 'does not update with wrong values' do diff --git a/spec/workers/poll_expiration_notify_worker_spec.rb b/spec/workers/poll_expiration_notify_worker_spec.rb index b3ccdd3d77..190630608c 100644 --- a/spec/workers/poll_expiration_notify_worker_spec.rb +++ b/spec/workers/poll_expiration_notify_worker_spec.rb @@ -33,15 +33,11 @@ RSpec.describe PollExpirationNotifyWorker do end context 'when poll is local' do - it 'notifies voters' do + it 'notifies voters, owner, and local voters' do expect(ActivityPub::DistributePollUpdateWorker).to have_enqueued_sidekiq_job(poll.status.id) - end - it 'notifies owner' do expect(LocalNotificationWorker).to have_enqueued_sidekiq_job(poll.account.id, poll.id, 'Poll', 'poll') - end - it 'notifies local voters' do expect(LocalNotificationWorker).to have_enqueued_sidekiq_job(poll_vote.account.id, poll.id, 'Poll', 'poll') end end @@ -49,15 +45,11 @@ RSpec.describe PollExpirationNotifyWorker do context 'when poll is remote' do let(:remote?) { true } - it 'does not notify remote voters' do + it 'does not notify remote voters or owner, does notify local voters' do expect(ActivityPub::DistributePollUpdateWorker).to_not have_enqueued_sidekiq_job(poll.status.id) - end - it 'does not notify owner' do expect(LocalNotificationWorker).to_not have_enqueued_sidekiq_job(poll.account.id, poll.id, 'Poll', 'poll') - end - it 'notifies local voters' do expect(LocalNotificationWorker).to have_enqueued_sidekiq_job(poll_vote.account.id, poll.id, 'Poll', 'poll') end end diff --git a/spec/workers/publish_scheduled_status_worker_spec.rb b/spec/workers/publish_scheduled_status_worker_spec.rb index 9365e8a4bc..a91e665965 100644 --- a/spec/workers/publish_scheduled_status_worker_spec.rb +++ b/spec/workers/publish_scheduled_status_worker_spec.rb @@ -13,11 +13,9 @@ RSpec.describe PublishScheduledStatusWorker do end context 'when the account is not disabled' do - it 'creates a status' do + it 'creates a status and removes scheduled record' do expect(scheduled_status.account.statuses.first.text).to eq 'Hello world, future!' - end - it 'removes the scheduled status' do expect(ScheduledStatus.find_by(id: scheduled_status.id)).to be_nil end end @@ -25,11 +23,9 @@ RSpec.describe PublishScheduledStatusWorker do context 'when the account is disabled' do let(:scheduled_status) { Fabricate(:scheduled_status, account: Fabricate(:account, user: Fabricate(:user, disabled: true))) } - it 'does not create a status' do + it 'does not create a status and removes scheduled record' do expect(Status.count).to eq 0 - end - it 'removes the scheduled status' do expect(ScheduledStatus.find_by(id: scheduled_status.id)).to be_nil end end diff --git a/spec/workers/unfollow_follow_worker_spec.rb b/spec/workers/unfollow_follow_worker_spec.rb index 7b9d49b902..2e05d1ca78 100644 --- a/spec/workers/unfollow_follow_worker_spec.rb +++ b/spec/workers/unfollow_follow_worker_spec.rb @@ -18,14 +18,11 @@ RSpec.describe UnfollowFollowWorker do let(:show_reblogs) { true } describe 'perform' do - it 'unfollows source account and follows target account' do + it 'unfollows source account and follows target account and preserves show_reblogs' do subject.perform(local_follower.id, source_account.id, target_account.id) expect(local_follower.following?(source_account)).to be false expect(local_follower.following?(target_account)).to be true - end - it 'preserves show_reblogs' do - subject.perform(local_follower.id, source_account.id, target_account.id) expect(Follow.find_by(account: local_follower, target_account: target_account).show_reblogs?).to be show_reblogs end end @@ -35,14 +32,11 @@ RSpec.describe UnfollowFollowWorker do let(:show_reblogs) { false } describe 'perform' do - it 'unfollows source account and follows target account' do + it 'unfollows source account and follows target account and preserves show_reblogs' do subject.perform(local_follower.id, source_account.id, target_account.id) expect(local_follower.following?(source_account)).to be false expect(local_follower.following?(target_account)).to be true - end - it 'preserves show_reblogs' do - subject.perform(local_follower.id, source_account.id, target_account.id) expect(Follow.find_by(account: local_follower, target_account: target_account).show_reblogs?).to be show_reblogs end end diff --git a/yarn.lock b/yarn.lock index d11e676432..de67e53a46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3926,9 +3926,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.195": - version: 4.17.13 - resolution: "@types/lodash@npm:4.17.13" - checksum: 10c0/c3d0b7efe7933ac0369b99f2f7bff9240d960680fdb74b41ed4bd1b3ca60cca1e31fe4046d9abbde778f941a41bc2a75eb629abf8659fa6c27b66efbbb0802a9 + version: 4.17.15 + resolution: "@types/lodash@npm:4.17.15" + checksum: 10c0/2eb2dc6d231f5fb4603d176c08c8d7af688f574d09af47466a179cd7812d9f64144ba74bb32ca014570ffdc544eedc51b7a5657212bad083b6eecbd72223f9bb languageName: node linkType: hard @@ -3986,13 +3986,13 @@ __metadata: linkType: hard "@types/pg@npm:^8.6.6": - version: 8.11.10 - resolution: "@types/pg@npm:8.11.10" + version: 8.11.11 + resolution: "@types/pg@npm:8.11.11" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" pg-types: "npm:^4.0.1" - checksum: 10c0/c8800d0ab2c6424308e6c6b40c73f19583ee1aed758462bd07694844b0a551b5841442205a4ee05207b80109ba502f33f20241b1bd9b4902e713611fb9e08f6c + checksum: 10c0/18c2585e1ba7a5dd5f849d49410d53fdfe9a6c3cbc4ae46c51fd728264d6ecf9a84a5cd82d89cb1f870a74383bad88effce1eed888f16accbcbde56a53d23a69 languageName: node linkType: hard @@ -4269,9 +4269,9 @@ __metadata: linkType: hard "@types/webpack-env@npm:^1.18.4": - version: 1.18.5 - resolution: "@types/webpack-env@npm:1.18.5" - checksum: 10c0/b9e4876e8c7cae419896249f9ed795db283c008fe1d38efa679cbbf05194fc2eea2a5bfb4ff4393d109e3a9895416dadf5f3ddd5c22931b678062230f860454e + version: 1.18.8 + resolution: "@types/webpack-env@npm:1.18.8" + checksum: 10c0/527a5d1eb75c5243e4f3665d956c7c340f899955dd25d16c9fd9750406f32e95a3a17d207640295038e8235c0c2a2daf084f420e088e58b965d82fc74f6012d7 languageName: node linkType: hard @@ -4301,11 +4301,11 @@ __metadata: linkType: hard "@types/ws@npm:^8.5.9": - version: 8.5.13 - resolution: "@types/ws@npm:8.5.13" + version: 8.5.14 + resolution: "@types/ws@npm:8.5.14" dependencies: "@types/node": "npm:*" - checksum: 10c0/a5430aa479bde588e69cb9175518d72f9338b6999e3b2ae16fc03d3bdcff8347e486dc031e4ed14601260463c07e1f9a0d7511dfc653712b047c439c680b0b34 + checksum: 10c0/be88a0b6252f939cb83340bd1b4d450287f752c19271195cd97564fd94047259a9bb8c31c585a61b69d8a1b069a99df9dd804db0132d3359c54d3890c501416a languageName: node linkType: hard @@ -15549,8 +15549,8 @@ __metadata: linkType: hard "sass@npm:^1.62.1": - version: 1.83.4 - resolution: "sass@npm:1.83.4" + version: 1.84.0 + resolution: "sass@npm:1.84.0" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -15561,7 +15561,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10c0/6f27f0eebfeb50222b14baaeef548ef58a05daf8abd9797e6c499334ed7ad40541767056c8693780d06ca83d8836348ea7396a923d3be439b133507993ca78be + checksum: 10c0/4af28c12416b6f1fec2423677cfa8c48af7fb7652a50bd076e0cdd1ea260f0330948ddd6075368a734b8d6cfa16c9af5518292181334f47a9471cb542599bc7b languageName: node linkType: hard @@ -17420,22 +17420,22 @@ __metadata: linkType: hard "typescript@npm:5, typescript@npm:^5.0.4": - version: 5.7.2 - resolution: "typescript@npm:5.7.2" + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/a873118b5201b2ef332127ef5c63fb9d9c155e6fdbe211cbd9d8e65877283797cca76546bad742eea36ed7efbe3424a30376818f79c7318512064e8625d61622 + checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa languageName: node linkType: hard "typescript@patch:typescript@npm%3A5#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": - version: 5.7.2 - resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=5786d5" + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/f3b8082c9d1d1629a215245c9087df56cb784f9fb6f27b5d55577a20e68afe2a889c040aacff6d27e35be165ecf9dca66e694c42eb9a50b3b2c451b36b5675cb + checksum: 10c0/6fd7e0ed3bf23a81246878c613423730c40e8bdbfec4c6e4d7bf1b847cbb39076e56ad5f50aa9d7ebd89877999abaee216002d3f2818885e41c907caaa192cc4 languageName: node linkType: hard