diff --git a/.env.production.sample b/.env.production.sample index 15004b9d0d9fde..8ea569fb0168cb 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -91,9 +91,6 @@ SESSION_RETENTION_PERIOD=31556952 # Fetch All Replies Behavior # -------------------------- -# When a user expands a post (DetailedStatus view), fetch all of its replies -# (default: false) -FETCH_REPLIES_ENABLED=false # Period to wait between fetching replies (in minutes) FETCH_REPLIES_COOLDOWN_MINUTES=15 diff --git a/.ruby-version b/.ruby-version index 1cf8253024ccd6..2aa51319921198 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.4.6 +3.4.7 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ad88c51070c5a..249596dc055f5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,48 @@ All notable changes to this project will be documented in this file. +## [4.4.6] - 2025-10-13 + +### Security + +- Update dependencies `rack` and `uri` +- Fix streaming server connection not being closed on user suspension (by @ThisIsMissEm, [GHSA-r2fh-jr9c-9pxh](https://github.com/mastodon/mastodon/security/advisories/GHSA-r2fh-jr9c-9pxh)) +- Fix password change through admin CLI not invalidating existing sessions and access tokens (by @ThisIsMissEm, [GHSA-f3q3-rmf7-9655](https://github.com/mastodon/mastodon/security/advisories/GHSA-f3q3-rmf7-9655)) +- Fix streaming server allowing access to public timelines even without the `read` or `read:statuses` OAuth scopes (by @ThisIsMissEm, [GHSA-7gwh-mw97-qjgp](https://github.com/mastodon/mastodon/security/advisories/GHSA-7gwh-mw97-qjgp)) + +### Added + +- Add support for processing quotes of deleted posts signaled through a `Tombstone` (#36381 by @ClearlyClaire) + +### Fixed + +- Fix quote post state sometimes not being updated through streaming server (#36408 by @ClearlyClaire) +- Fix inconsistent “pending tags” count on admin dashboard (#36404 by @mjankowski) +- Fix JSON payload being potentially mutated when processing interaction policies (#36392 by @ClearlyClaire) +- Fix quotes not being displayed in email notifications (#36379 by @diondiondion) +- Fix redirect to external object when URL is missing or malformed (#36347 by @ClearlyClaire) +- Fix quotes not being displayed in the featured carousel (#36335 by @diondiondion) + +## [4.4.5] - 2025-09-23 + +### Security + +- Update dependencies + +### Added + +- Add support for `has:quote` in search (#36217 by @ClearlyClaire) + +### Changed + +- Change quoted posts from silenced accounts to use a click-through rather than being hidden (#36166 and #36167 by @ClearlyClaire) + +### Fixed + +- Fix processing of out-of-order `Update` as implicit updates (#36190 by @ClearlyClaire) +- Fix getting `Create` and `Update` out of order (#36176 by @ClearlyClaire) +- Fix quotes with Content Warnings but no text being shown without Content Warnings (#36150 by @ClearlyClaire) + ## [4.4.4] - 2025-09-16 ### Security diff --git a/Dockerfile b/Dockerfile index f2164ffd94102a..ad8150552a4c05 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ ARG BASE_REGISTRY="docker.io" # Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"] # renovate: datasource=docker depName=docker.io/ruby -ARG RUBY_VERSION="3.4.6" +ARG RUBY_VERSION="3.4.7" # # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"] # renovate: datasource=node-version depName=node ARG NODE_MAJOR_VERSION="22" diff --git a/Gemfile b/Gemfile index 0d9ab342715c46..aa201d1e72b75b 100644 --- a/Gemfile +++ b/Gemfile @@ -106,19 +106,19 @@ gem 'opentelemetry-api', '~> 1.7.0' group :opentelemetry do gem 'opentelemetry-exporter-otlp', '~> 0.30.0', require: false - gem 'opentelemetry-instrumentation-active_job', '~> 0.8.0', require: false - gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.22.0', require: false - gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.22.0', require: false - gem 'opentelemetry-instrumentation-excon', '~> 0.24.0', require: false - gem 'opentelemetry-instrumentation-faraday', '~> 0.28.0', require: false - gem 'opentelemetry-instrumentation-http', '~> 0.25.0', require: false - gem 'opentelemetry-instrumentation-http_client', '~> 0.24.0', require: false - gem 'opentelemetry-instrumentation-net_http', '~> 0.24.0', require: false - gem 'opentelemetry-instrumentation-pg', '~> 0.30.0', require: false - gem 'opentelemetry-instrumentation-rack', '~> 0.27.0', require: false - gem 'opentelemetry-instrumentation-rails', '~> 0.37.0', require: false - gem 'opentelemetry-instrumentation-redis', '~> 0.26.0', require: false - gem 'opentelemetry-instrumentation-sidekiq', '~> 0.26.0', require: false + gem 'opentelemetry-instrumentation-active_job', '~> 0.9.0', require: false + gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.23.0', require: false + gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.23.0', require: false + gem 'opentelemetry-instrumentation-excon', '~> 0.25.0', require: false + gem 'opentelemetry-instrumentation-faraday', '~> 0.29.0', require: false + gem 'opentelemetry-instrumentation-http', '~> 0.26.0', require: false + gem 'opentelemetry-instrumentation-http_client', '~> 0.25.0', require: false + gem 'opentelemetry-instrumentation-net_http', '~> 0.25.0', require: false + gem 'opentelemetry-instrumentation-pg', '~> 0.31.0', require: false + gem 'opentelemetry-instrumentation-rack', '~> 0.28.0', require: false + gem 'opentelemetry-instrumentation-rails', '~> 0.38.0', require: false + gem 'opentelemetry-instrumentation-redis', '~> 0.27.0', require: false + gem 'opentelemetry-instrumentation-sidekiq', '~> 0.27.0', require: false gem 'opentelemetry-sdk', '~> 1.4', require: false end diff --git a/Gemfile.lock b/Gemfile.lock index d67384d8e73c82..ee5f481e34a7eb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -96,7 +96,7 @@ GEM ast (2.4.3) attr_required (1.0.2) aws-eventstream (1.4.0) - aws-partitions (1.1135.0) + aws-partitions (1.1168.0) aws-sdk-core (3.215.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -207,7 +207,7 @@ GEM railties (>= 5) dotenv (3.1.8) drb (2.2.3) - dry-cli (1.2.0) + dry-cli (1.3.0) elasticsearch (7.17.11) elasticsearch-api (= 7.17.11) elasticsearch-transport (= 7.17.11) @@ -226,18 +226,18 @@ GEM activemodel erb (5.0.2) erubi (1.13.1) - et-orbi (1.2.11) + et-orbi (1.4.0) tzinfo - excon (1.2.8) + excon (1.3.0) logger fabrication (3.0.0) faker (3.5.2) i18n (>= 1.8.11, < 2) - faraday (2.13.4) + faraday (2.14.0) faraday-net_http (>= 2.0, < 3.5) json logger - faraday-follow_redirects (0.3.0) + faraday-follow_redirects (0.4.0) faraday (>= 1, < 3) faraday-httpclient (2.0.2) httpclient (>= 2.2) @@ -266,18 +266,19 @@ GEM fog-openstack (1.1.5) fog-core (~> 2.1) fog-json (>= 1.0) - formatador (1.1.1) + formatador (1.2.1) + reline forwardable (1.3.3) - fugit (1.11.1) - et-orbi (~> 1, >= 1.2.11) + fugit (1.12.0) + et-orbi (~> 1.4) raabro (~> 1.4) - globalid (1.2.1) + globalid (1.3.0) activesupport (>= 6.1) - google-protobuf (4.31.1) + google-protobuf (4.32.1) bigdecimal rake (>= 13) - googleapis-common-protos-types (1.20.0) - google-protobuf (>= 3.18, < 5.a) + googleapis-common-protos-types (1.21.0) + google-protobuf (~> 4.26) haml (6.3.0) temple (>= 0.8.2) thor @@ -293,7 +294,7 @@ GEM rainbow rubocop (>= 1.0) sysexits (~> 1.1) - hashdiff (1.2.0) + hashdiff (1.2.1) hashie (5.0.0) hcaptcha (7.1.0) json @@ -309,7 +310,7 @@ GEM http-cookie (~> 1.0) http-form_data (~> 2.2) llhttp-ffi (~> 0.5.0) - http-cookie (1.0.8) + http-cookie (1.1.0) domain_name (~> 0.5) http-form_data (2.3.0) http_accept_language (2.1.1) @@ -345,9 +346,9 @@ GEM azure-blob (~> 0.5.2) hashie (~> 5.0) jmespath (1.6.2) - json (2.15.0) + json (2.15.1) json-canonicalization (1.0.0) - json-jwt (1.16.7) + json-jwt (1.17.0) activesupport (>= 4.2) aes_key_wrap base64 @@ -438,7 +439,7 @@ GEM mime-types (3.7.0) logger mime-types-data (~> 3.2025, >= 3.2025.0507) - mime-types-data (3.2025.0916) + mime-types-data (3.2025.0924) mini_mime (1.1.5) mini_portile2 (2.8.9) minitest (5.25.5) @@ -447,7 +448,7 @@ GEM mutex_m (0.3.0) net-http (0.6.0) uri - net-imap (0.5.10) + net-imap (0.5.12) date net-protocol net-ldap (0.20.0) @@ -497,7 +498,7 @@ GEM tzinfo validate_url webfinger (~> 2.0) - openssl (3.3.0) + openssl (3.3.1) openssl-signature_algorithm (1.3.0) openssl (> 2.0) opentelemetry-api (1.7.0) @@ -510,86 +511,61 @@ GEM opentelemetry-common (~> 0.20) opentelemetry-sdk (~> 1.2) opentelemetry-semantic_conventions - opentelemetry-helpers-sql (0.1.1) - opentelemetry-api (~> 1.0) + opentelemetry-helpers-sql (0.2.0) + opentelemetry-api (~> 1.7) opentelemetry-helpers-sql-obfuscation (0.3.0) opentelemetry-common (~> 0.21) - opentelemetry-instrumentation-action_mailer (0.4.0) - opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-action_mailer (0.5.0) opentelemetry-instrumentation-active_support (~> 0.7) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-action_pack (0.13.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-action_pack (0.14.1) opentelemetry-instrumentation-rack (~> 0.21) - opentelemetry-instrumentation-action_view (0.9.0) - opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-action_view (0.10.0) opentelemetry-instrumentation-active_support (~> 0.7) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-active_job (0.8.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-active_model_serializers (0.22.0) - opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_job (0.9.2) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-active_model_serializers (0.23.0) opentelemetry-instrumentation-active_support (>= 0.7.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-active_record (0.9.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-active_storage (0.1.1) - opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_record (0.10.1) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-active_storage (0.2.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) - opentelemetry-instrumentation-base (0.23.0) - opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (0.9.1) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-base (0.24.0) + opentelemetry-api (~> 1.7) opentelemetry-common (~> 0.21) opentelemetry-registry (~> 0.1) - opentelemetry-instrumentation-concurrent_ruby (0.22.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-excon (0.24.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-faraday (0.28.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-http (0.25.1) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-http_client (0.24.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-net_http (0.24.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-pg (0.30.1) - opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-concurrent_ruby (0.23.1) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-excon (0.25.2) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-faraday (0.29.1) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-http (0.26.1) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-http_client (0.25.1) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-net_http (0.25.1) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-pg (0.31.1) opentelemetry-helpers-sql opentelemetry-helpers-sql-obfuscation - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-rack (0.27.1) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-rails (0.37.0) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-action_mailer (~> 0.4.0) - opentelemetry-instrumentation-action_pack (~> 0.13.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.1) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-sidekiq (0.26.1) - opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-rack (0.28.2) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-rails (0.38.0) + opentelemetry-instrumentation-action_mailer (~> 0.4) + opentelemetry-instrumentation-action_pack (~> 0.13) + opentelemetry-instrumentation-action_view (~> 0.9) + opentelemetry-instrumentation-active_job (~> 0.8) + opentelemetry-instrumentation-active_record (~> 0.9) + opentelemetry-instrumentation-active_storage (~> 0.1) + opentelemetry-instrumentation-active_support (~> 0.8) + opentelemetry-instrumentation-concurrent_ruby (~> 0.22) + opentelemetry-instrumentation-redis (0.27.1) + opentelemetry-instrumentation-base (~> 0.24) + opentelemetry-instrumentation-sidekiq (0.27.1) + opentelemetry-instrumentation-base (~> 0.24) opentelemetry-registry (0.4.0) opentelemetry-api (~> 1.1) opentelemetry-sdk (1.9.0) @@ -616,7 +592,7 @@ GEM playwright-ruby-client (1.55.0) concurrent-ruby (>= 1.1.6) mime-types (>= 3.0) - pp (0.6.2) + pp (0.6.3) prettyprint premailer (1.27.0) addressable @@ -644,7 +620,7 @@ GEM activesupport (>= 3.0.0) raabro (1.4.0) racc (1.8.1) - rack (3.2.1) + rack (3.2.3) rack-attack (6.7.0) rack (>= 1.0, < 4) rack-cors (3.0.0) @@ -714,9 +690,10 @@ GEM readline (~> 0.0) rdf-normalize (0.7.0) rdf (~> 3.3) - rdoc (6.14.2) + rdoc (6.15.0) erb psych (>= 4.0.0) + tsort readline (0.0.4) reline redcarpet (3.6.1) @@ -733,7 +710,7 @@ GEM railties (>= 5.2) rexml (3.4.4) rotp (6.3.0) - rouge (4.6.0) + rouge (4.6.1) rpam2 (4.0.2) rqrcode (3.1.0) chunky_png (~> 1.0) @@ -766,7 +743,7 @@ GEM rspec-expectations (~> 3.0) rspec-mocks (~> 3.0) sidekiq (>= 5, < 9) - rspec-support (3.13.4) + rspec-support (3.13.6) rubocop (1.81.1) json (~> 2.3) language_server-protocol (~> 3.17.0.2) @@ -827,7 +804,7 @@ GEM securerandom (0.4.1) shoulda-matchers (6.5.0) activesupport (>= 5.2.0) - sidekiq (8.0.7) + sidekiq (8.0.8) connection_pool (>= 2.5.0) json (>= 2.9.0) logger (>= 1.6.2) @@ -905,7 +882,7 @@ GEM unicode-display_width (3.2.0) unicode-emoji (~> 4.1) unicode-emoji (4.1.0) - uri (1.0.3) + uri (1.0.4) useragent (0.16.11) validate_url (1.0.15) activemodel (>= 3.0.0) @@ -1032,19 +1009,19 @@ DEPENDENCIES omniauth_openid_connect (~> 0.8.0) opentelemetry-api (~> 1.7.0) opentelemetry-exporter-otlp (~> 0.30.0) - opentelemetry-instrumentation-active_job (~> 0.8.0) - opentelemetry-instrumentation-active_model_serializers (~> 0.22.0) - opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0) - opentelemetry-instrumentation-excon (~> 0.24.0) - opentelemetry-instrumentation-faraday (~> 0.28.0) - opentelemetry-instrumentation-http (~> 0.25.0) - opentelemetry-instrumentation-http_client (~> 0.24.0) - opentelemetry-instrumentation-net_http (~> 0.24.0) - opentelemetry-instrumentation-pg (~> 0.30.0) - opentelemetry-instrumentation-rack (~> 0.27.0) - opentelemetry-instrumentation-rails (~> 0.37.0) - opentelemetry-instrumentation-redis (~> 0.26.0) - opentelemetry-instrumentation-sidekiq (~> 0.26.0) + opentelemetry-instrumentation-active_job (~> 0.9.0) + opentelemetry-instrumentation-active_model_serializers (~> 0.23.0) + opentelemetry-instrumentation-concurrent_ruby (~> 0.23.0) + opentelemetry-instrumentation-excon (~> 0.25.0) + opentelemetry-instrumentation-faraday (~> 0.29.0) + opentelemetry-instrumentation-http (~> 0.26.0) + opentelemetry-instrumentation-http_client (~> 0.25.0) + opentelemetry-instrumentation-net_http (~> 0.25.0) + opentelemetry-instrumentation-pg (~> 0.31.0) + opentelemetry-instrumentation-rack (~> 0.28.0) + opentelemetry-instrumentation-rails (~> 0.38.0) + opentelemetry-instrumentation-redis (~> 0.27.0) + opentelemetry-instrumentation-sidekiq (~> 0.27.0) opentelemetry-sdk (~> 1.4) ox (~> 2.14) parslet @@ -1110,4 +1087,4 @@ RUBY VERSION ruby 3.4.1p0 BUNDLED WITH - 2.7.1 + 2.7.2 diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index 5b0867dcfbac2f..fe314daeca69f6 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -9,10 +9,16 @@ def index @pending_appeals_count = Appeal.pending.async_count @pending_reports_count = Report.unresolved.async_count - @pending_tags_count = Tag.pending_review.async_count + @pending_tags_count = pending_tags.async_count @pending_users_count = User.pending.async_count @system_checks = Admin::SystemCheck.perform(current_user) @time_period = (29.days.ago.to_date...Time.now.utc.to_date) end + + private + + def pending_tags + ::Trends::TagFilter.new(status: :pending_review).results + end end end diff --git a/app/controllers/api/v1/timelines/base_controller.rb b/app/controllers/api/v1/timelines/base_controller.rb index 1dba4a5bb21d58..e79eba79ee575d 100644 --- a/app/controllers/api/v1/timelines/base_controller.rb +++ b/app/controllers/api/v1/timelines/base_controller.rb @@ -3,14 +3,8 @@ class Api::V1::Timelines::BaseController < Api::BaseController after_action :insert_pagination_headers, unless: -> { @statuses.empty? } - before_action :require_user!, if: :require_auth? - private - def require_auth? - !Setting.timeline_preview - end - def pagination_collection @statuses end diff --git a/app/controllers/api/v1/timelines/home_controller.rb b/app/controllers/api/v1/timelines/home_controller.rb index 97a80bdbeb10d9..fef7bfac346cc4 100644 --- a/app/controllers/api/v1/timelines/home_controller.rb +++ b/app/controllers/api/v1/timelines/home_controller.rb @@ -3,8 +3,8 @@ class Api::V1::Timelines::HomeController < Api::V1::Timelines::BaseController include AsyncRefreshesConcern - before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: [:show] - before_action :require_user!, only: [:show] + before_action -> { doorkeeper_authorize! :read, :'read:statuses' } + before_action :require_user! PERMITTED_PARAMS = %i(local limit).freeze diff --git a/app/controllers/api/v1/timelines/link_controller.rb b/app/controllers/api/v1/timelines/link_controller.rb index 37ed084f0626ad..9e6ddd69243701 100644 --- a/app/controllers/api/v1/timelines/link_controller.rb +++ b/app/controllers/api/v1/timelines/link_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class Api::V1::Timelines::LinkController < Api::V1::Timelines::BaseController +class Api::V1::Timelines::LinkController < Api::V1::Timelines::TopicController before_action -> { authorize_if_got_token! :read, :'read:statuses' } before_action :set_preview_card before_action :set_statuses diff --git a/app/controllers/api/v1/timelines/public_controller.rb b/app/controllers/api/v1/timelines/public_controller.rb index 73dcc5aee4764c..0714aeca650a1d 100644 --- a/app/controllers/api/v1/timelines/public_controller.rb +++ b/app/controllers/api/v1/timelines/public_controller.rb @@ -2,6 +2,7 @@ class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController before_action -> { authorize_if_got_token! :read, :'read:statuses' } + before_action :require_user!, if: :require_auth? PERMITTED_PARAMS = %i(local remote limit only_media).freeze @@ -15,6 +16,16 @@ def show private + def require_auth? + if truthy_param?(:local) + Setting.local_live_feed_access != 'public' + elsif truthy_param?(:remote) + Setting.remote_live_feed_access != 'public' + else + Setting.local_live_feed_access != 'public' || Setting.remote_live_feed_access != 'public' + end + end + def load_statuses preloaded_public_statuses_page end diff --git a/app/controllers/api/v1/timelines/tag_controller.rb b/app/controllers/api/v1/timelines/tag_controller.rb index b9855fb67a4b08..4ab5db524451c6 100644 --- a/app/controllers/api/v1/timelines/tag_controller.rb +++ b/app/controllers/api/v1/timelines/tag_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class Api::V1::Timelines::TagController < Api::V1::Timelines::BaseController +class Api::V1::Timelines::TagController < Api::V1::Timelines::TopicController before_action -> { authorize_if_got_token! :read, :'read:statuses' } before_action :load_tag @@ -16,10 +16,6 @@ def show private - def require_auth? - !Setting.timeline_preview - end - def load_tag @tag = Tag.find_normalized(params[:id]) end diff --git a/app/controllers/api/v1/timelines/topic_controller.rb b/app/controllers/api/v1/timelines/topic_controller.rb new file mode 100644 index 00000000000000..6faf54f708311f --- /dev/null +++ b/app/controllers/api/v1/timelines/topic_controller.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class Api::V1::Timelines::TopicController < Api::V1::Timelines::BaseController + before_action :require_user!, if: :require_auth? + + private + + def require_auth? + if truthy_param?(:local) + Setting.local_topic_feed_access != 'public' + elsif truthy_param?(:remote) + Setting.remote_topic_feed_access != 'public' + else + Setting.local_topic_feed_access != 'public' || Setting.remote_topic_feed_access != 'public' + end + end +end diff --git a/app/controllers/concerns/async_refreshes_concern.rb b/app/controllers/concerns/async_refreshes_concern.rb index 29122e16b5e14e..2d0e9ff4ff4ba5 100644 --- a/app/controllers/concerns/async_refreshes_concern.rb +++ b/app/controllers/concerns/async_refreshes_concern.rb @@ -6,6 +6,9 @@ module AsyncRefreshesConcern def add_async_refresh_header(async_refresh, retry_seconds: 3) return unless async_refresh.running? - response.headers['Mastodon-Async-Refresh'] = "id=\"#{async_refresh.id}\", retry=#{retry_seconds}" + value = "id=\"#{async_refresh.id}\", retry=#{retry_seconds}" + value += ", result_count=#{async_refresh.result_count}" unless async_refresh.result_count.nil? + + response.headers['Mastodon-Async-Refresh'] = value end end diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index 79e28c983af40f..59bc06031eea1a 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -21,7 +21,13 @@ def account_link_to(account, button = '', path: nil) end end else - link_to(path || ActivityPub::TagManager.instance.url_for(account), class: 'account__display-name') do + account_url = if account.suspended? + ActivityPub::TagManager.instance.url_for(account) + else + web_url("@#{account.pretty_acct}") + end + + link_to(path || account_url, class: 'account__display-name') do content_tag(:div, class: 'account__avatar-wrapper') do image_tag(full_asset_url(current_account&.user&.setting_auto_play_gif ? account.avatar_original_url : account.avatar_static_url), class: 'account__avatar', width: 46, height: 46) end + diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb index b16f68ed0ba63a..6671462048ee62 100644 --- a/app/helpers/statuses_helper.rb +++ b/app/helpers/statuses_helper.rb @@ -60,6 +60,20 @@ def status_description(status) components.compact_blank.join("\n\n") end + # This logic should be kept in sync with https://github.com/mastodon/mastodon/blob/425311e1d95c8a64ddac6c724fca247b8b893a82/app/javascript/mastodon/features/status/components/card.jsx#L160 + def preview_card_aspect_ratio_classname(preview_card) + interactive = preview_card.type == 'video' + large_image = (preview_card.image.present? && preview_card.width > preview_card.height) || interactive + + if large_image && interactive + 'status-card__image--video' + elsif large_image + 'status-card__image--large' + else + 'status-card__image--normal' + end + end + def visibility_icon(status) VISIBLITY_ICONS[status.visibility.to_sym] end diff --git a/app/javascript/entrypoints/admin.tsx b/app/javascript/entrypoints/admin.tsx index 5946c5aee57ce8..6cfa51d3e9258a 100644 --- a/app/javascript/entrypoints/admin.tsx +++ b/app/javascript/entrypoints/admin.tsx @@ -1,6 +1,7 @@ import { createRoot } from 'react-dom/client'; import Rails from '@rails/ujs'; +import { decode, ValidationError } from 'blurhash'; import ready from '../mastodon/ready'; @@ -434,6 +435,46 @@ ready(() => { document.querySelectorAll('[data-admin-component]').forEach((element) => { void mountReactComponent(element); }); + + document + .querySelectorAll('canvas[data-blurhash]') + .forEach((canvas) => { + const blurhash = canvas.dataset.blurhash; + if (blurhash) { + try { + // decode returns a Uint8ClampedArray not Uint8ClampedArray + const pixels = decode( + blurhash, + 32, + 32, + ) as Uint8ClampedArray; + const ctx = canvas.getContext('2d'); + const imageData = new ImageData(pixels, 32, 32); + + ctx?.putImageData(imageData, 0, 0); + } catch (err) { + if (err instanceof ValidationError) { + // ignore blurhash validation errors + return; + } + + throw err; + } + } + }); + + document + .querySelectorAll('.preview-card') + .forEach((previewCard) => { + const spoilerButton = previewCard.querySelector('.spoiler-button'); + if (!spoilerButton) { + return; + } + + spoilerButton.addEventListener('click', () => { + previewCard.classList.toggle('preview-card--image-visible'); + }); + }); }).catch((reason: unknown) => { throw reason; }); diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index dd1956446daeeb..fea3eb0d792e48 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -70,7 +70,7 @@ function loaded() { }; document.querySelectorAll('.emojify').forEach((content) => { - content.innerHTML = emojify(content.innerHTML); + content.innerHTML = emojify(content.innerHTML, {}, true); // Force emojify as public doesn't load the new emoji system. }); document diff --git a/app/javascript/mastodon/actions/compose_typed.ts b/app/javascript/mastodon/actions/compose_typed.ts index f3aa37e20db31f..151a5ddc844ce1 100644 --- a/app/javascript/mastodon/actions/compose_typed.ts +++ b/app/javascript/mastodon/actions/compose_typed.ts @@ -4,6 +4,7 @@ import { createAction } from '@reduxjs/toolkit'; import type { List as ImmutableList, Map as ImmutableMap } from 'immutable'; import { apiUpdateMedia } from 'mastodon/api/compose'; +import { apiGetSearch } from 'mastodon/api/search'; import type { ApiMediaAttachmentJSON } from 'mastodon/api_types/media_attachments'; import type { MediaAttachment } from 'mastodon/models/media_attachment'; import { @@ -16,6 +17,7 @@ import type { Status } from '../models/status'; import { showAlert } from './alerts'; import { focusCompose } from './compose'; +import { importFetchedStatuses } from './importer'; import { openModal } from './modal'; const messages = defineMessages({ @@ -155,6 +157,41 @@ export const quoteComposeById = createAppThunk( }, ); +export const pasteLinkCompose = createDataLoadingThunk( + 'compose/pasteLink', + async ({ url }: { url: string }) => { + return await apiGetSearch({ + q: url, + type: 'statuses', + resolve: true, + limit: 2, + }); + }, + (data, { dispatch, getState }) => { + const composeState = getState().compose; + + if ( + composeState.get('quoted_status_id') || + composeState.get('is_submitting') || + composeState.get('poll') || + composeState.get('is_uploading') + ) + return; + + dispatch(importFetchedStatuses(data.statuses)); + + if ( + data.statuses.length === 1 && + data.statuses[0] && + ['automatic', 'manual'].includes( + data.statuses[0].quote_approval?.current_user ?? 'denied', + ) + ) { + dispatch(quoteComposeById(data.statuses[0].id)); + } + }, +); + export const quoteComposeCancel = createAction('compose/quoteComposeCancel'); export const setComposeQuotePolicy = createAction( diff --git a/app/javascript/mastodon/actions/statuses_typed.ts b/app/javascript/mastodon/actions/statuses_typed.ts index c1d4cfd9847e53..63af85a7c260d4 100644 --- a/app/javascript/mastodon/actions/statuses_typed.ts +++ b/app/javascript/mastodon/actions/statuses_typed.ts @@ -9,8 +9,9 @@ import { importFetchedStatuses } from './importer'; export const fetchContext = createDataLoadingThunk( 'status/context', - ({ statusId }: { statusId: string }) => apiGetContext(statusId), - ({ context, refresh }, { dispatch }) => { + ({ statusId }: { statusId: string; prefetchOnly?: boolean }) => + apiGetContext(statusId), + ({ context, refresh }, { dispatch, actionArg: { prefetchOnly = false } }) => { const statuses = context.ancestors .concat(context.descendants) .concat(context.references); @@ -20,6 +21,7 @@ export const fetchContext = createDataLoadingThunk( return { context, refresh, + prefetchOnly, }; }, ); @@ -28,6 +30,14 @@ export const completeContextRefresh = createAction<{ statusId: string }>( 'status/context/complete', ); +export const showPendingReplies = createAction<{ statusId: string }>( + 'status/context/showPendingReplies', +); + +export const clearPendingReplies = createAction<{ statusId: string }>( + 'status/context/clearPendingReplies', +); + export const setStatusQuotePolicy = createDataLoadingThunk( 'status/setQuotePolicy', ({ statusId, policy }: { statusId: string; policy: ApiQuotePolicy }) => { diff --git a/app/javascript/mastodon/api_types/announcements.ts b/app/javascript/mastodon/api_types/announcements.ts new file mode 100644 index 00000000000000..03e8922d8f189f --- /dev/null +++ b/app/javascript/mastodon/api_types/announcements.ts @@ -0,0 +1,28 @@ +// See app/serializers/rest/announcement_serializer.rb + +import type { ApiCustomEmojiJSON } from './custom_emoji'; +import type { ApiMentionJSON, ApiStatusJSON, ApiTagJSON } from './statuses'; + +export interface ApiAnnouncementJSON { + id: string; + content: string; + starts_at: null | string; + ends_at: null | string; + all_day: boolean; + published_at: string; + updated_at: null | string; + read: boolean; + mentions: ApiMentionJSON[]; + statuses: ApiStatusJSON[]; + tags: ApiTagJSON[]; + emojis: ApiCustomEmojiJSON[]; + reactions: ApiAnnouncementReactionJSON[]; +} + +export interface ApiAnnouncementReactionJSON { + name: string; + count: number; + me: boolean; + url?: string; + static_url?: string; +} diff --git a/app/javascript/mastodon/components/account/index.tsx b/app/javascript/mastodon/components/account/index.tsx index 1a8ba0988e87b7..ce5ea5849b26a0 100644 --- a/app/javascript/mastodon/components/account/index.tsx +++ b/app/javascript/mastodon/components/account/index.tsx @@ -7,6 +7,7 @@ import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Link } from 'react-router-dom'; +import { EmojiHTML } from '@/mastodon/components/emoji/html'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import { blockAccount, @@ -342,9 +343,10 @@ export const Account: React.FC = ({ {account && withBio && (account.note.length > 0 ? ( -
) : (
diff --git a/app/javascript/mastodon/components/account_bio.tsx b/app/javascript/mastodon/components/account_bio.tsx index b5ff686f864ead..e87ae654fdf585 100644 --- a/app/javascript/mastodon/components/account_bio.tsx +++ b/app/javascript/mastodon/components/account_bio.tsx @@ -7,8 +7,8 @@ import { useLinks } from 'mastodon/hooks/useLinks'; import { useAppSelector } from '../store'; import { isModernEmojiEnabled } from '../utils/environment'; -import { AnimateEmojiProvider } from './emoji/context'; import { EmojiHTML } from './emoji/html'; +import { useElementHandledLink } from './status/handled_link'; interface AccountBioProps { className: string; @@ -24,19 +24,29 @@ export const AccountBio: React.FC = ({ const handleClick = useLinks(showDropdown); const handleNodeChange = useCallback( (node: HTMLDivElement | null) => { - if (!showDropdown || !node || node.childNodes.length === 0) { + if ( + !showDropdown || + !node || + node.childNodes.length === 0 || + isModernEmojiEnabled() + ) { return; } addDropdownToHashtags(node, accountId); }, [showDropdown, accountId], ); + + const htmlHandlers = useElementHandledLink({ + hashtagAccountId: showDropdown ? accountId : undefined, + }); + const note = useAppSelector((state) => { const account = state.accounts.get(accountId); if (!account) { return ''; } - return isModernEmojiEnabled() ? account.note : account.note_emojified; + return account.note_emojified; }); const extraEmojis = useAppSelector((state) => { const account = state.accounts.get(accountId); @@ -48,13 +58,14 @@ export const AccountBio: React.FC = ({ } return ( - - - + {...htmlHandlers} + /> ); }; diff --git a/app/javascript/mastodon/components/account_fields.tsx b/app/javascript/mastodon/components/account_fields.tsx index 4ce55f7896ae92..dd17b89d865865 100644 --- a/app/javascript/mastodon/components/account_fields.tsx +++ b/app/javascript/mastodon/components/account_fields.tsx @@ -1,42 +1,70 @@ +import { useIntl } from 'react-intl'; + import classNames from 'classnames'; import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import { Icon } from 'mastodon/components/icon'; -import { useLinks } from 'mastodon/hooks/useLinks'; import type { Account } from 'mastodon/models/account'; -export const AccountFields: React.FC<{ - fields: Account['fields']; - limit: number; -}> = ({ fields, limit = -1 }) => { - const handleClick = useLinks(); +import { CustomEmojiProvider } from './emoji/context'; +import { EmojiHTML } from './emoji/html'; +import { useElementHandledLink } from './status/handled_link'; + +export const AccountFields: React.FC> = ({ + fields, + emojis, +}) => { + const intl = useIntl(); + const htmlHandlers = useElementHandledLink(); if (fields.size === 0) { return null; } return ( -
- {fields.take(limit).map((pair, i) => ( -
-
+ {fields.map((pair, i) => ( +
+ -
- {pair.get('verified_at') && ( - - )} - + {pair.verified_at && ( + + + + )}{' '} +
))} -
+ ); }; + +const dateFormatOptions: Intl.DateTimeFormatOptions = { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', +}; diff --git a/app/javascript/mastodon/components/autosuggest_textarea.jsx b/app/javascript/mastodon/components/autosuggest_textarea.jsx index de5accc4b287df..68cf9e17fc92f5 100644 --- a/app/javascript/mastodon/components/autosuggest_textarea.jsx +++ b/app/javascript/mastodon/components/autosuggest_textarea.jsx @@ -150,10 +150,7 @@ const AutosuggestTextarea = forwardRef(({ }, [suggestions, onSuggestionSelected, textareaRef]); const handlePaste = useCallback((e) => { - if (e.clipboardData && e.clipboardData.files.length === 1) { - onPaste(e.clipboardData.files); - e.preventDefault(); - } + onPaste(e); }, [onPaste]); // Show the suggestions again whenever they change and the textarea is focused diff --git a/app/javascript/mastodon/components/content_warning.tsx b/app/javascript/mastodon/components/content_warning.tsx index 6bcae1d6f739fa..a407ec146e3e12 100644 --- a/app/javascript/mastodon/components/content_warning.tsx +++ b/app/javascript/mastodon/components/content_warning.tsx @@ -1,15 +1,38 @@ +import type { List } from 'immutable'; + +import type { CustomEmoji } from '../models/custom_emoji'; +import type { Status } from '../models/status'; + +import { EmojiHTML } from './emoji/html'; import { StatusBanner, BannerVariant } from './status_banner'; export const ContentWarning: React.FC<{ - text: string; + status: Status; expanded?: boolean; onClick?: () => void; -}> = ({ text, expanded, onClick }) => ( - - - -); +}> = ({ status, expanded, onClick }) => { + const hasSpoiler = !!status.get('spoiler_text'); + if (!hasSpoiler) { + return null; + } + + const text = + status.getIn(['translation', 'spoilerHtml']) || status.get('spoilerHtml'); + if (typeof text !== 'string' || text.length === 0) { + return null; + } + + return ( + + } + /> + + ); +}; diff --git a/app/javascript/mastodon/components/display_name/no-domain.tsx b/app/javascript/mastodon/components/display_name/no-domain.tsx index bb5a0936593bdc..ee6e84050c3b89 100644 --- a/app/javascript/mastodon/components/display_name/no-domain.tsx +++ b/app/javascript/mastodon/components/display_name/no-domain.tsx @@ -2,8 +2,6 @@ import type { ComponentPropsWithoutRef, FC } from 'react'; import classNames from 'classnames'; -import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; - import { AnimateEmojiProvider } from '../emoji/context'; import { EmojiHTML } from '../emoji/html'; import { Skeleton } from '../skeleton'; @@ -24,11 +22,7 @@ export const DisplayNameWithoutDomain: FC< {account ? ( diff --git a/app/javascript/mastodon/components/display_name/simple.tsx b/app/javascript/mastodon/components/display_name/simple.tsx index 375f4932b2e2cb..29d9ee217b1063 100644 --- a/app/javascript/mastodon/components/display_name/simple.tsx +++ b/app/javascript/mastodon/components/display_name/simple.tsx @@ -1,7 +1,5 @@ import type { ComponentPropsWithoutRef, FC } from 'react'; -import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; - import { EmojiHTML } from '../emoji/html'; import type { DisplayNameProps } from './index'; @@ -19,11 +17,7 @@ export const DisplayNameSimple: FC< diff --git a/app/javascript/mastodon/components/emoji/html.tsx b/app/javascript/mastodon/components/emoji/html.tsx index a6ecc869c1d8e2..b462a2ee6f8c2e 100644 --- a/app/javascript/mastodon/components/emoji/html.tsx +++ b/app/javascript/mastodon/components/emoji/html.tsx @@ -1,60 +1,89 @@ import { useMemo } from 'react'; -import type { ComponentPropsWithoutRef, ElementType } from 'react'; import classNames from 'classnames'; import type { CustomEmojiMapArg } from '@/mastodon/features/emoji/types'; import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; +import type { + OnAttributeHandler, + OnElementHandler, +} from '@/mastodon/utils/html'; import { htmlStringToComponents } from '@/mastodon/utils/html'; +import { polymorphicForwardRef } from '@/types/polymorphic'; import { AnimateEmojiProvider, CustomEmojiProvider } from './context'; import { textToEmojis } from './index'; -type EmojiHTMLProps = Omit< - ComponentPropsWithoutRef, - 'dangerouslySetInnerHTML' | 'className' -> & { +interface EmojiHTMLProps { htmlString: string; extraEmojis?: CustomEmojiMapArg; - as?: Element; className?: string; -}; - -export const ModernEmojiHTML = ({ - extraEmojis, - htmlString, - as: asProp = 'div', // Rename for syntax highlighting - shallow, - className = '', - ...props -}: EmojiHTMLProps) => { - const contents = useMemo( - () => htmlStringToComponents(htmlString, { onText: textToEmojis }), - [htmlString], - ); - - return ( - - - {contents} - - - ); -}; - -export const LegacyEmojiHTML = ( - props: EmojiHTMLProps, -) => { - const { as: asElement, htmlString, extraEmojis, className, ...rest } = props; - const Wrapper = asElement ?? 'div'; - return ( - - ); -}; + onElement?: OnElementHandler; + onAttribute?: OnAttributeHandler; +} + +export const ModernEmojiHTML = polymorphicForwardRef<'div', EmojiHTMLProps>( + ( + { + extraEmojis, + htmlString, + as: asProp = 'div', // Rename for syntax highlighting + className = '', + onElement, + onAttribute, + ...props + }, + ref, + ) => { + const contents = useMemo( + () => + htmlStringToComponents(htmlString, { + onText: textToEmojis, + onElement, + onAttribute, + }), + [htmlString, onAttribute, onElement], + ); + + return ( + + + {contents} + + + ); + }, +); +ModernEmojiHTML.displayName = 'ModernEmojiHTML'; + +export const LegacyEmojiHTML = polymorphicForwardRef<'div', EmojiHTMLProps>( + (props, ref) => { + const { + as: asElement, + htmlString, + extraEmojis, + className, + onElement, + onAttribute, + ...rest + } = props; + const Wrapper = asElement ?? 'div'; + return ( + + ); + }, +); +LegacyEmojiHTML.displayName = 'LegacyEmojiHTML'; export const EmojiHTML = isModernEmojiEnabled() ? ModernEmojiHTML diff --git a/app/javascript/mastodon/components/hover_card_account.tsx b/app/javascript/mastodon/components/hover_card_account.tsx index 5dbf7e2ed2966e..4c0c5de625aca1 100644 --- a/app/javascript/mastodon/components/hover_card_account.tsx +++ b/app/javascript/mastodon/components/hover_card_account.tsx @@ -23,6 +23,8 @@ import { domain, isHideItem } from 'mastodon/initial_state'; import { getAccountHidden } from 'mastodon/selectors/accounts'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; +import { useLinks } from '../hooks/useLinks'; + export const HoverCardAccount = forwardRef< HTMLDivElement, { accountId?: string } @@ -66,6 +68,8 @@ export const HoverCardAccount = forwardRef< !isMutual && !isFollower; + const handleClick = useLinks(); + return (
- + +
+ +
+ {note && note.length > 0 && (
diff --git a/app/javascript/mastodon/components/poll.tsx b/app/javascript/mastodon/components/poll.tsx index 80444f6406f10f..a9229e6ee4907a 100644 --- a/app/javascript/mastodon/components/poll.tsx +++ b/app/javascript/mastodon/components/poll.tsx @@ -8,6 +8,7 @@ import classNames from 'classnames'; import { animated, useSpring } from '@react-spring/web'; import escapeTextContentForBrowser from 'escape-html'; +import { EmojiHTML } from '@/mastodon/components/emoji/html'; import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import { openModal } from 'mastodon/actions/modal'; import { fetchPoll, vote } from 'mastodon/actions/polls'; @@ -305,10 +306,11 @@ const PollOption: React.FC = (props) => { )} - {!!voted && ( diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 6136c783363c7d..9322a16a8dbfa6 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -126,7 +126,7 @@ class Status extends ImmutablePureComponent { unread: PropTypes.bool, showThread: PropTypes.bool, isQuotedPost: PropTypes.bool, - shouldHighlightOnMount: PropTypes.bool, + shouldHighlightOnMount: PropTypes.bool, getScrollPosition: PropTypes.func, updateScrollBottom: PropTypes.func, cacheMediaWidth: PropTypes.func, @@ -640,7 +640,7 @@ class Status extends ImmutablePureComponent { {matchedFilters && } - {(status.get('spoiler_text').length > 0 && (!matchedFilters || this.state.showDespiteFilter)) && } + {(!matchedFilters || this.state.showDespiteFilter) && } {expanded && ( <> diff --git a/app/javascript/mastodon/components/status/handled_link.stories.tsx b/app/javascript/mastodon/components/status/handled_link.stories.tsx new file mode 100644 index 00000000000000..e34383370486c3 --- /dev/null +++ b/app/javascript/mastodon/components/status/handled_link.stories.tsx @@ -0,0 +1,102 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; + +import { HashtagMenuController } from '@/mastodon/features/ui/components/hashtag_menu_controller'; +import { accountFactoryState } from '@/testing/factories'; + +import { HoverCardController } from '../hover_card_controller'; + +import type { HandledLinkProps } from './handled_link'; +import { HandledLink } from './handled_link'; + +type HandledLinkStoryProps = Pick< + HandledLinkProps, + 'href' | 'text' | 'prevText' +> & { + mentionAccount: 'local' | 'remote' | 'none'; + hashtagAccount: boolean; +}; + +const meta = { + title: 'Components/Status/HandledLink', + render({ mentionAccount, hashtagAccount, ...args }) { + let mention: HandledLinkProps['mention'] | undefined; + if (mentionAccount === 'local') { + mention = { id: '1', acct: 'testuser' }; + } else if (mentionAccount === 'remote') { + mention = { id: '2', acct: 'remoteuser@mastodon.social' }; + } + return ( + <> + + {args.text} + + + + + ); + }, + args: { + href: 'https://example.com/path/subpath?query=1#hash', + text: 'https://example.com', + mentionAccount: 'none', + hashtagAccount: false, + }, + argTypes: { + mentionAccount: { + control: { type: 'select' }, + options: ['local', 'remote', 'none'], + defaultValue: 'none', + }, + }, + parameters: { + state: { + accounts: { + '1': accountFactoryState({ id: '1', acct: 'hashtaguser' }), + }, + }, + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; + +export const Simple: Story = { + args: { + href: 'https://example.com/test', + }, +}; + +export const Hashtag: Story = { + args: { + text: '#example', + hashtagAccount: true, + }, +}; + +export const Mention: Story = { + args: { + text: '@user', + mentionAccount: 'local', + }, +}; + +export const InternalLink: Story = { + args: { + href: '/about', + text: 'About', + }, +}; + +export const InvalidURL: Story = { + args: { + href: 'ht!tp://invalid-url', + text: 'ht!tp://invalid-url -- invalid!', + }, +}; diff --git a/app/javascript/mastodon/components/status/handled_link.tsx b/app/javascript/mastodon/components/status/handled_link.tsx new file mode 100644 index 00000000000000..3c8973992bdd1c --- /dev/null +++ b/app/javascript/mastodon/components/status/handled_link.tsx @@ -0,0 +1,109 @@ +import { useCallback } from 'react'; +import type { ComponentProps, FC } from 'react'; + +import classNames from 'classnames'; +import { Link } from 'react-router-dom'; + +import type { ApiMentionJSON } from '@/mastodon/api_types/statuses'; +import type { OnElementHandler } from '@/mastodon/utils/html'; + +export interface HandledLinkProps { + href: string; + text: string; + prevText?: string; + hashtagAccountId?: string; + mention?: Pick; +} + +export const HandledLink: FC> = ({ + href, + text, + prevText, + hashtagAccountId, + mention, + className, + children, + ...props +}) => { + // Handle hashtags + if (text.startsWith('#') || prevText?.endsWith('#')) { + const hashtag = text.slice(1).trim(); + return ( + + {children} + + ); + } else if ((text.startsWith('@') || prevText?.endsWith('@')) && mention) { + // Handle mentions + return ( + + {children} + + ); + } + + // Non-absolute paths treated as internal links. This shouldn't happen, but just in case. + if (href.startsWith('/')) { + return ( + + {children} + + ); + } + + return ( + + {children} + + ); +}; + +export const useElementHandledLink = ({ + hashtagAccountId, + hrefToMention, +}: { + hashtagAccountId?: string; + hrefToMention?: (href: string) => ApiMentionJSON | undefined; +} = {}) => { + const onElement = useCallback( + (element, { key, ...props }, children) => { + if (element instanceof HTMLAnchorElement) { + const mention = hrefToMention?.(element.href); + return ( + + {children} + + ); + } + return undefined; + }, + [hashtagAccountId, hrefToMention], + ); + return { onElement }; +}; diff --git a/app/javascript/mastodon/components/status_banner.tsx b/app/javascript/mastodon/components/status_banner.tsx index e11b2c9279b761..a1d200133f8062 100644 --- a/app/javascript/mastodon/components/status_banner.tsx +++ b/app/javascript/mastodon/components/status_banner.tsx @@ -3,6 +3,8 @@ import { useCallback, useRef, useId } from 'react'; import { FormattedMessage } from 'react-intl'; +import { AnimateEmojiProvider } from './emoji/context'; + export enum BannerVariant { Warning = 'warning', Filter = 'filter', @@ -34,8 +36,7 @@ export const StatusBanner: React.FC<{ return ( // Element clicks are passed on to button - // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -
)} -
+ ); }; diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index 76c81703e8572d..c5345077d9bce4 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -18,6 +18,7 @@ import { languages as preloadedLanguages } from 'mastodon/initial_state'; import { isModernEmojiEnabled } from '../utils/environment'; import { EmojiHTML } from './emoji/html'; +import { HandledLink } from './status/handled_link'; const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top) @@ -27,9 +28,6 @@ const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top) * @returns {string} */ export function getStatusContent(status) { - if (isModernEmojiEnabled()) { - return status.getIn(['translation', 'content']) || status.get('content'); - } return status.getIn(['translation', 'contentHtml']) || status.get('contentHtml'); } @@ -99,6 +97,23 @@ class StatusContent extends PureComponent { } const { status, onCollapsedToggle } = this.props; + if (status.get('collapsed', null) === null && onCollapsedToggle) { + const { collapsible, onClick } = this.props; + + const collapsed = + collapsible + && onClick + && node.clientHeight > MAX_HEIGHT + && status.get('spoiler_text').length === 0; + + onCollapsedToggle(collapsed); + } + + // Exit if modern emoji is enabled, as it handles links using the HandledLink component. + if (isModernEmojiEnabled()) { + return; + } + const links = node.querySelectorAll('a'); let link, mention; @@ -128,18 +143,6 @@ class StatusContent extends PureComponent { link.classList.add('unhandled-link'); } } - - if (status.get('collapsed', null) === null && onCollapsedToggle) { - const { collapsible, onClick } = this.props; - - const collapsed = - collapsible - && onClick - && node.clientHeight > MAX_HEIGHT - && status.get('spoiler_text').length === 0; - - onCollapsedToggle(collapsed); - } } componentDidMount () { @@ -201,6 +204,27 @@ class StatusContent extends PureComponent { this.node = c; }; + handleElement = (element, { key, ...props }, children) => { + if (element instanceof HTMLAnchorElement) { + const mention = this.props.status.get('mentions').find(item => element.href === item.get('url')); + return ( + + {children} + + ); + } else if (element instanceof HTMLParagraphElement && element.classList.contains('quote-inline')) { + return null; + } + return undefined; + } + render () { const { status, intl, statusContent } = this.props; @@ -250,6 +274,7 @@ class StatusContent extends PureComponent { lang={language} htmlString={content} extraEmojis={status.get('emojis')} + onElement={this.handleElement.bind(this)} /> {poll} @@ -267,6 +292,7 @@ class StatusContent extends PureComponent { lang={language} htmlString={content} extraEmojis={status.get('emojis')} + onElement={this.handleElement.bind(this)} /> {poll} diff --git a/app/javascript/mastodon/components/verified_badge.tsx b/app/javascript/mastodon/components/verified_badge.tsx index 626cc500d6a672..43edbc79518849 100644 --- a/app/javascript/mastodon/components/verified_badge.tsx +++ b/app/javascript/mastodon/components/verified_badge.tsx @@ -1,10 +1,17 @@ +import { EmojiHTML } from '@/mastodon/components/emoji/html'; import CheckIcon from '@/material-icons/400-24px/check.svg?react'; +import { isModernEmojiEnabled } from '../utils/environment'; +import type { OnAttributeHandler } from '../utils/html'; + import { Icon } from './icon'; const domParser = new DOMParser(); const stripRelMe = (html: string) => { + if (isModernEmojiEnabled()) { + return html; + } const document = domParser.parseFromString(html, 'text/html').documentElement; document.querySelectorAll('a[rel]').forEach((link) => { @@ -15,7 +22,23 @@ const stripRelMe = (html: string) => { }); const body = document.querySelector('body'); - return body ? { __html: body.innerHTML } : undefined; + return body?.innerHTML ?? ''; +}; + +const onAttribute: OnAttributeHandler = (name, value, tagName) => { + if (name === 'rel' && tagName === 'a') { + if (value === 'me') { + return null; + } + return [ + name, + value + .split(' ') + .filter((x) => x !== 'me') + .join(' '), + ]; + } + return undefined; }; interface Props { @@ -24,6 +47,10 @@ interface Props { export const VerifiedBadge: React.FC = ({ link }) => ( - + ); diff --git a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx index 844c87be15d5d2..1cbe24a51970d4 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx @@ -7,9 +7,9 @@ import { Helmet } from 'react-helmet'; import { NavLink } from 'react-router-dom'; import { AccountBio } from '@/mastodon/components/account_bio'; +import { AccountFields } from '@/mastodon/components/account_fields'; import { DisplayName } from '@/mastodon/components/display_name'; import { AnimateEmojiProvider } from '@/mastodon/components/emoji/context'; -import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import LockIcon from '@/material-icons/400-24px/lock.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import NotificationsIcon from '@/material-icons/400-24px/notifications.svg?react'; @@ -203,14 +203,6 @@ const titleFromAccount = (account: Account) => { return `${prefix} (@${acct})`; }; -const dateFormatOptions: Intl.DateTimeFormatOptions = { - month: 'short', - day: 'numeric', - year: 'numeric', - hour: '2-digit', - minute: '2-digit', -}; - export const AccountHeader: React.FC<{ accountId: string; hideTabs?: boolean; @@ -978,46 +970,7 @@ export const AccountHeader: React.FC<{
- {fields.map((pair, i) => ( -
-
- -
- {pair.verified_at && ( - - - - )}{' '} - -
-
- ))} +
diff --git a/app/javascript/mastodon/features/compose/components/edit_indicator.jsx b/app/javascript/mastodon/features/compose/components/edit_indicator.jsx index 106ff7bdaa41f6..3fa37bb8c8b061 100644 --- a/app/javascript/mastodon/features/compose/components/edit_indicator.jsx +++ b/app/javascript/mastodon/features/compose/components/edit_indicator.jsx @@ -50,9 +50,7 @@ export const EditIndicator = () => { {(status.get('poll') || status.get('media_attachments').size > 0) && ( diff --git a/app/javascript/mastodon/features/compose/components/reply_indicator.jsx b/app/javascript/mastodon/features/compose/components/reply_indicator.jsx index 35733ac23b662c..e746fe6a6d22cb 100644 --- a/app/javascript/mastodon/features/compose/components/reply_indicator.jsx +++ b/app/javascript/mastodon/features/compose/components/reply_indicator.jsx @@ -35,9 +35,7 @@ export const ReplyIndicator = () => { {(status.get('poll') || status.get('media_attachments').size > 0) && ( diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js index 272ea3ce08b071..357a53fba6738d 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -12,10 +12,13 @@ import { insertFeaturedTagCompose, uploadCompose, } from 'mastodon/actions/compose'; +import { pasteLinkCompose } from 'mastodon/actions/compose_typed'; import { openModal } from 'mastodon/actions/modal'; import ComposeForm from '../components/compose_form'; +const urlLikeRegex = /^https?:\/\/[^\s]+\/[^\s]+$/i; + const mapStateToProps = state => ({ text: state.getIn(['compose', 'text']), suggestions: state.getIn(['compose', 'suggestions']), @@ -76,8 +79,21 @@ const mapDispatchToProps = (dispatch, props) => ({ dispatch(changeComposeSpoilerText(checked)); }, - onPaste (files) { - dispatch(uploadCompose(files)); + onPaste (e) { + if (e.clipboardData && e.clipboardData.files.length === 1) { + dispatch(uploadCompose(e.clipboardData.files)); + e.preventDefault(); + } else if (e.clipboardData && e.clipboardData.files.length === 0) { + const data = e.clipboardData.getData('text/plain'); + if (!data.match(urlLikeRegex)) return; + + try { + const url = new URL(data); + dispatch(pasteLinkCompose({ url })); + } catch { + return; + } + } }, onPickEmoji (position, data, needsSpace) { diff --git a/app/javascript/mastodon/features/directory/components/account_card.tsx b/app/javascript/mastodon/features/directory/components/account_card.tsx index 0126d97c85558a..7c6598ca366c5b 100644 --- a/app/javascript/mastodon/features/directory/components/account_card.tsx +++ b/app/javascript/mastodon/features/directory/components/account_card.tsx @@ -2,6 +2,7 @@ import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; +import { EmojiHTML } from '@/mastodon/components/emoji/html'; import { Avatar } from 'mastodon/components/avatar'; import { DisplayName } from 'mastodon/components/display_name'; import { FollowButton } from 'mastodon/components/follow_button'; @@ -39,9 +40,10 @@ export const AccountCard: React.FC<{ accountId: string }> = ({ accountId }) => { {account.get('note').length > 0 && ( -
)} diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js index 66dcd894882127..1bad4e96d3ee4f 100644 --- a/app/javascript/mastodon/features/emoji/emoji.js +++ b/app/javascript/mastodon/features/emoji/emoji.js @@ -1,5 +1,6 @@ import Trie from 'substring-trie'; +import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; import { assetHost } from 'mastodon/utils/config'; import { autoPlayGif } from '../../initial_state'; @@ -148,7 +149,17 @@ const emojifyNode = (node, customEmojis) => { } }; -const emojify = (str, customEmojis = {}) => { +/** + * Legacy emoji processing function. + * @param {string} str + * @param {object} customEmojis + * @param {boolean} force If true, always emojify even if modern emoji is enabled + * @returns {string} + */ +const emojify = (str, customEmojis = {}, force = false) => { + if (isModernEmojiEnabled() && !force) { + return str; + } const wrapper = document.createElement('div'); wrapper.innerHTML = str; diff --git a/app/javascript/mastodon/features/emoji/emoji_picker.tsx b/app/javascript/mastodon/features/emoji/emoji_picker.tsx index f5300c9fecef6f..6dcfe37ac86fc2 100644 --- a/app/javascript/mastodon/features/emoji/emoji_picker.tsx +++ b/app/javascript/mastodon/features/emoji/emoji_picker.tsx @@ -2,9 +2,12 @@ import type { EmojiProps, PickerProps } from 'emoji-mart'; import EmojiRaw from 'emoji-mart/dist-es/components/emoji/nimble-emoji'; import PickerRaw from 'emoji-mart/dist-es/components/picker/nimble-picker'; +import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; import { assetHost } from 'mastodon/utils/config'; +import { EMOJI_MODE_NATIVE } from './constants'; import EmojiData from './emoji_data.json'; +import { useEmojiAppState } from './hooks'; const backgroundImageFnDefault = () => `${assetHost}/emoji/sheet_15_1.png`; @@ -16,6 +19,7 @@ const Emoji = ({ backgroundImageFn = backgroundImageFnDefault, ...props }: EmojiProps) => { + const { mode } = useEmojiAppState(); return ( @@ -37,6 +42,7 @@ const Picker = ({ backgroundImageFn = backgroundImageFnDefault, ...props }: PickerProps) => { + const { mode } = useEmojiAppState(); return ( ); diff --git a/app/javascript/mastodon/features/emoji/hooks.ts b/app/javascript/mastodon/features/emoji/hooks.ts index b3b27d274a63a5..dbd20d3044fa6e 100644 --- a/app/javascript/mastodon/features/emoji/hooks.ts +++ b/app/javascript/mastodon/features/emoji/hooks.ts @@ -1,6 +1,6 @@ import { useCallback, useLayoutEffect, useMemo, useState } from 'react'; -import { useAppSelector } from '@/mastodon/store'; +import { createAppSelector, useAppSelector } from '@/mastodon/store'; import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; import { toSupportedLocale } from './locale'; @@ -58,13 +58,16 @@ export function useEmojify({ return emojifiedText; } +const modeSelector = createAppSelector( + [(state) => state.meta.get('emoji_style') as string], + (emoji_style) => determineEmojiMode(emoji_style), +); + export function useEmojiAppState(): EmojiAppState { const locale = useAppSelector((state) => toSupportedLocale(state.meta.get('locale') as string), ); - const mode = useAppSelector((state) => - determineEmojiMode(state.meta.get('emoji_style') as string), - ); + const mode = useAppSelector(modeSelector); return { currentLocale: locale, diff --git a/app/javascript/mastodon/features/emoji/normalize.ts b/app/javascript/mastodon/features/emoji/normalize.ts index 65667dfe6dd8cd..a09505e97fc545 100644 --- a/app/javascript/mastodon/features/emoji/normalize.ts +++ b/app/javascript/mastodon/features/emoji/normalize.ts @@ -154,15 +154,21 @@ export function cleanExtraEmojis(extraEmojis?: CustomEmojiMapArg) { if (!extraEmojis) { return null; } - if (!isList(extraEmojis)) { - return extraEmojis; - } - return extraEmojis - .toJSON() - .reduce( + if (Array.isArray(extraEmojis)) { + return extraEmojis.reduce( (acc, emoji) => ({ ...acc, [emoji.shortcode]: emoji }), {}, ); + } + if (isList(extraEmojis)) { + return extraEmojis + .toJS() + .reduce( + (acc, emoji) => ({ ...acc, [emoji.shortcode]: emoji }), + {}, + ); + } + return extraEmojis; } function hexStringToNumbers(hexString: string): number[] { diff --git a/app/javascript/mastodon/features/emoji/types.ts b/app/javascript/mastodon/features/emoji/types.ts index 043b21361bbf3c..b55cefb0a5e218 100644 --- a/app/javascript/mastodon/features/emoji/types.ts +++ b/app/javascript/mastodon/features/emoji/types.ts @@ -56,7 +56,9 @@ export type EmojiStateMap = LimitedCache; export type CustomEmojiMapArg = | ExtraCustomEmojiMap - | ImmutableList; + | ImmutableList + | CustomEmoji[] + | ApiCustomEmojiJSON[]; export type ExtraCustomEmojiMap = Record< string, diff --git a/app/javascript/mastodon/features/explore/components/author_link.jsx b/app/javascript/mastodon/features/explore/components/author_link.jsx deleted file mode 100644 index cf92ebc78b36a0..00000000000000 --- a/app/javascript/mastodon/features/explore/components/author_link.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import PropTypes from 'prop-types'; - -import { Avatar } from 'mastodon/components/avatar'; -import { useAppSelector } from 'mastodon/store'; -import { LinkedDisplayName } from '@/mastodon/components/display_name'; - -export const AuthorLink = ({ accountId }) => { - const account = useAppSelector(state => state.getIn(['accounts', accountId])); - - if (!account) { - return null; - } - - return ( - - - - ); -}; - -AuthorLink.propTypes = { - accountId: PropTypes.string.isRequired, -}; diff --git a/app/javascript/mastodon/features/explore/components/author_link.tsx b/app/javascript/mastodon/features/explore/components/author_link.tsx new file mode 100644 index 00000000000000..a4667693a59ad5 --- /dev/null +++ b/app/javascript/mastodon/features/explore/components/author_link.tsx @@ -0,0 +1,22 @@ +import type { FC } from 'react'; + +import { LinkedDisplayName } from '@/mastodon/components/display_name'; +import { Avatar } from 'mastodon/components/avatar'; +import { useAppSelector } from 'mastodon/store'; + +export const AuthorLink: FC<{ accountId: string }> = ({ accountId }) => { + const account = useAppSelector((state) => state.accounts.get(accountId)); + + if (!account) { + return null; + } + + return ( + + + + ); +}; diff --git a/app/javascript/mastodon/features/firehose/index.jsx b/app/javascript/mastodon/features/firehose/index.jsx index 9a750ae8be167e..dd9deddda93967 100644 --- a/app/javascript/mastodon/features/firehose/index.jsx +++ b/app/javascript/mastodon/features/firehose/index.jsx @@ -13,7 +13,7 @@ import { changeSetting } from 'mastodon/actions/settings'; import { connectPublicStream, connectCommunityStream } from 'mastodon/actions/streaming'; import { expandPublicTimeline, expandCommunityTimeline } from 'mastodon/actions/timelines'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; -import { domain, enableLocalTimeline } from 'mastodon/initial_state'; +import { localLiveFeedAccess, remoteLiveFeedAccess, me, domain, enableLocalTimeline } from 'mastodon/initial_state'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; import Column from '../../components/column'; @@ -165,12 +165,12 @@ const Firehose = ({ feedType, multiColumn }) => { - {enableLocalTimeline && ( + {(signedIn || (localLiveFeedAccess === 'public' && remoteLiveFeedAccess === 'public')) && enableLocalTimeline && (
- + diff --git a/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx b/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx index dd308c87cb1fc3..e865b606fe38e8 100644 --- a/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx +++ b/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx @@ -10,9 +10,10 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import CloseIcon from '@/material-icons/400-24px/close.svg?react'; -import { Avatar } from '../../../components/avatar'; -import { DisplayName } from '../../../components/display_name'; -import { IconButton } from '../../../components/icon_button'; +import { Avatar } from '@/mastodon/components/avatar'; +import { DisplayName } from '@/mastodon/components/display_name'; +import { IconButton } from '@/mastodon/components/icon_button'; +import { EmojiHTML } from '@/mastodon/components/emoji/html'; const messages = defineMessages({ authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' }, @@ -30,7 +31,6 @@ class AccountAuthorize extends ImmutablePureComponent { render () { const { intl, account, onAuthorize, onReject } = this.props; - const content = { __html: account.get('note_emojified') }; return (
@@ -40,7 +40,11 @@ class AccountAuthorize extends ImmutablePureComponent { -
+
diff --git a/app/javascript/mastodon/features/home_timeline/components/announcements/announcement.tsx b/app/javascript/mastodon/features/home_timeline/components/announcements/announcement.tsx new file mode 100644 index 00000000000000..8513e6169bd5e8 --- /dev/null +++ b/app/javascript/mastodon/features/home_timeline/components/announcements/announcement.tsx @@ -0,0 +1,119 @@ +import { useEffect, useState } from 'react'; +import type { FC } from 'react'; + +import { FormattedDate, FormattedMessage } from 'react-intl'; + +import type { ApiAnnouncementJSON } from '@/mastodon/api_types/announcements'; +import { AnimateEmojiProvider } from '@/mastodon/components/emoji/context'; +import { EmojiHTML } from '@/mastodon/components/emoji/html'; + +import { ReactionsBar } from './reactions'; + +export interface IAnnouncement extends ApiAnnouncementJSON { + contentHtml: string; +} + +interface AnnouncementProps { + announcement: IAnnouncement; + selected: boolean; +} + +export const Announcement: FC = ({ + announcement, + selected, +}) => { + const [unread, setUnread] = useState(!announcement.read); + useEffect(() => { + // Only update `unread` marker once the announcement is out of view + if (!selected && unread !== !announcement.read) { + setUnread(!announcement.read); + } + }, [announcement.read, selected, unread]); + + return ( + + + + + {' · '} + + + + + + + + + {unread && } + + ); +}; + +const Timestamp: FC> = ({ + announcement, +}) => { + const startsAt = announcement.starts_at && new Date(announcement.starts_at); + const endsAt = announcement.ends_at && new Date(announcement.ends_at); + const now = new Date(); + const hasTimeRange = startsAt && endsAt; + const skipTime = announcement.all_day; + + if (hasTimeRange) { + const skipYear = + startsAt.getFullYear() === endsAt.getFullYear() && + endsAt.getFullYear() === now.getFullYear(); + const skipEndDate = + startsAt.getDate() === endsAt.getDate() && + startsAt.getMonth() === endsAt.getMonth() && + startsAt.getFullYear() === endsAt.getFullYear(); + return ( + <> + {' '} + -{' '} + + + ); + } + const publishedAt = new Date(announcement.published_at); + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx b/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx new file mode 100644 index 00000000000000..8c7c704849dfdc --- /dev/null +++ b/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx @@ -0,0 +1,118 @@ +import { useCallback, useState } from 'react'; +import type { FC } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import type { Map, List } from 'immutable'; + +import ReactSwipeableViews from 'react-swipeable-views'; + +import elephantUIPlane from '@/images/elephant_ui_plane.svg'; +import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; +import { IconButton } from '@/mastodon/components/icon_button'; +import LegacyAnnouncements from '@/mastodon/features/getting_started/containers/announcements_container'; +import { mascot, reduceMotion } from '@/mastodon/initial_state'; +import { createAppSelector, useAppSelector } from '@/mastodon/store'; +import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; +import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; + +import type { IAnnouncement } from './announcement'; +import { Announcement } from './announcement'; + +const messages = defineMessages({ + close: { id: 'lightbox.close', defaultMessage: 'Close' }, + previous: { id: 'lightbox.previous', defaultMessage: 'Previous' }, + next: { id: 'lightbox.next', defaultMessage: 'Next' }, +}); + +const announcementSelector = createAppSelector( + [(state) => state.announcements as Map>>], + (announcements) => + (announcements.get('items')?.toJS() as IAnnouncement[] | undefined) ?? [], +); + +export const ModernAnnouncements: FC = () => { + const intl = useIntl(); + + const announcements = useAppSelector(announcementSelector); + const emojis = useAppSelector((state) => state.custom_emojis); + + const [index, setIndex] = useState(0); + const handleChangeIndex = useCallback( + (idx: number) => { + setIndex(idx % announcements.length); + }, + [announcements.length], + ); + const handleNextIndex = useCallback(() => { + setIndex((prevIndex) => (prevIndex + 1) % announcements.length); + }, [announcements.length]); + const handlePrevIndex = useCallback(() => { + setIndex((prevIndex) => + prevIndex === 0 ? announcements.length - 1 : prevIndex - 1, + ); + }, [announcements.length]); + + if (announcements.length === 0) { + return null; + } + + return ( +
+ + +
+ + + {announcements + .map((announcement, idx) => ( + + )) + .reverse()} + + + + {announcements.length > 1 && ( +
+ + + {index + 1} / {announcements.length} + + +
+ )} +
+
+ ); +}; + +export const Announcements = isModernEmojiEnabled() + ? ModernAnnouncements + : LegacyAnnouncements; diff --git a/app/javascript/mastodon/features/home_timeline/components/announcements/reactions.tsx b/app/javascript/mastodon/features/home_timeline/components/announcements/reactions.tsx new file mode 100644 index 00000000000000..481e87f190bcf9 --- /dev/null +++ b/app/javascript/mastodon/features/home_timeline/components/announcements/reactions.tsx @@ -0,0 +1,108 @@ +import { useCallback, useMemo } from 'react'; +import type { FC, HTMLAttributes } from 'react'; + +import classNames from 'classnames'; + +import type { AnimatedProps } from '@react-spring/web'; +import { animated, useTransition } from '@react-spring/web'; + +import { addReaction, removeReaction } from '@/mastodon/actions/announcements'; +import type { ApiAnnouncementReactionJSON } from '@/mastodon/api_types/announcements'; +import { AnimatedNumber } from '@/mastodon/components/animated_number'; +import { Emoji } from '@/mastodon/components/emoji'; +import { Icon } from '@/mastodon/components/icon'; +import EmojiPickerDropdown from '@/mastodon/features/compose/containers/emoji_picker_dropdown_container'; +import { isUnicodeEmoji } from '@/mastodon/features/emoji/utils'; +import { useAppDispatch } from '@/mastodon/store'; +import AddIcon from '@/material-icons/400-24px/add.svg?react'; + +export const ReactionsBar: FC<{ + reactions: ApiAnnouncementReactionJSON[]; + id: string; +}> = ({ reactions, id }) => { + const visibleReactions = useMemo( + () => reactions.filter((x) => x.count > 0), + [reactions], + ); + + const dispatch = useAppDispatch(); + const handleEmojiPick = useCallback( + (emoji: { native: string }) => { + dispatch(addReaction(id, emoji.native.replaceAll(/:/g, ''))); + }, + [dispatch, id], + ); + + const transitions = useTransition(visibleReactions, { + from: { + scale: 0, + }, + enter: { + scale: 1, + }, + leave: { + scale: 0, + }, + keys: visibleReactions.map((x) => x.name), + }); + + return ( +
+ {transitions(({ scale }, reaction) => ( + `scale(${s})`) }} + id={id} + /> + ))} + + {visibleReactions.length < 8 && ( + } + /> + )} +
+ ); +}; + +const Reaction: FC<{ + reaction: ApiAnnouncementReactionJSON; + id: string; + style: AnimatedProps>['style']; +}> = ({ id, reaction, style }) => { + const dispatch = useAppDispatch(); + const handleClick = useCallback(() => { + if (reaction.me) { + dispatch(removeReaction(id, reaction.name)); + } else { + dispatch(addReaction(id, reaction.name)); + } + }, [dispatch, id, reaction.me, reaction.name]); + + const code = isUnicodeEmoji(reaction.name) + ? reaction.name + : `:${reaction.name}:`; + + return ( + + + + + + + + + ); +}; diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx index 39a8355b8993d0..8c5555fd49e01b 100644 --- a/app/javascript/mastodon/features/home_timeline/index.jsx +++ b/app/javascript/mastodon/features/home_timeline/index.jsx @@ -14,7 +14,6 @@ import { SymbolLogo } from 'mastodon/components/logo'; import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/announcements'; import { IconWithBadge } from 'mastodon/components/icon_with_badge'; import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator'; -import AnnouncementsContainer from 'mastodon/features/getting_started/containers/announcements_container'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { criticalUpdatesPending } from 'mastodon/initial_state'; import { withBreakpoint } from 'mastodon/features/ui/hooks/useBreakpoint'; @@ -27,6 +26,7 @@ import StatusListContainer from '../ui/containers/status_list_container'; import { ColumnSettings } from './components/column_settings'; import { CriticalUpdateBanner } from './components/critical_update_banner'; +import { Announcements } from './components/announcements'; const messages = defineMessages({ title: { id: 'column.home', defaultMessage: 'Home' }, @@ -162,7 +162,7 @@ class HomeTimeline extends PureComponent { pinned={pinned} multiColumn={multiColumn} extraButton={announcementsButton} - appendContent={hasAnnouncements && showAnnouncements && } + appendContent={hasAnnouncements && showAnnouncements && } > diff --git a/app/javascript/mastodon/features/navigation_panel/index.tsx b/app/javascript/mastodon/features/navigation_panel/index.tsx index 0b3212a81136b2..4d281646c216df 100644 --- a/app/javascript/mastodon/features/navigation_panel/index.tsx +++ b/app/javascript/mastodon/features/navigation_panel/index.tsx @@ -39,13 +39,14 @@ import { ColumnLink } from 'mastodon/features/ui/components/column_link'; import { useBreakpoint } from 'mastodon/features/ui/hooks/useBreakpoint'; import { useIdentity } from 'mastodon/identity_context'; import { - me, enableDtlMenu, - timelinePreview, - trendsEnabled, dtlTag, enableLocalTimeline, isShowItem, + localLiveFeedAccess, + remoteLiveFeedAccess, + trendsEnabled, + me, } from 'mastodon/initial_state'; import { transientSingleColumn } from 'mastodon/is_mobile'; import { selectUnreadNotificationGroupsCount } from 'mastodon/selectors/notifications'; @@ -300,10 +301,18 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({ /> )} - {(signedIn || timelinePreview) && ( + {(signedIn || + localLiveFeedAccess === 'public' || + remoteLiveFeedAccess === 'public') && ( ; +export type Mention = RecordOf; export const EmbeddedStatus: React.FC<{ statusId: string }> = ({ statusId, @@ -86,12 +87,9 @@ export const EmbeddedStatus: React.FC<{ statusId: string }> = ({ } // Assign status attributes to variables with a forced type, as status is not yet properly typed - const contentHtml = status.get('contentHtml') as string; - const contentWarning = status.get('spoilerHtml') as string; + const hasContentWarning = !!status.get('spoiler_text'); const poll = status.get('poll'); - const language = status.get('language') as string; - const mentions = status.get('mentions') as ImmutableList; - const expanded = !status.get('hidden') || !contentWarning; + const expanded = !status.get('hidden') || !hasContentWarning; const mediaAttachmentsSize = ( status.get('media_attachments') as ImmutableList ).size; @@ -109,20 +107,16 @@ export const EmbeddedStatus: React.FC<{ statusId: string }> = ({
- {contentWarning && ( - - )} + - {(!contentWarning || expanded) && ( + {(!hasContentWarning || expanded) && ( )} diff --git a/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx b/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx index 855e160fac657d..b7dc998a479f2d 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { useCallback, useMemo } from 'react'; import { useHistory } from 'react-router-dom'; @@ -6,16 +6,22 @@ import type { List } from 'immutable'; import type { History } from 'history'; +import type { ApiMentionJSON } from '@/mastodon/api_types/statuses'; +import { EmojiHTML } from '@/mastodon/components/emoji/html'; +import { useElementHandledLink } from '@/mastodon/components/status/handled_link'; +import type { Status } from '@/mastodon/models/status'; +import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; + import type { Mention } from './embedded_status'; const handleMentionClick = ( history: History, - mention: Mention, + mention: ApiMentionJSON, e: MouseEvent, ) => { if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { e.preventDefault(); - history.push(`/@${mention.get('acct')}`); + history.push(`/@${mention.acct}`); } }; @@ -31,16 +37,25 @@ const handleHashtagClick = ( }; export const EmbeddedStatusContent: React.FC<{ - content: string; - mentions: List; - language: string; + status: Status; className?: string; -}> = ({ content, mentions, language, className }) => { +}> = ({ status, className }) => { const history = useHistory(); + const mentions = useMemo( + () => (status.get('mentions') as List).toJS(), + [status], + ); + const htmlHandlers = useElementHandledLink({ + hashtagAccountId: status.get('account') as string | undefined, + hrefToMention(href) { + return mentions.find((item) => item.url === href); + }, + }); + const handleContentRef = useCallback( (node: HTMLDivElement | null) => { - if (!node) { + if (!node || isModernEmojiEnabled()) { return; } @@ -53,7 +68,7 @@ export const EmbeddedStatusContent: React.FC<{ link.classList.add('status-link'); - const mention = mentions.find((item) => link.href === item.get('url')); + const mention = mentions.find((item) => link.href === item.url); if (mention) { link.addEventListener( @@ -61,8 +76,8 @@ export const EmbeddedStatusContent: React.FC<{ handleMentionClick.bind(null, history, mention), false, ); - link.setAttribute('title', `@${mention.get('acct')}`); - link.setAttribute('href', `/@${mention.get('acct')}`); + link.setAttribute('title', `@${mention.acct}`); + link.setAttribute('href', `/@${mention.acct}`); } else if ( link.textContent.startsWith('#') || link.previousSibling?.textContent?.endsWith('#') @@ -83,11 +98,12 @@ export const EmbeddedStatusContent: React.FC<{ ); return ( -
); }; diff --git a/app/javascript/mastodon/features/status/components/detailed_status.tsx b/app/javascript/mastodon/features/status/components/detailed_status.tsx index 280ab505917e49..16e7ea70ef5306 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.tsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.tsx @@ -469,17 +469,13 @@ export const DetailedStatus: React.FC<{ /> )} - {status.get('spoiler_text').length > 0 && - (!matchedFilters || showDespiteFilter) && ( - - )} + {(!matchedFilters || showDespiteFilter) && ( + + )} {expanded && ( <> diff --git a/app/javascript/mastodon/features/status/components/refresh_controller.tsx b/app/javascript/mastodon/features/status/components/refresh_controller.tsx index 34faaf1d5d2ac1..8297922cbb1ee6 100644 --- a/app/javascript/mastodon/features/status/components/refresh_controller.tsx +++ b/app/javascript/mastodon/features/status/components/refresh_controller.tsx @@ -5,6 +5,8 @@ import { useIntl, defineMessages } from 'react-intl'; import { fetchContext, completeContextRefresh, + showPendingReplies, + clearPendingReplies, } from 'mastodon/actions/statuses'; import type { AsyncRefreshHeader } from 'mastodon/api'; import { apiGetAsyncRefresh } from 'mastodon/api/async_refreshes'; @@ -34,10 +36,6 @@ const messages = defineMessages({ id: 'status.context.loading', defaultMessage: 'Loading', }, - loadingMore: { - id: 'status.context.loading_more', - defaultMessage: 'Loading more replies', - }, success: { id: 'status.context.loading_success', defaultMessage: 'All replies loaded', @@ -52,36 +50,33 @@ const messages = defineMessages({ }, }); -type LoadingState = - | 'idle' - | 'more-available' - | 'loading-initial' - | 'loading-more' - | 'success' - | 'error'; +type LoadingState = 'idle' | 'more-available' | 'loading' | 'success' | 'error'; export const RefreshController: React.FC<{ statusId: string; }> = ({ statusId }) => { - const refresh = useAppSelector( - (state) => state.contexts.refreshing[statusId], - ); - const currentReplyCount = useAppSelector( - (state) => state.contexts.replies[statusId]?.length ?? 0, - ); - const autoRefresh = !currentReplyCount; const dispatch = useAppDispatch(); const intl = useIntl(); - const [loadingState, setLoadingState] = useState( - refresh && autoRefresh ? 'loading-initial' : 'idle', + const refreshHeader = useAppSelector( + (state) => state.contexts.refreshing[statusId], + ); + const hasPendingReplies = useAppSelector( + (state) => !!state.contexts.pendingReplies[statusId]?.length, ); + const [partialLoadingState, setLoadingState] = useState( + refreshHeader ? 'loading' : 'idle', + ); + const loadingState = hasPendingReplies + ? 'more-available' + : partialLoadingState; const [wasDismissed, setWasDismissed] = useState(false); const dismissPrompt = useCallback(() => { setWasDismissed(true); setLoadingState('idle'); - }, []); + dispatch(clearPendingReplies({ statusId })); + }, [dispatch, statusId]); useEffect(() => { let timeoutId: ReturnType; @@ -89,36 +84,51 @@ export const RefreshController: React.FC<{ const scheduleRefresh = (refresh: AsyncRefreshHeader) => { timeoutId = setTimeout(() => { void apiGetAsyncRefresh(refresh.id).then((result) => { - if (result.async_refresh.status === 'finished') { - dispatch(completeContextRefresh({ statusId })); - - if (result.async_refresh.result_count > 0) { - if (autoRefresh) { - void dispatch(fetchContext({ statusId })).then(() => { - setLoadingState('idle'); - }); - } else { - setLoadingState('more-available'); - } - } else { - setLoadingState('idle'); - } - } else { + // If the refresh status is not finished, + // schedule another refresh and exit + if (result.async_refresh.status !== 'finished') { scheduleRefresh(refresh); + return; + } + + // Refresh status is finished. The action below will clear `refreshHeader` + dispatch(completeContextRefresh({ statusId })); + + // Exit if there's nothing to fetch + if (result.async_refresh.result_count === 0) { + setLoadingState('idle'); + return; } + + // A positive result count means there _might_ be new replies, + // so we fetch the context in the background to check if there + // are any new replies. + // If so, they will populate `contexts.pendingReplies[statusId]` + void dispatch(fetchContext({ statusId, prefetchOnly: true })) + .then(() => { + // Reset loading state to `idle` – but if the fetch + // has resulted in new pending replies, the `hasPendingReplies` + // flag will switch the loading state to 'more-available' + setLoadingState('idle'); + }) + .catch(() => { + // Show an error if the fetch failed + setLoadingState('error'); + }); }); }, refresh.retry * 1000); }; - if (refresh && !wasDismissed) { - scheduleRefresh(refresh); - setLoadingState('loading-initial'); + // Initialise a refresh + if (refreshHeader && !wasDismissed) { + scheduleRefresh(refreshHeader); + setLoadingState('loading'); } return () => { clearTimeout(timeoutId); }; - }, [dispatch, statusId, refresh, autoRefresh, wasDismissed]); + }, [dispatch, statusId, refreshHeader, wasDismissed]); useEffect(() => { // Hide success message after a short delay @@ -134,20 +144,19 @@ export const RefreshController: React.FC<{ return () => ''; }, [loadingState]); + useEffect(() => { + // Clear pending replies on unmount + return () => { + dispatch(clearPendingReplies({ statusId })); + }; + }, [dispatch, statusId]); + const handleClick = useCallback(() => { - setLoadingState('loading-more'); - - dispatch(fetchContext({ statusId })) - .then(() => { - setLoadingState('success'); - return ''; - }) - .catch(() => { - setLoadingState('error'); - }); + dispatch(showPendingReplies({ statusId })); + setLoadingState('success'); }, [dispatch, statusId]); - if (loadingState === 'loading-initial') { + if (loadingState === 'loading') { return (
- -
+
{references} {ancestors} diff --git a/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx b/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx index 4227c741317ffd..c9a58265660ca6 100644 --- a/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx @@ -15,6 +15,8 @@ import InlineAccount from 'mastodon/components/inline_account'; import MediaAttachments from 'mastodon/components/media_attachments'; import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; import emojify from 'mastodon/features/emoji/emoji'; +import { EmojiHTML } from '@/mastodon/components/emoji/html'; +import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; const mapStateToProps = (state, { statusId }) => ({ language: state.getIn(['statuses', statusId, 'language']), @@ -51,8 +53,8 @@ class CompareHistoryModal extends PureComponent { return obj; }, {}); - const content = { __html: emojify(currentVersion.get('content'), emojiMap) }; - const spoilerContent = { __html: emojify(escapeTextContentForBrowser(currentVersion.get('spoiler_text')), emojiMap) }; + const content = emojify(currentVersion.get('content'), emojiMap); + const spoilerContent = emojify(escapeTextContentForBrowser(currentVersion.get('spoiler_text')), emojiMap); const formattedDate = ; const formattedName = ; @@ -65,43 +67,50 @@ class CompareHistoryModal extends PureComponent { return (
-
- - {label} -
- -
-
- {currentVersion.get('spoiler_text').length > 0 && ( - <> -
-
- - )} - -
- - {!!currentVersion.get('poll') && ( -
-
    - {currentVersion.getIn(['poll', 'options']).map(option => ( -
  • - - - -
  • - ))} -
-
- )} - - + +
+ + {label}
-
+ +
+
+ {currentVersion.get('spoiler_text').length > 0 && ( + <> + +
+ + )} + + + + {!!currentVersion.get('poll') && ( +
+
    + {currentVersion.getIn(['poll', 'options']).map(option => ( +
  • + + + +
  • + ))} +
+
+ )} + + +
+
+
); } diff --git a/app/javascript/mastodon/features/ui/components/hashtag_menu_controller.tsx b/app/javascript/mastodon/features/ui/components/hashtag_menu_controller.tsx index 6707b246728a97..6833073813d160 100644 --- a/app/javascript/mastodon/features/ui/components/hashtag_menu_controller.tsx +++ b/app/javascript/mastodon/features/ui/components/hashtag_menu_controller.tsx @@ -11,6 +11,8 @@ import type { } from 'react-overlays/esm/usePopper'; import { DropdownMenu } from 'mastodon/components/dropdown_menu'; +import { useIdentity } from 'mastodon/identity_context'; +import type { MenuItem } from 'mastodon/models/dropdown_menu'; import { useAppSelector } from 'mastodon/store'; const messages = defineMessages({ @@ -45,6 +47,7 @@ interface TargetParams { export const HashtagMenuController: React.FC = () => { const intl = useIntl(); + const { signedIn } = useIdentity(); const [open, setOpen] = useState(false); const [{ accountId, hashtag }, setTargetParams] = useState({}); const targetRef = useRef(null); @@ -96,8 +99,8 @@ export const HashtagMenuController: React.FC = () => { targetRef.current = null; }, [setOpen]); - const menu = useMemo( - () => [ + const menu = useMemo(() => { + const arr: MenuItem[] = [ { text: intl.formatMessage(messages.browseHashtag, { hashtag, @@ -111,17 +114,20 @@ export const HashtagMenuController: React.FC = () => { }), to: `/@${account?.acct}/tagged/${hashtag}`, }, - null, - { + ]; + + if (signedIn) { + arr.push(null, { text: intl.formatMessage(messages.muteHashtag, { hashtag, }), href: '/filters', dangerous: true, - }, - ], - [intl, hashtag, account], - ); + }); + } + + return arr; + }, [intl, hashtag, account, signedIn]); if (!open) { return null; diff --git a/app/javascript/mastodon/hooks/useLinks.ts b/app/javascript/mastodon/hooks/useLinks.ts index 00e1dd9bb44253..77609181be9954 100644 --- a/app/javascript/mastodon/hooks/useLinks.ts +++ b/app/javascript/mastodon/hooks/useLinks.ts @@ -7,6 +7,8 @@ import { isFulfilled, isRejected } from '@reduxjs/toolkit'; import { openURL } from 'mastodon/actions/search'; import { useAppDispatch } from 'mastodon/store'; +import { isModernEmojiEnabled } from '../utils/environment'; + const isMentionClick = (element: HTMLAnchorElement) => element.classList.contains('mention') && !element.classList.contains('hashtag'); @@ -53,6 +55,11 @@ export const useLinks = (skipHashtags?: boolean) => { const handleClick = useCallback( (e: React.MouseEvent) => { + // Exit early if modern emoji is enabled, as this is handled by HandledLink. + if (isModernEmojiEnabled()) { + return; + } + const target = (e.target as HTMLElement).closest('a'); if (!target || e.button !== 0 || e.ctrlKey || e.metaKey) { diff --git a/app/javascript/mastodon/initial_state.ts b/app/javascript/mastodon/initial_state.ts index 00e216437c5509..df193c3a8f46bf 100644 --- a/app/javascript/mastodon/initial_state.ts +++ b/app/javascript/mastodon/initial_state.ts @@ -42,7 +42,8 @@ interface InitialStateMeta { single_user_mode: boolean; source_url: string; streaming_api_base_url: string; - timeline_preview: boolean; + local_live_feed_access: 'public' | 'authenticated'; + remote_live_feed_access: 'public' | 'authenticated'; title: string; show_trends: boolean; trends_as_landing_page: boolean; @@ -137,7 +138,8 @@ export const trendsEnabled = getMeta('trends_enabled'); export const showTrends = getMeta('show_trends'); export const singleUserMode = getMeta('single_user_mode'); export const source_url = getMeta('source_url'); -export const timelinePreview = getMeta('timeline_preview'); +export const localLiveFeedAccess = getMeta('local_live_feed_access'); +export const remoteLiveFeedAccess = getMeta('remote_live_feed_access'); export const title = getMeta('title'); export const trendsAsLanding = getMeta('trends_as_landing_page'); export const useBlurhash = getMeta('use_blurhash'); diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index e51b5a56b1d798..dc02cf731a945b 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -257,7 +257,12 @@ "confirmations.revoke_quote.confirm": "Выдаліць допіс", "confirmations.revoke_quote.message": "Гэтае дзеянне немагчыма адмяніць.", "confirmations.revoke_quote.title": "Выдаліць допіс?", + "confirmations.unblock.confirm": "Разблакіраваць", + "confirmations.unblock.title": "Разблакіраваць {name}?", "confirmations.unfollow.confirm": "Адпісацца", + "confirmations.unfollow.title": "Адпісацца ад {name}?", + "confirmations.withdraw_request.confirm": "Адклікаць запыт", + "confirmations.withdraw_request.title": "Адклікаць запыт на падпіску на {name}?", "content_warning.hide": "Схаваць допіс", "content_warning.show": "Усё адно паказаць", "content_warning.show_more": "Паказаць усё роўна", @@ -870,7 +875,6 @@ "status.contains_quote": "Утрымлівае цытату", "status.context.loading": "Загружаюцца іншыя адказы", "status.context.loading_error": "Немагчыма загрузіць новыя адказы", - "status.context.loading_more": "Загружаюцца іншыя адказы", "status.context.loading_success": "Усе адказы загружаныя", "status.context.more_replies_found": "Знойдзеныя іншыя адказы", "status.context.retry": "Паспрабаваць зноў", @@ -918,6 +922,8 @@ "status.quote_private": "Прыватныя допісы нельга цытаваць", "status.quotes": "{count, plural,one {цытата} few {цытаты} other {цытат}}", "status.quotes.empty": "Яшчэ ніхто не цытаваў гэты допіс. Калі гэта адбудзецца, то Вы пабачыце гэта тут.", + "status.quotes.local_other_disclaimer": "Цытаты, у якіх адмовіў аўтар, паказаныя не будуць.", + "status.quotes.remote_other_disclaimer": "Толькі цытаты з {domain} тут будуць гарантавана паказаныя. Цытаты, у якіх адмовіў аўтар, паказаныя не будуць.", "status.read_more": "Чытаць болей", "status.reblog": "Пашырыць", "status.reblog_or_quote": "Пашырыць ці цытаваць", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index c33d64a54e5bd5..3d87c0fd93d1fb 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -28,6 +28,7 @@ "account.disable_notifications": "Paouez d'am c'hemenn pa vez embannet traoù gant @{name}", "account.domain_blocking": "Domani stanket", "account.edit_profile": "Kemmañ ar profil", + "account.edit_profile_short": "Kemmañ", "account.enable_notifications": "Ma c'hemenn pa vez embannet traoù gant @{name}", "account.endorse": "Lakaat en a-raok war ar profil", "account.familiar_followers_one": "Heuliet gant {name1}", @@ -39,6 +40,10 @@ "account.featured_tags.last_status_never": "Embann ebet", "account.follow": "Heuliañ", "account.follow_back": "Heuliañ d'ho tro", + "account.follow_back_short": "Heuliañ d'ho tro", + "account.follow_request": "Reked d'ho heuliañ", + "account.follow_request_cancel": "Nullañ ar reked", + "account.follow_request_cancel_short": "Nullañ", "account.followers": "Tud koumanantet", "account.followers.empty": "Den na heul an implijer·ez-mañ c'hoazh.", "account.followers_counter": "{count, plural, one {{counter} heulier} two {{counter} heulier} few {{counter} heulier} many {{counter} heulier} other {{counter} heulier}}", @@ -210,13 +215,19 @@ "confirmations.missing_alt_text.secondary": "Embann memes tra", "confirmations.missing_alt_text.title": "Ouzhpennañ an eiltestenn?", "confirmations.mute.confirm": "Kuzhat", + "confirmations.quiet_post_quote_info.got_it": "Mat eo", "confirmations.redraft.confirm": "Diverkañ ha skrivañ en-dro", "confirmations.redraft.title": "Diverkañ ha skrivañ an embann en-dro?", "confirmations.remove_from_followers.confirm": "Dilemel an heulier·ez", "confirmations.remove_from_followers.title": "Dilemel an heulier·ez?", "confirmations.revoke_quote.confirm": "Dilemel an embannadur", "confirmations.revoke_quote.title": "Dilemel an embannadur?", + "confirmations.unblock.confirm": "Distankañ", + "confirmations.unblock.title": "Distankañ {name}?", "confirmations.unfollow.confirm": "Diheuliañ", + "confirmations.unfollow.title": "Diheuliañ {name}?", + "confirmations.withdraw_request.confirm": "Nullañ ar reked", + "confirmations.withdraw_request.title": "Nullañ ho reked da heuliañ {name}?", "content_warning.hide": "Kuzhat an embannadur", "content_warning.show": "Diskwel memes tra", "content_warning.show_more": "Diskouez muioc'h", @@ -239,6 +250,7 @@ "domain_block_modal.block_account_instead": "Stankañ @{name} kentoc'h", "domain_block_modal.title": "Stankañ an domani?", "domain_pill.server": "Dafariad", + "domain_pill.their_handle": "H·ec'h anaouder:", "domain_pill.username": "Anv-implijer", "domain_pill.whats_in_a_handle": "Petra eo an anaouder?", "domain_pill.your_handle": "Hoc'h anaouder:", @@ -260,6 +272,7 @@ "emoji_button.search_results": "Disoc'hoù an enklask", "emoji_button.symbols": "Arouezioù", "emoji_button.travel": "Beajiñ & Lec'hioù", + "empty_column.account_featured_other.unknown": "N'eo ket bet lakaet netra en a-raok gant ar gont-mañ.", "empty_column.account_suspended": "Kont astalet", "empty_column.account_timeline": "Embannadur ebet amañ!", "empty_column.account_unavailable": "Profil dihegerz", @@ -486,6 +499,7 @@ "notifications.column_settings.admin.sign_up": "Enskrivadurioù nevez :", "notifications.column_settings.alert": "Kemennoù war ar burev", "notifications.column_settings.favourite": "Muiañ-karet:", + "notifications.column_settings.filter_bar.advanced": "Diskouez an holl rummadoù", "notifications.column_settings.follow": "Heulierien nevez:", "notifications.column_settings.follow_request": "Rekedoù heuliañ nevez:", "notifications.column_settings.group": "Strollañ", @@ -511,7 +525,7 @@ "notifications.group": "{count} a gemennoù", "notifications.mark_as_read": "Merkañ an holl kemennoù evel bezañ lennet", "notifications.permission_denied": "Kemennoù war ar burev n'int ket hegerz rak pedadenn aotren ar merdeer a zo bet nullet araok", - "notifications.permission_denied_alert": "Kemennoù wa ar burev na c'hellont ket bezañ lezelet, rak aotre ar merdeer a zo bet nac'het a-raok", + "notifications.permission_denied_alert": "Kemennoù war ar burev na c'hellont ket bezañ lezelet, rak aotre ar merdeer a zo bet nac'het a-raok", "notifications.permission_required": "Kemennoù war ar burev n'int ket hegerz abalamour d'an aotre rekis n'eo ket bet roet.", "notifications.policy.accept": "Asantiñ", "notifications.policy.accept_hint": "Diskouez er c’hemennoù", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 4a1acfd695c709..956420026ac71c 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -871,7 +871,6 @@ "status.contains_quote": "Conté una cita", "status.context.loading": "Es carreguen més respostes", "status.context.loading_error": "No s'han pogut carregar respostes noves", - "status.context.loading_more": "Es carreguen més respostes", "status.context.loading_success": "S'han carregat totes les respostes", "status.context.more_replies_found": "S'han trobat més respostes", "status.context.retry": "Torna-ho a provar", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 7b69cdc6542511..3ba60cb04c3a00 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -257,7 +257,12 @@ "confirmations.revoke_quote.confirm": "Odstranit příspěvek", "confirmations.revoke_quote.message": "Tuto akci nelze vrátit zpět.", "confirmations.revoke_quote.title": "Odstranit příspěvek?", + "confirmations.unblock.confirm": "Odblokovat", + "confirmations.unblock.title": "Odblokovat {name}?", "confirmations.unfollow.confirm": "Přestat sledovat", + "confirmations.unfollow.title": "Přestat sledovat {name}?", + "confirmations.withdraw_request.confirm": "Zrušit žádost", + "confirmations.withdraw_request.title": "Zrušit žádost na sledování {name}?", "content_warning.hide": "Skrýt příspěvek", "content_warning.show": "Přesto zobrazit", "content_warning.show_more": "Zobrazit více", @@ -870,7 +875,6 @@ "status.contains_quote": "Obsahuje citaci", "status.context.loading": "Načítání dalších odpovědí", "status.context.loading_error": "Nelze načíst nové odpovědi", - "status.context.loading_more": "Načítání dalších odpovědí", "status.context.loading_success": "Všechny odpovědi načteny", "status.context.more_replies_found": "Nalezeny další odpovědi", "status.context.retry": "Zkusit znovu", @@ -918,6 +922,8 @@ "status.quote_private": "Soukromé příspěvky nelze citovat", "status.quotes": "{count, plural, one {citace} few {citace} other {citací}}", "status.quotes.empty": "Tento příspěvek zatím nikdo necitoval. Pokud tak někdo učiní, uvidíte to zde.", + "status.quotes.local_other_disclaimer": "Citace zamítnuté autorem nebudou zobrazeny.", + "status.quotes.remote_other_disclaimer": "Pouze citace z {domain} zde budou zaručeně ukázány. Citace zamítnuté autorem nebudou zobrazeny.", "status.read_more": "Číst více", "status.reblog": "Boostnout", "status.reblog_or_quote": "Boostnout nebo citovat", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 843e2ae18798b4..5378330c3a2793 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -870,7 +870,6 @@ "status.contains_quote": "Yn cynnwys dyfyniad", "status.context.loading": "Yn llwytho mwy o atebion", "status.context.loading_error": "Wedi methu llwytho atebion newydd", - "status.context.loading_more": "Yn llwytho mwy o atebion", "status.context.loading_success": "Wedi llwytho'r holl atebion", "status.context.more_replies_found": "Mwy o atebion wedi'u canfod", "status.context.retry": "Ceisio eto", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 5c4dc9ff1d4fe5..92dd5014db2328 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -172,7 +172,7 @@ "column.domain_blocks": "Blokerede domæner", "column.edit_list": "Redigér liste", "column.favourites": "Favoritter", - "column.firehose": "Live feeds", + "column.firehose": "Aktuelt", "column.follow_requests": "Følgeanmodninger", "column.home": "Hjem", "column.list_members": "Håndtér listemedlemmer", @@ -574,8 +574,8 @@ "navigation_bar.follows_and_followers": "Følges og følgere", "navigation_bar.import_export": "Import og eksport", "navigation_bar.lists": "Lister", - "navigation_bar.live_feed_local": "Live feed (lokalt)", - "navigation_bar.live_feed_public": "Live feed (offentligt)", + "navigation_bar.live_feed_local": "Aktuelt (lokalt)", + "navigation_bar.live_feed_public": "Aktuelt (offentligt)", "navigation_bar.logout": "Log af", "navigation_bar.moderation": "Moderering", "navigation_bar.more": "Mere", @@ -875,7 +875,6 @@ "status.contains_quote": "Indeholder citat", "status.context.loading": "Indlæser flere svar", "status.context.loading_error": "Kunne ikke indlæse nye svar", - "status.context.loading_more": "Indlæser flere svar", "status.context.loading_success": "Alle svar indlæst", "status.context.more_replies_found": "Flere svar fundet", "status.context.retry": "Prøv igen", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 2ee15010ccf2ab..c1d848ee079a4c 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -257,8 +257,8 @@ "confirmations.revoke_quote.confirm": "Beitrag entfernen", "confirmations.revoke_quote.message": "Diese Aktion kann nicht rückgängig gemacht werden.", "confirmations.revoke_quote.title": "Beitrag entfernen?", - "confirmations.unblock.confirm": "Nicht mehr blockieren", - "confirmations.unblock.title": "{name} nicht mehr blockieren?", + "confirmations.unblock.confirm": "Entsperren", + "confirmations.unblock.title": "{name} entsperren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.title": "{name} entfolgen?", "confirmations.withdraw_request.confirm": "Anfrage zurückziehen", @@ -875,7 +875,6 @@ "status.contains_quote": "Enthält Zitat", "status.context.loading": "Weitere Antworten laden", "status.context.loading_error": "Weitere Antworten konnten nicht geladen werden", - "status.context.loading_more": "Weitere Antworten laden", "status.context.loading_success": "Alle weiteren Antworten geladen", "status.context.more_replies_found": "Weitere Antworten verfügbar", "status.context.retry": "Erneut versuchen", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 6df9c3c1e2ed1b..5c94e6d858ae84 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -875,7 +875,6 @@ "status.contains_quote": "Περιέχει παράθεση", "status.context.loading": "Φόρτωση περισσότερων απαντήσεων", "status.context.loading_error": "Αδυναμία φόρτωσης νέων απαντήσεων", - "status.context.loading_more": "Φόρτωση περισσότερων απαντήσεων", "status.context.loading_success": "Όλες οι απαντήσεις φορτώθηκαν", "status.context.more_replies_found": "Βρέθηκαν περισσότερες απαντήσεις", "status.context.retry": "Επανάληψη", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 96a9188eb01137..0b009f6433d1c8 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -1073,7 +1073,6 @@ "status.contains_quote": "Contains quote", "status.context.loading": "Loading more replies", "status.context.loading_error": "Couldn't load new replies", - "status.context.loading_more": "Loading more replies", "status.context.loading_success": "All replies loaded", "status.context.more_replies_found": "More replies found", "status.context.retry": "Retry", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 485ac9036ad6ad..cb6ba17612b8f4 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -875,7 +875,6 @@ "status.contains_quote": "Contiene cita", "status.context.loading": "Cargando más respuestas", "status.context.loading_error": "No se pudieron cargar nuevas respuestas", - "status.context.loading_more": "Cargando más respuestas", "status.context.loading_success": "Se cargaron todas las respuestas", "status.context.more_replies_found": "Se encontraron más respuestas", "status.context.retry": "Reintentar", @@ -923,8 +922,8 @@ "status.quote_private": "No se pueden citar los mensajes privados", "status.quotes": "{count, plural, one {# voto} other {# votos}}", "status.quotes.empty": "Todavía nadie citó este mensaje. Cuando alguien lo haga, se mostrará acá.", - "status.quotes.local_other_disclaimer": "Las citas rechazadas por el autor no se mostrarán.", - "status.quotes.remote_other_disclaimer": "Solo se muestran las citas de {domain}. Las citas rechazadas por el autor no se mostrarán.", + "status.quotes.local_other_disclaimer": "Las citas rechazadas por el autor no serán mostradas.", + "status.quotes.remote_other_disclaimer": "Solo las citas de {domain} están garantizadas de ser mostradas acá. Las citas rechazadas por el autor no serán mostradas.", "status.read_more": "Leé más", "status.reblog": "Adherir", "status.reblog_or_quote": "Adherir o citar", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 3875b0187d02d8..8c00edc9925de2 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -875,7 +875,6 @@ "status.contains_quote": "Contiene cita", "status.context.loading": "Cargando más respuestas", "status.context.loading_error": "No se pudieron cargar nuevas respuestas", - "status.context.loading_more": "Cargando más respuestas", "status.context.loading_success": "Todas las respuestas cargadas", "status.context.more_replies_found": "Se han encontrado más respuestas", "status.context.retry": "Reintentar", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 3123f55b85fe13..fc86d608488172 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -875,7 +875,6 @@ "status.contains_quote": "Contiene cita", "status.context.loading": "Cargando más respuestas", "status.context.loading_error": "No se pudieron cargar nuevas respuestas", - "status.context.loading_more": "Cargando más respuestas", "status.context.loading_success": "Se cargaron todas las respuestas", "status.context.more_replies_found": "Se encontraron más respuestas", "status.context.retry": "Reintentar", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 9175a6cc29ed45..4848c4f7e15bdf 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -257,7 +257,12 @@ "confirmations.revoke_quote.confirm": "Eemalda postitus", "confirmations.revoke_quote.message": "Seda tegevust ei saa tagasi pöörata.", "confirmations.revoke_quote.title": "Kas eemaldame postituse?", + "confirmations.unblock.confirm": "Lõpeta blokeerimine", + "confirmations.unblock.title": "Kas lõpetad {name} kasutaja blokeerimise?", "confirmations.unfollow.confirm": "Ära jälgi", + "confirmations.unfollow.title": "Kas lõpetad {name} kasutaja jälgimise?", + "confirmations.withdraw_request.confirm": "Tühista päring", + "confirmations.withdraw_request.title": "Tühistad päringu {name} kasutaja jälgimiseks?", "content_warning.hide": "Peida postitus", "content_warning.show": "Näita ikkagi", "content_warning.show_more": "Näita rohkem", @@ -870,7 +875,6 @@ "status.contains_quote": "Sisaldab tsitaati", "status.context.loading": "Laadin veel vastuseid", "status.context.loading_error": "Uute vastuste laadimine ei õnnestunud", - "status.context.loading_more": "Laadin veel vastuseid", "status.context.loading_success": "Kõik vastused on laaditud", "status.context.more_replies_found": "Leidub veel vastuseid", "status.context.retry": "Proovi uuesti", @@ -918,6 +922,8 @@ "status.quote_private": "Otsepostituste tsiteerimine pole võimalik", "status.quotes": "{count, plural, one {# tsiteerimine} other {# tsiteerimist}}", "status.quotes.empty": "Keegi pole seda postitust veel tsiteerinud. Kui keegi seda teeb, siis on ta nähtav siin.", + "status.quotes.local_other_disclaimer": "Autori poolt tagasilükatud tsitaate ei kuvata.", + "status.quotes.remote_other_disclaimer": "Kui kasutaja on {domain} domeenist, siis siin on tagatud vaid tema tsitaatide näitamine. Autori poolt tagasilükatud tsitaate ei kuvata.", "status.read_more": "Loe veel", "status.reblog": "Jaga", "status.reblog_or_quote": "Anna hoogu või tsiteeri", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 27b5c209e6de17..4cdcece7fe3206 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -875,7 +875,6 @@ "status.contains_quote": "Sisältää lainauksen", "status.context.loading": "Ladataan lisää vastauksia", "status.context.loading_error": "Ei voitu ladata lisää vastauksia", - "status.context.loading_more": "Ladataan lisää vastauksia", "status.context.loading_success": "Kaikki vastaukset ladattu", "status.context.more_replies_found": "Löytyi lisää vastauksia", "status.context.retry": "Yritä uudelleen", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 0863717ab39822..a83cd427632f3b 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -875,7 +875,6 @@ "status.contains_quote": "Inniheldur sitat", "status.context.loading": "Tekur fleiri svar niður", "status.context.loading_error": "Fekk ikki tikið nýggj svar niður", - "status.context.loading_more": "Tekur fleiri svar niður", "status.context.loading_success": "Øll svar tikin niður", "status.context.more_replies_found": "Fleiri svar funnin", "status.context.retry": "Royn aftur", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 63e8fdf2ab7365..d5c282d2f89039 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -251,7 +251,12 @@ "confirmations.revoke_quote.confirm": "Retirer la publication", "confirmations.revoke_quote.message": "Cette action ne peut pas être annulée.", "confirmations.revoke_quote.title": "Retirer la publication ?", + "confirmations.unblock.confirm": "Débloquer", + "confirmations.unblock.title": "Débloquer {name} ?", "confirmations.unfollow.confirm": "Ne plus suivre", + "confirmations.unfollow.title": "Ne plus suivre {name} ?", + "confirmations.withdraw_request.confirm": "Rejeter la demande", + "confirmations.withdraw_request.title": "Rejeter la demande de suivre {name} ?", "content_warning.hide": "Masquer le message", "content_warning.show": "Montrer quand même", "content_warning.show_more": "Montrer plus", @@ -861,6 +866,13 @@ "status.cancel_reblog_private": "Débooster", "status.cannot_quote": "Vous n'êtes pas autorisé à citer ce message", "status.cannot_reblog": "Cette publication ne peut pas être boostée", + "status.contains_quote": "Contient la citation", + "status.context.loading": "Chargement de réponses supplémentaires", + "status.context.loading_error": "Impossible de charger les nouvelles réponses", + "status.context.loading_success": "Toutes les réponses sont chargées", + "status.context.more_replies_found": "Plus de réponses trouvées", + "status.context.retry": "Réessayer", + "status.context.show": "Montrer", "status.continued_thread": "Suite du fil", "status.copy": "Copier un lien vers cette publication", "status.delete": "Supprimer", @@ -890,17 +902,22 @@ "status.quote": "Citer", "status.quote.cancel": "Annuler la citation", "status.quote_error.filtered": "Caché en raison de l'un de vos filtres", + "status.quote_error.limited_account_hint.action": "Afficher quand même", + "status.quote_error.limited_account_hint.title": "Ce profil a été masqué par la modération de {domain}.", "status.quote_error.not_available": "Publication non disponible", "status.quote_error.pending_approval": "Publication en attente", "status.quote_error.pending_approval_popout.body": "Sur Mastodon, vous pouvez contrôler si quelqu'un peut vous citer. Ce message est en attente pendant que nous recevons l'approbation de l'auteur original.", "status.quote_error.revoked": "Post supprimé par l'auteur", "status.quote_followers_only": "Seul·e·s les abonné·e·s peuvent citer cette publication", "status.quote_manual_review": "L'auteur va vérifier manuellement", + "status.quote_noun": "Citation", "status.quote_policy_change": "Changer qui peut vous citer", "status.quote_post_author": "A cité un message par @{name}", "status.quote_private": "Les publications privées ne peuvent pas être citées", "status.quotes": " {count, plural, one {quote} other {quotes}}", "status.quotes.empty": "Personne n'a encore cité ce message. Quand quelqu'un le fera, il apparaîtra ici.", + "status.quotes.local_other_disclaimer": "Les citations rejetées par l'auteur ne seront pas affichées.", + "status.quotes.remote_other_disclaimer": "Seules les citations de {domain} sont garanties d'être affichées ici. Les citations rejetées par l'auteur ne seront pas affichées.", "status.read_more": "En savoir plus", "status.reblog": "Booster", "status.reblog_or_quote": "Boost ou citation", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index e16e177ca49403..cc70dbc68f2905 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -251,7 +251,12 @@ "confirmations.revoke_quote.confirm": "Retirer la publication", "confirmations.revoke_quote.message": "Cette action ne peut pas être annulée.", "confirmations.revoke_quote.title": "Retirer la publication ?", + "confirmations.unblock.confirm": "Débloquer", + "confirmations.unblock.title": "Débloquer {name} ?", "confirmations.unfollow.confirm": "Ne plus suivre", + "confirmations.unfollow.title": "Ne plus suivre {name} ?", + "confirmations.withdraw_request.confirm": "Rejeter la demande", + "confirmations.withdraw_request.title": "Rejeter la demande de suivre {name} ?", "content_warning.hide": "Masquer le message", "content_warning.show": "Montrer quand même", "content_warning.show_more": "Montrer plus", @@ -861,6 +866,13 @@ "status.cancel_reblog_private": "Annuler le partage", "status.cannot_quote": "Vous n'êtes pas autorisé à citer ce message", "status.cannot_reblog": "Ce message ne peut pas être partagé", + "status.contains_quote": "Contient la citation", + "status.context.loading": "Chargement de réponses supplémentaires", + "status.context.loading_error": "Impossible de charger les nouvelles réponses", + "status.context.loading_success": "Toutes les réponses sont chargées", + "status.context.more_replies_found": "Plus de réponses trouvées", + "status.context.retry": "Réessayer", + "status.context.show": "Montrer", "status.continued_thread": "Suite du fil", "status.copy": "Copier le lien vers le message", "status.delete": "Supprimer", @@ -890,18 +902,23 @@ "status.quote": "Citer", "status.quote.cancel": "Annuler la citation", "status.quote_error.filtered": "Caché en raison de l'un de vos filtres", + "status.quote_error.limited_account_hint.action": "Afficher quand même", + "status.quote_error.limited_account_hint.title": "Ce profil a été masqué par la modération de {domain}.", "status.quote_error.not_available": "Publication non disponible", "status.quote_error.pending_approval": "Publication en attente", "status.quote_error.pending_approval_popout.body": "Sur Mastodon, vous pouvez contrôler si quelqu'un peut vous citer. Ce message est en attente pendant que nous recevons l'approbation de l'auteur original.", "status.quote_error.revoked": "Post supprimé par l'auteur", "status.quote_followers_only": "Seul·e·s les abonné·e·s peuvent citer cette publication", "status.quote_manual_review": "L'auteur va vérifier manuellement", + "status.quote_noun": "Citation", "status.quote_policy_change": "Changer qui peut vous citer", "status.quote_post_author": "A cité un message par @{name}", "status.quote_private": "Les publications privées ne peuvent pas être citées", "status.quotes": " {count, plural, one {quote} other {quotes}}", "status.quotes.empty": "Personne n'a encore cité ce message. Quand quelqu'un le fera, il apparaîtra ici.", - "status.read_more": "En savoir plus", + "status.quotes.local_other_disclaimer": "Les citations rejetées par l'auteur ne seront pas affichées.", + "status.quotes.remote_other_disclaimer": "Seules les citations de {domain} sont garanties d'être affichées ici. Les citations rejetées par l'auteur ne seront pas affichées.", + "status.read_more": "Lire la suite", "status.reblog": "Partager", "status.reblog_or_quote": "Boost ou citation", "status.reblog_private": "Partagez à nouveau avec vos abonnés", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 74021a0c2e3b0c..5b0d00d04c6744 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -875,7 +875,6 @@ "status.contains_quote": "Tá luachan ann", "status.context.loading": "Ag lódáil tuilleadh freagraí", "status.context.loading_error": "Níorbh fhéidir freagraí nua a lódáil", - "status.context.loading_more": "Ag lódáil tuilleadh freagraí", "status.context.loading_success": "Luchtaithe na freagraí uile", "status.context.more_replies_found": "Tuilleadh freagraí aimsithe", "status.context.retry": "Déan iarracht arís", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index a7e1cfd8c30a81..8ba7a73abe31fb 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -875,7 +875,6 @@ "status.contains_quote": "Contén unha cita", "status.context.loading": "Cargando máis respostas", "status.context.loading_error": "Non se puideron mostrar novas respostas", - "status.context.loading_more": "Cargando máis respostas", "status.context.loading_success": "Móstranse todas as respostas", "status.context.more_replies_found": "Existen máis respostas", "status.context.retry": "Volver tentar", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index f67ee0fd6931b0..61e8cb2e5f5d51 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -875,7 +875,6 @@ "status.contains_quote": "הודעה מכילה ציטוט", "status.context.loading": "נטענות תשובות נוספות", "status.context.loading_error": "טעינת תשובות נוספות נכשלה", - "status.context.loading_more": "נטענות תשובות נוספות", "status.context.loading_success": "כל התשובות נטענו", "status.context.more_replies_found": "תשובות נוספות נמצאו", "status.context.retry": "נסה שוב", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 1aba0615b4136d..1d1d824a45a171 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -28,6 +28,7 @@ "account.disable_notifications": "Ne figyelmeztessen, ha @{name} bejegyzést tesz közzé", "account.domain_blocking": "Domain tiltás", "account.edit_profile": "Profil szerkesztése", + "account.edit_profile_short": "Szerkesztés", "account.enable_notifications": "Figyelmeztessen, ha @{name} bejegyzést tesz közzé", "account.endorse": "Kiemelés a profilodon", "account.familiar_followers_many": "{name1}, {name2} és még {othersCount, plural, one {egy valaki} other {# valaki}}, akit ismersz", @@ -40,6 +41,11 @@ "account.featured_tags.last_status_never": "Nincs bejegyzés", "account.follow": "Követés", "account.follow_back": "Viszontkövetés", + "account.follow_back_short": "Visszakövetés", + "account.follow_request": "Követési kérés", + "account.follow_request_cancel": "Kérés törlése", + "account.follow_request_cancel_short": "Mégse", + "account.follow_request_short": "Kérés", "account.followers": "Követő", "account.followers.empty": "Ezt a felhasználót még senki sem követi.", "account.followers_counter": "{count, plural, one {{counter} követő} other {{counter} követő}}", @@ -251,7 +257,12 @@ "confirmations.revoke_quote.confirm": "Bejegyzés eltávolítása", "confirmations.revoke_quote.message": "Ez a művelet nem vonható vissza.", "confirmations.revoke_quote.title": "Bejegyzés eltávolítása?", + "confirmations.unblock.confirm": "Tiltás feloldása", + "confirmations.unblock.title": "{name} tiltásának feloldása?", "confirmations.unfollow.confirm": "Követés visszavonása", + "confirmations.unfollow.title": "{name} követésének megszüntetése?", + "confirmations.withdraw_request.confirm": "Kérés visszavonása", + "confirmations.withdraw_request.title": "{name} követése kérésének visszavonása?", "content_warning.hide": "Bejegyzés elrejtése", "content_warning.show": "Megjelenítés mindenképp", "content_warning.show_more": "Több megjelenítése", @@ -862,6 +873,12 @@ "status.cannot_quote": "Nem idézheted ezt a bejegyzést", "status.cannot_reblog": "Ezt a bejegyzést nem lehet megtolni", "status.contains_quote": "Idézést tartalmaz", + "status.context.loading": "Több válasz betöltése", + "status.context.loading_error": "Az új válaszok nem tölthetőek be", + "status.context.loading_success": "Összes válasz betöltve", + "status.context.more_replies_found": "Több válasz található", + "status.context.retry": "Újra", + "status.context.show": "Megjelenítés", "status.continued_thread": "Folytatott szál", "status.copy": "Link másolása bejegyzésbe", "status.delete": "Törlés", @@ -905,6 +922,8 @@ "status.quote_private": "A privát bejegyzések nem idézhetőek", "status.quotes": "{count, plural, one {idézés} other {idézés}}", "status.quotes.empty": "Senki sem idézte még ezt a bejegyzést. Ha valaki megteszi, itt fog megjelenni.", + "status.quotes.local_other_disclaimer": "A szerző által elutasított idézések nem fognak megjelenni.", + "status.quotes.remote_other_disclaimer": "Csak a(z) {domain} idézései jelennek meg itt garantáltan. A szerző által elutasított idézések nem fognak megjelenni.", "status.read_more": "Bővebben", "status.reblog": "Megtolás", "status.reblog_or_quote": "Megtolás vagy idézés", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 50b836ad6296ec..4a9929ddc0559a 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -870,7 +870,6 @@ "status.contains_quote": "Contine un citation", "status.context.loading": "Cargante plus responsas", "status.context.loading_error": "Non poteva cargar nove responsas", - "status.context.loading_more": "Cargante plus responsas", "status.context.loading_success": "Tote le responsas cargate", "status.context.more_replies_found": "Plus responsas trovate", "status.context.retry": "Tentar de novo", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 4dbdee7c8c3b0a..7934d15692cd2a 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -875,7 +875,6 @@ "status.contains_quote": "Inniheldur tilvitnun", "status.context.loading": "Hleð inn fleiri svörum", "status.context.loading_error": "Gat ekki hlaðið inn nýjum svörum", - "status.context.loading_more": "Hleð inn fleiri svörum", "status.context.loading_success": "Öllum svörum hlaðið inn", "status.context.more_replies_found": "Fleiri svör fundust", "status.context.retry": "Reyna aftur", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 204d5d8e305c12..bd84dfcadee600 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -875,7 +875,6 @@ "status.contains_quote": "Contiene una citazione", "status.context.loading": "Caricamento di altre risposte", "status.context.loading_error": "Impossibile caricare nuove risposte", - "status.context.loading_more": "Caricamento di altre risposte", "status.context.loading_success": "Tutte le risposte caricate", "status.context.more_replies_found": "Sono state trovate altre risposte", "status.context.retry": "Riprova", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index d641c896237e60..cf8d3e2bece325 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -1,6 +1,7 @@ { "about.blocks": "Rajekarên çavdêrkirî", "about.contact": "Têkilî:", + "about.default_locale": "Berdest", "about.disclaimer": "Mastodon belaş e, nermalaveke çavkaniya vekirî ye û markeyeke Mastodon gGmbHê ye.", "about.domain_blocks.no_reason_available": "Sedem ne berdest e", "about.domain_blocks.preamble": "Mastodon bi gelemperî dihêle ku tu naverokê bibînî û bi bikarhênerên ji rajekareke din a li fendiverse re têkilî dayne. Ev awaretyên ku li ser vê rajekara taybetî hatine çêkirin ev in.", @@ -8,6 +9,7 @@ "about.domain_blocks.silenced.title": "Sînorkirî", "about.domain_blocks.suspended.explanation": "Dê tu daneya ji van rajekaran neyê berhev kirin, tomarkirin an jî guhertin, ku têkilî an danûstendinek bi bikarhênerên van rajekaran re tune dike.", "about.domain_blocks.suspended.title": "Hatiye rawestandin", + "about.language_label": "Ziman", "about.not_available": "Ev zanyarî li ser vê rajekarê nehatine peydakirin.", "about.powered_by": "Medyaya civakî ya nenavendî bi hêzdariya {mastodon}", "about.rules": "Rêbazên rajekar", @@ -19,17 +21,25 @@ "account.block_domain": "Navpera {domain} asteng bike", "account.block_short": "Asteng bike", "account.blocked": "Astengkirî", + "account.blocking": "Astengkirin", "account.cancel_follow_request": "Daxwaza şopandinê vekişîne", "account.copy": "Girêdanê bo profîlê jê bigire", "account.direct": "Bi taybetî qale @{name} bike", "account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne", "account.edit_profile": "Profîlê serrast bike", + "account.edit_profile_short": "Serrast bike", "account.enable_notifications": "Min agahdar bike gava @{name} diweşîne", "account.endorse": "Taybetiyên li ser profîl", + "account.featured.accounts": "Profîl", + "account.featured.hashtags": "Hashtag", "account.featured_tags.last_status_at": "Şandiya dawî di {date} de", "account.featured_tags.last_status_never": "Şandî tune ne", "account.follow": "Bişopîne", "account.follow_back": "Bişopîne", + "account.follow_request": "Bo şopandinê daxwaz bike", + "account.follow_request_cancel": "Daxwazê têk bibe", + "account.follow_request_cancel_short": "Têk bibe", + "account.follow_request_short": "Daxwaz bike", "account.followers": "Şopîner", "account.followers.empty": "Kesekî hin ev bikarhêner neşopandiye.", "account.followers_counter": "{count, plural, one {{counter} şopîner} other {{counter} şopîner}}", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 9d289c5c53c239..6f2fcb037294b9 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -322,6 +322,7 @@ "errors.unexpected_crash.copy_stacktrace": "Kopēt stacktrace uz starpliktuvi", "errors.unexpected_crash.report_issue": "Ziņot par problēmu", "explore.suggested_follows": "Cilvēki", + "explore.title": "Populārākie", "explore.trending_links": "Jaunumi", "explore.trending_statuses": "Ieraksti", "explore.trending_tags": "Tēmturi", @@ -487,8 +488,10 @@ "mute_modal.show_options": "Parādīt iespējas", "mute_modal.title": "Apklusināt lietotāju?", "navigation_bar.about": "Par", + "navigation_bar.account_settings": "Parole un drošība", "navigation_bar.administration": "Pārvaldība", "navigation_bar.advanced_interface": "Atvērt paplašinātā tīmekļa saskarnē", + "navigation_bar.automated_deletion": "Automātiska ziņu dzēšana", "navigation_bar.blocks": "Bloķētie lietotāji", "navigation_bar.bookmarks": "Grāmatzīmes", "navigation_bar.direct": "Privātas pieminēšanas", @@ -498,6 +501,7 @@ "navigation_bar.follow_requests": "Sekošanas pieprasījumi", "navigation_bar.followed_tags": "Sekojamie tēmturi", "navigation_bar.follows_and_followers": "Seko un sekotāji", + "navigation_bar.import_export": "Imports un eksports", "navigation_bar.lists": "Saraksti", "navigation_bar.logout": "Iziet", "navigation_bar.moderation": "Satura pārraudzība", @@ -505,6 +509,7 @@ "navigation_bar.mutes": "Apklusinātie lietotāji", "navigation_bar.opened_in_classic_interface": "Ieraksti, konti un citas noteiktas lapas pēc noklusējuma tiek atvērtas klasiskajā tīmekļa saskarnē.", "navigation_bar.preferences": "Iestatījumi", + "navigation_bar.privacy_and_reach": "Privātums un sasniedzamība", "navigation_bar.search": "Meklēt", "not_signed_in_indicator.not_signed_in": "Ir jāpiesakās, lai piekļūtu šim resursam.", "notification.admin.report": "{name} ziņoja par {target}", diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json index a4ffafbe5cc542..5d864eeddf1c50 100644 --- a/app/javascript/mastodon/locales/nan.json +++ b/app/javascript/mastodon/locales/nan.json @@ -257,7 +257,12 @@ "confirmations.revoke_quote.confirm": "Thâi掉PO文", "confirmations.revoke_quote.message": "Tsit ê動作bē當復原。", "confirmations.revoke_quote.title": "Kám beh thâi掉PO文?", + "confirmations.unblock.confirm": "取消封鎖", + "confirmations.unblock.title": "取消封鎖 {name}?", "confirmations.unfollow.confirm": "取消跟tuè", + "confirmations.unfollow.title": "取消跟tuè {name}?", + "confirmations.withdraw_request.confirm": "Kā跟tuè請求收tńg去", + "confirmations.withdraw_request.title": "Kám beh收tńg去跟tuè {name} ê請求?", "content_warning.hide": "Am-khàm PO文", "content_warning.show": "Mā tio̍h顯示", "content_warning.show_more": "其他內容", @@ -870,7 +875,6 @@ "status.contains_quote": "包含引用", "status.context.loading": "載入其他回應", "status.context.loading_error": "Bē當載入新回應", - "status.context.loading_more": "載入其他回應", "status.context.loading_success": "回應lóng載入ah", "status.context.more_replies_found": "Tshuē-tio̍h其他回應", "status.context.retry": "Koh試", @@ -917,6 +921,8 @@ "status.quote_private": "私人PO文bē當引用", "status.quotes": "{count, plural, other {# 篇引用ê PO文}}", "status.quotes.empty": "Iáu無lâng引用tsit篇PO文。Nā是有lâng引用,ē佇tsia顯示。.", + "status.quotes.local_other_disclaimer": "Hōo作者拒絕引用ê引文bē當顯示。", + "status.quotes.remote_other_disclaimer": "Kan-ta tuì {domain} 來ê引文tsiah保證佇tsia顯示。Hōo作者拒絕ê引文buē顯示。", "status.read_more": "讀詳細", "status.reblog": "轉送", "status.reblog_or_quote": "轉送á是引用", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 6be053b5cfa7de..ecf8f46f756a02 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -875,7 +875,6 @@ "status.contains_quote": "Bevat citaat", "status.context.loading": "Meer reacties laden", "status.context.loading_error": "Kon geen nieuwe reacties laden", - "status.context.loading_more": "Meer reacties laden", "status.context.loading_success": "Alle reacties zijn geladen", "status.context.more_replies_found": "Meer reacties gevonden", "status.context.retry": "Opnieuw proberen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index b9ef0e491c71f4..faa4efe61fb8c3 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -875,7 +875,6 @@ "status.contains_quote": "Inneheld eit sitat", "status.context.loading": "Lastar fleire svar", "status.context.loading_error": "Kunne ikkje lasta nye svar", - "status.context.loading_more": "Lastar fleire svar", "status.context.loading_success": "Alle svara er lasta", "status.context.more_replies_found": "Fann fleire svar", "status.context.retry": "Prøv om att", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 751db6fdd4d11c..82fa079e9b2726 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -870,7 +870,6 @@ "status.contains_quote": "Contém citação", "status.context.loading": "A carregar mais respostas", "status.context.loading_error": "Não foi possível carregar novas respostas", - "status.context.loading_more": "A carregar mais respostas", "status.context.loading_success": "Todas as respostas carregadas", "status.context.more_replies_found": "Foram encontradas mais respostas", "status.context.retry": "Repetir", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index ffc3697393178b..c11df5d0d2ed58 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -1,6 +1,7 @@ { "about.blocks": "Moderované servery", "about.contact": "Kontakt:", + "about.default_locale": "Predvolený", "about.disclaimer": "Mastodon je bezplatný open-source softvér s otvoreným zdrojovým kódom a ochranná známka spoločnosti Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Dôvod nebol uvedený", "about.domain_blocks.preamble": "Mastodon vo všeobecnosti umožňuje prezerať obsah a komunikovať s používateľmi z akéhokoľvek iného servera vo fediverze. Tu sú uvedené výnimky, ktoré boli urobené na tomto konkrétnom serveri.", @@ -20,13 +21,17 @@ "account.block_domain": "Blokovať doménu {domain}", "account.block_short": "Blokovať", "account.blocked": "Účet blokovaný", + "account.blocking": "Blokované", "account.cancel_follow_request": "Zrušiť žiadosť o sledovanie", "account.copy": "Skopírovať odkaz na profil", "account.direct": "Súkromne označiť @{name}", "account.disable_notifications": "Zrušiť upozornenia na príspevky od @{name}", + "account.domain_blocking": "Blokované domény", "account.edit_profile": "Upraviť profil", + "account.edit_profile_short": "Upraviť", "account.enable_notifications": "Zapnúť upozornenia na príspevky od @{name}", "account.endorse": "Zobraziť na vlastnom profile", + "account.familiar_followers_many": "Sleduje {name1}, {name2} a {othersCount, plural, one {ďalší účet, ktorý poznáte} few {# ďalšie účty, ktoré poznáte} many {#} other {# ďalších účtov, ktoré poznáte}}", "account.familiar_followers_one": "Nasledovanie od {name1}", "account.familiar_followers_two": "Nasledovanie od {name1} a {name2}", "account.featured": "Zviditeľnené", @@ -36,13 +41,19 @@ "account.featured_tags.last_status_never": "Žiadne príspevky", "account.follow": "Sledovať", "account.follow_back": "Sledovať späť", - "account.followers": "Sledovatelia", + "account.follow_back_short": "Sledovať späť", + "account.follow_request": "Požiadať o sledovanie", + "account.follow_request_cancel": "Zrušiť žiadosť", + "account.follow_request_cancel_short": "Zrušiť", + "account.follow_request_short": "Požiadať", + "account.followers": "Sledujúce účty", "account.followers.empty": "Ešte nikto nesleduje tohto užívateľa.", - "account.followers_counter": "{count, plural, one {{counter} sledujúci} other {{counter} sledujúci}}", - "account.following": "Sledovaný účet", + "account.followers_counter": "{count, plural, one {{counter} sledujúci účet} few {{counter} sledujúce účty} many {{counter} followers} other {{counter} sledujúcich účtov}}", + "account.followers_you_know_counter": "{count, one {{counter}, ktorý poznáte}, few {{counter}, ktoré poznáte}, many {{counter}, kterých znáte} other {{counter}, ktoré poznáte}}", + "account.following": "Sledovaných účtov", "account.following_counter": "{count, plural, one {{counter} sledovaných} other {{counter} sledovaných}}", "account.follows.empty": "Tento účet ešte nikoho nesleduje.", - "account.follows_you": "Nasleduje ťa", + "account.follows_you": "Sleduje vás", "account.go_to_profile": "Prejsť na profil", "account.hide_reblogs": "Skryť zdieľania od @{name}", "account.in_memoriam": "In memoriam.", @@ -58,13 +69,15 @@ "account.mute_short": "Stíšiť", "account.muted": "Účet stíšený", "account.muting": "Stíšenie", - "account.mutual": "Nasledujete sa navzájom", + "account.mutual": "Sledujete sa navzájom", "account.no_bio": "Nie je uvedený žiadny popis.", "account.open_original_page": "Otvoriť pôvodnú stránku", "account.posts": "Príspevky", "account.posts_with_replies": "Príspevky a odpovede", + "account.remove_from_followers": "Zrušiť sledovanie od {name}", "account.report": "Nahlásiť @{name}", "account.requested_follow": "{name} vás chce sledovať", + "account.requests_to_follow_you": "Žiadosti o sledovanie", "account.share": "Zdieľaj profil @{name}", "account.show_reblogs": "Zobrazovať zdieľania od @{name}", "account.statuses_counter": "{count, plural, one {{counter} príspevok} other {{counter} príspevkov}}", @@ -91,26 +104,37 @@ "alert.rate_limited.title": "Priveľa žiadostí", "alert.unexpected.message": "Vyskytla sa nečakaná chyba.", "alert.unexpected.title": "Ups!", - "alt_text_badge.title": "Alternatívny popis", - "alt_text_modal.add_text_from_image": "Pridaj text z obrázka", + "alt_text_badge.title": "Opis", + "alt_text_modal.add_alt_text": "Pridať opis", + "alt_text_modal.add_text_from_image": "Pridať text z obrázka", "alt_text_modal.cancel": "Zrušiť", + "alt_text_modal.change_thumbnail": "Zmeniť náhľad", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Opíšte obsah pre ľudí so sluchovým postihnutím…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Opíšte obsah pre ľudí so zrakovým postihnutím…", "alt_text_modal.done": "Hotovo", "announcement.announcement": "Oznámenie", - "annual_report.summary.archetype.oracle": "Veštec", + "annual_report.summary.archetype.booster": "Zdieľač*ka", + "annual_report.summary.archetype.lurker": "Sliedič*ka", + "annual_report.summary.archetype.oracle": "Divoká karta", + "annual_report.summary.archetype.pollster": "Anketár*ka", + "annual_report.summary.archetype.replier": "Hlasná trúba", "annual_report.summary.followers.followers": "sledovatelia", "annual_report.summary.followers.total": "{count} celkovo", "annual_report.summary.here_it_is": "Tu je tvoja {year} v zhrnutí:", "annual_report.summary.highlighted_post.by_favourites": "najviac obľúbený príspevok", - "annual_report.summary.highlighted_post.by_reblogs": "najviac vyzdvihovaný príspevok", + "annual_report.summary.highlighted_post.by_reblogs": "najviac zdieľaný príspevok", "annual_report.summary.highlighted_post.by_replies": "príspevok s najviac odpoveďami", + "annual_report.summary.highlighted_post.possessive": "{name}", "annual_report.summary.most_used_app.most_used_app": "najviac používaná aplikácia", "annual_report.summary.most_used_hashtag.most_used_hashtag": "najviac užívaný hashtag", "annual_report.summary.most_used_hashtag.none": "Žiaden", "annual_report.summary.new_posts.new_posts": "nové príspevky", + "annual_report.summary.percentile.text": "Takže patríte do topúčtov na {domain}", "annual_report.summary.percentile.we_wont_tell_bernie": "Nepovieme Berniemu.", "annual_report.summary.thanks": "Vďaka, že si súčasťou Mastodonu!", "attachments_list.unprocessed": "(nespracované)", "audio.hide": "Skryť zvuk", + "block_modal.remote_users_caveat": "Požiadame server {domain} o rešpektovanie vášho rozhodnutia. Nevieme to však zaručiť, keďže niektoré servery pristupujú k blokovaniu inak. Verejné príspevky sa stále môžu zobrazovať neprihláseným ľuďom.", "block_modal.show_less": "Zobraziť menej", "block_modal.show_more": "Zobraziť viac", "block_modal.they_cant_mention": "Nemôžu ťa spomenúť, alebo nasledovať.", @@ -119,7 +143,8 @@ "block_modal.title": "Blokovať užívateľa?", "block_modal.you_wont_see_mentions": "Neuvidíš príspevky, ktoré ich spomínajú.", "boost_modal.combo": "Nabudúce môžete preskočiť stlačením {combo}", - "boost_modal.reblog": "Vyzdvihnúť príspevok?", + "boost_modal.reblog": "Zdieľať príspevok?", + "boost_modal.undo_reblog": "Zrušiť zdieľanie?", "bundle_column_error.copy_stacktrace": "Kopírovať chybovú hlášku", "bundle_column_error.error.body": "Požadovanú stránku nebolo možné vykresliť. Môže to byť spôsobené chybou v našom kóde alebo problémom s kompatibilitou prehliadača.", "bundle_column_error.error.title": "Ale nie!", @@ -130,6 +155,7 @@ "bundle_column_error.routing.body": "Žiadaná stránka nebola nájdená. Ste si istí, že zadaná adresa URL je správna?", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Zatvoriť", + "bundle_modal_error.message": "Pri načítavaní tejto obrazovky nastala chyba.", "bundle_modal_error.retry": "Skúsiť znova", "closed_registrations.other_server_instructions": "Keďže Mastodon je decentralizovaný, môžete si vytvoriť účet na inom serveri a stále komunikovať s týmto serverom.", "closed_registrations_modal.description": "Vytvorenie účtu na {domain} nie je v súčasnosti možné, ale myslite na to, že na používanie Mastodonu nepotrebujete účet práve na {domain}.", @@ -145,7 +171,7 @@ "column.directory": "Prehľadávať profily", "column.domain_blocks": "Blokované domény", "column.edit_list": "Uprav zoznam", - "column.favourites": "Obľúbené", + "column.favourites": "Ohviezdičkované", "column.firehose": "Živé kanály", "column.follow_requests": "Žiadosti o sledovanie", "column.home": "Domov", @@ -174,7 +200,7 @@ "compose_form.direct_message_warning_learn_more": "Viac informácií", "compose_form.encryption_warning": "Príspevky na Mastodone nie sú šifrované end-to-end. Nezdieľajte cez Mastodon žiadne citlivé informácie.", "compose_form.hashtag_warning": "Tento príspevok nebude zobrazený pod žiadným hashtagom, lebo nie je verejný. Iba verejné príspevky môžu byť nájdené podľa hashtagu.", - "compose_form.lock_disclaimer": "Váš účet nie je {locked}. Ktokoľvek vás môže sledovať a vidieť vaše príspevky pre sledujúcich.", + "compose_form.lock_disclaimer": "Váš účet nie je {locked}. Ktokoľvek vás môže sledovať a vidieť vaše príspevky pre sledujúce účty.", "compose_form.lock_disclaimer.lock": "zamknutý", "compose_form.placeholder": "Na čo práve myslíte?", "compose_form.poll.duration": "Trvanie ankety", @@ -198,6 +224,8 @@ "confirmations.delete_list.confirm": "Vymazať", "confirmations.delete_list.message": "Určite chcete tento zoznam trvalo vymazať?", "confirmations.delete_list.title": "Vymazať zoznam?", + "confirmations.discard_draft.confirm": "Zahodiť a pokračovať", + "confirmations.discard_draft.edit.cancel": "Pokračovať v úpravách", "confirmations.discard_edit_media.confirm": "Zahodiť", "confirmations.discard_edit_media.message": "Máte neuložené zmeny v popise alebo náhľade média, zahodiť ich aj tak?", "confirmations.follow_to_list.confirm": "Nasleduj a pridaj do zoznamu", @@ -206,13 +234,19 @@ "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.missing_alt_text.confirm": "Pridať opis", + "confirmations.missing_alt_text.message": "Váš príspevok obsahuje médiá bez opisu. Pridanie opisu sprístupňuje váš obsah viac ľuďom.", + "confirmations.missing_alt_text.secondary": "Aj tak uverejniť", + "confirmations.missing_alt_text.title": "Pridať opis?", "confirmations.mute.confirm": "Stíšiť", "confirmations.redraft.confirm": "Vymazať a prepísať", "confirmations.redraft.message": "Určite chcete tento príspevok vymazať a prepísať? Prídete o jeho zdieľania a ohviezdičkovania a odpovede na pôvodný príspevok budú odlúčené.", "confirmations.redraft.title": "Vymazať a prepísať príspevok?", "confirmations.remove_from_followers.confirm": "Odstrániť nasledovateľa", - "confirmations.unfollow.confirm": "Prestať sledovať", + "confirmations.revoke_quote.title": "Vymazať príspevok?", + "confirmations.unblock.confirm": "Odblokovať", + "confirmations.unblock.title": "Odblokovať {name}?", + "confirmations.unfollow.confirm": "Zrušiť sledovanie", "content_warning.hide": "Skryť príspevok", "content_warning.show": "Aj tak zobraziť", "content_warning.show_more": "Ukázať viac", @@ -265,7 +299,7 @@ "empty_column.account_timeline": "Nie sú tu žiadne príspevky.", "empty_column.account_unavailable": "Profil nedostupný", "empty_column.blocks": "Nemáte blokované žiadne účty.", - "empty_column.bookmarked_statuses": "Ešte nemáte záložku v žiadnom príspevku. Keď si ju do nejakého príspevkuk pridáte, zobrazí sa tu.", + "empty_column.bookmarked_statuses": "Ešte nemáte záložku v žiadnom príspevku. Keď si ju do nejakého príspevku pridáte, zobrazí sa tu.", "empty_column.community": "Miesta časová os je prázdna. Napíšte niečo, aby to tu ožilo!", "empty_column.direct": "Ešte nemáte žiadne súkromné označenia. Keď nejaké pošlete alebo dostanete, zobrazí sa tu.", "empty_column.domain_blocks": "Žiadne domény ešte nie sú blokované.", @@ -291,6 +325,7 @@ "explore.trending_links": "Správy", "explore.trending_statuses": "Príspevky", "explore.trending_tags": "Hashtagy", + "featured_carousel.header": "{count, plural, one {Pripnutý príspevok} few {Pripnuté príspevky} many {} other {Pripnutých príspevkov}}", "filter_modal.added.context_mismatch_explanation": "Táto kategória filtrov sa nevzťahuje na kontext, v ktorom ste získali prístup k tomuto príspevku. Ak chcete, aby sa príspevok filtroval aj v tomto kontexte, budete musieť filter upraviť.", "filter_modal.added.context_mismatch_title": "Nesúlad kontextu!", "filter_modal.added.expired_explanation": "Platnosť tejto kategórie filtra vypršala, aby sa použila, je potrebné zmeniť dátum vypršania platnosti.", @@ -351,12 +386,12 @@ "hashtag.column_settings.tag_mode.any": "Ľubovoľné z týchto", "hashtag.column_settings.tag_mode.none": "Žiaden z týchto", "hashtag.column_settings.tag_toggle": "Vložte dodatočné hashtagy pre tento stĺpec", - "hashtag.counter_by_accounts": "{count, plural, one {{counter} prispievateľ} few {{counter} prispievatelia} many {{counter} prispievateľov} other {{counter} prispievateľov}}", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} prispievajúci účet} few {{counter} prispievajúce účty} many {{counter} participants} other {{counter} prispievajúcich účtov}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}} dnes", "hashtag.follow": "Sledovať hashtag", "hashtag.mute": "Utlmiť #{hashtag}", - "hashtag.unfollow": "Prestať sledovať hashtag", + "hashtag.unfollow": "Zrušiť sledovanie hashtagu", "hashtags.and_other": "…a {count, plural, other {# ďalších}}", "hints.profiles.followers_may_be_missing": "Nasledovatelia tohto profilu môžu chýbať.", "hints.profiles.follows_may_be_missing": "Nasledovatelia tohto profilu môžu chýbať.", @@ -373,7 +408,7 @@ "home.show_announcements": "Zobraziť oznámenia", "ignore_notifications_modal.filter_instead": "Radšej triediť", "ignore_notifications_modal.filter_to_act_users": "Stále budeš môcť akceptovať, odmietnuť, alebo nahlásiť užívateľov", - "ignore_notifications_modal.filter_to_avoid_confusion": "Triedenie pomáha vyvarovať sa možnému zmäteniu", + "ignore_notifications_modal.filter_to_avoid_confusion": "Filtrovanie pomáha vyvarovať sa možnému zmäteniu", "ignore_notifications_modal.ignore": "Ignoruj upozornenia", "ignore_notifications_modal.limited_accounts_title": "Ignorovať oboznámenia z obmedzených účtov?", "ignore_notifications_modal.new_accounts_title": "Nevšímať si oznámenia z nových účtov?", @@ -381,6 +416,7 @@ "ignore_notifications_modal.not_following_title": "Nevšímať si oznámenia od ľudí, ktorých nenasleduješ?", "ignore_notifications_modal.private_mentions_title": "Nevšímať si oznámenia o nevyžiadaných súkromných spomínaniach?", "info_button.label": "Pomoc", + "info_button.what_is_alt_text": "

Čo je to opis?

Opis médií umožňuje ľuďom so zdravotným postihnutím alebo slabým pripojením porozumieť obsahu príspevku.

Zrozumiteľné, stručné a objektívne opisy sprístupňujú a vysvetľujú váš obsah väčšiemu počtu ľudí.

  • Spomeňte dôležité prvky
  • Zhrňte text na obrázkoch a fotkách
  • Píšte bežné vety
  • Vynechajte zbytočné informácie
  • Pri zložitých vizuáloch (napr. nákresoch či mapách) sa sústreďte na kľúčové vzorce a závery
", "interaction_modal.go": "Prejdi", "interaction_modal.no_account_yet": "Ešte nemáš účet?", "interaction_modal.on_another_server": "Na inom serveri", @@ -421,7 +457,7 @@ "keyboard_shortcuts.toggle_hidden": "Zobraziť/skryť text za varovaním o obsahu", "keyboard_shortcuts.toggle_sensitivity": "Zobraziť/skryť médiá", "keyboard_shortcuts.toot": "Vytvoriť nový príspevok", - "keyboard_shortcuts.translate": "preložiť príspevok", + "keyboard_shortcuts.translate": "Preložiť príspevok", "keyboard_shortcuts.unfocus": "Odísť z textového poľa", "keyboard_shortcuts.up": "Posunúť sa vyššie v zozname", "lightbox.close": "Zatvoriť", @@ -437,7 +473,7 @@ "lists.add_to_list": "Pridaj do zoznamu", "lists.add_to_lists": "Pridaj {name} do zoznamov", "lists.create": "Vytvor", - "lists.create_a_list_to_organize": "Vytvor nový zoznam pre spravovanie tvojej domovskej osi", + "lists.create_a_list_to_organize": "Vytvorte si nový zoznam na organizáciu svojho domovského kanála", "lists.create_list": "Vytvor zoznam", "lists.delete": "Vymazať zoznam", "lists.done": "Hotovo", @@ -447,7 +483,7 @@ "lists.find_users_to_add": "Nájdi užívateľov na pridanie", "lists.list_name": "Názov zoznamu", "lists.new_list_name": "Názov nového zoznamu", - "lists.no_lists_yet": "Ešte žiadne zoznamy.", + "lists.no_lists_yet": "Zatiaľ nemáte žiadne zoznamy.", "lists.no_members_yet": "Zatiaľ bez členov.", "lists.no_results_found": "Žiadne výsledky nenájdené.", "lists.remove_member": "Odstráň", @@ -471,8 +507,10 @@ "mute_modal.you_wont_see_mentions": "Neuvidíš príspevky, ktoré ho/ju spomínajú.", "mute_modal.you_wont_see_posts": "Stále uvidí tvoje príspevky, ale ty neuvidíš jeho/jej.", "navigation_bar.about": "O tomto serveri", + "navigation_bar.account_settings": "Heslo a zabezpečenie", "navigation_bar.administration": "Spravovanie", "navigation_bar.advanced_interface": "Otvoriť v pokročilom webovom rozhraní", + "navigation_bar.automated_deletion": "Automatické mazanie príspevkov", "navigation_bar.blocks": "Blokované účty", "navigation_bar.bookmarks": "Záložky", "navigation_bar.direct": "Súkromné označenia", @@ -481,13 +519,16 @@ "navigation_bar.filters": "Filtrované slová", "navigation_bar.follow_requests": "Žiadosti o sledovanie", "navigation_bar.followed_tags": "Sledované hashtagy", - "navigation_bar.follows_and_followers": "Sledovania a sledovatelia", + "navigation_bar.follows_and_followers": "Sledované a sledujúce účty", + "navigation_bar.import_export": "Import a export", "navigation_bar.lists": "Zoznamy", "navigation_bar.logout": "Odhlásiť sa", "navigation_bar.moderation": "Moderovanie", + "navigation_bar.more": "Viac", "navigation_bar.mutes": "Stíšené účty", "navigation_bar.opened_in_classic_interface": "Príspevky, účty a iné špeciálne stránky sú predvolene otvárané v klasickom webovom rozhraní.", "navigation_bar.preferences": "Nastavenia", + "navigation_bar.privacy_and_reach": "Súkromie a dosah", "navigation_bar.search": "Hľadať", "not_signed_in_indicator.not_signed_in": "Ak chcete získať prístup k tomuto zdroju, prihláste sa.", "notification.admin.report": "Účet {name} nahlásil {target}", @@ -498,24 +539,25 @@ "notification.favourite_pm": "{name} obľúbil/a tvoje súkromné spomenutie", "notification.follow": "{name} vás sleduje", "notification.follow_request": "{name} vás žiada sledovať", - "notification.label.mention": "Zmienka", - "notification.label.private_mention": "Súkromná zmienka", + "notification.label.mention": "Označenie", + "notification.label.private_mention": "Súkromné označenie", "notification.label.private_reply": "Súkromná odpoveď", "notification.label.reply": "Odpoveď", - "notification.mention": "Zmienka", + "notification.mention": "Označenie", "notification.mentioned_you": "{name} ťa spomenul/a", "notification.moderation-warning.learn_more": "Zisti viac", "notification.moderation_warning": "Dostal/a si varovanie od moderátora", "notification.moderation_warning.action_delete_statuses": "Niektoré z tvojich príspevkov boli odstránené.", "notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.", - "notification.moderation_warning.action_mark_statuses_as_sensitive": "Niektoré tvoje príspevky boli označené za chúlostivé.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Niektoré vaše príspevky boli označené ako citlivé.", "notification.moderation_warning.action_none": "Tvoj účet dostal upozornenie od moderátora.", - "notification.moderation_warning.action_sensitive": "Tvoje príspevky budú odteraz označované ako chúlostivé.", + "notification.moderation_warning.action_sensitive": "Vaše príspevky budú odteraz označované ako citlivé.", "notification.moderation_warning.action_silence": "Tvoj účet bol obmedzený.", "notification.moderation_warning.action_suspend": "Tvoj účet bol pozastavený.", "notification.own_poll": "Vaša anketa sa skončila", "notification.poll": "Anketa, v ktorej si hlasoval/a, skončila", "notification.reblog": "{name} zdieľa váš príspevok", + "notification.reblog.name_and_others_with_link": "{name} a {count, plural, one {# ďalší človek} few {# ďalší ľudia} many {#} other {# ďalších ľudí}} zdieľa váš príspevok", "notification.relationships_severance_event": "Stratené prepojenia s {name}", "notification.relationships_severance_event.account_suspension": "Správca z {from} pozastavil/a {target}, čo znamená, že od nich viac nemôžeš dostávať aktualizácie, alebo s nimi interaktovať.", "notification.relationships_severance_event.learn_more": "Zisti viac", @@ -592,7 +634,7 @@ "onboarding.profile.save_and_continue": "Uložiť a pokračovať", "onboarding.profile.title": "Nastavenie profilu", "onboarding.profile.upload_avatar": "Nahrať profilový obrázok", - "onboarding.profile.upload_header": "Nahrať obrázok záhlavia profilu", + "onboarding.profile.upload_header": "Nahrať obrázok v záhlaví profilu", "password_confirmation.exceeds_maxlength": "Potvrdené heslo presahuje maximálnu dĺžku hesla", "password_confirmation.mismatching": "Zadané heslá sa nezhodujú", "picture_in_picture.restore": "Vrátiť späť", @@ -720,6 +762,7 @@ "status.admin_account": "Moderovať @{name}", "status.admin_domain": "Moderovať {domain}", "status.admin_status": "Moderovať príspevok", + "status.all_disabled": "Zdieľania a citácie sú vypnuté", "status.block": "Blokovať @{name}", "status.bookmark": "Pridať záložku", "status.cancel_reblog_private": "Zrušiť zdieľanie", @@ -733,7 +776,7 @@ "status.edit": "Upraviť", "status.edited": "Naposledy upravený {date}", "status.edited_x_times": "Upravený {count, plural, other {{count}×}}", - "status.favourite": "Ohviezdičkované", + "status.favourite": "Ohviezdičkovať", "status.filter": "Filtrovanie tohto príspevku", "status.history.created": "Vytvorené účtom {name} {date}", "status.history.edited": "Upravené účtom {name} {date}", @@ -747,13 +790,16 @@ "status.mute_conversation": "Stíšiť konverzáciu", "status.open": "Rozbaliť príspevok", "status.pin": "Pripnúť na profil", + "status.quote_policy_change": "Zmeňte, kto vás môže citovať", "status.read_more": "Čítaj ďalej", "status.reblog": "Zdieľať", + "status.reblog_or_quote": "Zdieľať alebo citovať", "status.reblogged_by": "{name} zdieľa", + "status.reblogs": "{count, plural, one {zdieľanie} few {zdieľania} many {} other {zdieľaní}}", "status.reblogs.empty": "Nikto ešte tento príspevok nezdieľal. Keď tak niekto urobí, zobrazí sa to tu.", "status.redraft": "Vymazať a prepísať", "status.remove_bookmark": "Odstrániť záložku", - "status.remove_favourite": "Odstráň z obľúbených", + "status.remove_favourite": "Zrušiť ohviezdičkovanie", "status.replied_in_thread": "Odpovedal/a vo vlákne", "status.replied_to": "Odpoveď na {name}", "status.reply": "Odpovedať", @@ -805,5 +851,10 @@ "video.pause": "Pozastaviť", "video.play": "Prehrať", "video.volume_down": "Hlasitosť nadol", - "video.volume_up": "Hlasitosť nahor" + "video.volume_up": "Hlasitosť nahor", + "visibility_modal.header": "Viditeľnosť a interakcia", + "visibility_modal.quote_followers": "Iba sledujúce účty", + "visibility_modal.quote_label": "Kto vás môže citovať", + "visibility_modal.quote_nobody": "Iba ja", + "visibility_modal.quote_public": "Ktokoľvek" } diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 3f61ff0a29c33c..8e76cd8fe05bb9 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -28,6 +28,7 @@ "account.disable_notifications": "Resht së njoftuari mua, kur poston @{name}", "account.domain_blocking": "Bllokim përkatësie", "account.edit_profile": "Përpunoni profilin", + "account.edit_profile_short": "Përpunojeni", "account.enable_notifications": "Njoftomë, kur poston @{name}", "account.endorse": "Pasqyrojeni në profil", "account.familiar_followers_many": "Ndjekur nga {name1}, {name2} dhe {othersCount, plural, one {një tjetër që njihni} other {# të tjerë që njihni}}", @@ -40,6 +41,11 @@ "account.featured_tags.last_status_never": "Pa postime", "account.follow": "Ndiqeni", "account.follow_back": "Ndiqe gjithashtu", + "account.follow_back_short": "Ndiqe gjithashtu", + "account.follow_request": "Kërkoni ta ndiqni", + "account.follow_request_cancel": "Anuloje kërkesën", + "account.follow_request_cancel_short": "Anuloje", + "account.follow_request_short": "Kërkoje", "account.followers": "Ndjekës", "account.followers.empty": "Këtë përdorues ende s’e ndjek kush.", "account.followers_counter": "{count, plural, one {{counter} ndjekës} other {{counter} ndjekës}}", @@ -107,6 +113,7 @@ "alt_text_modal.describe_for_people_with_visual_impairments": "Përshkruajeni këtë për persona me mangësi shikimi…", "alt_text_modal.done": "U bë", "announcement.announcement": "Lajmërim", + "annual_report.summary.archetype.oracle": "Orakulli", "annual_report.summary.followers.followers": "ndjekës", "annual_report.summary.followers.total": "{count} gjithsej", "annual_report.summary.here_it_is": "Ja {year} juaj e shqyrtuar:", @@ -233,13 +240,25 @@ "confirmations.missing_alt_text.secondary": "Postoje, sido qoftë", "confirmations.missing_alt_text.title": "Të shtohet tekst alternativ?", "confirmations.mute.confirm": "Heshtoje", + "confirmations.quiet_post_quote_info.dismiss": "Mos ma kujto më", + "confirmations.quiet_post_quote_info.got_it": "E mora vesh", + "confirmations.quiet_post_quote_info.message": "Kur citoni një postim publik të heshtuar, postimi juaj do të kalohet i fshehur te rrjedha kohore e gjërave në modë.", + "confirmations.quiet_post_quote_info.title": "Citim postimesh publikë të heshtuar", "confirmations.redraft.confirm": "Fshijeni & rihartojeni", "confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Të parapëlqyerit dhe përforcimet do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.", "confirmations.redraft.title": "Të fshihet & riharothet postimi?", "confirmations.remove_from_followers.confirm": "Hiqe ndjekësin", "confirmations.remove_from_followers.message": "{name} do të reshtë së ndjekuri ju. Jeni i sigurt se doni të vazhdohet?", "confirmations.remove_from_followers.title": "Të hiqet ndjekësi?", + "confirmations.revoke_quote.confirm": "Hiqe postimin", + "confirmations.revoke_quote.message": "Ky veprim s’mund të zhbëhet.", + "confirmations.revoke_quote.title": "Të hiqet postimi?", + "confirmations.unblock.confirm": "Zhbllokoje", + "confirmations.unblock.title": "Të zhbllojohet {name}?", "confirmations.unfollow.confirm": "Resht së ndjekuri", + "confirmations.unfollow.title": "Të ndalet ndjekja për {name}?", + "confirmations.withdraw_request.confirm": "Tërhiqeni mbrapsht kërkesën", + "confirmations.withdraw_request.title": "Të tërhiqet mbrapsht kërkesa për ndjeken e {name}?", "content_warning.hide": "Fshihe postimin", "content_warning.show": "Shfaqe, sido qoftë", "content_warning.show_more": "Shfaq më tepër", @@ -281,6 +300,7 @@ "domain_pill.your_handle": "Targa juaj:", "domain_pill.your_server": "Shtëpia juaj dixhitale, kur gjenden krejt postimet tuaja. S’ju pëlqen kjo këtu? Shpërngulni shërbyes kur të doni dhe sillni edhe ndjekësit tuaj.", "domain_pill.your_username": "Identifikuesi juja unik në këtë shërbyes. Është e mundur të gjenden përdorues me të njëjtin emër përdoruesi në shërbyes të ndryshëm.", + "dropdown.empty": "Përzgjidhni një mundësi", "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.", "embed.preview": "Ja si do të duket:", "emoji_button.activity": "Veprimtari", @@ -437,10 +457,12 @@ "ignore_notifications_modal.private_mentions_title": "Të shpërfillen njoftime nga Përmendje Private të pakërkuara?", "info_button.label": "Ndihmë", "info_button.what_is_alt_text": "

Ç’është teksti alternativ?

Teksti alternativ jep përshkrime figurash për persona me mangësi në të parët, lidhje me gjerësi bande të ulët, ose për ata që duan kontekst shtesë.

Mund të përmirësoni përdorimin nga persona me aftësi të kufizuara dhe kuptimin për këto, duke shkruar tekst alternativ të qartë, konciz dhe objektiv.

  • Rrokni elementët e rëndësishëm
  • Përmblidhni tekst në figura
  • Përdorni strukturë të rregullt fjalish
  • Shmangni përsëritje informacioni
  • Në aspekte pamore të ndërlikuara (fjala vjen, diagrame ose harta) përqendrohuni te prirje dhe gjetje gjërash kyçe
", + "interaction_modal.action": "Që të ndërveproni me postimin nga {name}, lypset të bëni hyrjen në llogarinë tuaj, ose në çfarëdo shërbyesi Mastodon që përdorni.", "interaction_modal.go": "Shko", "interaction_modal.no_account_yet": "S’keni ende një llogari?", "interaction_modal.on_another_server": "Në një tjetër shërbyes", "interaction_modal.on_this_server": "Në këtë shërbyes", + "interaction_modal.title": "Që të vazhdohet, bëni hyrjen", "interaction_modal.username_prompt": "P.sh., {example}", "intervals.full.days": "{number, plural, one {# ditë} other {# ditë}}", "intervals.full.hours": "{number, plural, one {# orë} other {# orë}}", @@ -461,6 +483,7 @@ "keyboard_shortcuts.home": "Për hapje rrjedhe kohore vetjake", "keyboard_shortcuts.hotkey": "Tast përkatës", "keyboard_shortcuts.legend": "Për shfaqje të kësaj legjende", + "keyboard_shortcuts.load_more": "Kaloje fokusin te butoni “Ngarko më tepër”", "keyboard_shortcuts.local": "Për hapje rrjedhe kohore vendore", "keyboard_shortcuts.mention": "Për përmendje të autorit", "keyboard_shortcuts.muted": "Për hapje liste përdoruesish të heshtuar", @@ -469,6 +492,7 @@ "keyboard_shortcuts.open_media": "Për hapje mediash", "keyboard_shortcuts.pinned": "Për hapje liste mesazhesh të fiksuar", "keyboard_shortcuts.profile": "Për hapje të profilit të autorit", + "keyboard_shortcuts.quote": "Citoni postim", "keyboard_shortcuts.reply": "Për t’iu përgjigjur një postimi", "keyboard_shortcuts.requests": "Për hapje liste kërkesash për ndjekje", "keyboard_shortcuts.search": "Për kalim fokusi te kërkimi", @@ -480,6 +504,8 @@ "keyboard_shortcuts.translate": "për të përkthyer një postim", "keyboard_shortcuts.unfocus": "Për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve", "keyboard_shortcuts.up": "Për ngjitje sipër nëpër listë", + "learn_more_link.got_it": "E mora vesh", + "learn_more_link.learn_more": "Mësoni më tepër", "lightbox.close": "Mbylle", "lightbox.next": "Pasuesja", "lightbox.previous": "E mëparshmja", @@ -544,6 +570,8 @@ "navigation_bar.follows_and_followers": "Ndjekje dhe ndjekës", "navigation_bar.import_export": "Importim dhe eksportim", "navigation_bar.lists": "Lista", + "navigation_bar.live_feed_local": "Pryrje e atypëratyshme (vendore)", + "navigation_bar.live_feed_public": "Prurje e atypëratyshme (publike)", "navigation_bar.logout": "Dalje", "navigation_bar.moderation": "Moderim", "navigation_bar.more": "Më tepër", @@ -578,6 +606,7 @@ "notification.label.mention": "Përmendje", "notification.label.private_mention": "Përmendje private", "notification.label.private_reply": "Përgjigje private", + "notification.label.quote": "{name} citoi postimin tuaj", "notification.label.reply": "Përgjigje", "notification.mention": "Përmendje", "notification.mentioned_you": "{name} ju ka përmendur", @@ -592,6 +621,7 @@ "notification.moderation_warning.action_suspend": "Llogaria juaj është pezulluar.", "notification.own_poll": "Pyetësori juaj ka përfunduar", "notification.poll": "Ka përfunduar një pyetësor në të cilin keni marrë pjesë", + "notification.quoted_update": "{name} përpunoi një postim që keni cituar", "notification.reblog": "{name} përforcoi mesazhin tuaj", "notification.reblog.name_and_others_with_link": "Ju ka përforcuar {name} dhe {count, plural, one {# tjetër} other {# të tjerë}}", "notification.relationships_severance_event": "Lidhje të humbura me {name}", @@ -635,6 +665,7 @@ "notifications.column_settings.mention": "Përmendje:", "notifications.column_settings.poll": "Përfundime pyetësori:", "notifications.column_settings.push": "Njoftime Push", + "notifications.column_settings.quote": "Ctime:", "notifications.column_settings.reblog": "Përforcime:", "notifications.column_settings.show": "Shfaqi në shtylla", "notifications.column_settings.sound": "Luaj një tingull", @@ -710,10 +741,18 @@ "privacy.private.short": "Ndjekës", "privacy.public.long": "Cilido që hyn e del në Mastodon", "privacy.public.short": "Publik", + "privacy.quote.anyone": "{visibility}, mund të citojë cilido", + "privacy.quote.disabled": "{visibility}, citimet janë çaktivizuar", + "privacy.quote.limited": "{visibility}, citime të kufizuara", "privacy.unlisted.additional": "Ky sillet saktësisht si publik, vetëm se postimi s’do të shfaqet në prurje të drejtpërdrejta, ose në hashtag-ë, te eksploroni, apo kërkim në Mastodon, edhe kur keni zgjedhur të jetë për tërë llogarinë.", + "privacy.unlisted.long": "Fshehur nga përfundime kërkimi në Mastodon, rrjedha kohore gjërash në modë dhe publike", "privacy.unlisted.short": "Publik i qetë", "privacy_policy.last_updated": "Përditësuar së fundi më {date}", "privacy_policy.title": "Rregulla Privatësie", + "quote_error.poll": "Me pyetësorët nuk lejohet citim.", + "quote_error.quote": "Lejohet vetëm një citim në herë.", + "quote_error.unauthorized": "S’jen i autorizuar ta citoni këtë postim.", + "quote_error.upload": "Me bashkëngjitjet media nuk lejohet citim.", "recommended": "E rekomanduar", "refresh": "Rifreskoje", "regeneration_indicator.please_stand_by": "Ju lutemi, mos u largoni.", @@ -729,6 +768,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "sot", + "remove_quote_hint.button_label": "E mora vesh", + "remove_quote_hint.message": "Këtë mund ta bëni një menuja e mundësive {icon}.", + "remove_quote_hint.title": "Doni të hiqet postimi juaj i cituar?", "reply_indicator.attachments": "{count, plural, one {# bashkëngjitje} other {# bashkëngjitje}}", "reply_indicator.cancel": "Anuloje", "reply_indicator.poll": "Pyetësor", @@ -820,13 +862,23 @@ "status.admin_account": "Hap ndërfaqe moderimi për @{name}", "status.admin_domain": "Hap ndërfaqe moderimi për {domain}", "status.admin_status": "Hape këtë mesazh te ndërfaqja e moderimit", + "status.all_disabled": "Përforcimet dhe citime janë të çaktivizuara", "status.block": "Blloko @{name}", "status.bookmark": "Faqeruaje", "status.cancel_reblog_private": "Shpërforcojeni", + "status.cannot_quote": "S’keni leje të citoni këtë postim", "status.cannot_reblog": "Ky postim s’mund të përforcohet", + "status.contains_quote": "Përmban citim", + "status.context.loading": "Po ngarkohen më tepër përgjigje", + "status.context.loading_error": "S’u ngarkuan dot përgjigje të reja", + "status.context.loading_success": "Janë ngarkuar krejt përgjigjet", + "status.context.more_replies_found": "U gjetën më tepër përgjigje", + "status.context.retry": "Riprovoni", + "status.context.show": "Shfaqe", "status.continued_thread": "Vazhdoi rrjedhën", "status.copy": "Kopjoje lidhjen për te mesazhi", "status.delete": "Fshije", + "status.delete.success": "Postimi u fshi", "status.detailed_status": "Pamje e hollësishme bisede", "status.direct": "Përmendje private për @{name}", "status.direct_indicator": "Përmendje private", @@ -849,20 +901,43 @@ "status.mute_conversation": "Heshtoje bisedën", "status.open": "Zgjeroje këtë mesazh", "status.pin": "Fiksoje në profil", + "status.quote": "Citojeni", + "status.quote.cancel": "Anuloje citimin", "status.quote_error.filtered": "Fshehur për shkak të njërit nga filtrat tuaj", + "status.quote_error.limited_account_hint.action": "Shfaqe, sido qoftë", + "status.quote_error.limited_account_hint.title": "Kjo llogari është fshehur nga moderatorët e {domain}.", + "status.quote_error.not_available": "Postim që s’mund të kihet", + "status.quote_error.pending_approval": "Postim pezull", + "status.quote_error.pending_approval_popout.body": "Në Mastodon mundeni të kontrolloni nëse dikush ju citon a jo. Ky postim është pezull, teksa po marrim miratimin e autorit origjinal.", + "status.quote_error.revoked": "Postim i hequr nga autori", + "status.quote_followers_only": "Këtë postim mund ta citojnë vetëm ndjekës", + "status.quote_manual_review": "Autori do ta shqyrtojë dorazi", + "status.quote_noun": "Citim", + "status.quote_policy_change": "Ndryshoni cilët mund të citojnë", + "status.quote_post_author": "U citua një postim nga @{name}", + "status.quote_private": "Postimet private s’mund të citohen", + "status.quotes": "{count, plural, one {citim} other {citime}}", + "status.quotes.empty": "Këtë postim ende s’e ka cituar kush. Kur dikush ta bëjë, do të shfaqet këtu.", + "status.quotes.local_other_disclaimer": "Citimet e hedhura poshtë nga autori s’do të shfaqen.", + "status.quotes.remote_other_disclaimer": "Këtu garantohet të shfaqen vetëm citime nga {domain}. Citime të hedhura poshtë nga autori s’do të shfaqen.", "status.read_more": "Lexoni më tepër", "status.reblog": "Përforcojeni", + "status.reblog_or_quote": "Përforconi ose citoni", + "status.reblog_private": "Rindajeni me ndjekësit tuaj", "status.reblogged_by": "{name} përforcoi", "status.reblogs": "{count, plural, one {përforcim} other {përforcime}}", "status.reblogs.empty": "Këtë mesazh s’e ka përforcuar njeri deri tani. Kur ta bëjë dikush, kjo do të duket këtu.", "status.redraft": "Fshijeni & rihartojeni", "status.remove_bookmark": "Hiqe faqerojtësin", "status.remove_favourite": "Hiqe nga të parapëlqyerat", + "status.remove_quote": "Hiqe", "status.replied_in_thread": "U përgjigj te rrjedha", "status.replied_to": "Iu përgjigj {name}", "status.reply": "Përgjigjuni", "status.replyAll": "Përgjigjuni rrjedhës", "status.report": "Raportojeni @{name}", + "status.request_quote": "Kërkoni të citohet", + "status.revoke_quote": "Hiqe postimin tim nga postimi i @{name}", "status.sensitive_warning": "Lëndë rezervat", "status.share": "Ndajeni me të tjerë", "status.show_less_all": "Shfaq më pak për të tërë", @@ -900,6 +975,7 @@ "upload_button.label": "Shtoni figura, një video ose një kartelë audio", "upload_error.limit": "U tejkalua kufi ngarkimi kartelash.", "upload_error.poll": "Me pyetësorët s’lejohet ngarkim kartelash.", + "upload_error.quote": "Nuk lejohet ngarkim kartelash me citime.", "upload_form.drag_and_drop.instructions": "Që të merrni një bashkëngjitje media, shtypni tastin Space ose Enter. Teksa bëhet tërheqje, përdorni tastet shigjetë për ta shpënë bashkëngjitjen media në cilëndo drejtori që doni. Shtypni sërish Space ose Enter që të lihet bashkëngjitja media në pozicionin e vet të ri, ose shtypni Esc, që të anulohet veprimi.", "upload_form.drag_and_drop.on_drag_cancel": "Tërheqja u anulua. Bashkëngjitja media {item} u la.", "upload_form.drag_and_drop.on_drag_end": "Bashkëngjitja media {item} u la.", @@ -922,5 +998,19 @@ "video.skip_forward": "Anashkalo pasardhësen", "video.unmute": "Hiqi heshtimin", "video.volume_down": "Ulje volumi", - "video.volume_up": "Ngritje volumi" + "video.volume_up": "Ngritje volumi", + "visibility_modal.button_title": "Caktoni dukshmëri", + "visibility_modal.header": "Dukshmëri dhe ndërveprim", + "visibility_modal.helper.direct_quoting": "Përmendje private të krijuara në Mastodon s’mund të citohen nga të tjerë.", + "visibility_modal.helper.privacy_editing": "Dukshmëria s’mund të ndryshohet pasi postimi botohet.", + "visibility_modal.helper.privacy_private_self_quote": "Citimet nga ju vetë të postime private s’mund të bëhen publike.", + "visibility_modal.helper.private_quoting": "Postime vetëm për ndjekësit, të krijuara në Mastodon s’mund të citohen nga të tjerë.", + "visibility_modal.helper.unlisted_quoting": "Kur njerëzit ju citojnë, nga rrjedha kohore e gjërave në modë do të kalohen si të fshehura edhe postimet e tyre.", + "visibility_modal.instructions": "Kontrolloni cilët mund të ndërveprojnë me këtë postim. Rregullime mund të aplikooni edhe mbi krejt postimet e ardshme, që nga Parapëlqime > Parazgjedhje postimi.", + "visibility_modal.privacy_label": "Dukshmëri", + "visibility_modal.quote_followers": "Vetëm ndjekës", + "visibility_modal.quote_label": "Cilët mund të citojnë", + "visibility_modal.quote_nobody": "Thjesht unë", + "visibility_modal.quote_public": "Cilido", + "visibility_modal.save": "Ruaje" } diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 1fcaad9b64dd17..63df997694b818 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -417,6 +417,7 @@ "interaction_modal.no_account_yet": "ยังไม่มีบัญชี?", "interaction_modal.on_another_server": "ในเซิร์ฟเวอร์อื่น", "interaction_modal.on_this_server": "ในเซิร์ฟเวอร์นี้", + "interaction_modal.title": "ลงชื่อเข้า", "interaction_modal.username_prompt": "เช่น {example}", "intervals.full.days": "{number, plural, other {# วัน}}", "intervals.full.hours": "{number, plural, other {# ชั่วโมง}}", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 96fa8ae98637ec..6301c8b7dab829 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -875,7 +875,6 @@ "status.contains_quote": "Alıntı içeriyor", "status.context.loading": "Daha fazla yanıt yükleniyor", "status.context.loading_error": "Yeni yanıtlar yüklenemiyor", - "status.context.loading_more": "Daha fazla yanıt yükleniyor", "status.context.loading_success": "Tüm yanıtlar yüklendi", "status.context.more_replies_found": "Daha fazla yanıt bulundu", "status.context.retry": "Yeniden dene", @@ -923,6 +922,8 @@ "status.quote_private": "Özel gönderiler alıntılanamaz", "status.quotes": "{count, plural, one {# alıntı} other {# alıntı}}", "status.quotes.empty": "Henüz hiç kimse bu gönderiyi alıntılamadı. Herhangi bir kullanıcı alıntıladığında burada görüntülenecek.", + "status.quotes.local_other_disclaimer": "Yazar tarafından reddedilen alıntılar gösterilmez.", + "status.quotes.remote_other_disclaimer": "Yalnızca {domain} adresinden gelen alıntılar burada gösterilir. Yazar tarafından reddedilen alıntılar gösterilmez.", "status.read_more": "Devamını okuyun", "status.reblog": "Yeniden paylaş", "status.reblog_or_quote": "Yükselt veya alıntıla", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 08b224e3d64c44..61de7d3e563783 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -875,7 +875,6 @@ "status.contains_quote": "Chứa trích dẫn", "status.context.loading": "Tải thêm các trả lời", "status.context.loading_error": "Không thể tải những trả lời mới", - "status.context.loading_more": "Tải thêm các trả lời", "status.context.loading_success": "Đã tải toàn bộ trả lời", "status.context.more_replies_found": "Có trả lời mới", "status.context.retry": "Thử lại", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 1397f28f930d1e..87fe47d7771f64 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -875,7 +875,6 @@ "status.contains_quote": "包含引用", "status.context.loading": "正在加载更多回复", "status.context.loading_error": "无法加载新回复", - "status.context.loading_more": "正在加载更多回复", "status.context.loading_success": "已加载所有回复", "status.context.more_replies_found": "已找到更多回复", "status.context.retry": "重试", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 5e340810941562..35e7250f0e3ad2 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -42,7 +42,7 @@ "account.follow": "跟隨", "account.follow_back": "跟隨回去", "account.follow_back_short": "跟隨回去", - "account.follow_request": "要求跟隨您", + "account.follow_request": "要求跟隨", "account.follow_request_cancel": "取消跟隨請求", "account.follow_request_cancel_short": "取消", "account.follow_request_short": "跟隨請求", @@ -875,7 +875,6 @@ "status.contains_quote": "包含引用嘟文", "status.context.loading": "讀取更多回嘟", "status.context.loading_error": "無法讀取新回嘟", - "status.context.loading_more": "讀取更多回嘟", "status.context.loading_success": "已讀取所有回嘟", "status.context.more_replies_found": "已有更多回嘟", "status.context.retry": "再試一次", diff --git a/app/javascript/mastodon/polyfills/index.ts b/app/javascript/mastodon/polyfills/index.ts index 0ff0dd72690cc8..1abfe0a935e2ac 100644 --- a/app/javascript/mastodon/polyfills/index.ts +++ b/app/javascript/mastodon/polyfills/index.ts @@ -19,7 +19,7 @@ export function loadPolyfills() { return Promise.all([ loadIntlPolyfills(), // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- those properties might not exist in old browsers, even if they are always here in types - needsExtraPolyfills && importExtraPolyfills(), + needsExtraPolyfills ? importExtraPolyfills() : Promise.resolve(), loadEmojiPolyfills(), ]); } diff --git a/app/javascript/mastodon/reducers/contexts.ts b/app/javascript/mastodon/reducers/contexts.ts index 6ebe8fa432dc17..55ff8d23e499d6 100644 --- a/app/javascript/mastodon/reducers/contexts.ts +++ b/app/javascript/mastodon/reducers/contexts.ts @@ -13,7 +13,12 @@ import type { import type { Status } from 'mastodon/models/status'; import { blockAccountSuccess, muteAccountSuccess } from '../actions/accounts'; -import { fetchContext, completeContextRefresh } from '../actions/statuses'; +import { + fetchContext, + completeContextRefresh, + showPendingReplies, + clearPendingReplies, +} from '../actions/statuses'; import { TIMELINE_UPDATE } from '../actions/timelines'; import { compareId } from '../compare_id'; @@ -27,6 +32,10 @@ interface State { inReplyTos: Record; replies: Record; references: Record; + pendingReplies: Record< + string, + Pick[] + >; refreshing: Record; } @@ -34,50 +43,78 @@ const initialState: State = { inReplyTos: {}, replies: {}, references: {}, + pendingReplies: {}, refreshing: {}, }; +const addReply = ( + state: Draft, + { id, in_reply_to_id }: Pick, +) => { + if (!in_reply_to_id) { + return; + } + + if (!state.inReplyTos[id]) { + const siblings = (state.replies[in_reply_to_id] ??= []); + const index = siblings.findIndex((sibling) => compareId(sibling, id) < 0); + siblings.splice(index + 1, 0, id); + state.inReplyTos[id] = in_reply_to_id; + } +}; + const normalizeContext = ( state: Draft, id: string, { ancestors, descendants, references }: ApiContextJSON, ): void => { - const addReply = ({ - id, - in_reply_to_id, - }: { - id: string; - in_reply_to_id?: string; - }) => { - if (!in_reply_to_id) { - return; - } - - if (!state.inReplyTos[id]) { - const siblings = (state.replies[in_reply_to_id] ??= []); - const index = siblings.findIndex((sibling) => compareId(sibling, id) < 0); - siblings.splice(index + 1, 0, id); - state.inReplyTos[id] = in_reply_to_id; - } - }; + ancestors.forEach((item) => { + addReply(state, item); + }); // We know in_reply_to_id of statuses but `id` itself. // So we assume that the status of the id replies to last ancestors. - - ancestors.forEach(addReply); - if (ancestors[0]) { - addReply({ + addReply(state, { id, in_reply_to_id: ancestors[ancestors.length - 1]?.id, }); } - descendants.forEach(addReply); + descendants.forEach((item) => { + addReply(state, item); + }); state.references[id] = references.map((r) => r.id); }; +const applyPrefetchedReplies = (state: Draft, statusId: string) => { + const pendingReplies = state.pendingReplies[statusId]; + if (pendingReplies?.length) { + pendingReplies.forEach((item) => { + addReply(state, item); + }); + delete state.pendingReplies[statusId]; + } +}; + +const storePrefetchedReplies = ( + state: Draft, + statusId: string, + { descendants }: ApiContextJSON, +): void => { + descendants.forEach(({ id, in_reply_to_id }) => { + if (!in_reply_to_id) { + return; + } + const isNewReply = !state.replies[in_reply_to_id]?.includes(id); + if (isNewReply) { + const pendingReplies = (state.pendingReplies[statusId] ??= []); + pendingReplies.push({ id, in_reply_to_id }); + } + }); +}; + const deleteFromContexts = (state: Draft, ids: string[]): void => { ids.forEach((id) => { const inReplyToIdOfId = state.inReplyTos[id]; @@ -133,12 +170,30 @@ const updateContext = (state: Draft, status: ApiStatusJSON): void => { export const contextsReducer = createReducer(initialState, (builder) => { builder .addCase(fetchContext.fulfilled, (state, action) => { - normalizeContext(state, action.meta.arg.statusId, action.payload.context); + if (action.payload.prefetchOnly) { + storePrefetchedReplies( + state, + action.meta.arg.statusId, + action.payload.context, + ); + } else { + normalizeContext( + state, + action.meta.arg.statusId, + action.payload.context, + ); - if (action.payload.refresh) { - state.refreshing[action.meta.arg.statusId] = action.payload.refresh; + if (action.payload.refresh) { + state.refreshing[action.meta.arg.statusId] = action.payload.refresh; + } } }) + .addCase(showPendingReplies, (state, action) => { + applyPrefetchedReplies(state, action.payload.statusId); + }) + .addCase(clearPendingReplies, (state, action) => { + delete state.pendingReplies[action.payload.statusId]; + }) .addCase(completeContextRefresh, (state, action) => { delete state.refreshing[action.payload.statusId]; }) diff --git a/app/javascript/mastodon/reducers/modal.ts b/app/javascript/mastodon/reducers/modal.ts index e287626ff2f78b..dfdff7cf0379ef 100644 --- a/app/javascript/mastodon/reducers/modal.ts +++ b/app/javascript/mastodon/reducers/modal.ts @@ -41,7 +41,7 @@ const popModal = ( modalType === state.get('stack').get(0)?.get('modalType') ) { return state - .set('ignoreFocus', !!ignoreFocus) + .set('ignoreFocus', ignoreFocus) .update('stack', (stack) => stack.shift()); } else { return state; diff --git a/app/javascript/mastodon/utils/__tests__/html-test.ts b/app/javascript/mastodon/utils/__tests__/html-test.ts index 6aacc396dc8873..a48a8b572b3d1b 100644 --- a/app/javascript/mastodon/utils/__tests__/html-test.ts +++ b/app/javascript/mastodon/utils/__tests__/html-test.ts @@ -53,13 +53,19 @@ describe('html', () => { it('calls onElement callback', () => { const input = '

lorem ipsum

'; - const onElement = vi.fn( - (element: HTMLElement, children: React.ReactNode[]) => - React.createElement(element.tagName.toLowerCase(), {}, ...children), + const onElement = vi.fn( + (element, props, children) => + React.createElement( + element.tagName.toLowerCase(), + props, + ...children, + ), ); html.htmlStringToComponents(input, { onElement }); expect(onElement).toHaveBeenCalledExactlyOnceWith( expect.objectContaining({ tagName: 'P' }), + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + expect.objectContaining({ key: expect.any(String) }), expect.arrayContaining(['lorem ipsum']), {}, ); @@ -71,6 +77,8 @@ describe('html', () => { const output = html.htmlStringToComponents(input, { onElement }); expect(onElement).toHaveBeenCalledExactlyOnceWith( expect.objectContaining({ tagName: 'P' }), + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + expect.objectContaining({ key: expect.any(String) }), expect.arrayContaining(['lorem ipsum']), {}, ); diff --git a/app/javascript/mastodon/utils/environment.ts b/app/javascript/mastodon/utils/environment.ts index c666e2c94d7866..c2b6b1cf86a0d3 100644 --- a/app/javascript/mastodon/utils/environment.ts +++ b/app/javascript/mastodon/utils/environment.ts @@ -20,10 +20,7 @@ export function isFeatureEnabled(feature: Features) { export function isModernEmojiEnabled() { try { - return ( - isFeatureEnabled('modern_emojis') && - localStorage.getItem('experiments')?.split(',').includes('modern_emojis') - ); + return isFeatureEnabled('modern_emojis'); } catch { return false; } diff --git a/app/javascript/mastodon/utils/html.ts b/app/javascript/mastodon/utils/html.ts index 971aefa6d16b4b..c87b5a34cfc10e 100644 --- a/app/javascript/mastodon/utils/html.ts +++ b/app/javascript/mastodon/utils/html.ts @@ -32,20 +32,31 @@ interface QueueItem { depth: number; } -export interface HTMLToStringOptions> { +export type OnElementHandler< + Arg extends Record = Record, +> = ( + element: HTMLElement, + props: Record, + children: React.ReactNode[], + extra: Arg, +) => React.ReactNode; + +export type OnAttributeHandler< + Arg extends Record = Record, +> = ( + name: string, + value: string, + tagName: string, + extra: Arg, +) => [string, unknown] | undefined | null; + +export interface HTMLToStringOptions< + Arg extends Record = Record, +> { maxDepth?: number; onText?: (text: string, extra: Arg) => React.ReactNode; - onElement?: ( - element: HTMLElement, - children: React.ReactNode[], - extra: Arg, - ) => React.ReactNode; - onAttribute?: ( - name: string, - value: string, - tagName: string, - extra: Arg, - ) => [string, unknown] | null; + onElement?: OnElementHandler; + onAttribute?: OnAttributeHandler; allowedTags?: AllowedTagsType; extraArgs?: Arg; } @@ -125,9 +136,57 @@ export function htmlStringToComponents>( const children: React.ReactNode[] = []; let element: React.ReactNode = undefined; + // Generate props from attributes. + const key = `html-${uniqueIdCounter++}`; // Get the current key and then increment it. + const props: Record = { key }; + for (const attr of node.attributes) { + let name = attr.name.toLowerCase(); + + // Custom attribute handler. + if (onAttribute) { + const result = onAttribute(name, attr.value, tagName, extraArgs); + // Rewrite this attribute. + if (result) { + const [cbName, value] = result; + props[cbName] = value; + continue; + } else if (result === null) { + // Explicitly remove this attribute. + continue; + } + } + + // Check global attributes first, then tag-specific ones. + const globalAttr = globalAttributes[name]; + const tagAttr = tagInfo.attributes?.[name]; + + // Exit if neither global nor tag-specific attribute is allowed. + if (!globalAttr && !tagAttr) { + continue; + } + + // Rename if needed. + if (typeof tagAttr === 'string') { + name = tagAttr; + } else if (typeof globalAttr === 'string') { + name = globalAttr; + } + + let value: string | boolean | number = attr.value; + + // Handle boolean attributes. + if (value === 'true') { + value = true; + } else if (value === 'false') { + value = false; + } + + props[name] = value; + } + // If onElement is provided, use it to create the element. if (onElement) { - const component = onElement(node, children, extraArgs); + const component = onElement(node, props, children, extraArgs); // Check for undefined to allow returning null. if (component !== undefined) { @@ -137,53 +196,6 @@ export function htmlStringToComponents>( // If the element wasn't created, use the default conversion. if (element === undefined) { - const props: Record = {}; - props.key = `html-${uniqueIdCounter++}`; // Get the current key and then increment it. - for (const attr of node.attributes) { - let name = attr.name.toLowerCase(); - - // Custom attribute handler. - if (onAttribute) { - const result = onAttribute( - name, - attr.value, - node.tagName.toLowerCase(), - extraArgs, - ); - if (result) { - const [cbName, value] = result; - props[cbName] = value; - } - } else { - // Check global attributes first, then tag-specific ones. - const globalAttr = globalAttributes[name]; - const tagAttr = tagInfo.attributes?.[name]; - - // Exit if neither global nor tag-specific attribute is allowed. - if (!globalAttr && !tagAttr) { - continue; - } - - // Rename if needed. - if (typeof tagAttr === 'string') { - name = tagAttr; - } else if (typeof globalAttr === 'string') { - name = globalAttr; - } - - let value: string | boolean | number = attr.value; - - // Handle boolean attributes. - if (value === 'true') { - value = true; - } else if (value === 'false') { - value = false; - } - - props[name] = value; - } - } - element = React.createElement( tagName, props, diff --git a/app/javascript/styles/entrypoints/mailer.scss b/app/javascript/styles/entrypoints/mailer.scss index 7d2a54afae0ca2..fcbbd66f4c7747 100644 --- a/app/javascript/styles/entrypoints/mailer.scss +++ b/app/javascript/styles/entrypoints/mailer.scss @@ -88,6 +88,14 @@ table + p { padding: 24px; } +.email-inner-nested-card-td { + border-radius: 12px; + padding: 18px; + overflow: hidden; + background-color: #fff; + border: 1px solid #dfdee3; +} + // Account .email-account-banner-table { background-color: #f3f2f5; @@ -559,12 +567,29 @@ table + p { } } +.email-quote-header-img { + width: 34px; + + img { + width: 34px; + height: 34px; + border-radius: 8px; + overflow: hidden; + } +} + .email-status-header-text { padding-left: 16px; padding-right: 16px; vertical-align: middle; } +.email-quote-header-text { + padding-left: 14px; + padding-right: 14px; + vertical-align: middle; +} + .email-status-header-name { font-size: 16px; font-weight: 600; @@ -578,6 +603,19 @@ table + p { color: #746a89; } +.email-quote-header-name { + font-size: 14px; + font-weight: 600; + line-height: 18px; + color: #17063b; +} + +.email-quote-header-handle { + font-size: 13px; + line-height: 18px; + color: #746a89; +} + .email-status-content { padding-top: 24px; } @@ -589,6 +627,10 @@ table + p { } .email-status-prose { + .quote-inline { + display: none; + } + p { font-size: 14px; line-height: 20px; diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 3037ddfac9b3c5..7f9756d6a074ad 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1953,7 +1953,6 @@ a.sparkline { .status__card { padding: 15px; border-radius: 4px; - background: $ui-base-color; font-size: 15px; line-height: 20px; word-wrap: break-word; @@ -1972,8 +1971,105 @@ a.sparkline { .status__content { padding-top: 0; - summary { - display: list-item; + > details { + summary { + display: block; + box-sizing: border-box; + background: var(--nested-card-background); + color: var(--nested-card-text); + border: var(--nested-card-border); + border-radius: 8px; + padding: 8px 13px; + position: relative; + font-size: 15px; + line-height: 22px; + cursor: pointer; + + &::after { + content: attr(data-show, 'Show more'); + margin-top: 8px; + display: block; + font-size: 15px; + line-height: 20px; + color: $highlight-text-color; + cursor: pointer; + border: 0; + background: transparent; + padding: 0; + text-decoration: none; + font-weight: 500; + } + + &:hover, + &:focus-visible { + &::after { + text-decoration: underline !important; + } + } + } + + &[open] summary { + margin-bottom: 16px; + + &::after { + content: attr(data-hide, 'Hide post'); + } + } + } + } + + .preview-card { + position: relative; + max-width: 566px; + + .status-card__image { + &--video { + aspect-ratio: 16 / 9; + } + + &--large { + aspect-ratio: 1.91 / 1; + } + + aspect-ratio: 1; + } + + .spoiler-button__overlay__label { + outline: 1px solid var(--media-outline-color); + } + + .hide-button { + // Toggled to appear when the preview-card is unblurred: + display: none; + position: absolute; + top: 5px; + right: 5px; + color: $white; + border: 0; + outline: 1px solid var(--media-outline-color); + background-color: color.change($black, $alpha: 0.45); + backdrop-filter: $backdrop-blur-filter; + padding: 3px 12px; + border-radius: 99px; + font-size: 14px; + font-weight: 700; + line-height: 20px; + + &:hover, + &:focus { + background-color: color.change($black, $alpha: 0.9); + } + } + + &.preview-card--image-visible { + .hide-button { + display: block; + } + + .spoiler-button__overlay, + .status-card__image-preview { + display: none; + } } } } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index a08748b9b999c0..13c9e06af32b97 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3254,18 +3254,23 @@ a.account__display-name { .column__alert { position: sticky; - bottom: 1rem; + bottom: 0; z-index: 10; box-sizing: border-box; display: grid; width: 100%; max-width: 360px; - padding-inline: 10px; - margin-top: 1rem; - margin-inline: auto; + padding: 1rem; + margin: auto auto 0; + overflow: clip; + + &:empty { + padding: 0; + } @media (max-width: #{$mobile-menu-breakpoint - 1}) { - bottom: 4rem; + // Compensate for mobile menubar + bottom: var(--mobile-bottom-nav-height); } & > * { diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 7179b6407c6d46..40d65a1b518ff3 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -289,12 +289,12 @@ def process_tags def process_quote @quote_uri = @status_parser.quote_uri - return if @quote_uri.blank? + return unless @status_parser.quote? approval_uri = @status_parser.quote_approval_uri approval_uri = 'http://kmy.blue/ns#LegacyQuote' if approval_uri == 'kmyblue:LegacyQuote' approval_uri = nil if unsupported_uri_scheme?(approval_uri) || (approval_uri != 'http://kmy.blue/ns#LegacyQuote' && TagManager.instance.local_url?(approval_uri)) - @quote = Quote.new(account: @account, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?) + @quote = Quote.new(account: @account, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?, state: @status_parser.deleted_quote? ? :deleted : :pending) end def process_hashtag(tag) diff --git a/app/lib/activitypub/forwarder.rb b/app/lib/activitypub/forwarder.rb index 3a94f9669abd64..c5ff59fa5ae749 100644 --- a/app/lib/activitypub/forwarder.rb +++ b/app/lib/activitypub/forwarder.rb @@ -27,17 +27,25 @@ def reblogged_by_account_ids @reblogged_by_account_ids ||= @status.reblogs.includes(:account).references(:account).merge(Account.local).pluck(:account_id) end + def quoted_by_account_ids + @quoted_by_account_ids ||= @status.quotes.includes(:account).references(:account).merge(Account.local).pluck(:account_id) + end + + def shared_by_account_ids + reblogged_by_account_ids.concat(quoted_by_account_ids) + end + def signature_account_id @signature_account_id ||= if in_reply_to_local? in_reply_to.account_id else - reblogged_by_account_ids.first + shared_by_account_ids.first end end def inboxes @inboxes ||= begin - arr = inboxes_for_followers_of_reblogged_by_accounts + arr = inboxes_for_followers_of_shared_by_accounts arr += inboxes_for_followers_of_replied_to_account if in_reply_to_local? arr -= [@account.preferred_inbox_url] arr.uniq! @@ -45,8 +53,8 @@ def inboxes end end - def inboxes_for_followers_of_reblogged_by_accounts - Account.where(id: ::Follow.where(target_account_id: reblogged_by_account_ids).select(:account_id)).inboxes + def inboxes_for_followers_of_shared_by_accounts + Account.where(id: ::Follow.where(target_account_id: shared_by_account_ids).select(:account_id)).inboxes end def inboxes_for_followers_of_replied_to_account diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb index d7d9a3c4574f12..531fa1d2270a43 100644 --- a/app/lib/activitypub/parser/status_parser.rb +++ b/app/lib/activitypub/parser/status_parser.rb @@ -152,6 +152,14 @@ def quote_policy flags end + def quote? + %w(quote _misskey_quote quoteUrl quoteUri).any? { |key| @object[key].present? } + end + + def deleted_quote? + @object['quote'].is_a?(Hash) && @object['quote']['type'] == 'Tombstone' + end + def quote_uri %w(quote _misskey_quote quoteUrl quoteUri).filter_map do |key| value_or_id(as_array(@object[key]).first) @@ -176,7 +184,7 @@ def quote_approval_uri def quote_subpolicy(subpolicy) flags = 0 - allowed_actors = as_array(subpolicy) + allowed_actors = as_array(subpolicy).dup allowed_actors.uniq! flags |= Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] if allowed_actors.delete('as:Public') || allowed_actors.delete('Public') || allowed_actors.delete('https://www.w3.org/ns/activitystreams#Public') diff --git a/app/lib/permalink_redirector.rb b/app/lib/permalink_redirector.rb index 142a05d10d3daa..19fb3f401c9b6c 100644 --- a/app/lib/permalink_redirector.rb +++ b/app/lib/permalink_redirector.rb @@ -12,21 +12,21 @@ def object @object ||= begin if at_username_status_request? || statuses_status_request? status = Status.find_by(id: second_segment) - status if status&.distributable? && !status&.local? + status if status&.distributable? && !status&.local? && !status&.account&.suspended? elsif at_username_request? username, domain = first_segment.delete_prefix('@').split('@') domain = nil if TagManager.instance.local_domain?(domain) account = Account.find_remote(username, domain) - account unless account&.local? + account if !account&.local? && !account&.suspended? elsif accounts_request? && record_integer_id_request? account = Account.find_by(id: second_segment) - account unless account&.local? + account if !account&.local? && !account&.suspended? end end end def redirect_path - return ActivityPub::TagManager.instance.url_for(object) if object.present? + return ActivityPub::TagManager.instance.url_for(object) || ActivityPub::TagManager.instance.uri_for(object) if object.present? @path.delete_prefix('/deck') if @path.start_with?('/deck') end diff --git a/app/models/concerns/account/suspensions.rb b/app/models/concerns/account/suspensions.rb index cdf3c1cb245fc3..45a4e517ed4905 100644 --- a/app/models/concerns/account/suspensions.rb +++ b/app/models/concerns/account/suspensions.rb @@ -33,6 +33,10 @@ def suspend!(date: Time.now.utc, origin: :local, block_email: true) update!(suspended_at: date, suspension_origin: origin) create_canonical_email_block! if block_email end + + # This terminates all connections for the given account with the streaming + # server: + redis.publish("timeline:system:#{id}", Oj.dump(event: :kill)) if local? end def unsuspend! diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index c5e3a230d8fb05..0b241fbf9a15ab 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -21,7 +21,6 @@ class Form::AdminSettings registrations_end_hour registrations_secondary_start_hour registrations_secondary_end_hour - timeline_preview bootstrap_timeline_accounts theme activity_api_enabled @@ -68,6 +67,10 @@ class Form::AdminSettings favicon min_age auto_accept_legacy_quotes + local_live_feed_access + remote_live_feed_access + local_topic_feed_access + remote_topic_feed_access ).freeze INTEGER_KEYS = %i( @@ -139,6 +142,7 @@ class Form::AdminSettings DESCRIPTION_LIMIT = 200 DOMAIN_BLOCK_AUDIENCES = %w(disabled users all).freeze REGISTRATION_MODES = %w(open approved none).freeze + FEED_ACCESS_MODES = %w(public authenticated).freeze attr_accessor(*KEYS) @@ -147,6 +151,10 @@ class Form::AdminSettings validates :bootstrap_timeline_accounts, existing_username: { multiple: true }, if: -> { defined?(@bootstrap_timeline_accounts) } validates :show_domain_blocks, inclusion: { in: DOMAIN_BLOCK_AUDIENCES }, if: -> { defined?(@show_domain_blocks) } validates :show_domain_blocks_rationale, inclusion: { in: DOMAIN_BLOCK_AUDIENCES }, if: -> { defined?(@show_domain_blocks_rationale) } + validates :local_live_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@local_live_feed_access) } + validates :remote_live_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@remote_live_feed_access) } + validates :local_topic_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@local_topic_feed_access) } + validates :remote_topic_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@remote_topic_feed_access) } validates :media_cache_retention_period, :content_cache_retention_period, :backups_retention_period, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@media_cache_retention_period) || defined?(@content_cache_retention_period) || defined?(@backups_retention_period) } validates :min_age, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@min_age) } validates :site_short_description, length: { maximum: DESCRIPTION_LIMIT }, if: -> { defined?(@site_short_description) } diff --git a/app/models/quote.rb b/app/models/quote.rb index dcfcd3b353cf6e..0d24cb239a8fd4 100644 --- a/app/models/quote.rb +++ b/app/models/quote.rb @@ -25,7 +25,7 @@ class Quote < ApplicationRecord REFRESH_DEADLINE = 6.hours enum :state, - { pending: 0, accepted: 1, rejected: 2, revoked: 3 }, + { pending: 0, accepted: 1, rejected: 2, revoked: 3, deleted: 4 }, validate: true belongs_to :status diff --git a/app/models/status_edit.rb b/app/models/status_edit.rb index 42c97a3099617e..8ce4a54279d131 100644 --- a/app/models/status_edit.rb +++ b/app/models/status_edit.rb @@ -53,6 +53,10 @@ def quote underlying_quote end + def with_preview_card? + false + end + def with_media? ordered_media_attachments.any? end diff --git a/app/models/user.rb b/app/models/user.rb index 6c14d9f854e2ad..3d21805a22efc0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -185,6 +185,10 @@ def valid_invitation? def disable! update!(disabled: true) + + # This terminates all connections for the given account with the streaming + # server: + redis.publish("timeline:system:#{account.id}", Oj.dump(event: :kill)) end def enable! @@ -378,17 +382,22 @@ def revoke_access! end def reset_password! + # First, change password to something random, this revokes sessions and on-going access: + change_password!(SecureRandom.hex) + + # Finally, send a reset password prompt to the user + send_reset_password_instructions + end + + def change_password!(new_password) # First, change password to something random and deactivate all sessions transaction do - update(password: SecureRandom.hex) + update(password: new_password) session_activations.destroy_all end # Then, remove all authorized applications and connected push subscriptions revoke_access! - - # Finally, send a reset password prompt to the user - send_reset_password_instructions end protected diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb index 3693c4c1bb0b1c..4fcc38bc7dd32d 100644 --- a/app/serializers/activitypub/note_serializer.rb +++ b/app/serializers/activitypub/note_serializer.rb @@ -34,8 +34,8 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer attribute :voters_count, if: :poll_and_voters_count? attribute :quote, if: :quote? - attribute :quote, key: :_misskey_quote, if: :quote? - attribute :quote, key: :quote_uri, if: :quote? + attribute :quote, key: :_misskey_quote, if: :serializable_quote? + attribute :quote, key: :quote_uri, if: :serializable_quote? attribute :quote_authorization, if: :quote_authorization? attribute :interaction_policy @@ -281,13 +281,17 @@ def quote? object.quote&.present? end + def serializable_quote? + object.quote&.quoted_status&.present? + end + def quote_authorization? object.quote.present? && ActivityPub::TagManager.instance.approval_uri_for(object.quote).present? end def quote # TODO: handle inlining self-quotes - ActivityPub::TagManager.instance.uri_for(object.quote.quoted_status) + object.quote.quoted_status.present? ? ActivityPub::TagManager.instance.uri_for(object.quote.quoted_status) : { type: 'Tombstone' } end def quote_authorization diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index b9e93a9ba97e27..a7ac7eb516c7fe 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -146,12 +146,13 @@ def default_meta_store sso_redirect: sso_redirect, status_page_url: Setting.status_page_url, streaming_api_base_url: Rails.configuration.x.streaming_api_base_url, - timeline_preview: Setting.timeline_preview, title: instance_presenter.title, trends_as_landing_page: Setting.trends_as_landing_page, trends_enabled: Setting.trends, version: instance_presenter.version, terms_of_service_enabled: TermsOfService.current.present?, + local_live_feed_access: Setting.local_live_feed_access, + remote_live_feed_access: Setting.remote_live_feed_access, } end diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index 8f09a12e7ae84c..26aa1782583936 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -128,6 +128,21 @@ def configuration enabled: Chewy.enabled?, }, + timelines_access: { + live_feeds: { + local: Setting.local_live_feed_access, + remote: Setting.remote_live_feed_access, + }, + hashtag_feeds: { + local: Setting.local_topic_feed_access, + remote: Setting.remote_topic_feed_access, + }, + trending_link_feeds: { + local: Setting.local_topic_feed_access, + remote: Setting.remote_topic_feed_access, + }, + }, + limited_federation: limited_federation?, } end diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index b0bb855e4d65e1..5d8bca0cb366bd 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -85,6 +85,8 @@ def handle_implicit_update! update_quote_approval! update_counts! end + + broadcast_updates! if @status.quote&.state_previously_changed? end def update_interaction_policies! @@ -396,7 +398,7 @@ def update_quote_approval! def update_quote! quote_uri = @status_parser.quote_uri - if quote_uri.present? + if @status_parser.quote? approval_uri = @status_parser.quote_approval_uri approval_uri = nil if unsupported_uri_scheme?(approval_uri) || TagManager.instance.local_url?(approval_uri) @@ -406,7 +408,7 @@ def update_quote! # Revoke the quote while we get a chance… maybe this should be a `before_destroy` hook? RevokeQuoteService.new.call(@status.quote) if @status.quote.quoted_account&.local? && @status.quote.accepted? @status.quote.destroy - quote = Quote.create(status: @status, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?) + quote = Quote.create(status: @status, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?, state: @status_parser.deleted_quote? ? :deleted : :pending) @quote_changed = true else quote = @status.quote diff --git a/app/views/admin/settings/discovery/show.html.haml b/app/views/admin/settings/discovery/show.html.haml index 878b519ec282bf..482fb913ab6494 100644 --- a/app/views/admin/settings/discovery/show.html.haml +++ b/app/views/admin/settings/discovery/show.html.haml @@ -30,10 +30,35 @@ %h4= t('admin.settings.discovery.public_timelines') - .fields-group - = f.input :timeline_preview, - as: :boolean, - wrapper: :with_label + .fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :local_live_feed_access, + collection: f.object.class::FEED_ACCESS_MODES, + include_blank: false, + label_method: ->(mode) { I18n.t("admin.settings.feed_access.modes.#{mode}") }, + wrapper: :with_label + + .fields-row__column.fields-row__column-6.fields-group + = f.input :remote_live_feed_access, + collection: f.object.class::FEED_ACCESS_MODES, + include_blank: false, + label_method: ->(mode) { I18n.t("admin.settings.feed_access.modes.#{mode}") }, + wrapper: :with_label + + .fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :local_topic_feed_access, + collection: f.object.class::FEED_ACCESS_MODES, + include_blank: false, + label_method: ->(mode) { I18n.t("admin.settings.feed_access.modes.#{mode}") }, + wrapper: :with_label + + .fields-row__column.fields-row__column-6.fields-group + = f.input :remote_topic_feed_access, + collection: f.object.class::FEED_ACCESS_MODES, + include_blank: false, + label_method: ->(mode) { I18n.t("admin.settings.feed_access.modes.#{mode}") }, + wrapper: :with_label %h4= t('admin.settings.discovery.privacy') diff --git a/app/views/admin/shared/_preview_card.html.haml b/app/views/admin/shared/_preview_card.html.haml new file mode 100644 index 00000000000000..c4796dc59cc384 --- /dev/null +++ b/app/views/admin/shared/_preview_card.html.haml @@ -0,0 +1,30 @@ +/# locals: (preview_card:) + +.preview-card + .status-card.expanded + .status-card__image{ class: preview_card_aspect_ratio_classname(preview_card) } + .spoiler-button + %button.hide-button{ type: 'button' }= t('link_preview.potentially_sensitive_content.hide_button') + %button.spoiler-button__overlay{ type: 'button' } + %span.spoiler-button__overlay__label + %span= t('link_preview.potentially_sensitive_content.label') + %span.spoiler-button__overlay__action + %span= t('link_preview.potentially_sensitive_content.action') + %canvas.status-card__image-preview{ 'data-blurhash': preview_card.blurhash, width: 32, height: 32 } + = image_tag preview_card.image.url, alt: '', class: 'status-card__image-image' + = link_to preview_card.url, target: '_blank', rel: 'noopener', data: { confirm: t('link_preview.potentially_sensitive_content.confirm_visit') } do + .status-card__content{ dir: 'auto' } + %span.status-card__host + %span{ lang: preview_card.language } + = preview_card.provider_name + - if preview_card.published_at + · + %time.relative-formatted{ datetime: preview_card.published_at.iso8601, title: l(preview_card.published_at) }= l(preview_card.published_at) + %strong.status-card__title{ title: preview_card.title, lang: preview_card.language } + = preview_card.title + - if preview_card.author_name.present? + %span.status-card__author + = t('link_preview.author_html', name: content_tag(:strong, preview_card.author_name)) + - else + %span.status-card__description{ lang: preview_card.language } + = preview_card.description diff --git a/app/views/admin/shared/_status_attachments.html.haml b/app/views/admin/shared/_status_attachments.html.haml index d34a4221db72aa..8fca4add52e4e9 100644 --- a/app/views/admin/shared/_status_attachments.html.haml +++ b/app/views/admin/shared/_status_attachments.html.haml @@ -13,6 +13,9 @@ %button.button.button-secondary{ disabled: true } = t('polls.vote') +- if status.with_preview_card? + = render partial: 'admin/shared/preview_card', locals: { preview_card: status.preview_card } + - if status.with_media? - if status.ordered_media_attachments.first.video? = render_video_component(status, visible: false) diff --git a/app/views/admin/shared/_status_content.html.haml b/app/views/admin/shared/_status_content.html.haml index aedd84bdd679ef..465696fe5e9547 100644 --- a/app/views/admin/shared/_status_content.html.haml +++ b/app/views/admin/shared/_status_content.html.haml @@ -1,8 +1,14 @@ .status__content>< - if status.spoiler_text.present? %details< - %summary>< - %strong> Content warning: #{prerender_custom_emojis(h(status.spoiler_text), status.emojis)} + %summary{ + data: { + show: t('statuses.content_warnings.show'), + hide: t('statuses.content_warnings.hide'), + } + }>< + %strong> + = prerender_custom_emojis(h(status.spoiler_text), status.emojis) = prerender_custom_emojis(status_content_format(status), status.emojis) = render partial: 'admin/shared/status_attachments', locals: { status: status.proper } - else diff --git a/app/views/notification_mailer/_nested_quote.html.haml b/app/views/notification_mailer/_nested_quote.html.haml new file mode 100644 index 00000000000000..e66736399f47a8 --- /dev/null +++ b/app/views/notification_mailer/_nested_quote.html.haml @@ -0,0 +1,17 @@ +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-quote-header-img + = image_tag full_asset_url(status.account.avatar.url), alt: '', width: 34, height: 34 + %td.email-quote-header-text + %h2.email-quote-header-name + = display_name(status.account) + %p.email-quote-header-handle + @#{status.account.pretty_acct} + +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-status-content + = render 'status_content', status: status + + %p.email-status-footer + = link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}") diff --git a/app/views/notification_mailer/_status.html.haml b/app/views/notification_mailer/_status.html.haml index bf38dc9aa26ca5..064709e7dac75e 100644 --- a/app/views/notification_mailer/_status.html.haml +++ b/app/views/notification_mailer/_status.html.haml @@ -11,21 +11,12 @@ %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-status-content - .auto-dir - - if status.spoiler_text? - %p.email-status-spoiler - = status.spoiler_text - - .email-status-prose - = status_content_format(status) - - - if status.ordered_media_attachments.size.positive? - %p.email-status-media - - status.ordered_media_attachments.each do |a| - - if status.local? - = link_to full_asset_url(a.file.url(:original)), full_asset_url(a.file.url(:original)) - - else - = link_to a.remote_url, a.remote_url + = render 'status_content', status: status + - if status.local? && status.quote + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-nested-card-td + = render 'nested_quote', status: status.quote.quoted_status, time_zone: time_zone %p.email-status-footer = link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}") diff --git a/app/views/notification_mailer/_status.text.erb b/app/views/notification_mailer/_status.text.erb index e03e8346c16a25..13711ee74d9c70 100644 --- a/app/views/notification_mailer/_status.text.erb +++ b/app/views/notification_mailer/_status.text.erb @@ -4,5 +4,9 @@ > <% end %> > <%= raw word_wrap(extract_status_plain_text(status), break_sequence: "\n> ") %> +<% if status.local? && status.quote %> +> +>> <%= raw word_wrap(extract_status_plain_text(status.quote.quoted_status), break_sequence: "\n>> ") %> +<% end %> <%= raw t('application_mailer.view')%> <%= web_url("@#{status.account.pretty_acct}/#{status.id}") %> diff --git a/app/views/notification_mailer/_status_content.html.haml b/app/views/notification_mailer/_status_content.html.haml new file mode 100644 index 00000000000000..f95ba8ccba856a --- /dev/null +++ b/app/views/notification_mailer/_status_content.html.haml @@ -0,0 +1,15 @@ +.auto-dir + - if status.spoiler_text? + %p.email-status-spoiler + = status.spoiler_text + + .email-status-prose + = status_content_format(status) + + - if status.ordered_media_attachments.size.positive? + %p.email-status-media + - status.ordered_media_attachments.each do |a| + - if status.local? + = link_to full_asset_url(a.file.url(:original)), full_asset_url(a.file.url(:original)) + - else + = link_to a.remote_url, a.remote_url diff --git a/app/workers/activitypub/refetch_and_verify_quote_worker.rb b/app/workers/activitypub/refetch_and_verify_quote_worker.rb index 0c7ecd9b2ac021..e2df0231030767 100644 --- a/app/workers/activitypub/refetch_and_verify_quote_worker.rb +++ b/app/workers/activitypub/refetch_and_verify_quote_worker.rb @@ -10,6 +10,7 @@ class ActivityPub::RefetchAndVerifyQuoteWorker def perform(quote_id, quoted_uri, options = {}) quote = Quote.find(quote_id) ActivityPub::VerifyQuoteService.new.call(quote, fetchable_quoted_uri: quoted_uri, request_id: options[:request_id]) + ::DistributionWorker.perform_async(quote.status_id, { 'update' => true }) if quote.state_previously_changed? rescue ActiveRecord::RecordNotFound # Do nothing true diff --git a/config/locales/activerecord.sk.yml b/config/locales/activerecord.sk.yml index 68a9e447b9099c..1513142bd2f995 100644 --- a/config/locales/activerecord.sk.yml +++ b/config/locales/activerecord.sk.yml @@ -4,7 +4,7 @@ sk: attributes: poll: expires_at: Trvá do - options: Voľby + options: Možnosti user: agreement: Dohoda o poskytovaní služieb email: E-mailová adresa diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 81806695b5e445..e2bca6e8cb8196 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -326,6 +326,9 @@ ast: all: A tol mundu disabled: A naide users: A los perfiles llocales + feed_access: + modes: + public: Tol mundu registrations: preamble: Controla quién pue crear una cuenta nel sirvidor. title: Rexistros diff --git a/config/locales/be.yml b/config/locales/be.yml index cd7bf94e1a2338..ebbfb8bf6d70f5 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -707,7 +707,7 @@ be: created_at: Створана delete_and_resolve: Выдаліць допісы forwarded: Пераслана - forwarded_replies_explanation: Гэтае паведамленне паступіла ад выдаленага карыстальніка і дакранаецца выдаленага змесціва. Яно было накіраванае вам, бо змесціва паведамлення з'яўляецца адказам аднаму з вашых карыстальнікаў. + forwarded_replies_explanation: Гэтае паведамленне паступіла ад карыстальніка з іншага сервера і дакранаецца змесціва адтуль. Яно было накіраванае вам, бо змесціва паведамлення з'яўляецца адказам аднаму з вашых карыстальнікаў. forwarded_to: Пераслана на %{domain} mark_as_resolved: Пазначыць як вырашаную mark_as_sensitive: Пазначыць як далікатны @@ -876,6 +876,10 @@ be: all: Для ўсіх disabled: Нікому users: Лакальным карыстальнікам, якія ўвайшлі + feed_access: + modes: + authenticated: Толькі аўтэнтыфікаваныя карыстальнікі + public: Усе registrations: moderation_recommandation: Пераканайцеся, што ў вас ёсць адэкватная і аператыўная каманда мадэратараў, перш чым адчыняць рэгістрацыю для ўсіх жадаючых! preamble: Кантралюйце, хто можа ствараць уліковы запіс на вашым серверы. @@ -1665,6 +1669,13 @@ be: expires_at: Дзее да uses: Выкарыстанні title: Запрасіць людзей + link_preview: + author_html: Ад %{name} + potentially_sensitive_content: + action: Націсніце, каб паказаць + confirm_visit: Вы ўпэўненыя, што хочаце адкрыць гэту спасылку? + hide_button: Схаваць + label: Патэнцыйна далікатны кантэнт lists: errors: limit: Вы дасягнулі макс. колькасці спісаў @@ -1981,6 +1992,9 @@ be: other: "%{count} відэафайла" boosted_from_html: Пашырыў уліковы запіс %{acct_link} content_warning: 'Папярэджанне аб змесціве: %{warning}' + content_warnings: + hide: Схаваць допіс + show: Паказаць усё роўна default_language: Такая, што і мова інтэрфэйсу disallowed_hashtags: few: 'змяшчае недазволеныя хэштэгі: %{tags}' diff --git a/config/locales/br.yml b/config/locales/br.yml index c6cb9152522623..30f4a50fbcedf6 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -145,6 +145,7 @@ br: destroy_custom_emoji_html: Dilamet eo bet ar fromlun %{target} gant %{name} destroy_email_domain_block_html: Distanket eo bet an domani postel %{target} gant %{name} destroy_status_html: Dilamet eo bet toud %{target} gant %{name} + destroy_user_role_html: Dilamet eo bet ar perzh %{target} gant %{name} disable_custom_emoji_html: Diweredekaet eo bet ar fromlun %{target} gant %{name} enable_custom_emoji_html: Gweredekaet eo bet ar fromlun %{target} gant %{name} resend_user_html: Adkaset eo bet ar postel kadarnaat evit %{target} gant %{name} @@ -372,6 +373,7 @@ br: manage_rules: Merañ reolennoù ar servijer title: Diwar-benn appearance: + preamble: Personelaat etrefas web Mastodon. title: Neuz content_retention: danger_zone: Takad dañjer @@ -776,12 +778,13 @@ br: account: Kont account_settings: Arventennoù ar gont aliases: Aliasoù ar gont + appearance: Neuz back: Distreiñ da vMastodon delete: Dilemel ar gont development: Diorren edit_profile: Kemmañ ar profil export: Ezporzhiañ - featured_tags: Gerioù-klik en a-raok + featured_tags: Penngerioù-klik import: Enporzhiañ import_and_export: Enporzhiañ hag ezporzhiañ notifications: Kemennoù dre bostel diff --git a/config/locales/cs.yml b/config/locales/cs.yml index fd3b579781703e..8b21cfb2ebeb49 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -876,6 +876,10 @@ cs: all: Všem disabled: Nikomu users: Přihlášeným místním uživatelům + feed_access: + modes: + authenticated: Pouze autentifikovaní uživatelé + public: Všichni registrations: moderation_recommandation: Před otevřením registrací všem se ujistěte, že máte vhodný a reaktivní moderační tým! preamble: Mějte pod kontrolou, kdo může vytvořit účet na vašem serveru. diff --git a/config/locales/da.yml b/config/locales/da.yml index 8ad3ccb1389bac..0f8bb88cd3fc7d 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -848,6 +848,10 @@ da: all: Til alle disabled: Til ingen users: Til indloggede lokale brugere + feed_access: + modes: + authenticated: Kun godkendte brugere + public: Alle registrations: moderation_recommandation: Sørg for, at der er et tilstrækkeligt og reaktivt moderationsteam, før registrering åbnes for alle! preamble: Styr, hvem der kan oprette en konto på serveren. @@ -1281,7 +1285,7 @@ da: account_status: Kontostatus confirming: Afventer færdiggørelse af e-mailbekræftelse. functional: Din konto er fuldt funktionel. - pending: Ansøgningen afventer gennemgang af vores personale. Dette kan tage noget tid. Man bør modtage en e-mail, såfremt ansøgningen godkendes. + pending: Ansøgningen afventer gennemgang af vores personale. Dette kan tage noget tid. Du modtager en e-mail, hvis din ansøgning bliver godkendt. redirecting_to: Din konto er inaktiv, da den pt. er omdirigerer til %{acct}. self_destruct: Da %{domain} er under nedlukning, vil kontoadgangen være begrænset. view_strikes: Se tidligere anmeldelser af din konto @@ -1587,6 +1591,13 @@ da: expires_at: Udløber uses: Benyttelser title: Invitér personer + link_preview: + author_html: Af %{name} + potentially_sensitive_content: + action: Klik for at vise + confirm_visit: Er du sikker på, at du vil åbne dette link? + hide_button: Skjul + label: Potentielt følsomt indhold lists: errors: limit: Maks. listeantal nået @@ -1897,6 +1908,9 @@ da: other: "%{count} videoer" boosted_from_html: Fremhævet fra %{acct_link} content_warning: 'Indholdsadvarsel: %{warning}' + content_warnings: + hide: Skjul indlæg + show: Vis mere default_language: Samme som UI-sproget disallowed_hashtags: one: 'indeholdte et ikke tilladt hashtag: %{tags}' diff --git a/config/locales/de.yml b/config/locales/de.yml index 0f694493fac7ce..3f16ac94d9bc11 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -848,6 +848,10 @@ de: all: Allen disabled: Niemandem users: Für angemeldete lokale Benutzer*innen + feed_access: + modes: + authenticated: Nur authentifizierte Nutzer*innen + public: Alle registrations: moderation_recommandation: Bitte vergewissere dich, dass du ein geeignetes und reaktionsschnelles Moderationsteam hast, bevor du die Registrierungen uneingeschränkt zulässt! preamble: Lege fest, wer auf deinem Server ein Konto erstellen darf. @@ -1587,6 +1591,13 @@ de: expires_at: Läuft ab uses: Verwendungen title: Einladungen + link_preview: + author_html: Von %{name} + potentially_sensitive_content: + action: Zum Anzeigen anklicken + confirm_visit: Möchtest du diesen Link wirklich öffnen? + hide_button: Ausblenden + label: Inhaltswarnung lists: errors: limit: Du hast die maximale Anzahl an Listen erreicht @@ -1897,6 +1908,9 @@ de: other: "%{count} Videos" boosted_from_html: Geteilt von %{acct_link} content_warning: 'Inhaltswarnung: %{warning}' + content_warnings: + hide: Beitrag ausblenden + show: Beitrag anzeigen default_language: Wie die Sprache des Webinterface disallowed_hashtags: one: 'enthält einen nicht-erlaubten Hashtag: %{tags}' diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index 08e93456b03738..9d852913d2db61 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -4,7 +4,7 @@ sk: confirmations: confirmed: Vaša e-mailová adresa bola úspešne potvrdená. send_instructions: O niekoľko minút obdržíte e-mail s pokynmi na potvrdenie svojho účtu. Prosíme, skontrolujte si aj zložku spam, ak ste tento e-mail nedostali. - send_paranoid_instructions: Ak sa vaša e-mailová adresa nachádza v našej databáze, o niekoľko minút obdržíte e-mail s pokynmi na potvrdenie svojho účtu. Prosíme, skontrolujte aj zložku spam, ste tento e-mail nedostali. + send_paranoid_instructions: Ak sa vaša e-mailová adresa nachádza v našej databáze, o niekoľko minút obdržíte e-mail s pokynmi na potvrdenie svojho účtu. Prosíme, skontrolujte aj zložku spam, ak ste tento e-mail nedostali. failure: already_authenticated: Už ste sa prihlásili. inactive: Váš účet ešte nie je aktivovaný. @@ -88,8 +88,8 @@ sk: success: Úspešné overenie z účtu %{kind}. passwords: no_token: Túto stránku nemôžete navštíviť, ak vás sem nepresmeroval e-mail s pokynmi na obnovu hesla. Pokiaľ prichádzate z tohto e-mailu, uistite sa, že ste použili celú adresu URL z e-mailu. - send_instructions: Ak sa vaša emailová adresa nachádza v databáze, o niekoľko minút dostanete e-mail s pokynmi na nastavenie nového hesla. Ak ste ho nedostali, skontrolujte aj priečinok pre spam. - send_paranoid_instructions: Ak sa vaša emailová adresa nachádza v databáze, o niekoľko minút dostanete e-mail s pokynmi na nastavenie nového hesla. Ak ste ho nedostali, skontrolujte aj priečinok pre spam. + send_instructions: Ak sa vaša e-mailová adresa nachádza v databáze, o niekoľko minút dostanete e-mail s pokynmi na nastavenie nového hesla. Ak ste ho nedostali, skontrolujte aj priečinok pre spam. + send_paranoid_instructions: Ak sa vaša e-mailová adresa nachádza v databáze, o niekoľko minút dostanete e-mail s pokynmi na nastavenie nového hesla. Ak ste ho nedostali, skontrolujte aj priečinok pre spam. updated: Vaše heslo bolo úspešne zmenené. Teraz ste sa prihlásili. updated_not_active: Vaše heslo bolo úspešne zmenené. registrations: @@ -97,9 +97,9 @@ sk: update_needs_confirmation: Váš účet bol úspešne zmenený, ale ešte potrebujeme overiť vašu novú e-mailovú adresu. Overíte ju kliknutím na potvrdzovací odkaz zaslaný na váš e-mail. Ak ste e-mail nedostali, skontrolujte svoj priečinok pre spam. updated: Váš účet bol úspešne aktualizovaný. sessions: - already_signed_out: Úspešne ste sa odhlásili. + already_signed_out: Odhlásenie prebehlo úspešne. signed_in: Úspešne ste sa prihlásili. - signed_out: Úspešne ste sa odhlásili. + signed_out: Odhlásenie prebehlo úspešne. unlocks: send_instructions: O niekoľko minút obdržíte e-mail s pokynmi na odomknutie svojho účtu. Prosíme, skontrolujte si aj zložku spam, ak ste tento e-mail nedostali. send_paranoid_instructions: Ak váš účet existuje, o niekoľko minút obdržíte e-mail s pokynmi na jeho odomknutie. Prosíme, skontrolujte si aj zložku spam, ak ste tento e-mail nedostali. diff --git a/config/locales/el.yml b/config/locales/el.yml index a17e8700757c6d..f5a72625f72404 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -848,6 +848,10 @@ el: all: Για όλους disabled: Για κανέναν users: Προς συνδεδεμένους τοπικούς χρήστες + feed_access: + modes: + authenticated: Πιστοποιημένοι χρήστες μόνο + public: Όλοι registrations: moderation_recommandation: Παρακαλώ βεβαιώσου ότι έχεις μια επαρκής και ενεργή ομάδα συντονισμού πριν ανοίξεις τις εγγραφές για όλους! preamble: Έλεγξε ποιος μπορεί να δημιουργήσει ένα λογαριασμό στον διακομιστή σας. @@ -1587,6 +1591,13 @@ el: expires_at: Λήγει uses: Χρήσεις title: Προσκάλεσε κόσμο + link_preview: + author_html: Από %{name} + potentially_sensitive_content: + action: Κάνε κλικ για εμφάνιση + confirm_visit: Σίγουρα θες να ανοίξεις αυτόν τον σύνδεσμο; + hide_button: Απόκρυψη + label: Δυνητικά ευαίσθητο περιεχόμενο lists: errors: limit: Έχεις φτάσει το μέγιστο αριθμό λιστών @@ -1897,6 +1908,9 @@ el: other: "%{count} βίντεο" boosted_from_html: Ενισχύθηκε από %{acct_link} content_warning: 'Προειδοποίηση περιεχομένου: %{warning}' + content_warnings: + hide: Απόκρυψη ανάρτησης + show: Εμφάνιση περισσότερων default_language: Ίδια με γλώσσα διεπαφής disallowed_hashtags: one: 'περιέχει μη επιτρεπτή ετικέτα: %{tags}' diff --git a/config/locales/en.yml b/config/locales/en.yml index 0d1c618c1ff197..63682982ac89e8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1097,6 +1097,10 @@ en: all: To everyone disabled: To no one users: To logged-in local users + feed_access: + modes: + authenticated: Authenticated users only + public: Everyone registrations: moderation_recommandation: Please make sure you have an adequate and reactive moderation team before you open registrations to everyone! preamble: Control who can create an account on your server. @@ -1895,6 +1899,13 @@ en: expires_at: Expires uses: Uses title: Invite people + link_preview: + author_html: By %{name} + potentially_sensitive_content: + action: Click to show + confirm_visit: Are you sure you wish to open this link? + hide_button: Hide + label: Potentially sensitive content lists: errors: limit: You have reached the maximum number of lists @@ -2234,6 +2245,9 @@ en: boosted_from_html: Boosted from %{acct_link} contains_ng_words: The post contains NG words content_warning: 'Content warning: %{warning}' + content_warnings: + hide: Hide post + show: Show more default_language: Same as interface language disallowed_hashtags: one: 'contained a disallowed hashtag: %{tags}' diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 7e019daf4643cb..feded782ba2cc3 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -848,6 +848,10 @@ es-AR: all: A todos disabled: A nadie users: A usuarios locales con sesiones abiertas + feed_access: + modes: + authenticated: Solo usuarios autenticados + public: Todos registrations: moderation_recommandation: Por favor, ¡asegurate de tener un equipo de moderación adecuado y reactivo antes de abrir los registros a todos! preamble: Controlá quién puede crear una cuenta en tu servidor. @@ -1587,6 +1591,13 @@ es-AR: expires_at: Vence uses: Usos title: Invitar a gente + link_preview: + author_html: Por %{name} + potentially_sensitive_content: + action: Clic para mostrar + confirm_visit: "¿Está seguro de que querés abrir este enlace?" + hide_button: Ocultar + label: Contenido potencialmente sensible lists: errors: limit: Alcanzaste el número máximo de listas @@ -1897,6 +1908,9 @@ es-AR: other: "%{count} videos" boosted_from_html: Adherido desde %{acct_link} content_warning: 'Advertencia de contenido: %{warning}' + content_warnings: + hide: Ocultar mensaje + show: Mostrar más default_language: Igual que el idioma de la interface disallowed_hashtags: one: 'contenía una etiqueta no permitida: %{tags}' diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 2f0a69891f1712..0672b21bc476a5 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -848,6 +848,10 @@ es-MX: all: A todos disabled: A nadie users: Para los usuarios locales que han iniciado sesión + feed_access: + modes: + authenticated: Solo usuarios autenticados + public: Todos registrations: moderation_recommandation: "¡Por favor, asegúrate de contar con un equipo de moderación adecuado y activo antes de abrir el registro al público!" preamble: Controla quién puede crear una cuenta en tu servidor. @@ -1587,6 +1591,13 @@ es-MX: expires_at: Expira uses: Usos title: Invitar a gente + link_preview: + author_html: Por %{name} + potentially_sensitive_content: + action: Pulsa para mostrar + confirm_visit: "¿Seguro que quieres abrir este enlace?" + hide_button: Ocultar + label: Contenido potencialmente sensible lists: errors: limit: Has alcanzado la cantidad máxima de listas @@ -1897,6 +1908,9 @@ es-MX: other: "%{count} vídeos" boosted_from_html: Impulsado desde %{acct_link} content_warning: 'Alerta de contenido: %{warning}' + content_warnings: + hide: Ocultar publicación + show: Mostrar más default_language: Igual que el idioma de la interfaz disallowed_hashtags: one: 'contenía una etiqueta no permitida: %{tags}' diff --git a/config/locales/es.yml b/config/locales/es.yml index a14c924bd00b02..15fd191ea41fef 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -848,6 +848,10 @@ es: all: A todos disabled: A nadie users: Para los usuarios locales que han iniciado sesión + feed_access: + modes: + authenticated: Solo usuarios autenticados + public: Todos registrations: moderation_recommandation: Por favor, ¡asegúrate de tener un equipo de moderación adecuado y reactivo antes de abrir los registros a todo el mundo! preamble: Controla quién puede crear una cuenta en tu servidor. @@ -1587,6 +1591,13 @@ es: expires_at: Expira uses: Usos title: Invitar a gente + link_preview: + author_html: Por %{name} + potentially_sensitive_content: + action: Pulsa para mostrar + confirm_visit: "¿Seguro que quieres abrir este enlace?" + hide_button: Ocultar + label: Contenido potencialmente sensible lists: errors: limit: Has alcanzado la cantidad máxima de listas @@ -1897,6 +1908,9 @@ es: other: "%{count} vídeos" boosted_from_html: Impulsado desde %{acct_link} content_warning: 'Alerta de contenido: %{warning}' + content_warnings: + hide: Ocultar publicación + show: Mostrar más default_language: Igual que el idioma de la interfaz disallowed_hashtags: one: 'contenía una etiqueta no permitida: %{tags}' diff --git a/config/locales/fi.yml b/config/locales/fi.yml index ec474090a62f0f..7b19a0d820db6c 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -848,6 +848,10 @@ fi: all: Kaikille disabled: Ei kenellekään users: Kirjautuneille paikallisille käyttäjille + feed_access: + modes: + authenticated: Vain todennetut käyttäjät + public: Kaikki registrations: moderation_recommandation: Varmista, että sinulla on riittävä ja toimintavalmis joukko moderaattoreita, ennen kuin avaat rekisteröitymisen kaikille! preamble: Määritä, kuka voi luoda tilin palvelimellesi. @@ -1587,6 +1591,13 @@ fi: expires_at: Vanhenee uses: Käyttökertoja title: Kutsu käyttäjiä + link_preview: + author_html: Tehnyt %{name} + potentially_sensitive_content: + action: Näytä napsauttamalla + confirm_visit: Haluatko varmasti avata tämän linkin? + hide_button: Piilota + label: Mahdollisesti arkaluonteista sisältöä lists: errors: limit: Sinulla on enimmäismäärä listoja @@ -1897,6 +1908,9 @@ fi: other: "%{count} videota" boosted_from_html: Tehosti lähteestä %{acct_link} content_warning: 'Sisältövaroitus: %{warning}' + content_warnings: + hide: Piilota julkaisu + show: Näytä lisää default_language: Sama kuin käyttöliittymän kieli disallowed_hashtags: one: 'sisälsi kielletyn aihetunnisteen: %{tags}' diff --git a/config/locales/fo.yml b/config/locales/fo.yml index f6ba039efc7777..22ec7bbf25dd65 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -848,6 +848,10 @@ fo: all: Til øll disabled: Til ongan users: Fyri lokalum brúkarum, sum eru ritaðir inn + feed_access: + modes: + authenticated: Einans váttaðir brúkarar + public: Øll registrations: moderation_recommandation: Vinarliga tryggja tær, at tú hevur eitt nøktandi og klárt umsjónartoymi, áðreen tú letur upp fyri skrásetingum frá øllum! preamble: Stýr, hvør kann stovna eina kontu á tínum ambætara. @@ -1587,6 +1591,13 @@ fo: expires_at: Rennir út uses: Brúk title: Bjóða fólki + link_preview: + author_html: Av %{name} + potentially_sensitive_content: + action: Klikka fyri at vísa + confirm_visit: Er tú vís/ur í, at tú vil lata hetta leinkið upp? + hide_button: Fjal + label: Tilfar, sum møguliga er viðkvæmt lists: errors: limit: Tú hevur rokkið mesta talið av listum diff --git a/config/locales/ga.yml b/config/locales/ga.yml index adfdacb034be5e..901a3a3940a675 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -890,6 +890,10 @@ ga: all: Do chách disabled: Do dhuine ar bith users: Chun úsáideoirí áitiúla logáilte isteach + feed_access: + modes: + authenticated: Úsáideoirí fíordheimhnithe amháin + public: Gach duine registrations: moderation_recommandation: Cinntigh le do thoil go bhfuil foireann mhodhnóireachta imoibríoch leordhóthanach agat sula n-osclaíonn tú clárúcháin do gach duine! preamble: Rialú cé atá in ann cuntas a chruthú ar do fhreastalaí. @@ -1704,6 +1708,13 @@ ga: expires_at: In éag uses: Úsáidí title: Tabhair cuireadh do dhaoine + link_preview: + author_html: Le %{name} + potentially_sensitive_content: + action: Cliceáil chun a thaispeáint + confirm_visit: An bhfuil tú cinnte gur mian leat an nasc seo a oscailt? + hide_button: Folaigh + label: Ábhar a d'fhéadfadh a bheith íogair lists: errors: limit: Tá uaslíon na liostaí sroichte agat @@ -2023,6 +2034,9 @@ ga: two: "%{count} físeáin" boosted_from_html: Molta ó %{acct_link} content_warning: 'Rabhadh ábhair: %{warning}' + content_warnings: + hide: Folaigh an post + show: Taispeáin níos mó default_language: Mar an gcéanna le teanga an chomhéadain disallowed_hashtags: few: 'bhí na Haischlib dícheadaithe: %{tags}' diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 4eee0fe0f981cb..c6a852fd8eaac6 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -848,6 +848,10 @@ gl: all: Para todos disabled: Para ninguén users: Para usuarias locais conectadas + feed_access: + modes: + authenticated: Só para usuarias con sesión iniciada + public: Para calquera registrations: moderation_recommandation: Por favor, pon interese en crear un equipo de moderación competente e reactivo antes de permitir que calquera poida crear unha conta! preamble: Xestiona quen pode crear unha conta no teu servidor. diff --git a/config/locales/he.yml b/config/locales/he.yml index 9c8d91722ab71e..3ea929f76c930d 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -876,6 +876,10 @@ he: all: לכולם disabled: לאף אחד users: למשתמשים מקומיים מחוברים + feed_access: + modes: + authenticated: משתמשים מאומתים בלבד + public: כולם registrations: moderation_recommandation: יש לוודא שלאתר יש צוות מנחות ומנחי שיחה מספק ושירותי בטרם תבחרו לפתוח הרשמה לכולם! preamble: שליטה בהרשאות יצירת חשבון בשרת שלך. @@ -1665,6 +1669,13 @@ he: expires_at: פג תוקף ב- uses: שימושים title: הזמנת אנשים + link_preview: + author_html: מאת %{name} + potentially_sensitive_content: + action: לחץ להצגה + confirm_visit: האם להמשיך ליעד הקישור? + hide_button: להסתיר + label: תוכן שעלול להיות רגיש lists: errors: limit: הגעת למספר הרשימות המירבי @@ -1981,6 +1992,9 @@ he: two: "%{count} סרטונים" boosted_from_html: הודהד מ-%{acct_link} content_warning: 'אזהרת תוכן: %{warning}' + content_warnings: + hide: להסתיר הודעה + show: הצג עוד default_language: זהה לשפת ממשק disallowed_hashtags: many: 'מכיל את התגיות האסורות: %{tags}' diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 123e8a97c9feae..2b57ef5516132b 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -848,6 +848,10 @@ hu: all: Mindenkinek disabled: Senkinek users: Bejelentkezett helyi felhasználóknak + feed_access: + modes: + authenticated: Csak hitelesített felhasználók + public: Mindenki registrations: moderation_recommandation: Győződj meg arról, hogy megfelelő és gyors reagálású moderátor csapatod van, mielőtt mindenki számára megnyitod a regisztrációt! preamble: Szabályozd, hogy ki hozhat létre fiókot a kiszolgálón. diff --git a/config/locales/is.yml b/config/locales/is.yml index 5f783331c067bf..39a2150fb5aaf3 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -850,6 +850,10 @@ is: all: Til allra disabled: Til engra users: Til innskráðra staðværra notenda + feed_access: + modes: + authenticated: Einungis auðkenndir notendur + public: Allir registrations: moderation_recommandation: Tryggðu að þú hafir hæft og aðgengilegt umsjónarteymi til taks áður en þú opnar á skráningar fyrir alla! preamble: Stýrðu því hverjir geta útbúið notandaaðgang á netþjóninum þínum. @@ -1591,6 +1595,13 @@ is: expires_at: Rennur út uses: Afnot title: Bjóða fólki + link_preview: + author_html: Frá %{name} + potentially_sensitive_content: + action: Smelltu til að birta + confirm_visit: Ertu viss um að þú viljir opna þennan tengil? + hide_button: Fela + label: Mögulega viðkvæmt efni lists: errors: limit: Þú hefur náð hámarksfjölda lista @@ -1901,6 +1912,9 @@ is: other: "%{count} myndskeið" boosted_from_html: Endurbirt frá %{acct_link} content_warning: 'Aðvörun vegna efnis (CW): %{warning}' + content_warnings: + hide: Fela færslu + show: Sýna meira default_language: Sama og tungumál viðmóts disallowed_hashtags: one: 'innihélt óleyfilegt myllumerki: %{tags}' diff --git a/config/locales/lv.yml b/config/locales/lv.yml index b57d2b3ef02c99..979933b196bb63 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -365,7 +365,7 @@ lv: dashboard: active_users: aktīvie lietotāji interactions: mijiedarbības - media_storage: Multividesu krātuve + media_storage: Multivides uzglabāšana new_users: jauni lietotāji opened_reports: atvērtie ziņojumi pending_appeals_html: @@ -1164,7 +1164,7 @@ lv: remove: Atsaistīt aizstājvārdu appearance: advanced_web_interface: Paplašinātā tīmekļa saskarne - advanced_web_interface_hint: 'Ja vēlies izmantot visu ekrāna platumu, uzlabotā tīmekļa saskarne ļauj konfigurēt daudzas dažādas kolonnas, lai vienlaikus redzētu tik daudz informācijas, cik vēlies: Sākums, paziņojumi, apvienotā ziņu lenta, neierobežots skaits sarakstu un tēmturu.' + advanced_web_interface_hint: 'Ja vēlies izmantot visu ekrāna platumu, paplašinātā tīmekļa saskarne ļauj konfigurēt daudzas dažādas kolonnas, lai vienlaikus redzētu tik daudz informācijas, cik vēlies: Sākums, paziņojumi, apvienotā ziņu lenta, neierobežots skaits sarakstu un tēmturu.' animations_and_accessibility: Animācijas un pieejamība confirmation_dialogs: Apstiprināšanas dialogi discovery: Atklāšana @@ -1728,7 +1728,7 @@ lv: duration_too_short: ir par agru expired: Aptauja jau ir beigusies invalid_choice: Izvēlētā balsošanas iespēja nepastāv - over_character_limit: katrs nedrīkst būt garāks par %{max} rakstzīmēm + over_character_limit: nedrīkst būt garākas par %{max} rakstzīmēm self_vote: Tu nevari balsot pats savā aptaujā too_few_options: jābūt vairāk nekā vienam vienumam too_many_options: nevar saturēt vairāk par %{max} vienumiem @@ -1904,6 +1904,10 @@ lv: limit: Jau ir piesprausts lielākais iespējamais ierakstu skaits ownership: Kāda cita ierakstu nevar piespraust reblog: Pastiprinātu ierakstu nevar piespraust + quote_policies: + followers: Tikai sekotāji + nobody: Tikai es + public: Jebkurš title: "%{name}: “%{quote}”" visibilities: public: Publisks diff --git a/config/locales/nan.yml b/config/locales/nan.yml index 20e53b4a865b8b..74d4fd813feb76 100644 --- a/config/locales/nan.yml +++ b/config/locales/nan.yml @@ -834,6 +834,10 @@ nan: all: Kàu ta̍k ê lâng disabled: 無kàu tó tsi̍t ê users: Kàu ta̍k位登入ê用者 + feed_access: + modes: + authenticated: Kan-ta hōo登入ê用者 + public: Ta̍k lâng registrations: moderation_recommandation: 佇開放hōo ta̍k ê lâng註冊進前,請確認lí有夠額koh主動反應ê管理團隊! preamble: 控制ē當佇lí ê服侍器註冊ê人。 @@ -991,8 +995,47 @@ nan: no_terms_of_service_html: Lí目前iáu無設定任何服務規定。服務規定是beh提供明確性,兼保護lí佇kap用者ê爭議中毋免承受可能ê責任。 notified_on_html: 佇 %{date} 通知ê用者 notify_users: 通知用者 + preview: + explanation_html: Tsit封email ē送hōo tī %{date} 進前註冊 ê %{display_count} ê用者。Email ē包括下跤ê文字: + send_preview: Kā tāi先看ê內容寄kàu %{email} + send_to_all: + other: 寄出 %{display_count} 張電子phue + title: 先kā服務規定ê通知看māi + publish: 公開 + published_on_html: 公開tī %{date} + save_draft: 儲存草稿 + title: 服務規定 + title: 管理 trends: + allow: 允准 + approved: 允准ah + confirm_allow: Lí kám確定beh允准所揀ê標簽? + confirm_disallow: Lí kám確定無愛允准所揀ê標簽? + disallow: 無愛允准 + links: + allow: 允准連結 + allow_provider: 允准提供者 + confirm_allow: Lí kám確定beh允准所揀ê連結? + confirm_allow_provider: Lí kám確定beh允准所揀ê提供者? + confirm_disallow: Lí kám確定無愛允准所揀ê連結? + confirm_disallow_provider: Lí kám確定無愛允准所揀ê提供者? + description_html: Tsia是連結,現tsú時lí ê服侍器hōo通見ê用者大量分享ê。tse通幫tsān lí ê用者tshuē著tsit-má世間有siánn tāi誌。直kàu lí允准公開者,連結bē公開展示。lí通允准á是拒絕單ê連結。 + disallow: 無愛允准連結 + disallow_provider: 無愛允准提供者 + no_link_selected: 因為無揀任何連結,所以lóng無改變 + publishers: + no_publisher_selected: 因為無揀任何提供者,所以lóng無改變 + shared_by_over_week: + other: 頂禮拜hōo %{count} 位用者分享 + title: 趨勢ê連結 + usage_comparison: Tī kin-á日hōo %{today} ê lâng分享,比較tsa-hng有 %{yesterday} ê + not_allowed_to_trend: 無允准刊tī趨勢 + only_allowed: Kan-ta允准 + pending_review: Teh等審核 preview_card_providers: + allowed: Tsit ê提供者ê連結通刊tī趨勢 + description_html: Tsiah ê域名來自定定受lí ê服侍器分享ê連結。連結bē變做公開趨勢,除非連結ê域名受允准。Lí ê允准(á是拒絕)擴展kàu kiánn域名。 + rejected: Tsit ê提供者ê連結bē刊tī趨勢 title: 發布者 rejected: 拒絕ê statuses: @@ -1002,9 +1045,55 @@ nan: confirm_allow_account: Lí kám確定beh允准所揀ê口座? confirm_disallow: Lí kám確定無愛允准所揀ê狀態? confirm_disallow_account: Lí kám確定無愛允准所揀ê口座? + description_html: Tsiah ê是lí ê服侍器所知ê,tsit-má teh受tsē-tsē分享kap收藏ê PO文。PO文bē公開顯示,除非lí允准作者,而且作者允准in ê口座hőng推薦hōo別lâng。Lí通允准á是拒絕個別PO文。 + disallow: 無允准PO文 + disallow_account: 無允准作者 + no_status_selected: 因為無揀任何趨勢PO文,所以lóng無改變 + not_discoverable: 作者iáu bē揀通hōo lâng發現 + shared_by: + other: Hōo lâng分享á是收藏 %{friendly_count} kái + title: 趨勢ê PO文 tags: + current_score: 目前ê分數:%{score} dashboard: + tag_accounts_measure: 無重複用 tag_languages_dimension: Tsia̍p用ê語言 + tag_servers_dimension: 人氣服侍器 + tag_servers_measure: 無kâng ê服侍器 + tag_uses_measure: Lóng總使用 + description_html: Tsiah ê是hashtag,tsit-má佇lí ê服侍器看見ê tsē-tsē PO文中出現。Tse通tsān lí ê用者tshuē著ta̍k家上tsē討論ê內容。除非lí核准,hashtag bē公開顯示。 + listable: 通受建議 + no_tag_selected: 因為無揀任何標簽,所以lóng無改變 + not_listable: Bē當受建議 + not_trendable: Bē刊tī趨勢 + not_usable: Bē當用 + peaked_on_and_decaying: 佇 %{date} 日上烘,tsit-má teh退火 + title: 趨勢ê hashtag + trendable: 通刊tī趨勢 + trending_rank: '趨勢 #%{rank}' + usable: Ē當用 + usage_comparison: Tī kin-á日hōo %{today} ê lâng用,比較tsa-hng有 %{yesterday} ê + used_by_over_week: + other: 頂禮拜hōo %{count} 位用者用 + title: 推薦kap趨勢 + trending: 趨勢 + username_blocks: + add_new: 加新ê + block_registrations: 封鎖註冊 + comparison: + contains: 包含 + equals: 等於 + contains_html: 包含 %{string} + created_msg: 成功加添用者名規則 + delete: Thâi掉 + edit: + title: 編輯使用者號名規則 + matches_exactly_html: 等於 %{string} + new: + create: 建立規則 + title: 創造使用者號名規則 + no_username_block_selected: 因為無揀任何使用者號名規則,所以lóng無改變 + not_permitted: 無允准 scheduled_statuses: too_soon: Tio̍h用未來ê日期。 statuses: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 0c557cd4421a53..2a814367cf024d 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -848,6 +848,10 @@ nl: all: Aan iedereen disabled: Aan niemand users: Aan ingelogde lokale gebruikers + feed_access: + modes: + authenticated: Alleen ingelogde gebruikers + public: Iedereen registrations: moderation_recommandation: Zorg ervoor dat je een adequaat en responsief moderatieteam hebt voordat je registraties voor iedereen openstelt! preamble: Toezicht houden op wie een account op deze server kan registreren. @@ -907,7 +911,7 @@ nl: status_title: Bericht van @%{name} title: Accountberichten - @%{name} trending: Trending - view_publicly: In het openbaar bekijken + view_publicly: Openbaar bericht bekijken visibility: Zichtbaarheid with_media: Met media strikes: @@ -980,7 +984,7 @@ nl: name: Naam newest: Nieuwste oldest: Oudste - open: In het openbaar bekijken + open: Oorspronkelijk bericht bekijken reset: Opnieuw review: Status beoordelen search: Zoeken @@ -1587,6 +1591,13 @@ nl: expires_at: Verloopt op uses: Aantal keer te gebruiken title: Mensen uitnodigen + link_preview: + author_html: Door %{name} + potentially_sensitive_content: + action: Klik om te tonen + confirm_visit: Ben je zeker dat je deze link wilt openen? + hide_button: Verberg + label: Mogelijk gevoelige inhoud lists: errors: limit: Je hebt het maximum aantal lijsten bereikt @@ -1897,6 +1908,9 @@ nl: other: "%{count} video's" boosted_from_html: Geboost van %{acct_link} content_warning: 'Inhoudswaarschuwing: %{warning}' + content_warnings: + hide: Bericht verbergen + show: Meer tonen default_language: Hetzelfde als de taal van de gebruikersomgeving disallowed_hashtags: one: 'bevatte een niet toegestane hashtag: %{tags}' diff --git a/config/locales/simple_form.an.yml b/config/locales/simple_form.an.yml index ad17b19ba058aa..d21689f6ed1a1f 100644 --- a/config/locales/simple_form.an.yml +++ b/config/locales/simple_form.an.yml @@ -81,7 +81,6 @@ an: site_title: Cómo puede referir-se la chent a lo tuyo servidor amás de per lo nombre de dominio. theme: Lo tema que los visitantes no rechistraus y los nuevos usuarios veyen. thumbnail: Una imachen d'aproximadament 2:1 s'amuestra chunto a la información d'o tuyo servidor. - timeline_preview: Los visitantes no rechistraus podrán navegar per los mensaches publicos mas recients disponibles en o servidor. trendable_by_default: Omitir la revisión manual d'o conteniu en tendencia. Los elementos individuals encara podrán eliminar-se d'as tendencias. trends: Las tendencias amuestran qué mensaches, etiquetas y noticias son ganando tracción en o tuyo servidor. form_challenge: @@ -233,7 +232,6 @@ an: site_title: Nombre d'o servidor theme: Tema per defecto thumbnail: Miniatura d'o servidor - timeline_preview: Permitir l'acceso no autenticau a las linias de tiempo publicas trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias interactions: diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 4e2c1cf67ee938..767cd030bbdf34 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -102,7 +102,6 @@ ar: status_page_url: العنوان التشعبي حيث يمكن للناس رؤية صفحة حالة هذا الخادم عند حدوث عطب ما theme: الشكل الذي يشاهده الزوار الجدد و الغير مسجلين الدخول. thumbnail: عرض حوالي 2:1 صورة إلى جانب معلومات الخادم الخاص بك. - timeline_preview: الزوار الذين سجلوا خروجهم سيكونون قادرين على تصفح أحدث المشاركات العامة المتاحة على الخادم. trendable_by_default: تخطي مراجعة المحتوى التريند اليدوي. لا يزال من الممكن الإزالة اللاحقة للعناصر الفردية من التريندات. trends: تُظهِر المتداولة أي من المنشورات والوسوم وقصص الأخبار التي تجذب الانتباه على خادمك. trends_as_landing_page: إظهار المحتوى المتداوَل للمستخدمين والزوار غير المسجلين بدلاً من وصف هذا الخادم. يتطلب هذا تفعيل المتداولة. @@ -292,7 +291,6 @@ ar: status_page_url: الرابط التشعبي لصفحة حالة الخادم theme: الحُلَّة الإفتراضية thumbnail: الصورة المصغرة للخادم - timeline_preview: السماح بالوصول غير الموثق إلى الخيوط الزمنية العامة trendable_by_default: السماح للوسوم بالظهور على المتداوَلة دون مراجعة مسبقة trends: تمكين المتداوَلة trends_as_landing_page: استخدام المُتداوَلة كصفحة ترحيب diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index c042d3ced436cf..977f89027a80ec 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -142,7 +142,6 @@ ast: site_title: Nome del sirvidor theme: Estilu predetermináu thumbnail: Miniatura del sirvidor - timeline_preview: Permitir l'accesu ensin autenticar a les llinies de tiempu públiques trendable_by_default: Permitir tendencies ensin revisión previa trends: Activar les tendencies interactions: diff --git a/config/locales/simple_form.az.yml b/config/locales/simple_form.az.yml index fd290627cab308..cb15c716222cf6 100644 --- a/config/locales/simple_form.az.yml +++ b/config/locales/simple_form.az.yml @@ -66,7 +66,6 @@ az: setting_use_pending_items: Yavaş rejim form_admin_settings: show_domain_blocks: Əngəllənən domenləri göstər - timeline_preview: Ümumi zaman xətlərinə səlahiyyətsiz erişimə icazə ver ip_block: severities: no_access: Erişimi əngəllə diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 811dd80dae14f1..eaa6d52708ba47 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -91,7 +91,7 @@ be: custom_css: Вы можаце прымяняць карыстальніцкія стылі ў вэб-версіі Mastodon. favicon: WEBP, PNG, GIF ці JPG. Замяняе прадвызначаны favicon Mastodon на ўласны значок. mascot: Замяняе ілюстрацыю ў пашыраным вэб-інтэрфейсе. - media_cache_retention_period: Медыяфайлы з допісаў, зробленых выдаленымі карыстальнікамі, кэшыруюцца на вашым серверы. Пры станоўчым значэнні медыяфайлы будуць выдалены праз пазначаную колькасць дзён. Калі медыяданыя будуць запытаны пасля выдалення, яны будуць спампаваны зноў, калі зыходнае змесціва усё яшчэ даступнае. У сувязі з абмежаваннямі на частату абнаўлення картак перадпрагляду іншых сайтаў, рэкамендуецца ўсталяваць значэнне не менш за 14 дзён, інакш гэтыя карткі не будуць абнаўляцца па запыце раней за гэты тэрмін. + media_cache_retention_period: Медыяфайлы з допісаў, зробленых карыстальнікамі з іншых сервераў, кэшыруюцца на вашым серверы. Пры станоўчым значэнні медыяфайлы будуць выдалены праз пазначаную колькасць дзён. Калі медыяданыя будуць запытаныя пасля выдалення, яны будуць спампаваныя зноў, калі зыходнае змесціва усё яшчэ даступнае. У сувязі з абмежаваннямі на частату абнаўлення картак перадпрагляду іншых сайтаў, рэкамендуецца ўсталяваць значэнне не менш за 14 дзён, інакш гэтыя карткі не будуць абнаўляцца па запыце раней за гэты тэрмін. min_age: Карыстальнікі будуць атрымліваць запыт на пацвярджэнне даты нараджэння падчас рэгістрацыі peers_api_enabled: Спіс даменных імён, з якімі сутыкнуўся гэты сервер у федэральным сусвеце. Даныя пра тое, ці знаходзіцеся вы з дадзеным серверам у федэрацыі, не ўключаны. Уключаны толькі даныя пра тое, што ваш сервер ведае пра іншыя серверы. Гэта выкарыстоўваецца сэрвісамі, якія збіраюць статыстыку па федэрацыі ў агульным сэнсе. profile_directory: Дырэкторыя профіляў змяшчае спіс усіх карыстальнікаў, якія вырашылі быць бачнымі. @@ -105,7 +105,6 @@ be: status_page_url: URL старонкі, дзе людзі могуць бачыць стан гэтага сервера падчас збою theme: Тэма, што бачаць новыя карыстальнікі ды наведвальнікі, якія выйшлі. thumbnail: Выява памерамі прыкладна 2:1, якая паказваецца побач з інфармацыяй пра ваш сервер. - timeline_preview: Наведвальнікі, якія выйшлі, змогуць праглядаць апошнія публічныя допісы на серверы. trendable_by_default: Прапусціць ручны агляд трэндавага змесціва. Асобныя элементы ўсё яшчэ можна будзе выдаліць з трэндаў пастфактум. trends: Трэнды паказваюць, якія допісы, хэштэгі і навіны набываюць папулярнасць на вашым серверы. trends_as_landing_page: Паказваць папулярнае змесціва карыстальнікам, якія выйшлі з сістэмы, і наведвальнікам, замест апісання гэтага сервера. Патрабуецца ўключэнне трэндаў. @@ -283,15 +282,19 @@ be: backups_retention_period: Працягласць захавання архіву карыстальніка bootstrap_timeline_accounts: Заўсёды раіць гэтыя ўліковыя запісы новым карыстальнікам closed_registrations_message: Уласнае паведамленне, калі рэгістрацыя немагчымая - content_cache_retention_period: Перыяд захоўвання выдаленага змесціва + content_cache_retention_period: Перыяд захоўвання змесціва з іншых сервераў custom_css: CSS карыстальніка favicon: Значок сайта + local_live_feed_access: Доступ да жывых стужак з лакальнымі допісамі + local_topic_feed_access: Доступ да хэштэгавых і спасылачных стужак з лакальнымі допісамі mascot: Уласны маскот(спадчына) media_cache_retention_period: Працягласць захавання кэшу для медыя min_age: Патрабаванне мінімальнага ўзросту peers_api_enabled: Апублікаваць спіс знойдзеных сервераў у API profile_directory: Уключыць каталог профіляў registrations_mode: Хто можа зарэгістравацца + remote_live_feed_access: Доступ да жывых стужак з допісамі з іншых сервераў + remote_topic_feed_access: Доступ да хэштэгавых і спасылачных стужак з допісамі з іншых сервераў require_invite_text: Каб далучыцца, патрэбна прычына show_domain_blocks: Паказаць заблакіраваныя дамены show_domain_blocks_rationale: Паказваць прычыну блакавання даменаў @@ -304,7 +307,6 @@ be: status_page_url: URL старонкі статусу theme: Тэма па змаўчанні thumbnail: Мініяцюра сервера - timeline_preview: Дазволіць неаўтэнтыфікаваны доступ да публічных стужак trendable_by_default: Дазваляць трэнды без папярэдняй праверкі trends: Уключыць трэнды trends_as_landing_page: Выкарыстоўваць трэнды ў якасці лэндзінга diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index d1673b9e1fc32f..38e3c2a538f37b 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -103,7 +103,6 @@ bg: status_page_url: Адресът на страницата, където хората могат да видят състоянието на този сървър по време на прекъсване theme: Темата, която излизащи от системата посетители и нови потребители виждат. thumbnail: Образ в съотношение около 2:1, показвано до информацията за сървъра ви. - timeline_preview: Излизащите от системата посетители ще може да разглеждат най-новите публични публикации, налични на сървъра. trendable_by_default: Прескачане на ръчния преглед на изгряващо съдържание. Отделни елементи още могат да се премахват от изгряващи постфактум. trends: В раздел „Налагащо се“ се показват публикации, хаштагове и новини, набрали популярност на сървъра ви. trends_as_landing_page: Показване на налагащото се съдържание за излизащите потребители и посетители вместо на описа на този сървър. Изисква налагащото се да бъде включено. @@ -298,7 +297,6 @@ bg: status_page_url: URL адрес на страница със състоянието theme: Стандартна тема thumbnail: Образче на сървъра - timeline_preview: Позволяване на неудостоверен достъп до публични инфопотоци trendable_by_default: Без преглед на налагащото се trends: Включване на налагащи се trends_as_landing_page: Употреба на налагащото се като целева страница diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 46ba3ddd59476c..a8cbf6bb90b82c 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -105,7 +105,6 @@ ca: status_page_url: Enllaç de la pàgina on els usuaris poden veure l'estat d'aquest servidor durant una interrupció del servei theme: El tema que els visitants i els nous usuaris veuen. thumbnail: Una imatge d'aproximadament 2:1 que es mostra al costat la informació del teu servidor. - timeline_preview: Els visitants amb sessió no iniciada seran capaços de navegar per els tuts més recents en el teu servidor. trendable_by_default: Omet la revisió manual del contingut en tendència. Els articles individuals poden encara ser eliminats després del fet. trends: Les tendències mostren quins tuts, etiquetes i notícies estan guanyant força en el teu servidor. trends_as_landing_page: Mostra el contingut en tendència als usuaris i visitants no autenticats enlloc de la descripció d'aquest servidor. Requereix que les tendències estiguin activades. @@ -297,7 +296,6 @@ ca: status_page_url: Enllaç de la pàgina d'estat theme: Tema per defecte thumbnail: Miniatura del servidor - timeline_preview: Permet l'accés no autenticat a les línies de temps públiques trendable_by_default: Permet tendències sense revisió prèvia trends: Activa les tendències trends_as_landing_page: Fer servir les tendències com a pàgina inicial diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index f2ef4f672cc7e7..93d6b202d8e8b9 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -105,7 +105,6 @@ cs: status_page_url: URL stránky, kde mohou lidé vidět stav tohoto serveru během výpadku theme: Vzhled stránky, který vidí noví a odhlášení uživatelé. thumbnail: Přibližně 2:1 obrázek zobrazený vedle informací o vašem serveru. - timeline_preview: Odhlášení uživatelé budou moci procházet nejnovější veřejné příspěvky na serveru. trendable_by_default: Přeskočit manuální kontrolu populárního obsahu. Jednotlivé položky mohou být odstraněny z trendů později. trends: Trendy zobrazují, které příspěvky, hashtagy a zprávy získávají na serveru pozornost. trends_as_landing_page: Zobrazit populární obsah odhlášeným uživatelům a návštěvníkům místo popisu tohoto serveru. Vyžaduje povolení trendů. @@ -286,12 +285,16 @@ cs: content_cache_retention_period: Doba uchovávání vzdáleného obsahu custom_css: Vlastní CSS favicon: Favicon + local_live_feed_access: Přístup k live kanálům s lokálními příspěvky + local_topic_feed_access: Přístup ke kanálům s hashtagy a odkazy s lokálními příspěvky mascot: Vlastní maskot (zastaralé) media_cache_retention_period: Doba uchovávání mezipaměti médií min_age: Minimální věková hranice peers_api_enabled: Zveřejnit seznam nalezených serverů v API profile_directory: Povolit adresář profilů registrations_mode: Kdo se může přihlásit + remote_live_feed_access: Přístup k live kanálům s vzdálenými příspěvky + remote_topic_feed_access: Přístup ke kanálům s hashtagy a odkazy se vzdálenými příspěvky require_invite_text: Požadovat důvod pro připojení show_domain_blocks: Zobrazit blokace domén show_domain_blocks_rationale: Zobrazit proč byly blokovány domény @@ -304,7 +307,6 @@ cs: status_page_url: URL stránky se stavem theme: Výchozí motiv thumbnail: Miniatura serveru - timeline_preview: Povolit neověřený přístup k veřejným časovým osám trendable_by_default: Povolit trendy bez předchozí revize trends: Povolit trendy trends_as_landing_page: Použít trendy jako vstupní stránku diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 0faa978c4d04c0..354d76a65da487 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -105,7 +105,6 @@ cy: status_page_url: URL tudalen lle gall pobl weld statws y gweinydd hwn yn ystod cyfnod o doriad gwasanaeth theme: Thema sy'n allgofnodi ymwelwyr a defnyddwyr newydd yn gweld. thumbnail: Delwedd tua 2:1 yn cael ei dangos ochr yn ochr â manylion eich gweinydd. - timeline_preview: Bydd ymwelwyr sydd wedi allgofnodi yn gallu pori drwy'r postiadau cyhoeddus diweddaraf sydd ar gael ar y gweinydd. trendable_by_default: Hepgor adolygiad llaw o gynnwys sy'n tueddu. Gall eitemau unigol gael eu tynnu o dueddiadau o hyd ar ôl y ffaith. trends: Mae pynciau llosg yn dangos y postiadau, hashnodau, a newyddion sy'n denu sylw ar eich gweinydd. trends_as_landing_page: Dangos cynnwys tueddiadol i ddefnyddwyr ac ymwelwyr sydd wedi allgofnodi yn lle disgrifiad o'r gweinydd hwn. Mae angen galluogi tueddiadau. @@ -306,7 +305,6 @@ cy: status_page_url: URL tudalen statws theme: Thema ragosodedig thumbnail: Bawdlun y gweinydd - timeline_preview: Caniatáu mynediad heb ei ddilysu i linellau amser cyhoeddus trendable_by_default: Caniatáu pynciau llosg heb adolygiad trends: Galluogi pynciau llosg trends_as_landing_page: Defnyddio tueddiadau fel y dudalen gartref diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 05fa2acc9c0aa6..7b15510e03c7f9 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -105,7 +105,6 @@ da: status_page_url: URL'en til en side, hvor status for denne server kan ses under en afbrydelse theme: Tema, som udloggede besøgende og nye brugere ser. 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_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. @@ -284,12 +283,16 @@ da: content_cache_retention_period: Opbevaringsperiode for eksternt indhold custom_css: Tilpasset CSS favicon: Favikon + local_live_feed_access: Adgang til live feeds med lokale indlæg + local_topic_feed_access: Adgang til hashtag- og link-feeds med lokale indlæg mascot: Tilpasset maskot (ældre funktion) media_cache_retention_period: Media-cache opbevaringsperiode min_age: Minimums alderskrav peers_api_enabled: Udgiv liste over fundne server i API'en profile_directory: Aktivér profiloversigt registrations_mode: Hvem, der kan tilmelde sig + remote_live_feed_access: Adgang til live feeds med eksterne indlæg + remote_topic_feed_access: Adgang til hashtag- og link-feeds med eksterne indlæg require_invite_text: Kræv tilmeldingsbegrundelse show_domain_blocks: Vis domæneblokeringer show_domain_blocks_rationale: Vis, hvorfor domæner blev blokeret @@ -302,7 +305,6 @@ da: status_page_url: Statusside-URL theme: Standardtema thumbnail: Serverminiaturebillede - timeline_preview: Tillad ikke-godkendt adgang til offentlige tidslinjer trendable_by_default: Tillad ikke-reviderede trends trends: Aktivér trends trends_as_landing_page: Brug tendenser som destinationssiden diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 0eed719cf71f9b..fac3892a9026de 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -105,7 +105,6 @@ de: status_page_url: Link zu einer Internetseite, auf der der Serverstatus während eines Ausfalls angezeigt wird theme: Das Design, das abgemeldete Besucher und neue Benutzer sehen. thumbnail: Ein Bild ungefähr im 2:1-Format, das neben den Server-Informationen angezeigt wird. - timeline_preview: Nicht angemeldete Personen können die neuesten öffentlichen Beiträge dieses Servers aufrufen. trendable_by_default: Manuelles Überprüfen angesagter Inhalte überspringen. Einzelne Elemente können später noch aus den Trends entfernt werden. trends: Trends zeigen, welche Beiträge, Hashtags und Nachrichten auf deinem Server immer beliebter werden. trends_as_landing_page: Dies zeigt nicht angemeldeten Personen Trendinhalte anstelle einer Beschreibung des Servers an. Erfordert, dass Trends aktiviert sind. @@ -284,12 +283,16 @@ de: content_cache_retention_period: Aufbewahrungsfrist für externe Inhalte custom_css: Eigenes CSS favicon: Favicon + local_live_feed_access: Zugriff auf Live-Feeds, die lokale Beiträge beinhalten + local_topic_feed_access: Zugriff auf Hashtags und Links, die lokale Beiträge beinhalten mascot: Benutzerdefiniertes Maskottchen (Legacy) media_cache_retention_period: Aufbewahrungsfrist für Medien im Cache min_age: Erforderliches Mindestalter peers_api_enabled: Die entdeckten Server im Fediverse über die API veröffentlichen profile_directory: Profilverzeichnis aktivieren registrations_mode: Wer darf ein neues Konto registrieren? + remote_live_feed_access: Zugriff auf Live-Feeds, die Beiträge externer Server beinhalten + remote_topic_feed_access: Zugriff auf Hashtags und Links, die Beiträge externer Server beinhalten require_invite_text: Begründung für Beitritt verlangen show_domain_blocks: Anzeigen, welche Domains gesperrt wurden show_domain_blocks_rationale: Anzeigen, weshalb Domains gesperrt wurden @@ -302,7 +305,6 @@ de: status_page_url: Statusseite (URL) theme: Standard-Design thumbnail: Vorschaubild des Servers - timeline_preview: Nicht-authentisierten Zugriff auf öffentliche Timelines gestatten trendable_by_default: Trends ohne vorherige Überprüfung erlauben trends: Trends aktivieren trends_as_landing_page: Trends als Landingpage verwenden diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index f43399b5e6993d..f65ad49793be1b 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -105,7 +105,6 @@ el: status_page_url: Το URL μιας σελίδας όπου κάποιος μπορεί να δει την κατάσταση αυτού του διακομιστή κατά τη διάρκεια μιας διακοπής λειτουργίας theme: Θέμα που βλέπουν αποσυνδεδεμένοι επισκέπτες ή νέοι χρήστες. thumbnail: Μια εικόνα περίπου 2:1 που εμφανίζεται παράλληλα με τις πληροφορίες του διακομιστή σου. - timeline_preview: Αποσυνδεδεμένοι επισκέπτες θα μπορούν να περιηγηθούν στις πιο πρόσφατες δημόσιες δημοσιεύσεις που είναι διαθέσιμες στο διακομιστή. trendable_by_default: Παράλειψη χειροκίνητης αξιολόγησης του περιεχομένου σε τάση. Μεμονωμένα στοιχεία μπορούν ακόμα να αφαιρεθούν από τις τάσεις μετέπειτα. trends: Τάσεις δείχνουν ποιες δημοσιεύσεις, ετικέτες και ειδήσεις προκαλούν έλξη στο διακομιστή σας. trends_as_landing_page: Εμφάνιση περιεχομένου σε τάση σε αποσυνδεδεμένους χρήστες και επισκέπτες αντί για μια περιγραφή αυτού του διακομιστή. Απαιτεί οι τάσεις να έχουν ενεργοποιηθεί. @@ -284,12 +283,16 @@ el: content_cache_retention_period: Περίοδος διατήρησης απομακρυσμένου περιεχομένου custom_css: Προσαρμοσμένο CSS favicon: Favicon + local_live_feed_access: Πρόσβαση σε ζωντανές ροές με τοπικές αναρτήσεις + local_topic_feed_access: Πρόσβαση σε ροές ετικετών και συνδέσμων με τοπικές αναρτήσεις mascot: Προσαρμοσμένη μασκότ (απαρχαιωμένο) media_cache_retention_period: Περίοδος διατήρησης προσωρινής μνήμης πολυμέσων min_age: Ελάχιστη απαιτούμενη ηλικία peers_api_enabled: Δημοσίευση λίστας των εντοπισμένων διακομιστών στο API profile_directory: Ενεργοποίηση καταλόγου προφίλ registrations_mode: Ποιος μπορεί να εγγραφεί + remote_live_feed_access: Πρόσβαση σε ζωντανές ροές με απομακρυσμένες αναρτήσεις + remote_topic_feed_access: Πρόσβαση σε ροές ετικετών και συνδέσμων με απομακρυσμένες αναρτήσεις require_invite_text: Απαίτησε έναν λόγο για να γίνει κάποιος μέλος show_domain_blocks: Εμφάνιση αποκλεισμένων τομέων show_domain_blocks_rationale: Εμφάνιση γιατί αποκλείστηκαν οι τομείς @@ -302,7 +305,6 @@ el: status_page_url: URL σελίδας κατάστασης theme: Προεπιλεγμένο θέμα thumbnail: Μικρογραφία διακομιστή - timeline_preview: Να επιτρέπεται μη πιστοποιημένη πρόσβαση σε δημόσιες ροές trendable_by_default: Επίτρεψε τις τάσεις χωρίς προηγούμενη αξιολόγηση trends: Ενεργοποίηση τάσεων trends_as_landing_page: Χρήση των τάσεων ως σελίδα προορισμού diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index e813ecc0c34b51..1e534d1d2161ed 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -103,7 +103,6 @@ en-GB: status_page_url: URL of a page where people can see the status of this server during an outage theme: Theme that logged out visitors and new users see. thumbnail: A roughly 2:1 image displayed alongside your server information. - timeline_preview: Logged out visitors will be able to browse the most recent public posts available on the server. trendable_by_default: Skip manual review of trending content. Individual items can still be removed from trends after the fact. trends: Trends show which posts, hashtags and news stories are gaining traction on your server. trends_as_landing_page: Show trending content to logged-out users and visitors instead of a description of this server. Requires trends to be enabled. @@ -292,7 +291,6 @@ en-GB: status_page_url: Status page URL theme: Default theme thumbnail: Server thumbnail - timeline_preview: Allow unauthenticated access to public timelines trendable_by_default: Allow trends without prior review trends: Enable trends trends_as_landing_page: Use trends as the landing page diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index e360512c8043a4..a81e4b2d6b4e19 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -140,7 +140,6 @@ en: streaming_other_servers_emoji_reaction: Check network lines and server load as large amounts of data are delivered. If the server load is high, try unchecking the box temporarily. theme: Theme that logged out visitors and new users see. thumbnail: A roughly 2:1 image displayed alongside your server information. - timeline_preview: Logged out visitors will be able to browse the most recent public posts available on the server. trendable_by_default: Skip manual review of trending content. Individual items can still be removed from trends after the fact. trends: Trends show which posts, hashtags and news stories are gaining traction on your server. trends_as_landing_page: Show trending content to logged-out users and visitors instead of a description of this server. Requires trends to be enabled. @@ -409,6 +408,8 @@ en: enable_public_unlisted_visibility: Enable public-unlisted visibility / public-unlisted searchability enable_public_visibility: Enable public visibility favicon: Favicon + local_live_feed_access: Access to live feeds featuring local posts + local_topic_feed_access: Access to hashtag and link feeds featuring local posts mascot: Custom mascot (legacy) media_cache_retention_period: Media cache retention period min_age: Minimum age requirement @@ -424,6 +425,8 @@ en: registrations_secondary_end_hour_hint: If input 0, secondary hour is disabled. registrations_secondary_start_hour: Secondary registration start hour (UTC 0-24) registrations_start_hour: Registration-without-approval start hour (UTC 0-24) + remote_live_feed_access: Access to live feeds featuring remote posts + remote_topic_feed_access: Access to hashtag and link feeds featuring remote posts require_invite_text: Require a reason to join show_domain_blocks: Show domain blocks show_domain_blocks_rationale: Show why domains were blocked @@ -438,7 +441,6 @@ en: streaming_other_servers_emoji_reaction: Streaming emoji reactions between other server users theme: Default theme thumbnail: Server thumbnail - timeline_preview: Allow unauthenticated access to public timelines trendable_by_default: Allow trends without prior review trends: Enable trends trends_as_landing_page: Use trends as the landing page diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 4e2ff0bf0af9f1..c8bf3ec0bd7bca 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -105,7 +105,6 @@ eo: status_page_url: URL de paĝo kie homoj povas vidi la staton de ĉi tiu servilo dum malfunkcio theme: Etoso kiun elsalutitaj vizitantoj kaj novaj uzantoj vidas. thumbnail: Ĉirkaua 2:1 bildo montritas kun via servilinformo. - timeline_preview: Elsalutitaj vizitantoj povos vidi la plej lastajn publikajn mesaĝojn disponeblaj en la servilo. trendable_by_default: Ignori permanan kontrolon de tendenca enhavo. trends: Tendencoj montras kiu mesaĝoj, kradvortoj kaj novaĵoj populariĝas en via servilo. trends_as_landing_page: Montru tendencan enhavon al elsalutitaj uzantoj kaj vizitantoj anstataŭ priskribo de ĉi tiu servilo. Necesas ke tendencoj estu ebligitaj. @@ -298,7 +297,6 @@ eo: status_page_url: URL de la paĝo de stato theme: Implicita etoso thumbnail: Bildeto de servilo - timeline_preview: Permesi la neaŭtentigitan aliron al la publikaj templinioj trendable_by_default: Permesi tendencojn sen deviga kontrolo trends: Ŝalti furorojn trends_as_landing_page: Uzu tendencojn kiel la landpaĝon diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index cf697ea64c3cd6..d65a3ef1fd7065 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -105,7 +105,6 @@ es-AR: status_page_url: Dirección web de una página donde la gente puede ver el estado de este servidor durante un apagón theme: El tema que los visitantes no registrados y los nuevos usuarios ven. thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. - timeline_preview: Los visitantes no registrados podrán navegar por los mensajes públicos más recientes disponibles en el servidor. trendable_by_default: Omití la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué mensajes, etiquetas y noticias están ganando tracción en tu servidor. trends_as_landing_page: Mostrar contenido en tendencia para usuarios que no iniciaron sesión y visitantes, en lugar de una descripción de este servidor. Requiere que las tendencias estén habilitadas. @@ -284,12 +283,16 @@ es-AR: content_cache_retention_period: Período de retención de contenido remoto custom_css: CSS personalizado favicon: Favicón + local_live_feed_access: Acceso a líneas temporales en vivo, destacando mensajes locales + local_topic_feed_access: Acceso a líneas temporales de etiquetas y enlaces, destacando mensajes locales mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de la caché de medios min_age: Edad mínima requerida peers_api_enabled: Publicar lista de servidores descubiertos en la API profile_directory: Habilitar directorio de perfiles registrations_mode: Quién puede registrarse + remote_live_feed_access: Acceso a líneas temporales en vivo, destacando mensajes remotos + remote_topic_feed_access: Acceso a líneas temporales de etiquetas y enlaces, destacando mensajes remotos require_invite_text: Requerir un motivo para unirse show_domain_blocks: Mostrar dominios bloqueados show_domain_blocks_rationale: Mostrar por qué se bloquearon los dominios @@ -302,7 +305,6 @@ es-AR: status_page_url: Dirección web de la página de estado theme: Tema predeterminado thumbnail: Miniatura del servidor - timeline_preview: Permitir el acceso no autenticado a las líneas temporales públicas trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias trends_as_landing_page: Usar las tendencias como la página de destino diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index ceaa3fcf9feb5f..088423f275975a 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -105,7 +105,6 @@ es-MX: status_page_url: URL de una página donde las personas pueden ver el estado de este servidor durante una interrupción theme: El tema que los visitantes no registrados y los nuevos usuarios ven. thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. - timeline_preview: Los visitantes no registrados podrán navegar por los mensajes públicos más recientes disponibles en el servidor. trendable_by_default: Omitir la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué mensajes, etiquetas y noticias están ganando tracción en tu servidor. trends_as_landing_page: Mostrar contenido en tendencia para usuarios y visitantes desconectados en lugar de una descripción de este servidor. Requiere tendencias para ser habilitado. @@ -284,12 +283,16 @@ es-MX: content_cache_retention_period: Periodo de conservación de contenidos remotos custom_css: CSS personalizado favicon: Favicon + local_live_feed_access: Acceso a las cronologías que destacan publicaciones locales + local_topic_feed_access: Acceso a las etiquetas y enlaces en tendencia que destacan publicaciones locales mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de caché multimedia min_age: Edad mínima requerida peers_api_enabled: Publicar lista de servidores descubiertos en la API profile_directory: Habilitar directorio de perfiles registrations_mode: Quién puede registrarse + remote_live_feed_access: Acceso a las cronologías que destacan publicaciones remotas + remote_topic_feed_access: Acceso a las etiquetas y enlaces en tendencia que destacan publicaciones remotas require_invite_text: Requerir una razón para unirse show_domain_blocks: Mostrar dominios bloqueados show_domain_blocks_rationale: Mostrar por qué se bloquearon los dominios @@ -302,7 +305,6 @@ es-MX: status_page_url: URL de página de estado theme: Tema por defecto thumbnail: Miniatura del servidor - timeline_preview: Permitir el acceso no autenticado a las líneas de tiempo públicas trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias trends_as_landing_page: Usar tendencias como página de destino diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index ec7ba3e30c37be..d6f1c5d8657c5f 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -105,7 +105,6 @@ es: status_page_url: URL de una página donde se pueda ver el estado de este servidor durante una incidencia theme: El tema que los visitantes no registrados y los nuevos usuarios ven. thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. - timeline_preview: Los visitantes no registrados podrán navegar por los mensajes públicos más recientes disponibles en el servidor. trendable_by_default: Omitir la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué publicaciones, etiquetas y noticias están ganando tracción en tu servidor. trends_as_landing_page: Mostrar contenido en tendencia para usuarios y visitantes en lugar de una descripción de este servidor. Requiere que las tendencias estén habilitadas. @@ -284,12 +283,16 @@ es: content_cache_retention_period: Período de retención de contenido remoto custom_css: CSS personalizado favicon: Favicon + local_live_feed_access: Acceso a las cronologías que destacan publicaciones locales + local_topic_feed_access: Acceso a las etiquetas y enlaces en tendencia que destacan publicaciones locales mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de caché multimedia min_age: Edad mínima requerida peers_api_enabled: Publicar lista de servidores descubiertos en la API profile_directory: Habilitar directorio de perfiles registrations_mode: Quién puede registrarse + remote_live_feed_access: Acceso a las cronologías que destacan publicaciones remotas + remote_topic_feed_access: Acceso a las etiquetas y enlaces en tendencia que destacan publicaciones remotas require_invite_text: Requerir una razón para unirse show_domain_blocks: Mostrar dominios bloqueados show_domain_blocks_rationale: Mostrar por qué se bloquearon los dominios @@ -302,7 +305,6 @@ es: status_page_url: URL de página de estado theme: Tema por defecto thumbnail: Miniatura del servidor - timeline_preview: Permitir el acceso no autenticado a las líneas de tiempo públicas trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias trends_as_landing_page: Usar tendencias como la página de inicio diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 1f9bf778fad6c9..603d00f26d053a 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -105,7 +105,6 @@ et: status_page_url: Lehe URL, kus saab serveri maas oleku ajal näha serveri olekut theme: Teema, mida näevad sisenemata ning uued kasutajad. thumbnail: Umbes 2:1 mõõdus pilt serveri informatsiooni kõrval. - timeline_preview: Sisenemata külastajatel on võimalik sirvida viimaseid avalikke postitusi serveril. trendable_by_default: Populaarse sisu ülevaatuse vahele jätmine. Pärast seda on siiski võimalik üksikuid üksusi trendidest eemaldada. trends: Trendid näitavad, millised postitused, sildid ja uudislood koguvad sinu serveris tähelepanu. trends_as_landing_page: Näitab välja logitud kasutajatele ja külalistele serveri kirjelduse asemel populaarset sisu. Populaarne sisu (trendid) peab selleks olema sisse lülitatud. @@ -302,7 +301,6 @@ et: status_page_url: Oleku lehe URL theme: Vaikmisi teema thumbnail: Serveri pisipilt - timeline_preview: Luba autentimata ligipääs avalikele ajajoontele trendable_by_default: Luba trendid eelneva ülevaatuseta trends: Luba trendid trends_as_landing_page: Kasuta maabumislehena lehte Populaarne diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index c1879e9f87ccb8..ff4c4ed30a7e93 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -103,7 +103,6 @@ eu: status_page_url: Kanporatua dagoen jendeak zerbitzari honen egoera ikus dezaten gune baten URL theme: Saioa hasi gabeko erabiltzaileek eta berriek ikusiko duten gaia. thumbnail: Zerbitzariaren informazioaren ondoan erakusten den 2:1 inguruko irudia. - timeline_preview: Saioa hasi gabeko erabiltzaileek ezingo dituzte arakatu zerbitzariko bidalketa publiko berrienak. trendable_by_default: Saltatu joeretako edukiaren eskuzko berrikuspena. Ondoren elementuak banan-bana kendu daitezke joeretatik. trends: Joeretan zure zerbitzarian bogan dauden bidalketa, traola eta albisteak erakusten dira. trends_as_landing_page: Erakutsi pil-pilean dagoen edukia saioa hasita ez duten erabiltzaileei eta bisitariei, zerbitzari honen deskribapena erakutsi ordez. Joerak aktibatuak edukitzea beharrezkoa da. @@ -279,7 +278,6 @@ eu: status_page_url: Egoera-orriaren URLa theme: Lehenetsitako gaia thumbnail: Zerbitzariaren koadro txikia - timeline_preview: Onartu autentifikatu gabeko sarbidea denbora lerro publikoetara trendable_by_default: Onartu joerak aurrez berrikusi gabe trends: Gaitu joerak trends_as_landing_page: Erabili joerak hasierako orri gisa diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 9d75b9e5db4ae5..dac3c88bf9d0c0 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -103,7 +103,6 @@ fa: status_page_url: نشانی وب صفحه‌ای که در آن افراد می‌توانند وضعیت این سرور را در هنگام قطع شدن ببینند theme: زمینه‌ای که بینندگان خارج شده و کاربران جدید می‌بینند. thumbnail: یک تصویر تقریباً 2:1 در کنار اطلاعات سرور شما نمایش داده می شود. - timeline_preview: بازدیدکنندگانی که از سیستم خارج شده اند می توانند جدیدترین پست های عمومی موجود در سرور را مرور کنند. trendable_by_default: از بررسی دستی محتوای پرطرفدار صرف نظر کنید. آیتم های فردی هنوز هم می توانند پس از واقعیت از روند حذف شوند. trends: روندها نشان می‌دهند که کدام پست‌ها، هشتگ‌ها و داستان‌های خبری در سرور شما مورد توجه قرار گرفته‌اند. trends_as_landing_page: به جای توضیح این سرور، محتوای پرطرفدار را به کاربران و بازدیدکنندگان از سیستم خارج شده نشان دهید. نیاز به فعال شدن روندها دارد. @@ -299,7 +298,6 @@ fa: status_page_url: نشانی صفحهٔ وضعیت theme: زمینهٔ پیش‌گزیده thumbnail: بندانگشتی کارساز - timeline_preview: اجازهٔ دسترسی بدون تأیید هویت به خط‌زمانی‌های عمومی trendable_by_default: اجازهٔ پرطرفدار شدن بدون بازبینی پیشین trends: به کار انداختن پرطرفدارها trends_as_landing_page: استفاده از داغ‌ها به عنوان صفحهٔ فرود diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index b31c8e1ef35d82..d99e86feeeb571 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -105,7 +105,6 @@ fi: status_page_url: URL-osoite sivulle, josta tämän palvelimen tilan voi ongelmatilanteissa tarkistaa theme: Teema, jonka uloskirjautuneet vierailijat ja uudet käyttäjät näkevät. thumbnail: Noin 2:1 kuva näkyy palvelimen tietojen ohessa. - timeline_preview: Uloskirjautuneet vierailijat voivat selata uusimpia julkisia julkaisuja, jotka ovat saatavilla palvelimella. trendable_by_default: Ohita suositun sisällön manuaalinen tarkastus. Yksittäisiä kohteita voidaan edelleen poistaa jälkikäteen. trends: Trendit osoittavat, mitkä julkaisut, aihetunnisteet ja uutiset keräävät huomiota palvelimellasi. trends_as_landing_page: Näytä vierailijoille ja uloskirjautuneille käyttäjille suosittua sisältöä palvelimen kuvauksen sijaan. Edellyttää, että trendit on otettu käyttöön. @@ -283,12 +282,16 @@ fi: content_cache_retention_period: Etäsisällön säilytysaika custom_css: Mukautettu CSS favicon: Sivustokuvake + local_live_feed_access: Pääsy paikallisia julkaisuja esitteleviin livesyötteisiin + local_topic_feed_access: Pääsy paikallisia julkaisuja esitteleviin aihetunniste- ja linkkisyötteisiin mascot: Mukautettu maskotti (vanhentunut) media_cache_retention_period: Mediasisällön välimuistin säilytysaika min_age: Vähimmäisikävaatimus peers_api_enabled: Julkaise löydettyjen palvelinten luettelo ohjelmointirajapinnassa profile_directory: Ota profiilihakemisto käyttöön registrations_mode: Kuka voi rekisteröityä + remote_live_feed_access: Pääsy etäjulkaisuja esitteleviin livesyötteisiin + remote_topic_feed_access: Pääsy etäjulkaisuja esitteleviin aihetunniste- ja linkkisyötteisiin require_invite_text: Vaadi liittymissyy show_domain_blocks: Näytä verkkotunnusten estot show_domain_blocks_rationale: Näytä, miksi verkkotunnukset on estetty @@ -301,7 +304,6 @@ fi: status_page_url: Tilasivun URL-osoite theme: Oletusteema thumbnail: Palvelimen pienoiskuva - timeline_preview: Salli todentamaton pääsy julkisille aikajanoille trendable_by_default: Salli trendit ilman ennakkotarkastusta trends: Ota trendit käyttöön trends_as_landing_page: Käytä trendejä aloitussivuna diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 95368bcf7ab071..605b32fd80e46d 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -105,7 +105,6 @@ fo: status_page_url: Slóð til eina síðu, har ið fólk kunnu síggja støðuna á hesum ambætaranum í sambandi við streymslit theme: Uppsetingareyðkenni, sum vitjandi, ið ikki eru ritaði inn, og nýggir brúkarar síggja. thumbnail: Ein mynd í lutfallinum 2:1, sum verður víst saman við ambætaraupplýsingunum hjá tær. - timeline_preview: Vitjandi, sum eru ritaði út, fara at kunna blaða ígjøgnum nýggjastu almennu postarnar, sum eru tøkir á ambætaranum. trendable_by_default: Loyp uppum serskilda eftirkannan av tilfari, sum er vælumtókt. Einstakir lutir kunnu framvegis strikast frá listum við vælumtóktum tilfari seinni. trends: Listar við vælumtóktum tilfari vísa, hvørjir postar, frámerki og tíðindasøgur hava framburð á tínum ambætara. trends_as_landing_page: Vís vitjandi og brúkarum, sum ikki eru innritaðir, rák í staðin fyri eina lýsing av ambætaranum. Krevur at rák eru virkin. @@ -284,12 +283,16 @@ fo: content_cache_retention_period: Tíðarskeið fyri varðveiðslu av fjartilfari custom_css: Serskilt CSS favicon: Favikon + local_live_feed_access: Atgongd til beinleiðis rásir við lokalum postum + local_topic_feed_access: Atgongd til frámerki og rásir við leinkjum við lokalum postum mascot: Serskildur maskottur (arvur) media_cache_retention_period: Tíðarskeið, har miðlagoymslur verða varðveittar min_age: Aldursmark peers_api_enabled: Kunnger lista við uppdagaðum ambætarum í API'num profile_directory: Ger vangaskrá virkna registrations_mode: Hvør kann tilmelda seg + remote_live_feed_access: Atgongd til beinleiðis rásir við fjarum postum + remote_topic_feed_access: Atgongd til frámerki og rásir við leinkjum við fjarum postum require_invite_text: Krev eina orsøk at luttaka show_domain_blocks: Vís navnaøkisblokeringar show_domain_blocks_rationale: Vís hví navnaøki vóru blokeraði @@ -302,7 +305,6 @@ fo: status_page_url: Slóð til støðusíðu theme: Sjálvvalt uppsetingareyðkenni thumbnail: Ambætarasmámynd - timeline_preview: Loyv teimum, sum ikki eru ritaði inn, atgongd til almennar tíðarlinjur trendable_by_default: Loyv vælumtóktum tilfari uttan at viðgera tað fyrst trends: Loyv ráki trends_as_landing_page: Brúka rák sum lendingarsíðu diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index 4a38b57118060f..83c32efaff611a 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -102,7 +102,6 @@ fr-CA: status_page_url: URL d'une page où les gens peuvent voir l'état de ce serveur en cas de panne theme: Thème que verront les utilisateur·rice·s déconnecté·e·s ainsi que les nouveaux·elles utilisateur·rice·s. thumbnail: Une image d'environ 2:1 affichée à côté des informations de votre serveur. - timeline_preview: Les visiteurs déconnectés pourront parcourir les derniers messages publics disponibles sur le serveur. trendable_by_default: Ignorer l'examen manuel du contenu tendance. Des éléments individuels peuvent toujours être supprimés des tendances après coup. trends: Les tendances montrent quelles publications, hashtags et actualités sont en train de gagner en traction sur votre serveur. trends_as_landing_page: Afficher le contenu tendance au lieu d'une description de ce serveur pour les comptes déconnectés et les non-inscrit⋅e⋅s. Nécessite que les tendances soient activées. @@ -290,7 +289,6 @@ fr-CA: status_page_url: URL de la page de l'état du serveur theme: Thème par défaut thumbnail: Miniature du serveur - timeline_preview: Autoriser l’accès non authentifié aux fils publics trendable_by_default: Autoriser les tendances sans révision préalable trends: Activer les tendances trends_as_landing_page: Utiliser les tendances comme page d'accueil diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 83eef109363918..249a08c326633b 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -102,7 +102,6 @@ fr: status_page_url: URL d'une page où les gens peuvent voir l'état de ce serveur en cas de panne theme: Thème que verront les utilisateur·rice·s déconnecté·e·s ainsi que les nouveaux·elles utilisateur·rice·s. thumbnail: Une image d'environ 2:1 affichée à côté des informations de votre serveur. - timeline_preview: Les utilisateur⋅rice⋅s déconnecté⋅e⋅s pourront parcourir les derniers messages publics disponibles sur le serveur. trendable_by_default: Ignorer l'examen manuel du contenu tendance. Des éléments individuels peuvent toujours être supprimés des tendances après coup. trends: Les tendances montrent quels messages, hashtags et actualités gagnent en popularité sur votre serveur. trends_as_landing_page: Afficher le contenu tendance au lieu d'une description de ce serveur pour les comptes déconnectés et les non-inscrit⋅e⋅s. Nécessite que les tendances soient activées. @@ -290,7 +289,6 @@ fr: status_page_url: URL de la page de l'état du serveur theme: Thème par défaut thumbnail: Miniature du serveur - timeline_preview: Autoriser l’accès non authentifié aux fils publics trendable_by_default: Autoriser les tendances sans révision préalable trends: Activer les tendances trends_as_landing_page: Utiliser les tendances comme page d'accueil diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index 4345f2f6a70a8b..31c6943c408e18 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -103,7 +103,6 @@ fy: status_page_url: URL fan in side dêr’t minsken de steat fan dizze server sjen kinne wylst in steuring theme: Tema dy’t ôfmelde besikers en nije brûkers sjen. thumbnail: In ôfbylding fan ûngefear in ferhâlding fan 2:1 dy’t njonken jo serverynformaasje toand wurdt. - timeline_preview: Net oanmelde besikers kinne de meast resinte, op de server oanwêzige iepenbiere berjochten besjen. trendable_by_default: Hânmjittige beoardieling fan trends oerslaan. Yndividuele items kinne letter dochs noch ôfkard wurde. trends: Trends toane hokker berjochten, hashtags en nijsberjochten op jo server oan populariteit winne. trends_as_landing_page: Toan trending ynhâld oan ôfmelde brûkers en besikers yn stee fan in beskriuwing fan dizze server. Fereasket dat trends ynskeakele binne. @@ -295,7 +294,6 @@ fy: status_page_url: URL fan steatside theme: Standerttema thumbnail: Serverthumbnail - timeline_preview: Tagong ta de iepenbiere tiidlinen sûnder oan te melden tastean trendable_by_default: Trends goedkarre sûnder yn it foar geande beoardieling trends: Trends ynskeakelje trends_as_landing_page: Lit trends op de startside sjen diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index c7e143743d99aa..f9c06764511442 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -105,7 +105,6 @@ ga: status_page_url: URL leathanach inar féidir le daoine stádas an fhreastalaí seo a fheiceáil le linn briseadh amach theme: Téama a fheiceann cuairteoirí logáilte amach agus úsáideoirí nua. thumbnail: Íomhá thart ar 2:1 ar taispeáint taobh le faisnéis do fhreastalaí. - timeline_preview: Beidh cuairteoirí logáilte amach in ann na postálacha poiblí is déanaí atá ar fáil ar an bhfreastalaí a bhrabhsáil. trendable_by_default: Léim ar athbhreithniú láimhe ar ábhar treochta. Is féidir míreanna aonair a bhaint as treochtaí fós tar éis an fhíric. trends: Léiríonn treochtaí cé na postálacha, hashtags agus scéalta nuachta atá ag tarraingt ar do fhreastalaí. trends_as_landing_page: Taispeáin inneachar treochta d'úsáideoirí agus do chuairteoirí atá logáilte amach in ionad cur síos ar an bhfreastalaí seo. Éilíonn treochtaí a chumasú. @@ -287,12 +286,16 @@ ga: content_cache_retention_period: Tréimhse choinneála inneachair cianda custom_css: CSS saincheaptha favicon: Favicon + local_live_feed_access: Rochtain ar bheatha bheo ina bhfuil poist áitiúla + local_topic_feed_access: Rochtain ar fhothaí hashtag agus nasc ina bhfuil poist áitiúla mascot: Mascóg saincheaptha (oidhreacht) media_cache_retention_period: Tréimhse choinneála taisce meán min_age: Riachtanas aoise íosta peers_api_enabled: Foilsigh liosta de na freastalaithe aimsithe san API profile_directory: Cumasaigh eolaire próifíle registrations_mode: Cé atá in ann clárú + remote_live_feed_access: Rochtain ar bheatha bheo ina bhfuil poist iargúlta + remote_topic_feed_access: Rochtain ar fhothaí hashtag agus nasc ina bhfuil poist iargúlta require_invite_text: A cheangal ar chúis a bheith páirteach show_domain_blocks: Taispeáin bloic fearainn show_domain_blocks_rationale: Taispeáin cén fáth ar cuireadh bac ar fhearann @@ -305,7 +308,6 @@ ga: status_page_url: URL an leathanaigh stádais theme: Téama réamhshocraithe thumbnail: Mionsamhail freastalaí - timeline_preview: Ceadaigh rochtain neamhdheimhnithe ar amlínte poiblí trendable_by_default: Ceadaigh treochtaí gan athbhreithniú roimh ré trends: Cumasaigh treochtaí trends_as_landing_page: Úsáid treochtaí mar an leathanach tuirlingthe diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 2464955a43e5be..19a0a2a5586b64 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -105,7 +105,6 @@ gd: status_page_url: URL duilleige far am faicear staid an fhrithealaiche seo nuair a bhios e sìos theme: An t-ùrlar a chì na h-aoighean gun chlàradh a-staigh agus an luchd-cleachdaidh ùr. thumbnail: Dealbh mu 2:1 a thèid a shealltainn ri taobh fiosrachadh an fhrithealaiche agad. - timeline_preview: "’S urrainn dha na h-aoighean gun chlàradh a-staigh na postaichean poblach as ùire a tha ri fhaighinn air an fhrithealaiche a bhrabhsadh." trendable_by_default: Geàrr leum thar lèirmheas a làimh na susbainte a’ treandadh. Gabhaidh nithean fa leth a thoirt far nan treandaichean fhathast an uairsin. trends: Seallaidh na treandaichean na postaichean, tagaichean hais is naidheachdan a tha fèill mhòr orra air an fhrithealaiche agad. trends_as_landing_page: Seall susbaint a’ treandadh dhan fheadhainn nach do chlàraich a-steach is do dh’aoighean seach tuairisgeul an fhrithealaiche seo. Feumaidh treandaichean a bhith an comas airson sin. @@ -303,7 +302,6 @@ gd: status_page_url: URL duilleag na staide theme: An t-ùrlar bunaiteach thumbnail: Dealbhag an fhrithealaiche - timeline_preview: Ceadaich inntrigeadh gun ùghdarrachadh air na loidhnichean-ama phoblach trendable_by_default: Ceadaich treandaichean gun lèirmheas ro làimh trends: Cuir na treandaichean an comas trends_as_landing_page: Cleachd na treandaichean ’nan duilleag-laighe diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 3b4f72b1be4926..7c77d4aec9798d 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -105,7 +105,6 @@ gl: status_page_url: URL dunha páxina onde se pode ver o estado deste servidor cando non está a funcionar theme: Decorado que verán visitantes e novas usuarias. thumbnail: Imaxe con proporcións 2:1 mostrada xunto á información sobre o servidor. - timeline_preview: Visitantes e usuarias non conectadas poderán ver as publicacións públicas máis recentes do servidor. trendable_by_default: Omitir a revisión manual dos contidos populares. Poderás igualmente eliminar manualmente os elementos que vaian aparecendo. trends: As tendencias mostran publicacións, cancelos e novas historias que teñen popularidade no teu servidor. trends_as_landing_page: Mostrar contidos en voga para as persoas sen sesión iniciada e visitantes no lugar dunha descrición deste servidor. Require ter activado Popularidade. @@ -284,12 +283,16 @@ gl: content_cache_retention_period: Período de retención de contido remoto custom_css: CSS personalizado favicon: Favicon + local_live_feed_access: Acceso a cronoloxías ao vivo que mostran publicacións locais + local_topic_feed_access: Acceso a cronoloxías de ligazóns e cancelos que mostran publicacións locais mascot: Mascota propia (herdado) media_cache_retention_period: Período de retención da caché multimedia min_age: Idade mínima requerida peers_api_enabled: Publicar na API unha lista dos servidores descubertos profile_directory: Activar o directorio de perfís registrations_mode: Quen se pode rexistrar + remote_live_feed_access: Acceso a cronoloxías ao vivo que mostran publicacións remotas + remote_topic_feed_access: Acceso a cronoloxías de ligazóns e cancelos que mostran publicacións remotas require_invite_text: Pedir unha razón para unirse show_domain_blocks: Amosar dominios bloqueados show_domain_blocks_rationale: Explicar porque están bloqueados os dominios @@ -302,7 +305,6 @@ gl: status_page_url: URL da páxina do estado theme: Decorado predeterminado thumbnail: Icona do servidor - timeline_preview: Permitir acceso á cronoloxía pública sen autenticación trendable_by_default: Permitir tendencias sen aprobación previa trends: Activar tendencias trends_as_landing_page: Usar as tendencias como páxina de benvida diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index b96d98f60d74dd..53ba7c1e5e9f10 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -105,7 +105,6 @@ he: status_page_url: כתובת לבדיקת מצב שרת זה בעת תקלה theme: ערכת המראה שיראו משתמשים חדשים ומשתמשים שאינם מחוברים. thumbnail: תמונה ביחס 2:1 בערך שתוצג ליד המידע על השרת שלך. - timeline_preview: משתמשים מנותקים יוכלו לדפדף בהודעות ציר הזמן הציבורי שעל השרת. trendable_by_default: לדלג על בדיקה ידנית של התכנים החמים. פריטים ספציפיים עדיין ניתנים להסרה לאחר מעשה. trends: נושאים חמים יציגו אילו הודעות, תגיות וידיעות חדשות צוברות חשיפה על השרת שלך. trends_as_landing_page: הצג למבקרים ולמשתמשים שאינם מחוברים את הנושאים החמים במקום את תיאור השרת. מחייב הפעלה של אפשרות הנושאים החמים. @@ -286,12 +285,16 @@ he: content_cache_retention_period: תקופת השמירה על תוכן חיצוני custom_css: CSS בהתאמה אישית favicon: סמל מועדפים (Favicon) + local_live_feed_access: גישה לפידים חיים המציגים הודעות מקומיות + local_topic_feed_access: גישה לפידים של תגיות וקישורים המציגים הודעות מקומיות mascot: סמל השרת (ישן) media_cache_retention_period: תקופת שמירת מטמון מדיה min_age: דרישת גיל מינימלי peers_api_enabled: פרסם רשימה של שרתים שנתגלו באמצעות ה-API profile_directory: הפעלת ספריית פרופילים registrations_mode: מי יכולים לפתוח חשבון + remote_live_feed_access: גישה לפידים חיים המציגים הודעות מהעולם + remote_topic_feed_access: גישה לפידים של תגיות וקישורים המציגים הודעות מהעולם require_invite_text: לדרוש סיבה להצטרפות show_domain_blocks: הצגת חסימת דומיינים show_domain_blocks_rationale: הצגת סיבות חסימה למתחמים @@ -304,7 +307,6 @@ he: status_page_url: URL של עמוד סטטוס חיצוני theme: ערכת נושא ברירת מחדל thumbnail: תמונה ממוזערת מהשרת - timeline_preview: הרשאת גישה בלתי מאומתת לפיד הפומבי trendable_by_default: הרשאה לפריטים להופיע בנושאים החמים ללא אישור מוקדם trends: אפשר פריטים חמים (טרנדים) trends_as_landing_page: דף הנחיתה יהיה "נושאים חמים" diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index c4f0e2b6f68454..622fb0bbe9b019 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -105,7 +105,6 @@ hu: status_page_url: Annak az oldalnak az URL-je, melyen ennek a kiszolgálónak az állapotát látják az emberek egy leállás során theme: A téma, melyet a kijelentkezett látogatók és az új felhasználók látnak. thumbnail: Egy durván 2:1 arányú kép, amely a kiszolgálóinformációk mellett jelenik meg. - timeline_preview: A kijelentkezett látogatók továbbra is böngészhetik a kiszolgáló legfrissebb nyilvános bejegyzéseit. trendable_by_default: Kézi felülvizsgálat kihagyása a felkapott tartalmaknál. Az egyes elemek utólag távolíthatók el a trendek közül. trends: A trendek azt mondják meg, hogy mely bejegyzések, hashtagek és hírbejegyzések felkapottak a kiszolgálódon. trends_as_landing_page: Felkapott tartalmak mutatása a kijelentkezett felhasználók és látogatók számára ennek a kiszolgálónak a leírása helyett. Szükséges hozzá a trendek engedélyezése. @@ -284,12 +283,16 @@ hu: content_cache_retention_period: Távoli tartalmak megtartási időszaka custom_css: Egyéni CSS favicon: Könyvjelzőikon + local_live_feed_access: Helyi bejegyzéseket bemutató élő hírfolyamok elérése + local_topic_feed_access: Helyi bejegyzéseket bemutató hashtagek és hivatkozásfolyamok elérése mascot: Egyéni kabala (örökölt) media_cache_retention_period: Média-gyorsítótár megtartási időszaka min_age: Minimális korhatár peers_api_enabled: Felfedezett kiszolgálók listájának közzététele az API-ban profile_directory: Profiladatbázis engedélyezése registrations_mode: Ki regisztrálhat + remote_live_feed_access: Távoli bejegyzéseket bemutató élő hírfolyamok elérése + remote_topic_feed_access: Távoli bejegyzéseket bemutató hashtagek és hivatkozásfolyamok elérése require_invite_text: Indok megkövetelése a csatlakozáshoz show_domain_blocks: Domain tiltások megjelenitése show_domain_blocks_rationale: A domainek letiltási okainak megjelenítése @@ -302,7 +305,6 @@ hu: status_page_url: Állapotoldal URL-je theme: Alapértelmezett téma thumbnail: Kiszolgáló bélyegképe - timeline_preview: A nyilvános idővonalak hitelesítés nélküli elérésének engedélyezése trendable_by_default: Trendek engedélyezése előzetes ellenőrzés nélkül trends: Trendek engedélyezése trends_as_landing_page: Trendek használata nyitóoldalként diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 499d565f4f6414..57b382fe06528d 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -105,7 +105,6 @@ ia: status_page_url: URL de un pagina ubi le personas pote vider le stato de iste servitor durante un interruption theme: Thema que le visitatores disconnexe e le nove usatores vide. thumbnail: Un imagine de circa 2:1 monstrate al latere del informationes de tu servitor. - timeline_preview: Le visitatores foras de session potera percurrer le messages public le plus recente disponibile sur le servitor. trendable_by_default: Saltar le revision manual del contento de tendentia. Elementos singule pote ancora esser removite de tendentias post le facto. trends: Tendentias monstra que messages, hashtags e novas gania traction sur tu servitor. trends_as_landing_page: Monstrar contento de tendentia a usatores disconnexe e visitatores in vice que un description de iste servitor. Require tendentias esser activate. @@ -302,7 +301,6 @@ ia: status_page_url: URL del pagina de stato theme: Thema predefinite thumbnail: Miniatura de servitor - timeline_preview: Permitter accesso non authenticate a chronologias public trendable_by_default: Permitter tendentias sin revision previe trends: Activar tendentias trends_as_landing_page: Usar tendentias como pagina de destination diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 0413dafe36abb2..d89c610ddb536e 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -80,7 +80,6 @@ id: site_title: Bagaimana orang dapat memberitahu tentang server selain nama domain. theme: Tema yang dilihat oleh pengunjung yang keluar dan pengguna baru. thumbnail: Gambar sekitar 2:1 yang ditampilkan di samping informasi server Anda. - timeline_preview: Pengunjung yang keluar akan dapat menjelajahi kiriman publik terkini yang tersedia di server. trendable_by_default: Lewati tinjauan manual dari konten tren. Item individu masih dapat dihapus dari tren setelah faktanya. trends: Tren yang menampilkan kiriman, tagar, dan cerita berita apa yang sedang tren di server Anda. form_challenge: @@ -230,7 +229,6 @@ id: site_title: Nama server theme: Tema bawaan thumbnail: Gambar kecil server - timeline_preview: Perbolehkan akses tidak terotentikasi ke linimasa publik trendable_by_default: Perbolehkan tren tanpa tinjauan trends: Aktifkan tren interactions: diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index 24635c7f8320f6..ccb54501933104 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -97,7 +97,6 @@ ie: status_page_url: URL de un págine monstrant li statu de ti-ci servitor durant un ruptura de servicie theme: Li dessine quel ínregistrat visitantes e nov usatores vide. thumbnail: Un image de dimensiones circa 2:1 monstrat along tui servitor-information. - timeline_preview: Ínregistrat visitantes va posser vider li max recent public postas disponibil che li servitor. trendable_by_default: Pretersaltar un manual revision de contenete in tendentie. Mem pos to on posse remover índividual pezzes de tendentie. trends: Tendenties monstra quel postas, hashtags e novas es ganiant atention sur tui servitor. trends_as_landing_page: Monstrar populari contenete a ínregistrat visitantes vice un description del servitor. Besona que tendenties es activisat. @@ -261,7 +260,6 @@ ie: status_page_url: URL de statu-págine theme: Predefenit tema thumbnail: Miniatura del servitor - timeline_preview: Permisser accesse ínautenticat al public témpor-lineas trendable_by_default: Possibilisar tendenties sin priori inspection trends: Possibilisar tendenties trends_as_landing_page: Usar tendenties quam frontispicie diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index b0904353c1a85d..c3d4d1a0f582a9 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -100,7 +100,6 @@ io: status_page_url: URL di pagino ube personi povas vidar la stando di ca servilo kande la servilo ne funcionas theme: Temo quo videsas da ekirita vizitanti e nova uzanti. thumbnail: Cirkum 2:1 imajo montresar kun informo di ca servilo. - timeline_preview: Ekirita vizitanti videsos maxim recenta publika posti quo esas displonebla en la servilo. trendable_by_default: Ignorez manuala kontrolar di populara enhavajo. trends: Populari montras quala afishi, gretvorti e novaji populareskas en vua servilo. trends_as_landing_page: Montrez populara posti a uzanti neeniriti e vizitanti vice deskriptajo pri ca servilo. Bezonas ke populari es aktivita. @@ -280,7 +279,6 @@ io: status_page_url: URL dil stando-pagino theme: Originala temo thumbnail: Servilimajeto - timeline_preview: Permisez neyurizita aceso a publika tempolineo trendable_by_default: Permisez populari sen kontrolo trends: Ebligar populari trends_as_landing_page: Uzar populari quale la iniciala pagino diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index bbbba8c8f7aa8e..03d093fc6bff7f 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -105,7 +105,6 @@ is: status_page_url: Slóð á síðu þar sem fólk getur séð ástand netþjónsins þegar vandræði koma upp theme: Þema sem útskráðir gestir og nýjir notendur sjá. thumbnail: Mynd um það bil 2:1 sem birtist samhliða upplýsingum um netþjóninn þinn. - timeline_preview: Gestir sem ekki eru skráðir inn munu geta skoðað nýjustu opinberu færslurnar sem tiltækar eru á þjóninum. trendable_by_default: Sleppa handvirkri yfirferð á vinsælu efni. Áfram verður hægt að fjarlægja stök atriði úr vinsældarlistum. trends: Vinsældir sýna hvaða færslur, myllumerki og fréttasögur séu í umræðunni á netþjóninum þínum. trends_as_landing_page: Sýna vinsælt efni til ekki-innskráðra notenda í stað lýsingar á þessum netþjóni. Krefst þess að vinsældir efnis sé virkjað. @@ -284,12 +283,16 @@ is: content_cache_retention_period: Tímabil sem á að geyma fjartengt efni custom_css: Sérsniðið CSS favicon: Auðkennismynd + local_live_feed_access: Aðgangur að beinum streymum, þar með töldum staðværum færslum + local_topic_feed_access: Aðgangur að myllumerkjum og tengdum streymum, þar með töldum staðværum færslum mascot: Sérsniðið gæludýr (eldra) media_cache_retention_period: Tímalengd sem myndefni haldið min_age: Kröfur um lágmarksaldur peers_api_enabled: Birta lista yfir uppgötvaða netþjóna í API-kerfisviðmótinu profile_directory: Virkja notendamöppu registrations_mode: Hverjir geta nýskráð sig + remote_live_feed_access: Aðgangur að beinum streymum, þar með töldum fjartengdum færslum + remote_topic_feed_access: Aðgangur að myllumerkjum og tengdum streymum, þar með töldum fjartengdum færslum require_invite_text: Krefjast ástæðu fyrir þátttöku show_domain_blocks: Sýna útilokanir léna show_domain_blocks_rationale: Sýna af hverju lokað var á lén @@ -302,7 +305,6 @@ is: status_page_url: Slóð á ástandssíðu theme: Sjálfgefið þema thumbnail: Smámynd vefþjóns - timeline_preview: Leyfa óauðkenndan aðgang að opinberum tímalínum trendable_by_default: Leyfa vinsælt efni án undanfarandi yfirferðar trends: Virkja vinsælt trends_as_landing_page: Nota vinsælasta sem upphafssíðu diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 39587cd5e5028c..59d7924820ff0b 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -105,7 +105,6 @@ it: status_page_url: URL di una pagina in cui le persone possono visualizzare lo stato di questo server durante un disservizio theme: Tema visualizzato dai visitatori e dai nuovi utenti disconnessi. thumbnail: Un'immagine approssimativamente 2:1 visualizzata insieme alle informazioni del tuo server. - timeline_preview: I visitatori disconnessi potranno sfogliare i post pubblici più recenti disponibili sul server. trendable_by_default: Salta la revisione manuale dei contenuti di tendenza. I singoli elementi possono ancora essere rimossi dalle tendenze dopo il fatto. trends: Le tendenze mostrano quali post, hashtag e notizie stanno guadagnando popolarità sul tuo server. trends_as_landing_page: Mostra i contenuti di tendenza agli utenti disconnessi e ai visitatori, invece di una descrizione di questo server. Richiede l'abilitazione delle tendenze. @@ -302,7 +301,6 @@ it: status_page_url: URL della pagina di stato theme: Tema predefinito thumbnail: Miniatura del server - timeline_preview: Consenti l'accesso non autenticato alle timeline pubbliche trendable_by_default: Consenti le tendenze senza revisione preventiva trends: Abilita le tendenze trends_as_landing_page: Usa le tendenze come pagina di destinazione diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 23dec5b5489242..8ab0010397ed4f 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -136,7 +136,6 @@ ja: streaming_other_servers_emoji_reaction: 大量のデータが配信されるため、ネットワークの回線やサーバーの負荷をチェックしてください。サーバーの負荷が高い場合は一時的にチェックを外してみてください。 theme: ログインしていない人と新規ユーザーに表示されるテーマ。 thumbnail: サーバー情報と共に表示される、アスペクト比が約 2:1 の画像。 - timeline_preview: ログインしていないユーザーがサーバー上の最新の公開投稿を閲覧できるようにします。 trendable_by_default: トレンドの審査を省略します。トレンドは掲載後でも個別に除外できます。 trends: トレンドは、サーバー上で人気を集めている投稿、ハッシュタグ、ニュース記事などが表示されます。 trends_as_landing_page: ログインしていないユーザーに対して、サーバーの説明の代わりにトレンドコンテンツを表示します。トレンドを有効にする必要があります。 @@ -427,7 +426,6 @@ ja: streaming_other_servers_emoji_reaction: 他のサーバーのユーザーが他のサーバーの投稿につけた絵文字リアクションをストリーミングする theme: デフォルトテーマ thumbnail: サーバーのサムネイル - timeline_preview: 公開タイムラインへの未認証のアクセスを許可する trendable_by_default: 審査前のトレンドの掲載を許可する trends: トレンドを有効にする trends_as_landing_page: 新規登録画面にトレンドを表示する diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 4cca7676f7aef1..4b04631cb48227 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -103,7 +103,6 @@ ko: status_page_url: 이 서버가 중단된 동안 사람들이 서버의 상태를 볼 수 있는 페이지 URL theme: 로그인 하지 않은 사용자나 새로운 사용자가 보게 될 테마. thumbnail: 대략 2:1 비율의 이미지가 서버 정보 옆에 표시됩니다. - timeline_preview: 로그아웃 한 사용자들이 이 서버에 있는 최신 공개글들을 볼 수 있게 합니다. trendable_by_default: 유행하는 콘텐츠에 대한 수동 승인을 건너뜁니다. 이 설정이 적용된 이후에도 각각의 항목들을 삭제할 수 있습니다. trends: 트렌드는 어떤 게시물, 해시태그 그리고 뉴스 기사가 이 서버에서 인기를 끌고 있는지 보여줍니다. trends_as_landing_page: 로그아웃한 사용자와 방문자에게 서버 설명 대신 유행하는 내용을 보여줍니다. 유행 기능을 활성화해야 합니다. @@ -298,7 +297,6 @@ ko: status_page_url: 상태 페이지 URL theme: 기본 테마 thumbnail: 서버 썸네일 - timeline_preview: 로그인 하지 않고 공개 타임라인에 접근하는 것을 허용 trendable_by_default: 사전 리뷰 없이 트렌드에 오르는 것을 허용 trends: 유행 활성화 trends_as_landing_page: 유행을 방문 페이지로 쓰기 diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index b9111e3f64d2aa..1bd566d22dcbee 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -79,7 +79,6 @@ ku: site_title: Tu çawa dixwazî mirov qale rajekarê te bikin ji bilî navê navperê wî. theme: Rûkara ku mêvanên têneketî û bikarhênerên nû dibînin. thumbnail: Li kêleka zanyariyên rajekarê xwe wêneyeke 2:1 nîşan bide. - timeline_preview: Mêvanên têneketî wê karibin li şandiyên gelemperî yên herî dawî yên ku li ser rajekarê peyda dibin bigerin. trendable_by_default: Nirxandina destan a naveroka rojevê derbas bike. Tiştên kesane dîsa jî dikarin piştî rastiyê ji rojevê werin derxistin. trends: Rojev nîşan dide ka kîjan şandî, hashtag û çîrokê nûçeyan balê dikişîne li ser rajekarê te. form_challenge: @@ -229,7 +228,6 @@ ku: site_title: Navê rajekar theme: Rûkara berdest thumbnail: Wêneya piçûk a rajekar - timeline_preview: Mafê bide gihîştina ne naskirî bo demnameya gelemperî trendable_by_default: Mafê bide rojevê bêyî ku were nirxandin trends: Rojevê çalak bike interactions: diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index 08fefe240f011e..f11eb946e529b0 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -93,7 +93,6 @@ lad: status_page_url: Adreso URL de la pajina ande la djente puede ver el estado de este sirvidor durante una insidensya theme: El tema ke los vizitantes no enrejistrados i los muevos utilizadores ven. thumbnail: Una imaje de aproksimadamente 2:1 se amostra djunto a la enformasyon de tu sirvidor. - timeline_preview: Los vizitantes no konektados podran navigar por los mesajes publikos mas resientes desponivles en el sirvidor. trendable_by_default: Omite la revizyon manuala del kontenido en trend. Los elementos individuales ainda podran supremirse de los trendes. trends: Los trendes amostran ke mesajes, etiketas i haberes estan ganando traksyon en tu sirvidor. trends_as_landing_page: Amostra kontenido en trend para utilizadores i vizitantes en lugar de una deskripsyon de este sirvidor. Rekiere ke los trendes esten kapasitados. @@ -259,7 +258,6 @@ lad: status_page_url: URL de pajina de estado theme: Tema predeterminado thumbnail: Minyatura del sirvidor - timeline_preview: Permite el akseso no autentifikado a las linyas de tiempo publikas trendable_by_default: Permite trendes sin revizyon previa trends: Kapasita trendes trends_as_landing_page: Kulanea trendes komo la pajina prinsipala diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index 2b2f2df1365a9c..8eacc9685f270a 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -91,7 +91,6 @@ lt: site_contact_username: Kaip žmonės gali tave pasiekti Mastodon. site_extended_description: Bet kokia papildoma informacija, kuri gali būti naudinga lankytojams ir naudotojams. Gali būti struktūrizuota naudojant Markdown sintaksę. thumbnail: Maždaug 2:1 dydžio vaizdas, rodomas šalia tavo serverio informacijos. - timeline_preview: Atsijungę lankytojai galės naršyti naujausius viešus įrašus, esančius serveryje. trends: Trendai rodo, kurios įrašai, saitažodžiai ir naujienų istorijos tavo serveryje sulaukia didžiausio susidomėjimo. trends_as_landing_page: Rodyti tendencingą turinį atsijungusiems naudotojams ir lankytojams vietoj šio serverio aprašymo. Reikia, kad tendencijos būtų įjungtos. imports: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 6e7e57ffabe2e1..49ff578c31f1e5 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -57,9 +57,9 @@ lv: setting_aggregate_reblogs: Nerādīt jaunus izcēlumus ziņām, kas nesen tika palielinātas (ietekmē tikai nesen saņemtos palielinājumus) setting_always_send_emails: Parasti e-pasta paziņojumi netiek sūtīti, kad aktīvi izmantojat Mastodon setting_default_sensitive: Pēc noklusējuma jūtīgi informācijas nesēji ir paslēpti, un tos var atklāt ar klikšķi - setting_display_media_default: Paslēpt informācijas nesējus, kas atzīmēti kā jūtīgi - setting_display_media_hide_all: Vienmēr slēpt multividi - setting_display_media_show_all: Vienmēr rādīt multividi + setting_display_media_default: Paslēpt attēlus un video, kas atzīmēti kā jūtīgi + setting_display_media_hide_all: Vienmēr slēpt attēlus un video + setting_display_media_show_all: Vienmēr rādīt attēlus un video setting_system_scrollbars_ui: Attiecas tikai uz darbvirsmas pārlūkiem, kuru pamatā ir Safari vai Chrome setting_use_blurhash: Pāreju pamatā ir paslēpto uzskatāmo līdzekļu krāsas, bet saturs tiek padarīts neskaidrs setting_use_pending_items: Paslēpt laika skalas atjauninājumus aiz klikšķa, nevis ar automātisku plūsmas ritināšanu @@ -102,7 +102,6 @@ lv: status_page_url: Tās lapas URL, kurā lietotāji var redzēt šī servera statusu pārtraukuma laikā theme: Tēma, kuru redz apmeklētāji, kuri ir atteikušies, un jaunie lietotāji. thumbnail: Aptuveni 2:1 attēls, kas tiek parādīts kopā ar tava servera informāciju. - timeline_preview: Atteikušies apmeklētāji varēs pārlūkot jaunākos serverī pieejamos publiskos ierakstus. trendable_by_default: Izlaist aktuālā satura manuālu pārskatīšanu. Atsevišķas preces joprojām var noņemt no tendencēm pēc fakta. trends: Tendences parāda, kuras ziņas, atsauces un ziņu stāsti gūst panākumus tavā serverī. trends_as_landing_page: Šī servera apraksta vietā rādīt aktuālo saturu lietotājiem un apmeklētājiem, kuri ir atteikušies. Nepieciešams iespējot tendences. @@ -223,7 +222,7 @@ lv: setting_default_language: Publicēšanas valoda setting_default_quote_policy: Kas var citēt setting_default_sensitive: Vienmēr atzīmēt informācijas nesējus kā jūtīgus - setting_delete_modal: Parādīt apstiprinājuma dialogu pirms ziņas dzēšanas + setting_delete_modal: Rādīt apstiprinājuma dialogu pirms ziņas dzēšanas setting_disable_hover_cards: Atspējot profila priekšskatījumu pēc kursora novietošanas setting_disable_swiping: Atspējot vilkšanas kustības setting_display_media: Multivides rādīšana @@ -232,13 +231,13 @@ lv: setting_display_media_show_all: Parādīt visu setting_expand_spoilers: Vienmēr izvērst ziņas, kas apzīmētas ar brīdinājumiem par saturu setting_hide_network: Slēpt savu sociālo grafu - setting_missing_alt_text_modal: Rādīt apstiprināšanas lodziņu pirms informācijas nesēju bez aprakstošā teksta iesūtīšanas + setting_missing_alt_text_modal: Rādīt apstiprināšanas lodziņu pirms iesūtīt attēlus vai video bez aprakstošā teksta setting_reduce_motion: Ierobežot kustību animācijās setting_system_font_ui: Lietot sistēmas noklusējuma fontu setting_system_scrollbars_ui: Lietot sistēmas noklusējuma ritjoslu setting_theme: Vietnes motīvs setting_trends: Parādīt šodienas tendences - setting_unfollow_modal: Parādīt apstiprinājuma dialogu pirms pārtraukt kādam sekot + setting_unfollow_modal: Rādīt apstiprinājuma dialogu pirms pārtraukt kādam sekot setting_use_blurhash: Rādīt krāsainas pārejas paslēptajiem informācijas nesējiem setting_use_pending_items: Lēnais režīms severity: Smagums @@ -254,7 +253,7 @@ lv: name: Tēmturis filters: actions: - blur: Paslēpt informācijas nesējus ar brīdinājumu + blur: Paslēpt attēlus un video ar brīdinājumu hide: Paslēpt pilnībā warn: Paslēpt ar brīdinājumu form_admin_settings: @@ -284,7 +283,6 @@ lv: status_page_url: Statusa lapas URL theme: Noklusētā tēma thumbnail: Servera sīkbilde - timeline_preview: Atļaut neautentificētu piekļuvi publiskajām ziņu lentām trendable_by_default: Atļaut tendences bez iepriekšējas pārskatīšanas trends: Iespējot tendences trends_as_landing_page: Izmantojiet tendences kā galveno lapu diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml index 6c45240781421c..478d10a5b94a51 100644 --- a/config/locales/simple_form.ms.yml +++ b/config/locales/simple_form.ms.yml @@ -91,7 +91,6 @@ ms: status_page_url: URL halaman yang membolehkan orang ramai melihat status server ini semasa gangguan theme: Tema yang pelawat log keluar dan pengguna baharu lihat. thumbnail: Imej kira-kira 2:1 dipaparkan bersama maklumat server anda. - timeline_preview: Pelawat yang log keluar akan dapat menyemak imbas siaran awam terkini yang tersedia pada server. trendable_by_default: Langkau semakan manual kandungan sohor kini. Item individu masih boleh dialih keluar daripada trend selepas fakta itu. trends: Aliran menunjukkan pos, hashtag dan cerita berita yang mendapat tarikan pada server anda. trends_as_landing_page: Tunjukkan kandungan trend kepada pengguna dan pelawat yang log keluar dan bukannya penerangan tentang server ini. Memerlukan trend untuk didayakan. @@ -256,7 +255,6 @@ ms: status_page_url: URL halaman status theme: Tema asal thumbnail: Server thumbnail - timeline_preview: Benarkan akses tidak disahkan kepada garis masa awam trendable_by_default: Benarkan aliran tanpa semakan terlebih dahulu trends: Dayakan trend trends_as_landing_page: Gunakan trend sebagai halaman pendaratan diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index 283acbd76d65d9..fe8c476ea090ea 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -90,7 +90,6 @@ my: status_page_url: ပြတ်တောက်နေစဉ်အတွင်း လူများက ဤဆာဗာအခြေအနေကို မြင်နိုင်မည့် စာမျက်နှာ URL theme: အကောင့်မှထွက်ပြီး အသုံးပြုသူအသစ်များနှင့် ဝင်ကြည့်မည့်သူများအတွက် မြင်ရမည့်ပုံစံ။ thumbnail: သင့်ဆာဗာအချက်အလက်နှင့်အတူ အကြမ်းဖျင်းအားဖြင့် ၂:၁ ဖြင့် ပြသထားသောပုံတစ်ပုံ။ - timeline_preview: အကောင့်မှထွက်ထားသူများသည် ဆာဗာပေါ်ရှိ လတ်တလော အများမြင်ပို့စ်များကို ရှာဖွေကြည့်ရှုနိုင်မည်ဖြစ်သည်။ trendable_by_default: ခေတ်စားနေသော အကြောင်းအရာများ၏ ကိုယ်တိုင်သုံးသပ်ချက်ကို ကျော်ပါ။ နောက်ပိုင်းတွင် အချက်အလက်တစ်ခုချင်းစီကို ခေတ်စားနေသောအကြောင်းအရာများကဏ္ဍမှ ဖယ်ရှားနိုင်ပါသေးသည်။ trends: လက်ရှိခေတ်စားနေသာပို့စ်များ၊ hashtag များနှင့် သတင်းဇာတ်လမ်းများကို သင့်ဆာဗာပေါ်တွင် တွေ့မြင်နိုင်ပါမည်။ trends_as_landing_page: ဤဆာဗာဖော်ပြချက်အစား အကောင့်မှ ထွက်ထားသူများနှင့် ဝင်ရောက်ကြည့်ရှုသူများအတွက် ခေတ်စားနေသော အကြောင်းအရာများကို ပြသပါ။ ခေတ်စားနေသောပို့စ်များကို ဖွင့်ထားရန် လိုအပ်သည်။ @@ -252,7 +251,6 @@ my: status_page_url: အခြေအနေပြစာမျက်နှာ URL theme: မူလသတ်မှတ်ထားသည့် အပြင်အဆင် thumbnail: ဆာဗာ ပုံသေး - timeline_preview: အများမြင်စာမျက်နှာများသို့ အထောက်အထားမရှိဘဲ ဝင်ရောက်ခွင့်ပြုပါ trendable_by_default: ကြိုမသုံးသပ်ဘဲ ခေတ်စားနေသောအကြောင်းအရာများကို ခွင့်ပြုပါ trends: လက်ရှိခေတ်စားနေမှုများကိုပြပါ trends_as_landing_page: ခေတ်စားနေသောပို့စ်များကို landing စာမျက်နှာအဖြစ် အသုံးပြုပါ diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 16fb62a11ea29a..22e0f3fa70f433 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -105,7 +105,6 @@ nl: status_page_url: URL van een pagina waar mensen de status van deze server kunnen zien tijdens een storing theme: Thema die (niet ingelogde) bezoekers en nieuwe gebruikers zien. thumbnail: Een afbeelding van ongeveer een verhouding van 2:1 die naast jouw serverinformatie wordt getoond. - timeline_preview: Bezoekers (die niet zijn ingelogd) kunnen de meest recente, op de server aanwezige openbare berichten bekijken. trendable_by_default: Handmatige beoordeling van trends overslaan. Individuele items kunnen later alsnog worden afgekeurd. trends: Trends laten zien welke berichten, hashtags en nieuwsberichten op jouw server aan populariteit winnen. trends_as_landing_page: Toon trending inhoud aan uitgelogde gebruikers en bezoekers in plaats van een beschrijving van deze server. Vereist dat trends zijn ingeschakeld. @@ -284,12 +283,16 @@ nl: content_cache_retention_period: Bewaartermijn voor externe inhoud custom_css: Aangepaste CSS favicon: Favicon + local_live_feed_access: Toegang tot openbare lokale berichten + local_topic_feed_access: Toegang tot overzicht met lokale hashtags en links mascot: Aangepaste mascotte (legacy) media_cache_retention_period: Bewaartermijn mediacache min_age: Vereiste minimumleeftijd peers_api_enabled: Lijst van bekende servers via de API publiceren profile_directory: Gebruikersgids inschakelen registrations_mode: Wie kan zich registreren + remote_live_feed_access: Toegang tot openbare berichten van andere servers + remote_topic_feed_access: Toegang tot overzicht met hashtags en links van andere servers require_invite_text: Opgeven van een reden is verplicht show_domain_blocks: Domeinblokkades tonen show_domain_blocks_rationale: Redenen voor domeinblokkades tonen @@ -302,7 +305,6 @@ nl: status_page_url: URL van statuspagina theme: Standaardthema thumbnail: Server-miniatuur - timeline_preview: Toegang tot de openbare tijdlijnen zonder in te loggen toestaan trendable_by_default: Trends goedkeuren zonder voorafgaande beoordeling trends: Trends inschakelen trends_as_landing_page: Laat trends op de startpagina zien diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 3e6982f14010e7..b80f90adb46855 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -105,7 +105,6 @@ nn: status_page_url: Adressa til ei side der folk kan sjå statusen til denne tenaren ved feil og utkoplingar theme: Tema som er synleg for nye brukarar og besøkjande som ikkje er logga inn. thumbnail: Eit omlag 2:1 bilete vist saman med informasjon om tenaren. - timeline_preview: Besøkjande som ikkje er logga inn vil kunne bla gjennom dei siste offentlege innlegga på tenaren. trendable_by_default: Hopp over manuell gjennomgang av populært innhald. Enkeltståande innlegg kan fjernast frå trendar i etterkant. trends: Trendar viser kva for nokre innlegg, emneknaggar og nyheiter som er populære på tenaren. trends_as_landing_page: Vis populært innhald til utlogga brukarar og folk som kjem innom sida i staden for ei skildring av tenaren. Du må ha skrudd på trendar for å kunna bruka dette. @@ -302,7 +301,6 @@ nn: status_page_url: Adresse til statussida theme: Standardtema thumbnail: Miniatyrbilete for tenaren - timeline_preview: Tillat uautentisert tilgang til offentleg tidsline trendable_by_default: Tillat trendar utan gjennomgang på førehand trends: Aktiver trendar trends_as_landing_page: Bruk trendar som startside diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index cd92a269b1a044..747cf2f3b85ed4 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -92,7 +92,6 @@ status_page_url: URL-adressen til en side hvor folk kan se tilstanden til denne tjeneren under et avbrudd theme: Tema som vises for nye brukere og besøkende som ikke er logget inn. thumbnail: Et omtrent 2:1 bilde vist sammen med serverinformasjonen din. - timeline_preview: Logget ut besøkende vil kunne bla gjennom de siste offentlige innlegg tilgjengelig på serveren. trendable_by_default: Hopp over manuell gjennomgang av populære innhold. Individuelle elementer kan fjernes fra populært etter faktaen. trends: Trender viser hvilke innlegg, emneknagger og nyheter som får trekkraft på serveren din. trends_as_landing_page: Vis populære innhold til innloggede brukere og besøkende i stedet for en beskrivelse av tjeneren. Krever populært for å bli aktivert. @@ -255,7 +254,6 @@ status_page_url: Status side lenke theme: Standard tema thumbnail: Miniatyrbilde til server - timeline_preview: Tillat uautentisert tilgang til offentlige tidslinjer trendable_by_default: Tillat trender uten foregående vurdering trends: Aktiver trender trends_as_landing_page: Bruk trender som landingsside diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 2eb7c58f544c75..26c310068e915e 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -180,7 +180,6 @@ oc: site_title: Nom del servidor theme: Tèma per defaut thumbnail: Miniatura del servidor - timeline_preview: Permtre l’accès a l’apercebut del flux public sens autentificacion trendable_by_default: Activar las tendéncias sens revision prealabla trends: Activar las tendéncias interactions: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index da7a8e25e54b16..07196019bd547e 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -103,7 +103,6 @@ pl: status_page_url: Adres URL strony, na której odwiedzający mogą zobaczyć status tego serwera w trakcie awarii theme: Motyw, który widzą wylogowani i nowi użytkownicy. thumbnail: Obraz o proporcjach mniej więcej 2:1 wyświetlany obok informacji o serwerze. - timeline_preview: Wylogowani użytkownicy będą mogli przeglądać najnowsze publiczne wpisy dostępne na serwerze. trendable_by_default: Pomiń ręczny przegląd treści trendów. Pojedyncze elementy nadal mogą być usuwane z trendów po fakcie. trends: Tendencje pokazują, które posty, hasztagi i newsy zyskują popularność na Twoim serwerze. trends_as_landing_page: Pokaż najpopularniejsze treści niezalogowanym użytkownikom i odwiedzającym zamiast opisu tego serwera. Wymaga włączenia trendów. @@ -301,7 +300,6 @@ pl: status_page_url: Adres URL strony statusu theme: Domyślny motyw thumbnail: Miniaturka serwera - timeline_preview: Zezwalaj na nieuwierzytelniony dostęp do publicznych osi czasu trendable_by_default: Zezwalaj na trendy bez wcześniejszego przeglądu trends: Włącz trendy trends_as_landing_page: Użyj trendów jako strony początkowej diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index fc8d90a86a9087..2aa15652d34ebc 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -103,7 +103,6 @@ pt-BR: status_page_url: URL de uma página onde as pessoas podem ver o status deste servidor durante uma interrupção theme: Tema que visitantes e novos usuários veem. thumbnail: Uma imagem de aproximadamente 2:1 exibida ao lado da informação de sua instância. - timeline_preview: Visitantes conseguirão navegar pelas postagens públicas mais recentes disponíveis na instância. trendable_by_default: Pular a revisão manual do conteúdo em tendência. Itens individuais ainda poderão ser removidos das tendências após a sua exibição. trends: Tendências mostram quais publicações, hashtags e notícias estão ganhando destaque na sua instância. trends_as_landing_page: Mostrar conteúdo de tendências para usuários deslogados e visitantes em vez de uma descrição deste servidor. Requer que as tendências sejam ativadas. @@ -300,7 +299,6 @@ pt-BR: status_page_url: Endereço da página de status theme: Tema padrão thumbnail: Miniatura do servidor - timeline_preview: Permitir acesso não autenticado às linhas do tempo públicas trendable_by_default: Permitir tendências sem revisão prévia trends: Habilitar tendências trends_as_landing_page: Usar tendências como página inicial diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 4e5fa12c041ed8..3214690dcd6ef9 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -105,7 +105,6 @@ pt-PT: status_page_url: URL de uma página onde as pessoas podem ver o estado deste servidor durante uma interrupção theme: Tema que os visitantes e os novos utilizadores veem. thumbnail: Uma imagem de cerca de 2:1, apresentada ao lado da informação do seu servidor. - timeline_preview: Os visitantes sem sessão iniciada poderão consultar as publicações públicas mais recentes disponíveis no servidor. trendable_by_default: Ignorar a revisão manual do conteúdo em destaque. Os itens individuais poderão ainda assim ser posteriormente removidos das tendências. trends: As tendências mostram quais as publicações, etiquetas e notícias que estão a ganhar destaque no seu servidor. trends_as_landing_page: Mostrar conteúdo em destaque a utilizadores sem sessão iniciada e visitantes, ao invés de uma descrição deste servidor. Requer que os destaques estejam ativados. @@ -302,7 +301,6 @@ pt-PT: status_page_url: URL da página de estado theme: Tema predefinido thumbnail: Miniatura do servidor - timeline_preview: Permitir acesso não autenticado às cronologias públicas trendable_by_default: Permitir tendências sem revisão prévia trends: Ativar destaques trends_as_landing_page: Usar destaques como página de apresentação diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index ae8e2e065c3f17..3dc6380b6bf8cc 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -98,7 +98,6 @@ ro: status_page_url: URL-ul unei pagini unde oamenii pot vedea starea acestui server în timpul unei întreruperi theme: Tema pe care vizitatorii deconectați și utilizatorii noi o văd. thumbnail: O imagine de aproximativ 2:1 afișată alături de informațiile serverului dvs. - timeline_preview: Vizitatorii deconectați vor putea să răsfoiască cele mai recente postări publice disponibile pe server. trendable_by_default: Omiteți revizuirea manuală a conținutului în tendințe. Elementele individuale pot fi în continuare eliminate din tendințe după fapt. trends: Tendințele arată ce postări, hashtag-uri și știri câștigă teren pe serverul dvs. trends_as_landing_page: Afișați conținut în tendințe utilizatorilor deconectați și vizitatorilor în loc de o descriere a acestui server. Necesită ca tendințele să fie activate. diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index cf59942e7fb732..c38b545af0b1ea 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -102,7 +102,6 @@ ru: status_page_url: URL страницы, на которой люди могут видеть статус этого сервера во время отключения theme: Тема, которую видят вышедшие из системы посетители и новые пользователи. thumbnail: Изображение примерно 2:1, отображаемое рядом с информацией о вашем сервере. - timeline_preview: Посетители, вышедшие из системы, смогут просматривать последние публичные сообщения, имеющиеся на сервере. trendable_by_default: Пропустить ручной просмотр трендового контента. Отдельные элементы могут быть удалены из трендов уже постфактум. trends: Тренды показывают, какие посты, хэштеги и новостные истории набирают обороты на вашем сервере. trends_as_landing_page: Показывать популярный контент для выходов пользователей и посетителей, а не для описания этого сервера. Требует включения тенденций. @@ -296,7 +295,6 @@ ru: status_page_url: Страница уведомлений theme: Тема по умолчанию thumbnail: Изображение сервера - timeline_preview: Разрешить доступ к публичным лентам без авторизации trendable_by_default: Разрешить треды без предварительной проверки trends: Включить тренды trends_as_landing_page: Использовать тенденции в качестве целевой страницы diff --git a/config/locales/simple_form.sco.yml b/config/locales/simple_form.sco.yml index 1a08061dcc14f8..6a22045fbd624f 100644 --- a/config/locales/simple_form.sco.yml +++ b/config/locales/simple_form.sco.yml @@ -77,7 +77,6 @@ sco: site_title: Hou fowk kin refer tae yer server asides its domain nemm. theme: Theme thit logged oot visitors an new uisers see. thumbnail: A rochly 2:1 image displayit alangsides yer server information. - timeline_preview: Logged oot visitors wull be able tae broose the maist recent public posts available on the server. trendable_by_default: Jouk the review bi haun o trendin content. Individual items kin stull get taen aff trends efter the fact. trends: Trends shaw whit posts, hashtags an news stories is gettin traction on yer server. form_challenge: @@ -227,7 +226,6 @@ sco: site_title: Server nemm theme: Defaut theme thumbnail: Server thoomnail - timeline_preview: Alloo unauthenticated access tae public timelines trendable_by_default: Alloo trends athoot prior review trends: Turn on trends interactions: diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index 8aac332bf22f43..6c47c4005e94a3 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -102,7 +102,6 @@ si: status_page_url: ඇනහිටීමක් අතරතුර මෙම සේවාදායකයේ තත්ත්වය මිනිසුන්ට දැකිය හැකි පිටුවක URL එක theme: අමුත්තන් ලොග් අවුට් කළ සහ නව පරිශීලකයින් දකින තේමාව. thumbnail: ඔබගේ සේවාදායක තොරතුරු සමඟ ආසන්න වශයෙන් 2:1 රූපයක් දර්ශනය වේ. - timeline_preview: ලොග් අවුට් වූ අමුත්තන්ට සේවාදායකයේ ඇති නවතම පොදු සටහන් බ්‍රවුස් කිරීමට හැකි වනු ඇත. trendable_by_default: ප්‍රවණතා අන්තර්ගතයන් අතින් සමාලෝචනය කිරීම මඟ හරින්න. කාරණයෙන් පසුවත් තනි අයිතම ප්‍රවණතා වලින් ඉවත් කළ හැකිය. trends: ප්‍රවණතා මඟින් ඔබේ සේවාදායකයේ ආකර්ෂණය ලබා ගන්නා පළ කිරීම්, හැෂ් ටැග් සහ ප්‍රවෘත්ති කථා පෙන්වයි. trends_as_landing_page: මෙම සේවාදායකයේ විස්තරයක් වෙනුවට පිටව ගිය පරිශීලකයින්ට සහ අමුත්තන්ට ප්‍රවණතා අන්තර්ගතය පෙන්වන්න. ප්‍රවණතා සක්‍රීය කිරීම අවශ්‍ය වේ. @@ -290,7 +289,6 @@ si: status_page_url: තත්ව පිටු URL එක theme: පෙරනිමි තේමාව thumbnail: සේවාදායක සිඟිති රුව - timeline_preview: පොදු කාලරේඛා වෙත සත්‍යාපනය නොකළ ප්‍රවේශයට ඉඩ දෙන්න. trendable_by_default: පූර්ව සමාලෝචනයකින් තොරව ප්‍රවණතා වලට ඉඩ දෙන්න. trends: ප්‍රවණතා සක්‍රීය කරන්න trends_as_landing_page: ගොඩබෑමේ පිටුව ලෙස ප්‍රවණතා භාවිතා කරන්න diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index b6896c73e18a61..7db8fa67e24711 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -2,12 +2,21 @@ sk: simple_form: hints: + account: + attribution_domains: Jeden na riadok. Chráni vás pred falošným pripisovaním autorstva. + discoverable: Vaše verejné príspevky a profil môžu byť zobrazované a odporúčané v rôznych častiach Mastodonu a váš profil môže byť navrhovaný ostatným. + display_name: Vaše meno a priezvisko alebo prezývka. + fields: Váš web, zámená, vek, čokoľvek, čo chcete o sebe uviesť. + indexable: Vaše verejné príspevky sa môžu zobrazovať vo výsledkoch vyhľadávania na Mastodone. Ľudia, ktorí s nimi interagovali, ich môžu nájsť vždy. + note: 'Môžete @označiť iných ľudí alebo #hashtagy.' + show_collections: Ľudia si budú môcť prezrieť, ktoré účty sledujete a ktoré účty sledujú vás. Ľudia, ktorých sledujete, o tom budú vždy vedieť. + unlocked: Ľudia vás budú môcť sledovať bez vášho schválenia. Zrušenie vám dá možnosť kontrolovať žiadosti o sledovanie a rozhodovať sa o prijímaní alebo zamietaní nových sledujúcich. account_alias: acct: Urči prezyvku@domenu účtu, s ktorého sa chceš presunúť account_migration: acct: Urči prezyvku@domenu účtu, na ktorý sa chceš presunúť account_warning_preset: - text: Môžeš používať rovnakú syntaxiu ako v rámci príspevkov, čiže URL, haštagy, a spomenutia + text: Môžete používať syntax príspevk, ako sú adresy URL, hashtagy a označenia admin_account_action: include_statuses: Užívateľ uvidí, ktoré príspevky majú za následok moderačný zásah, alebo upozornenie send_email_notification: Užívateľ dostane vysvetlenie ohľadom toho, čo sa stalo s ich účtom @@ -17,29 +26,37 @@ sk: defaults: autofollow: Ľudia ktorí sa zaregistrujú prostredníctvom pozvánky, ťa budú inheď nasledovať avatar: WEBP, PNG, GIF, alebo JPG. Najviac %{size}. Bude zmenšený na %{dimensions}px - bot: Tento účet vykonáva hlavne automatizované akcie, a je pravdepodobne nespravovaný + bot: Tento účet vykonáva hlavne automatizované akcie a je pravdepodobne nespravovaný context: Jedno, alebo viac kritérií, v ktorých má byť filtrovanie uplatnené current_password: Z bezpečtnostných dôvodov prosím zadaj heslo súčasného účtu current_username: Pre potvrdenie prosím zadaj prezývku súčasného účtu digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak si obdržal/a nejaké osobné správy kým si bol/a preč - email: Bude ti odoslaný potvrdzujúci email + email: Odošleme vám potvrdzujúci e-mail header: WEBP, PNG, GIF, alebo JPG. Najviac %{size}. Bude zmenšený na %{dimensions}px inbox_url: Skopíruj adresu z hlavnej stránky mostíka, ktorý chceš používať - irreversible: Vytriedené príspevky zmiznú nenávratne, aj keď triedenie neskôr zrušíš - locale: Jazyk užívateľského rozhrania, emailových, a nástenkových oboznámení - password: Zadaj aspoň osem znakov + irreversible: Filtrované príspevky nenávratne zmiznú, aj keď filter neskôr zrušíte + locale: Jazyk používateľského rozhrania, e-mailových a push upozornení + password: Heslo musí obsahovať aspoň 8 znakov phrase: Zhoda sa nájde nezávisle od toho, či je text napísaný, veľkými, alebo malými písmenami, či už v tele, alebo v hlavičke scopes: Ktoré API budú povolené aplikácii pre prístup. Ak vyberieš vrcholný stupeň, nemusíš už potom vyberať po jednom. - setting_aggregate_reblogs: Nezobrazuj nové vyzdvihnutia pre príspevky, ktoré už boli len nedávno povýšené (týka sa iba nanovo získaných povýšení) - setting_default_sensitive: Chúlostivé médiá sú štandardne ukryté, a môžu byť zobrazené kliknutím - setting_display_media_default: Ukry médiá označené ako chúlostivé - setting_display_media_hide_all: Vždy ukry všetky médiá - setting_display_media_show_all: Vždy zobrazuj médiá - setting_use_blurhash: Prechody sú založené na farbách skrytých vizuálov, ale zahaľujú akékoľvek podrobnosti - setting_use_pending_items: Skry aktualizovanie časovej osi tak, aby bola načitávaná iba po kliknutí, namiesto samostatného posúvania + setting_aggregate_reblogs: Nezobrazovať nové zdieľania pre nedávno zdieľané príspevky (týka sa iba nových zdieľaní) + setting_always_send_emails: Pri bežnom používaní Mastodonu nebudete dostávať e-mailové upozornenia + setting_default_sensitive: Citlivé médiá sú predvolene ukryté a môžu byť zobrazené kliknutím + setting_display_media_default: Skrývať médiá označené ako citlivé + setting_display_media_hide_all: Vždy skrývať médiá + setting_display_media_show_all: Vždy zobrazovať médiá + setting_system_scrollbars_ui: Platí len pre počítačové prehliadače využívajúce technológiu Chrome alebo Safari + setting_use_blurhash: Prechody sú založené na farbách skrytých vizuálov, ale skrývajú akékoľvek podrobnosti + setting_use_pending_items: Časová os bude aktualizovaná až po kliknutí, feed sa nebúde posúvať automaticky whole_word: Ak je kľúčové slovo, alebo fráza poskladaná iba s písmen a čísel, bude použité iba ak sa zhoduje s celým výrazom domain_allow: domain: Táto doména bude schopná získavať dáta z tohto servera, a prichádzajúce dáta ním budú spracovávané a uložené + featured_tag: + name: 'Nedávno ste použili napríklad tieto hashtagy:' + form_admin_settings: + site_contact_email: Spôsob, ako vás môžu ľudia kontaktovať pre právne účely alebo podporu. + site_contact_username: Ako vás môžu ľudia na Mastodone nájsť. + thumbnail: 'Obrázok v pomere približne 2 : 1, ktorý sa zobrazí pri informáciách o serveri.' form_challenge: current_password: Vstupuješ do zabezpečenej časti imports: @@ -51,16 +68,23 @@ sk: sign_up_block: Nové registrácie nebudú možné sessions: otp: 'Napíš sem dvoj-faktorový kód z telefónu, alebo použi jeden z tvojích obnovovacích kódov:' + settings: + indexable: Váš profil sa môže zobraziť vo výsledkoch vyhľadávania cez Google, Bing a ďalšie. + show_application: Tebe sa táto informácia zobrazí vždy. tag: name: Zmeniť môžeš iba veľkosť písmen, napríklad aby boli ľahšie čítateľné user: - chosen_languages: Keď je zaškrtnuté, vo verejnej osi budú zobrazené iba príspevky vo vybraných jazykoch + chosen_languages: Po zaškrtnutí budú na verejných časových osiach zobrazované iba príspevky vo vybraných jazykoch labels: account: + attribution_domains: Weby, ktoré vám môžu pripisovať autorstvo + discoverable: Zobrazovať profil a príspevky v objavovacích algoritmoch fields: - name: Označenie - value: Obsah - unlocked: Automaticky prijímaj nových nasledovateľov + name: Definícia + value: Hodnota + indexable: Zobrazovať verejné príspevky vo vyhľadávaní + show_collections: Zobrazovať v profile sledované a sledujúce účty + unlocked: Automaticky schvaľovať nové sledovania account_alias: acct: Adresa starého účtu account_migration: @@ -77,7 +101,7 @@ sk: disable: Deaktivuj none: Neurob nič silence: Utíš - suspend: Vylúč a nenávratne vymaž dáta na účte + suspend: Vylúčiť warning_preset_id: Použi varovnú predlohu announcement: all_day: Celodenná udalosť @@ -86,19 +110,19 @@ sk: text: Oboznámenie defaults: autofollow: Pozvi k následovaniu tvojho profilu - avatar: Maskot + avatar: Profilová fotka bot: Toto je automatizovaný bot účet - chosen_languages: Filtruj jazyky - confirm_new_password: Znovu tvoje nové heslo, pre potvrdenie + chosen_languages: Filtrovanie jazykov + confirm_new_password: Overenie nového hesla confirm_password: Over heslo - context: Triedenie kontextov + context: Kontexty filtra current_password: Súčasné heslo data: Dáta display_name: Zobrazované meno - email: Emailová adresa + email: E-mailová adresa expires_in: Expiruj po fields: Metadáta profilu - header: Obrázok v hlavičke + header: Obrázok v záhlaví inbox_url: URL adresa prechodnej schránky irreversible: Zahoď, namiesto ukrytia locale: Jazyk rozhrania @@ -108,25 +132,31 @@ sk: otp_attempt: Dvoj-faktorový overovací kód password: Heslo phrase: Kľúčové slovo, alebo fráza - setting_advanced_layout: Zapni pokročilé užívateľské rozhranie - setting_aggregate_reblogs: Zoskupuj vyzdvihnutia v časovej osi - setting_auto_play_gif: Automaticky prehrávaj animované GIFy - setting_boost_modal: Zobrazuj potvrdzovacie okno pred povýšením - setting_default_language: Píšeš v jazyku - setting_default_sensitive: Označ všetky mediálne súbory ako chúlostivé - setting_delete_modal: Zobrazuj potvrdzovacie okno pred vymazaním toot-u + setting_advanced_layout: Zapnúť pokročilé používateľské rozhranie + setting_aggregate_reblogs: Zoskupovať zdieľania na časových osiach + setting_always_send_emails: Vždy posielať e-mailové upozornenia + setting_auto_play_gif: Automaticky prehrávať animácie GIF + setting_boost_modal: Zobrazovať potvrdzovacie okno pred zdieľaním + setting_default_language: Jazyk príspevkov + setting_default_quote_policy: Kto vás môže citovať + setting_default_sensitive: Vždy označovať médiá ako citlivé + setting_delete_modal: Zobrazovať potvrdzovacie okno pred vymazaním príspevku + setting_disable_hover_cards: Vypnúť náhľady profilov pri ukázaní kurzorom + setting_disable_swiping: Vypnúť gestá posúvaním setting_display_media: Zobrazovanie médií setting_display_media_default: Štandard setting_display_media_hide_all: Ukry všetky setting_display_media_show_all: Ukáž všetky - setting_expand_spoilers: Stále rozbaľ príspevky označené varovaním o chúlostivom obsahu + setting_expand_spoilers: Stále rozbaľovať príspevky označené varovaním o obsahu setting_hide_network: Ukry svoju sieť kontaktov - setting_reduce_motion: Mierni pohyb pri animáciách - setting_system_font_ui: Použi základné systémové písmo + setting_missing_alt_text_modal: Zobrazovať potvrdzovacie okno pred uverejnením média bez opisu + setting_reduce_motion: Stlmiť animácie + setting_system_font_ui: Používať predvolené písmo systému + setting_system_scrollbars_ui: Používať predvolený posuvník systému setting_theme: Vzhľad webu - setting_trends: Ukáž dnešné trendy + setting_trends: Zobrazovať dnešné trendy setting_unfollow_modal: Vyžaduj potvrdenie pred tým, než niekoho prestaneš sledovať - setting_use_blurhash: Ukáž farebné prechody pre skryté médiá + setting_use_blurhash: Zobrazovať farebné prechody skrytých médií setting_use_pending_items: Pomalý režim severity: Závažnosť sign_in_token_attempt: Bezpečnostný kód @@ -135,10 +165,11 @@ sk: username_or_email: Prezývka, alebo email whole_word: Celé slovo featured_tag: - name: Haštag + name: Hashtag form_admin_settings: peers_api_enabled: Zverejni zoznam objavených serverov v API status_page_url: URL adresa stránky stavu + thumbnail: Náhľad servera interactions: must_be_follower: Blokuj oboznámenia od užívateľov, ktorí ma nenasledujú must_be_following: Blokuj oboznámenia od ľudí, ktorých nesledujem @@ -153,17 +184,32 @@ sk: sign_up_requires_approval: Obmedz registrácie severity: Pravidlo notification_emails: + appeal: Niekto sa odvoláva voči moderátorskému rozhodnutiu digest: Zasielať súhrnné emaily - favourite: Zaslať email, ak si niekto obľúbi tvoj príspevok - follow: Niekto ťa začal nasledovať - follow_request: Zaslať email, ak ti niekto pošle žiadosť o sledovanie - mention: Zaslať email, ak ťa niekto spomenie vo svojom príspevku - pending_account: Zaslať email, ak treba prehodnotiť nový účet - reblog: Zaslať email, ak niekto re-tootne tvoj príspevok + favourite: Niekto ohviezdičkuje váš príspevok + follow: Niekto vás začal sledovať + follow_request: Niekto vám posiela žiadosť o sledovanie + mention: Niekto vás označí + pending_account: Je potrebná kontrola nového účtu + quote: Niekto vás cituje + reblog: Niekto zdieľa váš príspevok + report: Niekto niečo nahlásil + software_updates: + all: Upozorňovať na všetky novinky + critical: Upozorňovať iba na kritické novinky + label: Je dostupná nová verzia Mastodonu + none: Nikdy neupozorňovať na novinky (neodporúčané) + patch: Upozorňovať na novinky s riešením chýb + trending_tag: Je potrebné skontrolovať nový trend + settings: + indexable: Zobrazovať profil v internetových vyhľadávačoch + show_application: Zobrazovať apku, z ktorej sú uverejňované príspevky tag: - listable: Povoľ zobrazovanie tohto haštagu v návrhoch vyhľadávaní - name: Haštag - trendable: Povoľ zobrazovanie tohto haštagu medzi trendujúcimi + listable: Povoliť zobrazovanie tohto hashtagu v návrhoch vyhľadávaní + name: Hashtag + trendable: Povoliť zobrazovanie tohto hashtagu medzi trendujúcimi + user: + time_zone: Časové pásmo 'no': Nie recommended: Odporúčané required: diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 9a2850119cd6df..2894a2665e2c5a 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -101,7 +101,6 @@ sl: status_page_url: URL strani, kjer je moč videti stanje tega strežnika med prekinjenim delovanjem theme: Tema, ki jo vidijo odjavljeni obiskovalci in novi uporabniki. thumbnail: Slika v razmerju stranic približno 2:1, prikazana vzdolž podatkov o vašem strežniku. - timeline_preview: Odjavljeni obiskovalci bodo lahko brskali po najnovejših javnih objavah, ki so na voljo na strežniku. trendable_by_default: Preskočite ročni pregled vsebine v trendu. Posamezne elemente še vedno lahko odstranite iz trenda post festum. trends: Trendi prikažejo, katere objave, ključniki in novice privlačijo zanimanje na vašem strežniku. trends_as_landing_page: Odjavljenim uporabnikom in obiskovalcem namesto opisa tega strežnika pokažite vsebine v trendu. Trendi morajo biti omogočeni. @@ -286,7 +285,6 @@ sl: status_page_url: URL strani stanja theme: Privzeta tema thumbnail: Sličica strežnika - timeline_preview: Omogoči neoverjen dostop do javnih časovnic trendable_by_default: Dovoli trende brez predhodnega pregleda trends: Omogoči trende trends_as_landing_page: Uporabi trende za pristopno stran diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index ad26b87a5aab36..a942a2d0300b5f 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -56,6 +56,8 @@ sq: scopes: Cilat API do të lejohen të përdorin aplikacioni. Nëse përzgjidhni një shkallë të epërme, nuk ju duhet të përzgjidhni individualet një nga një. setting_aggregate_reblogs: Mos shfaq përforcime të reja për mesazhe që janë përforcuar tani së fundi (prek vetëm përforcime të marra rishtas) setting_always_send_emails: Normalisht s’do të dërgohen njoftime, kur përdorni aktivisht Mastodon-in + setting_default_quote_policy_private: Në Mastodon s’mund të citohen nga të tjerë postim Vetëm-për-ndjekësit. + setting_default_quote_policy_unlisted: Kur njerëzit ju citojnë, nga rrjedha kohore e gjërave në modë do të kalohen si të fshehura edhe postimet e tyre. setting_default_sensitive: Media rezervat fshihet, si parazgjedhje, dhe mund të shfaqet me një klikim setting_display_media_default: Fshih media me shenjën rezervat setting_display_media_hide_all: Fshih përherë mediat @@ -102,7 +104,6 @@ sq: status_page_url: URL e faqe ku njerëzit mund të shohin gjendjen e këtij shërbyesi, gjatë një ndërprerje të funksionimit theme: Temë që shohin vizitorët që kanë bërë daljen dhe përdorues të rinj. thumbnail: Një figurë afërsisht 2:1 e shfaqur tok me hollësi mbi shërbyesin tuaj. - timeline_preview: Vizitorët që kanë bërë daljen do të jenë në gjendje të shfletojnë postimet më të freskëta publike të passhme në shërbyes. trendable_by_default: Anashkalo shqyrtim dorazi lënde në modë. Gjëra individuale prapë mund të hiqen nga lëndë në modë pas publikimi. trends: Gjërat në modë shfaqin cilat postime, hashtagë dhe histori të reja po tërheqin vëmendjen në shërbyesin tuaj. trends_as_landing_page: Shfaq lëndë në modë për përdorues jo të futur në llogari dhe për vizitorë, në vend se të një përshkrimi të këtij shërbyesi. Lyp që të jenë të aktivizuara gjërat në modë. @@ -147,6 +148,9 @@ sq: min_age: S’duhet të jetë nën moshën minimum të domosdoshme nga ligjet në juridiksionin tuaj. user: chosen_languages: Në iu vëntë shenjë, te rrjedha kohore publike do të shfaqen vetëm mesazhe në gjuhët e përzgjedhura + date_of_birth: + one: Na duhet të sigurohemi se jeni të paktën %{count} që të përdorni %{domain}. S’do ta depozitojmë këtë. + other: Na duhet të sigurohemi se jeni të paktën %{count} që të përdorni %{domain}. S’do ta depozitojmë këtë. role: Roli kontrollon cilat leje ka përdoruesi. user_role: color: Ngjyrë për t’u përdorur për rolin nëpër UI, si RGB në format gjashtëmbëdhjetësh @@ -154,6 +158,10 @@ sq: name: Emër publik për rolin, nëse roli është ujdisur të shfaqet si një stemë permissions_as_keys: Përdoruesit me këtë rol do të mund të… position: Role më të lartë vendosin zgjidhje përplasje në disa raste. Disa veprime mund të kryhen vetëm mbi role të një shkalle më të ulët + username_block: + allow_with_approval: Në vend të pengimit aty për aty të regjistrimit, regjistrime me përkim do të duan miratimin tuaj + comparison: Ju lutemi, mbani parasysh Problemin Scunthorpe, kur bllokohen përkime të pjesshme + username: Do të merret si përkim, pavarësisht shkrimit me të mëdha apo të vogla dhe pavarësisht homoglifesh të tilla si "4" për "a", ose "3" për "e" webhook: events: Përzgjidhni akte për dërgim template: Hartoni ngarkesë tuajën JSON, duke përdorur ndërkëmbim ndryshoresh. Lëreni të zbrazët, për JSON-in parazgjedhje. @@ -226,6 +234,7 @@ sq: setting_auto_play_gif: Vetëluaji GIF-et e animuar setting_boost_modal: Shfaq dialog ripohimi përpara përforcimi setting_default_language: Gjuhë postimi + setting_default_privacy: Dukshmëri postimi setting_default_quote_policy: Cilët mund të citojnë setting_default_sensitive: Mediave vëru përherë shenjë si rezervat setting_delete_modal: Shfaq dialog ripohimi përpara fshirjes së një mesazhi @@ -235,6 +244,7 @@ sq: setting_display_media_default: Parazgjedhje setting_display_media_hide_all: Fshihi krejt setting_display_media_show_all: Shfaqi krejt + setting_emoji_style: Stil emoji-sh setting_expand_spoilers: Mesazhet me sinjalizime mbi lëndën, zgjeroji përherë setting_hide_network: Fshiheni rrjetin tuaj setting_missing_alt_text_modal: Shfaq dialog ripohimi, para postimi mediash pa tekst alternativ @@ -271,12 +281,16 @@ sq: content_cache_retention_period: Periudhë mbajtjeje lënde të largët custom_css: CSS Vetjake favicon: Favikonë + local_live_feed_access: Hyrje te prurje të atypëratyshme që përmbajnë postime vendore + local_topic_feed_access: Hyrje te prurje hashtag-ësh dhe lidhjesh që përmbajnë postime vendore mascot: Simbol vetjak (e dikurshme) media_cache_retention_period: Periudhë mbajtjeje lënde media min_age: Domosdosmëri moshe minimum peers_api_enabled: Publiko te API listë shërbyesish të zbuluar profile_directory: Aktivizo drejtori profilesh registrations_mode: Kush mund të regjistrohet + remote_live_feed_access: Hyrje te prurje të atypëratyshme që përmbajnë postime nga larg + remote_topic_feed_access: Hyrje te prurje hashtag-ësh dhe lidhjesh që përmbajnë postime nga larg require_invite_text: Kërko një arsye për pjesëmarrje show_domain_blocks: Shfaq bllokime përkatësish show_domain_blocks_rationale: Shfaq pse janë bllokuar përkatësitë @@ -289,7 +303,6 @@ sq: status_page_url: URL faqeje gjendjesh theme: Temë parazgjedhje thumbnail: Miniaturë shërbyesi - timeline_preview: Lejo hyrje pa mirëfilltësim te rrjedha kohore publike trendable_by_default: Lejoni gjëra në modë pa shqyrtim paraprak trends: Aktivizo gjëra në modë trends_as_landing_page: Përdor gjërat në modë si faqe hyrëse @@ -317,6 +330,7 @@ sq: follow_request: Dikush kërkoi t’ju ndjekë mention: Dikush ju përmendi pending_account: Llogaria e re lyp shqyrtim + quote: Dikush ju citoi reblog: Dikush përforcoi gjendjen tuaj report: Parashtrohet raportim i ri software_updates: @@ -363,6 +377,10 @@ sq: name: Emër permissions_as_keys: Leje position: Përparësi + username_block: + allow_with_approval: Lejo regjistrim me miratim + comparison: Metodë krahasimi + username: Fjalë për t’u vëzhguar webhook: events: Akte të aktivizuar template: Gjedhe ngarkese diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 213075e6b43a94..1a8f2b13ed2d56 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -97,7 +97,6 @@ sr-Latn: status_page_url: URL stranice gde ljudi mogu da vide status servera dok je server oboren theme: Tema koju vide posetioci koji nisu prijavljeni i novi korisnici. thumbnail: Slika u razmeri od približno 2:1 koja se prikazuje pored informacija o Vašem serveru. - timeline_preview: Posetioci koji nisu prijavljeni će moći da pregledaju najnovije javne objave dostupne na serveru. trendable_by_default: Preskoči ručni pregled sadržaja koji je u trendu. Pojedinačne stavke se nakon toga i dalje mogu ukloniti iz trendova. trends: Trendovi pokazuju koje objave, heš oznake i vesti postaju sve popularnije na Vašem serveru. trends_as_landing_page: Prikaži sadržaj u trendu odjavljenim korisnicima i posetiocima umesto opisa ovog servera. Zahteva da trendovi budu omogućeni. @@ -264,7 +263,6 @@ sr-Latn: status_page_url: URL statusne stranice theme: Podrazumevana tema thumbnail: Sličica servera - timeline_preview: Dozvoli neautorizovan pristup javnim vremenskim osama trendable_by_default: Dozvoli trendove bez prethodnog pregleda trends: Omogući trendove trends_as_landing_page: Koristite trendove kao stranicu dočeka diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 96c5732ebdb80e..ad3b0f60b5a283 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -97,7 +97,6 @@ sr: status_page_url: URL странице где људи могу да виде статус сервера док је сервер оборен theme: Тема коју виде посетиоци који нису пријављени и нови корисници. thumbnail: Слика у размери од приближно 2:1 која се приказује поред информација о Вашем серверу. - timeline_preview: Посетиоци који нису пријављени ће моћи да прегледају најновије јавне објаве доступне на серверу. trendable_by_default: Прескочи ручни преглед садржаја који је у тренду. Појединачне ставке се након тога и даље могу уклонити из трендова. trends: Трендови показују које објаве, хеш ознаке и вести постају све популарније на Вашем серверу. trends_as_landing_page: Прикажи садржај у тренду одјављеним корисницима и посетиоцима уместо описа овог сервера. Захтева да трендови буду омогућени. @@ -264,7 +263,6 @@ sr: status_page_url: URL статусне странице theme: Подразумевана тема thumbnail: Сличица сервера - timeline_preview: Дозволи неауторизован приступ јавним временским осама trendable_by_default: Дозволи трендове без претходног прегледа trends: Омогући трендове trends_as_landing_page: Користите трендове као страницу дочека diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index c4be2a70908fba..4eba2503572d93 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -103,7 +103,6 @@ sv: status_page_url: URL till en sida där personer kan se serverns status under ett driftavbrott theme: Tema som utloggade besökare och nya användare ser. thumbnail: En bild i cirka 2:1-proportioner som visas tillsammans med din serverinformation. - timeline_preview: Utloggade besökare kommer kunna bläddra bland de senaste offentliga inläggen som finns på servern. trendable_by_default: Hoppa över manuell granskning av trendande innehåll. Enskilda objekt kan ändå raderas från trender retroaktivt. trends: Trender visar vilka inlägg, hashtaggar och nyheter det pratas om på din server. trends_as_landing_page: Visa trendande innehåll för utloggade användare och besökare istället för en beskrivning om servern. Kräver att trender är aktiverat. @@ -299,7 +298,6 @@ sv: status_page_url: URL för statussida theme: Standardtema thumbnail: Serverns tumnagelbild - timeline_preview: Tillåt oautentiserad åtkomst till offentliga tidslinjer trendable_by_default: Tillåt trender utan föregående granskning trends: Aktivera trender trends_as_landing_page: Använd trender som landningssida diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 8ec163d433e975..5246e8baf542d6 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -99,7 +99,6 @@ th: status_page_url: URL ของหน้าที่ผู้คนสามารถเห็นสถานะของเซิร์ฟเวอร์นี้ในระหว่างการหยุดทำงาน theme: ชุดรูปแบบที่ผู้เยี่ยมชมที่ออกจากระบบและผู้ใช้ใหม่เห็น thumbnail: แสดงภาพ 2:1 โดยประมาณควบคู่ไปกับข้อมูลเซิร์ฟเวอร์ของคุณ - timeline_preview: ผู้เยี่ยมชมที่ออกจากระบบจะสามารถเรียกดูโพสต์สาธารณะล่าสุดที่มีในเซิร์ฟเวอร์ trendable_by_default: ข้ามการตรวจทานเนื้อหาที่กำลังนิยมด้วยตนเอง ยังคงสามารถเอารายการแต่ละรายการออกจากแนวโน้มได้หลังจากเกิดเหตุ trends: แนวโน้มแสดงว่าโพสต์, แฮชแท็ก และเรื่องข่าวใดกำลังได้รับความสนใจในเซิร์ฟเวอร์ของคุณ trends_as_landing_page: แสดงเนื้อหาที่กำลังนิยมแก่ผู้ใช้และผู้เยี่ยมชมที่ออกจากระบบแทนที่จะเป็นคำอธิบายของเซิร์ฟเวอร์นี้ ต้องมีการเปิดใช้งานแนวโน้ม @@ -270,7 +269,6 @@ th: status_page_url: URL ของหน้าสถานะ theme: ชุดรูปแบบเริ่มต้น thumbnail: ภาพขนาดย่อเซิร์ฟเวอร์ - timeline_preview: อนุญาตการเข้าถึงเส้นเวลาสาธารณะที่ไม่ได้รับรองความถูกต้อง trendable_by_default: อนุญาตแนวโน้มโดยไม่มีการตรวจทานล่วงหน้า trends: เปิดใช้งานแนวโน้ม trends_as_landing_page: ใช้แนวโน้มเป็นหน้าเริ่มต้น diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 9901691c9ecf11..eed2a95ef69cd3 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -105,7 +105,6 @@ tr: status_page_url: İnsanların bir kesinti halinde sunucunun durumunu görebilecekleri bir sayfanın URL'si theme: Giriş yapmamış ziyaretçilerin ve yeni kullanıcıların gördüğü tema. thumbnail: Sunucu bilginizin yanında gösterilen yaklaşık 2:1'lik görüntü. - timeline_preview: Giriş yapmamış ziyaretçiler, sunucuda mevcut olan en son genel gönderileri tarayabilecekler. trendable_by_default: Öne çıkan içeriğin elle incelenmesini atla. Tekil öğeler sonrada öne çıkanlardan kaldırılabilir. trends: Öne çıkanlar, sunucunuzda ilgi toplayan gönderileri, etiketleri ve haber yazılarını gösterir. trends_as_landing_page: Giriş yapmış kullanıcılar ve ziyaretçilere sunucunun açıklması yerine öne çıkan içeriği göster. Öne çıkanların etkin olması gerekir. @@ -284,12 +283,16 @@ tr: content_cache_retention_period: Uzak içerik saklama süresi custom_css: Özel CSS favicon: Yer imi simgesi + local_live_feed_access: Yerel gönderileri ön plana çıkaran canlı akışlara erişim + local_topic_feed_access: Yerel gönderileri ön plana çıkaran etiket ve bağlantı akışlarına erişim mascot: Özel maskot (eski) media_cache_retention_period: Medya önbelleği saklama süresi min_age: Azami yaş gereksinimi peers_api_enabled: API'de keşfedilen sunucuların listesini yayınla profile_directory: Profil dizinini etkinleştir registrations_mode: Kim kaydolabilir + remote_live_feed_access: Uzaktan gönderileri ön plana çıkaran canlı akışlara erişim + remote_topic_feed_access: Uzaktan gönderileri ön plana çıkaran etiket ve bağlantı akışlarına erişim require_invite_text: Katılmak için bir gerekçe iste show_domain_blocks: Engellenen alan adlarını göster show_domain_blocks_rationale: Alan adlarının neden engellendiğini göster @@ -302,7 +305,6 @@ tr: status_page_url: Durum sayfası URL'si theme: Öntanımlı tema thumbnail: Sunucu küçük resmi - timeline_preview: Genel zaman çizelgelerine yetkisiz erişime izin ver trendable_by_default: Ön incelemesiz öne çıkanlara izin ver trends: Öne çıkanları etkinleştir trends_as_landing_page: Giriş sayfası olarak öne çıkanları kullan diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 017e041ecda2d4..abcf8e18d4ef13 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -102,7 +102,6 @@ uk: status_page_url: URL сторінки, на якій люди можуть бачити статус цього сервера під час його збою в роботі theme: Тема, яку бачать відвідувачі, що вийшли з системи, та нові користувачі. thumbnail: Зображення приблизно 2:1, що показується поряд з відомостями про ваш сервер. - timeline_preview: Зареєстровані відвідувачі зможуть переглядати останні публічні дописи, доступні на сервері. trendable_by_default: Пропустити ручний огляд популярних матеріалів. Індивідуальні елементи все ще можна вилучити з популярних постфактум. trends: Популярні показують, які дописи, хештеґи та новини набувають популярності на вашому сервері. trends_as_landing_page: Показувати популярні матеріали для зареєстрованих користувачів і відвідувачів замість опису цього сервера. Для активації потрібні тренди. @@ -288,7 +287,6 @@ uk: status_page_url: URL сторінки статусу theme: Стандартна тема thumbnail: Мініатюра сервера - timeline_preview: Дозволити неавтентифікований доступ до публічних стрічок trendable_by_default: Дозволити популярне без попереднього огляду trends: Увімкнути популярні trends_as_landing_page: Використовуйте тенденції як цільову сторінку diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index e7e308a1b0e6b9..0711711e5d7a04 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -105,7 +105,6 @@ vi: status_page_url: URL của trang nơi mọi người có thể xem trạng thái của máy chủ này khi ngừng hoạt động theme: Chủ đề mà khách truy cập đăng xuất và người mới nhìn thấy. thumbnail: 'Một hình ảnh tỉ lệ 2: 1 được hiển thị cùng với thông tin máy chủ của bạn.' - timeline_preview: Khách truy cập đã đăng xuất sẽ có thể xem các tút công khai gần đây nhất trên máy chủ. trendable_by_default: Bỏ qua việc duyệt thủ công nội dung xu hướng. Các mục riêng lẻ vẫn có thể bị xóa khỏi xu hướng sau này. trends: Hiển thị những tút, hashtag và tin tức đang được thảo luận nhiều trên máy chủ của bạn. trends_as_landing_page: Hiển thị nội dung xu hướng cho người dùng chưa đăng nhập thay vì mô tả về máy chủ này. Yêu cầu xu hướng được kích hoạt. @@ -283,12 +282,16 @@ vi: content_cache_retention_period: Khoảng thời gian lưu giữ nội dung máy chủ khác custom_css: Tùy chỉnh CSS favicon: Favicon + local_live_feed_access: Truy cập bảng tin gồm những tút của máy chủ + local_topic_feed_access: Truy cập hashtag và bảng tin liên kết gồm những tút của máy chủ mascot: Tùy chỉnh linh vật (kế thừa) media_cache_retention_period: Thời hạn lưu trữ cache media min_age: Độ tuổi tối thiểu peers_api_enabled: Công khai danh sách các máy chủ được phát hiện trong API profile_directory: Cho phép hiện danh bạ thành viên registrations_mode: Ai có thể đăng ký + remote_live_feed_access: Truy cập bảng tin gồm những tút từ máy chủ khác + remote_topic_feed_access: Truy cập hashtag và bảng tin liên kết gồm những tút từ máy chủ khác require_invite_text: Yêu cầu lí do đăng ký show_domain_blocks: Xem máy chủ chặn show_domain_blocks_rationale: Hiện lý do máy chủ bị chặn @@ -301,7 +304,6 @@ vi: status_page_url: URL trang trạng thái theme: Chủ đề mặc định thumbnail: Hình thu nhỏ của máy chủ - timeline_preview: Cho phép truy cập vào dòng thời gian công khai trendable_by_default: Cho phép lên xu hướng mà không cần duyệt trước trends: Bật xu hướng trends_as_landing_page: Dùng trang xu hướng làm trang chào mừng diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index efd37217a4b13e..dbe628205f25f2 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -105,7 +105,6 @@ zh-CN: status_page_url: 配置一个网址,当服务中断时,人们可以通过该网址查看服务器的状态。 theme: 给未登录访客和新用户使用的主题。 thumbnail: 与服务器信息一并展示的约 2:1 比例的图像。 - timeline_preview: 未登录访客将能够浏览服务器上的最新公开嘟文。 trendable_by_default: 跳过对热门内容的手工审核。个别项目仍可在之后从趋势中删除。 trends: 热门页中会显示正在你服务器上受到关注的嘟文、标签和新闻故事。 trends_as_landing_page: 向注销的用户和访问者显示热门内容,而不是对该服务器的描述,需要启用热门。 @@ -283,12 +282,16 @@ zh-CN: content_cache_retention_period: 外站内容保留期 custom_css: 自定义 CSS favicon: Favicon + local_live_feed_access: 展示本站嘟文的实时动态访问权限 + local_topic_feed_access: 展示本站嘟文的话题标签及实时动态访问权限 mascot: 自定义吉祥物(旧) media_cache_retention_period: 媒体缓存保留期 min_age: 最低年龄要求 peers_api_enabled: 在API中公开的已知实例的服务器的列表 profile_directory: 启用用户目录 registrations_mode: 谁可以注册 + remote_live_feed_access: 展示外站嘟文的实时动态访问权限 + remote_topic_feed_access: 展示外站嘟文的话题标签及实时动态访问权限 require_invite_text: 注册时需要提供理由 show_domain_blocks: 显示站点屏蔽列表 show_domain_blocks_rationale: 显示站点屏蔽原因 @@ -301,7 +304,6 @@ zh-CN: status_page_url: 状态页网址 theme: 默认主题 thumbnail: 本站缩略图 - timeline_preview: 允许未登录用户访问公共时间线 trendable_by_default: 允许在未审核的情况下将话题置为热门 trends: 启用热门 trends_as_landing_page: 使用热门页作为登陆页面 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index de4a76c0edb66c..6e79264e98fdd3 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -95,7 +95,6 @@ zh-HK: status_page_url: 可在服務中斷期間,查看此伺服器狀態的網頁網址 theme: 未登入訪客和新使用者看到的主題。 thumbnail: 一幅約 2:1 的圖片顯示在你的伺服器資訊的旁邊。 - timeline_preview: 未登入的訪客能夠瀏覽伺服器上最新的公開帖文。 trendable_by_default: 跳過對趨勢內容的手動審查,事後仍可從趨勢中刪除個別項目。 trends: 趨勢顯示哪些帖文、標籤和新聞故事在你的伺服器上較有吸引力。 trends_as_landing_page: 向未登入的使用者及訪客展示趨勢內容,而非只有此伺服器的描述。需要啟用趨勢。 @@ -261,7 +260,6 @@ zh-HK: status_page_url: 狀態頁網址 theme: 預設主題 thumbnail: 伺服器縮圖 - timeline_preview: 允許未經認證的人存取公共時間軸 trendable_by_default: 允許未經審核的趨勢 trends: 啟用趨勢 trends_as_landing_page: 使用趨勢作為登陸頁面 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 6bf083139446af..00684c3271504b 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -105,7 +105,6 @@ zh-TW: status_page_url: 當服務中斷時,可以提供使用者了解伺服器資訊頁面之 URL theme: 未登入之訪客或新使用者所見之佈景主題。 thumbnail: 大約 2:1 圖片會顯示於您伺服器資訊之旁。 - timeline_preview: 未登入之訪客能夠瀏覽此伺服器上最新的公開嘟文。 trendable_by_default: 跳過手動審核熱門內容。仍能於登上熱門趨勢後移除個別內容。 trends: 熱門趨勢將顯示於您伺服器上正在吸引大量注意力的嘟文、主題標籤、或者新聞。 trends_as_landing_page: 顯示熱門趨勢內容至未登入使用者及訪客而不是關於此伺服器之描述。需要啟用熱門趨勢。 @@ -283,12 +282,16 @@ zh-TW: content_cache_retention_period: 遠端內容保留期限 custom_css: 自訂 CSS favicon: 網站圖示 (Favicon) + local_live_feed_access: 允許瀏覽本站嘟文之即時內容 + local_topic_feed_access: 允許瀏覽本站嘟文之主題標籤與連結 mascot: 自訂吉祥物 (legacy) media_cache_retention_period: 多媒體快取資料保留期間 min_age: 最低年齡要求 peers_api_enabled: 於 API 中公開已知伺服器的列表 profile_directory: 啟用個人檔案目錄 registrations_mode: 誰能註冊 + remote_live_feed_access: 允許瀏覽聯邦宇宙嘟文之即時內容 + remote_topic_feed_access: 允許瀏覽聯邦宇宙嘟文之主題標籤與連結 require_invite_text: 要求「加入原因」 show_domain_blocks: 顯示封鎖的網域 show_domain_blocks_rationale: 顯示網域被封鎖之原因 @@ -301,7 +304,6 @@ zh-TW: status_page_url: 狀態頁面 URL theme: 預設佈景主題 thumbnail: 伺服器縮圖 - timeline_preview: 允許未登入使用者瀏覽公開時間軸 trendable_by_default: 允許熱門趨勢直接顯示,不需經過審核 trends: 啟用熱門趨勢 trends_as_landing_page: 以熱門趨勢作為登陸頁面 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 65aca0b47ed1b2..e6db6013abf987 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -14,7 +14,7 @@ sk: other: Sledujúci following: Nasledujem instance_actor_flash: Toto konto je virtuálny aktér, ktorý predstavuje samotný server, a nie konkrétneho používateľa. Používa sa na účely federácie a nemal by byť pozastavený. - last_active: naposledy aktívny + last_active: posledná aktivita link_verified_on: Vlastníctvo tohto odkazu bolo skontrolované %{date} nothing_here: Nič tu nie je! pin_errors: @@ -41,7 +41,7 @@ sk: approve: Schváľ approved_msg: Úspešne schválená prihláška %{username} are_you_sure: Si si istý/á? - avatar: Maskot + avatar: Profilová fotka by_domain: Doména change_email: changed_msg: E-mail úspešne zmenený! @@ -60,13 +60,13 @@ sk: confirmed: Potvrdený confirming: Potvrdzujúci custom: Vlastné - delete: Vymaž dáta + delete: Vymazať dáta deleted: Vymazané demote: Degraduj destroyed_msg: "%{username} je teraz zaradený do fronty na okamžité vymazanie" disable: Zablokuj disable_sign_in_token_auth: Vypni overovanie e-mailovým tokenom - disable_two_factor_authentication: Vypni dvoj-faktorové overovanie + disable_two_factor_authentication: Vypnúť dvojstupňové overenie disabled: Blokovaný display_name: Ukáž meno domain: Doména @@ -119,14 +119,14 @@ sk: push_subscription_expires: PuSH odoberanie expiruje redownload: Obnov profil redownloaded_msg: Úspešne obnovený profil %{username} z pôvodného - reject: Zamietni + reject: Zamietnuť rejected_msg: Úspešne zamietnutá prihláška %{username} remote_suspension_irreversible: Údaje tohto účtu boli nenávratne zmazané. remote_suspension_reversible_hint_html: Účet bol pozastavený na ich serveri a údaje budú úplne odstránené dňa %{date}. Dovtedy môže vzdialený server účet obnoviť bez akýchkoľvek nepriaznivých účinkov. Ak chceš odstrániť všetky údaje účtu ihneď, môžeš tak urobiť nižšie. - remove_avatar: Vymaž avatar - remove_header: Vymaž záhlavie + remove_avatar: Vymazať profilovú fotku + remove_header: Vymazať záhlavie removed_avatar_msg: Úspešne odstránený obrázok avatara %{username} - removed_header_msg: Úspešne odstránený obrázok hlavičky %{username} + removed_header_msg: Obrázok v záhlaví profilu %{username} bol úspešne odstránený resend_confirmation: already_confirmed: Tento užívateľ je už potvrdený send: Odošli potvrdzovací odkaz znovu @@ -142,7 +142,7 @@ sk: only_password: Iba heslo password_and_2fa: Heslo a dvoj-faktorové overovanie sensitive: Citlivé na silu - sensitized: Označený ako chúlostivý + sensitized: Označený ako citlivý shared_inbox_url: URL zdieľanej schránky show: created_reports: Vytvorené hlásenia @@ -190,15 +190,15 @@ sk: create_unavailable_domain: Vytvor nedostupnú doménu create_user_role: Vytvoriť rolu demote_user: Zniž užívateľskú rolu - destroy_announcement: Vymaž oboznámenie + destroy_announcement: Vymazať oznámenie destroy_canonical_email_block: Zruš blokovanie emailu - destroy_custom_emoji: Vymaž vlastné emotikony + destroy_custom_emoji: Vymazať vlastné emotikony destroy_domain_allow: Zmaž povolenie pre doménu destroy_domain_block: Zruš blokovanie domény destroy_instance: Vyčistiť doménu - destroy_ip_block: Vymaž IP pravidlo - destroy_status: Vymaž príspevok - destroy_unavailable_domain: Vymaž nedostupnú doménu + destroy_ip_block: Vymazať IP pravidlo + destroy_status: Vymazať príspevok + destroy_unavailable_domain: Vymazať nedostupnú doménu destroy_user_role: Zničiť rolu disable_2fa_user: Vypni dvoj-faktorové overovanie disable_custom_emoji: Vypni vlastné emotikony @@ -208,14 +208,14 @@ sk: memorialize_account: Zmena na „in memoriam“ promote_user: Povýš užívateľskú rolu publish_terms_of_service: Zverejni podmienky prevozu - reject_appeal: Zamietni námietku - reject_user: Zamietni užívateľa - remove_avatar_user: Vymaž avatar + reject_appeal: Zamietnuť odvolanie + reject_user: Zamietnuť používateľa + remove_avatar_user: Vymazať profilovú fotku reopen_report: Znovu otvor hlásenie resend_user: Preposlať overovací email reset_password_user: Obnov heslo resolve_report: Vyrieš nahlásený problém - sensitive_account: Vynúť všetky médiá na účte ako chúlostivé + sensitive_account: Označiť všetky médiá na účte ako citlivé silence_account: Utíš účet suspend_account: Pozastav účet unassigned_report: Odober priradenie nahlásenia @@ -263,12 +263,12 @@ sk: reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}" reset_password_user_html: "%{name} resetoval/a heslo používateľa %{target}" resolve_report_html: "%{name} vyriešil/a nahlásenie %{target}" - sensitive_account_html: "%{name} označil/a médium od %{target} za chúlostivé" + sensitive_account_html: "%{name} uvádza médiá od %{target} ako citlivé" silence_account_html: "%{name} obmedzil/a účet %{target}" suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}" unassigned_report_html: "%{name} odobral/a report od %{target}" unblock_email_account_html: "%{name} odblokoval/a %{target}ovu/inu emailovú adresu" - unsensitive_account_html: "%{name} odznačil/a médium od %{target} ako chúlostivé" + unsensitive_account_html: "%{name} ruší uvádzanie médií od %{target} ako citlivé" unsilence_account_html: "%{name} zrušil/a obmedzenie %{target}ovho/inho účtu" unsuspend_account_html: "%{name} spojazdnil/a účet %{target}" update_announcement_html: "%{name} aktualizoval/a oboznámenie %{target}" @@ -291,6 +291,8 @@ sk: new: create: Vytvor oznam title: Nové oznámenie + preview: + disclaimer: Keďže si používatelia nemôžu e-mailové upozornenia vypnúť, mali by byť využívané iba na dôležité oznamy, napríklad upozornenia o úniku osobných údajov alebo rušení servera. publish: Zverejni published_msg: Oboznámenie úspešne zverejnené! scheduled_for: Načasované na %{time} @@ -307,7 +309,7 @@ sk: copy_failed_msg: Nebolo možné vytvoriť miestnu kópiu tohto emoji create_new_category: Vytvor novú kategóriu created_msg: Emoji úspešne vytvorené! - delete: Vymaž + delete: Vymazať destroyed_msg: Emoji úspešne zničené! disable: Zakáž disabled: Vypnuté @@ -354,7 +356,7 @@ sk: add_new: Povolená doména created_msg: Doména bola úspešne povolená destroyed_msg: Doména bola odstránená zo zoznamu povolených - export: Exportuj + export: Export import: Nahraj undo: Odober zo zoznamu povolených domain_blocks: @@ -370,7 +372,7 @@ sk: domain: Doména edit: Uprav blokovanie domény existing_domain_block_html: Pre účet %{name} si už nahodil/a přísnejšie obmedzenie, najskôr ho teda musíš odblokovať. - export: Exportuj + export: Export import: Nahraj new: create: Vytvor blokovanie domény @@ -393,10 +395,10 @@ sk: undo: Odvolaj blokovanie domény view: Ukáž blokovanie domén email_domain_blocks: - add_new: Pridaj nový + add_new: Pridať nový allow_registrations_with_approval: Povoľ registrovanie so schválením created_msg: Úspešne zablokovaná emailová doména - delete: Vymaž + delete: Vymazať dns: types: mx: MX záznam @@ -411,7 +413,7 @@ sk: export_domain_allows: new: title: Nahraj povolené domény - no_file: Nevybraný žiaden súbor + no_file: Nebol vybraný žiadny súbor export_domain_blocks: import: existing_relationships_warning: Existujúce vzťahy nasledovania @@ -419,7 +421,7 @@ sk: title: Nahraj zákazy domén new: title: Nahraj zákazy domén - no_file: Nevybraný žiaden súbor + no_file: Nebol vybraný žiadny súbor follow_recommendations: description_html: "Odporúčania na sledovanie pomáhaju novým užívateľom rýchlo nájsť zaujímavý obsah. Ak užívateľ zatiaľ nedostatočne interagoval s ostatnými aby si vyformoval personalizované odporúčania na sledovanie, tak mu budú odporúčané tieto účty. Sú prepočítavané na dennej báze z mixu účtov s nedávnym najvyšším záujmom a najvyšším počtom lokálnych sledujúcich pre daný jazyk." language: Pre jazyk @@ -430,6 +432,7 @@ sk: unsuppress: Obnoviť odporúčanie na sledovanie instances: availability: + failure_threshold_reached: Limit neúspešných pokusov bol dosiahnutý %{date}. no_failures_recorded: Žiadne zlyhania nezaznamenané. title: Dostupnosť back_to_all: Všetko @@ -489,7 +492,7 @@ sk: ip_blocks: add_new: Vytvor pravidlo created_msg: Nové IP pravidlo úspešne pridané - delete: Vymaž + delete: Vymazať expires_in: '1209600': 2 týždne '15778476': 6 mesiacov @@ -504,8 +507,8 @@ sk: relationships: title: Vzťahy užívateľa %{acct} relays: - add_new: Pridaj nový federovací mostík - delete: Vymaž + add_new: Pridať nový federovací mostík + delete: Vymazať description_html: "Federovací mostík je prechodný server, ktorý obmieňa veľké množstvá verejných príspevkov medzi tými servermi ktoré na od neho odoberajú, aj doňho prispievajú. Môže to pomôcť malým a stredným instanciám objavovať federovaný obsah, čo inak vyžaduje aby miestni užívatelia ručne následovali iných ľudí zo vzdialených instancií." disable: Vypni disabled: Vypnutý @@ -532,6 +535,7 @@ sk: action_log: Denník auditu action_taken_by: Zákrok vykonal/a actions: + silence_description_html: Účet bude viditeľný iba pre účty, ktoré ho už sledujú alebo si ho vyhľadali ručne, čo výrazne zredukuje jeho dosah. Toto nastavenie je kedykoľvek možné zmeniť. Ukončí všetky hlásenia voči tomuto účtu. suspend_description_html: Tento účet a všetok jeho obsah bude nedostupný a nakoniec zmazaný, interaktovať s ním bude nemožné. Zvrátiteľné v rámci 30 dní. Uzatvára všetky hlásenia voči tomuto účtu. add_to_report: Pridaj viac do hlásenia already_suspended_badges: @@ -548,18 +552,18 @@ sk: confirm: Potvrď confirm_action: Potvrď moderovací úkon proti @%{acct} created_at: Nahlásené - delete_and_resolve: Vymaž príspevky + delete_and_resolve: Vymazať príspevky forwarded: Preposlané forwarded_to: Preposlané na %{domain} mark_as_resolved: Označiť ako vyriešené - mark_as_sensitive: Označ ako chúlostivé + mark_as_sensitive: Označiť ako citlivý obsah mark_as_unresolved: Označ ako nevyriešené no_one_assigned: Nikoho notes: create: Pridaj poznámku create_and_resolve: Vyrieš s poznámkou create_and_unresolve: Otvor znovu, s poznámkou - delete: Vymaž + delete: Vymazať placeholder: Opíš aké opatrenia boli urobené, alebo akékoľvek iné súvisiace aktualizácie… title: Poznámky remote_user_placeholder: vzdialený užívateľ z %{instance} @@ -576,8 +580,9 @@ sk: action_preambles: suspend_html: 'Chystáš sa pozastaviť účet @%{acct}. To urobí:' actions: - delete_html: Vymaž pohoršujúce príspevky - mark_as_sensitive_html: Označ médiá pohoršujúcich príspevkov za chúlostivé + delete_html: Vymazať príspevky porušujúce pravidlá + mark_as_sensitive_html: Označiť médiá v príspevkoch porušujúcich pravidlá ako citlivé + silence_html: Zásadne obmedzí dosah profilu @%{acct} zmenou jeho viditeľnosti spolu s jeho obsahom iba pre ľudí, ktorí ho už sledujú alebo si ho ručne vyhľadali close_report: 'Označ hlásenie #%{id} za vyriešené' target_origin: Pôvod nahláseného účtu title: Hlásenia @@ -598,7 +603,7 @@ sk: invites: Pozvánky moderation: Moderácia special: Špeciálne - delete: Vymaž + delete: Vymazať edit: Uprav postavenie %{name} everyone: Východzie oprávnenia permissions_count: @@ -609,7 +614,7 @@ sk: privileges: administrator: Správca administrator_description: Užívatelia s týmto povolením, obídu všetky povolenia - delete_user_data: Vymaž užívateľské dáta + delete_user_data: Vymazať používateľské dáta invite_users: Pozvi užívateľov manage_announcements: Spravuj oboznámenia manage_appeals: Spravuj námietky @@ -626,7 +631,7 @@ sk: title: Postavenia rules: add_new: Pridaj pravidlo - delete: Vymaž + delete: Vymazať edit: Uprav pravidlo empty: Žiadne pravidlá servera ešte neboli určené. title: Serverové pravidlá @@ -660,9 +665,11 @@ sk: none: Nikto sa nemôže registrovať open: Ktokoľvek sa môže zaregistrovať warning_hint: Odporúčame používať "Pre registráciu je potrebné schválenie", pokiaľ si niesi istý/á, že tvoj moderovací tím vie zvládnuť spam a záškodné registrácie včas. + security: + authorized_fetch_hint: Vyžadovanie overenia od federovaných serverov umožňuje dôkladnejšie vykonávania blokov na úrovni používateľa aj severa. Prináša to so sebou však aj zhoršenie výkonu a dosahu vašich odpovedí a môže spôsobiť problémy s kompatibilitou s niektorými federovanými službami. Okrem toho to nezabráni prístupu k vašim verejným príspevkom a účtom. title: Nastavenia servera site_uploads: - delete: Vymaž nahratý súbor + delete: Vymazať nahratý súbor destroyed_msg: Nahratie bolo zo stránky úspešne vymazané! software_updates: critical_update: Kritické — prosím aktualizuj rýchlo @@ -680,10 +687,10 @@ sk: back_to_account: Späť na účet back_to_report: Späť na stránku hlásenia batch: - remove_from_report: Vymaž z hlásenia + remove_from_report: Vymazať z hlásenia report: Hlásenie deleted: Vymazané - favourites: Obľúbené + favourites: Ohviezdičkovania history: História verzií in_reply_to: Odpoveď na language: Jazyk @@ -717,7 +724,7 @@ sk: action: Pozri tu pre viac informácií tags: review: Prehodnoť stav - updated_msg: Nastavenia haštagov boli úspešne aktualizované + updated_msg: Nastavenia hashtagov boli úspešne aktualizované title: Spravovanie trends: allow: Povoľ @@ -758,10 +765,10 @@ sk: trending: Populárne warning_presets: add_new: Pridaj nové - delete: Vymaž + delete: Vymazať edit_preset: Uprav varovnú predlohu webhooks: - delete: Vymaž + delete: Vymazať disable: Vypni disabled: Vypnuté enable: Povoľ @@ -789,7 +796,7 @@ sk: new_trending_statuses: title: Populárne príspevky new_trending_tags: - title: Populárne haštagy + title: Populárne hashtagy aliases: add_new: Vytvor alias created_msg: Nový alias úspešne vytvorený. Teraz môžeš začať presun zo starého účtu. @@ -797,14 +804,14 @@ sk: remove: Odpoj alias appearance: advanced_web_interface: Pokročilé webové rozhranie - advanced_web_interface_hint: 'Ak chceš využiť celkovú šírku tvojej obrazovky, pokročilé webové rozhranie ti umožňuje nastaviť mnoho rôznych stĺpcov, aby si videl/a toľko informácií naraz, koľko chceš: Domov, oboznámenia, federovanú časovú os, a ľubovolný počet zoznamov, či haštagov.' + advanced_web_interface_hint: 'Ak chcete využiť celkú šírku svojej obrazovky, pokročilé webové rozhranie vám umožňuje nastaviť mnoho rôznych stĺpcov, aby ste videli naraz toľko informácií, koľko chcete: Domov, upozornenia, federovanú časovú os a ľubovolný počet zoznamov či hashtagov.' animations_and_accessibility: Animácie a prístupnosť confirmation_dialogs: Potvrdzovacie dialógy - discovery: Nájdenie + discovery: Objavovanie localization: body: Mastodon je prekladaný dobrovoľníkmi. guide_link_text: Prispievať môže každý. - sensitive_content: Chúlostivý obsah + sensitive_content: Citlivý obsah application_mailer: unsubscribe: Prestaň odoberať view: 'Zobraziť:' @@ -813,7 +820,7 @@ sk: applications: created: Aplikácia bola vytvorená úspešne destroyed: Aplikáciu sa podarilo odstrániť - logout: Odhlás sa + logout: Odhlásiť sa regenerate_token: Znovu vygeneruj prístupový token token_regenerated: Prístupový token bol úspešne vygenerovaný znova warning: Na tieto údaje dávaj ohromný pozor. Nikdy ich s nikým nezďieľaj! @@ -827,8 +834,8 @@ sk: login_link: prihlás sa proceed_to_login_html: Teraz môžeš pokračovať na %{login_link}. welcome_title: Vitaj, %{name}! - delete_account: Vymaž účet - delete_account_html: Pokiaľ chceš svoj účet odtiaľto vymazať, môžeš tak urobiť tu. Budeš požiadaný/á o potvrdenie tohto kroku. + delete_account: Odstránenie účtu + delete_account_html: Pokiaľ chcete odstrániť svoj účet, môžete to urobiť tu. Toto rozhodnutie ešte budete musieť potvrdiť. description: prefix_invited_by_user: "@%{name} ťa pozýva na tento Mastodon server!" prefix_sign_up: Zaregistruj sa na Mastodone už dnes! @@ -839,9 +846,9 @@ sk: invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítaj si nový. log_in_with: Prihlás sa s login: Prihlás sa - logout: Odhlás sa - migrate_account: Presúvam sa na iný účet - migrate_account_html: Ak si želáš presmerovať tento účet na nejaký iný, môžeš si to nastaviť tu. + logout: Odhlásiť sa + migrate_account: Presun na iný účet + migrate_account_html: Ak chcete presmerovať tento účet na nejaký iný, môžete to nastaviť tu. or_log_in_with: Alebo prihlás s progress: confirm: Potvrď email @@ -865,8 +872,21 @@ sk: title: Prihlás sa na %{domain} status: account_status: Stav účtu - redirecting_to: Tvoj účet je neaktívny, lebo v súčasnosti presmerováva na %{acct}. + confirming: Čaká sa na dokončenie overenia e-mailu. + functional: Váš účet je funkčný. + pending: Vaša žiadosť je na kontrole naším tímom. Môže to trvať. Po jej prípadnom schválení dostanete e-mail. + redirecting_to: Váš účet je neaktívny, pretože v súčasnosti presmerúva na %{acct}. + self_destruct: Keďže %{domain} končí, budete mať k účtu iba obmedzený prístup. + view_strikes: Zobraziť predošlé sankcie vášho účtu use_security_key: Použi bezpečnostný kľúč + author_attribution: + example_title: Názorný text + hint_html: Píšete novinové alebo blogové články mimo Mastodonu? Rozhodujte o tom, ako sú vám pripisované, keď ich niekto zdieľa na Mastodone. + instructions: 'Vložte tento kód do kódu HTML vo vašom článku:' + more_from_html: Viac od %{name} + s_blog: Blog %{name} + then_instructions: Potom do poľa nižšie zadajte názov domény média. + title: Uvádzanie autorstva challenge: confirm: Pokračuj hint_html: "Tip: Hodinu nebudeme znovu vyžadovať tvoje heslo." @@ -890,7 +910,7 @@ sk: challenge_not_passed: Údaje, ktoré si zadal/a, sú nesprávne confirm_password: Napíš svoje terajšie heslo pre overenie tvojej identity confirm_username: Zadaj svoju prezývku, na potvrdenie úkonu - proceed: Vymaž účet + proceed: Odstrániť účet success_msg: Tvoj účet bol úspešne vymazaný warning: before: 'Než budeš pokračovať, prosím pozorne si prečítaj tieto poznámky:' @@ -913,14 +933,15 @@ sk: reject_appeal: Zamietni námietku title_actions: disable: Zmrazenie účtu - mark_statuses_as_sensitive: Označenie príspevkov za chúlostivé + mark_statuses_as_sensitive: Označenie príspevkov ako citlivé none: Varovanie - sensitive: Označenie účtu ako chúlostivý + sensitive: Označenie účtu ako citlivého silence: Obmedzenie účtu your_appeal_approved: Tvoja námietka bola schválená your_appeal_pending: Odoslal si námietku edit_profile: basic_information: Základné informácie + hint_html: "Upravte, čo ľudia vidia vo vašom verejom profile a pri vašich príspevkoch. S vyplneným profilom a nahratou profilovou fotkou sa zvýšia šance, že vás iní ľudia budú sledovať a budú s vami komunikovať." other: Ostatné errors: '400': Požiadavka, ktorú si odoslal/a, bola buď nesprávna, alebo znehodnotená. @@ -944,9 +965,9 @@ sk: archive_takeout: date: Dátum download: Stiahni si svoj archív - hint_html: Môžeš si vyžiadať archív svojích príspevkov a nahratých médií. Exportované dáta budú v ActivityPub formáte, čítateľné hociakým kompatibilným softvérom. Archív si je možné vyžiadať každých sedem dní. - in_progress: Balím tvoj archív... - request: Vyžiadaj si tvoj archív + hint_html: Môžete si vyžiadať archív svojich príspevkov a nahratých médií. Dáta budú exportované vo formáte ActivityPub, ktorý prečíta ľubovoľný kompatibilný softvér. Archív si je možné vyžiadať každých sedem dní. + in_progress: Prebieha kompilácia archívu… + request: Požiadať o archív size: Veľkosť blocks: Blokujete bookmarks: Záložky @@ -955,9 +976,10 @@ sk: mutes: Stíšil/a si storage: Úložisko médií featured_tags: - add_new: Pridaj nový + add_new: Pridať nový errors: - limit: Už si si predvolil/a najvyšší možný počet haštagov + limit: Už ste si predvolili najvyšší možný počet hashtagov + hint_html: "Zobrazte vo svojom profile vaše najvýznamnejšie hashtagy. Zvýraznené hashtagy majú viditeľné miesto vo vašom profile a umožňujú vám rýchly prístup k vašim príspevkom, aby ste mali svoje diela a dlhodobé projekty vždy poruke." filters: contexts: account: Profily @@ -968,29 +990,29 @@ sk: edit: add_keyword: Pridaj kľúčové slovo keywords: Kľúčové slová - title: Uprav triedenie + title: Upraviť filter errors: invalid_context: Nebola poskytnutá žiadna, alebo ide o neplatnú súvislosť index: - delete: Vymaž + delete: Vymazať empty: Nemáš žiadné filtrovanie. expires_on: Expiruje dňa %{date} - title: Triedenia + title: Filtre new: save: Uložiť nový filter - title: Pridaj nové triedenie + title: Pridať nový filter statuses: batch: remove: Odstrániť z filtrovania generic: all: Všetko cancel: Zruš - changes_saved_msg: Zmeny boli úspešne uložené! + changes_saved_msg: Zmeny boli úspešne uložené. confirm: Potvrď copy: Kopíruj - delete: Vymaž - order_by: Zoraď podľa - save_changes: Ulož zmeny + delete: Vymazať + order_by: Zoradiť podľa + save_changes: Uložiť zmeny today: dnes validation_errors: few: Niečo ešte nieje celkom v poriadku! Prosím skontroluj %{count} chýb uvedených nižšie @@ -1004,11 +1026,11 @@ sk: failures: Zlyhaní(a) imported: Nahrané modes: - merge: Spoj dohromady - merge_long: Ponechaj existujúce záznamy a pridaj k nim nové - overwrite: Prepíš - overwrite_long: Nahraď súčasné záznamy novými - preface: Môžeš nahrať dáta ktoré si exportoval/a z iného Mastodon serveru, ako sú napríklad zoznamy ľudí ktorých sleduješ, alebo blokuješ. + merge: Pridať + merge_long: Ponechať existujúce záznamy a pridať k nim nové + overwrite: Prepísať + overwrite_long: Nahradiť súčasné záznamy novými + preface: Môžete importovať dáta exportované z iného serveru na Mastodone, napríklad zoznam sledovaných alebo blokovaných účtov. recent_imports: Nedávne nahrania states: finished: Dokončené @@ -1021,7 +1043,7 @@ sk: lists: Nahrávanie zoznamov type_groups: constructive: Sledovania a záložky - destructive: Blokovania a utíšenia + destructive: Blokovania a stíšenia types: blocking: Zoznam blokovaných bookmarks: Záložky @@ -1057,7 +1079,7 @@ sk: title: Pozvi ľudí lists: errors: - limit: Dosiahli ste maximálny počet zoznamov + limit: Bol dosiahnutý maximálny počet zoznamov login_activities: authentication_methods: password: heslom @@ -1065,6 +1087,9 @@ sk: title: História overení mail_subscriptions: unsubscribe: + emails: + notification_emails: + reblog: e-mailové upozornenia na zdieľania title: Ukonči odber media_attachments: validations: @@ -1082,8 +1107,8 @@ sk: not_found: nebolo možné nájsť on_cooldown: Si v spánkovom stave followers_count: Následovatelia v čase presunu - incoming_migrations: Presúvam sa z iného účtu - incoming_migrations_html: K presunutiu z iného účtu na tento, si najskôr potrebuješ vytvoriť alias pre účet. + incoming_migrations: Presun z iného účtu + incoming_migrations_html: Ak sa chcete na tento účet presunúť z iného účtu, najprv si vytvorte nový alias. moved_msg: Tvoj účet teraz presmerováva na %{acct} a tvoji sledovatelia sú presúvaní tam. not_redirecting: Tvoj účet v súčasnosti nepresmerováva na žiaden iný účet. on_cooldown: Účet si si presunul/a len nedávno. Táto vymoženosť bude znovu sprístupnená za %{count} dní. @@ -1108,12 +1133,12 @@ sk: carry_mutes_over_text: Tento užívateľ sa presunul z účtu %{acct}, ktorý si mal/a stíšený. notification_mailer: favourite: - body: 'Tvoj príspevok bol obľúbený užívateľom %{name}:' + body: "%{name} hviezdičkuje váš príspevok:" subject: "%{name} si obľúbil/a tvoj príspevok" - title: Novo obľúbené + title: Nové ohviezdičkovanie follow: - body: "%{name} ťa teraz nasleduje!" - subject: "%{name} ťa teraz nasleduje" + body: "%{name} vás teraz sleduje." + subject: "%{name} vás teraz sleduje" title: Nový sledovateľ follow_request: action: Spravuj žiadosti o sledovanie @@ -1128,15 +1153,17 @@ sk: poll: subject: Anketa od %{name} skončila reblog: - body: 'Tvoj príspevok bol vyzdvihnutý užívateľom %{name}:' - subject: "%{name} vyzdvihli tvoj príspevok" - title: Novo vyzdvyhnuté + body: "%{name} zdieľa váš príspevok:" + subject: "%{name} zdieľa váš príspevok" + title: Nové zdieľanie status: subject: "%{name} práve prispel/a" update: subject: "%{name} upravil/a príspevok" notifications: - email_events_hint: 'Vyber si udalosti, pre ktoré chceš dostávať oboznámenia:' + administration_emails: Administrátorské e-mailové upozornenia + email_events: Udalosti pre e-mailové upozornenia + email_events_hint: 'Vyberte udalosti, pre ktoré chcete dostávať upozornenia:' otp_authentication: enable: Povoľ pagination: @@ -1157,11 +1184,16 @@ sk: too_many_options: nemôže zahŕňať viac ako %{max} položiek preferences: other: Ostatné - posting_defaults: Východiskové nastavenia príspevkov + posting_defaults: Predvolené nastavenia príspevkov public_timelines: Verejné časové osi privacy: + hint_html: "Upravte si spôsob nachádzania vášho profilu a príspevkov. Tieto funkcie vám môžu pomôcť osloviť väčšie publikum na Mastodone. Skontrolujte tieto nastavenia, aby bolo všetko tak, ako to chcete." privacy: Súkromie + privacy_hint_html: Rozhodujte o tom, koľko svojej aktivity chcete ukázať ostatným. Ľudia nachádzajú zaujímavé profily a aplikácie aj v profiloch iných, v zoznamoch sledovateľov a sledovaných. Máte možnosť ich skryť. + reach: Dosah + reach_hint_html: Rozhodnite o tom, či chcete aby vás iní ľudia nachádzali a sledovali. Chcete, aby sa vaše príspevky zobrazovali vo feede Objavovanie? Chcete, aby bol váš účet zobrazovaný ostatným v návrhoch na sledovanie? Chcete automatický schváliť všetky sledovania vás alebo o nich chcete jednotlivo rozhodovať? search: Vyhľadávanie + search_hint_html: Rozhodujte o tom, ako je možné vás nájsť. Chcete, aby vás ľudia mohli nájsť cez vaše verejné príspevky? Chcete, aby ľudia mimo Mastodonu mohli nachádzať váš profil pri prehľadávaní internetu? Upozorňujeme, že verejné informácie nie je možné úplne odizolovať od vyhľadávačov. title: Súkromie a dosah privacy_policy: title: Pravidlá ochrany súkromia @@ -1177,21 +1209,21 @@ sk: confirm_follow_selected_followers: Si si istý/á, že chceš nasledovať vybraných sledujúcich? confirm_remove_selected_followers: Si si istý/á, že chceš odstrániť vybraných sledovateľov? confirm_remove_selected_follows: Si si istý/á, že chceš odstrániť vybraných sledovaných? - dormant: Spiace + dormant: Neaktívne follow_failure: Nemožno nasledovať niektoré z vybraných účtov. follow_selected_followers: Následuj označených sledovatelov - followers: Sledovatelia - following: Nasledovaní + followers: Sledujú vás + following: Sledované vami invited: Pozvaný/á - last_active: Naposledy aktívny + last_active: Naposledy aktívne most_recent: Najnovšie - moved: Presunuli sa - mutual: Spoločné + moved: Presunuté + mutual: Vzájomné primary: Hlavné relationship: Vzťah - remove_selected_domains: Vymaž všetkých následovateľov z vybraných domén + remove_selected_domains: Vymazať všetky sledujúce účty z vybraných domén remove_selected_followers: Odstráň vybraných následovatrľov - remove_selected_follows: Prestaň sledovať vybraných užívateľov + remove_selected_follows: Zrušiť sledovanie vybraných účtov status: Stav účtu remote_follow: missing_resource: Nemožno nájsť potrebnú presmerovaciu adresu k tvojmu účtu @@ -1204,7 +1236,7 @@ sk: over_daily_limit: Prekročil/a si denný limit %{limit} predplánovaných príspevkov over_total_limit: Prekročil/a si limit %{limit} predplánovaných príspevkov sessions: - activity: Najnovšia aktivita + activity: Posledná aktivita browser: Prehliadač browsers: chrome: Google Chrome @@ -1216,10 +1248,10 @@ sk: safari: Apple Safari unknown_browser: Neznámy prehliadač weibo: Sina/Tencent Weibo - current_session: Aktuálna sezóna + current_session: Vaše aktuálne prihlásenie date: Dátum description: "%{browser} na %{platform}" - explanation: Tieto sú prehliadače ktoré sú teraz prihlásené na tvoj Mastodon účet. + explanation: Tieto prehliadače sú práve prihlásené do vášho účtu na Mastodone. ip: IP adresa platforms: ios: Apple iOS @@ -1227,9 +1259,10 @@ sk: mac: MacOSX unknown_platform: Neznáma platforma windows: Microsoft Windows - revoke: Zamietni - revoke_success: Sezóna úspešne zamietnutá - title: Sezóny + revoke: Zrušiť + revoke_success: Prihlásenie bolo zrušené + title: Aktívne prihlásenia + view_authentication_history: Zobraziť históriu prihlásení účtu settings: account: Účet account_settings: Nastavenia účtu @@ -1239,19 +1272,30 @@ sk: back: Späť na Mastodon delete: Vymazanie účtu development: Vývoj - edit_profile: Uprav profil - featured_tags: Zvýraznené haštagy - import: Importuj + edit_profile: Úprava profilu + featured_tags: Zvýraznené hashtagy + import: Import import_and_export: Import a export migrate: Presuň účet - preferences: Voľby + notifications: E-mailové upozornenia + preferences: Predvoľby profile: Profil - relationships: Sledovania a následovatelia - two_factor_authentication: Dvojfázové overenie + relationships: Sledované a sledujúce účty + severed_relationships: Prerušené vzťahy + statuses_cleanup: Automatické mazanie príspevkov + two_factor_authentication: Dvojstupňové overenie webauthn_authentication: Bezpečnostné kľúče severed_relationships: - lost_followers: Stratení nasledovatelia - lost_follows: Stratené sledovania + download: Stiahnuť (%{count}) + event_type: + account_suspension: Pozastavenie účtu (%{target_name}) + domain_block: Pozastavenie servera (%{target_name}) + user_domain_block: Zablokovali ste %{target_name} + lost_followers: Zrušenie sledovania účtami + lost_follows: Zrušenie sledovania účtov + preamble: Pri blokovaní domény alebo pri pozastavení pripojenia s iným serverom moderátorským tímom vášho servera môžete prísť o sledované a sledujúce účty. Keď sa to stane, tu si môžete stiahnuť zoznam prerušených vzťahov, ktorý môžete skontrolovať a prípadne importovať na inom serveri. + purged: Informácie o tomto serveri boli odstránené administrátorským tímom vášho servera. + type: Udalosť statuses: attached: description: 'Priložené: %{attached}' @@ -1260,14 +1304,14 @@ sk: many: "%{count} obrázkov" one: "%{count} obrázok" other: "%{count} obrázky" - boosted_from_html: Vyzdvihnuté od %{acct_link} + boosted_from_html: Zdieľané od %{acct_link} content_warning: 'Varovanie o obsahu: %{warning}' default_language: Rovnaký ako jazyk rozhrania disallowed_hashtags: - few: 'obsah nepovolených haštagov: %{tags}' - many: 'obsah nepovolených haštagov: %{tags}' - one: 'obsahoval nepovolený haštag: %{tags}' - other: 'obsahoval nepovolené haštagy: %{tags}' + few: 'obsahoval nepovolené hashtagy: %{tags}' + many: 'obsahoval nepovolené hashtagy: %{tags}' + one: 'obsahoval nepovolený hashtag: %{tags}' + other: 'obsahoval nepovolené hashtagy: %{tags}' edited_at_html: Upravené %{date} errors: in_reply_not_found: Príspevok, na ktorý sa snažíš odpovedať, pravdepodobne neexistuje. @@ -1275,29 +1319,50 @@ sk: pin_errors: limit: Už si si pripol ten najvyšší možný počet hlášok ownership: Nieje možné pripnúť hlášku od niekoho iného - reblog: Vyzdvihnutie sa nedá pripnúť + reblog: Zdieľanie nie je možné pripnúť title: '%{name}: „%{quote}"' visibilities: + direct: Súkromné označenie + private: Iba pre sledujúce účty public: Verejné + public_long: Ktokoľvek na Mastodone aj mimo neho + unlisted: Tiché verejné + unlisted_long: Skryté z výsledkov vyhľadávania, populárnych tém a verejných časových osí na Mastodone statuses_cleanup: + enabled: Automaticky mazať staré príspevky + enabled_hint: Automaticky vymaže vaše príspevky po dosiahnutí stanoveného veku, pokiaľ nespadajú do niektorej z výnimiek nižšie exceptions: Výnimky - ignore_favs: Ignoruj obľúbené - ignore_reblogs: Ignoruj vyzdvihnutia - keep_direct: Ponechaj súkromné správy - keep_pinned: Ponechaj pripnuté príspevky - keep_pinned_hint: Nevymaže žiadne s tvojich pripnutých príspevkov - keep_polls: Ponechaj ankety - keep_self_bookmark: Ponechaj príspevky, ktoré sú záložkami - keep_self_fav: Ponechať príspevky, ktoré si si obľúbil/a + explanation: Keďže je mazanie príspevkov drahým procesom, bude sa to diať pomaly a postupne v časoch, keď server nie je inak vyťažovaný. Preto môže príspevkom po dosiahnutí stanoveného veku ešte chvíľu trvať, než budú vymazané. + ignore_favs: Ignorovať hviezdičky + ignore_reblogs: Ignorovať zdieľania + interaction_exceptions: Výnimky podľa interakcií + interaction_exceptions_explanation: Vymazanie príspevkov nie je zaručené, pokiaľ klesnú pod limit hviezdičkovaní alebo zdieľaní až po kontrole. + keep_direct: Ponechať súkromné správy + keep_direct_hint: Vaše súkromné správy nebudú vymazané + keep_media: Ponechať príspevky s médiami + keep_media_hint: Vaše príspevky s mediálnymi prílohami nebudú vymazané + keep_pinned: Ponechať pripnuté príspevky + keep_pinned_hint: Vaše pripnuté príspevky nebudú vymazané + keep_polls: Ponechať ankety + keep_polls_hint: Vaše ankety nebudú vymazané + keep_self_bookmark: Ponechať príspevky označené záložkou + keep_self_bookmark_hint: Vaše príspevky označené záložkou nebudú vymazané + keep_self_fav: Ponechať ohviezdičkované príspevky + keep_self_fav_hint: Vaše ohviezdičkované príspevky nebudú vymazané min_age: '1209600': 2 týždne - '15778476': 6 mesačné - '2629746': 1 mesačné - '31556952': 1 ročné - '5259492': 2 mesačné + '15778476': 6 mesiacov + '2629746': 1 mesiac + '31556952': 1 rok + '5259492': 2 mesiace '604800': 1 týždeň - '63113904': 2 ročné - '7889238': 3 mesačné + '63113904': 2 roky + '7889238': 3 mesiace + min_age_label: Časová hranica + min_favs: Ponechať príspevky s aspoň týmto počtom hviezdičiek + min_favs_hint: Vaše príspevky, ktoré majú aspoň tento počet hviezdičiek, nebudú vymazané. Nevypĺňajte, pokiaľ chcete mazať príspevky bez ohľadu na ich počet hviezdičiek + min_reblogs: Ponechať príspevky s aspoň týmto počtom zdieľaní + min_reblogs_hint: Vaše príspevky, ktoré majú aspoň tento počet zdieľaní, nebudú vymazané. Nevypĺňajte, pokiaľ chcete mazať príspevky bez ohľadu na ich počet zdieľaní stream_entries: sensitive_content: Senzitívny obsah tags: @@ -1309,18 +1374,25 @@ sk: time: formats: default: "%b %d, %R, %H:%M" + with_time_zone: "%b %d, %Y, %H:%M %Z" translation: errors: too_many_requests: V poslednej dobe bolo na prekladateľskú službu vykonaných priveľa požiadaviek. two_factor_authentication: - disable: Zakáž - enabled: Dvojfázové overovanie je povolené - enabled_success: Dvojfázové overovanie úspešne povolené - generate_recovery_codes: Vygeneruj zálohové kódy - lost_recovery_codes: Zálohové kódy ti umožnia dostať sa k svojmu účtu ak stratíš telefón. Pokiaľ si stratila svoje zálohové kódy, môžeš si ich tu znovu vygenerovať. Tvoje staré zálohové kódy budú zneplatnené. - recovery_codes: Zálohuj kódy pre obnovu - recovery_codes_regenerated: Zálohové kódy boli úspešne zvova vygenerované - recovery_instructions_html: Keď hocikedy stratíš prístup k svojmu telefónu, môžeš použiť jeden z prístupových kódov nižšie pre obnovenie prístupu k svojmu účtu. Skladuj tieto prístupové kódy na bezpečnom mieste. Napríklad ich môžeš vytlačiť a uložiť ich spolu s inými dôležitými dokumentami. + add: Pridať + disable: Vypnúť dvojstupňové overenie + disabled_success: Dvojstupňové overenie bolo úspešne vypnuté + edit: Upraviť + enabled: Dvojstupňové overovanie je zapnuté + enabled_success: Dvojstupňové overovanie bolo úspešne zapnuté + generate_recovery_codes: Vygenerovať záložné kódy + lost_recovery_codes: Záložné kódy vás umožnia prístup k účtu v prípade straty mobilného telefónu. Pokiaľ ste svoje zálohové kódy stratili, môžete si tu vygenerovať nové. Staré zálohové kódy budú deaktivované. + methods: Metódy dvojstupňového overenia + otp: Overovacia apka + recovery_codes: Zálohovať záložné kódy + recovery_codes_regenerated: Záložné kódy boli úspešne znova vygenerované + recovery_instructions_html: Ak niekedy prídete o prístup k svojmu mobilnému telefónu, prístup k účtu môžete obnoviť použitím jedného zo záložných kódov nižšie. Záložné kódy si bezpečne uložte. Môžete si ich napríklad vytlačiť a založiť k iným dôležitým dokumentom. + webauthn: Bezpečnostné kľúče user_mailer: appeal_approved: action: Nastavenia účtu @@ -1331,7 +1403,7 @@ sk: backup_ready: explanation: Vyžiadal/a si si úplnú zálohu svojho Mastodon účtu. extra: Teraz je pripravená na stiahnutie! - subject: Tvoj archív je pripravený na stiahnutie + subject: Váš archív je pripravený na stiahnutie title: Odber archívu failed_2fa: details: 'Tu sú podrobnosti o pokuse o prihlásenie:' @@ -1349,9 +1421,9 @@ sk: title: delete_statuses: Príspevky vymazané disable: Účet bol zamrazený - mark_statuses_as_sensitive: Príspevky označené za chúlostivé + mark_statuses_as_sensitive: Príspevky označené ako citlivé none: Varovanie - sensitive: Účet označený za chúlostivý + sensitive: Účty označené ako citlivé silence: Účet bol obmedzený suspend: Tvoj účet bol vylúčený welcome: @@ -1360,9 +1432,11 @@ sk: apps_step: Stiahni naše oficiálne aplikácie. apps_title: Mastodon aplikácie edit_profile_action: Prispôsob + edit_profile_step: Naštartuje svoje interakcie vyplnením svojho profilu. edit_profile_title: Prispôsob si svoj profil explanation: Tu nájdeš nejaké tipy do začiatku feature_action: Zisti viac + feature_creativity: Mastodon vám pri tvorbe obsahu a vyjadrovaní sa online umožňuje používať audio, video, obrázky a fotky, opisy pre zleplšenie prístupnosti, ankety, varovania o obsahu, animované profilové fotky, vlastné emoji, upravené náhľady a ďalšie. Nech už chcete zverejňovať svoje vizuálne diela, hudbu či podcasty, Mastodon je tu pre vás. follow_action: Nasleduj follow_title: Prispôsob svoj domáci kanál follows_title: Koho nasledovať @@ -1371,10 +1445,15 @@ sk: subject: Vitaj na Mastodone title: Vitaj na palube, %{name}! users: - follow_limit_reached: Nemôžeš nasledovať viac ako %{limit} ľudí + follow_limit_reached: Nemôžete sledovať viac ako %{limit} ľudí invalid_otp_token: Neplatný kód pre dvojfaktorovú autentikáciu otp_lost_help_html: Pokiaľ si stratil/a prístup k obom, môžeš dať vedieť %{email} rate_limited: Príliš veľa pokusov o overenie, skús to znova neskôr. signed_in_as: 'Prihlásená/ý ako:' verification: + extra_instructions_html: Tip: Odkaz na vašom webe môže byť neviditeľný. Najdôležitejšia časť je rel="me", zabraňuje tomu, že sa za vás bude niekto vydávať na weboch s obsahom generovaným používateľmi. V záhlaví stránky môžete dokonca namiesto tagu a použiť tag link, ale kód HTML musí byť prístupný bez potreby spustenia JavaScriptu. + here_is_how: Ako na to + hint_html: "Každý na Mastodone môže overiť svoju totožnosť. Okamžite, zadarmo a navždy s využitím otvorených webových štandardov. Potrebujete len svoju vlastnú webovú stránku. Keď odkaz na ňu uvediete vo svojom profile, skontrolujeme, či je prepojená s vaším profilom a úspešné overenie zvýrazníme vizuálnym indikátorom." + instructions_html: Skopírujte kód nižšie a vložte ho do kódu HTML svojho webu. Potom pridajte svoju webovú stránku do jedného z extra polí v karte Úprava profilu a uložte zmeny. verification: Overenie + website_verification: Overenie webu diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 4b1cf77cb6c520..5a978ed66684df 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -190,6 +190,7 @@ sq: create_relay: Krijoni Rele create_unavailable_domain: Krijo Përkatësi të Papërdorshme create_user_role: Krijoni Rol + create_username_block: Krijoni Rregull Emrash Përdoruesish demote_user: Zhgradoje Përdoruesin destroy_announcement: Fshije Lajmërimin destroy_canonical_email_block: Fshini Bllokim Email-esh @@ -203,6 +204,7 @@ sq: destroy_status: Fshi Gjendje destroy_unavailable_domain: Fshi Përkatësi të Papërdorshme destroy_user_role: Asgjësoje Rolin + destroy_username_block: Fshini Rregull Emrash Përdoruesish disable_2fa_user: Çaktivizo 2FA-në disable_custom_emoji: Çaktivizo Emotikon Vetjak disable_relay: Çaktivizoje Relenë @@ -237,6 +239,7 @@ sq: update_report: Përditësoni Raportimin update_status: Përditëso Gjendjen update_user_role: Përditësoni Rol + update_username_block: Përditësoni Rregull Emrash Përdoruesish actions: approve_appeal_html: "%{name} miratoi apelim vendimi moderimi nga %{target}" approve_user_html: "%{name} miratoi regjistrim nga %{target}" @@ -255,6 +258,7 @@ sq: create_relay_html: "%{name} krijoi një rele %{target}" create_unavailable_domain_html: "%{name} ndali dërgimin drejt përkatësisë %{target}" create_user_role_html: "%{name} krijoi rolin %{target}" + create_username_block_html: "%{name} shtoi rregull për emra përdoruesish që përmbajnë %{target}" demote_user_html: "%{name} zhgradoi përdoruesin %{target}" destroy_announcement_html: "%{name} fshiu lajmërimin për %{target}" destroy_canonical_email_block_html: "%{name} zhbllokoi email me hashin %{target}" @@ -268,6 +272,7 @@ sq: destroy_status_html: "%{name} hoqi gjendje nga %{target}" destroy_unavailable_domain_html: "%{name} rinisi dërgimin drejt përkatësisë %{target}" destroy_user_role_html: "%{name} fshiu rolin %{target}" + destroy_username_block_html: "%{name} hoqi rregull për emra përdoruesish që përmbajnë %{target}" disable_2fa_user_html: "%{name} çaktivizoi domosdoshmërinë për dyfaktorësh për përdoruesin %{target}" disable_custom_emoji_html: "%{name} çaktivizoi emoxhin %{target}" disable_relay_html: "%{name} çaktivizoi relenë %{target}" @@ -302,6 +307,7 @@ sq: update_report_html: "%{name} përditësoi raportimin %{target}" update_status_html: "%{name} përditësoi gjendjen me %{target}" update_user_role_html: "%{name} ndryshoi rolin për %{target}" + update_username_block_html: "%{name} përditësoi rregull për emra përdoruesish që përmbajnë %{target}" deleted_account: fshiu llogarinë empty: S’u gjetën regjistra. filter_by_action: Filtroji sipas veprimit @@ -505,6 +511,7 @@ sq: select_capabilities: Përzgjidhni Aftësi sign_in: Hyni status: Gjendje + title: Shërbyes Shërbimesh Ndihmëse Fediversi title: FASP follow_recommendations: description_html: "Rekomandimet për ndjekje ndihmojnë përdoruesit e rinj të gjejnë shpejt lëndë me interes. Kur një përdorues nuk ka ndërvepruar mjaftueshëm me të tjerët, që të formohen rekomandime të personalizuara ndjekjeje, rekomandohen këto llogari. Ato përzgjidhen çdo ditë, prej një përzierje llogarish me shkallën më të lartë të angazhimit dhe numrin më të lartë të ndjekësve vendorë për një gjuhë të dhënë." @@ -835,6 +842,10 @@ sq: all: Për këdo disabled: Për askënd users: Për përdorues vendorë që kanë bërë hyrjen + feed_access: + modes: + authenticated: Vetëm përdorues të mirëfilltësuar + public: Kushdo registrations: moderation_recommandation: Ju lutemi, sigurohuni si keni një ekip adekuat dhe reagues moderimi, përpara se të hapni regjistrimet për këdo! preamble: Kontrolloni cilët mund të krijojnë llogari në shërbyesin tuaj. @@ -1075,6 +1086,25 @@ sq: other: Përdorur nga %{count} vetë gjatë javës së kaluar title: Rekomandime & Prirje trending: Në modë + username_blocks: + add_new: Shtoni të ri + block_registrations: Blloko regjistrimet + comparison: + contains: Përmban + equals: Është baras me + contains_html: Përmban %{string} + created_msg: U krijua me sukses rregull emrash përdoruesish + delete: Fshije + edit: + title: Përpunoni rregull emrash përdoruesi + matches_exactly_html: Baras me %{string} + new: + create: Krijoni rregull + title: Krijoni rregull të ri emrash përdoruesish + no_username_block_selected: S’u ndryshua ndonjë rregull emrash përdoruesishm ngaqë s’u përzgjodh ndonjë + not_permitted: Jo i lejuar + title: Rregulla emrash përdoruesish + updated_msg: Rregulli i emrave të përdoruesve u përditësua me sukses warning_presets: add_new: Shtoni të ri delete: Fshije @@ -1548,6 +1578,13 @@ sq: expires_at: Skadon më uses: Përdorime title: Ftoni njerëz + link_preview: + author_html: Nga %{name} + potentially_sensitive_content: + action: Klikoni për shfaqje + confirm_visit: Jeni i sigurt se doni të hapet kjo lidhje? + hide_button: Fshihe + label: Lëndë potencalisht me spec lists: errors: limit: Keni mbërritur në numrin maksimum të listave @@ -1648,6 +1685,10 @@ sq: title: Përmendje e re poll: subject: Përfundoi një pyetësor nga %{name} + quote: + body: 'Postimi juaj u citua nga %{name}:' + subject: "%{name} citoi postimin tuaj" + title: Citim i ri reblog: body: 'Gjendja juaj u përforcua nga %{name}:' subject: "%{name} përforcoi gjendjen tuaj" @@ -1696,6 +1737,9 @@ sq: self_vote: S’mund të votoni në pyetësorët tuaj too_few_options: duhet të ketë më tepër se një element too_many_options: s’mund të përmbajë më tepër se %{max} elementë + vote: Votoni + posting_defaults: + explanation: Këto rregullime do të përdoren si parazgjedhje, kur krijoni postime të reja, por mund t’i përpunoni për postim, brenda hartuesit. preferences: other: Tjetër posting_defaults: Parazgjedhje postimesh @@ -1851,6 +1895,9 @@ sq: other: "%{count} video" boosted_from_html: Përforcuar nga %{acct_link} content_warning: 'Sinjalizim lënde: %{warning}' + content_warnings: + hide: Fshihe postimin + show: Shfaq më tepër default_language: Njësoj me gjuhën e ndërfaqes disallowed_hashtags: one: 'përmbante një hashtag të palejuar: %{tags}' @@ -1858,15 +1905,24 @@ sq: edited_at_html: Përpunuar më %{date} errors: in_reply_not_found: Gjendja të cilës po provoni t’i përgjigjeni s’duket se ekziston. + quoted_status_not_found: Postimi që po rrekeni të citoni nuk duket se ekziston. over_character_limit: u tejkalua kufi shenjash prej %{max} pin_errors: direct: Postimet që janë të dukshme vetëm për përdoruesit e përmendur s’mund të fiksohen limit: Keni fiksuar tashmë numrin maksimum të mesazheve ownership: S’mund të fiksohen mesazhet e të tjerëve reblog: S’mund të fiksohet një përforcim + quote_policies: + followers: Vetëm ndjekës + nobody: Thjesht unë + public: Cilido title: '%{name}: "%{quote}"' visibilities: + direct: Përmendje private + private: Vetëm ndjekës public: Publike + public_long: Cilido që hyn e del në Mastodon + unlisted_long: Fshehur nga përfundime kërkimi në Mastodon, rrjedha kohore gjërash në modë dhe publike statuses_cleanup: enabled: Fshi automatikisht postime të vjetra enabled_hint: Fshin automatikisht postimet tuaja, pasi mbërrijnë një prag të caktuar moshe, hiq rastin kur ka përputhje me një nga përjashtimet më poshtë diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 50319622df6a55..f07a66d327e586 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -848,6 +848,10 @@ tr: all: Herkes için disabled: Hiç kimseye users: Oturum açan yerel kullanıcılara + feed_access: + modes: + authenticated: Sadece yetkilendirilmiş kullanıcılar + public: Herkes registrations: moderation_recommandation: Lütfen kayıtları herkese açmadan önce yeterli ve duyarlı bir denetleyici ekibine sahip olduğunuzdan emin olun! preamble: Sunucunuzda kimin hesap oluşturabileceğini denetleyin. @@ -1897,6 +1901,9 @@ tr: other: "%{count} videolar" boosted_from_html: "%{acct_link} kişisinden yeniden paylaştı" content_warning: 'İçerik uyarısı: %{warning}' + content_warnings: + hide: Gönderiyi gizle + show: Daha fazlasını göster default_language: Arayüz diliyle aynı disallowed_hashtags: one: 'izin verilmeyen bir etiket içeriyordu: %{tags}' diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 0af555c913edca..b38035ab071626 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -834,6 +834,10 @@ vi: all: Tới mọi người disabled: Không ai users: Để đăng nhập người cục bộ + feed_access: + modes: + authenticated: Chỉ những người dùng đã xác minh + public: Mọi người registrations: moderation_recommandation: Vui lòng đảm bảo rằng bạn có một đội ngũ kiểm duyệt và phản ứng nhanh trước khi mở đăng ký cho mọi người! preamble: Kiểm soát những ai có thể tạo tài khoản trên máy chủ của bạn. @@ -1548,6 +1552,13 @@ vi: expires_at: Hết hạn uses: Sử dụng title: Mời bạn bè + link_preview: + author_html: Bởi %{name} + potentially_sensitive_content: + action: Nhấn để xem + confirm_visit: Bạn có chắc muốn mở liên kết này? + hide_button: Ẩn + label: Có khả năng là nội dung nhạy cảm lists: errors: limit: Bạn đã đạt đến số lượng danh sách tối đa @@ -1855,6 +1866,9 @@ vi: other: "%{count} video" boosted_from_html: Đã đăng lại từ %{acct_link} content_warning: 'Cảnh báo nội dung: %{warning}' + content_warnings: + hide: Ẩn tút + show: Mở rộng default_language: Giống giao diện disallowed_hashtags: other: 'chứa các hashtag bị cấm: %{tags}' diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 3200bdfd23e648..60ab656e7ddeb5 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -834,6 +834,10 @@ zh-CN: all: 对所有人 disabled: 不对任何人 users: 对已登录的本站用户 + feed_access: + modes: + authenticated: 仅已登录用户 + public: 所有人 registrations: moderation_recommandation: 在向所有人开放注册之前,请确保你拥有一个人手足够且反应迅速的管理团队! preamble: 控制谁可以在你的服务器上创建账号。 @@ -1548,6 +1552,13 @@ zh-CN: expires_at: 失效时间 uses: 已使用次数 title: 邀请用户 + link_preview: + author_html: 来自 %{name} + potentially_sensitive_content: + action: 点击查看 + confirm_visit: 您确定要打开此链接吗? + hide_button: 隐藏 + label: 可能为敏感内容 lists: errors: limit: 你已达到列表数量的上限 @@ -1855,6 +1866,9 @@ zh-CN: other: "%{count} 段视频" boosted_from_html: 转嘟自 %{acct_link} content_warning: 内容警告:%{warning} + content_warnings: + hide: 隐藏嘟文 + show: 显示更多 default_language: 与界面显示语言相同 disallowed_hashtags: other: 包含以下被禁止的话题:%{tags} @@ -1877,7 +1891,7 @@ zh-CN: direct: 私下提及 private: 仅关注者 public: 公开 - public_long: 所有人(无论是否注册了 Mastodon) + public_long: 任何人(无论是否注册了 Mastodon) unlisted: 悄悄公开 unlisted_long: 不显示在Mastodon的搜索结果、热门趋势、公共时间线上 statuses_cleanup: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 101ea1850a28bc..0a0c3a1ee5626b 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -836,6 +836,10 @@ zh-TW: all: 至任何人 disabled: 至沒有人 users: 套用至所有登入的本站使用者 + feed_access: + modes: + authenticated: 僅限已登入之使用者 + public: 任何人 registrations: moderation_recommandation: 對所有人開放註冊之前,請確保您有人手充足且反應靈敏的管理員團隊! preamble: 控制誰能於您伺服器上建立帳號。 @@ -1550,6 +1554,13 @@ zh-TW: expires_at: 失效時間 uses: 已使用次數 title: 邀請使用者 + link_preview: + author_html: 來自 %{name} + potentially_sensitive_content: + action: 點擊以顯示 + confirm_visit: 您確定要開啟此連結嗎? + hide_button: 隱藏 + label: 可能為敏感內容 lists: errors: limit: 您所建立之列表數量已達上限 @@ -1857,6 +1868,9 @@ zh-TW: other: "%{count} 段影片" boosted_from_html: 轉嘟自 %{acct_link} content_warning: 內容警告: %{warning} + content_warnings: + hide: 隱藏嘟文 + show: 顯示更多 default_language: 與介面語言相同 disallowed_hashtags: other: 含有不得使用的標籤: %{tags} diff --git a/config/settings.yml b/config/settings.yml index 6cbdfa56d0e402..24488ef4a86459 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -18,7 +18,10 @@ defaults: &defaults registrations_secondary_end_hour: 0 profile_directory: true closed_registrations_message: '' - timeline_preview: true + local_live_feed_access: 'public' + remote_live_feed_access: 'public' + local_topic_feed_access: 'public' + remote_topic_feed_access: 'public' show_staff_badge: true preview_sensitive_media: false noindex: false diff --git a/db/migrate/20251002140103_migrate_timeline_preview_setting.rb b/db/migrate/20251002140103_migrate_timeline_preview_setting.rb new file mode 100644 index 00000000000000..4d180bd8f39ee0 --- /dev/null +++ b/db/migrate/20251002140103_migrate_timeline_preview_setting.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class MigrateTimelinePreviewSetting < ActiveRecord::Migration[8.0] + class Setting < ApplicationRecord; end + + def up + setting = Setting.find_by(var: 'timeline_preview') + return unless setting.present? && setting.attributes['value'].present? + + value = YAML.safe_load(setting.attributes['value'], permitted_classes: [ActiveSupport::HashWithIndifferentAccess, Symbol]) + + Setting.upsert_all( + %w(local_live_feed_access remote_live_feed_access local_topic_feed_access remote_topic_feed_access).map do |var| + { var: var, value: value ? "--- public\n" : "--- authenticated\n" } + end, + unique_by: :var + ) + end + + def down; end +end diff --git a/db/migrate/20251007100627_add_index_follows_on_target_account_id_and_account_id.rb b/db/migrate/20251007100627_add_index_follows_on_target_account_id_and_account_id.rb new file mode 100644 index 00000000000000..23c08d2d061fe2 --- /dev/null +++ b/db/migrate/20251007100627_add_index_follows_on_target_account_id_and_account_id.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddIndexFollowsOnTargetAccountIdAndAccountId < ActiveRecord::Migration[8.0] + disable_ddl_transaction! + + def change + add_index :follows, [:target_account_id, :account_id], algorithm: :concurrently + end +end diff --git a/db/migrate/20251007100813_remove_index_follows_on_target_account_id.rb b/db/migrate/20251007100813_remove_index_follows_on_target_account_id.rb new file mode 100644 index 00000000000000..142086f35829bb --- /dev/null +++ b/db/migrate/20251007100813_remove_index_follows_on_target_account_id.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class RemoveIndexFollowsOnTargetAccountId < ActiveRecord::Migration[8.0] + disable_ddl_transaction! + + def change + remove_index :follows, [:target_account_id], algorithm: :concurrently + end +end diff --git a/db/schema.rb b/db/schema.rb index e45637d366a743..3acd76e020efae 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_09_24_170259) do +ActiveRecord::Schema[8.0].define(version: 2025_10_07_100813) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -738,7 +738,7 @@ t.boolean "notify", default: false, null: false t.string "languages", array: true t.index ["account_id", "target_account_id"], name: "index_follows_on_account_id_and_target_account_id", unique: true - t.index ["target_account_id"], name: "index_follows_on_target_account_id" + t.index ["target_account_id", "account_id"], name: "index_follows_on_target_account_id_and_account_id" end create_table "friend_domains", force: :cascade do |t| diff --git a/docker-compose.yml b/docker-compose.yml index 5ddb9c04b0c8c9..c9bcb3157febb4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes build: . - image: kmyblue:20.0-dev + image: kmyblue:21.0-dev restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: build: dockerfile: ./streaming/Dockerfile context: . - image: kmyblue-streaming:20.0-dev + image: kmyblue-streaming:21.0-dev restart: always env_file: .env.production command: node ./streaming/index.js @@ -101,7 +101,7 @@ services: sidekiq: build: . - image: kmyblue:20.0-dev + image: kmyblue:21.0-dev restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb index 4cbbb3dffeae64..fc4606d236b7c5 100644 --- a/lib/mastodon/cli/accounts.rb +++ b/lib/mastodon/cli/accounts.rb @@ -202,14 +202,17 @@ def modify(username) user.role_id = nil end - password = SecureRandom.hex if options[:reset_password] - user.password = password if options[:reset_password] user.email = options[:email] if options[:email] user.disabled = false if options[:enable] user.disabled = true if options[:disable] user.approved = true if options[:approve] user.disable_two_factor! if options[:disable_2fa] + # Password changes are a little different, as we also need to ensure + # sessions, subscriptions, and access tokens are revoked after changing: + password = SecureRandom.hex if options[:reset_password] + user.change_password!(password) if options[:reset_password] + if user.save user.confirm if options[:confirm] diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index cf4cf1984a292b..571d39b1c48259 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -35,7 +35,7 @@ def patch end def default_prerelease - 'alpha.2' + 'alpha.3' end def prerelease diff --git a/package.json b/package.json index 5914b11f1a6c56..aad8e4eb168b15 100644 --- a/package.json +++ b/package.json @@ -196,7 +196,7 @@ "stylelint-config-prettier-scss": "^1.0.0", "stylelint-config-standard-scss": "^15.0.1", "typescript": "~5.9.0", - "typescript-eslint": "^8.29.1", + "typescript-eslint": "^8.45.0", "vitest": "^3.2.4" }, "resolutions": { diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index f165b2b758d9d3..999dff3ad1d095 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -1709,6 +1709,30 @@ def activity_for_object(json) end end + context 'with an unverifiable quote of a dead post' do + let(:quoted_status) { Fabricate(:status) } + + let(:object_json) do + build_object( + type: 'Note', + content: 'woah what she said is amazing', + quote: { type: 'Tombstone' } + ) + end + + it 'creates a status with an unverified quote' do + expect { subject.perform }.to change(sender.statuses, :count).by(1) + + status = sender.statuses.first + expect(status).to_not be_nil + expect(status.quote).to_not be_nil + expect(status.quote).to have_attributes( + state: 'deleted', + approval_uri: nil + ) + end + end + context 'with a legacy quote from other kmyblue server' do let(:quoted_status) { Fabricate(:status, account: Fabricate(:account, domain: 'example.com')) } let(:sender_software) { 'misskey' } diff --git a/spec/lib/activitypub/forwarder_spec.rb b/spec/lib/activitypub/forwarder_spec.rb new file mode 100644 index 00000000000000..f72e3342183e83 --- /dev/null +++ b/spec/lib/activitypub/forwarder_spec.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::Forwarder do + subject { described_class.new(account, payload, status) } + + let(:account) { Fabricate(:account) } + let(:remote_account) { Fabricate(:account, domain: 'example.com') } + let(:status) { Fabricate(:status, account: remote_account) } + + let(:signature) { { type: 'RsaSignature2017', signatureValue: 'foo' } } + let(:payload) do + { + '@context': [ + 'https://www.w3.org/ns/activitystreams', + 'https://w3id.org/security/v1', + ], + signature: signature, + type: 'Delete', + object: ActivityPub::TagManager.instance.uri_for(status), + }.deep_stringify_keys + end + + describe '#forwardable?' do + context 'when payload has an inlined signature' do + it 'returns true' do + expect(subject.forwardable?).to be true + end + end + + context 'when payload has an no inlined signature' do + let(:signature) { nil } + + it 'returns true' do + expect(subject.forwardable?).to be false + end + end + end + + describe '#forward!' do + let(:alice) { Fabricate(:account) } + let(:bob) { Fabricate(:account) } + let(:eve) { Fabricate(:account, domain: 'remote1.example.com', inbox_url: 'https://remote1.example.com/users/eve/inbox', protocol: :activitypub) } + let(:mallory) { Fabricate(:account, domain: 'remote2.example.com', inbox_url: 'https://remote2.example.com/users/mallory/inbox', protocol: :activitypub) } + + before do + alice.statuses.create!(reblog: status) + Fabricate(:quote, status: Fabricate(:status, account: bob), quoted_status: status, state: :accepted) + + eve.follow!(alice) + mallory.follow!(bob) + end + + it 'correctly forwards to expected remote followers' do + expect { subject.forward! } + .to enqueue_sidekiq_job(ActivityPub::LowPriorityDeliveryWorker).with(Oj.dump(payload), anything, eve.preferred_inbox_url) + .and enqueue_sidekiq_job(ActivityPub::LowPriorityDeliveryWorker).with(Oj.dump(payload), anything, mallory.preferred_inbox_url) + end + end +end diff --git a/spec/lib/mastodon/cli/accounts_spec.rb b/spec/lib/mastodon/cli/accounts_spec.rb index 111703a18bbe6b..927c6ca8debed8 100644 --- a/spec/lib/mastodon/cli/accounts_spec.rb +++ b/spec/lib/mastodon/cli/accounts_spec.rb @@ -361,11 +361,20 @@ def account_from_options context 'with --reset-password option' do let(:options) { { reset_password: true } } + let(:user) { Fabricate(:user, password: original_password) } + let(:original_password) { 'foobar12345' } + let(:new_password) { 'new_password12345' } + it 'returns a new password for the user' do - allow(SecureRandom).to receive(:hex).and_return('new_password') + allow(SecureRandom).to receive(:hex).and_return(new_password) + allow(Account).to receive(:find_local).and_return(user.account) + allow(user).to receive(:change_password!).and_call_original expect { subject } - .to output_results('new_password') + .to output_results(new_password) + + expect(user).to have_received(:change_password!).with(new_password) + expect(user.reload).to_not be_external_or_valid_password(original_password) end end diff --git a/spec/lib/permalink_redirector_spec.rb b/spec/lib/permalink_redirector_spec.rb index 5a544c3d38e136..81fa05449e96d0 100644 --- a/spec/lib/permalink_redirector_spec.rb +++ b/spec/lib/permalink_redirector_spec.rb @@ -10,39 +10,77 @@ Fabricate(:status, account: remote_account, id: 123, url: 'https://example.com/status-123') end - it 'returns path for legacy account links' do - redirector = described_class.new('accounts/2') - expect(redirector.redirect_path).to eq 'https://example.com/@alice' + it 'returns path for deck URLs with query params' do + redirector = described_class.new('/deck/directory?local=true') + expect(redirector.redirect_path).to eq '/directory?local=true' end - it 'returns path for legacy status links' do - redirector = described_class.new('statuses/123') - expect(redirector.redirect_path).to eq 'https://example.com/status-123' - end + context 'when account is not suspended' do + it 'returns path for legacy account links' do + redirector = described_class.new('accounts/2') + expect(redirector.redirect_path).to eq 'https://example.com/@alice' + end - it 'returns path for pretty account links' do - redirector = described_class.new('@alice@example.com') - expect(redirector.redirect_path).to eq 'https://example.com/@alice' - end + it 'returns path for legacy status links' do + redirector = described_class.new('statuses/123') + expect(redirector.redirect_path).to eq 'https://example.com/status-123' + end - it 'returns path for pretty status links' do - redirector = described_class.new('@alice/123') - expect(redirector.redirect_path).to eq 'https://example.com/status-123' - end + it 'returns path for pretty account links' do + redirector = described_class.new('@alice@example.com') + expect(redirector.redirect_path).to eq 'https://example.com/@alice' + end - it 'returns path for legacy status links with a query param' do - redirector = described_class.new('statuses/123?foo=bar') - expect(redirector.redirect_path).to eq 'https://example.com/status-123' - end + it 'returns path for pretty status links' do + redirector = described_class.new('@alice/123') + expect(redirector.redirect_path).to eq 'https://example.com/status-123' + end - it 'returns path for pretty status links with a query param' do - redirector = described_class.new('@alice/123?foo=bar') - expect(redirector.redirect_path).to eq 'https://example.com/status-123' + it 'returns path for legacy status links with a query param' do + redirector = described_class.new('statuses/123?foo=bar') + expect(redirector.redirect_path).to eq 'https://example.com/status-123' + end + + it 'returns path for pretty status links with a query param' do + redirector = described_class.new('@alice/123?foo=bar') + expect(redirector.redirect_path).to eq 'https://example.com/status-123' + end end - it 'returns path for deck URLs with query params' do - redirector = described_class.new('/deck/directory?local=true') - expect(redirector.redirect_path).to eq '/directory?local=true' + context 'when account is suspended' do + before do + remote_account.suspend! + end + + it 'returns nil for legacy account links' do + redirector = described_class.new('accounts/2') + expect(redirector.redirect_path).to be_nil + end + + it 'returns nil for legacy status links' do + redirector = described_class.new('statuses/123') + expect(redirector.redirect_path).to be_nil + end + + it 'returns nil for pretty account links' do + redirector = described_class.new('@alice@example.com') + expect(redirector.redirect_path).to be_nil + end + + it 'returns nil for pretty status links' do + redirector = described_class.new('@alice/123') + expect(redirector.redirect_path).to be_nil + end + + it 'returns nil for legacy status links with a query param' do + redirector = described_class.new('statuses/123?foo=bar') + expect(redirector.redirect_path).to be_nil + end + + it 'returns nil for pretty status links with a query param' do + redirector = described_class.new('@alice/123?foo=bar') + expect(redirector.redirect_path).to be_nil + end end end end diff --git a/spec/mailers/previews/notification_mailer_preview.rb b/spec/mailers/previews/notification_mailer_preview.rb index ae2d6802bcf24a..29ab047dfb198a 100644 --- a/spec/mailers/previews/notification_mailer_preview.rb +++ b/spec/mailers/previews/notification_mailer_preview.rb @@ -35,7 +35,9 @@ def reblog # Preview this email at http://localhost:3000/rails/mailers/notification_mailer/quote def quote - activity = Quote.first + notification = Notification.where(type: 'quote').order(:created_at).last + activity = notification.activity + mailer_for(activity.quoted_account, activity).quote end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a9ab15a956ed6c..7088266b34eb38 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -382,12 +382,15 @@ let(:current_sign_in_at) { Time.zone.now } - before do + it 'disables user' do + allow(redis).to receive(:publish) + user.disable! - end - it 'disables user' do expect(user).to have_attributes(disabled: true) + + expect(redis) + .to have_received(:publish).with("timeline:system:#{user.account.id}", Oj.dump(event: :kill)).once end end diff --git a/spec/requests/api/v1/timelines/link_spec.rb b/spec/requests/api/v1/timelines/link_spec.rb index 37a3b36872f076..fa911345d69b65 100644 --- a/spec/requests/api/v1/timelines/link_spec.rb +++ b/spec/requests/api/v1/timelines/link_spec.rb @@ -87,7 +87,7 @@ context 'when the instance does not allow public preview' do before do - Form::AdminSettings.new(timeline_preview: false).save + Form::AdminSettings.new(local_topic_feed_access: 'authenticated', remote_topic_feed_access: 'authenticated').save end it_behaves_like 'forbidden for wrong scope', 'profile' diff --git a/spec/requests/api/v1/timelines/public_spec.rb b/spec/requests/api/v1/timelines/public_spec.rb index cca41c4f459539..f6c0279946af83 100644 --- a/spec/requests/api/v1/timelines/public_spec.rb +++ b/spec/requests/api/v1/timelines/public_spec.rb @@ -121,7 +121,7 @@ context 'when the instance does not allow public preview' do before do - Form::AdminSettings.new(timeline_preview: false).save + Form::AdminSettings.new(local_live_feed_access: 'authenticated', remote_live_feed_access: 'authenticated').save end it_behaves_like 'forbidden for wrong scope', 'profile' diff --git a/spec/requests/api/v1/timelines/tag_spec.rb b/spec/requests/api/v1/timelines/tag_spec.rb index 75348fe1b4efb6..5a723b11e42220 100644 --- a/spec/requests/api/v1/timelines/tag_spec.rb +++ b/spec/requests/api/v1/timelines/tag_spec.rb @@ -99,7 +99,7 @@ context 'when the instance does not allow public preview' do before do - Form::AdminSettings.new(timeline_preview: false).save + Form::AdminSettings.new(local_topic_feed_access: 'authenticated', remote_topic_feed_access: 'authenticated').save end it_behaves_like 'forbidden for wrong scope', 'profile' diff --git a/spec/serializers/activitypub/note_serializer_spec.rb b/spec/serializers/activitypub/note_serializer_spec.rb index c5b617b221aee6..42058b30b3a75b 100644 --- a/spec/serializers/activitypub/note_serializer_spec.rb +++ b/spec/serializers/activitypub/note_serializer_spec.rb @@ -189,6 +189,21 @@ def reply_items end end + context 'with a deleted quote' do + let(:quoted_status) { Fabricate(:status) } + + before do + Fabricate(:quote, status: parent, quoted_status: nil, state: :accepted) + end + + it 'has the expected shape' do + expect(subject).to include({ + 'type' => 'Note', + 'quote' => { 'type' => 'Tombstone' }, + }) + end + end + context 'with a quote policy' do let(:parent) { Fabricate(:status, quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:followers] << 16) } diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb index c04aeebe28a316..39990aa2c6df48 100644 --- a/spec/services/activitypub/process_status_update_service_spec.rb +++ b/spec/services/activitypub/process_status_update_service_spec.rb @@ -1409,6 +1409,44 @@ end end + context 'when the status swaps a verified quote with an ID-less Tombstone through an explicit update' do + let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } + let(:quoted_status) { Fabricate(:status, account: quoted_account) } + let(:second_quoted_status) { Fabricate(:status, account: quoted_account) } + let!(:quote) { Fabricate(:quote, status: status, quoted_status: quoted_status, approval_uri: approval_uri, state: :accepted) } + let(:approval_uri) { 'https://quoted.example.com/approvals/1' } + + let(:payload) do + { + '@context': [ + 'https://www.w3.org/ns/activitystreams', + { + '@id': 'https://w3id.org/fep/044f#quote', + '@type': '@id', + }, + { + '@id': 'https://w3id.org/fep/044f#quoteAuthorization', + '@type': '@id', + }, + ], + id: 'foo', + type: 'Note', + summary: 'Show more', + content: 'Hello universe', + updated: '2021-09-08T22:39:25Z', + quote: { type: 'Tombstone' }, + } + end + + it 'updates the URI and unverifies the quote' do + expect { subject.call(status, json, json) } + .to change { status.quote.quoted_status }.from(quoted_status).to(nil) + .and change { status.quote.state }.from('accepted').to('deleted') + + expect { quote.reload }.to raise_error(ActiveRecord::RecordNotFound) + end + end + context 'when the status swaps a verified quote with another verifiable quote through an explicit update' do let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') } let(:second_quoted_account) { Fabricate(:account, domain: 'second-quoted.example.com') } diff --git a/spec/system/admin/dashboard_spec.rb b/spec/system/admin/dashboard_spec.rb index 06d31cde44e965..d0cedd2ed19ffa 100644 --- a/spec/system/admin/dashboard_spec.rb +++ b/spec/system/admin/dashboard_spec.rb @@ -9,6 +9,7 @@ before do stub_system_checks Fabricate :software_update + Fabricate :tag, requested_review_at: 5.minutes.ago sign_in(user) end @@ -18,6 +19,7 @@ expect(page) .to have_title(I18n.t('admin.dashboard.title')) .and have_content(I18n.t('admin.system_checks.software_version_patch_check.message_html')) + .and have_content('0 pending hashtags') end private diff --git a/spec/system/streaming/channel_subscriptions_spec.rb b/spec/system/streaming/channel_subscriptions_spec.rb index 54e125c293dfa0..447ea64f22f35f 100644 --- a/spec/system/streaming/channel_subscriptions_spec.rb +++ b/spec/system/streaming/channel_subscriptions_spec.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'rails_helper' -require 'debug' RSpec.describe 'Channel Subscriptions', :inline_jobs, :streaming do let(:application) { Fabricate(:application, confidential: false) } @@ -15,6 +14,25 @@ streaming_client.close end + context 'when the access token has insufficient scope to read statuses' do + let(:scopes) { 'profile' } + + it 'cannot subscribe to the public:local channel' do + streaming_client.authenticate(access_token.token) + + streaming_client.connect + streaming_client.subscribe('public:local') + + # Receive the error back from the subscription attempt: + message = streaming_client.wait_for_message + + expect(message).to include( + error: 'Access token does not have the required scopes', + status: 401 + ) + end + end + context 'when the access token has read scope' do let(:scopes) { 'read' } @@ -39,11 +57,52 @@ ) ) end + + it 'can subscribing to the user:notifications channel' do + streaming_client.authenticate(access_token.token) + + streaming_client.connect + streaming_client.subscribe('user:notification') + + # We need to perform an action that triggers a notification as there is + # no positive acknowledgement of subscriptions: + first_status = PostStatusService.new.call(user_account, text: 'Test') + ReblogService.new.call(bob_account, first_status) + + message = streaming_client.wait_for_message + + expect(message).to include( + event: 'notification', + stream: ['user:notification'] + ) + end end - context 'when the access token cannot read notifications' do + context 'when the access token has read:statuses scope' do let(:scopes) { 'read:statuses' } + it 'can subscribing to the public:local channel' do + streaming_client.authenticate(access_token.token) + + streaming_client.connect + streaming_client.subscribe('public:local') + + # We need to publish a status as there is no positive acknowledgement of + # subscriptions: + status = PostStatusService.new.call(bob_account, text: 'Hello @alice') + + # And then we want to receive that status: + message = streaming_client.wait_for_message + + expect(message).to include( + stream: be_an(Array).and(contain_exactly('public:local')), + event: 'update', + payload: include( + id: status.id.to_s + ) + ) + end + it 'cannot subscribing to the user:notifications channel' do streaming_client.authenticate(access_token.token) @@ -59,4 +118,27 @@ ) end end + + context 'when the access token has read:notifications scope' do + let(:scopes) { 'read:notifications' } + + it 'can subscribing to the user:notifications channel' do + streaming_client.authenticate(access_token.token) + + streaming_client.connect + streaming_client.subscribe('user:notification') + + # We need to perform an action that triggers a notification as there is + # no positive acknowledgement of subscriptions: + first_status = PostStatusService.new.call(user_account, text: 'Test') + ReblogService.new.call(bob_account, first_status) + + message = streaming_client.wait_for_message + + expect(message).to include( + event: 'notification', + stream: ['user:notification'] + ) + end + end end diff --git a/spec/system/streaming/streaming_spec.rb b/spec/system/streaming/streaming_spec.rb index c12bd1b18fed77..f5d3ba114265ae 100644 --- a/spec/system/streaming/streaming_spec.rb +++ b/spec/system/streaming/streaming_spec.rb @@ -74,4 +74,52 @@ expect(streaming_client.open?).to be(false) end end + + context 'with a disabled user account' do + before do + user.disable! + end + + it 'receives an 401 unauthorized error when trying to connect' do + streaming_client.connect + + expect(streaming_client.status).to eq(401) + expect(streaming_client.open?).to be(false) + end + end + + context 'when the user account is disabled whilst connected' do + it 'terminates the connection for the user' do + streaming_client.connect + + user.disable! + + expect(streaming_client.wait_for(:closed).code).to be(1000) + expect(streaming_client.open?).to be(false) + end + end + + context 'with a suspended user account' do + before do + user.account.suspend! + end + + it 'receives an 401 unauthorized error when trying to connect' do + streaming_client.connect + + expect(streaming_client.status).to eq(401) + expect(streaming_client.open?).to be(false) + end + end + + context 'when the user account is suspended whilst connected' do + it 'terminates the connection for the user' do + streaming_client.connect + + user.account.suspend! + + expect(streaming_client.wait_for(:closed).code).to be(1000) + expect(streaming_client.open?).to be(false) + end + end end diff --git a/streaming/index.js b/streaming/index.js index 29e00ac941e7a1..59d17c42b5e847 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -91,17 +91,6 @@ const parseJSON = (json, req) => { } }; -const PUBLIC_CHANNELS = [ - 'public', - 'public:media', - 'public:local', - 'public:local:media', - 'public:remote', - 'public:remote:media', - 'hashtag', - 'hashtag:local', -]; - // Used for priming the counters/gauges for the various metrics that are // per-channel const CHANNEL_NAMES = [ @@ -109,8 +98,16 @@ const CHANNEL_NAMES = [ 'user', 'user:notification', 'list', + 'antenna', 'direct', - ...PUBLIC_CHANNELS, + 'public', + 'public:media', + 'public:local', + 'public:local:media', + 'public:remote', + 'public:remote:media', + 'hashtag', + 'hashtag:local', ]; const startServer = async () => { @@ -397,10 +394,7 @@ const startServer = async () => { * @returns {Promise} */ const accountFromToken = async (token, req) => { - const result = await pgPool.query( - 'SELECT oauth_access_tokens.id, oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL LIMIT 1', - [token], - ); + const result = await pgPool.query('SELECT oauth_access_tokens.id, oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id INNER JOIN accounts ON accounts.id = users.account_id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL AND users.disabled IS FALSE AND accounts.suspended_at IS NULL LIMIT 1', [token]); if (result.rows.length === 0) { throw new AuthenticationError('Invalid access token'); @@ -486,12 +480,6 @@ const startServer = async () => { new Promise((resolve, reject) => { logger.debug(`Checking OAuth scopes for ${channelName}`); - // When accessing public channels, no scopes are needed - if (channelName && PUBLIC_CHANNELS.includes(channelName)) { - resolve(); - return; - } - // The `read` scope has the highest priority, if the token has it // then it can access all streams const requiredScopes = ['read']; diff --git a/streaming/lint-staged.config.mjs b/streaming/lint-staged.config.mjs index 430a999b9ab144..5f9230acbd55d7 100644 --- a/streaming/lint-staged.config.mjs +++ b/streaming/lint-staged.config.mjs @@ -1,5 +1,4 @@ const config = { - '*': 'prettier --ignore-unknown --write', '*.{js,ts}': 'eslint --fix', '**/*.ts': () => 'tsc -p tsconfig.json --noEmit', }; diff --git a/yarn.lock b/yarn.lock index bc2bc55b2586e9..4e0c01acc5e9b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2410,6 +2410,18 @@ __metadata: languageName: node linkType: hard +"@formatjs/ecma402-abstract@npm:2.3.5": + version: 2.3.5 + resolution: "@formatjs/ecma402-abstract@npm:2.3.5" + dependencies: + "@formatjs/fast-memoize": "npm:2.2.7" + "@formatjs/intl-localematcher": "npm:0.6.2" + decimal.js: "npm:^10.4.3" + tslib: "npm:^2.8.0" + checksum: 10c0/c6cac6312a1228347adf3a6a5fd09c0593e7d199e7a56484ece7cb8121c4138ba5c2777b70f82e88d8fbe3199ef5f48b2b1444f0348ee315b930e9db33c67d84 + languageName: node + linkType: hard + "@formatjs/fast-memoize@npm:2.2.7": version: 2.2.7 resolution: "@formatjs/fast-memoize@npm:2.2.7" @@ -2430,6 +2442,17 @@ __metadata: languageName: node linkType: hard +"@formatjs/icu-messageformat-parser@npm:2.11.3": + version: 2.11.3 + resolution: "@formatjs/icu-messageformat-parser@npm:2.11.3" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.3.5" + "@formatjs/icu-skeleton-parser": "npm:1.8.15" + tslib: "npm:^2.8.0" + checksum: 10c0/dfa08a671318bc9425f9b8e77ba0fb11856c9e1bb366b2a9c820212711d3483d9337fba50ef0a65c259c5564a6306355b065d739feae56e03b3046edba739460 + languageName: node + linkType: hard + "@formatjs/icu-skeleton-parser@npm:1.8.14": version: 1.8.14 resolution: "@formatjs/icu-skeleton-parser@npm:1.8.14" @@ -2440,6 +2463,16 @@ __metadata: languageName: node linkType: hard +"@formatjs/icu-skeleton-parser@npm:1.8.15": + version: 1.8.15 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.15" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.3.5" + tslib: "npm:^2.8.0" + checksum: 10c0/e33478f3cdb6d49f8531f35fb80db98d49533add42cd4ab8d3f3cef72c3496ae3042dfe24f252e6afffd3e4f6c9f1dec88367973c14e779dc07947c75641cede + languageName: node + linkType: hard + "@formatjs/intl-localematcher@npm:0.6.1": version: 0.6.1 resolution: "@formatjs/intl-localematcher@npm:0.6.1" @@ -2449,33 +2482,42 @@ __metadata: languageName: node linkType: hard +"@formatjs/intl-localematcher@npm:0.6.2": + version: 0.6.2 + resolution: "@formatjs/intl-localematcher@npm:0.6.2" + dependencies: + tslib: "npm:^2.8.0" + checksum: 10c0/22a17a4c67160b6c9f52667914acfb7b79cd6d80630d4ac6d4599ce447cb89d2a64f7d58fa35c3145ddb37fef893f0a45b9a55e663a4eb1f2ae8b10a89fac235 + languageName: node + linkType: hard + "@formatjs/intl-pluralrules@npm:^5.4.4": - version: 5.4.4 - resolution: "@formatjs/intl-pluralrules@npm:5.4.4" + version: 5.4.5 + resolution: "@formatjs/intl-pluralrules@npm:5.4.5" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.4" - "@formatjs/intl-localematcher": "npm:0.6.1" + "@formatjs/ecma402-abstract": "npm:2.3.5" + "@formatjs/intl-localematcher": "npm:0.6.2" decimal.js: "npm:^10.4.3" tslib: "npm:^2.8.0" - checksum: 10c0/8a8ec9f2fad40d9fa654a68de06fb18aaa6f0eafa908f41397f057366740625c12da627c6de68e0396fcd67ceaaa2c5c20a4b102f71ac8694abd9e76cceca949 + checksum: 10c0/2405fd2a4c8ce7a5c25ae824daa1408b07664a4f5ca573683fedad78a487a118b50391b0a2234db921c615e1ed4f53e860a55cd9892708ae49f5766980495b6e languageName: node linkType: hard -"@formatjs/intl@npm:3.1.6": - version: 3.1.6 - resolution: "@formatjs/intl@npm:3.1.6" +"@formatjs/intl@npm:3.1.7": + version: 3.1.7 + resolution: "@formatjs/intl@npm:3.1.7" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.4" + "@formatjs/ecma402-abstract": "npm:2.3.5" "@formatjs/fast-memoize": "npm:2.2.7" - "@formatjs/icu-messageformat-parser": "npm:2.11.2" - intl-messageformat: "npm:10.7.16" + "@formatjs/icu-messageformat-parser": "npm:2.11.3" + intl-messageformat: "npm:10.7.17" tslib: "npm:^2.8.0" peerDependencies: - typescript: ^5.6.0 + typescript: 5.8.3 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/a31f8d2569c9f2384f67a76f1cc2c8bfc2721c97a7dee0e971b6cfc0f223449bab0cfdc29140e3b71d74b04573c20ee8600909d256293e296a809da69a141530 + checksum: 10c0/52d800f587ed11407879f44b971a498844f116d966f9348ef1b597b7a4ee91f8023e0270797961be8126989512859f5944c4115e39675f4959a22b7837b62e77 languageName: node linkType: hard @@ -2499,6 +2541,25 @@ __metadata: languageName: node linkType: hard +"@formatjs/ts-transformer@npm:3.14.1": + version: 3.14.1 + resolution: "@formatjs/ts-transformer@npm:3.14.1" + dependencies: + "@formatjs/icu-messageformat-parser": "npm:2.11.3" + "@types/node": "npm:^22.0.0" + chalk: "npm:^4.1.2" + json-stable-stringify: "npm:^1.3.0" + tslib: "npm:^2.8.0" + typescript: "npm:5.8.3" + peerDependencies: + ts-jest: ^29 + peerDependenciesMeta: + ts-jest: + optional: true + checksum: 10c0/ed412d70fb0b8a57b74f1453e2605481295fda71ba462f4c65fab3d1a7f5a0c51c70fa78b9e9e2b291917eb63bbc5cffc7df27f04645832ae64e881e1327a11c + languageName: node + linkType: hard + "@gamestdio/websocket@npm:^0.3.2": version: 0.3.2 resolution: "@gamestdio/websocket@npm:0.3.2" @@ -2874,7 +2935,7 @@ __metadata: tiny-queue: "npm:^0.2.1" twitter-text: "npm:3.1.0" typescript: "npm:~5.9.0" - typescript-eslint: "npm:^8.29.1" + typescript-eslint: "npm:^8.45.0" use-debounce: "npm:^10.0.0" vite: "npm:^7.1.1" vite-plugin-manifest-sri: "npm:^0.2.0" @@ -4517,106 +4578,106 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.38.0" +"@typescript-eslint/eslint-plugin@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.45.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.38.0" - "@typescript-eslint/type-utils": "npm:8.38.0" - "@typescript-eslint/utils": "npm:8.38.0" - "@typescript-eslint/visitor-keys": "npm:8.38.0" + "@typescript-eslint/scope-manager": "npm:8.45.0" + "@typescript-eslint/type-utils": "npm:8.45.0" + "@typescript-eslint/utils": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" graphemer: "npm:^1.4.0" ignore: "npm:^7.0.0" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - "@typescript-eslint/parser": ^8.38.0 + "@typescript-eslint/parser": ^8.45.0 eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/199b82e9f0136baecf515df7c31bfed926a7c6d4e6298f64ee1a77c8bdd7a8cb92a2ea55a5a345c9f2948a02f7be6d72530efbe803afa1892b593fbd529d0c27 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/0c60a0e5d07fa8618348db38b5a81e66143d528e1b3cdb5678bbc6c60590cd559b27c98c36f5663230fc4cf6920dff2cd604de30b58df26a37fcfcc5dc1dbd45 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/parser@npm:8.38.0" +"@typescript-eslint/parser@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/parser@npm:8.45.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.38.0" - "@typescript-eslint/types": "npm:8.38.0" - "@typescript-eslint/typescript-estree": "npm:8.38.0" - "@typescript-eslint/visitor-keys": "npm:8.38.0" + "@typescript-eslint/scope-manager": "npm:8.45.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/typescript-estree": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/5580c2a328f0c15f85e4a0961a07584013cc0aca85fe868486187f7c92e9e3f6602c6e3dab917b092b94cd492ed40827c6f5fea42730bef88eb17592c947adf4 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/8b419bcf795b112a39fcac05dcf147835059345b6399035ffa3f76a9d8e320f3fac79cae2fe4320dcda83fa059b017ca7626a7b4e3da08a614415c8867d169b8 languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/project-service@npm:8.38.0" +"@typescript-eslint/project-service@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/project-service@npm:8.45.0" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.38.0" - "@typescript-eslint/types": "npm:^8.38.0" + "@typescript-eslint/tsconfig-utils": "npm:^8.45.0" + "@typescript-eslint/types": "npm:^8.45.0" debug: "npm:^4.3.4" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/87d2f55521e289bbcdc666b1f4587ee2d43039cee927310b05abaa534b528dfb1b5565c1545bb4996d7fbdf9d5a3b0aa0e6c93a8f1289e3fcfd60d246364a884 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/98af065a1a3ed9d3d1eb265e09d3e9c2ae676d500a8c1d764f5609fe2c1b86749516b709804eb814fae688be7809d11748b9ae691d43c28da51dac390ca81fa9 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/scope-manager@npm:8.38.0" +"@typescript-eslint/scope-manager@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/scope-manager@npm:8.45.0" dependencies: - "@typescript-eslint/types": "npm:8.38.0" - "@typescript-eslint/visitor-keys": "npm:8.38.0" - checksum: 10c0/ceaf489ea1f005afb187932a7ee363dfe1e0f7cc3db921283991e20e4c756411a5e25afbec72edd2095d6a4384f73591f4c750cf65b5eaa650c90f64ef9fe809 + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" + checksum: 10c0/54cd36206f6b4fc8e1e48576ed01e0d6ab20c2a9c4c7d90d5cc3a2d317dd8a13abe148ffecf471b16f1224aba5749e0905472745626bef9ae5bed771776f4abe languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.38.0, @typescript-eslint/tsconfig-utils@npm:^8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.38.0" +"@typescript-eslint/tsconfig-utils@npm:8.45.0, @typescript-eslint/tsconfig-utils@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.45.0" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/1a90da16bf1f7cfbd0303640a8ead64a0080f2b1d5969994bdac3b80abfa1177f0c6fbf61250bae082e72cf5014308f2f5cc98edd6510202f13420a7ffd07a84 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/227a9b7a5baaf35466fd369992cb933192515df1156ddf22f438deb344c2523695208e1036f5590b20603f31724de75a47fe0ee84e2fd4c8e9f3606f23f68112 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/type-utils@npm:8.38.0" +"@typescript-eslint/type-utils@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/type-utils@npm:8.45.0" dependencies: - "@typescript-eslint/types": "npm:8.38.0" - "@typescript-eslint/typescript-estree": "npm:8.38.0" - "@typescript-eslint/utils": "npm:8.38.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/typescript-estree": "npm:8.45.0" + "@typescript-eslint/utils": "npm:8.45.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/27795c4bd0be395dda3424e57d746639c579b7522af1c17731b915298a6378fd78869e8e141526064b6047db2c86ba06444469ace19c98cda5779d06f4abd37c + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/ce0f4c209c2418ebeb65e7de053499fb68bf6000bdd71068594fdb8c8ac3dbbd62935a3cea233989491f7da3ef5db87e7efd2910133c6abf6d0cbf57248f6442 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.38.0, @typescript-eslint/types@npm:^8.34.1, @typescript-eslint/types@npm:^8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/types@npm:8.38.0" - checksum: 10c0/f0ac0060c98c0f3d1871f107177b6ae25a0f1846ca8bd8cfc7e1f1dd0ddce293cd8ac4a5764d6a767de3503d5d01defcd68c758cb7ba6de52f82b209a918d0d2 +"@typescript-eslint/types@npm:8.45.0, @typescript-eslint/types@npm:^8.34.1, @typescript-eslint/types@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/types@npm:8.45.0" + checksum: 10c0/0213a0573c671d13bc91961a2b2e814ec7f6381ff093bce6704017bd96b2fc7fee25906c815cedb32a0601cf5071ca6c7c5f940d087c3b0d3dd7d4bc03478278 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.38.0" +"@typescript-eslint/typescript-estree@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.45.0" dependencies: - "@typescript-eslint/project-service": "npm:8.38.0" - "@typescript-eslint/tsconfig-utils": "npm:8.38.0" - "@typescript-eslint/types": "npm:8.38.0" - "@typescript-eslint/visitor-keys": "npm:8.38.0" + "@typescript-eslint/project-service": "npm:8.45.0" + "@typescript-eslint/tsconfig-utils": "npm:8.45.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -4624,33 +4685,33 @@ __metadata: semver: "npm:^7.6.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/00a00f6549877f4ae5c2847fa5ac52bf42cbd59a87533856c359e2746e448ed150b27a6137c92fd50c06e6a4b39e386d6b738fac97d80d05596e81ce55933230 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/8c2f44a00fe859a6cd4b50157c484c5b6a1c7af5d48e89ae79c5f4924947964962fc8f478ad4c2ade788907fceee9b72d4e376508ea79b51392f91082a37d239 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.38.0, @typescript-eslint/utils@npm:^8.27.0, @typescript-eslint/utils@npm:^8.8.1": - version: 8.38.0 - resolution: "@typescript-eslint/utils@npm:8.38.0" +"@typescript-eslint/utils@npm:8.45.0, @typescript-eslint/utils@npm:^8.27.0, @typescript-eslint/utils@npm:^8.8.1": + version: 8.45.0 + resolution: "@typescript-eslint/utils@npm:8.45.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.38.0" - "@typescript-eslint/types": "npm:8.38.0" - "@typescript-eslint/typescript-estree": "npm:8.38.0" + "@typescript-eslint/scope-manager": "npm:8.45.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/typescript-estree": "npm:8.45.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/e97a45bf44f315f9ed8c2988429e18c88e3369c9ee3227ee86446d2d49f7325abebbbc9ce801e178f676baa986d3e1fd4b5391f1640c6eb8944c123423ae43bb + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/b3c83a23813b15e20e303d7153789508c01e06dec355b1a80547c59aa36998d498102f45fcd13f111031fac57270608abb04d20560248d4448fd00b1cf4dc4ab languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.38.0": - version: 8.38.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.38.0" +"@typescript-eslint/visitor-keys@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.45.0" dependencies: - "@typescript-eslint/types": "npm:8.38.0" + "@typescript-eslint/types": "npm:8.45.0" eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/071a756e383f41a6c9e51d78c8c64bd41cd5af68b0faef5fbaec4fa5dbd65ec9e4cd610c2e2cdbe9e2facc362995f202850622b78e821609a277b5b601a1d4ec + checksum: 10c0/119adcf50c902dad7f7757bcdd88fad0a23a171d309d9b7cefe78af12e451cf84c04ae611f4c31f7e23f16c2b47665ad92e6e5648fc77d542ef306f465bf1f29 languageName: node linkType: hard @@ -5420,21 +5481,21 @@ __metadata: linkType: hard "babel-plugin-formatjs@npm:^10.5.37": - version: 10.5.39 - resolution: "babel-plugin-formatjs@npm:10.5.39" + version: 10.5.40 + resolution: "babel-plugin-formatjs@npm:10.5.40" dependencies: "@babel/core": "npm:^7.26.10" "@babel/helper-plugin-utils": "npm:^7.26.5" "@babel/plugin-syntax-jsx": "npm:^7.25.9" "@babel/traverse": "npm:^7.26.10" "@babel/types": "npm:^7.26.10" - "@formatjs/icu-messageformat-parser": "npm:2.11.2" - "@formatjs/ts-transformer": "npm:3.14.0" + "@formatjs/icu-messageformat-parser": "npm:2.11.3" + "@formatjs/ts-transformer": "npm:3.14.1" "@types/babel__core": "npm:^7.20.5" "@types/babel__helper-plugin-utils": "npm:^7.10.3" "@types/babel__traverse": "npm:^7.20.6" tslib: "npm:^2.8.0" - checksum: 10c0/08ddc1516e6504bc794257cc7a5b788068afce5f0bdb1c98458d6e7eb9e5b96385f5f4912f92909aad72b4e20083c1472e16d7c05d008bd84a5f3a6d38bb1e95 + checksum: 10c0/b065cc92ae70dd237bc2aa151f52f91f06337b2ad268d9332cf257414da528f8376aabe7019f9ff630abf55c1b409ecbac720a6ea163397179133b244982320e languageName: node linkType: hard @@ -6126,15 +6187,15 @@ __metadata: linkType: hard "cross-env@npm:^10.0.0": - version: 10.0.0 - resolution: "cross-env@npm:10.0.0" + version: 10.1.0 + resolution: "cross-env@npm:10.1.0" dependencies: "@epic-web/invariant": "npm:^1.0.0" cross-spawn: "npm:^7.0.6" bin: cross-env: dist/bin/cross-env.js cross-env-shell: dist/bin/cross-env-shell.js - checksum: 10c0/d16ffc3734106577d57b6253d81ab50294623bd59f96e161033eaf99c1c308ffbaba8463c23a6c0f72e841eff467cb7007a0a551f27554fcf2bbf6598cd828f9 + checksum: 10c0/834a862db456ba1fedf6c6da43436b123ae38f514fa286d6f0937c14fa83f13469f77f70f2812db041ae2d84f82bac627040b8686030aca27fbdf113dfa38b63 languageName: node linkType: hard @@ -8332,15 +8393,15 @@ __metadata: languageName: node linkType: hard -"intl-messageformat@npm:10.7.16, intl-messageformat@npm:^10.7.16": - version: 10.7.16 - resolution: "intl-messageformat@npm:10.7.16" +"intl-messageformat@npm:10.7.17, intl-messageformat@npm:^10.7.16": + version: 10.7.17 + resolution: "intl-messageformat@npm:10.7.17" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.4" + "@formatjs/ecma402-abstract": "npm:2.3.5" "@formatjs/fast-memoize": "npm:2.2.7" - "@formatjs/icu-messageformat-parser": "npm:2.11.2" + "@formatjs/icu-messageformat-parser": "npm:2.11.3" tslib: "npm:^2.8.0" - checksum: 10c0/537735bf6439f0560f132895d117df6839957ac04cdd58d861f6da86803d40bfc19059e3d341ddb8de87214b73a6329b57f9acdb512bb0f745dcf08729507b9b + checksum: 10c0/74445987da233cd5a6df0e4d35813ff11483b0788ff5cbbcf9e2a07c276cdd18001a3ba68583bf8d28920494b68a2be91a9c9f796062973dec3c95a4e88ffa81 languageName: node linkType: hard @@ -8354,8 +8415,8 @@ __metadata: linkType: hard "ioredis@npm:^5.3.2": - version: 5.8.0 - resolution: "ioredis@npm:5.8.0" + version: 5.8.1 + resolution: "ioredis@npm:5.8.1" dependencies: "@ioredis/commands": "npm:1.4.0" cluster-key-slot: "npm:^1.1.0" @@ -8366,7 +8427,7 @@ __metadata: redis-errors: "npm:^1.2.0" redis-parser: "npm:^3.0.0" standard-as-callback: "npm:^2.1.0" - checksum: 10c0/66fad6283c6d9052b4aa0987d592c1bf6c9471304eb0edf0c9d18024b1b38028adf29c05f1cf114b90f5bdb516576f897a654946e8c29568f404ac33cd3b9d19 + checksum: 10c0/4ed66444017150da027bce940a24bf726994691e2a7b3aa11d52f8aeb37f258068cc171af4d9c61247acafc28eb086fa8a7c79420b8e8d2907d2f74f39584465 languageName: node linkType: hard @@ -8955,16 +9016,16 @@ __metadata: languageName: node linkType: hard -"json-stable-stringify@npm:^1.1.1": - version: 1.2.1 - resolution: "json-stable-stringify@npm:1.2.1" +"json-stable-stringify@npm:^1.1.1, json-stable-stringify@npm:^1.3.0": + version: 1.3.0 + resolution: "json-stable-stringify@npm:1.3.0" dependencies: call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" + call-bound: "npm:^1.0.4" isarray: "npm:^2.0.5" jsonify: "npm:^0.0.1" object-keys: "npm:^1.1.1" - checksum: 10c0/e623e7ce89282f089d56454087edb717357e8572089b552fbc6980fb7814dc3943f7d0e4f1a19429a36ce9f4428b6c8ee6883357974457aaaa98daba5adebeea + checksum: 10c0/8b3ff19e4c23c0ad591a49bc3a015d89a538db787d12fe9c4072e1d64d8cfa481f8c37719c629c3d84e848847617bf49f5fee894cf1d25959ab5b67e1c517f31 languageName: node linkType: hard @@ -10353,8 +10414,8 @@ __metadata: linkType: hard "pino@npm:^9.0.0": - version: 9.12.0 - resolution: "pino@npm:9.12.0" + version: 9.13.1 + resolution: "pino@npm:9.13.1" dependencies: atomic-sleep: "npm:^1.0.0" on-exit-leak-free: "npm:^2.1.0" @@ -10369,7 +10430,7 @@ __metadata: thread-stream: "npm:^3.0.0" bin: pino: bin.js - checksum: 10c0/5cfe093e972a8471a90f7f380c01379eed3fd937038acb97d1de9180f097c044855ca89a2e70baa699aec3e8dcaec037d03e2c90dde235102a3e17b40f54cc1f + checksum: 10c0/c99e879f9538f7255488ad276a46a857cf9114217b754b850b7f1441e31b724a6d6f0697228ead954d3d9601522704e03cad5d441c228108073eed2f37ea0e41 languageName: node linkType: hard @@ -11156,16 +11217,16 @@ __metadata: linkType: hard "react-intl@npm:^7.1.10": - version: 7.1.11 - resolution: "react-intl@npm:7.1.11" + version: 7.1.13 + resolution: "react-intl@npm:7.1.13" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.4" - "@formatjs/icu-messageformat-parser": "npm:2.11.2" - "@formatjs/intl": "npm:3.1.6" + "@formatjs/ecma402-abstract": "npm:2.3.5" + "@formatjs/icu-messageformat-parser": "npm:2.11.3" + "@formatjs/intl": "npm:3.1.7" "@types/hoist-non-react-statics": "npm:^3.3.1" "@types/react": "npm:16 || 17 || 18 || 19" hoist-non-react-statics: "npm:^3.3.2" - intl-messageformat: "npm:10.7.16" + intl-messageformat: "npm:10.7.17" tslib: "npm:^2.8.0" peerDependencies: react: 16 || 17 || 18 || 19 @@ -11173,7 +11234,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/f20770fb7bcce7a67acec70b9183f5320b7f3f9bbcb263ca8f4787817297674d1be158687f94d1e2803a9c8696d4f93dd86a28898aba8bc5197e858313e3dd06 + checksum: 10c0/2288c63c3eb2b3fdb79af5fa7b0d297469cc2530143fec798d4603d713c2caf28c9cc1e3a0a53c7b0f90331a3b672ae18e0edefd2fe816de90f90daa7612fb41 languageName: node linkType: hard @@ -11818,8 +11879,8 @@ __metadata: linkType: hard "rollup-plugin-visualizer@npm:^6.0.3": - version: 6.0.3 - resolution: "rollup-plugin-visualizer@npm:6.0.3" + version: 6.0.4 + resolution: "rollup-plugin-visualizer@npm:6.0.4" dependencies: open: "npm:^8.0.0" picomatch: "npm:^4.0.2" @@ -11835,7 +11896,7 @@ __metadata: optional: true bin: rollup-plugin-visualizer: dist/bin/cli.js - checksum: 10c0/595d68936a6338744e8facd165fceedf7f2ebedc44863e640e725198001ed62948cc4a5d8403aa74e679de92957e4def3b1dffc4a9f8de71e4245929566553a3 + checksum: 10c0/e5d472bec0c863c9c3c46f55b303a9457e854bf1b654215e727a586da12897e2cfc30029f029c6c44dd8e9e61ce0d22f113a68ed8e5fe2256abeb58f265c0a89 languageName: node linkType: hard @@ -13434,18 +13495,28 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.28.0, typescript-eslint@npm:^8.29.1": - version: 8.38.0 - resolution: "typescript-eslint@npm:8.38.0" +"typescript-eslint@npm:^8.28.0, typescript-eslint@npm:^8.45.0": + version: 8.45.0 + resolution: "typescript-eslint@npm:8.45.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.38.0" - "@typescript-eslint/parser": "npm:8.38.0" - "@typescript-eslint/typescript-estree": "npm:8.38.0" - "@typescript-eslint/utils": "npm:8.38.0" + "@typescript-eslint/eslint-plugin": "npm:8.45.0" + "@typescript-eslint/parser": "npm:8.45.0" + "@typescript-eslint/typescript-estree": "npm:8.45.0" + "@typescript-eslint/utils": "npm:8.45.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/486b9862ee08f7827d808a2264ce03b58087b11c4c646c0da3533c192a67ae3fcb4e68d7a1e69d0f35a1edc274371a903a50ecfe74012d5eaa896cb9d5a81e0b + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/2342b0bffe6f719711adbb42116f90cb1fe1670e2e74dde2739482c9d61c2a975ee16e2d560684613050544b543342ec1b11b46e158a48ecc605f5882d2d5da7 + languageName: node + linkType: hard + +"typescript@npm:5.8.3": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/5f8bb01196e542e64d44db3d16ee0e4063ce4f3e3966df6005f2588e86d91c03e1fb131c2581baf0fb65ee79669eea6e161cd448178986587e9f6844446dbb48 languageName: node linkType: hard @@ -13459,6 +13530,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A5.8.3#optional!builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/39117e346ff8ebd87ae1510b3a77d5d92dae5a89bde588c747d25da5c146603a99c8ee588c7ef80faaf123d89ed46f6dbd918d534d641083177d5fac38b8a1cb + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^5.6.0#optional!builtin, typescript@patch:typescript@npm%3A~5.9.0#optional!builtin": version: 5.9.2 resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5" @@ -13892,8 +13973,8 @@ __metadata: linkType: hard "vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1": - version: 7.1.7 - resolution: "vite@npm:7.1.7" + version: 7.1.9 + resolution: "vite@npm:7.1.9" dependencies: esbuild: "npm:^0.25.0" fdir: "npm:^6.5.0" @@ -13942,7 +14023,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/3f6bd61a65aaa81368f4dda804f0e23b103664724218ccb5a0b1a0c7e284df498107b57ced951dc40ae4c5d472435bc8fb5c836414e729ee7e102809eaf6ff80 + checksum: 10c0/f628f903a137c1410232558bde99c223ea00a090bda6af77752c61f912955f0050aac12d3cfe024d08a0f150ff6fab61b3d0be75d634a59b94d49f525392e1f7 languageName: node linkType: hard