diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index d14af5d7d..5d9917b39 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -2,6 +2,7 @@ version: '3' services: app: + working_dir: /workspaces/mastodon/ build: context: . dockerfile: Dockerfile @@ -70,7 +71,7 @@ services: hard: -1 libretranslate: - image: libretranslate/libretranslate:v1.5.6 + image: libretranslate/libretranslate:v1.5.7 restart: unless-stopped volumes: - lt-data:/home/libretranslate/.local diff --git a/.env.test b/.env.test index 9e6abea5c..d2763e582 100644 --- a/.env.test +++ b/.env.test @@ -4,7 +4,8 @@ NODE_ENV=production LOCAL_DOMAIN=cb6e6126.ngrok.io LOCAL_HTTPS=true -# Required by ActiveRecord encryption feature -ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=fkSxKD2bF396kdQbrP1EJ7WbU7ZgNokR -ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=r0hvVmzBVsjxC7AMlwhOzmtc36ZCOS1E -ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PhdFyyfy5xJ7WVd2lWBpcPScRQHzRTNr +# Secret values required by ActiveRecord encryption feature +# Use `bin/rails db:encryption:init` to generate fresh secrets +ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=test_determinist_key_DO_NOT_USE_IN_PRODUCTION +ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=test_salt_DO_NOT_USE_IN_PRODUCTION +ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=test_primary_key_DO_NOT_USE_IN_PRODUCTION diff --git a/.github/renovate.json5 b/.github/renovate.json5 index e92608a43..378d4fc83 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -141,6 +141,13 @@ matchUpdateTypes: ['patch', 'minor'], groupName: 'RSpec (non-major)', }, + { + // Group all opentelemetry-ruby packages in the same PR + matchManagers: ['bundler'], + matchPackagePrefixes: ['opentelemetry-'], + matchUpdateTypes: ['patch', 'minor'], + groupName: 'opentelemetry-ruby (non-major)', + }, // Add labels depending on package manager { matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] }, { matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] }, diff --git a/.github/stylelint-matcher.json b/.github/stylelint-matcher.json deleted file mode 100644 index cdfd4086b..000000000 --- a/.github/stylelint-matcher.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "stylelint", - "pattern": [ - { - "regexp": "^([^\\s].*)$", - "file": 1 - }, - { - "regexp": "^\\s+((\\d+):(\\d+))?\\s+(✖|×)\\s+(.*)\\s{2,}(.*)$", - "line": 2, - "column": 3, - "message": 5, - "code": 6, - "loop": true - } - ] - } - ] -} diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml index 256dcffc7..1df7672d6 100644 --- a/.github/workflows/crowdin-download.yml +++ b/.github/workflows/crowdin-download.yml @@ -52,7 +52,7 @@ jobs: # Create or update the pull request - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.4 + uses: peter-evans/create-pull-request@v6.0.5 with: commit-message: 'New Crowdin translations' title: 'New Crowdin Translations (automated)' diff --git a/.github/workflows/lint-css.yml b/.github/workflows/lint-css.yml index e5f487487..d3b8035cd 100644 --- a/.github/workflows/lint-css.yml +++ b/.github/workflows/lint-css.yml @@ -38,9 +38,5 @@ jobs: - name: Set up Javascript environment uses: ./.github/actions/setup-javascript - - uses: xt0rted/stylelint-problem-matcher@v1 - - - run: echo "::add-matcher::.github/stylelint-matcher.json" - - name: Stylelint - run: yarn lint:css + run: yarn lint:css -f github diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index 3a78f8b43..2bfa59e6b 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -115,8 +115,8 @@ jobs: matrix: ruby-version: - '3.1' + - '3.2' - '.ruby-version' - - '3.3' steps: - uses: actions/checkout@v4 @@ -145,6 +145,8 @@ jobs: uses: codecov/codecov-action@v4 with: files: coverage/lcov/mastodon.lcov + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} test-e2e: name: End to End testing @@ -184,14 +186,16 @@ jobs: DISABLE_SIMPLECOV: true RAILS_ENV: test BUNDLE_WITH: test + LOCAL_DOMAIN: localhost:3000 + LOCAL_HTTPS: false strategy: fail-fast: false matrix: ruby-version: - '3.1' + - '3.2' - '.ruby-version' - - '3.3' steps: - uses: actions/checkout@v4 @@ -213,7 +217,7 @@ jobs: - name: Load database schema run: './bin/rails db:create db:schema:load db:seed' - - run: bundle exec rake spec:system + - run: bin/rspec spec/system --tag streaming --tag js - name: Archive logs uses: actions/upload-artifact@v4 @@ -260,8 +264,8 @@ jobs: ports: - 6379:6379 - search: - image: ${{ matrix.search-image }} + elasticsearch: + image: ${{ contains(matrix.search-image, 'elasticsearch') && matrix.search-image || '' }} env: discovery.type: single-node xpack.security.enabled: false @@ -273,6 +277,20 @@ jobs: ports: - 9200:9200 + opensearch: + image: ${{ contains(matrix.search-image, 'opensearch') && matrix.search-image || '' }} + env: + discovery.type: single-node + DISABLE_INSTALL_DEMO_CONFIG: true + DISABLE_SECURITY_PLUGIN: true + options: >- + --health-cmd "curl http://localhost:9200/_cluster/health" + --health-interval 10s + --health-timeout 5s + --health-retries 10 + ports: + - 9200:9200 + env: DB_HOST: localhost DB_USER: postgres @@ -289,13 +307,15 @@ jobs: matrix: ruby-version: - '3.1' + - '3.2' - '.ruby-version' - - '3.3' search-image: - docker.elastic.co/elasticsearch/elasticsearch:7.17.13 include: - ruby-version: '.ruby-version' search-image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2 + - ruby-version: '.ruby-version' + search-image: opensearchproject/opensearch:2 steps: - uses: actions/checkout@v4 diff --git a/.nvmrc b/.nvmrc index 7795cadb5..973f49d55 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.12 +20.13 diff --git a/.rubocop.yml b/.rubocop.yml index 542e90b5e..cbc0afd28 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -211,6 +211,11 @@ Style/PercentLiteralDelimiters: Style/RedundantBegin: Enabled: false +# Reason: Prevailing style choice +# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantfetchblock +Style/RedundantFetchBlock: + Enabled: false + # Reason: Overridden to reduce implicit StandardError rescues # https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror Style/RescueStandardError: diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index c2826d718..a70caad8c 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp` -# using RuboCop version 1.62.1. +# using RuboCop version 1.63.5. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -42,14 +42,6 @@ RSpec/MultipleMemoizedHelpers: RSpec/NestedGroups: Max: 6 -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/HasAndBelongsToMany: - Exclude: - - 'app/models/concerns/account/associations.rb' - - 'app/models/status.rb' - - 'app/models/tag.rb' - Rails/OutputSafety: Exclude: - 'config/initializers/simple_form.rb' @@ -62,10 +54,6 @@ Style/ClassEqualityComparison: - 'app/helpers/jsonld_helper.rb' - 'app/serializers/activitypub/outbox_serializer.rb' -Style/ClassVars: - Exclude: - - 'config/initializers/devise.rb' - # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowedVars. Style/FetchEnvVar: @@ -82,7 +70,7 @@ Style/FetchEnvVar: - 'config/initializers/vapid.rb' - 'lib/mastodon/redis_config.rb' - 'lib/tasks/repo.rake' - - 'spec/features/profile_spec.rb' + - 'spec/system/profile_spec.rb' # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle, MaxUnannotatedPlaceholdersAllowed, AllowedMethods, AllowedPatterns. @@ -134,13 +122,6 @@ Style/HashTransformValues: - 'app/serializers/rest/web_push_subscription_serializer.rb' - 'app/services/import_service.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/IfUnlessModifier: - Exclude: - - 'config/environments/production.rb' - - 'config/initializers/devise.rb' - - 'config/initializers/ffmpeg.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). Style/MapToHash: Exclude: @@ -188,16 +169,6 @@ Style/RedundantConstantBase: - 'config/environments/production.rb' - 'config/initializers/sidekiq.rb' -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: SafeForConstants. -Style/RedundantFetchBlock: - Exclude: - - 'config/initializers/1_hosts.rb' - - 'config/initializers/chewy.rb' - - 'config/initializers/devise.rb' - - 'config/initializers/paperclip.rb' - - 'config/puma.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength. # AllowedMethods: present?, blank?, presence, try, try! @@ -205,20 +176,6 @@ Style/SafeNavigation: Exclude: - 'app/models/concerns/account/finder_concern.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: only_raise, only_fail, semantic -Style/SignalException: - Exclude: - - 'lib/devise/strategies/two_factor_ldap_authenticatable.rb' - - 'lib/devise/strategies/two_factor_pam_authenticatable.rb' - -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: Mode. -Style/StringConcatenation: - Exclude: - - 'config/initializers/paperclip.rb' - # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: WordRegex. # SupportedStyles: percent, brackets diff --git a/.ruby-version b/.ruby-version index 351227fca..bea438e9a 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.2.4 +3.3.1 diff --git a/.simplecov b/.simplecov deleted file mode 100644 index fbd0207be..000000000 --- a/.simplecov +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -if ENV['CI'] - require 'simplecov-lcov' - SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true - SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter -else - SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter -end - -SimpleCov.start 'rails' do - enable_coverage :branch - - add_filter 'lib/linter' - - add_group 'Libraries', 'lib' - add_group 'Policies', 'app/policies' - add_group 'Presenters', 'app/presenters' - add_group 'Serializers', 'app/serializers' - add_group 'Services', 'app/services' - add_group 'Validators', 'app/validators' -end diff --git a/CHANGELOG.md b/CHANGELOG.md index a53790afa..c9b24d6f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,61 @@ All notable changes to this project will be documented in this file. +## [4.2.9] - 2024-05-30 + +### Security + +- Update dependencies +- Fix private mention filtering ([GHSA-5fq7-3p3j-9vrf](https://github.com/mastodon/mastodon/security/advisories/GHSA-5fq7-3p3j-9vrf)) +- Fix password change endpoint not being rate-limited ([GHSA-q3rg-xx5v-4mxh](https://github.com/mastodon/mastodon/security/advisories/GHSA-q3rg-xx5v-4mxh)) +- Add hardening around rate-limit bypass ([GHSA-c2r5-cfqr-c553](https://github.com/mastodon/mastodon/security/advisories/GHSA-c2r5-cfqr-c553)) + +### Added + +- Add rate-limit on OAuth application registration ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/30316)) +- Add fallback redirection when getting a webfinger query `WEB_DOMAIN@WEB_DOMAIN` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28592)) +- Add `digest` attribute to `Admin::DomainBlock` entity in REST API ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/29092)) + +### Removed + +- Remove superfluous application-level caching in some controllers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29862)) +- Remove aggressive OAuth application vacuuming ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/30316)) + +### Fixed + +- Fix leaking Elasticsearch connections in Sidekiq processes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30450)) +- Fix language of remote posts not being recognized when using unusual casing ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30403)) +- Fix off-by-one in `tootctl media` commands ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30306)) +- Fix removal of allowed domains (in `LIMITED_FEDERATION_MODE`) not being recorded in the audit log ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/30125)) +- Fix not being able to block a subdomain of an already-blocked domain through the API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30119)) +- Fix `Idempotency-Key` being ignored when scheduling a post ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30084)) +- Fix crash when supplying the `FFMPEG_BINARY` environment variable ([timothyjrogers](https://github.com/mastodon/mastodon/pull/30022)) +- Fix improper email address validation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29838)) +- Fix results/query in `api/v1/featured_tags/suggestions` ([mjankowski](https://github.com/mastodon/mastodon/pull/29597)) +- Fix unblocking internationalized domain names under certain conditions ([tribela](https://github.com/mastodon/mastodon/pull/29530)) +- Fix admin account created by `mastodon:setup` not being auto-approved ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29379)) +- Fix reference to non-existent var in CLI maintenance command ([mjankowski](https://github.com/mastodon/mastodon/pull/28363)) + +## [4.2.8] - 2024-02-23 + +### Added + +- Add hourly task to automatically require approval for new registrations in the absence of moderators ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29318), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/29355)) + In order to prevent future abandoned Mastodon servers from being used for spam, harassment and other malicious activity, Mastodon will now automatically switch new user registrations to require moderator approval whenever they are left open and no activity (including non-moderation actions from apps) from any logged-in user with permission to access moderation reports has been detected in a full week. + When this happens, users with the permission to change server settings will receive an email notification. + This feature is disabled when `EMAIL_DOMAIN_ALLOWLIST` is used, and can also be disabled with `DISABLE_AUTOMATIC_SWITCHING_TO_APPROVED_REGISTRATIONS=true`. + +### Changed + +- Change registrations to be closed by default on new installations ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29280)) + If you are running a server and never changed your registrations mode from the default, updating will automatically close your registrations. + Simply re-enable them through the administration interface or using `tootctl settings registrations open` if you want to enable them again. + +### Fixed + +- Fix processing of remote ActivityPub actors making use of `Link` objects as `Image` `url` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29335)) +- Fix link verifications when page size exceeds 1MB ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29358)) + ## [4.2.7] - 2024-02-16 ### Fixed diff --git a/Dockerfile b/Dockerfile index ccf57a0d0..6cf26d28c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,15 +7,15 @@ ARG TARGETPLATFORM=${TARGETPLATFORM} ARG BUILDPLATFORM=${BUILDPLATFORM} -# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.2.4"] -ARG RUBY_VERSION="3.2.4" +# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.1"] +ARG RUBY_VERSION="3.3.1" # # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"] ARG NODE_MAJOR_VERSION="20" # Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"] ARG DEBIAN_VERSION="bookworm" # Node image to use for base image based on combined variables (ex: 20-bookworm-slim) FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim as node -# Ruby image to use for base image based on combined variables (ex: 3.2.4-slim-bookworm) +# Ruby image to use for base image based on combined variables (ex: 3.3.1-slim-bookworm) FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} as ruby # Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA diff --git a/Gemfile b/Gemfile index a10613b30..d9de33182 100644 --- a/Gemfile +++ b/Gemfile @@ -31,7 +31,7 @@ gem 'browser' gem 'charlock_holmes', '~> 0.7.7' gem 'chewy', '~> 7.3' gem 'devise', '~> 4.9' -gem 'devise-two-factor', '~> 4.1' +gem 'devise-two-factor' group :pam_authentication, optional: true do gem 'devise_pam_authenticatable2', '~> 9.2' @@ -57,7 +57,7 @@ gem 'htmlentities', '~> 4.3' gem 'http', '~> 5.2.0' gem 'http_accept_language', '~> 2.1' gem 'httplog', '~> 1.6.2' -gem 'i18n', '1.14.1' # TODO: Remove version when resolved: https://github.com/glebm/i18n-tasks/issues/552 / https://github.com/ruby-i18n/i18n/pull/688 +gem 'i18n' gem 'idn-ruby', require: 'idn' gem 'inline_svg' gem 'kaminari', '~> 1.2' @@ -103,6 +103,26 @@ gem 'rdf-normalize', '~> 0.5' gem 'private_address_check', '~> 0.5' +gem 'opentelemetry-api', '~> 1.2.5' + +group :opentelemetry do + gem 'opentelemetry-exporter-otlp', '~> 0.26.3', require: false + gem 'opentelemetry-instrumentation-active_job', '~> 0.7.1', require: false + gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.20.1', require: false + gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.21.2', require: false + gem 'opentelemetry-instrumentation-excon', '~> 0.22.0', require: false + gem 'opentelemetry-instrumentation-faraday', '~> 0.24.1', require: false + gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false + gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false + gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false + gem 'opentelemetry-instrumentation-pg', '~> 0.27.1', require: false + gem 'opentelemetry-instrumentation-rack', '~> 0.24.1', require: false + gem 'opentelemetry-instrumentation-rails', '~> 0.30.0', require: false + gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false + gem 'opentelemetry-instrumentation-sidekiq', '~> 0.25.2', require: false + gem 'opentelemetry-sdk', '~> 1.4', require: false +end + group :test do # Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab gem 'rspec-github', '~> 2.4', require: false @@ -114,7 +134,7 @@ group :test do gem 'email_spec' # Extra RSpec extension methods and helpers for sidekiq - gem 'rspec-sidekiq', '~> 4.0' + gem 'rspec-sidekiq', '~> 5.0' # Browser integration testing gem 'capybara', '~> 3.39' @@ -160,7 +180,7 @@ group :development do # Preview mail in the browser gem 'letter_opener', '~> 1.8' - gem 'letter_opener_web', '~> 2.0' + gem 'letter_opener_web', '~> 3.0' # Security analysis CLI tools gem 'brakeman', '~> 6.0', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 620da8499..5c480c525 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,35 +10,35 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (7.1.3.2) - actionpack (= 7.1.3.2) - activesupport (= 7.1.3.2) + actioncable (7.1.3.3) + actionpack (= 7.1.3.3) + activesupport (= 7.1.3.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.3.2) - actionpack (= 7.1.3.2) - activejob (= 7.1.3.2) - activerecord (= 7.1.3.2) - activestorage (= 7.1.3.2) - activesupport (= 7.1.3.2) + actionmailbox (7.1.3.3) + actionpack (= 7.1.3.3) + activejob (= 7.1.3.3) + activerecord (= 7.1.3.3) + activestorage (= 7.1.3.3) + activesupport (= 7.1.3.3) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.3.2) - actionpack (= 7.1.3.2) - actionview (= 7.1.3.2) - activejob (= 7.1.3.2) - activesupport (= 7.1.3.2) + actionmailer (7.1.3.3) + actionpack (= 7.1.3.3) + actionview (= 7.1.3.3) + activejob (= 7.1.3.3) + activesupport (= 7.1.3.3) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.3.2) - actionview (= 7.1.3.2) - activesupport (= 7.1.3.2) + actionpack (7.1.3.3) + actionview (= 7.1.3.3) + activesupport (= 7.1.3.3) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -46,15 +46,15 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.3.2) - actionpack (= 7.1.3.2) - activerecord (= 7.1.3.2) - activestorage (= 7.1.3.2) - activesupport (= 7.1.3.2) + actiontext (7.1.3.3) + actionpack (= 7.1.3.3) + activerecord (= 7.1.3.3) + activestorage (= 7.1.3.3) + activesupport (= 7.1.3.3) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.3.2) - activesupport (= 7.1.3.2) + actionview (7.1.3.3) + activesupport (= 7.1.3.3) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -64,22 +64,22 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (7.1.3.2) - activesupport (= 7.1.3.2) + activejob (7.1.3.3) + activesupport (= 7.1.3.3) globalid (>= 0.3.6) - activemodel (7.1.3.2) - activesupport (= 7.1.3.2) - activerecord (7.1.3.2) - activemodel (= 7.1.3.2) - activesupport (= 7.1.3.2) + activemodel (7.1.3.3) + activesupport (= 7.1.3.3) + activerecord (7.1.3.3) + activemodel (= 7.1.3.3) + activesupport (= 7.1.3.3) timeout (>= 0.4.0) - activestorage (7.1.3.2) - actionpack (= 7.1.3.2) - activejob (= 7.1.3.2) - activerecord (= 7.1.3.2) - activesupport (= 7.1.3.2) + activestorage (7.1.3.3) + actionpack (= 7.1.3.3) + activejob (= 7.1.3.3) + activerecord (= 7.1.3.3) + activesupport (= 7.1.3.3) marcel (~> 1.0) - activesupport (7.1.3.2) + activesupport (7.1.3.3) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -97,22 +97,20 @@ GEM activerecord (>= 3.2, < 8.0) rake (>= 10.4, < 14.0) ast (2.4.2) - attr_encrypted (4.0.0) - encryptor (~> 3.0.0) attr_required (1.0.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.916.0) - aws-sdk-core (3.192.1) + aws-partitions (1.929.0) + aws-sdk-core (3.196.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.79.0) - aws-sdk-core (~> 3, >= 3.191.0) + aws-sdk-kms (1.81.0) + aws-sdk-core (~> 3, >= 3.193.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.147.0) - aws-sdk-core (~> 3, >= 3.192.0) + aws-sdk-s3 (1.151.0) + aws-sdk-core (~> 3, >= 3.194.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sigv4 (1.8.0) @@ -132,14 +130,7 @@ GEM erubi (>= 1.0.0) rack (>= 0.9.0) rouge (>= 1.0.0) - better_html (2.1.1) - actionview (>= 6.0) - activesupport (>= 6.0) - ast (~> 2.0) - erubi (~> 1.4) - parser (>= 2.4) - smart_properties - bigdecimal (3.1.7) + bigdecimal (3.1.8) bindata (2.5.0) binding_of_caller (1.0.1) debug_inspector (>= 1.2.0) @@ -169,9 +160,9 @@ GEM activesupport cbor (0.5.9.8) charlock_holmes (0.7.7) - chewy (7.5.1) + chewy (7.6.0) activesupport (>= 5.2) - elasticsearch (>= 7.12.0, < 7.14.0) + elasticsearch (>= 7.14.0, < 8) elasticsearch-dsl chunky_png (1.4.0) climate_control (1.2.0) @@ -204,9 +195,8 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-two-factor (4.1.1) + devise-two-factor (5.0.0) activesupport (~> 7.0) - attr_encrypted (>= 1.3, < 5, != 2) devise (~> 4.0) railties (~> 7.0) rotp (~> 6.0) @@ -220,29 +210,28 @@ GEM domain_name (0.6.20240107) doorkeeper (5.6.9) railties (>= 5) - dotenv (3.1.0) + dotenv (3.1.2) drb (2.2.1) ed25519 (1.3.0) - elasticsearch (7.13.3) - elasticsearch-api (= 7.13.3) - elasticsearch-transport (= 7.13.3) - elasticsearch-api (7.13.3) + elasticsearch (7.17.10) + elasticsearch-api (= 7.17.10) + elasticsearch-transport (= 7.17.10) + elasticsearch-api (7.17.10) multi_json elasticsearch-dsl (0.1.10) - elasticsearch-transport (7.13.3) - faraday (~> 1) + elasticsearch-transport (7.17.10) + faraday (>= 1, < 3) multi_json email_spec (2.2.2) htmlentities (~> 4.3.3) launchy (~> 2.1) mail (~> 2.7) - encryptor (3.0.0) erubi (1.12.0) et-orbi (1.2.11) tzinfo excon (0.110.0) fabrication (2.31.0) - faker (3.3.1) + faker (3.4.1) i18n (>= 1.8.11, < 2) faraday (1.10.3) faraday-em_http (~> 1.0) @@ -283,7 +272,7 @@ GEM fog-json (1.2.0) fog-core multi_json (~> 1.10) - fog-openstack (1.1.0) + fog-openstack (1.1.1) fog-core (~> 2.1) fog-json (>= 1.0) formatador (1.1.0) @@ -295,6 +284,9 @@ GEM ruby-progressbar (~> 1.4) globalid (1.2.1) activesupport (>= 6.1) + google-protobuf (3.25.3) + googleapis-common-protos-types (1.14.0) + google-protobuf (~> 3.18) haml (6.3.0) temple (>= 0.8.2) thor @@ -304,7 +296,7 @@ GEM activesupport (>= 5.1) haml (>= 4.0.6) railties (>= 5.1) - haml_lint (0.57.0) + haml_lint (0.58.0) haml (>= 5.0) parallel (~> 1.10) rainbow @@ -332,12 +324,11 @@ GEM httplog (1.6.3) rack (>= 2.0) rainbow (>= 2.0.0) - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) - i18n-tasks (1.0.13) + i18n-tasks (1.0.14) activesupport (>= 4.0.2) ast (>= 2.1.0) - better_html (>= 1.0, < 3.0) erubi highline (>= 2.0.0) i18n @@ -350,8 +341,8 @@ GEM activesupport (>= 3.0) nokogiri (>= 1.6) io-console (0.7.2) - irb (1.12.0) - rdoc + irb (1.13.1) + rdoc (>= 4.0.0) reline (>= 0.4.2) jmespath (1.6.2) json (2.7.2) @@ -398,10 +389,10 @@ GEM addressable (~> 2.8) letter_opener (1.10.0) launchy (>= 2.2, < 4) - letter_opener_web (2.0.0) - actionmailer (>= 5.2) - letter_opener (~> 1.7) - railties (>= 5.2) + letter_opener_web (3.0.0) + actionmailer (>= 6.1) + letter_opener (~> 1.9) + railties (>= 6.1) rexml link_header (0.0.8) llhttp-ffi (0.5.0) @@ -431,10 +422,10 @@ GEM memory_profiler (1.0.1) mime-types (3.5.2) mime-types-data (~> 3.2015) - mime-types-data (3.2024.0305) + mime-types-data (3.2024.0507) mini_mime (1.1.5) mini_portile2 (2.8.6) - minitest (5.22.3) + minitest (5.23.1) msgpack (1.7.2) multi_json (1.15.0) multipart-post (2.4.0) @@ -443,7 +434,7 @@ GEM uri net-http-persistent (4.0.2) connection_pool (~> 2.2) - net-imap (0.4.10) + net-imap (0.4.11) date net-protocol net-ldap (0.19.0) @@ -453,8 +444,8 @@ GEM timeout net-smtp (0.5.0) net-protocol - nio4r (2.7.1) - nokogiri (1.16.4) + nio4r (2.7.3) + nokogiri (1.16.5) mini_portile2 (~> 2.8.2) racc (~> 1.4) nsa (0.3.0) @@ -495,10 +486,100 @@ GEM openssl (3.2.0) openssl-signature_algorithm (1.3.0) openssl (> 2.0) + opentelemetry-api (1.2.5) + opentelemetry-common (0.20.1) + opentelemetry-api (~> 1.0) + opentelemetry-exporter-otlp (0.26.3) + google-protobuf (~> 3.14) + googleapis-common-protos-types (~> 1.3) + opentelemetry-api (~> 1.1) + opentelemetry-common (~> 0.20) + opentelemetry-sdk (~> 1.2) + opentelemetry-semantic_conventions + opentelemetry-helpers-sql-obfuscation (0.1.0) + opentelemetry-common (~> 0.20) + opentelemetry-instrumentation-action_pack (0.9.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-rack (~> 0.21) + opentelemetry-instrumentation-action_view (0.7.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (~> 0.1) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-active_job (0.7.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-active_model_serializers (0.20.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-active_record (0.7.2) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-active_support (0.5.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-base (0.22.3) + opentelemetry-api (~> 1.0) + opentelemetry-registry (~> 0.1) + opentelemetry-instrumentation-concurrent_ruby (0.21.3) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-excon (0.22.1) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.20.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-faraday (0.24.2) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.20.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-http (0.23.3) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-http_client (0.22.4) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.20.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-net_http (0.22.4) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.20.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-pg (0.27.3) + opentelemetry-api (~> 1.0) + opentelemetry-helpers-sql-obfuscation + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-rack (0.24.3) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.20.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-rails (0.30.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-action_pack (~> 0.9.0) + opentelemetry-instrumentation-action_view (~> 0.7.0) + opentelemetry-instrumentation-active_job (~> 0.7.0) + opentelemetry-instrumentation-active_record (~> 0.7.0) + opentelemetry-instrumentation-active_support (~> 0.5.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-redis (0.25.4) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.20.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-sidekiq (0.25.3) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.20.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-registry (0.3.1) + opentelemetry-api (~> 1.1) + opentelemetry-sdk (1.4.1) + opentelemetry-api (~> 1.1) + opentelemetry-common (~> 0.20) + opentelemetry-registry (~> 0.2) + opentelemetry-semantic_conventions + opentelemetry-semantic_conventions (1.10.0) + opentelemetry-api (~> 1.0) orm_adapter (0.5.0) ox (2.14.18) parallel (1.24.0) - parser (3.3.0.5) + parser (3.3.1.0) ast (~> 2.4.1) racc parslet (2.0.0) @@ -526,10 +607,10 @@ GEM public_suffix (5.0.5) puma (6.4.2) nio4r (~> 2.0) - pundit (2.3.1) + pundit (2.3.2) activesupport (>= 3.0.0) raabro (1.4.0) - racc (1.7.3) + racc (1.8.0) rack (2.2.9) rack-attack (6.7.0) rack (>= 1.0, < 4) @@ -553,20 +634,20 @@ GEM rackup (1.0.0) rack (< 3) webrick - rails (7.1.3.2) - actioncable (= 7.1.3.2) - actionmailbox (= 7.1.3.2) - actionmailer (= 7.1.3.2) - actionpack (= 7.1.3.2) - actiontext (= 7.1.3.2) - actionview (= 7.1.3.2) - activejob (= 7.1.3.2) - activemodel (= 7.1.3.2) - activerecord (= 7.1.3.2) - activestorage (= 7.1.3.2) - activesupport (= 7.1.3.2) + rails (7.1.3.3) + actioncable (= 7.1.3.3) + actionmailbox (= 7.1.3.3) + actionmailer (= 7.1.3.3) + actionpack (= 7.1.3.3) + actiontext (= 7.1.3.3) + actionview (= 7.1.3.3) + activejob (= 7.1.3.3) + activemodel (= 7.1.3.3) + activerecord (= 7.1.3.3) + activestorage (= 7.1.3.3) + activesupport (= 7.1.3.3) bundler (>= 1.15.0) - railties (= 7.1.3.2) + railties (= 7.1.3.3) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -581,9 +662,9 @@ GEM rails-i18n (7.0.9) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (7.1.3.2) - actionpack (= 7.1.3.2) - activesupport (= 7.1.3.2) + railties (7.1.3.3) + actionpack (= 7.1.3.3) + activesupport (= 7.1.3.3) irb rackup (>= 1.0.0) rake (>= 12.2) @@ -604,15 +685,16 @@ GEM redis (>= 4) redlock (1.3.2) redis (>= 3.0.0, < 6.0) - regexp_parser (2.9.0) - reline (0.5.2) + regexp_parser (2.9.2) + reline (0.5.7) io-console (~> 0.5) request_store (1.6.0) rack (>= 1.4) responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.2.6) + rexml (3.2.8) + strscan (>= 3.0.9) rotp (6.3.0) rouge (4.2.1) rpam2 (4.0.2) @@ -627,7 +709,7 @@ GEM rspec-support (~> 3.13.0) rspec-github (2.4.0) rspec-core (~> 3.0) - rspec-mocks (3.13.0) + rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-rails (6.1.2) @@ -638,13 +720,13 @@ GEM rspec-expectations (~> 3.13) rspec-mocks (~> 3.13) rspec-support (~> 3.13) - rspec-sidekiq (4.2.0) + rspec-sidekiq (5.0.0) rspec-core (~> 3.0) rspec-expectations (~> 3.0) rspec-mocks (~> 3.0) sidekiq (>= 5, < 8) rspec-support (3.13.1) - rubocop (1.63.3) + rubocop (1.64.0) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) @@ -655,8 +737,8 @@ GEM rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.2) - parser (>= 3.3.0.4) + rubocop-ast (1.31.3) + parser (>= 3.3.1.0) rubocop-capybara (2.20.0) rubocop (~> 1.41) rubocop-factory_bot (2.25.1) @@ -664,12 +746,12 @@ GEM rubocop-performance (1.21.0) rubocop (>= 1.48.1, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rails (2.24.1) + rubocop-rails (2.25.0) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rspec (2.29.1) + rubocop-rspec (2.29.2) rubocop (~> 1.40) rubocop-capybara (~> 2.17) rubocop-factory_bot (~> 2.22) @@ -693,7 +775,7 @@ GEM scenic (1.8.0) activerecord (>= 4.0.0) railties (>= 4.0.0) - selenium-webdriver (4.20.1) + selenium-webdriver (4.21.1) base64 (~> 0.2) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) @@ -717,7 +799,7 @@ GEM thor (>= 0.20, < 3.0) simple-navigation (4.4.0) activesupport (>= 2.3.2) - simple_form (5.3.0) + simple_form (5.3.1) actionpack (>= 5.2) activemodel (>= 5.2) simplecov (0.22.0) @@ -727,7 +809,6 @@ GEM simplecov-html (0.12.3) simplecov-lcov (0.8.0) simplecov_json_formatter (0.1.4) - smart_properties (1.17.0) stackprof (0.2.26) statsd-ruby (1.5.0) stoplight (4.1.0) @@ -735,6 +816,7 @@ GEM stringio (3.1.0) strong_migrations (1.8.0) activerecord (>= 5.2) + strscan (3.1.0) swd (1.3.0) activesupport (>= 3) attr_required (>= 0.0.5) @@ -795,7 +877,7 @@ GEM webfinger (1.2.0) activesupport httpclient (>= 2.4) - webmock (3.23.0) + webmock (3.23.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -813,7 +895,7 @@ GEM xorcist (1.1.3) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.13) + zeitwerk (2.6.14) PLATFORMS ruby @@ -842,7 +924,7 @@ DEPENDENCIES database_cleaner-active_record debug (~> 1.8) devise (~> 4.9) - devise-two-factor (~> 4.1) + devise-two-factor devise_pam_authenticatable2 (~> 9.2) discard (~> 1.2) doorkeeper (~> 5.6) @@ -864,7 +946,7 @@ DEPENDENCIES http (~> 5.2.0) http_accept_language (~> 2.1) httplog (~> 1.6.2) - i18n (= 1.14.1) + i18n i18n-tasks (~> 1.0) idn-ruby inline_svg @@ -875,7 +957,7 @@ DEPENDENCIES kaminari (~> 1.2) kt-paperclip (~> 7.2) letter_opener (~> 1.8) - letter_opener_web (~> 2.0) + letter_opener_web (~> 3.0) link_header (~> 0.0) lograge (~> 0.12) mail (~> 2.8) @@ -893,6 +975,22 @@ DEPENDENCIES omniauth-rails_csrf_protection (~> 1.0) omniauth-saml (~> 2.0) omniauth_openid_connect (~> 0.6.1) + opentelemetry-api (~> 1.2.5) + opentelemetry-exporter-otlp (~> 0.26.3) + opentelemetry-instrumentation-active_job (~> 0.7.1) + opentelemetry-instrumentation-active_model_serializers (~> 0.20.1) + opentelemetry-instrumentation-concurrent_ruby (~> 0.21.2) + opentelemetry-instrumentation-excon (~> 0.22.0) + opentelemetry-instrumentation-faraday (~> 0.24.1) + opentelemetry-instrumentation-http (~> 0.23.2) + opentelemetry-instrumentation-http_client (~> 0.22.3) + opentelemetry-instrumentation-net_http (~> 0.22.4) + opentelemetry-instrumentation-pg (~> 0.27.1) + opentelemetry-instrumentation-rack (~> 0.24.1) + opentelemetry-instrumentation-rails (~> 0.30.0) + opentelemetry-instrumentation-redis (~> 0.25.3) + opentelemetry-instrumentation-sidekiq (~> 0.25.2) + opentelemetry-sdk (~> 1.4) ox (~> 2.14) parslet pg (~> 1.5) @@ -917,7 +1015,7 @@ DEPENDENCIES rqrcode (~> 2.2) rspec-github (~> 2.4) rspec-rails (~> 6.0) - rspec-sidekiq (~> 4.0) + rspec-sidekiq (~> 5.0) rubocop rubocop-capybara rubocop-performance @@ -952,7 +1050,7 @@ DEPENDENCIES xorcist (~> 1.1) RUBY VERSION - ruby 3.2.3p157 + ruby 3.3.1p55 BUNDLED WITH 2.5.9 diff --git a/README.md b/README.md index 1d0e75dab..0353a4c67 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre - **PostgreSQL** 12+ - **Redis** 4+ - **Ruby** 3.1+ -- **Node.js** 16+ +- **Node.js** 18+ The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation. @@ -91,10 +91,12 @@ A **Vagrant** configuration is included for development purposes. To use it, com To set up **MacOS** for native development, complete the following steps: - Use a Ruby version manager to install the specified version from `.ruby-version` +- Run `bundle` to install required gems - Run `brew install postgresql@14 redis imagemagick libidn` to install required dependencies - Navigate to Mastodon's root directory and run `brew install nvm` then `nvm use` to use the version from `.nvmrc` +- Run `yarn` to install required packages - Run `corepack enable && corepack prepare` -- Run `bundle exec rails db:setup` (optionally prepend `RAILS_ENV=development` to target the dev environment) +- Run `RAILS_ENV=development bundle exec rails db:setup` - Finally, run `bin/dev` which will launch the local services via `overmind` (if installed) or `foreman` ### Docker diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 32549e151..c3131edce 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -25,7 +25,7 @@ class AccountsController < ApplicationController limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE @statuses = filtered_statuses.without_reblogs.limit(limit) - @statuses = cache_collection(@statuses, Status) + @statuses = preload_collection(@statuses, Status) end format.json do diff --git a/app/controllers/activitypub/collections_controller.rb b/app/controllers/activitypub/collections_controller.rb index d5632902f..c25362c9b 100644 --- a/app/controllers/activitypub/collections_controller.rb +++ b/app/controllers/activitypub/collections_controller.rb @@ -18,7 +18,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController def set_items case params[:id] when 'featured' - @items = for_signed_account { cache_collection(@account.pinned_statuses, Status) } + @items = for_signed_account { preload_collection(@account.pinned_statuses, Status) } @items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) } when 'tags' @items = for_signed_account { @account.featured_tags } diff --git a/app/controllers/activitypub/outboxes_controller.rb b/app/controllers/activitypub/outboxes_controller.rb index 8079e011d..b8baf64e1 100644 --- a/app/controllers/activitypub/outboxes_controller.rb +++ b/app/controllers/activitypub/outboxes_controller.rb @@ -60,7 +60,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController def set_statuses return unless page_requested? - @statuses = cache_collection_paginated_by_id( + @statuses = preload_collection_paginated_by_id( AccountStatusesFilter.new(@account, signed_request_account).results, Status, LIMIT, diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index d3be7817f..9beb8fde6 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -128,7 +128,7 @@ module Admin def unblock_email authorize @account, :unblock_email? - CanonicalEmailBlock.matching_account(@account).delete_all + CanonicalEmailBlock.where(reference_account: @account).delete_all log_action :unblock_email, @account diff --git a/app/controllers/admin/domain_allows_controller.rb b/app/controllers/admin/domain_allows_controller.rb index 31be1978b..b0f139e3a 100644 --- a/app/controllers/admin/domain_allows_controller.rb +++ b/app/controllers/admin/domain_allows_controller.rb @@ -25,6 +25,8 @@ class Admin::DomainAllowsController < Admin::BaseController def destroy authorize @domain_allow, :destroy? UnallowDomainService.new.call(@domain_allow) + log_action :destroy, @domain_allow + redirect_to admin_instances_path, notice: I18n.t('admin.domain_allows.destroyed_msg') end diff --git a/app/controllers/admin/site_uploads_controller.rb b/app/controllers/admin/site_uploads_controller.rb index a5d2cf41c..96e61cf6b 100644 --- a/app/controllers/admin/site_uploads_controller.rb +++ b/app/controllers/admin/site_uploads_controller.rb @@ -9,7 +9,7 @@ module Admin @site_upload.destroy! - redirect_to admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg') + redirect_back fallback_location: admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg') end private diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index 35ea9c8ec..c42f27776 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -19,11 +19,11 @@ class Api::V1::Accounts::StatusesController < Api::BaseController end def load_statuses - @account.unavailable? ? [] : cached_account_statuses + @account.unavailable? ? [] : preloaded_account_statuses end - def cached_account_statuses - cache_collection_paginated_by_id( + def preloaded_account_statuses + preload_collection_paginated_by_id( AccountStatusesFilter.new(@account, current_account, params).results, Status, limit_param(DEFAULT_STATUSES_LIMIT), diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 23fc85b47..84b604b30 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -9,16 +9,22 @@ class Api::V1::AccountsController < Api::BaseController before_action -> { doorkeeper_authorize! :follow, :write, :'write:blocks' }, only: [:block, :unblock] before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:create] - before_action :require_user!, except: [:show, :create] - before_action :set_account, except: [:create] - before_action :check_account_approval, except: [:create] - before_action :check_account_confirmation, except: [:create] + before_action :require_user!, except: [:index, :show, :create] + before_action :set_account, except: [:index, :create] + before_action :set_accounts, only: [:index] + before_action :check_account_approval, except: [:index, :create] + before_action :check_account_confirmation, except: [:index, :create] before_action :check_enabled_registrations, only: [:create] + before_action :check_accounts_limit, only: [:index] skip_before_action :require_authenticated_user!, only: :create override_rate_limit_headers :follow, family: :follows + def index + render json: @accounts, each_serializer: REST::AccountSerializer + end + def show cache_if_unauthenticated! render json: @account, serializer: REST::AccountSerializer @@ -79,6 +85,10 @@ class Api::V1::AccountsController < Api::BaseController @account = Account.find(params[:id]) end + def set_accounts + @accounts = Account.where(id: account_ids).without_unapproved + end + def check_account_approval raise(ActiveRecord::RecordNotFound) if @account.local? && @account.user_pending? end @@ -87,10 +97,22 @@ class Api::V1::AccountsController < Api::BaseController raise(ActiveRecord::RecordNotFound) if @account.local? && !@account.user_confirmed? end + def check_accounts_limit + raise(Mastodon::ValidationError) if account_ids.size > DEFAULT_ACCOUNTS_LIMIT + end + def relationships(**options) AccountRelationshipsPresenter.new([@account], current_user.account_id, **options) end + def account_ids + Array(accounts_params[:id]).uniq.map(&:to_i) + end + + def accounts_params + params.permit(id: []) + end + def account_params params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone, :invite_code) end diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb index b589d277d..ae94ac59c 100644 --- a/app/controllers/api/v1/admin/domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb @@ -29,10 +29,11 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController def create authorize :domain_block, :create? + @domain_block = DomainBlock.new(resource_params) existing_domain_block = resource_params[:domain].present? ? DomainBlock.rule_for(resource_params[:domain]) : nil - return render json: existing_domain_block, serializer: REST::Admin::ExistingDomainBlockErrorSerializer, status: 422 if existing_domain_block.present? + return render json: existing_domain_block, serializer: REST::Admin::ExistingDomainBlockErrorSerializer, status: 422 if conflicts_with_existing_block?(@domain_block, existing_domain_block) - @domain_block = DomainBlock.create!(resource_params) + @domain_block.save! DomainBlockWorker.perform_async(@domain_block.id) log_action :create, @domain_block render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer @@ -55,6 +56,10 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController private + def conflicts_with_existing_block?(domain_block, existing_domain_block) + existing_domain_block.present? && (existing_domain_block.domain == TagManager.instance.normalize_domain(domain_block.domain) || !domain_block.stricter_than?(existing_domain_block)) + end + def set_domain_blocks @domain_blocks = filtered_domain_blocks.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) end diff --git a/app/controllers/api/v1/apps/credentials_controller.rb b/app/controllers/api/v1/apps/credentials_controller.rb index 6256bed64..29ab92038 100644 --- a/app/controllers/api/v1/apps/credentials_controller.rb +++ b/app/controllers/api/v1/apps/credentials_controller.rb @@ -4,6 +4,6 @@ class Api::V1::Apps::CredentialsController < Api::BaseController def show return doorkeeper_render_error unless valid_doorkeeper_token? - render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer, fields: %i(name website vapid_key client_id scopes) + render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer end end diff --git a/app/controllers/api/v1/apps_controller.rb b/app/controllers/api/v1/apps_controller.rb index 97177547a..50feaf185 100644 --- a/app/controllers/api/v1/apps_controller.rb +++ b/app/controllers/api/v1/apps_controller.rb @@ -5,7 +5,7 @@ class Api::V1::AppsController < Api::BaseController def create @app = Doorkeeper::Application.create!(application_options) - render json: @app, serializer: REST::ApplicationSerializer + render json: @app, serializer: REST::CredentialApplicationSerializer end private @@ -24,6 +24,6 @@ class Api::V1::AppsController < Api::BaseController end def app_params - params.permit(:client_name, :redirect_uris, :scopes, :website) + params.permit(:client_name, :scopes, :website, :redirect_uris, redirect_uris: []) end end diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb index b6bb987b6..f7671a903 100644 --- a/app/controllers/api/v1/bookmarks_controller.rb +++ b/app/controllers/api/v1/bookmarks_controller.rb @@ -13,11 +13,11 @@ class Api::V1::BookmarksController < Api::BaseController private def load_statuses - cached_bookmarks + preloaded_bookmarks end - def cached_bookmarks - cache_collection(results.map(&:status), Status) + def preloaded_bookmarks + preload_collection(results.map(&:status), Status) end def results diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/conversations_controller.rb index a95c816e1..a29b90855 100644 --- a/app/controllers/api/v1/conversations_controller.rb +++ b/app/controllers/api/v1/conversations_controller.rb @@ -38,15 +38,15 @@ class Api::V1::ConversationsController < Api::BaseController def paginated_conversations AccountConversation.where(account: current_account) .includes( - account: :account_stat, + account: [:account_stat, user: :role], last_status: [ :media_attachments, :status_stat, :tags, { - preview_cards_status: :preview_card, - active_mentions: [account: :account_stat], - account: :account_stat, + preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, + active_mentions: :account, + account: [:account_stat, user: :role], }, ] ) diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb index 73da538f5..18ca9ab86 100644 --- a/app/controllers/api/v1/favourites_controller.rb +++ b/app/controllers/api/v1/favourites_controller.rb @@ -13,11 +13,11 @@ class Api::V1::FavouritesController < Api::BaseController private def load_statuses - cached_favourites + preloaded_favourites end - def cached_favourites - cache_collection(results.map(&:status), Status) + def preloaded_favourites + preload_collection(results.map(&:status), Status) end def results diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb index 6a26cc0e8..0e58379a3 100644 --- a/app/controllers/api/v1/notifications/requests_controller.rb +++ b/app/controllers/api/v1/notifications/requests_controller.rb @@ -41,7 +41,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController ) NotificationRequest.preload_cache_collection(requests) do |statuses| - cache_collection(statuses, Status) + preload_collection(statuses, Status) end end diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index c41a0bb05..1d0aa10d2 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -41,7 +41,7 @@ class Api::V1::NotificationsController < Api::BaseController ) Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses| - cache_collection(target_statuses, Status) + preload_collection(target_statuses, Status) end end diff --git a/app/controllers/api/v1/push/subscriptions_controller.rb b/app/controllers/api/v1/push/subscriptions_controller.rb index 3634acf95..e1ad89ee3 100644 --- a/app/controllers/api/v1/push/subscriptions_controller.rb +++ b/app/controllers/api/v1/push/subscriptions_controller.rb @@ -1,9 +1,12 @@ # frozen_string_literal: true class Api::V1::Push::SubscriptionsController < Api::BaseController + include Redisable + include Lockable + before_action -> { doorkeeper_authorize! :push } before_action :require_user! - before_action :set_push_subscription + before_action :set_push_subscription, only: [:show, :update] before_action :check_push_subscription, only: [:show, :update] def show @@ -11,16 +14,18 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController end def create - @push_subscription&.destroy! + with_redis_lock("push_subscription:#{current_user.id}") do + destroy_web_push_subscriptions! - @push_subscription = Web::PushSubscription.create!( - endpoint: subscription_params[:endpoint], - key_p256dh: subscription_params[:keys][:p256dh], - key_auth: subscription_params[:keys][:auth], - data: data_params, - user_id: current_user.id, - access_token_id: doorkeeper_token.id - ) + @push_subscription = Web::PushSubscription.create!( + endpoint: subscription_params[:endpoint], + key_p256dh: subscription_params[:keys][:p256dh], + key_auth: subscription_params[:keys][:auth], + data: data_params, + user_id: current_user.id, + access_token_id: doorkeeper_token.id + ) + end render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer end @@ -31,14 +36,18 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController end def destroy - @push_subscription&.destroy! + destroy_web_push_subscriptions! render_empty end private + def destroy_web_push_subscriptions! + doorkeeper_token.web_push_subscriptions.destroy_all + end + def set_push_subscription - @push_subscription = Web::PushSubscription.find_by(access_token_id: doorkeeper_token.id) + @push_subscription = doorkeeper_token.web_push_subscriptions.first end def check_push_subscription diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 01c371876..cca3865f6 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -5,9 +5,11 @@ class Api::V1::StatusesController < Api::BaseController before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :update, :destroy] before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :update, :destroy] - before_action :require_user!, except: [:show, :context] - before_action :set_status, only: [:show, :context] - before_action :set_thread, only: [:create] + before_action :require_user!, except: [:index, :show, :context] + before_action :set_statuses, only: [:index] + before_action :set_status, only: [:show, :context] + before_action :set_thread, only: [:create] + before_action :check_statuses_limit, only: [:index] override_rate_limit_headers :create, family: :statuses override_rate_limit_headers :update, family: :statuses @@ -23,9 +25,14 @@ class Api::V1::StatusesController < Api::BaseController DESCENDANTS_LIMIT = 60 DESCENDANTS_DEPTH_LIMIT = 20 + def index + @statuses = preload_collection(@statuses, Status) + render json: @statuses, each_serializer: REST::StatusSerializer + end + def show cache_if_unauthenticated! - @status = cache_collection([@status], Status).first + @status = preload_collection([@status], Status).first render json: @status, serializer: REST::StatusSerializer end @@ -44,8 +51,8 @@ class Api::V1::StatusesController < Api::BaseController ancestors_results = @status.in_reply_to_id.nil? ? [] : @status.ancestors(ancestors_limit, current_account) descendants_results = @status.descendants(descendants_limit, current_account, descendants_depth_limit) - loaded_ancestors = cache_collection(ancestors_results, Status) - loaded_descendants = cache_collection(descendants_results, Status) + loaded_ancestors = preload_collection(ancestors_results, Status) + loaded_descendants = preload_collection(descendants_results, Status) @context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants) statuses = [@status] + @context.ancestors + @context.descendants @@ -111,6 +118,10 @@ class Api::V1::StatusesController < Api::BaseController private + def set_statuses + @statuses = Status.permitted_statuses_from_ids(status_ids, current_account) + end + def set_status @status = Status.find(params[:id]) authorize @status, :show? @@ -125,6 +136,18 @@ class Api::V1::StatusesController < Api::BaseController render json: { error: I18n.t('statuses.errors.in_reply_not_found') }, status: 404 end + def check_statuses_limit + raise(Mastodon::ValidationError) if status_ids.size > DEFAULT_STATUSES_LIMIT + end + + def status_ids + Array(statuses_params[:id]).uniq.map(&:to_i) + end + + def statuses_params + params.permit(id: []) + end + def status_params params.permit( :status, diff --git a/app/controllers/api/v1/timelines/home_controller.rb b/app/controllers/api/v1/timelines/home_controller.rb index 36fdbea64..d5d182866 100644 --- a/app/controllers/api/v1/timelines/home_controller.rb +++ b/app/controllers/api/v1/timelines/home_controller.rb @@ -21,11 +21,11 @@ class Api::V1::Timelines::HomeController < Api::V1::Timelines::BaseController private def load_statuses - cached_home_statuses + preloaded_home_statuses end - def cached_home_statuses - cache_collection home_statuses, Status + def preloaded_home_statuses + preload_collection home_statuses, Status end def home_statuses diff --git a/app/controllers/api/v1/timelines/list_controller.rb b/app/controllers/api/v1/timelines/list_controller.rb index 14b884ecd..d8cdbdb74 100644 --- a/app/controllers/api/v1/timelines/list_controller.rb +++ b/app/controllers/api/v1/timelines/list_controller.rb @@ -21,11 +21,11 @@ class Api::V1::Timelines::ListController < Api::V1::Timelines::BaseController end def set_statuses - @statuses = cached_list_statuses + @statuses = preloaded_list_statuses end - def cached_list_statuses - cache_collection list_statuses, Status + def preloaded_list_statuses + preload_collection list_statuses, Status end def list_statuses diff --git a/app/controllers/api/v1/timelines/public_controller.rb b/app/controllers/api/v1/timelines/public_controller.rb index 35af8dc4b..d164854d6 100644 --- a/app/controllers/api/v1/timelines/public_controller.rb +++ b/app/controllers/api/v1/timelines/public_controller.rb @@ -18,11 +18,11 @@ class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController end def load_statuses - cached_public_statuses_page + preloaded_public_statuses_page end - def cached_public_statuses_page - cache_collection(public_statuses, Status) + def preloaded_public_statuses_page + preload_collection(public_statuses, Status) end def public_statuses diff --git a/app/controllers/api/v1/timelines/tag_controller.rb b/app/controllers/api/v1/timelines/tag_controller.rb index 4ba439dbb..3bf8f374e 100644 --- a/app/controllers/api/v1/timelines/tag_controller.rb +++ b/app/controllers/api/v1/timelines/tag_controller.rb @@ -23,11 +23,11 @@ class Api::V1::Timelines::TagController < Api::V1::Timelines::BaseController end def load_statuses - cached_tagged_statuses + preloaded_tagged_statuses end - def cached_tagged_statuses - @tag.nil? ? [] : cache_collection(tag_timeline_statuses, Status) + def preloaded_tagged_statuses + @tag.nil? ? [] : preload_collection(tag_timeline_statuses, Status) end def tag_timeline_statuses diff --git a/app/controllers/api/v1/trends/statuses_controller.rb b/app/controllers/api/v1/trends/statuses_controller.rb index 48bfe1199..c6fbbce16 100644 --- a/app/controllers/api/v1/trends/statuses_controller.rb +++ b/app/controllers/api/v1/trends/statuses_controller.rb @@ -20,7 +20,7 @@ class Api::V1::Trends::StatusesController < Api::BaseController def set_statuses @statuses = if enabled? - cache_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status) + preload_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status) else [] end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8ba10d64c..66e0f7e30 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -9,6 +9,7 @@ class ApplicationController < ActionController::Base include UserTrackingConcern include SessionTrackingConcern include CacheConcern + include PreloadingConcern include DomainControlHelper include DatabaseHelper include AuthorizedFetchHelper diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index acfc0af0d..f858c0ad9 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -44,7 +44,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController end def build_resource(hash = nil) - super(hash) + super resource.locale = I18n.locale resource.invite_code = @invite&.code if resource.invite_code.blank? diff --git a/app/controllers/concerns/cache_concern.rb b/app/controllers/concerns/cache_concern.rb index 4656539f8..1823b5b8e 100644 --- a/app/controllers/concerns/cache_concern.rb +++ b/app/controllers/concerns/cache_concern.rb @@ -45,20 +45,4 @@ module CacheConcern Rails.cache.write(key, response.body, expires_in: expires_in, raw: true) end end - - # TODO: Rename this method, as it does not perform any caching anymore. - def cache_collection(raw, klass) - return raw unless klass.respond_to?(:preload_cacheable_associations) - - records = raw.to_a - - klass.preload_cacheable_associations(records) - - records - end - - # TODO: Rename this method, as it does not perform any caching anymore. - def cache_collection_paginated_by_id(raw, klass, limit, options) - cache_collection raw.to_a_paginated_by_id(limit, options), klass - end end diff --git a/app/controllers/concerns/preloading_concern.rb b/app/controllers/concerns/preloading_concern.rb new file mode 100644 index 000000000..61e221364 --- /dev/null +++ b/app/controllers/concerns/preloading_concern.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module PreloadingConcern + extend ActiveSupport::Concern + + def preload_collection(scope, klass) + return scope unless klass.respond_to?(:preload_cacheable_associations) + + scope.to_a.tap do |records| + klass.preload_cacheable_associations(records) + end + end + + def preload_collection_paginated_by_id(scope, klass, limit, options) + preload_collection scope.to_a_paginated_by_id(limit, options), klass + end +end diff --git a/app/controllers/settings/applications_controller.rb b/app/controllers/settings/applications_controller.rb index d4b720568..6849979b1 100644 --- a/app/controllers/settings/applications_controller.rb +++ b/app/controllers/settings/applications_controller.rb @@ -13,7 +13,7 @@ class Settings::ApplicationsController < Settings::BaseController def new @application = Doorkeeper::Application.new( redirect_uri: Doorkeeper.configuration.native_redirect_uri, - scopes: 'read write follow' + scopes: 'read:me' ) end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index b0bdbde95..d6c0d872c 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -45,7 +45,7 @@ class TagsController < ApplicationController end def set_statuses - @statuses = cache_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status) + @statuses = preload_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status) end def limit_param diff --git a/app/controllers/well_known/oauth_metadata_controller.rb b/app/controllers/well_known/oauth_metadata_controller.rb new file mode 100644 index 000000000..c80be2d65 --- /dev/null +++ b/app/controllers/well_known/oauth_metadata_controller.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module WellKnown + class OauthMetadataController < ActionController::Base # rubocop:disable Rails/ApplicationController + include CacheConcern + + # Prevent `active_model_serializer`'s `ActionController::Serialization` from calling `current_user` + # and thus re-issuing session cookies + serialization_scope nil + + def show + # Due to this document potentially changing between Mastodon versions (as + # new OAuth scopes are added), we don't use expires_in to cache upstream, + # instead just caching in the rails cache: + render_with_cache( + json: ::OauthMetadataPresenter.new, + serializer: ::OauthMetadataSerializer, + content_type: 'application/json', + expires_in: 15.minutes + ) + end + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4cf959f2d..7563ae610 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -240,6 +240,22 @@ module ApplicationHelper EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s end + def mascot_url + full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg')) + end + + def instance_presenter + @instance_presenter ||= InstancePresenter.new + end + + def favicon_path(size = '48') + instance_presenter.favicon&.file&.url(size) + end + + def app_icon_path(size = '48') + instance_presenter.app_icon&.file&.url(size) + end + private def storage_host_var diff --git a/app/helpers/mascot_helper.rb b/app/helpers/mascot_helper.rb deleted file mode 100644 index 34b656411..000000000 --- a/app/helpers/mascot_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module MascotHelper - def mascot_url - full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg')) - end - - def instance_presenter - @instance_presenter ||= InstancePresenter.new - end -end diff --git a/app/javascript/entrypoints/application.js b/app/javascript/entrypoints/application.ts similarity index 81% rename from app/javascript/entrypoints/application.js rename to app/javascript/entrypoints/application.ts index d13388b47..1087b1c4c 100644 --- a/app/javascript/entrypoints/application.js +++ b/app/javascript/entrypoints/application.ts @@ -1,5 +1,5 @@ import './public-path'; -import main from "mastodon/main"; +import main from 'mastodon/main'; import { start } from '../mastodon/common'; import { loadLocale } from '../mastodon/locales'; @@ -10,6 +10,6 @@ start(); loadPolyfills() .then(loadLocale) .then(main) - .catch(e => { + .catch((e: unknown) => { console.error(e); }); diff --git a/app/javascript/entrypoints/error.js b/app/javascript/entrypoints/error.ts similarity index 64% rename from app/javascript/entrypoints/error.js rename to app/javascript/entrypoints/error.ts index 6376dc2f5..db68484f3 100644 --- a/app/javascript/entrypoints/error.js +++ b/app/javascript/entrypoints/error.ts @@ -2,7 +2,9 @@ import './public-path'; import ready from '../mastodon/ready'; ready(() => { - const image = document.querySelector('img'); + const image = document.querySelector('img'); + + if (!image) return; image.addEventListener('mouseenter', () => { image.src = '/oops.gif'; @@ -11,4 +13,6 @@ ready(() => { image.addEventListener('mouseleave', () => { image.src = '/oops.png'; }); +}).catch((e: unknown) => { + console.error(e); }); diff --git a/app/javascript/entrypoints/inert.js b/app/javascript/entrypoints/inert.ts similarity index 100% rename from app/javascript/entrypoints/inert.js rename to app/javascript/entrypoints/inert.ts diff --git a/app/javascript/entrypoints/mailer.js b/app/javascript/entrypoints/mailer.ts similarity index 100% rename from app/javascript/entrypoints/mailer.js rename to app/javascript/entrypoints/mailer.ts diff --git a/app/javascript/entrypoints/public-path.js b/app/javascript/entrypoints/public-path.ts similarity index 69% rename from app/javascript/entrypoints/public-path.js rename to app/javascript/entrypoints/public-path.ts index f4d166a77..ac4b9355b 100644 --- a/app/javascript/entrypoints/public-path.js +++ b/app/javascript/entrypoints/public-path.ts @@ -2,7 +2,7 @@ // to share the same assets regardless of instance configuration. // See https://webpack.js.org/guides/public-path/#on-the-fly -function removeOuterSlashes(string) { +function removeOuterSlashes(string: string) { return string.replace(/^\/*/, '').replace(/\/*$/, ''); } @@ -15,7 +15,9 @@ function formatPublicPath(host = '', path = '') { return `${formattedHost}/${formattedPath}/`; } -const cdnHost = document.querySelector('meta[name=cdn-host]'); +const cdnHost = document.querySelector('meta[name=cdn-host]'); -// eslint-disable-next-line no-undef -__webpack_public_path__ = formatPublicPath(cdnHost ? cdnHost.content : '', process.env.PUBLIC_OUTPUT_PATH); +__webpack_public_path__ = formatPublicPath( + cdnHost ? cdnHost.content : '', + process.env.PUBLIC_OUTPUT_PATH, +); diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index d45927226..40a9b7c0c 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -65,7 +65,7 @@ window.addEventListener('message', (e) => { { type: 'setHeight', id: data.id, - height: document.getElementsByTagName('html')[0].scrollHeight, + height: document.getElementsByTagName('html')[0]?.scrollHeight, }, '*', ); @@ -135,7 +135,7 @@ function loaded() { ); }; const todayFormat = new IntlMessageFormat( - localeData['relative_format.today'] || 'Today at {time}', + localeData['relative_format.today'] ?? 'Today at {time}', locale, ); @@ -288,13 +288,13 @@ function loaded() { if (statusEl.dataset.spoiler === 'expanded') { statusEl.dataset.spoiler = 'folded'; this.textContent = new IntlMessageFormat( - localeData['status.show_more'] || 'Show more', + localeData['status.show_more'] ?? 'Show more', locale, ).format() as string; } else { statusEl.dataset.spoiler = 'expanded'; this.textContent = new IntlMessageFormat( - localeData['status.show_less'] || 'Show less', + localeData['status.show_less'] ?? 'Show less', locale, ).format() as string; } @@ -316,8 +316,8 @@ function loaded() { const message = statusEl.dataset.spoiler === 'expanded' - ? localeData['status.show_less'] || 'Show less' - : localeData['status.show_more'] || 'Show more'; + ? localeData['status.show_less'] ?? 'Show less' + : localeData['status.show_more'] ?? 'Show more'; spoilerLink.textContent = new IntlMessageFormat( message, locale, diff --git a/app/javascript/entrypoints/remote_interaction_helper.ts b/app/javascript/entrypoints/remote_interaction_helper.ts index d5834c6c3..419571c89 100644 --- a/app/javascript/entrypoints/remote_interaction_helper.ts +++ b/app/javascript/entrypoints/remote_interaction_helper.ts @@ -67,7 +67,9 @@ const fetchInteractionURLFailure = () => { ); }; -const isValidDomain = (value: string) => { +const isValidDomain = (value: unknown) => { + if (typeof value !== 'string') return false; + const url = new URL('https:///path'); url.hostname = value; return url.hostname === value; @@ -124,6 +126,11 @@ const fromAcct = (acct: string) => { const domain = segments[1]; const fallbackTemplate = `https://${domain}/authorize_interaction?uri={uri}`; + if (!domain) { + fetchInteractionURLFailure(); + return; + } + axios .get(`https://${domain}/.well-known/webfinger`, { params: { resource: `acct:${acct}` }, diff --git a/app/javascript/entrypoints/share.jsx b/app/javascript/entrypoints/share.tsx similarity index 64% rename from app/javascript/entrypoints/share.jsx rename to app/javascript/entrypoints/share.tsx index 7b5723091..792625085 100644 --- a/app/javascript/entrypoints/share.jsx +++ b/app/javascript/entrypoints/share.tsx @@ -2,7 +2,7 @@ import './public-path'; import { createRoot } from 'react-dom/client'; import { start } from '../mastodon/common'; -import ComposeContainer from '../mastodon/containers/compose_container'; +import ComposeContainer from '../mastodon/containers/compose_container'; import { loadPolyfills } from '../mastodon/polyfills'; import ready from '../mastodon/ready'; @@ -16,7 +16,7 @@ function loaded() { if (!attr) return; - const props = JSON.parse(attr); + const props = JSON.parse(attr) as object; const root = createRoot(mountNode); root.render(); @@ -24,9 +24,13 @@ function loaded() { } function main() { - ready(loaded); + ready(loaded).catch((error: unknown) => { + console.error(error); + }); } -loadPolyfills().then(main).catch(error => { - console.error(error); -}); +loadPolyfills() + .then(main) + .catch((error: unknown) => { + console.error(error); + }); diff --git a/app/javascript/entrypoints/sign_up.js b/app/javascript/entrypoints/sign_up.js deleted file mode 100644 index cf9c83777..000000000 --- a/app/javascript/entrypoints/sign_up.js +++ /dev/null @@ -1,42 +0,0 @@ -import './public-path'; -import axios from 'axios'; - -import ready from '../mastodon/ready'; - -ready(() => { - setInterval(() => { - axios.get('/api/v1/emails/check_confirmation').then((response) => { - if (response.data) { - window.location = '/start'; - } - }).catch(error => { - console.error(error); - }); - }, 5000); - - document.querySelectorAll('.timer-button').forEach(button => { - let counter = 30; - - const container = document.createElement('span'); - - const updateCounter = () => { - container.innerText = ` (${counter})`; - }; - - updateCounter(); - - const countdown = setInterval(() => { - counter--; - - if (counter === 0) { - button.disabled = false; - button.removeChild(container); - clearInterval(countdown); - } else { - updateCounter(); - } - }, 1000); - - button.appendChild(container); - }); -}); diff --git a/app/javascript/entrypoints/sign_up.ts b/app/javascript/entrypoints/sign_up.ts new file mode 100644 index 000000000..880738fcb --- /dev/null +++ b/app/javascript/entrypoints/sign_up.ts @@ -0,0 +1,48 @@ +import './public-path'; +import axios from 'axios'; + +import ready from '../mastodon/ready'; + +async function checkConfirmation() { + const response = await axios.get('/api/v1/emails/check_confirmation'); + + if (response.data) { + window.location.href = '/start'; + } +} + +ready(() => { + setInterval(() => { + void checkConfirmation(); + }, 5000); + + document + .querySelectorAll('button.timer-button') + .forEach((button) => { + let counter = 30; + + const container = document.createElement('span'); + + const updateCounter = () => { + container.innerText = ` (${counter})`; + }; + + updateCounter(); + + const countdown = setInterval(() => { + counter--; + + if (counter === 0) { + button.disabled = false; + button.removeChild(container); + clearInterval(countdown); + } else { + updateCounter(); + } + }, 1000); + + button.appendChild(container); + }); +}).catch((e: unknown) => { + throw e; +}); diff --git a/app/javascript/entrypoints/two_factor_authentication.js b/app/javascript/entrypoints/two_factor_authentication.js deleted file mode 100644 index e77965c75..000000000 --- a/app/javascript/entrypoints/two_factor_authentication.js +++ /dev/null @@ -1,119 +0,0 @@ -import * as WebAuthnJSON from '@github/webauthn-json'; -import axios from 'axios'; - -import ready from '../mastodon/ready'; -import 'regenerator-runtime/runtime'; - -function getCSRFToken() { - var CSRFSelector = document.querySelector('meta[name="csrf-token"]'); - if (CSRFSelector) { - return CSRFSelector.getAttribute('content'); - } else { - return null; - } -} - -function hideFlashMessages() { - Array.from(document.getElementsByClassName('flash-message')).forEach(function(flashMessage) { - flashMessage.classList.add('hidden'); - }); -} - -function callback(url, body) { - axios.post(url, JSON.stringify(body), { - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'X-CSRF-Token': getCSRFToken(), - }, - credentials: 'same-origin', - }).then(function(response) { - window.location.replace(response.data.redirect_path); - }).catch(function(error) { - if (error.response.status === 422) { - const errorMessage = document.getElementById('security-key-error-message'); - errorMessage.classList.remove('hidden'); - console.error(error.response.data.error); - } else { - console.error(error); - } - }); -} - -ready(() => { - if (!WebAuthnJSON.supported()) { - const unsupported_browser_message = document.getElementById('unsupported-browser-message'); - if (unsupported_browser_message) { - unsupported_browser_message.classList.remove('hidden'); - document.querySelector('.btn.js-webauthn').disabled = true; - } - } - - - const webAuthnCredentialRegistrationForm = document.getElementById('new_webauthn_credential'); - if (webAuthnCredentialRegistrationForm) { - webAuthnCredentialRegistrationForm.addEventListener('submit', (event) => { - event.preventDefault(); - - var nickname = event.target.querySelector('input[name="new_webauthn_credential[nickname]"]'); - if (nickname.value) { - axios.get('/settings/security_keys/options') - .then((response) => { - const credentialOptions = response.data; - - WebAuthnJSON.create({ 'publicKey': credentialOptions }).then((credential) => { - var params = { 'credential': credential, 'nickname': nickname.value }; - callback('/settings/security_keys', params); - }).catch((error) => { - const errorMessage = document.getElementById('security-key-error-message'); - errorMessage.classList.remove('hidden'); - console.error(error); - }); - }).catch((error) => { - console.error(error.response.data.error); - }); - } else { - nickname.focus(); - } - }); - } - - const webAuthnCredentialAuthenticationForm = document.getElementById('webauthn-form'); - if (webAuthnCredentialAuthenticationForm) { - webAuthnCredentialAuthenticationForm.addEventListener('submit', (event) => { - event.preventDefault(); - - axios.get('sessions/security_key_options') - .then((response) => { - const credentialOptions = response.data; - - WebAuthnJSON.get({ 'publicKey': credentialOptions }).then((credential) => { - var params = { 'user': { 'credential': credential } }; - callback('sign_in', params); - }).catch((error) => { - const errorMessage = document.getElementById('security-key-error-message'); - errorMessage.classList.remove('hidden'); - console.error(error); - }); - }).catch((error) => { - console.error(error.response.data.error); - }); - }); - - const otpAuthenticationForm = document.getElementById('otp-authentication-form'); - - const linkToOtp = document.getElementById('link-to-otp'); - linkToOtp.addEventListener('click', () => { - webAuthnCredentialAuthenticationForm.classList.add('hidden'); - otpAuthenticationForm.classList.remove('hidden'); - hideFlashMessages(); - }); - - const linkToWebAuthn = document.getElementById('link-to-webauthn'); - linkToWebAuthn.addEventListener('click', () => { - otpAuthenticationForm.classList.add('hidden'); - webAuthnCredentialAuthenticationForm.classList.remove('hidden'); - hideFlashMessages(); - }); - } -}); diff --git a/app/javascript/entrypoints/two_factor_authentication.ts b/app/javascript/entrypoints/two_factor_authentication.ts new file mode 100644 index 000000000..981481694 --- /dev/null +++ b/app/javascript/entrypoints/two_factor_authentication.ts @@ -0,0 +1,197 @@ +import * as WebAuthnJSON from '@github/webauthn-json'; +import axios, { AxiosError } from 'axios'; + +import ready from '../mastodon/ready'; + +import 'regenerator-runtime/runtime'; + +type PublicKeyCredentialCreationOptionsJSON = + WebAuthnJSON.CredentialCreationOptionsJSON['publicKey']; + +function exceptionHasAxiosError( + error: unknown, +): error is AxiosError<{ error: unknown }> { + return ( + error instanceof AxiosError && + typeof error.response?.data === 'object' && + 'error' in error.response.data + ); +} + +function logAxiosResponseError(error: unknown) { + if (exceptionHasAxiosError(error)) console.error(error); +} + +function getCSRFToken() { + return document + .querySelector('meta[name="csrf-token"]') + ?.getAttribute('content'); +} + +function hideFlashMessages() { + document.querySelectorAll('.flash-message').forEach((flashMessage) => { + flashMessage.classList.add('hidden'); + }); +} + +async function callback( + url: string, + body: + | { + credential: WebAuthnJSON.PublicKeyCredentialWithAttestationJSON; + nickname: string; + } + | { + user: { credential: WebAuthnJSON.PublicKeyCredentialWithAssertionJSON }; + }, +) { + try { + const response = await axios.post<{ redirect_path: string }>( + url, + JSON.stringify(body), + { + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + 'X-CSRF-Token': getCSRFToken(), + }, + }, + ); + + window.location.replace(response.data.redirect_path); + } catch (error) { + if (error instanceof AxiosError && error.response?.status === 422) { + const errorMessage = document.getElementById( + 'security-key-error-message', + ); + errorMessage?.classList.remove('hidden'); + + logAxiosResponseError(error); + } else { + console.error(error); + } + } +} + +async function handleWebauthnCredentialRegistration(nickname: string) { + try { + const response = await axios.get( + '/settings/security_keys/options', + ); + + const credentialOptions = response.data; + + try { + const credential = await WebAuthnJSON.create({ + publicKey: credentialOptions, + }); + + const params = { + credential: credential, + nickname: nickname, + }; + + await callback('/settings/security_keys', params); + } catch (error) { + const errorMessage = document.getElementById( + 'security-key-error-message', + ); + errorMessage?.classList.remove('hidden'); + console.error(error); + } + } catch (error) { + logAxiosResponseError(error); + } +} + +async function handleWebauthnCredentialAuthentication() { + try { + const response = await axios.get( + 'sessions/security_key_options', + ); + + const credentialOptions = response.data; + + try { + const credential = await WebAuthnJSON.get({ + publicKey: credentialOptions, + }); + + const params = { user: { credential: credential } }; + void callback('sign_in', params); + } catch (error) { + const errorMessage = document.getElementById( + 'security-key-error-message', + ); + errorMessage?.classList.remove('hidden'); + console.error(error); + } + } catch (error) { + logAxiosResponseError(error); + } +} + +ready(() => { + if (!WebAuthnJSON.supported()) { + const unsupported_browser_message = document.getElementById( + 'unsupported-browser-message', + ); + if (unsupported_browser_message) { + unsupported_browser_message.classList.remove('hidden'); + const button = document.querySelector( + 'button.btn.js-webauthn', + ); + if (button) button.disabled = true; + } + } + + const webAuthnCredentialRegistrationForm = + document.querySelector('form#new_webauthn_credential'); + if (webAuthnCredentialRegistrationForm) { + webAuthnCredentialRegistrationForm.addEventListener('submit', (event) => { + event.preventDefault(); + + if (!(event.target instanceof HTMLFormElement)) return; + + const nickname = event.target.querySelector( + 'input[name="new_webauthn_credential[nickname]"]', + ); + + if (nickname?.value) { + void handleWebauthnCredentialRegistration(nickname.value); + } else { + nickname?.focus(); + } + }); + } + + const webAuthnCredentialAuthenticationForm = + document.getElementById('webauthn-form'); + if (webAuthnCredentialAuthenticationForm) { + webAuthnCredentialAuthenticationForm.addEventListener('submit', (event) => { + event.preventDefault(); + void handleWebauthnCredentialAuthentication(); + }); + + const otpAuthenticationForm = document.getElementById( + 'otp-authentication-form', + ); + + const linkToOtp = document.getElementById('link-to-otp'); + + linkToOtp?.addEventListener('click', () => { + webAuthnCredentialAuthenticationForm.classList.add('hidden'); + otpAuthenticationForm?.classList.remove('hidden'); + hideFlashMessages(); + }); + + const linkToWebAuthn = document.getElementById('link-to-webauthn'); + linkToWebAuthn?.addEventListener('click', () => { + otpAuthenticationForm?.classList.add('hidden'); + webAuthnCredentialAuthenticationForm.classList.remove('hidden'); + hideFlashMessages(); + }); + } +}).catch((e: unknown) => { + throw e; +}); diff --git a/app/javascript/mastodon/actions/account_notes.ts b/app/javascript/mastodon/actions/account_notes.ts index e524e5235..c2ebaf54a 100644 --- a/app/javascript/mastodon/actions/account_notes.ts +++ b/app/javascript/mastodon/actions/account_notes.ts @@ -1,18 +1,10 @@ -import type { ApiRelationshipJSON } from 'mastodon/api_types/relationships'; -import { createAppAsyncThunk } from 'mastodon/store/typed_functions'; +import { apiSubmitAccountNote } from 'mastodon/api/accounts'; +import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; -import api from '../api'; - -export const submitAccountNote = createAppAsyncThunk( +export const submitAccountNote = createDataLoadingThunk( 'account_note/submit', - async (args: { id: string; value: string }, { getState }) => { - const response = await api(getState).post( - `/api/v1/accounts/${args.id}/note`, - { - comment: args.value, - }, - ); - - return { relationship: response.data }; - }, + ({ accountId, note }: { accountId: string; note: string }) => + apiSubmitAccountNote(accountId, note), + (relationship) => ({ relationship }), + { skipLoading: true }, ); diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js index 9f3bbba03..cea915e5f 100644 --- a/app/javascript/mastodon/actions/accounts.js +++ b/app/javascript/mastodon/actions/accounts.js @@ -76,11 +76,11 @@ export const ACCOUNT_REVEAL = 'ACCOUNT_REVEAL'; export * from './accounts_typed'; export function fetchAccount(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchRelationships([id])); dispatch(fetchAccountRequest(id)); - api(getState).get(`/api/v1/accounts/${id}`).then(response => { + api().get(`/api/v1/accounts/${id}`).then(response => { dispatch(importFetchedAccount(response.data)); dispatch(fetchAccountSuccess()); }).catch(error => { @@ -89,10 +89,10 @@ export function fetchAccount(id) { }; } -export const lookupAccount = acct => (dispatch, getState) => { +export const lookupAccount = acct => (dispatch) => { dispatch(lookupAccountRequest(acct)); - api(getState).get('/api/v1/accounts/lookup', { params: { acct } }).then(response => { + api().get('/api/v1/accounts/lookup', { params: { acct } }).then(response => { dispatch(fetchRelationships([response.data.id])); dispatch(importFetchedAccount(response.data)); dispatch(lookupAccountSuccess()); @@ -146,7 +146,7 @@ export function followAccount(id, options = { reblogs: true }) { dispatch(followAccountRequest({ id, locked })); - api(getState).post(`/api/v1/accounts/${id}/follow`, options).then(response => { + api().post(`/api/v1/accounts/${id}/follow`, options).then(response => { dispatch(followAccountSuccess({relationship: response.data, alreadyFollowing})); }).catch(error => { dispatch(followAccountFail({ id, error, locked })); @@ -158,7 +158,7 @@ export function unfollowAccount(id) { return (dispatch, getState) => { dispatch(unfollowAccountRequest(id)); - api(getState).post(`/api/v1/accounts/${id}/unfollow`).then(response => { + api().post(`/api/v1/accounts/${id}/unfollow`).then(response => { dispatch(unfollowAccountSuccess({relationship: response.data, statuses: getState().get('statuses')})); }).catch(error => { dispatch(unfollowAccountFail({ id, error })); @@ -170,7 +170,7 @@ export function blockAccount(id) { return (dispatch, getState) => { dispatch(blockAccountRequest(id)); - api(getState).post(`/api/v1/accounts/${id}/block`).then(response => { + api().post(`/api/v1/accounts/${id}/block`).then(response => { // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers dispatch(blockAccountSuccess({ relationship: response.data, statuses: getState().get('statuses') })); }).catch(error => { @@ -180,10 +180,10 @@ export function blockAccount(id) { } export function unblockAccount(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(unblockAccountRequest(id)); - api(getState).post(`/api/v1/accounts/${id}/unblock`).then(response => { + api().post(`/api/v1/accounts/${id}/unblock`).then(response => { dispatch(unblockAccountSuccess({ relationship: response.data })); }).catch(error => { dispatch(unblockAccountFail({ id, error })); @@ -223,7 +223,7 @@ export function muteAccount(id, notifications, duration=0) { return (dispatch, getState) => { dispatch(muteAccountRequest(id)); - api(getState).post(`/api/v1/accounts/${id}/mute`, { notifications, duration }).then(response => { + api().post(`/api/v1/accounts/${id}/mute`, { notifications, duration }).then(response => { // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers dispatch(muteAccountSuccess({ relationship: response.data, statuses: getState().get('statuses') })); }).catch(error => { @@ -233,10 +233,10 @@ export function muteAccount(id, notifications, duration=0) { } export function unmuteAccount(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(unmuteAccountRequest(id)); - api(getState).post(`/api/v1/accounts/${id}/unmute`).then(response => { + api().post(`/api/v1/accounts/${id}/unmute`).then(response => { dispatch(unmuteAccountSuccess({ relationship: response.data })); }).catch(error => { dispatch(unmuteAccountFail({ id, error })); @@ -274,10 +274,10 @@ export function unmuteAccountFail(error) { export function fetchFollowers(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchFollowersRequest(id)); - api(getState).get(`/api/v1/accounts/${id}/followers`).then(response => { + api().get(`/api/v1/accounts/${id}/followers`).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); @@ -324,7 +324,7 @@ export function expandFollowers(id) { dispatch(expandFollowersRequest(id)); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); @@ -361,10 +361,10 @@ export function expandFollowersFail(id, error) { } export function fetchFollowing(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchFollowingRequest(id)); - api(getState).get(`/api/v1/accounts/${id}/following`).then(response => { + api().get(`/api/v1/accounts/${id}/following`).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); @@ -411,7 +411,7 @@ export function expandFollowing(id) { dispatch(expandFollowingRequest(id)); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); @@ -460,7 +460,7 @@ export function fetchRelationships(accountIds) { dispatch(fetchRelationshipsRequest(newAccountIds)); - api(getState).get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => { + api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => { dispatch(fetchRelationshipsSuccess({ relationships: response.data })); }).catch(error => { dispatch(fetchRelationshipsFail(error)); @@ -486,10 +486,10 @@ export function fetchRelationshipsFail(error) { } export function fetchFollowRequests() { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchFollowRequestsRequest()); - api(getState).get('/api/v1/follow_requests').then(response => { + api().get('/api/v1/follow_requests').then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null)); @@ -528,7 +528,7 @@ export function expandFollowRequests() { dispatch(expandFollowRequestsRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null)); @@ -558,10 +558,10 @@ export function expandFollowRequestsFail(error) { } export function authorizeFollowRequest(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(authorizeFollowRequestRequest(id)); - api(getState) + api() .post(`/api/v1/follow_requests/${id}/authorize`) .then(() => dispatch(authorizeFollowRequestSuccess({ id }))) .catch(error => dispatch(authorizeFollowRequestFail(id, error))); @@ -585,10 +585,10 @@ export function authorizeFollowRequestFail(id, error) { export function rejectFollowRequest(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(rejectFollowRequestRequest(id)); - api(getState) + api() .post(`/api/v1/follow_requests/${id}/reject`) .then(() => dispatch(rejectFollowRequestSuccess({ id }))) .catch(error => dispatch(rejectFollowRequestFail(id, error))); @@ -611,10 +611,10 @@ export function rejectFollowRequestFail(id, error) { } export function pinAccount(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(pinAccountRequest(id)); - api(getState).post(`/api/v1/accounts/${id}/pin`).then(response => { + api().post(`/api/v1/accounts/${id}/pin`).then(response => { dispatch(pinAccountSuccess({ relationship: response.data })); }).catch(error => { dispatch(pinAccountFail(error)); @@ -623,10 +623,10 @@ export function pinAccount(id) { } export function unpinAccount(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(unpinAccountRequest(id)); - api(getState).post(`/api/v1/accounts/${id}/unpin`).then(response => { + api().post(`/api/v1/accounts/${id}/unpin`).then(response => { dispatch(unpinAccountSuccess({ relationship: response.data })); }).catch(error => { dispatch(unpinAccountFail(error)); @@ -662,7 +662,7 @@ export function unpinAccountFail(error) { }; } -export const updateAccount = ({ displayName, note, avatar, header, discoverable, indexable }) => (dispatch, getState) => { +export const updateAccount = ({ displayName, note, avatar, header, discoverable, indexable }) => (dispatch) => { const data = new FormData(); data.append('display_name', displayName); @@ -672,7 +672,7 @@ export const updateAccount = ({ displayName, note, avatar, header, discoverable, data.append('discoverable', discoverable); data.append('indexable', indexable); - return api(getState).patch('/api/v1/accounts/update_credentials', data).then(response => { + return api().patch('/api/v1/accounts/update_credentials', data).then(response => { dispatch(importFetchedAccount(response.data)); }); }; diff --git a/app/javascript/mastodon/actions/announcements.js b/app/javascript/mastodon/actions/announcements.js index 339c5f3ad..7657b05dc 100644 --- a/app/javascript/mastodon/actions/announcements.js +++ b/app/javascript/mastodon/actions/announcements.js @@ -26,10 +26,10 @@ export const ANNOUNCEMENTS_TOGGLE_SHOW = 'ANNOUNCEMENTS_TOGGLE_SHOW'; const noOp = () => {}; -export const fetchAnnouncements = (done = noOp) => (dispatch, getState) => { +export const fetchAnnouncements = (done = noOp) => (dispatch) => { dispatch(fetchAnnouncementsRequest()); - api(getState).get('/api/v1/announcements').then(response => { + api().get('/api/v1/announcements').then(response => { dispatch(fetchAnnouncementsSuccess(response.data.map(x => normalizeAnnouncement(x)))); }).catch(error => { dispatch(fetchAnnouncementsFail(error)); @@ -61,10 +61,10 @@ export const updateAnnouncements = announcement => ({ announcement: normalizeAnnouncement(announcement), }); -export const dismissAnnouncement = announcementId => (dispatch, getState) => { +export const dismissAnnouncement = announcementId => (dispatch) => { dispatch(dismissAnnouncementRequest(announcementId)); - api(getState).post(`/api/v1/announcements/${announcementId}/dismiss`).then(() => { + api().post(`/api/v1/announcements/${announcementId}/dismiss`).then(() => { dispatch(dismissAnnouncementSuccess(announcementId)); }).catch(error => { dispatch(dismissAnnouncementFail(announcementId, error)); @@ -103,7 +103,7 @@ export const addReaction = (announcementId, name) => (dispatch, getState) => { dispatch(addReactionRequest(announcementId, name, alreadyAdded)); } - api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => { + api().put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => { dispatch(addReactionSuccess(announcementId, name, alreadyAdded)); }).catch(err => { if (!alreadyAdded) { @@ -134,10 +134,10 @@ export const addReactionFail = (announcementId, name, error) => ({ skipLoading: true, }); -export const removeReaction = (announcementId, name) => (dispatch, getState) => { +export const removeReaction = (announcementId, name) => (dispatch) => { dispatch(removeReactionRequest(announcementId, name)); - api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => { + api().delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => { dispatch(removeReactionSuccess(announcementId, name)); }).catch(err => { dispatch(removeReactionFail(announcementId, name, err)); diff --git a/app/javascript/mastodon/actions/blocks.js b/app/javascript/mastodon/actions/blocks.js index 54296d090..5c66e27be 100644 --- a/app/javascript/mastodon/actions/blocks.js +++ b/app/javascript/mastodon/actions/blocks.js @@ -13,10 +13,10 @@ export const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS'; export const BLOCKS_EXPAND_FAIL = 'BLOCKS_EXPAND_FAIL'; export function fetchBlocks() { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchBlocksRequest()); - api(getState).get('/api/v1/blocks').then(response => { + api().get('/api/v1/blocks').then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); dispatch(fetchBlocksSuccess(response.data, next ? next.uri : null)); @@ -56,7 +56,7 @@ export function expandBlocks() { dispatch(expandBlocksRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); dispatch(expandBlocksSuccess(response.data, next ? next.uri : null)); diff --git a/app/javascript/mastodon/actions/bookmarks.js b/app/javascript/mastodon/actions/bookmarks.js index 0b16f61e6..89716b224 100644 --- a/app/javascript/mastodon/actions/bookmarks.js +++ b/app/javascript/mastodon/actions/bookmarks.js @@ -18,7 +18,7 @@ export function fetchBookmarkedStatuses() { dispatch(fetchBookmarkedStatusesRequest()); - api(getState).get('/api/v1/bookmarks').then(response => { + api().get('/api/v1/bookmarks').then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); dispatch(fetchBookmarkedStatusesSuccess(response.data, next ? next.uri : null)); @@ -59,7 +59,7 @@ export function expandBookmarkedStatuses() { dispatch(expandBookmarkedStatusesRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); dispatch(expandBookmarkedStatusesSuccess(response.data, next ? next.uri : null)); diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 7477e45e5..b07dff182 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -196,7 +196,7 @@ export function submitCompose(routerHistory) { }); } - api(getState).request({ + api().request({ url: statusId === null ? '/api/v1/statuses' : `/api/v1/statuses/${statusId}`, method: statusId === null ? 'post' : 'put', data: { @@ -304,7 +304,7 @@ export function uploadCompose(files) { const data = new FormData(); data.append('file', file); - api(getState).post('/api/v2/media', data, { + api().post('/api/v2/media', data, { onUploadProgress: function({ loaded }){ progress[i] = loaded; dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); @@ -321,7 +321,7 @@ export function uploadCompose(files) { let tryCount = 1; const poll = () => { - api(getState).get(`/api/v1/media/${data.id}`).then(response => { + api().get(`/api/v1/media/${data.id}`).then(response => { if (response.status === 200) { dispatch(uploadComposeSuccess(response.data, file)); } else if (response.status === 206) { @@ -343,7 +343,7 @@ export const uploadComposeProcessing = () => ({ type: COMPOSE_UPLOAD_PROCESSING, }); -export const uploadThumbnail = (id, file) => (dispatch, getState) => { +export const uploadThumbnail = (id, file) => (dispatch) => { dispatch(uploadThumbnailRequest()); const total = file.size; @@ -351,7 +351,7 @@ export const uploadThumbnail = (id, file) => (dispatch, getState) => { data.append('thumbnail', file); - api(getState).put(`/api/v1/media/${id}`, data, { + api().put(`/api/v1/media/${id}`, data, { onUploadProgress: ({ loaded }) => { dispatch(uploadThumbnailProgress(loaded, total)); }, @@ -434,7 +434,7 @@ export function changeUploadCompose(id, params) { dispatch(changeUploadComposeSuccess(data, true)); } else { - api(getState).put(`/api/v1/media/${id}`, params).then(response => { + api().put(`/api/v1/media/${id}`, params).then(response => { dispatch(changeUploadComposeSuccess(response.data, false)); }).catch(error => { dispatch(changeUploadComposeFail(id, error)); @@ -522,7 +522,7 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => fetchComposeSuggestionsAccountsController = new AbortController(); - api(getState).get('/api/v1/accounts/search', { + api().get('/api/v1/accounts/search', { signal: fetchComposeSuggestionsAccountsController.signal, params: { @@ -556,7 +556,7 @@ const fetchComposeSuggestionsTags = throttle((dispatch, getState, token) => { fetchComposeSuggestionsTagsController = new AbortController(); - api(getState).get('/api/v2/search', { + api().get('/api/v2/search', { signal: fetchComposeSuggestionsTagsController.signal, params: { diff --git a/app/javascript/mastodon/actions/conversations.js b/app/javascript/mastodon/actions/conversations.js index 8c4c4529f..03174c485 100644 --- a/app/javascript/mastodon/actions/conversations.js +++ b/app/javascript/mastodon/actions/conversations.js @@ -28,13 +28,13 @@ export const unmountConversations = () => ({ type: CONVERSATIONS_UNMOUNT, }); -export const markConversationRead = conversationId => (dispatch, getState) => { +export const markConversationRead = conversationId => (dispatch) => { dispatch({ type: CONVERSATIONS_READ, id: conversationId, }); - api(getState).post(`/api/v1/conversations/${conversationId}/read`); + api().post(`/api/v1/conversations/${conversationId}/read`); }; export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => { @@ -48,7 +48,7 @@ export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => { const isLoadingRecent = !!params.since_id; - api(getState).get('/api/v1/conversations', { params }) + api().get('/api/v1/conversations', { params }) .then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); @@ -88,10 +88,10 @@ export const updateConversations = conversation => dispatch => { }); }; -export const deleteConversation = conversationId => (dispatch, getState) => { +export const deleteConversation = conversationId => (dispatch) => { dispatch(deleteConversationRequest(conversationId)); - api(getState).delete(`/api/v1/conversations/${conversationId}`) + api().delete(`/api/v1/conversations/${conversationId}`) .then(() => dispatch(deleteConversationSuccess(conversationId))) .catch(error => dispatch(deleteConversationFail(conversationId, error))); }; diff --git a/app/javascript/mastodon/actions/custom_emojis.js b/app/javascript/mastodon/actions/custom_emojis.js index 9ec8156b1..fb65f072d 100644 --- a/app/javascript/mastodon/actions/custom_emojis.js +++ b/app/javascript/mastodon/actions/custom_emojis.js @@ -5,10 +5,10 @@ export const CUSTOM_EMOJIS_FETCH_SUCCESS = 'CUSTOM_EMOJIS_FETCH_SUCCESS'; export const CUSTOM_EMOJIS_FETCH_FAIL = 'CUSTOM_EMOJIS_FETCH_FAIL'; export function fetchCustomEmojis() { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchCustomEmojisRequest()); - api(getState).get('/api/v1/custom_emojis').then(response => { + api().get('/api/v1/custom_emojis').then(response => { dispatch(fetchCustomEmojisSuccess(response.data)); }).catch(error => { dispatch(fetchCustomEmojisFail(error)); diff --git a/app/javascript/mastodon/actions/directory.js b/app/javascript/mastodon/actions/directory.js index cda63f2b5..7a0748029 100644 --- a/app/javascript/mastodon/actions/directory.js +++ b/app/javascript/mastodon/actions/directory.js @@ -11,10 +11,10 @@ export const DIRECTORY_EXPAND_REQUEST = 'DIRECTORY_EXPAND_REQUEST'; export const DIRECTORY_EXPAND_SUCCESS = 'DIRECTORY_EXPAND_SUCCESS'; export const DIRECTORY_EXPAND_FAIL = 'DIRECTORY_EXPAND_FAIL'; -export const fetchDirectory = params => (dispatch, getState) => { +export const fetchDirectory = params => (dispatch) => { dispatch(fetchDirectoryRequest()); - api(getState).get('/api/v1/directory', { params: { ...params, limit: 20 } }).then(({ data }) => { + api().get('/api/v1/directory', { params: { ...params, limit: 20 } }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(fetchDirectorySuccess(data)); dispatch(fetchRelationships(data.map(x => x.id))); @@ -40,7 +40,7 @@ export const expandDirectory = params => (dispatch, getState) => { const loadedItems = getState().getIn(['user_lists', 'directory', 'items']).size; - api(getState).get('/api/v1/directory', { params: { ...params, offset: loadedItems, limit: 20 } }).then(({ data }) => { + api().get('/api/v1/directory', { params: { ...params, offset: loadedItems, limit: 20 } }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(expandDirectorySuccess(data)); dispatch(fetchRelationships(data.map(x => x.id))); diff --git a/app/javascript/mastodon/actions/domain_blocks.js b/app/javascript/mastodon/actions/domain_blocks.js index 55c0a6ce9..727f800af 100644 --- a/app/javascript/mastodon/actions/domain_blocks.js +++ b/app/javascript/mastodon/actions/domain_blocks.js @@ -24,7 +24,7 @@ export function blockDomain(domain) { return (dispatch, getState) => { dispatch(blockDomainRequest(domain)); - api(getState).post('/api/v1/domain_blocks', { domain }).then(() => { + api().post('/api/v1/domain_blocks', { domain }).then(() => { const at_domain = '@' + domain; const accounts = getState().get('accounts').filter(item => item.get('acct').endsWith(at_domain)).valueSeq().map(item => item.get('id')); @@ -54,7 +54,7 @@ export function unblockDomain(domain) { return (dispatch, getState) => { dispatch(unblockDomainRequest(domain)); - api(getState).delete('/api/v1/domain_blocks', { params: { domain } }).then(() => { + api().delete('/api/v1/domain_blocks', { params: { domain } }).then(() => { const at_domain = '@' + domain; const accounts = getState().get('accounts').filter(item => item.get('acct').endsWith(at_domain)).valueSeq().map(item => item.get('id')); dispatch(unblockDomainSuccess({ domain, accounts })); @@ -80,10 +80,10 @@ export function unblockDomainFail(domain, error) { } export function fetchDomainBlocks() { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchDomainBlocksRequest()); - api(getState).get('/api/v1/domain_blocks').then(response => { + api().get('/api/v1/domain_blocks').then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(fetchDomainBlocksSuccess(response.data, next ? next.uri : null)); }).catch(err => { @@ -123,7 +123,7 @@ export function expandDomainBlocks() { dispatch(expandDomainBlocksRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(expandDomainBlocksSuccess(response.data, next ? next.uri : null)); }).catch(err => { diff --git a/app/javascript/mastodon/actions/favourites.js b/app/javascript/mastodon/actions/favourites.js index 2d4d4e620..ff475c82b 100644 --- a/app/javascript/mastodon/actions/favourites.js +++ b/app/javascript/mastodon/actions/favourites.js @@ -18,7 +18,7 @@ export function fetchFavouritedStatuses() { dispatch(fetchFavouritedStatusesRequest()); - api(getState).get('/api/v1/favourites').then(response => { + api().get('/api/v1/favourites').then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); dispatch(fetchFavouritedStatusesSuccess(response.data, next ? next.uri : null)); @@ -62,7 +62,7 @@ export function expandFavouritedStatuses() { dispatch(expandFavouritedStatusesRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); dispatch(expandFavouritedStatusesSuccess(response.data, next ? next.uri : null)); diff --git a/app/javascript/mastodon/actions/featured_tags.js b/app/javascript/mastodon/actions/featured_tags.js index 18bb61539..6ee4dee2b 100644 --- a/app/javascript/mastodon/actions/featured_tags.js +++ b/app/javascript/mastodon/actions/featured_tags.js @@ -11,7 +11,7 @@ export const fetchFeaturedTags = (id) => (dispatch, getState) => { dispatch(fetchFeaturedTagsRequest(id)); - api(getState).get(`/api/v1/accounts/${id}/featured_tags`) + api().get(`/api/v1/accounts/${id}/featured_tags`) .then(({ data }) => dispatch(fetchFeaturedTagsSuccess(id, data))) .catch(err => dispatch(fetchFeaturedTagsFail(id, err))); }; diff --git a/app/javascript/mastodon/actions/filters.js b/app/javascript/mastodon/actions/filters.js index a11956ac5..588e390f0 100644 --- a/app/javascript/mastodon/actions/filters.js +++ b/app/javascript/mastodon/actions/filters.js @@ -23,13 +23,13 @@ export const initAddFilter = (status, { contextType }) => dispatch => }, })); -export const fetchFilters = () => (dispatch, getState) => { +export const fetchFilters = () => (dispatch) => { dispatch({ type: FILTERS_FETCH_REQUEST, skipLoading: true, }); - api(getState) + api() .get('/api/v2/filters') .then(({ data }) => dispatch({ type: FILTERS_FETCH_SUCCESS, @@ -44,10 +44,10 @@ export const fetchFilters = () => (dispatch, getState) => { })); }; -export const createFilterStatus = (params, onSuccess, onFail) => (dispatch, getState) => { +export const createFilterStatus = (params, onSuccess, onFail) => (dispatch) => { dispatch(createFilterStatusRequest()); - api(getState).post(`/api/v2/filters/${params.filter_id}/statuses`, params).then(response => { + api().post(`/api/v2/filters/${params.filter_id}/statuses`, params).then(response => { dispatch(createFilterStatusSuccess(response.data)); if (onSuccess) onSuccess(); }).catch(error => { @@ -70,10 +70,10 @@ export const createFilterStatusFail = error => ({ error, }); -export const createFilter = (params, onSuccess, onFail) => (dispatch, getState) => { +export const createFilter = (params, onSuccess, onFail) => (dispatch) => { dispatch(createFilterRequest()); - api(getState).post('/api/v2/filters', params).then(response => { + api().post('/api/v2/filters', params).then(response => { dispatch(createFilterSuccess(response.data)); if (onSuccess) onSuccess(response.data); }).catch(error => { diff --git a/app/javascript/mastodon/actions/history.js b/app/javascript/mastodon/actions/history.js index 52401b7dc..07732ea18 100644 --- a/app/javascript/mastodon/actions/history.js +++ b/app/javascript/mastodon/actions/history.js @@ -15,7 +15,7 @@ export const fetchHistory = statusId => (dispatch, getState) => { dispatch(fetchHistoryRequest(statusId)); - api(getState).get(`/api/v1/statuses/${statusId}/history`).then(({ data }) => { + api().get(`/api/v1/statuses/${statusId}/history`).then(({ data }) => { dispatch(importFetchedAccounts(data.map(x => x.account))); dispatch(fetchHistorySuccess(statusId, data)); }).catch(error => dispatch(fetchHistoryFail(error))); diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js index 7d0144438..57f2459c0 100644 --- a/app/javascript/mastodon/actions/interactions.js +++ b/app/javascript/mastodon/actions/interactions.js @@ -3,10 +3,6 @@ import api, { getLinks } from '../api'; import { fetchRelationships } from './accounts'; import { importFetchedAccounts, importFetchedStatus } from './importer'; -export const REBLOG_REQUEST = 'REBLOG_REQUEST'; -export const REBLOG_SUCCESS = 'REBLOG_SUCCESS'; -export const REBLOG_FAIL = 'REBLOG_FAIL'; - export const REBLOGS_EXPAND_REQUEST = 'REBLOGS_EXPAND_REQUEST'; export const REBLOGS_EXPAND_SUCCESS = 'REBLOGS_EXPAND_SUCCESS'; export const REBLOGS_EXPAND_FAIL = 'REBLOGS_EXPAND_FAIL'; @@ -15,10 +11,6 @@ export const FAVOURITE_REQUEST = 'FAVOURITE_REQUEST'; export const FAVOURITE_SUCCESS = 'FAVOURITE_SUCCESS'; export const FAVOURITE_FAIL = 'FAVOURITE_FAIL'; -export const UNREBLOG_REQUEST = 'UNREBLOG_REQUEST'; -export const UNREBLOG_SUCCESS = 'UNREBLOG_SUCCESS'; -export const UNREBLOG_FAIL = 'UNREBLOG_FAIL'; - export const UNFAVOURITE_REQUEST = 'UNFAVOURITE_REQUEST'; export const UNFAVOURITE_SUCCESS = 'UNFAVOURITE_SUCCESS'; export const UNFAVOURITE_FAIL = 'UNFAVOURITE_FAIL'; @@ -51,89 +43,13 @@ export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST'; export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS'; export const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL'; -export function reblog(status, visibility) { - return function (dispatch, getState) { - dispatch(reblogRequest(status)); - - api(getState).post(`/api/v1/statuses/${status.get('id')}/reblog`, { visibility }).then(function (response) { - // The reblog API method returns a new status wrapped around the original. In this case we are only - // interested in how the original is modified, hence passing it skipping the wrapper - dispatch(importFetchedStatus(response.data.reblog)); - dispatch(reblogSuccess(status)); - }).catch(function (error) { - dispatch(reblogFail(status, error)); - }); - }; -} - -export function unreblog(status) { - return (dispatch, getState) => { - dispatch(unreblogRequest(status)); - - api(getState).post(`/api/v1/statuses/${status.get('id')}/unreblog`).then(response => { - dispatch(importFetchedStatus(response.data)); - dispatch(unreblogSuccess(status)); - }).catch(error => { - dispatch(unreblogFail(status, error)); - }); - }; -} - -export function reblogRequest(status) { - return { - type: REBLOG_REQUEST, - status: status, - skipLoading: true, - }; -} - -export function reblogSuccess(status) { - return { - type: REBLOG_SUCCESS, - status: status, - skipLoading: true, - }; -} - -export function reblogFail(status, error) { - return { - type: REBLOG_FAIL, - status: status, - error: error, - skipLoading: true, - }; -} - -export function unreblogRequest(status) { - return { - type: UNREBLOG_REQUEST, - status: status, - skipLoading: true, - }; -} - -export function unreblogSuccess(status) { - return { - type: UNREBLOG_SUCCESS, - status: status, - skipLoading: true, - }; -} - -export function unreblogFail(status, error) { - return { - type: UNREBLOG_FAIL, - status: status, - error: error, - skipLoading: true, - }; -} +export * from "./interactions_typed"; export function favourite(status) { - return function (dispatch, getState) { + return function (dispatch) { dispatch(favouriteRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/favourite`).then(function (response) { + api().post(`/api/v1/statuses/${status.get('id')}/favourite`).then(function (response) { dispatch(importFetchedStatus(response.data)); dispatch(favouriteSuccess(status)); }).catch(function (error) { @@ -143,10 +59,10 @@ export function favourite(status) { } export function unfavourite(status) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(unfavouriteRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/unfavourite`).then(response => { + api().post(`/api/v1/statuses/${status.get('id')}/unfavourite`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(unfavouriteSuccess(status)); }).catch(error => { @@ -206,10 +122,10 @@ export function unfavouriteFail(status, error) { } export function bookmark(status) { - return function (dispatch, getState) { + return function (dispatch) { dispatch(bookmarkRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function (response) { + api().post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function (response) { dispatch(importFetchedStatus(response.data)); dispatch(bookmarkSuccess(status, response.data)); }).catch(function (error) { @@ -219,10 +135,10 @@ export function bookmark(status) { } export function unbookmark(status) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(unbookmarkRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => { + api().post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(unbookmarkSuccess(status, response.data)); }).catch(error => { @@ -278,10 +194,10 @@ export function unbookmarkFail(status, error) { } export function fetchReblogs(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchReblogsRequest(id)); - api(getState).get(`/api/v1/statuses/${id}/reblogged_by`).then(response => { + api().get(`/api/v1/statuses/${id}/reblogged_by`).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); dispatch(fetchReblogsSuccess(id, response.data, next ? next.uri : null)); @@ -325,7 +241,7 @@ export function expandReblogs(id) { dispatch(expandReblogsRequest(id)); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); @@ -360,10 +276,10 @@ export function expandReblogsFail(id, error) { } export function fetchFavourites(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchFavouritesRequest(id)); - api(getState).get(`/api/v1/statuses/${id}/favourited_by`).then(response => { + api().get(`/api/v1/statuses/${id}/favourited_by`).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); dispatch(fetchFavouritesSuccess(id, response.data, next ? next.uri : null)); @@ -407,7 +323,7 @@ export function expandFavourites(id) { dispatch(expandFavouritesRequest(id)); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); @@ -442,10 +358,10 @@ export function expandFavouritesFail(id, error) { } export function pin(status) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(pinRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/pin`).then(response => { + api().post(`/api/v1/statuses/${status.get('id')}/pin`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(pinSuccess(status)); }).catch(error => { @@ -480,10 +396,10 @@ export function pinFail(status, error) { } export function unpin (status) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(unpinRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/unpin`).then(response => { + api().post(`/api/v1/statuses/${status.get('id')}/unpin`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(unpinSuccess(status)); }).catch(error => { diff --git a/app/javascript/mastodon/actions/interactions_typed.ts b/app/javascript/mastodon/actions/interactions_typed.ts new file mode 100644 index 000000000..f58faffa8 --- /dev/null +++ b/app/javascript/mastodon/actions/interactions_typed.ts @@ -0,0 +1,35 @@ +import { apiReblog, apiUnreblog } from 'mastodon/api/interactions'; +import type { StatusVisibility } from 'mastodon/models/status'; +import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; + +import { importFetchedStatus } from './importer'; + +export const reblog = createDataLoadingThunk( + 'status/reblog', + ({ + statusId, + visibility, + }: { + statusId: string; + visibility: StatusVisibility; + }) => apiReblog(statusId, visibility), + (data, { dispatch, discardLoadData }) => { + // The reblog API method returns a new status wrapped around the original. In this case we are only + // interested in how the original is modified, hence passing it skipping the wrapper + dispatch(importFetchedStatus(data.reblog)); + + // The payload is not used in any actions + return discardLoadData; + }, +); + +export const unreblog = createDataLoadingThunk( + 'status/unreblog', + ({ statusId }: { statusId: string }) => apiUnreblog(statusId), + (data, { dispatch, discardLoadData }) => { + dispatch(importFetchedStatus(data)); + + // The payload is not used in any actions + return discardLoadData; + }, +); diff --git a/app/javascript/mastodon/actions/lists.js b/app/javascript/mastodon/actions/lists.js index b0789cd42..995605938 100644 --- a/app/javascript/mastodon/actions/lists.js +++ b/app/javascript/mastodon/actions/lists.js @@ -57,7 +57,7 @@ export const fetchList = id => (dispatch, getState) => { dispatch(fetchListRequest(id)); - api(getState).get(`/api/v1/lists/${id}`) + api().get(`/api/v1/lists/${id}`) .then(({ data }) => dispatch(fetchListSuccess(data))) .catch(err => dispatch(fetchListFail(id, err))); }; @@ -78,10 +78,10 @@ export const fetchListFail = (id, error) => ({ error, }); -export const fetchLists = () => (dispatch, getState) => { +export const fetchLists = () => (dispatch) => { dispatch(fetchListsRequest()); - api(getState).get('/api/v1/lists') + api().get('/api/v1/lists') .then(({ data }) => dispatch(fetchListsSuccess(data))) .catch(err => dispatch(fetchListsFail(err))); }; @@ -125,10 +125,10 @@ export const changeListEditorTitle = value => ({ value, }); -export const createList = (title, shouldReset) => (dispatch, getState) => { +export const createList = (title, shouldReset) => (dispatch) => { dispatch(createListRequest()); - api(getState).post('/api/v1/lists', { title }).then(({ data }) => { + api().post('/api/v1/lists', { title }).then(({ data }) => { dispatch(createListSuccess(data)); if (shouldReset) { @@ -151,10 +151,10 @@ export const createListFail = error => ({ error, }); -export const updateList = (id, title, shouldReset, isExclusive, replies_policy) => (dispatch, getState) => { +export const updateList = (id, title, shouldReset, isExclusive, replies_policy) => (dispatch) => { dispatch(updateListRequest(id)); - api(getState).put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === 'undefined' ? undefined : !!isExclusive }).then(({ data }) => { + api().put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === 'undefined' ? undefined : !!isExclusive }).then(({ data }) => { dispatch(updateListSuccess(data)); if (shouldReset) { @@ -183,10 +183,10 @@ export const resetListEditor = () => ({ type: LIST_EDITOR_RESET, }); -export const deleteList = id => (dispatch, getState) => { +export const deleteList = id => (dispatch) => { dispatch(deleteListRequest(id)); - api(getState).delete(`/api/v1/lists/${id}`) + api().delete(`/api/v1/lists/${id}`) .then(() => dispatch(deleteListSuccess(id))) .catch(err => dispatch(deleteListFail(id, err))); }; @@ -207,10 +207,10 @@ export const deleteListFail = (id, error) => ({ error, }); -export const fetchListAccounts = listId => (dispatch, getState) => { +export const fetchListAccounts = listId => (dispatch) => { dispatch(fetchListAccountsRequest(listId)); - api(getState).get(`/api/v1/lists/${listId}/accounts`, { params: { limit: 0 } }).then(({ data }) => { + api().get(`/api/v1/lists/${listId}/accounts`, { params: { limit: 0 } }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(fetchListAccountsSuccess(listId, data)); }).catch(err => dispatch(fetchListAccountsFail(listId, err))); @@ -234,7 +234,7 @@ export const fetchListAccountsFail = (id, error) => ({ error, }); -export const fetchListSuggestions = q => (dispatch, getState) => { +export const fetchListSuggestions = q => (dispatch) => { const params = { q, resolve: false, @@ -242,7 +242,7 @@ export const fetchListSuggestions = q => (dispatch, getState) => { following: true, }; - api(getState).get('/api/v1/accounts/search', { params }).then(({ data }) => { + api().get('/api/v1/accounts/search', { params }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(fetchListSuggestionsReady(q, data)); }).catch(error => dispatch(showAlertForError(error))); @@ -267,10 +267,10 @@ export const addToListEditor = accountId => (dispatch, getState) => { dispatch(addToList(getState().getIn(['listEditor', 'listId']), accountId)); }; -export const addToList = (listId, accountId) => (dispatch, getState) => { +export const addToList = (listId, accountId) => (dispatch) => { dispatch(addToListRequest(listId, accountId)); - api(getState).post(`/api/v1/lists/${listId}/accounts`, { account_ids: [accountId] }) + api().post(`/api/v1/lists/${listId}/accounts`, { account_ids: [accountId] }) .then(() => dispatch(addToListSuccess(listId, accountId))) .catch(err => dispatch(addToListFail(listId, accountId, err))); }; @@ -298,10 +298,10 @@ export const removeFromListEditor = accountId => (dispatch, getState) => { dispatch(removeFromList(getState().getIn(['listEditor', 'listId']), accountId)); }; -export const removeFromList = (listId, accountId) => (dispatch, getState) => { +export const removeFromList = (listId, accountId) => (dispatch) => { dispatch(removeFromListRequest(listId, accountId)); - api(getState).delete(`/api/v1/lists/${listId}/accounts`, { params: { account_ids: [accountId] } }) + api().delete(`/api/v1/lists/${listId}/accounts`, { params: { account_ids: [accountId] } }) .then(() => dispatch(removeFromListSuccess(listId, accountId))) .catch(err => dispatch(removeFromListFail(listId, accountId, err))); }; @@ -338,10 +338,10 @@ export const setupListAdder = accountId => (dispatch, getState) => { dispatch(fetchAccountLists(accountId)); }; -export const fetchAccountLists = accountId => (dispatch, getState) => { +export const fetchAccountLists = accountId => (dispatch) => { dispatch(fetchAccountListsRequest(accountId)); - api(getState).get(`/api/v1/accounts/${accountId}/lists`) + api().get(`/api/v1/accounts/${accountId}/lists`) .then(({ data }) => dispatch(fetchAccountListsSuccess(accountId, data))) .catch(err => dispatch(fetchAccountListsFail(accountId, err))); }; @@ -370,4 +370,3 @@ export const addToListAdder = listId => (dispatch, getState) => { export const removeFromListAdder = listId => (dispatch, getState) => { dispatch(removeFromList(listId, getState().getIn(['listAdder', 'accountId']))); }; - diff --git a/app/javascript/mastodon/actions/markers.ts b/app/javascript/mastodon/actions/markers.ts index 6ecc86716..03f577c54 100644 --- a/app/javascript/mastodon/actions/markers.ts +++ b/app/javascript/mastodon/actions/markers.ts @@ -1,21 +1,24 @@ -import { List as ImmutableList } from 'immutable'; - import { debounce } from 'lodash'; import type { MarkerJSON } from 'mastodon/api_types/markers'; +import { getAccessToken } from 'mastodon/initial_state'; import type { AppDispatch, RootState } from 'mastodon/store'; import { createAppAsyncThunk } from 'mastodon/store/typed_functions'; -import api, { authorizationTokenFromState } from '../api'; +import api from '../api'; import { compareId } from '../compare_id'; export const synchronouslySubmitMarkers = createAppAsyncThunk( 'markers/submit', async (_args, { getState }) => { - const accessToken = authorizationTokenFromState(getState); + const accessToken = getAccessToken(); const params = buildPostMarkersParams(getState()); - if (Object.keys(params).length === 0 || !accessToken) { + if ( + Object.keys(params).length === 0 || + !accessToken || + accessToken === '' + ) { return; } @@ -71,19 +74,6 @@ interface MarkerParam { last_read_id?: string; } -function getLastHomeId(state: RootState): string | undefined { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return ( - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - state - // @ts-expect-error state.timelines is not yet typed - .getIn(['timelines', 'home', 'items'], ImmutableList()) - // @ts-expect-error state.timelines is not yet typed - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - .find((item) => item !== null) - ); -} - function getLastNotificationId(state: RootState): string | undefined { // @ts-expect-error state.notifications is not yet typed // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call @@ -93,15 +83,8 @@ function getLastNotificationId(state: RootState): string | undefined { const buildPostMarkersParams = (state: RootState) => { const params = {} as { home?: MarkerParam; notifications?: MarkerParam }; - const lastHomeId = getLastHomeId(state); const lastNotificationId = getLastNotificationId(state); - if (lastHomeId && compareId(lastHomeId, state.markers.home) > 0) { - params.home = { - last_read_id: lastHomeId, - }; - } - if ( lastNotificationId && compareId(lastNotificationId, state.markers.notifications) > 0 @@ -118,14 +101,14 @@ export const submitMarkersAction = createAppAsyncThunk<{ home: string | undefined; notifications: string | undefined; }>('markers/submitAction', async (_args, { getState }) => { - const accessToken = authorizationTokenFromState(getState); + const accessToken = getAccessToken(); const params = buildPostMarkersParams(getState()); - if (Object.keys(params).length === 0 || accessToken === '') { + if (Object.keys(params).length === 0 || !accessToken || accessToken === '') { return { home: undefined, notifications: undefined }; } - await api(getState).post('/api/v1/markers', params); + await api().post('/api/v1/markers', params); return { home: params.home?.last_read_id, @@ -155,14 +138,11 @@ export const submitMarkers = createAppAsyncThunk( }, ); -export const fetchMarkers = createAppAsyncThunk( - 'markers/fetch', - async (_args, { getState }) => { - const response = await api(getState).get>( - `/api/v1/markers`, - { params: { timeline: ['notifications'] } }, - ); +export const fetchMarkers = createAppAsyncThunk('markers/fetch', async () => { + const response = await api().get>( + `/api/v1/markers`, + { params: { timeline: ['notifications'] } }, + ); - return { markers: response.data }; - }, -); + return { markers: response.data }; +}); diff --git a/app/javascript/mastodon/actions/mutes.js b/app/javascript/mastodon/actions/mutes.js index 99c113f41..3676748cf 100644 --- a/app/javascript/mastodon/actions/mutes.js +++ b/app/javascript/mastodon/actions/mutes.js @@ -13,10 +13,10 @@ export const MUTES_EXPAND_SUCCESS = 'MUTES_EXPAND_SUCCESS'; export const MUTES_EXPAND_FAIL = 'MUTES_EXPAND_FAIL'; export function fetchMutes() { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchMutesRequest()); - api(getState).get('/api/v1/mutes').then(response => { + api().get('/api/v1/mutes').then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); dispatch(fetchMutesSuccess(response.data, next ? next.uri : null)); @@ -56,7 +56,7 @@ export function expandMutes() { dispatch(expandMutesRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data)); dispatch(expandMutesSuccess(response.data, next ? next.uri : null)); diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index b54cbe27b..fe728aa26 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -216,7 +216,7 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { dispatch(expandNotificationsRequest(isLoadingMore)); - api(getState).get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }).then(response => { + api().get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data.map(item => item.account))); @@ -262,12 +262,12 @@ export function expandNotificationsFail(error, isLoadingMore) { } export function clearNotifications() { - return (dispatch, getState) => { + return (dispatch) => { dispatch({ type: NOTIFICATIONS_CLEAR, }); - api(getState).post('/api/v1/notifications/clear'); + api().post('/api/v1/notifications/clear'); }; } @@ -346,10 +346,10 @@ export function setBrowserPermission (value) { }; } -export const fetchNotificationPolicy = () => (dispatch, getState) => { +export const fetchNotificationPolicy = () => (dispatch) => { dispatch(fetchNotificationPolicyRequest()); - api(getState).get('/api/v1/notifications/policy').then(({ data }) => { + api().get('/api/v1/notifications/policy').then(({ data }) => { dispatch(fetchNotificationPolicySuccess(data)); }).catch(err => { dispatch(fetchNotificationPolicyFail(err)); @@ -370,10 +370,10 @@ export const fetchNotificationPolicyFail = error => ({ error, }); -export const updateNotificationsPolicy = params => (dispatch, getState) => { +export const updateNotificationsPolicy = params => (dispatch) => { dispatch(fetchNotificationPolicyRequest()); - api(getState).put('/api/v1/notifications/policy', params).then(({ data }) => { + api().put('/api/v1/notifications/policy', params).then(({ data }) => { dispatch(fetchNotificationPolicySuccess(data)); }).catch(err => { dispatch(fetchNotificationPolicyFail(err)); @@ -393,7 +393,7 @@ export const fetchNotificationRequests = () => (dispatch, getState) => { dispatch(fetchNotificationRequestsRequest()); - api(getState).get('/api/v1/notifications/requests', { params }).then(response => { + api().get('/api/v1/notifications/requests', { params }).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data.map(x => x.account))); dispatch(fetchNotificationRequestsSuccess(response.data, next ? next.uri : null)); @@ -426,7 +426,7 @@ export const expandNotificationRequests = () => (dispatch, getState) => { dispatch(expandNotificationRequestsRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data.map(x => x.account))); dispatch(expandNotificationRequestsSuccess(response.data, next?.uri)); @@ -459,7 +459,7 @@ export const fetchNotificationRequest = id => (dispatch, getState) => { dispatch(fetchNotificationRequestRequest(id)); - api(getState).get(`/api/v1/notifications/requests/${id}`).then(({ data }) => { + api().get(`/api/v1/notifications/requests/${id}`).then(({ data }) => { dispatch(fetchNotificationRequestSuccess(data)); }).catch(err => { dispatch(fetchNotificationRequestFail(id, err)); @@ -482,10 +482,10 @@ export const fetchNotificationRequestFail = (id, error) => ({ error, }); -export const acceptNotificationRequest = id => (dispatch, getState) => { +export const acceptNotificationRequest = id => (dispatch) => { dispatch(acceptNotificationRequestRequest(id)); - api(getState).post(`/api/v1/notifications/requests/${id}/accept`).then(() => { + api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { dispatch(acceptNotificationRequestSuccess(id)); }).catch(err => { dispatch(acceptNotificationRequestFail(id, err)); @@ -508,10 +508,10 @@ export const acceptNotificationRequestFail = (id, error) => ({ error, }); -export const dismissNotificationRequest = id => (dispatch, getState) => { +export const dismissNotificationRequest = id => (dispatch) => { dispatch(dismissNotificationRequestRequest(id)); - api(getState).post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ + api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ dispatch(dismissNotificationRequestSuccess(id)); }).catch(err => { dispatch(dismissNotificationRequestFail(id, err)); @@ -550,7 +550,7 @@ export const fetchNotificationsForRequest = accountId => (dispatch, getState) => dispatch(fetchNotificationsForRequestRequest()); - api(getState).get('/api/v1/notifications', { params }).then(response => { + api().get('/api/v1/notifications', { params }).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); @@ -586,7 +586,7 @@ export const expandNotificationsForRequest = () => (dispatch, getState) => { dispatch(expandNotificationsForRequestRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); diff --git a/app/javascript/mastodon/actions/pin_statuses.js b/app/javascript/mastodon/actions/pin_statuses.js index baa10d156..d583eab57 100644 --- a/app/javascript/mastodon/actions/pin_statuses.js +++ b/app/javascript/mastodon/actions/pin_statuses.js @@ -8,10 +8,10 @@ export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS'; export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL'; export function fetchPinnedStatuses() { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchPinnedStatusesRequest()); - api(getState).get(`/api/v1/accounts/${me}/statuses`, { params: { pinned: true } }).then(response => { + api().get(`/api/v1/accounts/${me}/statuses`, { params: { pinned: true } }).then(response => { dispatch(importFetchedStatuses(response.data)); dispatch(fetchPinnedStatusesSuccess(response.data, null)); }).catch(error => { diff --git a/app/javascript/mastodon/actions/polls.js b/app/javascript/mastodon/actions/polls.js index a37410dc9..aa4934144 100644 --- a/app/javascript/mastodon/actions/polls.js +++ b/app/javascript/mastodon/actions/polls.js @@ -10,10 +10,10 @@ export const POLL_FETCH_REQUEST = 'POLL_FETCH_REQUEST'; export const POLL_FETCH_SUCCESS = 'POLL_FETCH_SUCCESS'; export const POLL_FETCH_FAIL = 'POLL_FETCH_FAIL'; -export const vote = (pollId, choices) => (dispatch, getState) => { +export const vote = (pollId, choices) => (dispatch) => { dispatch(voteRequest()); - api(getState).post(`/api/v1/polls/${pollId}/votes`, { choices }) + api().post(`/api/v1/polls/${pollId}/votes`, { choices }) .then(({ data }) => { dispatch(importFetchedPoll(data)); dispatch(voteSuccess(data)); @@ -21,10 +21,10 @@ export const vote = (pollId, choices) => (dispatch, getState) => { .catch(err => dispatch(voteFail(err))); }; -export const fetchPoll = pollId => (dispatch, getState) => { +export const fetchPoll = pollId => (dispatch) => { dispatch(fetchPollRequest()); - api(getState).get(`/api/v1/polls/${pollId}`) + api().get(`/api/v1/polls/${pollId}`) .then(({ data }) => { dispatch(importFetchedPoll(data)); dispatch(fetchPollSuccess(data)); diff --git a/app/javascript/mastodon/actions/reports.js b/app/javascript/mastodon/actions/reports.js index 756b8cd05..49b89b0d1 100644 --- a/app/javascript/mastodon/actions/reports.js +++ b/app/javascript/mastodon/actions/reports.js @@ -15,10 +15,10 @@ export const initReport = (account, status) => dispatch => }, })); -export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => { +export const submitReport = (params, onSuccess, onFail) => (dispatch) => { dispatch(submitReportRequest()); - api(getState).post('/api/v1/reports', params).then(response => { + api().post('/api/v1/reports', params).then(response => { dispatch(submitReportSuccess(response.data)); if (onSuccess) onSuccess(); }).catch(error => { diff --git a/app/javascript/mastodon/actions/search.js b/app/javascript/mastodon/actions/search.js index a34a490e7..bde17ae0d 100644 --- a/app/javascript/mastodon/actions/search.js +++ b/app/javascript/mastodon/actions/search.js @@ -46,7 +46,7 @@ export function submitSearch(type) { dispatch(fetchSearchRequest(type)); - api(getState).get('/api/v2/search', { + api().get('/api/v2/search', { params: { q: value, resolve: signedIn, @@ -99,7 +99,7 @@ export const expandSearch = type => (dispatch, getState) => { dispatch(expandSearchRequest(type)); - api(getState).get('/api/v2/search', { + api().get('/api/v2/search', { params: { q: value, type, @@ -156,7 +156,7 @@ export const openURL = (value, history, onFailure) => (dispatch, getState) => { dispatch(fetchSearchRequest()); - api(getState).get('/api/v2/search', { params: { q: value, resolve: true } }).then(response => { + api().get('/api/v2/search', { params: { q: value, resolve: true } }).then(response => { if (response.data.accounts?.length > 0) { dispatch(importFetchedAccounts(response.data.accounts)); history.push(`/@${response.data.accounts[0].acct}`); diff --git a/app/javascript/mastodon/actions/server.js b/app/javascript/mastodon/actions/server.js index 65f3efc3a..32ee093af 100644 --- a/app/javascript/mastodon/actions/server.js +++ b/app/javascript/mastodon/actions/server.js @@ -25,7 +25,7 @@ export const fetchServer = () => (dispatch, getState) => { dispatch(fetchServerRequest()); - api(getState) + api() .get('/api/v2/instance').then(({ data }) => { if (data.contact.account) dispatch(importFetchedAccount(data.contact.account)); dispatch(fetchServerSuccess(data)); @@ -46,10 +46,10 @@ const fetchServerFail = error => ({ error, }); -export const fetchServerTranslationLanguages = () => (dispatch, getState) => { +export const fetchServerTranslationLanguages = () => (dispatch) => { dispatch(fetchServerTranslationLanguagesRequest()); - api(getState) + api() .get('/api/v1/instance/translation_languages').then(({ data }) => { dispatch(fetchServerTranslationLanguagesSuccess(data)); }).catch(err => dispatch(fetchServerTranslationLanguagesFail(err))); @@ -76,7 +76,7 @@ export const fetchExtendedDescription = () => (dispatch, getState) => { dispatch(fetchExtendedDescriptionRequest()); - api(getState) + api() .get('/api/v1/instance/extended_description') .then(({ data }) => dispatch(fetchExtendedDescriptionSuccess(data))) .catch(err => dispatch(fetchExtendedDescriptionFail(err))); @@ -103,7 +103,7 @@ export const fetchDomainBlocks = () => (dispatch, getState) => { dispatch(fetchDomainBlocksRequest()); - api(getState) + api() .get('/api/v1/instance/domain_blocks') .then(({ data }) => dispatch(fetchDomainBlocksSuccess(true, data))) .catch(err => { diff --git a/app/javascript/mastodon/actions/settings.js b/app/javascript/mastodon/actions/settings.js index 3685b0684..fbd89f9d4 100644 --- a/app/javascript/mastodon/actions/settings.js +++ b/app/javascript/mastodon/actions/settings.js @@ -20,7 +20,7 @@ export function changeSetting(path, value) { } const debouncedSave = debounce((dispatch, getState) => { - if (getState().getIn(['settings', 'saved'])) { + if (getState().getIn(['settings', 'saved']) || !getState().getIn(['meta', 'me'])) { return; } diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js index 3aed80735..a60b80dc2 100644 --- a/app/javascript/mastodon/actions/statuses.js +++ b/app/javascript/mastodon/actions/statuses.js @@ -59,7 +59,7 @@ export function fetchStatus(id, forceFetch = false) { dispatch(fetchStatusRequest(id, skipLoading)); - api(getState).get(`/api/v1/statuses/${id}`).then(response => { + api().get(`/api/v1/statuses/${id}`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(fetchStatusSuccess(skipLoading)); }).catch(error => { @@ -102,7 +102,7 @@ export const editStatus = (id, routerHistory) => (dispatch, getState) => { dispatch(fetchStatusSourceRequest()); - api(getState).get(`/api/v1/statuses/${id}/source`).then(response => { + api().get(`/api/v1/statuses/${id}/source`).then(response => { dispatch(fetchStatusSourceSuccess()); ensureComposeIsVisible(getState, routerHistory); dispatch(setComposeToStatus(status, response.data.text, response.data.spoiler_text)); @@ -134,7 +134,7 @@ export function deleteStatus(id, routerHistory, withRedraft = false) { dispatch(deleteStatusRequest(id)); - api(getState).delete(`/api/v1/statuses/${id}`).then(response => { + api().delete(`/api/v1/statuses/${id}`).then(response => { dispatch(deleteStatusSuccess(id)); dispatch(deleteFromTimelines(id)); dispatch(importFetchedAccount(response.data.account)); @@ -175,10 +175,10 @@ export const updateStatus = status => dispatch => dispatch(importFetchedStatus(status)); export function fetchContext(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchContextRequest(id)); - api(getState).get(`/api/v1/statuses/${id}/context`).then(response => { + api().get(`/api/v1/statuses/${id}/context`).then(response => { dispatch(importFetchedStatuses(response.data.ancestors.concat(response.data.descendants))); dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants)); @@ -219,10 +219,10 @@ export function fetchContextFail(id, error) { } export function muteStatus(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(muteStatusRequest(id)); - api(getState).post(`/api/v1/statuses/${id}/mute`).then(() => { + api().post(`/api/v1/statuses/${id}/mute`).then(() => { dispatch(muteStatusSuccess(id)); }).catch(error => { dispatch(muteStatusFail(id, error)); @@ -253,10 +253,10 @@ export function muteStatusFail(id, error) { } export function unmuteStatus(id) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(unmuteStatusRequest(id)); - api(getState).post(`/api/v1/statuses/${id}/unmute`).then(() => { + api().post(`/api/v1/statuses/${id}/unmute`).then(() => { dispatch(unmuteStatusSuccess(id)); }).catch(error => { dispatch(unmuteStatusFail(id, error)); @@ -316,10 +316,10 @@ export function toggleStatusCollapse(id, isCollapsed) { }; } -export const translateStatus = id => (dispatch, getState) => { +export const translateStatus = id => (dispatch) => { dispatch(translateStatusRequest(id)); - api(getState).post(`/api/v1/statuses/${id}/translate`).then(response => { + api().post(`/api/v1/statuses/${id}/translate`).then(response => { dispatch(translateStatusSuccess(id, response.data)); }).catch(error => { dispatch(translateStatusFail(id, error)); diff --git a/app/javascript/mastodon/actions/suggestions.js b/app/javascript/mastodon/actions/suggestions.js index 8eafe38b2..258ffa901 100644 --- a/app/javascript/mastodon/actions/suggestions.js +++ b/app/javascript/mastodon/actions/suggestions.js @@ -10,10 +10,10 @@ export const SUGGESTIONS_FETCH_FAIL = 'SUGGESTIONS_FETCH_FAIL'; export const SUGGESTIONS_DISMISS = 'SUGGESTIONS_DISMISS'; export function fetchSuggestions(withRelationships = false) { - return (dispatch, getState) => { + return (dispatch) => { dispatch(fetchSuggestionsRequest()); - api(getState).get('/api/v2/suggestions', { params: { limit: 20 } }).then(response => { + api().get('/api/v2/suggestions', { params: { limit: 20 } }).then(response => { dispatch(importFetchedAccounts(response.data.map(x => x.account))); dispatch(fetchSuggestionsSuccess(response.data)); @@ -48,11 +48,11 @@ export function fetchSuggestionsFail(error) { }; } -export const dismissSuggestion = accountId => (dispatch, getState) => { +export const dismissSuggestion = accountId => (dispatch) => { dispatch({ type: SUGGESTIONS_DISMISS, id: accountId, }); - api(getState).delete(`/api/v1/suggestions/${accountId}`).catch(() => {}); + api().delete(`/api/v1/suggestions/${accountId}`).catch(() => {}); }; diff --git a/app/javascript/mastodon/actions/tags.js b/app/javascript/mastodon/actions/tags.js index dda8c924b..d18d7e514 100644 --- a/app/javascript/mastodon/actions/tags.js +++ b/app/javascript/mastodon/actions/tags.js @@ -20,10 +20,10 @@ export const HASHTAG_UNFOLLOW_REQUEST = 'HASHTAG_UNFOLLOW_REQUEST'; export const HASHTAG_UNFOLLOW_SUCCESS = 'HASHTAG_UNFOLLOW_SUCCESS'; export const HASHTAG_UNFOLLOW_FAIL = 'HASHTAG_UNFOLLOW_FAIL'; -export const fetchHashtag = name => (dispatch, getState) => { +export const fetchHashtag = name => (dispatch) => { dispatch(fetchHashtagRequest()); - api(getState).get(`/api/v1/tags/${name}`).then(({ data }) => { + api().get(`/api/v1/tags/${name}`).then(({ data }) => { dispatch(fetchHashtagSuccess(name, data)); }).catch(err => { dispatch(fetchHashtagFail(err)); @@ -45,10 +45,10 @@ export const fetchHashtagFail = error => ({ error, }); -export const fetchFollowedHashtags = () => (dispatch, getState) => { +export const fetchFollowedHashtags = () => (dispatch) => { dispatch(fetchFollowedHashtagsRequest()); - api(getState).get('/api/v1/followed_tags').then(response => { + api().get('/api/v1/followed_tags').then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(fetchFollowedHashtagsSuccess(response.data, next ? next.uri : null)); }).catch(err => { @@ -87,7 +87,7 @@ export function expandFollowedHashtags() { dispatch(expandFollowedHashtagsRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(expandFollowedHashtagsSuccess(response.data, next ? next.uri : null)); }).catch(error => { @@ -117,10 +117,10 @@ export function expandFollowedHashtagsFail(error) { }; } -export const followHashtag = name => (dispatch, getState) => { +export const followHashtag = name => (dispatch) => { dispatch(followHashtagRequest(name)); - api(getState).post(`/api/v1/tags/${name}/follow`).then(({ data }) => { + api().post(`/api/v1/tags/${name}/follow`).then(({ data }) => { dispatch(followHashtagSuccess(name, data)); }).catch(err => { dispatch(followHashtagFail(name, err)); @@ -144,10 +144,10 @@ export const followHashtagFail = (name, error) => ({ error, }); -export const unfollowHashtag = name => (dispatch, getState) => { +export const unfollowHashtag = name => (dispatch) => { dispatch(unfollowHashtagRequest(name)); - api(getState).post(`/api/v1/tags/${name}/unfollow`).then(({ data }) => { + api().post(`/api/v1/tags/${name}/unfollow`).then(({ data }) => { dispatch(unfollowHashtagSuccess(name, data)); }).catch(err => { dispatch(unfollowHashtagFail(name, err)); diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index 4ce7c3cf8..dc37cdf1f 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -114,7 +114,7 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { dispatch(expandTimelineRequest(timelineId, isLoadingMore)); - api(getState).get(path, { params }).then(response => { + api().get(path, { params }).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); diff --git a/app/javascript/mastodon/actions/trends.js b/app/javascript/mastodon/actions/trends.js index d31442388..0b840b41c 100644 --- a/app/javascript/mastodon/actions/trends.js +++ b/app/javascript/mastodon/actions/trends.js @@ -18,10 +18,10 @@ export const TRENDS_STATUSES_EXPAND_REQUEST = 'TRENDS_STATUSES_EXPAND_REQUEST'; export const TRENDS_STATUSES_EXPAND_SUCCESS = 'TRENDS_STATUSES_EXPAND_SUCCESS'; export const TRENDS_STATUSES_EXPAND_FAIL = 'TRENDS_STATUSES_EXPAND_FAIL'; -export const fetchTrendingHashtags = () => (dispatch, getState) => { +export const fetchTrendingHashtags = () => (dispatch) => { dispatch(fetchTrendingHashtagsRequest()); - api(getState) + api() .get('/api/v1/trends/tags') .then(({ data }) => dispatch(fetchTrendingHashtagsSuccess(data))) .catch(err => dispatch(fetchTrendingHashtagsFail(err))); @@ -45,10 +45,10 @@ export const fetchTrendingHashtagsFail = error => ({ skipAlert: true, }); -export const fetchTrendingLinks = () => (dispatch, getState) => { +export const fetchTrendingLinks = () => (dispatch) => { dispatch(fetchTrendingLinksRequest()); - api(getState) + api() .get('/api/v1/trends/links') .then(({ data }) => dispatch(fetchTrendingLinksSuccess(data))) .catch(err => dispatch(fetchTrendingLinksFail(err))); @@ -79,7 +79,7 @@ export const fetchTrendingStatuses = () => (dispatch, getState) => { dispatch(fetchTrendingStatusesRequest()); - api(getState).get('/api/v1/trends/statuses').then(response => { + api().get('/api/v1/trends/statuses').then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); dispatch(fetchTrendingStatusesSuccess(response.data, next ? next.uri : null)); @@ -115,7 +115,7 @@ export const expandTrendingStatuses = () => (dispatch, getState) => { dispatch(expandTrendingStatusesRequest()); - api(getState).get(url).then(response => { + api().get(url).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); dispatch(expandTrendingStatusesSuccess(response.data, next ? next.uri : null)); diff --git a/app/javascript/mastodon/api.ts b/app/javascript/mastodon/api.ts index de597a3e3..e133125a2 100644 --- a/app/javascript/mastodon/api.ts +++ b/app/javascript/mastodon/api.ts @@ -1,9 +1,9 @@ -import type { AxiosResponse, RawAxiosRequestHeaders } from 'axios'; +import type { AxiosResponse, Method, RawAxiosRequestHeaders } from 'axios'; import axios from 'axios'; import LinkHeader from 'http-link-header'; +import { getAccessToken } from './initial_state'; import ready from './ready'; -import type { GetState } from './store'; export const getLinks = (response: AxiosResponse) => { const value = response.headers.link as string | undefined; @@ -29,30 +29,22 @@ const setCSRFHeader = () => { void ready(setCSRFHeader); -export const authorizationTokenFromState = (getState?: GetState) => { - return ( - getState && (getState().meta.get('access_token', '') as string | false) - ); -}; +const authorizationTokenFromInitialState = (): RawAxiosRequestHeaders => { + const accessToken = getAccessToken(); -const authorizationHeaderFromState = (getState?: GetState) => { - const accessToken = authorizationTokenFromState(getState); - - if (!accessToken) { - return {}; - } + if (!accessToken) return {}; return { Authorization: `Bearer ${accessToken}`, - } as RawAxiosRequestHeaders; + }; }; // eslint-disable-next-line import/no-default-export -export default function api(getState: GetState) { +export default function api(withAuthorization = true) { return axios.create({ headers: { ...csrfHeader, - ...authorizationHeaderFromState(getState), + ...(withAuthorization ? authorizationTokenFromInitialState() : {}), }, transformResponse: [ @@ -66,3 +58,17 @@ export default function api(getState: GetState) { ], }); } + +export async function apiRequest( + method: Method, + url: string, + params?: Record, +) { + const { data } = await api().request({ + method, + url: '/api/' + url, + data: params, + }); + + return data; +} diff --git a/app/javascript/mastodon/api/accounts.ts b/app/javascript/mastodon/api/accounts.ts new file mode 100644 index 000000000..3d89e44b2 --- /dev/null +++ b/app/javascript/mastodon/api/accounts.ts @@ -0,0 +1,7 @@ +import { apiRequest } from 'mastodon/api'; +import type { ApiRelationshipJSON } from 'mastodon/api_types/relationships'; + +export const apiSubmitAccountNote = (id: string, value: string) => + apiRequest('post', `v1/accounts/${id}/note`, { + comment: value, + }); diff --git a/app/javascript/mastodon/api/interactions.ts b/app/javascript/mastodon/api/interactions.ts new file mode 100644 index 000000000..4c466a1b4 --- /dev/null +++ b/app/javascript/mastodon/api/interactions.ts @@ -0,0 +1,10 @@ +import { apiRequest } from 'mastodon/api'; +import type { Status, StatusVisibility } from 'mastodon/models/status'; + +export const apiReblog = (statusId: string, visibility: StatusVisibility) => + apiRequest<{ reblog: Status }>('post', `v1/statuses/${statusId}/reblog`, { + visibility, + }); + +export const apiUnreblog = (statusId: string) => + apiRequest('post', `v1/statuses/${statusId}/unreblog`); diff --git a/app/javascript/mastodon/components/account.jsx b/app/javascript/mastodon/components/account.jsx index 3282696d3..18a31cba2 100644 --- a/app/javascript/mastodon/components/account.jsx +++ b/app/javascript/mastodon/components/account.jsx @@ -172,7 +172,6 @@ Account.propTypes = { onBlock: PropTypes.func, onMute: PropTypes.func, onMuteNotifications: PropTypes.func, - intl: PropTypes.object.isRequired, hidden: PropTypes.bool, minimal: PropTypes.bool, defaultAction: PropTypes.string, diff --git a/app/javascript/mastodon/components/admin/Counter.jsx b/app/javascript/mastodon/components/admin/Counter.jsx index 6ce23c9f0..e4d21da62 100644 --- a/app/javascript/mastodon/components/admin/Counter.jsx +++ b/app/javascript/mastodon/components/admin/Counter.jsx @@ -48,7 +48,7 @@ export default class Counter extends PureComponent { componentDidMount () { const { measure, start_at, end_at, params } = this.props; - api().post('/api/v1/admin/measures', { keys: [measure], start_at, end_at, [measure]: params }).then(res => { + api(false).post('/api/v1/admin/measures', { keys: [measure], start_at, end_at, [measure]: params }).then(res => { this.setState({ loading: false, data: res.data, diff --git a/app/javascript/mastodon/components/admin/Dimension.jsx b/app/javascript/mastodon/components/admin/Dimension.jsx index bfda6c93d..56557ad8e 100644 --- a/app/javascript/mastodon/components/admin/Dimension.jsx +++ b/app/javascript/mastodon/components/admin/Dimension.jsx @@ -26,7 +26,7 @@ export default class Dimension extends PureComponent { componentDidMount () { const { start_at, end_at, dimension, limit, params } = this.props; - api().post('/api/v1/admin/dimensions', { keys: [dimension], start_at, end_at, limit, [dimension]: params }).then(res => { + api(false).post('/api/v1/admin/dimensions', { keys: [dimension], start_at, end_at, limit, [dimension]: params }).then(res => { this.setState({ loading: false, data: res.data, diff --git a/app/javascript/mastodon/components/admin/ImpactReport.jsx b/app/javascript/mastodon/components/admin/ImpactReport.jsx index c27ee0ab0..add54134b 100644 --- a/app/javascript/mastodon/components/admin/ImpactReport.jsx +++ b/app/javascript/mastodon/components/admin/ImpactReport.jsx @@ -27,7 +27,7 @@ export default class ImpactReport extends PureComponent { include_subdomains: true, }; - api().post('/api/v1/admin/measures', { + api(false).post('/api/v1/admin/measures', { keys: ['instance_accounts', 'instance_follows', 'instance_followers'], start_at: null, end_at: null, diff --git a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx index 90f4334a6..cc05e5c16 100644 --- a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx +++ b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx @@ -105,7 +105,7 @@ class ReportReasonSelector extends PureComponent { }; componentDidMount() { - api().get('/api/v1/instance').then(res => { + api(false).get('/api/v1/instance').then(res => { this.setState({ rules: res.data.rules, }); @@ -122,7 +122,7 @@ class ReportReasonSelector extends PureComponent { return; } - api().put(`/api/v1/admin/reports/${id}`, { + api(false).put(`/api/v1/admin/reports/${id}`, { category, rule_ids: category === 'violation' ? rule_ids : [], }).catch(err => { diff --git a/app/javascript/mastodon/components/admin/Retention.jsx b/app/javascript/mastodon/components/admin/Retention.jsx index 1e8ef48b7..87746e9f4 100644 --- a/app/javascript/mastodon/components/admin/Retention.jsx +++ b/app/javascript/mastodon/components/admin/Retention.jsx @@ -34,7 +34,7 @@ export default class Retention extends PureComponent { componentDidMount () { const { start_at, end_at, frequency } = this.props; - api().post('/api/v1/admin/retention', { start_at, end_at, frequency }).then(res => { + api(false).post('/api/v1/admin/retention', { start_at, end_at, frequency }).then(res => { this.setState({ loading: false, data: res.data, diff --git a/app/javascript/mastodon/components/admin/Trends.jsx b/app/javascript/mastodon/components/admin/Trends.jsx index c69b4a8cb..fd6db106d 100644 --- a/app/javascript/mastodon/components/admin/Trends.jsx +++ b/app/javascript/mastodon/components/admin/Trends.jsx @@ -22,7 +22,7 @@ export default class Trends extends PureComponent { componentDidMount () { const { limit } = this.props; - api().get('/api/v1/admin/trends/tags', { params: { limit } }).then(res => { + api(false).get('/api/v1/admin/trends/tags', { params: { limit } }).then(res => { this.setState({ loading: false, data: res.data, diff --git a/app/javascript/mastodon/components/animated_number.tsx b/app/javascript/mastodon/components/animated_number.tsx index e98e30b24..6c1e0aaec 100644 --- a/app/javascript/mastodon/components/animated_number.tsx +++ b/app/javascript/mastodon/components/animated_number.tsx @@ -48,8 +48,9 @@ export const AnimatedNumber: React.FC = ({ value }) => { 0 ? 'absolute' : 'static', - transform: `translateY(${style.y * 100}%)`, + position: + direction * (style.y ?? 0) > 0 ? 'absolute' : 'static', + transform: `translateY(${(style.y ?? 0) * 100}%)`, }} > diff --git a/app/javascript/mastodon/components/badge.jsx b/app/javascript/mastodon/components/badge.jsx index 5e0b2587b..2a335d7f5 100644 --- a/app/javascript/mastodon/components/badge.jsx +++ b/app/javascript/mastodon/components/badge.jsx @@ -7,7 +7,7 @@ import PersonIcon from '@/material-icons/400-24px/person.svg?react'; import SmartToyIcon from '@/material-icons/400-24px/smart_toy.svg?react'; -export const Badge = ({ icon, label, domain, roleId }) => ( +export const Badge = ({ icon = , label, domain, roleId }) => (
{icon} {label} @@ -22,10 +22,6 @@ Badge.propTypes = { roleId: PropTypes.string }; -Badge.defaultProps = { - icon: , -}; - export const GroupBadge = () => ( } label={} /> ); diff --git a/app/javascript/mastodon/components/column_header.jsx b/app/javascript/mastodon/components/column_header.jsx index a7d07ffdb..42183f336 100644 --- a/app/javascript/mastodon/components/column_header.jsx +++ b/app/javascript/mastodon/components/column_header.jsx @@ -14,8 +14,10 @@ import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import SettingsIcon from '@/material-icons/400-24px/settings.svg?react'; import { Icon } from 'mastodon/components/icon'; import { ButtonInTabsBar } from 'mastodon/features/ui/util/columns_context'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; + import { useAppHistory } from './router'; const messages = defineMessages({ @@ -51,12 +53,8 @@ BackButton.propTypes = { }; class ColumnHeader extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, intl: PropTypes.object.isRequired, title: PropTypes.node, icon: PropTypes.string, @@ -171,7 +169,7 @@ class ColumnHeader extends PureComponent { ); } - if (this.context.identity.signedIn && (children || (multiColumn && this.props.onPin))) { + if (this.props.identity.signedIn && (children || (multiColumn && this.props.onPin))) { collapseButton = ( } + {!showResults && } {!showResults && <> · } {showResults && !this.props.disabled && <> · } {votesCount} @@ -247,4 +244,4 @@ class Poll extends ImmutablePureComponent { } -export default injectIntl(Poll); +export default injectIntl(withIdentity(Poll)); diff --git a/app/javascript/mastodon/components/short_number.tsx b/app/javascript/mastodon/components/short_number.tsx index 74c3c5d75..a0b523aaa 100644 --- a/app/javascript/mastodon/components/short_number.tsx +++ b/app/javascript/mastodon/components/short_number.tsx @@ -48,7 +48,7 @@ const ShortNumberCounter: React.FC = ({ value }) => { const count = ( ); diff --git a/app/javascript/mastodon/components/status_action_bar.jsx b/app/javascript/mastodon/components/status_action_bar.jsx index 6def49fdb..c79eae846 100644 --- a/app/javascript/mastodon/components/status_action_bar.jsx +++ b/app/javascript/mastodon/components/status_action_bar.jsx @@ -22,6 +22,7 @@ import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react'; import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react'; import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react'; import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -74,12 +75,8 @@ const mapStateToProps = (state, { status }) => ({ }); class StatusActionBar extends ImmutablePureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, status: ImmutablePropTypes.map.isRequired, relationship: ImmutablePropTypes.record, onReply: PropTypes.func, @@ -118,7 +115,7 @@ class StatusActionBar extends ImmutablePureComponent { ]; handleReplyClick = () => { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { this.props.onReply(this.props.status, this.props.history); @@ -136,7 +133,7 @@ class StatusActionBar extends ImmutablePureComponent { }; handleFavouriteClick = () => { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { this.props.onFavourite(this.props.status); @@ -146,7 +143,7 @@ class StatusActionBar extends ImmutablePureComponent { }; handleReblogClick = e => { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { this.props.onReblog(this.props.status, e); @@ -250,7 +247,7 @@ class StatusActionBar extends ImmutablePureComponent { render () { const { status, relationship, intl, withDismiss, withCounters, scrollKey } = this.props; - const { signedIn, permissions } = this.context.identity; + const { signedIn, permissions } = this.props.identity; const publicStatus = ['public', 'unlisted'].includes(status.get('visibility')); const pinnableStatus = ['public', 'unlisted', 'private'].includes(status.get('visibility')); @@ -410,4 +407,4 @@ class StatusActionBar extends ImmutablePureComponent { } -export default withRouter(connect(mapStateToProps)(injectIntl(StatusActionBar))); +export default withRouter(withIdentity(connect(mapStateToProps)(injectIntl(StatusActionBar)))); diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index 4a7ba941e..24483cf51 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -12,8 +12,10 @@ import { connect } from 'react-redux'; import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import { Icon } from 'mastodon/components/icon'; import PollContainer from 'mastodon/containers/poll_container'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { autoPlayGif, languages as preloadedLanguages } from 'mastodon/initial_state'; + const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top) /** @@ -67,12 +69,8 @@ const mapStateToProps = state => ({ }); class StatusContent extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, status: ImmutablePropTypes.map.isRequired, statusContent: PropTypes.string, expanded: PropTypes.bool, @@ -245,7 +243,7 @@ class StatusContent extends PureComponent { const renderReadMore = this.props.onClick && status.get('collapsed'); const contentLocale = intl.locale.replace(/[_-].*/, ''); const targetLanguages = this.props.languages?.get(status.get('language') || 'und'); - const renderTranslate = this.props.onTranslate && this.context.identity.signedIn && ['public', 'unlisted'].includes(status.get('visibility')) && status.get('search_index').trim().length > 0 && targetLanguages?.includes(contentLocale); + const renderTranslate = this.props.onTranslate && this.props.identity.signedIn && ['public', 'unlisted'].includes(status.get('visibility')) && status.get('search_index').trim().length > 0 && targetLanguages?.includes(contentLocale); const content = { __html: statusContent ?? getStatusContent(status) }; const spoilerContent = { __html: status.getIn(['translation', 'spoilerHtml']) || status.get('spoilerHtml') }; @@ -328,4 +326,4 @@ class StatusContent extends PureComponent { } -export default withRouter(connect(mapStateToProps)(injectIntl(StatusContent))); +export default withRouter(withIdentity(connect(mapStateToProps)(injectIntl(StatusContent)))); diff --git a/app/javascript/mastodon/containers/mastodon.jsx b/app/javascript/mastodon/containers/mastodon.jsx index 87708da19..0b1255c33 100644 --- a/app/javascript/mastodon/containers/mastodon.jsx +++ b/app/javascript/mastodon/containers/mastodon.jsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import { PureComponent } from 'react'; import { Helmet } from 'react-helmet'; @@ -14,6 +13,7 @@ import { connectUserStream } from 'mastodon/actions/streaming'; import ErrorBoundary from 'mastodon/components/error_boundary'; import { Router } from 'mastodon/components/router'; import UI from 'mastodon/features/ui'; +import { IdentityContext, createIdentityContext } from 'mastodon/identity_context'; import initialState, { title as siteTitle } from 'mastodon/initial_state'; import { IntlProvider } from 'mastodon/locales'; import { store } from 'mastodon/store'; @@ -28,33 +28,9 @@ if (initialState.meta.me) { store.dispatch(fetchCustomEmojis()); } -const createIdentityContext = state => ({ - signedIn: !!state.meta.me, - accountId: state.meta.me, - disabledAccountId: state.meta.disabled_account_id, - accessToken: state.meta.access_token, - permissions: state.role ? state.role.permissions : 0, -}); - export default class Mastodon extends PureComponent { - - static childContextTypes = { - identity: PropTypes.shape({ - signedIn: PropTypes.bool.isRequired, - accountId: PropTypes.string, - disabledAccountId: PropTypes.string, - accessToken: PropTypes.string, - }).isRequired, - }; - identity = createIdentityContext(initialState); - getChildContext() { - return { - identity: this.identity, - }; - } - componentDidMount() { if (this.identity.signedIn) { this.disconnect = store.dispatch(connectUserStream()); @@ -74,19 +50,21 @@ export default class Mastodon extends PureComponent { render () { return ( - - - - - - - - + + + + + + + + + - - - - + + + + + ); } diff --git a/app/javascript/mastodon/containers/status_container.jsx b/app/javascript/mastodon/containers/status_container.jsx index c6842e8df..4a9b52577 100644 --- a/app/javascript/mastodon/containers/status_container.jsx +++ b/app/javascript/mastodon/containers/status_container.jsx @@ -96,9 +96,9 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ onModalReblog (status, privacy) { if (status.get('reblogged')) { - dispatch(unreblog(status)); + dispatch(unreblog({ statusId: status.get('id') })); } else { - dispatch(reblog(status, privacy)); + dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); } }, diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index e9d6071a2..b10ef6ef7 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -25,6 +25,7 @@ import { IconButton } from 'mastodon/components/icon_button'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { ShortNumber } from 'mastodon/components/short_number'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { autoPlayGif, me, domain as localDomain } from 'mastodon/initial_state'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -111,6 +112,7 @@ const dateFormatOptions = { class Header extends ImmutablePureComponent { static propTypes = { + identity: identityContextPropShape, account: ImmutablePropTypes.record, identity_props: ImmutablePropTypes.list, onFollow: PropTypes.func.isRequired, @@ -136,10 +138,6 @@ class Header extends ImmutablePureComponent { ...WithRouterPropTypes, }; - static contextTypes = { - identity: PropTypes.object, - }; - setRef = c => { this.node = c; }; @@ -255,7 +253,7 @@ class Header extends ImmutablePureComponent { render () { const { account, hidden, intl } = this.props; - const { signedIn, permissions } = this.context.identity; + const { signedIn, permissions } = this.props.identity; if (!account) { return null; @@ -516,4 +514,4 @@ class Header extends ImmutablePureComponent { } -export default withRouter(injectIntl(Header)); +export default withRouter(withIdentity(injectIntl(Header))); diff --git a/app/javascript/mastodon/features/account/containers/account_note_container.js b/app/javascript/mastodon/features/account/containers/account_note_container.js index 20304a452..1530242d6 100644 --- a/app/javascript/mastodon/features/account/containers/account_note_container.js +++ b/app/javascript/mastodon/features/account/containers/account_note_container.js @@ -11,7 +11,7 @@ const mapStateToProps = (state, { account }) => ({ const mapDispatchToProps = (dispatch, { account }) => ({ onSave (value) { - dispatch(submitAccountNote({ id: account.get('id'), value})); + dispatch(submitAccountNote({ accountId: account.get('id'), note: value })); }, }); diff --git a/app/javascript/mastodon/features/community_timeline/index.jsx b/app/javascript/mastodon/features/community_timeline/index.jsx index 0aa1f9aa2..5652ea532 100644 --- a/app/javascript/mastodon/features/community_timeline/index.jsx +++ b/app/javascript/mastodon/features/community_timeline/index.jsx @@ -9,6 +9,7 @@ import { connect } from 'react-redux'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { domain } from 'mastodon/initial_state'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; @@ -38,16 +39,12 @@ const mapStateToProps = (state, { columnId }) => { }; class CommunityTimeline extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static defaultProps = { onlyMedia: false, }; static propTypes = { + identity: identityContextPropShape, dispatch: PropTypes.func.isRequired, columnId: PropTypes.string, intl: PropTypes.object.isRequired, @@ -77,7 +74,7 @@ class CommunityTimeline extends PureComponent { componentDidMount () { const { dispatch, onlyMedia } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; dispatch(expandCommunityTimeline({ onlyMedia })); @@ -87,7 +84,7 @@ class CommunityTimeline extends PureComponent { } componentDidUpdate (prevProps) { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (prevProps.onlyMedia !== this.props.onlyMedia) { const { dispatch, onlyMedia } = this.props; @@ -161,4 +158,4 @@ class CommunityTimeline extends PureComponent { } -export default connect(mapStateToProps)(injectIntl(CommunityTimeline)); +export default withIdentity(connect(mapStateToProps)(injectIntl(CommunityTimeline))); diff --git a/app/javascript/mastodon/features/compose/components/search.jsx b/app/javascript/mastodon/features/compose/components/search.jsx index ca02c23fc..7fa7ad248 100644 --- a/app/javascript/mastodon/features/compose/components/search.jsx +++ b/app/javascript/mastodon/features/compose/components/search.jsx @@ -12,6 +12,7 @@ import CancelIcon from '@/material-icons/400-24px/cancel-fill.svg?react'; import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import SearchIcon from '@/material-icons/400-24px/search.svg?react'; import { Icon } from 'mastodon/components/icon'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { domain, searchEnabled } from 'mastodon/initial_state'; import { HASHTAG_REGEX } from 'mastodon/utils/hashtags'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -33,12 +34,8 @@ const labelForRecentSearch = search => { }; class Search extends PureComponent { - - static contextTypes = { - identity: PropTypes.object.isRequired, - }; - static propTypes = { + identity: identityContextPropShape, value: PropTypes.string.isRequired, recent: ImmutablePropTypes.orderedSet, submitted: PropTypes.bool, @@ -276,7 +273,7 @@ class Search extends PureComponent { } _calculateOptions (value) { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; const trimmedValue = value.trim(); const options = []; @@ -318,7 +315,7 @@ class Search extends PureComponent { render () { const { intl, value, submitted, recent } = this.props; const { expanded, options, selectedOption } = this.state; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; const hasValue = value.length > 0 || submitted; @@ -402,4 +399,4 @@ class Search extends PureComponent { } -export default withRouter(injectIntl(Search)); +export default withRouter(withIdentity(injectIntl(Search))); diff --git a/app/javascript/mastodon/features/compose/components/search_results.jsx b/app/javascript/mastodon/features/compose/components/search_results.jsx index 667662781..6a482c8ec 100644 --- a/app/javascript/mastodon/features/compose/components/search_results.jsx +++ b/app/javascript/mastodon/features/compose/components/search_results.jsx @@ -1,16 +1,16 @@ -import PropTypes from 'prop-types'; +import { useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; - import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import TagIcon from '@/material-icons/400-24px/tag.svg?react'; +import { expandSearch } from 'mastodon/actions/search'; import { Icon } from 'mastodon/components/icon'; import { LoadMore } from 'mastodon/components/load_more'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { SearchSection } from 'mastodon/features/explore/components/search_section'; +import { useAppDispatch, useAppSelector } from 'mastodon/store'; import { ImmutableHashtag as Hashtag } from '../../../components/hashtag'; import AccountContainer from '../../../containers/account_container'; @@ -26,62 +26,68 @@ const withoutLastResult = list => { } }; -class SearchResults extends ImmutablePureComponent { +export const SearchResults = () => { + const results = useAppSelector((state) => state.getIn(['search', 'results'])); + const isLoading = useAppSelector((state) => state.getIn(['search', 'isLoading'])); - static propTypes = { - results: ImmutablePropTypes.map.isRequired, - expandSearch: PropTypes.func.isRequired, - searchTerm: PropTypes.string, - }; + const dispatch = useAppDispatch(); - handleLoadMoreAccounts = () => this.props.expandSearch('accounts'); + const handleLoadMoreAccounts = useCallback(() => { + dispatch(expandSearch('accounts')); + }, [dispatch]); - handleLoadMoreStatuses = () => this.props.expandSearch('statuses'); + const handleLoadMoreStatuses = useCallback(() => { + dispatch(expandSearch('statuses')); + }, [dispatch]); - handleLoadMoreHashtags = () => this.props.expandSearch('hashtags'); + const handleLoadMoreHashtags = useCallback(() => { + dispatch(expandSearch('hashtags')); + }, [dispatch]); - render () { - const { results } = this.props; + let accounts, statuses, hashtags; - let accounts, statuses, hashtags; - - if (results.get('accounts') && results.get('accounts').size > 0) { - accounts = ( - }> - {withoutLastResult(results.get('accounts')).map(accountId => )} - {(results.get('accounts').size > INITIAL_PAGE_LIMIT && results.get('accounts').size % INITIAL_PAGE_LIMIT === 1) && } - - ); - } - - if (results.get('hashtags') && results.get('hashtags').size > 0) { - hashtags = ( - }> - {withoutLastResult(results.get('hashtags')).map(hashtag => )} - {(results.get('hashtags').size > INITIAL_PAGE_LIMIT && results.get('hashtags').size % INITIAL_PAGE_LIMIT === 1) && } - - ); - } - - if (results.get('statuses') && results.get('statuses').size > 0) { - statuses = ( - }> - {withoutLastResult(results.get('statuses')).map(statusId => )} - {(results.get('statuses').size > INITIAL_PAGE_LIMIT && results.get('statuses').size % INITIAL_PAGE_LIMIT === 1) && } - - ); - } - - - return ( -
- {accounts} - {hashtags} - {statuses} -
+ if (results.get('accounts') && results.get('accounts').size > 0) { + accounts = ( + }> + {withoutLastResult(results.get('accounts')).map(accountId => )} + {(results.get('accounts').size > INITIAL_PAGE_LIMIT && results.get('accounts').size % INITIAL_PAGE_LIMIT === 1) && } + ); } -} + if (results.get('hashtags') && results.get('hashtags').size > 0) { + hashtags = ( + }> + {withoutLastResult(results.get('hashtags')).map(hashtag => )} + {(results.get('hashtags').size > INITIAL_PAGE_LIMIT && results.get('hashtags').size % INITIAL_PAGE_LIMIT === 1) && } + + ); + } -export default SearchResults; + if (results.get('statuses') && results.get('statuses').size > 0) { + statuses = ( + }> + {withoutLastResult(results.get('statuses')).map(statusId => )} + {(results.get('statuses').size > INITIAL_PAGE_LIMIT && results.get('statuses').size % INITIAL_PAGE_LIMIT === 1) && } + + ); + } + + return ( +
+ {!accounts && !hashtags && !statuses && ( + isLoading ? ( + + ) : ( +
+ +
+ ) + )} + {accounts} + {hashtags} + {statuses} +
+ ); + +}; diff --git a/app/javascript/mastodon/features/compose/containers/search_results_container.js b/app/javascript/mastodon/features/compose/containers/search_results_container.js deleted file mode 100644 index 54c2af317..000000000 --- a/app/javascript/mastodon/features/compose/containers/search_results_container.js +++ /dev/null @@ -1,20 +0,0 @@ -import { connect } from 'react-redux'; - -import { expandSearch } from 'mastodon/actions/search'; -import { fetchSuggestions, dismissSuggestion } from 'mastodon/actions/suggestions'; - -import SearchResults from '../components/search_results'; - -const mapStateToProps = state => ({ - results: state.getIn(['search', 'results']), - suggestions: state.getIn(['suggestions', 'items']), - searchTerm: state.getIn(['search', 'searchTerm']), -}); - -const mapDispatchToProps = dispatch => ({ - fetchSuggestions: () => dispatch(fetchSuggestions()), - expandSearch: type => dispatch(expandSearch(type)), - dismissSuggestion: account => dispatch(dismissSuggestion(account.get('id'))), -}); - -export default connect(mapStateToProps, mapDispatchToProps)(SearchResults); diff --git a/app/javascript/mastodon/features/compose/index.jsx b/app/javascript/mastodon/features/compose/index.jsx index ce8eb9e05..83c741fd1 100644 --- a/app/javascript/mastodon/features/compose/index.jsx +++ b/app/javascript/mastodon/features/compose/index.jsx @@ -29,9 +29,9 @@ import { mascot } from '../../initial_state'; import { isMobile } from '../../is_mobile'; import Motion from '../ui/util/optional_motion'; +import { SearchResults } from './components/search_results'; import ComposeFormContainer from './containers/compose_form_container'; import SearchContainer from './containers/search_container'; -import SearchResultsContainer from './containers/search_results_container'; const messages = defineMessages({ start: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, @@ -138,7 +138,7 @@ class Compose extends PureComponent { {({ x }) => (
- +
)}
diff --git a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts index ffca1f8b0..806a3f892 100644 --- a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts +++ b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts @@ -29,7 +29,10 @@ const emojis: Emojis = {}; // decompress Object.keys(shortCodesToEmojiData).forEach((shortCode) => { - const [_filenameData, searchData] = shortCodesToEmojiData[shortCode]; + const emojiData = shortCodesToEmojiData[shortCode]; + if (!emojiData) return; + + const [_filenameData, searchData] = emojiData; const [native, short_names, search, unified] = searchData; emojis[shortCode] = { diff --git a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts index 191419496..d116c6c62 100644 --- a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts +++ b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts @@ -46,7 +46,10 @@ function processEmojiMapData( Object.keys(shortCodesToEmojiData).forEach( (shortCode: ShortCodesToEmojiDataKey) => { if (shortCode === undefined) return; - const [filenameData, _searchData] = shortCodesToEmojiData[shortCode]; + + const emojiData = shortCodesToEmojiData[shortCode]; + if (!emojiData) return; + const [filenameData, _searchData] = emojiData; filenameData.forEach((emojiMapData) => { processEmojiMapData(emojiMapData, shortCode); }); diff --git a/app/javascript/mastodon/features/explore/index.jsx b/app/javascript/mastodon/features/explore/index.jsx index d77aec701..83e5df22f 100644 --- a/app/javascript/mastodon/features/explore/index.jsx +++ b/app/javascript/mastodon/features/explore/index.jsx @@ -13,6 +13,7 @@ import SearchIcon from '@/material-icons/400-24px/search.svg?react'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import Search from 'mastodon/features/compose/containers/search_container'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { trendsEnabled } from 'mastodon/initial_state'; import Links from './links'; @@ -32,12 +33,8 @@ const mapStateToProps = state => ({ }); class Explore extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, intl: PropTypes.object.isRequired, multiColumn: PropTypes.bool, isSearching: PropTypes.bool, @@ -53,7 +50,7 @@ class Explore extends PureComponent { render() { const { intl, multiColumn, isSearching } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; return ( @@ -114,4 +111,4 @@ class Explore extends PureComponent { } -export default connect(mapStateToProps)(injectIntl(Explore)); +export default withIdentity(connect(mapStateToProps)(injectIntl(Explore))); diff --git a/app/javascript/mastodon/features/firehose/index.jsx b/app/javascript/mastodon/features/firehose/index.jsx index c65fe48ea..f65bee45e 100644 --- a/app/javascript/mastodon/features/firehose/index.jsx +++ b/app/javascript/mastodon/features/firehose/index.jsx @@ -6,13 +6,14 @@ import { useIntl, defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; import { NavLink } from 'react-router-dom'; +import { useIdentity } from '@/mastodon/identity_context'; import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import { addColumn } from 'mastodon/actions/columns'; 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 initialState, { domain } from 'mastodon/initial_state'; +import { domain } from 'mastodon/initial_state'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; import Column from '../../components/column'; @@ -24,15 +25,6 @@ const messages = defineMessages({ title: { id: 'column.firehose', defaultMessage: 'Live feeds' }, }); -// TODO: use a proper React context later on -const useIdentity = () => ({ - signedIn: !!initialState.meta.me, - accountId: initialState.meta.me, - disabledAccountId: initialState.meta.disabled_account_id, - accessToken: initialState.meta.access_token, - permissions: initialState.role ? initialState.role.permissions : 0, -}); - const ColumnSettings = () => { const dispatch = useAppDispatch(); const settings = useAppSelector((state) => state.getIn(['settings', 'firehose'])); diff --git a/app/javascript/mastodon/features/getting_started/index.jsx b/app/javascript/mastodon/features/getting_started/index.jsx index db6e0f6ec..628bbe62b 100644 --- a/app/javascript/mastodon/features/getting_started/index.jsx +++ b/app/javascript/mastodon/features/getting_started/index.jsx @@ -24,6 +24,7 @@ import { fetchFollowRequests } from 'mastodon/actions/accounts'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import LinkFooter from 'mastodon/features/ui/components/link_footer'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { me, showTrends } from '../../initial_state'; import { NavigationBar } from '../compose/components/navigation_bar'; @@ -75,12 +76,8 @@ const badgeDisplay = (number, limit) => { }; class GettingStarted extends ImmutablePureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, intl: PropTypes.object.isRequired, myAccount: ImmutablePropTypes.record, multiColumn: PropTypes.bool, @@ -91,7 +88,7 @@ class GettingStarted extends ImmutablePureComponent { componentDidMount () { const { fetchFollowRequests } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (!signedIn) { return; @@ -102,7 +99,7 @@ class GettingStarted extends ImmutablePureComponent { render () { const { intl, myAccount, multiColumn, unreadFollowRequests } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; const navItems = []; @@ -167,4 +164,4 @@ class GettingStarted extends ImmutablePureComponent { } -export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(GettingStarted)); +export default withIdentity(connect(mapStateToProps, mapDispatchToProps)(injectIntl(GettingStarted))); diff --git a/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js b/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js index be95004cc..680b44519 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js +++ b/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js @@ -15,7 +15,7 @@ const mapStateToProps = (state, { columnId }) => { return { settings: columns.get(index).get('params'), onLoad (value) { - return api(() => state).get('/api/v2/search', { params: { q: value, type: 'hashtags' } }).then(response => { + return api().get('/api/v2/search', { params: { q: value, type: 'hashtags' } }).then(response => { return (response.data.hashtags || []).map((tag) => { return { value: tag.name, label: `#${tag.name}` }; }); diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.jsx b/app/javascript/mastodon/features/hashtag_timeline/index.jsx index f431a7e9b..42a668859 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/index.jsx +++ b/app/javascript/mastodon/features/hashtag_timeline/index.jsx @@ -17,6 +17,7 @@ import { fetchHashtag, followHashtag, unfollowHashtag } from 'mastodon/actions/t import { expandHashtagTimeline, clearTimeline } from 'mastodon/actions/timelines'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import StatusListContainer from '../ui/containers/status_list_container'; @@ -29,14 +30,10 @@ const mapStateToProps = (state, props) => ({ }); class HashtagTimeline extends PureComponent { - disconnects = []; - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, params: PropTypes.object.isRequired, columnId: PropTypes.string, dispatch: PropTypes.func.isRequired, @@ -94,7 +91,7 @@ class HashtagTimeline extends PureComponent { }; _subscribe (dispatch, id, tags = {}, local) { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (!signedIn) { return; @@ -168,7 +165,7 @@ class HashtagTimeline extends PureComponent { handleFollow = () => { const { dispatch, params, tag } = this.props; const { id } = params; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (!signedIn) { return; @@ -185,7 +182,7 @@ class HashtagTimeline extends PureComponent { const { hasUnread, columnId, multiColumn, tag } = this.props; const { id, local } = this.props.params; const pinned = !!columnId; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; return ( @@ -225,4 +222,4 @@ class HashtagTimeline extends PureComponent { } -export default connect(mapStateToProps)(HashtagTimeline); +export default connect(mapStateToProps)(withIdentity(HashtagTimeline)); diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx index 6e7dc2b6c..00b5835a1 100644 --- a/app/javascript/mastodon/features/home_timeline/index.jsx +++ b/app/javascript/mastodon/features/home_timeline/index.jsx @@ -14,6 +14,7 @@ import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/an 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 { addColumn, removeColumn, moveColumn } from '../../actions/columns'; @@ -40,12 +41,8 @@ const mapStateToProps = state => ({ }); class HomeTimeline extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, dispatch: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, @@ -126,7 +123,7 @@ class HomeTimeline extends PureComponent { render () { const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; const pinned = !!columnId; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; const banners = []; let announcementsButton; @@ -190,4 +187,4 @@ class HomeTimeline extends PureComponent { } -export default connect(mapStateToProps)(injectIntl(HomeTimeline)); +export default connect(mapStateToProps)(withIdentity(injectIntl(HomeTimeline))); diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.jsx b/app/javascript/mastodon/features/notifications/components/column_settings.jsx index fc737c0fe..e375b856c 100644 --- a/app/javascript/mastodon/features/notifications/components/column_settings.jsx +++ b/app/javascript/mastodon/features/notifications/components/column_settings.jsx @@ -5,6 +5,7 @@ import { FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions'; import { CheckboxWithLabel } from './checkbox_with_label'; @@ -12,13 +13,9 @@ import ClearColumnButton from './clear_column_button'; import GrantPermissionButton from './grant_permission_button'; import SettingToggle from './setting_toggle'; -export default class ColumnSettings extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - +class ColumnSettings extends PureComponent { static propTypes = { + identity: identityContextPropShape, settings: ImmutablePropTypes.map.isRequired, pushSettings: ImmutablePropTypes.map.isRequired, onChange: PropTypes.func.isRequired, @@ -215,7 +212,7 @@ export default class ColumnSettings extends PureComponent {
- {((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) && ( + {((this.props.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) && (

@@ -228,7 +225,7 @@ export default class ColumnSettings extends PureComponent {
)} - {((this.context.identity.permissions & PERMISSION_MANAGE_REPORTS) === PERMISSION_MANAGE_REPORTS) && ( + {((this.props.identity.permissions & PERMISSION_MANAGE_REPORTS) === PERMISSION_MANAGE_REPORTS) && (

@@ -245,3 +242,5 @@ export default class ColumnSettings extends PureComponent { } } + +export default withIdentity(ColumnSettings); diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index caf7f9bdc..69084c211 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -41,7 +41,7 @@ const messages = defineMessages({ adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' }, adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' }, relationshipsSevered: { id: 'notification.relationships_severance_event', defaultMessage: 'Lost connections with {name}' }, - moderationWarning: { id: 'notification.moderation_warning', defaultMessage: 'Your have received a moderation warning' }, + moderationWarning: { id: 'notification.moderation_warning', defaultMessage: 'You have received a moderation warning' }, }); const notificationForScreenReader = (intl, message, timestamp) => { diff --git a/app/javascript/mastodon/features/notifications/containers/notification_container.js b/app/javascript/mastodon/features/notifications/containers/notification_container.js index de450cd1a..650acf4cc 100644 --- a/app/javascript/mastodon/features/notifications/containers/notification_container.js +++ b/app/javascript/mastodon/features/notifications/containers/notification_container.js @@ -39,12 +39,12 @@ const mapDispatchToProps = dispatch => ({ }, onModalReblog (status, privacy) { - dispatch(reblog(status, privacy)); + dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); }, onReblog (status, e) { if (status.get('reblogged')) { - dispatch(unreblog(status)); + dispatch(unreblog({ statusId: status.get('id') })); } else { if (e.shiftKey || !boostModal) { this.onModalReblog(status); diff --git a/app/javascript/mastodon/features/notifications/index.jsx b/app/javascript/mastodon/features/notifications/index.jsx index e062957ff..d45f51715 100644 --- a/app/javascript/mastodon/features/notifications/index.jsx +++ b/app/javascript/mastodon/features/notifications/index.jsx @@ -17,6 +17,7 @@ import NotificationsIcon from '@/material-icons/400-24px/notifications-fill.svg? import { compareId } from 'mastodon/compare_id'; import { Icon } from 'mastodon/components/icon'; import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { submitMarkers } from '../../actions/markers'; @@ -77,12 +78,8 @@ const mapStateToProps = state => ({ }); class Notifications extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, columnId: PropTypes.string, notifications: ImmutablePropTypes.list.isRequired, dispatch: PropTypes.func.isRequired, @@ -190,7 +187,7 @@ class Notifications extends PureComponent { const { intl, notifications, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, lastReadId, canMarkAsRead, needsNotificationPermission } = this.props; const pinned = !!columnId; const emptyMessage = ; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; let scrollableContent = null; @@ -299,4 +296,4 @@ class Notifications extends PureComponent { } -export default connect(mapStateToProps)(injectIntl(Notifications)); +export default connect(mapStateToProps)(withIdentity(injectIntl(Notifications))); diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx index 7a163a882..ba0642da2 100644 --- a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx +++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx @@ -18,6 +18,7 @@ import { replyCompose } from 'mastodon/actions/compose'; import { reblog, favourite, unreblog, unfavourite } from 'mastodon/actions/interactions'; import { openModal } from 'mastodon/actions/modal'; import { IconButton } from 'mastodon/components/icon_button'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { me, boostModal } from 'mastodon/initial_state'; import { makeGetStatus } from 'mastodon/selectors'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -47,12 +48,8 @@ const makeMapStateToProps = () => { }; class Footer extends ImmutablePureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, statusId: PropTypes.string.isRequired, status: ImmutablePropTypes.map.isRequired, intl: PropTypes.object.isRequired, @@ -75,7 +72,7 @@ class Footer extends ImmutablePureComponent { handleReplyClick = () => { const { dispatch, askReplyConfirmation, status, intl } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { if (askReplyConfirmation) { @@ -104,7 +101,7 @@ class Footer extends ImmutablePureComponent { handleFavouriteClick = () => { const { dispatch, status } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { if (status.get('favourited')) { @@ -126,16 +123,16 @@ class Footer extends ImmutablePureComponent { _performReblog = (status, privacy) => { const { dispatch } = this.props; - dispatch(reblog(status, privacy)); + dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); }; handleReblogClick = e => { const { dispatch, status } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { if (status.get('reblogged')) { - dispatch(unreblog(status)); + dispatch(unreblog({ statusId: status.get('id') })); } else if ((e && e.shiftKey) || !boostModal) { this._performReblog(status); } else { @@ -209,4 +206,4 @@ class Footer extends ImmutablePureComponent { } -export default connect(makeMapStateToProps)(withRouter(injectIntl(Footer))); +export default connect(makeMapStateToProps)(withIdentity(withRouter(injectIntl(Footer)))); diff --git a/app/javascript/mastodon/features/public_timeline/index.jsx b/app/javascript/mastodon/features/public_timeline/index.jsx index 3601dfeae..91351901f 100644 --- a/app/javascript/mastodon/features/public_timeline/index.jsx +++ b/app/javascript/mastodon/features/public_timeline/index.jsx @@ -9,6 +9,7 @@ import { connect } from 'react-redux'; import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { domain } from 'mastodon/initial_state'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; @@ -40,16 +41,12 @@ const mapStateToProps = (state, { columnId }) => { }; class PublicTimeline extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static defaultProps = { onlyMedia: false, }; static propTypes = { + identity: identityContextPropShape, dispatch: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, columnId: PropTypes.string, @@ -80,7 +77,7 @@ class PublicTimeline extends PureComponent { componentDidMount () { const { dispatch, onlyMedia, onlyRemote } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; dispatch(expandPublicTimeline({ onlyMedia, onlyRemote })); @@ -90,7 +87,7 @@ class PublicTimeline extends PureComponent { } componentDidUpdate (prevProps) { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (prevProps.onlyMedia !== this.props.onlyMedia || prevProps.onlyRemote !== this.props.onlyRemote) { const { dispatch, onlyMedia, onlyRemote } = this.props; @@ -164,4 +161,4 @@ class PublicTimeline extends PureComponent { } -export default connect(mapStateToProps)(injectIntl(PublicTimeline)); +export default connect(mapStateToProps)(withIdentity(injectIntl(PublicTimeline))); diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx index 69209e8bd..d61053998 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.jsx +++ b/app/javascript/mastodon/features/status/components/action_bar.jsx @@ -21,6 +21,7 @@ import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react'; import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react'; import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react'; import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -67,12 +68,8 @@ const mapStateToProps = (state, { status }) => ({ }); class ActionBar extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, status: ImmutablePropTypes.map.isRequired, relationship: ImmutablePropTypes.record, onReply: PropTypes.func.isRequired, @@ -198,7 +195,7 @@ class ActionBar extends PureComponent { render () { const { status, relationship, intl } = this.props; - const { signedIn, permissions } = this.context.identity; + const { signedIn, permissions } = this.props.identity; const publicStatus = ['public', 'unlisted'].includes(status.get('visibility')); const pinnableStatus = ['public', 'unlisted', 'private'].includes(status.get('visibility')); @@ -326,4 +323,4 @@ class ActionBar extends PureComponent { } -export default withRouter(connect(mapStateToProps)(injectIntl(ActionBar))); +export default withRouter(connect(mapStateToProps)(withIdentity(injectIntl(ActionBar)))); diff --git a/app/javascript/mastodon/features/status/components/card.jsx b/app/javascript/mastodon/features/status/components/card.jsx index f47861f66..c2f5703b3 100644 --- a/app/javascript/mastodon/features/status/components/card.jsx +++ b/app/javascript/mastodon/features/status/components/card.jsx @@ -6,6 +6,8 @@ import { PureComponent } from 'react'; import { FormattedMessage } from 'react-intl'; import classNames from 'classnames'; +import { Link } from 'react-router-dom'; + import Immutable from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; @@ -13,6 +15,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import DescriptionIcon from '@/material-icons/400-24px/description-fill.svg?react'; import OpenInNewIcon from '@/material-icons/400-24px/open_in_new.svg?react'; import PlayArrowIcon from '@/material-icons/400-24px/play_arrow-fill.svg?react'; +import { Avatar } from 'mastodon/components/avatar'; import { Blurhash } from 'mastodon/components/blurhash'; import { Icon } from 'mastodon/components/icon'; import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; @@ -56,6 +59,20 @@ const addAutoPlay = html => { return html; }; +const MoreFromAuthor = ({ author }) => ( +
+ + + + + {author.get('display_name')} }} /> +
+); + +MoreFromAuthor.propTypes = { + author: ImmutablePropTypes.map, +}; + export default class Card extends PureComponent { static propTypes = { @@ -136,6 +153,7 @@ export default class Card extends PureComponent { const interactive = card.get('type') === 'video'; const language = card.get('language') || ''; const largeImage = (card.get('image')?.length > 0 && card.get('width') > card.get('height')) || interactive; + const showAuthor = !!card.get('author_account'); const description = (
@@ -146,7 +164,7 @@ export default class Card extends PureComponent { {card.get('title')} - {card.get('author_name').length > 0 ? {card.get('author_name')} }} /> : {card.get('description')}} + {!showAuthor && (card.get('author_name').length > 0 ? {card.get('author_name')} }} /> : {card.get('description')})}
); @@ -235,10 +253,14 @@ export default class Card extends PureComponent { } return ( - - {embed} - {description} - + <> + + {embed} + {description} + + + {showAuthor && } + ); } diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js index 1c650f544..c3d4fec4d 100644 --- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js +++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js @@ -74,12 +74,12 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onModalReblog (status, privacy) { - dispatch(reblog(status, privacy)); + dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); }, onReblog (status, e) { if (status.get('reblogged')) { - dispatch(unreblog(status)); + dispatch(unreblog({ statusId: status.get('id') })); } else { if (e.shiftKey || !boostModal) { this.onModalReblog(status); diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index 391475972..7f37cb50d 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -20,6 +20,7 @@ import { Icon } from 'mastodon/components/icon'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import ScrollContainer from 'mastodon/containers/scroll_container'; import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import { @@ -189,12 +190,8 @@ const titleFromStatus = (intl, status) => { }; class Status extends ImmutablePureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, status: ImmutablePropTypes.map, @@ -244,7 +241,7 @@ class Status extends ImmutablePureComponent { handleFavouriteClick = (status) => { const { dispatch } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { if (status.get('favourited')) { @@ -274,7 +271,7 @@ class Status extends ImmutablePureComponent { handleReplyClick = (status) => { const { askReplyConfirmation, dispatch, intl } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { if (askReplyConfirmation) { @@ -302,16 +299,16 @@ class Status extends ImmutablePureComponent { }; handleModalReblog = (status, privacy) => { - this.props.dispatch(reblog(status, privacy)); + this.props.dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); }; handleReblogClick = (status, e) => { const { dispatch } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; if (signedIn) { if (status.get('reblogged')) { - dispatch(unreblog(status)); + dispatch(unreblog({ statusId: status.get('id') })); } else { if ((e && e.shiftKey) || !boostModal) { this.handleModalReblog(status); @@ -745,4 +742,4 @@ class Status extends ImmutablePureComponent { } -export default withRouter(injectIntl(connect(makeMapStateToProps)(Status))); +export default withRouter(injectIntl(connect(makeMapStateToProps)(withIdentity(Status)))); diff --git a/app/javascript/mastodon/features/ui/components/compose_panel.jsx b/app/javascript/mastodon/features/ui/components/compose_panel.jsx index e6ac79bdd..18321cbe6 100644 --- a/app/javascript/mastodon/features/ui/components/compose_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/compose_panel.jsx @@ -7,16 +7,13 @@ import { changeComposing, mountCompose, unmountCompose } from 'mastodon/actions/ import ServerBanner from 'mastodon/components/server_banner'; import ComposeFormContainer from 'mastodon/features/compose/containers/compose_form_container'; import SearchContainer from 'mastodon/features/compose/containers/search_container'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import LinkFooter from './link_footer'; class ComposePanel extends PureComponent { - - static contextTypes = { - identity: PropTypes.object.isRequired, - }; - static propTypes = { + identity: identityContextPropShape, dispatch: PropTypes.func.isRequired, }; @@ -41,7 +38,7 @@ class ComposePanel extends PureComponent { } render() { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; return (
@@ -65,4 +62,4 @@ class ComposePanel extends PureComponent { } -export default connect()(ComposePanel); +export default connect()(withIdentity(ComposePanel)); diff --git a/app/javascript/mastodon/features/ui/components/header.jsx b/app/javascript/mastodon/features/ui/components/header.jsx index 2f8636b12..19c76c722 100644 --- a/app/javascript/mastodon/features/ui/components/header.jsx +++ b/app/javascript/mastodon/features/ui/components/header.jsx @@ -13,6 +13,7 @@ import { fetchServer } from 'mastodon/actions/server'; import { Avatar } from 'mastodon/components/avatar'; import { Icon } from 'mastodon/components/icon'; import { WordmarkLogo, SymbolLogo } from 'mastodon/components/logo'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { registrationsOpen, me, sso_redirect } from 'mastodon/initial_state'; const Account = connect(state => ({ @@ -41,12 +42,8 @@ const mapDispatchToProps = (dispatch) => ({ }); class Header extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, openClosedRegistrationsModal: PropTypes.func, location: PropTypes.object, signupUrl: PropTypes.string.isRequired, @@ -60,7 +57,7 @@ class Header extends PureComponent { } render () { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; const { location, openClosedRegistrationsModal, signupUrl, intl } = this.props; let content; @@ -121,4 +118,4 @@ class Header extends PureComponent { } -export default injectIntl(withRouter(connect(mapStateToProps, mapDispatchToProps)(Header))); +export default injectIntl(withRouter(withIdentity(connect(mapStateToProps, mapDispatchToProps)(Header)))); diff --git a/app/javascript/mastodon/features/ui/components/link_footer.jsx b/app/javascript/mastodon/features/ui/components/link_footer.jsx index 91debb9d4..de2b54b09 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.jsx +++ b/app/javascript/mastodon/features/ui/components/link_footer.jsx @@ -8,6 +8,7 @@ import { Link } from 'react-router-dom'; import { connect } from 'react-redux'; import { openModal } from 'mastodon/actions/modal'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'mastodon/initial_state'; import { PERMISSION_INVITE_USERS } from 'mastodon/permissions'; import { logOut } from 'mastodon/utils/log_out'; @@ -32,12 +33,8 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }); class LinkFooter extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, multiColumn: PropTypes.bool, onLogout: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, @@ -53,7 +50,7 @@ class LinkFooter extends PureComponent { }; render () { - const { signedIn, permissions } = this.context.identity; + const { signedIn, permissions } = this.props.identity; const { multiColumn } = this.props; const canInvite = signedIn && ((permissions & PERMISSION_INVITE_USERS) === PERMISSION_INVITE_USERS); @@ -113,4 +110,4 @@ class LinkFooter extends PureComponent { } -export default injectIntl(connect(null, mapDispatchToProps)(LinkFooter)); +export default injectIntl(withIdentity(connect(null, mapDispatchToProps)(LinkFooter))); diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index d52dbee13..3689913c6 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -32,6 +32,7 @@ import { fetchFollowRequests } from 'mastodon/actions/accounts'; import { IconWithBadge } from 'mastodon/components/icon_with_badge'; import { WordmarkLogo } from 'mastodon/components/logo'; import { NavigationPortal } from 'mastodon/components/navigation_portal'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { timelinePreview, trendsEnabled } from 'mastodon/initial_state'; import { transientSingleColumn } from 'mastodon/is_mobile'; @@ -99,12 +100,8 @@ const FollowRequestsLink = () => { }; class NavigationPanel extends Component { - - static contextTypes = { - identity: PropTypes.object.isRequired, - }; - static propTypes = { + identity: identityContextPropShape, intl: PropTypes.object.isRequired, }; @@ -114,7 +111,7 @@ class NavigationPanel extends Component { render () { const { intl } = this.props; - const { signedIn, disabledAccountId } = this.context.identity; + const { signedIn, disabledAccountId } = this.props.identity; let banner = undefined; @@ -194,4 +191,4 @@ class NavigationPanel extends Component { } -export default injectIntl(NavigationPanel); +export default injectIntl(withIdentity(NavigationPanel)); diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index c84a2c51a..7742f6486 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -15,6 +15,7 @@ import { focusApp, unfocusApp, changeLayout } from 'mastodon/actions/app'; import { synchronouslySubmitMarkers, submitMarkers, fetchMarkers } from 'mastodon/actions/markers'; import { INTRODUCTION_VERSION } from 'mastodon/actions/onboarding'; import { PictureInPicture } from 'mastodon/features/picture_in_picture'; +import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { layoutFromWindow } from 'mastodon/is_mobile'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -120,12 +121,8 @@ const keyMap = { }; class SwitchingColumnsArea extends PureComponent { - - static contextTypes = { - identity: PropTypes.object, - }; - static propTypes = { + identity: identityContextPropShape, children: PropTypes.node, location: PropTypes.object, singleColumn: PropTypes.bool, @@ -160,7 +157,7 @@ class SwitchingColumnsArea extends PureComponent { render () { const { children, singleColumn } = this.props; - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; const pathName = this.props.location.pathname; let redirect; @@ -252,12 +249,8 @@ class SwitchingColumnsArea extends PureComponent { } class UI extends PureComponent { - - static contextTypes = { - identity: PropTypes.object.isRequired, - }; - static propTypes = { + identity: identityContextPropShape, dispatch: PropTypes.func.isRequired, children: PropTypes.node, isComposing: PropTypes.bool, @@ -309,7 +302,7 @@ class UI extends PureComponent { this.dragTargets.push(e.target); } - if (e.dataTransfer && Array.from(e.dataTransfer.types).includes('Files') && this.props.canUploadMore && this.context.identity.signedIn) { + if (e.dataTransfer && Array.from(e.dataTransfer.types).includes('Files') && this.props.canUploadMore && this.props.identity.signedIn) { this.setState({ draggingOver: true }); } }; @@ -337,7 +330,7 @@ class UI extends PureComponent { this.setState({ draggingOver: false }); this.dragTargets = []; - if (e.dataTransfer && e.dataTransfer.files.length >= 1 && this.props.canUploadMore && this.context.identity.signedIn) { + if (e.dataTransfer && e.dataTransfer.files.length >= 1 && this.props.canUploadMore && this.props.identity.signedIn) { this.props.dispatch(uploadCompose(e.dataTransfer.files)); } }; @@ -389,7 +382,7 @@ class UI extends PureComponent { }; componentDidMount () { - const { signedIn } = this.context.identity; + const { signedIn } = this.props.identity; window.addEventListener('focus', this.handleWindowFocus, false); window.addEventListener('blur', this.handleWindowBlur, false); @@ -586,7 +579,7 @@ class UI extends PureComponent {
- + {children} @@ -602,4 +595,4 @@ class UI extends PureComponent { } -export default connect(mapStateToProps)(injectIntl(withRouter(UI))); +export default connect(mapStateToProps)(injectIntl(withRouter(withIdentity(UI)))); diff --git a/app/javascript/mastodon/identity_context.tsx b/app/javascript/mastodon/identity_context.tsx new file mode 100644 index 000000000..7f28ab77a --- /dev/null +++ b/app/javascript/mastodon/identity_context.tsx @@ -0,0 +1,70 @@ +import PropTypes from 'prop-types'; +import { createContext, useContext } from 'react'; + +import hoistStatics from 'hoist-non-react-statics'; + +import type { InitialState } from 'mastodon/initial_state'; + +export interface IdentityContextType { + signedIn: boolean; + accountId: string | undefined; + disabledAccountId: string | undefined; + permissions: number; +} + +export const identityContextPropShape = PropTypes.shape({ + signedIn: PropTypes.bool.isRequired, + accountId: PropTypes.string, + disabledAccountId: PropTypes.string, +}).isRequired; + +export const createIdentityContext = (state: InitialState) => ({ + signedIn: !!state.meta.me, + accountId: state.meta.me, + disabledAccountId: state.meta.disabled_account_id, + permissions: state.role?.permissions ?? 0, +}); + +export const IdentityContext = createContext({ + signedIn: false, + permissions: 0, + accountId: undefined, + disabledAccountId: undefined, +}); + +export const useIdentity = () => useContext(IdentityContext); + +export interface IdentityProps { + ref?: unknown; + wrappedComponentRef?: unknown; +} + +/* Injects an `identity` props into the wrapped component to be able to use the new context in class components */ +export function withIdentity< + ComponentType extends React.ComponentType, +>(Component: ComponentType) { + const displayName = `withIdentity(${Component.displayName ?? Component.name})`; + const C = (props: React.ComponentProps) => { + const { wrappedComponentRef, ...remainingProps } = props; + + return ( + + {(context) => { + return ( + // @ts-expect-error - Dynamic covariant generic components are tough to type. + + ); + }} + + ); + }; + + C.displayName = displayName; + C.WrappedComponent = Component; + + return hoistStatics(C, Component); +} diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index d8c57a2a0..9ec3df0df 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -44,12 +44,22 @@ * @property {string} sso_redirect */ +/** + * @typedef Role + * @property {string} id + * @property {string} name + * @property {string} permissions + * @property {string} color + * @property {boolean} highlighted + */ + /** * @typedef InitialState * @property {Record} accounts * @property {InitialStateLanguage[]} languages * @property {boolean=} critical_updates_pending * @property {InitialStateMeta} meta + * @property {Role?} role */ const element = document.getElementById('initial-state'); @@ -107,4 +117,11 @@ export const criticalUpdatesPending = initialState?.critical_updates_pending; export const statusPageUrl = getMeta('status_page_url'); export const sso_redirect = getMeta('sso_redirect'); +/** + * @returns {string | undefined} + */ +export function getAccessToken() { + return getMeta('access_token'); +} + export default initialState; diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index dd13f10aa..68e32dd2a 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -5,7 +5,7 @@ "about.domain_blocks.no_reason_available": "السبب غير متوفر", "about.domain_blocks.preamble": "يسمح لك ماستدون عموماً بعرض المحتوى من المستخدمين من أي خادم آخر في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادم بالذات.", "about.domain_blocks.silenced.explanation": "عموماً، لن ترى ملفات التعريف والمحتوى من هذا الخادم، إلا إذا كنت تبحث عنه بشكل صريح أو تختار أن تتابعه.", - "about.domain_blocks.silenced.title": "تم كتمه", + "about.domain_blocks.silenced.title": "محدود", "about.domain_blocks.suspended.explanation": "لن يتم معالجة أي بيانات من هذا الخادم أو تخزينها أو تبادلها، مما يجعل أي تفاعل أو اتصال مع المستخدمين من هذا الخادم مستحيلا.", "about.domain_blocks.suspended.title": "مُعلّق", "about.not_available": "لم يتم توفير هذه المعلومات على هذا الخادم.", @@ -21,7 +21,7 @@ "account.blocked": "محظور", "account.browse_more_on_origin_server": "تصفح المزيد في الملف الشخصي الأصلي", "account.cancel_follow_request": "إلغاء طلب المتابعة", - "account.copy": "نسخ الرابط إلى الملف الشخصي", + "account.copy": "نسخ الرابط إلى الحساب", "account.direct": "إشارة خاصة لـ @{name}", "account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}", "account.domain_blocked": "اسم النِّطاق محظور", @@ -32,7 +32,7 @@ "account.featured_tags.last_status_never": "لا توجد رسائل", "account.featured_tags.title": "وسوم {name} المميَّزة", "account.follow": "متابعة", - "account.follow_back": "تابعه بدورك", + "account.follow_back": "رد المتابعة", "account.followers": "مُتابِعون", "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.", "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}", @@ -89,12 +89,12 @@ "announcement.announcement": "إعلان", "attachments_list.unprocessed": "(غير معالَج)", "audio.hide": "إخفاء المقطع الصوتي", - "block_modal.remote_users_caveat": "Do t’i kërkojmë shërbyesit {domain} të respektojë vendimin tuaj. Por, pajtimi s’është i garantuar, ngaqë disa shërbyes mund t’i trajtojnë ndryshe bllokimet. Psotimet publike mundet të jenë ende të dukshme për përdorues pa bërë hyrje në llogari.", - "block_modal.show_less": "اعرض أقلّ", + "block_modal.remote_users_caveat": "سوف نطلب من الخادم {domain} أن يحترم قرارك، لكن الالتزام غير مضمون لأن بعض الخواديم قد تتعامل مع نصوص الكتل بشكل مختلف. قد تظل المنشورات العامة مرئية للمستخدمين غير المسجلين الدخول.", + "block_modal.show_less": "أظهر الأقل", "block_modal.show_more": "أظهر المزيد", "block_modal.they_cant_mention": "لن يستطيع ذِكرك أو متابعتك.", "block_modal.they_cant_see_posts": "لن يستطيع رؤية منشوراتك ولن ترى منشوراته.", - "block_modal.they_will_know": "يمكنه أن يرى أنه قد تم حجبه.", + "block_modal.they_will_know": "يمكنه أن يرى أنه قد تم حظره.", "block_modal.title": "أتريد حظر المستخدم؟", "block_modal.you_wont_see_mentions": "لن تر المنشورات التي يُشار فيهم إليه.", "boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة", @@ -220,7 +220,7 @@ "domain_pill.activitypub_lets_connect": "يتيح لك التواصل والتفاعل مع الناس ليس فقط على ماستدون، ولكن عبر تطبيقات اجتماعية مختلفة أيضا.", "domain_pill.activitypub_like_language": "إنّ ActivityPub مثل لغة ماستدون التي يتحدث بها مع شبكات اجتماعية أخرى.", "domain_pill.server": "الخادِم", - "domain_pill.their_handle": "مُعرِّفُه:", + "domain_pill.their_handle": "مُعرفه:", "domain_pill.their_server": "بيتهم الرقمي، حيث تُستضاف كافة منشوراتهم.", "domain_pill.their_username": "مُعرّفُهم الفريد على الخادم. من الممكن العثور على مستخدمين بنفس اسم المستخدم على خوادم مختلفة.", "domain_pill.username": "اسم المستخدم", @@ -308,6 +308,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "هذا الملف الشخصي مشابه للملفات الشخصية التي تابعتها مؤخرا.", "follow_suggestions.personalized_suggestion": "توصية مخصصة", "follow_suggestions.popular_suggestion": "توصية رائجة", + "follow_suggestions.popular_suggestion_longer": "رائج على {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "مشابهة لمواصفات الملفات الشخصية التي تابعتَها حديثًا", "follow_suggestions.view_all": "عرض الكل", "follow_suggestions.who_to_follow": "حسابات للمُتابَعة", "followed_tags": "الوسوم المتابَعة", @@ -360,8 +362,8 @@ "interaction_modal.title.reply": "الرد على منشور {name}", "intervals.full.days": "{number, plural, one {# يوم} other {# أيام}}", "intervals.full.hours": "{number, plural, one {# ساعة} other {# ساعات}}", - "intervals.full.minutes": "{number, plural, one {# دقيقة} other {# دقائق}}", - "keyboard_shortcuts.back": "للعودة", + "intervals.full.minutes": "{number, plural, one {دقيقة واحدة}two {دقيقتان} other {# دقائق}}", + "keyboard_shortcuts.back": "للرجوع", "keyboard_shortcuts.blocked": "لفتح قائمة المستخدمين المحظورين", "keyboard_shortcuts.boost": "لإعادة النشر", "keyboard_shortcuts.column": "للتركيز على منشور على أحد الأعمدة", @@ -421,7 +423,9 @@ "loading_indicator.label": "جاري التحميل…", "media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}", "moved_to_account_banner.text": "حسابك {disabledAccount} معطل حاليًا لأنك انتقلت إلى {movedToAccount}.", + "mute_modal.hide_from_notifications": "إخفاء من قائمة الإشعارات", "mute_modal.hide_options": "إخفاء الخيارات", + "mute_modal.indefinite": "إلى أن أفسخ كتمها", "mute_modal.show_options": "إظهار الخيارات", "mute_modal.they_can_mention_and_follow": "سيكون بإمكانه الإشارة إليك ومتابعتك، لكنك لن تره.", "mute_modal.they_wont_know": "لن يَعرف أنه قد تم كتمه.", @@ -460,10 +464,20 @@ "notification.follow": "يتابعك {name}", "notification.follow_request": "لقد طلب {name} متابعتك", "notification.mention": "{name} ذكرك", + "notification.moderation-warning.learn_more": "اعرف المزيد", + "notification.moderation_warning.action_disable": "تم تعطيل حسابك.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "بعض من منشوراتك تم تصنيفها على أنها حساسة.", + "notification.moderation_warning.action_none": "لقد تلقى حسابك تحذيرا بالإشراف.", + "notification.moderation_warning.action_sensitive": "سيتم وضع علامة على منشوراتك على أنها حساسة من الآن فصاعدا.", + "notification.moderation_warning.action_suspend": "لقد تم تعليق حسابك.", "notification.own_poll": "انتهى استطلاعك للرأي", "notification.poll": "لقد انتهى استطلاع رأي شاركتَ فيه", "notification.reblog": "قام {name} بمشاركة منشورك", + "notification.relationships_severance_event": "فقدت الاتصالات مع {name}", + "notification.relationships_severance_event.account_suspension": "قام مشرف من {from} بتعليق {target}، مما يعني أنك لم يعد بإمكانك تلقي التحديثات منهم أو التفاعل معهم.", + "notification.relationships_severance_event.domain_block": "قام مشرف من {from} بحظر {target}، بما في ذلك {followersCount} من متابعينك و {followingCount, plural, one {# حساب} other {# حسابات}} تتابعها.", "notification.relationships_severance_event.learn_more": "اعرف المزيد", + "notification.relationships_severance_event.user_domain_block": "لقد قمت بحظر {target}، مما أدى إلى إزالة {followersCount} من متابعينك و {followingCount, plural, one {# حساب} other {# حسابات}} تتابعها.", "notification.status": "{name} نشر للتو", "notification.update": "عدّلَ {name} منشورًا", "notification_requests.accept": "موافقة", @@ -503,10 +517,15 @@ "notifications.permission_denied": "تنبيهات سطح المكتب غير متوفرة بسبب رفض أذونات المتصفح مسبقاً", "notifications.permission_denied_alert": "لا يمكن تفعيل إشعارات سطح المكتب، لأن إذن المتصفح قد تم رفضه سابقاً", "notifications.permission_required": "إشعارات سطح المكتب غير متوفرة لأنه لم يتم منح الإذن المطلوب.", + "notifications.policy.filter_new_accounts.hint": "تم إنشاؤها منذ {days, plural, zero {}one {يوم واحد} two {يومان} few {# أيام} many {# أيام} other {# أيام}}", "notifications.policy.filter_new_accounts_title": "حسابات جديدة", + "notifications.policy.filter_not_followers_hint": "بما في ذلك الأشخاص الذين يتابعونك أقل من {days, plural, zero {}one {يوم واحد} two {يومان} few {# أيام} many {# أيام} other {# أيام}}", "notifications.policy.filter_not_followers_title": "أشخاص لا يتابعونك", "notifications.policy.filter_not_following_hint": "حتى توافق عليهم يدويا", "notifications.policy.filter_not_following_title": "أشخاص لا تتابعهم", + "notifications.policy.filter_private_mentions_hint": "تمت تصفيته إلا إذا أن يكون ردًا على ذكرك أو إذا كنت تتابع الحساب", + "notifications.policy.filter_private_mentions_title": "إشارات خاصة غير مرغوب فيها", + "notifications.policy.title": "تصفية الإشعارات من…", "notifications_permission_banner.enable": "تفعيل إشعارات سطح المكتب", "notifications_permission_banner.how_to_control": "لتلقي الإشعارات عندما لا يكون ماستدون مفتوح، قم بتفعيل إشعارات سطح المكتب، يمكنك التحكم بدقة في أنواع التفاعلات التي تولد إشعارات سطح المكتب من خلال زر الـ{icon} أعلاه بمجرد تفعيلها.", "notifications_permission_banner.title": "لا تفوت شيئاً أبداً", @@ -687,6 +706,7 @@ "status.edited_x_times": "عُدّل {count, plural, zero {} one {مرةً واحدة} two {مرّتان} few {{count} مرات} many {{count} مرة} other {{count} مرة}}", "status.embed": "إدماج", "status.favourite": "فضّل", + "status.favourites": "{count, plural, zero {}one {مفضلة واحدة} two {مفضلتان} few {# مفضلات} many {# مفضلات} other {# مفضلات}}", "status.filter": "تصفية هذه الرسالة", "status.filtered": "مُصفّى", "status.hide": "إخفاء المنشور", @@ -707,6 +727,7 @@ "status.reblog": "إعادة النشر", "status.reblog_private": "إعادة النشر إلى الجمهور الأصلي", "status.reblogged_by": "شارَكَه {name}", + "status.reblogs": "{count, plural, one {تعزيز واحد} two {تعزيزتان} few {# تعزيزات} many {# تعزيزات} other {# تعزيزات}}", "status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.", "status.redraft": "إزالة وإعادة الصياغة", "status.remove_bookmark": "احذفه مِن الفواصل المرجعية", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 2b7673312..61e96e4b5 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -469,6 +469,7 @@ "notification.follow": "{name} падпісаўся на вас", "notification.follow_request": "{name} адправіў запыт на падпіску", "notification.mention": "{name} згадаў вас", + "notification.moderation-warning.learn_more": "Даведацца больш", "notification.own_poll": "Ваша апытанне скончылася", "notification.poll": "Апытанне, дзе вы прынялі ўдзел, скончылася", "notification.reblog": "{name} пашырыў ваш допіс", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index dabefd1f4..95d60b71e 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Въпреки че акаунтът ви не е заключен, служителите на {domain} помислиха, че може да искате да преглеждате ръчно заявките за последване на тези профили.", "follow_suggestions.curated_suggestion": "Избор на персонал", "follow_suggestions.dismiss": "Без ново показване", + "follow_suggestions.featured_longer": "Ръчно избрано от отбора на {domain}", + "follow_suggestions.friends_of_friends_longer": "Популярно измежду хората, които следвате", "follow_suggestions.hints.featured": "Този профил е ръчно подбран от отбора на {domain}.", "follow_suggestions.hints.friends_of_friends": "Този профил е популярен измежду хората, които следвате.", "follow_suggestions.hints.most_followed": "Този профил е един от най-следваните при {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Този профил е подобен на профилите, които сте последвали наскоро.", "follow_suggestions.personalized_suggestion": "Персонализирано предложение", "follow_suggestions.popular_suggestion": "Популярно предложение", + "follow_suggestions.popular_suggestion_longer": "Популярно из {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Подобни на профилите, които наскоро сте последвали", "follow_suggestions.view_all": "Преглед на всички", "follow_suggestions.who_to_follow": "Кого да се следва", "followed_tags": "Последвани хаштагове", @@ -469,6 +473,15 @@ "notification.follow": "{name} ви последва", "notification.follow_request": "{name} поиска да ви последва", "notification.mention": "{name} ви спомена", + "notification.moderation-warning.learn_more": "Научете повече", + "notification.moderation_warning": "Получихте предупреждение за модериране", + "notification.moderation_warning.action_delete_statuses": "Някои от публикациите ви са премахнати.", + "notification.moderation_warning.action_disable": "Вашият акаунт е изключен.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Някои от публикациите ви са означени като деликатни.", + "notification.moderation_warning.action_none": "Акаунтът ви получи предупреждение за модериране.", + "notification.moderation_warning.action_sensitive": "Публикациите ви ще се означават като деликатни от сега нататък.", + "notification.moderation_warning.action_silence": "Вашият акаунт е ограничен.", + "notification.moderation_warning.action_suspend": "Вашият акаунт е спрян.", "notification.own_poll": "Анкетата ви приключи", "notification.poll": "Анкета, в която гласувахте, приключи", "notification.reblog": "{name} подсили ваша публикация", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index f51121bcd..9ec26c8c1 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -263,6 +263,8 @@ "follow_request.authorize": "Aotren", "follow_request.reject": "Nac'hañ", "follow_requests.unlocked_explanation": "Daoust ma n'eo ket ho kont prennet, skipailh {domain} a soñj e fellfe deoc'h gwiriekaat pedadennoù heuliañ deus ar c'hontoù-se diwar-zorn.", + "follow_suggestions.friends_of_friends_longer": "Diouzh ar c'hiz e-touez an dud heuliet ganeoc'h", + "follow_suggestions.popular_suggestion_longer": "Diouzh ar c'hiz war {domain}", "follow_suggestions.view_all": "Gwelet pep tra", "followed_tags": "Hashtagoù o heuliañ", "footer.about": "Diwar-benn", @@ -395,6 +397,7 @@ "notification.follow": "heuliañ a ra {name} ac'hanoc'h", "notification.follow_request": "Gant {name} eo bet goulennet ho heuliañ", "notification.mention": "Gant {name} oc'h bet meneget", + "notification.moderation-warning.learn_more": "Gouzout hiroc'h", "notification.own_poll": "Echu eo ho sontadeg", "notification.poll": "Ur sontadeg ho deus mouezhet warnañ a zo echuet", "notification.reblog": "Gant {name} eo bet skignet ho toud", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 6dfe06a92..68429b093 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -318,7 +318,7 @@ "follow_suggestions.personalized_suggestion": "Suggeriment personalitzat", "follow_suggestions.popular_suggestion": "Suggeriment popular", "follow_suggestions.popular_suggestion_longer": "Popular a {domain}", - "follow_suggestions.similar_to_recently_followed_longer": "Semblant a perfils que has seguit fa poc", + "follow_suggestions.similar_to_recently_followed_longer": "Semblant a perfils que seguiu de fa poc", "follow_suggestions.view_all": "Mostra-ho tot", "follow_suggestions.who_to_follow": "A qui seguir", "followed_tags": "Etiquetes seguides", @@ -414,6 +414,7 @@ "limited_account_hint.action": "Mostra el perfil de totes maneres", "limited_account_hint.title": "Aquest perfil l'han amagat els moderadors de {domain}.", "link_preview.author": "Per {name}", + "link_preview.more_from_author": "Més de {name}", "lists.account.add": "Afegeix a la llista", "lists.account.remove": "Elimina de la llista", "lists.delete": "Elimina la llista", @@ -473,6 +474,15 @@ "notification.follow": "{name} et segueix", "notification.follow_request": "{name} ha sol·licitat de seguir-te", "notification.mention": "{name} t'ha esmentat", + "notification.moderation-warning.learn_more": "Per a saber-ne més", + "notification.moderation_warning": "Heu rebut un avís de moderació", + "notification.moderation_warning.action_delete_statuses": "S'han eliminat algunes de les vostres publicacions.", + "notification.moderation_warning.action_disable": "S'ha desactivat el vostre compte.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "S'ha marcat com a sensibles algunes de les vostres publicacions.", + "notification.moderation_warning.action_none": "El vostre compte ha rebut un avís de moderació.", + "notification.moderation_warning.action_sensitive": "A partir d'ara les vostres publicacions es marcaran com sensibles.", + "notification.moderation_warning.action_silence": "S'ha limitat el vostre compte.", + "notification.moderation_warning.action_suspend": "S'ha suspès el vostre compte.", "notification.own_poll": "La teva enquesta ha finalitzat", "notification.poll": "Ha finalitzat una enquesta en què has votat", "notification.reblog": "{name} t'ha impulsat", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 2fc01f3ac..f2a1f023a 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, personál {domain} usoudil, že byste mohli chtít tyto požadavky na sledování zkontrolovat ručně.", "follow_suggestions.curated_suggestion": "Výběr personálů", "follow_suggestions.dismiss": "Znovu nezobrazovat", + "follow_suggestions.featured_longer": "Ručně vybráno týmem {domain}", + "follow_suggestions.friends_of_friends_longer": "Populární mezi lidmi, které sledujete", "follow_suggestions.hints.featured": "Tento profil byl ručně vybrán týmem {domain}.", "follow_suggestions.hints.friends_of_friends": "Tento profil je populární mezi lidmi, které sledujete.", "follow_suggestions.hints.most_followed": "Tento profil je jedním z nejvíce sledovaných na {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Tento profil je podobný profilům, které jste nedávno sledovali.", "follow_suggestions.personalized_suggestion": "Přizpůsobený návrh", "follow_suggestions.popular_suggestion": "Populární návrh", + "follow_suggestions.popular_suggestion_longer": "Populární na {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Podobné profilům, které jste nedávno sledovali", "follow_suggestions.view_all": "Zobrazit vše", "follow_suggestions.who_to_follow": "Koho sledovat", "followed_tags": "Sledované hashtagy", @@ -469,6 +473,15 @@ "notification.follow": "Uživatel {name} vás začal sledovat", "notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat", "notification.mention": "Uživatel {name} vás zmínil", + "notification.moderation-warning.learn_more": "Zjistit více", + "notification.moderation_warning": "Obdrželi jste moderační varování", + "notification.moderation_warning.action_delete_statuses": "Některé z vašich příspěvků byly odstraněny.", + "notification.moderation_warning.action_disable": "Váš účet je zablokován.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Některé z vašich příspěvků byly označeny jako citlivé.", + "notification.moderation_warning.action_none": "Váš účet obdržel moderační varování.", + "notification.moderation_warning.action_sensitive": "Vaše příspěvky budou od nynějška označeny jako citlivé.", + "notification.moderation_warning.action_silence": "Váš účet byl omezen.", + "notification.moderation_warning.action_suspend": "Váš účet byl pozastaven.", "notification.own_poll": "Vaše anketa skončila", "notification.poll": "Anketa, ve které jste hlasovali, skončila", "notification.reblog": "Uživatel {name} boostnul váš příspěvek", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index d2731b629..2c5976995 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -89,6 +89,14 @@ "announcement.announcement": "Cyhoeddiad", "attachments_list.unprocessed": "(heb eu prosesu)", "audio.hide": "Cuddio sain", + "block_modal.remote_users_caveat": "Byddwn yn gofyn i'r gweinydd {domain} barchu eich penderfyniad. Fodd bynnag, nid yw cydymffurfiad wedi'i warantu gan y gall rhai gweinyddwyr drin rhwystro mewn ffyrdd gwahanol. Mae'n bosibl y bydd postiadau cyhoeddus yn dal i fod yn weladwy i ddefnyddwyr nad ydynt wedi mewngofnodi.", + "block_modal.show_less": "Dangos llai", + "block_modal.show_more": "Dangos mwy", + "block_modal.they_cant_mention": "Nid ydynt yn gallu eich crybwyll na'ch dilyn.", + "block_modal.they_cant_see_posts": "Nid ydynt yn gallu gweld eich postiadau ac ni fyddwch yn gweld eu rhai hwy.", + "block_modal.they_will_know": "Gallant weld eu bod wedi'u rhwystro.", + "block_modal.title": "Rhwystro defnyddiwr?", + "block_modal.you_wont_see_mentions": "Ni welwch bostiadau sy'n sôn amdanynt.", "boost_modal.combo": "Mae modd pwyso {combo} er mwyn hepgor hyn tro nesa", "bundle_column_error.copy_stacktrace": "Copïo'r adroddiad gwall", "bundle_column_error.error.body": "Nid oedd modd cynhyrchu'r dudalen honno. Gall fod oherwydd gwall yn ein cod neu fater cydnawsedd porwr.", @@ -169,6 +177,7 @@ "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?", "confirmations.discard_edit_media.confirm": "Dileu", "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?", + "confirmations.domain_block.confirm": "Rhwystro gweinydd", "confirmations.domain_block.message": "Ydych chi wir, wir eisiau blocio'r holl {domain}? Fel arfer, mae blocio neu dewi pobl penodol yn broses mwy effeithiol. Fyddwch chi ddim yn gweld cynnwys o'r parth hwnnw mewn ffrydiau cyhoeddus neu yn eich hysbysiadau. Bydd eich dilynwyr o'r parth hwnnw yn cael eu ddileu.", "confirmations.edit.confirm": "Golygu", "confirmations.edit.message": "Bydd golygu nawr yn trosysgrifennu'r neges rydych yn ei ysgrifennu ar hyn o bryd. Ydych chi'n siŵr eich bod eisiau gwneud hyn?", @@ -200,6 +209,27 @@ "dismissable_banner.explore_statuses": "Mae'r rhain yn bostiadau o bob rhan o'r we gymdeithasol sydd ar gynnydd heddiw. Mae postiadau mwy diweddar sydd â mwy o hybiau a ffefrynu'n cael eu graddio'n uwch.", "dismissable_banner.explore_tags": "Mae'r rhain yn hashnodau sydd ar gynnydd ar y we gymdeithasol heddiw. Mae hashnodau sy'n cael eu defnyddio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.", "dismissable_banner.public_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl ar y we gymdeithasol y mae pobl ar {domain} yn eu dilyn.", + "domain_block_modal.block": "Rhwystro gweinydd", + "domain_block_modal.block_account_instead": "Rhwystro @{name} yn lle hynny", + "domain_block_modal.they_can_interact_with_old_posts": "Gall pobl o'r gweinydd hwn ryngweithio â'ch hen bostiadau.", + "domain_block_modal.they_cant_follow": "Ni all neb o'r gweinydd hwn eich dilyn.", + "domain_block_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu rhwystro.", + "domain_block_modal.title": "Rhwystro parth?", + "domain_block_modal.you_will_lose_followers": "Bydd eich holl ddilynwyr o'r gweinydd hwn yn cael eu tynnu.", + "domain_block_modal.you_wont_see_posts": "Fyddwch chi ddim yn gweld postiadau na hysbysiadau gan ddefnyddwyr ar y gweinydd hwn.", + "domain_pill.activitypub_lets_connect": "Mae'n caniatáu ichi gysylltu a rhyngweithio â phobl nid yn unig ar Mastodon, ond ar draws gwahanol apiau cymdeithasol hefyd.", + "domain_pill.activitypub_like_language": "Mae ActivityPub fel yr iaith y mae Mastodon yn ei siarad â rhwydweithiau cymdeithasol eraill.", + "domain_pill.server": "Gweinydd", + "domain_pill.their_handle": "Eu handlen:", + "domain_pill.their_server": "Eu cartref digidol, lle mae eu holl negeseuon yn byw.", + "domain_pill.their_username": "Eu dynodwr unigryw ar eu gweinydd. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.", + "domain_pill.username": "Enw Defnyddiwr", + "domain_pill.whats_in_a_handle": "Beth sydd mewn handlen?", + "domain_pill.who_they_are": "Gan fod handlen yn dweud pwy yw rhywun a ble maen nhw, gallwch chi ryngweithio â phobl ar draws gwe gymdeithasol .", + "domain_pill.who_you_are": "Oherwydd bod eich handlen yn dweud pwy ydych chi a ble rydych chi, gall pobl ryngweithio â chi ar draws gwe gymdeithasol .", + "domain_pill.your_handle": "Eich handlen:", + "domain_pill.your_server": "Eich cartref digidol, lle mae'ch holl bostiadau'n byw. Ddim yn hoffi'r un hon? Trosglwyddwch weinyddion ar unrhyw adeg a dewch â'ch dilynwyr hefyd.", + "domain_pill.your_username": "Eich dynodwr unigryw ar y gweinydd hwn. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.", "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.", "embed.preview": "Dyma sut olwg fydd arno:", "emoji_button.activity": "Gweithgarwch", @@ -267,6 +297,8 @@ "filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd", "filter_modal.select_filter.title": "Hidlo'r postiad hwn", "filter_modal.title.status": "Hidlo postiad", + "filtered_notifications_banner.mentions": "{count, plural, one {crybwylliad} other {crybwylliad}}", + "filtered_notifications_banner.pending_requests": "Hysbysiadau gan {count, plural, =0 {neb} one {un person} other {# person}} efallai y gwyddoch amdanyn nhw", "filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo", "firehose.all": "Popeth", "firehose.local": "Gweinydd hwn", @@ -276,6 +308,8 @@ "follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, roedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.", "follow_suggestions.curated_suggestion": "Dewis staff", "follow_suggestions.dismiss": "Peidio â dangos hwn eto", + "follow_suggestions.featured_longer": "Wedi'i ddewis â llaw gan dîm {domain}", + "follow_suggestions.friends_of_friends_longer": "Yn boblogaidd ymhlith y bobl rydych chi'n eu dilyn", "follow_suggestions.hints.featured": "Mae'r proffil hwn wedi'i ddewis yn arbennig gan dîm {domain}.", "follow_suggestions.hints.friends_of_friends": "Mae'r proffil hwn yn boblogaidd ymhlith y bobl rydych chi'n eu dilyn.", "follow_suggestions.hints.most_followed": "Mae'r proffil hwn yn un o'r rhai sy'n cael ei ddilyn fwyaf ar {domain}.", @@ -283,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Mae'r proffil hwn yn debyg i'r proffiliau rydych chi wedi'u dilyn yn fwyaf diweddar.", "follow_suggestions.personalized_suggestion": "Awgrym personol", "follow_suggestions.popular_suggestion": "Awgrym poblogaidd", + "follow_suggestions.popular_suggestion_longer": "Yn boblogaidd ar {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Yn debyg i broffiliau y gwnaethoch chi eu dilyn yn ddiweddar", "follow_suggestions.view_all": "Gweld y cyfan", "follow_suggestions.who_to_follow": "Pwy i ddilyn", "followed_tags": "Hashnodau rydych yn eu dilyn", @@ -396,6 +432,15 @@ "loading_indicator.label": "Yn llwytho…", "media_gallery.toggle_visible": "{number, plural, one {Cuddio delwedd} other {Cuddio delwedd}}", "moved_to_account_banner.text": "Ar hyn y bryd, mae eich cyfrif {disabledAccount} wedi ei analluogi am i chi symud i {movedToAccount}.", + "mute_modal.hide_from_notifications": "Cuddio rhag hysbysiadau", + "mute_modal.hide_options": "Cuddio'r dewis", + "mute_modal.indefinite": "Nes i mi eu dad-dewi", + "mute_modal.show_options": "Dangos y dewis", + "mute_modal.they_can_mention_and_follow": "Gallan nhw eich crybwyll a'ch dilyn, ond fyddwch chi ddim yn eu gweld.", + "mute_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu tawelu.", + "mute_modal.title": "Tewi defnyddiwr?", + "mute_modal.you_wont_see_mentions": "Welwch chi ddim postiadau sy'n sôn amdanyn nhw.", + "mute_modal.you_wont_see_posts": "Gallan nhw weld eich postiadau o hyd, ond fyddwch chi ddim yn gweld eu rhai hwy.", "navigation_bar.about": "Ynghylch", "navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch", "navigation_bar.blocks": "Defnyddwyr wedi eu blocio", @@ -428,9 +473,23 @@ "notification.follow": "Dilynodd {name} chi", "notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn", "notification.mention": "Crybwyllodd {name} amdanoch chi", + "notification.moderation-warning.learn_more": "Dysgu mwy", + "notification.moderation_warning": "Rydych wedi derbyn rhybudd gan gymedrolwr", + "notification.moderation_warning.action_delete_statuses": "Mae rhai o'ch postiadau wedi'u dileu.", + "notification.moderation_warning.action_disable": "Mae eich cyfrif wedi'i analluogi.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Mae rhai o'ch postiadau wedi'u marcio'n sensitif.", + "notification.moderation_warning.action_none": "Mae eich cyfrif wedi derbyn rhybudd cymedroli.", + "notification.moderation_warning.action_sensitive": "Bydd eich postiadau'n cael eu marcio'n sensitif o hyn ymlaen.", + "notification.moderation_warning.action_silence": "Mae eich cyfrif wedi'i gyfyngu.", + "notification.moderation_warning.action_suspend": "Mae eich cyfrif wedi'i hatal.", "notification.own_poll": "Mae eich pleidlais wedi dod i ben", "notification.poll": "Mae pleidlais rydych wedi pleidleisio ynddi wedi dod i ben", "notification.reblog": "Hybodd {name} eich post", + "notification.relationships_severance_event": "Wedi colli cysylltiad â {name}", + "notification.relationships_severance_event.account_suspension": "Mae gweinyddwr o {from} wedi atal {target}, sy'n golygu na allwch dderbyn diweddariadau ganddynt mwyach na rhyngweithio â nhw.", + "notification.relationships_severance_event.domain_block": "Mae gweinyddwr o {from} wedi rhwystro {target}, gan gynnwys {followersCount} o'ch dilynwyr a {followingCount, plural, one {# cyfrif} other {# cyfrif}} arall rydych chi'n ei ddilyn.", + "notification.relationships_severance_event.learn_more": "Dysgu mwy", + "notification.relationships_severance_event.user_domain_block": "Rydych wedi rhwystro {target}, gan ddileu {followersCount} o'ch dilynwyr a {followingCount, plural, one {# cyfrif} other {#cyfrifon}} arall rydych yn ei ddilyn.", "notification.status": "{name} newydd ei bostio", "notification.update": "Golygodd {name} bostiad", "notification_requests.accept": "Derbyn", @@ -443,6 +502,8 @@ "notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", "notifications.column_settings.favourite": "Ffefrynnau:", + "notifications.column_settings.filter_bar.advanced": "Dangos pob categori", + "notifications.column_settings.filter_bar.category": "Bar hidlo cyflym", "notifications.column_settings.follow": "Dilynwyr newydd:", "notifications.column_settings.follow_request": "Ceisiadau dilyn newydd:", "notifications.column_settings.mention": "Crybwylliadau:", @@ -653,9 +714,11 @@ "status.direct": "Crybwyll yn breifat @{name}", "status.direct_indicator": "Crybwyll preifat", "status.edit": "Golygu", + "status.edited": "Golygwyd ddiwethaf {date}", "status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}", "status.embed": "Mewnblannu", "status.favourite": "Hoffi", + "status.favourites": "{count, plural, one {ffefryn} other {ffefryn}}", "status.filter": "Hidlo'r postiad hwn", "status.filtered": "Wedi'i hidlo", "status.hide": "Cuddio'r postiad", @@ -676,6 +739,7 @@ "status.reblog": "Hybu", "status.reblog_private": "Hybu i'r gynulleidfa wreiddiol", "status.reblogged_by": "Hybodd {name}", + "status.reblogs": "{count, plural, one {hwb} other {hwb}}", "status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.", "status.redraft": "Dileu ac ailddrafftio", "status.remove_bookmark": "Tynnu nod tudalen", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 59d3d0965..577664107 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -331,7 +331,7 @@ "footer.source_code": "Quellcode anzeigen", "footer.status": "Status", "generic.saved": "Gespeichert", - "getting_started.heading": "Auf geht’s!", + "getting_started.heading": "Auf gehts!", "hashtag.column_header.tag_mode.all": "und {additional}", "hashtag.column_header.tag_mode.any": "oder {additional}", "hashtag.column_header.tag_mode.none": "ohne {additional}", @@ -400,7 +400,7 @@ "keyboard_shortcuts.requests": "Liste der Follower-Anfragen aufrufen", "keyboard_shortcuts.search": "Suchleiste fokussieren", "keyboard_shortcuts.spoilers": "Feld für Inhaltswarnung anzeigen/ausblenden", - "keyboard_shortcuts.start": "„Auf geht’s!“ öffnen", + "keyboard_shortcuts.start": "„Auf gehts!“ öffnen", "keyboard_shortcuts.toggle_hidden": "Beitragstext hinter der Inhaltswarnung anzeigen/ausblenden", "keyboard_shortcuts.toggle_sensitivity": "Medien anzeigen/ausblenden", "keyboard_shortcuts.toot": "Neuen Beitrag erstellen", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 6c24d5a26..e70348e0b 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", "follow_suggestions.curated_suggestion": "Staff pick", "follow_suggestions.dismiss": "Don't show again", + "follow_suggestions.featured_longer": "Hand-picked by the {domain} team", + "follow_suggestions.friends_of_friends_longer": "Popular among people you follow", "follow_suggestions.hints.featured": "This profile has been hand-picked by the {domain} team.", "follow_suggestions.hints.friends_of_friends": "This profile is popular among the people you follow.", "follow_suggestions.hints.most_followed": "This profile is one of the most followed on {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "This profile is similar to the profiles you have most recently followed.", "follow_suggestions.personalized_suggestion": "Personalised suggestion", "follow_suggestions.popular_suggestion": "Popular suggestion", + "follow_suggestions.popular_suggestion_longer": "Popular on {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similar to profiles you recently followed", "follow_suggestions.view_all": "View all", "follow_suggestions.who_to_follow": "Who to follow", "followed_tags": "Followed hashtags", @@ -469,6 +473,15 @@ "notification.follow": "{name} followed you", "notification.follow_request": "{name} has requested to follow you", "notification.mention": "{name} mentioned you", + "notification.moderation-warning.learn_more": "Learn more", + "notification.moderation_warning": "You have received a moderation warning", + "notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.", + "notification.moderation_warning.action_disable": "Your account has been disabled.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Some of your posts have been marked as sensitive.", + "notification.moderation_warning.action_none": "Your account has received a moderation warning.", + "notification.moderation_warning.action_sensitive": "Your posts will be marked as sensitive from now on.", + "notification.moderation_warning.action_silence": "Your account has been limited.", + "notification.moderation_warning.action_suspend": "Your account has been suspended.", "notification.own_poll": "Your poll has ended", "notification.poll": "A poll you have voted in has ended", "notification.reblog": "{name} boosted your status", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 9d127b6b0..63298d59e 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -414,6 +414,7 @@ "limited_account_hint.action": "Show profile anyway", "limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.", "link_preview.author": "By {name}", + "link_preview.more_from_author": "More from {name}", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -474,7 +475,7 @@ "notification.follow_request": "{name} has requested to follow you", "notification.mention": "{name} mentioned you", "notification.moderation-warning.learn_more": "Learn more", - "notification.moderation_warning": "Your have received a moderation warning", + "notification.moderation_warning": "You have received a moderation warning", "notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.", "notification.moderation_warning.action_disable": "Your account has been disabled.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Some of your posts have been marked as sensitive.", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 2cf419862..4c30bfa25 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -241,7 +241,7 @@ "emoji_button.nature": "Naturaleza", "emoji_button.not_found": "No se encontraron emojis coincidentes", "emoji_button.objects": "Objetos", - "emoji_button.people": "Gente", + "emoji_button.people": "Cuentas", "emoji_button.recent": "Usados frecuentemente", "emoji_button.search": "Buscar...", "emoji_button.search_results": "Resultados de búsqueda", @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el equipo de {domain} pensó que podrías querer revisar manualmente las solicitudes de seguimiento de estas cuentas.", "follow_suggestions.curated_suggestion": "Selección del equipo", "follow_suggestions.dismiss": "No mostrar de nuevo", + "follow_suggestions.featured_longer": "Seleccionada a mano por el equipo de {domain}", + "follow_suggestions.friends_of_friends_longer": "Populares entre las cuentas que seguís", "follow_suggestions.hints.featured": "Este perfil fue seleccionado a mano por el equipo de {domain}.", "follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las cuentas que seguís.", "follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los que comenzaste a seguir.", "follow_suggestions.personalized_suggestion": "Sugerencia personalizada", "follow_suggestions.popular_suggestion": "Sugerencia popular", + "follow_suggestions.popular_suggestion_longer": "Popular en {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similares a perfiles que comenzaste a seguir recientemente", "follow_suggestions.view_all": "Ver todo", "follow_suggestions.who_to_follow": "A quién seguir", "followed_tags": "Etiquetas seguidas", @@ -410,6 +414,7 @@ "limited_account_hint.action": "Mostrar perfil de todos modos", "limited_account_hint.title": "Este perfil fue ocultado por los moderadores de {domain}.", "link_preview.author": "Por {name}", + "link_preview.more_from_author": "Más de {name}", "lists.account.add": "Agregar a lista", "lists.account.remove": "Quitar de lista", "lists.delete": "Eliminar lista", @@ -469,6 +474,15 @@ "notification.follow": "{name} te empezó a seguir", "notification.follow_request": "{name} solicitó seguirte", "notification.mention": "{name} te mencionó", + "notification.moderation-warning.learn_more": "Aprendé más", + "notification.moderation_warning": "Recibiste una advertencia de moderación", + "notification.moderation_warning.action_delete_statuses": "Se eliminaron algunos de tus mensajes.", + "notification.moderation_warning.action_disable": "Se deshabilitó tu cuenta.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Se marcaron como sensibles a algunos de tus mensajes.", + "notification.moderation_warning.action_none": "Tu cuenta recibió una advertencia de moderación.", + "notification.moderation_warning.action_sensitive": "A partir de ahora, tus mensajes serán marcados como sensibles.", + "notification.moderation_warning.action_silence": "Tu cuenta fue limitada.", + "notification.moderation_warning.action_suspend": "Tu cuenta fue suspendida.", "notification.own_poll": "Tu encuesta finalizó", "notification.poll": "Finalizó una encuesta en la que votaste", "notification.reblog": "{name} adhirió a tu mensaje", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 1d8d4cedf..1a99d1d4b 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.", "follow_suggestions.curated_suggestion": "Recomendaciones del equipo", "follow_suggestions.dismiss": "No mostrar de nuevo", + "follow_suggestions.featured_longer": "Escogidos por el equipo de {domain}", + "follow_suggestions.friends_of_friends_longer": "Populares entre las personas a las que sigues", "follow_suggestions.hints.featured": "Este perfil ha sido seleccionado a mano por el equipo de {domain}.", "follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las personas que sigues.", "follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los perfiles que has seguido recientemente.", "follow_suggestions.personalized_suggestion": "Sugerencia personalizada", "follow_suggestions.popular_suggestion": "Sugerencia popular", + "follow_suggestions.popular_suggestion_longer": "Populares en {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similares a los perfiles que has seguido recientemente", "follow_suggestions.view_all": "Ver todo", "follow_suggestions.who_to_follow": "Recomendamos seguir", "followed_tags": "Hashtags seguidos", @@ -469,6 +473,15 @@ "notification.follow": "{name} te empezó a seguir", "notification.follow_request": "{name} ha solicitado seguirte", "notification.mention": "{name} te ha mencionado", + "notification.moderation-warning.learn_more": "Saber más", + "notification.moderation_warning": "Has recibido una advertencia de moderación", + "notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.", + "notification.moderation_warning.action_disable": "Tu cuenta ha sido desactivada.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Se han marcado como sensibles algunas de tus publicaciones.", + "notification.moderation_warning.action_none": "Tu cuenta ha recibido un aviso de moderación.", + "notification.moderation_warning.action_sensitive": "De ahora en adelante, todas tus publicaciones se marcarán como sensibles.", + "notification.moderation_warning.action_silence": "Tu cuenta ha sido limitada.", + "notification.moderation_warning.action_suspend": "Tu cuenta ha sido suspendida.", "notification.own_poll": "Tu encuesta ha terminado", "notification.poll": "Una encuesta en la que has votado ha terminado", "notification.reblog": "{name} ha retooteado tu estado", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 149a37d74..1782a3a1f 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.", "follow_suggestions.curated_suggestion": "Recomendaciones del equipo", "follow_suggestions.dismiss": "No mostrar de nuevo", + "follow_suggestions.featured_longer": "Escogidos por el equipo de {domain}", + "follow_suggestions.friends_of_friends_longer": "Populares entre las personas a las que sigues", "follow_suggestions.hints.featured": "Este perfil ha sido elegido a mano por el equipo de {domain}.", "follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las personas que sigues.", "follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los perfiles que has seguido recientemente.", "follow_suggestions.personalized_suggestion": "Sugerencia personalizada", "follow_suggestions.popular_suggestion": "Sugerencia popular", + "follow_suggestions.popular_suggestion_longer": "Populares en {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similares a los perfiles que has seguido recientemente", "follow_suggestions.view_all": "Ver todo", "follow_suggestions.who_to_follow": "A quién seguir", "followed_tags": "Etiquetas seguidas", @@ -469,6 +473,15 @@ "notification.follow": "{name} te empezó a seguir", "notification.follow_request": "{name} ha solicitado seguirte", "notification.mention": "{name} te ha mencionado", + "notification.moderation-warning.learn_more": "Saber más", + "notification.moderation_warning": "Has recibido una advertencia de moderación", + "notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.", + "notification.moderation_warning.action_disable": "Tu cuenta ha sido desactivada.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Se han marcado como sensibles algunas de tus publicaciones.", + "notification.moderation_warning.action_none": "Tu cuenta ha recibido un aviso de moderación.", + "notification.moderation_warning.action_sensitive": "De ahora en adelante, todas tus publicaciones se marcarán como sensibles.", + "notification.moderation_warning.action_silence": "Tu cuenta ha sido limitada.", + "notification.moderation_warning.action_suspend": "Tu cuenta ha sido suspendida.", "notification.own_poll": "Tu encuesta ha terminado", "notification.poll": "Una encuesta en la que has votado ha terminado", "notification.reblog": "{name} ha impulsado tu publicación", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 5a5031fd1..6c2162e52 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -298,7 +298,7 @@ "filter_modal.select_filter.title": "Suodata tämä julkaisu", "filter_modal.title.status": "Suodata julkaisu", "filtered_notifications_banner.mentions": "{count, plural, one {maininta} other {mainintaa}}", - "filtered_notifications_banner.pending_requests": "Sinulle on ilmoituksia mahdollisesti tuntemiltasi henkilöiltä seuraavasti: {count, plural, =0 {Ei keltään} one {Yhdeltä henkilöltä} other {# henkilöltä}}", + "filtered_notifications_banner.pending_requests": "Ilmoituksia {count, plural, =0 {ei ole} one {1 henkilöltä} other {# henkilöltä}}, jonka saatat tuntea", "filtered_notifications_banner.title": "Suodatetut ilmoitukset", "firehose.all": "Kaikki", "firehose.local": "Tämä palvelin", @@ -308,7 +308,7 @@ "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, palvelimen {domain} ylläpito on arvioinut, että saatat olla halukas tarkistamaan nämä seuraamispyynnöt erikseen.", "follow_suggestions.curated_suggestion": "Ehdotus ylläpidolta", "follow_suggestions.dismiss": "Älä näytä uudelleen", - "follow_suggestions.featured_longer": "Käsin valinnut palvelimen {domain} tiimi", + "follow_suggestions.featured_longer": "Valinnut käsin palvelimen {domain} tiimi", "follow_suggestions.friends_of_friends_longer": "Suosittu seuraamiesi ihmisten keskuudessa", "follow_suggestions.hints.featured": "Tämän profiilin on valinnut palvelimen {domain} tiimi.", "follow_suggestions.hints.friends_of_friends": "Seuraamasi käyttäjät suosivat tätä profiilia.", @@ -414,6 +414,7 @@ "limited_account_hint.action": "Näytä profiili joka tapauksessa", "limited_account_hint.title": "Palvelimen {domain} valvojat ovat piilottaneet tämän käyttäjätilin.", "link_preview.author": "Julkaissut {name}", + "link_preview.more_from_author": "Lisää käyttäjältä {name}", "lists.account.add": "Lisää listalle", "lists.account.remove": "Poista listalta", "lists.delete": "Poista lista", diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index 894d73c8c..1f9b0496b 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -50,6 +50,8 @@ "admin.dashboard.retention.cohort_size": "Mga bagong tagagamit", "alert.rate_limited.message": "Mangyaring subukan muli pagkatapos ng {retry_time, time, medium}.", "audio.hide": "Itago ang tunog", + "block_modal.show_less": "Magpakita ng mas kaunti", + "block_modal.show_more": "Magpakita ng higit pa", "block_modal.title": "Harangan ang tagagamit?", "bundle_column_error.error.title": "Naku!", "bundle_column_error.network.body": "Nagkaroon ng kamalian habang sinusubukang i-karga ang pahinang ito. Maaaring dahil ito sa pansamantalang problema ng iyong koneksyon sa internet o ang server na ito.", @@ -102,6 +104,7 @@ "compose_form.encryption_warning": "Ang mga post sa Mastodon ay hindi naka-encrypt nang dulo-dulo. Huwag magbahagi ng anumang sensitibong impormasyon sa Mastodon.", "compose_form.hashtag_warning": "Hindi maililista ang post na ito sa anumang hashtag dahil hindi ito nakapubliko. Mga nakapublikong post lamang ang mahahanap ayon sa hashtag.", "compose_form.placeholder": "Anong nangyari?", + "compose_form.poll.duration": "Tagal ng botohan", "compose_form.poll.multiple": "Maraming pagpipilian", "compose_form.poll.single": "Piliin ang isa", "compose_form.reply": "Tumugon", @@ -173,6 +176,7 @@ "empty_column.list": "Wala pang laman ang listahang ito. Kapag naglathala ng mga bagong post ang mga miyembro ng listahang ito, makikita iyon dito.", "empty_column.lists": "Wala ka pang mga listahan. Kapag gumawa ka ng isa, makikita yun dito.", "explore.search_results": "Mga resulta ng paghahanap", + "explore.suggested_follows": "Mga tao", "explore.title": "Tuklasin", "explore.trending_links": "Mga balita", "filter_modal.select_filter.search": "Hanapin o gumawa", @@ -186,9 +190,14 @@ "follow_suggestions.who_to_follow": "Sinong maaaring sundan", "footer.about": "Tungkol dito", "footer.get_app": "Kunin ang app", + "footer.status": "Katayuan", "generic.saved": "Nakaimbak", "hashtag.column_header.tag_mode.all": "at {additional}", "hashtag.column_header.tag_mode.any": "o {additional}", + "hashtag.column_settings.tag_mode.all": "Lahat ng nandito", + "hashtag.column_settings.tag_mode.any": "Ilan dito", + "hashtag.column_settings.tag_mode.none": "Wala dito", + "hashtags.and_other": "…at {count, plural, one {# iba pa} other {# na iba pa}}", "home.column_settings.show_replies": "Ipakita ang mga tugon", "home.pending_critical_update.body": "Mangyaring i-update ang iyong serbiro ng Mastodon sa lalong madaling panahon!", "interaction_modal.login.action": "Iuwi mo ako", @@ -199,6 +208,7 @@ "intervals.full.days": "{number, plural, one {# araw} other {# na araw}}", "intervals.full.hours": "{number, plural, one {# oras} other {# na oras}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# na minuto}}", + "keyboard_shortcuts.blocked": "Buksan ang talaan ng mga nakaharang na mga tagagamit", "keyboard_shortcuts.description": "Paglalarawan", "keyboard_shortcuts.down": "Ilipat pababa sa talaan", "keyboard_shortcuts.mention": "Banggitin ang may-akda", @@ -215,17 +225,23 @@ "lists.replies_policy.title": "Ipakita ang mga tugon sa:", "lists.subheading": "Iyong mga talaan", "loading_indicator.label": "Kumakarga…", + "mute_modal.hide_from_notifications": "Itago mula sa mga abiso", "navigation_bar.about": "Tungkol dito", "navigation_bar.blocks": "Nakaharang na mga tagagamit", "navigation_bar.direct": "Mga palihim na banggit", + "navigation_bar.discover": "Tuklasin", + "navigation_bar.explore": "Tuklasin", "navigation_bar.favourites": "Mga paborito", + "navigation_bar.follow_requests": "Mga hiling sa pagsunod", "navigation_bar.follows_and_followers": "Mga sinusundan at tagasunod", "navigation_bar.lists": "Mga listahan", + "navigation_bar.public_timeline": "Pinagsamang timeline", "navigation_bar.search": "Maghanap", "notification.admin.report": "Iniulat ni {name} si {target}", "notification.follow": "Sinundan ka ni {name}", "notification.follow_request": "Hinihiling ni {name} na sundan ka", "notification.mention": "Binanggit ka ni {name}", + "notification.moderation_warning": "Mayroong kang natanggap na babala sa pagtitimpi", "notification.relationships_severance_event.learn_more": "Matuto nang higit pa", "notification_requests.accept": "Tanggapin", "notification_requests.notifications_from": "Mga abiso mula kay/sa {name}", @@ -234,10 +250,12 @@ "notifications.column_settings.alert": "Mga abiso sa Desktop", "notifications.column_settings.favourite": "Mga paborito:", "notifications.column_settings.follow": "Mga bagong tagasunod:", + "notifications.column_settings.poll": "Resulta ng botohan:", "notifications.column_settings.unread_notifications.category": "Hindi Nabasang mga Abiso", "notifications.column_settings.update": "Mga pagbago:", "notifications.filter.all": "Lahat", "notifications.filter.favourites": "Mga paborito", + "notifications.filter.polls": "Resulta ng botohan", "notifications.mark_as_read": "Markahan lahat ng abiso bilang nabasa na", "notifications.policy.filter_not_followers_title": "Mga taong hindi ka susundan", "notifications.policy.filter_not_following_title": "Mga taong hindi mo sinusundan", @@ -246,6 +264,7 @@ "onboarding.profile.note_hint": "Maaari mong @bangitin ang ibang mga tao o mga #hashtag…", "onboarding.profile.save_and_continue": "Iimbak at magpatuloy", "onboarding.share.next_steps": "Mga posibleng susunod na hakbang:", + "picture_in_picture.restore": "Ilagay ito pabalik", "poll.closed": "Sarado", "poll.reveal": "Ipakita ang mga resulta", "poll.voted": "Binoto mo para sa sagot na ito", @@ -280,10 +299,13 @@ "report.thanks.title": "Ayaw mo bang makita ito?", "report.thanks.title_actionable": "Salamat sa pag-uulat, titingnan namin ito.", "report_notification.categories.other": "Iba pa", + "report_notification.categories.violation": "Paglabag sa patakaran", + "report_notification.open": "Buksan ang ulat", "search.quick_action.open_url": "Buksan ang URL sa Mastodon", "search.search_or_paste": "Maghanap o ilagay ang URL", "search_popout.full_text_search_disabled_message": "Hindi magagamit sa {domain}.", "search_popout.full_text_search_logged_out_message": "Magagamit lamang kapag naka-log in.", + "search_popout.recent": "Kamakailang mga paghahanap", "search_results.all": "Lahat", "search_results.see_all": "Ipakita lahat", "server_banner.learn_more": "Matuto nang higit pa", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 77257413f..f22a829c0 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -474,11 +474,11 @@ "notification.follow_request": "{name} biður um at fylgja tær", "notification.mention": "{name} nevndi teg", "notification.moderation-warning.learn_more": "Lær meira", - "notification.moderation_warning": "Tú hevur móttikið eina umsjónarávarðing", + "notification.moderation_warning": "Tú hevur móttikið eina umsjónarávaring", "notification.moderation_warning.action_delete_statuses": "Onkrir av tínum postum eru strikaðir.", "notification.moderation_warning.action_disable": "Konta tín er gjørd óvirkin.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Nakrir av postum tínum eru merktir sum viðkvæmir.", - "notification.moderation_warning.action_none": "Konta tín hevur móttikið eina umsjónarávarðing.", + "notification.moderation_warning.action_none": "Konta tín hevur móttikið eina umsjónarávaring.", "notification.moderation_warning.action_sensitive": "Postar tínir verða merktir sum viðkvæmir frá nú av.", "notification.moderation_warning.action_silence": "Konta tín er avmarkað.", "notification.moderation_warning.action_suspend": "Konta tín er ógildað.", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 49802ac48..0847b8bf0 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -2,7 +2,7 @@ "about.blocks": "Servidores suxeitos a moderación", "about.contact": "Contacto:", "about.disclaimer": "Mastodon é software libre, de código aberto, e unha marca comercial de Mastodon gGmbH.", - "about.domain_blocks.no_reason_available": "Motivo non indicado. ", + "about.domain_blocks.no_reason_available": "Motivo non indicado", "about.domain_blocks.preamble": "Mastodon de xeito xeral permíteche ver contidos doutros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estabeleceron neste servidor en particular.", "about.domain_blocks.silenced.explanation": "Por defecto non verás perfís e contido desde este servidor, a menos que mires de xeito explícito ou optes por seguir ese contido ou usuaria.", "about.domain_blocks.silenced.title": "Limitado", @@ -92,7 +92,7 @@ "block_modal.remote_users_caveat": "Ímoslle pedir ao servidor {domain} que respecte a túa decisión. Emporiso, non hai garantía de que atenda a petición xa que os servidores xestionan os bloqueos de formas diferentes. As publicacións públicas poderían aínda ser visibles para usuarias que non iniciaron sesión.", "block_modal.show_less": "Mostrar menos", "block_modal.show_more": "Mostrar máis", - "block_modal.they_cant_mention": "Non te pode seguir nin mencionar.", + "block_modal.they_cant_mention": "Non te poden seguir nin mencionar.", "block_modal.they_cant_see_posts": "Non pode ver as túas publicacións nin ti as de ela.", "block_modal.they_will_know": "Pode ver que a bloqueaches.", "block_modal.title": "Bloquear usuaria?", @@ -115,7 +115,7 @@ "closed_registrations_modal.find_another_server": "Atopa outro servidor", "closed_registrations_modal.preamble": "Mastodon é descentralizado, así que non importa onde crees a conta, poderás seguir e interactuar con calquera conta deste servidor. Incluso podes ter o teu servidor!", "closed_registrations_modal.title": "Crear conta en Mastodon", - "column.about": "Acerca de", + "column.about": "Sobre", "column.blocks": "Usuarias bloqueadas", "column.bookmarks": "Marcadores", "column.community": "Cronoloxía local", @@ -322,7 +322,7 @@ "follow_suggestions.view_all": "Ver todas", "follow_suggestions.who_to_follow": "A quen seguir", "followed_tags": "Cancelos seguidos", - "footer.about": "Acerca de", + "footer.about": "Sobre", "footer.directory": "Directorio de perfís", "footer.get_app": "Descarga a app", "footer.invite": "Convidar persoas", @@ -414,6 +414,7 @@ "limited_account_hint.action": "Mostrar perfil igualmente", "limited_account_hint.title": "Este perfil foi agochado pola moderación de {domain}.", "link_preview.author": "Por {name}", + "link_preview.more_from_author": "Máis de {name}", "lists.account.add": "Engadir á listaxe", "lists.account.remove": "Eliminar da listaxe", "lists.delete": "Eliminar listaxe", @@ -441,7 +442,7 @@ "mute_modal.title": "Acalar usuaria?", "mute_modal.you_wont_see_mentions": "Non verás as publicacións que a mencionen.", "mute_modal.you_wont_see_posts": "Seguirá podendo ler as túas publicacións, pero non verás as súas.", - "navigation_bar.about": "Acerca de", + "navigation_bar.about": "Sobre", "navigation_bar.advanced_interface": "Abrir coa interface web avanzada", "navigation_bar.blocks": "Usuarias bloqueadas", "navigation_bar.bookmarks": "Marcadores", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 0b66a27fa..600de3959 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -473,6 +473,15 @@ "notification.follow": "{name} במעקב אחרייך", "notification.follow_request": "{name} ביקשו לעקוב אחריך", "notification.mention": "אוזכרת על ידי {name}", + "notification.moderation-warning.learn_more": "למידע נוסף", + "notification.moderation_warning": "קיבלת אזהרה מצוות ניהול התוכן", + "notification.moderation_warning.action_delete_statuses": "חלק מהודעותיך הוסרו.", + "notification.moderation_warning.action_disable": "חשבונך הושבת.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "חלק מהודעותיך סומנו כרגישות.", + "notification.moderation_warning.action_none": "חשבונך קיבל אזהרה מצוות ניהול התוכן.", + "notification.moderation_warning.action_sensitive": "הודעותיך יסומנו כרגישות מעתה ואילך.", + "notification.moderation_warning.action_silence": "חשבונך הוגבל.", + "notification.moderation_warning.action_suspend": "חשבונך הושעה.", "notification.own_poll": "הסקר שלך הסתיים", "notification.poll": "סקר שהצבעת בו הסתיים", "notification.reblog": "הודעתך הודהדה על ידי {name}", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 372eb09fa..5dc99dd76 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -205,6 +205,10 @@ "dismissable_banner.dismiss": "डिसमिस", "dismissable_banner.explore_links": "इन समाचारों के बारे में लोगों द्वारा इस पर और डेसेंट्रलीसेड नेटवर्क के अन्य सर्वरों पर अभी बात की जा रही है।", "dismissable_banner.explore_tags": "ये हैशटैग अभी इस पर और डेसेंट्रलीसेड नेटवर्क के अन्य सर्वरों पर लोगों के बीच कर्षण प्राप्त कर रहे हैं।", + "domain_block_modal.block": "सर्वर ब्लॉक करें", + "domain_block_modal.title": "डोमेन ब्लॉक करें", + "domain_pill.server": "सर्वर", + "domain_pill.username": "यूज़रनेम", "embed.instructions": "अपने वेबसाइट पर, निचे दिए कोड को कॉपी करके, इस स्टेटस को एम्बेड करें", "embed.preview": "यह ऐसा दिखेगा :", "emoji_button.activity": "गतिविधि", @@ -274,6 +278,7 @@ "follow_request.authorize": "अधिकार दें", "follow_request.reject": "अस्वीकार करें", "follow_requests.unlocked_explanation": "हालाँकि आपका खाता लॉक नहीं है, फिर भी {domain} डोमेन स्टाफ ने सोचा कि आप इन खातों के मैन्युअल अनुरोधों की समीक्षा करना चाहते हैं।", + "follow_suggestions.dismiss": "दोबारा न दिखाएं", "followed_tags": "फॉलो किए गए हैशटैग्स", "footer.about": "अबाउट", "footer.directory": "प्रोफाइल्स डायरेक्टरी", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 42ce84258..ba7fd6ddc 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -309,7 +309,7 @@ "follow_suggestions.curated_suggestion": "A stáb választása", "follow_suggestions.dismiss": "Ne jelenjen meg újra", "follow_suggestions.featured_longer": "A {domain} csapata által kézzel kiválasztott", - "follow_suggestions.friends_of_friends_longer": "Népszerű az Ön által követett emberek körében", + "follow_suggestions.friends_of_friends_longer": "Népszerű az általad követett emberek körében", "follow_suggestions.hints.featured": "Ezt a profilt a(z) {domain} csapata választotta ki.", "follow_suggestions.hints.friends_of_friends": "Ez a profil népszerű az általad követett emberek körében.", "follow_suggestions.hints.most_followed": "Ez a profil a leginkább követett a(z) {domain} oldalon.", @@ -318,7 +318,7 @@ "follow_suggestions.personalized_suggestion": "Személyre szabott javaslat", "follow_suggestions.popular_suggestion": "Népszerű javaslat", "follow_suggestions.popular_suggestion_longer": "Népszerű itt: {domain}", - "follow_suggestions.similar_to_recently_followed_longer": "Hasonló profilok, melyeket nemrég követett", + "follow_suggestions.similar_to_recently_followed_longer": "Hasonló azokhoz a profilokhoz, melyeket nemrég követtél be", "follow_suggestions.view_all": "Összes megtekintése", "follow_suggestions.who_to_follow": "Kit érdemes követni", "followed_tags": "Követett hashtagek", @@ -473,7 +473,7 @@ "notification.follow": "{name} követ téged", "notification.follow_request": "{name} követni szeretne téged", "notification.mention": "{name} megemlített", - "notification.moderation-warning.learn_more": "További információk", + "notification.moderation-warning.learn_more": "További információ", "notification.moderation_warning": "Moderációs figyelmeztetést kaptál", "notification.moderation_warning.action_delete_statuses": "Néhány bejegyzésedet eltávolították.", "notification.moderation_warning.action_disable": "A fiókod le van tiltva.", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 73634b99c..47c64e3f0 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -19,7 +19,7 @@ "account.block_domain": "Blocar dominio {domain}", "account.block_short": "Blocar", "account.blocked": "Blocate", - "account.browse_more_on_origin_server": "Navigar plus sur le profilo original", + "account.browse_more_on_origin_server": "Percurrer plus sur le profilo original", "account.cancel_follow_request": "Cancellar sequimento", "account.copy": "Copiar ligamine a profilo", "account.direct": "Mentionar privatemente @{name}", @@ -122,7 +122,7 @@ "column.direct": "Mentiones private", "column.directory": "Navigar profilos", "column.domain_blocks": "Dominios blocate", - "column.favourites": "Favoritos", + "column.favourites": "Favorites", "column.firehose": "Fluxos in directo", "column.follow_requests": "Requestas de sequimento", "column.home": "Initio", @@ -204,7 +204,7 @@ "disabled_account_banner.account_settings": "Parametros de conto", "disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.", "dismissable_banner.community_timeline": "Ecce le messages public le plus recente del personas con contos sur {domain}.", - "dismissable_banner.dismiss": "Dimitter", + "dismissable_banner.dismiss": "Clauder", "dismissable_banner.explore_links": "Istes es le articulos de novas que se condivide le plus sur le rete social hodie. Le articulos de novas le plus recente, publicate per plus personas differente, se classifica plus in alto.", "dismissable_banner.explore_statuses": "Ecce le messages de tote le rete social que gania popularitate hodie. Le messages plus nove con plus impulsos e favorites se classifica plus in alto.", "dismissable_banner.explore_tags": "Ecce le hashtags que gania popularitate sur le rete social hodie. Le hashtags usate per plus personas differente se classifica plus in alto.", @@ -212,8 +212,8 @@ "domain_block_modal.block": "Blocar le servitor", "domain_block_modal.block_account_instead": "Blocar @{name} in su loco", "domain_block_modal.they_can_interact_with_old_posts": "Le personas de iste servitor pote interager con tu messages ancian.", - "domain_block_modal.they_cant_follow": "Nulle persona ab iste servitor pote sequer te.", - "domain_block_modal.they_wont_know": "Illes non sapera que illes ha essite blocate.", + "domain_block_modal.they_cant_follow": "Necuno de iste servitor pote sequer te.", + "domain_block_modal.they_wont_know": "Ille non sapera que ille ha essite blocate.", "domain_block_modal.title": "Blocar dominio?", "domain_block_modal.you_will_lose_followers": "Omne sequitores ab iste servitor essera removite.", "domain_block_modal.you_wont_see_posts": "Tu non videra messages e notificationes ab usatores sur iste servitor.", @@ -307,7 +307,9 @@ "follow_request.reject": "Rejectar", "follow_requests.unlocked_explanation": "Benque tu conto non es serrate, le personal de {domain} pensa que es un bon idea que tu revide manualmente le sequente requestas de iste contos.", "follow_suggestions.curated_suggestion": "Selection del equipa", - "follow_suggestions.dismiss": "Non monstrar novemente", + "follow_suggestions.dismiss": "Non monstrar de novo", + "follow_suggestions.featured_longer": "Seligite con cura per le equipa de {domain}", + "follow_suggestions.friends_of_friends_longer": "Popular inter le gente que tu seque", "follow_suggestions.hints.featured": "Iste profilo ha essite seligite manualmente per le equipa de {domain}.", "follow_suggestions.hints.friends_of_friends": "Iste profilo es popular inter le gente que tu seque.", "follow_suggestions.hints.most_followed": "Iste profilo es un del plus sequites sur {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Iste profilo es similar al profilos que tu ha recentemente sequite.", "follow_suggestions.personalized_suggestion": "Suggestion personalisate", "follow_suggestions.popular_suggestion": "Suggestion personalisate", + "follow_suggestions.popular_suggestion_longer": "Popular sur {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similar al profilos que tu ha sequite recentemente", "follow_suggestions.view_all": "Vider toto", "follow_suggestions.who_to_follow": "Qui sequer", "followed_tags": "Hashtags sequite", @@ -408,7 +412,7 @@ "lightbox.next": "Sequente", "lightbox.previous": "Precedente", "limited_account_hint.action": "Monstrar profilo in omne caso", - "limited_account_hint.title": "Iste profilo esseva celate per le moderatores de {domain}.", + "limited_account_hint.title": "Iste profilo ha essite celate per le moderatores de {domain}.", "link_preview.author": "Per {name}", "lists.account.add": "Adder al lista", "lists.account.remove": "Remover del lista", @@ -428,12 +432,12 @@ "loading_indicator.label": "Cargante…", "media_gallery.toggle_visible": "{number, plural, one {Celar imagine} other {Celar imagines}}", "moved_to_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate perque tu ha cambiate de conto a {movedToAccount}.", - "mute_modal.hide_from_notifications": "Celar ab notificationes", + "mute_modal.hide_from_notifications": "Celar in notificationes", "mute_modal.hide_options": "Celar optiones", "mute_modal.indefinite": "Usque io dissilentia iste persona", "mute_modal.show_options": "Monstrar optiones", - "mute_modal.they_can_mention_and_follow": "Illes pote mentionar te e sequer te, ma tu non potera vider los.", - "mute_modal.they_wont_know": "Illes non sapera que illes ha essite silentiate.", + "mute_modal.they_can_mention_and_follow": "Ille pote mentionar te e sequer te, ma tu non potera vider le.", + "mute_modal.they_wont_know": "Ille non sapera que ille ha essite silentiate.", "mute_modal.title": "Silentiar le usator?", "mute_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.", "mute_modal.you_wont_see_posts": "Iste persona pote totevia vider tu messages, ma tu non videra le sues.", @@ -447,13 +451,13 @@ "navigation_bar.discover": "Discoperir", "navigation_bar.domain_blocks": "Dominios blocate", "navigation_bar.explore": "Explorar", - "navigation_bar.favourites": "Favoritos", + "navigation_bar.favourites": "Favorites", "navigation_bar.filters": "Parolas silentiate", "navigation_bar.follow_requests": "Requestas de sequimento", "navigation_bar.followed_tags": "Hashtags sequite", "navigation_bar.follows_and_followers": "Sequites e sequitores", "navigation_bar.lists": "Listas", - "navigation_bar.logout": "Clauder le session", + "navigation_bar.logout": "Clauder session", "navigation_bar.mutes": "Usatores silentiate", "navigation_bar.opened_in_classic_interface": "Messages, contos e altere paginas specific es aperite per predefinition in le interfacie web classic.", "navigation_bar.personal": "Personal", @@ -469,6 +473,15 @@ "notification.follow": "{name} te ha sequite", "notification.follow_request": "{name} ha requestate de sequer te", "notification.mention": "{name} te ha mentionate", + "notification.moderation-warning.learn_more": "Apprender plus", + "notification.moderation_warning": "Tu ha recepite un aviso de moderation", + "notification.moderation_warning.action_delete_statuses": "Alcunes de tu messages ha essite removite.", + "notification.moderation_warning.action_disable": "Tu conto ha essite disactivate.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Alcunes de tu messages ha essite marcate como sensibile.", + "notification.moderation_warning.action_none": "Tu conto ha recipite un advertimento de moderation.", + "notification.moderation_warning.action_sensitive": "Tu messages essera marcate como sensibile a partir de ora.", + "notification.moderation_warning.action_silence": "Tu conto ha essite limitate.", + "notification.moderation_warning.action_suspend": "Tu conto ha essite suspendite.", "notification.own_poll": "Tu sondage ha finite", "notification.poll": "Un sondage in le qual tu ha votate ha finite", "notification.reblog": "{name} ha impulsate tu message", @@ -488,7 +501,7 @@ "notifications.column_settings.admin.report": "Nove signalationes:", "notifications.column_settings.admin.sign_up": "Nove inscriptiones:", "notifications.column_settings.alert": "Notificationes de scriptorio", - "notifications.column_settings.favourite": "Favoritos:", + "notifications.column_settings.favourite": "Favorites:", "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias", "notifications.column_settings.filter_bar.category": "Barra de filtro rapide", "notifications.column_settings.follow": "Nove sequitores:", @@ -505,7 +518,7 @@ "notifications.column_settings.update": "Modificationes:", "notifications.filter.all": "Toto", "notifications.filter.boosts": "Impulsos", - "notifications.filter.favourites": "Favoritos", + "notifications.filter.favourites": "Favorites", "notifications.filter.follows": "Sequites", "notifications.filter.mentions": "Mentiones", "notifications.filter.polls": "Resultatos del sondage", @@ -704,7 +717,7 @@ "status.edited": "Ultime modification le {date}", "status.edited_x_times": "Modificate {count, plural, one {{count} vice} other {{count} vices}}", "status.embed": "Incastrar", - "status.favourite": "Adder al favoritos", + "status.favourite": "Adder al favorites", "status.favourites": "{count, plural, one {favorite} other {favorites}}", "status.filter": "Filtrar iste message", "status.filtered": "Filtrate", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 8d491412c..192150947 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -89,6 +89,7 @@ "announcement.announcement": "Proclamation", "attachments_list.unprocessed": "(íntractat)", "audio.hide": "Celar audio", + "block_modal.remote_users_caveat": "Noi va petir que li servitor {domain} mey respecter tui decision. Támen, obedientie ne es garantit pro que chascun servitor gere bloccas diferentmen. Possibilmen public postas va restar visibil a usatores de inloggat.", "block_modal.show_less": "Monstrar minu", "block_modal.show_more": "Monstrar plu", "block_modal.they_cant_mention": "Ne posse mentionar ni sequer te.", @@ -212,13 +213,23 @@ "domain_block_modal.block_account_instead": "Altrimen, bloccar @{name}", "domain_block_modal.they_can_interact_with_old_posts": "Persones de ti servitor posse interacter con tui old postas.", "domain_block_modal.they_cant_follow": "Nequi de ti-ci servitor posse sequer te.", + "domain_block_modal.they_wont_know": "Ne va esser conscient pri li bloccada.", + "domain_block_modal.title": "Bloccar dominia?", + "domain_block_modal.you_will_lose_followers": "Omni tui sequitores de ti-ci servitor va esser efaciat.", + "domain_block_modal.you_wont_see_posts": "Tu ne va vider postas ni notificationes de usatores sur ti-ci servitor.", + "domain_pill.activitypub_lets_connect": "It possibilisa tui conexiones e interactiones con persones ne solmen sur Mastodon, ma anc tra diferent social aplis.", "domain_pill.activitypub_like_language": "ActivityPub es li lingue usat de Mastodon por parlar con altri social retages.", "domain_pill.server": "Servitor", "domain_pill.their_handle": "Identificator:", "domain_pill.their_server": "Su digital hem e omni su postas.", + "domain_pill.their_username": "Su unic identificator sur su servitor. It es possibil que altri servitores va haver usatores con li sam nómine.", "domain_pill.username": "Usator-nómine", "domain_pill.whats_in_a_handle": "Ex quo consiste un identificator?", + "domain_pill.who_they_are": "Pro que identificatores informa qui e u un person is, tu posse interacter con persones tra li rete social de .", + "domain_pill.who_you_are": "Pro que tui identificator informa qui e u tu es, persones posse interacter con te tra li rete social de .", "domain_pill.your_handle": "Tui identificator:", + "domain_pill.your_server": "Tui digital hem, u trova se omni tui postas. Si it ne plese te, tu posse transferer ad un altri servitor quandecunc e tui sequitores con te.", + "domain_pill.your_username": "Tui unic identificator sur ti-ci servitor. It es possibil que altri servitores va haver usatores con li sam nómine.", "embed.instructions": "Inbedar ti-ci posta per copiar li code in infra.", "embed.preview": "Vi qualmen it va aspecter:", "emoji_button.activity": "Activitá", @@ -286,6 +297,7 @@ "filter_modal.select_filter.subtitle": "Usar un existent categorie o crear nov", "filter_modal.select_filter.title": "Filtrar ti-ci posta", "filter_modal.title.status": "Filtrar un posta", + "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentiones}}", "filtered_notifications_banner.pending_requests": "Notificationes de {count, plural, =0 {nequi} one {un person} other {# persones}} quel tu possibilmen conosse", "filtered_notifications_banner.title": "Filtrat notificationes", "firehose.all": "Omno", @@ -296,6 +308,8 @@ "follow_requests.unlocked_explanation": "Benque tu conto ne es cludet, li administratores de {domain} pensat que tu fórsan vell voler tractar seque-petitiones de tis-ci contos manualmen.", "follow_suggestions.curated_suggestion": "Selection del employates", "follow_suggestions.dismiss": "Ne monstrar plu", + "follow_suggestions.featured_longer": "Selectet manualmen del equip de {domain}", + "follow_suggestions.friends_of_friends_longer": "Populari ínter li persones queles tu seque", "follow_suggestions.hints.featured": "Ti-ci profil ha esset selectet directmen del equip de {domain}.", "follow_suggestions.hints.friends_of_friends": "Ti-ci profil es populari ínter tis qui tu seque.", "follow_suggestions.hints.most_followed": "Ti-ci profil es un del max sequet sur {domain}.", @@ -303,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Ti-ci profil es simil al profiles queles tu ha recentmen sequet.", "follow_suggestions.personalized_suggestion": "Personalisat suggestion", "follow_suggestions.popular_suggestion": "Populari suggestion", + "follow_suggestions.popular_suggestion_longer": "Populari sur {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Simil a profiles queles tu sequet recentmen", "follow_suggestions.view_all": "Vider omnicos", "follow_suggestions.who_to_follow": "Persones a sequer", "followed_tags": "Sequet hashtags", @@ -423,6 +439,8 @@ "mute_modal.they_can_mention_and_follow": "Posse mentionar e sequer te, ma va esser ínvisibil a te.", "mute_modal.they_wont_know": "Ne va esser conscient pri li silentation.", "mute_modal.title": "Silentiar usator?", + "mute_modal.you_wont_see_mentions": "Tu ne va vider postas mentionant li usator.", + "mute_modal.you_wont_see_posts": "Ne posse vider tui postas e inversi.", "navigation_bar.about": "Information", "navigation_bar.advanced_interface": "Aperter in li web-interfacie avansat", "navigation_bar.blocks": "Bloccat usatores", @@ -455,10 +473,23 @@ "notification.follow": "{name} sequet te", "notification.follow_request": "{name} ha petit sequer te", "notification.mention": "{name} mentionat te", + "notification.moderation-warning.learn_more": "Aprender plu", + "notification.moderation_warning": "Tu ha recivet un moderatori advertiment", + "notification.moderation_warning.action_delete_statuses": "Alcun de tui postas ha esset efaciat.", + "notification.moderation_warning.action_disable": "Tui conto ha esset desactivisat.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Alcun de tui postas ha esset marcat quam sensitiv.", + "notification.moderation_warning.action_none": "Tui conto ha recivet un moderatori advertiment.", + "notification.moderation_warning.action_sensitive": "Desde nu tui postas va esser marcat quam sensitiv.", + "notification.moderation_warning.action_silence": "Tui conto ha esset limitat.", + "notification.moderation_warning.action_suspend": "Tui conto ha esset suspendet.", "notification.own_poll": "Tui balotation ha finit", "notification.poll": "Un balotation in quel tu votat ha finit", "notification.reblog": "{name} boostat tui posta", + "notification.relationships_severance_event": "Perdit conexiones con {name}", + "notification.relationships_severance_event.account_suspension": "Un admin de {from} ha suspendet {target}, dunc con ti person tu ne plu posse reciver actualisationes ni far interactiones.", + "notification.relationships_severance_event.domain_block": "Un admin de {from} ha bloccat {target}, includente {followersCount} de tui sequitores e {followingCount, plural, one {# conto} other {# contos}} sequet de te.", "notification.relationships_severance_event.learn_more": "Aprender plu", + "notification.relationships_severance_event.user_domain_block": "Tu ha bloccat {target}, efaciante {followersCount} de tui sequitores e {followingCount, plural, one {# conto} other {# contos}} sequet de te.", "notification.status": "{name} just postat", "notification.update": "{name} modificat un posta", "notification_requests.accept": "Acceptar", @@ -472,6 +503,7 @@ "notifications.column_settings.alert": "Notificationes sur li computator", "notifications.column_settings.favourite": "Favorites:", "notifications.column_settings.filter_bar.advanced": "Monstrar omni categories", + "notifications.column_settings.filter_bar.category": "Rapid filtre-barre", "notifications.column_settings.follow": "Nov sequitores:", "notifications.column_settings.follow_request": "Nov petitiones de sequer:", "notifications.column_settings.mention": "Mentiones:", @@ -707,6 +739,7 @@ "status.reblog": "Boostar", "status.reblog_private": "Boostar con li original visibilitá", "status.reblogged_by": "{name} boostat", + "status.reblogs": "{count, plural, one {boost} other {boosts}}", "status.reblogs.empty": "Ancor nequi ha boostat ti-ci posta. Quande alqui fa it, ilu va aparir ci.", "status.redraft": "Deleter & redacter", "status.remove_bookmark": "Remover marcator", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 8ab5db1b1..f66497e0a 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -414,6 +414,7 @@ "limited_account_hint.action": "Mostra comunque il profilo", "limited_account_hint.title": "Questo profilo è stato nascosto dai moderatori di {domain}.", "link_preview.author": "Di {name}", + "link_preview.more_from_author": "Altro da {name}", "lists.account.add": "Aggiungi all'elenco", "lists.account.remove": "Rimuovi dall'elenco", "lists.delete": "Elimina elenco", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index f20d93753..eea06fff5 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -299,7 +299,7 @@ "filter_modal.title.status": "投稿をフィルターする", "filtered_notifications_banner.mentions": "{count, plural, one {メンション} other {メンション}}", "filtered_notifications_banner.pending_requests": "{count, plural, =0 {通知がブロックされているアカウントはありません} other {#アカウントからの通知がブロックされています}}", - "filtered_notifications_banner.title": "ブロック済みの通知", + "filtered_notifications_banner.title": "保留中の通知", "firehose.all": "すべて", "firehose.local": "このサーバー", "firehose.remote": "ほかのサーバー", @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "あなたのアカウントは承認制ではありませんが、{domain}のスタッフはこれらのアカウントからのフォローリクエストの確認が必要であると判断しました。", "follow_suggestions.curated_suggestion": "サーバースタッフ公認", "follow_suggestions.dismiss": "今後表示しない", + "follow_suggestions.featured_longer": "{domain} スタッフ公認", + "follow_suggestions.friends_of_friends_longer": "フォロー中のユーザーに人気", "follow_suggestions.hints.featured": "{domain} の運営スタッフが選んだアカウントです。", "follow_suggestions.hints.friends_of_friends": "フォロー中のユーザーのあいだで人気のアカウントです。", "follow_suggestions.hints.most_followed": "{domain} でもっともフォローされているアカウントのひとつです。", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "最近フォローしたユーザーに似ているアカウントです。", "follow_suggestions.personalized_suggestion": "フォローに基づく提案", "follow_suggestions.popular_suggestion": "人気のアカウント", + "follow_suggestions.popular_suggestion_longer": "{domain} で人気", + "follow_suggestions.similar_to_recently_followed_longer": "最近フォローしたユーザーと似ているアカウント", "follow_suggestions.view_all": "すべて表示", "follow_suggestions.who_to_follow": "フォローを増やしてみませんか?", "followed_tags": "フォロー中のハッシュタグ", @@ -469,6 +473,15 @@ "notification.follow": "{name}さんにフォローされました", "notification.follow_request": "{name}さんがあなたにフォローリクエストしました", "notification.mention": "{name}さんがあなたに返信しました", + "notification.moderation-warning.learn_more": "さらに詳しく", + "notification.moderation_warning": "管理者から警告が来ています", + "notification.moderation_warning.action_delete_statuses": "あなたによるいくつかの投稿が削除されました。", + "notification.moderation_warning.action_disable": "あなたのアカウントは無効になりました。", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "あなたの投稿のいくつかは閲覧注意として判定されています。", + "notification.moderation_warning.action_none": "あなたのアカウントは管理者からの警告を受けています。", + "notification.moderation_warning.action_sensitive": "あなたの投稿はこれから閲覧注意としてマークされます。", + "notification.moderation_warning.action_silence": "あなたのアカウントは制限されています。", + "notification.moderation_warning.action_suspend": "あなたのアカウントは停止されました。", "notification.own_poll": "アンケートが終了しました", "notification.poll": "アンケートが終了しました", "notification.reblog": "{name}さんがあなたの投稿をブーストしました", @@ -482,7 +495,7 @@ "notification_requests.accept": "受け入れる", "notification_requests.dismiss": "無視", "notification_requests.notifications_from": "{name}からの通知", - "notification_requests.title": "ブロック済みの通知", + "notification_requests.title": "保留中の通知", "notifications.clear": "通知を消去", "notifications.clear_confirmation": "本当に通知を消去しますか?", "notifications.column_settings.admin.report": "新しい通報:", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 8628dbb33..7cd74fa50 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -234,7 +234,7 @@ "embed.preview": "이렇게 표시됩니다:", "emoji_button.activity": "활동", "emoji_button.clear": "지우기", - "emoji_button.custom": "사용자 지정", + "emoji_button.custom": "커스텀", "emoji_button.flags": "깃발", "emoji_button.food": "음식과 마실것", "emoji_button.label": "에모지 추가", @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "귀하의 계정이 잠긴 계정이 아닐지라도, {domain} 스태프는 이 계정들의 팔로우 요청을 수동으로 처리해 주시면 좋겠다고 생각했습니다.", "follow_suggestions.curated_suggestion": "스태프의 추천", "follow_suggestions.dismiss": "다시 보지 않기", + "follow_suggestions.featured_longer": "{domain} 팀이 손수 고름", + "follow_suggestions.friends_of_friends_longer": "내가 팔로우 하는 사람들 사이에서 인기", "follow_suggestions.hints.featured": "이 프로필은 {domain} 팀이 손수 선택했습니다.", "follow_suggestions.hints.friends_of_friends": "이 프로필은 내가 팔로우 하는 사람들에게서 유명합니다.", "follow_suggestions.hints.most_followed": "이 프로필은 {domain}에서 가장 많이 팔로우 된 사람들 중 하나입니다.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "이 프로필은 내가 최근에 팔로우 한 프로필들과 유사합니다.", "follow_suggestions.personalized_suggestion": "개인화된 추천", "follow_suggestions.popular_suggestion": "인기있는 추천", + "follow_suggestions.popular_suggestion_longer": "{domain}에서 인기", + "follow_suggestions.similar_to_recently_followed_longer": "내가 최근에 팔로우 한 프로필들과 유사", "follow_suggestions.view_all": "모두 보기", "follow_suggestions.who_to_follow": "팔로우할 만한 사람", "followed_tags": "팔로우 중인 해시태그", @@ -410,6 +414,7 @@ "limited_account_hint.action": "그래도 프로필 보기", "limited_account_hint.title": "이 프로필은 {domain}의 중재자에 의해 숨겨진 상태입니다.", "link_preview.author": "{name}", + "link_preview.more_from_author": "{name} 더 둘러보기", "lists.account.add": "리스트에 추가", "lists.account.remove": "리스트에서 제거", "lists.delete": "리스트 삭제", @@ -469,6 +474,15 @@ "notification.follow": "{name} 님이 나를 팔로우했습니다", "notification.follow_request": "{name} 님이 팔로우 요청을 보냈습니다", "notification.mention": "{name} 님의 멘션", + "notification.moderation-warning.learn_more": "더 알아보기", + "notification.moderation_warning": "중재 경고를 받았습니다", + "notification.moderation_warning.action_delete_statuses": "게시물 몇 개가 삭제되었습니다.", + "notification.moderation_warning.action_disable": "계정이 비활성화되었습니다.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "게시물 몇 개가 민감함 처리되었습니다.", + "notification.moderation_warning.action_none": "계정에 중재 경고를 받았습니다.", + "notification.moderation_warning.action_sensitive": "앞으로의 게시물을 민감한 것으로 표시됩니다.", + "notification.moderation_warning.action_silence": "계정이 제한되었습니다.", + "notification.moderation_warning.action_suspend": "계정이 정지되었습니다.", "notification.own_poll": "설문을 마침", "notification.poll": "참여한 설문이 종료됨", "notification.reblog": "{name} 님이 부스트했습니다", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index cf6c3f772..533f07400 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -295,6 +295,7 @@ "follow_requests.unlocked_explanation": "Aunke tu kuento no esta serrado, la taifa de {domain} kreye ke talvez keres revizar manualmente las solisitudes de segimento de estos kuentos.", "follow_suggestions.curated_suggestion": "Seleksyon de la taifa", "follow_suggestions.dismiss": "No amostra mas", + "follow_suggestions.friends_of_friends_longer": "Popular entre personas a las kualas siges", "follow_suggestions.hints.featured": "Este profil tiene sido eskojido por la taifa de {domain}.", "follow_suggestions.hints.friends_of_friends": "Este profil es popular entre las personas ke siges.", "follow_suggestions.hints.most_followed": "Este profil es uno de los mas segidos en {domain}.", @@ -454,6 +455,9 @@ "notification.follow": "{name} te ampeso a segir", "notification.follow_request": "{name} tiene solisitado segirte", "notification.mention": "{name} te enmento", + "notification.moderation-warning.learn_more": "Ambezate mas", + "notification.moderation_warning.action_silence": "Tu kuento tiene sido limitado.", + "notification.moderation_warning.action_suspend": "Tu kuento tiene sido suspendido.", "notification.own_poll": "Tu anketa eskapo", "notification.poll": "Anketa en ke votates eskapo", "notification.reblog": "{name} repartajo tu publikasyon", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 7b3511cfe..5fc7d3286 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -1,7 +1,7 @@ { "about.blocks": "Prižiūrimi serveriai", "about.contact": "Kontaktai:", - "about.disclaimer": "Mastodon – nemokama atvirojo kodo programa ir Mastodon gGmbH prekės ženklas.", + "about.disclaimer": "Mastodon – tai nemokama atvirojo kodo programinė įranga ir Mastodon gGmbH prekės ženklas.", "about.domain_blocks.no_reason_available": "Priežastis nepateikta", "about.domain_blocks.preamble": "Mastodon paprastai leidžia peržiūrėti turinį ir bendrauti su naudotojais iš bet kurio kito fediverse esančio serverio. Šios yra išimtys, kurios buvo padarytos šiame konkrečiame serveryje.", "about.domain_blocks.silenced.explanation": "Paprastai nematysi profilių ir turinio iš šio serverio, nebent jį aiškiai ieškosi arba pasirinksi jį sekdamas (-a).", @@ -30,7 +30,7 @@ "account.endorse": "Rodyti profilyje", "account.featured_tags.last_status_at": "Paskutinis įrašas {date}", "account.featured_tags.last_status_never": "Nėra įrašų", - "account.featured_tags.title": "{name} rekomenduojami saitažodžiai", + "account.featured_tags.title": "{name} rodomi saitažodžiai", "account.follow": "Sekti", "account.follow_back": "Sekti atgal", "account.followers": "Sekėjai", @@ -38,13 +38,13 @@ "account.followers_counter": "{count, plural, one {{counter} sekėjas} few {{counter} sekėjai} many {{counter} sekėjo} other {{counter} sekėjų}}", "account.following": "Sekama", "account.following_counter": "{count, plural, one {{counter} sekimas} few {{counter} sekimai} many {{counter} sekimo} other {{counter} sekimų}}", - "account.follows.empty": "Šis (-i) naudotojas (-a) dar nieko neseka.", + "account.follows.empty": "Šis naudotojas dar nieko neseka.", "account.go_to_profile": "Eiti į profilį", "account.hide_reblogs": "Slėpti pakėlimus iš @{name}", "account.in_memoriam": "Atminimui.", "account.joined_short": "Prisijungė", "account.languages": "Keisti prenumeruojamas kalbas", - "account.link_verified_on": "Šios nuorodos nuosavybė buvo patikrinta {date}.", + "account.link_verified_on": "Šios nuorodos nuosavybė buvo patikrinta {date}", "account.locked_info": "Šios paskyros privatumo būsena nustatyta kaip užrakinta. Savininkas (-ė) rankiniu būdu peržiūri, kas gali sekti.", "account.media": "Medija", "account.mention": "Paminėti @{name}", @@ -59,7 +59,7 @@ "account.posts": "Įrašai", "account.posts_with_replies": "Įrašai ir atsakymai", "account.report": "Pranešti apie @{name}", - "account.requested": "Laukiama patvirtinimo. Spustelėk, jei nori atšaukti sekimo prašymą.", + "account.requested": "Laukiama patvirtinimo. Spustelėk, jei nori atšaukti sekimo prašymą", "account.requested_follow": "{name} paprašė tave sekti", "account.share": "Bendrinti @{name} profilį", "account.show_reblogs": "Rodyti pakėlimus iš @{name}", @@ -82,7 +82,7 @@ "admin.impact_report.instance_followers": "Sekėjai, kuriuos prarastų mūsų naudotojai", "admin.impact_report.instance_follows": "Sekėjai, kuriuos prarastų jų naudotojai", "admin.impact_report.title": "Poveikio apibendrinimas", - "alert.rate_limited.message": "Pabandyk vėliau po {retry_time, time, medium}.", + "alert.rate_limited.message": "Bandyk vėliau po {retry_time, time, medium}.", "alert.rate_limited.title": "Sparta ribota.", "alert.unexpected.message": "Įvyko netikėta klaida.", "alert.unexpected.title": "Ups!", @@ -92,7 +92,12 @@ "block_modal.remote_users_caveat": "Paprašysime serverio {domain} gerbti tavo sprendimą. Tačiau atitiktis negarantuojama, nes kai kurie serveriai gali skirtingai tvarkyti blokavimus. Vieši įrašai vis tiek gali būti matomi neprisijungusiems naudotojams.", "block_modal.show_less": "Rodyti mažiau", "block_modal.show_more": "Rodyti daugiau", - "boost_modal.combo": "Galima paspausti {combo}, kad praleisti kitą kartą.", + "block_modal.they_cant_mention": "Jie negali tave paminėti ar sekti.", + "block_modal.they_cant_see_posts": "Jie negali matyti tavo įrašus, o tu nematysi jų.", + "block_modal.they_will_know": "Jie mato, kad yra užblokuoti.", + "block_modal.title": "Blokuoti naudotoją?", + "block_modal.you_wont_see_mentions": "Nematysi įrašus, kuriuose jie paminimi.", + "boost_modal.combo": "Galima paspausti {combo}, kad praleisti tai kitą kartą", "bundle_column_error.copy_stacktrace": "Kopijuoti klaidos ataskaitą", "bundle_column_error.error.body": "Paprašytos puslapio nepavyko atvaizduoti. Tai gali būti dėl mūsų kodo klaidos arba naršyklės suderinamumo problemos.", "bundle_column_error.error.title": "O, ne!", @@ -117,7 +122,7 @@ "column.direct": "Privatūs paminėjimai", "column.directory": "Naršyti profilius", "column.domain_blocks": "Užblokuoti domenai", - "column.favourites": "Mėgstamiausi", + "column.favourites": "Mėgstami", "column.firehose": "Tiesioginiai srautai", "column.follow_requests": "Sekimo prašymai", "column.home": "Pagrindinis", @@ -143,8 +148,8 @@ "compose.published.open": "Atidaryti", "compose.saved.body": "Įrašas išsaugotas.", "compose_form.direct_message_warning_learn_more": "Sužinoti daugiau", - "compose_form.encryption_warning": "Mastodon įrašai nėra šifruojami nuo galo iki galo. Per Mastodon nesidalyk jokia slapta informacija.", - "compose_form.hashtag_warning": "Šis įrašas nebus įtraukta į jokį saitažodį, nes ji nėra vieša. Tik viešų įrašų galima ieškoti pagal saitažodį.", + "compose_form.encryption_warning": "Mastodon įrašai nėra visapusiškai šifruojami. Per Mastodon nesidalyk jokia slapta informacija.", + "compose_form.hashtag_warning": "Šis įrašas nebus įtrauktas į jokį saitažodį, nes ji nėra vieša. Tik viešų įrašų galima ieškoti pagal saitažodį.", "compose_form.lock_disclaimer": "Tavo paskyra nėra {locked}. Bet kas gali sekti tave ir peržiūrėti tik sekėjams skirtus įrašus.", "compose_form.lock_disclaimer.lock": "užrakinta", "compose_form.placeholder": "Kas tavo mintyse?", @@ -152,7 +157,7 @@ "compose_form.poll.multiple": "Keli pasirinkimai", "compose_form.poll.option_placeholder": "{number} parinktis", "compose_form.poll.single": "Pasirinkti vieną", - "compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus.", + "compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus", "compose_form.poll.switch_to_single": "Keisti apklausą, kad būtų galima pasirinkti vieną pasirinkimą", "compose_form.poll.type": "Stilius", "compose_form.publish": "Skelbti", @@ -172,16 +177,17 @@ "confirmations.delete_list.message": "Ar tikrai nori visam laikui ištrinti šį sąrašą?", "confirmations.discard_edit_media.confirm": "Atmesti", "confirmations.discard_edit_media.message": "Turi neišsaugotų medijos aprašymo ar peržiūros pakeitimų, vis tiek juos atmesti?", + "confirmations.domain_block.confirm": "Blokuoti serverį", "confirmations.domain_block.message": "Ar tikrai, tikrai nori užblokuoti visą {domain}? Daugeliu atvejų užtenka kelių tikslinių blokavimų arba nutildymų. Šio domeno turinio nematysi jokiose viešose laiko skalėse ar pranešimuose. Tavo sekėjai iš to domeno bus pašalinti.", "confirmations.edit.confirm": "Redaguoti", "confirmations.edit.message": "Redaguojant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?", "confirmations.logout.confirm": "Atsijungti", "confirmations.logout.message": "Ar tikrai nori atsijungti?", "confirmations.mute.confirm": "Nutildyti", - "confirmations.redraft.confirm": "Ištrinti ir parengti iš naujo", - "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parengti jį iš naujo kaip juodraštį? Bus prarastos mėgstamiausios ir pakėlimai, o atsakymai į originalinį įrašą taps liekamojais.", + "confirmations.redraft.confirm": "Ištrinti ir perrašyti", + "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parašyti jį iš naujo? Bus prarastos mėgstamai ir pakėlimai, o atsakymai į originalinį įrašą taps liekamojais.", "confirmations.reply.confirm": "Atsakyti", - "confirmations.reply.message": "Atsakant dabar, bus perrašyta metu kuriama žinutė. Ar tikrai nori tęsti?", + "confirmations.reply.message": "Atsakant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?", "confirmations.unfollow.confirm": "Nebesekti", "confirmations.unfollow.message": "Ar tikrai nori nebesekti {name}?", "conversation.delete": "Ištrinti pokalbį", @@ -196,34 +202,42 @@ "directory.new_arrivals": "Nauji atvykėliai", "directory.recently_active": "Neseniai aktyvus (-i)", "disabled_account_banner.account_settings": "Paskyros nustatymai", - "disabled_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta.", - "dismissable_banner.community_timeline": "Tai – naujausi vieši įrašai, kuriuos paskelbė žmonės, kurių paskyros talpinamos {domain}.", + "disabled_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu yra išjungta.", + "dismissable_banner.community_timeline": "Tai – naujausi vieši įrašai iš žmonių, kurių paskyros talpinamos {domain}.", "dismissable_banner.dismiss": "Atmesti", "dismissable_banner.explore_links": "Tai – naujienos, kuriomis šiandien daugiausiai bendrinamasi socialiniame žiniatinklyje. Naujesnės naujienų istorijos, kurias paskelbė daugiau skirtingų žmonių, vertinamos aukščiau.", "dismissable_banner.explore_statuses": "Tai – įrašai iš viso socialinio žiniatinklio, kurie šiandien sulaukia daug dėmesio. Naujesni įrašai, turintys daugiau pakėlimų ir mėgstamų, vertinami aukščiau.", "dismissable_banner.explore_tags": "Tai – saitažodžiai, kurie šiandien sulaukia daug dėmesio socialiniame žiniatinklyje. Saitažodžiai, kuriuos naudoja daugiau skirtingų žmonių, vertinami aukščiau.", - "dismissable_banner.public_timeline": "Tai – naujausi vieši įrašai, kuriuos socialiniame žiniatinklyje paskelbė žmonės, sekantys {domain}.", - "domain_pill.activitypub_lets_connect": "Tai leidžia tau bendrauti su žmonėmis ne tik Mastodon, bet ir įvairiose socialinėse programėlėse.", - "domain_pill.activitypub_like_language": "ActivityPub – tarsi kalba, kuria Mastodon kalba su kitais socialiniais tinklais.", + "dismissable_banner.public_timeline": "Tai – naujausi vieši įrašai iš žmonių socialiniame žiniatinklyje, kuriuos seka {domain} žmonės.", + "domain_block_modal.block": "Blokuoti serverį", + "domain_block_modal.block_account_instead": "Blokuoti {name} vietoj to", + "domain_block_modal.they_can_interact_with_old_posts": "Žmonės iš šio serverio gali sąveikauti su tavo senomis įrašomis.", + "domain_block_modal.they_cant_follow": "Niekas iš šio serverio negali tavęs sekti.", + "domain_block_modal.they_wont_know": "Jie nežinos, kad buvo užblokuoti.", + "domain_block_modal.title": "Blokuoti domeną?", + "domain_block_modal.you_will_lose_followers": "Visi tavo sekėjai iš šio serverio bus pašalinti.", + "domain_block_modal.you_wont_see_posts": "Nematysi naudotojų įrašų ar pranešimų šiame serveryje.", + "domain_pill.activitypub_lets_connect": "Tai leidžia tau sąveikauti su žmonėmis ne tik Mastodon, bet ir įvairiose socialinėse programėlėse.", + "domain_pill.activitypub_like_language": "ActivityPub – tai tarsi kalba, kuria Mastodon kalba su kitais socialiniais tinklais.", "domain_pill.server": "Serveris", "domain_pill.their_handle": "Jų socialinis medijos vardas:", "domain_pill.their_server": "Jų skaitmeniniai namai, kuriuose saugomi visi jų įrašai.", "domain_pill.their_username": "Jų unikalus identifikatorius jų serveryje. Skirtinguose serveriuose galima rasti naudotojų, turinčių tą patį naudotojo vardą.", "domain_pill.username": "Naudotojo vardas", "domain_pill.whats_in_a_handle": "Kas yra socialiniame medijos varde?", - "domain_pill.who_they_are": "Kadangi socialines medijos vardai nurodo, kas ir kur jie yra, galima bendrauti su žmonėmis visame socialiniame tinkle, kuriame yra .", - "domain_pill.who_you_are": "Kadangi tavo socialinis medijos vardas nurodo, kas esi ir kur esi, žmonės gali bendrauti su tavimi visame socialiniame tinkle, kurį sudaro .", + "domain_pill.who_they_are": "Kadangi socialines medijos vardai nurodo, kas žmogus yra ir kur jie yra, gali sąveikauti su žmonėmis visame socialiniame žiniatinklyje, kurį sudaro .", + "domain_pill.who_you_are": "Kadangi tavo socialinis medijos vardas nurodo, kas esi ir kur esi, žmonės gali sąveikauti su tavimi visame socialiniame tinkle, kurį sudaro .", "domain_pill.your_handle": "Tavo socialinis medijos vardas:", "domain_pill.your_server": "Tavo skaitmeniniai namai, kuriuose saugomi visi tavo įrašai. Nepatinka šis? Bet kada perkelk serverius ir atsivesk ir savo sekėjus.", - "domain_pill.your_username": "Tavo unikalus identifikatorius šiame serveryje. Skirtinguose serveriuose galima rasti naudotojų, turinčių tą patį naudotojo vardą.", + "domain_pill.your_username": "Tavo unikalus identifikatorius šiame serveryje. Skirtinguose serveriuose galima rasti naudotojų su tuo pačiu naudotojo vardu.", "embed.instructions": "Įterpk šį įrašą į savo svetainę nukopijavus (-usi) toliau pateiktą kodą.", - "embed.preview": "Štai, kaip tai atrodys:", + "embed.preview": "Štai kaip tai atrodys:", "emoji_button.activity": "Veikla", "emoji_button.clear": "Išvalyti", "emoji_button.custom": "Pasirinktinis", "emoji_button.flags": "Vėliavos", "emoji_button.food": "Maistas ir gėrimai", - "emoji_button.label": "Įterpti veidelius", + "emoji_button.label": "Įterpti jaustuką", "emoji_button.nature": "Gamta", "emoji_button.not_found": "Nerasta jokių tinkamų jaustukų.", "emoji_button.objects": "Objektai", @@ -234,26 +248,27 @@ "emoji_button.symbols": "Simboliai", "emoji_button.travel": "Kelionės ir vietos", "empty_column.account_hides_collections": "Šis (-i) naudotojas (-a) pasirinko nepadaryti šią informaciją prieinamą.", - "empty_column.account_suspended": "Paskyra sustabdyta.", - "empty_column.account_timeline": "Nėra įrašų čia.", + "empty_column.account_suspended": "Paskyra pristabdyta.", + "empty_column.account_timeline": "Nėra čia įrašų.", "empty_column.account_unavailable": "Profilis neprieinamas.", "empty_column.blocks": "Dar neužblokavai nė vieno naudotojo.", - "empty_column.bookmarked_statuses": "Dar neturi nė vienos įrašo žymės. Kai vieną iš jų pridėsi į žymes, jis bus rodomas čia.", - "empty_column.community": "Vietinė laiko skalė tuščia. Parašyk ką nors viešai, kad pradėtum bendrauti!", + "empty_column.bookmarked_statuses": "Dar neturi nė vienos įrašo pridėtos žymės. Kai vieną iš jų pridėsi į žymes, jis bus rodomas čia.", + "empty_column.community": "Vietinė laiko skalė yra tuščia. Parašyk ką nors viešai, kad pradėtum sąveikauti.", "empty_column.direct": "Dar neturi jokių privačių paminėjimų. Kai išsiųsi arba gausi vieną iš jų, jis bus rodomas čia.", "empty_column.domain_blocks": "Dar nėra užblokuotų domenų.", - "empty_column.explore_statuses": "Šiuo metu niekas nėra tendencinga. Patikrink vėliau.", + "empty_column.explore_statuses": "Šiuo metu niekas nėra tendencinga. Patikrink vėliau!", "empty_column.favourited_statuses": "Dar neturi mėgstamų įrašų. Kai vieną iš jų pamėgsi, jis bus rodomas čia.", "empty_column.favourites": "Šio įrašo dar niekas nepamėgo. Kai kas nors tai padarys, jie bus rodomi čia.", "empty_column.follow_requests": "Dar neturi jokių sekimo prašymų. Kai gausi tokį prašymą, jis bus rodomas čia.", "empty_column.followed_tags": "Dar neseki jokių saitažodžių. Kai tai padarysi, jie bus rodomi čia.", "empty_column.hashtag": "Nėra nieko šiame saitažodyje kol kas.", - "empty_column.home": "Tavo pagrindinio laiko skalė tuščia! Sek daugiau žmonių, kad ją užpildytum.", + "empty_column.home": "Tavo pagrindinio laiko skalė tuščia. Sek daugiau žmonių, kad ją užpildytum.", "empty_column.list": "Nėra nieko šiame sąraše kol kas. Kai šio sąrašo nariai paskelbs naujų įrašų, jie bus rodomi čia.", "empty_column.lists": "Dar neturi jokių sąrašų. Kai jį sukursi, jis bus rodomas čia.", "empty_column.mutes": "Dar nesi nutildęs (-usi) nė vieno naudotojo.", - "empty_column.notifications": "Dar neturi jokių pranešimų. Kai kiti žmonės su tavimi bendraus, matysi tai čia.", - "empty_column.public": "Čia nieko nėra! Parašyk ką nors viešai arba rankiniu būdu sek naudotojus iš kitų serverių, kad jį užpildytum.", + "empty_column.notification_requests": "Viskas švaru! Čia nieko nėra. Kai gausi naujų pranešimų, jie bus rodomi čia pagal tavo nustatymus.", + "empty_column.notifications": "Dar neturi jokių pranešimų. Kai kiti žmonės su tavimi sąveikaus, matysi tai čia.", + "empty_column.public": "Čia nieko nėra. Parašyk ką nors viešai arba rankiniu būdu sek naudotojus iš kitų serverių, kad jį užpildytum.", "error.unexpected_crash.explanation": "Dėl mūsų kodo riktos arba naršyklės suderinamumo problemos šis puslapis negalėjo būti rodomas teisingai.", "error.unexpected_crash.explanation_addons": "Šį puslapį nepavyko parodyti teisingai. Šią klaidą greičiausiai sukėlė naršyklės priedas arba automatinio vertimo įrankiai.", "error.unexpected_crash.next_steps": "Pabandyk atnaujinti puslapį. Jei tai nepadeda, galbūt vis dar galėsi naudotis Mastodon per kitą naršyklę arba savąją programėlę.", @@ -270,9 +285,9 @@ "filter_modal.added.context_mismatch_title": "Konteksto neatitikimas.", "filter_modal.added.expired_explanation": "Ši filtro kategorija nustojo galioti. Kad ji būtų taikoma, turėsi pakeisti galiojimo datą.", "filter_modal.added.expired_title": "Baigėsi filtro galiojimas.", - "filter_modal.added.review_and_configure": "Norint peržiūrėti ir toliau konfigūruoti šią filtro kategoriją, eik į nuorodą {settings_link}.", + "filter_modal.added.review_and_configure": "Norint peržiūrėti ir toliau konfigūruoti šią filtro kategoriją, eik į {settings_link}.", "filter_modal.added.review_and_configure_title": "Filtro nustatymai", - "filter_modal.added.settings_link": "nustatymų puslapis", + "filter_modal.added.settings_link": "nustatymų puslapį", "filter_modal.added.short_explanation": "Šis įrašas buvo pridėtas į šią filtro kategoriją: {title}.", "filter_modal.added.title": "Pridėtas filtras.", "filter_modal.select_filter.context_mismatch": "netaikoma šiame kontekste.", @@ -282,6 +297,9 @@ "filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.", "filter_modal.select_filter.title": "Filtruoti šį įrašą", "filter_modal.title.status": "Filtruoti įrašą", + "filtered_notifications_banner.mentions": "{count, plural, one {paminėjimas} few {paminėjimai} many {paminėjimo} other {paminėjimų}}", + "filtered_notifications_banner.pending_requests": "Pranešimai iš {count, plural, =0 {nė vieno} one {vienos žmogaus} few {# žmonių} many {# žmonių} other {# žmonių}}, kuriuos galbūt pažįsti", + "filtered_notifications_banner.title": "Filtruojami pranešimai", "firehose.all": "Visi", "firehose.local": "Šis serveris", "firehose.remote": "Kiti serveriai", @@ -290,13 +308,17 @@ "follow_requests.unlocked_explanation": "Nors tavo paskyra neužrakinta, {domain} personalas mano, kad galbūt norėsi rankiniu būdu patikrinti šių paskyrų sekimo prašymus.", "follow_suggestions.curated_suggestion": "Personalo pasirinkimai", "follow_suggestions.dismiss": "Daugiau nerodyti", + "follow_suggestions.featured_longer": "Rankomis atrinkta {domain} komanda", + "follow_suggestions.friends_of_friends_longer": "Populiarus tarp žmonių, kurių seki", "follow_suggestions.hints.featured": "Šį profilį atrinko {domain} komanda.", "follow_suggestions.hints.friends_of_friends": "Šis profilis yra populiarus tarp žmonių, kuriuos seki.", - "follow_suggestions.hints.most_followed": "Šis profilis yra vienas iš labiausiai sekamų {domain}.", - "follow_suggestions.hints.most_interactions": "Pastaruoju metu šis profilis sulaukia daug dėmesio šiame {domain}.", + "follow_suggestions.hints.most_followed": "Šis profilis yra vienas iš labiausiai sekamų domene {domain}.", + "follow_suggestions.hints.most_interactions": "Pastaruoju metu šis profilis sulaukia daug dėmesio domane {domain}.", "follow_suggestions.hints.similar_to_recently_followed": "Šis profilis panašus į profilius, kuriuos neseniai sekei.", "follow_suggestions.personalized_suggestion": "Suasmenintas pasiūlymas", "follow_suggestions.popular_suggestion": "Populiarus pasiūlymas", + "follow_suggestions.popular_suggestion_longer": "Populiarus domene {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Panašūs į profilius, kuriuos neseniai seki", "follow_suggestions.view_all": "Peržiūrėti viską", "follow_suggestions.who_to_follow": "Ką sekti", "followed_tags": "Sekami saitažodžiai", @@ -307,8 +329,8 @@ "footer.keyboard_shortcuts": "Spartieji klavišai", "footer.privacy_policy": "Privatumo politika", "footer.source_code": "Peržiūrėti šaltinio kodą", - "footer.status": "Būsena", - "generic.saved": "Išsaugoti", + "footer.status": "Statusas", + "generic.saved": "Išsaugota", "getting_started.heading": "Kaip pradėti", "hashtag.column_header.tag_mode.all": "ir {additional}", "hashtag.column_header.tag_mode.any": "ar {additional}", @@ -328,7 +350,7 @@ "home.column_settings.show_reblogs": "Rodyti pakėlimus", "home.column_settings.show_replies": "Rodyti atsakymus", "home.hide_announcements": "Slėpti skelbimus", - "home.pending_critical_update.body": "Kuo greičiau atnaujink savo Mastodon serverį!", + "home.pending_critical_update.body": "Kuo greičiau atnaujink savo Mastodon serverį.", "home.pending_critical_update.link": "Žiūrėti naujinimus", "home.pending_critical_update.title": "Galimas kritinis saugumo naujinimas.", "home.show_announcements": "Rodyti skelbimus", @@ -410,6 +432,7 @@ "loading_indicator.label": "Kraunama…", "media_gallery.toggle_visible": "{number, plural, one {Slėpti vaizdą} few {Slėpti vaizdus} many {Slėpti vaizdo} other {Slėpti vaizdų}}", "moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta, nes persikėlei į {movedToAccount}.", + "mute_modal.show_options": "Rodyti parinktis", "navigation_bar.about": "Apie", "navigation_bar.advanced_interface": "Atidaryti išplėstinę žiniatinklio sąsają", "navigation_bar.blocks": "Užblokuoti naudotojai", @@ -442,6 +465,15 @@ "notification.follow": "{name} seka tave", "notification.follow_request": "{name} paprašė tave sekti", "notification.mention": "{name} paminėjo tave", + "notification.moderation-warning.learn_more": "Sužinoti daugiau", + "notification.moderation_warning": "Gavai prižiūrėjimo įspėjimą", + "notification.moderation_warning.action_delete_statuses": "Kai kurie tavo įrašai buvo pašalintos.", + "notification.moderation_warning.action_disable": "Tavo paskyra buvo išjungta.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Kai kurie tavo įrašai buvo pažymėtos kaip jautrios.", + "notification.moderation_warning.action_none": "Tavo paskyra gavo prižiūrėjimo įspėjimą.", + "notification.moderation_warning.action_sensitive": "Nuo šiol tavo įrašai bus pažymėti kaip jautrūs.", + "notification.moderation_warning.action_silence": "Tavo paskyra buvo apribota.", + "notification.moderation_warning.action_suspend": "Tavo paskyra buvo sustabdyta.", "notification.own_poll": "Tavo apklausa baigėsi", "notification.poll": "Apklausa, kurioje balsavai, pasibaigė", "notification.reblog": "{name} pakėlė tavo įrašą", @@ -465,7 +497,7 @@ "notifications.column_settings.follow_request": "Nauji sekimo prašymai:", "notifications.column_settings.mention": "Paminėjimai:", "notifications.column_settings.poll": "Balsavimo rezultatai:", - "notifications.column_settings.push": "Stumdomieji pranešimai", + "notifications.column_settings.push": "Tiesioginiai pranešimai", "notifications.column_settings.reblog": "Pakėlimai:", "notifications.column_settings.show": "Rodyti stulpelyje", "notifications.column_settings.sound": "Paleisti garsą", @@ -504,7 +536,7 @@ "onboarding.follows.lead": "Tavo pagrindinis srautas – pagrindinis būdas patirti Mastodon. Kuo daugiau žmonių seksi, tuo jis bus aktyvesnis ir įdomesnis. Norint pradėti, pateikiame keletą pasiūlymų:", "onboarding.follows.title": "Suasmenink savo pagrindinį srautą", "onboarding.profile.discoverable": "Padaryti mano profilį atrandamą", - "onboarding.profile.discoverable_hint": "Kai pasirenki Mastodon atrandamumą, tavo įrašai gali būti rodomi paieškos rezultatuose ir tendencijose, o profilis gali būti siūlomas panašių pomėgių turintiems žmonėms.", + "onboarding.profile.discoverable_hint": "Kai sutinki su Mastodon atrandamumu, tavo įrašai gali būti rodomi paieškos rezultatuose ir tendencijose, o profilis gali būti siūlomas panašių pomėgių turintiems žmonėms.", "onboarding.profile.display_name": "Rodomas vardas", "onboarding.profile.display_name_hint": "Tavo pilnas vardas arba linksmas vardas…", "onboarding.profile.lead": "Gali visada tai užbaigti vėliau nustatymuose, kur yra dar daugiau pritaikymo parinkčių.", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 55ceb564b..b61a2c0c3 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -8,7 +8,7 @@ "about.domain_blocks.silenced.title": "Ierobežotie", "about.domain_blocks.suspended.explanation": "Nekādi dati no šī servera netiks apstrādāti, uzglabāti vai apmainīti, padarot neiespējamu mijiedarbību vai saziņu ar lietotājiem no šī servera.", "about.domain_blocks.suspended.title": "Apturētie", - "about.not_available": "Šī informācija šajā serverī nav bijusi pieejama.", + "about.not_available": "Šī informācija nav padarīta pieejama šajā serverī.", "about.powered_by": "Decentralizētu sociālo tīklu nodrošina {mastodon}", "about.rules": "Servera noteikumi", "account.account_note_header": "Piezīme", @@ -89,6 +89,9 @@ "announcement.announcement": "Paziņojums", "attachments_list.unprocessed": "(neapstrādāti)", "audio.hide": "Slēpt audio", + "block_modal.remote_users_caveat": "Mēs vaicāsim serverim {domain} ņemt vērā Tavu lēmumu. Tomēr atbilstība nav nodrošināta, jo atsevišķi serveri var apstrādāt bloķēšanu citādi. Publiski ieraksti joprojām var būt redzami lietotājiem, kuri nav pieteikušies.", + "block_modal.show_less": "Rādīt mazāk", + "block_modal.show_more": "Parādīt mazāk", "boost_modal.combo": "Nospied {combo}, lai nākamreiz šo izlaistu", "bundle_column_error.copy_stacktrace": "Kopēt kļūdu ziņojumu", "bundle_column_error.error.body": "Pieprasīto lapu nevarēja atveidot. Tas varētu būt saistīts ar kļūdu mūsu kodā, vai tā ir pārlūkprogrammas saderības problēma.", @@ -190,7 +193,7 @@ "directory.federated": "No pazīstamas federācijas", "directory.local": "Tikai no {domain}", "directory.new_arrivals": "Jaunpienācēji", - "directory.recently_active": "Nesen aktīvie", + "directory.recently_active": "Nesen aktīvi", "disabled_account_banner.account_settings": "Konta iestatījumi", "disabled_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots.", "dismissable_banner.community_timeline": "Šie ir jaunākie publiskie ieraksti no cilvēkiem, kuru konti ir mitināti {domain}.", @@ -199,6 +202,9 @@ "dismissable_banner.explore_statuses": "Šie ir ieraksti, kas šodien gūst arvien lielāku ievērību visā sociālajā tīklā. Augstāk tiek kārtoti jaunāki ieraksti, kuri tiek vairāk pastiprināti un ievietoti izlasēs.", "dismissable_banner.explore_tags": "Šie tēmturi šobrīd kļūst arvien populārāki cilvēku vidū šajā un citos decentralizētā tīkla serveros.", "dismissable_banner.public_timeline": "Šie ir jaunākie publiskie ieraksti no lietotājiem sociālajā tīmeklī, kuriem {domain} seko cilvēki.", + "domain_block_modal.they_cant_follow": "Neviens šajā serverī nevar Tev sekot.", + "domain_pill.server": "Serveris", + "domain_pill.username": "Lietotājvārds", "embed.instructions": "Iestrādā šo ziņu savā mājaslapā, kopējot zemāk redzamo kodu.", "embed.preview": "Tas izskatīsies šādi:", "emoji_button.activity": "Aktivitāte", @@ -275,6 +281,7 @@ "follow_suggestions.curated_suggestion": "Darbinieku izvēle", "follow_suggestions.dismiss": "Vairs nerādīt", "follow_suggestions.personalized_suggestion": "Pielāgots ieteikums", + "follow_suggestions.similar_to_recently_followed_longer": "Līdzīgi profieliem, kuriem nesen sāki sekot", "follow_suggestions.view_all": "Skatīt visu", "follow_suggestions.who_to_follow": "Kam sekot", "followed_tags": "Sekojamie tēmturi", @@ -302,7 +309,7 @@ "hashtag.counter_by_uses_today": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}} šodien", "hashtag.follow": "Sekot tēmturim", "hashtag.unfollow": "Pārstāt sekot tēmturim", - "hashtags.and_other": "..un {count, plural, other {# vairāk}}", + "hashtags.and_other": "… un {count, plural, other {vēl #}}", "home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus", "home.column_settings.show_replies": "Rādīt atbildes", "home.hide_announcements": "Slēpt paziņojumus", @@ -388,6 +395,10 @@ "loading_indicator.label": "Ielādē…", "media_gallery.toggle_visible": "{number, plural, one {Slēpt attēlu} other {Slēpt attēlus}}", "moved_to_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots, jo Tu pārcēlies uz kontu {movedToAccount}.", + "mute_modal.hide_from_notifications": "Paslēpt paziņojumos", + "mute_modal.hide_options": "Paslēpt iespējas", + "mute_modal.show_options": "Parādīt iespējas", + "mute_modal.title": "Apklusināt lietotāju?", "navigation_bar.about": "Par", "navigation_bar.advanced_interface": "Atvērt paplašinātā tīmekļa saskarnē", "navigation_bar.blocks": "Bloķētie lietotāji", @@ -420,11 +431,23 @@ "notification.follow": "{name} uzsāka Tev sekot", "notification.follow_request": "{name} nosūtīja Tev sekošanas pieprasījumu", "notification.mention": "{name} pieminēja Tevi", + "notification.moderation-warning.learn_more": "Uzzināt vairāk", + "notification.moderation_warning.action_delete_statuses": "Daži no Taviem ierakstiem tika noņemti.", + "notification.moderation_warning.action_disable": "Tavs konts tika atspējots.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Daži no Taviem ierakstiem tika atzīmēti kā jutīgi.", + "notification.moderation_warning.action_sensitive": "Tavi ieraksti turpmāk tiks atzīmēti kā jutīgi.", + "notification.moderation_warning.action_silence": "Tavs konts tika ierobežots.", + "notification.moderation_warning.action_suspend": "Tava konta darbība tika apturēta.", "notification.own_poll": "Tava aptauja ir noslēgusies", "notification.poll": "Aptauja, kurā tu piedalījies, ir noslēgusies", "notification.reblog": "{name} pastiprināja Tavu ierakstu", + "notification.relationships_severance_event": "Zaudēti savienojumi ar {name}", + "notification.relationships_severance_event.learn_more": "Uzzināt vairāk", "notification.status": "{name} tikko publicēja", "notification.update": "{name} rediģēja ierakstu", + "notification_requests.accept": "Pieņemt", + "notification_requests.dismiss": "Noraidīt", + "notification_requests.notifications_from": "Paziņojumi no {name}", "notifications.clear": "Notīrīt paziņojumus", "notifications.clear_confirmation": "Vai tiešām vēlies neatgriezeniski notīrīt visus savus paziņojumus?", "notifications.column_settings.admin.report": "Jauni ziņojumi:", @@ -456,6 +479,9 @@ "notifications.permission_denied": "Darbvirsmas paziņojumi nav pieejami, jo iepriekš tika noraidīts pārlūka atļauju pieprasījums", "notifications.permission_denied_alert": "Darbvirsmas paziņojumus nevar iespējot, jo pārlūkprogrammai atļauja tika iepriekš atteikta", "notifications.permission_required": "Darbvirsmas paziņojumi nav pieejami, jo nav piešķirta nepieciešamā atļauja.", + "notifications.policy.filter_new_accounts_title": "Jauni konti", + "notifications.policy.filter_not_followers_title": "Cilvēki, kuri Tev neseko", + "notifications.policy.filter_not_following_title": "Cilvēki, kuriem Tu neseko", "notifications_permission_banner.enable": "Iespējot darbvirsmas paziņojumus", "notifications_permission_banner.how_to_control": "Lai saņemtu paziņojumus, kad Mastodon nav atvērts, iespējo darbvirsmas paziņojumus. Vari precīzi kontrolēt, kāda veida mijiedarbības rada darbvirsmas paziņojumus, izmantojot augstāk redzamo pogu {icon}, kad tie būs iespējoti.", "notifications_permission_banner.title": "Nekad nepalaid neko garām", @@ -465,7 +491,7 @@ "onboarding.actions.go_to_home": "Dodieties uz manu mājas plūsmu", "onboarding.compose.template": "Sveiki, #Mastodon!", "onboarding.follows.empty": "Diemžēl pašlaik nevar parādīt rezultātus. Vari mēģināt izmantot meklēšanu vai pārlūkot izpētes lapu, lai atrastu cilvēkus, kuriem sekot, vai vēlāk mēģināt vēlreiz.", - "onboarding.follows.lead": "Tava mājas plūsma ir galvenais veids, kā izbaudīt Mastodon. Jo vairāk cilvēku sekosi, jo aktīvāk un interesantāk tas būs. Lai sāktu, šeit ir daži ieteikumi:", + "onboarding.follows.lead": "Tava mājas plūsma ir galvenais veids, kā pieredzēt Mastodon. Jo vairāk cilvēkiem sekosi, jo dzīvīgāka un aizraujošāka tā būs. Lai sāktu, šeit ir daži ieteikumi:", "onboarding.follows.title": "Pielāgo savu mājas barotni", "onboarding.profile.discoverable": "Padarīt manu profilu atklājamu", "onboarding.profile.display_name": "Attēlojamais vārds", @@ -485,7 +511,7 @@ "onboarding.start.title": "Tev tas izdevās!", "onboarding.steps.follow_people.body": "Tu pats veido savu plūsmu. Piepildīsim to ar interesantiem cilvēkiem.", "onboarding.steps.follow_people.title": "Pielāgo savu mājas barotni", - "onboarding.steps.publish_status.body": "Sveicini pasauli ar tekstu, fotoattēliem, video, vai aptaujām {emoji}", + "onboarding.steps.publish_status.body": "Pasveicini pasauli ar tekstu, attēliem, video vai aptaujām {emoji}", "onboarding.steps.publish_status.title": "Izveido savu pirmo ziņu", "onboarding.steps.setup_profile.body": "Palielini mijiedarbību ar aptverošu profilu!", "onboarding.steps.setup_profile.title": "Pielāgo savu profilu", @@ -603,7 +629,7 @@ "search_results.statuses": "Ieraksti", "search_results.title": "Meklēt {q}", "server_banner.about_active_users": "Cilvēki, kas izmantojuši šo serveri pēdējo 30 dienu laikā (aktīvie lietotāji mēnesī)", - "server_banner.active_users": "aktīvie lietotāji", + "server_banner.active_users": "aktīvi lietotāji", "server_banner.administered_by": "Administrē:", "server_banner.introduction": "{domain} ir daļa no decentralizētā sociālā tīkla, ko nodrošina {mastodon}.", "server_banner.learn_more": "Uzzināt vairāk", @@ -625,6 +651,7 @@ "status.direct": "Pieminēt @{name} privāti", "status.direct_indicator": "Pieminēts privāti", "status.edit": "Labot", + "status.edited": "Pēdējoreiz labots {date}", "status.edited_x_times": "Labots {count, plural, one {{count} reizi} other {{count} reizes}}", "status.embed": "Iegult", "status.favourite": "Izlasē", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 14b355233..3711cc0ae 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -297,6 +297,7 @@ "filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny", "filter_modal.select_filter.title": "Filtrer dette innlegget", "filter_modal.title.status": "Filtrer eit innlegg", + "filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}", "filtered_notifications_banner.pending_requests": "Varsel frå {count, plural, =0 {ingen} one {ein person} other {# folk}} du kanskje kjenner", "filtered_notifications_banner.title": "Filtrerte varslingar", "firehose.all": "Alle", @@ -307,6 +308,8 @@ "follow_requests.unlocked_explanation": "Sjølv om kontoen din ikkje er låst tenkte dei som driv {domain} at du kanskje ville gå gjennom førespurnadar frå desse kontoane manuelt.", "follow_suggestions.curated_suggestion": "Utvalt av staben", "follow_suggestions.dismiss": "Ikkje vis igjen", + "follow_suggestions.featured_longer": "Hanplukka av gjengen på {domain}", + "follow_suggestions.friends_of_friends_longer": "Populært hjå dei du fylgjer", "follow_suggestions.hints.featured": "Denne profilen er handplukka av folka på {domain}.", "follow_suggestions.hints.friends_of_friends": "Denne profilen er populær hjå dei du fylgjer.", "follow_suggestions.hints.most_followed": "Mange på {domain} fylgjer denne profilen.", @@ -314,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Denne profilen liknar på dei andre profilane du har fylgt i det siste.", "follow_suggestions.personalized_suggestion": "Personleg forslag", "follow_suggestions.popular_suggestion": "Populært forslag", + "follow_suggestions.popular_suggestion_longer": "Populært på {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Liknar på profilar du har fylgt i det siste", "follow_suggestions.view_all": "Vis alle", "follow_suggestions.who_to_follow": "Kven du kan fylgja", "followed_tags": "Fylgde emneknaggar", @@ -668,7 +673,7 @@ "search.quick_action.account_search": "Profiler som samsvarer med {x}", "search.quick_action.go_to_account": "Gå til profil {x}", "search.quick_action.go_to_hashtag": "Gå til emneknagg {x}", - "search.quick_action.open_url": "Åpne URL i Mastodon", + "search.quick_action.open_url": "Opne adressa i Mastodon", "search.quick_action.status_search": "Innlegg som samsvarer med {x}", "search.search_or_paste": "Søk eller lim inn URL", "search_popout.full_text_search_disabled_message": "Ikkje tilgjengeleg på {domain}.", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index b763f740a..6f67e8f74 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -414,6 +414,7 @@ "limited_account_hint.action": "Pokaż profil mimo to", "limited_account_hint.title": "Ten profil został ukryty przez moderatorów {domain}.", "link_preview.author": "{name}", + "link_preview.more_from_author": "Więcej od {name}", "lists.account.add": "Dodaj do listy", "lists.account.remove": "Usunąć z listy", "lists.delete": "Usuń listę", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 6bda11058..3c8f3cf41 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Apesar de seu perfil não ser trancado, {domain} exige que você revise a solicitação para te seguir destes perfis manualmente.", "follow_suggestions.curated_suggestion": "Escolha da equipe", "follow_suggestions.dismiss": "Não mostrar novamente", + "follow_suggestions.featured_longer": "Escolhido à mão pela equipe de {domain}", + "follow_suggestions.friends_of_friends_longer": "Popular entre as pessoas que você segue", "follow_suggestions.hints.featured": "Este perfil foi escolhido a dedo pela equipe {domain}.", "follow_suggestions.hints.friends_of_friends": "Este perfil é popular entre as pessoas que você segue.", "follow_suggestions.hints.most_followed": "Este perfil é um dos mais seguidos em {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Este perfil é semelhante aos perfis que você seguiu recentemente.", "follow_suggestions.personalized_suggestion": "Sugestão personalizada", "follow_suggestions.popular_suggestion": "Sugestão popular", + "follow_suggestions.popular_suggestion_longer": "Popular em {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Similar a perfis que você seguiu recentemente", "follow_suggestions.view_all": "Visualizar tudo", "follow_suggestions.who_to_follow": "Quem seguir", "followed_tags": "Hashtags seguidas", @@ -410,6 +414,7 @@ "limited_account_hint.action": "Exibir perfil mesmo assim", "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do {domain}.", "link_preview.author": "Por {name}", + "link_preview.more_from_author": "Mais de {name}", "lists.account.add": "Adicionar à lista", "lists.account.remove": "Remover da lista", "lists.delete": "Excluir lista", @@ -469,6 +474,15 @@ "notification.follow": "{name} te seguiu", "notification.follow_request": "{name} quer te seguir", "notification.mention": "{name} te mencionou", + "notification.moderation-warning.learn_more": "Aprender mais", + "notification.moderation_warning": "Você recebeu um aviso de moderação", + "notification.moderation_warning.action_delete_statuses": "Algumas das suas publicações foram removidas.", + "notification.moderation_warning.action_disable": "Sua conta foi desativada.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algumas de suas publicações foram marcadas por ter conteúdo sensível.", + "notification.moderation_warning.action_none": "Sua conta recebeu um aviso de moderação.", + "notification.moderation_warning.action_sensitive": "Suas publicações serão marcadas como sensíveis a partir de agora.", + "notification.moderation_warning.action_silence": "Sua conta foi limitada.", + "notification.moderation_warning.action_suspend": "Sua conta foi suspensa.", "notification.own_poll": "Sua enquete terminou", "notification.poll": "Uma enquete que você votou terminou", "notification.reblog": "{name} deu boost no teu toot", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 70903065d..c389d4f4f 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -414,6 +414,7 @@ "limited_account_hint.action": "Exibir perfil mesmo assim", "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores de {domain}.", "link_preview.author": "Por {name}", + "link_preview.more_from_author": "Mais de {name}", "lists.account.add": "Adicionar à lista", "lists.account.remove": "Remover da lista", "lists.delete": "Eliminar lista", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index cd09a505b..07a41385a 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -468,6 +468,7 @@ "notification.follow": "{name} подписался (-лась) на вас", "notification.follow_request": "{name} отправил запрос на подписку", "notification.mention": "{name} упомянул(а) вас", + "notification.moderation_warning.action_delete_statuses": "Некоторые из ваших публикаций были удалены.", "notification.own_poll": "Ваш опрос закончился", "notification.poll": "Опрос, в котором вы приняли участие, завершился", "notification.reblog": "{name} продвинул(а) ваш пост", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 4cb81a760..ccbface05 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -18,6 +18,7 @@ "account.edit_profile": "පැතිකඩ සංස්කරණය", "account.enable_notifications": "@{name} පළ කරන විට මට දැනුම් දෙන්න", "account.endorse": "පැතිකඩෙහි විශේෂාංගය", + "account.featured_tags.last_status_at": "අවසාන ලිපිය: {date}", "account.featured_tags.last_status_never": "ලිපි නැත", "account.follow": "අනුගමනය", "account.followers": "අනුගාමිකයින්", @@ -104,6 +105,7 @@ "compose_form.poll.duration": "මත විමසීමේ කාලය", "compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයකට මත විමසුම වෙනස් කරන්න", "compose_form.poll.switch_to_single": "තනි තේරීමකට මත විමසුම වෙනස් කරන්න", + "compose_form.publish": "ප්‍රකාශනය", "compose_form.publish_form": "නව ලිපිය", "compose_form.spoiler.marked": "අන්තර්ගත අවවාදය ඉවත් කරන්න", "compose_form.spoiler.unmarked": "අන්තර්ගත අවවාදයක් එක් කරන්න", @@ -154,6 +156,7 @@ "empty_column.bookmarked_statuses": "ඔබ සතුව පොත්යොමු තබන ලද ලිපි කිසිවක් නැත. ඔබ පොත්යොමුවක් තබන විට, එය මෙහි දිස්වනු ඇත.", "empty_column.domain_blocks": "අවහිර කරන ලද වසම් නැත.", "empty_column.explore_statuses": "දැන් කිසිවක් නැඹුරු නොවේ. පසුව නැවත පරීක්ෂා කරන්න!", + "empty_column.favourited_statuses": "ඔබ සතුව ප්‍රියතම ලිපි කිසිවක් නැත. ඔබ යමකට ප්‍රිය කළ විට එය මෙහි පෙන්වනු ඇත.", "empty_column.follow_requests": "ඔබට තවමත් අනුගමන ඉල්ලීම් ලැබී නැත. ඉල්ලීමක් ලැබුණු විට, එය මෙහි පෙන්වනු ඇත.", "empty_column.home": "මුල් පිටුව හිස් ය! මෙය පිරවීමට බොහෝ පුද්ගලයින් අනුගමනය කරන්න.", "empty_column.lists": "ඔබට තවමත් ලැයිස්තු කිසිවක් නැත. ඔබ එකක් සාදන විට, එය මෙහි පෙන්වනු ඇත.", @@ -205,6 +208,7 @@ "interaction_modal.on_this_server": "මෙම සේවාදායකයෙහි", "interaction_modal.title.favourite": "{name}ගේ ලිපිය ප්‍රිය කරන්න", "interaction_modal.title.follow": "{name} අනුගමනය", + "interaction_modal.title.reply": "{name}ගේ ලිපියට පිළිතුරු", "intervals.full.days": "{number, plural, one {දවස් #} other {දවස් #}}", "intervals.full.hours": "{number, plural, one {පැය #} other {පැය #}}", "intervals.full.minutes": "{number, plural, one {විනාඩි #} other {විනාඩි #}}", @@ -239,6 +243,7 @@ "lists.delete": "ලැයිස්තුව මකන්න", "lists.edit": "ලැයිස්තුව සංස්කරණය", "lists.edit.submit": "සිරැසිය සංශෝධනය", + "lists.new.create": "එකතු", "lists.new.title_placeholder": "නව ලැයිස්තුවේ සිරැසිය", "lists.replies_policy.list": "ලැයිස්තුවේ සාමාජිකයින්", "lists.replies_policy.none": "කිසිවෙක් නැත", @@ -266,6 +271,7 @@ "navigation_bar.search": "සොයන්න", "navigation_bar.security": "ආරක්ෂාව", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "notification.favourite": "{name} ඔබගේ ලිපියට ප්‍රිය කළා", "notification.follow": "{name} ඔබව අනුගමනය කළා", "notification.mention": "{name} ඔබව සඳහන් කර ඇත", "notification.own_poll": "ඔබගේ මත විමසුම නිමයි", @@ -395,6 +401,7 @@ "status.admin_status": "මෙම ලිපිය මැදිහත්කරණ අතුරුමුහුණතෙහි අරින්න", "status.block": "@{name} අවහිර", "status.bookmark": "පොත්යොමුවක්", + "status.copy": "ලිපියට සබැඳියේ පිටපතක්", "status.delete": "මකන්න", "status.detailed_status": "විස්තරාත්මක සංවාද දැක්ම", "status.edit": "සංස්කරණය", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index d143fda52..c583b5822 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -246,6 +246,7 @@ "empty_column.list": "Tento zoznam je zatiaľ prázdny. Keď ale členovia tohoto zoznamu uverejnia nové príspevky, objavia sa tu.", "empty_column.lists": "Zatiaľ nemáte žiadne zoznamy. Keď nejaký vytvoríte, zobrazí sa tu.", "empty_column.mutes": "Zatiaľ ste si nikoho nestíšili.", + "empty_column.notification_requests": "Všetko čisté! Nič tu nieje. Keď dostaneš nové oboznámenia, zobrazia sa tu podľa tvojich nastavení.", "empty_column.notifications": "Zatiaľ nemáte žiadne upozornenia. Začnú vám pribúdať, keď s vami začnú interagovať ostatní.", "empty_column.public": "Zatiaľ tu nič nie je. Napíšte niečo verejné alebo začnite sledovať účty z iných serverov, aby tu niečo pribudlo.", "error.unexpected_crash.explanation": "Pre chybu v našom kóde alebo problém s kompatibilitou prehliadača nebolo túto stránku možné zobraziť správne.", @@ -293,6 +294,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Tento profil je podobný profilom, ktoré ste nedávno začali sledovať.", "follow_suggestions.personalized_suggestion": "Prispôsobený návrh", "follow_suggestions.popular_suggestion": "Obľúbený návrh", + "follow_suggestions.popular_suggestion_longer": "Populárne na {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Podobné profilom, ktoré si nedávno nasledoval/a", "follow_suggestions.view_all": "Zobraziť všetky", "follow_suggestions.who_to_follow": "Koho sledovať", "followed_tags": "Sledované hashtagy", @@ -442,9 +445,15 @@ "notification.follow": "{name} vás sleduje", "notification.follow_request": "{name} vás žiada sledovať", "notification.mention": "{name} vás spomína", + "notification.moderation-warning.learn_more": "Zisti viac", + "notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.", + "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 ste hlasovali, sa skončila", "notification.reblog": "{name} 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", "notification.status": "{name} uverejňuje niečo nové", "notification.update": "{name} upravuje príspevok", @@ -487,6 +496,7 @@ "notifications.policy.filter_new_accounts_title": "Nové účty", "notifications.policy.filter_not_followers_title": "Ľudia, ktorí ťa nenasledujú", "notifications.policy.filter_not_following_title": "Ľudia, ktorých nenasleduješ", + "notifications.policy.filter_private_mentions_title": "Nevyžiadané priame spomenutia", "notifications.policy.title": "Filtrovať oznámenia od…", "notifications_permission_banner.enable": "Povoliť upozornenia na ploche", "notifications_permission_banner.how_to_control": "Ak chcete dostávať upozornenia, keď Mastodon nie je otvorený, povoľte upozornenia na ploche. Po ich zapnutí môžete presne kontrolovať, ktoré typy interakcií generujú upozornenia na ploche, a to prostredníctvom tlačidla {icon} vyššie.", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index ed4fa8dfa..a8cce3202 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Čeprav vaš račun ni zaklenjen, zaposleni pri {domain} menijo, da bi morda želeli pregledati zahteve za sledenje teh računov ročno.", "follow_suggestions.curated_suggestion": "Izbor osebja", "follow_suggestions.dismiss": "Ne pokaži več", + "follow_suggestions.featured_longer": "Osebno izbrala ekipa {domain}", + "follow_suggestions.friends_of_friends_longer": "Priljubljeno med osebami, ki jim sledite", "follow_suggestions.hints.featured": "Ta profil so izbrali skrbniki strežnika {domain}.", "follow_suggestions.hints.friends_of_friends": "Ta profil je priljubljen med osebami, ki jim sledite.", "follow_suggestions.hints.most_followed": "Ta profil na strežniku {domain} je en izmed najbolj sledenih.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Ta profil je podoben profilom, ki ste jim nedavno začeli slediti.", "follow_suggestions.personalized_suggestion": "Osebno prilagojen predlog", "follow_suggestions.popular_suggestion": "Priljubljen predlog", + "follow_suggestions.popular_suggestion_longer": "Priljubljeno na {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Podobno profilom, ki ste jim pred kratkim sledili", "follow_suggestions.view_all": "Pokaži vse", "follow_suggestions.who_to_follow": "Komu slediti", "followed_tags": "Sledeni ključniki", @@ -410,6 +414,7 @@ "limited_account_hint.action": "Vseeno pokaži profil", "limited_account_hint.title": "Profil so moderatorji strežnika {domain} skrili.", "link_preview.author": "Avtor_ica {name}", + "link_preview.more_from_author": "Več od {name}", "lists.account.add": "Dodaj na seznam", "lists.account.remove": "Odstrani s seznama", "lists.delete": "Izbriši seznam", @@ -469,6 +474,15 @@ "notification.follow": "{name} vam sledi", "notification.follow_request": "{name} vam želi slediti", "notification.mention": "{name} vas je omenil/a", + "notification.moderation-warning.learn_more": "Več o tem", + "notification.moderation_warning": "Prejeli ste opozorilo moderatorjev", + "notification.moderation_warning.action_delete_statuses": "Nekatere vaše objave so odstranjene.", + "notification.moderation_warning.action_disable": "Vaš račun je bil onemogočen.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Nekatere vaše objave so bile označene kot občutljive.", + "notification.moderation_warning.action_none": "Vaš račun je prejel opozorilo moderatorjev.", + "notification.moderation_warning.action_sensitive": "Vaše objave bodo odslej označene kot občutljive.", + "notification.moderation_warning.action_silence": "Vaš račun je bil omejen.", + "notification.moderation_warning.action_suspend": "Vaš račun je bil suspendiran.", "notification.own_poll": "Vaša anketa je zaključena", "notification.poll": "Anketa, v kateri ste sodelovali, je zaključena", "notification.reblog": "{name} je izpostavila/a vašo objavo", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index da35b3d43..b496f8e20 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -297,6 +297,7 @@ "filter_modal.select_filter.subtitle": "Përdorni një kategori ekzistuese, ose krijoni një të re", "filter_modal.select_filter.title": "Filtroje këtë postim", "filter_modal.title.status": "Filtroni një postim", + "filtered_notifications_banner.mentions": "{count, plural, one {përmendje} other {përmendje}}", "filtered_notifications_banner.pending_requests": "Njoftime prej {count, plural, =0 {askujt} one {një personi} other {# vetësh}} që mund të njihni", "filtered_notifications_banner.title": "Njoftime të filtruar", "firehose.all": "Krejt", @@ -307,6 +308,8 @@ "follow_requests.unlocked_explanation": "Edhe pse llogaria juaj s’është e kyçur, ekipi i {domain} mendoi se mund të donit të shqyrtonit dorazi kërkesa ndjekjeje prej këtyre llogarive.", "follow_suggestions.curated_suggestion": "Zgjedhur nga ekipi", "follow_suggestions.dismiss": "Mos shfaq më", + "follow_suggestions.featured_longer": "Zgjedhur enkas nga ekipi {domain}", + "follow_suggestions.friends_of_friends_longer": "Popullore mes personash që ndiqni", "follow_suggestions.hints.featured": "Ky profil është zgjedhur nga ekipi {domain}.", "follow_suggestions.hints.friends_of_friends": "Ky profil është popullor mes personave që ndiqni.", "follow_suggestions.hints.most_followed": "Ky profil është një nga më të ndjekur në {domain}.", @@ -314,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Ky profil është i ngjashëm me profile që keni ndjekur tani afër.", "follow_suggestions.personalized_suggestion": "Sugjerim i personalizuar", "follow_suggestions.popular_suggestion": "Sugjerim popullor", + "follow_suggestions.popular_suggestion_longer": "Popullore në {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "I ngjashëm me profile që keni zënë të ndiqni së fundi", "follow_suggestions.view_all": "Shihni krejt", "follow_suggestions.who_to_follow": "Cilët të ndiqen", "followed_tags": "Hashtag-ë të ndjekur", @@ -468,6 +473,15 @@ "notification.follow": "{name} zuri t’ju ndjekë", "notification.follow_request": "{name} ka kërkuar t’ju ndjekë", "notification.mention": "{name} ju ka përmendur", + "notification.moderation-warning.learn_more": "Mësoni më tepër", + "notification.moderation_warning": "Ju është dhënë një sinjalizim moderimi", + "notification.moderation_warning.action_delete_statuses": "Disa nga postimet tuaja janë hequr.", + "notification.moderation_warning.action_disable": "Llogaria juaj është çaktivizuar.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Disa prej postimeve tuaja u është vënë shenjë si me spec.", + "notification.moderation_warning.action_none": "Llogaria juaj ka marrë një sinjalizim moderimi.", + "notification.moderation_warning.action_sensitive": "Postimeve tuaja do t’u vihet shenjë si me spec, nga tani e tutje.", + "notification.moderation_warning.action_silence": "Llogaria juaj është kufizuar.", + "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 ku keni votuar", "notification.reblog": "{name} përforcoi mesazhin tuaj", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 3eea87d5e..67b706fa1 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Iako vaš nalog nije zaključan, osoblje {domain} smatra da biste možda želeli da ručno pregledate zahteve za praćenje sa ovih naloga.", "follow_suggestions.curated_suggestion": "Izbor osoblja", "follow_suggestions.dismiss": "Ne prikazuj ponovo", + "follow_suggestions.featured_longer": "Ručno odabrao tim {domain}", + "follow_suggestions.friends_of_friends_longer": "Popularno među ljudima koje pratite", "follow_suggestions.hints.featured": "Ovaj profil je ručno izabrao tim {domain}.", "follow_suggestions.hints.friends_of_friends": "Ovaj profil je popularan među ljudima koje pratite.", "follow_suggestions.hints.most_followed": "Ovaj profil je jedan od najpraćenijih na {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Ovaj profil je sličan profilima koje ste nedavno zapratili.", "follow_suggestions.personalized_suggestion": "Personalizovani predlog", "follow_suggestions.popular_suggestion": "Popularni predlog", + "follow_suggestions.popular_suggestion_longer": "Popularno na {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Slično profilima koje ste nedavno zapratili", "follow_suggestions.view_all": "Prikaži sve", "follow_suggestions.who_to_follow": "Koga pratiti", "followed_tags": "Praćene heš oznake", @@ -469,6 +473,15 @@ "notification.follow": "{name} vas je zapratio", "notification.follow_request": "{name} je zatražio da vas prati", "notification.mention": "{name} vas je pomenuo", + "notification.moderation-warning.learn_more": "Saznajte više", + "notification.moderation_warning": "Dobili ste moderatorsko upozorenje", + "notification.moderation_warning.action_delete_statuses": "Neke od vaših objava su uklonjene.", + "notification.moderation_warning.action_disable": "Vaš nalog je onemogućen.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Neke od vaših objava su obeležene kao osetljive.", + "notification.moderation_warning.action_none": "Vaš nalog je dobio moderatorsko upozorenje.", + "notification.moderation_warning.action_sensitive": "Vaše objave će ubuduće biti označene kao osetljive.", + "notification.moderation_warning.action_silence": "Vaš nalog je ograničen.", + "notification.moderation_warning.action_suspend": "Vaš nalog je suspendovan.", "notification.own_poll": "Vaša anketa je završena", "notification.poll": "Završena je anketa u kojoj ste glasali", "notification.reblog": "{name} je podržao vašu objavu", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 69f755a0b..9898a10a3 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Иако ваш налог није закључан, особље {domain} сматра да бисте можда желели да ручно прегледате захтеве за праћење са ових налога.", "follow_suggestions.curated_suggestion": "Избор особља", "follow_suggestions.dismiss": "Не приказуј поново", + "follow_suggestions.featured_longer": "Ручно одабрао тим {domain}", + "follow_suggestions.friends_of_friends_longer": "Популарно међу људима које пратите", "follow_suggestions.hints.featured": "Овај профил је ручно изабрао тим {domain}.", "follow_suggestions.hints.friends_of_friends": "Овај профил је популаран међу људима које пратите.", "follow_suggestions.hints.most_followed": "Овај профил је један од најпраћенијих на {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Овај профил је сличан профилима које сте недавно запратили.", "follow_suggestions.personalized_suggestion": "Персонализовани предлог", "follow_suggestions.popular_suggestion": "Популарни предлог", + "follow_suggestions.popular_suggestion_longer": "Популарно на {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Слично профилима које сте недавно запратили", "follow_suggestions.view_all": "Прикажи све", "follow_suggestions.who_to_follow": "Кога пратити", "followed_tags": "Праћене хеш ознаке", @@ -469,6 +473,15 @@ "notification.follow": "{name} вас је запратио", "notification.follow_request": "{name} је затражио да вас прати", "notification.mention": "{name} вас је поменуо", + "notification.moderation-warning.learn_more": "Сазнајте више", + "notification.moderation_warning": "Добили сте модераторско упозорење", + "notification.moderation_warning.action_delete_statuses": "Неке од ваших објава су уклоњене.", + "notification.moderation_warning.action_disable": "Ваш налог је онемогућен.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Неке од ваших објава су обележене као осетљиве.", + "notification.moderation_warning.action_none": "Ваш налог је добио модераторско упозорење.", + "notification.moderation_warning.action_sensitive": "Ваше објаве ће убудуће бити означене као осетљиве.", + "notification.moderation_warning.action_silence": "Ваш налог је ограничен.", + "notification.moderation_warning.action_suspend": "Ваш налог је суспендован.", "notification.own_poll": "Ваша анкета је завршена", "notification.poll": "Завршена је анкета у којој сте гласали", "notification.reblog": "{name} је подржао вашу објаву", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index c2dd5297d..ba3a6b2f5 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -297,6 +297,7 @@ "filter_modal.select_filter.subtitle": "Använd en befintlig kategori eller skapa en ny", "filter_modal.select_filter.title": "Filtrera detta inlägg", "filter_modal.title.status": "Filtrera ett inlägg", + "filtered_notifications_banner.mentions": "{count, plural, one {omnämning} other {omnämnanden}}", "filtered_notifications_banner.pending_requests": "Aviseringar från {count, plural, =0 {ingen} one {en person} other {# personer}} du kanske känner", "filtered_notifications_banner.title": "Filtrerade aviseringar", "firehose.all": "Allt", @@ -307,6 +308,8 @@ "follow_requests.unlocked_explanation": "Även om ditt konto inte är låst tror {domain}-personalen att du kanske vill granska dessa följares förfrågningar manuellt.", "follow_suggestions.curated_suggestion": "Utvald av personalen", "follow_suggestions.dismiss": "Visa inte igen", + "follow_suggestions.featured_longer": "Handplockad av {domain}-teamet", + "follow_suggestions.friends_of_friends_longer": "Populärt bland personer du följer", "follow_suggestions.hints.featured": "Denna profil är handplockad av {domain}-teamet.", "follow_suggestions.hints.friends_of_friends": "Denna profil är populär bland de personer du följer.", "follow_suggestions.hints.most_followed": "Denna profil är en av de mest följda på {domain}.", @@ -314,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Denna profil liknar de profiler som du nyligen har följt.", "follow_suggestions.personalized_suggestion": "Personligt förslag", "follow_suggestions.popular_suggestion": "Populärt förslag", + "follow_suggestions.popular_suggestion_longer": "Populärt på {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Liknar profiler du nyligen följde", "follow_suggestions.view_all": "Visa alla", "follow_suggestions.who_to_follow": "Rekommenderade profiler", "followed_tags": "Följda hashtags", @@ -469,10 +474,14 @@ "notification.follow_request": "{name} har begärt att följa dig", "notification.mention": "{name} nämnde dig", "notification.moderation-warning.learn_more": "Läs mer", + "notification.moderation_warning": "Du har fått en moderationsvarning", "notification.moderation_warning.action_delete_statuses": "Några av dina inlägg har tagits bort.", "notification.moderation_warning.action_disable": "Ditt konto har inaktiverats.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Några av dina inlägg har markerats som känsliga.", + "notification.moderation_warning.action_none": "Ditt konto har mottagit en modereringsvarning.", + "notification.moderation_warning.action_sensitive": "Dina inlägg kommer markeras som känsliga från och med nu.", "notification.moderation_warning.action_silence": "Ditt konto har begränsats.", + "notification.moderation_warning.action_suspend": "Ditt konto har stängts av.", "notification.own_poll": "Din röstning har avslutats", "notification.poll": "En omröstning du röstat i har avslutats", "notification.reblog": "{name} boostade ditt inlägg", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 379aebbb1..b1b9407ba 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -158,7 +158,7 @@ "compose_form.poll.option_placeholder": "ตัวเลือก {number}", "compose_form.poll.single": "เลือกอย่างใดอย่างหนึ่ง", "compose_form.poll.switch_to_multiple": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตหลายตัวเลือก", - "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว", + "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดียว", "compose_form.poll.type": "ลักษณะ", "compose_form.publish": "โพสต์", "compose_form.publish_form": "โพสต์ใหม่", @@ -308,13 +308,17 @@ "follow_requests.unlocked_explanation": "แม้ว่าไม่มีการล็อคบัญชีของคุณ พนักงานของ {domain} คิดว่าคุณอาจต้องการตรวจทานคำขอติดตามจากบัญชีเหล่านี้ด้วยตนเอง", "follow_suggestions.curated_suggestion": "คัดสรรโดยพนักงาน", "follow_suggestions.dismiss": "ไม่ต้องแสดงอีก", + "follow_suggestions.featured_longer": "คัดสรรโดยทีม {domain}", + "follow_suggestions.friends_of_friends_longer": "เป็นที่นิยมในหมู่ผู้คนที่คุณติดตาม", "follow_suggestions.hints.featured": "โปรไฟล์นี้ได้รับการคัดสรรโดยทีม {domain}", - "follow_suggestions.hints.friends_of_friends": "โปรไฟล์นี้ได้รับความนิยมในหมู่ผู้คนที่คุณติดตาม", + "follow_suggestions.hints.friends_of_friends": "โปรไฟล์นี้เป็นที่นิยมในหมู่ผู้คนที่คุณติดตาม", "follow_suggestions.hints.most_followed": "โปรไฟล์นี้เป็นหนึ่งในโปรไฟล์ที่ได้รับการติดตามมากที่สุดใน {domain}", "follow_suggestions.hints.most_interactions": "โปรไฟล์นี้เพิ่งได้รับความสนใจอย่างมากใน {domain}", "follow_suggestions.hints.similar_to_recently_followed": "โปรไฟล์นี้คล้ายกับโปรไฟล์ที่คุณได้ติดตามล่าสุด", "follow_suggestions.personalized_suggestion": "ข้อเสนอแนะเฉพาะบุคคล", "follow_suggestions.popular_suggestion": "ข้อเสนอแนะยอดนิยม", + "follow_suggestions.popular_suggestion_longer": "เป็นที่นิยมใน {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "คล้ายกับโปรไฟล์ที่คุณได้ติดตามล่าสุด", "follow_suggestions.view_all": "ดูทั้งหมด", "follow_suggestions.who_to_follow": "ติดตามใครดี", "followed_tags": "แฮชแท็กที่ติดตาม", @@ -469,6 +473,15 @@ "notification.follow": "{name} ได้ติดตามคุณ", "notification.follow_request": "{name} ได้ขอติดตามคุณ", "notification.mention": "{name} ได้กล่าวถึงคุณ", + "notification.moderation-warning.learn_more": "เรียนรู้เพิ่มเติม", + "notification.moderation_warning": "คุณได้รับคำเตือนการกลั่นกรอง", + "notification.moderation_warning.action_delete_statuses": "เอาโพสต์บางส่วนของคุณออกแล้ว", + "notification.moderation_warning.action_disable": "ปิดใช้งานบัญชีของคุณแล้ว", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "ทำเครื่องหมายโพสต์บางส่วนของคุณว่าละเอียดอ่อนแล้ว", + "notification.moderation_warning.action_none": "บัญชีของคุณได้รับคำเตือนการกลั่นกรอง", + "notification.moderation_warning.action_sensitive": "จะทำเครื่องหมายโพสต์ของคุณว่าละเอียดอ่อนนับจากนี้ไป", + "notification.moderation_warning.action_silence": "จำกัดบัญชีของคุณแล้ว", + "notification.moderation_warning.action_suspend": "ระงับบัญชีของคุณแล้ว", "notification.own_poll": "การสำรวจความคิดเห็นของคุณได้สิ้นสุดแล้ว", "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว", "notification.reblog": "{name} ได้ดันโพสต์ของคุณ", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index dc07480ef..6c0110659 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Hesabınız kilitli olmasa da, {domain} personeli bu hesaplardan gelen takip isteklerini gözden geçirmek isteyebileceğinizi düşündü.", "follow_suggestions.curated_suggestion": "Çalışanların seçtikleri", "follow_suggestions.dismiss": "Tekrar gösterme", + "follow_suggestions.featured_longer": "{domain} takımı tarafından elle seçildi", + "follow_suggestions.friends_of_friends_longer": "Takip ettiğiniz kişiler arasında popüler", "follow_suggestions.hints.featured": "Bu profil {domain} ekibi tarafından elle seçilmiştir.", "follow_suggestions.hints.friends_of_friends": "Bu profil takip ettiğiniz insanlar arasında popülerdir.", "follow_suggestions.hints.most_followed": "Bu, {domain} sunucusunda en fazla izlenen profildir.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Bu profil, son zamanlarda takip ettiğiniz profillere benziyor.", "follow_suggestions.personalized_suggestion": "Kişiselleşmiş öneriler", "follow_suggestions.popular_suggestion": "Popüler öneriler", + "follow_suggestions.popular_suggestion_longer": "{domain} üzerinde popüler", + "follow_suggestions.similar_to_recently_followed_longer": "Yakın zamanda takip ettiğiniz hesaplara benziyor", "follow_suggestions.view_all": "Tümünü gör", "follow_suggestions.who_to_follow": "Takip edebileceklerin", "followed_tags": "Takip edilen etiketler", @@ -469,6 +473,15 @@ "notification.follow": "{name} seni takip etti", "notification.follow_request": "{name} size takip isteği gönderdi", "notification.mention": "{name} senden bahsetti", + "notification.moderation-warning.learn_more": "Daha fazlası", + "notification.moderation_warning": "Hesabınız bir denetim uyarısı aldı", + "notification.moderation_warning.action_delete_statuses": "Bazı gönderileriniz kaldırıldı.", + "notification.moderation_warning.action_disable": "Hesabınız devre dışı bırakıldı.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Bazı gönderileriniz hassas olarak işaretlendi.", + "notification.moderation_warning.action_none": "Hesabınız bir denetim uyarısı aldı.", + "notification.moderation_warning.action_sensitive": "Gönderileriniz artık hassas olarak işaretlenecek.", + "notification.moderation_warning.action_silence": "Hesabınız sınırlandırıldı.", + "notification.moderation_warning.action_suspend": "Hesabınız askıya alındı.", "notification.own_poll": "Anketiniz sona erdi", "notification.poll": "Oy verdiğiniz bir anket sona erdi", "notification.reblog": "{name} gönderini yeniden paylaştı", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 6ae4e162b..3a7f63206 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -217,8 +217,19 @@ "domain_block_modal.title": "Заблокувати домен?", "domain_block_modal.you_will_lose_followers": "Усіх ваших підписників з цього сервера буде вилучено.", "domain_block_modal.you_wont_see_posts": "Ви не бачитимете дописів і сповіщень від користувачів на цьому сервері.", + "domain_pill.activitypub_lets_connect": "Це дозволяє вам спілкуватися та взаємодіяти з людьми не лише на Mastodon, але й у різних соціальних додатках.", + "domain_pill.activitypub_like_language": "ActivityPub - це як мова, якою Мастодонт розмовляє з іншими соціальними мережами.", "domain_pill.server": "Сервер", + "domain_pill.their_handle": "Їхня адреса:", + "domain_pill.their_server": "Їхній цифровий дім, де живуть усі їхні пости.", + "domain_pill.their_username": "Їхній унікальний ідентифікатор на їхньому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.", "domain_pill.username": "Ім'я користувача", + "domain_pill.whats_in_a_handle": "Що є в адресі?", + "domain_pill.who_they_are": "Оскільки дескриптори вказують, хто це і де він знаходиться, ви можете взаємодіяти з людьми через соціальну мережу платформ на основі .", + "domain_pill.who_you_are": "Оскільки ваш нікнейм вказує, хто ви та де ви, люди можуть взаємодіяти з вами через соціальну мережу платформ на основі .", + "domain_pill.your_handle": "Ваша адреса:", + "domain_pill.your_server": "Ваш цифровий дім, де живуть усі ваші публікації. Не подобається цей? Перенесіть сервери в будь-який час і залучайте своїх підписників.", + "domain_pill.your_username": "Ваш унікальний ідентифікатор на цьому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.", "embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.", "embed.preview": "Ось який вигляд це матиме:", "emoji_button.activity": "Діяльність", @@ -286,6 +297,7 @@ "filter_modal.select_filter.subtitle": "Використати наявну категорію або створити нову", "filter_modal.select_filter.title": "Фільтрувати цей допис", "filter_modal.title.status": "Фільтрувати допис", + "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}", "filtered_notifications_banner.pending_requests": "Сповіщення від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати", "filtered_notifications_banner.title": "Відфільтровані сповіщення", "firehose.all": "Всі", @@ -296,6 +308,8 @@ "follow_requests.unlocked_explanation": "Хоча ваш обліковий запис не заблоковано, персонал {domain} припускає, що, можливо, ви хотіли б переглянути ці запити на підписку.", "follow_suggestions.curated_suggestion": "Відібрано командою", "follow_suggestions.dismiss": "Більше не показувати", + "follow_suggestions.featured_longer": "Вибрано командою {domain} вручну", + "follow_suggestions.friends_of_friends_longer": "Популярні серед людей, за якими ви слідкуєте", "follow_suggestions.hints.featured": "Цей профіль був обраний командою {domain}.", "follow_suggestions.hints.friends_of_friends": "Цей профіль популярний серед тих людей, на яких ви підписані.", "follow_suggestions.hints.most_followed": "За цим профілем один з найпопулярніших на {domain}.", @@ -303,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Цей профіль схожий на профілі, за якими ви стежили останнім часом.", "follow_suggestions.personalized_suggestion": "Персоналізована пропозиція", "follow_suggestions.popular_suggestion": "Популярна пропозиція", + "follow_suggestions.popular_suggestion_longer": "Популярно на {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Схожі на профілі, за якими ви нещодавно стежили", "follow_suggestions.view_all": "Переглянути все", "follow_suggestions.who_to_follow": "На кого підписатися", "followed_tags": "Відстежувані хештеґи", @@ -457,12 +473,23 @@ "notification.follow": "{name} підписалися на вас", "notification.follow_request": "{name} відправили запит на підписку", "notification.mention": "{name} згадали вас", + "notification.moderation-warning.learn_more": "Дізнатися більше", + "notification.moderation_warning": "Ви отримали попередження модерації", + "notification.moderation_warning.action_delete_statuses": "Деякі з ваших дописів було видалено.", + "notification.moderation_warning.action_disable": "Ваш обліковий запис було вимкнено.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Деякі з ваших дописів були позначені як чутливі.", + "notification.moderation_warning.action_none": "Ваш обліковий запис отримав попередження модерації.", + "notification.moderation_warning.action_sensitive": "Відтепер ваші дописи будуть позначені як чутливі.", + "notification.moderation_warning.action_silence": "Ваш обліковий запис було обмежено.", + "notification.moderation_warning.action_suspend": "Ваш обліковий запис було заблоковано.", "notification.own_poll": "Ваше опитування завершилося", "notification.poll": "Опитування, у якому ви голосували, скінчилося", "notification.reblog": "{name} поширює ваш допис", "notification.relationships_severance_event": "Втрачено з'єднання з {name}", "notification.relationships_severance_event.account_suspension": "Адміністратор з {from} призупинив {target}, що означає, що ви більше не можете отримувати оновлення від них або взаємодіяти з ними.", + "notification.relationships_severance_event.domain_block": "Адміністратор з {from} заблокував {target}, включаючи {followersCount} ваших підписників і {{followingCount, plural, one {# account} other {# accounts}}, на які ви підписані.", "notification.relationships_severance_event.learn_more": "Дізнатися більше", + "notification.relationships_severance_event.user_domain_block": "Ви заблокували {target}, видаливши {followersCount} ваших підписників і {followingCount, plural, one {# account} other {# accounts}}, за якими ви стежите.", "notification.status": "{name} щойно дописує", "notification.update": "{name} змінює допис", "notification_requests.accept": "Прийняти", @@ -504,9 +531,13 @@ "notifications.permission_required": "Сповіщення на стільниці не доступні, оскільки необхідний дозвіл не надано.", "notifications.policy.filter_new_accounts.hint": "Створено впродовж {days, plural, one {одного} few {# днів} many {# днів} other {# дня}}", "notifications.policy.filter_new_accounts_title": "Нові облікові записи", + "notifications.policy.filter_not_followers_hint": "Включаючи людей, які стежать за вами менше {days, plural, one {one day} other {# days}}", "notifications.policy.filter_not_followers_title": "Люди не підписані на вас", "notifications.policy.filter_not_following_hint": "Доки ви не схвалюєте їх вручну", "notifications.policy.filter_not_following_title": "Люди, на яких ви не підписані", + "notifications.policy.filter_private_mentions_hint": "Відфільтровується, якщо це не відповідь на вашу власну згадку або якщо ви відстежуєте відправника", + "notifications.policy.filter_private_mentions_title": "Небажані приватні згадки", + "notifications.policy.title": "Відфільтрувати сповіщення від…", "notifications_permission_banner.enable": "Увімкнути сповіщення стільниці", "notifications_permission_banner.how_to_control": "Щоб отримувати сповіщення, коли Mastodon не відкрито, увімкніть сповіщення стільниці. Ви можете контролювати, які типи взаємодій створюють сповіщення через кнопку {icon} вгорі після їхнього увімкнення.", "notifications_permission_banner.title": "Не проґавте нічого", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index e1f886b1f..56b2f7e52 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "Mặc dù tài khoản của bạn đang ở chế độ công khai, quản trị viên của {domain} vẫn tin rằng bạn sẽ muốn xem lại yêu cầu theo dõi từ những người khác.", "follow_suggestions.curated_suggestion": "Gợi ý từ máy chủ", "follow_suggestions.dismiss": "Không hiện lại", + "follow_suggestions.featured_longer": "Tuyển chọn bởi {domain}", + "follow_suggestions.friends_of_friends_longer": "Nổi tiếng với những người mà bạn theo dõi", "follow_suggestions.hints.featured": "Người này được đội ngũ {domain} đề xuất.", "follow_suggestions.hints.friends_of_friends": "Người này nổi tiếng với những người bạn theo dõi.", "follow_suggestions.hints.most_followed": "Người này được theo dõi nhiều nhất trên {domain}.", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Người này có nét giống những người mà bạn theo dõi gần đây.", "follow_suggestions.personalized_suggestion": "Gợi ý cá nhân hóa", "follow_suggestions.popular_suggestion": "Những người nổi tiếng", + "follow_suggestions.popular_suggestion_longer": "Nổi tiếng trên {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Tương tự những người mà bạn theo dõi gần đây", "follow_suggestions.view_all": "Xem tất cả", "follow_suggestions.who_to_follow": "Gợi ý theo dõi", "followed_tags": "Hashtag theo dõi", @@ -410,6 +414,7 @@ "limited_account_hint.action": "Vẫn cứ xem", "limited_account_hint.title": "Người này đã bị ẩn bởi quản trị viên của {domain}.", "link_preview.author": "Bởi {name}", + "link_preview.more_from_author": "Thêm từ {name}", "lists.account.add": "Thêm vào danh sách", "lists.account.remove": "Xóa khỏi danh sách", "lists.delete": "Xóa danh sách", @@ -469,6 +474,15 @@ "notification.follow": "{name} theo dõi bạn", "notification.follow_request": "{name} yêu cầu theo dõi bạn", "notification.mention": "{name} nhắc đến bạn", + "notification.moderation-warning.learn_more": "Tìm hiểu", + "notification.moderation_warning": "Bạn vừa nhận một cảnh báo kiểm duyệt", + "notification.moderation_warning.action_delete_statuses": "Một vài tút của bạn bị gỡ.", + "notification.moderation_warning.action_disable": "Tài khoản của bạn đã bị vô hiệu hóa.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Vài tút bạn bị đánh dấu nhạy cảm.", + "notification.moderation_warning.action_none": "Bạn đã nhận một cảnh báo kiểm duyệt.", + "notification.moderation_warning.action_sensitive": "Tút của bạn sẽ bị đánh dấu nhạy cảm kể từ bây giờ.", + "notification.moderation_warning.action_silence": "Tài khoản của bạn đã bị hạn chế.", + "notification.moderation_warning.action_suspend": "Tài khoản của bạn đã bị vô hiệu hóa.", "notification.own_poll": "Cuộc bình chọn của bạn đã kết thúc", "notification.poll": "Cuộc bình chọn đã kết thúc", "notification.reblog": "{name} đăng lại tút của bạn", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index ab6fe0bd7..0f8bcae6f 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -414,6 +414,7 @@ "limited_account_hint.action": "仍要显示个人资料", "limited_account_hint.title": "此账号资料已被 {domain} 管理员隐藏。", "link_preview.author": "由 {name}", + "link_preview.more_from_author": "查看 {name} 的更多内容", "lists.account.add": "添加到列表", "lists.account.remove": "从列表中移除", "lists.delete": "删除列表", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 3ca9a8d11..eaa5dabe9 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -308,6 +308,8 @@ "follow_requests.unlocked_explanation": "即使您的帳號未上鎖,{domain} 的工作人員認為您可能會想手動審核來自這些帳號的追蹤請求。", "follow_suggestions.curated_suggestion": "編輯精選", "follow_suggestions.dismiss": "不再顯示", + "follow_suggestions.featured_longer": "{domain} 團隊精選", + "follow_suggestions.friends_of_friends_longer": "受你的追蹤對象歡迎", "follow_suggestions.hints.featured": "這個人檔案是由 {domain} 團隊精挑細選。", "follow_suggestions.hints.friends_of_friends": "這個人檔案在你追蹤的人當中很受歡迎。", "follow_suggestions.hints.most_followed": "這個人檔案是在 {domain} 上最多追蹤之一。", @@ -315,6 +317,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "這個人檔案與你最近追蹤的類似。", "follow_suggestions.personalized_suggestion": "個人化推薦", "follow_suggestions.popular_suggestion": "熱門推薦", + "follow_suggestions.popular_suggestion_longer": "{domain} 熱門", + "follow_suggestions.similar_to_recently_followed_longer": "與你最近追蹤的帳號相似", "follow_suggestions.view_all": "查看所有", "follow_suggestions.who_to_follow": "追蹤對象", "followed_tags": "已追蹤標籤", @@ -469,6 +473,14 @@ "notification.follow": "{name} 開始追蹤你", "notification.follow_request": "{name} 要求追蹤你", "notification.mention": "{name} 提及你", + "notification.moderation-warning.learn_more": "了解更多", + "notification.moderation_warning.action_delete_statuses": "你的部份帖文已被刪除。", + "notification.moderation_warning.action_disable": "你的帳號已被停用。", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "你某些帖文已被標記為敏感內容。", + "notification.moderation_warning.action_none": "你的帳號收到一則審核警告。", + "notification.moderation_warning.action_sensitive": "從現在起,你的帖文將被標記為敏感內容。", + "notification.moderation_warning.action_silence": "你的帳號已受到限制。", + "notification.moderation_warning.action_suspend": "你的帳號已被停權。", "notification.own_poll": "你的投票已結束", "notification.poll": "你參與過的一個投票已經結束", "notification.reblog": "{name} 轉推你的文章", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index f00d62c07..1d20034db 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -414,6 +414,7 @@ "limited_account_hint.action": "一律顯示個人檔案", "limited_account_hint.title": "此個人檔案已被 {domain} 的管理員隱藏。", "link_preview.author": "來自 {name}", + "link_preview.more_from_author": "來自 {name} 之更多內容", "lists.account.add": "新增至列表", "lists.account.remove": "自列表中移除", "lists.delete": "刪除列表", diff --git a/app/javascript/mastodon/reducers/meta.js b/app/javascript/mastodon/reducers/meta.js index 96baf2f11..ddb788459 100644 --- a/app/javascript/mastodon/reducers/meta.js +++ b/app/javascript/mastodon/reducers/meta.js @@ -6,7 +6,6 @@ import { layoutFromWindow } from 'mastodon/is_mobile'; const initialState = ImmutableMap({ streaming_api_base_url: null, - access_token: null, layout: layoutFromWindow(), permissions: '0', }); @@ -14,7 +13,8 @@ const initialState = ImmutableMap({ export default function meta(state = initialState, action) { switch(action.type) { case STORE_HYDRATE: - return state.merge(action.state.get('meta')).set('permissions', action.state.getIn(['role', 'permissions'])); + // we do not want `access_token` to be stored in the state + return state.merge(action.state.get('meta')).delete('access_token').set('permissions', action.state.getIn(['role', 'permissions'])); case changeLayout.type: return state.set('layout', action.payload.layout); default: diff --git a/app/javascript/mastodon/reducers/search.js b/app/javascript/mastodon/reducers/search.js index 72835eb91..7828d49ee 100644 --- a/app/javascript/mastodon/reducers/search.js +++ b/app/javascript/mastodon/reducers/search.js @@ -50,6 +50,7 @@ export default function search(state = initialState, action) { return state.set('hidden', true); case SEARCH_FETCH_REQUEST: return state.withMutations(map => { + map.set('results', ImmutableMap()); map.set('isLoading', true); map.set('submitted', true); map.set('type', action.searchType); diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js index 683fe848f..ca766f73a 100644 --- a/app/javascript/mastodon/reducers/statuses.js +++ b/app/javascript/mastodon/reducers/statuses.js @@ -3,10 +3,6 @@ import { Map as ImmutableMap, fromJS } from 'immutable'; import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer'; import { normalizeStatusTranslation } from '../actions/importer/normalizer'; import { - REBLOG_REQUEST, - REBLOG_FAIL, - UNREBLOG_REQUEST, - UNREBLOG_FAIL, FAVOURITE_REQUEST, FAVOURITE_FAIL, UNFAVOURITE_REQUEST, @@ -16,6 +12,10 @@ import { UNBOOKMARK_REQUEST, UNBOOKMARK_FAIL, } from '../actions/interactions'; +import { + reblog, + unreblog, +} from '../actions/interactions_typed'; import { STATUS_MUTE_SUCCESS, STATUS_UNMUTE_SUCCESS, @@ -65,6 +65,7 @@ const statusTranslateUndo = (state, id) => { const initialState = ImmutableMap(); +/** @type {import('@reduxjs/toolkit').Reducer} */ export default function statuses(state = initialState, action) { switch(action.type) { case STATUS_FETCH_REQUEST: @@ -91,14 +92,6 @@ export default function statuses(state = initialState, action) { return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], false); case UNBOOKMARK_FAIL: return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], true); - case REBLOG_REQUEST: - return state.setIn([action.status.get('id'), 'reblogged'], true); - case REBLOG_FAIL: - return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'reblogged'], false); - case UNREBLOG_REQUEST: - return state.setIn([action.status.get('id'), 'reblogged'], false); - case UNREBLOG_FAIL: - return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'reblogged'], true); case STATUS_MUTE_SUCCESS: return state.setIn([action.id, 'muted'], true); case STATUS_UNMUTE_SUCCESS: @@ -128,6 +121,15 @@ export default function statuses(state = initialState, action) { case STATUS_TRANSLATE_UNDO: return statusTranslateUndo(state, action.id); default: - return state; + if(reblog.pending.match(action)) + return state.setIn([action.meta.arg.statusId, 'reblogged'], true); + else if(reblog.rejected.match(action)) + return state.get(action.meta.arg.statusId) === undefined ? state : state.setIn([action.meta.arg.statusId, 'reblogged'], false); + else if(unreblog.pending.match(action)) + return state.setIn([action.meta.arg.statusId, 'reblogged'], false); + else if(unreblog.rejected.match(action)) + return state.get(action.meta.arg.statusId) === undefined ? state : state.setIn([action.meta.arg.statusId, 'reblogged'], true); + else + return state; } } diff --git a/app/javascript/mastodon/store/middlewares/sounds.ts b/app/javascript/mastodon/store/middlewares/sounds.ts index 720ee163e..91407b1ec 100644 --- a/app/javascript/mastodon/store/middlewares/sounds.ts +++ b/app/javascript/mastodon/store/middlewares/sounds.ts @@ -74,8 +74,9 @@ export const soundsMiddleware = (): Middleware< if (isActionWithMetaSound(action)) { const sound = action.meta.sound; - if (sound && Object.hasOwn(soundCache, sound)) { - play(soundCache[sound]); + if (sound) { + const s = soundCache[sound]; + if (s) play(s); } } diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts index b66d7545c..dae37e622 100644 --- a/app/javascript/mastodon/store/typed_functions.ts +++ b/app/javascript/mastodon/store/typed_functions.ts @@ -2,6 +2,8 @@ import { createAsyncThunk } from '@reduxjs/toolkit'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports import { useDispatch, useSelector } from 'react-redux'; +import type { BaseThunkAPI } from '@reduxjs/toolkit/dist/createAsyncThunk'; + import type { AppDispatch, RootState } from './store'; export const useAppDispatch = useDispatch.withTypes(); @@ -13,8 +15,185 @@ export interface AsyncThunkRejectValue { error?: unknown; } +interface AppMeta { + skipLoading?: boolean; +} + export const createAppAsyncThunk = createAsyncThunk.withTypes<{ state: RootState; dispatch: AppDispatch; rejectValue: AsyncThunkRejectValue; }>(); + +type AppThunkApi = Pick< + BaseThunkAPI< + RootState, + unknown, + AppDispatch, + AsyncThunkRejectValue, + AppMeta, + AppMeta + >, + 'getState' | 'dispatch' +>; + +interface AppThunkOptions { + skipLoading?: boolean; +} + +const createBaseAsyncThunk = createAsyncThunk.withTypes<{ + state: RootState; + dispatch: AppDispatch; + rejectValue: AsyncThunkRejectValue; + fulfilledMeta: AppMeta; + rejectedMeta: AppMeta; +}>(); + +export function createThunk( + name: string, + creator: (arg: Arg, api: AppThunkApi) => Returned | Promise, + options: AppThunkOptions = {}, +) { + return createBaseAsyncThunk( + name, + async ( + arg: Arg, + { getState, dispatch, fulfillWithValue, rejectWithValue }, + ) => { + try { + const result = await creator(arg, { dispatch, getState }); + + return fulfillWithValue(result, { + skipLoading: options.skipLoading, + }); + } catch (error) { + return rejectWithValue({ error }, { skipLoading: true }); + } + }, + { + getPendingMeta() { + if (options.skipLoading) return { skipLoading: true }; + return {}; + }, + }, + ); +} + +const discardLoadDataInPayload = Symbol('discardLoadDataInPayload'); +type DiscardLoadData = typeof discardLoadDataInPayload; + +type OnData = ( + data: LoadDataResult, + api: AppThunkApi & { + discardLoadData: DiscardLoadData; + }, +) => ReturnedData | DiscardLoadData | Promise; + +type ArgsType = Record | undefined; + +// Overload when there is no `onData` method, the payload is the `onData` result +export function createDataLoadingThunk( + name: string, + loadData: (args: Args) => Promise, + thunkOptions?: AppThunkOptions, +): ReturnType>; + +// Overload when the `onData` method returns discardLoadDataInPayload, then the payload is empty +export function createDataLoadingThunk( + name: string, + loadData: (args: Args) => Promise, + onDataOrThunkOptions?: + | AppThunkOptions + | OnData, + thunkOptions?: AppThunkOptions, +): ReturnType>; + +// Overload when the `onData` method returns nothing, then the mayload is the `onData` result +export function createDataLoadingThunk( + name: string, + loadData: (args: Args) => Promise, + onDataOrThunkOptions?: AppThunkOptions | OnData, + thunkOptions?: AppThunkOptions, +): ReturnType>; + +// Overload when there is an `onData` method returning something +export function createDataLoadingThunk< + LoadDataResult, + Args extends ArgsType, + Returned, +>( + name: string, + loadData: (args: Args) => Promise, + onDataOrThunkOptions?: AppThunkOptions | OnData, + thunkOptions?: AppThunkOptions, +): ReturnType>; + +/** + * This function creates a Redux Thunk that handles loading data asynchronously (usually from the API), dispatching `pending`, `fullfilled` and `rejected` actions. + * + * You can run a callback on the `onData` results to either dispatch side effects or modify the payload. + * + * It is a wrapper around RTK's [`createAsyncThunk`](https://redux-toolkit.js.org/api/createAsyncThunk) + * @param name Prefix for the actions types + * @param loadData Function that loads the data. It's (object) argument will become the thunk's argument + * @param onDataOrThunkOptions + * Callback called on the results from `loadData`. + * + * First argument will be the return from `loadData`. + * + * Second argument is an object with: `dispatch`, `getState` and `discardLoadData`. + * It can return: + * - `undefined` (or no explicit return), meaning that the `onData` results will be the payload + * - `discardLoadData` to discard the `onData` results and return an empty payload + * - anything else, which will be the payload + * + * You can also omit this parameter and pass `thunkOptions` directly + * @param maybeThunkOptions + * Additional Mastodon specific options for the thunk. Currently supports: + * - `skipLoading` to avoid showing the loading bar when the request is in progress + * @returns The created thunk + */ +export function createDataLoadingThunk< + LoadDataResult, + Args extends ArgsType, + Returned, +>( + name: string, + loadData: (args: Args) => Promise, + onDataOrThunkOptions?: AppThunkOptions | OnData, + maybeThunkOptions?: AppThunkOptions, +) { + let onData: OnData | undefined; + let thunkOptions: AppThunkOptions | undefined; + + if (typeof onDataOrThunkOptions === 'function') onData = onDataOrThunkOptions; + else if (typeof onDataOrThunkOptions === 'object') + thunkOptions = onDataOrThunkOptions; + + if (maybeThunkOptions) { + thunkOptions = maybeThunkOptions; + } + + return createThunk( + name, + async (arg, { getState, dispatch }) => { + const data = await loadData(arg); + + if (!onData) return data as Returned; + + const result = await onData(data, { + dispatch, + getState, + discardLoadData: discardLoadDataInPayload, + }); + + // if there is no return in `onData`, we return the `onData` result + if (typeof result === 'undefined') return data as Returned; + // the user explicitely asked to discard the payload + else if (result === discardLoadDataInPayload) + return undefined as Returned; + else return result; + }, + thunkOptions, + ); +} diff --git a/app/javascript/mastodon/stream.js b/app/javascript/mastodon/stream.js index ff3af5fd8..40d69136a 100644 --- a/app/javascript/mastodon/stream.js +++ b/app/javascript/mastodon/stream.js @@ -2,6 +2,8 @@ import WebSocketClient from '@gamestdio/websocket'; +import { getAccessToken } from './initial_state'; + /** * @type {WebSocketClient | undefined} */ @@ -145,9 +147,11 @@ const channelNameWithInlineParams = (channelName, params) => { // @ts-expect-error export const connectStream = (channelName, params, callbacks) => (dispatch, getState) => { const streamingAPIBaseURL = getState().getIn(['meta', 'streaming_api_base_url']); - const accessToken = getState().getIn(['meta', 'access_token']); + const accessToken = getAccessToken(); const { onConnect, onReceive, onDisconnect } = callbacks(dispatch, getState); + if(!accessToken) throw new Error("Trying to connect to the streaming server but no access token is available."); + // If we cannot use a websockets connection, we must fall back // to using individual connections for each channel if (!streamingAPIBaseURL.startsWith('ws')) { diff --git a/app/javascript/mastodon/test_helpers.tsx b/app/javascript/mastodon/test_helpers.tsx index 69d57b95a..93b5a8453 100644 --- a/app/javascript/mastodon/test_helpers.tsx +++ b/app/javascript/mastodon/test_helpers.tsx @@ -1,7 +1,3 @@ -import PropTypes from 'prop-types'; -import type { PropsWithChildren } from 'react'; -import { Component } from 'react'; - import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router'; @@ -9,44 +5,26 @@ import { MemoryRouter } from 'react-router'; // eslint-disable-next-line import/no-extraneous-dependencies import { render as rtlRender } from '@testing-library/react'; -class FakeIdentityWrapper extends Component< - PropsWithChildren<{ signedIn: boolean }> -> { - static childContextTypes = { - identity: PropTypes.shape({ - signedIn: PropTypes.bool.isRequired, - accountId: PropTypes.string, - disabledAccountId: PropTypes.string, - accessToken: PropTypes.string, - }).isRequired, - }; - - getChildContext() { - return { - identity: { - signedIn: this.props.signedIn, - accountId: '123', - accessToken: 'test-access-token', - }, - }; - } - - render() { - return this.props.children; - } -} +import { IdentityContext } from './identity_context'; function render( ui: React.ReactElement, { locale = 'en', signedIn = true, ...renderOptions } = {}, ) { + const fakeIdentity = { + signedIn: signedIn, + accountId: '123', + disabledAccountId: undefined, + permissions: 0, + }; + const Wrapper = (props: { children: React.ReactNode }) => { return ( - + {props.children} - + ); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 9cb03bedf..4f36d85aa 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3896,6 +3896,10 @@ $ui-header-logo-wordmark-width: 99px; border: 1px solid var(--background-border-color); border-radius: 8px; + &.bottomless { + border-radius: 8px 8px 0 0; + } + &__actions { bottom: 0; inset-inline-start: 0; @@ -4371,6 +4375,10 @@ a.status-card { &:hover { color: $primary-text-color; } + + .icon-sliders { + transform: rotate(60deg); + } } &:disabled { @@ -4379,6 +4387,10 @@ a.status-card { } } +.no-reduce-motion .column-header__button .icon-sliders { + transition: transform 150ms ease-in-out; +} + .column-header__collapsible { max-height: 70vh; overflow: hidden; @@ -5616,7 +5628,7 @@ a.status-card { user-select: text; display: flex; - @media screen and (max-width: $no-gap-breakpoint) { + @media screen and (width <= 630px) { margin-top: auto; } } @@ -10145,6 +10157,7 @@ noscript { font-weight: 500; font-size: 11px; line-height: 16px; + word-break: keep-all; &__badge { background: $ui-button-background-color; @@ -10214,3 +10227,42 @@ noscript { } } } + +.more-from-author { + font-size: 14px; + color: $darker-text-color; + background: var(--surface-background-color); + border: 1px solid var(--background-border-color); + border-top: 0; + border-radius: 0 0 8px 8px; + padding: 15px; + display: flex; + align-items: center; + gap: 8px; + + .logo { + height: 16px; + color: $darker-text-color; + } + + & > span { + display: flex; + align-items: center; + gap: 8px; + } + + a { + display: inline-flex; + align-items: center; + gap: 4px; + font-weight: 500; + color: $primary-text-color; + text-decoration: none; + + &:hover, + &:focus, + &:active { + color: $highlight-text-color; + } + } +} diff --git a/app/lib/access_token_extension.rb b/app/lib/access_token_extension.rb index f51bde492..4e9585dd1 100644 --- a/app/lib/access_token_extension.rb +++ b/app/lib/access_token_extension.rb @@ -6,6 +6,8 @@ module AccessTokenExtension included do include Redisable + has_many :web_push_subscriptions, class_name: 'Web::PushSubscription', inverse_of: :access_token + after_commit :push_to_streaming_api end diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 85195f4c3..7ec7e84bd 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -110,7 +110,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def process_status_params @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url, object: @object) - attachment_ids = process_attachments.take(4).map(&:id) + attachment_ids = process_attachments.take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:id) @params = { uri: @status_parser.uri, @@ -260,7 +260,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity as_array(@object['attachment']).each do |attachment| media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment) - next if media_attachment_parser.remote_url.blank? || media_attachments.size >= 4 + next if media_attachment_parser.remote_url.blank? || media_attachments.size >= Status::MEDIA_ATTACHMENTS_LIMIT begin media_attachment = MediaAttachment.create( diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb index cfc2b8788..2940aea44 100644 --- a/app/lib/activitypub/parser/status_parser.rb +++ b/app/lib/activitypub/parser/status_parser.rb @@ -3,6 +3,8 @@ class ActivityPub::Parser::StatusParser include JsonLdHelper + NORMALIZED_LOCALE_NAMES = LanguagesHelper::SUPPORTED_LOCALES.keys.index_by(&:downcase).freeze + # @param [Hash] json # @param [Hash] options # @option options [String] :followers_collection @@ -87,6 +89,13 @@ class ActivityPub::Parser::StatusParser end def language + lang = raw_language_code + lang.presence && NORMALIZED_LOCALE_NAMES.fetch(lang.downcase.to_sym, lang) + end + + private + + def raw_language_code if content_language_map? @object['contentMap'].keys.first elsif name_language_map? @@ -96,8 +105,6 @@ class ActivityPub::Parser::StatusParser end end - private - def audience_to as_array(@object['to'] || @json['to']).map { |x| value_or_id(x) } end diff --git a/app/lib/activitypub/serializer.rb b/app/lib/activitypub/serializer.rb index 1fdc79310..b17ec3fdf 100644 --- a/app/lib/activitypub/serializer.rb +++ b/app/lib/activitypub/serializer.rb @@ -33,6 +33,6 @@ class ActivityPub::Serializer < ActiveModel::Serializer adapter_options[:named_contexts].merge!(_named_contexts) adapter_options[:context_extensions].merge!(_context_extensions) end - super(adapter_options, options, adapter_instance) + super end end diff --git a/app/lib/admin/metrics/dimension/software_versions_dimension.rb b/app/lib/admin/metrics/dimension/software_versions_dimension.rb index ccf556eae..97cdaf589 100644 --- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb +++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb @@ -25,14 +25,11 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim end def ruby_version - yjit = defined?(RubyVM::YJIT) && RubyVM::YJIT.enabled? - value = "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}#{yjit ? ' +YJIT' : ''}" - { key: 'ruby', human_key: 'Ruby', - value: value, - human_value: value, + value: "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}", + human_value: RUBY_DESCRIPTION, } end diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb index 400c51a02..2fea1057c 100644 --- a/app/lib/application_extension.rb +++ b/app/lib/application_extension.rb @@ -23,6 +23,12 @@ module ApplicationExtension redirect_uri.lines.first.strip end + def redirect_uris + # Doorkeeper stores the redirect_uri value as a newline delimeted list in + # the database: + redirect_uri.split + end + def push_to_streaming_api # TODO: #28793 Combine into a single topic payload = Oj.dump(event: :kill) diff --git a/app/lib/connection_pool/shared_connection_pool.rb b/app/lib/connection_pool/shared_connection_pool.rb index 3ca22d0ef..1cfcc5823 100644 --- a/app/lib/connection_pool/shared_connection_pool.rb +++ b/app/lib/connection_pool/shared_connection_pool.rb @@ -5,7 +5,7 @@ require_relative 'shared_timed_stack' class ConnectionPool::SharedConnectionPool < ConnectionPool def initialize(options = {}, &block) - super(options, &block) + super @available = ConnectionPool::SharedTimedStack.new(@size, &block) end diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb index bec7d3a45..2e49d3fb4 100644 --- a/app/lib/link_details_extractor.rb +++ b/app/lib/link_details_extractor.rb @@ -195,6 +195,10 @@ class LinkDetailsExtractor structured_data&.author_url end + def author_account + opengraph_tag('fediverse:creator') + end + def embed_url valid_url_or_nil(opengraph_tag('twitter:player:stream')) end @@ -282,6 +286,6 @@ class LinkDetailsExtractor end def html_entities - @html_entities ||= HTMLEntities.new + @html_entities ||= HTMLEntities.new(:expanded) end end diff --git a/app/lib/rss/channel.rb b/app/lib/rss/channel.rb index 9013ed066..518ea7140 100644 --- a/app/lib/rss/channel.rb +++ b/app/lib/rss/channel.rb @@ -2,7 +2,7 @@ class RSS::Channel < RSS::Element def initialize - super() + super @root = create_element('channel') end diff --git a/app/lib/rss/item.rb b/app/lib/rss/item.rb index 6739a2c18..8be8d4bf3 100644 --- a/app/lib/rss/item.rb +++ b/app/lib/rss/item.rb @@ -2,7 +2,7 @@ class RSS::Item < RSS::Element def initialize - super() + super @root = create_element('item') end diff --git a/app/lib/vacuum/applications_vacuum.rb b/app/lib/vacuum/applications_vacuum.rb deleted file mode 100644 index ba88655f1..000000000 --- a/app/lib/vacuum/applications_vacuum.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -class Vacuum::ApplicationsVacuum - def perform - Doorkeeper::Application.where(owner_id: nil) - .where.missing(:created_users, :access_tokens, :access_grants) - .where(created_at: ...1.day.ago) - .in_batches.delete_all - end -end diff --git a/app/lib/vacuum/imports_vacuum.rb b/app/lib/vacuum/imports_vacuum.rb index 8c8bb783a..700bd8184 100644 --- a/app/lib/vacuum/imports_vacuum.rb +++ b/app/lib/vacuum/imports_vacuum.rb @@ -9,10 +9,10 @@ class Vacuum::ImportsVacuum private def clean_unconfirmed_imports! - BulkImport.state_unconfirmed.where('created_at <= ?', 10.minutes.ago).reorder(nil).in_batches.delete_all + BulkImport.state_unconfirmed.where(created_at: ..10.minutes.ago).reorder(nil).in_batches.delete_all end def clean_old_imports! - BulkImport.where('created_at <= ?', 1.week.ago).reorder(nil).in_batches.delete_all + BulkImport.where(created_at: ..1.week.ago).reorder(nil).in_batches.delete_all end end diff --git a/app/lib/vacuum/statuses_vacuum.rb b/app/lib/vacuum/statuses_vacuum.rb index ad1de0738..92d3ccf4f 100644 --- a/app/lib/vacuum/statuses_vacuum.rb +++ b/app/lib/vacuum/statuses_vacuum.rb @@ -34,7 +34,7 @@ class Vacuum::StatusesVacuum def statuses_scope Status.unscoped.kept .joins(:account).merge(Account.remote) - .where('statuses.id < ?', retention_period_as_id) + .where(statuses: { id: ...retention_period_as_id }) end def retention_period_as_id diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index f8c1c9a8d..81a2c0c6d 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -5,7 +5,6 @@ class UserMailer < Devise::Mailer helper :accounts helper :application - helper :mascot helper :formatting helper :instance helper :routing diff --git a/app/models/account.rb b/app/models/account.rb index a04b4f1ab..8688112fb 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -71,6 +71,9 @@ class Account < ApplicationRecord MENTION_RE = %r{(? { local? && will_save_change_to_username? && actor_type != 'Application' } + validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: USERNAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' } validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' } - validates :display_name, length: { maximum: 30 }, if: -> { local? && will_save_change_to_display_name? } - validates :note, note_length: { maximum: 500 }, if: -> { local? && will_save_change_to_note? } + validates :display_name, length: { maximum: DISPLAY_NAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_display_name? } + validates :note, note_length: { maximum: NOTE_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_note? } validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? } validates :uri, absence: true, if: :local?, on: :create validates :inbox_url, absence: true, if: :local?, on: :create @@ -135,11 +138,12 @@ class Account < ApplicationRecord scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).joins(:account_stat) } scope :by_recent_status, -> { includes(:account_stat).merge(AccountStat.by_recent_status).references(:account_stat) } scope :by_recent_activity, -> { left_joins(:user, :account_stat).order(coalesced_activity_timestamps.desc).order(id: :desc) } - scope :popular, -> { order('account_stats.followers_count desc') } scope :by_domain_and_subdomains, ->(domain) { where(domain: Instance.by_domain_and_subdomains(domain).select(:domain)) } scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) } scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) } scope :dormant, -> { joins(:account_stat).merge(AccountStat.without_recent_activity) } + scope :with_username, ->(value) { where arel_table[:username].lower.eq(value.to_s.downcase) } + scope :with_domain, ->(value) { where arel_table[:domain].lower.eq(value&.to_s&.downcase) } after_update_commit :trigger_update_webhooks diff --git a/app/models/account_moderation_note.rb b/app/models/account_moderation_note.rb index ad49b2422..79b8b4d25 100644 --- a/app/models/account_moderation_note.rb +++ b/app/models/account_moderation_note.rb @@ -13,7 +13,7 @@ # class AccountModerationNote < ApplicationRecord - CONTENT_SIZE_LIMIT = 500 + CONTENT_SIZE_LIMIT = 2_000 belongs_to :account belongs_to :target_account, class_name: 'Account' diff --git a/app/models/account_suggestions/setting_source.rb b/app/models/account_suggestions/setting_source.rb index 9f3cd7bd3..614348172 100644 --- a/app/models/account_suggestions/setting_source.rb +++ b/app/models/account_suggestions/setting_source.rb @@ -3,7 +3,7 @@ class AccountSuggestions::SettingSource < AccountSuggestions::Source def get(account, limit: DEFAULT_LIMIT) if setting_enabled? - base_account_scope(account).where(setting_to_where_condition).limit(limit).pluck(:id).zip([key].cycle) + base_account_scope(account).merge(setting_to_where_condition).limit(limit).pluck(:id).zip([key].cycle) else [] end @@ -25,11 +25,9 @@ class AccountSuggestions::SettingSource < AccountSuggestions::Source def setting_to_where_condition usernames_and_domains.map do |(username, domain)| - Arel::Nodes::Grouping.new( - Account.arel_table[:username].lower.eq(username.downcase).and( - Account.arel_table[:domain].lower.eq(domain&.downcase) - ) - ) + Account + .with_username(username) + .with_domain(domain) end.reduce(:or) end diff --git a/app/models/admin/action_log_filter.rb b/app/models/admin/action_log_filter.rb index f581af74e..fc984b244 100644 --- a/app/models/admin/action_log_filter.rb +++ b/app/models/admin/action_log_filter.rb @@ -59,6 +59,7 @@ class Admin::ActionLogFilter unsuspend_account: { target_type: 'Account', action: 'unsuspend' }.freeze, update_announcement: { target_type: 'Announcement', action: 'update' }.freeze, update_custom_emoji: { target_type: 'CustomEmoji', action: 'update' }.freeze, + update_report: { target_type: 'Report', action: 'update' }.freeze, update_status: { target_type: 'Status', action: 'update' }.freeze, update_user_role: { target_type: 'UserRole', action: 'update' }.freeze, update_ip_block: { target_type: 'IpBlock', action: 'update' }.freeze, diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 014a73997..299aad634 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -22,4 +22,10 @@ class ApplicationRecord < ActiveRecord::Base value end end + + # Prevent implicit serialization in ActiveModel::Serializer or other code paths. + # This is a hardening step to avoid accidental leaking of attributes. + def as_json + raise NotImplementedError + end end diff --git a/app/models/canonical_email_block.rb b/app/models/canonical_email_block.rb index c05eb9801..d09df6f5e 100644 --- a/app/models/canonical_email_block.rb +++ b/app/models/canonical_email_block.rb @@ -20,7 +20,6 @@ class CanonicalEmailBlock < ApplicationRecord validates :canonical_email_hash, presence: true, uniqueness: true scope :matching_email, ->(email) { where(canonical_email_hash: email_to_canonical_email_hash(email)) } - scope :matching_account, ->(account) { matching_email(account&.user_email).or(where(reference_account: account)) } def to_log_human_identifier canonical_email_hash diff --git a/app/models/concerns/account/associations.rb b/app/models/concerns/account/associations.rb index b2e9d255f..1c67b07e5 100644 --- a/app/models/concerns/account/associations.rb +++ b/app/models/concerns/account/associations.rb @@ -62,7 +62,7 @@ module Account::Associations has_many :aliases, class_name: 'AccountAlias', dependent: :destroy, inverse_of: :account # Hashtags - has_and_belongs_to_many :tags + has_and_belongs_to_many :tags # rubocop:disable Rails/HasAndBelongsToMany has_many :featured_tags, -> { includes(:tag) }, dependent: :destroy, inverse_of: :account # Account deletion requests diff --git a/app/models/concerns/account/finder_concern.rb b/app/models/concerns/account/finder_concern.rb index a7acff1cb..249a7b5fd 100644 --- a/app/models/concerns/account/finder_concern.rb +++ b/app/models/concerns/account/finder_concern.rb @@ -25,42 +25,11 @@ module Account::FinderConcern end def find_remote(username, domain) - AccountFinder.new(username, domain).account - end - end - - class AccountFinder - attr_reader :username, :domain - - def initialize(username, domain) - @username = username - @domain = domain - end - - def account - scoped_accounts.order(id: :asc).take - end - - private - - def scoped_accounts - Account.unscoped.tap do |scope| - scope.merge! with_usernames - scope.merge! matching_username - scope.merge! matching_domain - end - end - - def with_usernames - Account.where.not(Account.arel_table[:username].lower.eq '') - end - - def matching_username - Account.where(Account.arel_table[:username].lower.eq username.to_s.downcase) - end - - def matching_domain - Account.where(Account.arel_table[:domain].lower.eq(domain.nil? ? nil : domain.to_s.downcase)) + Account + .with_username(username) + .with_domain(domain) + .order(id: :asc) + .take end end end diff --git a/app/models/concerns/attachmentable.rb b/app/models/concerns/attachmentable.rb index 3b7db1fce..f457f5822 100644 --- a/app/models/concerns/attachmentable.rb +++ b/app/models/concerns/attachmentable.rb @@ -23,7 +23,7 @@ module Attachmentable included do def self.has_attached_file(name, options = {}) # rubocop:disable Naming/PredicateName - super(name, options) + super send(:"before_#{name}_validate", prepend: true) do attachment = send(name) diff --git a/app/models/concerns/expireable.rb b/app/models/concerns/expireable.rb index c64fc7d80..26740e821 100644 --- a/app/models/concerns/expireable.rb +++ b/app/models/concerns/expireable.rb @@ -4,7 +4,7 @@ module Expireable extend ActiveSupport::Concern included do - scope :expired, -> { where.not(expires_at: nil).where('expires_at < ?', Time.now.utc) } + scope :expired, -> { where.not(expires_at: nil).where(expires_at: ...Time.now.utc) } def expires_in return @expires_in if defined?(@expires_in) diff --git a/app/models/concerns/legacy_otp_secret.rb b/app/models/concerns/legacy_otp_secret.rb new file mode 100644 index 000000000..466c4ec9b --- /dev/null +++ b/app/models/concerns/legacy_otp_secret.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +# TODO: This file is here for legacy support during devise-two-factor upgrade. +# It should be removed after all records have been migrated. + +module LegacyOtpSecret + extend ActiveSupport::Concern + + private + + # Decrypt and return the `encrypted_otp_secret` attribute which was used in + # prior versions of devise-two-factor + # @return [String] The decrypted OTP secret + def legacy_otp_secret + return nil unless self[:encrypted_otp_secret] + return nil unless self.class.otp_secret_encryption_key + + hmac_iterations = 2000 # a default set by the Encryptor gem + key = self.class.otp_secret_encryption_key + salt = Base64.decode64(encrypted_otp_secret_salt) + iv = Base64.decode64(encrypted_otp_secret_iv) + + raw_cipher_text = Base64.decode64(encrypted_otp_secret) + # The last 16 bytes of the ciphertext are the authentication tag - we use + # Galois Counter Mode which is an authenticated encryption mode + cipher_text = raw_cipher_text[0..-17] + auth_tag = raw_cipher_text[-16..-1] # rubocop:disable Style/SlicingWithRange + + # this alrorithm lifted from + # https://github.com/attr-encrypted/encryptor/blob/master/lib/encryptor.rb#L54 + + # create an OpenSSL object which will decrypt the AES cipher with 256 bit + # keys in Galois Counter Mode (GCM). See + # https://ruby.github.io/openssl/OpenSSL/Cipher.html + cipher = OpenSSL::Cipher.new('aes-256-gcm') + + # tell the cipher we want to decrypt. Symmetric algorithms use a very + # similar process for encryption and decryption, hence the same object can + # do both. + cipher.decrypt + + # Use a Password-Based Key Derivation Function to generate the key actually + # used for encryptoin from the key we got as input. + cipher.key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(key, salt, hmac_iterations, cipher.key_len) + + # set the Initialization Vector (IV) + cipher.iv = iv + + # The tag must be set after calling Cipher#decrypt, Cipher#key= and + # Cipher#iv=, but before calling Cipher#final. After all decryption is + # performed, the tag is verified automatically in the call to Cipher#final. + # + # If the auth_tag does not verify, then #final will raise OpenSSL::Cipher::CipherError + cipher.auth_tag = auth_tag + + # auth_data must be set after auth_tag has been set when decrypting See + # http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html#method-i-auth_data-3D + # we are not adding any authenticated data but OpenSSL docs say this should + # still be called. + cipher.auth_data = '' + + # #update is (somewhat confusingly named) the method which actually + # performs the decryption on the given chunk of data. Our OTP secret is + # short so we only need to call it once. + # + # It is very important that we call #final because: + # + # 1. The authentication tag is checked during the call to #final + # 2. Block based cipher modes (e.g. CBC) work on fixed size chunks. We need + # to call #final to get it to process the last chunk properly. The output + # of #final should be appended to the decrypted value. This isn't + # required for streaming cipher modes but including it is a best practice + # so that your code will continue to function correctly even if you later + # change to a block cipher mode. + cipher.update(cipher_text) + cipher.final + end +end diff --git a/app/models/concerns/status/threading_concern.rb b/app/models/concerns/status/threading_concern.rb index ca8c44814..478a139d6 100644 --- a/app/models/concerns/status/threading_concern.rb +++ b/app/models/concerns/status/threading_concern.rb @@ -3,6 +3,23 @@ module Status::ThreadingConcern extend ActiveSupport::Concern + class_methods do + def permitted_statuses_from_ids(ids, account, stable: false) + statuses = Status.with_accounts(ids).to_a + account_ids = statuses.map(&:account_id).uniq + domains = statuses.filter_map(&:account_domain).uniq + relations = account&.relations_map(account_ids, domains) || {} + + statuses.reject! { |status| StatusFilter.new(status, account, relations).filtered? } + + if stable + statuses.sort_by! { |status| ids.index(status.id) } + else + statuses + end + end + end + def ancestors(limit, account = nil) find_statuses_from_tree_path(ancestor_ids(limit), account) end @@ -76,15 +93,7 @@ module Status::ThreadingConcern end def find_statuses_from_tree_path(ids, account, promote: false) - statuses = Status.with_accounts(ids).to_a - account_ids = statuses.map(&:account_id).uniq - domains = statuses.filter_map(&:account_domain).uniq - relations = account&.relations_map(account_ids, domains) || {} - - statuses.reject! { |status| StatusFilter.new(status, account, relations).filtered? } - - # Order ancestors/descendants by tree path - statuses.sort_by! { |status| ids.index(status.id) } + statuses = Status.permitted_statuses_from_ids(ids, account, stable: true) # Bring self-replies to the top if promote diff --git a/app/models/concerns/user/ldap_authenticable.rb b/app/models/concerns/user/ldap_authenticable.rb index 180df9d31..fc1ee78d0 100644 --- a/app/models/concerns/user/ldap_authenticable.rb +++ b/app/models/concerns/user/ldap_authenticable.rb @@ -22,7 +22,7 @@ module User::LdapAuthenticable safe_username = safe_username.gsub(keys, replacement) end - resource = joins(:account).find_by(accounts: { username: safe_username }) + resource = joins(:account).merge(Account.with_username(safe_username)).take if resource.blank? resource = new( diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb index 2d8f5b6cb..bacf15826 100644 --- a/app/models/custom_filter.rb +++ b/app/models/custom_filter.rb @@ -28,6 +28,8 @@ class CustomFilter < ApplicationRecord account ).freeze + EXPIRATION_DURATIONS = [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].freeze + include Expireable include Redisable @@ -49,10 +51,9 @@ class CustomFilter < ApplicationRecord after_commit :invalidate_cache! def expires_in - return @expires_in if defined?(@expires_in) return nil if expires_at.nil? - [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].find { |expires_in| expires_in.from_now >= expires_at } + EXPIRATION_DURATIONS.find { |expires_in| expires_in.from_now >= expires_at } end def irreversible=(value) diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index cb37a5221..85b913cf8 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -37,6 +37,8 @@ class Form::AdminSettings status_page_url captcha_enabled authorized_fetch + app_icon + favicon ).freeze INTEGER_KEYS = %i( @@ -63,6 +65,8 @@ class Form::AdminSettings UPLOAD_KEYS = %i( thumbnail mascot + app_icon + favicon ).freeze OVERRIDEN_SETTINGS = { diff --git a/app/models/invite.rb b/app/models/invite.rb index 2fe9f22fb..ea095a3ac 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -24,7 +24,7 @@ class Invite < ApplicationRecord belongs_to :user, inverse_of: :invites has_many :users, inverse_of: :invite, dependent: nil - scope :available, -> { where(expires_at: nil).or(where('expires_at >= ?', Time.now.utc)) } + scope :available, -> { where(expires_at: nil).or(where(expires_at: Time.now.utc..)) } validates :comment, length: { maximum: COMMENT_SIZE_LIMIT } diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb index 9fe02bd16..11fdd9d88 100644 --- a/app/models/preview_card.rb +++ b/app/models/preview_card.rb @@ -32,6 +32,7 @@ # link_type :integer # published_at :datetime # image_description :string default(""), not null +# author_account_id :bigint(8) # class PreviewCard < ApplicationRecord @@ -54,6 +55,7 @@ class PreviewCard < ApplicationRecord has_many :statuses, through: :preview_cards_statuses has_one :trend, class_name: 'PreviewCardTrend', inverse_of: :preview_card, dependent: :destroy + belongs_to :author_account, class_name: 'Account', optional: true has_attached_file :image, processors: [:thumbnail, :blurhash_transcoder], styles: ->(f) { image_styles(f) }, convert_options: { all: '-quality 90 +profile "!icc,*" +set date:modify +set date:create +set date:timestamp' }, validate_media_type: false diff --git a/app/models/report_note.rb b/app/models/report_note.rb index b5c40a18b..7361c97e6 100644 --- a/app/models/report_note.rb +++ b/app/models/report_note.rb @@ -13,7 +13,7 @@ # class ReportNote < ApplicationRecord - CONTENT_SIZE_LIMIT = 500 + CONTENT_SIZE_LIMIT = 2_000 belongs_to :account belongs_to :report, inverse_of: :notes, touch: true diff --git a/app/models/site_upload.rb b/app/models/site_upload.rb index 03d472cdb..6431d1007 100644 --- a/app/models/site_upload.rb +++ b/app/models/site_upload.rb @@ -19,7 +19,30 @@ class SiteUpload < ApplicationRecord include Attachmentable + FAVICON_SIZES = [16, 32, 48].freeze + APPLE_ICON_SIZES = [57, 60, 72, 76, 114, 120, 144, 152, 167, 180, 1024].freeze + ANDROID_ICON_SIZES = [36, 48, 72, 96, 144, 192, 256, 384, 512].freeze + + APP_ICON_SIZES = (APPLE_ICON_SIZES + ANDROID_ICON_SIZES).uniq.freeze + STYLES = { + app_icon: + APP_ICON_SIZES.to_h do |size| + [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }] + end.freeze, + + favicon: { + ico: { + format: 'ico', + geometry: '48x48#', + file_geometry_parser: FastGeometryParser, + }.freeze, + }.merge( + FAVICON_SIZES.to_h do |size| + [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }] + end + ).freeze, + thumbnail: { '@1x': { format: 'png', diff --git a/app/models/status.rb b/app/models/status.rb index c2d7985b4..baa657800 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -39,6 +39,8 @@ class Status < ApplicationRecord include Status::SnapshotConcern include Status::ThreadingConcern + MEDIA_ATTACHMENTS_LIMIT = 4 + rate_limit by: :account, family: :statuses self.discard_column = :deleted_at @@ -82,7 +84,7 @@ class Status < ApplicationRecord has_many :local_reblogged, -> { merge(Account.local) }, through: :reblogs, source: :account has_many :local_bookmarked, -> { merge(Account.local) }, through: :bookmarks, source: :account - has_and_belongs_to_many :tags + has_and_belongs_to_many :tags # rubocop:disable Rails/HasAndBelongsToMany has_one :preview_cards_status, inverse_of: :status, dependent: :delete @@ -106,7 +108,9 @@ class Status < ApplicationRecord scope :remote, -> { where(local: false).where.not(uri: nil) } scope :local, -> { where(local: true).or(where(uri: nil)) } scope :with_accounts, ->(ids) { where(id: ids).includes(:account) } - scope :without_replies, -> { where('statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id') } + scope :without_replies, -> { not_reply.or(reply_to_account) } + scope :not_reply, -> { where(reply: false) } + scope :reply_to_account, -> { where(arel_table[:in_reply_to_account_id].eq arel_table[:account_id]) } scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) } scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) } scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) } @@ -153,9 +157,9 @@ class Status < ApplicationRecord :status_stat, :tags, :preloadable_poll, - preview_cards_status: [:preview_card], + preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, account: [:account_stat, user: :role], - active_mentions: { account: :account_stat }, + active_mentions: :account, reblog: [ :application, :tags, @@ -163,11 +167,11 @@ class Status < ApplicationRecord :conversation, :status_stat, :preloadable_poll, - preview_cards_status: [:preview_card], + preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, account: [:account_stat, user: :role], - active_mentions: { account: :account_stat }, + active_mentions: :account, ], - thread: { account: :account_stat } + thread: :account delegate :domain, to: :account, prefix: true @@ -264,7 +268,7 @@ class Status < ApplicationRecord end def reported? - @reported ||= Report.where(target_account: account).unresolved.exists?(['? = ANY(status_ids)', id]) + @reported ||= account.targeted_reports.unresolved.exists?(['? = ANY(status_ids)', id]) || account.strikes.exists?(['? = ANY(status_ids)', id.to_s]) end def emojis diff --git a/app/models/tag.rb b/app/models/tag.rb index 58baa48c0..3f88cb068 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -21,8 +21,10 @@ class Tag < ApplicationRecord include Paginable + # rubocop:disable Rails/HasAndBelongsToMany has_and_belongs_to_many :statuses has_and_belongs_to_many :accounts + # rubocop:enable Rails/HasAndBelongsToMany has_many :passive_relationships, class_name: 'TagFollow', inverse_of: :tag, dependent: :destroy has_many :featured_tags, dependent: :destroy, inverse_of: :tag @@ -35,7 +37,7 @@ class Tag < ApplicationRecord HASHTAG_LAST_SEQUENCE = '([[:word:]_]*[[:alpha:]][[:word:]_]*)' HASHTAG_NAME_PAT = "#{HASHTAG_FIRST_SEQUENCE}|#{HASHTAG_LAST_SEQUENCE}" - HASHTAG_RE = %r{(?(time_zone) { ActiveSupport::TimeZone[time_zone].nil? ? nil : time_zone } normalizes :chosen_languages, with: ->(chosen_languages) { chosen_languages.compact_blank.presence } - # This avoids a deprecation warning from Rails 5.1 - # It seems possible that a future release of devise-two-factor will - # handle this itself, and this can be removed from our User class. - attribute :otp_secret - has_many :session_activations, dependent: :destroy delegate :can?, to: :role diff --git a/app/policies/backup_policy.rb b/app/policies/backup_policy.rb index 86b8efbe9..7a4c5b434 100644 --- a/app/policies/backup_policy.rb +++ b/app/policies/backup_policy.rb @@ -4,6 +4,6 @@ class BackupPolicy < ApplicationPolicy MIN_AGE = 6.days def create? - user_signed_in? && current_user.backups.where('created_at >= ?', MIN_AGE.ago).count.zero? + user_signed_in? && current_user.backups.where(created_at: MIN_AGE.ago..).count.zero? end end diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb index 25df4d85a..92415a690 100644 --- a/app/presenters/instance_presenter.rb +++ b/app/presenters/instance_presenter.rb @@ -81,4 +81,16 @@ class InstancePresenter < ActiveModelSerializers::Model def mascot @mascot ||= Rails.cache.fetch('site_uploads/mascot') { SiteUpload.find_by(var: 'mascot') } end + + def favicon + return @favicon if defined?(@favicon) + + @favicon ||= Rails.cache.fetch('site_uploads/favicon') { SiteUpload.find_by(var: 'favicon') } + end + + def app_icon + return @app_icon if defined?(@app_icon) + + @app_icon ||= Rails.cache.fetch('site_uploads/app_icon') { SiteUpload.find_by(var: 'app_icon') } + end end diff --git a/app/presenters/oauth_metadata_presenter.rb b/app/presenters/oauth_metadata_presenter.rb new file mode 100644 index 000000000..546503bfc --- /dev/null +++ b/app/presenters/oauth_metadata_presenter.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +class OauthMetadataPresenter < ActiveModelSerializers::Model + include RoutingHelper + + attributes :issuer, :authorization_endpoint, :token_endpoint, + :revocation_endpoint, :scopes_supported, + :response_types_supported, :response_modes_supported, + :grant_types_supported, :token_endpoint_auth_methods_supported, + :service_documentation, :app_registration_endpoint + + def issuer + root_url + end + + def service_documentation + 'https://docs.joinmastodon.org/' + end + + def authorization_endpoint + oauth_authorization_url + end + + def token_endpoint + oauth_token_url + end + + # As the api_v1_apps route doesn't technically conform to the specification + # for OAuth 2.0 Dynamic Client Registration defined in RFC 7591 we use a + # non-standard property for now to indicate the mastodon specific registration + # endpoint. See: https://datatracker.ietf.org/doc/html/rfc7591 + def app_registration_endpoint + api_v1_apps_url + end + + def revocation_endpoint + oauth_revoke_url + end + + def scopes_supported + doorkeeper.scopes + end + + def response_types_supported + doorkeeper.authorization_response_types + end + + def response_modes_supported + doorkeeper.authorization_response_flows.flat_map(&:response_mode_matches).uniq + end + + def grant_types_supported + grant_types_supported = doorkeeper.grant_flows.dup + grant_types_supported << 'refresh_token' if doorkeeper.refresh_token_enabled? + grant_types_supported + end + + def token_endpoint_auth_methods_supported + %w(client_secret_basic client_secret_post) + end + + private + + def doorkeeper + @doorkeeper ||= Doorkeeper.configuration + end +end diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb index 1c1f7d0ad..a39fb5ef5 100644 --- a/app/serializers/manifest_serializer.rb +++ b/app/serializers/manifest_serializer.rb @@ -1,21 +1,10 @@ # frozen_string_literal: true class ManifestSerializer < ActiveModel::Serializer + include ApplicationHelper include RoutingHelper include ActionView::Helpers::TextHelper - ICON_SIZES = %w( - 36 - 48 - 72 - 96 - 144 - 192 - 256 - 384 - 512 - ).freeze - attributes :id, :name, :short_name, :icons, :theme_color, :background_color, :display, :start_url, :scope, @@ -37,9 +26,12 @@ class ManifestSerializer < ActiveModel::Serializer end def icons - ICON_SIZES.map do |size| + SiteUpload::ANDROID_ICON_SIZES.map do |size| + src = app_icon_path(size.to_i) + src = URI.join(root_url, src).to_s if src.present? + { - src: frontend_asset_url("icons/android-chrome-#{size}x#{size}.png"), + src: src || frontend_asset_url("icons/android-chrome-#{size}x#{size}.png"), sizes: "#{size}x#{size}", type: 'image/png', purpose: 'any maskable', diff --git a/app/serializers/oauth_metadata_serializer.rb b/app/serializers/oauth_metadata_serializer.rb new file mode 100644 index 000000000..5f3dc7b87 --- /dev/null +++ b/app/serializers/oauth_metadata_serializer.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class OauthMetadataSerializer < ActiveModel::Serializer + attributes :issuer, :authorization_endpoint, :token_endpoint, + :revocation_endpoint, :scopes_supported, + :response_types_supported, :response_modes_supported, + :grant_types_supported, :token_endpoint_auth_methods_supported, + :service_documentation, :app_registration_endpoint +end diff --git a/app/serializers/rest/application_serializer.rb b/app/serializers/rest/application_serializer.rb index 635508a17..1a7b9265f 100644 --- a/app/serializers/rest/application_serializer.rb +++ b/app/serializers/rest/application_serializer.rb @@ -1,24 +1,18 @@ # frozen_string_literal: true class REST::ApplicationSerializer < ActiveModel::Serializer - attributes :id, :name, :website, :scopes, :redirect_uri, - :client_id, :client_secret + attributes :id, :name, :website, :scopes, :redirect_uris # NOTE: Deprecated in 4.3.0, needs to be removed in 5.0.0 attribute :vapid_key + # We should consider this property deprecated for 4.3.0 + attribute :redirect_uri + def id object.id.to_s end - def client_id - object.uid - end - - def client_secret - object.secret - end - def website object.website.presence end diff --git a/app/serializers/rest/credential_application_serializer.rb b/app/serializers/rest/credential_application_serializer.rb new file mode 100644 index 000000000..bfec7d03e --- /dev/null +++ b/app/serializers/rest/credential_application_serializer.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class REST::CredentialApplicationSerializer < REST::ApplicationSerializer + attributes :client_id, :client_secret + + def client_id + object.uid + end + + def client_secret + object.secret + end +end diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index 42b73f438..8df79db6c 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -59,7 +59,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer statuses: { max_characters: StatusLengthValidator::MAX_CHARS, - max_media_attachments: 4, + max_media_attachments: Status::MEDIA_ATTACHMENTS_LIMIT, characters_reserved_per_url: StatusLengthValidator::URL_PLACEHOLDER_CHARS, }, diff --git a/app/serializers/rest/preview_card_serializer.rb b/app/serializers/rest/preview_card_serializer.rb index 039262cd5..7d4c99c2d 100644 --- a/app/serializers/rest/preview_card_serializer.rb +++ b/app/serializers/rest/preview_card_serializer.rb @@ -8,6 +8,8 @@ class REST::PreviewCardSerializer < ActiveModel::Serializer :provider_url, :html, :width, :height, :image, :image_description, :embed_url, :blurhash, :published_at + has_one :author_account, serializer: REST::AccountSerializer, if: -> { object.author_account.present? } + def url object.original_url.presence || object.url end diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb index fdf939cfc..636925b97 100644 --- a/app/serializers/rest/v1/instance_serializer.rb +++ b/app/serializers/rest/v1/instance_serializer.rb @@ -64,7 +64,7 @@ class REST::V1::InstanceSerializer < ActiveModel::Serializer statuses: { max_characters: StatusLengthValidator::MAX_CHARS, - max_media_attachments: 4, + max_media_attachments: Status::MEDIA_ATTACHMENTS_LIMIT, characters_reserved_per_url: StatusLengthValidator::URL_PLACEHOLDER_CHARS, }, diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index 571a0fa57..b86c9b9e7 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -151,13 +151,23 @@ class AccountSearchService < BaseService end def call(query, account = nil, options = {}) - @query = query&.strip&.gsub(/\A@/, '') - @limit = options[:limit].to_i - @offset = options[:offset].to_i - @options = options - @account = account + MastodonOTELTracer.in_span('AccountSearchService#call') do |span| + @query = query&.strip&.gsub(/\A@/, '') + @limit = options[:limit].to_i + @offset = options[:offset].to_i + @options = options + @account = account - search_service_results.compact.uniq + span.add_attributes( + 'search.offset' => @offset, + 'search.limit' => @limit, + 'search.backend' => Chewy.enabled? ? 'elasticsearch' : 'database' + ) + + search_service_results.compact.uniq.tap do |results| + span.set_attribute('search.results.count', results.size) + end + end end private diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index fb2b33114..1dbed27f2 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -73,7 +73,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService as_array(@json['attachment']).each do |attachment| media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment) - next if media_attachment_parser.remote_url.blank? || @next_media_attachments.size > 4 + next if media_attachment_parser.remote_url.blank? || @next_media_attachments.size > Status::MEDIA_ATTACHMENTS_LIMIT begin media_attachment = previous_media_attachments.find { |previous_media_attachment| previous_media_attachment.remote_url == media_attachment_parser.remote_url } diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index c6b600dd7..900cb9863 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -56,7 +56,7 @@ class FetchLinkCardService < BaseService @html_charset = res.charset - res.body_with_limit + res.truncated_body end end @@ -147,9 +147,12 @@ class FetchLinkCardService < BaseService return if html.nil? link_details_extractor = LinkDetailsExtractor.new(@url, @html, @html_charset) + provider = PreviewCardProvider.matching_domain(Addressable::URI.parse(link_details_extractor.canonical_url).normalized_host) + linked_account = ResolveAccountService.new.call(link_details_extractor.author_account, suppress_errors: true) if link_details_extractor.author_account.present? && provider&.trendable? @card = PreviewCard.find_or_initialize_by(url: link_details_extractor.canonical_url) if link_details_extractor.canonical_url != @card.url @card.assign_attributes(link_details_extractor.to_preview_card_attributes) + @card.author_account = linked_account @card.save_with_optional_image! unless @card.title.blank? && @card.html.blank? end end diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index e56562c0a..1f01c2d48 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -147,6 +147,9 @@ class NotifyService < BaseService end def statuses_that_mention_sender + # This queries private mentions from the recipient to the sender up in the thread. + # This allows up to 100 messages that do not match in the thread, allowing conversations + # involving multiple people. Status.count_by_sql([<<-SQL.squish, id: @notification.target_status.in_reply_to_id, recipient_id: @recipient.id, sender_id: @sender.id, depth_limit: 100]) WITH RECURSIVE ancestors(id, in_reply_to_id, mention_id, path, depth) AS ( SELECT s.id, s.in_reply_to_id, m.id, ARRAY[s.id], 0 @@ -154,16 +157,17 @@ class NotifyService < BaseService LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id WHERE s.id = :id UNION ALL - SELECT s.id, s.in_reply_to_id, m.id, st.path || s.id, st.depth + 1 - FROM ancestors st - JOIN statuses s ON s.id = st.in_reply_to_id - LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id - WHERE st.mention_id IS NULL AND NOT s.id = ANY(path) AND st.depth < :depth_limit + SELECT s.id, s.in_reply_to_id, m.id, ancestors.path || s.id, ancestors.depth + 1 + FROM ancestors + JOIN statuses s ON s.id = ancestors.in_reply_to_id + /* early exit if we already have a mention matching our requirements */ + LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id AND s.account_id = :recipient_id + WHERE ancestors.mention_id IS NULL AND NOT s.id = ANY(path) AND ancestors.depth < :depth_limit ) SELECT COUNT(*) - FROM ancestors st - JOIN statuses s ON s.id = st.id - WHERE st.mention_id IS NOT NULL AND s.visibility = 3 + FROM ancestors + JOIN statuses s ON s.id = ancestors.id + WHERE ancestors.mention_id IS NOT NULL AND s.account_id = :recipient_id AND s.visibility = 3 SQL end end diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 22a6a24af..83a931817 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -130,9 +130,9 @@ class PostStatusService < BaseService return end - raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > 4 || @options[:poll].present? + raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > Status::MEDIA_ATTACHMENTS_LIMIT || @options[:poll].present? - @media = @account.media_attachments.where(status_id: nil).where(id: @options[:media_ids].take(4).map(&:to_i)) + @media = @account.media_attachments.where(status_id: nil).where(id: @options[:media_ids].take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:to_i)) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if @media.size > 1 && @media.find(&:audio_or_video?) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_ready') if @media.any?(&:not_processed?) diff --git a/app/services/report_service.rb b/app/services/report_service.rb index fe546c383..dea6df7b0 100644 --- a/app/services/report_service.rb +++ b/app/services/report_service.rb @@ -81,7 +81,7 @@ class ReportService < BaseService # If the account making reports is remote, it is likely anonymized so we have to relax the requirements for attaching statuses. domain = @source_account.domain.to_s.downcase - has_followers = @target_account.followers.where(Account.arel_table[:domain].lower.eq(domain)).exists? + has_followers = @target_account.followers.with_domain(domain).exists? visibility = has_followers ? %i(public unlisted private) : %i(public unlisted) scope = @target_account.statuses.with_discarded scope.merge!(scope.where(visibility: visibility).or(scope.where('EXISTS (SELECT 1 FROM mentions m JOIN accounts a ON m.account_id = a.id WHERE lower(a.domain) = ?)', domain))) diff --git a/app/services/statuses_search_service.rb b/app/services/statuses_search_service.rb index 7d5b0203a..ab8e28f61 100644 --- a/app/services/statuses_search_service.rb +++ b/app/services/statuses_search_service.rb @@ -2,14 +2,24 @@ class StatusesSearchService < BaseService def call(query, account = nil, options = {}) - @query = query&.strip - @account = account - @options = options - @limit = options[:limit].to_i - @offset = options[:offset].to_i + MastodonOTELTracer.in_span('StatusesSearchService#call') do |span| + @query = query&.strip + @account = account + @options = options + @limit = options[:limit].to_i + @offset = options[:offset].to_i + convert_deprecated_options! - convert_deprecated_options! - status_search_results + span.add_attributes( + 'search.offset' => @offset, + 'search.limit' => @limit, + 'search.backend' => Chewy.enabled? ? 'elasticsearch' : 'database' + ) + + status_search_results.tap do |results| + span.set_attribute('search.results.count', results.size) + end + end end private diff --git a/app/services/tag_search_service.rb b/app/services/tag_search_service.rb index 929cfd884..57400b76a 100644 --- a/app/services/tag_search_service.rb +++ b/app/services/tag_search_service.rb @@ -2,15 +2,25 @@ class TagSearchService < BaseService def call(query, options = {}) - @query = query.strip.delete_prefix('#') - @offset = options.delete(:offset).to_i - @limit = options.delete(:limit).to_i - @options = options + MastodonOTELTracer.in_span('TagSearchService#call') do |span| + @query = query.strip.delete_prefix('#') + @offset = options.delete(:offset).to_i + @limit = options.delete(:limit).to_i + @options = options - results = from_elasticsearch if Chewy.enabled? - results ||= from_database + span.add_attributes( + 'search.offset' => @offset, + 'search.limit' => @limit, + 'search.backend' => Chewy.enabled? ? 'elasticsearch' : 'database' + ) - results + results = from_elasticsearch if Chewy.enabled? + results ||= from_database + + span.set_attribute('search.results.count', results.size) + + results + end end private diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb index cdfe28365..dc7d177e2 100644 --- a/app/services/update_status_service.rb +++ b/app/services/update_status_service.rb @@ -69,9 +69,9 @@ class UpdateStatusService < BaseService def validate_media! return [] if @options[:media_ids].blank? || !@options[:media_ids].is_a?(Enumerable) - raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > 4 || @options[:poll].present? + raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > Status::MEDIA_ATTACHMENTS_LIMIT || @options[:poll].present? - media_attachments = @status.account.media_attachments.where(status_id: [nil, @status.id]).where(scheduled_status_id: nil).where(id: @options[:media_ids].take(4).map(&:to_i)).to_a + media_attachments = @status.account.media_attachments.where(status_id: [nil, @status.id]).where(scheduled_status_id: nil).where(id: @options[:media_ids].take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:to_i)).to_a raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if media_attachments.size > 1 && media_attachments.find(&:audio_or_video?) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_ready') if media_attachments.any?(&:not_processed?) diff --git a/app/validators/unique_username_validator.rb b/app/validators/unique_username_validator.rb index 09c8fadb5..c417e2f69 100644 --- a/app/validators/unique_username_validator.rb +++ b/app/validators/unique_username_validator.rb @@ -6,10 +6,7 @@ class UniqueUsernameValidator < ActiveModel::Validator def validate(account) return if account.username.blank? - normalized_username = account.username.downcase - normalized_domain = account.domain&.downcase - - scope = Account.where(Account.arel_table[:username].lower.eq normalized_username).where(Account.arel_table[:domain].lower.eq normalized_domain) + scope = Account.with_username(account.username).with_domain(account.domain) scope = scope.where.not(id: account.id) if account.persisted? account.errors.add(:username, :taken) if scope.exists? diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index 41fcafa29..f148b9a08 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -30,7 +30,7 @@ = render 'admin/accounts/counters', account: @account - if @account.local? && @account.user.nil? - = link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.matching_account(@account).exists? + = link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.exists?(reference_account_id: @account.id) - else .table-wrapper %table.table.inline-table @@ -62,14 +62,16 @@ .report-notes = render partial: 'admin/report_notes/report_note', collection: @moderation_notes - = simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |f| - = f.hidden_field :target_account_id + = simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |form| + = form.hidden_field :target_account_id + + = render 'shared/error_messages', object: @account_moderation_note .field-group - = f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6 + = form.input :content, input_html: { placeholder: t('admin.reports.notes.placeholder'), maxlength: AccountModerationNote::CONTENT_SIZE_LIMIT, rows: 6, autofocus: @account_moderation_note.errors.any? } .actions - = f.button :button, t('admin.account_moderation_notes.create'), type: :submit + = form.button :button, t('admin.account_moderation_notes.create'), type: :submit %hr.spacer/ diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml index c880021cf..842aa5159 100644 --- a/app/views/admin/reports/show.html.haml +++ b/app/views/admin/reports/show.html.haml @@ -83,15 +83,17 @@ .report-notes = render @report_notes -= simple_form_for @report_note, url: admin_report_notes_path do |f| - = f.input :report_id, as: :hidden += simple_form_for @report_note, url: admin_report_notes_path do |form| + = form.input :report_id, as: :hidden + + = render 'shared/error_messages', object: @report_note .field-group - = f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6 + = form.input :content, input_html: { placeholder: t('admin.reports.notes.placeholder'), maxlength: ReportNote::CONTENT_SIZE_LIMIT, rows: 6, autofocus: @report_note.errors.any? } .actions - if @report.unresolved? - = f.button :button, t('admin.reports.notes.create_and_resolve'), name: :create_and_resolve, type: :submit + = form.button :button, t('admin.reports.notes.create_and_resolve'), name: :create_and_resolve, type: :submit - else - = f.button :button, t('admin.reports.notes.create_and_unresolve'), name: :create_and_unresolve, type: :submit - = f.button :button, t('admin.reports.notes.create'), type: :submit + = form.button :button, t('admin.reports.notes.create_and_unresolve'), name: :create_and_unresolve, type: :submit + = form.button :button, t('admin.reports.notes.create'), type: :submit diff --git a/app/views/admin/rules/_form.html.haml b/app/views/admin/rules/_form.html.haml new file mode 100644 index 000000000..9fc54e288 --- /dev/null +++ b/app/views/admin/rules/_form.html.haml @@ -0,0 +1,7 @@ +.fields-group + = form.input :text, + wrapper: :with_block_label + +.fields-group + = form.input :hint, + wrapper: :with_block_label diff --git a/app/views/admin/rules/edit.html.haml b/app/views/admin/rules/edit.html.haml index 77815588d..9e3c91581 100644 --- a/app/views/admin/rules/edit.html.haml +++ b/app/views/admin/rules/edit.html.haml @@ -1,14 +1,10 @@ - content_for :page_title do = t('admin.rules.edit') -= simple_form_for @rule, url: admin_rule_path(@rule) do |f| += simple_form_for @rule, url: admin_rule_path(@rule) do |form| = render 'shared/error_messages', object: @rule - .fields-group - = f.input :text, wrapper: :with_block_label - - .fields-group - = f.input :hint, wrapper: :with_block_label + = render form .actions - = f.button :button, t('generic.save_changes'), type: :submit + = form.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/admin/rules/index.html.haml b/app/views/admin/rules/index.html.haml index dd15ce03c..5a2789edc 100644 --- a/app/views/admin/rules/index.html.haml +++ b/app/views/admin/rules/index.html.haml @@ -6,17 +6,13 @@ %hr.spacer/ - if can? :create, :rule - = simple_form_for @rule, url: admin_rules_path do |f| + = simple_form_for @rule, url: admin_rules_path do |form| = render 'shared/error_messages', object: @rule - .fields-group - = f.input :text, wrapper: :with_block_label - - .fields-group - = f.input :hint, wrapper: :with_block_label + = render form .actions - = f.button :button, t('admin.rules.add_new'), type: :submit + = form.button :button, t('admin.rules.add_new'), type: :submit %hr.spacer/ diff --git a/app/views/admin/settings/branding/show.html.haml b/app/views/admin/settings/branding/show.html.haml index 769c0dafe..71aac5ead 100644 --- a/app/views/admin/settings/branding/show.html.haml +++ b/app/views/admin/settings/branding/show.html.haml @@ -40,5 +40,33 @@ = fa_icon 'trash fw' = t('admin.site_uploads.delete') + .fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :favicon, + as: :file, + input_html: { accept: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].join(',') }, + wrapper: :with_block_label + + .fields-row__column.fields-row__column-6.fields-group + - if @admin_settings.favicon.persisted? + = image_tag @admin_settings.favicon.file.url('48'), class: 'fields-group__thumbnail' + = link_to admin_site_upload_path(@admin_settings.favicon), data: { method: :delete }, class: 'link-button link-button--destructive' do + = fa_icon 'trash fw' + = t('admin.site_uploads.delete') + + .fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :app_icon, + as: :file, + input_html: { accept: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].join(',') }, + wrapper: :with_block_label + + .fields-row__column.fields-row__column-6.fields-group + - if @admin_settings.app_icon.persisted? + = image_tag @admin_settings.app_icon.file.url('48'), class: 'fields-group__thumbnail' + = link_to admin_site_upload_path(@admin_settings.app_icon), data: { method: :delete }, class: 'link-button link-button--destructive' do + = fa_icon 'trash fw' + = t('admin.site_uploads.delete') + .actions = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/admin/warning_presets/_form.html.haml b/app/views/admin/warning_presets/_form.html.haml new file mode 100644 index 000000000..cba74163c --- /dev/null +++ b/app/views/admin/warning_presets/_form.html.haml @@ -0,0 +1,7 @@ +.fields-group + = form.input :title, + wrapper: :with_block_label + +.fields-group + = form.input :text, + wrapper: :with_block_label diff --git a/app/views/admin/warning_presets/edit.html.haml b/app/views/admin/warning_presets/edit.html.haml index b5c5107ef..f0bd9c12e 100644 --- a/app/views/admin/warning_presets/edit.html.haml +++ b/app/views/admin/warning_presets/edit.html.haml @@ -1,14 +1,10 @@ - content_for :page_title do = t('admin.warning_presets.edit_preset') -= simple_form_for @warning_preset, url: admin_warning_preset_path(@warning_preset) do |f| += simple_form_for @warning_preset, url: admin_warning_preset_path(@warning_preset) do |form| = render 'shared/error_messages', object: @warning_preset - .fields-group - = f.input :title, wrapper: :with_block_label - - .fields-group - = f.input :text, wrapper: :with_block_label + = render form .actions - = f.button :button, t('generic.save_changes'), type: :submit + = form.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/admin/warning_presets/index.html.haml b/app/views/admin/warning_presets/index.html.haml index b26a13d96..22fee2105 100644 --- a/app/views/admin/warning_presets/index.html.haml +++ b/app/views/admin/warning_presets/index.html.haml @@ -2,17 +2,13 @@ = t('admin.warning_presets.title') - if can? :create, :account_warning_preset - = simple_form_for @warning_preset, url: admin_warning_presets_path do |f| + = simple_form_for @warning_preset, url: admin_warning_presets_path do |form| = render 'shared/error_messages', object: @warning_preset - .fields-group - = f.input :title, wrapper: :with_block_label - - .fields-group - = f.input :text, wrapper: :with_block_label + = render form .actions - = f.button :button, t('admin.warning_presets.add_new'), type: :submit + = form.button :button, t('admin.warning_presets.add_new'), type: :submit %hr.spacer/ diff --git a/app/views/admin/webhooks/edit.html.haml b/app/views/admin/webhooks/edit.html.haml index 2c2a7aa03..abc9bdfab 100644 --- a/app/views/admin/webhooks/edit.html.haml +++ b/app/views/admin/webhooks/edit.html.haml @@ -2,6 +2,6 @@ = t('admin.webhooks.edit') = simple_form_for @webhook, url: admin_webhook_path(@webhook) do |form| - = render partial: 'form', object: form + = render form .actions = form.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/admin/webhooks/new.html.haml b/app/views/admin/webhooks/new.html.haml index f51b039ce..50fcdc2be 100644 --- a/app/views/admin/webhooks/new.html.haml +++ b/app/views/admin/webhooks/new.html.haml @@ -2,6 +2,6 @@ = t('admin.webhooks.new') = simple_form_for @webhook, url: admin_webhooks_path do |form| - = render partial: 'form', object: form + = render form .actions = form.button :button, t('admin.webhooks.add_new'), type: :submit diff --git a/app/views/filters/_filter_fields.html.haml b/app/views/filters/_filter_fields.html.haml index 5b297a6a9..0f4049ffb 100644 --- a/app/views/filters/_filter_fields.html.haml +++ b/app/views/filters/_filter_fields.html.haml @@ -6,7 +6,7 @@ wrapper: :with_label .fields-row__column.fields-row__column-6.fields-group = f.input :expires_in, - collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), + collection: CustomFilter::EXPIRATION_DURATIONS.map(&:to_i), include_blank: I18n.t('invites.expires_in_prompt'), label_method: ->(i) { I18n.t("invites.expires_in.#{i}") }, wrapper: :with_label diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 9d7669d68..5957d1dbf 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -11,13 +11,13 @@ - if storage_host? %link{ rel: 'dns-prefetch', href: storage_host }/ - %link{ rel: 'icon', href: '/favicon.ico', type: 'image/x-icon' }/ + %link{ rel: 'icon', href: favicon_path('ico') || '/favicon.ico', type: 'image/x-icon' }/ - - %w(16 32 48).each do |size| - %link{ rel: 'icon', sizes: "#{size}x#{size}", href: frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/ + - SiteUpload::FAVICON_SIZES.each do |size| + %link{ rel: 'icon', sizes: "#{size}x#{size}", href: favicon_path(size.to_i) || frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/ - - %w(57 60 72 76 114 120 144 152 167 180 1024).each do |size| - %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/ + - SiteUpload::APPLE_ICON_SIZES.each do |size| + %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: app_icon_path(size.to_i) || frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/ %link{ rel: 'mask-icon', href: frontend_asset_path('images/logo-symbol-icon.svg'), color: '#6364FF' }/ %link{ rel: 'manifest', href: manifest_path(format: :json) }/ diff --git a/app/views/settings/applications/_fields.html.haml b/app/views/settings/applications/_fields.html.haml index ed97e880f..d53984895 100644 --- a/app/views/settings/applications/_fields.html.haml +++ b/app/views/settings/applications/_fields.html.haml @@ -11,6 +11,7 @@ .fields-group = f.input :redirect_uri, label: t('activerecord.attributes.doorkeeper/application.redirect_uri'), hint: t('doorkeeper.applications.help.redirect_uri'), + required: true, wrapper: :with_block_label %p.hint= t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: content_tag(:code, Doorkeeper.configuration.native_redirect_uri)).html_safe diff --git a/app/workers/scheduler/ip_cleanup_scheduler.rb b/app/workers/scheduler/ip_cleanup_scheduler.rb index f78c0584d..04fb0aaa3 100644 --- a/app/workers/scheduler/ip_cleanup_scheduler.rb +++ b/app/workers/scheduler/ip_cleanup_scheduler.rb @@ -16,11 +16,11 @@ class Scheduler::IpCleanupScheduler private def clean_ip_columns! - SessionActivation.where('updated_at < ?', SESSION_RETENTION_PERIOD.ago).in_batches.destroy_all - SessionActivation.where('updated_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(ip: nil) - User.where('current_sign_in_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(sign_up_ip: nil) - LoginActivity.where('created_at < ?', IP_RETENTION_PERIOD.ago).in_batches.destroy_all - Doorkeeper::AccessToken.where('last_used_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(last_used_ip: nil) + SessionActivation.where(updated_at: ...SESSION_RETENTION_PERIOD.ago).in_batches.destroy_all + SessionActivation.where(updated_at: ...IP_RETENTION_PERIOD.ago).in_batches.update_all(ip: nil) + User.where(current_sign_in_at: ...IP_RETENTION_PERIOD.ago).in_batches.update_all(sign_up_ip: nil) + LoginActivity.where(created_at: ...IP_RETENTION_PERIOD.ago).in_batches.destroy_all + Doorkeeper::AccessToken.where(last_used_at: ...IP_RETENTION_PERIOD.ago).in_batches.update_all(last_used_ip: nil) end def clean_expired_ip_blocks! diff --git a/app/workers/scheduler/scheduled_statuses_scheduler.rb b/app/workers/scheduler/scheduled_statuses_scheduler.rb index fe60d5524..4e251780d 100644 --- a/app/workers/scheduler/scheduled_statuses_scheduler.rb +++ b/app/workers/scheduler/scheduled_statuses_scheduler.rb @@ -20,7 +20,7 @@ class Scheduler::ScheduledStatusesScheduler end def due_statuses - ScheduledStatus.where('scheduled_at <= ?', Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET) + ScheduledStatus.where(scheduled_at: ..Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET) end def publish_scheduled_announcements! diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb index 2d2efc731..74abc2370 100644 --- a/app/workers/scheduler/user_cleanup_scheduler.rb +++ b/app/workers/scheduler/user_cleanup_scheduler.rb @@ -3,6 +3,9 @@ class Scheduler::UserCleanupScheduler include Sidekiq::Worker + UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS = 7 + DISCARDED_STATUSES_MAX_AGE_DAYS = 30 + sidekiq_options retry: 0, lock: :until_executed, lock_ttl: 1.day.to_i def perform @@ -13,7 +16,7 @@ class Scheduler::UserCleanupScheduler private def clean_unconfirmed_accounts! - User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).reorder(nil).find_in_batches do |batch| + User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch| # We have to do it separately because of missing database constraints AccountModerationNote.where(target_account_id: batch.map(&:account_id)).delete_all Account.where(id: batch.map(&:account_id)).delete_all @@ -22,7 +25,7 @@ class Scheduler::UserCleanupScheduler end def clean_discarded_statuses! - Status.unscoped.discarded.where('deleted_at <= ?', 30.days.ago).find_in_batches do |statuses| + Status.unscoped.discarded.where(deleted_at: ..DISCARDED_STATUSES_MAX_AGE_DAYS.days.ago).find_in_batches do |statuses| RemovalWorker.push_bulk(statuses) do |status| [status.id, { 'immediate' => true, 'skip_streaming' => true }] end diff --git a/app/workers/scheduler/vacuum_scheduler.rb b/app/workers/scheduler/vacuum_scheduler.rb index 1c9a2aabe..c22d6f5f8 100644 --- a/app/workers/scheduler/vacuum_scheduler.rb +++ b/app/workers/scheduler/vacuum_scheduler.rb @@ -22,7 +22,6 @@ class Scheduler::VacuumScheduler preview_cards_vacuum, backups_vacuum, access_tokens_vacuum, - applications_vacuum, feeds_vacuum, imports_vacuum, ] @@ -56,10 +55,6 @@ class Scheduler::VacuumScheduler Vacuum::ImportsVacuum.new end - def applications_vacuum - Vacuum::ApplicationsVacuum.new - end - def content_retention_policy ContentRetentionPolicy.current end diff --git a/bin/dev b/bin/dev index 9b1d3ac6f..0911bae55 100755 --- a/bin/dev +++ b/bin/dev @@ -6,7 +6,7 @@ export PORT="${PORT:-3000}" # Get around our boot.rb ENV check export RAILS_ENV="${RAILS_ENV:-development}" -if command -v overmind &> /dev/null +if command -v overmind 1> /dev/null 2>&1 then overmind start -f Procfile.dev "$@" exit $? diff --git a/config/application.rb b/config/application.rb index 1b3878992..6d6e91a5c 100644 --- a/config/application.rb +++ b/config/application.rb @@ -40,6 +40,7 @@ require_relative '../lib/mastodon/rack_middleware' require_relative '../lib/public_file_server_middleware' require_relative '../lib/devise/strategies/two_factor_ldap_authenticatable' require_relative '../lib/devise/strategies/two_factor_pam_authenticatable' +require_relative '../lib/elasticsearch/client_extensions' require_relative '../lib/chewy/settings_extensions' require_relative '../lib/chewy/index_extensions' require_relative '../lib/chewy/strategy/mastodon' @@ -47,16 +48,13 @@ require_relative '../lib/chewy/strategy/bypass_with_warning' require_relative '../lib/webpacker/manifest_extensions' require_relative '../lib/webpacker/helper_extensions' require_relative '../lib/rails/engine_extensions' +require_relative '../lib/action_dispatch/remote_ip_extensions' require_relative '../lib/active_record/database_tasks_extensions' require_relative '../lib/active_record/batches' require_relative '../lib/simple_navigation/item_extensions' -Dotenv::Rails.load - Bundler.require(:pam_authentication) if ENV['PAM_ENABLED'] == 'true' -require_relative '../lib/mastodon/redis_config' - module Mastodon class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. @@ -98,6 +96,10 @@ module Mastodon app.deprecators[:mastodon] = ActiveSupport::Deprecation.new('4.3', 'mastodon/mastodon') end + config.before_configuration do + require 'mastodon/redis_config' + end + config.to_prepare do Doorkeeper::AuthorizationsController.layout 'modal' Doorkeeper::AuthorizedApplicationsController.layout 'admin' diff --git a/config/environments/development.rb b/config/environments/development.rb index a855f5a16..a3254125c 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -87,8 +87,7 @@ Rails.application.configure do # Otherwise, use letter_opener, which launches a browser window to view sent mail. config.action_mailer.delivery_method = ENV['HEROKU'] || ENV['VAGRANT'] || ENV['REMOTE_DEV'] ? :letter_opener_web : :letter_opener - # We provide a default secret for the development environment here. - # This value should not be used in production environments! + # TODO: Remove once devise-two-factor data migration complete config.x.otp_secret = ENV.fetch('OTP_SECRET', '1fc2b87989afa6351912abeebe31ffc5c476ead9bf8b3d74cbc4a302c7b69a45b40b1bbef3506ddad73e942e15ed5ca4b402bf9a66423626051104f4b5f05109') # Raise error when a before_action's only/except options reference missing actions diff --git a/config/environments/production.rb b/config/environments/production.rb index 49e02b53d..a39843e95 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -86,9 +86,7 @@ Rails.application.configure do config.lograge.enabled = true config.lograge.custom_payload do |controller| - if controller.respond_to?(:signed_request?) && controller.signed_request? - { key: controller.signature_key_id } - end + { key: controller.signature_key_id } if controller.respond_to?(:signed_request?) && controller.signed_request? end # Use a different logger for distributed setups. @@ -157,6 +155,7 @@ Rails.application.configure do 'Referrer-Policy' => 'same-origin', } + # TODO: Remove once devise-two-factor data migration complete config.x.otp_secret = ENV.fetch('OTP_SECRET') # Enable DNS rebinding protection and other `Host` header attacks. diff --git a/config/environments/test.rb b/config/environments/test.rb index 13e197338..49b0c1f30 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -44,6 +44,7 @@ Rails.application.configure do # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr + # TODO: Remove once devise-two-factor data migration complete config.x.otp_secret = '100c7faeef00caa29242f6b04156742bf76065771fd4117990c4282b8748ff3d99f8fdae97c982ab5bd2e6756a159121377cce4421f4a8ecd2d67bd7749a3fb4' # Generate random VAPID keys diff --git a/config/imagemagick/policy.xml b/config/imagemagick/policy.xml index e2aa202f2..2730a9f84 100644 --- a/config/imagemagick/policy.xml +++ b/config/imagemagick/policy.xml @@ -23,5 +23,5 @@ - + diff --git a/config/initializers/active_record_encryption.rb b/config/initializers/active_record_encryption.rb index f99585b4a..777bafc27 100644 --- a/config/initializers/active_record_encryption.rb +++ b/config/initializers/active_record_encryption.rb @@ -5,18 +5,27 @@ ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY ).each do |key| - ENV.fetch(key) do - raise <<~MESSAGE + value = ENV.fetch(key) do + abort <<~MESSAGE - The ActiveRecord encryption feature requires that these variables are set: + Mastodon now requires that these variables are set: - ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY - ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT - ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY - Run `bin/rails db:encryption:init` to generate values and then assign the environment variables. + Run `bin/rails db:encryption:init` to generate new secrets and then assign the environment variables. MESSAGE end + + next unless Rails.env.production? && value.end_with?('DO_NOT_USE_IN_PRODUCTION') + + abort <<~MESSAGE + + It looks like you are trying to run Mastodon in production with a #{key} value from the test environment. + + Please generate fresh secrets using `bin/rails db:encryption:init` and use them instead. + MESSAGE end Rails.application.configure do diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index f935090ef..5c88c4cd5 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -38,42 +38,25 @@ Warden::Manager.before_logout do |_, warden| end module Devise - mattr_accessor :pam_authentication - @@pam_authentication = false - mattr_accessor :pam_controlled_service - @@pam_controlled_service = nil + mattr_accessor :pam_authentication, default: false + mattr_accessor :pam_controlled_service, default: nil - mattr_accessor :check_at_sign - @@check_at_sign = false + mattr_accessor :check_at_sign, default: false - mattr_accessor :ldap_authentication - @@ldap_authentication = false - mattr_accessor :ldap_host - @@ldap_host = nil - mattr_accessor :ldap_port - @@ldap_port = nil - mattr_accessor :ldap_method - @@ldap_method = nil - mattr_accessor :ldap_base - @@ldap_base = nil - mattr_accessor :ldap_uid - @@ldap_uid = nil - mattr_accessor :ldap_mail - @@ldap_mail = nil - mattr_accessor :ldap_bind_dn - @@ldap_bind_dn = nil - mattr_accessor :ldap_password - @@ldap_password = nil - mattr_accessor :ldap_tls_no_verify - @@ldap_tls_no_verify = false - mattr_accessor :ldap_search_filter - @@ldap_search_filter = nil - mattr_accessor :ldap_uid_conversion_enabled - @@ldap_uid_conversion_enabled = false - mattr_accessor :ldap_uid_conversion_search - @@ldap_uid_conversion_search = nil - mattr_accessor :ldap_uid_conversion_replace - @@ldap_uid_conversion_replace = nil + mattr_accessor :ldap_authentication, default: false + mattr_accessor :ldap_host, default: nil + mattr_accessor :ldap_port, default: nil + mattr_accessor :ldap_method, default: nil + mattr_accessor :ldap_base, default: nil + mattr_accessor :ldap_uid, default: nil + mattr_accessor :ldap_mail, default: nil + mattr_accessor :ldap_bind_dn, default: nil + mattr_accessor :ldap_password, default: nil + mattr_accessor :ldap_tls_no_verify, default: false + mattr_accessor :ldap_search_filter, default: nil + mattr_accessor :ldap_uid_conversion_enabled, default: false + mattr_accessor :ldap_uid_conversion_search, default: nil + mattr_accessor :ldap_uid_conversion_replace, default: nil module Strategies class PamAuthenticatable @@ -96,9 +79,7 @@ module Devise return pass end - if validate(resource) - success!(resource) - end + success!(resource) if validate(resource) end private diff --git a/config/initializers/enable_yjit.rb b/config/initializers/enable_yjit.rb new file mode 100644 index 000000000..7b1053ec1 --- /dev/null +++ b/config/initializers/enable_yjit.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +# Automatically enable YJIT as of Ruby 3.3, as it brings very +# sizeable performance improvements. + +# If you are deploying to a memory constrained environment +# you may want to delete this file, but otherwise it's free +# performance. +if defined?(RubyVM::YJIT.enable) + Rails.application.config.after_initialize do + RubyVM::YJIT.enable + end +end diff --git a/config/initializers/opentelemetry.rb b/config/initializers/opentelemetry.rb new file mode 100644 index 000000000..d121a95a3 --- /dev/null +++ b/config/initializers/opentelemetry.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +# Set OTEL_* environment variables according to OTel docs: +# https://opentelemetry.io/docs/concepts/sdk-configuration/ + +if ENV.keys.any? { |name| name.match?(/OTEL_.*_ENDPOINT/) } + require 'opentelemetry/sdk' + require 'opentelemetry/exporter/otlp' + + require 'opentelemetry/instrumentation/active_job' + require 'opentelemetry/instrumentation/active_model_serializers' + require 'opentelemetry/instrumentation/concurrent_ruby' + require 'opentelemetry/instrumentation/excon' + require 'opentelemetry/instrumentation/faraday' + require 'opentelemetry/instrumentation/http' + require 'opentelemetry/instrumentation/http_client' + require 'opentelemetry/instrumentation/net/http' + require 'opentelemetry/instrumentation/pg' + require 'opentelemetry/instrumentation/rack' + require 'opentelemetry/instrumentation/rails' + require 'opentelemetry/instrumentation/redis' + require 'opentelemetry/instrumentation/sidekiq' + + OpenTelemetry::SDK.configure do |c| + # use_all() attempts to load ALL the auto-instrumentations + # currently loaded by Ruby requires. + # + # Load attempts will emit an INFO or WARN to the console + # about the success/failure to wire up an auto-instrumentation. + # "WARN -- : Instrumentation: failed to install" is most + # likely caused by not being a Ruby library loaded by + # the application or the instrumentation has been explicitly + # disabled. + # + # To disable an instrumentation, set an environment variable + # along this pattern: + # + # OTEL_RUBY_INSTRUMENTATION__ENABLED=false + # + # For example, PostgreSQL and Redis produce a lot of child spans + # in the course of this application doing its business. To turn + # them off, set the env vars below, but recognize that you will + # be missing details about what particular calls to the + # datastores are slow. + # + # OTEL_RUBY_INSTRUMENTATION_PG_ENABLED=false + # OTEL_RUBY_INSTRUMENTATION_REDIS_ENABLED=false + + c.use_all({ + 'OpenTelemetry::Instrumentation::Rack' => { + use_rack_events: false, # instead of events, use middleware; allows for untraced_endpoints to ignore child spans + untraced_endpoints: ['/health'], + }, + 'OpenTelemetry::Instrumentation::Sidekiq' => { + span_naming: :job_class, # Use the job class as the span name, otherwise this is the queue name and not very helpful + }, + }) + + prefix = ENV.fetch('OTEL_SERVICE_NAME_PREFIX', 'mastodon') + + c.service_name = case $PROGRAM_NAME + when /puma/ then "#{prefix}/web" + else + "#{prefix}/#{$PROGRAM_NAME.split('/').last}" + end + c.service_version = Mastodon::Version.to_s + end +end + +MastodonOTELTracer = OpenTelemetry.tracer_provider.tracer('mastodon') diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb index eda3bbe9f..a5abf4a3e 100644 --- a/config/initializers/paperclip.rb +++ b/config/initializers/paperclip.rb @@ -13,7 +13,7 @@ end Paperclip.interpolates :prefix_path do |attachment, _style| if attachment.storage_schema_version >= 1 && attachment.instance.respond_to?(:local?) && !attachment.instance.local? - 'cache' + File::SEPARATOR + "cache#{File::SEPARATOR}" else '' end @@ -159,7 +159,7 @@ else Paperclip::Attachment.default_options.merge!( storage: :filesystem, path: File.join(ENV.fetch('PAPERCLIP_ROOT_PATH', File.join(':rails_root', 'public', 'system')), ':prefix_path:class', ':attachment', ':id_partition', ':style', ':filename'), - url: ENV.fetch('PAPERCLIP_ROOT_URL', '/system') + '/:prefix_url:class/:attachment/:id_partition/:style/:filename' + url: "#{ENV.fetch('PAPERCLIP_ROOT_URL', '/system')}/:prefix_url:class/:attachment/:id_partition/:style/:filename" ) end diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb index fa1bdca54..14fab7ecd 100644 --- a/config/initializers/rack_attack.rb +++ b/config/initializers/rack_attack.rb @@ -37,6 +37,10 @@ class Rack::Attack authenticated_token&.id end + def warden_user_id + @env['warden']&.user&.id + end + def unauthenticated? !authenticated_user_id end @@ -58,10 +62,6 @@ class Rack::Attack end end - Rack::Attack.safelist('allow from localhost') do |req| - req.remote_ip == '127.0.0.1' || req.remote_ip == '::1' - end - Rack::Attack.blocklist('deny from blocklist') do |req| IpBlock.blocked?(req.remote_ip) end @@ -105,6 +105,10 @@ class Rack::Attack req.authenticated_user_id if (req.post? && req.path.match?(API_DELETE_REBLOG_REGEX)) || (req.delete? && req.path.match?(API_DELETE_STATUS_REGEX)) end + throttle('throttle_oauth_application_registrations/ip', limit: 5, period: 10.minutes) do |req| + req.throttleable_remote_ip if req.post? && req.path == '/api/v1/apps' + end + throttle('throttle_sign_up_attempts/ip', limit: 25, period: 5.minutes) do |req| req.throttleable_remote_ip if req.post? && req.path_matches?('/auth') end @@ -137,6 +141,10 @@ class Rack::Attack req.session[:attempt_user_id] || req.params.dig('user', 'email').presence if req.post? && req.path_matches?('/auth/sign_in') end + throttle('throttle_password_change/account', limit: 10, period: 10.minutes) do |req| + req.warden_user_id if req.put? || (req.patch? && req.path_matches?('/auth')) + end + self.throttled_responder = lambda do |request| now = Time.now.utc match_data = request.env['rack.attack.match_data'] diff --git a/config/initializers/simple_cov_source_file.rb b/config/initializers/simple_cov_source_file.rb new file mode 100644 index 000000000..c6b3586c8 --- /dev/null +++ b/config/initializers/simple_cov_source_file.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +# TODO: https://github.com/simplecov-ruby/simplecov/pull/1084 +# Patches this missing condition, monitor for upstream fix + +module SimpleCov + module SourceFileExtensions + def build_branches + coverage_branch_data = coverage_data.fetch('branches', {}) || {} # Add the final empty hash in case where 'branches' is present, but returns nil + branches = coverage_branch_data.flat_map do |condition, coverage_branches| + build_branches_from(condition, coverage_branches) + end + + process_skipped_branches(branches) + end + end +end + +SimpleCov::SourceFile.prepend(SimpleCov::SourceFileExtensions) if defined?(SimpleCov::SourceFile) diff --git a/config/locales/an.yml b/config/locales/an.yml index 068a20187..637aa8c8b 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -852,7 +852,6 @@ an: delete: Borrar edit_preset: Editar aviso predeterminau empty: Encara no has definiu garra preajuste d'alvertencia. - title: Editar configuración predeterminada d'avisos webhooks: add_new: Anyadir endpoint delete: Eliminar diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 93a0720b8..2ca7538c3 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -804,6 +804,7 @@ ar: desc_html: ويعتمد هذا على نصوص برمجية خارجية من hCaptcha، والتي قد تكون مصدر قلق يتعلق بالأمان والخصوصية. بالإضافة إلى ذلك، قد يؤدي ذلك إلى جعل عملية التسجيل أقل سهولة بالنسبة لبعض الأشخاص (وخاصة المعاقين). لهذه الأسباب، يرجى النظر في تدابير بديلة مثل التسجيل على أساس الموافقة أو على أساس الدعوة. title: مطالبة المستخدمين الجدد بحل اختبار CAPTCHA لتأكيد حساباتهم content_retention: + danger_zone: منطقة خطرة preamble: التحكم في كيفية تخزين المحتوى الذي ينشئه المستخدم في ماستدون. title: الاحتفاظ بالمحتوى default_noindex: @@ -1012,7 +1013,6 @@ ar: delete: حذف edit_preset: تعديل نموذج التحذير empty: لم تحدد أي إعدادات تحذير مسبقة بعد. - title: إدارة نماذج التحذير webhooks: add_new: إضافة نقطة نهاية delete: حذف diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 816858d4a..9e6ec6d23 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -400,8 +400,6 @@ ast: usable: Pue usase title: Tendencies trending: En tendencia - warning_presets: - title: Xestión d'alvertencies preconfiguraes webhooks: add_new: Amestar un estremu delete: Desaniciar diff --git a/config/locales/be.yml b/config/locales/be.yml index cdfc9cb39..6f1f18952 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -621,6 +621,9 @@ be: actions_description_html: Вырашыце, якія дзеянні распачаць, каб вырашыць гэтую скаргу. Калі вы прымеце меры пакарання ў дачыненні да ўліковага запісу, пра які паведамляецца, ім будзе адпраўлена апавяшчэнне па электроннай пошце, за выключэннем выпадкаў, калі выбрана катэгорыя Спам. actions_description_remote_html: Вырашыце як паступіць з гэтай скаргай. Гэта паўплывае толькі на тое як ваш сервер звязваецца з аддалёным уліковым запісам і апрацоўвае яго кантэнт. add_to_report: Дадаць яшчэ дэталяў да скаргі + already_suspended_badges: + local: Ужо прыпынена на гэтым сэрвэры + remote: Ужо прыпынена на іх сэрвэры are_you_sure: Вы ўпэўнены? assign_to_self: Прызначыць мне assigned: Прызначаны мадэратар @@ -980,7 +983,6 @@ be: delete: Выдаліць edit_preset: Рэдагаваць шаблон папярэджання empty: Вы яшчэ не вызначылі ніякіх шаблонаў папярэджанняў. - title: Кіраванне шаблонамі папярэджанняў webhooks: add_new: Дадаць канцавую кропку delete: Выдаліць @@ -1708,6 +1710,7 @@ be: preferences: Налады profile: Профіль relationships: Падпіскі і падпісчыкі + severed_relationships: Разрыў сувязяў statuses_cleanup: Аўтавыдаленне допісаў strikes: Папярэджанні мадэратараў two_factor_authentication: Двухфактарная аўтэнтыфікацыя @@ -1715,10 +1718,13 @@ be: severed_relationships: download: Спампаваць (%{count}) event_type: + account_suspension: Прыпыненне ўліковага запісу (%{target_name}) + domain_block: Прыпыненне сервера (%{target_name}) user_domain_block: Вы заблакіравалі %{target_name} lost_followers: Страчаныя падпісчыкі lost_follows: Страчаныя падпіскі preamble: Вы можаце страціць падпіскі і падпісчыкаў, калі заблакіруеце дамен або калі вашы мадэратары вырашаць прыпыніць зносіны з серверам. Калі гэта адбудзецца, вы зможаце загрузіць спіс страчаных зносін, каб праверыць іх і, магчыма, імпартаваць на іншы сервер. + purged: Інфармацыя аб гэтым серверы была выдалена адміністратарамі вашага сервера. type: Падзея statuses: attached: @@ -1825,6 +1831,7 @@ be: contrast: Mastodon (высокі кантраст) default: Mastodon (цёмная) mastodon-light: Mastodon (светлая) + system: Аўтаматычна (выкарыстоўваць сістэмную тэму) time: formats: default: "%d.%m.%Y %H:%M" diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 0c4ce3be4..5aca8ad0f 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -285,6 +285,7 @@ bg: update_custom_emoji_html: "%{name} обнови емоджито %{target}" update_domain_block_html: "%{name} обнови блокирането на домейна за %{target}" update_ip_block_html: "%{name} промени правило за IP на %{target}" + update_report_html: "%{name} осъвремени доклад %{target}" update_status_html: "%{name} обнови публикация от %{target}" update_user_role_html: "%{name} промени ролята %{target}" deleted_account: изтрит акаунт @@ -751,6 +752,7 @@ bg: desc_html: Това разчита на външни скриптове от hCaptcha, което може да е проблем за сигурността и поверителността. В допълнение това може да направи процеса на регистриране значимо по-малко достъпно за някои хора (особено с увреждания).. Заради тези причини, то обмислете алтернативни мерки такива като регистрация на базата на одобрение или на покана. title: Изисква се новите потребители да разгадават капчата, за да потвърдят акаунтите си content_retention: + danger_zone: Опасна зона preamble: Управление на това как съдържание, породено от потребители, се съхранява в Mastodon. title: Задържане на съдържание default_noindex: @@ -949,7 +951,7 @@ bg: delete: Изтриване edit_preset: Редакция на предварителните настройки empty: Все още няма предварителни настройки за предупрежденията. - title: Управление на предварителните настройки + title: Предупредителни образци webhooks: add_new: Добавяне на крайна точка delete: Изтриване diff --git a/config/locales/br.yml b/config/locales/br.yml index fa6d266f6..03537a5b8 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -245,6 +245,8 @@ br: title: Diwar-benn appearance: title: Neuz + content_retention: + danger_zone: Takad dañjer discovery: title: Dizoloadur trends: Luskadoù diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 032dc1e35..ec32f771e 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -285,6 +285,7 @@ ca: update_custom_emoji_html: "%{name} ha actualitzat l'emoji %{target}" update_domain_block_html: "%{name} ha actualitzat el bloqueig de domini per a %{target}" update_ip_block_html: "%{name} ha canviat la norma per la IP %{target}" + update_report_html: "%{name} ha actualitzat l'informe %{target}" update_status_html: "%{name} ha actualitzat l'estat de %{target}" update_user_role_html: "%{name} ha canviat el rol %{target}" deleted_account: compte eliminat @@ -751,6 +752,7 @@ ca: desc_html: Això es basa en scripts externs de hCaptcha, que poden ser un problema de privacitat i seguretat. A més, això pot fer que el procés de registre sigui significativament menys accesible per algunes (especialment discapacitades) persones. Per aquestes raons, si us plau considera alternatives com ara registre amb aprovació necessària o basada en invitacions. title: Demana als nous usuaris que resolguin un CAPTCHA per a confirmar el seu compte content_retention: + danger_zone: Zona de perill preamble: Controla com es desa a Mastodon el contingut generat per l'usuari. title: Retenció de contingut default_noindex: @@ -949,7 +951,7 @@ ca: delete: Elimina edit_preset: Edita l'avís predeterminat empty: Encara no has definit cap preavís. - title: Gestiona les configuracions predefinides dels avisos + title: Predefinicions d'avís webhooks: add_new: Afegir extrem delete: Elimina diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index dfa035eca..93eea8273 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -548,7 +548,6 @@ ckb: add_new: زیادکردنی نوێ delete: سڕینەوە edit_preset: دەستکاریکردنی ئاگاداری پێشگریمان - title: بەڕێوەبردنی ئاگادارکردنەوە پێش‌سازدان admin_mailer: new_pending_account: body: وردەکاریهەژمارە نوێیەکە لە خوارەوەیە. دەتوانیت ئەم نەرمەکالا پەسەند بکەیت یان ڕەت بکەیتەوە. diff --git a/config/locales/co.yml b/config/locales/co.yml index 7d8abcd11..6edbbc95f 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -510,7 +510,6 @@ co: add_new: Aghjunghje delete: Sguassà edit_preset: Cambià a preselezzione d'avertimentu - title: Amministrà e preselezzione d'avertimentu admin_mailer: new_pending_account: body: I ditagli di u novu contu sò quì sottu. Pudete appruvà o righjittà a dumanda. diff --git a/config/locales/cs.yml b/config/locales/cs.yml index bccbb75c4..17c743f1d 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -779,6 +779,7 @@ cs: desc_html: Toto spoléhá na externí skripty z hCaptcha, což může být budit obavy o bezpečnost a soukromí. Navíc to může způsobit, že proces registrace bude pro některé osoby (zejména se zdravotním postižením) hůře přístupný. Z těchto důvodů zvažte alternativní přístup, jako je schvalování registrace nebo pozvánky. title: Vyžadovat po nových uživatelích, aby vyřešili CAPTCHU pro potvrzení jejich účtu content_retention: + danger_zone: Nebezpečná zóna preamble: Určuje, jak je obsah generovaný uživatelem uložen v Mastodonu. title: Uchovávání obsahu default_noindex: @@ -983,7 +984,6 @@ cs: delete: Smazat edit_preset: Upravit předlohu pro varování empty: Zatím jste nedefinovali žádné předlohy varování. - title: Spravovat předlohy pro varování webhooks: add_new: Přidat koncový bod delete: Smazat diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 93d249cb5..35ed5ade8 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -297,6 +297,7 @@ cy: update_custom_emoji_html: Mae %{name} wedi diweddaru emoji %{target} update_domain_block_html: Mae %{name} wedi diweddaru bloc parth %{target} update_ip_block_html: Mae %{name} wedi newid rheol IP %{target} + update_report_html: Mae %{name} wedi diweddaru adroddiad %{target} update_status_html: Mae %{name} wedi diweddaru postiad gan %{target} update_user_role_html: Mae %{name} wedi newid rôl %{target} deleted_account: cyfrif wedi'i ddileu @@ -645,6 +646,9 @@ cy: actions_description_html: Penderfynwch pa gamau i'w cymryd i ddatrys yr adroddiad hwn. Os byddwch yn cymryd camau cosbol yn erbyn y cyfrif a adroddwyd, bydd hysbysiad e-bost yn cael ei anfon atyn nhw, ac eithrio pan fydd y categori Sbam yn cael ei ddewis. actions_description_remote_html: Penderfynwch pa gamau i'w cymryd i ddatrys yr adroddiad hwn. Bydd hyn ond yn effeithio ar sut mae'ch gweinydd yn cyfathrebu â'r cyfrif hwn o bell ac yn trin ei gynnwys. add_to_report: Ychwanegu rhagor i adroddiad + already_suspended_badges: + local: Wedi atal dros dro ar y gweinydd hwn yn barod + remote: Wedi'i atal eisoes ar eu gweinydd are_you_sure: Ydych chi'n siŵr? assign_to_self: Neilltuo i mi assigned: Cymedrolwr wedi'i neilltuo @@ -804,6 +808,7 @@ cy: desc_html: Mae hyn yn dibynnu ar sgriptiau allanol gan hCaptcha, a all fod yn bryder diogelwch a phreifatrwydd. Yn ogystal, gall hyn wneud y broses gofrestru yn llawer llai hygyrch i rai pobl (yn enwedig yr anabl). Am y rhesymau hyn, ystyriwch fesurau eraill fel cofrestru ar sail cymeradwyaeth neu ar sail gwahoddiad. title: Ei gwneud yn ofynnol i ddefnyddwyr newydd ddatrys CAPTCHA i gadarnhau eu cyfrif content_retention: + danger_zone: Parth perygl preamble: Rheoli sut mae cynnwys sy'n cael ei gynhyrchu gan ddefnyddwyr yn cael ei storio yn Mastodon. title: Cadw cynnwys default_noindex: @@ -1014,7 +1019,7 @@ cy: delete: Dileu edit_preset: Golygu rhagosodiad rhybudd empty: Nid ydych wedi diffinio unrhyw ragosodiadau rhybudd eto. - title: Rheoli rhagosodiadau rhybudd + title: Rhagosodiadau rhybuddion webhooks: add_new: Ychwanegu diweddbwynt delete: Dileu @@ -1756,13 +1761,26 @@ cy: import: Mewnforio import_and_export: Mewnforio ac allforio migrate: Mudo cyfrif + notifications: Hysbysiadau e-bost preferences: Dewisiadau profile: Proffil cyhoeddus relationships: Yn dilyn a dilynwyr + severed_relationships: Perthynasau wedi'u torri statuses_cleanup: Dileu postiadau'n awtomatig strikes: Rhybuddion cymedroli two_factor_authentication: Dilysu dau-ffactor webauthn_authentication: Allweddi diogelwch + severed_relationships: + download: Llwytho i lawr (%{count}) + event_type: + account_suspension: Atal cyfrif (%{target_name}) + domain_block: Ataliad gweinydd (%{target_name}) + user_domain_block: Rydych wedi rhwystro %{target_name} + lost_followers: Dilynwyr coll + lost_follows: Yn dilyn coll + preamble: Efallai y byddwch yn colli dilynwyr a'r rhai rydych yn eu dilyn pan fyddwch yn rhwystro parth neu pan fydd eich cymedrolwyr yn penderfynu atal gweinydd o bell. Pan fydd hynny'n digwydd, byddwch yn gallu llwytho i lawr rhestrau o berthnasoedd wedi'u torri, i'w harchwilio ac o bosibl eu mewnforio ar weinydd arall. + purged: Mae gwybodaeth am y gweinydd hwn wedi'i dynnu gan weinyddwyr eich gweinydd. + type: Digwyddiad statuses: attached: audio: @@ -1880,6 +1898,7 @@ cy: contrast: Mastodon (Cyferbyniad uchel) default: Mastodon (Tywyll) mastodon-light: Mastodon (Golau) + system: Awtomatig (defnyddio thema system) time: formats: default: "%b %d, %Y, %H:%M" @@ -1992,6 +2011,13 @@ cy: follows_subtitle: Dilynwch gyfrifon adnabyddus follows_title: Pwy i ddilyn follows_view_more: Gweld mwy o bobl i ddilyn + hashtags_recent_count: + few: "%{people} o bobl yn y 2 ddiwrnod diwethaf" + many: "%{people} o bobl yn y 2 ddiwrnod diwethaf" + one: "%{people} person yn ystod y 2 ddiwrnod diwethaf" + other: "%{people} o bobl yn y 2 ddiwrnod diwethaf" + two: "%{people} o bobl yn y 2 ddiwrnod diwethaf" + zero: "%{people} o bobl yn y 2 ddiwrnod diwethaf" hashtags_subtitle: Gweld beth sy'n tueddu dros y 2 ddiwrnod diwethaf hashtags_title: Hashnodau tuedd hashtags_view_more: Gweld mwy o hashnodau tuedd @@ -1999,7 +2025,7 @@ cy: post_step: Dywedwch helo wrth y byd gyda thestun, lluniau, fideos neu arolygon barn. post_title: Creu'ch postiad cyntaf share_action: Rhannu - share_step: Gadewch i'ch ffrindiau wybod sut i ddod o hyd i chi ar Mastodon! + share_step: Gadewch i'ch ffrindiau wybod sut i ddod o hyd i chi ar Mastodon. share_title: Rhannwch eich proffil Mastodon sign_in_action: Mewngofnodi subject: Croeso i Mastodon diff --git a/config/locales/da.yml b/config/locales/da.yml index acab53d15..f37086264 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -285,6 +285,7 @@ da: update_custom_emoji_html: "%{name} opdaterede emoji %{target}" update_domain_block_html: "%{name} opdaterede domæneblokeringen for %{target}" update_ip_block_html: "%{name} ændrede reglen for IP'en %{target}" + update_report_html: "%{name} opdaterede rapporten %{target}" update_status_html: "%{name} opdaterede indlægget fra %{target}" update_user_role_html: "%{name} ændrede %{target}-rolle" deleted_account: slettet konto @@ -751,6 +752,7 @@ da: desc_html: Dette er afhængig af eksterne scripts fra hCaptcha, som kan være en sikkerhed og privatlivets fred. Derudover kan dette gøre registreringsprocessen betydeligt mindre tilgængelig for nogle (især deaktiveret) personer. Af disse grunde bedes De overveje alternative foranstaltninger såsom godkendelsesbaseret eller inviteret til at blive registreret. title: Kræv nye brugere for at løse en CAPTCHA for at bekræfte deres konto content_retention: + danger_zone: Farezone preamble: Styr, hvordan Mastodon gemmer brugergenereret indhold. title: Indholdsopbevaring default_noindex: @@ -949,7 +951,7 @@ da: delete: Slet edit_preset: Redigér advarselsforvalg empty: Ingen advarselsforvalg defineret endnu. - title: Håndtérr advarselsforvalg + title: Præindstillinger for advarsel webhooks: add_new: Tilføj endepunkt delete: Slet diff --git a/config/locales/de.yml b/config/locales/de.yml index 923682ea1..11460c3b4 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -285,6 +285,7 @@ de: update_custom_emoji_html: "%{name} bearbeitete das Emoji %{target}" update_domain_block_html: "%{name} aktualisierte die Domain-Sperre für %{target}" update_ip_block_html: "%{name} änderte die Regel für die IP-Adresse %{target}" + update_report_html: "%{name} überarbeitete die Meldung %{target}" update_status_html: "%{name} überarbeitete einen Beitrag von %{target}" update_user_role_html: "%{name} änderte die Rolle von %{target}" deleted_account: gelöschtes Konto @@ -751,6 +752,7 @@ de: desc_html: Dies beruht auf externen Skripten von hCaptcha, die ein Sicherheits- und Datenschutzproblem darstellen könnten. Darüber hinaus kann das den Registrierungsprozess für manche Menschen (insbesondere für Menschen mit Behinderung) erheblich erschweren. Aus diesen Gründen solltest du alternative Maßnahmen in Betracht ziehen, z. B. eine Registrierung basierend auf einer Einladung oder auf Genehmigungen. title: Neue Nutzer*innen müssen ein CAPTCHA lösen, um das Konto zu bestätigen content_retention: + danger_zone: Gefahrenzone preamble: Lege fest, wie lange Inhalte von Nutzer*innen auf deinem Mastodon-Server gespeichert bleiben. title: Cache & Archive default_noindex: @@ -949,7 +951,7 @@ de: delete: Löschen edit_preset: Warnvorlage bearbeiten empty: Du hast noch keine Warnvorlagen hinzugefügt. - title: Warnvorlagen verwalten + title: Warnvorlagen webhooks: add_new: Endpunkt hinzufügen delete: Löschen diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml index d180a46a6..e6ae6d4af 100644 --- a/config/locales/devise.ia.yml +++ b/config/locales/devise.ia.yml @@ -6,58 +6,116 @@ ia: send_instructions: Tu recipera un e-mail con instructiones pro confirmar tu adresse de e-mail in poc minutas. Per favor verifica tu dossier de spam si tu non lo recipe. send_paranoid_instructions: Si tu adresse de e-mail existe in nostre base de datos, tu recipera un e-mail con instructiones pro confirmar tu adresse de e-mail in poc minutas. Per favor verifica tu dossier de spam si tu non lo recipe. failure: - already_authenticated: Tu jam initiava le session. - inactive: Tu conto ancora non es activate. + already_authenticated: Tu ha jam aperite session. + inactive: Tu conto non es ancora activate. invalid: "%{authentication_keys} o contrasigno non valide." last_attempt: Tu ha solmente un altere tentativa ante que tu conto es serrate. - locked: Tu conto es blocate. + locked: Tu conto es serrate. not_found_in_database: "%{authentication_keys} o contrasigno non valide." omniauth_user_creation_failure: Error creante un conto pro iste identitate. pending: Tu conto es ancora sub revision. timeout: Tu session ha expirate. Per favor reaperi session pro continuar. unauthenticated: Es necessari aperir session o crear un conto ante de continuar. + unconfirmed: Es necessari confirmar tu adresse de e-mail ante de continuar. mailer: confirmation_instructions: action: Verificar adresse de e-mail action_with_app: Confirmar e retornar a %{app} + explanation: Tu ha create un conto sur %{host} con iste adresse de e-mail. Tu es a un sol clic de activar lo. Si isto non esseva tu, per favor ignora iste e-mail. + explanation_when_pending: Tu ha sollicitate un invitation a %{host} con iste adresse de e-mail. Post que tu confirma tu adresse de e-mail, nos va revider tu demanda. Tu pote aperir session pro cambiar tu detalios o eliminar tu conto, ma tu non pote acceder al majoritate del functiones usque tu conto es approbate. Si tu demanda es rejectate, tu datos essera removite e nulle action ulterior essera requirite de te. Si isto non esseva tu, per favor ignora iste message de e-mail. + extra_html: Per favor consulta tamben le regulas del servitor e nostre conditiones de servicio. + subject: 'Mastodon: Instructiones de confirmation pro %{instance}' title: Verificar adresse de e-mail email_changed: + explanation: 'Le adresse de e-mail pro tu conto essera cambiate a:' + extra: Si tu non ha cambiate de adresse de e-mail, es probabile que alcuno ha ganiate le accesso a tu conto. Per favor cambia immediatemente tu contrasigno o contacta le administrator del servitor si tu non pote acceder a tu conto. + subject: 'Mastodon: E-mail cambiate' title: Nove adresse de e-mail password_change: + explanation: Le contrasigno de tu conto ha essite cambiate. + extra: Si tu non ha cambiate tu contrasigno, es probabile que alcuno ha ganiate le accesso a tu conto. Per favor cambia immediatemente tu contrasigno o contacta le administrator del servitor si tu non pote acceder a tu conto. subject: 'Mastodon: Contrasigno cambiate' title: Contrasigno cambiate reconfirmation_instructions: explanation: Confirma le nove adresse pro cambiar tu email. + extra: Si non es tu qui ha initiate iste cambiamento, per favor ignora iste e-mail. Le adresse de e-mail pro le conto de Mastodon non cambiara usque tu accede al ligamine hic supra. + subject: 'Mastodon: Confirmar e-mail pro %{instance}' title: Verificar adresse de e-mail reset_password_instructions: action: Cambiar contrasigno + explanation: Tu ha requestate un nove contrasigno pro tu conto. + extra: Si tu non ha requestate isto, per favor ignora iste e-mail. Tu contrasigno non cambiara usque tu accede al ligamine hic supra e crea un nove. subject: 'Mastodon: Instructiones pro reinitialisar le contrasigno' title: Reinitialisar contrasigno two_factor_disabled: - title: 2FA disactivate + explanation: Ora es possibile aperir session con solmente le adresse de e-mail e contrasigno. + subject: 'Mastodon: Authentication bifactorial disactivate' + subtitle: Le authentication bifactorial ha essite disactivate pro tu conto. + title: A2F disactivate two_factor_enabled: - title: 2FA activate + explanation: Pro le apertura de session essera necessari un token generate per le application TOTP accopulate. + subject: 'Mastodon: Authentication bifactorial activate' + subtitle: Le authentication bifactorial ha essite activate pro tu conto. + title: A2F activate + two_factor_recovery_codes_changed: + explanation: Le ancian codices de recuperation ha essite invalidate e nove codices ha essite generate. + subject: 'Mastodon: Codices de recuperation regenerate' + subtitle: Le ancian codices de recuperation ha essite invalidate e nove codices ha essite generate. + title: Codices de recuperation cambiate unlock_instructions: subject: 'Mastodon: Instructiones pro disblocar' webauthn_credential: added: - explanation: Le sequente clave de securitate esseva addite a tu conto + explanation: Le sequente clave de securitate ha essite addite a tu conto subject: 'Mastodon: Nove clave de securitate' - title: Un nove clave de securitate esseva addite + title: Un nove clave de securitate ha essite addite deleted: - explanation: Le sequente clave de securitate esseva delite de tu conto + explanation: Le sequente clave de securitate ha essite delite de tu conto subject: 'Mastodon: Clave de securitate delite' + title: Un de tu claves de securitate ha essite delite webauthn_disabled: + explanation: Le authentication con claves de securitate ha essite disactivate pro tu conto. + extra: Ora es possibile aperir session usante solmente le token generate per le application TOTP accopulate. + subject: 'Mastodon: Le authentication con claves de securitate es disactivate' title: Claves de securitate disactivate webauthn_enabled: + explanation: Le authentication con claves de securitate ha essite activate pro tu conto. + extra: Tu clave de securitate pote ora esser usate pro aperir session. + subject: 'Mastodon: authentication de clave de securitate activate' title: Claves de securitate activate + omniauth_callbacks: + failure: Impossibile authenticar te ab %{kind} perque “%{reason}”. + success: Authenticate con successo ab conto %{kind}. + passwords: + no_token: Tu non pote acceder iste pagina sin venir ab un email de redefinition de contrasigno. Si tu veni ab un email de redefinition de contrasigno, verifica que tu usava le integre URL fornite. + send_instructions: Si tu adresse de e-mail existe in nostre base de datos, tu recipera un ligamine de recuperation de contrasigno in tu adresse de e-mail in poc minutas. Per favor verifica tu dossier de spam si tu non lo recipe. + send_paranoid_instructions: Si tu adresse de e-mail existe in nostre base de datos, tu recipera un ligamine de recuperation de contrasigno in tu adresse de e-mail in poc minutas. Per favor verifica tu dossier de spam si tu non lo recipe. + updated: Tu contrasigno ha essite cambiate. Tu ha ora aperite session. + updated_not_active: Tu contrasigno ha essite cambiate. registrations: - destroyed: A revider! Tu conto esseva cancellate con successo. Nos spera vider te novemente tosto. - signed_up_but_pending: Un message con un ligamine de confirmation esseva inviate a tu conto de email. Post que tu clicca le ligamine, nos revidera tu application. Tu essera notificate si illo es approbate. + destroyed: A revider! Tu conto ha essite cancellate. Nos spera vider te de novo tosto. + signed_up: Benvenite! Tu te ha inscribite con successo. + signed_up_but_inactive: Tu te ha inscribite con successo. Nonobstante, nos non poteva aperir tu session perque tu conto non es ancora activate. + signed_up_but_locked: Tu te ha inscribite con successo. Nonobstante, nos non poteva aperir tu session perque tu conto es serrate. + signed_up_but_pending: Un message con un ligamine de confirmation ha essite inviate a tu adresse de email. Post que tu clicca sur le ligamine, nos revidera tu demanda. Tu essera notificate si illo es approbate. + signed_up_but_unconfirmed: Un message con un ligamine de confirmation ha essite inviate a tu adresse de e-mail. Per favor seque le ligamine pro activar tu conto. Verifica tu dossier de spam si tu non recipe iste e-mail. + update_needs_confirmation: Tu ha actualisate tu conto con successo, ma nos debe verificar tu nove adresse de e-mail. Accede a tu e-mail e seque le ligamine de confirmation pro confirmar tu nove adresse de e-mail. Verifica tu dossier de spam si tu non recipe iste e-mail. updated: Tu conto ha essite actualisate con successo. + sessions: + already_signed_out: Session claudite con successo. + signed_in: Session aperite con successo. + signed_out: Session claudite con successo. unlocks: - unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar. + send_instructions: Tu recipera un e-mail con instructiones explicante como disserrar tu conto in alcun minutas. Verifica tu dossier de spam si tu non recipe iste e-mail. + send_paranoid_instructions: Si tu conto existe, tu recipera un email con instructiones explicante como disserrar lo in alcun minutas. Verifica tu dossier de spam si tu non recipe iste e-mail. + unlocked: Tu conto ha essite disserrate con successo. Aperi session pro continuar. errors: messages: - already_confirmed: jam esseva confirmate, tenta initiar session + already_confirmed: jam esseva confirmate, tenta aperir session + confirmation_period_expired: debe esser confirmate in %{period}, per favor requesta un nove + expired: ha expirate, per favor requesta un nove not_found: non trovate + not_locked: non esseva serrate + not_saved: + one: '1 error ha impedite a iste %{resource} de esser salvate:' + other: "%{count} errores ha impedite a iste %{resource} de esser salvate:" diff --git a/config/locales/devise.lt.yml b/config/locales/devise.lt.yml index ec5b85272..e36e60a75 100644 --- a/config/locales/devise.lt.yml +++ b/config/locales/devise.lt.yml @@ -22,7 +22,7 @@ lt: action: Patvirtinti el. pašto adresą action_with_app: Patvirtinti ir grįžti į %{app} explanation: Šiuo el. pašto adresu sukūrei paskyrą %{host}. Iki jos aktyvavimo liko vienas paspaudimas. Jei tai buvo ne tu, ignoruok šį el. laišką. - explanation_when_pending: Šiuo el. pašto adresu pateikei paraišką pakvietimui į %{host}. Kai patvirtinsi savo el. pašto adresą, mes peržiūrėsime tavo paraišką. Gali prisijungti ir pakeisti savo duomenis arba ištrinti paskyrą, tačiau negalėsi naudotis daugeliu funkcijų, kol tavo paskyra nebus patvirtinta. Jei tavo paraiška bus atmesta, duomenys bus pašalinti, todėl jokių papildomų veiksmų iš tavęs nereikės. Jei tai buvo ne tu, ignoruok šį el. laišką. + explanation_when_pending: Šiuo el. pašto adresu pateikei paraišką pakvietimui į %{host}. Kai patvirtinsi savo el. pašto adresą, mes peržiūrėsime tavo paraišką. Gali prisijungti ir pakeisti savo duomenis arba ištrinti paskyrą, bet negalėsi naudotis daugeliu funkcijų, kol tavo paskyra nebus patvirtinta. Jei tavo paraiška bus atmesta, duomenys bus pašalinti, todėl jokių papildomų veiksmų iš tavęs nereikės. Jei tai buvo ne tu, ignoruok šį el. laišką. extra_html: Taip pat peržiūrėk serverio taisykles ir mūsų paslaugų teikimo sąlygas. subject: 'Mastodon: patvirtinimo instrukcijos %{instance}' title: Patvirtinti el. pašto adresą diff --git a/config/locales/doorkeeper.be.yml b/config/locales/doorkeeper.be.yml index 748cbeafa..5f0536c8d 100644 --- a/config/locales/doorkeeper.be.yml +++ b/config/locales/doorkeeper.be.yml @@ -174,6 +174,7 @@ be: read:filters: бачыць свае фільтры read:follows: бачыць свае падпіскі read:lists: бачыць свае спісы + read:me: чытайце толькі базавую інфармацыю аб сваім уліковым запісе read:mutes: бачыць свае ігнараванні read:notifications: бачыць свае абвесткі read:reports: бачыць свае скаргі diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml index be2a4d971..9719a9a24 100644 --- a/config/locales/doorkeeper.cs.yml +++ b/config/locales/doorkeeper.cs.yml @@ -174,6 +174,7 @@ cs: read:filters: vidět vaše filtry read:follows: vidět vaše sledování read:lists: vidět vaše seznamy + read:me: číst pouze základní informace vašeho účtu read:mutes: vidět vaše skrytí read:notifications: vidět vaše oznámení read:reports: vidět vaše hlášení diff --git a/config/locales/doorkeeper.cy.yml b/config/locales/doorkeeper.cy.yml index e79aa0359..88cd2b9d5 100644 --- a/config/locales/doorkeeper.cy.yml +++ b/config/locales/doorkeeper.cy.yml @@ -174,6 +174,7 @@ cy: read:filters: gweld eich hidlwyr read:follows: gweld eich dilynwyr read:lists: gweld eich rhestrau + read:me: darllen dim ond manylion elfennol eich cyfrif read:mutes: gweld eich anwybyddiadau read:notifications: gweld eich hysbysiadau read:reports: gweld eich adroddiadau diff --git a/config/locales/doorkeeper.en-GB.yml b/config/locales/doorkeeper.en-GB.yml index b3ceffb13..2e537c530 100644 --- a/config/locales/doorkeeper.en-GB.yml +++ b/config/locales/doorkeeper.en-GB.yml @@ -174,6 +174,7 @@ en-GB: read:filters: see your filters read:follows: see your follows read:lists: see your lists + read:me: read only your account's basic information read:mutes: see your mutes read:notifications: see your notifications read:reports: see your reports diff --git a/config/locales/doorkeeper.fy.yml b/config/locales/doorkeeper.fy.yml index a43defc42..51f0055ff 100644 --- a/config/locales/doorkeeper.fy.yml +++ b/config/locales/doorkeeper.fy.yml @@ -174,6 +174,7 @@ fy: read:filters: jo filters besjen read:follows: de accounts dy’tsto folgest besjen read:lists: jo listen besjen + read:me: allinnich de basisgegevens fan jo account lêze read:mutes: jo negearre brûkers besjen read:notifications: jo meldingen besjen read:reports: jo rapportearre berjochten besjen diff --git a/config/locales/doorkeeper.ia.yml b/config/locales/doorkeeper.ia.yml index fd7d7a083..9c493e3d7 100644 --- a/config/locales/doorkeeper.ia.yml +++ b/config/locales/doorkeeper.ia.yml @@ -3,50 +3,104 @@ ia: activerecord: attributes: doorkeeper/application: - name: Nomine de application - website: Sito web de application + name: Nomine del application + redirect_uri: URI de redirection + scopes: Ambitos + website: Sito web del application errors: models: doorkeeper/application: attributes: redirect_uri: + fragment_present: non pote continer un fragmento. invalid_uri: debe esser un URI valide. + relative_uri: debe esser un URI absolute. + secured_uri: debe esser un URI HTTPS/SSL. doorkeeper: applications: buttons: authorize: Autorisar cancel: Cancellar + destroy: Destruer edit: Modificar + submit: Submitter confirmations: destroy: Es tu secur? edit: title: Modificar application + form: + error: Oops! Verifica tu formulario pro possibile errores + help: + native_redirect_uri: Usar %{native_redirect_uri} pro tests local + redirect_uri: Usar un linea per URI + scopes: Separa ambitos con spatios. Lassa vacue pro usar le ambitos predefinite. index: application: Application + callback_url: URL de retorno delete: Deler empty: Tu non ha applicationes. name: Nomine new: Nove application + scopes: Ambitos show: Monstrar title: Tu applicationes new: title: Nove application show: actions: Actiones + application_id: Clave del cliente + callback_urls: URLs de retorno + scopes: Ambitos + secret: Secreto del application title: 'Application: %{name}' authorizations: buttons: authorize: Autorisar + deny: Negar error: - title: Ocurreva un error + title: Un error ha occurrite + new: + prompt_html: "%{client_name} vole haber le permission de acceder a tu conto. Illo es un application tertie. Si tu non confide in illo, alora tu non deberea autorisar lo." + review_permissions: Revisionar le permissos + title: Autorisation necessari + show: + title: Copia iste codice de autorisation e colla lo in le application. authorized_applications: + buttons: + revoke: Revocar confirmations: revoke: Es tu secur? index: + authorized_at: Autorisate le %{date} + description_html: Ecce applicationes que pote acceder tu conto per le API. Si il ha applicationes que tu non recognosce ci, o un application que se comporta mal, tu pote revocar su accesso. last_used_at: Ultime uso in %{date} never_used: Nunquam usate scopes: Permissiones + superapp: Interne title: Tu applicationes autorisate + errors: + messages: + access_denied: Le proprietario del ressource o servitor de autorisation ha refusate le requesta. + credential_flow_not_configured: Le processo de credentiales de contrasigno del proprietario del ressource ha fallite perque Doorkeeper.configure.resource_owner_from_credentials non es configurate. + invalid_client: Le authentication del cliente ha fallite perque le cliente es incognite, necun authentication de cliente es includite, o le methodo de authentication non es supportate. + invalid_grant: Le concession de autorisation fornite es invalide, expirate, revocate, non corresponde al URI de redirection usate in le requesta de autorisation, o ha essite emittite a un altere cliente. + invalid_redirect_uri: Le URI de redirection includite non es valide. + invalid_request: + missing_param: 'Parametro requirite mancante: %{value}.' + request_not_authorized: Le requesta debe esser autorisate. Un parametro requirite pro autorisar le requesta manca o non es valide. + unknown: Le requesta non include un parametro requirite, include un valor de parametro non supportate, o es alteremente mal formate. + invalid_resource_owner: Le credentiales del proprietario del ressource fornite non es valide, o le proprietario del ressource non pote esser trovate + invalid_scope: Le ambito requirite es invalide, incognite, o mal formate. + invalid_token: + expired: Le token de accesso ha expirate + revoked: Le token de accesso ha essite revocate + unknown: Le token de accesso non es valide + resource_owner_authenticator_not_configured: Impossibile trovar le proprietario del ressource perque Doorkeeper.configure.resource_owner_authenticator non es configurate. + server_error: Le servitor de autorisation ha incontrate un condition impreviste que lo ha impedite de complir le requesta. + temporarily_unavailable: Le servitor de autorisation actualmente non pote gerer le requesta a causa de un supercarga temporari o de mantenentia del servitor. + unauthorized_client: Le application non es autorisate a exequer iste requesta usante iste methodo. + unsupported_grant_type: Le typo de concession de autorisation non es supportate per le servitor de autorisation. + unsupported_response_type: Le servitor de autorisation non supporta iste typo de responsa. flash: applications: create: @@ -55,17 +109,30 @@ ia: notice: Application delite. update: notice: Application actualisate. + authorized_applications: + destroy: + notice: Application revocate. grouped_scopes: + access: + read: Accesso de lectura sol + read/write: Accesso de lectura e scriptura + write: Accesso de scriptura sol title: accounts: Contos admin/accounts: Gestion de contos + admin/all: Tote le functiones administrative admin/reports: Gestion de reportos - all: Accesso plen a tu conto de Mastodon + all: Accesso complete a tu conto de Mastodon + blocks: Blocadas bookmarks: Marcapaginas conversations: Conversationes - favourites: Favoritos + crypto: Cryptation de puncta a puncta + favourites: Favorites filters: Filtros + follow: Sequites, silentiates e blocates + follows: Sequites lists: Listas + media: Annexos multimedial mutes: Silentiates notifications: Notificationes push: Notificationes push @@ -77,19 +144,41 @@ ia: nav: applications: Applicationes oauth2_provider: Fornitor OAuth2 + application: + title: Autorisation OAuth necessari scopes: admin:read: leger tote le datos in le servitor + admin:read:accounts: leger information sensibile de tote le contos + admin:read:canonical_email_blocks: leger datos sensibile de tote le blocadas de email canonic + admin:read:domain_allows: leger informationes sensibile de tote le dominios permittite + admin:read:domain_blocks: leger informationes sensibile de tote le blocadas de dominio + admin:read:email_domain_blocks: leger informationes sensibile de tote le blocadas de dominio email + admin:read:ip_blocks: leger informationes sensibile de tote le blocadas de IP + admin:read:reports: leger information sensibile de tote le reportos e contos signalate admin:write: modificar tote le datos in le servitor + admin:write:accounts: exequer action de moderation sur contos + admin:write:canonical_email_blocks: exequer actiones de moderation sur blocadas de email canonic + admin:write:domain_allows: exequer actiones de moderation sur dominios permittite + admin:write:domain_blocks: exequer actiones de moderation sur blocadas de dominio + admin:write:email_domain_blocks: exequer actiones de moderation sur blocadas de dominio email + admin:write:ip_blocks: exequer actiones de moderation sur blocadas de IP + admin:write:reports: exequer action de moderation sur reportos + crypto: usar cryptation de extremo-a-extremo + follow: modificar relationes del contos + push: reciper tu notificationes push read: leger tote le datos de tu conto read:accounts: vider informationes de conto + read:blocks: vider tu blocadas read:bookmarks: vider tu marcapaginas read:favourites: vider tu favoritos read:filters: vider tu filtros read:follows: vider tu sequites read:lists: vider tu listas read:me: leger solmente le information basic de tu conto + read:mutes: vider tu silentiates read:notifications: vider tu notificationes read:reports: vider tu reportos + read:search: cercar in tu nomine read:statuses: vider tote le messages write: modificar tote le datos de tu conto write:accounts: modificar tu profilo diff --git a/config/locales/doorkeeper.ie.yml b/config/locales/doorkeeper.ie.yml index 0119f3573..fc8132c92 100644 --- a/config/locales/doorkeeper.ie.yml +++ b/config/locales/doorkeeper.ie.yml @@ -174,6 +174,7 @@ ie: read:filters: vider tui filtres read:follows: vider tui sequitores read:lists: vider tui listes + read:me: leer solmen li basic information de tui conto read:mutes: vider tui silentias read:notifications: vider tui notificationes read:reports: vider tui raportes diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml index 62f2a3eb0..af61dbdcb 100644 --- a/config/locales/doorkeeper.ja.yml +++ b/config/locales/doorkeeper.ja.yml @@ -174,6 +174,7 @@ ja: read:filters: フィルターの読み取り read:follows: フォローの読み取り read:lists: リストの読み取り + read:me: 自分のアカウントの基本的な情報の読み取りのみ read:mutes: ミュートの読み取り read:notifications: 通知の読み取り read:reports: 通報の読み取り diff --git a/config/locales/doorkeeper.lt.yml b/config/locales/doorkeeper.lt.yml index 6f63e0309..82695d8ba 100644 --- a/config/locales/doorkeeper.lt.yml +++ b/config/locales/doorkeeper.lt.yml @@ -31,8 +31,8 @@ lt: form: error: Ups! Patikrink, ar formoje nėra galimų klaidų. help: - native_redirect_uri: Naudoti %{native_redirect_uri} vietiniams bandymams - redirect_uri: Naudoti po vieną eilutę kiekvienam URI + native_redirect_uri: Naudok %{native_redirect_uri} vietiniams bandymams. + redirect_uri: Naudok po vieną eilutę kiekvienam URI. scopes: Atskirk aprėptis tarpais. Palik tuščią, jei nori naudoti numatytąsias aprėtis. index: application: Programėlė @@ -64,7 +64,7 @@ lt: review_permissions: Peržiūrėti leidimus title: Reikalingas leidimas show: - title: Nukopijuok šį įgaliojimo kodą ir įklijuok jį į programėlę. + title: Nukopijuok šį tapatybės patvirtinimo kodą ir įklijuok jį į programėlę. authorized_applications: buttons: revoke: Naikinti @@ -90,7 +90,7 @@ lt: request_not_authorized: Užklausą reikia įgalioti. Reikalingo parametro užklausai įgalioti trūksta arba jis netinkamas. unknown: Užklausoje trūksta privalomo parametro, turi nepalaikomą parametro reikšmę arba yra kitaip netinkamai suformuota. invalid_resource_owner: Pateikti išteklių savininko įgaliojimai yra netinkami arba išteklių savininko negalima surasti. - invalid_scope: Užklausos aprėptis yra netinkama, nežinoma arba netinkamai suformuota. + invalid_scope: Užklausos aprėptis yra netinkama, nežinoma arba netaisyklingas. invalid_token: expired: Baigėsi prieigos rakto galiojimas. revoked: Prieigos raktas buvo panaikintas. @@ -126,16 +126,16 @@ lt: blocks: Blokavimai bookmarks: Žymės conversations: Pokalbiai - crypto: Galo iki galo užšifravimas + crypto: Visapusis šifravimas favourites: Mėgstami filters: Filtrai follow: Sekimai, nutildymai ir blokavimai follows: Sekimai lists: Sąrašai media: Medijos priedai - mutes: Užtildymai + mutes: Nutildymai notifications: Pranešimai - push: Stumdomieji pranešimai + push: Tiesioginiai pranešimai reports: Ataskaitos search: Paieška statuses: Įrašai @@ -147,33 +147,34 @@ lt: application: title: Reikalingas OAuth leidimas scopes: - admin:read: skaityti visus serveryje esančius duomenis - admin:read:accounts: skaityti neskelbtiną visų paskyrų informaciją - admin:read:canonical_email_blocks: skaityti neskelbtiną visų kanoninių el. laiško blokavimų informaciją - admin:read:domain_allows: skaityti neskelbtiną visų domeno leidimus informaciją - admin:read:domain_blocks: skaityti neskelbtiną visų domeno blokavimų informaciją - admin:read:email_domain_blocks: skaityti neskelbtiną visų el. laiško domeno blokavimų informaciją - admin:read:ip_blocks: skaityti neskelbtiną visų IP blokavimų informaciją - admin:read:reports: skaityti neskelbtiną visų ataskaitų ir praneštų paskyrų informaciją - admin:write: modifikuoti visus serveryje esančius duomenis + admin:read: skaityti visus duomenis serveryje + admin:read:accounts: skaityti slaptą visų paskyrų informaciją + admin:read:canonical_email_blocks: skaityti slaptą visų kanoninių el. laiško blokavimų informaciją + admin:read:domain_allows: skaityti slaptą visų domeno leidimus informaciją + admin:read:domain_blocks: skaityti slaptą visų domeno blokavimų informaciją + admin:read:email_domain_blocks: skaityti slaptą visų el. laiško domeno blokavimų informaciją + admin:read:ip_blocks: skaityti slaptą visų IP blokavimų informaciją + admin:read:reports: skaityti slaptą visų ataskaitų ir praneštų paskyrų informaciją + admin:write: modifikuoti visus duomenis serveryje admin:write:accounts: atlikti paskyrų prižiūrėjimo veiksmus admin:write:canonical_email_blocks: atlikti kanoninių el. laiško blokavimų prižiūrėjimo veiksmus - admin:write:domain_allows: atlikti prižiūrėjimo veiksmus su domeno leidimais - admin:write:domain_blocks: atlikti prižiūrėjimo veiksmus su domenų blokavimais - admin:write:email_domain_blocks: atlikti prižiūrėjimo veiksmus su el. laiško domenų blokavimais - admin:write:ip_blocks: atlikti prižiūrėjimo veiksmus su IP blokavimais - admin:write:reports: atlikti paskyrų prižiūrėjimo veiksmus atsakaitams - crypto: naudoti galo iki galo šifravimą - follow: modifikuoti paskyros santykius - push: gauti tavo stumiamuosius pranešimus - read: skaityti tavo visus paskyros duomenis + admin:write:domain_allows: atlikti domeno leidimų prižiūrėjimo veiksmus + admin:write:domain_blocks: atlikti domeno blokavimų prižiūrėjimo veiksmus + admin:write:email_domain_blocks: atlikti el. laiško domenų blokavimų prižiūrėjimo veiksmus + admin:write:ip_blocks: atlikti IP blokavimų prižiūrėjimo veiksmus + admin:write:reports: atlikti ataskaitų prižiūrėjimo veiksmus + crypto: naudoti visapusį šifravimą + follow: modifikuoti paskyros sąryšius + push: gauti tiesioginius pranešimus + read: skaityti visus paskyros duomenis read:accounts: matyti paskyrų informaciją read:blocks: matyti tavo blokavimus read:bookmarks: matyti tavo žymes - read:favourites: matyti tavo mėgstamiausius + read:favourites: matyti tavo mėgstamus read:filters: matyti tavo filtrus read:follows: matyti tavo sekimus read:lists: matyti tavo sąrašus + read:me: skaityti tik pagrindinę paskyros informaciją read:mutes: matyti tavo nutildymus read:notifications: matyti tavo pranešimus read:reports: matyti tavo ataskaitas @@ -182,14 +183,14 @@ lt: write: modifikuoti visus tavo paskyros duomenis write:accounts: modifikuoti tavo profilį write:blocks: blokuoti paskyras ir domenus - write:bookmarks: įrašyti įrašus + write:bookmarks: pridėti į žymes įrašus write:conversations: nutildyti ir ištrinti pokalbius - write:favourites: mėgti įrašai + write:favourites: pamėgti įrašus write:filters: sukurti filtrus write:follows: sekti žmones write:lists: sukurti sąrašus write:media: įkelti medijos failus write:mutes: nutildyti žmones ir pokalbius write:notifications: išvalyti tavo pranešimus - write:reports: pranešti kitus asmenus + write:reports: pranešti apie kitus žmones write:statuses: skelbti įrašus diff --git a/config/locales/doorkeeper.sq.yml b/config/locales/doorkeeper.sq.yml index 308a5429a..793819c59 100644 --- a/config/locales/doorkeeper.sq.yml +++ b/config/locales/doorkeeper.sq.yml @@ -174,6 +174,7 @@ sq: read:filters: të shohë filtrat tuaj read:follows: të shohë ndjekësit tuaj read:lists: të shohë listat tuaja + read:me: të shohë vetëm hollësi elementare të llogarisë tuaj read:mutes: të shohë ç’keni heshtuar read:notifications: të shohë njoftimet tuaja read:reports: të shohë raportimet tuaja diff --git a/config/locales/doorkeeper.sr-Latn.yml b/config/locales/doorkeeper.sr-Latn.yml index a4eb7bd33..58ed5e8b6 100644 --- a/config/locales/doorkeeper.sr-Latn.yml +++ b/config/locales/doorkeeper.sr-Latn.yml @@ -174,6 +174,7 @@ sr-Latn: read:filters: pogledaj svoje filtere read:follows: pogledaj koga pratiš read:lists: pogledaj svoje liste + read:me: čita samo osnovne informacije o vašem nalogu read:mutes: pogledaj ignorisanja read:notifications: pogledaj svoja obaveštenja read:reports: pogledaj svoje prijave diff --git a/config/locales/doorkeeper.sr.yml b/config/locales/doorkeeper.sr.yml index 010eb23eb..f40a05e90 100644 --- a/config/locales/doorkeeper.sr.yml +++ b/config/locales/doorkeeper.sr.yml @@ -174,6 +174,7 @@ sr: read:filters: погледај своје филтере read:follows: погледај кога пратиш read:lists: погледај своје листе + read:me: чита само основне информације о вашем налогу read:mutes: погледај игнорисања read:notifications: погледај своја обавештења read:reports: погледај своје пријаве diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml index 067e06558..8a28566a0 100644 --- a/config/locales/doorkeeper.th.yml +++ b/config/locales/doorkeeper.th.yml @@ -174,6 +174,7 @@ th: read:filters: ดูตัวกรองของคุณ read:follows: ดูการติดตามของคุณ read:lists: ดูรายการของคุณ + read:me: อ่านเฉพาะข้อมูลพื้นฐานของบัญชีของคุณเท่านั้น read:mutes: ดูการซ่อนของคุณ read:notifications: ดูการแจ้งเตือนของคุณ read:reports: ดูรายงานของคุณ diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml index 84684d24c..624db9aff 100644 --- a/config/locales/doorkeeper.vi.yml +++ b/config/locales/doorkeeper.vi.yml @@ -61,7 +61,7 @@ vi: title: Một lỗi đã xảy ra new: prompt_html: "%{client_name} yêu cầu truy cập tài khoản của bạn. Đây là ứng dụng của bên thứ ba. Nếu không tin tưởng, đừng cho phép nó." - review_permissions: Xem lại quyền cho phép + review_permissions: Quyền truy cập title: Yêu cầu truy cập show: title: Sao chép mã này và dán nó vào ứng dụng. @@ -122,7 +122,7 @@ vi: admin/accounts: Quản trị tài khoản admin/all: Mọi chức năng quản trị admin/reports: Quản trị báo cáo - all: Toàn quyền truy cập vào tài khoản Mastodon của bạn + all: Toàn quyền truy cập tài khoản Mastodon blocks: Chặn bookmarks: Tút đã lưu conversations: Thảo luận diff --git a/config/locales/el.yml b/config/locales/el.yml index 2e7ac8746..47b2250f0 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -903,7 +903,6 @@ el: delete: Διαγραφή edit_preset: Ενημέρωση προκαθορισμένης προειδοποίησης empty: Δεν έχετε ακόμη ορίσει κάποια προκαθορισμένη προειδοποίηση. - title: Διαχείριση προκαθορισμένων προειδοποιήσεων webhooks: add_new: Προσθήκη σημείου τερματισμού delete: Διαγραφή diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index df956902a..07eb84ebb 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -751,6 +751,7 @@ en-GB: desc_html: This relies on external scripts from hCaptcha, which may be a security and privacy concern. In addition, this can make the registration process significantly less accessible to some (especially disabled) people. For these reasons, please consider alternative measures such as approval-based or invite-based registration. title: Require new users to solve a CAPTCHA to confirm their account content_retention: + danger_zone: Danger zone preamble: Control how user-generated content is stored in Mastodon. title: Content retention default_noindex: @@ -949,7 +950,6 @@ en-GB: delete: Delete edit_preset: Edit warning preset empty: You haven't defined any warning presets yet. - title: Manage warning presets webhooks: add_new: Add endpoint delete: Delete diff --git a/config/locales/en.yml b/config/locales/en.yml index 446d06f0d..43aa8481c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -285,6 +285,7 @@ en: update_custom_emoji_html: "%{name} updated emoji %{target}" update_domain_block_html: "%{name} updated domain block for %{target}" update_ip_block_html: "%{name} changed rule for IP %{target}" + update_report_html: "%{name} updated report %{target}" update_status_html: "%{name} updated post by %{target}" update_user_role_html: "%{name} changed %{target} role" deleted_account: deleted account @@ -950,7 +951,7 @@ en: delete: Delete edit_preset: Edit warning preset empty: You haven't defined any warning presets yet. - title: Manage warning presets + title: Warning presets webhooks: add_new: Add endpoint delete: Delete diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 749f80687..95e3dd5a8 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -919,7 +919,6 @@ eo: delete: Forigi edit_preset: Redakti avertan antaŭagordon empty: Vi ankoraŭ ne difinis iun ajn antaŭagordon de averto. - title: Administri avertajn antaŭagordojn webhooks: add_new: Aldoni finpunkton delete: Forigi diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 7bfe3b90b..d6bfb60a1 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -285,6 +285,7 @@ es-AR: update_custom_emoji_html: "%{name} actualizó el emoji %{target}" update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}" update_ip_block_html: "%{name} cambió la regla para la dirección IP %{target}" + update_report_html: "%{name} actualizó la denuncia %{target}" update_status_html: "%{name} actualizó el mensaje de %{target}" update_user_role_html: "%{name} cambió el rol %{target}" deleted_account: cuenta eliminada @@ -751,6 +752,7 @@ es-AR: desc_html: Esto depende de scripts externos de hCaptcha, que pueden ser una preocupación de seguridad y privacidad. Además, esto puede hacer el proceso de registro significativamente menos accesible para algunas personas (especialmente para gente con discapacidades). Por estas razones, por favor, considerá medidas alternativas, como el registro basado en la aprobación o la invitación. title: Solicitar a los nuevos usuarios que resuelvan una CAPTCHA para confirmar su cuenta content_retention: + danger_zone: Zona de peligro preamble: Controlá cómo el contenido generado por el usuario se almacena en Mastodon. title: Retención de contenido default_noindex: @@ -949,7 +951,7 @@ es-AR: delete: Eliminar edit_preset: Editar preajuste de advertencia empty: Aún no ha definido ningún preajuste de advertencia. - title: Administrar preajustes de advertencia + title: Preajustes de advertencia webhooks: add_new: Agregar punto final delete: Eliminar diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 4d17de4d0..8f4aa183d 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -285,6 +285,7 @@ es-MX: update_custom_emoji_html: "%{name} actualizó el emoji %{target}" update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}" update_ip_block_html: "%{name} cambió la regla para la IP %{target}" + update_report_html: "%{name} actualizó el informe %{target}" update_status_html: "%{name} actualizó el estado de %{target}" update_user_role_html: "%{name} cambió el rol %{target}" deleted_account: cuenta eliminada @@ -751,6 +752,7 @@ es-MX: desc_html: Esto se basa en scripts externos de hCaptcha, que pueden suponer una preocupación de seguridad y privacidad. Además, esto puede volver el proceso de registro significativamente menos accesible para algunas personas (especialmente con discapacidades). Por estas razones, por favor, considera medidas alternativas como el registro por aprobación manual o con invitación. title: Solicita a los nuevos usuarios que resuelvan un CAPTCHA para confirmar su cuenta content_retention: + danger_zone: Zona peligrosa preamble: Controlar cómo el contenido generado por el usuario se almacena en Mastodon. title: Retención de contenido default_noindex: @@ -949,7 +951,7 @@ es-MX: delete: Borrar edit_preset: Editar aviso predeterminado empty: Aún no has definido ningún preajuste de advertencia. - title: Editar configuración predeterminada de avisos + title: Preajustes de advertencia webhooks: add_new: Añadir endpoint delete: Eliminar diff --git a/config/locales/es.yml b/config/locales/es.yml index 086e8e2ef..343f6f5a6 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -214,12 +214,12 @@ es: resend_user: Reenviar Correo de Confirmación reset_password_user: Restablecer Contraseña resolve_report: Resolver Reporte - sensitive_account: Marcar multimedia en tu cuenta como sensible + sensitive_account: Marcar cuenta como sensible silence_account: Silenciar Cuenta suspend_account: Suspender Cuenta unassigned_report: Desasignar Reporte unblock_email_account: Desbloquear dirección de correo - unsensitive_account: Desmarcar multimedia en tu cuenta como sensible + unsensitive_account: Desmarcar cuenta como sensible unsilence_account: Dejar de Silenciar Cuenta unsuspend_account: Dejar de Suspender Cuenta update_announcement: Actualizar Anuncio @@ -285,6 +285,7 @@ es: update_custom_emoji_html: "%{name} actualizó el emoji %{target}" update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}" update_ip_block_html: "%{name} cambió la regla para la IP %{target}" + update_report_html: "%{name} actualizó el informe %{target}" update_status_html: "%{name} actualizó la publicación de %{target}" update_user_role_html: "%{name} cambió el rol %{target}" deleted_account: cuenta eliminada @@ -751,6 +752,7 @@ es: desc_html: Esto se basa en scripts externos de hCaptcha, que pueden suponer una preocupación de seguridad y privacidad. Además, esto puede volver el proceso de registro significativamente menos accesible para algunas personas (especialmente con discapacidades). Por estas razones, por favor, considera medidas alternativas como el registro por aprobación manual o con invitación. title: Solicita a los nuevos usuarios que resuelvan un CAPTCHA para confirmar su cuenta content_retention: + danger_zone: Zona peligrosa preamble: Controlar cómo el contenido generado por el usuario se almacena en Mastodon. title: Retención de contenido default_noindex: @@ -949,7 +951,7 @@ es: delete: Borrar edit_preset: Editar aviso predeterminado empty: Aún no has definido ningún preajuste de advertencia. - title: Editar configuración predeterminada de avisos + title: Preajustes de advertencia webhooks: add_new: Añadir endpoint delete: Eliminar diff --git a/config/locales/et.yml b/config/locales/et.yml index a544d8063..172aad25b 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -949,7 +949,6 @@ et: delete: Kustuta edit_preset: Hoiatuse eelseadistuse muutmine empty: Hoiatuste eelseadeid pole defineeritud. - title: Halda hoiatuste eelseadistusi webhooks: add_new: Lisa lõpp-punkt delete: Kustuta diff --git a/config/locales/eu.yml b/config/locales/eu.yml index a05aa3c92..67da357e1 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -753,6 +753,7 @@ eu: desc_html: Hori egiteko hCaptcha-ko scriptak behar dira, hirugarrenenak izanik, segurtasun eta pribatutasun arazoak ekarri ditzaketeenak. Horrez gain, script horiengatik nabarmen zailagoa egiten zaie pertsona batzuei izena ematea (batez ere desgaitasunen bat duenei). Hori dela eta, hausnartu beste neurri batzuk hartu ditzakezun, esaterako onarpenean oinarritutako izen ematea, edo gonbidapenen bidezkoa. title: Eskatu erabiltzaile berriei CAPTCHA bat ebazteko beren kontua berresteko content_retention: + danger_zone: Eremu arriskutsua preamble: Kontrolatu erabiltzaileek sortutako edukia nola biltegiratzen den Mastodonen. title: Edukia atxikitzea default_noindex: @@ -951,7 +952,6 @@ eu: delete: Ezabatu edit_preset: Editatu abisu aurre-ezarpena empty: Ez duzu abisu aurrezarpenik definitu oraindik. - title: Kudeatu abisu aurre-ezarpenak webhooks: add_new: Gehitu amaiera-puntua delete: Ezabatu diff --git a/config/locales/fa.yml b/config/locales/fa.yml index d93d2e7d5..509d69fcb 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -808,7 +808,6 @@ fa: delete: زدودن edit_preset: ویرایش هشدار پیش‌فرض empty: هنز هیچ پیش‌تنظیم هشداری را تعریف نکرده‌اید. - title: مدیریت هشدارهای پیش‌فرض webhooks: add_new: افزودن نقطهٔ پایانی delete: حذف diff --git a/config/locales/fi.yml b/config/locales/fi.yml index f82a592ec..d1fa24467 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -285,6 +285,7 @@ fi: update_custom_emoji_html: "%{name} päivitti emojin %{target}" update_domain_block_html: "%{name} päivitti verkkotunnuksen %{target} eston" update_ip_block_html: "%{name} muutti sääntöä IP-osoitteelle %{target}" + update_report_html: "%{name} päivitti raportin %{target}" update_status_html: "%{name} päivitti käyttäjän %{target} julkaisun" update_user_role_html: "%{name} muutti roolia %{target}" deleted_account: poisti tilin @@ -751,6 +752,7 @@ fi: desc_html: Tämä perustuu ulkoisiin skripteihin hCaptchasta, mikä voi olla turvallisuus- ja yksityisyysongelma. Lisäksi tämä voi tehdä rekisteröinnin ihmisille huomattavasti (erityisesti vammaisten) helpommaksi. Harkitse vaihtoehtoisia toimenpiteitä, kuten hyväksymisperusteista tai kutsupohjaista rekisteröintiä. title: Vaadi uusia käyttäjiä vahvistaamaan tilinsä ratkaisemalla CAPTCHA-vahvistus content_retention: + danger_zone: Vaaravyöhyke preamble: Määritä, miten käyttäjän luoma sisältö tallennetaan Mastodoniin. title: Sisällön säilyttäminen default_noindex: @@ -949,7 +951,7 @@ fi: delete: Poista edit_preset: Muokkaa varoituksen esiasetusta empty: Et ole vielä määrittänyt yhtäkään varoitusten esiasetusta. - title: Hallitse varoitusten esiasetuksia + title: Varoituksen esiasetukset webhooks: add_new: Lisää päätepiste delete: Poista diff --git a/config/locales/fo.yml b/config/locales/fo.yml index b6c8b306f..0372d3dca 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -235,7 +235,7 @@ fo: change_email_user_html: "%{name} broytti teldupost addressuna hjá %{target}" change_role_user_html: "%{name} broytti leiklutin hjá %{target}" confirm_user_html: "%{name} góðtók teldupost addressuna hjá %{target}" - create_account_warning_html: "%{name} sendi eina ávarðing til %{target}" + create_account_warning_html: "%{name} sendi eina ávaring til %{target}" create_announcement_html: "%{name} stovnaði eina fráboðan %{target}" create_canonical_email_block_html: "%{name} forðaði telduposti við hash'inum %{target}" create_custom_emoji_html: "%{name} legði upp nýtt kenslutekn %{target}" @@ -285,6 +285,7 @@ fo: update_custom_emoji_html: "%{name} dagførdi kensluteknið %{target}" update_domain_block_html: "%{name} dagførdi navnaøkisblokeringina hjá %{target}" update_ip_block_html: "%{name} broytti IP-reglurnar %{target}" + update_report_html: "%{name} dagførdi meldingina %{target}" update_status_html: "%{name} dagførdi postin hjá %{target}" update_user_role_html: "%{name} broyttir %{target} leiklutir" deleted_account: strikað konta @@ -751,6 +752,7 @@ fo: desc_html: Hetta er bundið at uttanhýsis skriptum frá hCaptcha, sum kann vera ein trygdar- og privatlívsváði. Harafturat, so kann hetta gera skrásetingartilgongdina munandi minni atkomuliga til summi (brekaði) fólk. Tískil eigur tú at umhugsa aðrar hættir sosum góðkenningar-grundaða ella innbjóðingar-grundaða skráseting. title: Set krav til nýggjar brúkarar at loysa eina CAPTHA fyri at vátta teirra kontu content_retention: + danger_zone: Vandaøki preamble: Stýr hvussu brúkara-skapt tilfar er goymt í Mastodon. title: Varðveitsla av tilfari default_noindex: @@ -949,7 +951,7 @@ fo: delete: Strika edit_preset: Rætta ávaringar-undanstilling empty: Tú hevur ikki ásett nakrar ávaringar-undanstillingar enn. - title: Stýr ávaringar-undanstillingar + title: Undanstillingar fyri ávaring webhooks: add_new: Legg endapunkt afturat delete: Strika @@ -1834,7 +1836,7 @@ fo: delete_statuses: Summir av postum tínum eru staðfestir at vera í stríði við eina ella fleiri av leiðreglunum og eru tí strikaðir av umsjónarfólkunum á %{instance}. disable: Tú kanst ikki longur brúka tína kontu, men vangi tín og aðrar dátur eru óskalað. Tú kanst biðja um trygdaravrit av tínum dátum, broyta kontustillingar ella strika tína kontu. mark_statuses_as_sensitive: Summir av postum tínum eru merktir sum viðkvæmir av umsjónarfólkunum á %{instance}. Hetta merkir, at fólk mugu trýsta á miðilin í postinum, áðrenn ein undanvísing verður víst. Tú kanst sjálv/ur merkja miðlar viðkvæmar, tá tú postar í framtíðini. - sensitive: Frá nú av, so verða allar miðlafílur, sum tú leggur upp, merktar sum viðkvæmar og fjaldar aftan fyri eina ávarðing. + sensitive: Frá nú av, so verða allar miðlafílur, sum tú leggur upp, merktar sum viðkvæmar og fjaldar aftan fyri eina ávaring. silence: Tú kanst framvegis brúka kontu tína, men einans fólk, sum longu fylgja tær, fara at síggja tínar postar á hesum ambætaranum, og tú kanst vera hildin uttanfyri ymiskar leitihentleikar. Tó so, onnur kunnu framvegis fylgja tær beinleiðis. suspend: Tú kanst ikki longur brúka kontu tína og vangin og aðrar dátur eru ikki longur atkomulig. Tú kanst enn rita inn fyri at biðja um eitt trygdaravrit av tínum dátum, inntil dáturnar eru heilt burturbeindar um umleið 30 dagar, men vit varðveita nakrar grundleggjandi dátur fyri at forða tær í at støkka undan ógildingini. reason: 'Grund:' diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 05d6b8864..f297e8bfd 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -949,7 +949,6 @@ fr-CA: delete: Supprimer edit_preset: Éditer les avertissements prédéfinis empty: Vous n'avez pas encore créé de paramètres prédéfinis pour les avertissements. - title: Gérer les avertissements prédéfinis webhooks: add_new: Ajouter un point de terminaison delete: Supprimer diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 6ab420880..33cdcd44c 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -949,7 +949,6 @@ fr: delete: Supprimer edit_preset: Éditer les avertissements prédéfinis empty: Vous n'avez pas encore créé de paramètres prédéfinis pour les avertissements. - title: Gérer les avertissements prédéfinis webhooks: add_new: Ajouter un point de terminaison delete: Supprimer diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 1d62f7c6a..c8e287732 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -597,6 +597,9 @@ fy: actions_description_html: Beslis hokker maatregel nommen wurde moat om dizze rapportaazje op te lossen. Wannear’t jo in (straf)maatregel tsjin it rapportearre account nimme, kriget de account in e-mailmelding, behalve wannear’t de spam-kategory keazen is. actions_description_remote_html: Beslút hokker aksje nommen wurde moat om dizze rapportaazje ôf te hanneljen. Dit hat allinnich ynfloed op hoe’t jo server kommunisearret mei dizze eksterne account en omgiet mei de ynhâld. add_to_report: Mear oan de rapportaazje tafoegje + already_suspended_badges: + local: Al opskoarte op dizze server + remote: Al opskoarte op harren server are_you_sure: Binne jo wis? assign_to_self: Oan my tawize assigned: Tawizen moderator @@ -748,6 +751,7 @@ fy: desc_html: Dit is ôfhinklik fan eksterne scripts fan hCaptcha, wat feilichheids- en privacyrisiko’s meibringe kin. Boppe dat kin dit it registraasjeproses bot minder tagonklik meitsje foar guon (foaral handicapte) minsken. Om dizze redenen kinne jo it beste alternative maatregels oerweagje, lykas registraasje op basis fan goedkarring of op útnûging. title: Nije brûkers moatte in CAPTCHA oplosse om harren account te befêstigjen content_retention: + danger_zone: Gefaresône preamble: Tafersjoch hâlde op hoe’t berjochten en media fan brûkers op Mastodon bewarre wurde. title: Bewartermyn berjochten default_noindex: @@ -767,6 +771,7 @@ fy: disabled: Oan net ien users: Oan oanmelde lokale brûkers registrations: + moderation_recommandation: Soargje derfoar dat jo in adekwaat en responsyf moderaasjeteam hawwe eardat jo registraasjes foar elkenien iepenstelle! preamble: Tafersjoch hâlde op wa’t in account op dizze server registrearje kin. title: Registraasjes registrations_mode: @@ -944,7 +949,6 @@ fy: delete: Fuortsmite edit_preset: Foarynstelling foar warskôging bewurkje empty: Jo hawwe noch gjin foarynstellingen foar warskôgingen tafoege. - title: Foarynstellingen foar warskôgingen beheare webhooks: add_new: Einpunt tafoegje delete: Fuortsmite @@ -1647,13 +1651,24 @@ fy: import: Ymportearje import_and_export: Ymportearje en eksportearje migrate: Accountmigraasje + notifications: E-mailmeldingen preferences: Ynstellingen profile: Profyl relationships: Folgers en folgjenden + severed_relationships: Ferbrutsen folchrelaasjes statuses_cleanup: Automatysk berjochten fuortsmite strikes: Fêststelde skeiningen two_factor_authentication: Twa-stapsferifikaasje webauthn_authentication: Befeiligingskaaien + severed_relationships: + download: Downloade (%{count}) + event_type: + account_suspension: Accountopskoarting (%{target_name}) + domain_block: Serveropskoarting (%{target_name}) + user_domain_block: Jo hawwe %{target_name} blokkearre + lost_followers: Ferlerne folgers + lost_follows: Ferlerne folge accounts + type: Barren statuses: attached: audio: @@ -1747,6 +1762,7 @@ fy: contrast: Mastodon (heech kontrast) default: Mastodon (donker) mastodon-light: Mastodon (ljocht) + system: Automatysk (systeemtema brûke) time: formats: default: "%d %B %Y om %H:%M" @@ -1838,13 +1854,30 @@ fy: apps_ios_action: Fia de App Store downloade apps_step: Us offisjele apps downloade apps_title: Mastodon-apps + checklist_subtitle: 'Litte wy oan dit nije sosjale aventoer begjinne:' + checklist_title: Wolkomstkontrôlelist edit_profile_action: Personalisearje + edit_profile_step: Wannear’t jo mear oer josels fertelle, krije jo mear ynteraksje mei oare minsken. edit_profile_title: Jo profyl personalisearje explanation: Hjir binne inkelde tips om jo op wei te helpen feature_action: Mear ynfo + feature_audience: Mastodon biedt jo in unike mooglikheid om jo publyk te behearen sûnder tuskenpersoanen. Mastodon, ymplemintearre yn jo eigen ynfrastruktuer, stelt jo yn steat om elke oare Mastodon-server online te folgjen en troch harren folge te wurden, en stiet ûnder kontrôle fan net ien, útsein dy fan jo. + feature_audience_title: Bou jo publyk yn fertrouwen op + feature_control: Jo witte sels it bêste wat jo op jo tiidline sjen wolle. Gjin algoritmen of advertinsjes om jo tiid te fergriemen. Folgje elkenien op elke Mastodon-server fan ien account ôf en ûntfang harren berjochten yn gronologyske folchoarder, en meitsje jo hoekje op it ynternet in bytsje mear as josels. + feature_control_title: Hâld kontrôle oer jo eigen tiidline + feature_creativity: Mastodon stipet audio-, fideo- en fotoberjochten, tagonklikheidsbeskriuwingen, enkêten, ynhâldswarskôgingen, animearre avatars, oanpaste emoji, kontrôle oer it bywurkjen fan miniatueren en mear, om jo te helpen josels online te uterjen. Oft jo no jo keunst, muzyk of podcast publisearje, Mastodon stiet foar jo klear. + feature_creativity_title: Bjusterbaarlike kreativiteit + feature_moderation: Mastodon leit de beslútfoarming wer yn jo hannen. Elke server makket harren eigen rigels en foarskriften, dy’t lokaal hanthavene wurde en net fan boppe ôf, lykas sosjale media fan bedriuwen, wêrtroch it it meast fleksibel is yn it reagearjen op de behoeften fan ferskate groepen minsken. Wurd lid fan in server mei de rigels wêrmei’t jo akkoard geane, of host jo eigen. + feature_moderation_title: Moderaasje sa as it heart follow_action: Folgje + follow_step: Op Mastodon draait it hielendal om it folgjen fan ynteressante minsken. + follow_title: Personalisearje jo starttiidline + follows_subtitle: Folgje bekende accounts follows_title: Wa te folgjen follows_view_more: Mear minsken om te folgjen besjen + hashtags_recent_count: + one: "%{people} persoan yn de ôfrûne 2 dagen" + other: "%{people} persoanen yn de ôfrûne 2 dagen" hashtags_subtitle: Wat der yn de ôfrûne 2 dagen bard is ferkenne hashtags_title: Populêre hashtags hashtags_view_more: Mear populêre hashtags besjen diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 70bace05c..52b25e285 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -983,7 +983,6 @@ gd: delete: Sguab às edit_preset: Deasaich rabhadh ro-shuidhichte empty: Cha do mhìnich thu ro-sheataichean rabhaidhean fhathast. - title: Stiùirich na rabhaidhean ro-shuidhichte webhooks: add_new: Cuir puing-dheiridh ris delete: Sguab às diff --git a/config/locales/gl.yml b/config/locales/gl.yml index f36d6783c..a8489e425 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -5,7 +5,7 @@ gl: contact_missing: Non establecido contact_unavailable: Non dispoñíbel hosted_on: Mastodon aloxado en %{domain} - title: Acerca de + title: Sobre accounts: follow: Seguir followers: @@ -285,6 +285,7 @@ gl: update_custom_emoji_html: "%{name} actualizou o emoji %{target}" update_domain_block_html: "%{name} actualizou o bloqueo do dominio para %{target}" update_ip_block_html: "%{name} cambiou a regra para IP %{target}" + update_report_html: "%{name} actualizou a denuncia %{target}" update_status_html: "%{name} actualizou a publicación de %{target}" update_user_role_html: "%{name} cambiou o rol %{target}" deleted_account: conta eliminada @@ -503,7 +504,7 @@ gl: instance_follows_measure: as súas seguidoras aquí instance_languages_dimension: Top de idiomas instance_media_attachments_measure: anexos multimedia gardados - instance_reports_measure: denuncias acerca deles + instance_reports_measure: denuncias sobre eles instance_statuses_measure: publicacións gardadas delivery: all: Todo @@ -615,7 +616,7 @@ gl: created_at: Denunciado delete_and_resolve: Eliminar publicacións forwarded: Reenviado - forwarded_replies_explanation: Esta denuncia procede dunha usuaria remota e acerca de contido remoto. Enviouseche unha copia porque o contido denunciado é unha resposta a unha das túas usuarias. + forwarded_replies_explanation: Esta denuncia procede dunha usuaria remota e sobre contido remoto. Enviouseche unha copia porque o contido denunciado é unha resposta a unha das túas usuarias. forwarded_to: Reenviado a %{domain} mark_as_resolved: Marcar como resolto mark_as_sensitive: Marcar como sensible @@ -740,7 +741,7 @@ gl: manage_rules: Xestionar regras do servidor preamble: Proporciona información detallada acerca do xeito en que se xestiona, modera e financia o servidor. rules_hint: Hai un espazo dedicado para as normas que é de agardar as usuarias acaten. - title: Acerca de + title: Sobre appearance: preamble: Personalizar a interface web de Mastodon. title: Aparencia @@ -751,6 +752,7 @@ gl: desc_html: Ten dependencia de scripts externos desde hCaptcha, que podería ser un problema de seguridade e privacidade. Ademáis, pode diminuír a accesiblidade para algunhas persoas (principalmente as discapacitadas). Por estas razóns, considera medidas alternativas como o rexistro por convite e a aprobación manual das contas. title: Pedirlle ás novas usuarias resolver un CAPTCHA para confirmar a súa conta content_retention: + danger_zone: Zona perigosa preamble: Controla como se gardan en Mastodon os contidos creados polas usuarias. title: Retención do contido default_noindex: @@ -949,7 +951,7 @@ gl: delete: Eliminar edit_preset: Editar aviso preestablecido empty: Non definiches os avisos prestablecidos. - title: Xestionar avisos preestablecidos + title: Preestablecidos de advertencia webhooks: add_new: Engadir punto de extremo delete: Eliminar @@ -1869,7 +1871,7 @@ gl: feature_action: Saber máis feature_audience: Mastodon dache a oportunidade de xestionar sen intermediarios as túas relacións. Incluso se usas o teu propio servidor Mastodon poderás seguir e ser seguida desde calquera outro servidor Mastodon conectado á rede e estará baixo o teu control exclusivo. feature_audience_title: Crea a túa audiencia con tranquilidade - feature_control: Sabes mellor ca ninguén o que queres ver na cronoloxía. Non hai algoritmos nin publicidade facéndoche perder o tempo. Segue cunha soa conta a outras persoas en servidores Mastodon diferentes ao teu, recibirás as publicacións en orde cronolóxica, e farás deste curruchiño de internet un lugar para ti. + feature_control: Sabes mellor ca ninguén o que queres ver na cronoloxía. Non hai algoritmos nin publicidade facéndoche perder o tempo. Sigue cunha soa conta a outras persoas en servidores Mastodon diferentes ao teu, recibirás as publicacións en orde cronolóxica, e farás deste curruchiño de internet un lugar para ti. feature_control_title: Tes o control da túa cronoloxía feature_creativity: Mastodon ten soporte para audio, vídeo e imaxes nas publicacións, descricións para mellorar a accesibilidade, enquisas, avisos sobre o contido, avatares animados, emojis personalizados, control sobre o recorte de miniaturas, e moito máis, para axudarche a expresarte en internet. Tanto se publicas o teu arte, música ou podcast, Mastodon está aquí para ti. feature_creativity_title: Creatividade incomparable diff --git a/config/locales/he.yml b/config/locales/he.yml index ddb3417ff..9088f4821 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -291,6 +291,7 @@ he: update_custom_emoji_html: "%{name} עדכן/ה אמוג'י %{target}" update_domain_block_html: "%{name} עדכן/ה חסימת דומיין עבור %{target}" update_ip_block_html: "%{name} שינה כלל עבור IP %{target}" + update_report_html: '%{name} עדכן/ה דו"ח %{target}' update_status_html: "%{name} עדכן/ה הודעה של %{target}" update_user_role_html: "%{name} שינה את התפקיד של %{target}" deleted_account: חשבון מחוק @@ -779,6 +780,7 @@ he: desc_html: אפשרות זו ניסמכת על קטעי קוד חיצוניים של hCaptcha שעלולים להיות סיכון אבטחה ופרטיות. בנוסף, זה עשוי להפוך את תהליך ההרשמה לבלתי נגיש לא.נשים, במיוחד בעלות ובעלי מוגבלויות. מסיבות אלו, כדאי לשקול חלופות כמו אשרור מנהלים ידני או הרשמה רק על בסיס הזמנה. title: לדרוש פתרון CAPTCHA כדי לאשרר למשתמשים את חשבונם content_retention: + danger_zone: אזור מסוכן preamble: שליטה על דרך אחסון תוכן המשתמשים במסטודון. title: תקופת השמירה של תכנים default_noindex: @@ -983,7 +985,7 @@ he: delete: למחוק edit_preset: ערוך/י טקסט מוכן מראש לאזהרה empty: לא הגדרת עדיין שום טקסט מוכן מראש לאזהרה. - title: ניהול טקסטים מוכנים מראש לאזהרות + title: תצורת אזהרות webhooks: add_new: הוספת נקודת קצה delete: מחיקה diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 43f769253..d79bca7ff 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -285,6 +285,7 @@ hu: update_custom_emoji_html: "%{name} frissítette az emodzsit: %{target}" update_domain_block_html: "%{name} frissítette a %{target} domain tiltását" update_ip_block_html: "%{name} módosította a(z) %{target} IP-címre vonatkozó szabályt" + update_report_html: "%{name} frissítette a %{target} bejelentést" update_status_html: "%{name} frissítette %{target} felhasználó bejegyzését" update_user_role_html: "%{name} módosította a(z) %{target} szerepkört" deleted_account: törölt fiók @@ -751,6 +752,7 @@ hu: desc_html: Ez hCaptcha-ból származó külső scripteket használ, mely biztonsági vagy adatvédelmi résnek bizonyulhat. Ezen kívül ez a regisztrációs folyamatot jelentősen megnehezítheti bizonyos (kifejezetten különleges szükségletű) emberek számára. Emiatt fontold meg más módszerek, mint pl. jóváhagyás-alapú vagy meghívásalapú regisztráció használatát. title: Az új felhasználóknak egy CAPTCHA-t kell megoldaniuk, hogy megerősítsék a fiókjuk regisztrációját content_retention: + danger_zone: Veszélyzóna preamble: A felhasználók által előállított tartalom Mastodonon való tárolásának szabályozása. title: Tartalom megtartása default_noindex: @@ -949,7 +951,7 @@ hu: delete: Törlés edit_preset: Figyelmeztetés szerkesztése empty: Nem definiáltál még egyetlen figyelmeztetést sem. - title: Figyelmeztetések + title: Figyelmeztető szövegek webhooks: add_new: Végpont hozzáadása delete: Törlés diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 6c9929315..f8834136b 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -106,17 +106,31 @@ ia: pending: Attende revision perform_full_suspension: Suspender previous_strikes: Previe admonitiones + previous_strikes_description_html: + one: Iste conto ha un admonition. + other: Iste conto ha %{count} admonitiones. promote: Promover protocol: Protocollo public: Public push_subscription_expires: Subscription PuSH expira le redownload: Actualisar profilo + redownloaded_msg: Le profilo de %{username} ha essite actualisate desde le origine + reject: Rejectar + rejected_msg: Le demanda de inscription de %{username} ha essite rejectate + remote_suspension_irreversible: Le datos de iste conto ha essite irreversibilemente delite. + remote_suspension_reversible_hint_html: Le conto ha essite suspendite sur su servitor, e le datos essera removite completemente le %{date}. Usque alora, le servitor remote pote restaurar iste conto sin effectos negative. Si tu vole remover immediatemente tote le datos del conto, tu pote facer lo hic infra. + remove_avatar: Remover avatar + remove_header: Remover capite + removed_avatar_msg: Le imagine de avatar de %{username} ha essite removite + removed_header_msg: Le imagine de capite de %{username} ha essite removite resend_confirmation: already_confirmed: Iste usator jam es confirmate send: Reinviar ligamine de confirmation success: Ligamine de confirmation inviate con successo! reset: Reinitialisar reset_password: Reinitialisar contrasigno + resubscribe: Resubscriber + role: Rolo search: Cercar search_same_email_domain: Altere usatores con le mesme dominio de e-mail search_same_ip: Altere usatores con le mesme IP @@ -124,75 +138,212 @@ ia: security_measures: only_password: Solmente contrasigno password_and_2fa: Contrasigno e 2FA + sensitive: Fortiar sensibile + sensitized: Marcate como sensibile + shared_inbox_url: URL del cassa de entrata condividite show: created_reports: Reportos facite targeted_reports: Signalate per alteres + silence: Limitar silenced: Limitate statuses: Messages + strikes: Previe admonitiones subscribe: Subscriber + suspend: Suspender suspended: Suspendite + suspension_irreversible: Le datos de iste conto ha essite irreversibilemente delite. Tu pote disfacer le suspension de iste conto pro render lo usabile, ma isto non recuperara alcun datos precedente. + suspension_reversible_hint_html: Le conto ha essite suspendite, e le datos essera removite completemente le %{date}. Usque alora, le conto pote esser restaurate sin effectos negative. Si tu vole remover immediatemente tote le datos del conto, tu pote facer lo hic infra. title: Contos unblock_email: Disblocar adresse de e-mail unblocked_email_msg: Adresse de e-mail de %{username} disblocate con successo unconfirmed_email: E-mail non confirmate + undo_sensitized: Non plus fortiar sensibile undo_silenced: Disfacer le limite undo_suspension: Disfacer le suspension + unsilenced_msg: Le limite del conto de %{username} ha essite cancellate + unsubscribe: Desubscriber + unsuspended_msg: Le suspension del conto %{username} ha essite annullate username: Nomine de usator view_domain: Vider summario de dominio + warn: Advertir + web: Web + whitelisted: Permittite pro federation action_logs: action_types: + approve_appeal: Approbar appello + approve_user: Approbar usator + assigned_to_self_report: Assignar reporto + change_email_user: Cambiar e-mail pro le usator + change_role_user: Cambiar le rolo del usator confirm_user: Confirmar le usator create_account_warning: Crear un advertimento create_announcement: Crear annuncio + create_canonical_email_block: Crear blocada de email + create_custom_emoji: Crear emoticone personalisate + create_domain_allow: Crear permisso de dominio + create_domain_block: Crear blocada de dominio + create_email_domain_block: Crear blocada de dominio email create_ip_block: Crear un regula IP + create_unavailable_domain: Crear dominio indisponibile + create_user_role: Crear un rolo + demote_user: Degradar usator destroy_announcement: Deler annuncio + destroy_canonical_email_block: Deler blocada de email + destroy_custom_emoji: Deler emoticone personalisate + destroy_domain_allow: Deler permisso de dominio + destroy_domain_block: Deler blocada de dominio + destroy_email_domain_block: Crear blocada de dominio email + destroy_instance: Purgar dominio destroy_ip_block: Deler le regula IP destroy_status: Deler le message destroy_unavailable_domain: Deler le dominio non disponibile + destroy_user_role: Destruer rolo disable_2fa_user: Disactivar 2FA disable_custom_emoji: Disactivar emoji personalisate + disable_sign_in_token_auth_user: Disactivar le authentication per testimonio via email pro usator disable_user: Disactivar le usator enable_custom_emoji: Activar emoji personalisate + enable_sign_in_token_auth_user: Activar le authentication per testimonio via email pro usator enable_user: Activar le usator + memorialize_account: Commemorar conto promote_user: Promover usator + reject_appeal: Rejectar appello + reject_user: Rejectar usator + remove_avatar_user: Remover avatar + reopen_report: Reaperir reporto + resend_user: Reinviar message de confirmation reset_password_user: Reinitialisar contrasigno + resolve_report: Resolver reporto + sensitive_account: Marcar como sensibile le medios del conto silence_account: Limitar conto + suspend_account: Suspender conto + unassigned_report: Disassignar reporto unblock_email_account: Disblocar adresse de e-mail + unsensitive_account: Dismarcar como sensibile le medios del conto unsilence_account: Disfacer le limite de conto + unsuspend_account: Annullar suspension de conto update_announcement: Actualisar annuncio update_custom_emoji: Actualisar emoji personalisate + update_domain_block: Actualisar blocada de dominio update_ip_block: Actualisar le regula IP update_status: Actualisar le message + update_user_role: Actualisar rolo actions: + approve_appeal_html: "%{name} approbava appello del decision de moderation de %{target}" + approve_user_html: "%{name} approbava inscription de %{target}" + assigned_to_self_report_html: "%{name} assignava reporto %{target} a se mesme" change_email_user_html: "%{name} cambiava le adresse de e-mail address del usator %{target}" + change_role_user_html: "%{name} cambiava rolo de %{target}" + confirm_user_html: "%{name} confirmava le adresse email del usator %{target}" + create_account_warning_html: "%{name} inviava un advertimento a %{target}" create_announcement_html: "%{name} creava un nove annuncio %{target}" + create_canonical_email_block_html: "%{name} blocava email con le hash %{target}" + create_custom_emoji_html: "%{name} cargava nove emoticone %{target}" + create_domain_allow_html: "%{name} permitteva federation con dominio %{target}" + create_domain_block_html: "%{name} blocava dominio %{target}" + create_email_domain_block_html: "%{name} blocava dominio email %{target}" + create_ip_block_html: "%{name} creava regula pro IP %{target}" + create_unavailable_domain_html: "%{name} stoppava consignation a dominio %{target}" + create_user_role_html: "%{name} creava rolo de %{target}" + demote_user_html: "%{name} degradava usator %{target}" + destroy_announcement_html: "%{name} deleva annuncio %{target}" + destroy_canonical_email_block_html: "%{name} disblocava email con le hash %{target}" + destroy_custom_emoji_html: "%{name} deleva emoji %{target}" + destroy_domain_allow_html: "%{name} impediva le federation con dominio %{target}" + destroy_domain_block_html: "%{name} disblocava dominio %{target}" + destroy_email_domain_block_html: "%{name} disblocava le dominio email %{target}" + destroy_instance_html: "%{name} purgava le dominio %{target}" + destroy_ip_block_html: "%{name} deleva le regula pro IP %{target}" + destroy_status_html: "%{name} removeva le message de %{target}" + destroy_unavailable_domain_html: "%{name} resumeva le consignation al dominio %{target}" + destroy_user_role_html: "%{name} deleva le rolo de %{target}" + disable_2fa_user_html: "%{name} disactivava le authentication a duo factores pro le usator %{target}" + disable_custom_emoji_html: "%{name} disactivava le emoticone %{target}" + disable_sign_in_token_auth_user_html: "%{name} disactivava authentication per testimonio via email pro %{target}" + disable_user_html: "%{name} disactivava le accesso pro le usator %{target}" + enable_custom_emoji_html: "%{name} activava le emoticone %{target}" + enable_sign_in_token_auth_user_html: "%{name} activava le authentication per testimonio via email pro %{target}" + enable_user_html: "%{name} activava le accesso pro le usator %{target}" + memorialize_account_html: "%{name} mutava le conto de %{target} in un pagina commemorative" + promote_user_html: "%{name} promoveva le usator %{target}" + reject_appeal_html: "%{name} refusava le appello del decision de moderation de %{target}" + reject_user_html: "%{name} refusava le inscription de %{target}" + remove_avatar_user_html: "%{name} removeva le avatar de %{target}" + reopen_report_html: "%{name} reaperiva le reporto %{target}" + resend_user_html: "%{name} reinviava le email de confirmation pro %{target}" + reset_password_user_html: "%{name} reinitialisava le contrasigno del usator %{target}" + resolve_report_html: "%{name} resolveva le reporto %{target}" + sensitive_account_html: "%{name} marcava como sensibile le medios de %{target}" + silence_account_html: "%{name} limitava le conto de %{target}" + suspend_account_html: "%{name} suspendeva le conto de %{target}" + unassigned_report_html: "%{name} de-assignava le reporto %{target}" + unblock_email_account_html: "%{name} disblocava le adresse email de %{target}" + unsensitive_account_html: "%{name} dismarcava como sensibile le medios de %{target}" + unsilence_account_html: "%{name} removeva le limite del conto de %{target}" + unsuspend_account_html: "%{name} removeva le suspension del conto de %{target}" + update_announcement_html: "%{name} actualisava le annuncio %{target}" + update_custom_emoji_html: "%{name} actualisava le emoticone %{target}" + update_domain_block_html: "%{name} actualisava le blocada de dominio pro %{target}" + update_ip_block_html: "%{name} cambiava le regula pro IP %{target}" + update_report_html: "%{name} actualisava le reporto %{target}" + update_status_html: "%{name} actualisava le message per %{target}" + update_user_role_html: "%{name} cambiava le rolo de %{target}" deleted_account: conto delite + empty: Nulle registrationes trovate. + filter_by_action: Filtrar per action + filter_by_user: Filtrar per usator + title: Registro de inspection announcements: destroyed_msg: Annuncio delite con successo! edit: title: Modificar annuncio empty: Necun annuncios trovate. + live: Al vivo new: create: Crear annuncio title: Nove annuncio publish: Publicar published_msg: Annuncio publicate con successo! + scheduled_for: Programmate pro %{time} + scheduled_msg: Annuncio programmate pro le publication! title: Annuncios + unpublish: Depublicar + unpublished_msg: Le publication del annuncio ha essite disfacite! + updated_msg: Annuncio actualisate con successo! + critical_update_pending: Actualisation critic pendente custom_emojis: + assign_category: Assignar categoria by_domain: Dominio copied_msg: Copia local del emoji create con successo copy: Copiar + copy_failed_msg: Impossibile crear un copia local de ille emoticone create_new_category: Crear nove categoria created_msg: Emoji create con successo! delete: Deler + destroyed_msg: Emoticone destruite con successo destroyed! disable: Disactivar disabled: Disactivate + disabled_msg: Emoji disactivate con successo + emoji: Emoticone enable: Activar enabled: Activate enabled_msg: Emoji activate con successo + image_hint: PNG o GIF usque %{size} + list: Listar + listed: Listate new: title: Adder nove emoji personalisate + no_emoji_selected: Nulle emoticones ha essite cambiate perque nulle ha essite seligite + not_permitted: Tu non es autorisate a exequer iste action + overwrite: Superscriber + shortcode: Via breve + shortcode_hint: Al minus 2 characteres, solo characteres alphanumeric e lineettas basse title: Emojis personalisate + uncategorized: Sin categoria + unlist: Non listar + unlisted: Non listate + update_failed_msg: Impossibile actualisar ille emoticone + updated_msg: Emoticone actualisate con successo! upload: Incargar dashboard: active_users: usatores active @@ -200,154 +351,897 @@ ia: media_storage: Immagazinage de medios new_users: nove usatores opened_reports: reportos aperte + pending_appeals_html: + one: "%{count} appello pendente" + other: "%{count} appellos pendente" + pending_reports_html: + one: "%{count} reporto pendente" + other: "%{count} reportos pendente" + pending_tags_html: + one: "%{count} hashtag pendente" + other: "%{count} hashtags pendente" + pending_users_html: + one: "%{count} usator pendente" + other: "%{count} usatores pendente" + resolved_reports: reportos resolvite + software: Software + sources: Fontes de inscription + space: Uso de spatio + title: Pannello de controlo top_languages: Linguas le plus active top_servers: Servitores le plus active website: Sito web + disputes: + appeals: + empty: Nulle appellos trovate. + title: Appellos domain_allows: add_new: Permitter federation con dominio + created_msg: Le dominio ha essite permittite con successo pro federation + destroyed_msg: Le dominio ha essite prohibite pro federation export: Exportar import: Importar + undo: Prohiber federation con dominio domain_blocks: + add_new: Adder nove blocada de dominio confirm_suspension: cancel: Cancellar + confirm: Suspender + permanent_action: Disfacer le suspension non restaurara alcun datos o relation. + preamble_html: Tu es sur le puncto de suspender %{domain} e su subdominios. + remove_all_data: Isto removera de tu servitor tote le contento, multimedia e datos de profilo del contos de iste dominio. stop_communication: Tu servitor stoppara le communication con iste servitores. + title: Confirmar le blocada del dominio %{domain} + undo_relationships: Isto disfacera omne relation de sequimento inter le contos de iste servitores e illos del tue. + created_msg: Le blocada del dominio es ora in tractamento + destroyed_msg: Le blocada del dominio ha essite disfacite domain: Dominio - edit: Modificar un bloco de dominio + edit: Modificar un blocada de dominio + existing_domain_block: Tu ha ja imponite limites plus stricte sur %{name}. + existing_domain_block_html: Tu ha ja imponite limites plus stricte sur %{name}; ora es necessari disblocar lo primo. export: Exportar import: Importar + new: + create: Crear blocada + hint: Le blocada del dominio non impedira le creation de entratas de conto in le base de datos, ma applicara retroactive- e automaticamente le methodos specific de moderation a iste contos. + severity: + desc_html: "Limitar rendera le messages del contos de iste dominio invisibile pro tote persona que non los seque. Suspender removera de tu servitor tote le contento, multimedia e datos de profilo del contos de iste dominio. Usa Necun si tu solmente vole rejectar le files multimedial." + noop: Nemo + silence: Limitar + suspend: Suspender + title: Nove blocada de dominio + no_domain_block_selected: Necun blocada de dominio ha essite cambiate perque necun ha essite seligite + not_permitted: Tu non es autorisate a exequer iste action + obfuscate: Offuscar le nomine de dominio + obfuscate_hint: Offuscar partialmente le nomine de dominio in le lista si le diffusion del lista de limitationes del dominio es activate private_comment: Commento private + private_comment_hint: Commentar iste limitation de dominio pro uso interne per le moderatores. public_comment: Commento public + public_comment_hint: Commentar iste limitation de dominio pro le publico general, si le diffusion del lista de limitationes del dominio es activate. + reject_media: Refusar files multimedial + reject_media_hint: Remove le files multimedial immagazinate localmente e refusa de discargar tales in futuro. Irrelevante pro le suspensiones + reject_reports: Refusar reportos + reject_reports_hint: Ignorar tote le reportos proveniente de iste dominio. Irrelevante pro le suspensiones + undo: Disfacer blocada de dominio + view: Examinar blocada de dominio email_domain_blocks: add_new: Adder nove + allow_registrations_with_approval: Permitter inscriptiones con approbation + attempts_over_week: + one: "%{count} tentativa de inscription in le ultime septimana" + other: "%{count} tentativas de inscription in le ultime septimana" + created_msg: Le dominio de e-mail ha essite blocate delete: Deler + dns: + types: + mx: Registro MX domain: Dominio new: create: Adder un dominio + resolve: Resolver dominio title: Blocar un nove dominio de e-mail + no_email_domain_block_selected: Necun blocadas de dominio de e-mail ha essite cambiate perque necun ha essite seligite + not_permitted: Non permittite + resolved_dns_records_hint_html: Le nomine de dominio se resolve al sequente dominios MX, le quales ha le ultime responsibilitate pro le reception de e-mail. Blocar un dominio MX blocara le inscriptiones de qualcunque adresse de e-mail que usa le mesme dominio MX, mesmo si le nomine de dominio visibile es differente. Presta attention a evitar de blocar le grande fornitores de e-mail. + resolved_through_html: Resolvite per %{domain} title: Dominios de e-mail blocate export_domain_allows: + new: + title: Importar permissiones de dominio no_file: Necun file seligite export_domain_blocks: + import: + description_html: Tu es sur le puncto de importar un lista de blocadas de dominio. Per favor revide con grande cura iste lista, particularmente si tu non lo ha scribite tu mesme. + existing_relationships_warning: Relationes existente de sequimento + private_comment_description_html: 'Pro adjutar te a traciar de ubi proveni le blocadas importate, le blocadas importate essera create con le sequente commento private: %{comment}' + private_comment_template: Importate de %{source} le %{date} + title: Importar blocadas de dominio + invalid_domain_block: 'Un o plus blocadas de dominio ha essite saltate a causa del sequente error(es): %{error}' + new: + title: Importar blocadas de dominio no_file: Necun file seligite follow_recommendations: + description_html: "Le recommendationes de sequimento adjuta le nove usatores a trovar rapidemente contento interessante. Quando un usator non ha un historia sufficiente de interactiones con alteres pro formar recommendationes personalisate de sequimento, iste contos es recommendate. Illos se recalcula cata die a partir de un mixtura de contos con le plus grande numero de ingagiamentos recente e le numero de sequitores local le plus alte pro un lingua date." language: Per lingua status: Stato + suppress: Supprimer recommendation de sequimento + suppressed: Supprimite title: Sequer le recommendationes + unsuppress: Restaurar recommendation de sequimento instances: + availability: + description_html: + one: Si le livration al dominio falle %{count} die sin succeder, necun tentativa ulterior de livration essera facite, excepte si es recipite un livration ab le dominio. + other: Si le livration al dominio falle durante %{count} dies differente sin succeder, necun tentativa ulterior de livration essera facite, excepte si es recipite un livration ab le dominio. + failure_threshold_reached: Limine de fallimentos attingite le %{date}. + failures_recorded: + one: Tentativa fallite durante %{count} die. + other: Tentativa fallite durante %{count} dies differente. + no_failures_recorded: Necun fallimento cognoscite. + title: Disponibilitate + warning: Le ultime tentativa de connexion a iste servitor non ha succedite + back_to_all: Toto + back_to_limited: Limitate back_to_warning: Advertimento by_domain: Dominio + confirm_purge: Es tu secur que tu vole deler permanentemente le datos de iste dominio? content_policies: + comment: Nota interne + description_html: Tu pote definir politicas de contento que se applicara a tote le contos de iste dominio e a qualcunque de su subdominios. + limited_federation_mode_description_html: Tu pote decider si permitter le federation con iste dominio. + policies: + reject_media: Rejectar multimedia + reject_reports: Rejectar reportos + silence: Limitar + suspend: Suspender + policy: Politica reason: Ration public + title: Politicas de contento dashboard: instance_accounts_dimension: Contos le plus sequite + instance_accounts_measure: contos immagazinate + instance_followers_measure: nostre sequitores illac + instance_follows_measure: lor sequitores hic instance_languages_dimension: Linguas principal + instance_media_attachments_measure: annexos multimedial immagazinate + instance_reports_measure: signalationes sur illos + instance_statuses_measure: messages immagazinate delivery: + all: Totes + clear: Rader errores de livration + failing: Fallente + restart: Recomenciar livration + stop: Cessar livration unavailable: Non disponibile + delivery_available: Livration es disponibile + delivery_error_days: Dies de errores de livration + delivery_error_hint: Si le livration non es possibile durante %{count} dies, illo essera automaticamente marcate como non livrabile. + destroyed_msg: Le datos de %{domain} es ora in cauda pro deletion imminente. empty: Necun dominios trovate. + known_accounts: + one: "%{count} conto cognoscite" + other: "%{count} contos cognoscite" + moderation: + all: Toto + limited: Limitate + title: Moderation private_comment: Commento private public_comment: Commento public + purge: Purgar + purge_description_html: Si tu crede que iste dominio es foras de linea pro sempre, tu pote deler de tu immagazinage tote le registros del conto e le datos associate de iste dominio. Isto pote prender un tempore. + title: Federation total_blocked_by_us: Blocate per nos + total_followed_by_them: Sequite per illes total_followed_by_us: Sequite per nos + total_reported: Signalationes sur illes + total_storage: Annexos multimedial + totals_time_period_hint_html: Le totales monstrate hic infra include le datos de tote le tempore. + unknown_instance: Iste dominio non es actualmente cognoscite sur iste servitor. invites: deactivate_all: Disactivar toto filter: + all: Toto available: Disponibile + expired: Expirate + title: Filtro + title: Invitationes ip_blocks: add_new: Crear regula + created_msg: Le nove regula IP ha essite addite delete: Deler expires_in: '1209600': 2 septimanas '15778476': 6 menses '2629746': 1 mense + '31556952': 1 anno '86400': 1 die + '94670856': 3 annos new: title: Crear un nove regula IP + no_ip_block_selected: Necun regula IP ha essite cambiate perque necun ha essite seligite title: Regulas IP + relationships: + title: Relationes de %{acct} relays: + add_new: Adder nove repetitor delete: Deler + description_html: Un repetitor de federation es un servitor intermediari que excambia grande volumines de messages public inter le servitores que se inscribe e publica a illo. Illo pote adjutar le servitores micre e medie a discoperir le contento del fediverso, sin requirer que le usatores local seque manualmente altere personas sur servitores distante. disable: Disactivar disabled: Disactivate enable: Activar + enable_hint: Un vice activate, tu servitor se inscribera a tote le messages public de iste repetitor, e comenciara a inviar le messages public de iste servitor a illo. enabled: Activate + inbox_url: URL del repetitor + pending: Attende le approbation del repetitor save_and_enable: Salveguardar e activar + setup: Crear un connexion con un repetitor + signatures_not_enabled: Le repetitores pote non functionar correctemente durante que le modo secur o le modo de federation limitate es activate status: Stato + title: Repetitores + report_notes: + created_msg: Nota de signalation create con successo! + destroyed_msg: Nota de signalation delite con successo! reports: + account: + notes: + one: "%{count} nota" + other: "%{count} notas" + action_log: Registro de inspection + action_taken_by: Action prendite per + actions: + delete_description_html: Le messages signalate essera delite e un admonition essera registrate pro adjutar te a prender mesuras in caso de futur infractiones proveniente del mesme conto. + mark_as_sensitive_description_html: Le files multimedial in le messages reportate essera marcate como sensibile e un admonition essera registrate pro adjutar te a prender mesuras in caso de futur infractiones proveniente del mesme conto. + other_description_html: Vider plus optiones pro controlar le comportamento del conto e personalisar le communication al conto signalate. + resolve_description_html: Necun action essera prendite contra le conto signalate, necun admonition registrate, e le signalation essera claudite. + silence_description_html: Iste conto essera visibile solmente a qui ja lo seque o manualmente lo cerca, limitante gravemente su portata. Pote sempre esser revertite. Claude tote le signalationes contra iste conto. + suspend_description_html: Le conto e tote su contento essera inaccessible e finalmente delite, e interager con illo essera impossibile. Reversibile intra 30 dies. Claude tote le signalationes contra iste conto. + actions_description_html: Decide qual action prender pro resolver iste signalation. Si tu prende un action punitive contra le conto signalate, le persona recipera un notification in e-mail, excepte si le categoria Spam es seligite. + actions_description_remote_html: Decide qual action prender pro resolver iste signalation. Isto affectara solmente le maniera in que tu servitor communica con iste conto remote e gere su contento. add_to_report: Adder plus al reporto + already_suspended_badges: + local: Ja suspendite sur iste servitor + remote: Ja suspendite sur su servitor are_you_sure: Es tu secur? + assign_to_self: Assignar a me + assigned: Moderator assignate + by_target_domain: Dominio del conto signalate cancel: Cancellar category: Categoria + category_description_html: Le motivo pro le qual iste conto e/o contento ha essite signalate essera citate in le communication con le conto signalate + comment: + none: Necun + comment_description_html: 'Pro fornir plus information, %{name} ha scribite:' confirm: Confirmar + confirm_action: Confirmar le action de moderation contra %{acct} + created_at: Signalate delete_and_resolve: Deler le messages + forwarded: Reexpedite + forwarded_replies_explanation: Iste signalation proveni de un usator remote e concerne contento remote. Illo te ha essite reexpedite perque le contento signalate es in responsa a un usator tue. + forwarded_to: Reexpedite a %{domain} + mark_as_resolved: Marcar como resolvite + mark_as_sensitive: Marcar como sensibile + mark_as_unresolved: Marcar como non resolvite + no_one_assigned: Nemo notes: create: Adder un nota + create_and_resolve: Resolver con nota + create_and_unresolve: Reaperir con nota delete: Deler + placeholder: Describe le actiones prendite, o insere altere information pertinente... + title: Notas + notes_description_html: Vider e lassar notas pro altere moderatores e pro tu proprie futuro + processed_msg: 'Reporto #%{id} elaborate con successo' + quick_actions_description_html: 'Face un rapide action o rola a basso pro vider le contento reportate:' + remote_user_placeholder: le usator remote ab %{instance} + reopen: Reaperir reporto + report: 'Reporto #%{id}' + reported_account: Conto signalate + reported_by: Signalate per + resolved: Resolvite + resolved_msg: Reporto resolvite con successo! skip_to_actions: Saltar al actiones status: Stato + statuses: Contento signalate + statuses_description_html: Le contento offensive sera citate in communication con le conto reportate + summary: + action_preambles: + delete_html: 'Tu va remover parte de messages de @%{acct}. Isto ira:' + mark_as_sensitive_html: 'Tu va marcar parte de messages de @%{acct} como sensibile. Isto ira:' + silence_html: 'Tu va limitar le conto de @%{acct}. Isto ira:' + suspend_html: 'Tu va limitar le conto de @%{acct}. Isto ira:' + actions: + delete_html: Remover le messages offensive + mark_as_sensitive_html: Marcar le medios de messages offensive como sensibile + silence_html: Limitar gravemente le portata de @%{acct} rendente le profilo e contento visibile solmente a qui ja lo seque o lo cerca manualmente + suspend_html: Suspender @%{acct}, rendente le profilo e contento inaccessibile e le interaction con illo impossibile + close_report: Marcar le signalation №%{id} como resolvite + close_reports_html: Marcar tote le signalationes contra @%{acct} como resolvite + delete_data_html: Deler le profilo e contento de @%{acct} in 30 dies excepte si le suspension es disfacite intertanto + preview_preamble_html: "@%{acct} recipera un advertimento con le sequente contento:" + record_strike_html: Registrar un admonition contra @%{acct} pro adjutar te a imponer sanctiones in caso de futur violationes de iste conto + send_email_html: Inviar un e-mail de advertimento a @%{acct} + warning_placeholder: Motivation supplementari facultative pro le action de moderation. + target_origin: Origine del conto signalate + title: Reportos + unassign: Disassignar + unknown_action_msg: 'Action incognite: %{action}' + unresolved: Non resolvite updated_at: Actualisate view_profile: Vider profilo roles: + add_new: Adder rolo assigned_users: one: "%{count} usator" other: "%{count} usatores" - everyone: Permissiones predefinite - privileges: - delete_user_data: Deler le datos de usator - manage_announcements: Gerer le annuncios - manage_invites: Gerer le invitationes - manage_rules: Gerer le regulas - manage_settings: Gerer le parametros - manage_users: Gerer usatores - rules: + categories: + administration: Administration + devops: DevOps + invites: Invitationes + moderation: Moderation + special: Special delete: Deler + description_html: Le rolos de usator permitte personalisar le functiones e areas de Mastodon al quales le usator pote acceder. + edit: Modificar le rolo '%{name}' + everyone: Permissiones predefinite + everyone_full_description_html: Iste es le rolo de base que affecta tote le usatores, mesmo illes sin rolo assignate. Tote le altere rolos heredita le permissiones de illo. + permissions_count: + one: "%{count} permission" + other: "%{count} permissiones" + privileges: + administrator: Administrator + administrator_description: Le usatores con iste permission pote contornar tote permission + delete_user_data: Deler le datos de usator + delete_user_data_description: Permitte que usatores dele immediatemente le datos de altere usatores + invite_users: Invitar usatores + invite_users_description: Permitte que usatores invita nove personas al servitor + manage_announcements: Gerer le annuncios + manage_announcements_description: Permitte que usatores genere annuncios sur le servitor + manage_appeals: Gerer appellos + manage_appeals_description: Permitte que usatores revide appellos contra actiones de moderation + manage_blocks: Gerer blocadas + manage_blocks_description: Permitter que usatores bloca le fornitores de e-mail e le adresses IP + manage_custom_emojis: Gerer emojis personalisate + manage_custom_emojis_description: Permitte que usatores gere emojis personalisate sur le servitor + manage_federation: Gerer federation + manage_federation_description: Permitte que le usatores bloca o permitte le federation con altere dominios, e controla le livration + manage_invites: Gerer le invitationes + manage_invites_description: Permitte que usatores examina e deactiva ligamines de invitation + manage_reports: Gerer le reportos + manage_reports_description: Permitte que usatores revide signalationes e exeque actiones de moderation a base de illos + manage_roles: Gerer le rolos + manage_roles_description: Permitte que usatores gere e assigna rolos inferior a lor privilegios actual + manage_rules: Gerer le regulas + manage_rules_description: Permitte que usatores cambia le regulas del servitor + manage_settings: Gerer le parametros + manage_settings_description: Permitte que usatores cambia le parametros del sito + manage_taxonomies: Gerer taxonomias + manage_taxonomies_description: Permitte que usatores revide contento in tendentias e actualisa le parametros de hashtag + manage_user_access: Gerer le accessos de usator + manage_user_access_description: Permitte que usatores disactiva le authentication bifactorial de altere usatores, cambia lor adresses de e-mail, e reinitialisa lor contrasigno + manage_users: Gerer usatores + manage_users_description: Permitte que usatores vide le detalios de altere usatores e exeque actiones de moderation contra illes + manage_webhooks: Gerer Webhooks + manage_webhooks_description: Permitte que usatores installa “webhooks” pro eventos administrative + view_audit_log: Vider le registro de inspection + view_audit_log_description: Permitte que usatores vide un historia de actiones administrative sur le servitor + view_dashboard: Vider le tabuliero de instrumentos + view_dashboard_description: Permitte que usatores accede al tabuliero de instrumentos e a varie statisticas + view_devops: DevOps + view_devops_description: Permitte que usatores accede al tabulieros de instrumentos de Sidekiq e pgHero + title: Rolos + rules: + add_new: Adder regula + delete: Deler + description_html: Ben que multes affirma de haber legite e acceptate le conditiones de servicio, generalmente le gente non los lege completemente usque un problema surge. Facilita le visibilitate del regulas de tu servitor in un colpo de oculo forniente los in un lista a punctos. Tenta mantener le regulas individual curte e simple, ma sin divider los in multe punctos separate. + edit: Modificar regula + empty: Necun regula del servitor ha essite definite ancora. + title: Regulas del servitor settings: about: + manage_rules: Gerer le regulas del servitor + preamble: Fornir information detaliate sur le functionamento, moderation e financiamento del servitor. + rules_hint: Il ha un area dedicate al regulas que tu usatores debe acceptar. title: A proposito de appearance: preamble: Personalisar le interfacie web de Mastodon. title: Apparentia + branding: + preamble: Le marca de tu servitor lo differentia de altere servitores in le rete. Iste information pote esser monstrate in diverse ambientes, como le interfacie web de Mastodon, applicationes native, in previsualisationes de ligamines sur altere sitos web, in applicationes de messageria, etc. Pro iste ration, il es melior mantener iste information clar, breve e concise. + title: Marca + captcha_enabled: + desc_html: Iste depende de scripts externe de hCaptcha, que pote esser un problema de securitate e vita private. De plus, isto pote render le processo de inscription multo minus accessibile a certe personas (particularmente personas con discapacitates). Pro iste rationes, considera altere mesuras como le inscription basate sur approbation o invitation. + title: Require que nove usatores solve un CAPTCHA pro confirmar lor conto + content_retention: + danger_zone: Zona periculose + preamble: Controlar como contento generate per le usator es immagazinate in Mastodon. + title: Retention de contento + default_noindex: + desc_html: Affice tote le usatores qui non ha cambiate iste parametro per se mesme + title: Refusar de ordinario le indexation del usatores per le motores de recerca discovery: + follow_recommendations: Sequer le recommendationes + preamble: Presentar contento interessante es instrumental in introducer nove usatores qui pote non cognoscer alcuno de Mastodon. profile_directory: Directorio de profilos public_timelines: Chronologias public + publish_discovered_servers: Publicar servitores discoperite + publish_statistics: Publicar statistica + title: Discoperi trends: Tendentias + domain_blocks: + all: A omnes + disabled: A necuno + users: A usators local in session + registrations: + moderation_recommandation: Per favor verifica que tu ha un adequate e reactive equipa de moderation ante que tu aperi registrationes a quicunque! + preamble: Controla qui pote crear un conto sur tu servitor. + title: Registrationes + registrations_mode: + modes: + approved: Approbation necessari pro le inscription + none: Nemo pote inscriber se + open: Quicunque pote inscriber se + warning_hint: Nos consilia usar “Approbation necessari pro le inscription” si tu non crede que tu equipa de moderation pote tractar spam e registrationes maligne in un modo opportun. + security: + authorized_fetch: Require authentication ab servitores federate + authorized_fetch_hint: Requirer authentication de servitores federate permitte un application plus stricte de blocadas a nivello de usator e de servitor. Nonobstante, isto diminue le prestationes del servitor, reduce le portata de tu responsas e pote introducer problemas de compatibilitate con certe servicios federate. In plus, isto non impedira le actores dedicate a recuperar tu messages public e tu contos. + authorized_fetch_overridden_hint: Tu actualmente non pote cambiar iste parametros perque il es superate per un variabile de ambiente. + federation_authentication: Application del authentication de federation title: Parametros de servitor site_uploads: delete: Deler file incargate + destroyed_msg: Incarga de sito delite con successo! + software_updates: + critical_update: Critic! Actualisa tosto + description: Il es recommendate de mantener actualisate tu installation de Mastodon pro beneficiar del ultime reparationes e functiones. In ultra, il es aliquando critic actualisar Mastodon in maniera opportun pro evitar problemas de securitate. Pro iste rationes, Mastodon controla pro actualisationes cata 30 minutas, e te notificara secundo tu preferentias de notificationes per email. + documentation_link: Pro saper plus + release_notes: Notas de version + title: Actualisationes disponibile + type: Typo + types: + major: Version major + minor: Version minor + patch: 'Version de pecias: remedios de bugs e cambiamentos facile a applicar' + version: Version statuses: + account: Autor + application: Application + back_to_account: Retro al pagina de conto + back_to_report: Retro al pagina de reporto + batch: + remove_from_report: Remover ab reporto + report: Reporto + deleted: Delite + favourites: Favoritos + history: Chronologia del versiones + in_reply_to: Replicante a language: Lingua + media: + title: Medios metadata: Metadatos + no_status_selected: Nulle messages era cambiate perque necun era seligite open: Aperir message original_status: Message original + reblogs: Promotiones + status_changed: Messages cambiate title: Messages del conto trending: Tendentias visibility: Visibilitate + with_media: Con medios strikes: actions: + delete_statuses: "%{name} ha delite le messages de %{target}" + disable: "%{name} ha gelate le conto de %{target}" + mark_statuses_as_sensitive: "%{name} ha marcate le messages de %{target} como sensibile" none: "%{name} ha inviate un advertimento a %{target}" + sensitive: "%{name} ha marcate le conto de %{target} como sensibile" + silence: "%{name} ha limitate le conto de %{target}" + suspend: "%{name} ha suspendite le conto de %{target}" + appeal_approved: Appello facite + appeal_pending: Appello pendente + appeal_rejected: Appello rejectate system_checks: + database_schema_check: + message_html: Il ha migrationes de base de datos pendente. Per favor exeque los pro assecurar que le application se comporta como expectate + elasticsearch_health_red: + message_html: Le aggregation Elasticsearch es malsan (stato rubie), le functiones de recerca es indisponibile + elasticsearch_health_yellow: + message_html: Le aggregation Elasticsearch es malsan (stato jalne), tu poterea voler investigar le ration + elasticsearch_index_mismatch: + message_html: Le mappas de indice Elasticsearch es obsolete. Per favor exeque tootctl search deploy --only=%{value} + elasticsearch_preset: + action: Vide documentation + message_html: Tu aggregation Elasticsearch ha plus que un nodo, ma Mastodon non es configurate a usar los. + elasticsearch_preset_single_node: + action: Vide documentation + message_html: Tu aggregation Elasticsearch ha un sol nodo, ES_PRESET deberea esser predefinite a single_node_cluster. + elasticsearch_reset_chewy: + message_html: Le indexation de tu systema Elasticsearch es obsolete per un cambio de configuration. Per cfavor exeque tootctl search deploy --reset-chewy pro actualisar lo. + elasticsearch_running_check: + message_html: Impossibile connecter se a Elasticsearch. Verifica que illo flue, o disactiva le recerca a plen texto + elasticsearch_version_check: + message_html: 'Version de Elasticsearch incompatibile: %{value}' + version_comparison: Elasticsearch %{running_version} es currente dum %{required_version} es necesse rules_check: action: Gerer le regulas del servitor + message_html: Tu non ha definite ulle regulas de servitor. + sidekiq_process_check: + message_html: Nulle processo Sidekiq currente pro le %{value} cauda(s). Controla tu configuration de Sidekiq software_version_critical_check: action: Vider le actualisationes disponibile + message_html: Un actualisation critic de Mastodon es disponibile, actualisa lo le plus rapide possibile. software_version_patch_check: action: Vider le actualisationes disponibile + message_html: Un actualisation de remedio de bug pro Mastodon es disponibile. upload_check_privacy_error: action: Verifica hic pro plus de information + message_html: "Tu servitor de web es mal-configurate. Le confidentialitate de tu usatores es a risco." + upload_check_privacy_error_object_storage: + action: Verifica hic pro plus de information + message_html: "Tu immagazinage de objectos es mal-configurate. Le confidentialitate de tu usatores es a risco." + tags: + review: Revide le stato + updated_msg: Parametros de hashtag actualisate con successo + title: Administration + trends: + allow: Permitter + approved: Approbate + disallow: Impedir + links: + allow: Permitter ligamine + allow_provider: Permitter editor + description_html: Istos es ligamines que es actualmente multo compartite per contos de que tu servitor vide messages. Illo pote adjutar tu usatores a discoperir lo que eveni in le mundo. Nulle ligamines es monstrate publicamente usque tu non approba le editor. Tu alsi pote permitter o rejectar ligamines singule. + disallow: Impedir ligamine + disallow_provider: Impedir editor + no_link_selected: Nulle ligamine era cambiate perque nulle era seligite + publishers: + no_publisher_selected: Nulle editores era cambiate perque nemo era seligite + shared_by_over_week: + one: Compartite per un persona le septimana passate + other: Compartite per %{count} personas le septimana passate + title: Ligamines de tendentia + usage_comparison: Compartite %{today} vices hodie, comparate al %{yesterday} de heri + not_allowed_to_trend: Non permittite haber tendentia + only_allowed: Solo permittite + pending_review: Attende revision + preview_card_providers: + allowed: Ligamines ab iste editor pote haber tendentia + description_html: Il ha dominios ab que ligamines es sovente compartite sur tu servitor. Ligamines non habera publicamente tendentia salvo que le dominio del ligamine es approbate. Tu approbation (o rejection) se extende al sub-dominios. + rejected: Ligamines ab iste editor non habera tendentia + title: Editores + rejected: Rejectate + statuses: + allow: Permitter message + allow_account: Permitter autor + description_html: Istos es messages que tu servitor cognosce perque illos es al momento multo compartite e favorite. Isto pote adjutar tu nove e renovate usatores a trovar altere personas a sequer. Nulle messages es monstrate publicamente usque tu approba le autor, e le autor permitte que su conto es suggerite a alteres. Tu alsi pote permitter o rejectar messages singule. + disallow: Impedir message + disallow_account: Impedir autor + no_status_selected: Nulle messages era cambiate perque nulle era seligite + not_discoverable: Le autor non ha optate pro esser detectabile + shared_by: + one: Compartite e favorite un tempore + other: Compartite e favorite %{friendly_count} tempores + title: Messages de tendentia + tags: + current_score: Punctuage actual %{score} + dashboard: + tag_accounts_measure: usos unic + tag_languages_dimension: Linguas principal + tag_servers_dimension: Servitores principal + tag_servers_measure: servitores differente + tag_uses_measure: usos total + description_html: Istos es hashtags que actualmente appare in tante messages que tu servitor vide. Illo pote adjutar tu usatores a discoperir re que le personas parla plus al momento. Nulle hashtags es monstrate publicamente usque tu los approba. + listable: Pote esser suggerite + no_tag_selected: Nulle placas era cambiate perque nulle era seligite + not_listable: Non sera suggerite + not_trendable: Non apparera sub tendentias + not_usable: Non pote esser usate + peaked_on_and_decaying: Habeva un picco %{date}, ora decade + title: Hashtags de tendentia + trendable: Pote apparer sub tendentias + trending_rank: 'De tendentia #%{rank}' + usable: Pote esser usate + usage_comparison: Usate %{today} vices hodie, al contrario del %{yesterday} de heri + used_by_over_week: + one: Usate per un persona le ultime septimana + other: Usate per %{count} personas le ultime septimana + title: Tendentias + trending: Tendentias + warning_presets: + add_new: Adder nove + delete: Deler + edit_preset: Rediger aviso predefinite + empty: Tu non ha ancora definite alcun avisos predefinite. + title: Predefinitiones de avisos + webhooks: + add_new: Adder terminal + delete: Deler + description_html: Un croc web habilita Mastodon a transmitter notificationes in tempore real re eventos seligite pro tu pro activar application, assi tu application pote automaticamente discatenar reactiones. + disable: Disactivar + disabled: Disactivate + edit: Rediger terminal + empty: Tu ancora non ha configurate alcun punctos final de web croc. + enable: Activar + enabled: Active + enabled_events: + one: 1 evento activate + other: "%{count} eventos activate" + events: Eventos + new: Nove croc web + rotate_secret: Rotar secrete + secret: Firmante secrete + status: Stato + title: Crocs web + webhook: Crocs web + admin_mailer: + auto_close_registrations: + body: Per un carentia recente de activate de moderator, le registrationes sur %{instance} ha essite automaticamente mutate a besoniante revision manual, pro impedir %{instance} de esser usate como un platteforma pro potential mal actores. Tu pote mutar lo retro pro sempre aperir le registrationes. + subject: Le registrationes pro %{instance} ha essite automaticamente mutate a besoniante de approbation + new_appeal: + actions: + delete_statuses: pro deler lor messages + disable: pro gelar lor conto + mark_statuses_as_sensitive: pro marcar lor messages como sensibile + none: pro advertir + sensitive: a marcar lor conto como sensibile + silence: pro limitar lor conto + suspend: pro suspender lor conto + body: "%{target} appella un decision de moderation per %{action_taken_by} ab le %{date}, que era %{type}. Ille scribeva:" + next_steps: Tu pote approbar le appello a disfacer le decision de moderation, o ignorar lo. + subject: "%{username} appella un decision de moderation sur %{instance}" + new_critical_software_updates: + body: Nove versiones critic de Mastodon ha essite publicate, tu poterea voler actualisar al plus tosto possibile! + subject: Actualisationes critic de Mastodon es disponibile pro %{instance}! + new_pending_account: + body: Le detalios del nove conto es infra. + subject: Nove conto preste a revider sur %{instance} (%{username}) + new_report: + body: "%{reporter} ha reportate %{target}" + body_remote: Alcuno de %{domain} ha reportate %{target} + subject: Nove reporto pro %{instance} (#%{id}) + new_software_updates: + body: Nove versiones de Mastodon ha essite publicate, tu poterea voler actualisar! + subject: Nove versiones de Mastodon es disponibile pro %{instance}! + new_trends: + body: 'Le sequente elementos besoniar de un recension ante que illos pote esser monstrate publicamente:' + new_trending_links: + title: Ligamines de tendentia + new_trending_statuses: + title: Messages de tendentia + new_trending_tags: + title: Hashtags de tendentia + subject: Nove tendentias pro recenser sur %{instance} + aliases: + add_new: Crear alias + created_msg: Create con successo un nove alias. Ora tu pote initiar le motion ab le vetere conto. + deleted_msg: Removite con successo le alias. Mover de ille conto a isto non sera plus possibile. + empty: Tu non ha aliases. + hint_html: Si tu desira mover ab un altere conto a isto, ci tu pote crear un alias, que es requirite ante que tu pote continuar con mover sequaces ab le vetere conto a isto. Iste action per se mesme es innocue e reversibile. Le migration de conto es initiate ab le vetere conto. + remove: Disligar alias + appearance: + advanced_web_interface: Interfacie web avantiate + advanced_web_interface_hint: 'Si tu desira facer uso de tu integre largessa de schermo, le interfacie web avantiate te permitte de configurar plure columnas differente pro vider al mesme tempore tante informationes como tu vole: pagina principal, notificationes, chronogramma federate, ulle numero de listas e hashtags.' + animations_and_accessibility: Animationes e accessibilitate + confirmation_dialogs: Dialogos de confirmation + discovery: Discoperta + localization: + body: Mastodon es traducite per voluntarios. + guide_link: https://crowdin.com/project/mastodon + guide_link_text: Totes pote contribuer. + sensitive_content: Contento sensibile + application_mailer: + notification_preferences: Cambiar preferentias de e-mail + salutation: "%{name}," + settings: 'Cambiar preferentias de e-mail: %{link}' + unsubscribe: Desubscriber + view: 'Vider:' + view_profile: Vider profilo + view_status: Vider message + applications: + created: Application create con successo + destroyed: Application delite con successo + logout: Clauder le session + regenerate_token: Regenerar testimonio de accesso + token_regenerated: Testimonio de accesso regenerate con successo + warning: Sia multo attente con iste datos. Jammais compartir los con quicunque! + your_token: Tu testimonio de accesso + auth: + apply_for_account: Peter un conto + captcha_confirmation: + help_html: Si tu ha problemas a solver le CAPTCHA, tu pote contactar nos per %{email} e nos pote assister te. + hint_html: Justo un altere cosa! Nos debe confirmar que tu es un human (isto es assi proque nos pote mantener foras le spam!). Solve le CAPTCHA infra e clicca "Continuar". + title: Controlo de securitate + confirmations: + awaiting_review: Tu adresse email es confirmate! Le personal de %{domain} ora revide tu registration. Tu recipera un email si illes approba tu conto! + awaiting_review_title: Tu registration es revidite + clicking_this_link: cliccante iste ligamine + login_link: acceder + proceed_to_login_html: Ora tu pote continuar a %{login_link}. + redirect_to_app_html: Tu deberea haber essite re-dirigite al app %{app_name}. Si isto non eveni, tenta %{clicking_this_link} o manualmente retorna al app. + registration_complete: Tu registration sur %{domain} es ora complete! + welcome_title: Benvenite, %{name}! + wrong_email_hint: Si ille adresse email non es correcte, tu pote cambiar lo in parametros de conto. + delete_account: Deler le conto + delete_account_html: Si tu vole a dele tu conto, tu pote continuar ci. Te sera demandate confirmation. + description: + prefix_invited_by_user: "@%{name} te invita a junger te a iste servitor de Mastodon!" + prefix_sign_up: Inscribe te sur Mastodon hodie! + suffix: Con un conto, tu potera sequer personas, messages de actualisation e excambios de messages con usatores de ulle servitor de Mastodon e plus! + didnt_get_confirmation: Non recipeva tu un ligamine de confirmation? + dont_have_your_security_key: Non ha tu le clave de securitate? + forgot_password: Contrasigno oblidate? + invalid_reset_password_token: Pete un nove. + link_to_otp: Insere un codice a duo factores o un codice de recuperation ab tu telephono + link_to_webauth: Usa tu apparato clave de securitate + log_in_with: Accede con + login: Accede + logout: Clauder le session + migrate_account: Move a un conto differente + migrate_account_html: Si tu vole re-adressar iste conto a un altere, tu pote configurar lo ci. + or_log_in_with: O accede con + privacy_policy_agreement_html: Io ha legite e acceptar le politica de confidentialitate + progress: + confirm: Confirma le email + details: Tu detalios + review: Nostre revision + rules: Accepta le regulas + providers: + cas: CAS + saml: SAML + register: Inscribe te + registration_closed: "%{instance} non accepta nove membros" + resend_confirmation: Reinviar ligamine de confirmation + reset_password: Remontar le contrasigno + rules: + accept: Acceptar + back: Retro + invited_by: 'Tu pote junger te a %{domain} gratias al invitation que tu ha recipite de:' + preamble: Illos es predefinite e fortiarte per le moderatores de %{domain}. + preamble_invited: Ante que tu continua, considera le regulas base definite per le moderatores de %{domain}. + title: Alcun regulas base. + title_invited: Tu ha essite invitate. + security: Securitate + set_new_password: Definir un nove contrasigno + setup: + email_below_hint_html: Verifica tu plica de spam, o pete un altero. Tu pote corriger tu adresse email si illo es errate. + email_settings_hint_html: Clicca le ligamine que nos te inviava pro verificar %{email}. + link_not_received: Non obteneva tu un ligamine? + new_confirmation_instructions_sent: Tu recipera un nove email con le ligamine de confirmation in alcun minutas! + title: Verifica tu cassa de ingresso + sign_in: + preamble_html: Accede con tu %{domain} credentiales. Si tu conto es hospite sur un differente servitor, tu non potera authenticar te ci. + title: Acceder a %{domain} + sign_up: + manual_review: Le inscriptiones sur %{domain} passa per revision manual de nostre moderatores. Pro adjutar nos a processar tu registration, scribe un poco re te mesme e perque tu vole un conto sur %{domain}. + preamble: Con un conto sur iste servitor de Mastodon, tu potera sequer ulle altere persona in rete, sin reguardo de ubi lor conto es hospite. + title: Lassa que nos te configura sur %{domain}. + status: + account_status: Stato del conto + confirming: Attendente esser completate email de confirmation. + functional: Tu conto es plenmente operative. + pending: Tu application es pendente de revision per nostre personal. Isto pote prender alcun tempore. Tu recipera un email si tu application es approbate. + redirecting_to: Tu conto es inactive perque illo es actualmente re-adressa a %{acct}. + self_destruct: Dum %{domain} va clauder, tu solo habera accesso limitate a tu conto. + view_strikes: Examinar le admonitiones passate contra tu conto + too_fast: Formulario inviate troppo velocemente, retenta. + use_security_key: Usar clave de securitate + challenge: + confirm: Continuar + hint_html: "Consilio: Nos non te demandara tu contrasigno ancora pro le proxime hora." + invalid_password: Contrasigno non valide + prompt: Confirma le contrasigno pro continuar + crypto: + errors: + invalid_key: non es un clave Ed25519 o Curve25519 valide + invalid_signature: non es un valide firma Ed25519 + date: + formats: + default: "%b %d, %Y" + with_month_name: "%B %d, %Y" + datetime: + distance_in_words: + about_x_hours: "%{count}h" + about_x_months: "%{count}me" + about_x_years: "%{count}a" + almost_x_years: "%{count}a" + half_a_minute: Justo ora + less_than_x_minutes: "%{count} m" + less_than_x_seconds: Justo ora + over_x_years: "%{count}a" + x_days: "%{count}d" + x_minutes: "%{count} m" + x_months: "%{count}me" + x_seconds: "%{count}s" + deletes: + challenge_not_passed: Le informationes que tu ha inserite non era correcte + confirm_password: Insere tu contrasigno actual pro verificar tu identitate + confirm_username: Insere tu actual contrasigno pro verificar tu identitate + proceed: Deler le conto + success_msg: Tu conto esseva delite con successo + warning: + before: 'Insere tu nomine de usator pro confirmar le procedura:' + caches: Contente que ha essite in cache per altere servitores pote persister + data_removal: Tu messages e altere datos essera removite permanentemente + email_change_html: Tu pote cambiar tu adresse de e-mail sin deler tu conto + email_contact_html: Si illo ancora non arriva, tu pote inviar email a %{email} pro peter adjuta + email_reconfirmation_html: Si tu non recipe le email de confirmation, tu pote politica de confidentialitate. + username_available: Tu nomine de usator essera disponibile novemente + username_unavailable: Tu nomine de usator remanera indisponibile + disputes: + strikes: + action_taken: Action prendite + appeal: Facer appello + appeal_approved: Iste admonition ha essite annullate in appello e non es plus valide + appeal_rejected: Le appello ha essite rejectate + appeal_submitted_at: Appello submittite + appealed_msg: Tu appello ha essite submittite. Si es approbate, tu recipera notification. + appeals: + submit: Submitter appello + approve_appeal: Approbar apello + associated_report: Signalation associate + created_at: Del data + description_html: Istes es le actiones prendite contra tu conto e le advertimentos que te ha essite inviate per le personal de %{instance}. + recipient: Adressate a + reject_appeal: Rejectar appello + status: Message №%{id} + status_removed: Le message ha ja essite removite del systema + title: "%{action} del %{date}" + title_actions: + delete_statuses: Elimination de messages + disable: Gelamento del conto + mark_statuses_as_sensitive: Marcation de messages como sensibile + none: Advertimento + sensitive: Marcation del conto como sensibile + silence: Limitation del conto + suspend: Suspension del conto + your_appeal_approved: Tu appello ha essite approbate + your_appeal_pending: Tu ha submittite un appello + your_appeal_rejected: Tu appello ha essite rejectate + domain_validator: + invalid_domain: non es un nomine de dominio valide edit_profile: + basic_information: Information basic + hint_html: "Personalisa lo que le personas vide sur tu profilo public e presso tu messages. Il es plus probabile que altere personas te seque e interage con te quando tu ha un profilo compilate e un photo de profilo." other: Alteres + errors: + '400': Le requesta que tu inviava era non valide o mal formate. + '403': Tu non ha le permisso pro acceder a iste pagina. + '404': Le pagina que tu cerca non es ci. + '406': Iste pagina non es disponibile in le formato requirite. + '410': Le pagina que tu cercava non plus existe ci. + '422': + content: Le verification de securitate ha fallite. Bloca tu le cookies? + title: Falleva le verification de securitate + '429': Troppe requestas + '500': + content: Nos lo regretta, ma alco errate eveniva sur nostre extremo. + title: Iste pagina non es correcte + '503': Le pagina non poteva esser servite per un panna de servitor temporari. + noscript_html: A usar le application web Mastodon, activa JavaScript. In alternativa, tenta un del apps native de Mastodon pro tu platteforma. existing_username_validator: + not_found: impossibile trovar un usator local con ille nomine de usator not_found_multiple: non poteva trovar %{usernames} exports: archive_takeout: date: Data download: Discargar tu archivo + hint_html: Tu pote requirer un archivo de tu messages e medios cargate. Le datos exportate sera in le formato ActivityPub, legibile per ulle software conforme. + in_progress: Compilante tu archivo... + request: Pete tu archivo size: Dimension blocks: Tu ha blocate bookmarks: Marcapaginas csv: CSV + domain_blocks: Blocadas de dominio + lists: Listas mutes: Tu ha silentiate storage: Immagazinage de medios featured_tags: add_new: Adder nove + errors: + limit: Tu ha jam consiliate le maxime numero de hashtags + hint_html: "Consilia tu plus importante hashtags sur tu profilo. Un grande instrumento pro tener tracia de tu labores creative e projectos de longe-tempore, le hashtags consiliate es monstrate prominentemente sur tu profilo e permitte accesso rapide a tu proprie messages." filters: contexts: account: Profilos @@ -359,28 +1253,122 @@ ia: add_keyword: Adder parola clave keywords: Parolas clave statuses: Messages individual + statuses_hint_html: Iste filtro se applica a seliger messages singule sin reguardo si illes concorda le parolas clave infra. Revide o remove le messages ab le filtro. title: Modificar filtro + errors: + deprecated_api_multiple_keywords: Iste parametros non pote esser cambiate ab iste application perque illos se applica a plus que un sol parola clave del filtro. Usa un application plus recente o le interfacie web. + invalid_context: Nulle o non valide contexto supplite index: + contexts: Filtros in %{contexts} delete: Deler + empty: Tu non ha filtros. + expires_in: Expira in %{distance} + expires_on: Expira le %{date} + keywords: + one: "%{count} parola clave" + other: "%{count} parolas clave" + statuses: + one: "%{count} message" + other: "%{count} messages" + statuses_long: + one: "%{count} singule message celate" + other: "%{count} singule messages celate" + title: Filtros + new: + save: Salveguardar nove filtro + title: Adder nove filtro + statuses: + back_to_filter: Retro al filtro + batch: + remove: Remover ab filtro + index: + hint: Iste filtro se applica pro seliger messages singule sin reguardo de altere criterios. Tu pote adder altere messages a iste filtro ab le interfacie web. + title: Messages filtrate generic: all: Toto + all_items_on_page_selected_html: + one: "%{count} elemento sur iste pagina es seligite." + other: Tote le %{count} elementos sur iste pagina es seligite. + all_matching_items_selected_html: + one: "%{count} elemento concordante que tu cerca es seligite." + other: Tote le %{count} elementos concordante que tu cerca es seligite. cancel: Cancellar changes_saved_msg: Cambios salveguardate con successo! confirm: Confirmar copy: Copiar delete: Deler + deselect: Deseliger toto + none: Nemo order_by: Ordinar per save_changes: Salvar le cambios + select_all_matching_items: + one: Selige %{count} elemento concordante tu recerca. + other: Selige %{count} elementos concordante tu recerca. today: hodie + validation_errors: + one: Alco non es multo bon ancora! Controla le error infra + other: Alco non es multo bon ancora! Controla %{count} errores infra imports: errors: empty: File CSV vacue + incompatible_type: Incompatibile con le typo de importation seligite + invalid_csv_file: 'File CSV non valide. Error: %{error}' + over_rows_processing_limit: contine plus que %{count} rangos too_large: Le file es troppo longe failures: Fallimentos + imported: Importate + mismatched_types_warning: Il appare que tu pote haber seligite le typo errate pro iste importation, controla duo vices. + modes: + merge: Funder + merge_long: Mantene le registrationes existente e adde illos nove + overwrite: Superscriber + overwrite_long: Reimplaciar registros actual con le noves + overwrite_preambles: + blocking_html: Tu es sur le puncto de reimplaciar tu lista de blocadas per usque a %{total_items} contos proveniente de %{filename}. + bookmarks_html: Tu va reimplaciar tu lista de blocadas per usque a %{total_items} contos proveniente de %{filename}. + domain_blocking_html: Tu es sur le puncto de reimplaciar tu lista de blocadas de dominio per usque a %{total_items} dominios proveniente de %{filename}. + following_html: Tu va sequer usque %{total_items} contos de %{filename} e cessar de sequer ulle altere. + lists_html: Tu va reimplaciar tu lista con contentos de %{filename}. Usque %{total_items} contos sera addite a nove listas. + muting_html: Tu va reimplaciar tu lista de contos silentiate con usque %{total_items} contos ab %{filename}. + preambles: + blocking_html: Tu es sur le puncto de blocar usque a %{total_items} contos a partir de %{filename}. + bookmarks_html: Tu va adder usque %{total_items} messages de %{filename} a tu marcapaginas. + domain_blocking_html: Tu es sur le puncto de blocar usque a %{total_items} dominios a partir de %{filename}. + following_html: Tu va blocar usque a %{total_items} dominios ab %{filename}. + lists_html: Tu va adder usque %{total_items} contos ab %{filename} a tu lista. Nove listas sera create si il non ha lista a adder. + muting_html: Tu va silentiar usque %{total_items} contos ab %{filename}. + preface: Tu pote importar datos que tu ha exportate de un altere servitor, como un lista de personas que tu seque o bloca. + recent_imports: Importationes recente + states: + finished: Terminate + in_progress: In curso + scheduled: Planificate + unconfirmed: Non confirmate status: Stato + success: Tu datos era cargate con successo e sera processate in tempore debite + time_started: Initiate le + titles: + blocking: Importation de contos blocate + bookmarks: Importation de marcapaginas + domain_blocking: Importation de dominios blocate + following: Importation de contos sequite + lists: Importation de listas + muting: Importation de contos silentiate + type: Typo de importation + type_groups: + constructive: Sequites e marcapaginas + destructive: Blocadas e silentiamentos types: + blocking: Lista de blocadas + bookmarks: Marcapaginas + domain_blocking: Lista de dominios blocate + following: Sequente lista lists: Listas + muting: Lista del silentiates + upload: Incargar invites: + delete: Disactivar + expired: Expirate expires_in: '1800': 30 minutas '21600': 6 horas @@ -389,22 +1377,374 @@ ia: '604800': 1 septimana '86400': 1 die expires_in_prompt: Nunquam + generate: Generar ligamine de invitation + invalid: Iste invitation non es valide + invited_by: 'Tu ha essite invitate per:' + max_uses: + one: un uso + other: "%{count} usos" + max_uses_prompt: Nulle limite + prompt: Genera e comparti ligamines con alteres pro conceder accesso a iste servitor + table: + expires_at: Expira + uses: Usos + title: Invitar personas + lists: + errors: + limit: Tu ha attingite le maxime numero de listas login_activities: authentication_methods: + otp: app pro authentication a duo factores password: contrasigno + sign_in_token: codice de securitate de e-mail + webauthn: claves de securitate + description_html: Si tu vide activitate que tu non recognosce, considera de cambiar tu contrasigno e activar le authentication a duo factores. + empty: Nulle chronologia de authentication disponibile + failed_sign_in_html: Tentativa de authentication fallite con %{method} ab %{ip} (%{browser}) + successful_sign_in_html: Apertura de session con successo con %{method} ab %{ip} (%{browser}) + title: Chronologia de authentication + mail_subscriptions: + unsubscribe: + action: Si, desubscriber + complete: Desubscribite + confirmation_html: Es tu secur de voler cancellar le subscription al %{type} de Mastodon sur %{domain} pro tu adresse de e-mail %{email}? Tu pote sempre resubscriber te a partir del parametros de notification in e-mail. + emails: + notification_emails: + favourite: notificationes de favorites in e-mail + follow: notificationes de sequimento in e-mail + follow_request: requestas de sequimento in e-mail + mention: notificationes de mentiones in e-mail + reblog: notificationes de impulsos in e-mail + resubscribe_html: Si tu ha cancellate le subscription in error, tu pote resubscriber te a partir del parametros de notification in e-mail. + success_html: Tu non recipera plus %{type} pro Mastodon sur %{domain} a tu adresse de e-mail %{email}. + title: Desubcriber + media_attachments: + validations: + images_and_video: Impossibile annexar un video a un message que jam contine imagines + not_ready: Impossibile annexar un video a un message que jam contine imagines. Retenta post un momento! + too_many: Impossibile annexar plus que 4 files migrations: + acct: Movite a + cancel: Cancellar redirection + cancel_explanation: Cancellar le redirection reactivara tu conto actual, ma non reportara sequaces que ha essite movite in ille conto. + cancelled_msg: Redirection cancellate con successo. errors: + already_moved: is the same account you have already moved to + missing_also_known_as: non es un alias de iste conto + move_to_self: non pote esser le conto actual not_found: non poterea esser trovate - preferences: - public_timelines: Chronologias public - statuses: + on_cooldown: Tu es in pausa + followers_count: Sequaces a tempore de mover + incoming_migrations: Movente ab un conto differente + incoming_migrations_html: Pro mover ab un altere conto a isto, primo tu debe crear un alias de conto. + moved_msg: Tu conto ora es redirigite a %{acct} e tu sequaces es movite super. + not_redirecting: Tu conto actualmente non es redirigite a ulle altere conto. + on_cooldown: Tu recentemente ha migrate tu conto. Iste function de novo sera disponibile in %{count} dies. + past_migrations: Migrationes passate + proceed_with_move: Mover sequaces + redirected_msg: Tu conto es ora redirigite a %{acct}. + redirecting_to: Tu conto es redirigite a %{acct}. + set_redirect: Predefinir redirection + warning: + backreference_required: Le nove conto debe primo esser configurate pro referer se a isto + before: 'Ante de continuar, lege iste notas accuratemente:' + cooldown: Post le movimento il ha un periodo de pausa durante le qual tu non potera mover te ancora + disabled_account: Tu conto actual non sera plenmente usabile postea. Comocunque, tu habera accesso a exportation de datos e re-activation. + followers: Iste action movera tote le sequaces ab le conto actual al nove conto + only_redirect_html: In alternativa, tu pote solo superponer un redirection sur tu profilo. + other_data: Nulle altere datos sera movite automaticamente + redirect: Le profilo de tu conto actual sera actualisate con un aviso de redirection e sera excludite de recercas + moderation: + title: Moderation + move_handler: + carry_blocks_over_text: Iste usator ha cambiate de conto desde %{acct}, que tu habeva blocate. + carry_mutes_over_text: Iste usator moveva ab %{acct}, que tu habeva silentiate. + copy_account_note_text: 'Iste usator moveva ab %{acct}, ci era tu previe notas re ille:' + navigation: + toggle_menu: Mutar menu + notification_mailer: + admin: + report: + subject: "%{name} inviava un reporto" + sign_up: + subject: "%{name} se ha inscribite" + favourite: + body: 'Tu message era favorite per %{name}:' + subject: "%{name} favoriva tu message" + title: Nove preferito + follow: + body: "%{name} ora te seque!" + subject: "%{name} ora te seque" + title: Nove sequitor + follow_request: + action: Gere requestas de sequer + body: "%{name} ha demandate de sequer te" + subject: 'Sequace pendente: %{name}' + title: Nove requesta de sequimento + mention: + action: Responder + body: 'Tu era mentionate per %{name} in:' + subject: Tu ha essite mentionate per %{name} + title: Nove mention poll: + subject: Un inquesta de %{name} ha finite + reblog: + body: 'Tu message ha essite impulsate per %{name}:' + subject: "%{name} ha impulsate tu message" + title: Nove impulso + status: + subject: "%{name} justo ha publicate" + update: + subject: "%{name} ha modificate un message" + notifications: + administration_emails: Avisos de email per administrator + email_events: Eventos pro avisos de email + email_events_hint: 'Selige eventos pro que tu vole reciper avisos:' + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T + otp_authentication: + code_hint: Insere le codice generate per tu app de authentication pro confirmar + description_html: Si tu activa le authentication a duo factores per un app de authentication, le authentication requirera que tu es in possession de tu telephono, que generara testimonios pro facer te entrar. + enable: Activar + instructions_html: "Scande iste codice QR in Google Authenticator o un simile app TOTP sur tu telephono. Desde ora in avante, ille app generara testimonios que tu debera inserer quando tu te authenticara." + manual_instructions: 'Si tu non pote scander le codice QR e besonia de inserer lo manualmente, ecce le texto-simple secrete:' + setup: Configurar + wrong_code: Le codice inserite non era valide! Es tempore de servitor e tempore de apparato correcte? + pagination: + newer: Plus recente + next: Sequente + older: Plus vetere + prev: Previe + truncate: "…" + polls: + errors: + already_voted: Tu jam ha votate in iste sondage + duplicate_options: contine elementos duplicate + duration_too_long: il es troppo lontan in le futuro + duration_too_short: il es troppo tosto + expired: Le sondage ha jam finite + invalid_choice: Le option de voto eligite non existe + over_character_limit: non pote esser plus longe que %{max} characteres cata un + self_vote: Tu non pote vota in tu proprie sondages + too_few_options: debe haber plus que un elemento + too_many_options: non pote continer plus que %{max} elementos + preferences: + other: Altere + posting_defaults: Publicationes predefinite + public_timelines: Chronologias public + privacy: + hint_html: "Personalisa como tu vole que tu profilo e tu messages a es trovate. Un varietate de functiones in Mastodon pote adjutar te attinger un plus large auditorio si activate. Prende un momento pro revider iste parametros pro assecurar te que illos se adapta a tu caso de uso." + privacy: Confidentialitate + privacy_hint_html: Controla quanto tu vole divulgar pro le beneficio de alteres. Le gente discoperi profilos e applicationes interessante percurrente le profilos sequite per altere personas e vidente a partir de qual applicationes illos publica lor messages, ma tu pote preferer de mantener tal information private. + reach: Portata + reach_hint_html: Controla si tu vole esser discoperite e sequite per nove personas. Vole tu que tu messages appare sur le schermo Explorar? Vole tu que altere personas te vide in lor recommendationes de sequimento? Vole tu acceptar automaticamente tote le nove sequitores o prefere tu haber le controlo granular super cata un? + search: Cercar + search_hint_html: Controla como tu vole esser trovate. Vole tu que le gente te trova per medio del contento de tu messages public? Vole tu que personas foras de Mastodon trova tu profilo quando illes cerca in le web? Nota ben que non es possibile garantir le exclusion total de tu information public del motores de recerca. + title: Confidentialitate e portata + privacy_policy: + title: Politica de confidentialitate + reactions: + errors: + limit_reached: Limite de reactiones differente attingite + unrecognized_emoji: non es un emoticone recognoscite + redirects: + prompt: Si tu te fide de iste ligamine, clicca lo pro continuar. + title: Tu va lassar %{instance}. + relationships: + activity: Activitate del conto + confirm_follow_selected_followers: Desira tu vermente remover le sequaces seligite? + confirm_remove_selected_followers: Desira tu vermente remover le sequaces seligite? + confirm_remove_selected_follows: Desira tu vermente remover le sequaces seligite? + dormant: Dormiente + follow_failure: Impossibile sequer alcun del contos seligite. + follow_selected_followers: Sequer le sequaces seligite + followers: Sequaces + following: Sequente + invited: Invitate + last_active: Ultimo active + most_recent: Plus recente + moved: Movite + mutual: Mutue + primary: Primari + relationship: Relation + remove_selected_domains: Remover tote le sequaces ab le dominios seligite + remove_selected_followers: Remover le sequaces seligite + remove_selected_follows: Non plus sequer le usatores seligite + status: Stato del conto + remote_follow: + missing_resource: Impossibile trovar le requirite re-adresse URL pro tu conto + reports: + errors: + invalid_rules: non referentia regulas valide + rss: + content_warning: 'Advertimento de contento:' + descriptions: + account: Messages public de @%{acct} + tag: 'Messages public plachettate #%{hashtag}' + scheduled_statuses: + over_daily_limit: Tu ha excedite le limite de %{limit} messages programmate pro hodie + over_total_limit: Tu ha excedite le limite de %{limit} messages programmate + too_soon: Le data programmate debe esser in le futuro + self_destruct: + lead_html: Infortunatemente, %{domain} va clauder permanentemente. Si tu habeva un conto illac, tu non potera continuar a usar lo, ma tu pote ancora peter un salveguarda de tu datos. + title: Iste servitor va clauder + sessions: + activity: Ultime activitate + browser: Navigator + browsers: + alipay: Alipay + blackberry: BlackBerry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + generic: Navigator incognite + huawei_browser: Huawei Browser + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Navigator de Nokia S40 Ovi + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UC Browser + unknown_browser: Navigator Incognite + weibo: Weibo + current_session: Session actual + date: Data + description: "%{browser} sur %{platform}" + explanation: Il ha navigatores del web actualmente connexe a tu conto Mastodon. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: BlackBerry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + kai_os: KaiOS + linux: Linux + mac: macOS + unknown_platform: Platteforma incognite + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Revocar + revoke_success: Session revocate con successo + title: Sessiones + view_authentication_history: Vider chronologia de authentication de tu conto + settings: + account: Conto + account_settings: Parametros de conto + aliases: Aliases de conto + appearance: Apparentia + authorized_apps: Apps autorisate + back: Tornar a Mastodon + delete: Deletion de conto + development: Disveloppamento + edit_profile: Modificar profilo + export: Exportation de datos + featured_tags: Hashtags eminente + import: Importar + import_and_export: Importar e exportar + migrate: Migration de conto + notifications: Notificationes de e-mail + preferences: Preferentias + profile: Profilo public + relationships: Sequites e sequitores + severed_relationships: Relationes rupte + statuses_cleanup: Deletion de message automatic + strikes: Admonitiones de moderation + two_factor_authentication: Authentication a duo factores + webauthn_authentication: Claves de securitate + severed_relationships: + download: Discargar (%{count}) + event_type: + account_suspension: Suspension del conto (%{target_name}) + domain_block: Suspension del servitor (%{target_name}) + user_domain_block: Tu ha blocate %{target_name} + lost_followers: Sequitores perdite + lost_follows: Sequites perdite + preamble: Tu pote perder sequites e sequitores quando tu bloca un dominio o quando tu moderatores decide suspender un servitor remote. Quando isto occurre, tu potera discargar listas de relationes rumpite, a inspectar e eventualmente importar in un altere servitor. + purged: Le information re iste servitor ha essite purgate per le administratores de tu servitor. + type: Evento + statuses: + attached: + audio: + one: "%{count} audio" + other: "%{count} audio" + description: 'Attachate: %{attached}' + image: + one: "%{count} imagine" + other: "%{count} imagines" + video: + one: "%{count} video" + other: "%{count} videos" + boosted_from_html: Impulsate desde %{acct_link} + content_warning: 'Advertimento de contento: %{warning}' + default_language: Mesme como lingua de interfacie + disallowed_hashtags: + one: 'contineva un hashtag non autorisate: %{tags}' + other: 'contineva le hashtags non autorisate: %{tags}' + edited_at_html: Modificate le %{date} + errors: + in_reply_not_found: Le message a que tu tenta responder non pare exister. + open_in_web: Aperir in le web + over_character_limit: limite de characteres de %{max} excedite + pin_errors: + direct: Messages que es solo visibile a usatores mentionate non pote esser appunctate + limit: Tu ha jam appunctate le maxime numero de messages + ownership: Le message de alcuno altere non pote esser appunctate + reblog: Un impulso non pote esser affixate + poll: + total_people: + one: "%{count} persona" + other: "%{count} personas" + total_votes: + one: "%{count} voto" + other: "%{count} votos" vote: Votar show_more: Monstrar plus + show_thread: Monstrar argumento + title: '%{name}: "%{quote}"' visibilities: + direct: Directe + private: Solo-sequaces private_long: Solmente monstrar a sequitores public: Public + public_long: Omnes pote vider + unlisted: Non listate + unlisted_long: Omnes pote vider, ma non es listate in le chronologias public statuses_cleanup: + enabled: Deler automaticamente le messages ancian + enabled_hint: Dele automaticamente tu messages un vice que illos attinge un limine de etate specificate, salvo que illes concorda un del exceptiones infra + exceptions: Exceptiones + explanation: Pois que deler messages es un operation costose, isto es facite lentemente in le tempore quando le servitor non es alteremente occupate. Pro iste ration, tu messages pote esser delite un poco post que illos attinge le limine de etate. + ignore_favs: Ignorar favoritos + ignore_reblogs: Ignorar impulsos + interaction_exceptions: Exceptiones basate super interactiones + interaction_exceptions_explanation: Nota que il non ha garantia que le messages essera delite si illos va sub le limine de favorites o impulsos post haber lo superate un vice. + keep_direct: Mantener le messages directe + keep_direct_hint: Non dele alcuno de tu messages directe + keep_media: Mantener messages con annexos de medios + keep_media_hint: Non dele alcuno de tu messages que ha annexos de medios + keep_pinned: Mantener messages appunctate + keep_pinned_hint: Non dele alcuno de tu messages appunctate + keep_polls: Mantener sondages + keep_polls_hint: Non dele ulle de tu sondages + keep_self_bookmark: Mantener messages que tu marcava con marcapaginas + keep_self_bookmark_hint: Non dele tu proprie messages si tu los ha marcate con marcapaginas + keep_self_fav: Mantene messages que tu favoriva + keep_self_fav_hint: Non dele tu proprie messages si tu los ha favorite min_age: '1209600': 2 septimanas '15778476': 6 menses @@ -414,29 +1754,179 @@ ia: '604800': 1 septimana '63113904': 2 annos '7889238': 3 menses + min_age_label: Limine de etate + min_favs: Mantener messages favorite al minus + min_favs_hint: Non deler alcuno de tu messages que ha recipite al minus iste numero de favoritos. Lassar blanc pro deler messages sin reguardo de lor numero de favoritos + min_reblogs: Mantener messages impulsate al minus + min_reblogs_hint: Non dele alcun de tu messages que ha essite impulsate al minus iste numero de vices. Lassar vacue pro deler messages independentemente de lor numero de impulsos + stream_entries: + sensitive_content: Contento sensibile + strikes: + errors: + too_late: Es troppo tarde pro facer appello contra iste admonition + tags: + does_not_match_previous_name: non concorda le nomine previe themes: + contrast: Mastodon (Alte contrasto) default: Mastodon (Obscur) mastodon-light: Mastodon (Clar) system: Automatic (usar thema del systema) + time: + formats: + default: "%d %b %Y, %H:%M" + month: "%b %Y" + time: "%H:%M" + with_time_zone: "%b %d, %Y, %H:%M %Z" + translation: + errors: + quota_exceeded: Le quota de utilisation del servitor pro le servicio de traduction ha essite excedite. + too_many_requests: Il ha habite troppe requestas al servicio de traduction recentemente. two_factor_authentication: add: Adder disable: Disactivar 2FA + disabled_success: Authentication a duo factores disactivate con successo edit: Modificar + enabled: Le authentication a duo factores es activate + enabled_success: Authentication a duo factores activate con successo + generate_recovery_codes: Generar codices de recuperation + lost_recovery_codes: Le codices de recuperation te permitte de reganiar accesso a tu conto si tu perde tu telephono. Si tu ha perdite tu codices de recuperation, tu pote regenerar los ci. Tu vetere codices de recuperation sera invalidate. + methods: Methodos a duo factores + otp: App de authenticator + recovery_codes: Salveguardar codices de recuperation + recovery_codes_regenerated: Codices de recuperation regenerate con successo + recovery_instructions_html: Si tu perde le accesso a tu telephono, tu pote usar un del codices de recuperation hic infra pro reganiar le accesso a tu conto. Mantene le codices de recuperation secur. Per exemplo, tu pote imprimer los e guardar los con altere documentos importante. + webauthn: Claves de securitate user_mailer: appeal_approved: action: Parametros de conto + explanation: Le appello contra le admonition contra tu conto del %{strike_date}, que tu ha submittite le %{appeal_date}, ha essite approbate. Tu conto ha de novo un bon reputation. + subject: Tu appello ab %{date} ha essite approbate + subtitle: Tu conto es ancora un vice in regula. + title: Appello approbate + appeal_rejected: + explanation: Le appello contra le admonition contra tu conto del %{strike_date}, que tu ha submittite le %{appeal_date}, ha essite rejectate. + subject: Tu appello ab %{date} ha essite rejectate + subtitle: Tu appello ha essite rejectate. + title: Appello rejectate + backup_ready: + explanation: Tu ha requestate un copia de securitate complete de tu conto de Mastodon. + extra: Isto es preste pro discargar! + subject: Tu archivo es preste pro discargar + title: Discargar archivo + failed_2fa: + details: 'Hic es le detalios del tentativa de initio de session:' + explanation: Alcuno ha tentate aperir session a tu conto ma ha fornite un secunde factor de authentication non valide. + further_actions_html: Si non se tractava de te, nos recommenda %{action} immediatemente perque illo pote esser compromittite. + subject: Fallimento del authentication de duo factores + title: Falleva le authentication de duo factores + suspicious_sign_in: + change_password: cambiar tu contrasigno + details: 'Hic es le detalios del initio de session:' + explanation: Nos ha detegite un initio de session a tu conto ab un nove adresse IP. + further_actions_html: Si non se tractava de te, nos recommenda %{action} immediatemente e activar le authentication bifactorial pro mantener tu conto secur. + subject: Alcuno ha accedite a tu conto desde un nove adresse IP + title: Un nove initio de session + warning: + appeal: Submitter un appello + appeal_description: Si tu crede que se tracta de un error, tu pote presentar un appello al personal de %{instance}. + categories: + spam: Spam + violation: Le contento viola le sequente regulas del communitate + explanation: + delete_statuses: Alcunes de tu messages ha essite judicate contrari a un o plus directivas communitari e ha dunque essite removite per le moderatores de %{instance}. + disable: Tu non pote plus usar tu conto, ma tu profilo e altere datos remane intacte. Tu pote requestar un copia de reserva de tu datos, cambiar le parametros del conto o deler le conto. + mark_statuses_as_sensitive: Alcunes de tu messages ha essite marcate como sensibile per le moderatores de %{instance}. Isto vole dicer que le gente debe toccar le objectos multimedial in le messages ante que un previsualisation appare. Tu pote marcar objectos multimedial como sensibile tu mesme quando tu publica messages in futuro. + sensitive: A partir de iste momento, tote le files multimedial que tu incarga essera marcate como sensibile e le gente debera cliccar sur un advertimento ante de poter vider los. + silence: Tu pote ancora usar tu conto ma solmente le personas qui ja te seque videra tu messages sur iste servitor, e tu pote esser excludite de varie functiones de discoperta. Nonobstante, altere personas pote ancora sequer te manualmente. + suspend: Tu non pote plus usar tu conto, e tu profilo e altere datos non es plus accessibile. Tu pote ancora aperir session pro requestar un copia de reserva de tu datos usque lor elimination in circa 30 dies. Nos retenera certe datos de base pro impedir que tu evade le suspension. + reason: 'Ration:' + statuses: 'Message citate:' + subject: + delete_statuses: Tu messages sur %{acct} esseva removite + disable: Tu conto %{acct} ha essite gelate + mark_statuses_as_sensitive: Tu messages sur %{acct} ha essite marcate como sensibile + none: Advertimento pro %{acct} + sensitive: Tu messages sur %{acct} essera marcate como sensibile a partir de ora + silence: Tu conto %{acct} ha essite limitate + suspend: Tu conto %{acct} ha essite suspendite + title: + delete_statuses: Messages removite + disable: Conto gelate + mark_statuses_as_sensitive: Messages marcate como sensibile + none: Advertimento + sensitive: Conto marcate como sensibile + silence: Conto limitate + suspend: Conto suspendite welcome: apps_android_action: Obtene lo sur Google Play apps_ios_action: Discargar sur le App Store apps_step: Discarga nostre applicationes official. apps_title: Applicationes de Mastodon + checklist_subtitle: 'Comencia tu aventura sur le web social:' + checklist_title: Prime passos edit_profile_action: Personalisar + edit_profile_step: Impulsa tu interactiones con un profilo comprehensive. edit_profile_title: Personalisar tu profilo + explanation: Ecce alcun consilios pro initiar feature_action: Apprender plus + feature_audience: Mastodon te presenta le possibilitate unic de gerer tu audientia sin intermediarios. Mastodon, installate sur tu proprie infrastructura, te permitte sequer, e esser sequite per, personas sur qualcunque altere servitor Mastodon in linea, e necuno lo controla salvo tu. + feature_audience_title: Crea tu auditorio in fiducia + feature_control: Tu sape melio lo que tu vole vider sur tu fluxo de initio. Nulle algorithmos o annuncios dissipa tu tempore. Seque quicinque sur qualcunque servitor Mastodon desde un sol conto, recipe lor messages in ordine chronologic, e face te un angulo del internet ubi tu te senti a casa. + feature_control_title: Mantene le controlo de tu proprie chronologia + feature_creativity: Mastodon supporta messages con audio, video e imagines, descriptiones de accessibilitate, sondages, advertimentos de contento, avatares con animation, emojis personalisate, controlo de retalio de miniaturas, e plus, pro adjutar te a exprimer te in linea. Que tu publica tu arte, tu musica o tu podcast, Mastodon existe pro te. + feature_creativity_title: Creativitate sin parallel + feature_moderation: Mastodon remitte le controlo in tu manos. Cata servitor crea su proprie regulas e directivas, applicate localmente e non de maniera vertical como le medios social corporative, rendente lo flexibile in responder al necessitates de differente gruppos de personas. Adhere a un servitor con regulas que te place, o alberga le tue. + feature_moderation_title: Moderation como deberea esser + follow_action: Sequer + follow_step: Sequer personas interessante es le ration de esser de Mastodon. + follow_title: Personalisa tu fluxo de initio + follows_subtitle: Seque contos popular + follows_title: Qui sequer + follows_view_more: Vider plus de personas a sequer + hashtags_recent_count: + one: "%{people} persona in le passate duo dies" + other: "%{people} personas in le passate duo diea" + hashtags_subtitle: Explora le tendentias del passate 2 dies + hashtags_title: Hashtags in tendentia + hashtags_view_more: Vider plus de hashtags in tendentia + post_action: Scriber + post_step: Saluta le mundo con texto, photos, videos o sondages. + post_title: Face tu prime message + share_action: Compartir + share_step: Face saper a tu amicos como trovar te sur Mastodon. share_title: Compartir tu profilo de Mastodon + sign_in_action: Initiar session subject: Benvenite in Mastodon + title: Benvenite a bordo, %{name}! + users: + follow_limit_reached: Tu non pote sequer plus de %{limit} personas + go_to_sso_account_settings: Vader al parametros de conto de tu fornitor de identitate + invalid_otp_token: Codice de duo factores non valide + otp_lost_help_html: Si tu ha perdite le accesso a ambes, tu pote contactar %{email} + rate_limited: Troppo de tentativas de authentication. Per favor reessaya plus tarde. + seamless_external_login: Tu ha aperite session per medio de un servicio externe. Le parametros de contrasigno e de e-mail es dunque indisponibile. + signed_in_as: 'Session aperite como:' verification: + extra_instructions_html: Consilio: Le ligamine sur tu sito web pote esser invisibile. Le parte importante es rel="me" que impedi le usurpation de identitate sur sitos web con contento generate per usatores. Tu pote mesmo usar un etiquetta link in le capite del pagina in vice de a, ma le codice HTML debe esser accessibile sin executar JavaScript. + here_is_how: Ecce como + hint_html: "Omnes pote verificar lor identitate sur Mastodon. Isto es basate sur standards web aperte e es gratuite, ora e pro sempre. Tote lo que es necessari es un sito web personal que le gente recognosce como le tue. Quando tu liga a iste sito web desde tu profilo, le systema verificara que le sito web liga retro a tu profilo e monstrara un indicator visual de iste facto." + instructions_html: Copia e colla le codice hic infra in le HTML de tu sito web. Alora adde le adresse de tu sito web in un del campos supplementari sur tu profilo desde le scheda “Modificar profilo” e salva le cambiamentos. + verification: Verification verified_links: Tu ligamines verificate webauthn_credentials: add: Adder un nove clave de securitate + create: + error: Il habeva un problema in adder tu clave de securitate. Tenta novemente. + success: Tu clave de securitate ha essite addite con successo. delete: Deler + delete_confirmation: Es tu secur que tu vole deler iste clave de securitate? + description_html: Si tu activa le authentication per clave de securitate, le apertura de session requirera que tu usa un de tu claves de securitate. + destroy: + error: Il habeva un problema in deler tu clave de securitate. Tenta novemente. + success: Tu clave de securitate ha essite delite con successo. + invalid_credential: Clave de securitate non valide + nickname_hint: Insere le pseudonymo de tu nove clave de securitate + not_enabled: Tu ancora non ha activate WebAuthn + not_supported: Iste navigator non supporta claves de securitate + otp_required: Pro usar le claves de securitate activa prime le authentication de duo factores. + registered_on: Registrate le %{date} diff --git a/config/locales/id.yml b/config/locales/id.yml index bee282fa8..aae790f48 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -831,7 +831,6 @@ id: delete: Hapus edit_preset: Sunting preset peringatan empty: Anda belum mendefinisikan peringatan apapun. - title: Kelola preset peringatan webhooks: add_new: Tambah titik akhir delete: Hapus diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 46e55b9e1..432e7d031 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -751,6 +751,7 @@ ie: desc_html: To ci usa extern scrites de hCaptcha, quel posse esser ínquietant pro rasones de securitá e privatie. In plu, it posse far li processu de registration mult plu desfacil (particularimen por tis con deshabilitás). Pro ti rasones, ples considerar alternativ mesuras, tales quam registration per aprobation o invitation. title: Exige que nov usatores solue un CAPTCHA por confirmar lor conto content_retention: + danger_zone: Zone de dangere preamble: Decider qualmen usator-generat contenete es inmagasinat in Mastodon. title: Retention de contenete default_noindex: @@ -949,7 +950,6 @@ ie: delete: Deleter edit_preset: Modificar prefiguration de avise empty: Vu ancor ha definit null prefigurationes de avise. - title: Modificar prefigurationes de avise webhooks: add_new: Adjunter punctu terminal delete: Deleter @@ -1659,6 +1659,7 @@ ie: preferences: Preferenties profile: Public profil relationships: Sequetes e sequitores + severed_relationships: Detranchat relationes statuses_cleanup: Automatisat deletion de postas strikes: Admonimentes moderatori two_factor_authentication: 2-factor autentication @@ -1667,9 +1668,12 @@ ie: download: Descargar (%{count}) event_type: account_suspension: Suspension del conto (%{target_name}) + domain_block: Suspension del servitor (%{target_name}) user_domain_block: Tu bloccat %{target_name} lost_followers: Perdit sequitores + lost_follows: Perdit sequetes preamble: Tu posse perdir tis queles tu seque e tui sequitores quande tu blocca un domonia o quande tui moderatores decide suspender un lontan servitor. Tande, tu va posser descargar listes de dejuntet relationes, a inspecter e possibilmen importar sur un altri servitor. + purged: Information pri ti-ci servitor ha esset purgat per li administratores de tui servitor. type: Eveniment statuses: attached: diff --git a/config/locales/io.yml b/config/locales/io.yml index ed0d0d634..bccdcb3cc 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -928,7 +928,6 @@ io: delete: Efacez edit_preset: Modifikez avertfixito empty: Vu ne fixis irga avertfixito til nun. - title: Jerez avertfixiti webhooks: add_new: Insertez finpunto delete: Efacez diff --git a/config/locales/is.yml b/config/locales/is.yml index ba1785d9e..75950e572 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -285,6 +285,7 @@ is: update_custom_emoji_html: "%{name} uppfærði tjáningartáknið %{target}" update_domain_block_html: "%{name} uppfærði útilokun lénsins %{target}" update_ip_block_html: "%{name} breytti reglu fyrir IP-vistfangið %{target}" + update_report_html: "%{name} uppfærði kæru %{target}" update_status_html: "%{name} uppfærði færslu frá %{target}" update_user_role_html: "%{name} breytti hlutverki %{target}" deleted_account: eyddur notandaaðgangur @@ -753,6 +754,7 @@ is: Aukinheldur gæti þetta gert nýskráningarferlið óaðgengilegra sumum (sérstaklega fyrir fatlaða). Þess vegna er rétt að skoða aðra valmöguleika svo sem nýskráningar háðar samþykki eða boði. title: Nýir notendur munu þurfa að standast Turing skynpróf til að staðfesta notendaaðganginn content_retention: + danger_zone: Hættusvæði preamble: Stýrðu hvernig efni frá notendum sé geymt í Mastodon. title: Geymsla efnis default_noindex: @@ -951,7 +953,7 @@ is: delete: Eyða edit_preset: Breyta forstilltri aðvörun empty: Þú hefur ekki enn skilgreint neinar aðvaranaforstillingar. - title: Sýsla með forstilltar aðvaranir + title: Forstilltar aðvaranir webhooks: add_new: Bæta við endapunkti delete: Eyða diff --git a/config/locales/it.yml b/config/locales/it.yml index f12735cfb..c3389f59c 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -285,6 +285,7 @@ it: update_custom_emoji_html: "%{name} ha aggiornato emoji %{target}" update_domain_block_html: "%{name} ha aggiornato il blocco dominio per %{target}" update_ip_block_html: "%{name} ha cambiato la regola per l'IP %{target}" + update_report_html: "%{name} ha aggiornato la segnalazione %{target}" update_status_html: "%{name} ha aggiornato lo status di %{target}" update_user_role_html: "%{name} ha modificato il ruolo %{target}" deleted_account: account eliminato @@ -751,6 +752,7 @@ it: desc_html: Questo si basa su script esterni da hCaptcha, che possono rappresentare un problema di sicurezza e privacy. Inoltre, questo può rendere il processo di registrazione significativamente meno accessibile ad alcune persone (soprattutto disabili). Per questi motivi, prendi in considerazione misure alternative come la registrazione basata su approvazione o su invito. title: Richiedi ai nuovi utenti di risolvere un CAPTCHA per confermare il loro account content_retention: + danger_zone: Zona pericolosa preamble: Controlla come vengono memorizzati i contenuti generati dall'utente in Mastodon. title: Conservazione dei contenuti default_noindex: @@ -949,7 +951,7 @@ it: delete: Cancella edit_preset: Modifica avviso predefinito empty: Non hai ancora definito alcun avviso preimpostato. - title: Gestisci avvisi predefiniti + title: Preimpostazioni di avviso webhooks: add_new: Aggiungi endpoint delete: Elimina diff --git a/config/locales/ja.yml b/config/locales/ja.yml index da9a42141..ec6963517 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -282,6 +282,7 @@ ja: update_custom_emoji_html: "%{name}さんがカスタム絵文字 %{target}を更新しました" update_domain_block_html: "%{name}さんが%{target}のドメインブロックを更新しました" update_ip_block_html: "%{name} さんがIP %{target} のルールを更新しました" + update_report_html: "%{name}さんが通報 %{target} を更新しました" update_status_html: "%{name}さんが%{target}さんの投稿を更新しました" update_user_role_html: "%{name}さんがロール『%{target}』を変更しました" deleted_account: 削除されたアカウント @@ -737,6 +738,7 @@ ja: desc_html: この機能は hCaptcha による外部スクリプトを使用しますが、hCaptcha にはセキュリティとプライバシーの懸念が考えられます。また、CAPTCHAにより新規登録のアクセシビリティが大幅に損なわれる可能性があり、身体および精神障害者においては特に顕著です。以上の理由から、承認制や招待制を基本とするなど、代わりの登録手順を提供することを検討してください。 title: 新規ユーザーのアカウント確認にCHAPCHAを要求する content_retention: + danger_zone: 危険な操作 preamble: ユーザーが生成したコンテンツがどのように Mastodon に保存されるかを管理します。 title: コンテンツの保持 default_noindex: @@ -932,7 +934,7 @@ ja: delete: 削除 edit_preset: プリセット警告文を編集 empty: まだプリセット警告文が作成されていません。 - title: プリセット警告文を管理 + title: プリセット警告文 webhooks: add_new: エンドポイントを追加 delete: 削除 diff --git a/config/locales/kk.yml b/config/locales/kk.yml index f08d8ead1..2695127f0 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -299,7 +299,6 @@ kk: add_new: Add nеw delete: Deletе edit_preset: Edit warning prеset - title: Manage warning presеts admin_mailer: new_pending_account: body: Жаңа есептік жазба туралы мәліметтер төменде берілген. Бұл қолданбаны мақұлдауыңызға немесе қабылдамауыңызға болады. diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 0e90cc723..9de2f6ca5 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -282,6 +282,7 @@ ko: update_custom_emoji_html: "%{name} 님이 에모지 %{target}를 업데이트 했습니다" update_domain_block_html: "%{name} 님이 %{target}에 대한 도메인 차단을 갱신했습니다" update_ip_block_html: "%{name} 님이 IP 규칙 %{target}을 수정했습니다" + update_report_html: "%{name} 님이 신고 %{target}를 업데이트 했습니다" update_status_html: "%{name} 님이 %{target}의 게시물을 업데이트했습니다" update_user_role_html: "%{name} 님이 %{target} 역할을 수정했습니다" deleted_account: 계정을 삭제했습니다 @@ -739,6 +740,7 @@ ko: desc_html: 이것은 hCaptcha의 외부 스크립트에 의존합니다, 이것은 개인정보 보호에 위협을 가할 수도 있습니다. 추가적으로, 이것은 몇몇 사람들(특히나 장애인들)에게 가입 절차의 접근성을 심각하게 떨어트릴 수 있습니다. 이러한 이유로, 대체제로 승인 전용이나 초대제를 통한 가입을 고려해보세요. title: 새로운 사용자가 계정 확인을 위해서는 CAPTCHA를 풀어야 하도록 합니다 content_retention: + danger_zone: 위험한 영역 preamble: 마스토돈에 저장된 사용자 콘텐츠를 어떻게 다룰지 제어합니다. title: 콘텐츠 보존기한 default_noindex: @@ -934,7 +936,7 @@ ko: delete: 삭제 edit_preset: 경고 프리셋 편집 empty: 아직 어떤 경고 틀도 정의되지 않았습니다. - title: 경고 틀 관리 + title: 경고 프리셋 webhooks: add_new: 엔드포인트 추가 delete: 삭제 diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 74dcd6f8f..c24337dd7 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -849,7 +849,6 @@ ku: delete: Jê bibe edit_preset: Hişyariyên pêşsazkirî serrast bike empty: Te hin tu hişyariyên pêşsazkirî destnîşan nekirine. - title: Hişyariyên pêşsazkirî bi rêve bibe webhooks: add_new: Xala dawîbûnê tevlî bike delete: Jê bibe diff --git a/config/locales/lad.yml b/config/locales/lad.yml index e9f18d4be..d0657e73f 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -285,6 +285,7 @@ lad: update_custom_emoji_html: "%{name} aktualizo el emoji %{target}" update_domain_block_html: "%{name} aktualizo el bloko de domeno para %{target}" update_ip_block_html: "\"%{name} troko la regla de IP %{target}" + update_report_html: "%{name} aktualizo el raporto %{target}" update_status_html: "%{name} aktualizo la publikasyon de %{target}" update_user_role_html: "%{name} troko el rolo %{target}" deleted_account: kuento supremido @@ -949,7 +950,6 @@ lad: delete: Efasa edit_preset: Edita avizo predeterminado empty: Ainda no tienes definido ningun avizo predeterminado. - title: Edita konfigurasyon predeterminada de avizos webhooks: add_new: Adjusta endpoint delete: Efasa diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 9664a4ab5..77fcf4286 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -291,6 +291,7 @@ lt: update_custom_emoji_html: "%{name} atnaujino jaustuką %{target}" update_domain_block_html: "%{name} atnaujino domeno bloką %{target}" update_ip_block_html: "%{name} pakeitė taisyklę IP %{target}" + update_report_html: "%{name} atnaujino ataskaitą %{target}" update_status_html: "%{name} atnaujino įrašą %{target}" update_user_role_html: "%{name} pakeitė %{target} vaidmenį" deleted_account: ištrinta paskyra @@ -344,6 +345,8 @@ lt: shortcode: Trumpas kodas shortcode_hint: Bent du ženklai, tik raidiniai skaitmeniniai ženklai bei akcentai(_) title: Asmeniniai jaustukai + uncategorized: Be kategorijos + unlist: Išbraukti iš sąrašo unlisted: Neįtrauktas į sąrašą update_failed_msg: Jaustukas negalėjo būti pakeistas updated_msg: Jaustukas sėkmingai pakeistas! @@ -391,8 +394,16 @@ lt: created_msg: Domenas buvo sėkmingai leistas federacijai. destroyed_msg: Domenas buvo neleistas federacijai. export: Eksportuoti + import: Importuoti + undo: Neleisti federavimo su domenu domain_blocks: add_new: Pridėti naują domeno bloką + confirm_suspension: + cancel: Atšaukti + confirm: Pristabdyti + permanent_action: Atšaukus pristabdymą jokie duomenys ar sąryšiai nebus atkurti. + preamble_html: Jūs pristabdysite %{domain} ir jo subdomenus. + remove_all_data: Taip iš serverio bus pašalintas visas šio domeno paskyrų turinys, medija ir profilio duomenys. created_msg: Domeno užblokavimas nagrinėjamas destroyed_msg: Domeno blokas pašalintas domain: Domenas @@ -410,11 +421,15 @@ lt: silence: Riboti suspend: Pristabdyti title: Naujos domeno blokas + private_comment: Privatus komentaras + public_comment: Viešas komentaras + public_comment_hint: Komentaras apie šį domeno apribojimą plačiajai visuomenei, jei įjungtas domenų apribojimų sąrašo reklamavimas. reject_media: Atmesti medijos failus reject_media_hint: Panaikina lokaliai saugomus medijos failus bei atsisako jų parsisiuntimo ateityje. Neliečia užblokavimu reject_reports: Atmesti ataskaitas reject_reports_hint: Ignoruoti visus skundus, kurie siunčiami iš šio domeno. Neliečia užblokavimu undo: Atkurti domeno bloką + view: Peržiūrėti domeno bloką email_domain_blocks: add_new: Pridėti naują allow_registrations_with_approval: Leisti registracijas su patvirtinimu @@ -426,12 +441,24 @@ lt: title: Naujas el pašto juodojo sąrašo įtraukimas title: El pašto juodasis sąrašas instances: + availability: + title: Prieinamumas + back_to_all: Visi + back_to_limited: Apribotas + back_to_warning: Įspėjimas by_domain: Domenas + content_policies: + policy: Politika + reason: Viešoji priežastis + title: Turinio politika + delivery: + all: Visi delivery_available: Pristatymas galimas moderation: all: Visi limited: Limituotas title: Moderacija + public_comment: Viešas komentaras title: Federacija total_blocked_by_us: Mes užblokavome total_followed_by_them: Jų sekami @@ -443,17 +470,17 @@ lt: filter: all: Visi available: Pasiekiamas - expired: Pasibaigęs + expired: Nebegaliojantis title: Filtras title: Kvietimai relays: add_new: Pridėti naują pamainą delete: Ištrinti - description_html: "Federacijos perjungėjas tai tarpinis serveris, kuris apsikeičia didelios apimties informacija tarp kitų serverių. Tai gali padėti mažesniems serveriams atrasti turinį iš fedi-visatos, kuris kitaip reikalautų vartotojų lokaliai sekti kitus žmones naudojantis kitus tolimus serverius." + description_html: "Federacijos perdavimas – tai tarpinis serveris, kuris keičiasi dideliais viešų įrašų kiekiais tarp jį prenumeruojančių ir skelbiančių serverių. Jis gali padėti mažiems ir vidutiniams serveriams atrasti fediverse esantį turinį, nes priešingu atveju vietiniams naudotojams reikėtų rankiniu būdu sekti kitus žmones iš nutolusių serverių." disable: Išjungti disabled: Išjungtas enable: Įjungti - enable_hint: Kai įjungta, Jūsų serveris prenumeruos visas viešas žinutes iš šio tinklo, ir pradės siųsti šio serverio viešas žinutes į tinklą. + enable_hint: Kai bus įjungtas, tavo serveris užsiprenumeruos visus šio perdavimo viešus įrašus ir pradės į jį siųsti šio serverio viešus įrašus. enabled: Įjungtas inbox_url: Perdavimo URL pending: Laukiama perdavimo patvirtinimo @@ -497,23 +524,59 @@ lt: unresolved: Neišspręsti updated_at: Atnaujinti roles: + categories: + invites: Kvietimai everyone: Numatytieji leidimai everyone_full_description_html: Tai – bazinis vaidmuo, turintis įtakos visiems naudotojams, net ir tiems, kurie neturi priskirto vaidmens. Visi kiti vaidmenys iš jo paveldi teises. + privileges: + invite_users: Kviesti naudotojus + invite_users_description: Leidžia naudotojams pakviesti naujus žmones į serverį. + manage_invites: Tvarkyti kvietimus + manage_invites_description: Leidžia naudotojams naršyti ir deaktyvuoti kvietimų nuorodas. + manage_taxonomies_description: Leidžia naudotojams peržiūrėti tendencingą turinį ir atnaujinti saitažodžių nustatymus settings: captcha_enabled: desc_html: Tai priklauso nuo hCaptcha išorinių skriptų, kurie gali kelti susirūpinimą dėl saugumo ir privatumo. Be to, dėl to registracijos procesas kai kuriems žmonėms (ypač neįgaliesiems) gali būti gerokai sunkiau prieinami. Dėl šių priežasčių apsvarstyk alternatyvias priemones, pavyzdžiui, patvirtinimu arba kvietimu grindžiamą registraciją. + content_retention: + danger_zone: Pavojinga zona + discovery: + public_timelines: Viešieji laiko skalės + trends: Tendencijos domain_blocks: all: Visiems registrations: moderation_recommandation: Prieš atidarant registraciją visiems, įsitikink, kad turi tinkamą ir reaguojančią prižiūrėjimo komandą! software_updates: - description: Rekomenduojama nuolat atnaujinti Mastodon diegyklę, kad galėtum naudotis naujausiais pataisymais ir funkcijomis. Be to, kartais labai svarbu laiku naujinti Mastodon, kad būtų išvengta saugumo problemų. Dėl šių priežasčių Mastodon kas 30 minučių tikrina, ar yra atnaujinimų, ir praneša tau apie tai pagal tavo el. pašto pranešimų parinktis. + description: Rekomenduojama nuolat atnaujinti Mastodon diegyklę, kad galėtum naudotis naujausiais pataisymais ir funkcijomis. Be to, kartais labai svarbu laiku atnaujinti Mastodon, kad būtų išvengta saugumo problemų. Dėl šių priežasčių Mastodon kas 30 minučių tikrina, ar yra naujinimų, ir praneša tau apie tai pagal tavo el. pašto pranešimų parinktis. + documentation_link: Sužinoti daugiau + release_notes: Leidimo informacija + title: Galimi naujinimai + type: Tipas + types: + major: Pagrindinis leidimas + minor: Nedidelis leidimas + patch: Pataiso leidimas – riktų taisymai ir lengvai pritaikomi pakeitimai + version: Versija statuses: + account: Autorius (-ė) + application: Programa back_to_account: Grįžti į paskyros puslapį + back_to_report: Grįžti į ataskaitos puslapį + batch: + remove_from_report: Pašalinti iš ataskaitos + deleted: Ištrinta + favourites: Mėgstami + history: Versijų istorija + in_reply_to: Atsakydant į + language: Kalba media: title: Medija - no_status_selected: Jokie statusai nebuvo pakeisti, nes niekas nepasirinkta + metadata: Metaduomenys + no_status_selected: Jokie įrašai nebuvo pakeisti, nes nė vienas buvo pasirinktas + open: Atidaryti įrašą + original_status: Originalus įrašas title: Paskyros statusai + trending: Tendencinga with_media: Su medija system_checks: elasticsearch_health_yellow: @@ -521,13 +584,69 @@ lt: elasticsearch_preset: message_html: Tavo Elasticsearch klasteris turi daugiau nei vieną mazgą, bet Mastodon nėra sukonfigūruotas juos naudoti. elasticsearch_preset_single_node: + action: Žiūrėti dokumentaciją message_html: Tavo Elasticsearch klasteris turi tik vieną mazgą, ES_PRESET turėtų būti nustatyta į single_node_cluster. title: Administracija + trends: + allow: Leisti + approved: Patvirtinta + disallow: Neleisti + links: + allow: Leisti nuorodą + allow_provider: Leisti leidėją + description_html: Tai – nuorodos, kuriomis šiuo metu daug bendrinasi paskyros, iš kurių tavo serveris mato įrašus. Tai gali padėti naudotojams sužinoti, kas vyksta pasaulyje. Jokios nuorodos nerodomos viešai, kol nepatvirtinai leidėjo. Taip pat gali leisti arba atmesti atskiras nuorodas. + disallow: Neleisti nuorodą + disallow_provider: Neleisti leidėją + no_link_selected: Jokios nuorodos nebuvo pakeistos, nes nebuvo pasirinkta nė viena + publishers: + no_publisher_selected: Jokie leidėjai nebuvo pakeisti, nes nė vienas nebuvo pasirinktas + title: Tendencingos nuorodos + usage_comparison: Bendrinta %{today} kartų šiandien, palyginti su %{yesterday} vakar + not_allowed_to_trend: Neleidžiama tendencinguoti + only_allowed: Leidžiama tik + pending_review: Laukiama peržiūros + preview_card_providers: + allowed: Nuorodos iš šio leidėjo gali tendencinguoti + description_html: Tai – domenai, iš kurių dažnai bendrinamos nuorodos tavo serveryje. Nuorodos netendencinguos, nebent nuorodos domenas yra patvirtintas. Tavo patvirtinimas (arba atmetimas) apima ir subdomenus. + rejected: Nuorodos iš šio leidėjo netendencinguos + title: Leidėjai + rejected: Atmesta + statuses: + allow: Leisti įrašą + allow_account: Leisti autorių (-ę) + description_html: Tai – įrašai, apie kuriuos žino tavo serveris ir kuriais šiuo metu daug bendrinamasi ir kurie yra mėgstami. Tai gali padėti naujiems ir grįžtantiems naudotojams rasti daugiau žmonių, kuriuos galima sekti. Jokie įrašai nerodomi viešai, kol nepatvirtinai autoriaus (-ės), o autorius (-ė) leidžia savo paskyrą siūlyti kitiems. Taip pat gali leisti arba atmesti atskirus įrašus. + disallow: Neleisti įrašą + disallow_account: Neleisti autorių (-ę) + no_status_selected: Jokie tendencingi įrašai nebuvo pakeisti, nes nė vienas iš jų nebuvo pasirinktas + not_discoverable: Autorius (-ė) nesutiko, kad būtų galima juos atrasti + shared_by: + few: Bendrinta arba pamėgta %{friendly_count} kartus + many: Bendrinta arba pamėgta %{friendly_count} karto + one: Bendrinta arba pamėgta vieną kartą + other: Bendrinta arba pamėgta %{friendly_count} kartų + title: Tendencingi įrašai + tags: + dashboard: + tag_accounts_measure: unikalūs naudojimai + tag_languages_dimension: Populiariausios kalbos + tag_servers_dimension: Populiariausi serveriai + tag_servers_measure: skirtingi serveriai + tag_uses_measure: bendri naudojimai + listable: Gali būti siūloma + not_trendable: Nepasirodys tendencijose + title: Tendencingos saitažodžiai + trendable: Gali pasirodyti tendencijose + trending_rank: 'Tendencinga #%{rank}' + title: Tendencijos + trending: Tendencinga warning_presets: add_new: Pridėti naują delete: Ištrinti edit_preset: Keisti įspėjimo nustatymus - title: Valdyti įspėjimo nustatymus + title: Įspėjamieji numatytieji + webhooks: + description_html: "Webhook leidžia Mastodon siųsti realaus laiko pranešimus apie pasirinktus įvykius į tavo programą, kad programa galėtų automatiškai paleisti reakcijas." + events: Įvykiai admin_mailer: auto_close_registrations: body: Dėl pastarojo meto peržiūrėtojų aktyvumo trūkumo %{instance} registracija buvo automatiškai pakeista į reikalaujančią rankinės būdo peržiūros, kad %{instance} nebūtų naudojama kaip platforma potencialiems blogiems veikėjams. Bet kuriuo metu gali ją vėl perjungti į atvirą registraciją. @@ -536,16 +655,30 @@ lt: body: "%{reporter} parašė skundą apie %{target}" body_remote: Kažkas iš %{domain} parašė skundą apie %{target} subject: Naujas skundas %{instance} (#%{id}) + new_trends: + new_trending_links: + title: Tendencingos nuorodos + new_trending_statuses: + title: Tendencingi įrašai + new_trending_tags: + title: Tendencingos saitažodžiai + subject: Naujos tendencijos peržiūrimos %{instance} appearance: + advanced_web_interface: Išplėstinė žiniatinklio sąsaja + advanced_web_interface_hint: 'Jei nori išnaudoti visą ekrano plotį, išplėstinė žiniatinklio sąsaja leidžia sukonfigūruoti daug skirtingų stulpelių, kad vienu metu matytum tiek informacijos, kiek tik nori: Pagrindinis, pranešimai, federacinė laiko skalė, bet kokie sąrašai ir saitažodžiai.' + animations_and_accessibility: Animacijos ir pritaikymas neįgaliesiems + confirmation_dialogs: Patvirtinimo dialogai + discovery: Atradimas localization: body: Mastodon verčia savanoriai. guide_link_text: Visi gali prisidėti. + sensitive_content: Jautrus turinys application_mailer: - notification_preferences: Keisti el pašto parinktis + notification_preferences: Keisti el. pašto nuostatas settings: 'Keisti el. pašto nuostatas: %{link}' view: 'Peržiūra:' view_profile: Peržiurėti profilį - view_status: Peržiūrėti statusą + view_status: Peržiūrėti įrašą applications: created: Aplikacija sėkmingai sukurta destroyed: Aplikacija sėkmingai ištrinta @@ -554,24 +687,36 @@ lt: warning: Būkite atsargūs su šia informacija. Niekada jos nesidalinkite! your_token: Tavo prieigos raktas auth: + confirmations: + welcome_title: Sveiki, %{name}! delete_account: Ištrinti paskyrą delete_account_html: Jeigu norite ištrinti savo paskyrą, galite eiti čia. Jūsų prašys patvirtinti pasirinkimą. + description: + prefix_invited_by_user: "@%{name} kviečia prisijungti prie šio Mastodon serverio!" + prefix_sign_up: Užsiregistruok Mastodon šiandien! + didnt_get_confirmation: Negavai patvirtinimo nuorodos? dont_have_your_security_key: Neturi saugumo rakto? - forgot_password: Pamiršote slaptažodį? - invalid_reset_password_token: Slaptažodžio atkūrimo žetonas netinkamas arba jo galiojimo laikas pasibaigęs. Prašykite naujo žetono. + forgot_password: Pamiršai slaptažodį? + invalid_reset_password_token: Slaptažodžio atkūrimo raktas yra netinkamas arba nebegaliojantis. Paprašyk naujo. + log_in_with: Prisijungti su login: Prisijungti logout: Atsijungti migrate_account: Prisijungti prie kitos paskyros migrate_account_html: Jeigu norite nukreipti šią paskyrą į kita, galite tai konfiguruoti čia. or_log_in_with: Arba prisijungti su + providers: + cas: CAS + saml: SAML register: Užsiregistruoti reset_password: Atstatyti slaptažodį rules: invited_by: 'Gali prisijungti prie %{domain} pagal kvietimą, kurį gavai iš:' preamble_invited: Prieš tęsiant, atsižvelk į pagrindines taisykles, kurias nustatė %{domain} prižiūrėtojai. + title_invited: Esi pakviestas. security: Apsauga set_new_password: Nustatyti naują slaptažodį status: + account_status: Paskyros būsena redirecting_to: Tavo paskyra yra neaktyvi, nes šiuo metu ji nukreipiama į %{acct}. self_destruct: Kadangi %{domain} uždaromas, turėsi tik ribotą prieigą prie savo paskyros. view_strikes: Peržiūrėti ankstesnius savo paskyros pažeidimus @@ -599,16 +744,21 @@ lt: success_msg: Tavo paskyra buvo sėkmingai ištrinta disputes: strikes: + created_at: Data + title_actions: + none: Įspėjimas your_appeal_approved: Tavo apeliacija buvo patvirtinta your_appeal_pending: Pateikei apeliaciją your_appeal_rejected: Tavo apeliacija buvo atmesta + edit_profile: + hint_html: "Tinkink tai, ką žmonės mato tavo viešame profilyje ir šalia įrašų. Kiti žmonės labiau linkę sekti atgal ir bendrauti su tavimi, jei tavo profilis yra užpildytas ir turi profilio nuotrauką." errors: '403': Jūs neturie prieigos matyti šiam puslapiui. '404': Puslapis nerastas. '410': Puslapis neegzistuoja. '422': - content: Apsaugos patvirtinmas klaidingas. Ar jūs blokuojate sausainius? - title: Apsaugos patvirtinimas nepavyko + content: Nepavyko saugumo patvirtinimas. Ar blokuoji slapukus? + title: Nepavyko saugumo patvirtinimas '429': Stabdomas '500': content: Atsiprašome, tačiau mūsų pusėje įvyko klaida. @@ -623,32 +773,46 @@ lt: request: Prašyti savo archyvo size: Dydis blocks: Jūs blokuojate + bookmarks: Žymės + csv: CSV domain_blocks: Domeno blokai lists: Sąrašai mutes: Jūs tildote storage: Medijos sandėlis featured_tags: add_new: Pridėti naują + hint_html: "Savo profilyje parodyk svarbiausius saitažodžius. Tai puikus įrankis kūrybiniams darbams ir ilgalaikiams projektams sekti, todėl svarbiausios saitažodžiai rodomi matomoje vietoje profilyje ir leidžia greitai pasiekti tavo paties įrašus." filters: contexts: - home: Namų laiko juosta - notifications: Priminimai - public: Viešos laiko juostos + account: Profiliai + home: Pagrindinis ir sąrašai + notifications: Pranešimai + public: Viešieji laiko skalės thread: Pokalbiai edit: + add_keyword: Pridėti raktažodį + keywords: Raktažodžiai title: Keisti filtrą errors: invalid_context: Jokio arba netinkamas pateiktas kontekstas index: delete: Ištrinti + empty: Neturi jokių filtrų. title: Filtrai new: title: Pridėti naują filtrą generic: + all: Visi changes_saved_msg: Pakeitimai sėkmingai išsaugoti! copy: Kopijuoti + delete: Ištrinti + deselect: Panaikinti visus žymėjimus + order_by: Tvarkyti pagal save_changes: Išsaugoti pakeitimus + today: šiandien imports: + errors: + too_large: Failas per didelis. modes: merge: Sulieti merge_long: Išsaugoti esančius įrašus ir pridėti naujus @@ -664,7 +828,7 @@ lt: upload: Įkelti invites: delete: Deaktyvuoti - expired: Pasibaigė + expired: Nebegaliojantis expires_in: '1800': 30 minučių '21600': 6 valandų @@ -673,32 +837,33 @@ lt: '604800': 1 savaitės '86400': 1 dienos expires_in_prompt: Niekada - generate: Generuoti + generate: Generuoti kvietimo nuorodą invalid: Šis kvietimas negalioja. - invited_by: 'Jus pakvietė:' + invited_by: 'Tave pakvietė:' max_uses: - few: "%{count} panaudojimai" - many: "%{count} panaudojimo" - one: 1 panaudojimas - other: "%{count} panaudojimų" - max_uses_prompt: Nėra limito + few: "%{count} naudojimai" + many: "%{count} naudojimo" + one: 1 naudojimas + other: "%{count} naudojimų" + max_uses_prompt: Nėra ribojimo prompt: Generuok ir bendrink nuorodas su kitais, kad suteiktum prieigą prie šio serverio table: expires_at: Baigsis uses: Naudojimai - title: Pakviesti žmones + title: Kviesti žmones media_attachments: validations: images_and_video: Negalima pridėti video prie statuso, kuris jau turi nuotrauką too_many: Negalima pridėti daugiau nei 4 failų migrations: - acct: slapyvardis@domenas naujam vartotojui + acct: Perkelta į + cancel: Atšaukti nukreipimą moderation: - title: Moderacija + title: Prižiūrėjimas notification_mailer: favourite: - body: 'Jūsų statusą pamėgo %{name}:' - subject: "%{name} pamėgo Jūsų statusą" + body: 'Tavo įrašą pamėgo %{name}:' + subject: "%{name} pamėgo tavo įrašą" title: Naujas mėgstamas follow: body: "%{name} pradėjo jus sekti!" @@ -718,18 +883,53 @@ lt: body: 'Tavo įrašą pakėlė %{name}:' subject: "%{name} pakėlė tavo įrašą" title: Naujas pakėlimas + notifications: + email_events: Įvykiai, skirti el. laiško pranešimams + email_events_hint: 'Pasirink įvykius, apie kuriuos nori gauti pranešimus:' + number: + human: + decimal_units: + units: + billion: mlrd. + million: mln. + thousand: tūkst. pagination: newer: Naujesnis next: Kitas older: Senesnis prev: Ankstesnis + truncate: "…" preferences: other: Kita + posting_defaults: Skelbimo numatytosios nuostatos + public_timelines: Viešieji laiko skalės privacy: hint_html: "Tikrink, kaip nori, kad tavo profilis ir įrašai būtų randami. Įjungus įvairias Mastodon funkcijas, jos gali padėti pasiekti platesnę auditoriją. Akimirką peržiūrėk šiuos nustatymus, kad įsitikintum, jog jie atitinka tavo naudojimo būdą." + privacy: Privatumas + privacy_hint_html: Valdyk, kiek informacijos norėtum atskleisti kitų labui. Žmonės atranda įdomių profilių ir šaunių programėlių, naršydami kitų žmonių sekamus profilius ir žiūrėdami, iš kokių programėlių jie skelbia įrašus, bet tu galbūt norėsi tai slėpti. + reach: Pasiekiamumas + reach_hint_html: Valdyk, ar norėtum, kad tave atrastų ir sektų nauji žmonės. Ar nori, kad įrašai būtų rodomi Naršyti ekrane? Ar nori, kad kiti žmonės tave matytų savo sekimo rekomendacijose? Ar nori automatiškai priimti visus naujus sekėjus, ar detaliai valdyti kiekvieną iš jų? + search: Paieška + search_hint_html: Valdyk, kaip norėtum būti surastas. Ar nori, kad žmonės tave rastų pagal tai, apie ką viešai paskelbi? Ar nori, kad ne Mastodon žmonės, ieškantys profilio internete, rastų tavo profilį? Atmink, kad visiško pašalinimo iš visų paieškos variklių viešai skelbiamai informacijai užtikrinti negalima. + title: Privatumas ir pasiekiamumas + privacy_policy: + title: Privatumo politika redirects: prompt: Jei pasitiki šia nuoroda, spustelėk ją, kad tęstum. title: Palieki %{instance} + relationships: + activity: Paskyros aktyvumas + dormant: Neaktyvus + followers: Sekėjai + following: Sekama + invited: Pakviestas + last_active: Paskutinį kartą aktyvus + most_recent: Naujausias + moved: Perkelta + mutual: Bendri + primary: Pirminis + relationship: Sąryšis + status: Paskyros būsena remote_follow: missing_resource: Jūsų paskyros nukreipimo URL nerasta scheduled_statuses: @@ -745,33 +945,61 @@ lt: date: Data description: "%{browser} ant %{platform}" explanation: Čia rodomos web naršyklės prijungtos prie Jūsų Mastodon paskyros. + ip: IP platforms: + adobe_air: Adobe Air android: Android + blackberry: BlackBerry + chrome_os: ChromeOS + firefox_os: Firefox OS ios: iOS kai_os: KaiOS + linux: Linux mac: macOS + unknown_platform: Nežinoma platforma windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone - revoke: Atšaukti + revoke: Naikinti revoke_success: Seansas sėkmingai panaikintas. title: Seansai settings: - authorized_apps: Autorizuotos aplikacijos + account: Paskyra + account_settings: Paskyros nustatymai + aliases: Paskyros pseudonimai + appearance: Išvaizda + authorized_apps: Leidžiamos programėlės back: Grįžti į Mastodon delete: Paskyros trynimas - development: Plėtojimas - edit_profile: Keisti profilį - export: Informacijos eksportas - featured_tags: Rodomi saitažodžiai(#) + development: Kūrimas + edit_profile: Redaguoti profilį + export: Duomenų eksportas + featured_tags: Rodomi saitažodžiai import: Importuoti migrate: Paskyros migracija notifications: El. laiško pranešimai - preferences: Preferencijos + preferences: Nuostatos + profile: Viešas profilis + relationships: Sekimai ir sekėjai + severed_relationships: Nutrūkę sąryšiai two_factor_authentication: Dviejų veiksnių autentikacija + severed_relationships: + download: Atsisiųsti (%{count}) + preamble: Užblokavus domeną arba prižiūrėtojams nusprendus pristabdyti nuotolinio serverio veiklą, gali prarasti sekimus ir sekėjus. Kai taip atsitiks, galėsi atsisiųsti nutrauktų sąryšių sąrašus, kad juos patikrinti ir galbūt importuoti į kitą serverį. + type: Įvykis statuses: attached: + audio: + few: "%{count} garso įrašai" + many: "%{count} garso įrašo" + one: "%{count} garso įrašas" + other: "%{count} garso įrašų" description: 'Pridėta: %{attached}' + image: + few: "%{count} vaizdai" + many: "%{count} vaizdo" + one: "%{count} vaizdas" + other: "%{count} vaizdų" boosted_from_html: Pakelta iš %{acct_link} content_warning: 'Turinio įspėjimas: %{warning}' open_in_web: Atidaryti naudojan Web @@ -780,28 +1008,33 @@ lt: limit: Jūs jau prisegėte maksimalų toot'ų skaičų ownership: Kitų vartotojų toot'ai negali būti prisegti reblog: Pakeltos žinutės negali būti prisegtos - show_more: Daugiau + poll: + vote: Balsuoti + show_more: Rodyti daugiau + show_thread: Rodyti giją visibilities: private: Tik sekėjams - private_long: Rodyti tik sekėjams - public: Viešas - public_long: Visi gali matyti + private_long: rodyti tik sekėjams + public: Vieša + public_long: visi gali matyti unlisted: Neįtrauktas į sąrašus - unlisted_long: Matyti gali visi, tačiau nėra įtraukti į viešąsias laiko skales + unlisted_long: matyti gali visi, bet nėra išvardyti į viešąsias laiko skales statuses_cleanup: enabled_hint: Automatiškai ištrina įrašus, kai jie pasiekia nustatytą amžiaus ribą, nebent jie atitinka vieną iš toliau nurodytų išimčių keep_polls_hint: Neištrina jokių tavo apklausų keep_self_bookmark: Laikyti įrašus, kuriuos pažymėjai keep_self_bookmark_hint: Neištrina tavo pačių įrašų, jei esi juos pažymėjęs (-usi) + keep_self_fav_hint: Neištrina tavo pačių įrašų, jei esi juos pamėgęs (-usi) stream_entries: sensitive_content: Jautrus turinys themes: - contrast: Mastodon (Didelio Kontrasto) - default: Mastodon (Tamsus) - mastodon-light: Mastodon (Šviesus) + contrast: Mastodon (didelis kontrastas) + default: Mastodon (tamsi) + mastodon-light: Mastodon (šviesi) system: Automatinis (naudoti sistemos temą) two_factor_authentication: - disable: Išjungti + add: Pridėti + disable: Išjungti 2FA enabled: Dviejų veiksnių autentikacija įjungta enabled_success: Dviejų veiksnių autentikacija sėkmingai įjungta generate_recovery_codes: Sugeneruoti atkūrimo kodus @@ -863,8 +1096,8 @@ lt: follows_subtitle: Sek gerai žinomas paskyras. follows_title: Ką sekti follows_view_more: Peržiūrėti daugiau sekamų žmonių - hashtags_subtitle: Naršyk, kas tendencinga per pastarąsias 2 dienas. - hashtags_title: Tendencijos saitažodžiai + hashtags_subtitle: Naršyk, kas tendencinga per pastarąsias 2 dienas + hashtags_title: Tendencingos saitažodžiai hashtags_view_more: Peržiūrėti daugiau tendencingų saitažodžių post_action: Sukurti post_step: Sakyk labas pasauliui tekstu, nuotraukomis, vaizdo įrašais arba apklausomis. @@ -884,9 +1117,10 @@ lt: seamless_external_login: Esi prisijungęs (-usi) per išorinę paslaugą, todėl slaptažodžio ir el. pašto nustatymai nepasiekiami. signed_in_as: 'Prisijungta kaip:' verification: - extra_instructions_html: Patarimas: nuoroda tavo svetainėje gali būti nematoma. Svarbi dalis – tai, kas rel="me" neleidžia apsimesti interneto svetainėse, kuriose yra naudotojų sukurto turinio. Vietoj to gali naudoti net nuorodą puslapio antraštėje esančią žymę a, tačiau HTML turi būti pasiekiamas nevykdant JavaScript. + extra_instructions_html: Patarimas: nuoroda tavo svetainėje gali būti nematoma. Svarbi dalis – tai, kad rel="me" neleidžia apsimesti interneto svetainėse, kuriose yra naudotojų sukurto turinio. Vietoj to gali naudoti net nuorodą puslapio antraštėje esančią žymę a, tačiau HTML turi būti pasiekiamas nevykdant JavaScript. + here_is_how: Štai kaip hint_html: "Savo tapatybės patvirtinimas Mastodon skirtas visiems. Remiantis atviraisiais žiniatinklio standartais, dabar ir visam laikui nemokamas. Viskas, ko tau reikia, yra asmeninė svetainė, pagal kurią žmonės tave atpažįsta. Kai iš savo profilio pateiksi nuorodą į šią svetainę, patikrinsime, ar svetainėje yra nuoroda į tavo profilį, ir parodysime vizualinį indikatorių." - instructions_html: Nukopijuok ir įklijuok toliau pateiktą kodą į savo svetainės HTML. Tada į vieną iš papildomų profilio laukų skirtuke „Redaguoti profilį“ įrašyk savo svetainės adresą ir išsaugok pakeitimus. + instructions_html: Nukopijuok ir įklijuok toliau pateiktą kodą į savo svetainės HTML. Tada į vieną iš papildomų profilio laukų skirtuke Redaguoti profilį įrašyk savo svetainės adresą ir išsaugok pakeitimus. verification: Patvirtinimas verified_links: Tavo patikrintos nuorodos webauthn_credentials: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index ee8395400..5a071eba8 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -761,6 +761,7 @@ lv: desc_html: Tas balstās uz ārējiem skriptiem no hCaptcha, kas var radīt bažas par drošību un privātumu. Turklāt tas var padarīt reģistrācijas procesu ievērojami mazāk pieejamu dažiem cilvēkiem (īpaši invalīdiem). Šo iemeslu dēļ, lūdzu, apsver alternatīvus pasākumus, piemēram, reģistrāciju, kas balstīta uz apstiprinājumu vai uzaicinājumu. title: Pieprasīt jaunajiem lietotājiem atrisināt CAPTCHA, lai apstiprinātu savu kontu content_retention: + danger_zone: Bīstama sadaļa preamble: Kontrolē, kā Mastodon tiek glabāts lietotāju ģenerēts saturs. title: Satura saglabāšana default_noindex: @@ -960,7 +961,6 @@ lv: delete: Dzēst edit_preset: Labot iepriekš iestatītus brīdinājumus empty: Tu vēl neesi definējis iepriekš iestatītos brīdinājumus. - title: Pārvaldīt brīdinājuma iestatījumus webhooks: add_new: Pievienot galapunktu delete: Dzēst @@ -1631,6 +1631,7 @@ lv: unknown_browser: Nezināms Pārlūks weibo: Weibo current_session: Pašreizējā sesija + date: Datums description: "%{browser} uz %{platform}" explanation: Šie ir tīmekļa pārlūki, kuros šobrīd esi pieteicies savā Mastodon kontā. ip: IP @@ -1667,6 +1668,7 @@ lv: import: Imports import_and_export: Imports un eksports migrate: Konta migrācija + notifications: E-pasta paziņojumi preferences: Iestatījumi profile: Profils relationships: Sekojamie un sekotāji @@ -1674,6 +1676,9 @@ lv: strikes: Moderācijas aizrādījumi two_factor_authentication: Divpakāpju autentifikācija webauthn_authentication: Drošības atslēgas + severed_relationships: + download: Lejupielādēt (%{count}) + type: Notikums statuses: attached: audio: @@ -1800,6 +1805,7 @@ lv: webauthn: Drošības atslēgas user_mailer: appeal_approved: + action: Konta iestatījumi explanation: Apelācija par brīdinājumu jūsu kontam %{strike_date}, ko iesniedzāt %{appeal_date}, ir apstiprināta. Jūsu konts atkal ir labā stāvoklī. subject: Jūsu %{date} apelācija ir apstiprināta title: Apelācija apstiprināta @@ -1849,15 +1855,28 @@ lv: silence: Konts ierobežots suspend: Konts apturēts welcome: + apps_android_action: Iegūt to Google Play + apps_title: Mastodon lietotnes edit_profile_action: Pielāgot edit_profile_title: Pielāgo savu profilu explanation: Šeit ir daži padomi, kā sākt darbu + feature_action: Uzzināt vairāk feature_creativity: Mastodon nodrošina skaņas, video un attēlu ierakstus, pieejamības aprakstus, aptaujas, satura brīdinājumus, animētus profila attēlus, pielāgotas emocijzīmes, sīktēlu apgriešanas vadīklas un vēl, lai palīdzētu Tev sevi izpaust tiešsaistē. Vai Tu izplati savu mākslu, mūziku vai aplādes, Mastodon ir šeit ar Tevi. + follow_action: Sekot follow_title: Pielāgo savu mājas barotni + follows_title: Kam sekot + follows_view_more: Rādīt vairāk cilvēku, kuriem sekot hashtags_recent_count: one: "%{people} cilvēks pēdējās 2 dienās" other: "%{people} cilvēki pēdējās 2 dienās" zero: "%{people} cilvēku pēdējās divās dienās" + post_action: Rakstīt + post_step: Pasveicini pasauli ar tekstu, fotoattēliem, video vai aptaujām! + post_title: Izveido savu pirmo ierakstu + share_action: Kopīgot + share_step: Dari saviem draugiem zināmu, kā Tevi atrast Mastodon! + share_title: Kopīgo savu Mastodon profilu + sign_in_action: Pieteikties subject: Laipni lūgts Mastodon title: Laipni lūgts uz borta, %{name}! users: @@ -1865,6 +1884,7 @@ lv: go_to_sso_account_settings: Dodies uz sava identitātes nodrošinātāja konta iestatījumiem invalid_otp_token: Nederīgs divfaktora kods otp_lost_help_html: Ja esi zaudējis piekļuvi abiem, tu vari sazināties ar %{email} + rate_limited: Pārāk daudz autentifikācijas mēģinājumu, vēlāk jāmēģina vēlreiz. seamless_external_login: Tu esi pieteicies, izmantojot ārēju pakalpojumu, tāpēc paroles un e-pasta iestatījumi nav pieejami. signed_in_as: 'Pieteicies kā:' verification: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index f39c26a5c..a778d0c28 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -924,7 +924,6 @@ ms: delete: Padam edit_preset: Edit pratetap amaran empty: Anda belum menentukan sebarang pratetap amaran lagi. - title: Urus pratetap amaran webhooks: add_new: Tambah titik akhir delete: Padam diff --git a/config/locales/my.yml b/config/locales/my.yml index 4ac9ecdd4..f28458360 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -909,7 +909,6 @@ my: delete: ဖျက်ပါ edit_preset: ကြိုသတိပေးချက်ကို ပြင်ဆင်ပါ empty: ကြိုသတိပေးချက်များကို မသတ်မှတ်ရသေးပါ။ - title: ကြိုသတိပေးချက်များကို စီမံပါ webhooks: add_new: ဆုံးမှတ် ထည့်ပါ delete: ဖျက်ပါ diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 553c780be..a527fdb5a 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -285,6 +285,7 @@ nl: update_custom_emoji_html: Emoji %{target} is door %{name} bijgewerkt update_domain_block_html: "%{name} heeft de domeinblokkade bijgewerkt voor %{target}" update_ip_block_html: "%{name} wijzigde de IP-regel voor %{target}" + update_report_html: Rapportage %{target} is door %{name} bijgewerkt update_status_html: "%{name} heeft de berichten van %{target} bijgewerkt" update_user_role_html: "%{name} wijzigde de rol %{target}" deleted_account: verwijderd account @@ -745,12 +746,13 @@ nl: preamble: Mastodons webomgeving aanpassen. title: Weergave branding: - preamble: De branding van jouw server laat zien hoe het met andere servers in het netwerk verschilt. Deze informatie wordt op verschillende plekken getoond, zoals in de webomgeving van Mastodon, in mobiele apps, in voorvertoningen op andere websites en berichten-apps, enz. Daarom is het belangrijk om de informatie helder, kort en beknopt te houden. + preamble: De branding van jouw server laat zien hoe het met andere servers in het netwerk verschilt. Deze informatie wordt op verschillende plekken getoond, zoals in de webomgeving van Mastodon, in mobiele apps, in linkvoorbeelden op andere websites en berichten-apps, enz. Daarom is het belangrijk om de informatie helder, kort en beknopt te houden. title: Branding captcha_enabled: desc_html: Dit is afhankelijk van externe scripts van hCaptcha, wat veiligheids- en privacyrisico's met zich mee kan brengen. Bovendien kan dit het registratieproces aanzienlijk minder toegankelijk maken voor sommige (vooral gehandicapte) mensen. Om deze redenen kun je het beste alternatieve maatregelen overwegen, zoals registratie op basis van goedkeuring of op uitnodiging. title: Nieuwe gebruikers dienen een CAPTCHA op te lossen om hun account te bevestigen content_retention: + danger_zone: Gevarenzone preamble: Toezicht houden op hoe berichten en media van gebruikers op Mastodon worden bewaard. title: Bewaartermijn berichten default_noindex: @@ -949,7 +951,7 @@ nl: delete: Verwijderen edit_preset: Preset voor waarschuwing bewerken empty: Je hebt nog geen presets voor waarschuwingen toegevoegd. - title: Presets voor waarschuwingen beheren + title: Presets voor waarschuwingen webhooks: add_new: Eindpunt toevoegen delete: Verwijderen diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 8a7cb18a4..d82c92c26 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -285,6 +285,7 @@ nn: update_custom_emoji_html: "%{name} oppdaterte emojien %{target}" update_domain_block_html: "%{name} oppdaterte domeneblokkeringa for %{target}" update_ip_block_html: "%{name} endret regel for IP %{target}" + update_report_html: "%{name} oppdaterte rapporten %{target}" update_status_html: "%{name} oppdaterte innlegg av %{target}" update_user_role_html: "%{name} endret %{target} -rolle" deleted_account: sletta konto @@ -460,13 +461,13 @@ nn: title: Importer domeneblokkeringar no_file: Inga fil vald follow_recommendations: - description_html: "Følgjeforslag hjelper nye brukarar å raskt finna interessant innhald. Om ein brukar ikkje har interagera nok med andre til å danne personlege følgjeforslag, vert disse kontiane føreslått i staden. Dei vert gjenkalkulert på dagleg basis ut frå ei blanding av dei konti med flest nylege engasjement og flest lokale følgjarar for eit gitt språk." + description_html: "Fylgjeforslag hjelper nye brukarar å finna interessant innhald raskt. Om ein brukar ikkje har samhandla nok med andre til å få tilpassa fylgjeforslag, blir desse kontoane føreslått i staden. Dei blir rekna ut på nytt kvar dag ut frå ei blanding av kva kontoar som har mykje nyleg aktivitet og høgast tal på fylgjarar på eit bestemt språk." language: For språk status: Status suppress: Demp følgjeforslag suppressed: Dempa - title: Følgjeforslag - unsuppress: Tilbakestill følgjeforslag + title: Fylgjeforslag + unsuppress: Nullstill fylgjeforslag instances: availability: description_html: @@ -745,19 +746,20 @@ nn: preamble: Tilpasse web-grensesnittet. title: Utsjånad branding: - preamble: Profileringa av tenaren din skil den frå andre tenarar i nettverket. Informasjonen kan bli vist ulike stadar, til dømes i Mastodon sitt web-grensesnitt, i eigne applikasjonar, i førehandsvisningar på andre nettsider, i meldingsappar og så bortetter. På grunn av dette er det best å halde informasjonen enkel, kort og treffande. + preamble: Profileringa av tenaren din skil den frå andre tenarar i nettverket. Informasjonen kan bli vist ulike stader, til dømes i Mastodon sitt web-grensesnitt, i eigne applikasjonar, i førehandsvisningar på andre nettsider, i meldingsappar og så bortetter. På grunn av dette er det best at denne informasjonen er enkel, kort og treffande. title: Profilering captcha_enabled: desc_html: Dette baserer seg på eksterne skript frå hCaptcha, noko som kan vera eit tryggleiks- og personvernsproblem. I tillegg kan dette gjera registreringsprosessen monaleg mindre tilgjengeleg (særleg for folk med nedsett funksjonsevne). Dette gjer at du bør du vurdera alternative tiltak, som til dømes godkjennings- eller invitasjonsbasert registrering. title: Krev at nye brukarar løyser ein CAPTCHA for å bekrefte kontoen sin content_retention: + danger_zone: Faresone preamble: Styr korleis brukargenerert innhald blir lagra i Mastodon. title: Bevaring av innhald default_noindex: desc_html: Påverkar alle brukarar som ikkje har justert denne innstillinga sjølve title: Ikkje la brukarar indekserast av søkjemotorar som standard discovery: - follow_recommendations: Følgjeforslag + follow_recommendations: Fylgjeforslag preamble: Å framheva interessant innhald er vitalt i mottakinga av nye brukarar som ikkje nødvendigvis kjenner nokon på Mastodon. Kontroller korleis oppdagingsfunksjonane på tenaren din fungerar. profile_directory: Profilkatalog public_timelines: Offentlege tidsliner @@ -949,7 +951,7 @@ nn: delete: Slett edit_preset: Endr åtvaringsoppsett empty: Du har ikke definert noen forhåndsinnstillinger for advarsler enda. - title: Handsam åtvaringsoppsett + title: Førehandsinnstillingar for varsel webhooks: add_new: Legg til endepunkt delete: Slett @@ -1560,7 +1562,7 @@ nn: activity: Kontoaktivitet confirm_follow_selected_followers: Er du sikker på at du ynskjer å fylgja dei valde fylgjarane? confirm_remove_selected_followers: Er du sikker på at du ynskjer å fjerna dei valde fylgjarane? - confirm_remove_selected_follows: Er du sikker på at du ynskjer å fjerna det valde følgjet? + confirm_remove_selected_follows: Er du sikker på at du ikkje vil fylgja desse? dormant: I dvale follow_failure: Greidde ikkje fylgja alle kontoane du valde. follow_selected_followers: Følg valgte tilhengere diff --git a/config/locales/no.yml b/config/locales/no.yml index c71dffc63..537552ea9 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -944,7 +944,6 @@ delete: Slett edit_preset: Rediger advarsel forhåndsinnstilling empty: Du har ikke definert noen forhåndsinnstillinger for varsler enda. - title: Endre forhåndsinnstillinger for advarsler webhooks: add_new: Legg til endepunkt delete: Slett diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 0a653ea46..d2bea55bd 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -430,7 +430,6 @@ oc: add_new: N’ajustar un nòu delete: Escafar edit_preset: Modificar lo tèxt predefinit d’avertiment - title: Gerir los tèxtes predefinits webhooks: delete: Suprimir disable: Desactivar diff --git a/config/locales/pl.yml b/config/locales/pl.yml index d3d16fe37..4c7af82b9 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -291,6 +291,7 @@ pl: update_custom_emoji_html: Zaktualizowane emoji %{target} przez %{name} update_domain_block_html: Zaktualizowano blokadę domeny dla %{target} przez %{name} update_ip_block_html: "%{name} stworzył(a) regułę dla IP %{target}" + update_report_html: "%{target} zaktualizowany przez %{name}" update_status_html: "%{name} zaktualizował(a) wpis użytkownika %{target}" update_user_role_html: "%{name} zmienił rolę %{target}" deleted_account: usunięte konto @@ -779,6 +780,7 @@ pl: desc_html: Wymaga użycia zewnętrznych skryptów hCaptcha, co może negatywnie wpływać na bezpieczeństwo i prywatność. Może również przyczynić się do znaczącego utrudnienia procesu rejestracji niektórym, np. niepełnosprawnym, osobom. Dlatego sugeruje się używanie zaproszeń bądź ręcznie potwierdzanie kont. title: W celu potwierdzenia ich kont wymagaj rozwiązania zadania CAPTCHA przez nowych użytkowników content_retention: + danger_zone: Strefa niebezpieczeństwa preamble: Kontroluj, jak treści generowane przez użytkownika są przechowywane w Mastodon. title: Retencja treści default_noindex: @@ -983,7 +985,7 @@ pl: delete: Usuń edit_preset: Edytuj szablon ostrzeżenia empty: Nie zdefiniowano jeszcze żadnych szablonów ostrzegawczych. - title: Zarządzaj szablonami ostrzeżeń + title: Zapisane ostrzeżenia webhooks: add_new: Dodaj punkt końcowy delete: Usuń diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 9cb9cadee..8d3b53f77 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -285,6 +285,7 @@ pt-BR: update_custom_emoji_html: "%{name} atualizou o emoji %{target}" update_domain_block_html: "%{name} atualizou o bloqueio de domínio de %{target}" update_ip_block_html: "%{name} alterou a regra para o IP %{target}" + update_report_html: "%{name} atualizou o relatório %{target}" update_status_html: "%{name} atualizou a publicação de %{target}" update_user_role_html: "%{name} alterou o cargo %{target}" deleted_account: conta excluída @@ -751,6 +752,7 @@ pt-BR: desc_html: Isso é baseado em scripts externos de hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, isso pode tornar o processo de registro significativamente menos acessível para algumas pessoas (especialmente deficientes). Por estas razões, favor considerar medidas alternativas como o registro baseado em aprovação ou em convite. title: Exigir que novos usuários resolvam um CAPTCHA para confirmar sua conta content_retention: + danger_zone: Zona de perigo preamble: Controlar como o conteúdo gerado pelo usuário é armazenado no Mastodon. title: Retenção de conteúdo default_noindex: @@ -949,7 +951,7 @@ pt-BR: delete: Excluir edit_preset: Editar o aviso pré-definido empty: Você ainda não definiu nenhuma predefinição de alerta. - title: Gerenciar os avisos pré-definidos + title: Predefinições de aviso webhooks: add_new: Adicionar endpoint delete: Excluir diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 8e30a27b8..49522b741 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -285,6 +285,7 @@ pt-PT: update_custom_emoji_html: "%{name} atualizou o emoji %{target}" update_domain_block_html: "%{name} atualizou o bloqueio de domínio para %{target}" update_ip_block_html: "%{name} alterou regra para IP %{target}" + update_report_html: "%{name} atualizou a denúncia %{target}" update_status_html: "%{name} atualizou o estado de %{target}" update_user_role_html: "%{name} alterou a função %{target}" deleted_account: conta apagada @@ -751,6 +752,7 @@ pt-PT: desc_html: Isto depende de scripts externos da hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, isto pode tornar o processo de registo menos acessível para algumas pessoas (especialmente as com limitações físicas). Por isso, considere medidas alternativas tais como registo mediante aprovação ou sob convite. title: Requerer que novos utilizadores resolvam um CAPTCHA para confirmar a sua conta content_retention: + danger_zone: Zona de perigo preamble: Controle como o conteúdo gerado pelos utilizadores é armazenado no Mastodon. title: Retenção de conteúdo default_noindex: @@ -949,7 +951,7 @@ pt-PT: delete: Eliminar edit_preset: Editar o aviso predefinido empty: Ainda não definiu nenhum aviso predefinido. - title: Gerir os avisos predefinidos + title: Predefinições de aviso webhooks: add_new: Adicionar endpoint delete: Eliminar diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 1099e3d0d..cd54d5105 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -566,6 +566,7 @@ ro: blocking: Lista de blocare domain_blocking: Listă de blocare domenii following: Lista de urmărire + lists: Liste muting: Lista de ignorare upload: Încarcă invites: @@ -622,6 +623,14 @@ ro: body: 'Postarea ta a fost impulsionată de %{name}:' subject: "%{name} ți-a impulsionat postarea" title: Impuls nou + number: + human: + decimal_units: + units: + billion: B + million: M + quadrillion: Q + thousand: K polls: errors: expired: Sondajul s-a încheiat deja diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 85d8a7a54..d6b8726ba 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -978,7 +978,6 @@ ru: delete: Удалить edit_preset: Удалить шаблон предупреждения empty: Вы еще не определили пресеты предупреждений. - title: Управление шаблонами предупреждений webhooks: add_new: Добавить конечную точку delete: Удалить diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 01c355794..449d8d9c7 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -535,7 +535,6 @@ sc: delete: Cantzella edit_preset: Modìfica s'avisu predefinidu empty: No as cunfiguradu ancora perunu avisu predefinidu. - title: Gesti is cunfiguratziones predefinidas de is avisos webhooks: delete: Cantzella disable: Disativa diff --git a/config/locales/sco.yml b/config/locales/sco.yml index 2a7b1e3e7..7c733b71b 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -842,7 +842,6 @@ sco: delete: Delete edit_preset: Edit warnin preset empty: Ye huvnae definit onie warnin presets yit. - title: Manage warnin presets webhooks: add_new: Add enpynt delete: Delete diff --git a/config/locales/si.yml b/config/locales/si.yml index f5e65fda8..85e242b63 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -66,7 +66,7 @@ si: inbox_url: එන ලිපි URL invite_request_text: එක්වීමට හේතුව invited_by: විසින් ආරාධනා කරන ලදී - ip: අ.ජා. කෙ. (IP) + ip: අ.ජා.කෙ. (IP) joined: එක් වූ දිනය location: all: සියල්ල @@ -87,7 +87,7 @@ si: title: මැදිහත්කරණය moderation_notes: මැදිහත්කරණ සටහන් most_recent_activity: වඩාත්ම මෑත ක්රියාකාරිත්වය - most_recent_ip: මෑත අ.ජා.කෙ. (IP) + most_recent_ip: මෑත අ.ජා.කෙ. no_account_selected: කිසිවක් තෝරා නොගත් බැවින් ගිණුම් කිසිවක් වෙනස් කර නැත no_limits_imposed: සීමාවන් පනවා නැත not_subscribed: දායක වී නැත @@ -160,7 +160,7 @@ si: create_custom_emoji: අභිරුචි ඉමොජි සාදන්න create_domain_allow: වසමකට ඉඩදීම සාදන්න create_email_domain_block: ඊමේල් ඩොමේන් බ්ලොක් එකක් සාදන්න - create_ip_block: අ.ජා. කෙ. (IP) නීතියක් සාදන්න + create_ip_block: අ.ජා.කෙ. නීතියක් සාදන්න create_unavailable_domain: ලබා ගත නොහැකි වසම සාදන්න create_user_role: භූමිකාව සාදන්න demote_user: පරිශීලකයා පහත් කරන්න @@ -473,7 +473,7 @@ si: new: title: නව අ.ජා.කෙ. නීතියක් සාදන්න no_ip_block_selected: IP රීති කිසිවක් තෝරා නොගත් බැවින් වෙනස් කර නැත - title: අ.ජා. කෙ. (IP) නීති + title: අ.ජා.කෙ. (IP) නීති relationships: title: "%{acct}හි සබඳතා" relays: @@ -726,7 +726,6 @@ si: delete: මකන්න edit_preset: අනතුරු ඇඟවීමේ පෙර සැකසුම සංස්කරණය කරන්න empty: ඔබ තවම කිසිදු අනතුරු ඇඟවීමේ පෙරසිටුවක් නිර්වචනය කර නැත. - title: අනතුරු ඇඟවීමේ පෙරසිටුවීම් කළමනාකරණය කරන්න webhooks: add_new: අන්ත ලක්ෂ්‍යය එක් කරන්න delete: මකන්න @@ -1240,7 +1239,7 @@ si: current_session: වත්මන් වාරය description: "%{platform} හි %{browser}" explanation: ඔබගේ මාස්ටඩන් ගිණුමට පිවිසීම සඳහා භාවිතා කර තිබෙන අතිරික්සු. - ip: අ.ජා. කෙ. (IP) + ip: අ.ජා.කෙ. platforms: adobe_air: ඇඩෝබි එයාර් android: ඇන්ඩ්‍රොයිඩ් @@ -1400,7 +1399,7 @@ si: details: 'ප්‍රවේශයට අදාළ විස්තර:' explanation: ඔබගේ ගිණුමට නව අ.ජා.කෙ. (IP) ලිපිනයකින් ප්‍රවේශයක් අනාවරණය වී ඇත. further_actions_html: මේ ඔබ නොවේ නම්, වහාම %{action}. ඔබගේ ගිණුම සුරක්‍ෂිතව තබා ගැනීමට ද්වි-සාධකය සබල කරන්න. - subject: ඔබගේ ගිණුමට නව අ.ජා.කෙ. (IP) ලිපිනයකින් ප්‍රවේශ වී ඇත + subject: ඔබගේ ගිණුමට නව අ.ජා.කෙ. ලිපිනයකින් ප්‍රවේශ වී ඇත title: නව ප්‍රවේශයක් warning: appeal: අභියාචනයක් ඉදිරිපත් කරන්න diff --git a/config/locales/simple_form.an.yml b/config/locales/simple_form.an.yml index 6ec8380f2..e409c39ae 100644 --- a/config/locales/simple_form.an.yml +++ b/config/locales/simple_form.an.yml @@ -66,13 +66,10 @@ an: warn: Amagar lo conteniu filtrau dezaga d'una alvertencia mencionando lo titol d'o filtro form_admin_settings: activity_api_enabled: Conteyo de publicacions locals, usuarios activos y nuevos rechistros en periodos semanals - backups_retention_period: Mantener los fichers d'usuario cheneraus entre lo numero de días especificau. bootstrap_timeline_accounts: Estas cuentas amaneixerán en a parte superior d'as recomendacions d'os nuevos usuarios. closed_registrations_message: Amostrau quan los rechistros son zarraus - content_cache_retention_period: Las publicacions d'atros servidors s'eliminarán dimpués d'o numero especificau de días quan s'estableixca una valor positiva. Esto puede estar irreversible. custom_css: Puetz aplicar estilos personalizaus a la versión web de Mastodon. mascot: Reemplaza la ilustración en a interficie web abanzada. - media_cache_retention_period: Los fichers multimedia descargaus s'eliminarán dimpués d'o numero especificau de días quan s'estableixca una valor positiva, y se redescargarán baixo demanda. peers_api_enabled: Una lista de nombres de dominio que este servidor ha trobau en o Fediverso. Aquí no s'incluye garra dato sobre si federas con un servidor determinau, nomás que lo tuyo servidor lo conoixe. Esto ye emplegau per los servicios que replegan estatisticas sobre la federación en un sentiu cheneral. profile_directory: Lo directorio de perfils lista a totz los usuarios que han optado per que la suya cuenta pueda estar descubierta. require_invite_text: Quan los rechistros requieren aprebación manual, fa obligatoria la dentrada de texto "Per qué quiers unir-te?" en cuenta d'opcional @@ -221,7 +218,6 @@ an: backups_retention_period: Periodo de retención d'o fichero d'usuario bootstrap_timeline_accounts: Recomendar siempre estas cuentas a nuevos usuarios closed_registrations_message: Mensache personalizau quan los rechistros no son disponibles - content_cache_retention_period: Periodo de retención de caché de conteniu custom_css: CSS personalizau mascot: Mascota personalizada (legado) media_cache_retention_period: Periodo de retención de caché multimedia diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index da27fd8dc..370667d48 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -77,13 +77,15 @@ ar: warn: إخفاء المحتوى الذي تم تصفيته خلف تحذير يذكر عنوان الفلتر form_admin_settings: activity_api_enabled: عدد المنشورات المحلية و المستخدمين الناشطين و التسجيلات الأسبوعية الجديدة - backups_retention_period: الاحتفاظ بأرشيف المستخدم الذي تم إنشاؤه لعدد محدد من الأيام. + app_icon: WEBP أو PNG أو GIF أو JPG. يتجاوز أيقونة التطبيق الافتراضية على الجوالات مع أيقونة مخصصة. + backups_retention_period: للمستخدمين القدرة على إنشاء أرشيفات لمنشوراتهم لتحميلها في وقت لاحق. عند التعيين إلى قيمة موجبة، سيتم حذف هذه الأرشيف تلقائياً من وحدة تخزينك بعد عدد الأيام المحدد. bootstrap_timeline_accounts: سيتم تثبيت هذه الحسابات على قمة التوصيات للمستخدمين الجدد. closed_registrations_message: ما سيعرض عند إغلاق التسجيلات - content_cache_retention_period: سيتم حذف كافة المنشورات والمعاد نشرها من الخوادم الأخرى بعد عدد الأيام المحدد. قد لا تكون بعض المنشورات قابلة للاسترداد. كافة الفواصل المرجعية والمفضلات والمعاد نشرها ذات الصلة سوف تضيع ويستحيل التراجع عن هذا الإجراء. + content_cache_retention_period: سيتم حذف جميع المنشورات من الخوادم الأخرى (بما في ذلك التعزيزات والردود) بعد عدد الأيام المحدد، دون أي تفاعل محلي للمستخدم مع هذه المنشورات. وهذا يشمل المنشورات التي قام المستخدم المحلي بوضع علامة عليها كإشارات مرجعية أو المفضلة. وسوف تختفي أيضا الإشارات الخاصة بين المستخدمين من المثيلات المختلفة ويستحيل استعادتها. والغرض من استخدام هذا الإعداد هو مثيلات الغرض الخاص ويفسد الكثير من توقعات المستخدمين عند تنفيذها للاستخدام لأغراض عامة. custom_css: يمكنك تطبيق أساليب مخصصة على نسخة الويب من ماستدون. + favicon: WEBP أو PNG أو GIF أو JPG. يتجاوز أيقونة التطبيق المفضلة الافتراضية مع أيقونة مخصصة. mascot: تجاوز الرسوم التوضيحية في واجهة الويب المتقدمة. - media_cache_retention_period: سيتم حذف ملفات الوسائط التي تم تنزيلها بعد عدد الأيام المحدد عند تعيينها إلى قيمة موجبة، وإعادة تنزيلها عند الطلب. + media_cache_retention_period: ملفات الوسائط من المنشورات التي يقوم بها المستخدمون البعيدون يتم تخزينها في خادمك. عند التعيين إلى قيمة موجبة، سيتم حذف الوسائط بعد عدد الأيام المحدد. إذا كانت بيانات الوسائط مطلوبة بعد حذفها، فسيتم إعادة تحميلها إذا كان محتوى المصدر لا يزال متاحًا. بسبب القيود المفروضة على عدد المرات التي يتم فيها ربط بطاقات المعاينة لمواقع الطرف الثالث، يوصى بتعيين هذه القيمة إلى 14 يوماً على الأقل، أو لن يتم تحديث بطاقات معاينة الرابط عند الطلب قبل ذلك الوقت. peers_api_enabled: قائمة بأسماء النطاقات التي صادفها هذا الخادم في الفدرالية. لا توجد بيانات هنا حول ما إذا كنت تتحد مع خادم معين، فقط أن خادمك يعرف عنها. ويستخدم هذا الخدمات التي تجمع الإحصاءات المتعلقة بالاتحاد بشكل عام. profile_directory: دليل الملف الشخصي يسرد جميع المستخدمين الذين اختاروا الدخول ليكونوا قابلين للاكتشاف. require_invite_text: عندما تتطلب التسجيلات الموافقة اليدوية، اجعل إدخال النص "لماذا تريد الانضمام ؟" إلزاميا بدلا من اختياري @@ -243,7 +245,7 @@ ar: backups_retention_period: فترة الاحتفاظ بأرشيف المستخدم bootstrap_timeline_accounts: أوصي دائما بهذه الحسابات للمستخدمين الجدد closed_registrations_message: رسالة مخصصة عندما يكون التسجيل غير متاح - content_cache_retention_period: مدة الاحتفاظ بالتخزين المؤقت للوسائط + content_cache_retention_period: مدة الاحتفاظ بالمحتوى البعيد custom_css: سي أس أس CSS مخصص mascot: جالب حظ مخصص (قديم) media_cache_retention_period: مدة الاحتفاظ بالتخزين المؤقت للوسائط diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index e39696256..d1950ab15 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -33,11 +33,9 @@ ast: featured_tag: name: 'Equí tán dalgunes de les etiquetes qu''usesti apocayá:' form_admin_settings: - backups_retention_period: Caltién los archivos xeneraos polos perfiles demientres el númberu de díes especificáu. closed_registrations_message: Apaez cuando'l rexistru ta desactiváu custom_css: Pues aplicar estilos personalizaos a la versión web de Mastodon. mascot: Anula la ilustración na interfaz web avanzada. - media_cache_retention_period: Los ficheros multimedia baxaos desaníciense dempués del númberu de díes especificáu al configurar un valor positivu, ya vuelven baxase baxo demanda. require_invite_text: Cuando los rexistros riquen una aprobación manual, el campu «¿Por qué quies xunite?» vuélvese obligatoriu site_extended_description: Cualesquier tipu d'información adicional que pueda ser útil pa visitantes ya pa perfiles rexistraos. El testu pue estructurase cola sintaxis de Mastodon. site_short_description: Un descripción curtia qu'ayuda a identificar de forma única al sirvidor. ¿Quién lu lleva?, ¿pa quién ye? @@ -134,7 +132,6 @@ ast: form_admin_settings: backups_retention_period: Periodu de retención de los archivos de los perfiles closed_registrations_message: Mensaxe personalizáu cuando'l rexistru nun ta disponible - content_cache_retention_period: Periodu de retención de la caché de conteníu media_cache_retention_period: Periodu de retención de la caché multimedia registrations_mode: Quién pue rexistrase require_invite_text: Riquir un motivu pa rexistrase diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 245c1e852..f8000a1c8 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -77,13 +77,10 @@ be: warn: Схаваць адфільтраваны кантэнт за папярэджаннем з назвай фільтру form_admin_settings: activity_api_enabled: Падлік лакальна апублікаваных пастоў, актыўных карыстальнікаў і новых рэгістрацый у тыдзень - backups_retention_period: Захоўваць створаныя архівы карыстальніка адзначаную колькасць дзён. bootstrap_timeline_accounts: Гэтыя ўліковыя запісы будуць замацаваны ў топе рэкамендацый для новых карыстальнікаў. closed_registrations_message: Паказваецца, калі рэгістрацыя закрытая - content_cache_retention_period: Допісы з іншых сервераў будуць выдаляцца пасля выстаўленай колькасці дзён, калі выстаўлены станоўчы лік. Гэта можа быць незваротным. custom_css: Вы можаце прымяняць карыстальніцкія стылі ў вэб-версіі Mastodon. mascot: Замяняе ілюстрацыю ў пашыраным вэб-інтэрфейсе. - media_cache_retention_period: Спампаваныя медыя будуць выдаляцца пасля выстаўленай колькасці дзён, калі выстаўлены станоўчы лік, і спампоўвацца нанова па запыце. peers_api_enabled: Спіс даменных імён, з якімі сутыкнуўся гэты сервер у федэсвеце. Дадзеныя аб тым, ці знаходзіцеся вы з пэўным серверам у федэрацыі, не ўключаныя, ёсць толькі тое, што ваш сервер ведае пра гэта. Гэта выкарыстоўваецца сэрвісамі, якія збіраюць статыстыку па федэрацыі ў агульным сэнсе. profile_directory: Дырэкторыя профіляў змяшчае спіс усіх карыстальнікаў, якія вырашылі быць бачнымі. require_invite_text: Калі рэгістрацыя патрабуе ручнога пацвержання, зрабіце поле "Чаму вы хочаце далучыцца?" абавязковым @@ -243,7 +240,6 @@ be: backups_retention_period: Працягласць захавання архіву карыстальніка bootstrap_timeline_accounts: Заўсёды раіць гэтыя ўліковыя запісы новым карыстальнікам closed_registrations_message: Уласнае паведамленне, калі рэгістрацыя немагчымая - content_cache_retention_period: Працягласць захавання кэшу для змесціва custom_css: CSS карыстальніка mascot: Уласны маскот(спадчына) media_cache_retention_period: Працягласць захавання кэшу для медыя diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index e85e753e8..f14a21b0c 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -77,13 +77,15 @@ bg: warn: Скриване на филтрираното съдържание зад предупреждение, споменавайки заглавието на филтъра form_admin_settings: activity_api_enabled: Броят на местните публикувани публикации, дейни потребители и нови регистрации в седмични кофи - backups_retention_period: Задържане на породените потребителски архиви за определения брой дни. + app_icon: WEBP, PNG, GIF или JPG. Заменя подразбиращата се икона на приложението в мобилни устройства с произволна икона. + backups_retention_period: Потребителите имат способността да пораждат архиви от публикациите си за по-късно изтегляне. Задавайки положителна стойност, тези архиви самодейно ще се изтрият от хранилището ви след определения брой дни. bootstrap_timeline_accounts: Тези акаунти ще се закачат в горния край на препоръките за следване на нови потребители. closed_registrations_message: Показва се, когато е затворено за регистрации - content_cache_retention_period: Всички публикации и подсилвания от други сървъри ще се изтрият след определен брой дни. Някои публикации може да не се възстановят. Всички сродни отметки, любими и подсилвания също ще се загубят и невъзможно да се отмени. + content_cache_retention_period: Всички публикации от други сървъри, включително подсилвания и отговори, ще се изтрият след посочения брой дни, без да се взема предвид каквото и да е взаимодействие на местния потребител с тези публикации. Това включва публикации, които местния потребител е означил като отметки или любими. Личните споменавания между потребители от различни инстанции също ще се загубят и невъзможно да се възстановят. Употребата на тази настройка е предназначена за случаи със специално предназначение и разбива очакванията на много потребители, когато се изпълнява за употреба с общо предназначение. custom_css: Може да прилагате собствени стилове в уебверсията на Mastodon. + favicon: WEBP, PNG, GIF или JPG. Заменя стандартната сайтоикона на Mastodon с произволна икона. mascot: Замества илюстрацията в разширения уеб интерфейс. - media_cache_retention_period: Изтеглените мултимедийни файлове ще се изтрият след посочения брой дни, задавайки положително число, и ще се изтеглят пак при поискване. + media_cache_retention_period: Мултимедийни файлове от публикации, направени от отдалечени потребители, се сринаха в сървъра ви. Задавайки положителна стойност, мултимедията ще се изтрие след посочения брой дни. Ако се искат мултимедийни данни след изтриването, то ще се изтегли пак, ако още е наличен източникът на съдържание. Поради ограниченията за това колко често картите за предварващ преглед на връзките анкетират сайтове на трети страни, се препоръчва да зададете тази стойност на поне 14 дни или картите за предварващ преглед на връзките няма да се обновяват при поискване преди този момент. peers_api_enabled: Списък от имена на домейни, с които сървърът се е свързал във федивселената. Тук не се включват данни за това дали федерирате с даден сървър, а само за това дали сървърът ви знае за него. Това се ползва от услуги, събиращи статистика за федерацията в общия смисъл. profile_directory: Указателят на профили вписва всички потребители, избрали да бъдат откриваеми. require_invite_text: Когато регистрацията изисква ръчно одобрение, то направете текстовото поле за това "Защо желаете да се присъедините?" по-скоро задължително, отколкото по желание @@ -243,7 +245,7 @@ bg: backups_retention_period: Период за съхранение на потребителския архив bootstrap_timeline_accounts: Винаги да се препоръчват следните акаунти на нови потребители closed_registrations_message: Съобщение при неналична регистрация - content_cache_retention_period: Период на съхранение на кеша за съдържание + content_cache_retention_period: Период на запазване на отдалечено съдържание custom_css: Персонализиран CSS mascot: Плашило талисман по избор (остаряло) media_cache_retention_period: Период на запазване на мултимедийния кеш diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index e4bee0214..d3dc4b13f 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -77,13 +77,15 @@ ca: warn: Oculta el contingut filtrat darrere d'un avís mencionant el títol del filtre form_admin_settings: activity_api_enabled: Contador de tuts publicats localment, usuaris actius i registres nous en períodes setmanals - backups_retention_period: Manté els arxius d'usuari generats durant el nombre de dies especificats. + app_icon: WEBP, PNG, GIF o JPG. Canvia la icona per defecte de l'app en dispositius mòbils per una de personalitzada. + backups_retention_period: Els usuaris poden generar arxius de les seves publicacions per a baixar-los més endavant. Quan tingui un valor positiu, els arxius s'esborraran del vostre emmagatzematge després del nombre donat de dies. bootstrap_timeline_accounts: Aquests comptes es fixaran en la part superior de les recomanacions de seguiment dels nous usuaris. closed_registrations_message: Es mostra quan el registres estan tancats - content_cache_retention_period: Els tuts d'altres servidors se suprimiran després del nombre de dies especificat quan s'estableix un valor positiu. Això pot ser irreversible. + content_cache_retention_period: S'esborraran totes les publicacions d'altres servidors (impulsos i respostes inclosos) passats els dies indicats, sense tenir en consideració les interaccions d'usuaris locals amb aquestes publicacions. Això inclou les publicacions que un usuari local hagi marcat com a favorites. També es perdran, i no es podran recuperar, les mencions privades entre usuaris d'instàncies diferents. Aquest paràmetre està pensat per a instàncies amb un propòsit especial i trencarà les expectatives dels usuaris si s'utilitza en una instància convencional. custom_css: Pots aplicar estils personalitzats en la versió web de Mastodon. + favicon: WEBP, PNG, GIF o JPG. Canvia la icona per defecte de Mastodon a la pestanya del navegador per una de personalitzada. mascot: Anul·la la il·lustració en la interfície web avançada. - media_cache_retention_period: Els fitxers multimèdia descarregats s'esborraran després del nombre de dies especificat quan el valor configurat és positiu, i tornats a descarregats sota demanda. + media_cache_retention_period: El vostre servidor conserva una còpia dels fitxers multimèdia de les publicacions dels usuaris remots. Si s'indica un valor positiu, s'esborraran passats els dies indicats. Si el fitxer es torna a demanar un cop esborrat, es tornarà a baixar si el contingut origen segueix disponible. Per causa de les restriccions en la freqüència amb què es poden demanar les targetes de previsualització d'altres servidors, es recomana definir aquest valor com a mínim a 14 dies, o les targetes de previsualització no s'actualizaran a demanda abans d'aquest termini. peers_api_enabled: Una llista de noms de domini que aquest servidor ha trobat al fedivers. No inclou cap dada sobre si estàs federat amb un servidor determinat, només si el teu en sap res. La fan servir, en un sentit general, serveis que recol·lecten estadístiques sobre la federació. profile_directory: El directori de perfils llista tots els usuaris que tenen activat ser descoberts. require_invite_text: Quan el registre requereixi aprovació manual, fes que sigui obligatori en lloc d'opcional d'escriure el text de la sol·licitud d'invitació "Per què vols unir-te?" @@ -243,7 +245,7 @@ ca: backups_retention_period: Període de retenció del arxiu d'usuari bootstrap_timeline_accounts: Recomana sempre aquests comptes als nous usuaris closed_registrations_message: Missatge personalitzat quan el registre no és accessible - content_cache_retention_period: Període de retenció de la memòria cau de contingut + content_cache_retention_period: Període de retenció del contingut remot custom_css: CSS personalitzat mascot: Mascota personalitzada (llegat) media_cache_retention_period: Període de retenció del cau multimèdia diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index f91f82673..0b1a34e1b 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -77,13 +77,15 @@ cs: warn: Schovat filtrovaný obsah za varováním zmiňujicím název filtru form_admin_settings: activity_api_enabled: Počty lokálně zveřejnělých příspěvků, aktivních uživatelů a nových registrací v týdenních intervalech - backups_retention_period: Zachovat generované uživatelské archivy pro zadaný počet dní. + app_icon: WEBP, PNG, GIF nebo JPG. Nahradí výchozí ikonu aplikace v mobilních zařízeních vlastní ikonou. + backups_retention_period: Uživatelé mají možnost vytvářet archivy svých příspěvků, které si mohou stáhnout později. Pokud je nastaveno na kladnou hodnotu, budou tyto archivy po zadaném počtu dní automaticky odstraněny z úložiště. bootstrap_timeline_accounts: Tyto účty budou připnuty na vrchol nových uživatelů podle doporučení. closed_registrations_message: Zobrazeno při zavření registrace - content_cache_retention_period: Příspěvky z jiných serverů budou odstraněny po zadaném počtu dní, pokud je nastavena kladná hodnota. To může být nevratné. + content_cache_retention_period: Všechny příspěvky z jiných serverů (včetně boostů a odpovědí) budou po uplynutí stanoveného počtu dní smazány bez ohledu na interakci místního uživatele s těmito příspěvky. To se týká i příspěvků, které místní uživatel přidal do záložek nebo oblíbených. Soukromé zmínky mezi uživateli z různých instancí budou rovněž ztraceny a nebude možné je obnovit. Použití tohoto nastavení je určeno pro instance pro speciální účely a při implementaci pro obecné použití porušuje mnohá očekávání uživatelů. custom_css: Můžete použít vlastní styly ve verzi Mastodonu. + favicon: WEBP, PNG, GIF nebo JPG. Nahradí výchozí favicon Mastodonu vlastní ikonou. mascot: Přepíše ilustraci v pokročilém webovém rozhraní. - media_cache_retention_period: Stažené mediální soubory budou po zadaném počtu dní odstraněny, pokud je nastavena kladná hodnota, a na požádání znovu staženy. + media_cache_retention_period: Mediální soubory z příspěvků vzdálených uživatelů se ukládají do mezipaměti na vašem serveru. Pokud je nastaveno na kladnou hodnotu, budou média po zadaném počtu dní odstraněna. Pokud jsou mediální data vyžádána po jejich odstranění, budou znovu stažena, pokud je zdrojový obsah stále k dispozici. Vzhledem k omezením týkajícím se četnosti dotazů karet náhledů odkazů na weby třetích stran se doporučuje nastavit tuto hodnotu alespoň na 14 dní, jinak nebudou karty náhledů odkazů na vyžádání aktualizovány dříve. peers_api_enabled: Seznam názvů domén se kterými se tento server setkal ve fediversu. Neobsahuje žádná data o tom, zda jste federovali s daným serverem, pouze že o něm váš server ví. Toto je využíváno službami, které sbírají o federování statistiku v obecném smyslu. profile_directory: Adresář profilu obsahuje seznam všech uživatelů, kteří se přihlásili, aby mohli být nalezeni. require_invite_text: Pokud přihlášení vyžaduje ruční schválení, měl by být textový vstup „Proč se chcete připojit?“ povinný spíše než volitelný @@ -243,7 +245,7 @@ cs: backups_retention_period: Doba uchovávání archivu uživatelů bootstrap_timeline_accounts: Vždy doporučovat tyto účty novým uživatelům closed_registrations_message: Vlastní zpráva, když přihlášení není k dispozici - content_cache_retention_period: Doba uchování mezipaměti obsahu + content_cache_retention_period: Doba uchovávání vzdáleného obsahu custom_css: Vlastní CSS mascot: Vlastní maskot (zastaralé) media_cache_retention_period: Doba uchovávání mezipaměti médií diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 21cd1ddc0..5e8fd8529 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -77,13 +77,15 @@ cy: warn: Cuddiwch y cynnwys wedi'i hidlo y tu ôl i rybudd sy'n sôn am deitl yr hidlydd form_admin_settings: activity_api_enabled: Cyfrif o bostiadau a gyhoeddir yn lleol, defnyddwyr gweithredol, a chofrestriadau newydd mewn bwcedi wythnosol - backups_retention_period: Cadw archifau defnyddwyr a gynhyrchwyd am y nifer penodedig o ddyddiau. + app_icon: WEBP, PNG, GIF neu JPG. Yn diystyru'r eicon ap rhagosodedig ar ddyfeisiau symudol gydag eicon cyfaddas. + backups_retention_period: Mae gan ddefnyddwyr y gallu i gynhyrchu archifau o'u postiadau i'w llwytho i lawr yn ddiweddarach. Pan gânt eu gosod i werth positif, bydd yr archifau hyn yn cael eu dileu'n awtomatig o'ch storfa ar ôl y nifer penodedig o ddyddiau. bootstrap_timeline_accounts: Bydd y cyfrifon hyn yn cael eu pinio i frig argymhellion dilynol defnyddwyr newydd. closed_registrations_message: Yn cael eu dangos pan fydd cofrestriadau wedi cau - content_cache_retention_period: Bydd postiadau o weinyddion eraill yn cael eu dileu ar ôl y nifer penodedig o ddyddiau pan fyddan nhw wedi'u gosod i werth positif. Gall nad oes modd dadwneud hyn. + content_cache_retention_period: Bydd yr holl bostiadau gan weinyddion eraill (gan gynnwys hwb ac atebion) yn cael eu dileu ar ôl y nifer penodedig o ddyddiau, heb ystyried unrhyw ryngweithio defnyddiwr lleol â'r postiadau hynny. Mae hyn yn cynnwys postiadau lle mae defnyddiwr lleol wedi ei farcio fel nodau tudalen neu ffefrynnau. Bydd cyfeiriadau preifat rhwng defnyddwyr o wahanol achosion hefyd yn cael eu colli ac yn amhosibl eu hadfer. Mae'r defnydd o'r gosodiad hwn wedi'i fwriadu ar gyfer achosion pwrpas arbennig ac mae'n torri llawer o ddisgwyliadau defnyddwyr pan gaiff ei weithredu at ddibenion cyffredinol. custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon. + favicon: WEBP, PNG, GIF neu JPG. Yn diystyru'r favicon Mastodon rhagosodedig gydag eicon cyfaddas. mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch. - media_cache_retention_period: Bydd ffeiliau cyfryngau wedi'u llwytho i lawr yn cael eu dileu ar ôl y nifer penodedig o ddyddiau pan gânt eu gosod i werth cadarnhaol, a'u hail-lwytho i lawr ar alw. + media_cache_retention_period: Mae ffeiliau cyfryngau o bostiadau a wneir gan ddefnyddwyr o bell yn cael eu storio ar eich gweinydd. Pan gaiff ei osod i werth positif, bydd y cyfryngau yn cael eu dileu ar ôl y nifer penodedig o ddyddiau. Os gofynnir am y data cyfryngau ar ôl iddo gael ei ddileu, caiff ei ail-lwytho i lawr, os yw'r cynnwys ffynhonnell yn dal i fod ar gael. Oherwydd cyfyngiadau ar ba mor aml y mae cardiau rhagolwg cyswllt yn pleidleisio i wefannau trydydd parti, argymhellir gosod y gwerth hwn i o leiaf 14 diwrnod, neu ni fydd cardiau rhagolwg cyswllt yn cael eu diweddaru ar alw cyn yr amser hwnnw. peers_api_enabled: Rhestr o enwau parth y mae'r gweinydd hwn wedi dod ar eu traws yn y ffediws. Nid oes unrhyw ddata wedi'i gynnwys yma ynghylch a ydych chi'n ffedereiddio â gweinydd penodol, dim ond bod eich gweinydd yn gwybod amdano. Defnyddir hwn gan wasanaethau sy'n casglu ystadegau ar ffedereiddio mewn ystyr cyffredinol. profile_directory: Mae'r cyfeiriadur proffil yn rhestru'r holl ddefnyddwyr sydd wedi dewis i fod yn ddarganfyddiadwy. require_invite_text: Pan fydd angen cymeradwyaeth â llaw ar gyfer cofrestriadau, gwnewch y “Pam ydych chi am ymuno?” mewnbwn testun yn orfodol yn hytrach na dewisol @@ -243,7 +245,7 @@ cy: backups_retention_period: Cyfnod cadw archif defnyddwyr bootstrap_timeline_accounts: Argymhellwch y cyfrifon hyn i ddefnyddwyr newydd bob amser closed_registrations_message: Neges bersonol pan nad yw cofrestriadau ar gael - content_cache_retention_period: Cyfnod cadw storfa cynnwys + content_cache_retention_period: Cyfnod cadw cynnwys o bell custom_css: CSS cyfaddas mascot: Mascot cyfaddas (hen) media_cache_retention_period: Cyfnod cadw storfa cyfryngau diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 6c8d995bf..0719e2643 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -77,13 +77,15 @@ da: warn: Skjul filtreret indhold bag en advarsel, der nævner filterets titel form_admin_settings: activity_api_enabled: Antal lokalt opslåede indlæg, aktive brugere samt nye tilmeldinger i ugentlige opdelinger - backups_retention_period: Behold genererede brugerarkiver i det angivne antal dage. + app_icon: WEBP, PNG, GIF eller JPG. Tilsidesætter standard app-ikonet på mobilenheder med et tilpasset ikon. + backups_retention_period: Brugere har mulighed for at generere arkiver af deres indlæg til senere downloade. Når sat til positiv værdi, vil disse arkiver automatisk blive slettet fra lagerpladsen efter det angivne antal dage. bootstrap_timeline_accounts: Disse konti fastgøres øverst på nye brugeres følg-anbefalinger. closed_registrations_message: Vises, når tilmeldinger er lukket - content_cache_retention_period: Indlæg fra andre servere slettes efter det angivne antal dage, når sat til en positiv værdi. Dette kan være irreversibelt. + content_cache_retention_period: Alle indlæg fra andre servere (herunder boosts og besvarelser) slettes efter det angivne antal dage uden hensyn til lokal brugerinteraktion med disse indlæg. Dette omfatter indlæg, hvor en lokal bruger har markeret dem som bogmærker eller favoritter. Private omtaler mellem brugere fra forskellige instanser vil også være tabt og umulige at gendanne. Brugen af denne indstilling er beregnet til særlige formål instanser og bryder mange brugerforventninger ved implementering til almindelig brug. custom_css: Man kan anvende tilpassede stilarter på Mastodon-webversionen. + favicon: WEBP, PNG, GIF eller JPG. Tilsidesætter standard Mastodon favikonet på mobilenheder med et tilpasset ikon. mascot: Tilsidesætter illustrationen i den avancerede webgrænseflade. - media_cache_retention_period: Downloadede mediefiler slettes efter det angivne antal dage, når sat til en positiv værdi, og gendownloades på forlangende. + media_cache_retention_period: Mediefiler fra indlæg oprettet af eksterne brugere er cachet på din server. Når sat til positiv værdi, slettes medier efter det angivne antal dage. Anmodes om mediedata efter de er slettet, gendownloades de, hvis kildeindholdet stadig er tilgængeligt. Grundet begrænsninger på, hvor ofte linkforhåndsvisningskort forespørger tredjeparts websteder, anbefales det at sætte denne værdi til mindst 14 dage, ellers opdateres linkforhåndsvisningskort ikke efter behov før det tidspunkt. peers_api_enabled: En liste med domænenavne, som denne server har stødt på i fediverset. Ingen data inkluderes her om, hvorvidt der fødereres med en given server, blot at din server kender til det. Dette bruges af tjenester, som indsamler generelle føderationsstatistikker. profile_directory: Profilmappen oplister alle brugere, som har valgt at kunne opdages. require_invite_text: Når tilmelding kræver manuel godkendelse, så gør “Hvorfor ønsker du at deltage?” tekstinput obligatorisk i stedet for valgfrit @@ -243,7 +245,7 @@ da: backups_retention_period: Brugerarkivs opbevaringsperiode bootstrap_timeline_accounts: Anbefal altid disse konti til nye brugere closed_registrations_message: Tilpasset besked, når tilmelding er utilgængelig - content_cache_retention_period: Indholds-cache opbevaringsperiode + content_cache_retention_period: Opbevaringsperiode for eksternt indhold custom_css: Tilpasset CSS mascot: Tilpasset maskot (ældre funktion) media_cache_retention_period: Media-cache opbevaringsperiode diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 1d3fba787..7d3978669 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -77,13 +77,15 @@ de: warn: Den gefilterten Beitrag hinter einer Warnung, die den Filtertitel beinhaltet, ausblenden form_admin_settings: activity_api_enabled: Anzahl der wöchentlichen Beiträge, aktiven Profile und Registrierungen auf diesem Server - backups_retention_period: Behalte die Archive, die von den Benutzer*innen erstellt worden sind, für die angegebene Anzahl an Tagen. + app_icon: WEBP, PNG, GIF oder JPG. Überschreibt das Standard-App-Symbol auf mobilen Geräten mit einem eigenen Symbol. + backups_retention_period: Nutzer*innen haben die Möglichkeit, Archive ihrer Beiträge zu erstellen, die sie später herunterladen können. Wenn ein positiver Wert gesetzt ist, werden diese Archive nach der festgelegten Anzahl von Tagen automatisch aus deinem Speicher gelöscht. bootstrap_timeline_accounts: Diese Konten werden bei den Follower-Empfehlungen für neu registrierte Nutzer*innen oben angeheftet. closed_registrations_message: Wird angezeigt, wenn Registrierungen deaktiviert sind - content_cache_retention_period: Sowohl alle Beiträge als auch geteilte Beiträge von anderen Servern werden nach der angegebenen Anzahl von Tagen gelöscht. Alle zugehörigen Lesezeichen, Favoriten und geteilte Beiträge werden ebenfalls verloren gehen. Dies kann nicht mehr rückgängig gemacht werden. + content_cache_retention_period: Sämtliche Beiträge von anderen Servern (einschließlich geteilte Beiträge und Antworten) werden, unabhängig von der Interaktion der lokalen Nutzer*innen mit diesen Beiträgen, nach der festgelegten Anzahl von Tagen gelöscht. Das betrifft auch Beiträge, die von lokalen Nutzer*innen favorisiert oder als Lesezeichen gespeichert wurden. Private Erwähnungen zwischen Nutzer*innen von verschiedenen Servern werden ebenfalls verloren gehen und können nicht wiederhergestellt werden. Das Verwenden dieser Option richtet sich ausschließlich an Server für spezielle Zwecke und wird die allgemeine Nutzungserfahrung beeinträchtigen, wenn sie für den allgemeinen Gebrauch aktiviert ist. custom_css: Du kannst benutzerdefinierte Stile auf die Web-Version von Mastodon anwenden. + favicon: WEBP, PNG, GIF oder JPG. Überschreibt das Standard-Mastodon-Favicon mit einem eigenen Symbol. mascot: Überschreibt die Abbildung in der erweiterten Weboberfläche. - media_cache_retention_period: Von anderen Servern übertragene Mediendateien werden nach der angegebenen Anzahl an Tagen – sofern das Feld eine positive Zahl enthält – aus dem Cache gelöscht und bei Bedarf erneut heruntergeladen. + media_cache_retention_period: Mediendateien aus Beiträgen von externen Nutzer*innen werden auf deinem Server zwischengespeichert. Wenn ein positiver Wert gesetzt ist, werden die Medien nach der festgelegten Anzahl von Tagen gelöscht. Sollten die Medien nach dem Löschvorgang wieder angefragt werden, werden sie erneut heruntergeladen, sofern der ursprüngliche Inhalt noch vorhanden ist. Es wird empfohlen, diesen Wert auf mindestens 14 Tage festzulegen, da die Häufigkeit der Abfrage von Linkvorschaukarten für Websites von Dritten begrenzt ist und die Linkvorschaukarten sonst nicht vor Ablauf dieser Zeit aktualisiert werden. peers_api_enabled: Eine Liste von Domains, die diesem Server im Fediverse begegnet sind. Hierbei werden keine Angaben darüber gemacht, ob du mit einem bestimmten Server föderierst, sondern nur, dass dein Server davon weiß. Dies wird von Diensten verwendet, die allgemein Statistiken übers Ferdiverse sammeln. profile_directory: Dieses Verzeichnis zeigt alle Profile an, die sich dafür entschieden haben, entdeckt zu werden. require_invite_text: Wenn Registrierungen eine manuelle Genehmigung erfordern, dann werden Nutzer einen Grund für ihre Registrierung angeben müssen @@ -243,7 +245,7 @@ de: backups_retention_period: Aufbewahrungsfrist für Archive bootstrap_timeline_accounts: Neuen Nutzern immer diese Konten empfehlen closed_registrations_message: Nachricht, falls Registrierungen deaktiviert sind - content_cache_retention_period: Aufbewahrungsfrist für Inhalte im Cache + content_cache_retention_period: Aufbewahrungsfrist für externe Inhalte custom_css: Eigenes CSS mascot: Benutzerdefiniertes Maskottchen (Legacy) media_cache_retention_period: Aufbewahrungsfrist für Medien im Cache diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 4ffc496d0..29b9f59e1 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -67,13 +67,10 @@ el: warn: Απόκρυψη φιλτραρισμένου περιεχομένου πίσω από μια προειδοποίηση που αναφέρει τον τίτλο του φίλτρου form_admin_settings: activity_api_enabled: Καταμέτρηση τοπικά δημοσιευμένων δημοσιεύσεων, ενεργών χρηστών και νέων εγγραφών σε εβδομαδιαία πακέτα - backups_retention_period: Διατήρηση αρχείων χρηστών που δημιουργήθηκαν για τον καθορισμένο αριθμό ημερών. bootstrap_timeline_accounts: Αυτοί οι λογαριασμοί θα καρφιτσωθούν στην κορυφή των νέων χρηστών που ακολουθούν τις συστάσεις. closed_registrations_message: Εμφανίζεται όταν κλείνουν οι εγγραφές - content_cache_retention_period: Αναρτήσεις από άλλους διακομιστές θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών όταν οριστεί μια θετική τιμή. Αυτό μπορεί να είναι μη αναστρέψιμο. custom_css: Μπορείς να εφαρμόσεις προσαρμοσμένα στυλ στην έκδοση ιστοσελίδας του Mastodon. mascot: Παρακάμπτει την εικονογραφία στην προηγμένη διεπαφή ιστού. - media_cache_retention_period: Τα ληφθέντα αρχεία πολυμέσων θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών, όταν οριστεί σε θετική τιμή, και να γίνει εκ νέου λήψη κατά απαίτηση. peers_api_enabled: Μια λίστα με ονόματα τομέα που συνάντησε αυτός ο διακομιστής στο fediverse. Δεν περιλαμβάνονται δεδομένα εδώ για το αν συναλλάσσετε με ένα συγκεκριμένο διακομιστή, μόνο ότι ο διακομιστής σας το ξέρει. Χρησιμοποιείται από υπηρεσίες που συλλέγουν στατιστικά στοιχεία για την συναλλαγή με γενική έννοια. profile_directory: Ο κατάλογος προφίλ παραθέτει όλους τους χρήστες που έχουν επιλέξει να είναι ανακαλύψιμοι. require_invite_text: 'Όταν η εγγραφή απαιτεί χειροκίνητη έγκριση, κάνε το πεδίο κειμένου: «Γιατί θέλετε να συμμετάσχετε;» υποχρεωτικό αντί για προαιρετικό' @@ -224,7 +221,6 @@ el: backups_retention_period: Περίοδος αρχειοθέτησης του χρήστη bootstrap_timeline_accounts: Πρότεινε πάντα αυτούς τους λογαριασμούς σε νέους χρήστες closed_registrations_message: Προσαρμοσμένο μήνυμα όταν οι εγγραφές δεν είναι διαθέσιμες - content_cache_retention_period: Περίοδος διατήρησης προσωρινής μνήμης περιεχομένου custom_css: Προσαρμοσμένο CSS mascot: Προσαρμοσμένη μασκότ (απαρχαιωμένο) media_cache_retention_period: Περίοδος διατήρησης προσωρινής μνήμης πολυμέσων diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index e5c9b1b2b..eaf0501a2 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -77,13 +77,15 @@ en-GB: warn: Hide the filtered content behind a warning mentioning the filter's title form_admin_settings: activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets - backups_retention_period: Keep generated user archives for the specified number of days. + app_icon: WEBP, PNG, GIF or JPG. Overrides the default app icon on mobile devices with a custom icon. + backups_retention_period: Users have the ability to generate archives of their posts to download later. When set to a positive value, these archives will be automatically deleted from your storage after the specified number of days. bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations. closed_registrations_message: Displayed when sign-ups are closed - content_cache_retention_period: Posts from other servers will be deleted after the specified number of days when set to a positive value. This may be irreversible. + content_cache_retention_period: All posts from other servers (including boosts and replies) will be deleted after the specified number of days, without regard to any local user interaction with those posts. This includes posts where a local user has marked it as bookmarks or favorites. Private mentions between users from different instances will also be lost and impossible to restore. Use of this setting is intended for special purpose instances and breaks many user expectations when implemented for general purpose use. custom_css: You can apply custom styles on the web version of Mastodon. + favicon: WEBP, PNG, GIF or JPG. Overrides the default Mastodon favicon with a custom icon. mascot: Overrides the illustration in the advanced web interface. - media_cache_retention_period: Downloaded media files will be deleted after the specified number of days when set to a positive value, and re-downloaded on demand. + media_cache_retention_period: Media files from posts made by remote users are cached on your server. When set to a positive value, media will be deleted after the specified number of days. If the media data is requested after it is deleted, it will be re-downloaded, if the source content is still available. Due to restrictions on how often link preview cards poll third-party sites, it is recommended to set this value to at least 14 days, or link preview cards will not be updated on demand before that time. peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense. profile_directory: The profile directory lists all users who have opted-in to be discoverable. require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional @@ -243,7 +245,7 @@ en-GB: backups_retention_period: User archive retention period bootstrap_timeline_accounts: Always recommend these accounts to new users closed_registrations_message: Custom message when sign-ups are not available - content_cache_retention_period: Content cache retention period + content_cache_retention_period: Remote content retention period custom_css: Custom CSS mascot: Custom mascot (legacy) media_cache_retention_period: Media cache retention period diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 7304bdc22..fdc9f6181 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -77,11 +77,13 @@ en: warn: Hide the filtered content behind a warning mentioning the filter's title form_admin_settings: activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets + app_icon: WEBP, PNG, GIF or JPG. Overrides the default app icon on mobile devices with a custom icon. backups_retention_period: Users have the ability to generate archives of their posts to download later. When set to a positive value, these archives will be automatically deleted from your storage after the specified number of days. bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations. closed_registrations_message: Displayed when sign-ups are closed content_cache_retention_period: All posts from other servers (including boosts and replies) will be deleted after the specified number of days, without regard to any local user interaction with those posts. This includes posts where a local user has marked it as bookmarks or favorites. Private mentions between users from different instances will also be lost and impossible to restore. Use of this setting is intended for special purpose instances and breaks many user expectations when implemented for general purpose use. custom_css: You can apply custom styles on the web version of Mastodon. + favicon: WEBP, PNG, GIF or JPG. Overrides the default Mastodon favicon with a custom icon. mascot: Overrides the illustration in the advanced web interface. media_cache_retention_period: Media files from posts made by remote users are cached on your server. When set to a positive value, media will be deleted after the specified number of days. If the media data is requested after it is deleted, it will be re-downloaded, if the source content is still available. Due to restrictions on how often link preview cards poll third-party sites, it is recommended to set this value to at least 14 days, or link preview cards will not be updated on demand before that time. peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense. diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index ef4641d3e..e83f71a2c 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -75,13 +75,10 @@ eo: warn: Kaŝi la enhavon filtritan malantaŭ averto mencianta la nomon de la filtro form_admin_settings: activity_api_enabled: Nombroj de loke publikigitaj afiŝoj, aktivaj uzantoj kaj novaj registradoj en semajnaj siteloj - backups_retention_period: Konservi generitajn uzantoarkivojn por la kvanto de tagoj. bootstrap_timeline_accounts: Ĉi tiuj kontoj pinglitas al la supro de sekvorekomendoj de novaj uzantoj. closed_registrations_message: Montrita kiam registroj fermitas - content_cache_retention_period: Mesaĝoj de aliaj serviloj forigitas post la kvanto de tagoj kiam fiksitas al pozitiva nombro. custom_css: Vi povas meti propajn stilojn en la retversio de Mastodon. mascot: Anstatauigi la ilustraĵon en la altnivela retinterfaco. - media_cache_retention_period: Elŝutitaj audovidaĵojn forigotas post la kvanto de tagoj kiam fiksitas al pozitiva nombro. peers_api_enabled: Listo de domajnaj nomoj kiujn ĉi tiu servilo renkontis en la fediverso. Neniuj datumoj estas inkluditaj ĉi tie pri ĉu vi federacias kun donita servilo, nur ke via servilo scias pri ĝi. Ĉi tio estas uzata de servoj kiuj kolektas statistikojn pri federacio en ĝenerala signifo. profile_directory: La profilujo listigas ĉiujn uzantojn kiu volonte malkovrebli. require_invite_text: Kiam registroj bezonas permanan aprobon, igi la "Kial vi volas aliĝi?" tekstoenigon deviga anstau nedeviga @@ -240,7 +237,6 @@ eo: backups_retention_period: Uzantoarkivretendauro bootstrap_timeline_accounts: Ĉiam rekomendi ĉi tiujn kontojn al novaj uzantoj closed_registrations_message: Kutima mesaĝo kiam registroj ne estas disponeblaj - content_cache_retention_period: Enhavkaŝaĵretendauro custom_css: Propa CSS mascot: Propa maskoto media_cache_retention_period: Audovidaĵkaŝaĵretendauro diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 011162408..e346a23a0 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -77,13 +77,15 @@ es-AR: warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro form_admin_settings: activity_api_enabled: Conteos de mensajes publicados localmente, cuentas activas y nuevos registros en tandas semanales - backups_retention_period: Conservar los archivos historiales generados por el usuario durante el número de días especificado. + app_icon: WEBP, PNG, GIF o JPG. Reemplaza el ícono de aplicación predeterminado en dispositivos móviles con uno personalizado. + backups_retention_period: Los usuarios tienen la capacidad de generar archivos historiales de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente de su almacenamiento después del número especificado de días. bootstrap_timeline_accounts: Estas cuentas serán fijadas a la parte superior de las recomendaciones de cuentas a seguir para nuevos usuarios. closed_registrations_message: Mostrado cuando los registros están cerrados - content_cache_retention_period: Todos los mensajes y adhesiones de otros servidores se eliminarán después del número especificado de días. Es posible que algunos mensajes no sean recuperables. Todos los marcadores relacionados, mensajes marcados como favoritos y adhesiones también se perderán y será imposible de deshacer. + content_cache_retention_period: Todos los mensajes de otros servidores (incluyendo adhesiones y respuestas) se eliminarán después del número de días especificado, sin tener en cuenta la interacción del usuario local con esos mensajes. Esto incluye mensajes que un usuario local haya agregado a marcadores o los haya marcado como favoritos. Las menciones privadas entre usuarios de diferentes servidores también se perderán y también serán imposibles de restaurar. El uso de esta configuración está destinado a servidores de propósito especial y rompe muchas expectativas de los usuarios cuando se implementa para uso general. custom_css: Podés aplicar estilos personalizados a la versión web de Mastodon. + favicon: WEBP, PNG, GIF o JPG. Reemplaza el favicón predeterminado de Mastodon con uno personalizado. mascot: Reemplaza la ilustración en la interface web avanzada. - media_cache_retention_period: Los archivos de medios descargados se eliminarán después del número especificado de días cuando se establezca un valor positivo, y se volverán a descargar a pedido. + media_cache_retention_period: Los archivos de medios de mensajes publicados por usuarios remotos se almacenan en la memoria caché en tu servidor. Cuando se establece un valor positivo, los medios se eliminarán después del número especificado de días. Si los datos multimedia se solicitan después de eliminarse, se volverán a descargar, si es que el contenido fuente todavía está disponible. Debido a restricciones en la frecuencia con la que las tarjetas de previsualización de enlace consultan a sitios web de terceros, se recomienda establecer este valor a, al menos, 14 días, o las tarjetas de previsualización de enlaces no se actualizarán a pedido antes de ese momento. peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el Fediverso. Acá no se incluye ningún dato sobre si federás con un servidor determinado, sólo que tu servidor lo conoce. Esto es usado por los servicios que recopilan estadísticas sobre la federación en un sentido general. profile_directory: El directorio de perfiles lista a todos los usuarios que han optado a que su cuenta pueda ser descubierta. require_invite_text: Cuando registros aprobación manual, hacé que la solicitud de invitación "¿Por qué querés unirte?" sea obligatoria, en vez de opcional @@ -243,7 +245,7 @@ es-AR: backups_retention_period: Período de retención del archivo historial del usuario bootstrap_timeline_accounts: Siempre recomendar estas cuentas a usuarios nuevos closed_registrations_message: Mensaje personalizado cuando los registros no están disponibles - content_cache_retention_period: Período de retención de la caché de contenido + content_cache_retention_period: Período de retención de contenido remoto custom_css: CSS personalizado mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de la caché de medios diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 28253d385..b3c8a857e 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -77,13 +77,15 @@ es-MX: warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro form_admin_settings: activity_api_enabled: Conteo de publicaciones publicadas localmente, usuarios activos, y nuevos registros en periodos semanales - backups_retention_period: Mantener los archivos de usuario generados durante el número de días especificado. + app_icon: WEBP, PNG, GIF o JPG. Reemplaza el icono de aplicación predeterminado en dispositivos móviles con un icono personalizado. + backups_retention_period: Los usuarios tienen la capacidad de generar archivos de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente del almacenamiento después del número de días especificado. bootstrap_timeline_accounts: Estas cuentas aparecerán en la parte superior de las recomendaciones de los nuevos usuarios. closed_registrations_message: Mostrado cuando los registros están cerrados - content_cache_retention_period: Las publicaciones de otros servidores se eliminarán después del número especificado de días cuando se establezca un valor positivo. Esto puede ser irreversible. + content_cache_retention_period: Todas las publicaciones de otros servidores (incluso impulsos y respuestas) se eliminarán después del número de días especificado, sin tener en cuenta la interacción del usuario local con esos mensajes. Esto incluye mensajes donde un usuario local los ha marcado como marcadores o favoritos. Las menciones privadas entre usuarios de diferentes instancias también se perderán sin posibilidad de recuperación. El uso de esta configuración está destinado a instancias de propósito especial, y rompe muchas expectativas de los usuarios cuando se implementa para un uso de propósito general. custom_css: Puedes aplicar estilos personalizados a la versión web de Mastodon. + favicon: WEBP, PNG, GIF o JPG. Reemplaza el favicon predeterminado de Mastodon con un icono personalizado. mascot: Reemplaza la ilustración en la interfaz web avanzada. - media_cache_retention_period: Los archivos multimedia descargados se eliminarán después del número especificado de días cuando se establezca un valor positivo, y se redescargarán bajo demanda. + media_cache_retention_period: Los archivos multimedia de las publicaciones creadas por usuarios remotos se almacenan en caché en tu servidor. Cuando se establece un valor positivo, estos archivos se eliminarán después del número especificado de días. Si los datos multimedia se solicitan después de eliminarse, se volverán a descargar, si el contenido fuente todavía está disponible. Debido a restricciones en la frecuencia con la que las tarjetas de previsualización de enlaces realizan peticiones a sitios de terceros, se recomienda establecer este valor a al menos 14 días, o las tarjetas de previsualización de enlaces no se actualizarán bajo demanda antes de ese momento. peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el fediverso. Aquí no se incluye ningún dato sobre si usted federa con un servidor determinado, sólo que su servidor lo sabe. Esto es utilizado por los servicios que recopilan estadísticas sobre la federación en un sentido general. profile_directory: El directorio de perfiles lista a todos los usuarios que han optado por que su cuenta pueda ser descubierta. require_invite_text: Cuando los registros requieren aprobación manual, hace obligatoria la entrada de texto "¿Por qué quieres unirte?" en lugar de opcional @@ -243,7 +245,7 @@ es-MX: backups_retention_period: Período de retención del archivo de usuario bootstrap_timeline_accounts: Recomendar siempre estas cuentas a nuevos usuarios closed_registrations_message: Mensaje personalizado cuando los registros no están disponibles - content_cache_retention_period: Período de retención de caché de contenido + content_cache_retention_period: Período de retención de contenido remoto custom_css: CSS personalizado mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de caché multimedia diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 008ac1607..2fb5cab98 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -77,13 +77,15 @@ es: warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro form_admin_settings: activity_api_enabled: Conteo de publicaciones publicadas localmente, usuarios activos y registros nuevos cada semana - backups_retention_period: Mantener los archivos de usuario generados durante el número de días especificado. + app_icon: WEBP, PNG, GIF o JPG. Reemplaza el icono de aplicación predeterminado en dispositivos móviles con un icono personalizado. + backups_retention_period: Los usuarios tienen la capacidad de generar archivos de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente del almacenamiento después del número de días especificado. bootstrap_timeline_accounts: Estas cuentas aparecerán en la parte superior de las recomendaciones de los nuevos usuarios. closed_registrations_message: Mostrado cuando los registros están cerrados - content_cache_retention_period: Las publicaciones de otros servidores se eliminarán después del número especificado de días cuando se establezca un valor positivo. Esto puede ser irreversible. + content_cache_retention_period: Todas las publicaciones de otros servidores (incluso impulsos y respuestas) se eliminarán después del número de días especificado, sin tener en cuenta la interacción del usuario local con esos mensajes. Esto incluye mensajes donde un usuario local los ha marcado como marcadores o favoritos. Las menciones privadas entre usuarios de diferentes instancias también se perderán sin posibilidad de recuperación. El uso de esta configuración está destinado a instancias de propósito especial, y rompe muchas expectativas de los usuarios cuando se implementa para un uso de propósito general. custom_css: Puedes aplicar estilos personalizados a la versión web de Mastodon. + favicon: WEBP, PNG, GIF o JPG. Reemplaza el favicon predeterminado de Mastodon con un icono personalizado. mascot: Reemplaza la ilustración en la interfaz web avanzada. - media_cache_retention_period: Los archivos multimedia descargados se eliminarán después del número especificado de días cuando se establezca un valor positivo, y se redescargarán bajo demanda. + media_cache_retention_period: Los archivos multimedia de las publicaciones creadas por usuarios remotos se almacenan en caché en tu servidor. Cuando se establece un valor positivo, estos archivos se eliminarán después del número especificado de días. Si los datos multimedia se solicitan después de eliminarse, se volverán a descargar, si el contenido fuente todavía está disponible. Debido a restricciones en la frecuencia con la que las tarjetas de previsualización de enlaces realizan peticiones a sitios de terceros, se recomienda establecer este valor a al menos 14 días, o las tarjetas de previsualización de enlaces no se actualizarán bajo demanda antes de ese momento. peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el Fediverso. Aquí no se incluye ningún dato sobre si federas con un servidor determinado, solo que tu servidor lo conoce. Esto es utilizado por los servicios que recopilan estadísticas sobre la federación en un sentido general. profile_directory: El directorio de perfiles lista a todos los usuarios que han optado por que su cuenta pueda ser descubierta. require_invite_text: Cuando los registros requieren aprobación manual, hace obligatoria la entrada de texto "¿Por qué quieres unirte?" en lugar de opcional @@ -243,7 +245,7 @@ es: backups_retention_period: Período de retención del archivo de usuario bootstrap_timeline_accounts: Recomendar siempre estas cuentas a nuevos usuarios closed_registrations_message: Mensaje personalizado cuando los registros no están disponibles - content_cache_retention_period: Período de retención de caché de contenido + content_cache_retention_period: Período de retención de contenido remoto custom_css: CSS personalizado mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de caché multimedia diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 1f7d94004..b2ad4c51c 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -77,13 +77,10 @@ et: warn: Varja filtreeritud sisu hoiatusega, nimetades filtri pealkirja form_admin_settings: activity_api_enabled: Kohalike postituste, aktiivsete kasutajate ja uute registreerumistr arv nädala kaupa grupeeritult - backups_retention_period: Talleta genereeritud kasutajaarhiivid määratud arv päevi. bootstrap_timeline_accounts: Need kasutajad kinnitatakse uute kasutajate jälgimissoovituste esiritta. closed_registrations_message: Kuvatakse, kui liitumised pole võimalikud - content_cache_retention_period: Teiste serverite postitused kustutatakse pärast määratud päevade arvu, kui see on seatud positiivsele väärtusele. See võib olla pöördumatu. custom_css: Kohandatud stiile on võimalik kasutada Mastodoni veebiliideses. mascot: Asendab kohandatud veebiliidese illustratsiooni. - media_cache_retention_period: Positiivse väärtuse korral kustutatakse allalaetud meediafailid määratud päevade möödudes. Vajadusel laaditakse need uuesti alla. peers_api_enabled: Domeeninimede loetelu, mida see server on Fediversumis kohanud. Mitte mingeid andmeid selle serveri födereerumise kohta antud serverite pole, vaid üksnes info, et sellest serverist ollakse teadlik. Seda kasutavad teenused, mis koguvad üldist födereerumise statistikat. profile_directory: Kasutajate kataloog kuvab nimekirja kasutajatest, kes on seda lubanud. require_invite_text: Kui liitumisi on tarvis kinnitada, oleks "Miks soovid liituda?" vastus vajalik @@ -243,7 +240,6 @@ et: backups_retention_period: Kasutajate arhiivi talletusperiood bootstrap_timeline_accounts: Alati soovita neid kontosid uutele kasutajatele closed_registrations_message: Kohandatud teade, kui liitumine pole võimalik - content_cache_retention_period: Meediapuhvri talletusperiood custom_css: Kohandatud CSS mascot: Kohandatud maskott (kunagine) media_cache_retention_period: Meediapuhvri talletusperiood diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 5ed3b9efa..8c467bc9b 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -77,13 +77,15 @@ eu: warn: Ezkutatu iragazitako edukia iragazkiaren izenburua duen abisu batekin form_admin_settings: activity_api_enabled: Lokalki argitaratutako bidalketak, erabiltzaile aktiboak, eta izen-emateen kopuruak astero zenbatzen ditu - backups_retention_period: Mantendu sortutako erabiltzailearen artxiboa zehazturiko egun kopuruan. + app_icon: WEBP, PNG, GIF edo JPG. Aplikazioaren ikono lehenetsia gainidazten du ikono pertsonalizatu batekin gailu mugikorretan. + backups_retention_period: Erabiltzaileek geroago deskarga dezaketen beren argitalpenen artxiboak sor ditzakete. Balio positibo bat ezartzean, artxibo hauek biltegiratzetik automatikoki ezabatuko dira zehazturiko egunen buruan. bootstrap_timeline_accounts: Kontu hauek erabiltzaile berrien jarraitzeko gomendioen goiko aldean ainguratuko dira. closed_registrations_message: Izen-ematea itxia dagoenean bistaratua - content_cache_retention_period: Balio positibo bat ezarriz gero, egun kopuru horretara iristean beste zerbitzarietako bidalketak ezabatuko dira. Hau ezin da desegin. + content_cache_retention_period: Beste zerbitzarietako argitalpen guztiak (bultzadak eta erantzunak barne) ezabatuko dira zehazturiko egunen buruan, argitalpen horiek izan ditzaketen erabiltzaile lokalaren interakzioa kontuan izanik gabe. Instantzia desberdinetako erabiltzaileen arteko aipamen pribatuak ere galdu egingo dira eta ezin izango dira berreskuratu. Ezarpen honen erabilera xede berezia duten instantziei zuzendua dago eta erabiltzaileen itxaropena hausten da orotariko erabilerarako inplementatzean. custom_css: Estilo pertsonalizatuak aplikatu ditzakezu Mastodonen web bertsioan. + favicon: WEBP, PNG, GIF or JPG. Mastodon-en favicon-a gainidazten du ikono pertsonalizatu batekin. mascot: Web interfaze aurreratuko ilustrazioa gainidazten du. - media_cache_retention_period: Balio positibo bat ezarriz gero, egun kopuru horretara iristean beste zerbitzarietatik deskargatutako multimedia fitxategiak ezabatuko dira. Ondoren, eskatu ahala deskargatuko dira berriz. + media_cache_retention_period: Multimedia-fitxategiak dituzten urruneko erabiltzaileen argitalpenak zure zerbitzarian gordetzen dira cachean. Balio positiboa ezartzean, multimedia zehazturiko egunen buruan ezabatuko da. Multimedia-datuak eskatzen badira ezabatu ostean, berriro deskargatuko dira, iturburuko edukia oraindik erabilgarri badago. Estekaren aurrebistako txartelek hirugarrenen guneei zenbatetan dei diezaieketen mugatzen dieten murrizketak direla eta, balio honi, gutxienez, 14 egunen balioa ezartzea gomendatzen da, bestela, esteken aurrebistako txartelak ez dira eguneratuko eskatu ahala denbora horren aurretik. peers_api_enabled: Zerbitzari honek fedibertsoan ikusi dituen zerbitzarien domeinu-izenen zerrenda. Ez da daturik ematen zerbitzari jakin batekin federatzearen ala ez federatzearen inguruan, zerbitzariak haien berri duela soilik. Federazioari buruzko estatistika orokorrak biltzen dituzten zerbitzuek erabiltzen dute hau. profile_directory: Profilen direktorioan ikusgai egotea aukeratu duten erabiltzaile guztiak zerrendatzen dira. require_invite_text: Izen emateak eskuz onartu behar direnean, "Zergatik elkartu nahi duzu?" testu sarrera derrigorrezko bezala ezarri, ez hautazko @@ -243,7 +245,7 @@ eu: backups_retention_period: Erabiltzailearen artxiboa gordetzeko epea bootstrap_timeline_accounts: Gomendatu beti kontu hauek erabiltzaile berriei closed_registrations_message: Izen-emateak itxita daudenerako mezu pertsonalizatua - content_cache_retention_period: Edukiaren cache-a atxikitzeko epea + content_cache_retention_period: Urruneko edukiaren atxikipen-aldia custom_css: CSS pertsonalizatua mascot: Maskota pertsonalizatua (zaharkitua) media_cache_retention_period: Multimediaren cachea atxikitzeko epea diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 03f187545..dd1c56e3b 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -75,13 +75,10 @@ fa: warn: نهفتن محتوای پالوده پشت هشداری که به عنوان پالایه اشاره می‌کند form_admin_settings: activity_api_enabled: تعداد بوق‌های منتشرهٔ محلی، کاربران فعال، و کاربران تازه در هر هفته - backups_retention_period: نگه داشتن بایگانی‌های کاربری برای روزهای مشخّص شده. bootstrap_timeline_accounts: سنجاق کردنThese accounts will be pinned to the top of new users' follow recommendations. closed_registrations_message: نمایش داده هنگام بسته بودن ثبت‌نام‌ها - content_cache_retention_period: همهٔ فرسته‌ها و تقویت‌ها از دیگر کارسازها پس از روزهای نشخّص حذف خواهند شد. ممکن است برخی فرسته‌ها قابل بازیابی نباشند. همهٔ نشانک‌ها، پسندها و تقویت‌ها نیز از دست خواهند رفت و قابل بازگشت نخواهند بود. custom_css: می‌توانیدروی نگارش وب ماستودون سبک‌های سفارشی اعمال کنید. mascot: نقش میانای وب پیش‌رفته را پایمال می‌کند. - media_cache_retention_period: اگر به مقدار مثبتی تنظیم شود، پرونده‌های رسانهٔ بارگرفته پس از روزهای مشخّص شده حذف خواهند شد و هنگام درخواست دوباره بارگرفته می‌شوند. peers_api_enabled: فهرستی از نام‌های دامنه‌ای که این کارساز در فدیورس با آن مواجه شده است. هیچ اطلاعاتی در مورد اینکه آیا شما با یک کارساز داده شده متعهد هستید، در اینجا گنجانده نشده است، فقط کارساز شما در مورد آن می‌داند. این توسط خدماتی استفاده می‌شود که آمار مربوط به فدراسیون را به معنای کلی جمع‌آوری می‌کنند. profile_directory: شاخهٔ نمایه، همهٔ کاربرانی که کشف‌پذیری را برگزیده‌اند سیاهه می‌کند. require_invite_text: زمانی که نام‌نویسی ها نیازمند تایید دستی است، متن «چرا می‌خواهید بپیوندید؟» بخش درخواست دعوت را به جای اختیاری، اجباری کنید @@ -225,7 +222,6 @@ fa: backups_retention_period: دورهٔ نگه‌داری بایگانی کاربری bootstrap_timeline_accounts: پیشنهاد همیشگی این حساب‌ها به کاربران جدید closed_registrations_message: پیام سفارشی هنگام در دسترس نبودن ثبت‌نام‌ها - content_cache_retention_period: دورهٔ نگه‌داری انبارهٔ محتوا custom_css: سبک CSS سفارشی mascot: نشان سفارشی (قدیمی) media_cache_retention_period: دورهٔ نگه‌داری انبارهٔ رسانه diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index c3fbd4372..9ac36447d 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -77,13 +77,15 @@ fi: warn: Piilota suodatettu sisältö varoituksen taakse, jossa mainitaan suodattimen nimi form_admin_settings: activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä - backups_retention_period: Säilytä luodut arkistot määritetyn määrän päiviä. + app_icon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen mobiililaitteiden sovelluskuvakkeen omalla kuvakkeella. + backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun arvo on positiivinen, nämä arkistot poistuvat automaattisesti, kun määritetty määrä päiviä on kulunut. bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun. closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu - content_cache_retention_period: Kaikki julkaisut ja tehostukset muilta palvelimilta poistetaan, kun määritelty määrä päiviä on kulunut. Osaa julkaisuista voi olla mahdoton palauttaa. Kaikki julkaisuihin liittyvät kirjanmerkit, suosikit ja tehostukset menetetään, eikä niitä voi palauttaa. + content_cache_retention_period: Kaikki muiden palvelinten julkaisut (mukaan lukien tehostukset ja vastaukset) poistuvat, kun määritetty määrä päiviä on kulunut, ottamatta huomioon paikallisen käyttäjän vuorovaikutusta näiden julkaisujen kanssa. Sisältää julkaisut, jotka paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikiksi. Myös yksityiset maininnat eri palvelinten käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämä asetus on tarkoitettu käytettäväksi erityistapauksissa ja rikkoo monia käyttäjien odotuksia, kun sitä käytetään yleistarkoituksiin. custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa. + favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin suosikkikuvakkeen omalla kuvakkeella. mascot: Ohittaa kuvituksen edistyneessä selainkäyttöliittymässä. - media_cache_retention_period: Ladatut mediatiedostot poistetaan määritetyn määrän päiviä jälkeen, kun arvo on positiivinen ja ladataan uudelleen pyynnöstä. + media_cache_retention_period: Käyttäjien tekemien julkaisujen mediatiedostot ovat välimuistissa palvelimellasi. Kun arvo on positiivinen, media poistuu, kun määritetty määrä päiviä on kulunut. Jos mediaa pyydetään sen poistamisen jälkeen, se ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien esikatselun kyselyitä kolmansien osapuolien sivustoille on rajoitettu, on suositeltavaa asettaa tämä arvo vähintään 14 päivään, tai linkkien kortteja ei päivitetä pyynnöstä ennen tätä ajankohtaa. peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, oletko liitossa tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla. profile_directory: Profiilihakemisto lueteloi kaikki käyttäjät, jotka ovat ilmoittaneet olevansa löydettävissä. require_invite_text: Kun rekisteröityminen vaatii manuaalisen hyväksynnän, tee ”Miksi haluat liittyä?” -tekstikentästä pakollinen vapaaehtoisen sijaan @@ -243,7 +245,7 @@ fi: backups_retention_period: Käyttäjän arkiston säilytysaika bootstrap_timeline_accounts: Suosittele aina näitä tilejä uusille käyttäjille closed_registrations_message: Mukautettu viesti, kun rekisteröityminen ei ole saatavilla - content_cache_retention_period: Sisällön välimuistin säilytysaika + content_cache_retention_period: Etäsisällön säilytysaika custom_css: Mukautettu CSS mascot: Mukautettu maskotti (vanhentunut ominaisuus) media_cache_retention_period: Mediasisältövälimuistin säilytysaika diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 599e79ea2..7d4da2b51 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -77,13 +77,15 @@ fo: warn: Fjal filtreraða innihaldið aftan fyri eina ávaring, sum nevnir heitið á filtrinum form_admin_settings: activity_api_enabled: Tal av lokalt útgivnum postum, virknum brúkarum og nýggjum skrásetingum býtt vikuliga - backups_retention_period: Varðveit gjørd brúkarasøvn í ásetta talið av døgum. + app_icon: WEBP, PNG, GIF ella JPG. Býtir vanligu ikonina á fartelefoneindum um við eina ser-ikon. + backups_retention_period: Brúkarar hava møguleika at gera trygdaravrit av teirra postum, sum tey kunnu taka niður seinni. Tá hetta er sett til eitt virði størri enn 0, so verða hesi trygdaravrit strikaði av sær sjálvum frá tínar goymslu eftir ásetta talið av døgum. bootstrap_timeline_accounts: Hesar kontur verða festar ovast á listanum yvir brúkarar, sum tey nýggju verða mælt til at fylgja. closed_registrations_message: Víst tá stongt er fyri tilmeldingum - content_cache_retention_period: Postar frá øðrum ambætarum verða strikaðir eftir ásetta talið av døgum, tá hetta er sett til eitt positivt virði. Hetta kann møguliga ikki broytast. + content_cache_retention_period: Allir postar frá øðrum ambætarum (íroknað stimbranir og svar) verða strikaði eftir ásetta talið av døgum, óansæð hvussu lokalir brúkarar hava samvirkað við hesar postar. Hetta fevnir eisini um postar, sum lokalir brúkarar hava bókamerkt ella yndismerkt. Privatar umrøður millum brúkarar frá ymiskum ambætarum verða eisini burturmistar og ómøguligar at endurskapa. Brúk av hesi stillingini er einans hugsað til serligar støður og oyðileggur nógv, sum brúkarar vænta av einum vanligum ambætara. custom_css: Tú kanst seta títt egna snið upp í net-útgávuni av Mastodon. + favicon: WEBP, PNG, GIF ella JPG. Býtir vanligu Mastodon fav-ikonina um við eina ser-ikon. mascot: Skúgvar til viks myndprýðingina í framkomna vev-markamótinum. - media_cache_retention_period: Miðlafílur, sum eru tiknar niður, verða strikaðar eftir ásetta talið av døgum, tá hetta er sett til eitt positivt virði, og takast niður umaftur eftir ynski. + media_cache_retention_period: Miðlafílur frá postum, sum fjarbrúkarar hava gjørt, verða goymdir á tínum ambætara. Tá hetta er sett til eitt virði størri enn 0, so verða miðlafílurnar strikaðar eftir ásetta talið av døgum. Um miðladátur verða umbidnar eftir at tær eru strikaðar, verða tær tiknar innaftur á ambætaran, um keldutilfarið enn er tøkt. Vegna avmarkingar á hvussu ofta undanvísingarkort til leinki spyrja triðjapartsstøð, so verður mælt til at seta hetta virðið til í minsta lagi 14 dagar. Annars verða umbønir um dagføringar av undanvísingarkortum til leinki ikki gjørdar áðrenn hetta. peers_api_enabled: Ein listi við navnaøkjum, sum hesin ambætarin er komin framat í fediversinum. Ongar dátur eru tiknar við her um tú er sameind/ur við ein givnan ambætara, einans at tín ambætari veit um hann. Hetta verður brúkt av tænastum, sum gera hagtøl um sameining yvirhøvur. profile_directory: Vangaskráin listar allar brúkarar, sum hava valt at kunna uppdagast. require_invite_text: Tá tilmeldingar krevja serskilda góðkenning, set so "Hví vil tú vera við?" tekstateigin til at vera kravdan heldur enn valfrían @@ -243,7 +245,7 @@ fo: backups_retention_period: Hvussu leingi verða brúkarasøvn goymd bootstrap_timeline_accounts: Mæl altíð nýggjum brúkarum at fylgja hesar kontur closed_registrations_message: Serskild boð, tá tað ikki er møguligt at tilmelda seg - content_cache_retention_period: Tíðarskeið, har innihaldgoymslan verður varðveitt + content_cache_retention_period: Tíðarskeið fyri varðveiðslu av fjartilfari custom_css: Serskilt CSS mascot: Serskildur maskottur (arvur) media_cache_retention_period: Tíðarskeið, har miðlagoymslur verða varðveittar diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index 823929c55..4b3f53e22 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -77,13 +77,10 @@ fr-CA: warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre form_admin_settings: activity_api_enabled: Nombre de messages publiés localement, de comptes actifs et de nouvelles inscriptions par tranche hebdomadaire - backups_retention_period: Conserve les archives générées par l'utilisateur selon le nombre de jours spécifié. bootstrap_timeline_accounts: Ces comptes seront épinglés en tête de liste des recommandations pour les nouveaux utilisateurs. closed_registrations_message: Affiché lorsque les inscriptions sont fermées - content_cache_retention_period: Les publications depuis d'autres serveurs seront supprimées après un nombre de jours spécifiés lorsque défini sur une valeur positive. Cela peut être irréversible. custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. mascot: Remplace l'illustration dans l'interface Web avancée. - media_cache_retention_period: Les fichiers multimédias téléchargés seront supprimés après le nombre de jours spécifiés lorsque la valeur est positive, et seront téléchargés à nouveau sur demande. peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général. profile_directory: L'annuaire des profils répertorie tous les utilisateurs qui ont opté pour être découverts. require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif @@ -243,7 +240,6 @@ fr-CA: backups_retention_period: Période d'archivage utilisateur bootstrap_timeline_accounts: Toujours recommander ces comptes aux nouveaux utilisateurs closed_registrations_message: Message personnalisé lorsque les inscriptions ne sont pas disponibles - content_cache_retention_period: Durée de rétention du contenu dans le cache custom_css: CSS personnalisé mascot: Mascotte personnalisée (héritée) media_cache_retention_period: Durée de rétention des médias dans le cache diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 4c8de1b20..476f197f4 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -77,13 +77,10 @@ fr: warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre form_admin_settings: activity_api_enabled: Nombre de messages publiés localement, de comptes actifs et de nouvelles inscriptions par tranche hebdomadaire - backups_retention_period: Conserve les archives générées par l'utilisateur selon le nombre de jours spécifié. bootstrap_timeline_accounts: Ces comptes seront épinglés en tête de liste des recommandations pour les nouveaux utilisateurs. closed_registrations_message: Affiché lorsque les inscriptions sont fermées - content_cache_retention_period: Lorsque la valeur est positive, les messages publiés depuis d'autres serveurs seront supprimés après le nombre de jours défini. Cela peut être irréversible. custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. mascot: Remplace l'illustration dans l'interface Web avancée. - media_cache_retention_period: Lorsque la valeur est positive, les fichiers multimédias téléchargés seront supprimés après le nombre de jours défini et pourront être à nouveau téléchargés sur demande. peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général. profile_directory: L'annuaire des profils répertorie tous les comptes qui choisi d'être découvrables. require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif @@ -243,7 +240,6 @@ fr: backups_retention_period: Durée de rétention des archives utilisateur bootstrap_timeline_accounts: Toujours recommander ces comptes aux nouveaux⋅elles utilisateur⋅rice⋅s closed_registrations_message: Message personnalisé lorsque les inscriptions ne sont pas disponibles - content_cache_retention_period: Durée de rétention du contenu dans le cache custom_css: CSS personnalisé mascot: Mascotte personnalisée (héritée) media_cache_retention_period: Durée de rétention des médias dans le cache diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index e2e40f04d..8d599324b 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -77,13 +77,13 @@ fy: warn: Ferstopje de filtere ynhâld efter in warskôging, mei de titel fan it filter as warskôgingstekst form_admin_settings: activity_api_enabled: Tal lokaal publisearre artikelen, aktive brûkers en nije registraasjes yn wyklikse werjefte - backups_retention_period: De oanmakke brûkersargiven foar it opjûne oantal dagen behâlde. + backups_retention_period: Brûkers hawwe de mooglikheid om argiven fan harren berjochten te generearjen om letter te downloaden. Wannear ynsteld op in positive wearde, wurde dizze argiven automatysk fuortsmiten út jo ûnthâld nei it opjûne oantal dagen. bootstrap_timeline_accounts: Dizze accounts wurde boppe oan de oanrekommandaasjes oan nije brûkers toand. Meardere brûkersnammen troch komma’s skiede. closed_registrations_message: Werjûn wannear’t registraasje fan nije accounts útskeakele is - content_cache_retention_period: 'Berjochten fan oare servers wurde nei it opjûne oantal dagen fuortsmiten. Let op: Dit is definityf.' + content_cache_retention_period: Alle berjochten fan oare servers (ynklusyf boosts en reaksjes) wurde fuortsmiten nei it opjûne oantal dagen, nettsjinsteande iennige lokale brûkersynteraksje mei dy berjochten. Dit oanbelanget ek berjochten dy’t in lokale brûker oan harren blêdwizers tafoege hat of as favoryt markearre hat. Priveeberjochten tusken brûkers fan ferskate servers gean ek ferlern en binne ûnmooglik te werstellen. It gebrûk fan dizze ynstelling is bedoeld foar servers dy’t in spesjaal doel tsjinje en oertrêdet in protte brûkersferwachtingen wannear’t dizze foar algemien gebrûk ymplemintearre wurdt. custom_css: Jo kinne oanpaste CSS tapasse op de webferzje fan dizze Mastodon-server. mascot: Oerskriuwt de yllustraasje yn de avansearre webomjouwing. - media_cache_retention_period: Mediabestannen dy’t fan oare servers download binne wurde nei it opjûne oantal dagen fuortsmiten en wurde op fersyk opnij download. + media_cache_retention_period: Mediabestannen fan berjochten fan eksterne brûkers wurde op jo server yn de buffer bewarre. Wannear ynsteld op in positive wearde, wurde media fuortsmiten nei it opjûne oantal dagen. As de mediagegevens opfrege wurde neidat se fuortsmiten binne, wurde se opnij download wannear de orizjinele ynhâld noch hieltyd beskikber is. Fanwegen beheiningen op hoe faak keppelingsfoarbylden websites fan tredden rieplachtsje, wurdt oanrekommandearre om dizze wearde yn te stellen op op syn minste 14 dagen. Oars wurde keppelingsfoarbylden net op oanfraach bywurke. peers_api_enabled: In list mei domeinnammen, dêr’t dizze server yn fediverse kontakt hân mei hat. Hjir wurdt gjin data dield, oft jo mei in bepaalde server federearrest, mar alinnich, dat jo server dat wit. Dit wurdt foar tsjinsten brûkt, dy’t statistiken oer federaasje yn algemiene sin sammelet. profile_directory: De brûkersgids befettet in list fan alle brûkers dy¥t derfoar keazen hawwe om ûntdekt wurde te kinnen. require_invite_text: Meitsje it ynfoljen fan ‘Wêrom wolle jo jo hjir registrearje?’ ferplicht yn stee fan opsjoneel, wannear’t registraasjes hânmjittich goedkard wurde moatte @@ -243,7 +243,7 @@ fy: backups_retention_period: Bewartermyn brûkersargyf bootstrap_timeline_accounts: Accounts dy’t altyd oan nije brûkers oanrekommandearre wurde closed_registrations_message: Oanpast berjocht wannear registraasje útskeakele is - content_cache_retention_period: Bewartermyn berjochtebuffer + content_cache_retention_period: Bewartermyn foar eksterne ynhâld custom_css: Oanpaste CSS mascot: Oanpaste maskotte (legacy) media_cache_retention_period: Bewartermyn mediabuffer diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 168e7168e..8a36f73dc 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -77,13 +77,10 @@ gd: warn: Falaich an t-susbaint chriathraichte air cùlaibh rabhaidh a dh’innseas tiotal na criathraige form_admin_settings: activity_api_enabled: Cunntasan nam postaichean a chaidh fhoillseachadh gu h-ionadail, nan cleachdaichean gnìomhach ’s nan clàraidhean ùra an am bucaidean seachdaineil - backups_retention_period: Cùm na tasg-lannan a chaidh a ghintinn dhan luchd-cleachdaidh rè an àireamh de làithean a shònraich thu. bootstrap_timeline_accounts: Thèid na cunntasan seo a phrìneachadh air bàrr nam molaidhean leantainn dhan luchd-cleachdaidh ùr. closed_registrations_message: Thèid seo a shealltainn nuair a bhios an clàradh dùinte - content_cache_retention_period: Thèid gach post is brosnachadh o fhrithealaichean eile a sguabadh às às dèidh an àireamh de làithean a shònraicheas tu. Dh’fhaoidte nach gabh a h-uile post aiseag. Thèid gach comharran-lìn, annsachd is brosnachadh co-cheangailte riutha air chall cuideachd agus cha ghabh sin a neo-dhèanamh. custom_css: "’S urrainn dhut stoidhlean gnàthaichte a chur an sàs air an tionndadh-lìn de Mhastodon." mascot: Tar-àithnidh seo an sgead-dhealbh san eadar-aghaidh-lìn adhartach. - media_cache_retention_period: Thèid na faidhlichean meadhain air an luchdadh a-nuas a sguabadh às às dèidh an àireamh de làithean a shònraich thu nuair a bhios luach dearbh air agus an ath-luachdadh nuair a thèid an iarraidh an uairsin. peers_api_enabled: Seo liosta de dh’ainmean àrainne ris an do thachair am frithealaiche seo sa cho-shaoghal. Chan eil dàta sam bith ’ga ghabhail a-staigh an-seo mu a bheil thu co-naisgte ri frithealaiche sònraichte gus nach eil ach dìreach gu bheil am frithealaiche agad eòlach air. Thèid seo a chleachdadh le seirbheisean a chruinnicheas stadastaireachd air a’ cho-nasgadh san fharsaingeachd. profile_directory: Seallaidh eòlaire nam pròifil liosta dhen luchd-cleachdaidh a dh’aontaich gun gabh an rùrachadh. require_invite_text: Nuair a bhios aontachadh a làimh riatanach dhan chlàradh, dèan an raon teacsa “Carson a bu mhiann leat ballrachd fhaighinn?” riatanach seach roghainneil @@ -243,7 +240,6 @@ gd: backups_retention_period: Ùine glèidhidh aig tasg-lannan an luchd-cleachdaidh bootstrap_timeline_accounts: Mol na cunntasan seo do chleachdaichean ùra an-còmhnaidh closed_registrations_message: Teachdaireachd ghnàthaichte nuair nach eil clàradh ri fhaighinn - content_cache_retention_period: Ùine glèidhidh aig tasgadan na susbainte custom_css: CSS gnàthaichte mascot: Suaichnean gnàthaichte (dìleabach) media_cache_retention_period: Ùine glèidhidh aig tasgadan nam meadhanan diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index ffb12d31b..0411c45bc 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -77,13 +77,15 @@ gl: warn: Agochar o contido filtrado tras un aviso que conteña o nome do filtro form_admin_settings: activity_api_enabled: Conta do número de publicacións locais, usuarias activas, e novos rexistros en acumulados semanais - backups_retention_period: Gardar os arquivos xerados pola usuaria durante o número de días indicado. + app_icon: WEBP, PNG, GIF ou JPG. Sobrescribe a icona por defecto da aplicación nos dispositivos móbiles cunha icona personalizada. + backups_retention_period: As usuarias poden crear arquivos das súas publicacións para descargalos. Cando se establece un valor positivo, estes arquivos serán borrados automáticamente da túa almacenaxe despois do número de días establecido. bootstrap_timeline_accounts: Estas contas aparecerán fixas na parte superior das recomendacións para as usuarias. closed_registrations_message: Móstrase cando non se admiten novas usuarias - content_cache_retention_period: As publicacións desde outros servidores serán eliminadas despois do número de días indicados ao poñer un valor positivo. É unha acción irreversible. + content_cache_retention_period: Todas as publicacións procedentes de outros servidores (incluído promocións e respostas) van ser eliminadas despois do número de días indicado, sen importar as interaccións das usuarias locais con esas publicacións. Esto inclúe publicacións que a usuaria local marcou como favoritas ou incluíu nos marcadores. As mencións privadas entre usuarias de diferentes instancias tamén se eliminarán e non se poderán restablecer. O uso desta ferramenta esta orientado a situacións especiais e estraga moitas das expectativas das usuarias ao implementala cun propósito de uso xeral. custom_css: Podes aplicar deseños personalizados na versión web de Mastodon. + favicon: WEBP, PNG, GIF ou JPG. Sobrescribe a icona de favoritos de Mastodon por defecto cunha icona personalizada. mascot: Sobrescribe a ilustración na interface web avanzada. - media_cache_retention_period: Os ficheiros multimedia descargados serán eliminados despois do número de días indicado ao establecer un valor positivo, e voltos a descargar baixo petición. + media_cache_retention_period: Os ficheiros multimedia de publicacións de usuarias remotas están almacenados no teu servidor. Ao establecer un valor positivo, o multimedia vaise eliminar despois do número de días establecido. Se o multimedia fose requerido após ser eliminado entón descargaríase outra vez, se aínda está dispoñible na orixe. Debido a restricións sobre a frecuencia en que o servizo de vista previa trae recursos de terceiras partes, é recomendable establecer este valor polo menos en 14 días, ou as tarxetas de vista previa non se actualizarán baixo demanda para casos anteriores a ese prazo. peers_api_enabled: Unha lista dos nomes de dominio que este servidor atopou no fediverso. Non se inclúen aquí datos acerca de se estás a federar con eles ou non, só que o teu servidor os recoñeceu. Ten utilidade para servizos que recollen estatísticas acerca da federación nun amplo senso. profile_directory: O directorio de perfís inclúe a tódalas usuarias que optaron por ser descubribles. require_invite_text: Cando os rexistros requiren aprobación manual, facer que o texto "Por que te queres rexistrar?" do convite sexa obrigatorio en lugar de optativo @@ -243,7 +245,7 @@ gl: backups_retention_period: Período de retención do arquivo da usuaria bootstrap_timeline_accounts: Recomendar sempre estas contas ás novas usuarias closed_registrations_message: Mensaxe personalizada para cando o rexistro está pechado - content_cache_retention_period: Período de retención da caché do contido + content_cache_retention_period: Período de retención de contido remoto custom_css: CSS personalizado mascot: Mascota propia (herdado) media_cache_retention_period: Período de retención da caché multimedia diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 4f2611666..65c6f6110 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -77,13 +77,15 @@ he: warn: הסתר את התוכן המסונן מאחורי אזהרה עם כותרת המסנן form_admin_settings: activity_api_enabled: מספר ההודעות שפורסמו מקומית, משתמשים פעילים, והרשמות חדשות בדליים שבועיים - backups_retention_period: לשמור ארכיון משתמש שנוצר למשך מספר הימים המצוין. + app_icon: WEBP, PNG, GIF או JPG. גובר על אייקון ברירת המחדל ביישומון על מכשירים ניידים ומחליף אותו באייקון נבחר. + backups_retention_period: למשתמשים יש יכולת לבקש ארכיון של הודעותיהם להורדה מאוחר יותר. כאשר נבחר ערך חיובי, הארכיונים הללו ימחקו מאחסון לאחר מספר הימים שצוינו. bootstrap_timeline_accounts: חשבונות אלו יוצמדו לראש רשימת המלצות המעקב של משתמשים חדשים. closed_registrations_message: להציג כאשר הרשמות חדשות אינן מאופשרות - content_cache_retention_period: הודעות משרתים אחרים ימחקו אחרי מספר הימים המצוין כאשר מצוין מספר חיובי. פעולה זו אינה הפיכה. + content_cache_retention_period: כל ההודעות משרתים אחרים (לרבות הדהודים ותגובות) ימחקו אחרי מספר ימים, ללא קשר לאינטראקציה של משתמשים מקומיים איתם. בכלל זה הודעות שהמתשתמשים המקומיים סימנו בסימניה או חיבוב. איזכורים פרטיים ("דיאם") בין משתמשים בין שרתים שונים יאבדו גם הם ולא תהיה אפשרות לשחזרם. השימוש באפשרות הזו מיועד לשרתים עם ייעוד מיוחד ושובר את ציפיותיהם של רב המשתמשים כאשר האפשרות מופעלת בשרת לשימוש כללי. custom_css: ניתן לבחור ערכות סגנון אישיות בגרסת הדפדפן של מסטודון. + favicon: WEBP, PNG, GIF או JPG. גובר על "פאבאייקון" ברירת המחדל ומחליף אותו באייקון נבחר בדפדפן. mascot: בחירת ציור למנשק הווב המתקדם. - media_cache_retention_period: קבצי מדיה שהורדו ימחקו אחרי מספר הימים שיצוינו אם נבחר מספר חיובי, או-אז יורדו שוב מחדש בהתאם לצורך. + media_cache_retention_period: קבצי מדיה מהודעות שהגיעו משרתים רחוקים נשמרות על השרת שלך. כאשר יבחר פה מספר חיובי, המדיה תמחק לאחר מספר ימים כמצוין. אם המידע יבוקש שוב לאחר שנמחק, הוא יורד מחדש, אם המידע עדיין זמין בצד הרחוק. עקב מגבלות על תכיפות שליפת כרטיסי קדימון מאתרים מרוחקים, מומלץ לכוון את הערך ל־14 יום לפחות, או שכרטיסי קדימונים לא יעודכנו לפי דרישה לפני חלוף חלון הזמן הזה. peers_api_enabled: רשימת השרתים ששרת זה פגש בפדיוורס. לא כולל מידע לגבי קשר ישיר עם שרת נתון, אלא רק שידוע לשרת זה על קיומו. מידע זה משמש שירותים האוספים סטטיסטיקות כלליות על הפדרציה. profile_directory: ספריית הפרופילים מציגה ברשימה את כל המשתמשים שביקשו להיות ניתנים לגילוי. require_invite_text: כאשר הרשמות דורשות אישור ידני, הפיכת טקסט ה"מדוע את/ה רוצה להצטרף" להכרחי במקום אופציונלי @@ -243,7 +245,7 @@ he: backups_retention_period: תקופת השמירה של ארכיון המשתמש bootstrap_timeline_accounts: המלצה על חשבונות אלה למשתמשים חדשים closed_registrations_message: הודעה מיוחדת כשההרשמה לא מאופשרת - content_cache_retention_period: תקופת שמירת מטמון תוכן + content_cache_retention_period: תקופת השמירה על תוכן חיצוני custom_css: CSS בהתאמה אישית mascot: סמל השרת (ישן) media_cache_retention_period: תקופת שמירת מטמון מדיה diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 242c86327..6ccca2bc8 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -77,13 +77,15 @@ hu: warn: A szűrt tartalom a szűrő címét említő figyelmeztetés mögé rejtése form_admin_settings: activity_api_enabled: Helyi bejegyzések, aktív felhasználók és új regisztrációk száma heti bontásban - backups_retention_period: Az előállított felhasználói archívumok megtartása a megadott napokig. + app_icon: WEBP, PNG, GIF vagy JPG. Mobileszközökön az alkalmazás alapértelmezett ikonját felülírja egy egyéni ikonnal. + backups_retention_period: A felhasználók archívumokat állíthatnak elő a bejegyzéseikből, hogy később letöltsék azokat. Ha pozitív értékre van állítva, akkor a megadott számú nap után automatikusan törölve lesznek a tárhelyedről. bootstrap_timeline_accounts: Ezek a fiókok ki lesznek tűzve az új felhasználók követési javaslatainak élére. closed_registrations_message: Akkor jelenik meg, amikor a regisztráció le van zárva - content_cache_retention_period: A más kiszolgálókról származó bejegyzések megadott számú nap után törölve lesznek, ha pozitív értékre van állítva. Ez lehet, hogy nem fordítható vissza. + content_cache_retention_period: Minden más kiszolgálóról származó bejegyzés (megtolásokkal és válaszokkal együtt) törölve lesz a megadott számú nap elteltével, függetlenül a helyi felhasználók ezekkel a bejegyzésekkel történő interakcióitól. Ebben azok a bejegyzések is benne vannak, melyeket a helyi felhasználó könyvjelzőzött vagy kedvencnek jelölt. A különböző kiszolgálók felhasználói közötti privát üzenetek is el fognak veszni visszaállíthatatlanul. Ennek a beállításnak a használata különleges felhasználási esetekre javasolt, mert számos felhasználói elvárás fog eltörni, ha általános céllal használják. custom_css: A Mastodon webes verziójában használhatsz egyéni stílusokat. + favicon: WEBP, PNG, GIF vagy JPG. Az alapértelmezett Mastodon favicont felülírja egy egyéni ikonnal. mascot: Felülbírálja a speciális webes felületen található illusztrációt. - media_cache_retention_period: A letöltött médiafájlok megadott számú nap után törölve lesznek, ha pozitív értékre van állítva, és igény szerint újból le lesznek töltve. + media_cache_retention_period: A távoli felhasználók bejegyzéseinek médiatartalmait a kiszolgálód gyorsítótárazza. Ha pozitív értékre állítják, ezek a médiatartalmak a megadott számú nap után törölve lesznek. Ha a médiát újra lekérik, miután törlődött, újra le fogjuk tölteni, ha az eredeti még elérhető. A hivatkozások előnézeti kártyáinak harmadik fél weboldalai felé történő hivatkozásaira alkalmazott megkötései miatt javasolt, hogy ezt az értéket legalább 14 napra állítsuk, ellenkező esetben a hivatkozások előnézeti kártyái szükség esetén nem fognak tudni frissülni ezen idő előtt. peers_api_enabled: Azon domainek listája, melyekkel ez a kiszolgáló találkozott a fediverzumban. Nem csatolunk adatot arról, hogy föderált kapcsolatban vagy-e az adott kiszolgálóval, csak arról, hogy a kiszolgálód tud a másikról. Ezt olyan szolgáltatások használják, melyek általában a föderációról készítenek statisztikákat. profile_directory: A profilok jegyzéke minden olyan felhasználót felsorol, akik engedélyezték a felfedezhetőségüket. require_invite_text: Ha a regisztrációhoz manuális jóváhagyásra van szükség, akkor a „Miért akarsz csatlakozni?” válasz kitöltése legyen kötelező, és ne opcionális @@ -243,7 +245,7 @@ hu: backups_retention_period: Felhasználói archívum megtartási időszaka bootstrap_timeline_accounts: Mindig javasoljuk ezeket a fiókokat az új felhasználók számára closed_registrations_message: A feliratkozáskor megjelenő egyéni üzenet nem érhető el - content_cache_retention_period: Tartalom-gyorsítótár megtartási időszaka + content_cache_retention_period: Távoli tartalmak megtartási időszaka custom_css: Egyéni CSS mascot: Egyéni kabala (örökölt) media_cache_retention_period: Média-gyorsítótár megtartási időszaka diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 7012cdb1c..51329edd8 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -3,12 +3,143 @@ ia: simple_form: hints: account: + discoverable: Tu messages public e tu profilo pote esser consiliate o recommendate in varie areas de Mastodon e tu profilo pote esser suggerite a altere usatores. + display_name: Tu prenomine e nomine de familia o tu pseudonymo. + fields: Tu pagina principal, pronomines, etate, toto lo que tu vole. + indexable: Tu messages public pote apparer in resultatos del recerca sur Mastodon. Illes qui ha interagite con tu messages totevia pote cercar les. note: 'Tu pote @mentionar altere personas o #hashtags.' + show_collections: Le personas potera navigar per tu sequites e sequaces. Le personas potera navigar per tu sequites e sequaces. + unlocked: Le personas potera sequer te sin requestar approbation. Dismarca si tu desira revider le requestas de sequer e selige si acceptar o rejectar nove sequaces. + account_alias: + acct: Specifica le nomine_de_usator@dominio del conto ab que tu vole mover + account_migration: + acct: Specifica le nomine_de_usator@dominio del conto a que tu vole mover + account_warning_preset: + text: Tu pote usar le syntaxe de message, tal como URLs, hashtags e mentiones + title: Optional. Non visibile al destinatario + admin_account_action: + include_statuses: Le usator videra que messages ha causate le action o aviso de moderation + send_email_notification: Le usator recipera un explication de cosa eveniva con lor conto + text_html: Optional. Tu pote usar le syntaxe de message. Tu pote adder avisos preconfigurate pro sparniar tempore + type_html: Selige lo que tu vole facer con %{acct} + types: + disable: Impedir al usator de usar lor conto, sin deler o celar lor contentos. + none: Usar lo pro inviar un aviso al usator, sin discatenar ulle altere action. + sensitive: Fortiar tote le annexos multimedial de iste usator a esser signalate como sensibile. + silence: Impedir al usator de poter publicar messages con public visibilitate, celar lor messages e notificationes ab gente non sequente illes. Clauder tote le reportos contra iste conto. + suspend: Impedir ulle interaction de o a iste conto e deler su contentos. Reversibile intra 30 dies. Clauder tote le reportos contra iste conto. + warning_preset_id: Optional. Tu pote ancora adder personal texto a fin del preconfigurate + announcement: + all_day: Si marcate, solo le datas del campo tempore sera monstrate + ends_at: Le annuncio sera automaticamente obscurate a iste tempore + scheduled_at: Lassar blanc pro publicar le annuncio immediatemente + starts_at: Optional. In caso tu annuncio es ligate con un specific campo tempore + text: Tu pote usar le syntaxe de message. Presta attention al spatio que le annuncio occupara sur le schermo de usator + appeal: + text: Tu pote solo appellar te un vice defaults: + autofollow: Illes qui se inscribe per le invitation automaticamente devenira tu sequaces + avatar: WEBP, PNG, GIF or JPG. Al maximo %{size}. Sera diminuite a %{dimensions}px + bot: Signala a alteres que le conto principalmente exeque actiones automatisate e poterea non esser surveliate + context: Un o plure contextos ubi le filtro deberea applicar se + current_password: Pro propositos de securitate insere le contrasigno del conto actual + current_username: Pro confirmar, insere le nomine de usator del conto actual + digest: Solo inviate post un longe periodo de inactivitate e solo si tu ha recipite alcun messages personal in tu absentia + email: Te sera inviate un email de confirmation + header: WEBP, PNG, GIF or JPG. Al maximo %{size}. Sera diminuite a %{dimensions}px + inbox_url: Copia le URL ab le pagina principal del repetitor que tu vole usar + irreversible: Le messages filtrate disparera irreversibilemente, mesmo si le filtro es plus tarde removite + locale: Le lingua del interfacie de usator, del emails e del notificationes pulsate + password: Usa al minus 8 characteres + phrase: Sera concordate ignorante majuscule/minuscule in le texto o avisos de contento de un message + scopes: A que APIs sera permittite acceder al application. Si tu selige un ambito de maxime nivello, tu non besonia de seliger los singulemente. + setting_aggregate_reblogs: Non monstra nove stimulos pro messages que ha essite recentemente stimulate (stimulos solo affice los novemente recipite) + setting_always_send_emails: Normalmente le avisos de email non sera inviate quando tu activemente usa Mastodon + setting_default_sensitive: Le medios sensibile es celate de ordinario e pote esser revelate con un clic + setting_display_media_default: Celar le medios marcate como sensibile setting_display_media_hide_all: Sempre celar le medios setting_display_media_show_all: Sempre monstrar le medios + setting_use_blurhash: Le imagines degradate es basate sur le colores del medios visual celate, ma illos offusca qualcunque detalios + setting_use_pending_items: Celar le classification temporal detra un clic in vice que automaticamente rolante le fluxo + username: Tu pote usar litteras, numeros e tractos de sublineamento + whole_word: Quando le parola o expression clave es solo alphanumeric, illo sera solo applicate si illo concorda con tote le parola + domain_allow: + domain: Iste dominio potera reportar datos ab iste servitor e le datos in ingresso ab illo sera processate e immagazinate + email_domain_block: + domain: Isto pote esser le nomine de dominio que apparera in le adresse email o le registration MX que illo usa. Illos sera verificate durante le inscription. + with_dns_records: Un tentativa sera facite pro resolver le registrationes de DNS del dominio date e le resultatos sera alsi blocate + featured_tag: + name: 'Ecce alcun del hashtags que tu usava le plus recentemente:' + filters: + action: Selige que action exequer quando un message concorda con le filtro + actions: + hide: Completemente celar le contento filtrate, comportar se como si illo non existerea + warn: Celar le contento filtrate detra un aviso citante le titulo del filtro + form_admin_settings: + activity_api_enabled: Numeros de messages localmente publicate, usatores active, e nove registrationes in gruppos septimanal + app_icon: WEBP, PNG, GIF o JPG. Supplanta le icone predefinite sur apparatos mobile con un icone personalisate. + backups_retention_period: Le usatores pote generar archivos de lor messages pro discargar los plus tarde. Quando predefinite a un valor positive, iste archivos sera automaticamente delite de tu immagazinage post le specificate numero de dies. + bootstrap_timeline_accounts: Iste contos sera appunctate al summitate del recommendationes a sequer del nove usatores. + closed_registrations_message: Monstrate quando le inscriptiones es claudite + content_cache_retention_period: Tote messages de altere servitores (includite stimulos e responsas) sera delite post le specificate numero de dies, sin considerar alcun interaction de usator local con ille messages. Isto include messages ubi un usator local los ha marcate como marcapaginas o favoritos. Mentiones private inter usatores de differente instantias sera alsi perdite e impossibile a restaurar. Le uso de iste parametros es intendite pro specific instantias e infringe multe expectationes de usator quando implementate pro uso general. + custom_css: Tu pote applicar stilos personalisate sur le version de web de Mastodon. + favicon: WEBP, PNG, GIF o JPG. Supplanta le favicone predefinite de Mastodon con un icone personalisate. + mascot: Illo substitue le illustration in le interfacie web avantiate. + media_cache_retention_period: Le files multimedial de messages producite per usatores remote es in cache sur tu servitor. Quando predefinite a un valor positive, le medios sera delite post le numero de dies specificate. Le datos multimedial requirite post que illo es delite, sera re-discargate, si le contento original sera ancora disponibile. Per limitationes sur le frequentia con que le schedas de pre-visualisation de ligamine scruta le sitos de tertie partes, il es recommendate de predefinir iste valor a al minus 14 dies, o le schedas de pre-visualisation de ligamine non sera actualisate sur demanda ante ille tempore. + peers_api_enabled: Un lista de nomines de dominio que iste servitor ha incontrate in le fediverso. Nulle datos es includite ci re tu federation con un date servitor, justo que tu servitor lo cognosce. Isto es usate per servicios que collige statistica re le federation in senso general. + profile_directory: Le directorio de profilo lista tote le usatores qui ha optate pro esser detectabile. + require_invite_text: Quando le inscriptiones require approbation manual, rende obligatori, plus tosto que optional, le entrata de texto “Perque vole tu junger te?” + site_contact_email: Como pote contactar te le personas pro questiones legal o de supporto. + site_contact_username: Como pote contactar te le personas re Mastodon. + site_extended_description: Qualcunque information additional que pote esser utile al visitatores e a tu usatores. Pote esser structurate con syntaxe de markdown. + site_short_description: Un breve description pro adjutar a univocamente identificar tu servitor. Qui ha exequite illo, proque es illo? + site_terms: Usa tu proprie politica de confidentialitate o lassa blanc pro usar le predefinite. Pote esser structurate con syntaxe de markdown. + site_title: Como le personas pote referer se a tu servitor in addition su nomine de dominio. + 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 approximativemente 2:1 monstrate al latere del informationes de tu servitor. + timeline_preview: Le visitatores disconnexe potera navigar per le plus recente messages public 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. + form_challenge: + current_password: Tu entra in un area secur + imports: + data: File CSV exportate ab un altere servitor de Mastodon + invite_request: + text: Isto nos adjutara a revider tu application + ip_block: + comment: Optional. Memorar perque tu ha addite iste regula. + expires_in: Le adresses IP es un ressource finite, illos es aliquando compartite e sovente cambia manos. Pro iste ration, blocadas de IP indefinite non es recommendate. + ip: Inserer un adresse IPv4 o IPv6. Tu pote blocar campos integre per le syntaxe CIDR. Sia attente pro non disconnecter te! + severities: + no_access: Blocar accesso a tote le ressources + sign_up_block: Nove inscriptiones non sera possibile + sign_up_requires_approval: Nove inscriptiones requirera tu approbation + severity: Seliger que evenira con requestas ab iste IP + rule: + hint: Optional. Forni altere detalios re le regula + text: Describe un regula o requisito pro usatores sur iste servitor. Tenta de mantener lo breve e simple + sessions: + otp: 'Insere le codice a duo factores generate per le app de tu telephono o usa un de tu codices de recuperation:' + webauthn: Si illo es un clave USB cura de inserer lo e, si necessari, tocca lo. + settings: + indexable: Tu pagina del profilo pote apparer in resultatos del recerca sur Google, Bing, e alteros. + show_application: Tu sempre sera capace totevia de vider que app publicava tu message. + tag: + name: Tu pote solo cambiar le inveloppe del litteras, per exemplo, pro render lo plus legibile + user: + chosen_languages: Si marcate, solo le messages in le linguas seligite sera monstrate in chronologias public + role: Le rolo controla que permissos ha le usator + user_role: + color: Color a esser usate pro le rolo in omne parte del UI, como RGB in formato hexadecimal + highlighted: Iste rende le rolo publicamente visibile + name: Nomine public del rolo, si rolo es definite a esser monstrate como insignia + permissions_as_keys: Usatores con iste rolo habera accesso a... + position: Rolo superior decide resolution de conflicto in certe situationes. Certe actiones pote solo esser exequite sur rolos con un prioritate inferior webhook: events: Selige le eventos a inviar + template: Compone tu proprie carga utile JSON per interpolation de variabile. Lassar blanc pro JSON predefinite. url: Ubi le eventos essera inviate labels: account: @@ -19,39 +150,90 @@ ia: indexable: Includer messages public in le resultatos de recerca show_collections: Monstrar sequites e sequitores in le profilo unlocked: Acceptar automaticamente nove sequitores + account_alias: + acct: Pseudonymo del vetere conto + account_migration: + acct: Pseudonymo del nove conto account_warning_preset: + text: Texto predefinite title: Titulo admin_account_action: + include_statuses: Includer messages reportate in le email + send_email_notification: Notificar le usator per e-mail + text: Advertimento personalisate type: Action types: + disable: Gelar none: Inviar un advertimento + sensitive: Sensibile + silence: Limitar + suspend: Suspender + warning_preset_id: Usar un aviso predefinite announcement: + all_day: Evento quotidian + ends_at: Fin del evento + scheduled_at: Planificar publication + starts_at: Initio del evento text: Annuncio + appeal: + text: Explicar perque iste decision deberea esser revertite defaults: autofollow: Invitar a sequer tu conto avatar: Pictura de profilo + bot: Isto es un conto automatisate chosen_languages: Filtrar linguas confirm_new_password: Confirmar nove contrasigno confirm_password: Confirmar contrasigno + context: Contextos del filtro current_password: Contrasigno actual + data: Datos display_name: Nomine a monstrar email: Adresse de e-mail + expires_in: Expira post + fields: Campos extra + header: Imagine titulo + honeypot: "%{label} (non compilar)" + inbox_url: URL del cassa de ingresso de repetitor + irreversible: Declinar in vice que celar locale: Lingua de interfacie + max_uses: Numero max de usos new_password: Nove contrasigno + note: Bio + otp_attempt: Codice a duo factores password: Contrasigno + phrase: Parola o phrase clave setting_advanced_layout: Activar le interfacie web avantiate + setting_aggregate_reblogs: Gruppa promotiones in classificationes temporal setting_always_send_emails: Sempre inviar notificationes per e-mail + setting_auto_play_gif: Auto-reproduce GIFs animate + setting_boost_modal: Monstrar dialogo de confirmation ante promover setting_default_language: Lingua de publication + setting_default_privacy: Confidentialitate del messages + setting_default_sensitive: Sempre marcar le medios cmo sensbile + setting_delete_modal: Monstrar le dialogo de confirmation ante deler un message + setting_disable_swiping: Disactivar le movimentos per glissamento + setting_display_media: Visualisation de medios setting_display_media_default: Predefinite setting_display_media_hide_all: Celar toto setting_display_media_show_all: Monstrar toto + setting_expand_spoilers: Sempre expander messages marcate con avisos de contento + setting_hide_network: Cela tu rete social + setting_reduce_motion: Reducer movimento in animationes setting_system_font_ui: Usar typo de litteras predefinite del systema setting_theme: Thema de sito setting_trends: Monstrar le tendentias de hodie + setting_unfollow_modal: Monstrar dialogo de confirmation ante cessar de sequer alcuno + setting_use_blurhash: Monstrar imagines degradate multicolor pro medios celate + setting_use_pending_items: Modo lente + severity: Severitate sign_in_token_attempt: Codice de securitate title: Titulo + type: Importar le typo username: Nomine de usator username_or_email: Nomine de usator o e-mail + whole_word: Parola integre + email_domain_block: + with_dns_records: Includer registrationes MX e IPs del dominio featured_tag: name: Hashtag filters: @@ -59,43 +241,98 @@ ia: hide: Celar completemente warn: Celar con un advertimento form_admin_settings: + activity_api_enabled: Publicar statisticas aggregate re le activitate de usator in le API + backups_retention_period: Periodo de retention del archivo de usator bootstrap_timeline_accounts: Recommenda sempre iste contos a nove usatores + closed_registrations_message: Message personalisate quando le inscriptiones non es disponibile + content_cache_retention_period: Periodo de retention del contento remote custom_css: CSS personalisate + mascot: Personalisar le mascotte (hereditage) + media_cache_retention_period: Periodo de retention del cache multimedial + peers_api_enabled: Publicar le lista de servitores discoperite in le API profile_directory: Activar directorio de profilos + registrations_mode: Qui pote inscriber se + require_invite_text: Requirer un ration pro junger se + show_domain_blocks: Monstrar le blocadas de dominio + show_domain_blocks_rationale: Monstrar perque le dominios era blocate site_contact_email: Adresse de e-mail de contacto site_contact_username: Nomine de usator de contacto + site_extended_description: Description extense site_short_description: Description de servitor site_terms: Politica de confidentialitate site_title: Nomine de servitor 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 + interactions: + must_be_follower: Blocar notificationes de non-sequaces + must_be_following: Blocar notificationes de gente que tu non sequer + must_be_following_dm: Blocar messages directe de gente que tu non seque + invite: + comment: Commento + invite_request: + text: Perque vole tu junger te? ip_block: comment: Commento + ip: IP + severities: + no_access: Blocar le accesso + sign_up_block: Blocar inscriptiones + sign_up_requires_approval: Limitar inscriptiones severity: Regula notification_emails: + appeal: Alcuno appella un decision de moderator + digest: Inviar emails compendio + favourite: Alcuno appreciava tu message + follow: Alcuno te sequeva + follow_request: Alcuno requireva de sequer te + mention: Alcuno te mentionava + pending_account: Nove conto besonia de revision + reblog: Alcuno promoveva tu message + report: Un nove reporto es inviate software_updates: all: Notificar sur tote le actualisationes critical: Notificar solmente sur actualisationes critic label: Un nove version de Mastodon es disponibile none: Nunquam notificar sur actualisationes (non recommendate) + patch: Notificar re actualisationes de correction de bug + trending_tag: Un nove tendentia require revision rule: hint: Information additional text: Regula settings: indexable: Includer pagina de profilo in le motores de recerca + show_application: Monstrar ab que app tu ha inviate un message tag: listable: Permitter a iste hashtag apparer in le recercas e suggestiones name: Hashtag + trendable: Permitter a iste hashtag de sub tendentias usable: Permitter al messages usar iste hashtag user: + role: Rolo time_zone: Fuso horari user_role: + color: Color de insignia + highlighted: Monstrar le rolo como insignia sur le profilos de usator name: Nomine permissions_as_keys: Permissiones position: Prioritate + webhook: + events: Eventos activate + template: Modello de carga utile + url: URL de extremo + 'no': 'No' not_recommended: Non recommendate + overridden: Supplantate recommended: Recommendate required: + mark: "*" text: requirite + title: + sessions: + webauthn: Usa un de tu claves de securitate pro acceder 'yes': Si diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 8b9e74406..856f312ed 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -63,13 +63,10 @@ id: hide: Sembunyikan konten yang disaring, seperti itu tidak ada warn: Sembunyikan konten yang disaring di belakang sebuah peringatan menyebutkan judul saringan form_admin_settings: - backups_retention_period: Simpan arsip pengguna yang dibuat untuk jumlah hari yang ditetapkan. bootstrap_timeline_accounts: Akun ini akan disematkan di atas rekomendasi ikut pengguna baru. closed_registrations_message: Ditampilkan ketika pendaftaran ditutup - content_cache_retention_period: Kiriman dari server lain akan dihapus setelah jumlah hari yang ditentukan jika nilai positif ditetapkan. Ini mungkin tidak dapat diurungkan. custom_css: Anda dapat menerapkan gaya kustom di versi web Mastodon. mascot: Menimpa ilustrasi di antarmuka web tingkat lanjut. - media_cache_retention_period: File media yang diunduh akan dihapus setelah beberapa hari yang ditentukan ketika ditetapkan ke nilai yang positif, dan diunduh ulang pada permintaan. profile_directory: Direktori profil mendaftarka semua pengguna yang ingin untuk dapat ditemukan. require_invite_text: Ketika pendaftaran membutuhkan persetujuan manual, buat masukan teks "Mengapa Anda ingin bergabung?" dibutuhkan daripada opsional site_contact_email: Bagaimana orang dapat menghubungi Anda untuk kebutuhan hukum atau dukungan. @@ -216,7 +213,6 @@ id: backups_retention_period: Rentang retensi arsip pengguna bootstrap_timeline_accounts: Selalu rekomendasikan akun ini ke pengguna baru closed_registrations_message: Pesan kustom ketika pendaftaran tidak tersedia - content_cache_retention_period: Rentang retensi tembolok konten custom_css: CSS kustom mascot: Maskot kustom (lawas) media_cache_retention_period: Rentang retensi tembolok media diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index e142617fc..2b995e7ef 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -77,13 +77,15 @@ ie: warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre form_admin_settings: activity_api_enabled: Númeres de postas publicat localmen, activ usatores, e nov adhesiones in periodes semanal - backups_retention_period: Mantener usator-generat archives por li specificat quantitá de dies. + app_icon: WEBP, PNG, GIF o JPG. Remplazza li predenifit favicon Mastodon sur mobiles con un icon customisat. + backups_retention_period: Usatores posse generar archives de lor postas por adcargar plu tard. Si on specifica un valore positiv, li archives va esser automaticmen deletet de tui magazinage pos li specificat quantitá de dies. bootstrap_timeline_accounts: Ti-ci contos va esser pinglat al parte superiori del recomandationes por nov usatores. closed_registrations_message: Monstrat quande adhesiones es cludet - content_cache_retention_period: Omni postas e boosts de altri servitores va esser deletet pos li specificat quantitá de dies. Quelc postas fórsan va esser ínrestaurabil. Omni pertinent marcatores, favorites e boosts anc va esser perdit e ínpossibil a restaurar. + content_cache_retention_period: Omni postas de altri servitores (includente boosts e responses) va esser deletet pos li specificat quantitá de dies, sin egard a local usator-interactiones con les. To vale anc por postas queles un local usator ha marcat o favoritat it. Anc privat mentiones ínter usatores de diferent instanties va esser perdit e ínrestorabil. Talmen, ti-ci parametre es intentet por scopes special pro que it posse ruptes li expectationes de usatores. custom_css: On posse aplicar customisat stiles al web-version de Mastodon. + favicon: WEBP, PNG, GIF oo JPG. Remplazza li predenifit favicon Mastodon con in icon customisat. mascot: Substitue li ilustration in li avansat interfacie web. - media_cache_retention_period: Descargat files de media va esser deletet pos li specificat quantitá de dies quande li valore es positiv, e re-descargat sur demanda. + media_cache_retention_period: Files de medie de postas creat de lontan usatores es cachat sur tui servitor. Si on specifica un valore positiv, ili va esser automaticmen deletet pos li specificat quantitá de dies. Si on peti li data del medie pos deletion, it va esser re-descargat si li original fonte es disponibil. Restrictiones pri li frequentie de ligament-previsiones posse exister sur altri situs, e pro to it es recomandat que on usa un valore de adminim 14 dies; altrimen, li ligament-previsiones ne va esser actualisat secun demande ante ti témpor. peers_api_enabled: Un liste de nómines de dominia queles ti-ci servitor ha incontrat in li fediverse. Ci null data es includet pri ca tu confedera con un cert servitor o ne; it indica solmen que tui servitor conosse it. Usat per servicies colectent general statisticas pri federation. profile_directory: Li profilarium monstra omni usatores volent esser decovribil. require_invite_text: Quande registrationes besona manual aprobation, fa que li textu "Pro quo tu vole registrar te?" es obligatori vice facultativ @@ -243,7 +245,7 @@ ie: backups_retention_period: Periode de retener archives de usator bootstrap_timeline_accounts: Sempre recomandar ti-ci contos a nov usatores closed_registrations_message: Customisat missage quande registration ne disponibil - content_cache_retention_period: Periode de retention por cachat contenete + content_cache_retention_period: Periode de retention por contenete lontan custom_css: Custom CSS mascot: Customisat mascot (hereditat) media_cache_retention_period: Periode de retention por cachat medie diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 57a2aeb64..81f298249 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -75,13 +75,10 @@ io: warn: Celez filtrita kontenajo dop avert quo montras titulo di filtrilo form_admin_settings: activity_api_enabled: Quanto de lokale publikigita posti, aktiva uzanti e nova registri, donita semanope - backups_retention_period: Retenez igita uzantoarkivi por la diiquanto. bootstrap_timeline_accounts: Ca konti pinglagesos a super sequorekomendi di nova uzanti. closed_registrations_message: Montresas kande registradi klozesas - content_cache_retention_period: Omna posti e repeti de altra servili efacesos pos la specigita nombro de dii. Kelka posti forsan ne esos restaurebla. Omna relata libromarki, favoriziti e repeti anke esos perdita e neposible restaurota. custom_css: Vu povas pozar kustumizita staili en retverso di Mastodon. mascot: Remplas montreso en avanca retintervizajo. - media_cache_retention_period: Deschargita mediifaili efacesos pos la diiquanto kande fixesas a positiva nombro, e rideschargesas irgatempe. peers_api_enabled: Listo di domeni quin ca servilo trovis en la fediverso. Nula informo inkluzesas hike pri ka vu federas kun partikulara servilo, nur ke vua servilo savas pri lo. Co es uzata da enti qui kolektas statistiki pri federeso generale. profile_directory: La profilcheflisto montras omna uzanti quo voluntale volas esar deskovrebla. require_invite_text: Kande registradi bezonas manuala aprobo, ol kauzigas "Por quo vu volas juntas?" textoenpozo esar obliganta @@ -239,7 +236,6 @@ io: backups_retention_period: Uzantoarkivretendurtempo bootstrap_timeline_accounts: Sempre rekomendez ca konti a nova uzanti closed_registrations_message: Kustumizita mesajo kande registradi ne esas disponebla - content_cache_retention_period: Kontenajmemorajretendurtempo custom_css: Kustumizita CSS mascot: Kustumizita reprezentimajo (oldo) media_cache_retention_period: Mediimemorajretendurtempo diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index cae9bbed5..044e24deb 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -77,13 +77,15 @@ is: warn: Fela síað efni á bakvið aðvörun sem tekur fram titil síunnar form_admin_settings: activity_api_enabled: Fjöldi staðværra stöðufærslna, virkra notenda og nýskráninga í vikulegum skömmtum - backups_retention_period: Halda safni notandans í tiltekinn fjölda daga. + app_icon: WEBP, PNG, GIF eða JPG. Tekur yfir sjálfgefna táknmynd forrits á snjalltækjum með sérsniðinni táknmynd. + backups_retention_period: Notendur hafa kost á að útbúa safnskrár með færslunum sínum til að sækja svo síðar. Þegar þetta er stillt á jákvætt gildi, verður þessum safnskrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga. bootstrap_timeline_accounts: Þessir notendaaðgangar verða festir efst í meðmælum til nýrra notenda um að fylgjast með þeim. closed_registrations_message: Birtist þegar lokað er á nýskráningar - content_cache_retention_period: Færslum af öðrum netþjónum verður eytt eftir tiltekinn fjölda daga þegar þetta er jákvætt gildi. Þetta gæti verið óafturkallanleg aðgerð. + content_cache_retention_period: Öllum færslum af öðrum netþjónum (þar með taldar endurbirtingar og svör) verður eytt eftir uppgefinn fjölda daga, án tillits til gagnvirkni staðværra notenda við þessar færslur. Þetta á einnig við um færslur sem notandinn hefur merkt sem bókamerki eða eftirlæti. Beinar tilvísanir (einkaspjall) milli notenda af mismunandi netþjónum munu einnig tapast og er engin leið til að endurheimta þær. Notkun á þessari stillingu er einungis ætluð sérstilltum netþjónum og mun skemma fyrir notendum ef þetta er sett upp fyrir almenna notkun. custom_css: Þú getur virkjað sérsniðna stíla í vefútgáfu Mastodon. + favicon: WEBP, PNG, GIF eða JPG. Tekur yfir sjálfgefna Mastodon favicon-táknmynd með sérsniðinni táknmynd. mascot: Þetta tekyr yfir myndskreytinguna í ítarlega vefviðmótinu. - media_cache_retention_period: Sóttu myndefni verður eytt eftir tiltekinn fjölda daga þegar þetta er jákvætt gildi og síðan sótt aftur eftir þörfum. + media_cache_retention_period: Myndefnisskrár úr færslum sem gerðar eru af fjartengdum notendum eru geymdar á netþjóninum þínum. Þegar þetta er stillt á jákvætt gildi, verður þessum skrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga. Ef beðið er um myndefnið eftir að því er eytt, mun það verða sótt aftur ef frumgögnin eru ennþá aðgengileg. Vegna takmarkana á hversu oft forskoðunarspjöld tengla eru sótt á utanaðkomandi netþjóna, þá er mælt með því að setja þetta gildi á að minnsta kosti 14 daga, annars gæti mistekist að uppfæra forskoðunarspjöld tengla eftir þörfum fyrir þann tíma. peers_api_enabled: Listi yfir þau lénaheiti sem þessi netþjónn hefur rekist á í skýjasambandinu. Engin gögn eru hér sem gefa til kynna hvort þú sért í sambandi við tiltekinn netþjón, bara að netþjónninn þinn viti um hann. Þetta er notað af þjónustum sem safna tölfræði um skýjasambönd á almennan hátt. profile_directory: Notendamappan telur upp alla þá notendur sem hafa valið að vera uppgötvanlegir. require_invite_text: Þegar nýskráningar krefjast handvirks samþykkis, þá skal gera textann í “Hvers vegna viltu taka þátt?” að kröfu en ekki valkvæðan @@ -243,7 +245,7 @@ is: backups_retention_period: Tímalengd sem safni notandans er haldið eftir bootstrap_timeline_accounts: Alltaf mæla með þessum notendaaðgöngum fyrir nýja notendur closed_registrations_message: Sérsniðin skilaboð þegar ekki er hægt að nýskrá - content_cache_retention_period: Tímalengd sem haldið er í biðminni + content_cache_retention_period: Tímabil sem á að geyma fjartengt efni custom_css: Sérsniðið CSS mascot: Sérsniðið gæludýr (eldra) media_cache_retention_period: Tímalengd sem myndefni haldið diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index bf294a48c..f5624344b 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -77,13 +77,15 @@ it: warn: Nascondi il contenuto filtrato e mostra invece un avviso, citando il titolo del filtro form_admin_settings: activity_api_enabled: Conteggi di post pubblicati localmente, utenti attivi e nuove registrazioni in gruppi settimanali - backups_retention_period: Conserva gli archivi utente generati per il numero di giorni specificato. + app_icon: WEBP, PNG, GIF o JPG. Sostituisce l'icona dell'app predefinita sui dispositivi mobili con un'icona personalizzata. + backups_retention_period: Gli utenti hanno la possibilità di generare archivi dei propri post da scaricare successivamente. Se impostati su un valore positivo, questi archivi verranno automaticamente eliminati dallo spazio di archiviazione dopo il numero di giorni specificato. bootstrap_timeline_accounts: Questi account verranno aggiunti in cima ai consigli da seguire dei nuovi utenti. closed_registrations_message: Visualizzato alla chiusura delle iscrizioni - content_cache_retention_period: I post da altri server verranno eliminati dopo il numero di giorni specificato se impostato su un valore positivo. Questo potrebbe essere irreversibile. + content_cache_retention_period: Tutti i post da altri server (inclusi booster e risposte) verranno eliminati dopo il numero specificato di giorni, senza tener conto di eventuali interazioni con gli utenti locali con tali post. Questo include i post in cui un utente locale ha contrassegnato come segnalibri o preferiti. Anche le menzioni private tra utenti di diverse istanze andranno perse e impossibile da ripristinare. L'uso di questa impostazione è inteso per casi di scopo speciale e rompe molte aspettative dell'utente quando implementato per uso generale. custom_css: È possibile applicare stili personalizzati sulla versione web di Mastodon. + favicon: WEBP, PNG, GIF o JPG. Sostituisce la favicon predefinita di Mastodon con un'icona personalizzata. mascot: Sostituisce l'illustrazione nell'interfaccia web avanzata. - media_cache_retention_period: I file multimediali scaricati verranno eliminati dopo il numero di giorni specificato se impostati su un valore positivo e scaricati nuovamente su richiesta. + media_cache_retention_period: I file multimediali da post fatti da utenti remoti sono memorizzati nella cache sul tuo server. Quando impostato a un valore positivo, i media verranno eliminati dopo il numero specificato di giorni. Se i dati multimediali sono richiesti dopo che sono stati eliminati, saranno nuovamente scaricati, se il contenuto sorgente è ancora disponibile. A causa di restrizioni su quanto spesso link anteprima carte sondaggio siti di terze parti, si consiglia di impostare questo valore ad almeno 14 giorni, o le schede di anteprima link non saranno aggiornate su richiesta prima di quel tempo. peers_api_enabled: Un elenco di nomi di dominio che questo server ha incontrato nel fediverse. Qui non sono inclusi dati sul fatto se si federano con un dato server, solo che il server ne è a conoscenza. Questo viene utilizzato dai servizi che raccolgono statistiche sulla federazione in senso generale. profile_directory: La directory del profilo elenca tutti gli utenti che hanno acconsentito ad essere individuabili. require_invite_text: 'Quando le iscrizioni richiedono l''approvazione manuale, rendi la domanda: "Perché vuoi unirti?" obbligatoria anziché facoltativa' @@ -243,7 +245,7 @@ it: backups_retention_period: Periodo di conservazione dell'archivio utente bootstrap_timeline_accounts: Consiglia sempre questi account ai nuovi utenti closed_registrations_message: Messaggio personalizzato quando le iscrizioni non sono disponibili - content_cache_retention_period: Periodo di conservazione della cache dei contenuti + content_cache_retention_period: Periodo di ritenzione del contenuto remoto custom_css: Personalizza CSS mascot: Personalizza mascotte (legacy) media_cache_retention_period: Periodo di conservazione della cache multimediale diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 81615c134..c0698c3f7 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -77,13 +77,15 @@ ja: warn: フィルタに一致した投稿を非表示にし、フィルタのタイトルを含む警告を表示します form_admin_settings: activity_api_enabled: 週単位でローカルで公開された投稿数、アクティブユーザー数、新規登録者数を表示します - backups_retention_period: 生成されたユーザーのアーカイブを指定した日数の間保持します。 + app_icon: モバイル端末で表示されるデフォルトのアプリアイコンを独自のアイコンで上書きします。WEBP、PNG、GIF、JPGが利用可能です。 + backups_retention_period: ユーザーには、後でダウンロードするために投稿のアーカイブを生成する機能があります。正の値に設定すると、これらのアーカイブは指定された日数後に自動的にストレージから削除されます。 bootstrap_timeline_accounts: これらのアカウントは、新しいユーザー向けのおすすめユーザーの一番上にピン留めされます。 closed_registrations_message: アカウント作成を停止している時に表示されます - content_cache_retention_period: 指定した日数が経過した他のサーバーの投稿とブーストを削除します。削除された投稿は再取得できない場合があります。削除された投稿についたブックマークやお気に入り、ブーストも失われ、元に戻せません。 + content_cache_retention_period: 他のサーバーからのすべての投稿(ブーストや返信を含む)は、指定された日数が経過すると、ローカルユーザーとのやりとりに関係なく削除されます。これには、ローカルユーザーがブックマークやお気に入りとして登録した投稿も含まれます。異なるサーバーのユーザー間の非公開な変身も失われ、復元することは不可能です。この設定の使用は特別な目的のインスタンスのためのものであり、一般的な目的のサーバーで使用するした場合、多くのユーザーの期待を裏切ることになります。 custom_css: ウェブ版のMastodonでカスタムスタイルを適用できます。 + favicon: デフォルトのMastodonのブックマークアイコンを独自のアイコンで上書きします。WEBP、PNG、GIF、JPGが利用可能です。 mascot: 上級者向けWebインターフェースのイラストを上書きします。 - media_cache_retention_period: 正の値に設定されている場合、ダウンロードされたメディアファイルは指定された日数の後に削除され、リクエストに応じて再ダウンロードされます。 + media_cache_retention_period: リモートユーザーが投稿したメディアファイルは、あなたのサーバーにキャッシュされます。正の値を設定すると、メディアは指定した日数後に削除されます。削除後にメディアデータが要求された場合、ソースコンテンツがまだ利用可能であれば、再ダウンロードされます。リンクプレビューカードがサードパーティのサイトを更新する頻度に制限があるため、この値を少なくとも14日に設定することをお勧めします。 peers_api_enabled: このサーバーが Fediverse で遭遇したドメイン名のリストです。このサーバーが知っているだけで、特定のサーバーと連合しているかのデータは含まれません。これは一般的に Fediverse に関する統計情報を収集するサービスによって使用されます。 profile_directory: ディレクトリには、掲載する設定をしたすべてのユーザーが一覧表示されます。 require_invite_text: アカウント登録が承認制の場合、登録の際の申請事由の入力を必須にします @@ -243,7 +245,7 @@ ja: backups_retention_period: ユーザーアーカイブの保持期間 bootstrap_timeline_accounts: おすすめユーザーに常に表示するアカウント closed_registrations_message: アカウント作成を停止している時のカスタムメッセージ - content_cache_retention_period: コンテンツキャッシュの保持期間 + content_cache_retention_period: リモートコンテンツの保存期間 custom_css: カスタムCSS mascot: カスタムマスコット(レガシー) media_cache_retention_period: メディアキャッシュの保持期間 diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 790bcd061..54d36eafe 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -77,13 +77,15 @@ ko: warn: 필터 제목을 언급하는 경고 뒤에 걸러진 내용을 숨기기 form_admin_settings: activity_api_enabled: 주별 로컬에 게시된 글, 활성 사용자 및 새로운 가입자 수 - backups_retention_period: 생성된 사용자 아카이브를 며칠동안 저장할 지. + app_icon: WEBP, PNG, GIF 또는 JPG. 모바일 기기에 쓰이는 기본 아이콘을 대체합니다. + backups_retention_period: 사용자들은 나중에 다운로드하기 위해 게시물 아카이브를 생성할 수 있습니다. 양수로 설정된 경우 이 아카이브들은 지정된 일수가 지난 후에 저장소에서 자동으로 삭제될 것입니다. bootstrap_timeline_accounts: 이 계정들은 팔로우 추천 목록 상단에 고정됩니다. closed_registrations_message: 새 가입을 차단했을 때 표시됩니다 - content_cache_retention_period: 다른 서버의 게시물과 부스트들은 지정한 일수가 지나면 삭제될 것입니다. 몇몇 게시물들은 복구가 불가능할 것입니다. 관련된 북마크, 좋아요, 부스트 또한 잃어버릴 것이며 취소도 할 수 없습니다. + content_cache_retention_period: 다른 서버의 모든 게시물(부스트 및 답글 포함)은 해당 게시물에 대한 로컬 사용자의 상호 작용과 관계없이 지정된 일수가 지나면 삭제됩니다. 여기에는 로컬 사용자가 북마크 또는 즐겨찾기로 표시한 게시물도 포함됩니다. 다른 인스턴스 사용자와 주고 받은 비공개 멘션도 손실되며 복원할 수 없습니다. 이 설정은 특수 목적의 인스턴스를 위한 것이며 일반적인 용도의 많은 사용자의 예상이 빗나가게 됩니다. custom_css: 사용자 지정 스타일을 웹 버전의 마스토돈에 지정할 수 있습니다. + favicon: WEBP, PNG, GIF 또는 JPG. 기본 파비콘을 대체합니다. mascot: 고급 웹 인터페이스의 그림을 대체합니다. - media_cache_retention_period: 양수로 설정된 경우 다운로드된 미디어 파일들은 지정된 일수가 지나면 삭제될 것이고 필요할 때 다시 다운로드 될 것입니다. + media_cache_retention_period: 원격 사용자가 작성한 글의 미디어 파일은 이 서버에 캐시됩니다. 양수로 설정하면 지정된 일수 후에 미디어가 삭제됩니다. 삭제된 후에 미디어 데이터를 요청하면 원본 콘텐츠를 사용할 수 있는 경우 다시 다운로드됩니다. 링크 미리 보기 카드가 타사 사이트를 폴링하는 빈도에 제한이 있으므로 이 값을 최소 14일로 설정하는 것이 좋으며, 그렇지 않으면 그 이전에는 링크 미리 보기 카드가 제때 업데이트되지 않을 것입니다. peers_api_enabled: 이 서버가 연합우주에서 만났던 서버들에 대한 도메인 네임의 목록입니다. 해당 서버와 어떤 연합을 했는지에 대한 정보는 전혀 포함되지 않고, 단순히 그 서버를 알고 있는지에 대한 것입니다. 이것은 일반적으로 연합에 대한 통계를 수집할 때 사용됩니다. profile_directory: 프로필 책자는 발견되기를 희망하는 모든 사람들의 목록을 나열합니다. require_invite_text: 가입이 수동 승인을 필요로 할 때, "왜 가입하려고 하나요?" 항목을 선택사항으로 두는 것보다는 필수로 두는 것이 낫습니다 @@ -243,7 +245,7 @@ ko: backups_retention_period: 사용자 아카이브 유지 기한 bootstrap_timeline_accounts: 새로운 사용자들에게 추천할 계정들 closed_registrations_message: 가입이 불가능 할 때의 사용자 지정 메시지 - content_cache_retention_period: 콘텐츠 캐시 유지 기한 + content_cache_retention_period: 리모트 콘텐츠 보유 기간 custom_css: 사용자 정의 CSS mascot: 사용자 정의 마스코트 (legacy) media_cache_retention_period: 미디어 캐시 유지 기한 diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index aa8501bf2..0c4f87213 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -65,13 +65,10 @@ ku: hide: Naveroka parzûnkirî bi tevahî veşêre, mîna ku ew tune be tevbigere warn: Naveroka parzûnkirî li pişt hişyariyek ku sernavê parzûnê qal dike veşêre form_admin_settings: - backups_retention_period: Arşîvên bikarhênerên çêkirî ji bo rojên diyarkirî tomar bike. bootstrap_timeline_accounts: Ev ajimêr wê di pêşnîyarên şopandina bikarhênerên nû de werin derzîkirin. closed_registrations_message: Dema ku tomarkirin girtî bin têne xuyakirin - content_cache_retention_period: Şandiyên ji rajekarên din wê piştî çend rojên diyarkirî dema ku li ser nirxek erênî were danîn werin jêbirin. Dibe ku ev bê veger be. custom_css: Tu dikarî awayên kesane li ser guhertoya malperê ya Mastodon bicîh bikî. mascot: Îlustrasyona navrûyê webê yê pêşketî bêbandor dike. - media_cache_retention_period: Pelên medyayê yên daxistî wê piştî çend rojên diyarkirî dema ku li ser nirxek erênî were danîn werin jêbirin, û li gorî daxwazê ​​ji nû ve werin daxistin. profile_directory: Pelrêça profîlê hemû bikarhênerên keşfbûnê hilbijartine lîste dike. require_invite_text: Gava ku tomarkirin pêdiviya pejirandina destan dike, Têketina nivîsê "Tu çima dixwazî beşdar bibî?" Bike sereke ji devla vebijêrkî site_contact_email: Mirov dikarin ji bo pirsên qanûnî yan jî yên piştgiriyê çawa xwe digihînin te. @@ -218,7 +215,6 @@ ku: backups_retention_period: Serdema tomarkirina arşîva bikarhêner bootstrap_timeline_accounts: Van ajimêran ji bikarhênerên nû re pêşniyar bike closed_registrations_message: Peyama kesane dema ku tomarkirin peyda nebin - content_cache_retention_period: Serdema tomarkirina bîrdanka naverokê custom_css: CSS a kesanekirî mascot: Mascot a kesanekirî (legacy) media_cache_retention_period: Serdema tomarkirina bîrdanka medyayê diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index 75113be18..cef58e460 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -77,13 +77,10 @@ lad: warn: Eskonde el kontenido filtrado detras de una avertensya enmentando el titolo del filtro form_admin_settings: activity_api_enabled: Numero de publikasyones publikadas lokalmente, utilizadores activos i enrejistrasyones muevas kada semana - backups_retention_period: Manten las dosyas de utilizador djeneradas durante el numero de diyas espesifikado. bootstrap_timeline_accounts: Estos kuentos apareseran en la parte superior de las rekomendasiones de los muevos utilizadores. closed_registrations_message: Amostrado kuando las enrejistrasyones estan serrados - content_cache_retention_period: Las publikasyones de otros sirvidores se supremiran dempues del numero espesifikado de diyas kuando se establezka una valuta pozitiva. Esto puede ser irreversivle. custom_css: Puedes aplikar estilos personalizados a la version web de Mastodon. mascot: Reemplaza la ilustrasyon en la enterfaz web avanzada. - media_cache_retention_period: Las dosyas de multimedia abashadas se supremiran dempues del numero espesifikado de diyas kuando se establezka una valuta pozitiva, i se reabasharan basho demanda. peers_api_enabled: Una lista de nombres de domeno ke este sirvidor tiene topado en el Fediverso. Aki no se inkluye dingun dato sovre si federas kon un sirvidor determinado, solo ke tu sirvidor lo konese. Esto es utilizado por los servisyos ke rekopilan estatistikas sovre la federasyon en un senso djeneral. profile_directory: El katalogo de profiles lista a todos los utilizadores ke tienen optado por ke sus kuento pueda ser deskuvierto. require_invite_text: Kuando las enrejistrasyones rekieren achetasyon manuala, faze obligatoria la entrada de teksto "Por ke keres unirte?" en lugar de ser opsyonal @@ -243,7 +240,6 @@ lad: backups_retention_period: Periodo de retensyon de la dosya de utilizador bootstrap_timeline_accounts: Rekomenda siempre estos kuentos a muevos utilizadores closed_registrations_message: Mesaj personalizado kuando las enrejistrasyones no estan desponivles - content_cache_retention_period: Periodo de retensyon de kashe de kontenido custom_css: CSS personalizado mascot: Maskota personalizada (legado) media_cache_retention_period: Periodo de retensyon de kashe multimedia diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index 5431ea1b1..feec37ae0 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -40,7 +40,7 @@ lt: defaults: autofollow: Žmonės, kurie užsiregistruos per kvietimą, automatiškai seks tave avatar: WEBP, PNG, GIF arba JPG. Ne daugiau kaip %{size}. Bus sumažintas iki %{dimensions} tšk. - bot: Signalizuoti kitiems, kad paskyroje daugiausia atliekami automatiniai veiksmai ir kad ji gali būti nestebima + bot: Signalizuoti kitiems, kad paskyroje daugiausia atliekami automatiniai veiksmai ir kad ji gali būti nestebima. context: Vienas arba keli kontekstai, kuriems turėtų būti taikomas filtras current_password: Saugumo sumetimais įvesk dabartinės paskyros slaptažodį current_username: Kad patvirtintum, įvesk dabartinės paskyros naudotojo vardą @@ -49,18 +49,18 @@ lt: header: WEBP, PNG, GIF arba JPG. Ne daugiau kaip %{size}. Bus sumažintas iki %{dimensions} tšk. inbox_url: Nukopijuok URL adresą iš pradinio puslapio perdavėjo, kurį nori naudoti irreversible: Filtruoti įrašai išnyks negrįžtamai, net jei vėliau filtras bus pašalintas - locale: Naudotojo sąsajos kalba, el. laiškai ir stumiamieji pranešimai + locale: Naudotojo sąsajos kalba, el. laiškai ir tiesioginiai pranešimai password: Naudok bent 8 simbolius phrase: Bus suderinta, neatsižvelgiant į teksto lygį arba įrašo turinio įspėjimą scopes: Prie kurių API programai bus leidžiama pasiekti. Pasirinkus aukščiausio lygio sritį, atskirų sričių pasirinkti nereikia. - setting_aggregate_reblogs: Nerodyti naujų pakėlimų įrašams, kurie neseniai buvo pakelti (taikoma tik naujai gautiems pakėlimams) - setting_always_send_emails: Paprastai pranešimai el. paštu nebus siunčiami, kai aktyviai naudoji Mastodon - setting_default_sensitive: Jautrioji medija pagal numatytuosius nustatymus yra paslėpta ir gali būti atskleista paspaudus + setting_aggregate_reblogs: Nerodyti naujų pakėlimų įrašams, kurie neseniai buvo pakelti (taikoma tik naujai gautiems pakėlimams). + setting_always_send_emails: Paprastai el. laiško pranešimai nebus siunčiami, kai aktyviai naudoji Mastodon. + setting_default_sensitive: Jautrioji medija pagal numatytuosius nustatymus yra paslėpta ir gali būti atskleista spustelėjus. setting_display_media_default: Slėpti mediją, pažymėtą kaip jautrią setting_display_media_hide_all: Visada slėpti mediją setting_display_media_show_all: Visada rodyti mediją - setting_use_blurhash: Gradientai pagrįsti paslėptų vaizdų spalvomis, tačiau užgožia bet kokias detales - setting_use_pending_items: Slėpti laiko skalės naujienas po paspaudimo, vietoj automatinio kanalo slinkimo + setting_use_blurhash: Gradientai pagrįsti paslėptų vizualizacijų spalvomis, bet užgožia bet kokias detales. + setting_use_pending_items: Slėpti laiko skalės naujienas po paspaudimo, vietoj automatinio srauto slinkimo. username: Gali naudoti raides, skaičius ir pabraukimus whole_word: Kai raktažodis ar frazė yra tik raidinis ir skaitmeninis, jis bus taikomas tik tada, jei atitiks visą žodį email_domain_block: @@ -74,14 +74,23 @@ lt: warn: Slėpti filtruojamą turinį po įspėjimu, paminint filtro pavadinimą form_admin_settings: activity_api_enabled: Vietinių paskelbtų įrašų, aktyvių naudotojų ir naujų registracijų skaičiai kas savaitę - backups_retention_period: Laikyti sukurtus naudotojų archyvus nurodytą dienų skaičių. + app_icon: WEBP, PNG, GIF arba JPG. Pakeičia numatytąją programos piktogramą mobiliuosiuose įrenginiuose pasirinktine piktograma. + backups_retention_period: Naudotojai gali generuoti savo įrašų archyvus, kuriuos vėliau galės atsisiųsti. Nustačius teigiamą reikšmę, šie archyvai po nurodyto dienų skaičiaus bus automatiškai ištrinti iš saugyklos. + content_cache_retention_period: Visi įrašai iš kitų serverių (įskaitant pakėlimus ir atsakymus) bus ištrinti po nurodyto dienų skaičiaus, neatsižvelgiant į bet kokią vietinio naudotojo sąveiką su tais įrašais. Tai taikoma ir tiems įrašams, kuriuos vietinis naudotojas yra pažymėjęs kaip žymes ar mėgstamus. Privačios paminėjimai tarp naudotojų iš skirtingų instancijų taip pat bus prarastos ir jų bus neįmanoma atkurti. Šis nustatymas skirtas naudoti ypatingos paskirties instancijose, o įgyvendinus jį bendram naudojimui, pažeidžiami daugelio naudotojų lūkesčiai. + favicon: WEBP, PNG, GIF arba JPG. Pakeičia numatytąją Mastodon svetaines piktogramą pasirinktine piktograma. + mascot: Pakeičia išplėstinės žiniatinklio sąsajos iliustraciją. + media_cache_retention_period: Nuotolinių naudotojų įrašytų įrašų medijos failai talpinami tavo serveryje. Nustačius teigiamą reikšmę, medijos bus ištrinamos po nurodyto dienų skaičiaus. Jei medijos duomenų bus paprašyta po to, kai jie bus ištrinti, jie bus atsiųsti iš naujo, jei šaltinio turinys vis dar prieinamas. Dėl apribojimų, susijusių su nuorodų peržiūros kortelių apklausos dažnumu trečiųjų šalių svetainėse, rekomenduojama nustatyti šią reikšmę ne trumpesnę kaip 14 dienų, kitaip nuorodų peržiūros kortelės nebus atnaujinamos pagal pareikalavimą iki to laiko. peers_api_enabled: Domenų pavadinimų sąrašas, su kuriais šis serveris susidūrė fediverse. Čia nėra duomenų apie tai, ar tu bendrauji su tam tikru serveriu, tik apie tai, kad tavo serveris apie jį žino. Tai naudojama tarnybose, kurios renka federacijos statistiką bendrąja prasme. + require_invite_text: Kai registraciją reikia patvirtinti rankiniu būdu, teksto įvesties laukelį „Kodėl nori prisijungti?“ padaryk privalomą, o ne pasirenkamą site_contact_email: Kaip žmonės gali su tavimi susisiekti teisiniais ar pagalbos užklausimais. 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. + invite_request: + text: Tai padės mums peržiūrėti tavo paraišką rule: hint: Pasirinktinai. Pateik daugiau informacijos apie taisyklę. sessions: @@ -89,11 +98,13 @@ lt: webauthn: Jei tai USB raktas, būtinai jį įkišk ir, jei reikia, paspausk. settings: indexable: Tavo profilio puslapis gali būti rodomas paieškos rezultatuose Google, Bing ir kituose. + show_application: Neatsižvelgiant į tai, visada galėsi matyti, kuri programėlė paskelbė tavo įrašą. user: - chosen_languages: Kai pažymėta, viešose laiko skalėse bus rodomi tik įrašai pasirinktomis kalbomis + chosen_languages: Kai pažymėta, viešose laiko skalėse bus rodomi tik įrašai pasirinktomis kalbomis. role: Vaidmuo valdo, kokius leidimus naudotojas (-a) turi labels: account: + discoverable: Rekomenduoti profilį ir įrašus į atradimo algoritmus indexable: Įtraukti viešus įrašus į paieškos rezultatus show_collections: Rodyti sekimus ir sekėjus profilyje unlocked: Automatiškai priimti naujus sekėjus @@ -102,6 +113,7 @@ lt: admin_account_action: include_statuses: Įtraukti praneštus įrašus į el. laišką defaults: + autofollow: Kviesti sekti tavo paskyrą avatar: Profilio nuotrauka bot: Tai automatinė paskyra chosen_languages: Filtruoti kalbas @@ -116,19 +128,26 @@ lt: note: Biografija password: Slaptažodis phrase: Raktažodis arba frazė + setting_advanced_layout: Įjungti išplėstinę žiniatinklio sąsają + setting_aggregate_reblogs: Grupuoti pakėlimus laiko skalėse + setting_always_send_emails: Visada siųsti el. laiško pranešimus setting_auto_play_gif: Automatiškai leisti animuotų GIF setting_boost_modal: Rodyti patvirtinimo dialogą prieš pakėliant įrašą setting_default_language: Skelbimo kalba setting_default_privacy: Skelbimo privatumas setting_default_sensitive: Visada žymėti mediją kaip jautrią setting_delete_modal: Rodyti patvirtinimo dialogą prieš ištrinant įrašą + setting_disable_swiping: Išjungti perbraukimo judėjimus setting_display_media: Medijos rodymas setting_display_media_hide_all: Slėpti viską setting_display_media_show_all: Rodyti viską setting_expand_spoilers: Visada išplėsti įrašus, pažymėtus turinio įspėjimais setting_hide_network: Slėpti savo socialinę diagramą + setting_reduce_motion: Sumažinti judėjimą animacijose setting_system_font_ui: Naudoti numatytąjį sistemos šriftą setting_theme: Svetainės tema + setting_trends: Rodyti šiandienos trendus + setting_use_blurhash: Rodyti spalvingus paslėptos medijos gradientus setting_use_pending_items: Lėtas režimas title: Pavadinimas type: Importo tipas @@ -146,10 +165,11 @@ lt: form_admin_settings: activity_api_enabled: Skelbti suvestinį statistiką apie naudotojų veiklą per API bootstrap_timeline_accounts: Visada rekomenduoti šias paskyras naujiems naudotojams - content_cache_retention_period: Turinio talpyklos išlaikymo laikotarpis + content_cache_retention_period: Nuotolinio turinio saugojimo laikotarpis custom_css: Pasirinktinis CSS mascot: Pasirinktinis talismanas (pasenęs) registrations_mode: Kas gali užsiregistruoti + require_invite_text: Reikalauti priežasties prisijungti show_domain_blocks_rationale: Rodyti, kodėl domenai buvo užblokuoti site_extended_description: Išplėstas aprašymas site_short_description: Serverio aprašymas @@ -157,6 +177,11 @@ lt: site_title: Serverio pavadinimas theme: Numatytoji tema thumbnail: Serverio miniatūra + trendable_by_default: Leisti tendencijas be išankstinės peržiūros + trends: Įjungti tendencijas + trends_as_landing_page: Naudoti tendencijas kaip nukreipimo puslapį + invite: + comment: Komentuoti invite_request: text: Kodėl nori prisijungti? notification_emails: @@ -169,10 +194,12 @@ lt: software_updates: label: Yra nauja Mastodon versija patch: Pranešti apie klaidų ištaisymo atnaujinimus + trending_tag: Reikia peržiūros naujam tendencijai rule: hint: Papildoma informacija text: Taisyklė settings: + indexable: Įtraukti profilio puslapį į paieškos variklius show_application: Rodyti, iš kurios programėles išsiuntei įrašą tag: listable: Leisti šį saitažodį rodyti paieškose ir pasiūlymuose diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 002761065..711484b64 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -77,13 +77,10 @@ lv: warn: Paslēp filtrēto saturu aiz brīdinājuma, kurā minēts filtra nosaukums form_admin_settings: activity_api_enabled: Vietēji publicēto ziņu, aktīvo lietotāju un jauno reģistrāciju skaits nedēļas kopās - backups_retention_period: Saglabā ģenerētos lietotāju arhīvus norādīto dienu skaitā. bootstrap_timeline_accounts: Šie konti tiks piesprausti jauno lietotāju ieteikumu augšdaļā. closed_registrations_message: Tiek rādīts, kad reģistrēšanās ir slēgta - content_cache_retention_period: Ziņas no citiem serveriem tiks dzēstas pēc norādītā dienu skaita, ja ir iestatīta pozitīva vērtība. Tas var būt neatgriezeniski. custom_css: Vari lietot pielāgotus stilus Mastodon tīmekļa versijā. mascot: Ignorē ilustrāciju uzlabotajā tīmekļa saskarnē. - media_cache_retention_period: Lejupielādētie multivides faili tiks dzēsti pēc norādītā dienu skaita, kad tie būs iestatīti uz pozitīvu vērtību, un pēc pieprasījuma tiks lejupielādēti atkārtoti. peers_api_enabled: Domēna vārdu saraksts, ar kuriem šis serveris ir saskāries fediversā. Šeit nav iekļauti dati par to, vai tu veic federāciju ar noteiktu serveri, tikai tavs serveris par to zina. To izmanto dienesti, kas apkopo statistiku par federāciju vispārīgā nozīmē. profile_directory: Profilu direktorijā ir uzskaitīti visi lietotāji, kuri ir izvēlējušies būt atklājami. require_invite_text: 'Ja pierakstīšanai nepieciešama manuāla apstiprināšana, izdari tā, lai teksta: “Kāpēc vēlaties pievienoties?” ievade ir obligāta, nevis opcionāla' @@ -242,7 +239,6 @@ lv: backups_retention_period: Lietotāja arhīva glabāšanas periods bootstrap_timeline_accounts: Vienmēr iesaki šos kontus jaunajiem lietotājiem closed_registrations_message: Pielāgots ziņojums, ja reģistrēšanās nav pieejama - content_cache_retention_period: Satura arhīva glabāšanas periods custom_css: Pielāgots CSS mascot: Pielāgots talismans (mantots) media_cache_retention_period: Multivides kešatmiņas saglabāšanas periods diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml index 9e9931cc3..ae375149e 100644 --- a/config/locales/simple_form.ms.yml +++ b/config/locales/simple_form.ms.yml @@ -75,13 +75,10 @@ ms: warn: Sembunyikan kandungan yang ditapis di sebalik amaran yang menyebut tajuk penapis form_admin_settings: activity_api_enabled: Kiraan siaran tempatan yang diterbitkan, pengguna aktif dan pendaftaran baharu dalam baldi mingguan - backups_retention_period: Simpan arkib pengguna yang dijana untuk bilangan hari yang ditentukan. bootstrap_timeline_accounts: Akaun ini akan disematkan pada bahagian atas cadangan ikutan pengguna baharu. closed_registrations_message: Dipaparkan semasa pendaftaran ditutup - content_cache_retention_period: Semua pos dan rangsangan daripada server lain akan dipadamkan selepas bilangan hari yang ditentukan. Sesetengah siaran mungkin tidak boleh dipulihkan. Semua penanda halaman, kegemaran dan rangsangan yang berkaitan juga akan hilang dan mustahil untuk dibuat asal. custom_css: Anda boleh menggunakan gaya tersuai pada versi web Mastodon. mascot: Mengatasi ilustrasi dalam antara muka web lanjutan. - media_cache_retention_period: Fail media yang dimuat turun akan dipadamkan selepas bilangan hari yang ditetapkan apabila ditetapkan kepada nilai positif dan dimuat turun semula atas permintaan. peers_api_enabled: Senarai nama domain yang pernah ditemui oleh server ini dalam fediverse. Tiada data disertakan di sini tentang sama ada anda bersekutu dengan server tertentu, cuma server anda mengetahuinya. Ini digunakan oleh perkhidmatan yang mengumpul statistik mengenai persekutuan dalam pengertian umum. profile_directory: Direktori profil menyenaraikan semua pengguna yang telah mengikut serta untuk ditemui. require_invite_text: Apabila pendaftaran memerlukan kelulusan manual, buat "Mengapa anda mahu menyertai?" input teks wajib dan bukannya pilihan @@ -240,7 +237,6 @@ ms: backups_retention_period: Tempoh pengekalan arkib pengguna bootstrap_timeline_accounts: Sentiasa mengesyorkan akaun ini kepada pengguna baharu closed_registrations_message: Mesej tersuai apabila pendaftaran tidak tersedia - content_cache_retention_period: Tempoh pengekalan cache kandungan custom_css: CSS tersuai mascot: Maskot tersuai (warisan) media_cache_retention_period: Tempoh pengekalan cache media diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index 4f8a39782..20c862ab2 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -75,13 +75,10 @@ my: warn: စစ်ထုတ်မှုခေါင်းစဉ်ကိုဖော်ပြသည့်သတိပေးချက်နောက်တွင် စစ်ထုတ်ထားသောအကြောင်းအရာကို ဖျောက်ထားပါ form_admin_settings: activity_api_enabled: အပတ်စဉ် စာရင်းများတွင် ဒေသတွင်းတင်ထားသောပို့စ်များ၊ လက်ရှိအသုံးပြုသူများနှင့် စာရင်းသွင်းမှုအသစ်များ - backups_retention_period: သတ်မှတ်ထားသော ရက်အရေအတွက်အလိုက် အသုံးပြုသူမှတ်တမ်းများကို သိမ်းဆည်းပါ။ bootstrap_timeline_accounts: ဤအကောင့်များကို အသုံးပြုသူအသစ်များ၏ စောင့်ကြည့်မှု အကြံပြုချက်များ၏ထိပ်ဆုံးတွင် ပင်ချိတ်ထားပါမည်။ closed_registrations_message: အကောင့်ဖွင့်ခြင်းများကို ပိတ်ထားသည့်အခါတွင် ပြသထားသည် - content_cache_retention_period: သတ်မှတ်ထားသောရက်များပြီးနောက် အခြားဆာဗာများမှ ပို့စ်များကို ဖျက်လိုက်ပါမည်။ ပြန်လည်ပြင်ဆင်၍မရပါ။ custom_css: Mastodon ဝဘ်ဗားရှင်းတွင် စိတ်ကြိုက်စတိုင်များကို အသုံးပြုနိုင်ပါသည်။ mascot: အဆင့်မြင့် ဝဘ်ပုံစံတွင်တွင် ရုပ်ပုံဖြင့်ဖော်ပြထားသည်။ - media_cache_retention_period: သတ်မှတ်ထားသောရက်များပြီးနောက် ဒေါင်းလုဒ်လုပ်ထားသော မီဒီယာဖိုင်များကို ဖျက်လိုက်ပါမည်။ တောင်းဆိုပါက ပြန်လည်ဒေါင်းလုဒ် လုပ်ခွင့်ရှိသည်။ peers_api_enabled: ဤဆာဗာမှတွေ့ရသော ဖက်ဒီနယ်ပယ်ပေါင်းစုံရှိ ဒိုမိန်းအမည်များစာရင်း။ ဖက်ဒီနယ်ပယ်များမှာ သင်အသုံးပြုနေသည့်ဆာဗာနှင့် ပေါင်းစပ်ခြင်းရှိသည်ဖြစ်စေ၊ မရှိသည်ဖြစ်စေ ဤနေရာတွင် အချက်အလက်များကို မပြသထားပါ။ ယေဘုယျအားဖြင့် ဖက်ဒရယ်ဆိုင်ရာ စာရင်းအင်းများစုဆောင်းသည့် ဝန်ဆောင်မှုကိုသာ အသုံးပြုထားသည်။ profile_directory: ပရိုဖိုင်လမ်းညွှန်တွင် ရှာဖွေ‌နိုင်သည့်အသုံးပြုသူအားလုံးကို စာရင်းပြုစုထားသည်။ require_invite_text: အကောင့်ဖွင့်ရာတွင် လူကိုယ်တိုင်ခွင့်ပြုချက်လိုအပ်သောအခါ “ဘာကြောင့်ပါဝင်ချင်သလဲ” ဟုလုပ်ပါ။ စိတ်ကြိုက်ရွေးချယ်မည့်အစား စာသားထည့်သွင်းရန်မဖြစ်မနေထည့်သွင်းပါ။ @@ -240,7 +237,6 @@ my: backups_retention_period: အသုံးပြုသူ၏ မှတ်တမ်းကာလ bootstrap_timeline_accounts: ဤအကောင့်များကို အသုံးပြုသူအသစ်များအတွက် အကြံပြုပေးပါ closed_registrations_message: အကောင့်ဖွင့်ခြင်းများ မရတော့သောအခါ စိတ်ကြိုက်မက်ဆေ့ချ်ပို့ခြင်း - content_cache_retention_period: အကြောင်းအရာ ကက်ရှ်ထိန်းသိမ်းသည့်ကာလ custom_css: စိတ်ကြိုက်ပြုလုပ်ထားသော CSS mascot: စိတ်ကြိုက်ပြုလုပ်ထားသော mascot (legacy) media_cache_retention_period: မီဒီယာကက်ရှ် ထိန်းသိမ်းသည့်ကာလ diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 2f2107b13..2271d7037 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -28,7 +28,7 @@ nl: sensitive: Forceer dat alle mediabijlagen van deze gebruiker als gevoelig worden gemarkeerd. silence: Voorkom dat de gebruiker berichten kan plaatsen met openbare zichtbaarheid, verberg diens berichten en meldingen van mensen die de gebruiker niet volgen. Sluit alle rapportages tegen dit account af. suspend: Voorkom interactie van of naar dit account en verwijder de inhoud. Dit is omkeerbaar binnen 30 dagen. Dit sluit alle rapporten tegen dit account af. - warning_preset_id: Optioneel. Je kunt nog steeds handmatig tekst toevoegen aan het eind van de voorinstelling + warning_preset_id: Optioneel. Je kunt nog steeds handmatig tekst toevoegen aan het eind van de preset announcement: all_day: Wanneer dit is aangevinkt worden alleen de datums binnen het tijdvak getoond ends_at: Optioneel. De publicatie van de mededeling wordt op dit tijdstip automatisch beëindigd @@ -77,13 +77,15 @@ nl: warn: Verberg de gefilterde inhoud achter een waarschuwing, met de titel van het filter als waarschuwingstekst form_admin_settings: activity_api_enabled: Aantallen lokaal gepubliceerde berichten, actieve gebruikers en nieuwe registraties per week - backups_retention_period: De aangemaakte gebruikersarchieven voor het opgegeven aantal dagen behouden. + app_icon: WEBP, PNG, GIF of JPG. Vervangt op mobiele apparaten het standaard app-pictogram met een aangepast pictogram. + backups_retention_period: Gebruikers hebben de mogelijkheid om archieven van hun berichten te genereren om later te downloaden. Indien ingesteld op een positieve waarde, worden deze archieven automatisch verwijderd uit jouw opslag na het opgegeven aantal dagen. bootstrap_timeline_accounts: Deze accounts worden bovenaan de aanbevelingen aan nieuwe gebruikers getoond. Meerdere gebruikersnamen met komma's scheiden. closed_registrations_message: Weergegeven wanneer registratie van nieuwe accounts is uitgeschakeld - content_cache_retention_period: Alle berichten van andere servers worden na het opgegeven aantal dagen verwijderd. Deze berichten kunnen daarna hoogstwaarschijnlijk niet meer worden hersteld. Alle gerelateerde bladwijzers, favorieten en boosts worden eveneens onomkeerbaar verwijderd. + content_cache_retention_period: Alle berichten van andere servers (inclusief boosts en reacties) worden verwijderd na het opgegeven aantal dagen, ongeacht enige lokale gebruikersinteractie met die berichten. Dit betreft ook berichten die een lokale gebruiker aan diens bladwijzers heeft toegevoegd of als favoriet heeft gemarkeerd. Privéberichten tussen gebruikers van verschillende servers gaan ook verloren en zijn onmogelijk te herstellen. Het gebruik van deze instelling is bedoeld voor servers die een speciaal doel dienen en overtreedt veel gebruikersverwachtingen wanneer deze voor algemeen gebruik wordt geïmplementeerd. custom_css: Je kunt aangepaste CSS toepassen op de webversie van deze Mastodon-server. + favicon: WEBP, PNG, GIF of JPG. Vervangt de standaard Mastodon favicon met een aangepast pictogram. mascot: Overschrijft de illustratie in de geavanceerde webomgeving. - media_cache_retention_period: Mediabestanden die van andere servers zijn gedownload worden na het opgegeven aantal dagen verwijderd en worden op verzoek opnieuw gedownload. + media_cache_retention_period: Mediabestanden van berichten van externe gebruikers worden op jouw server in de cache opgeslagen. Indien ingesteld op een positieve waarde, worden media verwijderd na het opgegeven aantal dagen. Als de mediagegevens worden opgevraagd nadat ze zijn verwijderd, worden ze opnieuw gedownload wanneer de originele inhoud nog steeds beschikbaar is. Vanwege beperkingen op hoe vaak linkvoorbeelden sites van derden raadplegen, wordt aanbevolen om deze waarde in te stellen op ten minste 14 dagen. Anders worden linkvoorbeelden niet op aanvraag bijgewerkt. peers_api_enabled: Een lijst met domeinnamen die deze server heeft aangetroffen in de fediverse. Er zijn hier geen gegevens inbegrepen over de vraag of je verbonden bent met een bepaalde server, alleen dat je server er van weet. Dit wordt gebruikt door diensten die statistieken over de federatie in algemene zin verzamelen. profile_directory: De gebruikersgids bevat een lijst van alle gebruikers die ervoor gekozen hebben om ontdekt te kunnen worden. require_invite_text: Maak het invullen van "Waarom wil je je hier registreren?" verplicht in plaats van optioneel, wanneer registraties handmatig moeten worden goedgekeurd @@ -166,7 +168,7 @@ nl: sensitive: Gevoelig silence: Beperken suspend: Opschorten en onomkeerbaar accountgegevens verwijderen - warning_preset_id: Gebruik een voorinstelling van een waarschuwing + warning_preset_id: Een preset voor een waarschuwing gebruiken announcement: all_day: Gedurende de hele dag ends_at: Eindigt @@ -243,7 +245,7 @@ nl: backups_retention_period: Bewaartermijn gebruikersarchief bootstrap_timeline_accounts: Accounts die altijd aan nieuwe gebruikers worden aanbevolen closed_registrations_message: Aangepast bericht wanneer registratie is uitgeschakeld - content_cache_retention_period: Bewaartermijn berichtencache + content_cache_retention_period: Bewaartermijn voor externe inhoud custom_css: Aangepaste CSS mascot: Aangepaste mascotte (legacy) media_cache_retention_period: Bewaartermijn mediacache diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index a9f5f609f..a200e1206 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -8,8 +8,8 @@ nn: fields: Heimesida di, pronomen, alder, eller kva du måtte ynskje. indexable: Dei offentlege innlegga dine kan dukka opp i søkjeresultat på Mastodon. Folk som har reagert på oinnlegga dine kan uansett søkja gjennom dei. note: 'Du kan @nemne folk eller #emneknaggar.' - show_collections: Andre kan sjå kven du følgjer og kven som følgjer deg. Dei du følgjer kan alltid sjå at du følgjer dei. - unlocked: Alle kan følgje deg utan å måtte spørje om det. Vel bort om du vil gå gjennom førespurnadar om å følgje deg og seie ja eller nei. + show_collections: Andre kan sjå kven du fylgjer og kven som fylgjer deg. Dei du fylgjer kan alltid sjå at du fylgjer dei. + unlocked: Alle kan fylgja deg utan å måtta be om det. Vel bort dersom du vil gå gjennom førespurnader om å fylgja deg og seia ja eller nei til kvar av dei. account_alias: acct: Angi brukarnamn@domene til brukaren du ynskjer å flytta frå account_migration: @@ -77,13 +77,15 @@ nn: warn: Skjul det filtrerte innhaldet bak ei åtvaring som nemner tittelen på filteret form_admin_settings: activity_api_enabled: Tal på lokale innlegg, aktive brukarar og nyregistreringar kvar veke - backups_retention_period: Ta vare på genererte brukararkiv i angitt antal dagar. + app_icon: WEBP, PNG, GIF eller JPG. Overstyrer standard-app-ikonet på mobile einingar med eit eigendefinert ikon. + backups_retention_period: Brukarar har moglegheit til å generere arkiv av sine innlegg for å laste ned seinare. Når sett til ein positiv verdi, blir desse arkiva automatisk sletta frå lagringa etter eit gitt antal dagar. bootstrap_timeline_accounts: Desse kontoane vil bli festa øverst på fylgjaranbefalingane til nye brukarar. closed_registrations_message: Vist når det er stengt for registrering - content_cache_retention_period: Innlegg frå andre tenarar vil bli sletta etter det angitte talet på dagar når det er sett til ein positiv verdi. Dette kan vera irreversibelt. + content_cache_retention_period: Alle innlegg frå andre serverar (inkludert boostar og svar) vil bli sletta etter dei gitte antal dagar, uten hensyn til lokale brukarinteraksjonar med desse innlegga. Dette inkluderer innlegg der ein lokal brukar har merka det som bokmerker eller som favorittar. Òg private nemningar mellom brukarar frå ulike førekomstar vil gå tapt og vere umogleg å gjenskape. Bruk av denne innstillinga er rekna på spesielle førekomstar og bryt mange brukarforventingar når dette blir tatt i generell bruk. custom_css: Du kan bruka eigendefinerte stilar på nettversjonen av Mastodon. + favicon: WEBP, PNG, GIF eller JPG. Overstyrer det standarde Mastodon-favikonet med eit eigendefinert ikon. mascot: Overstyrer illustrasjonen i det avanserte webgrensesnittet. - media_cache_retention_period: Mediafiler som har blitt lasta ned vil bli sletta etter det angitte talet på dagar når det er sett til ein positiv verdi, og lasta ned på nytt ved etterspørsel. + media_cache_retention_period: Mediafiler frå innlegg laga av eksterne brukarar blir bufra på serveren din. Når sett til ein positiv verdi, slettast media etter eit gitt antal dagar. Viss mediedata blir førespurt etter det er sletta, vil dei bli lasta ned på nytt viss kjelda sitt innhald framleis er tilgjengeleg. På grunn av restriksjonar på kor ofte lenkeførehandsvisningskort lastar tredjepart-nettstadar, rådast det til å setje denne verdien til minst 14 dagar, eller at førehandsvisningskort ikkje blir oppdatert på førespurnad før det tidspunktet. peers_api_enabled: Ei liste over domenenamn denne tenaren har møtt på i allheimen. Det står ingenting om tenaren din samhandlar med ein annan tenar, berre om tenaren din veit om den andre. Dette blir brukt av tenester som samlar statistikk om føderering i det heile. profile_directory: Profilkatalogen viser alle brukarar som har valt å kunne bli oppdaga. require_invite_text: Når registrering krev manuell godkjenning, lyt du gjera tekstfeltet "Kvifor vil du bli med?" obligatorisk i staden for valfritt @@ -146,7 +148,7 @@ nn: name: Merkelapp value: Innhald indexable: Ta med offentlege innlegg i søkjeresultat - show_collections: Vis følgjer og følgjare på profilen + show_collections: Vis dei du fylgjer og dei som fylgjer deg på profilen din unlocked: Godta nye følgjare automatisk account_alias: acct: Brukarnamnet på den gamle kontoen @@ -243,7 +245,7 @@ nn: backups_retention_period: Arkiveringsperiode for brukararkiv bootstrap_timeline_accounts: Tilrå alltid desse kontoane for nye brukarar closed_registrations_message: Eigendefinert melding når registrering ikkje er mogleg - content_cache_retention_period: Oppbevaringsperiode for innhaldsbuffer + content_cache_retention_period: Oppbevaringstid for eksternt innhald custom_css: Egendefinert CSS mascot: Eigendefinert maskot (eldre funksjon) media_cache_retention_period: Oppbevaringsperiode for mediebuffer diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index a1050c9f9..de3788aa4 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -77,13 +77,10 @@ warn: Skjul det filtrerte innholdet bak et varsel som omtaler filterets tittel form_admin_settings: activity_api_enabled: Teller med lokale publiserte innlegg, aktive brukere og nye registreringer i ukentlige bøtter - backups_retention_period: Behold genererte brukerarkiv i det angitte antall dager. bootstrap_timeline_accounts: Disse kontoene vil bli festet til toppen av nye brukeres følge-anbefalinger. closed_registrations_message: Vises når det er stengt for registrering - content_cache_retention_period: Innlegg fra andre tjenere vil slettes etter det angitte antall dager når det er satt til en positiv verdi. Dette kan være irreversibelt. custom_css: Du kan bruke egendefinerte stiler på nettversjonen av Mastodon. mascot: Overstyrer illustrasjonen i det avanserte webgrensesnittet. - media_cache_retention_period: Mediafiler som lastes ned vil bli slettet etter det angitte antall dager når det settes til en positiv verdi, og blir lastet ned på nytt ved behov. peers_api_enabled: En liste over domenenavn denne serveren har oppstått i fødiverset. Det finnes ikke data om du føderer med en gitt server, for akkurat det serveren din vet om. Dette brukes av tjenester som i all hovedsak innhenter føderasjonsstatistikk. profile_directory: Profilkatalogen viser alle brukere som har valgt å kunne bli oppdaget. require_invite_text: Når registreringer krever manuell godkjenning, må du gjøre «Hvorfor vil du bli med?»-tekstinput obligatorisk i stedet for valgfritt @@ -242,7 +239,6 @@ backups_retention_period: Brukers oppbevaringsperiode for arkiv bootstrap_timeline_accounts: Anbefaler alltid disse kontoene til nye brukere closed_registrations_message: Egendefinert melding når registrering ikke er tilgjengelig - content_cache_retention_period: Oppbevaringsperiode for innholdsbuffer custom_css: Egendefinert CSS mascot: Egendefinert maskot (legacy) media_cache_retention_period: Oppbevaringsperiode for mediebuffer diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 3a1c619f7..9d82384af 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -77,13 +77,15 @@ pl: warn: Ukryj filtrowaną zawartość za ostrzeżeniem wskazującym tytuł filtra form_admin_settings: activity_api_enabled: Liczby opublikowanych lokalnych postów, aktywnych użytkowników i nowych rejestracji w tygodniowych przedziałach - backups_retention_period: Zachowaj wygenerowane archiwa użytkownika przez określoną liczbę dni. + app_icon: WEBP, PNG, GIF, albo JPEG. Nadpisuje domyślną ikonę aplikacji na urządzeniach mobilnych. + backups_retention_period: Użytkownicy mogą generować archiwa wpisów do późniejszego pobrania. Jeżeli ta wartość jest dodatnia, te archiwa zostaną automatycznie usunięte z twojego serwera po danej liczbie dni. bootstrap_timeline_accounts: Te konta zostaną przypięte na górze rekomendacji obserwacji nowych użytkowników. closed_registrations_message: Wyświetlane po zamknięciu rejestracji - content_cache_retention_period: Posty z innych serwerów zostaną usunięte po określonej liczbie dni, kiedy liczba jest ustawiona na wartość dodatnią. Może to być nieodwracalne. + content_cache_retention_period: Wszystkie wpisy z innych serwerów (w tym podbicia i odpowiedzi) zostaną usunięte po danej liczbie dni, bez względu na interakcje z nimi twoich użytkowników. Zawierają się w tym wpisy, które twoi użytkownicy dodali do zakładek lub ulubionych. Prywatne wzmianki od innych instancji zostaną utracone i będą nieprzywracalne. To ustawienie jest przeznaczone dla instancji zastosowania specjalnego i jest niezgodne z wieloma oczekiwaniami użytkowników. custom_css: Możesz zastosować niestandardowe style w internetowej wersji Mastodon. + favicon: WEBP, PNG, GIF, albo JPEG. Nadpisuje domyślną faviconę Mastodona. mascot: Nadpisuje ilustrację w zaawansowanym interfejsie internetowym. - media_cache_retention_period: Pobrane pliki multimedialne zostaną usunięte po określonej liczbie dni po ustawieniu na wartość dodatnią i ponownie pobrane na żądanie. + media_cache_retention_period: Media z wpisów od obcych użytkowników są cache'owane na twoim serwerze. Kiedy dana wartość jest dodatnia, media te będą usunięte po tylu dniach. Jeżeli usunięte media zostaną potem zażądane, oryginał zostanie ponownie pobrany (o ile jest dalej dostępny). Z powodu ograniczeń dot. częstotliwości z jaką karty podglądu linków dopytują się o dane od stron trzecich, zalecana wartość to min. 14 dni, bo karty podglądu linków nie będą wcześniej odświeżane na żądane. peers_api_enabled: Lista nazw domen, z którymi ten serwer spotkał się w fediverse. Nie są tu zawarte żadne dane o tym, czy użytkownik dokonuje federacji z danym serwerem, a jedynie, że jego serwer o tym wie. Jest to wykorzystywane przez serwisy, które zbierają statystyki dotyczące federacji w ogólnym sensie. profile_directory: Katalog profili zawiera listę wszystkich użytkowników, którzy zgodzili się na bycie znalezionymi. require_invite_text: Kiedy rejestracje wymagają ręcznego zatwierdzenia, ustaw pole "Dlaczego chcesz dołączyć?" jako obowiązkowe, a nie opcjonalne @@ -243,7 +245,7 @@ pl: backups_retention_period: Okres przechowywania archiwum użytkownika bootstrap_timeline_accounts: Zawsze rekomenduj te konta nowym użytkownikom closed_registrations_message: Niestandardowa wiadomość, gdy rejestracje nie są dostępne - content_cache_retention_period: Okres przechowywania pamięci podręcznej + content_cache_retention_period: Okres zachowywania zdalnych treści custom_css: Niestandardowy CSS mascot: Własna ikona media_cache_retention_period: Okres przechowywania pamięci podręcznej diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index c3eea9f11..77a0d8cd6 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -77,13 +77,15 @@ pt-BR: warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro form_admin_settings: activity_api_enabled: Contagem de publicações locais, usuários ativos e novos usuários semanais - backups_retention_period: Manter os arquivos de usuário gerados pelo número de dias especificados. + app_icon: WEBP, PNG, GIF ou JPG. Sobrescrever o ícone padrão do aplicativo em dispositivos móveis com um ícone personalizado. + backups_retention_period: Os usuários têm a capacidade de gerar arquivos de suas postagens para baixar mais tarde. Quando definido como um valor positivo, esses arquivos serão automaticamente excluídos do seu armazenamento após o número especificado de dias. bootstrap_timeline_accounts: Estas contas serão fixadas no topo das recomendações de novos usuários para seguir. closed_registrations_message: Exibido quando as inscrições estiverem fechadas - content_cache_retention_period: Postagens de outros servidores serão excluídas após o número de dias especificados, quando definido com um valor positivo. Isso pode ser irreversível. + content_cache_retention_period: Todas as postagens de outros servidores (incluindo boosts e respostas) serão excluídas após o número especificado de dias, sem levar a qualquer interação do usuário local com esses posts. Isto inclui postagens onde um usuário local o marcou como favorito ou favoritos. Menções privadas entre usuários de diferentes instâncias também serão perdidas e impossíveis de restaurar. O uso desta configuração destina-se a instâncias especiais de propósitos e quebra muitas expectativas dos usuários quando implementadas para uso de propósito geral. custom_css: Você pode aplicar estilos personalizados na versão da web do Mastodon. + favicon: WEBP, PNG, GIF ou JPG. Sobrescreve o favicon padrão do Mastodon com um ícone personalizado. mascot: Substitui a ilustração na interface web avançada. - media_cache_retention_period: Os arquivos de mídia baixados serão excluídos após o número especificado de dias, quando definido para um valor positivo, e baixados novamente na demanda. + media_cache_retention_period: Arquivos de mídia de mensagens de usuários remotos são armazenados em cache no seu servidor. Quando definido como valor positivo, a mídia será excluída após o número especificado de dias. Se os dados da mídia forem solicitados depois de excluídos, eles serão baixados novamente, se o conteúdo fonte ainda estiver disponível. Devido a restrições de quantas vezes os cartões de visualização de links sondam sites de terceiros, é recomendado definir este valor em pelo menos 14 dias, ou pré-visualização de links não serão atualizados a pedido antes desse tempo. peers_api_enabled: Uma lista de nomes de domínio que este servidor encontrou no "fediverse". Nenhum dado é incluído aqui sobre se você concorda com os padroes operacionais de um determinado servidor, apenas que o seu servidor sabe disso. Esta ferramenta é utilizado por serviços que recolhem estatísticas sob as normas da federação (grupo de empresas que concordam sob paramentros operacionais específicos), em termos gerais. profile_directory: O diretório de perfis lista todos os usuários que optaram por permitir que suas contas sejam descobertas. require_invite_text: 'Quando o cadastro de novas contas exigir aprovação manual, tornar obrigatório, ao invés de opcional, o texto de solicitação de convite: "Por que você deseja ingressar nessa comunidade?"' @@ -243,7 +245,7 @@ pt-BR: backups_retention_period: Período de retenção do arquivo de usuário bootstrap_timeline_accounts: Sempre recomendar essas contas para novos usuários closed_registrations_message: Mensagem personalizada quando inscrições não estão disponíveis - content_cache_retention_period: Período de retenção do cachê de conteúdo + content_cache_retention_period: Período de retenção de conteúdo remoto custom_css: CSS personalizável mascot: Mascote personalizado (legado) media_cache_retention_period: Período de retenção do cachê de mídia diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index a84f97f88..7fcbb210c 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -77,13 +77,15 @@ pt-PT: warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro form_admin_settings: activity_api_enabled: Contagem, em blocos semanais, de publicações locais, utilizadores ativos e novos registos - backups_retention_period: Manter os ficheiros gerados pelos utilizadores durante um número concreto de dias. + app_icon: WEBP, PNG, GIF ou JPG. Substitui o ícone padrão do aplicativo em dispositivos móveis por um ícone personalizado. + backups_retention_period: Os utilizadores têm a possibilidade de gerar arquivos das suas mensagens para descarregar mais tarde. Quando definido para um valor positivo, estes arquivos serão automaticamente eliminados do seu armazenamento após o número de dias especificado. bootstrap_timeline_accounts: Estas contas serão destacadas no topo das recomendações aos novos utilizadores. closed_registrations_message: Apresentado quando as inscrições estiverem encerradas - content_cache_retention_period: Publicações de outros servidores serão apagadas decorrido o número de dias especificado, se estiver definido um valor positivo. Isso pode ser irreversível. + content_cache_retention_period: Todas as publicações de outros servidores (incluindo boosts e respostas) serão eliminadas após o número de dias especificado, independentemente de qualquer interação do utilizador local com essas publicações. Isto inclui publicações em que um utilizador local as tenha marcado como favoritas ou adicionado aos items salvos. As menções privadas entre utilizadores de instâncias diferentes também se perderão e serão impossíveis de restaurar. A utilização desta definição destina-se a instâncias para fins especiais e quebra muitas expectativas dos utilizadores quando implementada para utilização geral. custom_css: Pode aplicar estilos personalizados na versão web do Mastodon. + favicon: WEBP, PNG, GIF ou JPG. Substitui o ícone de favorito padrão do Mastodon por um ícone personalizado. mascot: Sobrepõe-se à ilustração na interface web avançada. - media_cache_retention_period: Os ficheiros de media descarregados serão apagados decorrido o número de dias especificado, quando definido com um valor positivo, e descarregados novamente quando solicitados. + media_cache_retention_period: Os ficheiros multimédia de publicações feitas por utilizadores remotos são armazenados em cache no seu servidor. Quando definido para um valor positivo, os ficheiros multimédia serão eliminados após o número de dias especificado. Se os ficheiros multimédia forem solicitados depois de terem sido eliminados, serão transferidos novamente, se o conteúdo de origem ainda estiver disponível. Devido a restrições sobre a frequência com que os cartões de pré-visualização de links pesquisam sites de terceiros, recomenda-se que este valor seja definido para, pelo menos, 14 dias, ou os cartões de pré-visualização de links não serão atualizados a pedido antes desse período. peers_api_enabled: Uma lista de nomes de domínio que este servidor encontrou no fediverso. Nenhum dado é incluído aqui sobre se você federa com um determinado servidor, apenas que o seu servidor o conhece. Este serviço é utilizado por serviços que recolhem estatísticas na federação, em termos gerais. profile_directory: O diretório de perfis lista todos os utilizadores que optaram por ter a sua conta a ser sugerida a outros. require_invite_text: Quando as incrições exigirem aprovação manual, faça o texto "Por que se quer juntar a nós?" da solicitação de convite ser obrigatório, em vez de opcional @@ -243,7 +245,7 @@ pt-PT: backups_retention_period: Período de retenção de arquivos de utilizador bootstrap_timeline_accounts: Recomendar sempre estas contas para novos utilizadores closed_registrations_message: Mensagem personalizada quando as inscrições não estiverem disponíveis - content_cache_retention_period: Período de retenção de conteúdo em cache + content_cache_retention_period: Período de retenção de conteúdos remotos custom_css: CSS personalizado mascot: Mascote personalizada (legado) media_cache_retention_period: Período de retenção de ficheiros de media em cache diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index 559302270..dfb44c774 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -163,5 +163,6 @@ ro: 'no': Nu recommended: Recomandat required: + mark: "*" text: obligatoriu 'yes': Da diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 192a2f96d..a050b5a52 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -75,13 +75,10 @@ ru: warn: Скрыть отфильтрованный контент за предупреждением с указанием названия фильтра form_admin_settings: activity_api_enabled: Подсчёт количества локальных постов, активных пользователей и новых регистраций на еженедельной основе - backups_retention_period: Сохранять сгенерированные пользовательские архивы для указанного количества дней. bootstrap_timeline_accounts: Эти аккаунты будут рекомендованы для подписки новым пользователям. closed_registrations_message: Отображается, когда регистрация закрыта - content_cache_retention_period: Записи с других серверов будут удалены после указанного количества дней, когда установлено положительное значение. Это может быть необратимо. custom_css: Вы можете применять пользовательские стили в веб-версии Mastodon. mascot: Заменяет иллюстрацию в расширенном веб-интерфейсе. - media_cache_retention_period: Скачанные медиа-файлы будут удалены после указанного количества дней, когда установлено положительное значение и повторно загружены по требованию. peers_api_enabled: Список доменных имен, с которыми сервер столкнулся в fediverse. Здесь нет данных о том, федерировались ли вы с данным сервером, только что ваш сервер знает об этом. Это используется службами, которые собирают статистику по федерации в общем смысле. profile_directory: В каталоге профилей перечислены все пользователи, которые согласились быть доступными для обнаружения. require_invite_text: Когда регистрация требует ручного одобрения, сделайте текстовый ввод "Почему вы хотите присоединиться?" обязательным, а не опциональным @@ -240,7 +237,6 @@ ru: backups_retention_period: Период хранения архива пользователя bootstrap_timeline_accounts: Всегда рекомендовать эти учетные записи новым пользователям closed_registrations_message: Сообщение, когда регистрация недоступна - content_cache_retention_period: Период хранения кэша содержимого custom_css: Пользовательский CSS mascot: Пользовательский маскот (устаревшее) media_cache_retention_period: Период хранения кэша медиафайлов diff --git a/config/locales/simple_form.sco.yml b/config/locales/simple_form.sco.yml index 7eeaca375..f9dc4ba29 100644 --- a/config/locales/simple_form.sco.yml +++ b/config/locales/simple_form.sco.yml @@ -63,13 +63,10 @@ sco: hide: Totally plank the filtert content, ackin as if it didnae exist warn: Plank the filtert content ahin a warnin menshiein the filter's title form_admin_settings: - backups_retention_period: Haud generatit uiser archives fir the specified nummer o days. bootstrap_timeline_accounts: Thir accoonts wull get preenit tae the tap o new uisers' follae recommendations. closed_registrations_message: Displayit whan sign-ups is shut - content_cache_retention_period: Posts fae ither servers wull get deletit efter the specified nummer o days whan set tae a positive value. This wull mibbie be irreversible. custom_css: Ye kin pit custom styles on tae the web version o Mastodon. mascot: Owerrides the illustration in the advanced web interface. - media_cache_retention_period: Doonloadit media files wull be deletit efter the specified nummer o days whan set tae a positive value, an re-doonloadit on demand. profile_directory: The profile directory lists aw uisers thit hae opted-in fir tae be discoverable. require_invite_text: Whan sign-ups require approval bi haun, mak the “Hou dae ye want tae jyne?” text input mandatory raither nor optional site_contact_email: Hou fowk kin reach ye fir legal or support inquiries. @@ -216,7 +213,6 @@ sco: backups_retention_period: Uiser archive retention period bootstrap_timeline_accounts: Aye recommend thir accoonts tae new uisers closed_registrations_message: Custom message whan sign-ups urnae available - content_cache_retention_period: Content cache retention period custom_css: Custom CSS mascot: Custom mascot (legacy) media_cache_retention_period: Media cache retention period diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index eb41d263b..a81ba27bb 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -190,7 +190,7 @@ si: text: ඔබට එක් වීමට අවශ්‍ය ඇයි? ip_block: comment: අදහස - ip: අ.ජා. කෙ. (IP) + ip: අ.ජා.කෙ. (IP) severities: no_access: ප්‍රවේශය අවහිර කරන්න sign_up_requires_approval: ලියාපදිංචි වීම සීමා කරන්න diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index cbf057018..96b36307a 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -77,13 +77,15 @@ sl: warn: Skrij filtrirano vsebino za opozorilom, ki pomenja naslov filtra form_admin_settings: activity_api_enabled: Številke krajevno objavljenih objav, dejavnih uporabnikov in novih registracij na tedenskih seznamih - backups_retention_period: Hani tvorjene arhive uporabnikov navedeno število dni. + app_icon: WEBP, PNG, GIF ali JPG. Zamenja privzeto ikono programa na mobilnih napravah z ikono po meri. + backups_retention_period: Uporabniki lahko ustvarijo arhive svojih objav za kasnejši prenos k sebi. Ko je nastavljeno na pozitivno vrednost, bodo ti arhivi po nastavljenem številu dni samodejno izbrisani. bootstrap_timeline_accounts: Ti računi bodo pripeti na vrh priporočenih sledenj za nove uporabnike. closed_registrations_message: Prikazano, ko so registracije zaprte - content_cache_retention_period: Objave z drugih strežnikov bodo izbrisane po navedenem številu dni, če je vrednost pozitivna. Ta dejanja lahko nepovratna. + content_cache_retention_period: Vse objave z drugih strežnikov (vključno z izpostavitvami in odgovori) bodo izbrisani po nastavljenem številu dni, ne glede na krajevne interakcije s temi objavami. To vključuje objave, ki jih je krajevni uporabnik dodal med zaznamke ali priljubljene. Zasebne omembe med uporabniki na različnih strežnikih bodo prav tako izgubljene in jih ne bo moč obnoviti. Uporaba te nastavitve je namenjena strežnikom s posebnim namenom in nasprotuje mnogim pričakovanjem uporabnikov na strežnikih za splošni namen. custom_css: Spletni različici Mastodona lahko uveljavite sloge po meri. + favicon: WEBP, PNG, GIF ali JPG. Zamenja privzeto ikono spletne strani Mastodon z ikono po meri. mascot: Preglasi ilustracijo v naprednem spletnem vmesniku. - media_cache_retention_period: Prenesene predstavnostne datoteke bodo izbrisane po navedenem številu dni, če je vrednost pozitivna, in ponovno prenesene na zahtevo. + media_cache_retention_period: Predstavnostne datoteke iz objav uporabnikov na ostalih strežnikih se začasno hranijo na tem strežniku. Ko je nastavljeno na pozitivno vrednost, bodo predstavnostne datoteke izbrisane po nastavljenem številu dni. Če bo predstavnostna datoteka zahtevana po izbrisu, bo ponovno prenešena, če bo vir še vedno na voljo. Zaradi omejitev pogostosti prejemanja predogledov povezav z drugih strani je priporočljivo to vrednost nastaviti na vsaj 14 dni. V nasprotnem predogledi povezav pred tem časom ne bodo osveženi na zahtevo. peers_api_enabled: Seznam imen domen, na katere je ta strežnik naletel v fediverzumu. Sem niso vključeni podatki o tem, ali ste v federaciji z danim strežnikom, zgolj to, ali vaš strežnik ve zanj. To uporabljajo storitve, ki zbirajo statistične podatke o federaciji v splošnem smislu. profile_directory: Imenik profilov izpiše vse uporabnike, ki so dovolili, da so v njem navedeni. require_invite_text: Če registracije zahtevajo ročno potrditev, nastavite vnos besedila pod »Zakaj se želite pridružiti?« za obveznega. @@ -243,7 +245,7 @@ sl: backups_retention_period: Obdobje hrambe arhivov uporabnikov bootstrap_timeline_accounts: Vedno priporočaj te račune novim uporabnikom closed_registrations_message: Sporočilo po meri, ko registracije niso na voljo - content_cache_retention_period: Obdobje hrambe predpomnilnika vsebine + content_cache_retention_period: Obdobje hranjenja vsebine z ostalih strežnikov custom_css: CSS po meri mascot: Maskota po meri (opuščeno) media_cache_retention_period: Obdobje hrambe predpomnilnika predstavnosti diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 41ee3d9bd..c3c392096 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -77,13 +77,15 @@ sq: warn: Fshihe lëndën e filtruar pas një sinjalizimi që përmend titullin e filtrit form_admin_settings: activity_api_enabled: Numër postimesh të botuar lokalisht, përdoruesish aktiv dhe regjistrimesh të reja sipas matjesh javore - backups_retention_period: Mbaji arkivat e prodhuara të përdoruesve për aq ditë sa numri i dhënë. + app_icon: WEBP, PNG, GIF, ose JPG. Anashkalon ikonë parazgjedhje aplikacioni në pajisje celulare me një ikonë vetjake. + backups_retention_period: Përdorues kanë aftësinë të prodhojnë arkiva të postimeve të tyre për t’i shkarkuar më vonë. Kur i jepet një vlerë pozitive, këto arkiva do të fshihen automatikisht prej depozitës tuaj pas numrit të dhënë të ditëve. bootstrap_timeline_accounts: Këto llogari do të fiksohen në krye të rekomandimeve për ndjekje nga përdorues të rinj. closed_registrations_message: Shfaqur kur mbyllen dritare regjistrimesh - content_cache_retention_period: Postimet prej shërbyesve të tjerë do të fshihen pas numrit të dhënë të ditëve, kur këtij i jepet një vlerë pozitive. Kjo mund të jetë e pakthyeshme. + content_cache_retention_period: Krejt postimet prej shërbyesve të tjerë (përfshi përforcime dhe përgjigje) do të fshihen pas numrit të caktuar të ditëve, pa marrë parasysh çfarëdo ndërveprimi përdoruesi me këto postime. Kjo përfshin postime kur një përdorues vendor u ka vënë shenjë si faqerojtës, ose të parapëlqyer. Do të humbin gjithashtu dhe përmendje private mes përdoruesish nga instanca të ndryshme dhe s’do të jetë e mundshme të rikthehen. Përdorimi i këtij rregullimi është menduar për instanca me qëllim të caktuar dhe ndërhyn në çka presin mjaft përdorues, kur sendërtohet për përdorim të përgjithshëm. custom_css: Stile vetjakë mund të aplikoni në versionin web të Mastodon-it. + favicon: WEBP, PNG, GIF, ose JPG. Anashkalon favikonën parazgjedhje Mastodon me një ikonë vetjake. mascot: Anashkalon ilustrimin te ndërfaqja web e thelluar. - media_cache_retention_period: Kartelat media të shkarkuara do të fshihen pas numrit të dhënë të ditëve, kur këtij i jepet një vlerë pozitive dhe rishkarkohen po u kërkua. + media_cache_retention_period: Kartela media nga postime të bëra nga përdorues të largët ruhen në një fshehtinë në shërbyesin tuaj. Kur i jepet një vlerë pozitive, media do të fshihet pas numrit të dhënë të ditëve. Nëse të dhënat e medias duhen pas fshirjes, do të rishkarkohen, nëse lënda burim mund të kihet ende. Për shkak kufizimesh mbi sa shpesh skeda paraparjesh lidhjesh ndërveprojnë me sajte palësh të treta, rekomandohet të vihet kjo vlerë të paktën 14 ditë, ose skedat e paraparjes së lidhje s’do të përditësohen duke e kërkuar para asaj kohe. peers_api_enabled: Një listë emrash përkatësish që ky shërbyes ka hasur në fedivers. Këtu s’jepen të dhëna nëse jeni i federuar me shërbyesin e dhënë, thjesht tregohet se shërbyesi juaj e njeh. Kjo përdoret nga shërbime që mbledhin statistika mbi federimin në kuptimin e përgjithshëm. profile_directory: Drejtoria e profileve paraqet krejt përdoruesit që kanë zgjedhur të jenë të zbulueshëm. require_invite_text: Kur regjistrimet lypin miratim dorazi, bëje tekstin “Përse doni të bëheni pjesë?” të detyrueshëm, në vend se opsional @@ -243,7 +245,7 @@ sq: backups_retention_period: Periudhë mbajtjeje arkivash përdoruesish bootstrap_timeline_accounts: Rekomandoju përherë këto llogari përdoruesve të rinj closed_registrations_message: Mesazh vetjak për pamundësi regjistrimesh të reja - content_cache_retention_period: Periudhë mbajtjeje lënde fshehtine + content_cache_retention_period: Periudhë mbajtjeje lënde të largët custom_css: CSS Vetjake mascot: Simbol vetjak (e dikurshme) media_cache_retention_period: Periudhë mbajtjeje lënde media diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 13296a04c..710f81e84 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -20,7 +20,7 @@ sr-Latn: admin_account_action: include_statuses: Korisnik će videti koje su objave prouzrokovale moderacijsku radnju ili upozorenje send_email_notification: Korisnik će dobiti objašnjenje toga šta mu se desilo sa nalogom - text_html: Opcionalno. Možete koristiti sintaksu objava. Možete dodati unapred određene postavke upozorenja za uštedu vremena + text_html: Opciono. Možete koristiti sintaksu objava. Možete dodati predefinisana upozorenja za uštedu vremena type_html: Izaberite šta da radite sa %{acct} types: disable: Sprečava korisnika da koristi svoj nalog, ali ne briše niti sakriva njegove sadržaje. @@ -28,7 +28,7 @@ sr-Latn: sensitive: Učini da svi medijski prilozi ovog korisnika prisilno budu označeni kao osetljivi. silence: Sprečava korisnika da pravi javne objave, sakriva njegove objave i obaveštenja od ljudi koji ga ne prate. Zatvara sve prijave podnete protiv ovog naloga. suspend: Sprečava svu interakciju od ovog naloga i ka ovom nalogu i briše njegov sadržaj. Opozivo u roku od 30 dana. Zatvara sve prijave podnete protiv ovog naloga. - warning_preset_id: Opcionalno. Možete i dalje dodati prilagođeni tekst na kraj preseta + warning_preset_id: Opciono. Možete i dalje dodati prilagođeni tekst na kraj predefinisane vrednosti announcement: all_day: Kada je ova opcija označena, samo datumi iz vremenskog opsega će biti prikazani ends_at: Opciono. Objava će biti automatski opozvana u ovom trenutku @@ -77,13 +77,15 @@ sr-Latn: warn: Sakrij filtrirani sadržaj iza upozorenja u kome se navodi naziv filtera form_admin_settings: activity_api_enabled: Brojevi lokalno postavljenih objava, aktivnih korisnika i novih registracija na nedeljnoj bazi - backups_retention_period: Čuvaj generisane korisničke arhive navedeni broj dana. + app_icon: WEBP, PNG, GIF ili JPG. Zamenjuje podrazumevanu ikonicu aplikacije na mobilnim uređajima prilagođenom ikonicom. + backups_retention_period: Korisnici imaju mogućnost da generišu arhive svojih objava za kasnije preuzimanje. Kada se podese na pozitivnu vrednost, ove arhive će se automatski izbrisati iz vašeg skladišta nakon navedenog broja dana. bootstrap_timeline_accounts: Ovi nalozi će biti zakačeni na vrh preporuka za praćenje novih korisnika. closed_registrations_message: Prikazuje se kada su registracije zatvorene - content_cache_retention_period: Sve objave i podržavanja sa drugih servera će biti izbrisani nakon navedenog broja dana. Neke objave se možda neće moći oporaviti. Svi povezani obeleživači, omiljeni i podržavanja će takođe biti izgubljeni i nemoguće je opozvati radnju. + content_cache_retention_period: Sve objave sa drugih servera (uključujući podržavanja i odgovore) će biti izbrisane nakon navedenog broja dana, bez obzira na bilo kakvu interakciju lokalnog korisnika sa tim objavama. Ovo uključuje objave u kojima ih je lokalni korisnik označio kao obeleživače ili omiljene. Privatna pominjanja između korisnika sa različitih instanci će takođe biti izgubljena i nemoguće ih je vratiti. Korišćenje ove postavke je namenjeno za slučajeve posebne namene i krši mnoga očekivanja korisnika kada se primeni za upotrebu opšte namene. custom_css: Možete da primenite prilagođene stilove na veb verziji Mastodon-a. + favicon: WEBP, PNG, GIF ili JPG. Zamenjuje podrazumevani Mastodon favikon prilagođenom ikonicom. mascot: Zamenjuje ilustraciju u naprednom veb okruženju. - media_cache_retention_period: Kada se postavi na pozitivnu vrednost, preuzete medijske datoteke će biti izbrisane nakon navedenog broja dana, i ponovo preuzete na zahtev. + media_cache_retention_period: Medijske datoteke iz objava udaljenih korisnika se keširaju na vašem serveru. Kada se podesi na pozitivnu vrednost, mediji će biti izbrisani nakon navedenog broja dana. Ako se medijski podaci zahtevaju nakon brisanja, biće ponovo preuzeti, ako je izvorni sadržaj i dalje dostupan. Zbog ograničenja koliko često kartice za pregled veza anketiraju sajtove trećih strana, preporučuje se da ovu vrednost postavite na najmanje 14 dana, inače kartice za pregled veza neće biti ažurirane na zahtev pre tog vremena. peers_api_enabled: Lista domena sa kojima se ovaj server susreo u fediverzumu. Ovde nisu sadržani podaci o tome da li se Vaš server federiše sa drugim serverima, već samo da Vaš server zna za njih. Ove informacije koriste servisi koji prikupljaju podatke i vode statistiku o federaciji u širem smislu. profile_directory: Direktorijum profila navodi sve korisnike koji su se opredelili da budu vidljivi. require_invite_text: Kada registracije zahtevaju ručno odobrenje, postavite da odgovor na „Zašto želite da se pridružite?“ bude obavezan, a ne opcionalan @@ -116,7 +118,7 @@ sr-Latn: sign_up_requires_approval: Nove registracije će zahtevati Vaše odobrenje severity: Izaberite šta će se desiti sa zahtevima sa ove IP adrese rule: - hint: Opcionalno. Pružite više detalja o pravilu + hint: Opciono. Pružite više detalja o pravilu text: Opišite pravilo ili uslov za korisnike na ovom serveru. Potrudite se da opis bude kratak i jednostavan sessions: otp: 'Unesite dvofaktorski kod sa Vašeg telefona ili koristite jedan od kodova za oporavak:' @@ -153,7 +155,7 @@ sr-Latn: account_migration: acct: Ručica (@) novog naloga account_warning_preset: - text: Tekst preseta + text: Tekst predefinisane vrednosti title: Naslov admin_account_action: include_statuses: Uključi prijavljene objave u e-poštu @@ -166,7 +168,7 @@ sr-Latn: sensitive: Osetljivo silence: Utišaj suspend: Obustavite i nepovratno izbrišite podatke o nalogu - warning_preset_id: Koristi upozoravajući preset + warning_preset_id: Koristi predefinisano upozorenje announcement: all_day: Celodnevni događaj ends_at: Kraj događaja @@ -243,7 +245,7 @@ sr-Latn: backups_retention_period: Period čuvanja korisničke arhive bootstrap_timeline_accounts: Uvek preporuči ove naloge novim korisnicima closed_registrations_message: Prilagođena poruka kada prijave nisu moguće - content_cache_retention_period: Period čuvanja keša sadržaja + content_cache_retention_period: Period zadržavanja udaljenog sadržaja custom_css: Prilagođeni CSS mascot: Prilagođena maskota (nasleđe) media_cache_retention_period: Period čuvanja keša medija diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 982048218..c5fbc9185 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -20,7 +20,7 @@ sr: admin_account_action: include_statuses: Корисник ће видети које су објаве проузроковале модерацијску радњу или упозорење send_email_notification: Корисник ће добити објашњење тога шта му се десило са налогом - text_html: Опционално. Можете користити синтаксу објава. Можете додати унапред одређене поставке упозорења за уштеду времена + text_html: Опционо. Можете користити синтаксу објава. Можете додати предефинисана упозорења за уштеду времена type_html: Изаберите шта да радите са %{acct} types: disable: Спречава корисника да користи свој налог, али не брише нити сакрива његове садржаје. @@ -28,7 +28,7 @@ sr: sensitive: Учини да сви медијски прилози овог корисника присилно буду означени као осетљиви. silence: Спречава корисника да прави јавне објаве, сакрива његове објаве и обавештења од људи који га не прате. Затвара све пријаве поднете против овог налога. suspend: Спречава сву интеракцију од овог налога и ка овом налогу и брише његов садржај. Опозиво у року од 30 дана. Затвара све пријаве поднете против овог налога. - warning_preset_id: Опционално. Можете и даље додати прилагођени текст на крај пресета + warning_preset_id: Опционо. Можете и даље додати прилагођени текст на крај предефинисане вредности announcement: all_day: Када је ова опција означена, само датуми из временског опсега ће бити приказани ends_at: Опционо. Објава ће бити аутоматски опозвана у овом тренутку @@ -77,16 +77,18 @@ sr: warn: Сакриј филтрирани садржај иза упозорења у коме се наводи назив филтера form_admin_settings: activity_api_enabled: Бројеви локално постављених објава, активних корисника и нових регистрација на недељној бази - backups_retention_period: Чувај генерисане корисничке архиве наведени број дана. + app_icon: WEBP, PNG, GIF или JPG. Замењује подразумевану иконицу апликације на мобилним уређајима прилагођеном иконицом. + backups_retention_period: Корисници имају могућност да генеришу архиве својих објава за касније преузимање. Када се подесе на позитивну вредност, ове архиве ће се аутоматски избрисати из вашег складишта након наведеног броја дана. bootstrap_timeline_accounts: Ови налози ће бити закачени на врх препорука за праћење нових корисника. closed_registrations_message: Приказује се када су регистрације затворене - content_cache_retention_period: Све објаве и подржавања са других сервера ће бити избрисани након наведеног броја дана. Неке објаве се можда неће моћи опоравити. Сви повезани обележивачи, омиљени и подржавања ће такође бити изгубљени и немогуће је опозвати радњу. + content_cache_retention_period: Све објаве са других сервера (укључујући подржавања и одговоре) ће бити избрисане након наведеног броја дана, без обзира на било какву интеракцију локалног корисника са тим објавама. Ово укључује објаве у којима их је локални корисник означио као обележиваче или омиљене. Приватна помињања између корисника са различитих инстанци ће такође бити изгубљена и немогуће их је вратити. Коришћење ове поставке је намењено за случајеве посебне намене и крши многа очекивања корисника када се примени за употребу опште намене. custom_css: Можете да примените прилагођене стилове на веб верзији Mastodon-а. + favicon: WEBP, PNG, GIF или JPG. Замењује подразумевани Mastodon фавикон прилагођеном иконицом. mascot: Замењује илустрацију у напредном веб окружењу. - media_cache_retention_period: Када се постави на позитивну вредност, преузете медијске датотеке ће бити избрисане након наведеног броја дана, и поново преузете на захтев. + media_cache_retention_period: Медијске датотеке из објава удаљених корисника се кеширају на вашем серверу. Када се подеси на позитивну вредност, медији ће бити избрисани након наведеног броја дана. Ако се медијски подаци захтевају након брисања, биће поново преузети, ако је изворни садржај и даље доступан. Због ограничења колико често картице за преглед веза анкетирају сајтове трећих страна, препоручује се да ову вредност поставите на најмање 14 дана, иначе картице за преглед веза неће бити ажуриране на захтев пре тог времена. peers_api_enabled: Листа домена са којима се овај сервер сусрео у федиверзуму. Овде нису садржани подаци о томе да ли се Ваш сервер федерише са другим серверима, већ само да Ваш сервер зна за њих. Ове информације користе сервиси који прикупљају податке и воде статистику о федерацији у ширем смислу. profile_directory: Директоријум профила наводи све кориснике који су се определили да буду видљиви. - require_invite_text: Када регистрације захтевају ручно одобрење, поставите да одговор на „Зашто желите да се придружите?“ буде обавезан, а не опционалан + require_invite_text: Када регистрације захтевају ручно одобрење, постави да унос текста „Зашто желиш да се придружиш?“ буде обавезан, а не опциони site_contact_email: Како корисници могу да контактирају са Вама за правна питања или питања у вези подршке. site_contact_username: Како корисници могу да контактирају са вама на Mastodon-у. site_extended_description: Било какве додатне информације које могу бити корисне посетиоцима и Вашим корисницима. Могу се структурирати помоћу Markdown синтаксе. @@ -116,7 +118,7 @@ sr: sign_up_requires_approval: Нове регистрације ће захтевати Ваше одобрење severity: Изаберите шта ће се десити са захтевима са ове IP адресе rule: - hint: Опционално. Пружите више детаља о правилу + hint: Опционо. Пружите више детаља о правилу text: Опишите правило или услов за кориснике на овом серверу. Потрудите се да опис буде кратак и једноставан sessions: otp: 'Унесите двофакторски код са Вашег телефона или користите један од кодова за опоравак:' @@ -153,7 +155,7 @@ sr: account_migration: acct: Ручица (@) новог налога account_warning_preset: - text: Текст пресета + text: Текст предефинисане вредности title: Наслов admin_account_action: include_statuses: Укључи пријављене објаве у е-пошту @@ -166,7 +168,7 @@ sr: sensitive: Осетљиво silence: Утишај suspend: Обуставите и неповратно избришите податке о налогу - warning_preset_id: Користи упозоравајући пресет + warning_preset_id: Користи предефинисано упозорење announcement: all_day: Целодневни догађај ends_at: Крај догађаја @@ -243,7 +245,7 @@ sr: backups_retention_period: Период чувања корисничке архиве bootstrap_timeline_accounts: Увек препоручи ове налоге новим корисницима closed_registrations_message: Прилагођена порука када пријаве нису могуће - content_cache_retention_period: Период чувања кеша садржаја + content_cache_retention_period: Период задржавања удаљеног садржаја custom_css: Прилагођени CSS mascot: Прилагођена маскота (наслеђе) media_cache_retention_period: Период чувања кеша медија diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 37372cac2..5e5c6f954 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -77,13 +77,13 @@ sv: warn: Dölj det filtrerade innehållet bakom en varning som visar filtrets rubrik form_admin_settings: activity_api_enabled: Antalet lokalt publicerade inlägg, aktiva användare och nya registrerade konton per vecka - backups_retention_period: Behåll genererade användararkiv i det angivna antalet dagar. + backups_retention_period: Användare har möjlighet att generera arkiv av sina inlägg för att ladda ned senare. När det sätts till ett positivt värde raderas dessa arkiv automatiskt från din lagring efter det angivna antalet dagar. bootstrap_timeline_accounts: Dessa konton kommer fästas högst upp i nya användares följrekommendationer. closed_registrations_message: Visas när nyregistreringar är avstängda - content_cache_retention_period: Inlägg från andra servrar kommer att raderas efter det angivna antalet dagar när detta är inställt på ett positivt värde. Åtgärden kan vara oåterkallelig. + content_cache_retention_period: Alla inlägg från andra servrar (inklusive booster och svar) kommer att raderas efter det angivna antalet dagar, utan hänsyn till någon lokal användarinteraktion med dessa inlägg. Detta inkluderar inlägg där en lokal användare har markerat det som bokmärke eller favoriter. Privata omnämnanden mellan användare från olika instanser kommer också att gå förlorade och blir omöjliga att återställa. Användningen av denna inställning är avsedd för specialfall och bryter många användarförväntningar när de implementeras för allmänt bruk. custom_css: Du kan använda anpassade stilar på webbversionen av Mastodon. mascot: Åsidosätter illustrationen i det avancerade webbgränssnittet. - media_cache_retention_period: Nedladdade mediefiler kommer raderas efter det angivna antalet dagar, om inställt till ett positivt värde, och laddas ned på nytt vid behov. + media_cache_retention_period: Mediafiler från inlägg som gjorts av fjärranvändare cachas på din server. När inställd på ett positivt värde kommer media att raderas efter det angivna antalet dagar. Om mediadatat begärs efter att det har raderats, kommer det att laddas ned igen om källinnehållet fortfarande är tillgängligt. På grund av begränsningar för hur ofta förhandsgranskningskort för länkar hämtas från tredjepartswebbplatser, rekommenderas det att ange detta värde till minst 14 dagar, annars kommer förhandsgranskningskorten inte att uppdateras på begäran före den tiden. peers_api_enabled: En lista över domänen den här servern har stött på i fediversum. Ingen data inkluderas om du har federerat med servern, bara att din server känner till den. Detta används av tjänster som samlar statistik om federering i allmänhet. profile_directory: Profilkatalogen visar alla användare som har samtyckt till att bli upptäckbara. require_invite_text: Gör fältet "Varför vill du gå med?" obligatoriskt när nyregistreringar kräver manuellt godkännande @@ -243,7 +243,7 @@ sv: backups_retention_period: Lagringsperiod för användararkivet bootstrap_timeline_accounts: Rekommendera alltid dessa konton till nya användare closed_registrations_message: Anpassat meddelande när nyregistreringar inte är tillgängliga - content_cache_retention_period: Tid för bibehållande av innehållscache + content_cache_retention_period: Förvaringsperiod för fjärrinnehåll custom_css: Anpassad CSS mascot: Anpassad maskot (tekniskt arv) media_cache_retention_period: Tid för bibehållande av mediecache diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index b41cf0bea..0816efcc5 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -77,13 +77,15 @@ th: warn: ซ่อนเนื้อหาที่กรองอยู่หลังคำเตือนที่กล่าวถึงชื่อเรื่องของตัวกรอง form_admin_settings: activity_api_enabled: จำนวนโพสต์ที่เผยแพร่ในเซิร์ฟเวอร์, ผู้ใช้ที่ใช้งานอยู่ และการลงทะเบียนใหม่ในบักเก็ตรายสัปดาห์ - backups_retention_period: เก็บการเก็บถาวรผู้ใช้ที่สร้างขึ้นตามจำนวนวันที่ระบุ + app_icon: WEBP, PNG, GIF หรือ JPG เขียนทับไอคอนแอปเริ่มต้นในอุปกรณ์มือถือด้วยไอคอนที่กำหนดเอง + backups_retention_period: ผู้ใช้มีความสามารถในการสร้างการเก็บถาวรของโพสต์ของเขาเพื่อดาวน์โหลดในภายหลัง เมื่อตั้งเป็นค่าบวก จะลบการเก็บถาวรเหล่านี้ออกจากที่เก็บข้อมูลของคุณโดยอัตโนมัติหลังจากจำนวนวันที่ระบุ bootstrap_timeline_accounts: จะปักหมุดบัญชีเหล่านี้ไว้ด้านบนสุดของคำแนะนำการติดตามของผู้ใช้ใหม่ closed_registrations_message: แสดงเมื่อมีการปิดการลงทะเบียน - content_cache_retention_period: จะลบโพสต์และการดันทั้งหมดจากเซิร์ฟเวอร์อื่น ๆ หลังจากจำนวนวันที่ระบุ โพสต์บางส่วนอาจไม่สามารถกู้คืนได้ ที่คั่นหน้า, รายการโปรด และการดันที่เกี่ยวข้องทั้งหมดจะสูญหายและไม่สามารถเลิกทำได้เช่นกัน + content_cache_retention_period: จะลบโพสต์ทั้งหมดจากเซิร์ฟเวอร์อื่น ๆ (รวมถึงการดันและการตอบกลับ) หลังจากจำนวนวันที่ระบุ โดยไม่คำนึงถึงการโต้ตอบใด ๆ ของผู้ใช้ในเซิร์ฟเวอร์กับโพสต์เหล่านั้น สิ่งนี้รวมถึงโพสต์ที่ผู้ใช้ในเซิร์ฟเวอร์ได้ทำเครื่องหมายโพสต์ว่าเป็นที่คั่นหน้าหรือรายการโปรด การกล่าวถึงแบบส่วนตัวระหว่างผู้ใช้จากอินสแตนซ์ที่แตกต่างกันจะหายไปและไม่สามารถคืนค่าได้เช่นกัน การใช้การตั้งค่านี้มีไว้สำหรับอินสแตนซ์ที่มีวัตถุประสงค์พิเศษและทำลายความคาดหวังของผู้ใช้จำนวนมากเมื่อนำไปใช้สำหรับการใช้งานที่มีวัตถุประสงค์ทั่วไป custom_css: คุณสามารถนำไปใช้ลักษณะที่กำหนดเองใน Mastodon รุ่นเว็บ + favicon: WEBP, PNG, GIF หรือ JPG เขียนทับ Favicon ของ Mastodon เริ่มต้นด้วยไอคอนที่กำหนดเอง mascot: เขียนทับภาพประกอบในส่วนติดต่อเว็บขั้นสูง - media_cache_retention_period: จะลบไฟล์สื่อที่ดาวน์โหลดหลังจากจำนวนวันที่ระบุเมื่อตั้งเป็นค่าบวก และดาวน์โหลดใหม่ตามความต้องการ + media_cache_retention_period: จะแคชไฟล์สื่อจากโพสต์ที่สร้างโดยผู้ใช้ระยะไกลในเซิร์ฟเวอร์ของคุณ เมื่อตั้งเป็นค่าบวก จะลบสื่อหลังจากจำนวนวันที่ระบุ หากมีการขอข้อมูลสื่อหลังจากมีการลบสื่อ จะดาวน์โหลดสื่อใหม่ หากเนื้อหาต้นฉบับยังคงใช้งานได้ เนื่องจากข้อจำกัดเกี่ยวกับความถี่ที่บัตรตัวอย่างลิงก์สำรวจไซต์จากบุคคลที่สาม ขอแนะนำให้ตั้งค่านี้เป็นอย่างน้อย 14 วัน มิฉะนั้นจะไม่อัปเดตบัตรตัวอย่างลิงก์ตามความต้องการก่อนเวลานั้น peers_api_enabled: รายการชื่อโดเมนที่เซิร์ฟเวอร์นี้พบในจักรวาลสหพันธ์ ไม่มีข้อมูลรวมอยู่ที่นี่เกี่ยวกับว่าคุณติดต่อกับเซิร์ฟเวอร์ที่กำหนดหรือไม่ เพียงแค่ว่าเซิร์ฟเวอร์ของคุณทราบเกี่ยวกับเซิร์ฟเวอร์ที่กำหนด มีการใช้สิ่งนี้โดยบริการที่เก็บรวบรวมสถิติในการติดต่อกับภายนอกในความหมายทั่วไป profile_directory: ไดเรกทอรีโปรไฟล์แสดงรายการผู้ใช้ทั้งหมดที่ได้เลือกรับให้สามารถค้นพบได้ require_invite_text: เมื่อการลงทะเบียนต้องการการอนุมัติด้วยตนเอง ทำให้การป้อนข้อความ “ทำไมคุณจึงต้องการเข้าร่วม?” บังคับแทนที่จะไม่จำเป็น @@ -243,7 +245,7 @@ th: backups_retention_period: ระยะเวลาการเก็บรักษาการเก็บถาวรผู้ใช้ bootstrap_timeline_accounts: แนะนำบัญชีเหล่านี้ให้กับผู้ใช้ใหม่เสมอ closed_registrations_message: ข้อความที่กำหนดเองเมื่อการลงทะเบียนไม่พร้อมใช้งาน - content_cache_retention_period: ระยะเวลาการเก็บรักษาแคชเนื้อหา + content_cache_retention_period: ระยะเวลาการเก็บรักษาเนื้อหาระยะไกล custom_css: CSS ที่กำหนดเอง mascot: มาสคอตที่กำหนดเอง (ดั้งเดิม) media_cache_retention_period: ระยะเวลาการเก็บรักษาแคชสื่อ diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 758d1dc4d..697417a54 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -77,13 +77,15 @@ tr: warn: Süzgeçlenmiş içeriği, süzgecinin başlığından söz eden bir uyarının arkasında gizle form_admin_settings: activity_api_enabled: Yerel olarak yayınlanan gönderi, etkin kullanıcı ve yeni kayıtların haftalık sayıları - backups_retention_period: Üretilen kullanıcı arşivlerini belirli gün sayısı kadar sakla. + app_icon: WEBP, PNG, GIF veya JPG. Mobil aygıtlarda varsayılan uygulama simgesini isteğe bağlı bir simgeyle değiştirir. + backups_retention_period: Kullanıcılar, gönderilerinin arşivlerini daha sonra indirmek üzere oluşturabilirler. Pozitif bir değer verdilğinde bu arşivler verilmiş olan gün sonunda deponuzdan otomatik olarak silinecektir. bootstrap_timeline_accounts: Bu hesaplar, yeni kullanıcıların takip önerilerinin tepesinde sabitlenecektir. closed_registrations_message: Kayıt olma kapalıyken görüntülenir - content_cache_retention_period: Pozitif bir sayı girildiğinde, diğer sunuculardan gelen gönderiler belirli bir gün sonra silinecektir. Silme geri alınamayabilir. + content_cache_retention_period: Diğer sunuculardaki (öne çıkarma ve yanıtlar da dahil olmak üzere) tüm gönderiler belirlenen gün sonunda, yerel bir kullanıcının etkileşimine bakılmadan, silinecektir. Yerel bir kullanıcının yerimlerine veya favorilerine eklediği gönderiler de dahildir. Farklı sunuculardaki kullanıcılar arasındaki özel bahsetmeler de kaybolacak ve geri getirilmeleri mümkün olmayacaktır. Bu ayarın kullanımı özel amaçlı sunucular içindir ve genel amaçlı kullanımda etkinleştirildiğinde kullanıcı beklentilerini karşılamayabilir. custom_css: Mastodon'un web sürümüne özel biçimler uygulayabilirsiniz. + favicon: WEBP, PNG, GIF veya JPG. Varsayılan Mastodon simgesini isteğe bağlı bir simgeyle değiştirir. mascot: Gelişmiş web arayüzündeki illüstrasyonu geçersiz kılar. - media_cache_retention_period: Pozitif bir sayı girildiğinde, diğer sunuculardan indirilen medya dosyaları belirli bir gün sonra silinecektir, isteğe bağlı olarak tekrar indirilebilir. + media_cache_retention_period: Uzak kullanıcıların gönderilerindeki ortam dosyaları sunucunuzda önbelleklenir. Pozitif bir değer verildiğinde, ortam dosyaları belirlenen gün sonunda silinecektir. Eğer ortam dosyaları silindikten sonra istenirse, kaynak içerik hala mevcutsa, tekrar indirilecektir. Bağlantı önizleme kartlarının üçüncü parti siteleri yoklamasına ilişkin kısıtlamalar nedeniyle, bu değeri en azından 14 gün olarak ayarlamanız önerilir, yoksa bağlantı önizleme kartları bu süreden önce isteğe bağlı olarak güncellenmeyecektir. peers_api_enabled: Bu sunucunun fediverse'te karşılaştığı alan adlarının bir listesi. İlgili sunucuyla birleştirme mi yapıyorsunuz yoksa sunucunuz sadece onu biliyor mu hakkında bir bilgi burada yok. Bu blgi genel olarak federasyın hakkında istatistik toplamak isteyen hizmetler tarafından kullanılıyor. profile_directory: Profil dizini keşfedilebilir olmayı kabul eden tüm kullanıcıları listeler. require_invite_text: Kayıt olmak elle doğrulama gerektiriyorsa, "Neden katılmak istiyorsunuz?" metin girdisini isteğe bağlı yerine zorunlu yapın @@ -243,7 +245,7 @@ tr: backups_retention_period: Kullanıcı arşivi saklama süresi bootstrap_timeline_accounts: Bu hesapları yeni kullanıcılara her zaman öner closed_registrations_message: Kayıt olma mevcut değilken gösterilen özel ileti - content_cache_retention_period: İçerik önbelleği saklama süresi + content_cache_retention_period: Uzak içerik saklama süresi custom_css: Özel CSS mascot: Özel maskot (eski) media_cache_retention_period: Medya önbelleği saklama süresi diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index db8e4b4d2..11337f2f6 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -77,16 +77,15 @@ uk: warn: Сховати відфільтрований вміст за попередженням, у якому вказано заголовок фільтра form_admin_settings: activity_api_enabled: Кількість локальних опублікованих дописів, активних і нових користувачів у тижневих розрізах - backups_retention_period: Зберігати створені архіви користувача вказану кількість днів. + app_icon: WEBP, PNG, GIF або JPG. Замінює іконку програми за замовчуванням на мобільних пристроях на власну іконку. + backups_retention_period: Користувачі мають можливість створювати архіви своїх дописів, щоб завантажити їх пізніше. Якщо встановлено додатне значення, ці архіви будуть автоматично видалені з вашого сховища через вказану кількість днів. bootstrap_timeline_accounts: Ці облікові записи будуть закріплені в топі пропозицій для нових користувачів. closed_registrations_message: Показується, коли реєстрація закрита - content_cache_retention_period: |- - Матеріали з інших серверів будуть видалені після вказаної кількості днів, коли встановлено позитивне значення. Ця дія може бути незворотна. - - Матеріали з інших серверів будуть видалені після вказаної кількості днів. Ця дія може бути незворотна. Усі пов'язані з ними закладки та поширення також будуть втрачені. + content_cache_retention_period: Усі дописи з інших серверів (включно з коментарями та відповідями) будуть видалені через певну кількість днів, незважаючи на будь-яку локальну взаємодію користувачів з цими дописами. Сюди входять дописи, які локальний користувач позначив як закладки або вибране. Приватні згадки між користувачами з різних інстанцій також будуть втрачені і не підлягатимуть відновленню. Використання цього параметра призначено для екземплярів спеціального призначення і порушує багато очікувань користувачів, якщо його застосовано для загального використання. custom_css: Ви можете застосувати користувацькі стилі у вебверсії Mastodon. + favicon: WEBP, PNG, GIF або JPG. Замінює стандартну піктограму Mastodon на власну піктограму. mascot: Змінює ілюстрацію в розширеному вебінтерфейсі. - media_cache_retention_period: Завантажені медіафайли будуть видалені після вказаної кількості днів після встановлення додатного значення та повторного завантаження за запитом. + media_cache_retention_period: Медіафайли з дописів віддалених користувачів кешуються на вашому сервері. Якщо встановлено додатне значення, медіа буде видалено через вказану кількість днів. Якщо медіа-дані будуть запитані після видалення, вони будуть завантажені повторно, якщо вихідний вміст все ще доступний. Через обмеження на частоту опитування карток попереднього перегляду посилань на сторонніх сайтах, рекомендується встановити це значення не менше 14 днів, інакше картки попереднього перегляду посилань не будуть оновлюватися на вимогу раніше цього часу. peers_api_enabled: Список доменів імен цього сервера з'явився у федівсесвіті. Сюди не входять дані чи ви пов'язані федерацією з цим сервером, а лише відомості, що вашому серверу відомо про нього. Його використовують служби, які збирають загальну статистику про федерації. profile_directory: У каталозі профілів перераховані всі користувачі, які погодились бути видимими. require_invite_text: Якщо реєстрація вимагає власноручного затвердження, зробіть текстове поле «Чому ви хочете приєднатися?» обов'язковим, а не додатковим @@ -246,7 +245,7 @@ uk: backups_retention_period: Період утримання архіву користувача bootstrap_timeline_accounts: Завжди рекомендувати новим користувачам ці облікові записи closed_registrations_message: Показуване повідомлення, якщо реєстрація недоступна - content_cache_retention_period: Час зберігання кешу контенту + content_cache_retention_period: Період збереження віддаленого вмісту custom_css: Користувацький CSS mascot: Користувацький символ (застарілий) media_cache_retention_period: Період збереження кешу медіа diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index f4d9f526b..e5063e611 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -77,13 +77,15 @@ vi: warn: Ẩn nội dung đã lọc đằng sau một cảnh báo đề cập đến tiêu đề của bộ lọc form_admin_settings: activity_api_enabled: Số lượng tút được đăng trong máy chủ, người dùng đang hoạt động và đăng ký mới hàng tuần - backups_retention_period: Lưu trữ dữ liệu người dùng đã tạo trong số ngày được chỉ định. + app_icon: WEBP, PNG, GIF hoặc JPG. Dùng biểu tượng tùy chỉnh trên thiết bị di động. + backups_retention_period: Người dùng có khả năng tạo bản sao lưu các tút của họ để tải xuống sau. Các bản sao lưu này sẽ tự động bị xóa khỏi bộ nhớ của bạn sau số ngày được chỉ định. bootstrap_timeline_accounts: Những người này sẽ được ghim vào đầu các gợi ý theo dõi của người mới. closed_registrations_message: Được hiển thị khi đóng đăng ký - content_cache_retention_period: Tút từ các máy chủ khác sẽ bị xóa sau số ngày được chỉ định. Sau đó có thể không thể phục hồi được. + content_cache_retention_period: Tất cả tút từ các máy chủ khác (bao gồm cả đăng lại và trả lời) sẽ bị xóa sau số ngày được chỉ định mà không tính đến bất kỳ tương tác nào của người dùng cục bộ với các tút đó. Điều này bao gồm các tút mà người dùng cục bộ đã đánh dấu nó là dấu trang hoặc mục yêu thích. Những lượt nhắc riêng tư giữa những người dùng từ các máy chủ khác nhau cũng sẽ bị mất và không thể khôi phục. Việc sử dụng cài đặt này dành cho các trường hợp có mục đích đặc biệt và phá vỡ nhiều kỳ vọng của người dùng khi được triển khai cho mục đích sử dụng chung. custom_css: Bạn có thể tùy chỉnh phong cách trên bản web của Mastodon. + favicon: WEBP, PNG, GIF hoặc JPG. Dùng favicon Maston tùy chỉnh. mascot: Ghi đè hình minh họa trong giao diện web nâng cao. - media_cache_retention_period: Media đã tải xuống sẽ bị xóa sau số ngày được chỉ định và sẽ tải xuống lại theo yêu cầu. + media_cache_retention_period: Các tệp phương tiện từ các tút do người dùng máy chủ khác thực hiện sẽ được lưu vào bộ đệm trên máy chủ của bạn. Khi được đặt thành giá trị dương, phương tiện sẽ bị xóa sau số ngày được chỉ định. Nếu dữ liệu phương tiện được yêu cầu sau khi bị xóa, dữ liệu đó sẽ được tải xuống lại nếu nội dung nguồn vẫn còn. Do những hạn chế về tần suất thẻ xem trước liên kết thăm dò ý kiến ​​các trang web của bên thứ ba, bạn nên đặt giá trị này thành ít nhất 14 ngày, nếu không thẻ xem trước liên kết sẽ không được cập nhật theo yêu cầu trước thời gian đó. peers_api_enabled: Danh sách các máy chủ khác mà máy chủ này đã liên hợp. Không có dữ liệu nào được đưa vào đây về việc bạn có liên kết với một máy chủ nhất định hay không, chỉ là máy chủ của bạn biết về nó. Điều này được sử dụng bởi các dịch vụ thu thập số liệu thống kê về liên kết theo nghĩa chung. profile_directory: Liệt kê tất cả người đã chọn tham gia để có thể khám phá. require_invite_text: Khi đăng ký yêu cầu phê duyệt thủ công, hãy đặt câu hỏi "Tại sao bạn muốn tham gia?" nhập văn bản bắt buộc thay vì tùy chọn @@ -243,7 +245,7 @@ vi: backups_retention_period: Thời hạn lưu trữ nội dung người dùng sao lưu bootstrap_timeline_accounts: Luôn đề xuất những người này đến người mới closed_registrations_message: Thông báo tùy chỉnh khi tắt đăng ký - content_cache_retention_period: Thời hạn lưu trữ cache nội dung + 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 mascot: Tùy chỉnh linh vật (kế thừa) media_cache_retention_period: Thời hạn lưu trữ cache media diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 7f2eee023..6058cc00c 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -77,13 +77,15 @@ zh-CN: warn: 在警告中提及过滤器标题后,隐藏过滤内容 form_admin_settings: activity_api_enabled: 本站每周的嘟文数、活跃用户数和新注册用户数 - backups_retention_period: 将在指定天数内保留生成的用户存档。 + app_icon: WEBP、PNG、GIF 或 JPG。使用自定义图标覆盖移动设备上的默认应用图标。 + backups_retention_period: 用户可以生成其嘟文存档以供之后下载。当该值被设为正值时,这些存档将在指定的天数后自动从您的存储中删除。 bootstrap_timeline_accounts: 这些账号将在新用户关注推荐中置顶。 closed_registrations_message: 在关闭注册时显示 - content_cache_retention_period: 设为正数值时,来自其他服务器的嘟文将在指定天数后被删除。删除有可能会是不可逆的。 + content_cache_retention_period: 来自其它实例的所有嘟文(包括转嘟与回复)都将在指定天数后被删除,不论本实例用户是否与这些嘟文产生过交互。这包括被本实例用户喜欢和收藏的嘟文。实例间用户的私下提及也将丢失并无法恢复。此设置针对的是特殊用途的实例,用于一般用途时会打破许多用户的期望。 custom_css: 你可以为网页版 Mastodon 应用自定义样式。 + favicon: WEBP、PNG、GIF 或 JPG。使用自定义图标覆盖 Mastodon 的默认图标。 mascot: 覆盖高级网页界面中的绘图形象。 - media_cache_retention_period: 设为正数值时,来自其他服务器的媒体文件将在指定天数后被删除,并在需要时再次下载。 + media_cache_retention_period: 来自外站用户嘟文的媒体文件将被缓存到你的实例上。当该值被设为正值时,缓存的媒体文件将在指定天数后被清除。如果媒体文件在被清除后重新被请求,且源站内容仍然可用,它将被重新下载。由于链接预览卡拉取第三方站点的频率受到限制,建议将此值设置为至少 14 天,如果小于该值,链接预览卡将不会按需更新。 peers_api_enabled: 此服务器在联邦宇宙中遇到的域名列表。 这里不包含关于您是否与给定服务器联合的数据,只是您的服务器知道它。 这由收集一般意义上的联邦统计信息的服务使用。 profile_directory: 个人资料目录会列出所有选择可被发现的用户。 require_invite_text: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项 @@ -243,7 +245,7 @@ zh-CN: backups_retention_period: 用户存档保留期 bootstrap_timeline_accounts: 推荐新用户关注以下账号 closed_registrations_message: 在关闭注册时显示的自定义消息 - content_cache_retention_period: 内容缓存保留期 + content_cache_retention_period: 外站内容保留期 custom_css: 自定义 CSS mascot: 自定义吉祥物(旧) media_cache_retention_period: 媒体缓存保留期 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index f6e40720f..0e2ee81db 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -77,13 +77,13 @@ zh-HK: warn: 將已篩選的內容隱藏在篩選器標題的警告後面。 form_admin_settings: activity_api_enabled: 每週本站發佈的帖文、活躍使用者及新註冊的數量 - backups_retention_period: 繼續封存生成的使用者到指定的天數。 + backups_retention_period: 使用者可以生成帖文存檔,以便日後下載。如果設定為正值,這些存檔將在指定天數後自動從你的儲存空間中刪除。 bootstrap_timeline_accounts: 這些帳號會被置頂在新使用者的追蹤建議上。 closed_registrations_message: 關閉註冊時顯示 - content_cache_retention_period: 當設定為正數時,來自其他伺服器的帖文將在指定天數後被刪除。無法還原這個操作。 + content_cache_retention_period: 所有來自其他伺服器的帖文(包括轉推和回覆),不論本站使用者有否與這些帖文互動,帖文都將在指定天數後被刪除。這包括本地使用者標記為書籤或加入最愛的帖文。不同站點之間的私人提及也將丟失,並且無法恢復。此設定適用於有特殊用途的站點,一般使用可能會破壞使用者體驗。 custom_css: 你可以在 Mastodon 網頁版套用自訂樣式。 mascot: 覆蓋進階網頁介面中的插圖。 - media_cache_retention_period: 當設定為正數時,已下載的媒體檔案將在指定天數後被刪除,並視乎需要重新下載。 + media_cache_retention_period: 遠端使用者帖文中的媒體檔案會緩存到你的伺服器上。當設定為正值時,媒體將在指定天數後被刪除。如果媒體資料在刪除後被請求,而源內容仍然可用,則會重新下載該媒體。由於連結預覽卡輪詢第三方網站的頻率有限制,建議將此值設定為至少 14 天,否則在此之前不會按需要更新連結預覽卡。 peers_api_enabled: 本伺服器於聯邦宇宙相遇的網域名單。這裏不包括你與某伺服器有否聯網的數據,僅表示你的伺服器已知的網域。這是供收集一般跨站數據的服務使用。 profile_directory: 個人檔案目錄羅列了所有選擇被發現的使用者。 require_invite_text: 如果需要手動審核註冊,請將「為何你想加入?」文字欄設定為必填,而非選填。 @@ -243,7 +243,7 @@ zh-HK: backups_retention_period: 封存使用者保留期 bootstrap_timeline_accounts: 總是向新使用者推薦這些帳號 closed_registrations_message: 無法註冊時的自訂訊息 - content_cache_retention_period: 內容快取保留期 + content_cache_retention_period: 遠端內容保留期 custom_css: 自訂 CSS mascot: 自訂吉祥物 (舊版) media_cache_retention_period: 媒體快取保留期 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 69a2794e6..b7a67c6a6 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -77,13 +77,15 @@ zh-TW: warn: 隱藏過濾內容於過濾器標題之警告後 form_admin_settings: activity_api_enabled: 本站使用者的嘟文數量,以及本站的活躍使用者與一週內新使用者數量 - backups_retention_period: 將已產生的使用者封存資料保存特定天數。 + app_icon: WEBP、PNG、GIF、或 JPG。於行動裝置上使用自訂圖示替代預設應用程式圖示。 + backups_retention_period: 使用者能產生他們嘟文的備份以便日後下載。當設定為正值時,這些嘟文備份將於指定之天數後自您的儲存空間中自動刪除。 bootstrap_timeline_accounts: 這些帳號將被釘選於新帳號跟隨推薦之上。 closed_registrations_message: 於註冊關閉時顯示 - content_cache_retention_period: 所有來自其他伺服器之嘟文及轉嘟將於指定天數後被刪除。這項操作可能是不可逆的。所有相關之書籤、最愛、轉嘟將會遺失並且無法回復。 + content_cache_retention_period: 所有來自其他伺服器之嘟文(包括轉嘟與回嘟)將於指定之天數後自動刪除,不論這些嘟文與本地使用者間的任何互動。這將包含本地使用者已標記為書籤或最愛之嘟文。不同站點使用者間之私訊亦將遺失且不可回復。此設定應適用於特殊情況,若常規使用將超乎多數使用者預期。 custom_css: 您於 Mastodon 網頁版本中能套用客製化風格。 + favicon: WEBP、PNG、GIF、或 JPG。使用自訂圖示替代預設 Mastodon favicon 圖示。 mascot: 覆寫進階網頁介面中的圖例。 - media_cache_retention_period: 當設定成正值時,已下載的多媒體檔案會於指定天數後被刪除,並且視需要重新下載。 + media_cache_retention_period: 來自遠端伺服器嘟文中之多媒體內容將快取於您的伺服器。當設定為正值時,這些多媒體內容將於指定之天數後自您的儲存空間中自動刪除。若多媒體資料於刪除後被請求,且原始內容仍可存取,它們將被重新下載。由於連結預覽中第三方網站查詢頻率限制,建議將其設定為至少 14 日,否則於此之前連結預覽將不被即時更新。 peers_api_enabled: 浩瀚聯邦宇宙中與此伺服器曾經擦肩而過的網域列表。不包含關於您是否與此伺服器是否有與之串連,僅僅表示您的伺服器已知此網域。這是供收集聯邦宇宙中一般性統計資料服務使用。 profile_directory: 個人檔案目錄將會列出那些有選擇被發現的使用者。 require_invite_text: 如果已設定為手動審核註冊,請將「為什麼想要加入呢?」設定為必填項目。 @@ -243,7 +245,7 @@ zh-TW: backups_retention_period: 使用者封存資料保留期間 bootstrap_timeline_accounts: 永遠推薦這些帳號給新使用者 closed_registrations_message: 當註冊關閉時的客製化訊息 - content_cache_retention_period: 內容快取資料保留期間 + content_cache_retention_period: 遠端內容保留期限 custom_css: 自訂 CSS mascot: 自訂吉祥物 (legacy) media_cache_retention_period: 多媒體快取資料保留期間 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index d4cd86585..f10815129 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -236,10 +236,12 @@ sk: confirm_user_html: "%{name} potvrdil/a emailovú adresu používateľa %{target}" create_account_warning_html: "%{name} poslal/a upozornenie užívateľovi %{target}" create_announcement_html: "%{name} vytvoril/a nové oboznámenie %{target}" + create_canonical_email_block_html: "%{name} zablokoval/a email s hašom %{target}" create_custom_emoji_html: "%{name} nahral/a novú emotikonu %{target}" create_domain_allow_html: "%{name} povolil/a federáciu s doménou %{target}" create_domain_block_html: "%{name} zablokoval/a doménu %{target}" create_email_domain_block_html: "%{name} zablokoval/a e-mailovú doménu %{target}" + create_ip_block_html: "%{name} vytvoril/a pravidlo pre IP %{target}" create_user_role_html: "%{name} vytvoril/a rolu pre %{target}" demote_user_html: "%{name} degradoval/a užívateľa %{target}" destroy_announcement_html: "%{name} vymazal/a oboznámenie %{target}" @@ -252,9 +254,12 @@ sk: destroy_status_html: "%{name} zmazal/a príspevok od %{target}" destroy_unavailable_domain_html: "%{name} znova spustil/a doručovanie pre doménu %{target}" destroy_user_role_html: "%{name} vymazal/a rolu pre %{target}" + enable_custom_emoji_html: "%{name} povolil/a emotikonu %{target}" enable_user_html: "%{name} povolil/a prihlásenie pre používateľa %{target}" memorialize_account_html: "%{name} zmenil/a účet %{target} na pamätnú stránku" + promote_user_html: "%{name} povýšil/a užívateľa %{target}" reject_appeal_html: "%{name} zamietol/la námietku moderovacieho rozhodnutia od %{target}" + reject_user_html: "%{name} odmietol/la registráciu od %{target}" remove_avatar_user_html: "%{name} vymazal/a %{target}/ov/in avatar" reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}" resend_user_html: "%{name} znovu odoslal/a potvrdzovací email pre %{target}" @@ -264,7 +269,9 @@ sk: 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é" + 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}" update_custom_emoji_html: "%{name} aktualizoval/a emotikonu %{target}" @@ -522,10 +529,14 @@ sk: many: "%{count} poznámok" one: "%{count} poznámka" other: "%{count} poznámky" + action_log: Denník auditu action_taken_by: Zákrok vykonal/a actions: 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: + local: Na tomto serveri už vylúčený/á + remote: Už vylúčený/á na ich serveri are_you_sure: Si si istý/á? assign_to_self: Priraď sebe assigned: Priradený moderátor @@ -535,6 +546,7 @@ sk: comment: none: Žiadne confirm: Potvrď + confirm_action: Potvrď moderovací úkon proti @%{acct} created_at: Nahlásené delete_and_resolve: Vymaž príspevky forwarded: Preposlané @@ -589,8 +601,14 @@ sk: delete: Vymaž edit: Uprav postavenie %{name} everyone: Východzie oprávnenia + permissions_count: + few: "%{count} povolení" + many: "%{count} povolení" + one: "%{count} povolenie" + other: "%{count} povolenia" 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 invite_users: Pozvi užívateľov manage_announcements: Spravuj oboznámenia @@ -621,6 +639,7 @@ sk: branding: title: Značka content_retention: + danger_zone: Riziková zóna title: Ponechanie obsahu discovery: follow_recommendations: Odporúčania pre nasledovanie @@ -726,10 +745,16 @@ sk: tags: dashboard: tag_accounts_measure: unikátnych použití + tag_languages_dimension: Najpoužívanejšie jazyky + tag_servers_dimension: Najpoužívanejšie servery tag_servers_measure: iné servery tag_uses_measure: užívateľov celkovo + listable: Môže byť navrhnutý + not_listable: Nebude navrhnutý + not_trendable: Neobjaví sa medzi trendmi not_usable: Nemôže byť použitý title: Populárne štítky + trendable: Môže sa objaviť medzi trendmi trending_rank: 'Populárne #%{rank}' usable: Môže byť použitý title: Trendy @@ -738,7 +763,6 @@ sk: add_new: Pridaj nové delete: Vymaž edit_preset: Uprav varovnú predlohu - title: Spravuj varovné predlohy webhooks: delete: Vymaž disable: Vypni @@ -752,6 +776,7 @@ sk: new_appeal: actions: delete_statuses: vymazať ich príspevky + disable: zmraziť ich účet none: varovanie silence: obmedziť ich účet new_pending_account: @@ -888,14 +913,21 @@ sk: strikes: action_taken: Vykonaný zákrok appeal: Namietni + appeal_submitted_at: Námietka odoslaná appeals: submit: Pošli námietku approve_appeal: Schváľ námietku created_at: Dátumom recipient: Adresované pre + reject_appeal: Zamietni námietku title_actions: + disable: Zmrazenie účtu + mark_statuses_as_sensitive: Označenie príspevkov za chúlostivé none: Varovanie + sensitive: Označenie účtu ako chúlostivý silence: Obmedzenie účtu + your_appeal_approved: Tvoja námietka bola schválená + your_appeal_pending: Odoslal si námietku domain_validator: invalid_domain: nieje správny tvar domény edit_profile: @@ -956,7 +988,11 @@ sk: expires_on: Expiruje dňa %{date} title: Triedenia new: + save: Uložiť nový filter title: Pridaj nové triedenie + statuses: + batch: + remove: Odstrániť z filtrovania generic: all: Všetko cancel: Zruš @@ -975,15 +1011,28 @@ sk: imports: errors: over_rows_processing_limit: obsahuje viac než %{count} riadkov + too_large: Súbor je príliš veľký + 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š. + recent_imports: Nedávne nahrania + states: + finished: Dokončené + unconfirmed: Nepotvrdených + status: Stav success: Tvoje dáta boli nahraté úspešne, a teraz budú spracované v danom čase + titles: + bookmarks: Nahrávanie záložiek + domain_blocking: Nahrávanie blokovaných domén + lists: Nahrávanie zoznamov type_groups: constructive: Sledovania a záložky + destructive: Blokovania a utíšenia types: blocking: Zoznam blokovaných bookmarks: Záložky @@ -1026,6 +1075,9 @@ sk: sign_in_token: emailovým bezpečtnostným kódom webauthn: bezpečnostnými kľúčmi title: História overení + mail_subscriptions: + unsubscribe: + title: Ukonči odber media_attachments: validations: images_and_video: K príspevku ktorý už obsahuje obrázky nemôžeš priložiť video @@ -1121,7 +1173,11 @@ sk: posting_defaults: Východiskové nastavenia príspevkov public_timelines: Verejné časové osi privacy: + privacy: Súkromie + search: Vyhľadávanie title: Súkromie a dosah + privacy_policy: + title: Pravidlá ochrany súkromia reactions: errors: limit_reached: Maximálny počet rôznorodých reakcií bol dosiahnutý @@ -1152,6 +1208,11 @@ sk: status: Stav účtu remote_follow: missing_resource: Nemožno nájsť potrebnú presmerovaciu adresu k tvojmu účtu + rss: + content_warning: 'Varovanie o obsahu:' + descriptions: + account: Verejné príspevky od @%{acct} + tag: 'Verejné príspevky otagované #%{hashtag}' scheduled_statuses: 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 @@ -1203,6 +1264,7 @@ sk: profile: Profil relationships: Sledovania a následovatelia two_factor_authentication: Dvojfázové overenie + webauthn_authentication: Bezpečnostné kľúče severed_relationships: lost_followers: Stratení nasledovatelia lost_follows: Stratené sledovania @@ -1216,11 +1278,13 @@ sk: other: "%{count} obrázky" boosted_from_html: Vyzdvihnuté 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}' + edited_at_html: Upravené %{date} errors: in_reply_not_found: Príspevok, na ktorý sa snažíš odpovedať, pravdepodobne neexistuje. open_in_web: Otvor v okne na webe @@ -1245,6 +1309,7 @@ sk: show_thread: Ukáž diskusné vlákno title: '%{name}: „%{quote}"' visibilities: + direct: Súkromne private: Iba pre sledovateľov private_long: Ukáž iba následovateľom public: Verejné @@ -1252,10 +1317,24 @@ sk: unlisted: Nezaradené unlisted_long: Všetci môžu vidieť, ale nieje zaradené do verejnej osi statuses_cleanup: + 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 + min_age: + '1209600': 2 týždne + '15778476': 6 mesačné + '2629746': 1 mesačné + '31556952': 1 ročné + '5259492': 2 mesačné + '604800': 1 týždeň + '63113904': 2 ročné + '7889238': 3 mesačné stream_entries: sensitive_content: Senzitívny obsah tags: @@ -1282,8 +1361,10 @@ sk: user_mailer: appeal_approved: action: Nastavenia účtu + title: Námietka schválená appeal_rejected: subtitle: Tvoje odvolanie bolo zamietnuté. + title: Námietka zamietnutá backup_ready: explanation: Vyžiadal/a si si úplnú zálohu svojho Mastodon účtu. extra: Teraz je pripravená na stiahnutie! @@ -1291,23 +1372,36 @@ sk: title: Odber archívu failed_2fa: details: 'Tu sú podrobnosti o pokuse o prihlásenie:' + suspicious_sign_in: + change_password: zmeň svoje heslo + title: Nové prihlásenie warning: + appeal: Pošli námietku + reason: 'Dôvod:' subject: disable: Tvoj účet %{acct} bol zamrazený none: Varovanie pre %{acct} silence: Tvoj účet %{acct} bol obmedzený suspend: Tvoj účet %{acct} bol vylúčený title: + delete_statuses: Príspevky vymazané disable: Účet bol zamrazený + mark_statuses_as_sensitive: Príspevky označené za chúlostivé none: Varovanie + sensitive: Účet označený za chúlostivý silence: Účet bol obmedzený suspend: Tvoj účet bol vylúčený welcome: + apps_android_action: Získaj ju na Google Play + apps_ios_action: Stiahni z App Store + apps_step: Stiahni naše oficiálne aplikácie. apps_title: Mastodon aplikácie edit_profile_action: Prispôsob + edit_profile_title: Prispôsob si svoj profil explanation: Tu nájdeš nejaké tipy do začiatku feature_action: Zisti viac follow_action: Nasleduj + follows_title: Koho nasledovať post_title: Vytvor svoj prvý príspevok share_action: Zdieľaj sign_in_action: Prihlás sa diff --git a/config/locales/sl.yml b/config/locales/sl.yml index ff23e6484..1e4e254cf 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -291,6 +291,7 @@ sl: update_custom_emoji_html: "%{name} je posodobil/a emotikone %{target}" update_domain_block_html: "%{name} je posodobil/a domenski blok za %{target}" update_ip_block_html: "%{name} je spremenil/a pravilo za IP %{target}" + update_report_html: "%{name} je posodobil poročilo %{target}" update_status_html: "%{name} je posodobil/a objavo uporabnika %{target}" update_user_role_html: "%{name} je spremenil/a vlogo %{target}" deleted_account: izbrisan račun @@ -779,6 +780,7 @@ sl: desc_html: To se zanaša na zunanje skripte hCaptcha in lahko predstavlja tveganje za varnost in zasebnost. Poleg tega to lahko nekaterim ljudem (posebno invalidom) občutno oteži dostopnost registracijskega postopka. Zato svetujemo, da razmislite o drugih ukrepih, kot je na primer registracija na podlagi odobritve ali povabila. title: Od novih uporabnikov zahtevaj reševanje CAPTCHA za potrditev računov content_retention: + danger_zone: Območje nevarnosti preamble: Nazdor nad hrambo vsebine uporabnikov v Mastodonu. title: Hramba vsebin default_noindex: @@ -983,7 +985,7 @@ sl: delete: Izbriši edit_preset: Uredi prednastavitev opozoril empty: Zaenkrat še niste določili nobenih opozorilnih prednastavitev. - title: Upravljaj prednastavitev opozoril + title: Pred-nastavitve opozoril webhooks: add_new: Dodaj končno točko delete: Izbriši diff --git a/config/locales/sq.yml b/config/locales/sq.yml index dcacb46bf..5439f08a0 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -285,6 +285,7 @@ sq: update_custom_emoji_html: "%{name} përditësoi emoxhin %{target}" update_domain_block_html: "%{name} përditësoi bllokim përkatësish për %{target}" update_ip_block_html: "%{name} ndryshoi rregull për IP-në %{target}" + 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}" deleted_account: fshiu llogarinë @@ -748,6 +749,7 @@ sq: desc_html: Kjo bazohet në programthe të jashtëm prej hCaptcha, çka mund të përbëjë një shqetësim për sigurinë dhe privatësinë. Veç kësaj, kjo mund ta bëjë procesin e regjistrimit në shkallë të madhe më pak të përdorshëm për disa persona (veçanërisht ata me paaftësi). Për këto arsye, ju lutemi, shihni mundësinë e masave alternative, fjala vjen, bazuar në miratim, ose regjistrim vetëm me ftesa. title: Kërko prej përdoruesve të rinj të zgjidhin një CAPTCHA, si ripohim të llogarisë të tyre content_retention: + danger_zone: Zonë rreziku preamble: Kontrolloni se si depozitohen në Mastodon lënda e prodhuar nga përdoruesit. title: Mbajtje lënde default_noindex: @@ -945,7 +947,7 @@ sq: delete: Fshije edit_preset: Përpunoni sinjalizim të paracaktuar empty: S’keni përcaktuar ende sinjalizime të gatshme. - title: Administroni sinjalizime të paracaktuara + title: Paracaktime sinjalizimesh webhooks: add_new: Shtoni pikëmbarim delete: Fshije diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index e0fe9a710..718d1c0f8 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -288,6 +288,7 @@ sr-Latn: update_custom_emoji_html: "%{name} je ažurirao/-la emodži %{target}" update_domain_block_html: "%{name} je ažurirao/-la blok domena %{target}" update_ip_block_html: "%{name} je promenio/-la IP uslov za %{target}" + update_report_html: "%{name} je ažurirao izveštaj %{target}" update_status_html: "%{name} je ažurirao/-la objavu korisnika %{target}" update_user_role_html: "%{name} je promenio/-la poziciju %{target}" deleted_account: obrisan nalog @@ -765,6 +766,7 @@ sr-Latn: desc_html: Ovo se oslanja na eksterne skripte iz hCaptcha, što može predstavljati zabrinutost za bezbednost i privatnost. Pored toga, ovo može učiniti proces registracije znatno manje dostupnim nekim (posebno osobama sa invaliditetom). Iz ovih razloga, razmotrite alternativne mere kao što je registracija zasnovana na odobrenju ili na pozivu. title: Zahtevaj od novih korisnika da reše CAPTCHA da bi potvrdili svoj nalog content_retention: + danger_zone: Opasna zona preamble: Kontrolišite kako se sadržaj generisan od strane korisnika skladišti na Mastodon-u. title: Zadržavanje sadržaja default_noindex: @@ -867,7 +869,7 @@ sr-Latn: action: Pogledaj dokumentaciju message_html: Vaš Elasticsearch klaster ima samo jedan čvor, ES_PRESETtreba postaviti nasingle_node_cluster. elasticsearch_reset_chewy: - message_html: Vaš Elasticsearch klaster ima samo jedan čvor, ES_PRESETtreba postaviti nasingle_node_cluster. + message_html: Indeks Elasticsearch sistema je zastareo zbog promene podešavanja. Pokrenite tootctl search deploy --reset-chewyda biste ga ažurirali. elasticsearch_running_check: message_html: Povezivanje na Elasticsearch nije bilo moguće. Molimo Vas proverite da li je pokrenut, ili onemogućite pretragu celog teksta elasticsearch_version_check: @@ -964,9 +966,9 @@ sr-Latn: warning_presets: add_new: Dodaj novi delete: Izbriši - edit_preset: Uredi preset upozorenja - empty: Još uvek niste definisali nijedan šablon upozorenja. - title: Upravljaj presetima upozorenja + edit_preset: Uredi predefinisana upozorenja + empty: Još uvek niste definisali nijedno upozorenje. + title: Predefinisana upozorenja webhooks: add_new: Dodaj krajnju tačku delete: Izbriši diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 1c4ffc8c0..c9a67b193 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -288,6 +288,7 @@ sr: update_custom_emoji_html: "%{name} је ажурирао/-ла емоџи %{target}" update_domain_block_html: "%{name} је ажурирао/-ла блок домена %{target}" update_ip_block_html: "%{name} је променио/-ла IP услов за %{target}" + update_report_html: "%{name} је ажурирао извештај %{target}" update_status_html: "%{name} је ажурирао/-ла објаву корисника %{target}" update_user_role_html: "%{name} је променио/-ла позицију %{target}" deleted_account: обрисан налог @@ -765,6 +766,7 @@ sr: desc_html: Ово се ослања на екстерне скрипте из hCaptcha, што може представљати забринутост за безбедност и приватност. Поред тога, ово може учинити процес регистрације знатно мање доступним неким (посебно особама са инвалидитетом). Из ових разлога, размотрите алтернативне мере као што је регистрација заснована на одобрењу или на позиву. title: Захтевај од нових корисника да реше CAPTCHA да би потврдили свој налог content_retention: + danger_zone: Опасна зона preamble: Контролишите како се садржај генерисан од стране корисника складишти на Mastodon-у. title: Задржавање садржаја default_noindex: @@ -867,7 +869,7 @@ sr: action: Погледај документацију message_html: Ваш Elasticsearch кластер има само један чвор, ES_PRESETтреба поставити наsingle_node_cluster. elasticsearch_reset_chewy: - message_html: Ваш Elasticsearch кластер има само један чвор, ES_PRESETтреба поставити наsingle_node_cluster. + message_html: Индекс Elasticsearch система је застарео због промене подешавања. Покрените tootctl search deploy --reset-chewyда бисте га ажурирали. elasticsearch_running_check: message_html: Повезивање на Elasticsearch није било могуће. Молимо Вас проверите да ли је покренут, или онемогућите претрагу целог текста elasticsearch_version_check: @@ -964,9 +966,9 @@ sr: warning_presets: add_new: Додај нови delete: Избриши - edit_preset: Уреди пресет упозорења - empty: Још увек нисте дефинисали ниједан шаблон упозорења. - title: Управљај пресетима упозорења + edit_preset: Уреди предефинисана упозорења + empty: Још увек нисте дефинисали ниједно упозорење. + title: Предефинисна упозорења webhooks: add_new: Додај крајњу тачку delete: Избриши diff --git a/config/locales/sv.yml b/config/locales/sv.yml index d078cf720..cf68cdd56 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -285,6 +285,7 @@ sv: update_custom_emoji_html: "%{name} uppdaterade emoji %{target}" update_domain_block_html: "%{name} uppdaterade domän-block för %{target}" update_ip_block_html: "%{name} ändrade regel för IP %{target}" + update_report_html: "%{name} uppdaterade rapporten %{target}" update_status_html: "%{name} uppdaterade inlägget av %{target}" update_user_role_html: "%{name} ändrade rollen %{target}" deleted_account: raderat konto @@ -751,6 +752,7 @@ sv: desc_html: Detta bygger på externa skript från hCaptcha vilket kan vara ett säkerhets- och integritetsproblem. Dessutom,kan detta göra registreringsprocessen betydligt mindre tillgänglig för vissa personer (särskilt funktionsnedsatta). Av dessa skäl bör du överväga alternativa åtgärder såsom godkänningsbaserad eller inbjudningsbaserad registrering. title: Kräv att nya användare löser en CAPTCHA för att erkänna sitt konto content_retention: + danger_zone: Farozon preamble: Kontrollera hur användargenererat innehåll lagras i Mastodon. title: Bibehållande av innehåll default_noindex: @@ -949,7 +951,6 @@ sv: delete: Radera edit_preset: Redigera varningsförval empty: Du har inte definierat några varningsförval ännu. - title: Hantera varningsförval webhooks: add_new: Lägg till slutpunkt delete: Ta bort diff --git a/config/locales/th.yml b/config/locales/th.yml index 17ff6a5cc..bafcd30de 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -282,6 +282,7 @@ th: update_custom_emoji_html: "%{name} ได้อัปเดตอีโมจิ %{target}" update_domain_block_html: "%{name} ได้อัปเดตการปิดกั้นโดเมนสำหรับ %{target}" update_ip_block_html: "%{name} ได้เปลี่ยนกฎสำหรับ IP %{target}" + update_report_html: "%{name} ได้อัปเดตรายงาน %{target}" update_status_html: "%{name} ได้อัปเดตโพสต์โดย %{target}" update_user_role_html: "%{name} ได้เปลี่ยนบทบาท %{target}" deleted_account: บัญชีที่ลบแล้ว @@ -737,6 +738,7 @@ th: desc_html: สิ่งนี้พึ่งพาสคริปต์ภายนอกจาก hCaptcha ซึ่งอาจเป็นข้อกังวลด้านความปลอดภัยและความเป็นส่วนตัว นอกจากนี้ สิ่งนี้สามารถทำให้กระบวนการการลงทะเบียนเข้าถึงได้น้อยลงอย่างมีนัยสำคัญสำหรับผู้คนบางส่วน (โดยเฉพาะอย่างยิ่งผู้พิการ) ด้วยเหตุผลเหล่านี้ โปรดพิจารณามาตรการทางเลือก เช่น การลงทะเบียนตามการอนุมัติหรือตามคำเชิญ title: ต้องให้ผู้ใช้ใหม่แก้ CAPTCHA เพื่อยืนยันบัญชีของเขา content_retention: + danger_zone: โซนอันตราย preamble: ควบคุมวิธีการจัดเก็บเนื้อหาที่ผู้ใช้สร้างขึ้นใน Mastodon title: การเก็บรักษาเนื้อหา default_noindex: @@ -932,7 +934,7 @@ th: delete: ลบ edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า empty: คุณยังไม่ได้กำหนดคำเตือนที่ตั้งไว้ล่วงหน้าใด ๆ - title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า + title: คำเตือนที่ตั้งไว้ล่วงหน้า webhooks: add_new: เพิ่มปลายทาง delete: ลบ @@ -1836,6 +1838,11 @@ th: explanation: นี่คือเคล็ดลับบางส่วนที่จะช่วยให้คุณเริ่มต้นใช้งาน feature_action: เรียนรู้เพิ่มเติม feature_audience: Mastodon มีความพิเศษที่ให้คุณจัดการผู้รับสารของคุณได้โดยไม่มีตัวกลาง นอกจากนี้ การติดตั้ง Mastodon บนโครงสร้างพื้นฐานของคุณจะทำให้คุณสามารถติดตาม (และติดตามโดย) เซิร์ฟเวอร์ Mastodon แห่งไหนก็ได้ที่ทำงานอยู่ โดยไม่มีใครสามารถควบคุมได้นอกจากคุณ + feature_audience_title: สร้างผู้ชมของคุณด้วยความมั่นใจ + feature_control: คุณทราบดีที่สุดถึงสิ่งที่คุณต้องการเห็นในฟีดหน้าแรกของคุณ ไม่มีอัลกอริทึมหรือโฆษณาให้เสียเวลาของคุณ ติดตามใครก็ตามทั่วทั้งเซิร์ฟเวอร์ Mastodon ใด ๆ จากบัญชีเดียวและรับโพสต์ของเขาตามลำดับเวลา และทำให้มุมอินเทอร์เน็ตของคุณเป็นเหมือนคุณมากขึ้นอีกนิด + feature_control_title: การควบคุมเส้นเวลาของคุณเอง + feature_creativity_title: ความคิดสร้างสรรค์ที่ไม่มีใครเทียบได้ + feature_moderation_title: การกลั่นกรองในแบบที่ควรจะเป็น follow_action: ติดตาม follow_step: การติดตามผู้คนที่น่าสนใจคือสิ่งที่ Mastodon ให้ความสำคัญ follow_title: ปรับแต่งฟีดหน้าแรกของคุณ diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 4bd0e3455..3ce12fec8 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -285,6 +285,7 @@ tr: update_custom_emoji_html: "%{name}, %{target} emojisini güncelledi" update_domain_block_html: "%{name}, %{target} alan adının engelini güncelledi" update_ip_block_html: "%{name}, %{target} IP adresi için kuralı güncelledi" + update_report_html: "%{name}, %{target} raporunu güncelledi" update_status_html: "%{name}, %{target} kullanıcısının gönderisini güncelledi" update_user_role_html: "%{name}, %{target} rolünü değiştirdi" deleted_account: hesap silindi @@ -751,6 +752,7 @@ tr: desc_html: Bu, güvenlik ve gizlilikle ilgili bir endişe kaynağı olabilecek hCaptcha'nın harici komut dosyalarına dayanır. Ayrıca bu, kayıt sürecini bazı (özellikle engelli) kişiler için önemli ölçüde daha az erişilebilir hale getirebilir. Bu nedenlerle, lütfen onaya dayalı veya davete dayalı kayıt gibi alternatif önlemleri göz önünde bulundurun. title: Yeni kullanıcıların hesaplarını doğrulamaları için bir CAPTCHA çözmelerini gerektir content_retention: + danger_zone: Tehlikeli bölge preamble: Kullanıcıların ürettiği içeriğin Mastodon'da nasıl saklanacağını denetleyin. title: İçerik saklama default_noindex: @@ -949,7 +951,7 @@ tr: delete: Sil edit_preset: Uyarı ön-ayarını düzenle empty: Henüz önceden ayarlanmış bir uyarı tanımlanmadı. - title: Uyarı ön-ayarlarını yönet + title: Uyarı Önayarları webhooks: add_new: Uç nokta ekle delete: Sil diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 7c7652d69..c4f4a2638 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -291,6 +291,7 @@ uk: update_custom_emoji_html: "%{name} оновлює емодзі %{target}" update_domain_block_html: "%{name} оновлює блокування домену для %{target}" update_ip_block_html: "%{name} змінює правило для IP %{target}" + update_report_html: "%{name} оновлений звіт %{target}" update_status_html: "%{name} оновлює допис %{target}" update_user_role_html: "%{name} змінює роль %{target}" deleted_account: видалений обліковий запис @@ -671,7 +672,7 @@ uk: delete_html: 'Ви збираєтеся вилучити деякі з дописів @%{acct}. Це буде:' mark_as_sensitive_html: 'Ви збираєтеся позначити деякі з дописів @%{acct} делікатними. Це буде:' silence_html: 'Ви збираєтеся обмежити обліковий запис @%{acct}. Це буде:' - suspend_html: 'Ви збираєтесь призупинити обліковий запис @%%{acct}. Це буде:' + suspend_html: 'Ви збираєтесь призупинити обліковий запис @%{acct}. Це буде:' actions: delete_html: Вилучити образливі дописи mark_as_sensitive_html: Позначити медіа образливих дописів делікатними @@ -779,6 +780,7 @@ uk: desc_html: Це залежить від зовнішніх скриптів hCaptcha, що може становити загрозу безпеці та приватності. Крім того, це може зробити процес реєстрації значно менш доступним для деяких людей (особливо з обмеженими можливостями). З цих причин, будь ласка, розгляньте альтернативні заходи, такі як реєстрація на основі схвалення або на основі запрошення. title: Вимагати нових користувачів розв'язувати CAPTCHA для підтвердження облікового запису content_retention: + danger_zone: Зони небезпеки preamble: Контролюйте, як зберігаються користувацькі матеріали в Mastodon. title: Зберігання вмісту default_noindex: @@ -983,7 +985,7 @@ uk: delete: Видалити edit_preset: Редагувати шаблон попередження empty: Ви ще не визначили жодних попереджень. - title: Керування шаблонами попереджень + title: Попереджувальні пресети webhooks: add_new: Додати кінцеву точку delete: Видалити diff --git a/config/locales/vi.yml b/config/locales/vi.yml index ec851a828..459d1bb0d 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -282,6 +282,7 @@ vi: update_custom_emoji_html: "%{name} đã cập nhật emoji %{target}" update_domain_block_html: "%{name} cập nhật chặn máy chủ %{target}" update_ip_block_html: "%{name} cập nhật chặn IP %{target}" + update_report_html: "%{name} cập nhật báo cáo %{target}" update_status_html: "%{name} cập nhật tút của %{target}" update_user_role_html: "%{name} đã thay đổi vai trò %{target}" deleted_account: tài khoản đã xóa @@ -737,6 +738,7 @@ vi: desc_html: Điều này phụ thuộc vào các mã lệnh bên ngoài từ hCaptcha, đây có thể là mối lo ngại về bảo mật và quyền riêng tư. Thêm vào đó, điều này có thể làm cho quá trình đăng ký khó hơn đối với một số người (đặc biệt là người khuyết tật). Vì những lý do này, vui lòng xem xét các biện pháp thay thế như duyệt đăng ký thủ công hoặc tạo thư mời. title: Yêu cầu người dùng mới dùng CAPTCHA để xác minh tài khoản của họ content_retention: + danger_zone: Khu vực nguy hiểm preamble: Kiểm soát cách lưu trữ nội dung cá nhân trong Mastodon. title: Lưu giữ nội dung default_noindex: @@ -932,7 +934,7 @@ vi: delete: Xóa bỏ edit_preset: Sửa mẫu có sẵn empty: Bạn chưa thêm mẫu cảnh cáo nào cả. - title: Quản lý mẫu cảnh cáo + title: Cảnh báo cài sẵn webhooks: add_new: Thêm endpoint delete: Xóa bỏ diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 79764539d..b668c23d2 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -282,6 +282,7 @@ zh-CN: update_custom_emoji_html: "%{name} 更新了自定义表情 %{target}" update_domain_block_html: "%{name} 更新了对 %{target} 的域名屏蔽" update_ip_block_html: "%{name} 修改了对 IP %{target} 的规则" + update_report_html: "%{name} 更新了举报 %{target}" update_status_html: "%{name} 刷新了 %{target} 的嘟文" update_user_role_html: "%{name} 更改了 %{target} 角色" deleted_account: 账号已注销 @@ -737,6 +738,7 @@ zh-CN: desc_html: 这依赖于来自hCaptcha的外部脚本,可能会带来安全和隐私问题。此外,这可能使注册过程对某些人(尤其是残疾人)的注册简易程度大幅下降。出于这些原因,请考虑采取其他措施,如基于批准或邀请的注册方式。 title: 要求新用户输入验证码以确认他们的账户 content_retention: + danger_zone: 危险操作区 preamble: 控制用户生成的内容在 Mastodon 中如何存储。 title: 内容保留 default_noindex: @@ -932,7 +934,7 @@ zh-CN: delete: 删除 edit_preset: 编辑预置警告 empty: 你尚未定义任何警告预设。 - title: 管理预设警告 + title: 预设警告 webhooks: add_new: 新增对端 delete: 删除 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 1dc50c284..ddc6571e6 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -737,6 +737,7 @@ zh-HK: desc_html: 這倚賴 hCaptcha 的外部腳本,或會引起安全和私隱疑慮。此外,此註冊流程亦可能對特定人士(尤其是殘疾人士)有較多障礙。有鑑於此,請考慮使用其他以審核或邀請的註冊方式。 title: 要求新使用者解答 CAPTCHA 以驗證帳號 content_retention: + danger_zone: 危險區域 preamble: 控制使用者生成的內容如何儲存在 Mastodon。 title: 內容留存 default_noindex: @@ -932,7 +933,6 @@ zh-HK: delete: 刪除 edit_preset: 設定警告預設 empty: 您尚未定義任何預設警告 - title: 管理警告預設 webhooks: add_new: 新增端點 delete: 刪除 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 407931c20..14f54f9a1 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -282,6 +282,7 @@ zh-TW: update_custom_emoji_html: "%{name} 已更新自訂 emoji 表情符號 %{target}" update_domain_block_html: "%{name} 已更新 %{target} 之網域封鎖" update_ip_block_html: "%{name} 已變更 IP %{target} 之規則" + update_report_html: "%{name} 已更新 %{target} 的檢舉" update_status_html: "%{name} 已更新 %{target} 的嘟文" update_user_role_html: "%{name} 已變更 %{target} 角色" deleted_account: 已刪除帳號 @@ -739,6 +740,7 @@ zh-TW: 此外,這將大幅降低註冊流程對某些族群之易用性,特別是無障礙需求人士。基於此因,請考慮其他替代性方案,例如審核制或是邀請制之註冊流程。 title: 要求新使用者完成 CAPTCHA 挑戰以確認帳號 content_retention: + danger_zone: 危險區域! preamble: 控制使用者產生內容如何儲存於 Mastodon 上。 title: 內容保留期間 default_noindex: @@ -934,7 +936,7 @@ zh-TW: delete: 刪除 edit_preset: 編輯預設警告 empty: 您尚未定義任何預設警告。 - title: 管理預設警告 + title: 預設警告內容 webhooks: add_new: 新增端點 delete: 刪除 diff --git a/config/navigation.rb b/config/navigation.rb index 791025d52..c1dd81501 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -36,7 +36,7 @@ SimpleNavigation::Configuration.run do |navigation| end n.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: -> { current_user.can?(:invite_users) && current_user.functional? && !self_destruct } - n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_path, if: -> { current_user.functional? && !self_destruct } + n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_path, highlights_on: %r{/settings/applications}, if: -> { current_user.functional? && !self_destruct } n.item :trends, safe_join([fa_icon('fire fw'), t('admin.trends.title')]), admin_trends_statuses_path, if: -> { current_user.can?(:manage_taxonomies) && !self_destruct } do |s| s.item :statuses, safe_join([fa_icon('comments-o fw'), t('admin.trends.statuses.title')]), admin_trends_statuses_path, highlights_on: %r{/admin/trends/statuses} @@ -45,8 +45,8 @@ SimpleNavigation::Configuration.run do |navigation| end n.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) && !self_destruct } do |s| - s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports}, if: -> { current_user.can?(:manage_reports) } - s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) } + s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports|admin/report_notes}, if: -> { current_user.can?(:manage_reports) } + s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|admin/account_moderation_notes|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) } s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path, if: -> { current_user.can?(:manage_invites) } s.item :follow_recommendations, safe_join([fa_icon('user-plus fw'), t('admin.follow_recommendations.title')]), admin_follow_recommendations_path, highlights_on: %r{/admin/follow_recommendations}, if: -> { current_user.can?(:manage_taxonomies) } s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_path(limited: limited_federation_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) } @@ -59,6 +59,7 @@ SimpleNavigation::Configuration.run do |navigation| s.item :dashboard, safe_join([fa_icon('tachometer fw'), t('admin.dashboard.title')]), admin_dashboard_path, if: -> { current_user.can?(:view_dashboard) } s.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), admin_settings_path, if: -> { current_user.can?(:manage_settings) }, highlights_on: %r{/admin/settings} s.item :rules, safe_join([fa_icon('gavel fw'), t('admin.rules.title')]), admin_rules_path, highlights_on: %r{/admin/rules}, if: -> { current_user.can?(:manage_rules) } + s.item :warning_presets, safe_join([fa_icon('warning fw'), t('admin.warning_presets.title')]), admin_warning_presets_path, highlights_on: %r{/admin/warning_presets}, if: -> { current_user.can?(:manage_settings) } s.item :roles, safe_join([fa_icon('vcard fw'), t('admin.roles.title')]), admin_roles_path, highlights_on: %r{/admin/roles}, if: -> { current_user.can?(:manage_roles) } s.item :announcements, safe_join([fa_icon('bullhorn fw'), t('admin.announcements.title')]), admin_announcements_path, highlights_on: %r{/admin/announcements}, if: -> { current_user.can?(:manage_announcements) } s.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_path, highlights_on: %r{/admin/custom_emojis}, if: -> { current_user.can?(:manage_custom_emojis) } diff --git a/config/routes.rb b/config/routes.rb index 3d3c94096..f4662dd5d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -62,6 +62,7 @@ Rails.application.routes.draw do tokens: 'oauth/tokens' end + get '.well-known/oauth-authorization-server', to: 'well_known/oauth_metadata#show', as: :oauth_metadata, defaults: { format: 'json' } get '.well-known/host-meta', to: 'well_known/host_meta#show', as: :host_meta, defaults: { format: 'xml' } get '.well-known/nodeinfo', to: 'well_known/node_info#index', as: :nodeinfo, defaults: { format: 'json' } get '.well-known/webfinger', to: 'well_known/webfinger#show', as: :webfinger diff --git a/config/routes/api.rb b/config/routes/api.rb index 60fb0394e..bf3cee0c1 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -6,7 +6,7 @@ namespace :api, format: false do # JSON / REST API namespace :v1 do - resources :statuses, only: [:create, :show, :update, :destroy] do + resources :statuses, only: [:index, :create, :show, :update, :destroy] do scope module: :statuses do resources :reblogged_by, controller: :reblogged_by_accounts, only: :index resources :favourited_by, controller: :favourited_by_accounts, only: :index @@ -182,7 +182,7 @@ namespace :api, format: false do resources :familiar_followers, only: :index end - resources :accounts, only: [:create, :show] do + resources :accounts, only: [:index, :create, :show] do scope module: :accounts do resources :statuses, only: :index resources :followers, only: :index, controller: :follower_accounts diff --git a/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb b/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb index 3666abf1c..534df25ee 100644 --- a/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb +++ b/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb @@ -3,7 +3,11 @@ class AddAttachmentAvatarToAccounts < ActiveRecord::Migration[4.2] def self.up change_table :accounts do |t| - t.attachment :avatar + # The following corresponds to `t.attachment :avatar` in an older version of Paperclip + t.string :avatar_file_name + t.string :avatar_content_type + t.integer :avatar_file_size + t.datetime :avatar_updated_at end end diff --git a/db/migrate/20160312193225_add_attachment_header_to_accounts.rb b/db/migrate/20160312193225_add_attachment_header_to_accounts.rb index 37108fc18..b481fc529 100644 --- a/db/migrate/20160312193225_add_attachment_header_to_accounts.rb +++ b/db/migrate/20160312193225_add_attachment_header_to_accounts.rb @@ -3,7 +3,11 @@ class AddAttachmentHeaderToAccounts < ActiveRecord::Migration[4.2] def self.up change_table :accounts do |t| - t.attachment :header + # The following corresponds to `t.attachment :header` in an older version of Paperclip + t.string :header_file_name + t.string :header_content_type + t.integer :header_file_size + t.datetime :header_updated_at end end diff --git a/db/migrate/20160905150353_create_media_attachments.rb b/db/migrate/20160905150353_create_media_attachments.rb index 3903a7b9a..92680db9f 100644 --- a/db/migrate/20160905150353_create_media_attachments.rb +++ b/db/migrate/20160905150353_create_media_attachments.rb @@ -4,7 +4,13 @@ class CreateMediaAttachments < ActiveRecord::Migration[5.0] def change create_table :media_attachments do |t| t.integer :status_id, null: true, default: nil - t.attachment :file + + # The following corresponds to `t.attachment :file` in an older version of Paperclip + t.string :file_file_name + t.string :file_content_type + t.integer :file_file_size + t.datetime :file_updated_at + t.string :remote_url, null: false, default: '' t.integer :account_id diff --git a/db/migrate/20170330164118_add_attachment_data_to_imports.rb b/db/migrate/20170330164118_add_attachment_data_to_imports.rb index 908d4da96..0daaa9d02 100644 --- a/db/migrate/20170330164118_add_attachment_data_to_imports.rb +++ b/db/migrate/20170330164118_add_attachment_data_to_imports.rb @@ -3,7 +3,11 @@ class AddAttachmentDataToImports < ActiveRecord::Migration[4.2] def self.up change_table :imports do |t| - t.attachment :data + # The following corresponds to `t.attachment :data` in an older version of Paperclip + t.string :data_file_name + t.string :data_content_type + t.integer :data_file_size + t.datetime :data_updated_at end end diff --git a/db/migrate/20170901141119_truncate_preview_cards.rb b/db/migrate/20170901141119_truncate_preview_cards.rb index b4ba8c45e..f251841f2 100644 --- a/db/migrate/20170901141119_truncate_preview_cards.rb +++ b/db/migrate/20170901141119_truncate_preview_cards.rb @@ -8,7 +8,13 @@ class TruncatePreviewCards < ActiveRecord::Migration[5.1] t.string :url, default: '', null: false, index: { unique: true } t.string :title, default: '', null: false t.string :description, default: '', null: false - t.attachment :image + + # The following corresponds to `t.attachment :image` in an older version of Paperclip + t.string :image_file_name + t.string :image_content_type + t.integer :image_file_size + t.datetime :image_updated_at + t.integer :type, default: 0, null: false t.text :html, default: '', null: false t.string :author_name, default: '', null: false diff --git a/db/migrate/20170913000752_create_site_uploads.rb b/db/migrate/20170913000752_create_site_uploads.rb index 43a793806..16a95ea01 100644 --- a/db/migrate/20170913000752_create_site_uploads.rb +++ b/db/migrate/20170913000752_create_site_uploads.rb @@ -4,7 +4,13 @@ class CreateSiteUploads < ActiveRecord::Migration[5.1] def change create_table :site_uploads do |t| t.string :var, default: '', null: false, index: { unique: true } - t.attachment :file + + # The following corresponds to `t.attachment :file` in an older version of Paperclip + t.string :file_file_name + t.string :file_content_type + t.integer :file_file_size + t.datetime :file_updated_at + t.json :meta t.timestamps end diff --git a/db/migrate/20170917153509_create_custom_emojis.rb b/db/migrate/20170917153509_create_custom_emojis.rb index 984fcd218..dedc8cde8 100644 --- a/db/migrate/20170917153509_create_custom_emojis.rb +++ b/db/migrate/20170917153509_create_custom_emojis.rb @@ -5,7 +5,12 @@ class CreateCustomEmojis < ActiveRecord::Migration[5.1] create_table :custom_emojis do |t| t.string :shortcode, null: false, default: '' t.string :domain - t.attachment :image + + # The following corresponds to `t.attachment :image` in an older version of Paperclip + t.string :image_file_name + t.string :image_content_type + t.integer :image_file_size + t.datetime :image_updated_at t.timestamps end diff --git a/db/migrate/20200627125810_add_thumbnail_columns_to_media_attachments.rb b/db/migrate/20200627125810_add_thumbnail_columns_to_media_attachments.rb index a3c6b55fd..c11a24e8b 100644 --- a/db/migrate/20200627125810_add_thumbnail_columns_to_media_attachments.rb +++ b/db/migrate/20200627125810_add_thumbnail_columns_to_media_attachments.rb @@ -2,7 +2,12 @@ class AddThumbnailColumnsToMediaAttachments < ActiveRecord::Migration[5.2] def up - add_attachment :media_attachments, :thumbnail + # The following corresponds to `add_attachment :media_attachments, :thumbnail` in an older version of Paperclip + add_column :media_attachments, :thumbnail_file_name, :string + add_column :media_attachments, :thumbnail_content_type, :string + add_column :media_attachments, :thumbnail_file_size, :integer + add_column :media_attachments, :thumbnail_updated_at, :datetime + add_column :media_attachments, :thumbnail_remote_url, :string end diff --git a/db/migrate/20231210154528_add_otp_secret_to_user.rb b/db/migrate/20231210154528_add_otp_secret_to_user.rb new file mode 100644 index 000000000..b2ce0a4f7 --- /dev/null +++ b/db/migrate/20231210154528_add_otp_secret_to_user.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddOtpSecretToUser < ActiveRecord::Migration[7.1] + def change + add_column :users, :otp_secret, :string + end +end diff --git a/db/migrate/20240510192043_fix_notification_policies_foreign_key.rb b/db/migrate/20240510192043_fix_notification_policies_foreign_key.rb new file mode 100644 index 000000000..7bb134ecf --- /dev/null +++ b/db/migrate/20240510192043_fix_notification_policies_foreign_key.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +class FixNotificationPoliciesForeignKey < ActiveRecord::Migration[7.1] + def up + safety_assured do + execute <<~SQL.squish + ALTER TABLE notification_policies + DROP CONSTRAINT fk_rails_506d62f0da, + ADD CONSTRAINT fk_rails_506d62f0da + FOREIGN KEY (account_id) + REFERENCES accounts(id) + ON DELETE CASCADE + SQL + end + end + + def down + safety_assured do + execute <<~SQL.squish + ALTER TABLE notification_policies + DROP CONSTRAINT fk_rails_506d62f0da, + ADD CONSTRAINT fk_rails_506d62f0da + FOREIGN KEY (account_id) + REFERENCES accounts(id) + SQL + end + end +end diff --git a/db/migrate/20240522041528_add_author_account_id_to_preview_cards.rb b/db/migrate/20240522041528_add_author_account_id_to_preview_cards.rb new file mode 100644 index 000000000..a6e7a883d --- /dev/null +++ b/db/migrate/20240522041528_add_author_account_id_to_preview_cards.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class AddAuthorAccountIdToPreviewCards < ActiveRecord::Migration[7.1] + disable_ddl_transaction! + + def change + safety_assured { add_reference :preview_cards, :author_account, null: true, foreign_key: { to_table: 'accounts', on_delete: :nullify }, index: false } + add_index :preview_cards, :author_account_id, algorithm: :concurrently, where: 'author_account_id IS NOT NULL' + end +end diff --git a/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb b/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb new file mode 100644 index 000000000..6194cf9ee --- /dev/null +++ b/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +class MigrateDeviseTwoFactorSecrets < ActiveRecord::Migration[7.1] + disable_ddl_transaction! + + class MigrationUser < ApplicationRecord + self.table_name = :users + + devise :two_factor_authenticatable, + otp_secret_encryption_key: Rails.configuration.x.otp_secret + + include LegacyOtpSecret # Must be after the above `devise` line in order to override the legacy method + end + + def up + MigrationUser.reset_column_information + + users_with_otp_enabled.find_each do |user| + # Gets the new value on already-updated users + # Falls back to legacy value on not-yet-migrated users + otp_secret = begin + user.otp_secret + rescue OpenSSL::OpenSSLError + next if ENV['MIGRATION_IGNORE_INVALID_OTP_SECRET'] == 'true' + + abort_with_decryption_error(user) + end + + Rails.logger.debug { "Processing #{user.email}" } + + # This is a no-op for migrated users and updates format for not migrated + user.update!(otp_secret: otp_secret) + end + end + + def down + raise ActiveRecord::IrreversibleMigration + end + + private + + def users_with_otp_enabled + MigrationUser.where(otp_required_for_login: true, otp_secret: nil) + end + + def abort_with_decryption_error(user) + abort <<~MESSAGE + + ERROR: Unable to decrypt OTP secret for user #{user.id}. + + This is most likely because you have changed the value of `OTP_SECRET` at some point in + time after the user configured 2FA. + + In this case, their OTP secret had already been lost with the change to `OTP_SECRET`, and + proceeding with this migration will not make the situation worse. + + Please double-check that you have not accidentally changed `OTP_SECRET` just for this + migration, and re-run the migration with `MIGRATION_IGNORE_INVALID_OTP_SECRET=true`. + + Migration aborted. + MESSAGE + end +end diff --git a/db/schema.rb b/db/schema.rb index a875c6ffc..3a47522d2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do +ActiveRecord::Schema[7.1].define(version: 2024_05_22_041528) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -877,6 +877,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do t.integer "link_type" t.datetime "published_at" t.string "image_description", default: "", null: false + t.bigint "author_account_id" + t.index ["author_account_id"], name: "index_preview_cards_on_author_account_id", where: "(author_account_id IS NOT NULL)" t.index ["url"], name: "index_preview_cards_on_url", unique: true end @@ -1199,6 +1201,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do t.bigint "role_id" t.text "settings" t.string "time_zone" + t.string "otp_secret" t.index ["account_id"], name: "index_users_on_account_id" t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id", where: "(created_by_application_id IS NOT NULL)" @@ -1334,7 +1337,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do add_foreign_key "mutes", "accounts", name: "fk_b8d8daf315", on_delete: :cascade add_foreign_key "notification_permissions", "accounts" add_foreign_key "notification_permissions", "accounts", column: "from_account_id" - add_foreign_key "notification_policies", "accounts" + add_foreign_key "notification_policies", "accounts", on_delete: :cascade add_foreign_key "notification_requests", "accounts", column: "from_account_id", on_delete: :cascade add_foreign_key "notification_requests", "accounts", on_delete: :cascade add_foreign_key "notification_requests", "statuses", column: "last_status_id", on_delete: :nullify @@ -1351,6 +1354,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do add_foreign_key "polls", "accounts", on_delete: :cascade add_foreign_key "polls", "statuses", on_delete: :cascade add_foreign_key "preview_card_trends", "preview_cards", on_delete: :cascade + add_foreign_key "preview_cards", "accounts", column: "author_account_id", on_delete: :nullify add_foreign_key "report_notes", "accounts", on_delete: :cascade add_foreign_key "report_notes", "reports", on_delete: :cascade add_foreign_key "reports", "accounts", column: "action_taken_by_account_id", name: "fk_bca45b75fd", on_delete: :nullify diff --git a/docker-compose.yml b/docker-compose.yml index 154754d45..e7ae95ea7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3' services: db: restart: always @@ -56,7 +55,7 @@ services: web: build: . - image: ghcr.io/mastodon/mastodon:v4.2.7 + image: ghcr.io/mastodon/mastodon:v4.2.9 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -77,7 +76,7 @@ services: streaming: build: . - image: ghcr.io/mastodon/mastodon:v4.2.7 + image: ghcr.io/mastodon/mastodon:v4.2.9 restart: always env_file: .env.production command: node ./streaming @@ -95,7 +94,7 @@ services: sidekiq: build: . - image: ghcr.io/mastodon/mastodon:v4.2.7 + image: ghcr.io/mastodon/mastodon:v4.2.9 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/action_dispatch/remote_ip_extensions.rb b/lib/action_dispatch/remote_ip_extensions.rb new file mode 100644 index 000000000..e5c48bf3c --- /dev/null +++ b/lib/action_dispatch/remote_ip_extensions.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +# Mastodon is not made to be directly accessed without a reverse proxy. +# This monkey-patch prevents remote IP address spoofing when being accessed +# directly. +# +# See PR: https://github.com/rails/rails/pull/51610 + +# In addition to the PR above, it also raises an error if a request with +# `X-Forwarded-For` or `Client-Ip` comes directly from a client without +# going through a trusted proxy. + +# rubocop:disable all -- This is a mostly vendored file + +module ActionDispatch + class RemoteIp + module GetIpExtensions + def calculate_ip + # Set by the Rack web server, this is a single value. + remote_addr = ips_from(@req.remote_addr).last + + # Could be a CSV list and/or repeated headers that were concatenated. + client_ips = ips_from(@req.client_ip).reverse! + forwarded_ips = ips_from(@req.x_forwarded_for).reverse! + + # `Client-Ip` and `X-Forwarded-For` should not, generally, both be set. If they + # are both set, it means that either: + # + # 1) This request passed through two proxies with incompatible IP header + # conventions. + # + # 2) The client passed one of `Client-Ip` or `X-Forwarded-For` + # (whichever the proxy servers weren't using) themselves. + # + # Either way, there is no way for us to determine which header is the right one + # after the fact. Since we have no idea, if we are concerned about IP spoofing + # we need to give up and explode. (If you're not concerned about IP spoofing you + # can turn the `ip_spoofing_check` option off.) + should_check_ip = @check_ip && client_ips.last && forwarded_ips.last + if should_check_ip && !forwarded_ips.include?(client_ips.last) + # We don't know which came from the proxy, and which from the user + raise IpSpoofAttackError, "IP spoofing attack?! " \ + "HTTP_CLIENT_IP=#{@req.client_ip.inspect} " \ + "HTTP_X_FORWARDED_FOR=#{@req.x_forwarded_for.inspect}" + end + + # NOTE: Mastodon addition to make sure we don't get requests from a non-trusted client + if @check_ip && (forwarded_ips.last || client_ips.last) && !@proxies.any? { |proxy| proxy === remote_addr } + raise IpSpoofAttackError, "IP spoofing attack?! client #{remote_addr} is not a trusted proxy " \ + "HTTP_CLIENT_IP=#{@req.client_ip.inspect} " \ + "HTTP_X_FORWARDED_FOR=#{@req.x_forwarded_for.inspect}" + end + + # We assume these things about the IP headers: + # + # - X-Forwarded-For will be a list of IPs, one per proxy, or blank + # - Client-Ip is propagated from the outermost proxy, or is blank + # - REMOTE_ADDR will be the IP that made the request to Rack + ips = forwarded_ips + client_ips + ips.compact! + + # If every single IP option is in the trusted list, return the IP that's + # furthest away + filter_proxies([remote_addr] + ips).first || ips.last || remote_addr + end + end + end +end + +ActionDispatch::RemoteIp::GetIp.prepend(ActionDispatch::RemoteIp::GetIpExtensions) + +# rubocop:enable all diff --git a/lib/devise/strategies/two_factor_ldap_authenticatable.rb b/lib/devise/strategies/two_factor_ldap_authenticatable.rb index 065aa2de8..c8258deb1 100644 --- a/lib/devise/strategies/two_factor_ldap_authenticatable.rb +++ b/lib/devise/strategies/two_factor_ldap_authenticatable.rb @@ -16,7 +16,7 @@ module Devise if resource && !resource.otp_required_for_login? success!(resource) else - fail(:invalid) + fail(:invalid) # rubocop:disable Style/SignalException -- method is from Warden::Strategies::Base end end diff --git a/lib/devise/strategies/two_factor_pam_authenticatable.rb b/lib/devise/strategies/two_factor_pam_authenticatable.rb index 5ce723b33..a9db1b6a2 100644 --- a/lib/devise/strategies/two_factor_pam_authenticatable.rb +++ b/lib/devise/strategies/two_factor_pam_authenticatable.rb @@ -15,7 +15,7 @@ module Devise if resource && !resource.otp_required_for_login? success!(resource) else - fail(:invalid) + fail(:invalid) # rubocop:disable Style/SignalException -- method is from Warden::Strategies::Base end end diff --git a/lib/elasticsearch/client_extensions.rb b/lib/elasticsearch/client_extensions.rb new file mode 100644 index 000000000..700bfa4a1 --- /dev/null +++ b/lib/elasticsearch/client_extensions.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Elasticsearch + module ClientExtensions + def verify_elasticsearch + @verified = true + end + end +end + +Elasticsearch::Client.prepend(Elasticsearch::ClientExtensions) diff --git a/lib/mastodon/cli/media.rb b/lib/mastodon/cli/media.rb index e26b4f24a..509d11a81 100644 --- a/lib/mastodon/cli/media.rb +++ b/lib/mastodon/cli/media.rb @@ -128,7 +128,7 @@ module Mastodon::CLI model_name = path_segments.first.classify attachment_name = path_segments[1].singularize - record_id = path_segments[2..-2].join.to_i + record_id = path_segments[2...-2].join.to_i file_name = path_segments.last record = record_map.dig(model_name, record_id) attachment = record&.public_send(attachment_name) @@ -172,7 +172,7 @@ module Mastodon::CLI end model_name = path_segments.first.classify - record_id = path_segments[2..-2].join.to_i + record_id = path_segments[2...-2].join.to_i attachment_name = path_segments[1].singularize file_name = path_segments.last @@ -297,7 +297,7 @@ module Mastodon::CLI fail_with_message 'Not a media URL' unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size) model_name = path_segments.first.classify - record_id = path_segments[2..-2].join.to_i + record_id = path_segments[2...-2].join.to_i fail_with_message "Cannot find corresponding model: #{model_name}" unless PRELOAD_MODEL_WHITELIST.include?(model_name) @@ -353,7 +353,7 @@ module Mastodon::CLI next unless VALID_PATH_SEGMENTS_SIZE.include?(segments.size) model_name = segments.first.classify - record_id = segments[2..-2].join.to_i + record_id = segments[2...-2].join.to_i next unless PRELOAD_MODEL_WHITELIST.include?(model_name) diff --git a/lib/mastodon/cli/preview_cards.rb b/lib/mastodon/cli/preview_cards.rb index 9b20a0cbb..c0e207ad5 100644 --- a/lib/mastodon/cli/preview_cards.rb +++ b/lib/mastodon/cli/preview_cards.rb @@ -29,7 +29,7 @@ module Mastodon::CLI link = options[:link] ? 'link-type ' : '' scope = PreviewCard.cached scope = scope.where(type: :link) if options[:link] - scope = scope.where('updated_at < ?', time_ago) + scope = scope.where(updated_at: ...time_ago) processed, aggregate = parallelize_with_progress(scope) do |preview_card| next if preview_card.image.blank? diff --git a/lib/mastodon/cli/statuses.rb b/lib/mastodon/cli/statuses.rb index 57b03c941..f441dbcd8 100644 --- a/lib/mastodon/cli/statuses.rb +++ b/lib/mastodon/cli/statuses.rb @@ -191,24 +191,24 @@ module Mastodon::CLI def vacuum_and_analyze_statuses if options[:compress_database] - say('Run VACUUM FULL ANALYZE to statuses...') + say('Running "VACUUM FULL ANALYZE statuses"...') ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE statuses') - say('Run REINDEX to statuses...') + say('Running "REINDEX TABLE statuses"...') ActiveRecord::Base.connection.execute('REINDEX TABLE statuses') else - say('Run ANALYZE to statuses...') + say('Running "ANALYZE statuses"...') ActiveRecord::Base.connection.execute('ANALYZE statuses') end end def vacuum_and_analyze_conversations if options[:compress_database] - say('Run VACUUM FULL ANALYZE to conversations...') + say('Running "VACUUM FULL ANALYZE conversations"...') ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE conversations') - say('Run REINDEX to conversations...') + say('Running "REINDEX TABLE conversations"...') ActiveRecord::Base.connection.execute('REINDEX TABLE conversations') else - say('Run ANALYZE to conversations...') + say('Running "ANALYZE conversations"...') ActiveRecord::Base.connection.execute('ANALYZE conversations') end end diff --git a/lib/mastodon/sidekiq_middleware.rb b/lib/mastodon/sidekiq_middleware.rb index 3a747afb6..c5f4d8da3 100644 --- a/lib/mastodon/sidekiq_middleware.rb +++ b/lib/mastodon/sidekiq_middleware.rb @@ -8,6 +8,7 @@ class Mastodon::SidekiqMiddleware rescue Mastodon::HostValidationError # Do not retry rescue => e + clean_up_elasticsearch_connections! limit_backtrace_and_raise(e) ensure clean_up_sockets! @@ -25,6 +26,32 @@ class Mastodon::SidekiqMiddleware clean_up_statsd_socket! end + # This is a hack to immediately free up unused Elasticsearch connections. + # + # Indeed, Chewy creates one `Elasticsearch::Client` instance per thread, + # and each such client manages its long-lasting connection to + # Elasticsearch. + # + # As far as I know, neither `chewy`, `elasticsearch-transport` or even + # `faraday` provide a reliable way to immediately close a connection, and + # rely on the underlying object to be garbage-collected instead. + # + # Furthermore, `sidekiq` creates a new thread each time a job throws an + # exception, meaning that each failure will create a new connection, and + # the old one will only be closed on full garbage collection. + def clean_up_elasticsearch_connections! + return unless Chewy.enabled? && Chewy.current[:chewy_client].present? + + Chewy.client.transport.transport.connections.each do |connection| + # NOTE: This bit of code is tailored for the HTTPClient Faraday adapter + connection.connection.app.instance_variable_get(:@client)&.reset_all + end + + Chewy.current.delete(:chewy_client) + rescue + nil + end + def clean_up_redis_socket! RedisConfiguration.pool.checkin if Thread.current[:redis] Thread.current[:redis] = nil diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 2beceab1b..15a8f38f2 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'alpha.3' + 'alpha.4' end def prerelease diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index 4208c2ae4..d8bc927bc 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -1,6 +1,22 @@ # frozen_string_literal: true +# We are providing our own task with our own format +Rake::Task['db:encryption:init'].clear + namespace :db do + namespace :encryption do + desc 'Generate a set of keys for configuring Active Record encryption in a given environment' + task :init do # rubocop:disable Rails/RakeEnvironment + puts <<~MSG + Add these secret environment variables to your Mastodon environment (e.g. .env.production):#{' '} + + ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=#{SecureRandom.alphanumeric(32)} + ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=#{SecureRandom.alphanumeric(32)} + ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=#{SecureRandom.alphanumeric(32)} + MSG + end + end + namespace :migrate do desc 'Setup the db or migrate depending on state of db' task setup: :environment do diff --git a/lib/tasks/spec.rake b/lib/tasks/spec.rake deleted file mode 100644 index d505a4719..000000000 --- a/lib/tasks/spec.rake +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -if Rake::Task.task_defined?('spec:system') - namespace :spec do - task :enable_system_specs do # rubocop:disable Rails/RakeEnvironment - ENV['LOCAL_DOMAIN'] = 'localhost:3000' - ENV['LOCAL_HTTPS'] = 'false' - ENV['RUN_SYSTEM_SPECS'] = 'true' - end - end - - Rake::Task['spec:system'].enhance ['spec:enable_system_specs'] -end diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 0caebf92a..c8e0312bb 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -127,6 +127,14 @@ namespace :tests do exit(1) end + # This is checking the attribute rather than the method, to avoid the legacy fallback + # and ensure the data has been migrated + unless Account.find_local('qcuser').user[:otp_secret] == 'anotpsecretthatshouldbeencrypted' + puts "DEBUG: #{Account.find_local('qcuser').user.inspect}" + puts 'OTP secret for user not preserved as expected' + exit(1) + end + puts 'No errors found. Database state is consistent with a successful migration process.' end @@ -213,9 +221,15 @@ namespace :tests do (4, 10, 'kmruser@localhost', now(), now(), false, 'ku', '{en,kmr,ku,ckb}'); INSERT INTO "users" - (id, account_id, email, created_at, updated_at, locale) + (id, account_id, email, created_at, updated_at, locale, + encrypted_otp_secret, encrypted_otp_secret_iv, encrypted_otp_secret_salt, + otp_required_for_login) VALUES - (5, 11, 'qcuser@localhost', now(), now(), 'fr-QC'); + (5, 11, 'qcuser@localhost', now(), now(), 'fr-QC', + E'Fttsy7QAa0edaDfdfSz094rRLAxc8cJweDQ4BsWH/zozcdVA8o9GLqcKhn2b\nGi/V\n', + 'rys3THICkr60BoWC', + '_LMkAGvdg7a+sDIKjI3mR2Q==', + true); INSERT INTO "settings" (id, thing_type, thing_id, var, value, created_at, updated_at) diff --git a/package.json b/package.json index 0b5c3484d..f84d45c32 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.1.1", + "packageManager": "yarn@4.2.2", "engines": { "node": ">=18" }, @@ -17,7 +17,7 @@ "fix": "yarn fix:js && yarn fix:css", "format": "prettier --write --log-level warn .", "format:check": "prettier --check --ignore-unknown .", - "i18n:extract": "formatjs extract 'app/javascript/**/*.{js,jsx,ts,tsx}' '--ignore=**/*.d.ts' --out-file app/javascript/mastodon/locales/en.json --format config/formatjs-formatter.js", + "i18n:extract": "formatjs extract 'app/javascript/**/*.{js,jsx,ts,tsx}' --ignore '**/*.d.ts' --out-file app/javascript/mastodon/locales/en.json --format config/formatjs-formatter.js", "jest": "cross-env NODE_ENV=test jest", "lint:js": "eslint . --ext=.js,.jsx,.ts,.tsx --cache --report-unused-disable-directives", "lint:css": "stylelint \"**/*.{css,scss}\"", @@ -45,7 +45,7 @@ "@formatjs/intl-pluralrules": "^5.2.2", "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^2.1.1", - "@rails/ujs": "7.1.3-2", + "@rails/ujs": "7.1.3", "@reduxjs/toolkit": "^2.0.1", "@svgr/webpack": "^5.5.0", "arrow-key-navigation": "^1.2.0", @@ -167,6 +167,7 @@ "@types/redux-immutable": "^4.0.3", "@types/requestidlecallback": "^0.3.5", "@types/webpack": "^4.41.33", + "@types/webpack-env": "^1.18.4", "@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/parser": "^7.0.0", "babel-jest": "^29.5.0", @@ -177,7 +178,7 @@ "eslint-plugin-import": "~2.29.0", "eslint-plugin-jsdoc": "^48.0.0", "eslint-plugin-jsx-a11y": "~6.8.0", - "eslint-plugin-promise": "~6.1.1", + "eslint-plugin-promise": "~6.2.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "husky": "^9.0.11", diff --git a/spec/config/initializers/rack/attack_spec.rb b/spec/config/initializers/rack/attack_spec.rb index e25b7dfde..19de48089 100644 --- a/spec/config/initializers/rack/attack_spec.rb +++ b/spec/config/initializers/rack/attack_spec.rb @@ -56,7 +56,7 @@ describe Rack::Attack, type: :request do end def throttle_count - described_class.cache.read("#{counter_prefix}:#{throttle}:#{remote_ip}") || 0 + described_class.cache.read("#{counter_prefix}:#{throttle}:#{discriminator}") || 0 end def counter_prefix @@ -64,11 +64,12 @@ describe Rack::Attack, type: :request do end def increment_counter - described_class.cache.count("#{throttle}:#{remote_ip}", period) + described_class.cache.count("#{throttle}:#{discriminator}", period) end end let(:remote_ip) { '1.2.3.5' } + let(:discriminator) { remote_ip } describe 'throttle excessive sign-up requests by IP address' do context 'when accessed through the website' do @@ -131,4 +132,48 @@ describe Rack::Attack, type: :request do it_behaves_like 'throttled endpoint' end end + + describe 'throttle excessive oauth application registration requests by IP address' do + let(:throttle) { 'throttle_oauth_application_registrations/ip' } + let(:limit) { 5 } + let(:period) { 10.minutes } + let(:path) { '/api/v1/apps' } + let(:params) do + { + client_name: 'Throttle Test', + redirect_uris: 'urn:ietf:wg:oauth:2.0:oob', + scopes: 'read', + } + end + + let(:request) { -> { post path, params: params, headers: { 'REMOTE_ADDR' => remote_ip } } } + + it_behaves_like 'throttled endpoint' + end + + describe 'throttle excessive password change requests by account' do + let(:user) { Fabricate(:user, email: 'user@host.example') } + let(:throttle) { 'throttle_password_change/account' } + let(:limit) { 10 } + let(:period) { 10.minutes } + let(:request) { -> { put path, headers: { 'REMOTE_ADDR' => remote_ip } } } + let(:path) { '/auth' } + let(:discriminator) { user.id } + + before do + sign_in user, scope: :user + + # Unfortunately, devise's `sign_in` helper causes the `session` to be + # loaded in the next request regardless of whether it's actually accessed + # by the client code. + # + # So, we make an extra query to clear issue a session cookie instead. + # + # A less resource-intensive way to deal with that would be to generate the + # session cookie manually, but this seems pretty involved. + get '/' + end + + it_behaves_like 'throttled endpoint' + end end diff --git a/spec/controllers/admin/account_moderation_notes_controller_spec.rb b/spec/controllers/admin/account_moderation_notes_controller_spec.rb index 8d24a7af3..5ea546f41 100644 --- a/spec/controllers/admin/account_moderation_notes_controller_spec.rb +++ b/spec/controllers/admin/account_moderation_notes_controller_spec.rb @@ -24,10 +24,19 @@ RSpec.describe Admin::AccountModerationNotesController do end end - context 'when parameters are invalid' do + context 'when the content is too short' do let(:params) { { account_moderation_note: { target_account_id: target_account.id, content: '' } } } - it 'falls to create a note' do + it 'fails to create a note' do + expect { subject }.to_not change(AccountModerationNote, :count) + expect(response).to render_template 'admin/accounts/show' + end + end + + context 'when the content is too long' do + let(:params) { { account_moderation_note: { target_account_id: target_account.id, content: 'test' * AccountModerationNote::CONTENT_SIZE_LIMIT } } } + + it 'fails to create a note' do expect { subject }.to_not change(AccountModerationNote, :count) expect(response).to render_template 'admin/accounts/show' end diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index b90bb414b..f241d261b 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -53,11 +53,32 @@ RSpec.describe Admin::AccountsController do describe 'GET #show' do let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } - let(:account) { Fabricate(:account) } - it 'returns http success' do - get :show, params: { id: account.id } - expect(response).to have_http_status(200) + context 'with a remote account' do + let(:account) { Fabricate(:account, domain: 'example.com') } + + it 'returns http success' do + get :show, params: { id: account.id } + expect(response).to have_http_status(200) + end + end + + context 'with a local account' do + let(:account) { Fabricate(:account, domain: nil) } + + it 'returns http success' do + get :show, params: { id: account.id } + expect(response).to have_http_status(200) + end + end + + context 'with a local deleted account' do + let(:account) { Fabricate(:account, domain: nil, user: nil) } + + it 'returns http success' do + get :show, params: { id: account.id } + expect(response).to have_http_status(200) + end end end diff --git a/spec/controllers/admin/report_notes_controller_spec.rb b/spec/controllers/admin/report_notes_controller_spec.rb index 4ddf4a4e2..8d5b5c7ae 100644 --- a/spec/controllers/admin/report_notes_controller_spec.rb +++ b/spec/controllers/admin/report_notes_controller_spec.rb @@ -22,7 +22,7 @@ describe Admin::ReportNotesController do let(:account_id) { nil } context 'when create_and_resolve flag is on' do - let(:params) { { report_note: { content: 'test content', report_id: report.id }, create_and_resolve: nil } } + let(:params) { { report_note: { report_id: report.id, content: 'test content' }, create_and_resolve: nil } } it 'creates a report note and resolves report' do expect { subject }.to change(ReportNote, :count).by(1) @@ -32,7 +32,7 @@ describe Admin::ReportNotesController do end context 'when create_and_resolve flag is false' do - let(:params) { { report_note: { content: 'test content', report_id: report.id } } } + let(:params) { { report_note: { report_id: report.id, content: 'test content' } } } it 'creates a report note and does not resolve report' do expect { subject }.to change(ReportNote, :count).by(1) @@ -47,7 +47,7 @@ describe Admin::ReportNotesController do let(:account_id) { user.account.id } context 'when create_and_unresolve flag is on' do - let(:params) { { report_note: { content: 'test content', report_id: report.id }, create_and_unresolve: nil } } + let(:params) { { report_note: { report_id: report.id, content: 'test content' }, create_and_unresolve: nil } } it 'creates a report note and unresolves report' do expect { subject }.to change(ReportNote, :count).by(1) @@ -57,7 +57,7 @@ describe Admin::ReportNotesController do end context 'when create_and_unresolve flag is false' do - let(:params) { { report_note: { content: 'test content', report_id: report.id } } } + let(:params) { { report_note: { report_id: report.id, content: 'test content' } } } it 'creates a report note and does not unresolve report' do expect { subject }.to change(ReportNote, :count).by(1) @@ -68,12 +68,24 @@ describe Admin::ReportNotesController do end end - context 'when parameter is invalid' do - let(:params) { { report_note: { content: '', report_id: report.id } } } + context 'when content is too short' do + let(:params) { { report_note: { report_id: report.id, content: '' } } } let(:action_taken) { nil } let(:account_id) { nil } it 'renders admin/reports/show' do + expect { subject }.to_not change(ReportNote, :count) + expect(subject).to render_template 'admin/reports/show' + end + end + + context 'when content is too long' do + let(:params) { { report_note: { report_id: report.id, content: 'test' * ReportNote::CONTENT_SIZE_LIMIT } } } + let(:action_taken) { nil } + let(:account_id) { nil } + + it 'renders admin/reports/show' do + expect { subject }.to_not change(ReportNote, :count) expect(subject).to render_template 'admin/reports/show' end end diff --git a/spec/controllers/concerns/cache_concern_spec.rb b/spec/controllers/concerns/preloading_concern_spec.rb similarity index 79% rename from spec/controllers/concerns/cache_concern_spec.rb rename to spec/controllers/concerns/preloading_concern_spec.rb index fffd2b266..795afbc45 100644 --- a/spec/controllers/concerns/cache_concern_spec.rb +++ b/spec/controllers/concerns/preloading_concern_spec.rb @@ -2,20 +2,20 @@ require 'rails_helper' -RSpec.describe CacheConcern do +RSpec.describe PreloadingConcern do controller(ApplicationController) do - include CacheConcern + include PreloadingConcern def empty_array - render plain: cache_collection([], Status).size + render plain: preload_collection([], Status).size end def empty_relation - render plain: cache_collection(Status.none, Status).size + render plain: preload_collection(Status.none, Status).size end def account_statuses_favourites - render plain: cache_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count) + render plain: preload_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count) end end @@ -27,7 +27,7 @@ RSpec.describe CacheConcern do end end - describe '#cache_collection' do + describe '#preload_collection' do context 'when given an empty array' do it 'returns an empty array' do get :empty_array diff --git a/spec/fabricators/canonical_email_block_fabricator.rb b/spec/fabricators/canonical_email_block_fabricator.rb index 2f979df79..1ef53ff4a 100644 --- a/spec/fabricators/canonical_email_block_fabricator.rb +++ b/spec/fabricators/canonical_email_block_fabricator.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true Fabricator(:canonical_email_block) do - email { |attrs| attrs[:reference_account] ? attrs[:reference_account].user_email : sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } } + email { sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } } reference_account { Fabricate.build(:account) } end diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 9330eb0da..56974513b 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -285,4 +285,33 @@ describe ApplicationHelper do end end end + + describe 'favicon' do + context 'when an icon exists' do + let!(:favicon) { Fabricate(:site_upload, var: 'favicon') } + let!(:app_icon) { Fabricate(:site_upload, var: 'app_icon') } + + it 'returns the URL of the icon' do + expect(helper.favicon_path).to eq(favicon.file.url('48')) + expect(helper.app_icon_path).to eq(app_icon.file.url('48')) + end + + it 'returns the URL of the icon with size parameter' do + expect(helper.favicon_path(16)).to eq(favicon.file.url('16')) + expect(helper.app_icon_path(16)).to eq(app_icon.file.url('16')) + end + end + + context 'when an icon does not exist' do + it 'returns nil' do + expect(helper.favicon_path).to be_nil + expect(helper.app_icon_path).to be_nil + end + + it 'returns nil with size parameter' do + expect(helper.favicon_path(16)).to be_nil + expect(helper.app_icon_path(16)).to be_nil + end + end + end end diff --git a/spec/helpers/self_destruct_helper_spec.rb b/spec/helpers/self_destruct_helper_spec.rb new file mode 100644 index 000000000..09d7347ee --- /dev/null +++ b/spec/helpers/self_destruct_helper_spec.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe SelfDestructHelper do + describe 'self_destruct?' do + context 'when SELF_DESTRUCT is unset' do + it 'returns false' do + expect(helper.self_destruct?).to be false + end + end + + context 'when SELF_DESTRUCT is set to an invalid value' do + around do |example| + ClimateControl.modify SELF_DESTRUCT: 'true' do + example.run + end + end + + it 'returns false' do + expect(helper.self_destruct?).to be false + end + end + + context 'when SELF_DESTRUCT is set to value signed for the wrong purpose' do + around do |example| + ClimateControl.modify( + SELF_DESTRUCT: Rails.application.message_verifier('foo').generate('example.com'), + LOCAL_DOMAIN: 'example.com' + ) do + example.run + end + end + + it 'returns false' do + expect(helper.self_destruct?).to be false + end + end + + context 'when SELF_DESTRUCT is set to value signed for the wrong domain' do + around do |example| + ClimateControl.modify( + SELF_DESTRUCT: Rails.application.message_verifier('self-destruct').generate('foo.com'), + LOCAL_DOMAIN: 'example.com' + ) do + example.run + end + end + + it 'returns false' do + expect(helper.self_destruct?).to be false + end + end + + context 'when SELF_DESTRUCT is set to a correctly-signed value' do + around do |example| + ClimateControl.modify( + SELF_DESTRUCT: Rails.application.message_verifier('self-destruct').generate('example.com'), + LOCAL_DOMAIN: 'example.com' + ) do + example.run + end + end + + it 'returns true' do + expect(helper.self_destruct?).to be true + end + end + end +end diff --git a/spec/lib/activitypub/parser/status_parser_spec.rb b/spec/lib/activitypub/parser/status_parser_spec.rb new file mode 100644 index 000000000..5d9f008db --- /dev/null +++ b/spec/lib/activitypub/parser/status_parser_spec.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::Parser::StatusParser do + subject { described_class.new(json) } + + let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers', domain: 'example.com', uri: 'https://example.com/actor') } + let(:follower) { Fabricate(:account, username: 'bob') } + + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: [ActivityPub::TagManager.instance.uri_for(sender), '#foo'].join, + type: 'Create', + actor: ActivityPub::TagManager.instance.uri_for(sender), + object: object_json, + }.with_indifferent_access + end + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), 'post1'].join('/'), + type: 'Note', + to: [ + 'https://www.w3.org/ns/activitystreams#Public', + ActivityPub::TagManager.instance.uri_for(follower), + ], + content: '@bob lorem ipsum', + contentMap: { + EN: '@bob lorem ipsum', + }, + published: 1.hour.ago.utc.iso8601, + updated: 1.hour.ago.utc.iso8601, + tag: { + type: 'Mention', + href: ActivityPub::TagManager.instance.uri_for(follower), + }, + } + end + + it 'correctly parses status' do + expect(subject).to have_attributes( + text: '@bob lorem ipsum', + uri: [ActivityPub::TagManager.instance.uri_for(sender), 'post1'].join('/'), + reply: false, + language: :en + ) + end +end diff --git a/spec/lib/admin/system_check/elasticsearch_check_spec.rb b/spec/lib/admin/system_check/elasticsearch_check_spec.rb index a885640ce..8f210579d 100644 --- a/spec/lib/admin/system_check/elasticsearch_check_spec.rb +++ b/spec/lib/admin/system_check/elasticsearch_check_spec.rb @@ -127,7 +127,7 @@ describe Admin::SystemCheck::ElasticsearchCheck do end def stub_elasticsearch_error - client = instance_double(Elasticsearch::Transport::Client) + client = instance_double(Elasticsearch::Client) allow(client).to receive(:info).and_raise(Elasticsearch::Transport::Transport::Error) allow(Chewy).to receive(:client).and_return(client) end diff --git a/spec/lib/vacuum/applications_vacuum_spec.rb b/spec/lib/vacuum/applications_vacuum_spec.rb deleted file mode 100644 index df5c86060..000000000 --- a/spec/lib/vacuum/applications_vacuum_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Vacuum::ApplicationsVacuum do - subject { described_class.new } - - describe '#perform' do - let!(:app_with_token) { Fabricate(:application, created_at: 1.month.ago) } - let!(:app_with_grant) { Fabricate(:application, created_at: 1.month.ago) } - let!(:app_with_signup) { Fabricate(:application, created_at: 1.month.ago) } - let!(:app_with_owner) { Fabricate(:application, created_at: 1.month.ago, owner: Fabricate(:user)) } - let!(:unused_app) { Fabricate(:application, created_at: 1.month.ago) } - let!(:recent_app) { Fabricate(:application, created_at: 1.hour.ago) } - - before do - Fabricate(:access_token, application: app_with_token) - Fabricate(:access_grant, application: app_with_grant) - Fabricate(:user, created_by_application: app_with_signup) - - subject.perform - end - - it 'does not delete applications with valid access tokens' do - expect { app_with_token.reload }.to_not raise_error - end - - it 'does not delete applications with valid access grants' do - expect { app_with_grant.reload }.to_not raise_error - end - - it 'does not delete applications that were used to create users' do - expect { app_with_signup.reload }.to_not raise_error - end - - it 'does not delete owned applications' do - expect { app_with_owner.reload }.to_not raise_error - end - - it 'does not delete applications registered less than a day ago' do - expect { recent_app.reload }.to_not raise_error - end - - it 'deletes unused applications' do - expect { unused_app.reload }.to raise_error ActiveRecord::RecordNotFound - end - end -end diff --git a/spec/mailers/admin_mailer_spec.rb b/spec/mailers/admin_mailer_spec.rb index 88ad7aa02..cd1ab3311 100644 --- a/spec/mailers/admin_mailer_spec.rb +++ b/spec/mailers/admin_mailer_spec.rb @@ -125,4 +125,22 @@ RSpec.describe AdminMailer do .and(have_header('X-Priority', '1')) end end + + describe '.auto_close_registrations' do + let(:recipient) { Fabricate(:account, username: 'Bob') } + let(:mail) { described_class.with(recipient: recipient).auto_close_registrations } + + before do + recipient.user.update(locale: :en) + end + + it 'renders the email' do + expect(mail) + .to be_present + .and(deliver_to(recipient.user_email)) + .and(deliver_from('notifications@localhost')) + .and(have_subject('Registrations for cb6e6126.ngrok.io have been automatically switched to requiring approval')) + .and(have_body_text('have been automatically switched')) + end + end end diff --git a/spec/mailers/previews/admin_mailer_preview.rb b/spec/mailers/previews/admin_mailer_preview.rb index 942d40d56..b8fb387ac 100644 --- a/spec/mailers/previews/admin_mailer_preview.rb +++ b/spec/mailers/previews/admin_mailer_preview.rb @@ -32,4 +32,9 @@ class AdminMailerPreview < ActionMailer::Preview def new_critical_software_updates AdminMailer.with(recipient: Account.first).new_critical_software_updates end + + # Preview this email at http://localhost:3000/rails/mailers/admin_mailer/auto_close_registrations + def auto_close_registrations + AdminMailer.with(recipient: Account.first).auto_close_registrations + end end diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 284576ced..271cf8690 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -205,6 +205,48 @@ RSpec.describe Status do end end + describe '#reported?' do + context 'when the status is not reported' do + it 'returns false' do + expect(subject.reported?).to be false + end + end + + context 'when the status is part of an open report' do + before do + Fabricate(:report, target_account: subject.account, status_ids: [subject.id]) + end + + it 'returns true' do + expect(subject.reported?).to be true + end + end + + context 'when the status is part of a closed report with an account warning mentioning the account' do + before do + report = Fabricate(:report, target_account: subject.account, status_ids: [subject.id]) + report.resolve!(Fabricate(:account)) + Fabricate(:account_warning, target_account: subject.account, status_ids: [subject.id], report: report) + end + + it 'returns true' do + expect(subject.reported?).to be true + end + end + + context 'when the status is part of a closed report with an account warning not mentioning the account' do + before do + report = Fabricate(:report, target_account: subject.account, status_ids: [subject.id]) + report.resolve!(Fabricate(:account)) + Fabricate(:account_warning, target_account: subject.account, report: report) + end + + it 'returns false' do + expect(subject.reported?).to be false + end + end + end + describe '.mutes_map' do subject { described_class.mutes_map([status.conversation.id], account) } diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index 4c2bdd52f..7799afe44 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -36,6 +36,10 @@ RSpec.describe Tag do expect(subject.match('https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111895#c4')).to be_nil end + it 'does not match URLs with hashtag-like anchors after a non-ascii character' do + expect(subject.match('https://example.org/testé#foo')).to be_nil + end + it 'does not match URLs with hashtag-like anchors after an empty query parameter' do expect(subject.match('https://en.wikipedia.org/wiki/Ghostbusters_(song)?foo=#Lawsuit')).to be_nil end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 714d595dc..fa0a0503a 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -9,14 +9,25 @@ RSpec.describe User do it_behaves_like 'two_factor_backupable' - describe 'otp_secret' do + describe 'legacy_otp_secret' do it 'is encrypted with OTP_SECRET environment variable' do user = Fabricate(:user, encrypted_otp_secret: "Fttsy7QAa0edaDfdfSz094rRLAxc8cJweDQ4BsWH/zozcdVA8o9GLqcKhn2b\nGi/V\n", encrypted_otp_secret_iv: 'rys3THICkr60BoWC', encrypted_otp_secret_salt: '_LMkAGvdg7a+sDIKjI3mR2Q==') - expect(user.otp_secret).to eq 'anotpsecretthatshouldbeencrypted' + expect(user.send(:legacy_otp_secret)).to eq 'anotpsecretthatshouldbeencrypted' + end + end + + describe 'otp_secret' do + it 'encrypts the saved value' do + user = Fabricate(:user, otp_secret: '123123123') + + user.reload + + expect(user.otp_secret).to eq '123123123' + expect(user.attributes_before_type_cast[:otp_secret]).to_not eq '123123123' end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 89fc25bcb..38aa71108 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -2,14 +2,35 @@ ENV['RAILS_ENV'] ||= 'test' -# This needs to be defined before Rails is initialized -RUN_SYSTEM_SPECS = ENV.fetch('RUN_SYSTEM_SPECS', false) +unless ENV['DISABLE_SIMPLECOV'] == 'true' + require 'simplecov' -if RUN_SYSTEM_SPECS - STREAMING_PORT = ENV.fetch('TEST_STREAMING_PORT', '4020') - ENV['STREAMING_API_BASE_URL'] = "http://localhost:#{STREAMING_PORT}" + SimpleCov.start 'rails' do + if ENV['CI'] + require 'simplecov-lcov' + formatter SimpleCov::Formatter::LcovFormatter + formatter.config.report_with_single_file = true + else + formatter SimpleCov::Formatter::HTMLFormatter + end + + enable_coverage :branch + + add_filter 'lib/linter' + + add_group 'Libraries', 'lib' + add_group 'Policies', 'app/policies' + add_group 'Presenters', 'app/presenters' + add_group 'Serializers', 'app/serializers' + add_group 'Services', 'app/services' + add_group 'Validators', 'app/validators' + end end +# This needs to be defined before Rails is initialized +STREAMING_PORT = ENV.fetch('TEST_STREAMING_PORT', '4020') +ENV['STREAMING_API_BASE_URL'] = "http://localhost:#{STREAMING_PORT}" + require File.expand_path('../config/environment', __dir__) abort('The Rails environment is running in production mode!') if Rails.env.production? @@ -26,10 +47,12 @@ require 'test_prof/recipes/rspec/before_all' Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f } ActiveRecord::Migration.maintain_test_schema! -WebMock.disable_net_connect!(allow: Chewy.settings[:host], allow_localhost: RUN_SYSTEM_SPECS) +WebMock.disable_net_connect!( + allow_localhost: true, + allow: Chewy.settings[:host] +) Sidekiq.logger = nil -# System tests config DatabaseCleaner.strategy = [:deletion] Devise::Test::ControllerHelpers.module_eval do @@ -49,16 +72,14 @@ Devise::Test::ControllerHelpers.module_eval do end RSpec.configure do |config| - # This is set before running spec:system, see lib/tasks/tests.rake - config.filter_run_excluding type: lambda { |type| - case type - when :system - !RUN_SYSTEM_SPECS - end - } + # By default, skip specs that need full JS browser + config.filter_run_excluding :js - # By default, skip the elastic search integration specs - config.filter_run_excluding search: true + # By default, skip specs that need elastic search server + config.filter_run_excluding :search + + # By default, skip specs that need the streaming server + config.filter_run_excluding :streaming config.fixture_paths = [ Rails.root.join('spec', 'fixtures'), @@ -81,7 +102,7 @@ RSpec.configure do |config| config.include Devise::Test::ControllerHelpers, type: :controller config.include Devise::Test::ControllerHelpers, type: :helper config.include Devise::Test::ControllerHelpers, type: :view - config.include Devise::Test::IntegrationHelpers, type: :feature + config.include Devise::Test::IntegrationHelpers, type: :system config.include Devise::Test::IntegrationHelpers, type: :request config.include ActionMailer::TestHelper config.include Paperclip::Shoulda::Matchers @@ -111,10 +132,6 @@ RSpec.configure do |config| stub_reset_connection_pools end - config.before :each, type: :feature do - Capybara.current_driver = :rack_test - end - config.before do |example| allow(Resolv::DNS).to receive(:open).and_raise('Real DNS queries are disabled, stub Resolv::DNS as needed') unless example.metadata[:type] == :system end diff --git a/spec/requests/api/v1/accounts_spec.rb b/spec/requests/api/v1/accounts_spec.rb index e543c4136..3d9eb6501 100644 --- a/spec/requests/api/v1/accounts_spec.rb +++ b/spec/requests/api/v1/accounts_spec.rb @@ -8,6 +8,22 @@ describe '/api/v1/accounts' do let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + describe 'GET /api/v1/accounts?id[]=:id' do + let(:account) { Fabricate(:account) } + let(:other_account) { Fabricate(:account) } + let(:scopes) { 'read:accounts' } + + it 'returns expected response' do + get '/api/v1/accounts', headers: headers, params: { id: [account.id, other_account.id, 123_123] } + + expect(response).to have_http_status(200) + expect(body_as_json).to contain_exactly( + hash_including(id: account.id.to_s), + hash_including(id: other_account.id.to_s) + ) + end + end + describe 'GET /api/v1/accounts/:id' do context 'when logged out' do let(:account) { Fabricate(:account) } diff --git a/spec/requests/api/v1/admin/domain_blocks_spec.rb b/spec/requests/api/v1/admin/domain_blocks_spec.rb index 47aaf44d8..415281a93 100644 --- a/spec/requests/api/v1/admin/domain_blocks_spec.rb +++ b/spec/requests/api/v1/admin/domain_blocks_spec.rb @@ -130,7 +130,7 @@ RSpec.describe 'Domain Blocks' do it_behaves_like 'forbidden for wrong role', '' it_behaves_like 'forbidden for wrong role', 'Moderator' - it 'returns expected domain name and severity', :aggregate_failures do + it 'creates a domain block with the expected domain name and severity', :aggregate_failures do subject body = body_as_json @@ -146,7 +146,44 @@ RSpec.describe 'Domain Blocks' do expect(DomainBlock.find_by(domain: 'foo.bar.com')).to be_present end - context 'when a stricter domain block already exists' do + context 'when a looser domain block already exists on a higher level domain' do + let(:params) { { domain: 'foo.bar.com', severity: :suspend } } + + before do + Fabricate(:domain_block, domain: 'bar.com', severity: :silence) + end + + it 'creates a domain block with the expected domain name and severity', :aggregate_failures do + subject + + body = body_as_json + + expect(response).to have_http_status(200) + expect(body).to match a_hash_including( + { + domain: 'foo.bar.com', + severity: 'suspend', + } + ) + + expect(DomainBlock.find_by(domain: 'foo.bar.com')).to be_present + end + end + + context 'when a domain block already exists on the same domain' do + before do + Fabricate(:domain_block, domain: 'foo.bar.com', severity: :silence) + end + + it 'returns existing domain block in error', :aggregate_failures do + subject + + expect(response).to have_http_status(422) + expect(body_as_json[:existing_domain_block][:domain]).to eq('foo.bar.com') + end + end + + context 'when a stricter domain block already exists on a higher level domain' do before do Fabricate(:domain_block, domain: 'bar.com', severity: :suspend) end diff --git a/spec/requests/api/v1/apps/credentials_spec.rb b/spec/requests/api/v1/apps/credentials_spec.rb index e1455fe79..6e6970ce5 100644 --- a/spec/requests/api/v1/apps/credentials_spec.rb +++ b/spec/requests/api/v1/apps/credentials_spec.rb @@ -20,14 +20,26 @@ describe 'Credentials' do expect(body_as_json).to match( a_hash_including( + id: token.application.id.to_s, name: token.application.name, website: token.application.website, - vapid_key: Rails.configuration.x.vapid_public_key, scopes: token.application.scopes.map(&:to_s), - client_id: token.application.uid + redirect_uris: token.application.redirect_uris, + # Deprecated properties as of 4.3: + redirect_uri: token.application.redirect_uri.split.first, + vapid_key: Rails.configuration.x.vapid_public_key ) ) end + + it 'does not expose the client_id or client_secret' do + subject + + expect(response).to have_http_status(200) + + expect(body_as_json[:client_id]).to_not be_present + expect(body_as_json[:client_secret]).to_not be_present + end end context 'with a non-read scoped oauth token' do @@ -46,11 +58,14 @@ describe 'Credentials' do expect(body_as_json).to match( a_hash_including( + id: token.application.id.to_s, name: token.application.name, website: token.application.website, - vapid_key: Rails.configuration.x.vapid_public_key, scopes: token.application.scopes.map(&:to_s), - client_id: token.application.uid + redirect_uris: token.application.redirect_uris, + # Deprecated properties as of 4.3: + redirect_uri: token.application.redirect_uri.split.first, + vapid_key: Rails.configuration.x.vapid_public_key ) ) end diff --git a/spec/requests/api/v1/apps_spec.rb b/spec/requests/api/v1/apps_spec.rb index acabbc93f..1f01bddf3 100644 --- a/spec/requests/api/v1/apps_spec.rb +++ b/spec/requests/api/v1/apps_spec.rb @@ -9,8 +9,9 @@ RSpec.describe 'Apps' do end let(:client_name) { 'Test app' } - let(:scopes) { nil } - let(:redirect_uris) { 'urn:ietf:wg:oauth:2.0:oob' } + let(:scopes) { 'read write' } + let(:redirect_uri) { 'urn:ietf:wg:oauth:2.0:oob' } + let(:redirect_uris) { [redirect_uri] } let(:website) { nil } let(:params) do @@ -26,13 +27,63 @@ RSpec.describe 'Apps' do it 'creates an OAuth app', :aggregate_failures do subject + expect(response).to have_http_status(200) + + app = Doorkeeper::Application.find_by(name: client_name) + + expect(app).to be_present + expect(app.scopes.to_s).to eq scopes + expect(app.redirect_uris).to eq redirect_uris + + expect(body_as_json).to match( + a_hash_including( + id: app.id.to_s, + client_id: app.uid, + client_secret: app.secret, + name: client_name, + website: website, + scopes: ['read', 'write'], + redirect_uris: redirect_uris, + # Deprecated properties as of 4.3: + redirect_uri: redirect_uri, + vapid_key: Rails.configuration.x.vapid_public_key + ) + ) + end + end + + context 'without scopes being supplied' do + let(:scopes) { nil } + + it 'creates an OAuth App with the default scope' do + subject + expect(response).to have_http_status(200) expect(Doorkeeper::Application.find_by(name: client_name)).to be_present body = body_as_json - expect(body[:client_id]).to be_present - expect(body[:client_secret]).to be_present + expect(body[:scopes]).to eq Doorkeeper.config.default_scopes.to_a + end + end + + # FIXME: This is a bug: https://github.com/mastodon/mastodon/issues/30152 + context 'with scopes as an array' do + let(:scopes) { %w(read write follow) } + + it 'creates an OAuth App with the default scope' do + subject + + expect(response).to have_http_status(200) + + app = Doorkeeper::Application.find_by(name: client_name) + + expect(app).to be_present + expect(app.scopes.to_s).to eq 'read' + + body = body_as_json + + expect(body[:scopes]).to eq ['read'] end end @@ -77,8 +128,8 @@ RSpec.describe 'Apps' do end end - context 'with a too-long redirect_uris' do - let(:redirect_uris) { "https://foo.bar/#{'hoge' * 2_000}" } + context 'with a too-long redirect_uri' do + let(:redirect_uris) { "https://app.example/#{'hoge' * 2_000}" } it 'returns http unprocessable entity' do subject @@ -87,8 +138,80 @@ RSpec.describe 'Apps' do end end - context 'without required params' do - let(:client_name) { '' } + # NOTE: This spec currently tests the same as the "with a too-long redirect_uri test case" + context 'with too many redirect_uris' do + let(:redirect_uris) { (0...500).map { |i| "https://app.example/#{i}/callback" } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'with multiple redirect_uris as a string' do + let(:redirect_uris) { "https://redirect1.example/\napp://redirect2.example/" } + + it 'creates an OAuth application with multiple redirect URIs' do + subject + + expect(response).to have_http_status(200) + + app = Doorkeeper::Application.find_by(name: client_name) + + expect(app).to be_present + expect(app.redirect_uri).to eq redirect_uris + expect(app.redirect_uris).to eq redirect_uris.split + + body = body_as_json + + expect(body[:redirect_uri]).to eq redirect_uris + expect(body[:redirect_uris]).to eq redirect_uris.split + end + end + + context 'with multiple redirect_uris as an array' do + let(:redirect_uris) { ['https://redirect1.example/', 'app://redirect2.example/'] } + + it 'creates an OAuth application with multiple redirect URIs' do + subject + + expect(response).to have_http_status(200) + + app = Doorkeeper::Application.find_by(name: client_name) + + expect(app).to be_present + expect(app.redirect_uri).to eq redirect_uris.join "\n" + expect(app.redirect_uris).to eq redirect_uris + + body = body_as_json + + expect(body[:redirect_uri]).to eq redirect_uris.join "\n" + expect(body[:redirect_uris]).to eq redirect_uris + end + end + + context 'with an empty redirect_uris array' do + let(:redirect_uris) { [] } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'with just a newline as the redirect_uris string' do + let(:redirect_uris) { "\n" } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'with an empty redirect_uris string' do let(:redirect_uris) { '' } it 'returns http unprocessable entity' do @@ -97,5 +220,30 @@ RSpec.describe 'Apps' do expect(response).to have_http_status(422) end end + + context 'without a required param' do + let(:client_name) { '' } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'with a website' do + let(:website) { 'https://app.example/' } + + it 'creates an OAuth application with the website specified' do + subject + + expect(response).to have_http_status(200) + + app = Doorkeeper::Application.find_by(name: client_name) + + expect(app).to be_present + expect(app.website).to eq website + end + end end end diff --git a/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb index a3b84afa2..694861fb1 100644 --- a/spec/requests/api/v1/statuses_spec.rb +++ b/spec/requests/api/v1/statuses_spec.rb @@ -9,6 +9,22 @@ describe '/api/v1/statuses' do let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: client_app, scopes: scopes) } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + describe 'GET /api/v1/statuses?id[]=:id' do + let(:status) { Fabricate(:status) } + let(:other_status) { Fabricate(:status) } + let(:scopes) { 'read:statuses' } + + it 'returns expected response' do + get '/api/v1/statuses', headers: headers, params: { id: [status.id, other_status.id, 123_123] } + + expect(response).to have_http_status(200) + expect(body_as_json).to contain_exactly( + hash_including(id: status.id.to_s), + hash_including(id: other_status.id.to_s) + ) + end + end + describe 'GET /api/v1/statuses/:id' do subject do get "/api/v1/statuses/#{status.id}", headers: headers diff --git a/spec/requests/api/v2/admin/accounts_spec.rb b/spec/requests/api/v2/admin/accounts_spec.rb index fb04850bb..f5db93233 100644 --- a/spec/requests/api/v2/admin/accounts_spec.rb +++ b/spec/requests/api/v2/admin/accounts_spec.rb @@ -8,7 +8,6 @@ RSpec.describe 'API V2 Admin Accounts' do let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - let(:account) { Fabricate(:account) } describe 'GET #index' do let!(:remote_account) { Fabricate(:account, domain: 'example.org') } diff --git a/spec/requests/api/v2/instance_spec.rb b/spec/requests/api/v2/instance_spec.rb index c5c6a26f4..5c464f09a 100644 --- a/spec/requests/api/v2/instance_spec.rb +++ b/spec/requests/api/v2/instance_spec.rb @@ -45,7 +45,7 @@ describe 'Instances' do ), statuses: include( max_characters: StatusLengthValidator::MAX_CHARS, - max_media_attachments: 4 # TODO, move to constant somewhere + max_media_attachments: Status::MEDIA_ATTACHMENTS_LIMIT ), polls: include( max_options: PollValidator::MAX_OPTIONS diff --git a/spec/requests/content_security_policy_spec.rb b/spec/requests/content_security_policy_spec.rb index d4447dca4..ba6fe4774 100644 --- a/spec/requests/content_security_policy_spec.rb +++ b/spec/requests/content_security_policy_spec.rb @@ -23,7 +23,7 @@ describe 'Content-Security-Policy' do <<~CSP.split("\n").map(&:strip) base-uri 'none' child-src 'self' blob: https://cb6e6126.ngrok.io - connect-src 'self' data: blob: https://cb6e6126.ngrok.io ws://cb6e6126.ngrok.io:4000 + connect-src 'self' data: blob: https://cb6e6126.ngrok.io #{Rails.configuration.x.streaming_api_base_url} default-src 'none' font-src 'self' https://cb6e6126.ngrok.io form-action 'self' diff --git a/spec/requests/self_destruct_spec.rb b/spec/requests/self_destruct_spec.rb new file mode 100644 index 000000000..f71a2325e --- /dev/null +++ b/spec/requests/self_destruct_spec.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Self-destruct mode' do + before do + allow(SelfDestructHelper).to receive(:self_destruct?).and_return(true) + end + + shared_examples 'generic logged out request' do |path| + it 'returns 410 gone and mentions self-destruct' do + get path, headers: { 'Accept' => 'text/html' } + + expect(response).to have_http_status(410) + expect(response.body).to include(I18n.t('self_destruct.title')) + end + end + + shared_examples 'accessible logged-in endpoint' do |path| + it 'returns 200 ok' do + get path + + expect(response).to have_http_status(200) + end + end + + shared_examples 'ActivityPub request' do |path| + context 'without signature' do + it 'returns 410 gone' do + get path, headers: { + 'Accept' => 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"', + } + + expect(response).to have_http_status(410) + end + end + + context 'with invalid signature' do + it 'returns 410 gone' do + get path, headers: { + 'Accept' => 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"', + 'Signature' => 'keyId="https://remote.domain/users/bob#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="bar"', + } + + expect(response).to have_http_status(410) + end + end + end + + context 'when requesting various unavailable endpoints' do + it_behaves_like 'generic logged out request', '/' + it_behaves_like 'generic logged out request', '/about' + it_behaves_like 'generic logged out request', '/public' + end + + context 'when requesting a suspended account' do + let(:suspended) { Fabricate(:account, username: 'suspended') } + + before do + suspended.suspend! + end + + it_behaves_like 'generic logged out request', '/@suspended' + it_behaves_like 'ActivityPub request', '/users/suspended' + it_behaves_like 'ActivityPub request', '/users/suspended/followers' + it_behaves_like 'ActivityPub request', '/users/suspended/outbox' + end + + context 'when requesting a non-suspended account' do + before do + Fabricate(:account, username: 'bob') + end + + it_behaves_like 'generic logged out request', '/@bob' + it_behaves_like 'ActivityPub request', '/users/bob' + it_behaves_like 'ActivityPub request', '/users/bob/followers' + it_behaves_like 'ActivityPub request', '/users/bob/outbox' + end + + context 'when accessing still-enabled endpoints when logged in' do + let(:user) { Fabricate(:user) } + + before do + sign_in(user) + end + + it_behaves_like 'accessible logged-in endpoint', '/auth/edit' + it_behaves_like 'accessible logged-in endpoint', '/settings/export' + it_behaves_like 'accessible logged-in endpoint', '/settings/login_activities' + it_behaves_like 'accessible logged-in endpoint', '/settings/exports/follows.csv' + end +end diff --git a/spec/requests/well_known/oauth_metadata_spec.rb b/spec/requests/well_known/oauth_metadata_spec.rb new file mode 100644 index 000000000..deef189ac --- /dev/null +++ b/spec/requests/well_known/oauth_metadata_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'The /.well-known/oauth-authorization-server request' do + let(:protocol) { ENV.fetch('LOCAL_HTTPS', true) ? :https : :http } + + before do + host! ENV.fetch('LOCAL_DOMAIN') + end + + it 'returns http success with valid JSON response' do + get '/.well-known/oauth-authorization-server' + + expect(response) + .to have_http_status(200) + .and have_attributes( + media_type: 'application/json' + ) + + grant_types_supported = Doorkeeper.configuration.grant_flows.dup + grant_types_supported << 'refresh_token' if Doorkeeper.configuration.refresh_token_enabled? + + expect(body_as_json).to include( + issuer: root_url(protocol: protocol), + service_documentation: 'https://docs.joinmastodon.org/', + authorization_endpoint: oauth_authorization_url(protocol: protocol), + token_endpoint: oauth_token_url(protocol: protocol), + revocation_endpoint: oauth_revoke_url(protocol: protocol), + scopes_supported: Doorkeeper.configuration.scopes.map(&:to_s), + response_types_supported: Doorkeeper.configuration.authorization_response_types, + grant_types_supported: grant_types_supported, + # non-standard extension: + app_registration_endpoint: api_v1_apps_url(protocol: protocol) + ) + end +end diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb index 514f634d7..6064d2b05 100644 --- a/spec/services/notify_service_spec.rb +++ b/spec/services/notify_service_spec.rb @@ -309,6 +309,19 @@ RSpec.describe NotifyService do expect(subject.filter?).to be false end end + + context 'when the sender is mentioned in an unrelated message chain' do + before do + original_status = Fabricate(:status, visibility: :direct) + intermediary_status = Fabricate(:status, visibility: :direct, thread: original_status) + notification.target_status.update(thread: intermediary_status) + Fabricate(:mention, status: original_status, account: notification.from_account) + end + + it 'returns true' do + expect(subject.filter?).to be true + end + end end end end diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 18891bf11..11bf4c30e 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -228,14 +228,15 @@ RSpec.describe PostStatusService do expect(media.reload.status).to be_nil end - it 'does not allow attaching more than 4 files' do + it 'does not allow attaching more files than configured limit' do + stub_const('Status::MEDIA_ATTACHMENTS_LIMIT', 1) account = Fabricate(:account) expect do subject.call( account, text: 'test status update', - media_ids: Array.new(5) { Fabricate(:media_attachment, account: account) }.map(&:id) + media_ids: Array.new(2) { Fabricate(:media_attachment, account: account) }.map(&:id) ) end.to raise_error( Mastodon::ValidationError, diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8a01792a1..1f9cc40f1 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,9 +1,5 @@ # frozen_string_literal: true -unless ENV['DISABLE_SIMPLECOV'] == 'true' - require 'simplecov' # Configuration details loaded from .simplecov -end - RSpec.configure do |config| config.example_status_persistence_file_path = 'tmp/rspec/examples.txt' config.expect_with :rspec do |expectations| diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb index d4f27e209..be1378ffa 100644 --- a/spec/support/capybara.rb +++ b/spec/support/capybara.rb @@ -26,6 +26,10 @@ Capybara.javascript_driver = :headless_chrome RSpec.configure do |config| config.before(:each, type: :system) do + driven_by :rack_test + end + + config.before(:each, :js, type: :system) do driven_by Capybara.javascript_driver end end diff --git a/spec/support/javascript_errors.rb b/spec/support/javascript_errors.rb index a36bf6017..28a43b3b8 100644 --- a/spec/support/javascript_errors.rb +++ b/spec/support/javascript_errors.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true RSpec.configure do |config| - config.after(:each, type: :system) do + config.after(:each, :js, type: :system) do errors = page.driver.browser.logs.get(:browser) if errors.present? aggregate_failures 'javascript errrors' do diff --git a/spec/support/streaming_server_manager.rb b/spec/support/streaming_server_manager.rb index b702fc77c..3facf16b8 100644 --- a/spec/support/streaming_server_manager.rb +++ b/spec/support/streaming_server_manager.rb @@ -95,7 +95,7 @@ RSpec.configure do |config| end end - config.around :each, type: :system do |example| + config.around :each, :streaming, type: :system do |example| # Streaming server needs DB access but `use_transactional_tests` rolls back # every transaction. Disable this feature for streaming tests, and use # DatabaseCleaner to clean the database tables between each test. @@ -125,6 +125,6 @@ RSpec.configure do |config| end def streaming_examples_present? - RUN_SYSTEM_SPECS + RSpec.world.filtered_examples.values.flatten.any? { |example| example.metadata[:streaming] == true } end end diff --git a/spec/features/admin/accounts_spec.rb b/spec/system/admin/accounts_spec.rb similarity index 100% rename from spec/features/admin/accounts_spec.rb rename to spec/system/admin/accounts_spec.rb diff --git a/spec/features/admin/custom_emojis_spec.rb b/spec/system/admin/custom_emojis_spec.rb similarity index 100% rename from spec/features/admin/custom_emojis_spec.rb rename to spec/system/admin/custom_emojis_spec.rb diff --git a/spec/features/admin/domain_blocks_spec.rb b/spec/system/admin/domain_blocks_spec.rb similarity index 100% rename from spec/features/admin/domain_blocks_spec.rb rename to spec/system/admin/domain_blocks_spec.rb diff --git a/spec/features/admin/email_domain_blocks_spec.rb b/spec/system/admin/email_domain_blocks_spec.rb similarity index 100% rename from spec/features/admin/email_domain_blocks_spec.rb rename to spec/system/admin/email_domain_blocks_spec.rb diff --git a/spec/features/admin/ip_blocks_spec.rb b/spec/system/admin/ip_blocks_spec.rb similarity index 100% rename from spec/features/admin/ip_blocks_spec.rb rename to spec/system/admin/ip_blocks_spec.rb diff --git a/spec/features/admin/software_updates_spec.rb b/spec/system/admin/software_updates_spec.rb similarity index 100% rename from spec/features/admin/software_updates_spec.rb rename to spec/system/admin/software_updates_spec.rb diff --git a/spec/features/admin/statuses_spec.rb b/spec/system/admin/statuses_spec.rb similarity index 100% rename from spec/features/admin/statuses_spec.rb rename to spec/system/admin/statuses_spec.rb diff --git a/spec/features/admin/trends/links/preview_card_providers_spec.rb b/spec/system/admin/trends/links/preview_card_providers_spec.rb similarity index 100% rename from spec/features/admin/trends/links/preview_card_providers_spec.rb rename to spec/system/admin/trends/links/preview_card_providers_spec.rb diff --git a/spec/features/admin/trends/links_spec.rb b/spec/system/admin/trends/links_spec.rb similarity index 100% rename from spec/features/admin/trends/links_spec.rb rename to spec/system/admin/trends/links_spec.rb diff --git a/spec/features/admin/trends/statuses_spec.rb b/spec/system/admin/trends/statuses_spec.rb similarity index 100% rename from spec/features/admin/trends/statuses_spec.rb rename to spec/system/admin/trends/statuses_spec.rb diff --git a/spec/features/admin/trends/tags_spec.rb b/spec/system/admin/trends/tags_spec.rb similarity index 100% rename from spec/features/admin/trends/tags_spec.rb rename to spec/system/admin/trends/tags_spec.rb diff --git a/spec/features/captcha_spec.rb b/spec/system/captcha_spec.rb similarity index 100% rename from spec/features/captcha_spec.rb rename to spec/system/captcha_spec.rb diff --git a/spec/system/filters_spec.rb b/spec/system/filters_spec.rb new file mode 100644 index 000000000..9d18e9046 --- /dev/null +++ b/spec/system/filters_spec.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Filters' do + let(:user) { Fabricate(:user) } + let(:filter_title) { 'Filter of fun and games' } + + before { sign_in(user) } + + describe 'Creating a filter' do + it 'Populates a new filter from form' do + navigate_to_filters + + click_on I18n.t('filters.new.title') + fill_in_filter_form + expect(page).to have_content(filter_title) + end + end + + describe 'Editing an existing filter' do + let(:new_title) { 'Change title value' } + + before { Fabricate :custom_filter, account: user.account, title: filter_title } + + it 'Updates the saved filter' do + navigate_to_filters + + click_on filter_title + + fill_in filter_title_field, with: new_title + click_on I18n.t('generic.save_changes') + + expect(page).to have_content(new_title) + end + end + + describe 'Destroying an existing filter' do + before { Fabricate :custom_filter, account: user.account, title: filter_title } + + it 'Deletes the filter' do + navigate_to_filters + + expect(page).to have_content filter_title + expect do + click_on I18n.t('filters.index.delete') + end.to change(CustomFilter, :count).by(-1) + + expect(page).to_not have_content(filter_title) + end + end + + def navigate_to_filters + visit settings_path + + click_on I18n.t('filters.index.title') + expect(page).to have_content I18n.t('filters.index.title') + end + + def fill_in_filter_form + fill_in filter_title_field, with: filter_title + check I18n.t('filters.contexts.home') + within('.custom_filter_keywords_keyword') do + fill_in with: 'Keyword' + end + click_on I18n.t('filters.new.save') + end + + def filter_title_field + I18n.t('simple_form.labels.defaults.title') + end +end diff --git a/spec/features/log_in_spec.rb b/spec/system/log_in_spec.rb similarity index 100% rename from spec/features/log_in_spec.rb rename to spec/system/log_in_spec.rb diff --git a/spec/system/new_statuses_spec.rb b/spec/system/new_statuses_spec.rb index 5a3f1b406..725ea8fe5 100644 --- a/spec/system/new_statuses_spec.rb +++ b/spec/system/new_statuses_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe 'NewStatuses', :sidekiq_inline do +describe 'NewStatuses', :js, :sidekiq_inline, :streaming do include ProfileStories subject { page } diff --git a/spec/system/oauth_spec.rb b/spec/system/oauth_spec.rb index 060978217..1c9aca311 100644 --- a/spec/system/oauth_spec.rb +++ b/spec/system/oauth_spec.rb @@ -2,8 +2,8 @@ require 'rails_helper' -describe 'Using OAuth from an external app' do - let(:client_app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: 'http://localhost/health', scopes: 'read') } +describe 'Using OAuth from an external app', :js, :streaming do + let(:client_app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: about_url(host: Rails.application.config.x.local_domain), scopes: 'read') } context 'when the user is already logged in' do let!(:user) { Fabricate(:user) } diff --git a/spec/system/ocr_spec.rb b/spec/system/ocr_spec.rb index 254efa713..4f4941adc 100644 --- a/spec/system/ocr_spec.rb +++ b/spec/system/ocr_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe 'OCR', :paperclip_processing, :sidekiq_inline do +describe 'OCR', :js, :paperclip_processing, :sidekiq_inline, :streaming do include ProfileStories let(:email) { 'test@example.com' } diff --git a/spec/features/profile_spec.rb b/spec/system/profile_spec.rb similarity index 100% rename from spec/features/profile_spec.rb rename to spec/system/profile_spec.rb diff --git a/spec/features/redirections_spec.rb b/spec/system/redirections_spec.rb similarity index 100% rename from spec/features/redirections_spec.rb rename to spec/system/redirections_spec.rb diff --git a/spec/system/report_interface_spec.rb b/spec/system/report_interface_spec.rb index 6eba55255..f82604aae 100644 --- a/spec/system/report_interface_spec.rb +++ b/spec/system/report_interface_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe 'report interface', :paperclip_processing do +describe 'report interface', :js, :paperclip_processing, :streaming do include ProfileStories let(:email) { 'admin@example.com' } diff --git a/spec/features/severed_relationships_spec.rb b/spec/system/severed_relationships_spec.rb similarity index 100% rename from spec/features/severed_relationships_spec.rb rename to spec/system/severed_relationships_spec.rb diff --git a/spec/system/share_entrypoint_spec.rb b/spec/system/share_entrypoint_spec.rb index 126a816bc..5fdbeacef 100644 --- a/spec/system/share_entrypoint_spec.rb +++ b/spec/system/share_entrypoint_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe 'ShareEntrypoint' do +describe 'ShareEntrypoint', :js, :streaming do include ProfileStories subject { page } diff --git a/spec/system/unlogged_spec.rb b/spec/system/unlogged_spec.rb index c3ebf51d7..417ccdaeb 100644 --- a/spec/system/unlogged_spec.rb +++ b/spec/system/unlogged_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe 'UnloggedBrowsing' do +describe 'UnloggedBrowsing', :js, :streaming do subject { page } before do diff --git a/spec/validators/status_length_validator_spec.rb b/spec/validators/status_length_validator_spec.rb index 06625917b..ead69dfe2 100644 --- a/spec/validators/status_length_validator_spec.rb +++ b/spec/validators/status_length_validator_spec.rb @@ -4,6 +4,8 @@ require 'rails_helper' describe StatusLengthValidator do describe '#validate' do + before { stub_const("#{described_class}::MAX_CHARS", 500) } # Example values below are relative to this baseline + it 'does not add errors onto remote statuses' do status = instance_double(Status, local?: false) allow(status).to receive(:errors) @@ -22,27 +24,27 @@ describe StatusLengthValidator do expect(status).to_not have_received(:errors) end - it 'adds an error when content warning is over 500 characters' do - status = instance_double(Status, spoiler_text: 'a' * 520, text: '', errors: activemodel_errors, local?: true, reblog?: false) + it 'adds an error when content warning is over character limit' do + status = status_double(spoiler_text: 'a' * 520) subject.validate(status) expect(status.errors).to have_received(:add) end - it 'adds an error when text is over 500 characters' do - status = instance_double(Status, spoiler_text: '', text: 'a' * 520, errors: activemodel_errors, local?: true, reblog?: false) + it 'adds an error when text is over character limit' do + status = status_double(text: 'a' * 520) subject.validate(status) expect(status.errors).to have_received(:add) end - it 'adds an error when text and content warning are over 500 characters total' do - status = instance_double(Status, spoiler_text: 'a' * 250, text: 'b' * 251, errors: activemodel_errors, local?: true, reblog?: false) + it 'adds an error when text and content warning are over character limit total' do + status = status_double(spoiler_text: 'a' * 250, text: 'b' * 251) subject.validate(status) expect(status.errors).to have_received(:add) end it 'counts URLs as 23 characters flat' do text = ('a' * 476) + " http://#{'b' * 30}.com/example" - status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) + status = status_double(text: text) subject.validate(status) expect(status.errors).to_not have_received(:add) @@ -50,7 +52,7 @@ describe StatusLengthValidator do it 'does not count non-autolinkable URLs as 23 characters flat' do text = ('a' * 476) + "http://#{'b' * 30}.com/example" - status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) + status = status_double(text: text) subject.validate(status) expect(status.errors).to have_received(:add) @@ -58,14 +60,14 @@ describe StatusLengthValidator do it 'does not count overly long URLs as 23 characters flat' do text = "http://example.com/valid?#{'#foo?' * 1000}" - status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) + status = status_double(text: text) subject.validate(status) expect(status.errors).to have_received(:add) end it 'counts only the front part of remote usernames' do text = ('a' * 475) + " @alice@#{'b' * 30}.com" - status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) + status = status_double(text: text) subject.validate(status) expect(status.errors).to_not have_received(:add) @@ -73,7 +75,7 @@ describe StatusLengthValidator do it 'does count both parts of remote usernames for overly long domains' do text = "@alice@#{'b' * 500}.com" - status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) + status = status_double(text: text) subject.validate(status) expect(status.errors).to have_received(:add) @@ -82,6 +84,17 @@ describe StatusLengthValidator do private + def status_double(spoiler_text: '', text: '') + instance_double( + Status, + spoiler_text: spoiler_text, + text: text, + errors: activemodel_errors, + local?: true, + reblog?: false + ) + end + def activemodel_errors instance_double(ActiveModel::Errors, add: nil) end diff --git a/spec/validators/status_pin_validator_spec.rb b/spec/validators/status_pin_validator_spec.rb index d5109f990..e50a952db 100644 --- a/spec/validators/status_pin_validator_spec.rb +++ b/spec/validators/status_pin_validator_spec.rb @@ -45,8 +45,8 @@ RSpec.describe StatusPinValidator do end end - context 'when pin.account.status_pins.count > 4 && pin.account.local?' do - let(:count) { 5 } + context 'when pin account is local and has too many pins' do + let(:count) { described_class::PIN_LIMIT + 1 } let(:local) { true } it 'calls errors.add' do diff --git a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb index 4d9185093..08ebf8278 100644 --- a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb +++ b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb @@ -163,7 +163,7 @@ describe Scheduler::AccountsStatusesCleanupScheduler do def cleanable_statuses_count Status .where(account_id: [account_alice, account_chris, account_erin]) # Accounts with enabled policies - .where('created_at < ?', 2.weeks.ago) # Policy defaults is 2.weeks + .where(created_at: ...2.weeks.ago) # Policy defaults is 2.weeks .count end end diff --git a/spec/workers/scheduler/user_cleanup_scheduler_spec.rb b/spec/workers/scheduler/user_cleanup_scheduler_spec.rb index 8fda246ba..c3940901d 100644 --- a/spec/workers/scheduler/user_cleanup_scheduler_spec.rb +++ b/spec/workers/scheduler/user_cleanup_scheduler_spec.rb @@ -14,7 +14,7 @@ describe Scheduler::UserCleanupScheduler do before do # Need to update the already-existing users because their initialization overrides confirmation_sent_at new_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: Time.now.utc) - old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 1.week.ago) + old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 10.days.ago) confirmed_user.update!(confirmed_at: 1.day.ago) end diff --git a/streaming/package.json b/streaming/package.json index a0e7d96bb..cf1fe4ba6 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/streaming", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.1.1", + "packageManager": "yarn@4.2.2", "engines": { "node": ">=18" }, @@ -25,7 +25,7 @@ "pg": "^8.5.0", "pg-connection-string": "^2.6.0", "pino": "^9.0.0", - "pino-http": "^9.0.0", + "pino-http": "^10.0.0", "prom-client": "^15.0.0", "uuid": "^9.0.0", "ws": "^8.12.1" diff --git a/tsconfig.json b/tsconfig.json index 7010dda1f..cc1f18a99 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,8 @@ "allowJs": true, "noEmit": true, "strict": true, + "noImplicitReturns": true, + "noUncheckedIndexedAccess": true, "esModuleInterop": true, "skipLibCheck": true, "baseUrl": "./", diff --git a/yarn.lock b/yarn.lock index 0b60c39c9..da5bf1dca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,128 +42,128 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": - version: 7.24.2 - resolution: "@babel/code-frame@npm:7.24.2" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/code-frame@npm:7.24.6" dependencies: - "@babel/highlight": "npm:^7.24.2" + "@babel/highlight": "npm:^7.24.6" picocolors: "npm:^1.0.0" - checksum: 10c0/d1d4cba89475ab6aab7a88242e1fd73b15ecb9f30c109b69752956434d10a26a52cbd37727c4eca104b6d45227bd1dfce39a6a6f4a14c9b2f07f871e968cf406 + checksum: 10c0/c93c6d1763530f415218c31d07359364397f19b70026abdff766164c21ed352a931cf07f3102c5fb9e04792de319e332d68bcb1f7debef601a02197f90f9ba24 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/compat-data@npm:7.24.4" - checksum: 10c0/9cd8a9cd28a5ca6db5d0e27417d609f95a8762b655e8c9c97fd2de08997043ae99f0139007083c5e607601c6122e8432c85fe391731b19bf26ad458fa0c60dd3 +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/compat-data@npm:7.24.6" + checksum: 10c0/f50abbd4008eb2a5d12139c578809cebbeaeb8e660fb12d546eb2e7c2108ae1836ab8339184a5f5ce0e95bf81bb91e18edce86b387c59db937b01693ec0bc774 languageName: node linkType: hard -"@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1": - version: 7.24.4 - resolution: "@babel/core@npm:7.24.4" +"@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1, @babel/core@npm:^7.24.4": + version: 7.24.6 + resolution: "@babel/core@npm:7.24.6" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.4" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.24.4" - "@babel/parser": "npm:^7.24.4" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" + "@babel/code-frame": "npm:^7.24.6" + "@babel/generator": "npm:^7.24.6" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helpers": "npm:^7.24.6" + "@babel/parser": "npm:^7.24.6" + "@babel/template": "npm:^7.24.6" + "@babel/traverse": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/fc136966583e64d6f84f4a676368de6ab4583aa87f867186068655b30ef67f21f8e65a88c6d446a7efd219ad7ffb9185c82e8a90183ee033f6f47b5026641e16 + checksum: 10c0/e0762a8daef7f417494d555929418cfacd6848c7fc3310ec00e6dd8cecac20b7f590e760bfc9365d2af07874a3f5599832f9c9ff7f1a9d126a168f77ba67945a languageName: node linkType: hard -"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4, @babel/generator@npm:^7.7.2": - version: 7.24.4 - resolution: "@babel/generator@npm:7.24.4" +"@babel/generator@npm:^7.24.6, @babel/generator@npm:^7.7.2": + version: 7.24.6 + resolution: "@babel/generator@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.24.0" + "@babel/types": "npm:^7.24.6" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10c0/67a1b2f7cc985aaaa11b01e8ddd4fffa4f285837bc7a209738eb8203aa34bdafeb8507ed75fd883ddbabd641a036ca0a8d984e760f28ad4a9d60bff29d0a60bb + checksum: 10c0/8d71a17b386536582354afba53cc784396458a88cc9f05f0c6de0ec99475f6f539943b3566b2e733820c4928236952473831765e483c25d68cc007a6e604d782 languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" +"@babel/helper-annotate-as-pure@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/5a80dc364ddda26b334bbbc0f6426cab647381555ef7d0cd32eb284e35b867c012ce6ce7d52a64672ed71383099c99d32765b3d260626527bb0e3470b0f58e45 + "@babel/types": "npm:^7.24.6" + checksum: 10c0/3fe446e3bd37e5e32152279c84ace4e83815e5b88b9e09a82a83974a0bb22e941d89db26b23aaab4c9eb0f9713772c2f6163feffc1bcb055c4cdb6b67e5dc82f languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.15" - checksum: 10c0/2535e3824ca6337f65786bbac98e562f71699f25532cecd196f027d7698b4967a96953d64e36567956658ad1a05ccbdc62d1ba79ee751c79f4f1d2d3ecc2e01c + "@babel/types": "npm:^7.24.6" + checksum: 10c0/d468ba492163bdcf5b6c53248edcf0aaed6194c0f7bdebef4f29ef626e5b03e9fcc7ed737445eb80a961ec6e687c330e1c5242d8a724efb0af002141f3b3e66c languageName: node linkType: hard -"@babel/helper-builder-react-jsx@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/helper-builder-react-jsx@npm:7.22.10" +"@babel/helper-builder-react-jsx@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-builder-react-jsx@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/types": "npm:^7.22.10" - checksum: 10c0/8e2ad2e17dd779ddccec29f6b1de61df1f199694673bdbbae0474878211139f2e574810726110e4d46c1e9a0221af1f2d38bd0398dd20490eb03a24f790602be + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10c0/93b0500d00f214bc2f7f142ebfa0a634872cadd446bd767f7d58b26ae1b46e1f262b0fe80a9151691463611a3148a69ad28f930295d976bf8ced32c79449a3ce languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-compilation-targets@npm:7.24.6" dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/compat-data": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" browserslist: "npm:^4.22.2" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa + checksum: 10c0/4d41150086959f5f4d72d27bae29204192e943537ecb71df1711d1f5d8791358a44f3a5882ed3c8238ba0c874b0b55213af43767e14771765f13b8d15b262432 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4" +"@babel/helper-create-class-features-plugin@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-member-expression-to-functions": "npm:^7.23.0" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/helper-member-expression-to-functions": "npm:^7.24.6" + "@babel/helper-optimise-call-expression": "npm:^7.24.6" + "@babel/helper-replace-supers": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/6ebb38375dcd44c79f40008c2de4d023376cf436c135439f15c9c54603c2d6a8ada39b2e07be545da684d9e40b602a0cb0d1670f3877d056deb5f0d786c4bf86 + checksum: 10c0/e6734671bc6a5f3cca4ec46e4cc70238e5a2fa063e51225c2be572f157119002af419b33ea0f846dbb1307370fe9f3aa92d199449abbea5e88e0262513c8a821 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" regexpu-core: "npm:^5.3.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/8eba4c1b7b94a83e7a82df5c3e504584ff0ba6ab8710a67ecc2c434a7fb841a29c2f5c94d2de51f25446119a1df538fa90b37bd570db22ddd5e7147fe98277c6 + checksum: 10c0/c6e1b07c94b3b93a3f534039da88bc67ec3156080f1959aa07d5d534e9a640de3533e7ded0516dfcbccde955e91687044e6a950852b1d3f402ac5d5001be56cf languageName: node linkType: hard @@ -182,243 +182,242 @@ __metadata: languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 +"@babel/helper-environment-visitor@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-environment-visitor@npm:7.24.6" + checksum: 10c0/fdcd18ac505ed71f40c05cc992b648a4495b0aa5310a774492a0f74d8dcf3579691102f516561a651d3de6c3a44fe64bfb3049d11c14c5857634ef1823ea409a languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" +"@babel/helper-function-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-function-name@npm:7.24.6" dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.23.0" - checksum: 10c0/d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 + "@babel/template": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10c0/5ba2f8db789b3f5a2b2239300a217aa212e303cd7bfad9c8b90563807f49215e8c679e8f8f177b6aaca2038038e29bc702b83839e1f7b4896d79c44a75cac97a languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" +"@babel/helper-hoist-variables@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-hoist-variables@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 + "@babel/types": "npm:^7.24.6" + checksum: 10c0/e10ec6b864aaa419ec4934f5fcb5d0cfcc9d0657584a1b6c3c42ada949d44ca6bffcdab433a90ada4396c747e551cca31ba0e565ea005ab3f50964e3817bf6cf languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" +"@babel/helper-member-expression-to-functions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.23.0" - checksum: 10c0/b810daddf093ffd0802f1429052349ed9ea08ef7d0c56da34ffbcdecbdafac86f95bdea2fe30e0e0e629febc7dd41b56cb5eacc10d1a44336d37b755dac31fa4 + "@babel/types": "npm:^7.24.6" + checksum: 10c0/7595f62978f55921b24de6ed5252fcedbffacfb8271f71e092f38724179ba554cb3a24a4764a1a3890b8a53504c2bee9c99eab81f1f365582739f566c8e28eaa languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.1, @babel/helper-module-imports@npm:^7.24.3": - version: 7.24.3 - resolution: "@babel/helper-module-imports@npm:7.24.3" +"@babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-imports@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.24.0" - checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d + "@babel/types": "npm:^7.24.6" + checksum: 10c0/e0db3fbfcd963d138f0792ff626f940a576fcf212d02b8fe6478dccf3421bd1c2a76f8e69c7450c049985e7b63b30be309a24eeeb6ad7c2137a31b676a095a84 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-module-transforms@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-transforms@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-simple-access": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" + "@babel/helper-validator-identifier": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/211e1399d0c4993671e8e5c2b25383f08bee40004ace5404ed4065f0e9258cc85d99c1b82fd456c030ce5cfd4d8f310355b54ef35de9924eabfc3dff1331d946 + checksum: 10c0/9e2e3d0ddb397b36b9e8c7d94e175a36be8cb888ef370cefef2cdfd53ae1f87d567b268bd90ed9a6c706485a8de3da19cac577657613e9cd17210b91cbdfb00b languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" +"@babel/helper-optimise-call-expression@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-optimise-call-expression@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/31b41a764fc3c585196cf5b776b70cf4705c132e4ce9723f39871f215f2ddbfb2e28a62f9917610f67c8216c1080482b9b05f65dd195dae2a52cef461f2ac7b8 + "@babel/types": "npm:^7.24.6" + checksum: 10c0/7fce2c4ce22c4ba3c2178d1ce85f34fc9bbe286af5ec153b4b6ea9bf2212390359c4a1e8a54551c4daa4688022d619668bdb8c8060cb185c0c9ad02c5247efc9 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.0 - resolution: "@babel/helper-plugin-utils@npm:7.24.0" - checksum: 10c0/90f41bd1b4dfe7226b1d33a4bb745844c5c63e400f9e4e8bf9103a7ceddd7d425d65333b564d9daba3cebd105985764d51b4bd4c95822b97c2e3ac1201a8a5da +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.6, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.24.6 + resolution: "@babel/helper-plugin-utils@npm:7.24.6" + checksum: 10c0/636d3ce8cabc0621c1f78187e1d95f1087209921fa452f76aad06224ef5dffb3d934946f5183109920f32a4b94dd75ac91c63bc52813fee639d10cd54d49ba1f languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" +"@babel/helper-remap-async-to-generator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-remap-async-to-generator@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-wrap-function": "npm:^7.22.20" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-wrap-function": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/aa93aa74250b636d477e8d863fbe59d4071f8c2654841b7ac608909e480c1cf3ff7d7af5a4038568829ad09d810bb681668cbe497d9c89ba5c352793dc9edf1e + checksum: 10c0/b379b844eba352ac9487d31867e7bb2b8a264057f1739d9161b614145ea6e60969a7a82e75e5e83089e50cf1b6559f53aa085a787942bf40706fee15a2faa33c languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helper-replace-supers@npm:7.24.1" +"@babel/helper-replace-supers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-replace-supers@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-member-expression-to-functions": "npm:^7.23.0" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-member-expression-to-functions": "npm:^7.24.6" + "@babel/helper-optimise-call-expression": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/d39a3df7892b7c3c0e307fb229646168a9bd35e26a72080c2530729322600e8cff5f738f44a14860a2358faffa741b6a6a0d6749f113387b03ddbfa0ec10e1a0 + checksum: 10c0/aaf2dfaf25360da1525ecea5979d5afed201b96f0feeed2e15f90883a97776132a720b25039e67fee10a5c537363aea5cc2a46c0f1d13fdb86d0e920244f2da7 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" +"@babel/helper-simple-access@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-simple-access@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 + "@babel/types": "npm:^7.24.6" + checksum: 10c0/b17e404dd6c9787fc7d558aea5222471a77e29596705f0d10b4c2a58b9d71ff7eae915094204848cc1af99b771553caa69337a768b9abdd82b54a0050ba83eb9 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/ab7fa2aa709ab49bb8cd86515a1e715a3108c4bb9a616965ba76b43dc346dee66d1004ccf4d222b596b6224e43e04cbc5c3a34459501b388451f8c589fbc3691 + "@babel/types": "npm:^7.24.6" + checksum: 10c0/6928f698362d6082a67ee2bc73991ef6b0cc6b5f2854177389bc8f3c09296580f0ee20134dd1a29dfcb1906ad9e346fa0f7c6fcd7589ab3ff176d4f09504577f languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" +"@babel/helper-split-export-declaration@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-split-export-declaration@npm:7.24.6" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 + "@babel/types": "npm:^7.24.6" + checksum: 10c0/53a5dd8691fdffc89cc7fcf5aed0ad1d8bc39796a5782a3d170dcbf249eb5c15cc8a290e8d09615711d18798ad04a7d0694ab5195d35fa651abbc1b9c885d6a8 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: 10c0/f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac +"@babel/helper-string-parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-string-parser@npm:7.24.6" + checksum: 10c0/95115bf676e92c4e99166395649108d97447e6cabef1fabaec8cdbc53a43f27b5df2268ff6534439d405bc1bd06685b163eb3b470455bd49f69159dada414145 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 10c0/dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e +"@babel/helper-validator-identifier@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-identifier@npm:7.24.6" + checksum: 10c0/d29d2e3fca66c31867a009014169b93f7bc21c8fc1dd7d0b9d85d7a4000670526ff2222d966febb75a6e12f9859a31d1e75b558984e28ecb69651314dd0a6fd1 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 +"@babel/helper-validator-option@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-option@npm:7.24.6" + checksum: 10c0/787268dff5cf77f3b704454b96ab7b58aa4f43b2808247e51859a103a1c28a9c252100f830433f4b37a73f4a61ba745bbeef4cdccbab48c1e9adf037f4ca3491 languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-wrap-function@npm:7.22.20" +"@babel/helper-wrap-function@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-wrap-function@npm:7.24.6" dependencies: - "@babel/helper-function-name": "npm:^7.22.5" - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.22.19" - checksum: 10c0/97b5f42ff4d305318ff2f99a5f59d3e97feff478333b2d893c4f85456d3c66372070f71d7bf9141f598c8cf2741c49a15918193633c427a88d170d98eb8c46eb + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/template": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10c0/d32844275a544a8e7c71c13e9832d34d80656aafce659dc6c23b02e14d1c1179d8045125ded5096da1a99de83299ffb48211183d0403da2c8584ed55dc0ab646 languageName: node linkType: hard -"@babel/helpers@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/helpers@npm:7.24.4" +"@babel/helpers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helpers@npm:7.24.6" dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/747ef62b7fe87de31a2f3c19ff337a86cbb79be2f6c18af63133b614ab5a8f6da5b06ae4b06fb0e71271cb6a27efec6f8b6c9f44c60b8a18777832dc7929e6c5 + "@babel/template": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10c0/e5b5c0919fd6fa56ae11c15a72962d8de0ac19db524849554af28cf08ac32f9ae5aee49a43146eb150f54418cefb8e890fa2b2f33d029434dc7777dbcdfd5bac languageName: node linkType: hard -"@babel/highlight@npm:^7.24.2": - version: 7.24.2 - resolution: "@babel/highlight@npm:7.24.2" +"@babel/highlight@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/highlight@npm:7.24.6" dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-validator-identifier": "npm:^7.24.6" chalk: "npm:^2.4.2" js-tokens: "npm:^4.0.0" picocolors: "npm:^1.0.0" - checksum: 10c0/98ce00321daedeed33a4ed9362dc089a70375ff1b3b91228b9f05e6591d387a81a8cba68886e207861b8871efa0bc997ceabdd9c90f6cce3ee1b2f7f941b42db + checksum: 10c0/5bbc31695e5d44e97feb267f7aaf4c52908560d184ffeb2e2e57aae058d40125592931883889413e19def3326895ddb41ff45e090fa90b459d8c294b4ffc238c languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/parser@npm:7.24.4" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/parser@npm:7.24.6" bin: parser: ./bin/babel-parser.js - checksum: 10c0/8381e1efead5069cb7ed2abc3a583f4a86289b2f376c75cecc69f59a8eb36df18274b1886cecf2f97a6a0dff5334b27330f58535be9b3e4e26102cc50e12eac8 + checksum: 10c0/cbef70923078a20fe163b03f4a6482be65ed99d409a57f3091a23ce3a575ee75716c30e7ea9f40b692ac5660f34055f4cbeb66a354fad15a6cf1fca35c3496c5 languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/9aed453a1a21e4fd29add0b4a2d82a2c6f43a47c80d28411f8327f2a714064bc93a6f622c701d263970e0d72d7901d28f7f51e91ba91a31306efe8f17c411182 + checksum: 10c0/0dbf12de5a7e5d092271124f0d9bff1ceb94871d5563041940512671cd40ab2a93d613715ee37076cd8263cf49579afb805faa3189996c11639bb10d3e9837f1 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/d4e592e6fc4878654243d2e7b51ea86471b868a8cb09de29e73b65d2b64159990c6c198fd7c9c2af2e38b1cddf70206243792853c47384a84f829dada152f605 + checksum: 10c0/b0a03d4f587e1fa92312c912864a0af3f68bfc87367b7c93770e94f171767d563d7adfca7ad571d20cd755e89e1373e7414973ce30e694e7b6eb8f57d2b1b889 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10c0/351c36e45795a7890d610ab9041a52f4078a59429f6e74c281984aa44149a10d43e82b3a8172c703c0d5679471e165d1c02b6d2e45a677958ee301b89403f202 + checksum: 10c0/fdd40fdf7e87f3dbc5396c9a8f92005798865f6f20d2c24c33246ac43aab8df93742b63dfcfcda67c0a5cf1f7b8a987fdbccaceb9ccbb9a67bef10012b522390 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/d7dd5a59a54635a3152895dcaa68f3370bb09d1f9906c1e72232ff759159e6be48de4a598a993c986997280a2dc29922a48aaa98020f16439f3f57ad72788354 + checksum: 10c0/cc1e8ee138c71e78ec262a5198d2cf75c305f2fb4ea9771ebd4ded47f51bc1bacbf917db3cb28c681e7499a07f9803ab0bbe5ad50b9576cbe03902189e3871ed languageName: node linkType: hard @@ -497,25 +496,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" +"@babel/plugin-syntax-import-assertions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/72f0340d73e037f0702c61670054e0af66ece7282c5c2f4ba8de059390fee502de282defdf15959cd9f71aa18dc5c5e4e7a0fde317799a0600c6c4e0a656d82b + checksum: 10c0/8e81c7cd3d5812a3dda32f06f84492a1b5640f42c594619ed57bf4017529889f87bfb4e8e95c50ba1527d89501dae71a0c73770502676545c2cd9ce58ce3258d languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" +"@babel/plugin-syntax-import-attributes@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/309634e3335777aee902552b2cf244c4a8050213cc878b3fb9d70ad8cbbff325dc46ac5e5791836ff477ea373b27832238205f6ceaff81f7ea7c4c7e8fbb13bb + checksum: 10c0/c4d8554b89c0daa6d3c430582b98c10a3af2de8eab484082e97cb73f2712780ab6dd8d11d783c4b266efef76f4479abf4944ef8f416a4459b05eecaf438f8774 languageName: node linkType: hard @@ -541,14 +540,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:7, @babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.24.1, @babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.24.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" +"@babel/plugin-syntax-jsx@npm:7, @babel/plugin-syntax-jsx@npm:^7.24.6, @babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.24.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6cec76fbfe6ca81c9345c2904d8d9a8a0df222f9269f0962ed6eb2eb8f3f10c2f15e993d1ef09dbaf97726bf1792b5851cf5bd9a769f966a19448df6be95d19a + checksum: 10c0/f00d783a9e2d52f0a8797823a3cbdbe2d0dc09c7235fe8c88e6dce3a02f234f52fb5e976a001cc30b0e2b330590b5680f54436e56d67f9ab05d1e4bdeb3992cd languageName: node linkType: hard @@ -640,14 +639,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.24.1, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.24.1 - resolution: "@babel/plugin-syntax-typescript@npm:7.24.1" +"@babel/plugin-syntax-typescript@npm:^7.24.6, @babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.24.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7a81e277dcfe3138847e8e5944e02a42ff3c2e864aea6f33fd9b70d1556d12b0e70f0d56cc1985d353c91bcbf8fe163e6cc17418da21129b7f7f1d8b9ac00c93 + checksum: 10c0/b1eeabf8bebfa78cea559c0a0d55e480fe2ebd799472d1f6bd5afbd2759d02b362d29ad30009c81d5b112797beb987e58a3000d2331adaa4bf03862e1ed18cef languageName: node linkType: hard @@ -663,456 +662,456 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" +"@babel/plugin-transform-arrow-functions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f44bfacf087dc21b422bab99f4e9344ee7b695b05c947dacae66de05c723ab9d91800be7edc1fa016185e8c819f3aca2b4a5f66d8a4d1e47d9bad80b8fa55b8e + checksum: 10c0/46250eb3f535327825db323740a301b76b882b70979f1fb5f89cbb1a820378ab68ee880b912981dd5276dd116deaaee0f4a2a95f1c9cf537a67749fd4209a2d3 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.24.3": - version: 7.24.3 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" +"@babel/plugin-transform-async-generator-functions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-remap-async-to-generator": "npm:^7.22.20" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-remap-async-to-generator": "npm:^7.24.6" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/55ceed059f819dcccbfe69600bfa1c055ada466bd54eda117cfdd2cf773dd85799e2f6556e4a559b076e93b9704abcca2aef9d72aad7dc8a5d3d17886052f1d3 + checksum: 10c0/8876431855220ccfbf1ae510a4a7c4e0377b21189d3f73ea6dde5ffd31eee57f03ea2b2d1da59b6a36b6e107e41b38d0c1d1bb015e0d1c2c2fb627962260edb7 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1" +"@babel/plugin-transform-async-to-generator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.6" dependencies: - "@babel/helper-module-imports": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-remap-async-to-generator": "npm:^7.22.20" + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-remap-async-to-generator": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3731ba8e83cbea1ab22905031f25b3aeb0b97c6467360a2cc685352f16e7c786417d8883bc747f5a0beff32266bdb12a05b6292e7b8b75967087200a7bc012c4 + checksum: 10c0/52c137668e7a35356c3b1caf25ab3bf90ff61199885bfd9f0232bfe168a53a5cf0ca4c1e283c27e44ad76cc366b73e4ff7042241469d1944c7042fb78c57bfd8 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6fbaa85f5204f34845dfc0bebf62fdd3ac5a286241c85651e59d426001e7a1785ac501f154e093e0b8ee49e1f51e3f8b06575a5ae8d4a9406d43e4816bf18c37 + checksum: 10c0/0c761b5e3a2959b63edf47d67f6752e01f24777ad1accd82457a2dca059877f8a8297fbc7a062db6b48836309932f2ac645c507070ef6ad4e765b3600822c048 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4" +"@babel/plugin-transform-block-scoping@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/62f55fd1b60a115506e9553c3bf925179b1ab8a42dc31471c4e3ada20573a488b5c5e3317145da352493ef07f1d9750ce1f8a49cb3f39489ac1ab42e5ddc883d + checksum: 10c0/95c25e501c4553515f92d4e86032a8859a8855cea8aafb6df30f956979caa70af1e126e6dfaf9e51328d1306232ff1e081bda7d84a9aaf23f418d9da120c7018 languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" +"@babel/plugin-transform-class-properties@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/00dff042ac9df4ae67b5ef98b1137cc72e0a24e6d911dc200540a8cb1f00b4cff367a922aeb22da17da662079f0abcd46ee1c5f4cdf37ceebf6ff1639bb9af27 + checksum: 10c0/ae01e00dd528112d542a77f0f1cf6b43726553d2011bbdec9e4fac441dfa161d44bf14449dc4121b45cc971686a8c652652032594e83c5d6cab8e9fd794eecb2 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.24.4": - version: 7.24.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4" +"@babel/plugin-transform-class-static-block@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.4" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10c0/19dfeaf4a2ac03695034f7211a8b5ad89103b224608ac3e91791055107c5fe4d7ebe5d9fbb31b4a91265694af78762260642eb270f4b239c175984ee4b253f80 + checksum: 10c0/425f237faf62b531d973f23ac3eefe3f29c4f6c988c33c2dd660b6dfb61d4ed1e865a5088574742d87ed02437d26aa6ec6b107468b7df35ca9d3082bad742d8f languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-classes@npm:7.24.1" +"@babel/plugin-transform-classes@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-classes@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-replace-supers": "npm:^7.24.1" - "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-replace-supers": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/586a95826be4d68056fa23d8e6c34353ce2ea59bf3ca8cf62bc784e60964d492d76e1b48760c43fd486ffb65a79d3fed9a4f91289e4f526f88c3b6acc0dfb00e + checksum: 10c0/d29c26feea9ad5a64d790aeab1833b7a50d6af2be24140dad7e06510b754b8fe0ffb292d43d96fedaf7765fcb90c0034ac7c42635f814d9235697431076a1cf0 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" +"@babel/plugin-transform-computed-properties@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/template": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/template": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8292c508b656b7722e2c2ca0f6f31339852e3ed2b9b80f6e068a4010e961b431ca109ecd467fc906283f4b1574c1e7b1cb68d35a4dea12079d386c15ff7e0eac + checksum: 10c0/c464144c2eda8d526d70c8d8e3bf30820f591424991452f816617347ef3ccc5d04133c6e903b90c1d832d95d9c8550e5693ea40ea14856ede54fb8e1cd36c5de languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.1" +"@babel/plugin-transform-destructuring@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a08e706a9274a699abc3093f38c72d4a5354eac11c44572cc9ea049915b6e03255744297069fd94fcce82380725c5d6b1b11b9a84c0081aa3aa6fc2fdab98ef6 + checksum: 10c0/1fcc064e2b0c45a4340418bd70d2cf2b3644d1215eb975ec14f83e4f7615fdc3948e355db5091f81602f6c3d933f9308caa66232091aad4edd6c16b00240fcc7 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1" +"@babel/plugin-transform-dotall-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/758def705ec5a87ef910280dc2df5d2fda59dc5d4771c1725c7aed0988ae5b79e29aeb48109120301a3e1c6c03dfac84700469de06f38ca92c96834e09eadf5d + checksum: 10c0/4a2c98f1c22a18754c6ada1486563865690008df2536066d8a146fa58eed8515b607e162c7efb0b8fa062d755e77afea145495046cffdb4ea56194d38f489254 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1" +"@babel/plugin-transform-duplicate-keys@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/41072f57f83a6c2b15f3ee0b6779cdca105ff3d98061efe92ac02d6c7b90fdb6e7e293b8a4d5b9c690d9ae5d3ae73e6bde4596dc4d8c66526a0e5e1abc73c88c + checksum: 10c0/44ddba252f0b9f1f0b1ff8d903bbcf8871246670fb2883f65d09d371d403ce9c3e2e582b94b36506c1d042110b464eb3492e53cd1e87c1d479b145bcc01c04fd languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" +"@babel/plugin-transform-dynamic-import@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7e2834780e9b5251ef341854043a89c91473b83c335358620ca721554877e64e416aeb3288a35f03e825c4958e07d5d00ead08c4490fadc276a21fe151d812f1 + checksum: 10c0/b4411f21112127a02aef15103765e207e4c03e7321d7f4de3522fc181cb377c5abc8484cf0169e6c30f2e51e6c602c09894fa6b15643d24f66273833ef34e4a6 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1" +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.6" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f0fc4c5a9add25fd6bf23dabe6752e9b7c0a2b2554933dddfd16601245a2ba332b647951079c782bf3b94c6330e3638b9b4e0227f469a7c1c707446ba0eba6c7 + checksum: 10c0/c4f15518a5d1614dfac0dbadfb99b0f36a98c1c1ff1c39794a105c3c87cfce00689e0943fcb13368b43b00b2eebaa01136ea12fb8600a574720853b5a8a11de7 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" +"@babel/plugin-transform-export-namespace-from@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/510bb23b2423d5fbffef69b356e4050929c21a7627e8194b1506dd935c7d9cbbd696c9ae9d7c3bcd7e6e7b69561b0b290c2d72d446327b40fc20ce40bbca6712 + checksum: 10c0/bff16d1800d7e5b38d3a3c8d404cc14442a37383dff7769dcc599a0723b2507647cafe9ba7d9b52d2e2f02a78bb78d149676d8d8ddf7357b160f4096b89ae9c5 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-for-of@npm:7.24.1" +"@babel/plugin-transform-for-of@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-for-of@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e4bc92b1f334246e62d4bde079938df940794db564742034f6597f2e38bd426e11ae8c5670448e15dd6e45c462f2a9ab3fa87259bddf7c08553ffd9457fc2b2c + checksum: 10c0/c8def2a160783c5c4a1c136c721fc88aca9cd3757a60f1c885a804b5320edb5f143d3f989f698bdd9aae359fdabab0830dba3d35138cea42988a77d2c72c8443 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-function-name@npm:7.24.1" +"@babel/plugin-transform-function-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-function-name@npm:7.24.6" dependencies: - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/65c1735ec3b5e43db9b5aebf3c16171c04b3050c92396b9e22dda0d2aaf51f43fdcf147f70a40678fd9a4ee2272a5acec4826e9c21bcf968762f4c184897ad75 + checksum: 10c0/efa6527438ad94df0b7a4c92c33110ec40b086a0aceda567176b150ed291f8eb44b2ce697d8e3e1d4841496c10693add1e88f296418e72a171ead5c76b890a47 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" +"@babel/plugin-transform-json-strings@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/13d9b6a3c31ab4be853b3d49d8d1171f9bd8198562fd75da8f31e7de31398e1cfa6eb1d073bed93c9746e4f9c47a53b20f8f4c255ece3f88c90852ad3181dc2d + checksum: 10c0/46af52dcc16f494c6c11dc22c944f2533623b9d9dfce5097bc0bdb99535ad4c4cfe5bca0d8ce8c39a94202e69d99ee60f546ce0be0ad782b681c7b5b4c9ddd6f languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-literals@npm:7.24.1" +"@babel/plugin-transform-literals@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-literals@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a27cc7d565ee57b5a2bf136fa889c5c2f5988545ae7b3b2c83a7afe5dd37dfac80dca88b1c633c65851ce6af7d2095c04c01228657ce0198f918e64b5ccd01fa + checksum: 10c0/961b64df79a673706d74cf473d1f4646f250b4f8813f9d7ef5d897e30acdacd1ca104584de2e88546289fce055d71bd7559cdb8ad4a2d5e7eea17f3c829faa97 languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/98a2e0843ddfe51443c1bfcf08ba40ad8856fd4f8e397b392a5390a54f257c8c1b9a99d8ffc0fc7e8c55cce45e2cd9c2795a4450303f48f501bcbd662de44554 + checksum: 10c0/0ae7f4098c63f442fd038de6034155bcf20214e7e490e92189decb2980932247b97cb069b11ac8bc471b53f71d6859e607969440d63ff400b8932ee3e05b4958 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" +"@babel/plugin-transform-member-expression-literals@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/2af731d02aa4c757ef80c46df42264128cbe45bfd15e1812d1a595265b690a44ad036041c406a73411733540e1c4256d8174705ae6b8cfaf757fc175613993fd + checksum: 10c0/ec8908a409bd39d20f0428e35425c9e4c540bad252a0e33e08b84e3bea5088c785531197bdcf049afbdba841325962a93030b7be6da3586cb13d0ca0ebab89c9 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1" +"@babel/plugin-transform-modules-amd@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/71fd04e5e7026e6e52701214b1e9f7508ba371b757e5075fbb938a79235ed66a54ce65f89bb92b59159e9f03f01b392e6c4de6d255b948bec975a90cfd6809ef + checksum: 10c0/074d26c79f517b27a07fef00319aff9705df1e6b41a805db855fe719e0f246b9815d6525cf1c5f0890c7f830dd0b9776e9b2493bbc929a3c23c0dee15f10a514 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-simple-access": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-simple-access": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/efb3ea2047604a7eb44a9289311ebb29842fe6510ff8b66a77a60440448c65e1312a60dc48191ed98246bdbd163b5b6f3348a0669bcc0e3809e69c7c776b20fa + checksum: 10c0/4fc790136d066105fa773ffc7e249d88c6f0d0126984ede36fedd51ac2b622b46c08565bcdd1ab62ac10195eeedeaba0d26e7e4c676ed50906cbed16540a4e22 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1" +"@babel/plugin-transform-modules-systemjs@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.6" dependencies: - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-hoist-variables": "npm:^7.24.6" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-validator-identifier": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/38145f8abe8a4ce2b41adabe5d65eb7bd54a139dc58e2885fec975eb5cf247bd938c1dd9f09145c46dbe57d25dd0ef7f00a020e5eb0cbe8195b2065d51e2d93d + checksum: 10c0/500962e3ac1bb1a9890e94f1967ec9e3aa3d41e22d4a9d1c739918707e4a8936710fd8d0ed4f3a8aad87260f7566b54566bead77977eb21e90124835cb6bcdca languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1" +"@babel/plugin-transform-modules-umd@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-module-transforms": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/14c90c58562b54e17fe4a8ded3f627f9a993648f8378ef00cb2f6c34532032b83290d2ad54c7fff4f0c2cd49091bda780f8cc28926ec4b77a6c2141105a2e699 + checksum: 10c0/73c6cecb4f45ca3f665e2c57b6d04d65358518522dfaffb9b6913c026aeb704281d015324d02bf07f2cb026de6bac9308c62e82979364bd39f3687f752652b0d languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/b0b072bef303670b5a98307bc37d1ac326cb7ad40ea162b89a03c2ffc465451be7ef05be95cb81ed28bfeb29670dc98fe911f793a67bceab18b4cb4c81ef48f3 + checksum: 10c0/92547309d81938488753f87b05a679a7557a1cec253756966044367c268b27311e51efad91724aa3e433cf61626e10bf1008e112998350c2013a87824c4cfe0b languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-new-target@npm:7.24.1" +"@babel/plugin-transform-new-target@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-new-target@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c4cabe628163855f175a8799eb73d692b6f1dc347aae5022af0c253f80c92edb962e48ddccc98b691eff3d5d8e53c9a8f10894c33ba4cebc2e2f8f8fe554fb7a + checksum: 10c0/5e9b9edfbe46489f64013d2bbd422f29acdb8057ccc85e7c759f7cf1415fde6a82ac13a13f0f246defaba6e2f7f4d424178ba78fc02237bdbf7df6692fc1dca8 languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.3, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.3, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c8532951506fb031287280cebeef10aa714f8a7cea2b62a13c805f0e0af945ba77a7c87e4bbbe4c37fe973e0e5d5e649cfac7f0374f57efc54cdf9656362a392 + checksum: 10c0/53ab5b16bbcf47e842a48f1f0774d238dae0222c3e1f31653307808048e249ed140cba12dfc280cbc9a577cb3bb5b2f50ca0e3e4ffe5260fcf8c3ca0b83fb21e languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" +"@babel/plugin-transform-numeric-separator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/15e2b83292e586fb4f5b4b4021d4821a806ca6de2b77d5ad6c4e07aa7afa23704e31b4d683dac041afc69ac51b2461b96e8c98e46311cc1faba54c73f235044f + checksum: 10c0/14863e735fc407e065e1574914864a956b8250a84cfb4704592656763c9455d67034c7745e53066725195d9ed042121f424c4aaee00027791640e2639386b701 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.6" dependencies: - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.24.1" + "@babel/plugin-transform-parameters": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e301f1a66b63bafc2bce885305cc88ab30ec875b5e2c7933fb7f9cbf0d954685aa10334ffcecf147ba19d6a1d7ffab37baf4ce871849d395941c56fdb3060f73 + checksum: 10c0/1a192b9756ebfa0bc69ad5e285d7d0284963b4b95738ca7721354297329d5c1ab4eb05ff5b198cbfffa3ec00e97a15a712aa7a5011d9407478796966aab54527 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-object-super@npm:7.24.1" +"@babel/plugin-transform-object-super@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-object-super@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-replace-supers": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-replace-supers": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d30e6b9e59a707efd7ed524fc0a8deeea046011a6990250f2e9280516683138e2d13d9c52daf41d78407bdab0378aef7478326f2a15305b773d851cb6e106157 + checksum: 10c0/2e48b9e0a1f3b04b439ede2d0c83bcc5324a81c8bab73c70f0c466cf48061a4ff469f283e2feb17b4cc2e20372c1362253604477ecd77e622192d5d7906aa062 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/68408b9ef772d9aa5dccf166c86dc4d2505990ce93e03dcfc65c73fb95c2511248e009ba9ccf5b96405fb85de1c16ad8291016b1cc5689ee4becb1e3050e0ae7 + checksum: 10c0/411db3177b1bffd2f9e5b33a6b62e70158380e67d91ff4725755312e8a0a2f2c3fd340c60005295a672115fb593222ab2d7076266aebced6ef087a5505b6f371 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" +"@babel/plugin-transform-optional-chaining@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b4688795229c9e9ce978eccf979fe515eb4e8d864d2dcd696baa937c8db13e3d46cff664a3cd6119dfe60e261f5d359b10c6783effab7cc91d75d03ad7f43d05 + checksum: 10c0/8ee5a500a2309444d4fb27979857598e9c91d804fe23217c51cc208b1bc6b9cd0650b355b1ebd625f180c5f1dc4cb89b5f313c982f7c89d90281a69b24a88ccb languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-parameters@npm:7.24.1" +"@babel/plugin-transform-parameters@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-parameters@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/eee8d2f72d3ee0876dc8d85f949f4adf34685cfe36c814ebc20c96315f3891a53d43c764d636b939e34d55e6a6a4af9aa57ed0d7f9439eb5771a07277c669e55 + checksum: 10c0/d9648924b9c0d35a243c0742c22838932a024205c61f4cc419857e5195edd893a33e6be4f2c8fbd89e925051c7cbe8968029ec2d3e7f2f098bfa682f4e2b9731 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" +"@babel/plugin-transform-private-methods@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d8e18587d2a8b71a795da5e8841b0e64f1525a99ad73ea8b9caa331bc271d69646e2e1e749fd634321f3df9d126070208ddac22a27ccf070566b2efb74fecd99 + checksum: 10c0/55f93959b2e8aeda818db7cdc7dfdcd5076f5bdc8a819566818004a68969fb7297d617f9d108bf76ac232d6056d9f9d20f73ce10380baa43ff1755c5591aa803 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" +"@babel/plugin-transform-private-property-in-object@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/33d2b9737de7667d7a1b704eef99bfecc6736157d9ea28c2e09010d5f25e33ff841c41d89a4430c5d47f4eb3384e24770fa0ec79600e1e38d6d16e2f9333b4b5 + checksum: 10c0/c9eb9597362b598a91536375a49ba80cdf13461e849680e040898b103f7998c4d33a7832da5afba9fa51e3473f79cf8605f9ace07a887e386b7801797021631b languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" +"@babel/plugin-transform-property-literals@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3bf3e01f7bb8215a8b6d0081b6f86fea23e3a4543b619e059a264ede028bc58cdfb0acb2c43271271915a74917effa547bc280ac636a9901fa9f2fb45623f87e + checksum: 10c0/d1195d93406b6c400cdbc9ac57a2b8b58c72cc6480cc03656abfc243be0e2a48133cbb96559c2db95b1c78803daeb538277821540fe19e2a9105905e727ef618 languageName: node linkType: hard @@ -1127,243 +1126,243 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-display-name@npm:7.24.1" +"@babel/plugin-transform-react-display-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/adf1a3cb0df8134533a558a9072a67e34127fd489dfe431c3348a86dd41f3e74861d5d5134bbb68f61a9cdb3f7e79b2acea1346be94ce4d3328a64e5a9e09be1 + checksum: 10c0/e929d054035fa3b7432bd2b3e5cf280ffd8cf60d1ce80c863c5e0b03ad01bf6ae2546575d2da31cca2ab83d9399ac01a351f20e21af5075d9c0d4c893e4a36bd languageName: node linkType: hard "@babel/plugin-transform-react-inline-elements@npm:^7.21.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-inline-elements@npm:7.24.1" + version: 7.24.6 + resolution: "@babel/plugin-transform-react-inline-elements@npm:7.24.6" dependencies: - "@babel/helper-builder-react-jsx": "npm:^7.22.10" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-builder-react-jsx": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/83fc6afaebbe82a5b14936f00b6d1ffce1a3d908ac749d5daa43f724d32c98b50807ffc3ce2492c1aa49870189507b751993a4a079b9c3226c9b8aab783d08b6 + checksum: 10c0/b29f32a0c345db24f32569cf7a5626e37dd31c21bb764148757e91f609d41e2d09031ff1ad86e5672d578cf16f513b197ef3ebc8f0650d8314890a34ca68f02c languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" +"@babel/plugin-transform-react-jsx-development@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.6" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.22.5" + "@babel/plugin-transform-react-jsx": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4d2e9e68383238feb873f6111df972df4a2ebf6256d6f787a8772241867efa975b3980f7d75ab7d750e7eaad4bd454e8cc6e106301fd7572dd389e553f5f69d2 + checksum: 10c0/f899ffa65c7f459a682246a346af0e4132929ffe928cb0d02ae08aac1cf3fb01b2f6e944ef1eaca78f14e94eff935e2bf96aad878030c25ff6de2070a8b72448 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.22.5, @babel/plugin-transform-react-jsx@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" +"@babel/plugin-transform-react-jsx@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-react-jsx@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.23.3" - "@babel/types": "npm:^7.23.4" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-jsx": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8851b3adc515cd91bdb06ff3a23a0f81f0069cfef79dfb3fa744da4b7a82e3555ccb6324c4fa71ecf22508db13b9ff6a0ed96675f95fc87903b9fc6afb699580 + checksum: 10c0/6144f56a76529a82077475583a17be8f0b0b461c83673e650f3894e09dbe2bcdfdbfff089eca2e5e239e119f72cd9562749a9af7eb3f2e3266a730da31cd19f2 languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.1" +"@babel/plugin-transform-react-pure-annotations@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9eb3056fcaadd63d404fd5652b2a3f693bc4758ba753fee5b5c580c7a64346eeeb94e5a4f77a99c76f3cf06d1f1ad6c227647cd0b1219efe3d00cafa5a6e7b2a + checksum: 10c0/7f83c5a3a275dbb9a291dee4642a3a0f2249265346d8d3cc9324fc9ee063c3e35c3853b52752ece603f0ac92b405deb38c4b5307a99a74d3e1c9c32a2cefa465 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-regenerator@npm:7.24.1" +"@babel/plugin-transform-regenerator@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/0a333585d7c0b38d31cc549d0f3cf7c396d1d50b6588a307dc58325505ddd4f5446188bc536c4779431b396251801b3f32d6d8e87db8274bc84e8c41950737f7 + checksum: 10c0/d17eaa97514d583866182420024b8c22da2c6ca822bdbf16fe7564121564c1844935592dc3315c73d1f78f7c908a4338b1d783618811e694c9bb6d5f9233e58d languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1" +"@babel/plugin-transform-reserved-words@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/936d6e73cafb2cbb495f6817c6f8463288dbc9ab3c44684b931ebc1ece24f0d55dfabc1a75ba1de5b48843d0fef448dcfdbecb8485e4014f8f41d0d1440c536f + checksum: 10c0/5d2d4c579bd90c60fc6468a1285b3384e7b650b47d41a937a1590d4aecfc28bd945e82704c6e71cc91aa016b7e78c5594290c1c386edf11ec98e09e36235c5ae languageName: node linkType: hard "@babel/plugin-transform-runtime@npm:^7.22.4": - version: 7.24.3 - resolution: "@babel/plugin-transform-runtime@npm:7.24.3" + version: 7.24.6 + resolution: "@babel/plugin-transform-runtime@npm:7.24.6" dependencies: - "@babel/helper-module-imports": "npm:^7.24.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-module-imports": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" babel-plugin-polyfill-corejs2: "npm:^0.4.10" babel-plugin-polyfill-corejs3: "npm:^0.10.1" babel-plugin-polyfill-regenerator: "npm:^0.6.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/ee01967bf405d84bd95ca4089166a18fb23fe9851a6da53dcf712a7f8ba003319996f21f320d568ec76126e18adfaee978206ccda86eef7652d47cc9a052e75e + checksum: 10c0/89c43c1236506ecbfc547b12936283ca41e611430c2d2e6d12bf1cbdb0d80760cdae481951f486946733e1c9ae064cb05f4bc779c65b3288d40963b0c4a20c5c languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" +"@babel/plugin-transform-shorthand-properties@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8273347621183aada3cf1f3019d8d5f29467ba13a75b72cb405bc7f23b7e05fd85f4edb1e4d9f0103153dddb61826a42dc24d466480d707f8932c1923a4c25fa + checksum: 10c0/4141b5da1d0d20d66ca0affaef8dfc45ed5e954bfa9003eb8aa779842599de443b37c2b265da27693f304c35ab68a682b44098e9eea0d39f8f94072ab616657f languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-spread@npm:7.24.1" +"@babel/plugin-transform-spread@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-spread@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/50a0302e344546d57e5c9f4dea575f88e084352eeac4e9a3e238c41739eef2df1daf4a7ebbb3ccb7acd3447f6a5ce9938405f98bf5f5583deceb8257f5a673c9 + checksum: 10c0/6d12da05311690c4a73d775688ba6931b441e96e512377a166a60184292edeac0b17f5154a49e2f1d262a3f80b96e064bc9c88c63b2a6125f0a2132eff9ed585 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1" +"@babel/plugin-transform-sticky-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/786fe2ae11ef9046b9fa95677935abe495031eebf1274ad03f2054a20adea7b9dbd00336ac0b143f7924bc562e5e09793f6e8613607674b97e067d4838ccc4a0 + checksum: 10c0/2a65f57554f51d3b9cd035513a610f47e46b26dba112b3b9fb42d1c1f2ae153fce8f76294b4721d099817814f57895c656f5b7dccd5df683277da6522c817ee9 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" +"@babel/plugin-transform-template-literals@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f73bcda5488eb81c6e7a876498d9e6b72be32fca5a4d9db9053491a2d1300cd27b889b463fd2558f3cd5826a85ed00f61d81b234aa55cb5a0abf1b6fa1bd5026 + checksum: 10c0/fcde48e9c3ecd7f5f37ceb6908f1edd537d3115fc2f27d187d58fd83b2a13637a1bb3d24589d841529ed081405b951bf1c5d194ea81eff6ad2d88204d153010d languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d392f549bfd13414f59feecdf3fb286f266a3eb9107a9de818e57907bda56eed08d1f6f8e314d09bf99252df026a7fd4d5df839acd45078a777abcebaa9a8593 + checksum: 10c0/a24b3a3c7b87c6496ee13d2438effd4645868f054397357ec3cbe92a2f0df4152ac7fd7228cb956576c1b772c0675b065d6ad5f5053c382e97dd022015e9a028 languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-typescript@npm:7.24.1" +"@babel/plugin-transform-typescript@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-typescript@npm:7.24.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.24.1" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-typescript": "npm:^7.24.1" + "@babel/helper-annotate-as-pure": "npm:^7.24.6" + "@babel/helper-create-class-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/plugin-syntax-typescript": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9abce423ed2d3cb9398b09e3ed9efea661e92bd32e919f5c7942ac4bad4c5fd23a1d575bb7444d8c92261b68fb626552e0d9eea960372b6b6f54c2c9699a2649 + checksum: 10c0/46b054e4d4253187403e392ef30f4dd624d8486a1992703f5ff1b415d4e8d00f474e35fb77bc7a3a16a17330873cadcd5af4a8493c61b16da2dde212b2788ccd languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1" +"@babel/plugin-transform-unicode-escapes@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/67a72a1ed99639de6a93aead35b1993cb3f0eb178a8991fcef48732c38c9f0279c85bbe1e2e2477b85afea873e738ff0955a35057635ce67bc149038e2d8a28e + checksum: 10c0/0e4038c589b7a63a2469466a25b78aad4ecb7267732e3c953c3055f9a77c7bee859a71983a08b025179f1b094964f2ebbfca1b6c33de4ead90a0b5ef06ddb47e languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d9d9752df7d51bf9357c0bf3762fe16b8c841fca9ecf4409a16f15ccc34be06e8e71abfaee1251b7d451227e70e6b873b36f86b090efdb20f6f7de5fdb6c7a05 + checksum: 10c0/bca99e00de91d0460dfcb25f285f3606248acc905193c05587e2862c54ddb790c5d8cb45e80927290390cffbcba7620f8af3e74c5301ff0c1c59ce7d47c5629f languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1" +"@babel/plugin-transform-unicode-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6046ab38e5d14ed97dbb921bd79ac1d7ad9d3286da44a48930e980b16896db2df21e093563ec3c916a630dc346639bf47c5924a33902a06fe3bbb5cdc7ef5f2f + checksum: 10c0/ab6e253cfc38c7e8a2844d7ad46f85fdcbe33610b7f92f71045cf0b040438a08f1f1717ab4b84c480537f54e5478db8b404a4ccc2ff846b4e3ed33d373e3b47a languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/b6c1f6b90afeeddf97e5713f72575787fcb7179be7b4c961869bfbc66915f66540dc49da93e4369da15596bd44b896d1eb8a50f5e1fd907abd7a1a625901006b + checksum: 10c0/a52e84f85519fed330e88f7a17611064d2b5f1d0fe2823f8113ed312828e69787888bd023f404e8d35d0bb96461e42e19cdc4f0a44d35959bc86c219a3062237 languageName: node linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": - version: 7.24.4 - resolution: "@babel/preset-env@npm:7.24.4" + version: 7.24.6 + resolution: "@babel/preset-env@npm:7.24.6" dependencies: - "@babel/compat-data": "npm:^7.24.4" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.4" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1" + "@babel/compat-data": "npm:^7.24.6" + "@babel/helper-compilation-targets": "npm:^7.24.6" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.6" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.6" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.1" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.6" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.6" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -1375,54 +1374,54 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" - "@babel/plugin-transform-async-to-generator": "npm:^7.24.1" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1" - "@babel/plugin-transform-block-scoping": "npm:^7.24.4" - "@babel/plugin-transform-class-properties": "npm:^7.24.1" - "@babel/plugin-transform-class-static-block": "npm:^7.24.4" - "@babel/plugin-transform-classes": "npm:^7.24.1" - "@babel/plugin-transform-computed-properties": "npm:^7.24.1" - "@babel/plugin-transform-destructuring": "npm:^7.24.1" - "@babel/plugin-transform-dotall-regex": "npm:^7.24.1" - "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1" - "@babel/plugin-transform-dynamic-import": "npm:^7.24.1" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1" - "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" - "@babel/plugin-transform-for-of": "npm:^7.24.1" - "@babel/plugin-transform-function-name": "npm:^7.24.1" - "@babel/plugin-transform-json-strings": "npm:^7.24.1" - "@babel/plugin-transform-literals": "npm:^7.24.1" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" - "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1" - "@babel/plugin-transform-modules-amd": "npm:^7.24.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" - "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1" - "@babel/plugin-transform-modules-umd": "npm:^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" - "@babel/plugin-transform-object-super": "npm:^7.24.1" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.1" - "@babel/plugin-transform-parameters": "npm:^7.24.1" - "@babel/plugin-transform-private-methods": "npm:^7.24.1" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1" - "@babel/plugin-transform-property-literals": "npm:^7.24.1" - "@babel/plugin-transform-regenerator": "npm:^7.24.1" - "@babel/plugin-transform-reserved-words": "npm:^7.24.1" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1" - "@babel/plugin-transform-spread": "npm:^7.24.1" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.1" - "@babel/plugin-transform-template-literals": "npm:^7.24.1" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1" - "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1" - "@babel/plugin-transform-unicode-regex": "npm:^7.24.1" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.6" + "@babel/plugin-transform-async-generator-functions": "npm:^7.24.6" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.6" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.6" + "@babel/plugin-transform-block-scoping": "npm:^7.24.6" + "@babel/plugin-transform-class-properties": "npm:^7.24.6" + "@babel/plugin-transform-class-static-block": "npm:^7.24.6" + "@babel/plugin-transform-classes": "npm:^7.24.6" + "@babel/plugin-transform-computed-properties": "npm:^7.24.6" + "@babel/plugin-transform-destructuring": "npm:^7.24.6" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.6" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.6" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.6" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.6" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.6" + "@babel/plugin-transform-for-of": "npm:^7.24.6" + "@babel/plugin-transform-function-name": "npm:^7.24.6" + "@babel/plugin-transform-json-strings": "npm:^7.24.6" + "@babel/plugin-transform-literals": "npm:^7.24.6" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.6" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.6" + "@babel/plugin-transform-modules-amd": "npm:^7.24.6" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.6" + "@babel/plugin-transform-modules-systemjs": "npm:^7.24.6" + "@babel/plugin-transform-modules-umd": "npm:^7.24.6" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.6" + "@babel/plugin-transform-new-target": "npm:^7.24.6" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.6" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.6" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.6" + "@babel/plugin-transform-object-super": "npm:^7.24.6" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.6" + "@babel/plugin-transform-parameters": "npm:^7.24.6" + "@babel/plugin-transform-private-methods": "npm:^7.24.6" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.6" + "@babel/plugin-transform-property-literals": "npm:^7.24.6" + "@babel/plugin-transform-regenerator": "npm:^7.24.6" + "@babel/plugin-transform-reserved-words": "npm:^7.24.6" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.6" + "@babel/plugin-transform-spread": "npm:^7.24.6" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.6" + "@babel/plugin-transform-template-literals": "npm:^7.24.6" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.6" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.6" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.6" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.6" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.6" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2: "npm:^0.4.10" babel-plugin-polyfill-corejs3: "npm:^0.10.4" @@ -1431,7 +1430,7 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/72a79d0cd38cb26f143509dd0c58db34b5b1ae90116863f55a404f0eb06a64a3cdcb1abd0b6435fafe463bbf55b82ffcf56aedee91e8d37797bf53e4ae74c413 + checksum: 10c0/d837d294197803d550e48d9458a356853a54a0528e7cdc51c2b8a5d8dfe41c6fbc597b4fc67464615a7385198a3db2e839da15cca7b9502fedf27170fc6ef673 languageName: node linkType: hard @@ -1449,33 +1448,33 @@ __metadata: linkType: hard "@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.22.3": - version: 7.24.1 - resolution: "@babel/preset-react@npm:7.24.1" + version: 7.24.6 + resolution: "@babel/preset-react@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-transform-react-display-name": "npm:^7.24.1" - "@babel/plugin-transform-react-jsx": "npm:^7.23.4" - "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" + "@babel/plugin-transform-react-display-name": "npm:^7.24.6" + "@babel/plugin-transform-react-jsx": "npm:^7.24.6" + "@babel/plugin-transform-react-jsx-development": "npm:^7.24.6" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a842abc5a024ed68a0ce4c1244607d40165cb6f8cf1817ebda282e470f20302d81c6a61cb41c1a31aa6c4e99ce93df4dd9e998a8ded1417c25d7480f0e14103a + checksum: 10c0/edc470b86dfcfdedf53feca3f2266bd7f836a300806938a422f4120d39bbdea6a780b9b0a9ac0333e0bb1b8e554699a74cafd135b2a75b02b77ef1b21f7c7f62 languageName: node linkType: hard "@babel/preset-typescript@npm:^7.21.5": - version: 7.24.1 - resolution: "@babel/preset-typescript@npm:7.24.1" + version: 7.24.6 + resolution: "@babel/preset-typescript@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-validator-option": "npm:^7.23.5" - "@babel/plugin-syntax-jsx": "npm:^7.24.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" - "@babel/plugin-transform-typescript": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.24.6" + "@babel/helper-validator-option": "npm:^7.24.6" + "@babel/plugin-syntax-jsx": "npm:^7.24.6" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.6" + "@babel/plugin-transform-typescript": "npm:^7.24.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/0033dc6fbc898ed0d8017c83a2dd5e095c82909e2f83e48cf9f305e3e9287148758c179ad90f27912cf98ca68bfec3643c57c70c0ca34d3a6c50dc8243aef406 + checksum: 10c0/bfcef91ed80d67301301e17a799814457b57bfd0d85d9897dce6df6ed0b0af155c0f5b2af7a1a122a3f36faaaa1de87ccf9954ce06d2f440898ffdfaf18aab86 languageName: node linkType: hard @@ -1496,51 +1495,51 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.24.4 - resolution: "@babel/runtime@npm:7.24.4" + version: 7.24.6 + resolution: "@babel/runtime@npm:7.24.6" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/785aff96a3aa8ff97f90958e1e8a7b1d47f793b204b47c6455eaadc3f694f48c97cd5c0a921fe3596d818e71f18106610a164fb0f1c71fd68c622a58269d537c + checksum: 10c0/224ad205de33ea28979baaec89eea4c4d4e9482000dd87d15b97859365511cdd4d06517712504024f5d33a5fb9412f9b91c96f1d923974adf9359e1575cde049 languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0, @babel/template@npm:^7.3.3": - version: 7.24.0 - resolution: "@babel/template@npm:7.24.0" +"@babel/template@npm:^7.24.6, @babel/template@npm:^7.3.3": + version: 7.24.6 + resolution: "@babel/template@npm:7.24.6" dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.24.0" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54 + "@babel/code-frame": "npm:^7.24.6" + "@babel/parser": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" + checksum: 10c0/a4d5805770de908b445f7cdcebfcb6eaa07b1ec9c7b78fd3f375a911b1522c249bddae6b96bc4aac24247cc603e3e6cffcf2fe50b4c929dfeb22de289b517525 languageName: node linkType: hard -"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/traverse@npm:7.24.1" +"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/traverse@npm:7.24.6" dependencies: - "@babel/code-frame": "npm:^7.24.1" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" + "@babel/code-frame": "npm:^7.24.6" + "@babel/generator": "npm:^7.24.6" + "@babel/helper-environment-visitor": "npm:^7.24.6" + "@babel/helper-function-name": "npm:^7.24.6" + "@babel/helper-hoist-variables": "npm:^7.24.6" + "@babel/helper-split-export-declaration": "npm:^7.24.6" + "@babel/parser": "npm:^7.24.6" + "@babel/types": "npm:^7.24.6" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/c087b918f6823776537ba246136c70e7ce0719fc05361ebcbfd16f4e6f2f6f1f8f4f9167f1d9b675f27d12074839605189cc9d689de20b89a85e7c140f23daab + checksum: 10c0/39027d5fc7a241c6b71bb5872c2bdcec53743cd7ef3c151bbe6fd7cf874d15f4bc09e5d7e19e2f534b0eb2c115f5368553885fa4253aa1bc9441c6e5bf9efdaf languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.24.0 - resolution: "@babel/types@npm:7.24.0" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.24.6 + resolution: "@babel/types@npm:7.24.6" dependencies: - "@babel/helper-string-parser": "npm:^7.23.4" - "@babel/helper-validator-identifier": "npm:^7.22.20" + "@babel/helper-string-parser": "npm:^7.24.6" + "@babel/helper-validator-identifier": "npm:^7.24.6" to-fast-properties: "npm:^2.0.0" - checksum: 10c0/777a0bb5dbe038ca4c905fdafb1cdb6bdd10fe9d63ce13eca0bd91909363cbad554a53dc1f902004b78c1dcbc742056f877f2c99eeedff647333b1fadf51235d + checksum: 10c0/1d94d92d97ef49030ad7f9e14cfccfeb70b1706dabcaa69037e659ec9d2c3178fb005d2088cce40d88dfc1306153d9157fe038a79ea2be92e5e6b99a59ef80cc languageName: node linkType: hard @@ -1551,13 +1550,13 @@ __metadata: languageName: node linkType: hard -"@csstools/cascade-layer-name-parser@npm:^1.0.9": - version: 1.0.9 - resolution: "@csstools/cascade-layer-name-parser@npm:1.0.9" +"@csstools/cascade-layer-name-parser@npm:^1.0.11": + version: 1.0.11 + resolution: "@csstools/cascade-layer-name-parser@npm:1.0.11" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.1 - "@csstools/css-tokenizer": ^2.2.4 - checksum: 10c0/f6e28c7cdeca44711288400cf20de9ebc4db71eafa39ca9a6b3e9f5d3295ba636dd986aac9fcb9e6171c84d436712d68ced923504d78d5fda0601c880eb352fe + "@csstools/css-parser-algorithms": ^2.6.3 + "@csstools/css-tokenizer": ^2.3.1 + checksum: 10c0/52ac8369877c8072ff5c111f656bd87e9a2a4b9e44e48fe005c26faeb6cffd83bfe2f463f4f385a2ae5cfe1f82bbf95d26ddaabca18b66c6b657c4fe1520fb43 languageName: node linkType: hard @@ -1568,107 +1567,107 @@ __metadata: languageName: node linkType: hard -"@csstools/css-calc@npm:^1.2.0": - version: 1.2.0 - resolution: "@csstools/css-calc@npm:1.2.0" +"@csstools/css-calc@npm:^1.2.2": + version: 1.2.2 + resolution: "@csstools/css-calc@npm:1.2.2" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.1 - "@csstools/css-tokenizer": ^2.2.4 - checksum: 10c0/ef12dc08ccdb9903e5cb24d81b469080b94c79123415f62f707196a85c53420b7729be608930314c7a9404f50c832fe5256f647c0567d1c825079cb77f6a8719 + "@csstools/css-parser-algorithms": ^2.6.3 + "@csstools/css-tokenizer": ^2.3.1 + checksum: 10c0/6032b482764a11c1b882d7502928950ab11760044fa7a2c23ecee802002902f6ea8fca045ee2919302af5a5c399e7baa9f68dff001ac6246ac7fef48fb3f6df7 languageName: node linkType: hard -"@csstools/css-color-parser@npm:^2.0.0": - version: 2.0.0 - resolution: "@csstools/css-color-parser@npm:2.0.0" +"@csstools/css-color-parser@npm:^2.0.2": + version: 2.0.2 + resolution: "@csstools/css-color-parser@npm:2.0.2" dependencies: "@csstools/color-helpers": "npm:^4.2.0" - "@csstools/css-calc": "npm:^1.2.0" + "@csstools/css-calc": "npm:^1.2.2" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.1 - "@csstools/css-tokenizer": ^2.2.4 - checksum: 10c0/295f844a194dec4f51439e8760dbb4a142901b8b60cd9d676a62c15c0e8408eb7bcdcbb40be52cdd5f67d020e655a1c3267a28923cfc4f6bae2b74aa48fce426 + "@csstools/css-parser-algorithms": ^2.6.3 + "@csstools/css-tokenizer": ^2.3.1 + checksum: 10c0/c5ae4ad78745e425dce56da9f1ab053fb4f7963399735df3303305b32123bed0b2237689c2e7e99da2c62387e3226c12ea85e70e275c4027c7507e4ac929bffa languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.6.1": - version: 2.6.1 - resolution: "@csstools/css-parser-algorithms@npm:2.6.1" +"@csstools/css-parser-algorithms@npm:^2.6.3": + version: 2.6.3 + resolution: "@csstools/css-parser-algorithms@npm:2.6.3" peerDependencies: - "@csstools/css-tokenizer": ^2.2.4 - checksum: 10c0/2c60377c4ffc96bbeb962cab19c09fccbcc834785928747219ed3bd916a34e52977393935d1d36501403f3f95ff59d358dd741d1dddcdaf9564ab36d73926aa6 + "@csstools/css-tokenizer": ^2.3.1 + checksum: 10c0/6648fda75a1c08096320fb5c04fd13656a0168de13584d2795547fecfb26c2c7d8b3b1fb79ba7aa758714851e98bfbec20d89e28697f999f41f91133eafe4207 languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.2.4": - version: 2.2.4 - resolution: "@csstools/css-tokenizer@npm:2.2.4" - checksum: 10c0/23997db5874514f4b951ebd215e1e6cc8baf03adf9a35fc6fd028b84cb52aa2dc053860722108c09859a9b37b455f62b84181fe15539cd37797ea699b9ff85f0 +"@csstools/css-tokenizer@npm:^2.3.1": + version: 2.3.1 + resolution: "@csstools/css-tokenizer@npm:2.3.1" + checksum: 10c0/fed6619fb5108e109d4dd10b0e967035a92793bae8fb84544e1342058b6df4e306d9d075623e2201fe88831b1ada797aea3546a8d12229d2d81cd7a5dfee4444 languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.9": - version: 2.1.9 - resolution: "@csstools/media-query-list-parser@npm:2.1.9" +"@csstools/media-query-list-parser@npm:^2.1.11": + version: 2.1.11 + resolution: "@csstools/media-query-list-parser@npm:2.1.11" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.1 - "@csstools/css-tokenizer": ^2.2.4 - checksum: 10c0/602e9b5631928c078e670018df20b959bfb8e42ea11024d5218f1604e5ef94e070a74934a919ccbff3713e506d99096057947fa0c2e4768939f7b22479553534 + "@csstools/css-parser-algorithms": ^2.6.3 + "@csstools/css-tokenizer": ^2.3.1 + checksum: 10c0/9bcd99f7d28ae3cdaba73fbbfef571b0393dd4e841f522cc796fe5161744f17e327ba1713dad3c481626fade1357c55890e3d365177abed50e857b69130a9be5 languageName: node linkType: hard -"@csstools/postcss-cascade-layers@npm:^4.0.4": - version: 4.0.4 - resolution: "@csstools/postcss-cascade-layers@npm:4.0.4" +"@csstools/postcss-cascade-layers@npm:^4.0.6": + version: 4.0.6 + resolution: "@csstools/postcss-cascade-layers@npm:4.0.6" dependencies: - "@csstools/selector-specificity": "npm:^3.0.3" + "@csstools/selector-specificity": "npm:^3.1.1" postcss-selector-parser: "npm:^6.0.13" peerDependencies: postcss: ^8.4 - checksum: 10c0/87fdd1e3d846e45c2e415f24f66076e04c3c4539e8b802f1114b2a0fef9421d562d9eb61464ba3599d73805555ad8e95c51a8827cb3ddacfda01ec0df4afbfe0 + checksum: 10c0/134019e9b3f71de39034658e2a284f549883745a309f774d8d272871f9e65680e0981c893766537a8a56ed7f41dba2d0f9fc3cb4fa4057c227bc193976a2ec79 languageName: node linkType: hard -"@csstools/postcss-color-function@npm:^3.0.14": - version: 3.0.14 - resolution: "@csstools/postcss-color-function@npm:3.0.14" +"@csstools/postcss-color-function@npm:^3.0.16": + version: 3.0.16 + resolution: "@csstools/postcss-color-function@npm:3.0.16" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/81592b0eb3ad7022313ecafd028908b167de42acc6765f708c9b10631f86123c2b803aca27378f021c2b3dab8cc47770c0364fe5a3c1e18ec006deaf72e17c38 + checksum: 10c0/41756a4601a3f1086290dab6ca92b54e201bd94637b54b439c66a04fd628a14e2a0bd1452ad294d2981e2f4bb306758fa5f44639b1c4332320435050749aa487 languageName: node linkType: hard -"@csstools/postcss-color-mix-function@npm:^2.0.14": - version: 2.0.14 - resolution: "@csstools/postcss-color-mix-function@npm:2.0.14" +"@csstools/postcss-color-mix-function@npm:^2.0.16": + version: 2.0.16 + resolution: "@csstools/postcss-color-mix-function@npm:2.0.16" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/1dd3c63bbbbb9d3094699f169bbb9d26e86a49accb5f9abaa2441b54cb8a6f4cd332409666684a275eca867e3ef0ea3f6eafdf9fb87f2cbfa17c6296fb1ed4d7 + checksum: 10c0/70cd5b291dd615e20e4475517bf0027c90c433241397a66866f89acedb12cb91f45552a162bdd1000636ec56f7d6a099b65e44fe100fd03228fc65f17cfae285 languageName: node linkType: hard -"@csstools/postcss-exponential-functions@npm:^1.0.5": - version: 1.0.5 - resolution: "@csstools/postcss-exponential-functions@npm:1.0.5" +"@csstools/postcss-exponential-functions@npm:^1.0.7": + version: 1.0.7 + resolution: "@csstools/postcss-exponential-functions@npm:1.0.7" dependencies: - "@csstools/css-calc": "npm:^1.2.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-calc": "npm:^1.2.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/45e18ca9025597da29cbef214cef39fcabef1e169bbb1f5c015de5f677e2927a1c3b8ae18558d815701e8d3e64db1043412a222af35036c92c25011a0e1e027d + checksum: 10c0/2079c81c3437686ef432d88502fa3a13bf8a27b7af105b4c6c2eb8e779f14adc8967a5a3ed03271ab919eeaf999fc4489fe4b37d32a8f61ab3212439517bddcc languageName: node linkType: hard @@ -1684,46 +1683,46 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-gamut-mapping@npm:^1.0.7": - version: 1.0.7 - resolution: "@csstools/postcss-gamut-mapping@npm:1.0.7" +"@csstools/postcss-gamut-mapping@npm:^1.0.9": + version: 1.0.9 + resolution: "@csstools/postcss-gamut-mapping@npm:1.0.9" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/7b349db44fcd697d57172ab63b7a02a56c0b49bce17e48cb72aa0fa246bd2be83fe693c507fd400a9ed83597a711d18ece9319ee3af8000c8fd3a2761e228a11 + checksum: 10c0/412ae1410f3fce240401576441637c2c4e71d1a54153ac9b7a991b3de7519c253d03e10db78b09872eb10b0776d7f960b442779efabc11332b5be6672163c836 languageName: node linkType: hard -"@csstools/postcss-gradients-interpolation-method@npm:^4.0.15": - version: 4.0.15 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.15" +"@csstools/postcss-gradients-interpolation-method@npm:^4.0.17": + version: 4.0.17 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.17" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/dc0bbf6a4787d5ad3f9fe268dfa9776ecdc25b6cc0a49486bf53238341a339647f1e475240ead3cec1f4af9a237f6518ace015103e90ce8afe4d44539a566e04 + checksum: 10c0/465ac42856ca1a57aa2b9ea41ede31d9e2bcf2fe84345dbc182ae41f463069a0cfd41041b834b5133108c702cd85ecb8636b51b0b88fff8a221628639b59f386 languageName: node linkType: hard -"@csstools/postcss-hwb-function@npm:^3.0.13": - version: 3.0.13 - resolution: "@csstools/postcss-hwb-function@npm:3.0.13" +"@csstools/postcss-hwb-function@npm:^3.0.15": + version: 3.0.15 + resolution: "@csstools/postcss-hwb-function@npm:3.0.15" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/684c3d408ceb027e7276c4f25c9a17ef9bd52f0948268cf58b5184097e9b71f5364a41b42bab44691938c6fadffcba0c8e66f809a339a8b282f4a432d32d00ef + checksum: 10c0/fdfaeefbab1008ab1e4a98a2b45cc3db002b2724c404fa0600954b411a68b1fa4028286250bf9898eed10fa80c44e4d6b4e55f1aca073c3dfce8198a0aaedf3f languageName: node linkType: hard @@ -1749,29 +1748,29 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-is-pseudo-class@npm:^4.0.6": - version: 4.0.6 - resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.6" +"@csstools/postcss-is-pseudo-class@npm:^4.0.8": + version: 4.0.8 + resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.8" dependencies: - "@csstools/selector-specificity": "npm:^3.0.3" + "@csstools/selector-specificity": "npm:^3.1.1" postcss-selector-parser: "npm:^6.0.13" peerDependencies: postcss: ^8.4 - checksum: 10c0/aa071954e08dc9368fbeddbec6a8da2dea3a771b33bad53f67f3bc5a6b2f0a270909948f3e7b29ec885f4cceee245f16388809aeb0620284a1d66ad1f2026f28 + checksum: 10c0/82f191571c3e0973354a54ef15feeb17f9408b4abbefad19fc0f087683b1212fc854cdf09a47324267dd47be4c5cb47d63b8d083695a67c3f8f3e53df3d561f6 languageName: node linkType: hard -"@csstools/postcss-light-dark-function@npm:^1.0.3": - version: 1.0.3 - resolution: "@csstools/postcss-light-dark-function@npm:1.0.3" +"@csstools/postcss-light-dark-function@npm:^1.0.5": + version: 1.0.5 + resolution: "@csstools/postcss-light-dark-function@npm:1.0.5" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/99a1b72aba08a6fa5c7271d42f4459d86f001fe83f533c0ed3d21556f53ee227f65f94cda1feee1aa910890fc42482f15a4dfb3edbc7afdad828ce8897d0c52b + checksum: 10c0/4fbeda98372d0da25d3ed87da09903c9a0a5d0b8c13cc9de82a98acce4a8f8367e5ba33bfc25c2534d10f2b1db9d5b4278df4ebab755e27ef2b03a95e0ebe264 languageName: node linkType: hard @@ -1813,42 +1812,42 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-logical-viewport-units@npm:^2.0.7": - version: 2.0.7 - resolution: "@csstools/postcss-logical-viewport-units@npm:2.0.7" +"@csstools/postcss-logical-viewport-units@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-logical-viewport-units@npm:2.0.9" dependencies: - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/9493f5395ccfe88d0d0740e54f77f0c844afc79b164068fdd907aed75004b4252ba9423dea22194ad98114dd1a2e77c14e307604305d926425251d4ab3013949 + checksum: 10c0/25b01e36b08c571806d09046be63582dbebf97a4612df59be405fa8a92e6eebcd4e768ad7fbe53b0b8739d6ab04d56957964fb04d6a3ea129fc5f72e6d0adf95 languageName: node linkType: hard -"@csstools/postcss-media-minmax@npm:^1.1.4": - version: 1.1.4 - resolution: "@csstools/postcss-media-minmax@npm:1.1.4" +"@csstools/postcss-media-minmax@npm:^1.1.6": + version: 1.1.6 + resolution: "@csstools/postcss-media-minmax@npm:1.1.6" dependencies: - "@csstools/css-calc": "npm:^1.2.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" - "@csstools/media-query-list-parser": "npm:^2.1.9" + "@csstools/css-calc": "npm:^1.2.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" + "@csstools/media-query-list-parser": "npm:^2.1.11" peerDependencies: postcss: ^8.4 - checksum: 10c0/620bb85065195c72cf9c0abe9af822f9feeaf919b53bfd47ec09f75b644cb544bd967b09278c48f829348808b34c552718c1aa3eb5342e2dec983e22eb63b0a0 + checksum: 10c0/2cbfb3728a232c655d82f63d5ac7da36876d14e5fee5d62a0738efed40c58f20ef11f600395ade24d5063d750e8e093251dd93cc361f782b5a6c0e0f80288f51 languageName: node linkType: hard -"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^2.0.7": - version: 2.0.7 - resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:2.0.7" +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:2.0.9" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" - "@csstools/media-query-list-parser": "npm:^2.1.9" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" + "@csstools/media-query-list-parser": "npm:^2.1.11" peerDependencies: postcss: ^8.4 - checksum: 10c0/d5d52a744f9a9466d86a506aab430811778dfa681d3f52f5486ee9b686390919eaae9ad356b84bc782d263227f35913ef68d9a6c3eefcfc38d8ffaccc9b94de0 + checksum: 10c0/d431d2900a7177c938d9dc2d5bdf3c1930758adc214cc72f94b34e6bbd02fd917c200dc81482db515519c97d4f1e766ba3200f3ec9b55081887f2f8111f68e20 languageName: node linkType: hard @@ -1875,18 +1874,18 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^3.0.14": - version: 3.0.14 - resolution: "@csstools/postcss-oklab-function@npm:3.0.14" +"@csstools/postcss-oklab-function@npm:^3.0.16": + version: 3.0.16 + resolution: "@csstools/postcss-oklab-function@npm:3.0.16" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/dfe0b12c2256dded995c64825fac9507be9c747d776cfa09eeefff6dee0efa5eed6a92a1ecba39069a751a7fc3cefa8891c34209a7a3c7ea33d356c95d01a02d + checksum: 10c0/9c67ee5f51116df16ab6baffa1b3c6c7aa93d53b836f421125ae8824075bd3cfaa1a93594466de0ac935c89c4fc8171e80974e1a15bafa23ea864e4cf1f1c1f2 languageName: node linkType: hard @@ -1901,18 +1900,18 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-relative-color-syntax@npm:^2.0.14": - version: 2.0.14 - resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.14" +"@csstools/postcss-relative-color-syntax@npm:^2.0.16": + version: 2.0.16 + resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.16" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/64cd5f8054e4403f4e25ed11a5b9d157098af639dbc30ac25b94660b3af489c0bacc49fc439cba1ccceefa4caa5831a913e3d1d889a9796cc6fbf3902c7c31c1 + checksum: 10c0/cdc965706212dcbc03394f55c79a0ad043d1e0174059c4d0d90e4267fe8e6fd9eef7cfed4f5bbc1f8e89c225c1c042ae792e115bba198eb2daae763d65f44679 languageName: node linkType: hard @@ -1927,16 +1926,16 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-stepped-value-functions@npm:^3.0.6": - version: 3.0.6 - resolution: "@csstools/postcss-stepped-value-functions@npm:3.0.6" +"@csstools/postcss-stepped-value-functions@npm:^3.0.8": + version: 3.0.8 + resolution: "@csstools/postcss-stepped-value-functions@npm:3.0.8" dependencies: - "@csstools/css-calc": "npm:^1.2.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-calc": "npm:^1.2.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/a198aedc4fffe88909c92bfaa36031e6803e739a2578ba4a81c01b9f1525e6a6876d6ffacbbe21701298598dcade8b2ac8423d8ab0fc5d9f4ba86ed60f53cbca + checksum: 10c0/2be66aa769808245137be8ff14308aa17c3a0d75433f6fd6789114966a78c365dbf173d087e7ff5bc80118c75be2ff740baab83ed39fc0671980f6217779956b languageName: node linkType: hard @@ -1952,16 +1951,16 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-trigonometric-functions@npm:^3.0.6": - version: 3.0.6 - resolution: "@csstools/postcss-trigonometric-functions@npm:3.0.6" +"@csstools/postcss-trigonometric-functions@npm:^3.0.8": + version: 3.0.8 + resolution: "@csstools/postcss-trigonometric-functions@npm:3.0.8" dependencies: - "@csstools/css-calc": "npm:^1.2.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-calc": "npm:^1.2.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/4b484af853d9eb59a4a4b1c063fcf48e2658bb2d6930dfab1d79e676986534687e6440b8cdcd2731ddcb7726537f4ed484208a2b80ef2c9359053762ba35e5e7 + checksum: 10c0/aeed8d1026f4a5cb7afafbadd739af84291d5bfcbcdef2f79b77174f003d0cd0c7f9deb3fe0b9377efab37ce9bb17a2499efd4af8211f5ff9eb01b878b0b62b3 languageName: node linkType: hard @@ -1983,12 +1982,12 @@ __metadata: languageName: node linkType: hard -"@csstools/selector-specificity@npm:^3.0.2, @csstools/selector-specificity@npm:^3.0.3": - version: 3.0.3 - resolution: "@csstools/selector-specificity@npm:3.0.3" +"@csstools/selector-specificity@npm:^3.1.1": + version: 3.1.1 + resolution: "@csstools/selector-specificity@npm:3.1.1" peerDependencies: postcss-selector-parser: ^6.0.13 - checksum: 10c0/e4f0355165882ddde8bd4a2f0252868150e67b9fae927fd2d94a91cee31e438e7041059f20b9c755a93b0bd8e527a9f78b01168fe67b3539be32091240aa63bf + checksum: 10c0/1d4a3f8015904d6aeb3203afe0e1f6db09b191d9c1557520e3e960c9204ad852df9db4cbde848643f78a26f6ea09101b4e528dbb9193052db28258dbcc8a6e1d languageName: node linkType: hard @@ -2008,10 +2007,10 @@ __metadata: languageName: node linkType: hard -"@dual-bundle/import-meta-resolve@npm:^4.0.0": - version: 4.0.0 - resolution: "@dual-bundle/import-meta-resolve@npm:4.0.0" - checksum: 10c0/868b8314fc753b7767887108535afe3288de941d92bc8453164dbcb1abe886b171e338f6f7d02ff556256dee69c90e4ac6360e0c6a856a5ad7190274ab52de2e +"@dual-bundle/import-meta-resolve@npm:^4.1.0": + version: 4.1.0 + resolution: "@dual-bundle/import-meta-resolve@npm:4.1.0" + checksum: 10c0/55069e550ee2710e738dd8bbd34aba796cede456287454b50c3be46fbef8695d00625677f3f41f5ffbec1174c0f57f314da9a908388bc9f8ad41a8438db884d9 languageName: node linkType: hard @@ -2132,14 +2131,17 @@ __metadata: languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.42.0": - version: 0.42.0 - resolution: "@es-joy/jsdoccomment@npm:0.42.0" +"@es-joy/jsdoccomment@npm:~0.43.0": + version: 0.43.0 + resolution: "@es-joy/jsdoccomment@npm:0.43.0" dependencies: + "@types/eslint": "npm:^8.56.5" + "@types/estree": "npm:^1.0.5" + "@typescript-eslint/types": "npm:^7.2.0" comment-parser: "npm:1.4.1" esquery: "npm:^1.5.0" jsdoc-type-pratt-parser: "npm:~4.0.0" - checksum: 10c0/a8122762d2df3c6501a9c459e2822315a23c0078c4aeb0b40fb3c84b99e21a78e85e67f962d6b5dde5eb751792a1c67c6a170b619573db7151098a19950abe35 + checksum: 10c0/862294ed89772a231f309edd68405ece00f6aaf43103210f28410da894a6b697bc1f281c59e813dd37d5b7294f633ee7b874e07a0aa3d72f49504089fc9cb2c4 languageName: node linkType: hard @@ -2212,26 +2214,47 @@ __metadata: linkType: hard "@formatjs/cli@npm:^6.1.1": - version: 6.2.9 - resolution: "@formatjs/cli@npm:6.2.9" + version: 6.2.12 + resolution: "@formatjs/cli@npm:6.2.12" peerDependencies: + "@glimmer/env": ^0.1.7 + "@glimmer/reference": ^0.91.1 || ^0.92.0 + "@glimmer/syntax": ^0.92.0 + "@glimmer/validator": ^0.92.0 + "@vue/compiler-core": ^3.4.0 + content-tag: ^2.0.1 + ember-template-recast: ^6.1.4 vue: ^3.4.0 peerDependenciesMeta: + "@glimmer/env": + optional: true + "@glimmer/reference": + optional: true + "@glimmer/syntax": + optional: true + "@glimmer/validator": + optional: true + "@vue/compiler-core": + optional: true + content-tag: + optional: true + ember-template-recast: + optional: true vue: optional: true bin: formatjs: bin/formatjs - checksum: 10c0/498383bcdca7f8f8a748c1151be17392f71eb1861f6a23bc714280533167cba7cdc35a470a380113f6111236e721ff43cbee7b084939dac67b6a5d9b04c0587c + checksum: 10c0/3bd05a9fad6c837e22988e6638f426c128efa46ab80ff88cf2ad81fb3bc10cf4f228907577fc01e24c2d7d505cfabfaa69f0496d2ec8f0ab2d6b5eaccb5e475c languageName: node linkType: hard -"@formatjs/ecma402-abstract@npm:1.18.2": - version: 1.18.2 - resolution: "@formatjs/ecma402-abstract@npm:1.18.2" +"@formatjs/ecma402-abstract@npm:2.0.0": + version: 2.0.0 + resolution: "@formatjs/ecma402-abstract@npm:2.0.0" dependencies: "@formatjs/intl-localematcher": "npm:0.5.4" tslib: "npm:^2.4.0" - checksum: 10c0/87afb37dd937555e712ca85d5142a9083d617c491d1dddf8d660fdfb6186272d2bc75b78809b076388d26f016200c8bddbce73281fd707eb899da2bf3bc9b7ca + checksum: 10c0/94cba291aeadffa3ca416087c2c2352c8a741bb4dcb7f47f15c247b1f043ffcef1af5b20a1b7578fbba9e704fc5f1c079923f3537a273d50162be62f8037625c languageName: node linkType: hard @@ -2244,46 +2267,46 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.7.6": - version: 2.7.6 - resolution: "@formatjs/icu-messageformat-parser@npm:2.7.6" +"@formatjs/icu-messageformat-parser@npm:2.7.8": + version: 2.7.8 + resolution: "@formatjs/icu-messageformat-parser@npm:2.7.8" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" - "@formatjs/icu-skeleton-parser": "npm:1.8.0" + "@formatjs/ecma402-abstract": "npm:2.0.0" + "@formatjs/icu-skeleton-parser": "npm:1.8.2" tslib: "npm:^2.4.0" - checksum: 10c0/9fc72c2075333a969601e2be4260638940b1abefd1a5fc15b93b0b10d2319c9df5778aa51fc2a173ce66ca5e8a47b4b64caca85a32d0eb6095e16e8d65cb4b00 + checksum: 10c0/a3b759a825fb22ffd7b906f6a07b1a079bbc34f72c745de2c2514e439c4bb75bc1a9442eba1bac7ff3ea3010e12076374cd755ad12116b1d066cc90da5fbcbc9 languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.8.0": - version: 1.8.0 - resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0" +"@formatjs/icu-skeleton-parser@npm:1.8.2": + version: 1.8.2 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.2" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/ecma402-abstract": "npm:2.0.0" tslib: "npm:^2.4.0" - checksum: 10c0/10956732d70cc67049d216410b5dc3ef048935d1ea2ae76f5755bb9d0243af37ddeabd5d140ddbf5f6c7047068c3d02a05f93c68a89cedfaf7488d5062885ea4 + checksum: 10c0/9b15013acc47b8d560b52942e3dab2abaaa9c5a4410bbd1d490a4b22bf5ca36fdd88b71f241d05479bddf856d0d1d57b7ecc9e79738497ac518616aa6d4d0015 languageName: node linkType: hard -"@formatjs/intl-displaynames@npm:6.6.6": - version: 6.6.6 - resolution: "@formatjs/intl-displaynames@npm:6.6.6" +"@formatjs/intl-displaynames@npm:6.6.8": + version: 6.6.8 + resolution: "@formatjs/intl-displaynames@npm:6.6.8" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/ecma402-abstract": "npm:2.0.0" "@formatjs/intl-localematcher": "npm:0.5.4" tslib: "npm:^2.4.0" - checksum: 10c0/4ba40057cfafaabf04485137bc96705d5ed7ac48f17ed7dfe8dbd7f71119667b6c0b7fa75469e32b70c9bada2c5d03af37a5261d655a37b81c63ba907edbb2e8 + checksum: 10c0/1a03e7644022741c1bcf10fcd07da88c434416a13603ace693a038114010463307b4130d3a3f53ad5665bd27fca9a6b19ac8e5bf58e17598b1ea84db173fdfbb languageName: node linkType: hard -"@formatjs/intl-listformat@npm:7.5.5": - version: 7.5.5 - resolution: "@formatjs/intl-listformat@npm:7.5.5" +"@formatjs/intl-listformat@npm:7.5.7": + version: 7.5.7 + resolution: "@formatjs/intl-listformat@npm:7.5.7" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/ecma402-abstract": "npm:2.0.0" "@formatjs/intl-localematcher": "npm:0.5.4" tslib: "npm:^2.4.0" - checksum: 10c0/bc9d8cbe42bd9513db0b2b221c0b1a752892005a90fa629b4cf7df1cbd3b96997cddbf420e562ebdfdc691a28d9b759ccae9633d5987aa0bceed5aef77a07ca4 + checksum: 10c0/5d0478752d669d87c82aa80880df464d64a1c8974fcb6136bc854567f570a1696e5468005ffa266cfcb623adb7c7299b839c06ea33897f55d35dab6a7575cc84 languageName: node linkType: hard @@ -2297,41 +2320,41 @@ __metadata: linkType: hard "@formatjs/intl-pluralrules@npm:^5.2.2": - version: 5.2.12 - resolution: "@formatjs/intl-pluralrules@npm:5.2.12" + version: 5.2.14 + resolution: "@formatjs/intl-pluralrules@npm:5.2.14" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/ecma402-abstract": "npm:2.0.0" "@formatjs/intl-localematcher": "npm:0.5.4" tslib: "npm:^2.4.0" - checksum: 10c0/0f4d9f4f272dd962b2f742519045ad43a1b6358755787d3394efcc5884b02184cc8d76fb13d98b1f30c41a813b81f82dd2342e1fb0fbd7b7efa69f5d0d59c4d0 + checksum: 10c0/3c00109c8d4c8b221c2b9af38a38d31cd6293a0a412a1f2cdae2b8ef81bd71626c9ff4a647389682cb27ae5c223bd6f64ef54d03e3f6f19c372e0c6194b76b38 languageName: node linkType: hard -"@formatjs/intl@npm:2.10.1": - version: 2.10.1 - resolution: "@formatjs/intl@npm:2.10.1" +"@formatjs/intl@npm:2.10.4": + version: 2.10.4 + resolution: "@formatjs/intl@npm:2.10.4" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/ecma402-abstract": "npm:2.0.0" "@formatjs/fast-memoize": "npm:2.2.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.6" - "@formatjs/intl-displaynames": "npm:6.6.6" - "@formatjs/intl-listformat": "npm:7.5.5" - intl-messageformat: "npm:10.5.11" + "@formatjs/icu-messageformat-parser": "npm:2.7.8" + "@formatjs/intl-displaynames": "npm:6.6.8" + "@formatjs/intl-listformat": "npm:7.5.7" + intl-messageformat: "npm:10.5.14" tslib: "npm:^2.4.0" peerDependencies: typescript: ^4.7 || 5 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/24eee77382d1efd226aee7590228d3ae80f66a8547a65295f8028986b15b6abbfea3e380f4a338ece0e841e1db6f36554ca48124d84c0830382e3a9d395b5d75 + checksum: 10c0/ca7877e962f73f1fe0e358f12d73bdc3ec4006c14ee801e06d9f7aef06bcdcc12355a8f53f32b0e890f829949ded35e825c914ca5f4709eb1e08c2a18c1368c2 languageName: node linkType: hard -"@formatjs/ts-transformer@npm:3.13.12": - version: 3.13.12 - resolution: "@formatjs/ts-transformer@npm:3.13.12" +"@formatjs/ts-transformer@npm:3.13.14": + version: 3.13.14 + resolution: "@formatjs/ts-transformer@npm:3.13.14" dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.7.6" + "@formatjs/icu-messageformat-parser": "npm:2.7.8" "@types/json-stable-stringify": "npm:^1.0.32" "@types/node": "npm:14 || 16 || 17" chalk: "npm:^4.0.0" @@ -2343,7 +2366,7 @@ __metadata: peerDependenciesMeta: ts-jest: optional: true - checksum: 10c0/68f72ee6379b87b7ef6340e118a5370cb2fa18cbbae08f5f3d10893803a52f0533e644002e0b5e9ffeded5b2f0aa9daad6adf8b487b10f5d2b61f9fb3fed0dbd + checksum: 10c0/38450cfce3ec5132f3548c1e9ab098909ca8d2db2b8b6b4b5bb87aa59a4ca1a19bbf6d339ace39bcc931fa80d9946b4c7cf039c9574069b317ae015cd6963bd3 languageName: node linkType: hard @@ -2734,7 +2757,7 @@ __metadata: "@formatjs/intl-pluralrules": "npm:^5.2.2" "@gamestdio/websocket": "npm:^0.3.2" "@github/webauthn-json": "npm:^2.1.1" - "@rails/ujs": "npm:7.1.3-2" + "@rails/ujs": "npm:7.1.3" "@reduxjs/toolkit": "npm:^2.0.1" "@svgr/webpack": "npm:^5.5.0" "@testing-library/jest-dom": "npm:^6.0.0" @@ -2766,6 +2789,7 @@ __metadata: "@types/redux-immutable": "npm:^4.0.3" "@types/requestidlecallback": "npm:^0.3.5" "@types/webpack": "npm:^4.41.33" + "@types/webpack-env": "npm:^1.18.4" "@typescript-eslint/eslint-plugin": "npm:^7.0.0" "@typescript-eslint/parser": "npm:^7.0.0" arrow-key-navigation: "npm:^1.2.0" @@ -2798,7 +2822,7 @@ __metadata: eslint-plugin-import: "npm:~2.29.0" eslint-plugin-jsdoc: "npm:^48.0.0" eslint-plugin-jsx-a11y: "npm:~6.8.0" - eslint-plugin-promise: "npm:~6.1.1" + eslint-plugin-promise: "npm:~6.2.0" eslint-plugin-react: "npm:^7.33.2" eslint-plugin-react-hooks: "npm:^4.6.0" file-loader: "npm:^6.2.0" @@ -2905,7 +2929,7 @@ __metadata: pg: "npm:^8.5.0" pg-connection-string: "npm:^2.6.0" pino: "npm:^9.0.0" - pino-http: "npm:^9.0.0" + pino-http: "npm:^10.0.0" pino-pretty: "npm:^11.0.0" prom-client: "npm:^15.0.0" typescript: "npm:^5.0.4" @@ -3017,21 +3041,21 @@ __metadata: languageName: node linkType: hard -"@rails/ujs@npm:7.1.3-2": - version: 7.1.3-2 - resolution: "@rails/ujs@npm:7.1.3-2" - checksum: 10c0/8bd5b3a409c62f53790ed7e914f1f48235f461a472da7b4ce1d9ad57356fcdeaa7891c946298f7f620ff0ff7c6d5b995bf44057929c4fce796867a8cf4f27c99 +"@rails/ujs@npm:7.1.3": + version: 7.1.3 + resolution: "@rails/ujs@npm:7.1.3" + checksum: 10c0/68112d9add9dbc59b40c2ec1bc095a67445c57d20d0ab7d817ce3de0cd90374e2690af8ad54ce6ecc2d1c748b34c0c44d0fbd2f515ce2c443d7c5d23d00b9ce5 languageName: node linkType: hard "@reduxjs/toolkit@npm:^2.0.1": - version: 2.2.3 - resolution: "@reduxjs/toolkit@npm:2.2.3" + version: 2.2.5 + resolution: "@reduxjs/toolkit@npm:2.2.5" dependencies: immer: "npm:^10.0.3" redux: "npm:^5.0.1" redux-thunk: "npm:^3.1.0" - reselect: "npm:^5.0.1" + reselect: "npm:^5.1.0" peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 @@ -3040,7 +3064,7 @@ __metadata: optional: true react-redux: optional: true - checksum: 10c0/f10f2c8f4b6c5c7a65d8d60246bdfde86b6cd2f542210ebdda8002223c7f4e99ed32964825e63f37345d9d12532671150fcec2809a40690931ae44afe8aba7f8 + checksum: 10c0/be0593bf26852482fb8716b9248531466c6e8782a3114b823ae680fce90267d8c5512a3231cfecc30b17eff81a4604112772b49ad7ca6a3366ddd4f2a838e53c languageName: node linkType: hard @@ -3072,19 +3096,22 @@ __metadata: languageName: node linkType: hard -"@rollup/plugin-node-resolve@npm:^11.2.1": - version: 11.2.1 - resolution: "@rollup/plugin-node-resolve@npm:11.2.1" +"@rollup/plugin-node-resolve@npm:^15.2.3": + version: 15.2.3 + resolution: "@rollup/plugin-node-resolve@npm:15.2.3" dependencies: - "@rollup/pluginutils": "npm:^3.1.0" - "@types/resolve": "npm:1.17.1" - builtin-modules: "npm:^3.1.0" + "@rollup/pluginutils": "npm:^5.0.1" + "@types/resolve": "npm:1.20.2" deepmerge: "npm:^4.2.2" + is-builtin-module: "npm:^3.2.1" is-module: "npm:^1.0.0" - resolve: "npm:^1.19.0" + resolve: "npm:^1.22.1" peerDependencies: - rollup: ^1.20.0||^2.0.0 - checksum: 10c0/a8226b01352ee1f7133b1b59b3906267e11c99020a55e3b7a313e03889f790d1cd94e7f7769d3963261e897c3265082533ba595976f8e3f08cf70aa88bf1ddd7 + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/598c15615086f26e28c4b3dbf966682af7fb0e5bc277cc4e57f559668a3be675a63ab261eb34729ce9569c3a51342c48863e50b5efe02e0fc1571828f0113f9d languageName: node linkType: hard @@ -3100,6 +3127,22 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-terser@npm:^0.4.3": + version: 0.4.4 + resolution: "@rollup/plugin-terser@npm:0.4.4" + dependencies: + serialize-javascript: "npm:^6.0.1" + smob: "npm:^1.0.0" + terser: "npm:^5.17.4" + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/b9cb6c8f02ac1c1344019e9fb854321b74f880efebc41b6bdd84f18331fce0f4a2aadcdb481042245cd3f409b429ac363af71f9efec4a2024731d67d32af36ee + languageName: node + linkType: hard + "@rollup/pluginutils@npm:^3.1.0": version: 3.1.0 resolution: "@rollup/pluginutils@npm:3.1.0" @@ -3113,6 +3156,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.0.1": + version: 5.1.0 + resolution: "@rollup/pluginutils@npm:5.1.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^2.3.1" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/c7bed15711f942d6fdd3470fef4105b73991f99a478605e13d41888963330a6f9e32be37e6ddb13f012bc7673ff5e54f06f59fd47109436c1c513986a8a7612d + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -3298,8 +3357,8 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^6.0.0": - version: 6.4.2 - resolution: "@testing-library/jest-dom@npm:6.4.2" + version: 6.4.5 + resolution: "@testing-library/jest-dom@npm:6.4.5" dependencies: "@adobe/css-tools": "npm:^4.3.2" "@babel/runtime": "npm:^7.9.2" @@ -3307,7 +3366,7 @@ __metadata: chalk: "npm:^3.0.0" css.escape: "npm:^1.5.1" dom-accessibility-api: "npm:^0.6.3" - lodash: "npm:^4.17.15" + lodash: "npm:^4.17.21" redent: "npm:^3.0.0" peerDependencies: "@jest/globals": ">= 28" @@ -3326,21 +3385,25 @@ __metadata: optional: true vitest: optional: true - checksum: 10c0/e7eba527b34ce30cde94424d2ec685bdfed51daaafb7df9b68b51aec6052e99a50c8bfe654612dacdf857a1eb81d68cf294fc89de558ee3a992bf7a6019fffcc + checksum: 10c0/4cfdd44e2abab2b9d399c47cbfe686729bb65160d7df0f9e2329aaaea7702f6e852a9eefb29b468f00c1e5a5274b684f8cac76959d33299dfa909ba007ea191d languageName: node linkType: hard "@testing-library/react@npm:^15.0.0": - version: 15.0.2 - resolution: "@testing-library/react@npm:15.0.2" + version: 15.0.7 + resolution: "@testing-library/react@npm:15.0.7" dependencies: "@babel/runtime": "npm:^7.12.5" "@testing-library/dom": "npm:^10.0.0" "@types/react-dom": "npm:^18.0.0" peerDependencies: + "@types/react": ^18.0.0 react: ^18.0.0 react-dom: ^18.0.0 - checksum: 10c0/8d75e4850f8f749244bf4f30b0f99a5d4aa1156ee5a59eea0772f47971c38535d1fb31d021c4f0f0b816346ae664870dc223d5d997ab399dfb1b6211f0e2acf1 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/ac8ee8968e81949ecb35f7ee34741c2c043f73dd7fee2247d56f6de6a30de4742af94f25264356863974e54387485b46c9448ecf3f6ca41cf4339011c369f2d4 languageName: node linkType: hard @@ -3459,20 +3522,20 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:7 || 8": - version: 8.44.6 - resolution: "@types/eslint@npm:8.44.6" +"@types/eslint@npm:7 || 8, @types/eslint@npm:^8.56.5": + version: 8.56.10 + resolution: "@types/eslint@npm:8.56.10" dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: 10c0/fc449107eb186bdc5d30149bbcb4e673af8530afdeacca3b89f14deefcbfc67463157d6a81b42cd9df92ddeafda5351853d13310ff7ac6ab0d9769ac7cc0cc3a + checksum: 10c0/674349d6c342c3864d70f4d5a9965f96fb253801532752c8c500ad6a1c2e8b219e01ccff5dc8791dcb58b5483012c495708bb9f3ff929f5c9322b3da126c15d3 languageName: node linkType: hard -"@types/estree@npm:*": - version: 1.0.3 - resolution: "@types/estree@npm:1.0.3" - checksum: 10c0/5171f467fdd77852e28d7eec575222bc6c900e117a44e916a5ff65807ae8e1ed15f57d21e8954d6bd532e37c49a8ecfee730fcb152b7b44234d38681978b2caa +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d languageName: node linkType: hard @@ -3619,7 +3682,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -3641,9 +3704,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.195": - version: 4.17.0 - resolution: "@types/lodash@npm:4.17.0" - checksum: 10c0/4c5b41c9a6c41e2c05d08499e96f7940bcf194dcfa84356235b630da920c2a5e05f193618cea76006719bec61c76617dff02defa9d29934f9f6a76a49291bd8f + version: 4.17.4 + resolution: "@types/lodash@npm:4.17.4" + checksum: 10c0/0124c64cb9fe7a0f78b6777955abd05ef0d97844d49118652eae45f8fa57bfb7f5a7a9bccc0b5a84c0a6dc09631042e4590cb665acb9d58dfd5e6543c75341ec languageName: node linkType: hard @@ -3699,13 +3762,13 @@ __metadata: linkType: hard "@types/pg@npm:^8.6.6": - version: 8.11.5 - resolution: "@types/pg@npm:8.11.5" + version: 8.11.6 + resolution: "@types/pg@npm:8.11.6" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" pg-types: "npm:^4.0.1" - checksum: 10c0/d64d183bee2df96cd0558231190ff629558e8c0fd3203b880f48a7d34b1eaea528d20c09b57b19c0939f369136e6c6941533592eadd71174be78d1ec0ca5e60e + checksum: 10c0/e68e057d9500b25cd776f4fcc547b4880c4f3b0c7b6e03c8a0e5e262b6189dd7a00f4edc8937ffc55a9f6a136a78d7e4a9b6bbe6a46122a95c134f7be66f6842 languageName: node linkType: hard @@ -3759,11 +3822,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.4": - version: 18.2.25 - resolution: "@types/react-dom@npm:18.2.25" + version: 18.3.0 + resolution: "@types/react-dom@npm:18.3.0" dependencies: "@types/react": "npm:*" - checksum: 10c0/87604407eca6884c5b4d4657cb511dc5ba28ea1cfa5d0ce1fc2d659a7ad1b64ae85dcda60e3f010641f9a52a6a60dfcaa6be3b0d0de9d624475052a13dae01f4 + checksum: 10c0/6c90d2ed72c5a0e440d2c75d99287e4b5df3e7b011838cdc03ae5cd518ab52164d86990e73246b9d812eaf02ec351d74e3b4f5bd325bf341e13bf980392fd53b languageName: node linkType: hard @@ -3835,11 +3898,11 @@ __metadata: linkType: hard "@types/react-test-renderer@npm:^18.0.0": - version: 18.0.7 - resolution: "@types/react-test-renderer@npm:18.0.7" + version: 18.3.0 + resolution: "@types/react-test-renderer@npm:18.3.0" dependencies: "@types/react": "npm:*" - checksum: 10c0/45cbe963354acee2ab090979d856763c84f59ef7b63477d1fef5d0fd52760b69aa67bbd205fbd3bd36264620fce72c8e407735a9f2009c40ca50da59b0058c34 + checksum: 10c0/3c9748be52e8e659e7adf91dea6939486463264e6f633bf21c4cb116de18af7bef0595568a1e588160420b2f65289473075dda1cb417c2875df8cf7a09f5d913 languageName: node linkType: hard @@ -3862,12 +3925,12 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.79 - resolution: "@types/react@npm:18.2.79" + version: 18.3.3 + resolution: "@types/react@npm:18.3.3" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/c8a8a005d8830a48cc1ef93c3510c4935a2a03e5557dbecaa8f1038450cbfcb18eb206fa7fba7077d54b8da21faeb25577e897a333392770a7797f625b62c78a + checksum: 10c0/fe455f805c5da13b89964c3d68060cebd43e73ec15001a68b34634604a78140e6fc202f3f61679b9d809dde6d7a7c2cb3ed51e0fd1462557911db09879b55114 languageName: node linkType: hard @@ -3888,16 +3951,14 @@ __metadata: languageName: node linkType: hard -"@types/resolve@npm:1.17.1": - version: 1.17.1 - resolution: "@types/resolve@npm:1.17.1" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031 +"@types/resolve@npm:1.20.2": + version: 1.20.2 + resolution: "@types/resolve@npm:1.20.2" + checksum: 10c0/c5b7e1770feb5ccfb6802f6ad82a7b0d50874c99331e0c9b259e415e55a38d7a86ad0901c57665d93f75938be2a6a0bc9aa06c9749192cadb2e4512800bbc6e6 languageName: node linkType: hard -"@types/semver@npm:^7.5.0, @types/semver@npm:^7.5.8": +"@types/semver@npm:^7.5.0": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa @@ -3990,6 +4051,13 @@ __metadata: languageName: node linkType: hard +"@types/webpack-env@npm:^1.18.4": + version: 1.18.5 + resolution: "@types/webpack-env@npm:1.18.5" + checksum: 10c0/b9e4876e8c7cae419896249f9ed795db283c008fe1d38efa679cbbf05194fc2eea2a5bfb4ff4393d109e3a9895416dadf5f3ddd5c22931b678062230f860454e + languageName: node + linkType: hard + "@types/webpack-sources@npm:*": version: 3.2.2 resolution: "@types/webpack-sources@npm:3.2.2" @@ -4041,19 +4109,17 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^7.0.0": - version: 7.7.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.7.0" + version: 7.10.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.10.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.7.0" - "@typescript-eslint/type-utils": "npm:7.7.0" - "@typescript-eslint/utils": "npm:7.7.0" - "@typescript-eslint/visitor-keys": "npm:7.7.0" - debug: "npm:^4.3.4" + "@typescript-eslint/scope-manager": "npm:7.10.0" + "@typescript-eslint/type-utils": "npm:7.10.0" + "@typescript-eslint/utils": "npm:7.10.0" + "@typescript-eslint/visitor-keys": "npm:7.10.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" - semver: "npm:^7.6.0" ts-api-utils: "npm:^1.3.0" peerDependencies: "@typescript-eslint/parser": ^7.0.0 @@ -4061,25 +4127,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/d1f4c40523d284bce4b8272750c68aae5c0289ddb1c9267dd3477e0bfb8c8855bfb0c6e86dfec9911ca8302ef729d5f4e47d686a566f363b0f89bf7dc7670b5c + checksum: 10c0/bf3f0118ea5961c3eb01894678246458a329d82dda9ac7c2f5bfe77896410d05a08a4655e533bcb1ed2a3132ba6421981ec8c2ed0a3545779d9603ea231947ae languageName: node linkType: hard "@typescript-eslint/parser@npm:^7.0.0": - version: 7.7.0 - resolution: "@typescript-eslint/parser@npm:7.7.0" + version: 7.10.0 + resolution: "@typescript-eslint/parser@npm:7.10.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.7.0" - "@typescript-eslint/types": "npm:7.7.0" - "@typescript-eslint/typescript-estree": "npm:7.7.0" - "@typescript-eslint/visitor-keys": "npm:7.7.0" + "@typescript-eslint/scope-manager": "npm:7.10.0" + "@typescript-eslint/types": "npm:7.10.0" + "@typescript-eslint/typescript-estree": "npm:7.10.0" + "@typescript-eslint/visitor-keys": "npm:7.10.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/d756c2292737499a93913647af7493aded5dc720a5f4ab6f8e96d6cc81f19cf6a1769a1df0f516f8facd276d34f8464f1711e57b0216082e32eb6b75da81b12e + checksum: 10c0/4c4fbf43b5b05d75b766acb803d3dd078c6e080641a77f9e48ba005713466738ea4a71f0564fa3ce520988d65158d14c8c952ba01ccbc431ab4a05935db5ce6d languageName: node linkType: hard @@ -4093,22 +4159,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.7.0": - version: 7.7.0 - resolution: "@typescript-eslint/scope-manager@npm:7.7.0" +"@typescript-eslint/scope-manager@npm:7.10.0": + version: 7.10.0 + resolution: "@typescript-eslint/scope-manager@npm:7.10.0" dependencies: - "@typescript-eslint/types": "npm:7.7.0" - "@typescript-eslint/visitor-keys": "npm:7.7.0" - checksum: 10c0/014a3631c12bfbd5e33146a48e4b9eb5cc1c5c95bb458de33f8847eed33c04d7b9e66283971e48297673c4b92c3239d67e6dc3717efbe5836e0269a538c13d2e + "@typescript-eslint/types": "npm:7.10.0" + "@typescript-eslint/visitor-keys": "npm:7.10.0" + checksum: 10c0/1d4f7ee137b95bd423b5a1b0d03251202dfc19bd8b6adfa5ff5df25fd5aa30e2d8ca50ab0d8d2e92441670ecbc2a82b3c2dbe39a4f268ec1ee1c1e267f7fd1d1 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.7.0": - version: 7.7.0 - resolution: "@typescript-eslint/type-utils@npm:7.7.0" +"@typescript-eslint/type-utils@npm:7.10.0": + version: 7.10.0 + resolution: "@typescript-eslint/type-utils@npm:7.10.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.7.0" - "@typescript-eslint/utils": "npm:7.7.0" + "@typescript-eslint/typescript-estree": "npm:7.10.0" + "@typescript-eslint/utils": "npm:7.10.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependencies: @@ -4116,7 +4182,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/064c28d4087a97fd175e07e02c0a9cf4526f61cc6a17b4199fba626932979210037643a30f868bda8174fad567a8ac6aed34120631d1ecfd502e0ea1e830f9e9 + checksum: 10c0/55e9a6690f9cedb79d30abb1990b161affaa2684dac246b743223353812c9c1e3fd2d923c67b193c6a3624a07e1c82c900ce7bf5b6b9891c846f04cb480ebd9f languageName: node linkType: hard @@ -4127,10 +4193,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.7.0": - version: 7.7.0 - resolution: "@typescript-eslint/types@npm:7.7.0" - checksum: 10c0/eb50793650c9a911c73586150807912e7b7a0ae12eeb26c7a322ac8ebb8edef15960cc9a4b7049dbb89b82500079963145f67d15583f5de270fe8290974db533 +"@typescript-eslint/types@npm:7.10.0, @typescript-eslint/types@npm:^7.2.0": + version: 7.10.0 + resolution: "@typescript-eslint/types@npm:7.10.0" + checksum: 10c0/f01d9330b93cc362ba7967ab5037396f64742076450e1f93139fa69cbe93a6ece3ed55d68ab780c9b7d07ef4a7c645da410305216a2cfc5dec7eba49ee65ab23 languageName: node linkType: hard @@ -4153,12 +4219,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.7.0": - version: 7.7.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.7.0" +"@typescript-eslint/typescript-estree@npm:7.10.0": + version: 7.10.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.10.0" dependencies: - "@typescript-eslint/types": "npm:7.7.0" - "@typescript-eslint/visitor-keys": "npm:7.7.0" + "@typescript-eslint/types": "npm:7.10.0" + "@typescript-eslint/visitor-keys": "npm:7.10.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -4168,24 +4234,21 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/19da9bf0948c9800fde19c5a408a80a3a4cf357ff67d47b516df5d2a05701a4fdd2b9ab5b692866bd84bfc17cea9132d1575a1423e01763a4c2918b5d77d0b34 + checksum: 10c0/6200695834c566e52e2fa7331f1a05019f7815969d8c1e1e237b85a99664d36f41ccc16384eff3f8582a0ecb75f1cc315b56ee9283b818da37f24fa4d42f1d7a languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.7.0": - version: 7.7.0 - resolution: "@typescript-eslint/utils@npm:7.7.0" +"@typescript-eslint/utils@npm:7.10.0": + version: 7.10.0 + resolution: "@typescript-eslint/utils@npm:7.10.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.15" - "@types/semver": "npm:^7.5.8" - "@typescript-eslint/scope-manager": "npm:7.7.0" - "@typescript-eslint/types": "npm:7.7.0" - "@typescript-eslint/typescript-estree": "npm:7.7.0" - semver: "npm:^7.6.0" + "@typescript-eslint/scope-manager": "npm:7.10.0" + "@typescript-eslint/types": "npm:7.10.0" + "@typescript-eslint/typescript-estree": "npm:7.10.0" peerDependencies: eslint: ^8.56.0 - checksum: 10c0/c5f18ce198b420bdc201fd4278b4fa97bfe86178db565f3c4e1991bb452c9ea0b657e7980572555e2ec2fe218d07c42c794d217b9369903019cf784eea7e2164 + checksum: 10c0/6724471f94f2788f59748f7efa2a3a53ea910099993bee2fa5746ab5acacecdc9fcb110c568b18099ddc946ea44919ed394bff2bd055ba81fc69f5e6297b73bf languageName: node linkType: hard @@ -4216,13 +4279,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.7.0": - version: 7.7.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.7.0" +"@typescript-eslint/visitor-keys@npm:7.10.0": + version: 7.10.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.10.0" dependencies: - "@typescript-eslint/types": "npm:7.7.0" + "@typescript-eslint/types": "npm:7.10.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/0f3b9720a962c04462a75d4872714c07320c8f672841881ada797ae960f9f6bd0e5f7494178917034f42635ef76f0f09fa3c8d4bd84f31ec58ee968fe75bada7 + checksum: 10c0/049e812bcd28869059d04c7bf3543bb55f5205f468b777439c4f120417fb856fb6024cb1d25291aa12556bd08e84f043a96d754ffb2cde37abb604d6f3c51634 languageName: node linkType: hard @@ -5076,13 +5139,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.6.8 - resolution: "axios@npm:1.6.8" + version: 1.7.2 + resolution: "axios@npm:1.7.2" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9 + checksum: 10c0/cbd47ce380fe045313364e740bb03b936420b8b5558c7ea36a4563db1258c658f05e40feb5ddd41f6633fdd96d37ac2a76f884dad599c5b0224b4c451b3fa7ae languageName: node linkType: hard @@ -5128,21 +5191,21 @@ __metadata: linkType: hard "babel-plugin-formatjs@npm:^10.5.1": - version: 10.5.14 - resolution: "babel-plugin-formatjs@npm:10.5.14" + version: 10.5.16 + resolution: "babel-plugin-formatjs@npm:10.5.16" dependencies: "@babel/core": "npm:^7.10.4" "@babel/helper-plugin-utils": "npm:^7.10.4" "@babel/plugin-syntax-jsx": "npm:7" "@babel/traverse": "npm:7" "@babel/types": "npm:^7.12.11" - "@formatjs/icu-messageformat-parser": "npm:2.7.6" - "@formatjs/ts-transformer": "npm:3.13.12" + "@formatjs/icu-messageformat-parser": "npm:2.7.8" + "@formatjs/ts-transformer": "npm:3.13.14" "@types/babel__core": "npm:^7.1.7" "@types/babel__helper-plugin-utils": "npm:^7.10.0" "@types/babel__traverse": "npm:^7.1.7" tslib: "npm:^2.4.0" - checksum: 10c0/78d33f0304c7b6e36334b2f32bacd144cbbe08cb22318ff994e7adc7705b7f8208354c9af9f87b4390d11aee1ea81cfee9f224a57fe5265173b92ee7de921359 + checksum: 10c0/03d9d2b0b9cdc05c011bfb417a43e5c0f557868ed84d83acbc3cb9072b7fa98f5219473d0bd61f02741c151d6f2162da363bd337522c80af14721ae37f6da86b languageName: node linkType: hard @@ -5490,12 +5553,12 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: "npm:^7.0.1" - checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 languageName: node linkType: hard @@ -5654,7 +5717,7 @@ __metadata: languageName: node linkType: hard -"builtin-modules@npm:^3.1.0, builtin-modules@npm:^3.3.0": +"builtin-modules@npm:^3.3.0": version: 3.3.0 resolution: "builtin-modules@npm:3.3.0" checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a @@ -5798,13 +5861,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 - languageName: node - linkType: hard - "chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -5836,6 +5892,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:~5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + languageName: node + linkType: hard + "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -6128,13 +6191,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:11.1.0": - version: 11.1.0 - resolution: "commander@npm:11.1.0" - checksum: 10c0/13cc6ac875e48780250f723fb81c1c1178d35c5decb1abb1b628b3177af08a8554e76b2c0f29de72d69eef7c864d12613272a71fabef8047922bc622ab75a179 - languageName: node - linkType: hard - "commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -6149,6 +6205,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:~12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 + languageName: node + linkType: hard + "comment-parser@npm:1.4.1": version: 1.4.1 resolution: "comment-parser@npm:1.4.1" @@ -6312,9 +6375,9 @@ __metadata: linkType: hard "core-js@npm:^3.30.2": - version: 3.37.0 - resolution: "core-js@npm:3.37.0" - checksum: 10c0/7e00331f346318ca3f595c08ce9e74ddae744715aef137486c1399163afd79792fb94c3161280863adfdc3e30f8026912d56bd3036f93cacfc689d33e185f2ee + version: 3.37.1 + resolution: "core-js@npm:3.37.1" + checksum: 10c0/440eb51a7a39128a320225fe349f870a3641b96c9ecd26470227db730ef8c161ea298eaea621db66ec0ff622a85299efb4e23afebf889c0a1748616102307675 languageName: node linkType: hard @@ -6501,23 +6564,23 @@ __metadata: languageName: node linkType: hard -"css-functions-list@npm:^3.2.1": - version: 3.2.1 - resolution: "css-functions-list@npm:3.2.1" - checksum: 10c0/e6e2d9580437ad6df9f2cf18cff3f941691ec5cbbaebd4cb17a5da40d8d5dac50004807ddd05c00a121d2f21a224e2c5d339fe8e13614af21c00181d7d1c22b9 +"css-functions-list@npm:^3.2.2": + version: 3.2.2 + resolution: "css-functions-list@npm:3.2.2" + checksum: 10c0/8638a63d0cf1bdc50d4a752ec1c94a57e9953c3b03eace4f5526db20bec3c061e95089f905dbb4999c44b9780ce777ba856967560f6d15119a303f6030901c10 languageName: node linkType: hard -"css-has-pseudo@npm:^6.0.3": - version: 6.0.3 - resolution: "css-has-pseudo@npm:6.0.3" +"css-has-pseudo@npm:^6.0.5": + version: 6.0.5 + resolution: "css-has-pseudo@npm:6.0.5" dependencies: - "@csstools/selector-specificity": "npm:^3.0.3" + "@csstools/selector-specificity": "npm:^3.1.1" postcss-selector-parser: "npm:^6.0.13" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/bbe663eff5256233c7bcce256cd8de7d93d82f2d4f2ca104af8e39e2159170d67746d3a2954385d03ec4ea7ef2728fe9a7d8cb62c52c0a6df1ad3d3bb1e3439d + checksum: 10c0/946930b7e699d6dbcb8426ebcd593228ee0e2143a148fb2399111ea4c9ed8d6eb3447e944251f1be44ae987d5ab16e450b0b006ca197f318c2a3760ba431fbb9 languageName: node linkType: hard @@ -6828,7 +6891,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -7706,11 +7769,11 @@ __metadata: linkType: hard "eslint-plugin-formatjs@npm:^4.10.1": - version: 4.13.0 - resolution: "eslint-plugin-formatjs@npm:4.13.0" + version: 4.13.3 + resolution: "eslint-plugin-formatjs@npm:4.13.3" dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.7.6" - "@formatjs/ts-transformer": "npm:3.13.12" + "@formatjs/icu-messageformat-parser": "npm:2.7.8" + "@formatjs/ts-transformer": "npm:3.13.14" "@types/eslint": "npm:7 || 8" "@types/picomatch": "npm:^2.3.0" "@typescript-eslint/utils": "npm:^6.18.1" @@ -7722,7 +7785,7 @@ __metadata: unicode-emoji-utils: "npm:^1.2.0" peerDependencies: eslint: 7 || 8 - checksum: 10c0/3dbe4ffd3e72d4ce5b14afdcf6dd5db889dd09cb15bc875f29bcc5b49295e0ae4a3eb672ed89ed33f22aacbfe655151398ca4307fd0610508e568a6e4db50aa8 + checksum: 10c0/5e98f487a097189e3bdc64b678d19f4c83502c32d7c89a8959eda4ed9cb664bf16f13ad8871be89ca192cb39c1007d6a158c39bbf5b23c56962d949dbe9abfab languageName: node linkType: hard @@ -7754,21 +7817,20 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^48.0.0": - version: 48.2.3 - resolution: "eslint-plugin-jsdoc@npm:48.2.3" + version: 48.2.6 + resolution: "eslint-plugin-jsdoc@npm:48.2.6" dependencies: - "@es-joy/jsdoccomment": "npm:~0.42.0" + "@es-joy/jsdoccomment": "npm:~0.43.0" are-docs-informative: "npm:^0.0.2" comment-parser: "npm:1.4.1" debug: "npm:^4.3.4" escape-string-regexp: "npm:^4.0.0" esquery: "npm:^1.5.0" - is-builtin-module: "npm:^3.2.1" - semver: "npm:^7.6.0" + semver: "npm:^7.6.1" spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/e755923d96118890c6fd28b1c2298e1fe67ccbce08060ffc091b29ced59d0058ad8820323c56eef6f85c2954c783fc4076e78c0e5bc64838ae099b4e62ea702e + checksum: 10c0/9f01b3000aa31f17767786c62caf62f1e8c4b88bfef04b207d3b1de785be287cc2da3ad16ed32afacd5f6e6a9b76ebf3369069be416ce2228c44cd6d084fcd8f languageName: node linkType: hard @@ -7798,21 +7860,21 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-promise@npm:~6.1.1": - version: 6.1.1 - resolution: "eslint-plugin-promise@npm:6.1.1" +"eslint-plugin-promise@npm:~6.2.0": + version: 6.2.0 + resolution: "eslint-plugin-promise@npm:6.2.0" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 10c0/ec705741c110cd1cb4d702776e1c7f7fe60b671b71f706c88054ab443cf2767aae5a663928fb426373ba1095eaeda312a740a4f880546631f0e0727f298b3393 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 10c0/5f42ee774023c089453ecb792076c64c6d0739ea6e9d6cdc9d6a63da5ba928c776e349d01cc110548f2c67045ec55343136aa7eb8b486e4ab145ac016c06a492 languageName: node linkType: hard "eslint-plugin-react-hooks@npm:^4.6.0": - version: 4.6.0 - resolution: "eslint-plugin-react-hooks@npm:4.6.0" + version: 4.6.2 + resolution: "eslint-plugin-react-hooks@npm:4.6.2" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 10c0/58c7e10ea5792c33346fcf5cb4024e14837035ce412ff99c2dcb7c4f903dc9b17939078f80bfef826301ce326582c396c00e8e0ac9d10ac2cde2b42d33763c65 + checksum: 10c0/4844e58c929bc05157fb70ba1e462e34f1f4abcbc8dd5bbe5b04513d33e2699effb8bca668297976ceea8e7ebee4e8fc29b9af9d131bcef52886feaa2308b2cc languageName: node linkType: hard @@ -7979,6 +8041,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -8039,23 +8108,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^8.0.1" - human-signals: "npm:^5.0.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^3.0.0" - checksum: 10c0/2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af - languageName: node - linkType: hard - "execa@npm:^1.0.0": version: 1.0.0 resolution: "execa@npm:1.0.0" @@ -8088,6 +8140,23 @@ __metadata: languageName: node linkType: hard +"execa@npm:~8.0.1": + version: 8.0.1 + resolution: "execa@npm:8.0.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^8.0.1" + human-signals: "npm:^5.0.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^3.0.0" + checksum: 10c0/2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af + languageName: node + linkType: hard + "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -8213,10 +8282,10 @@ __metadata: languageName: node linkType: hard -"fast-copy@npm:^3.0.0": - version: 3.0.1 - resolution: "fast-copy@npm:3.0.1" - checksum: 10c0/a8310dbcc4c94ed001dc3e0bbc3c3f0491bb04e6c17163abe441a54997ba06cdf1eb532c2f05e54777c6f072c84548c23ef0ecd54665cd611be1d42f37eca258 +"fast-copy@npm:^3.0.2": + version: 3.0.2 + resolution: "fast-copy@npm:3.0.2" + checksum: 10c0/02e8b9fd03c8c024d2987760ce126456a0e17470850b51e11a1c3254eed6832e4733ded2d93316c82bc0b36aeb991ad1ff48d1ba95effe7add7c3ab8d8eb554a languageName: node linkType: hard @@ -8367,12 +8436,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 languageName: node linkType: hard @@ -8809,17 +8878,17 @@ __metadata: linkType: hard "glob@npm:^10.2.2, glob@npm:^10.2.6, glob@npm:^10.3.10, glob@npm:^10.3.7": - version: 10.3.12 - resolution: "glob@npm:10.3.12" + version: 10.4.1 + resolution: "glob@npm:10.4.1" dependencies: foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.6" - minimatch: "npm:^9.0.1" - minipass: "npm:^7.0.4" - path-scurry: "npm:^1.10.2" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10c0/f60cefdc1cf3f958b2bb5823e1b233727f04916d489dc4641d76914f016e6704421e06a83cbb68b0cb1cb9382298b7a88075b844ad2127fc9727ea22b18b0711 + checksum: 10c0/77f2900ed98b9cc2a0e1901ee5e476d664dae3cd0f1b662b8bfd4ccf00d0edc31a11595807706a274ca10e1e251411bbf2e8e976c82bed0d879a9b89343ed379 languageName: node linkType: hard @@ -9266,13 +9335,13 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "http-proxy-agent@npm:7.0.0" +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" dependencies: agent-base: "npm:^7.1.0" debug: "npm:^4.3.4" - checksum: 10c0/a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8 + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 languageName: node linkType: hard @@ -9316,13 +9385,13 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2": - version: 7.0.2 - resolution: "https-proxy-agent@npm:7.0.2" +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.4": + version: 7.0.4 + resolution: "https-proxy-agent@npm:7.0.4" dependencies: agent-base: "npm:^7.0.2" debug: "npm:4" - checksum: 10c0/7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77 + checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b languageName: node linkType: hard @@ -9419,9 +9488,9 @@ __metadata: linkType: hard "immutable@npm:^4.0.0, immutable@npm:^4.0.0-rc.1, immutable@npm:^4.3.0": - version: 4.3.5 - resolution: "immutable@npm:4.3.5" - checksum: 10c0/63d2d7908241a955d18c7822fd2215b6e89ff5a1a33cc72cd475b013cbbdef7a705aa5170a51ce9f84a57f62fdddfaa34e7b5a14b33d8a43c65cc6a881d6e894 + version: 4.3.6 + resolution: "immutable@npm:4.3.6" + checksum: 10c0/7d0952a768b4fadcee47230ed86dc9505a4517095eceaf5a47e65288571c42400c6e4a2ae21eca4eda957cb7bc50720213135b62cf6a181639111f8acae128c3 languageName: node linkType: hard @@ -9567,15 +9636,15 @@ __metadata: languageName: node linkType: hard -"intl-messageformat@npm:10.5.11, intl-messageformat@npm:^10.3.5": - version: 10.5.11 - resolution: "intl-messageformat@npm:10.5.11" +"intl-messageformat@npm:10.5.14, intl-messageformat@npm:^10.3.5": + version: 10.5.14 + resolution: "intl-messageformat@npm:10.5.14" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/ecma402-abstract": "npm:2.0.0" "@formatjs/fast-memoize": "npm:2.2.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.6" + "@formatjs/icu-messageformat-parser": "npm:2.7.8" tslib: "npm:^2.4.0" - checksum: 10c0/423f1c879ce2d0e7b9e0b4c1787a81ead7fe4d1734e0366a20fef56b06c09146e7ca3618e2e78b4f8b8f2b59cafe6237ceed21530fe0c16cfb47d915fc80222d + checksum: 10c0/8ec0a60539f67039356e211bcc8d81cf1bd9d62190a72ab0e94504da92f0242fe2f94ffb512b97cc6f63782b7891874d4038536ce04631e59d762c3441c60b4b languageName: node linkType: hard @@ -10280,16 +10349,16 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^2.3.6": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"jackspeak@npm:^3.1.2": + version: 3.1.2 + resolution: "jackspeak@npm:3.1.2" dependencies: "@isaacs/cliui": "npm:^8.0.2" "@pkgjs/parseargs": "npm:^0.11.0" dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + checksum: 10c0/5f1922a1ca0f19869e23f0dc4374c60d36e922f7926c76fecf8080cc6f7f798d6a9caac1b9428327d14c67731fd551bb3454cb270a5e13a0718f3b3660ec3d5d languageName: node linkType: hard @@ -10736,7 +10805,7 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^26.2.1, jest-worker@npm:^26.5.0": +"jest-worker@npm:^26.5.0": version: 26.6.2 resolution: "jest-worker@npm:26.6.2" dependencies: @@ -10884,36 +10953,36 @@ __metadata: linkType: hard "jsdom@npm:^24.0.0": - version: 24.0.0 - resolution: "jsdom@npm:24.0.0" + version: 24.1.0 + resolution: "jsdom@npm:24.1.0" dependencies: cssstyle: "npm:^4.0.1" data-urls: "npm:^5.0.0" decimal.js: "npm:^10.4.3" form-data: "npm:^4.0.0" html-encoding-sniffer: "npm:^4.0.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.2" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.4" is-potential-custom-element-name: "npm:^1.0.1" - nwsapi: "npm:^2.2.7" + nwsapi: "npm:^2.2.10" parse5: "npm:^7.1.2" - rrweb-cssom: "npm:^0.6.0" + rrweb-cssom: "npm:^0.7.0" saxes: "npm:^6.0.0" symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^4.1.3" + tough-cookie: "npm:^4.1.4" w3c-xmlserializer: "npm:^5.0.0" webidl-conversions: "npm:^7.0.0" whatwg-encoding: "npm:^3.1.1" whatwg-mimetype: "npm:^4.0.0" whatwg-url: "npm:^14.0.0" - ws: "npm:^8.16.0" + ws: "npm:^8.17.0" xml-name-validator: "npm:^5.0.0" peerDependencies: canvas: ^2.11.2 peerDependenciesMeta: canvas: optional: true - checksum: 10c0/7b35043d7af39ad6dcaef0fa5679d8c8a94c6c9b6cc4a79222b7c9987d57ab7150c50856684ae56b473ab28c7d82aec0fb7ca19dcbd4c3f46683c807d717a3af + checksum: 10c0/34eadd8a7ae20c1505abe7a0f3988b2f0881cce7e27d75c4f5224f440f81f8ac08f4f449695b0f4178f048ed1c1709f3594e9d3f2fe0406c28e8da6eddd44f5a languageName: node linkType: hard @@ -11103,10 +11172,10 @@ __metadata: languageName: node linkType: hard -"known-css-properties@npm:^0.30.0": - version: 0.30.0 - resolution: "known-css-properties@npm:0.30.0" - checksum: 10c0/8b487a6b33487affcec41eb392ceb77acf4d093558dde5c88b5ea06b9a3c81781876d7cb09872e0518b9602f27c8f4112c9ac333e02c90a91c8fbd12e202ed48 +"known-css-properties@npm:^0.31.0": + version: 0.31.0 + resolution: "known-css-properties@npm:0.31.0" + checksum: 10c0/8e643cbed32d7733278ba215c43dfc38fc7e77d391f66b81f07228af97d69ce2cebba03a9bc1ac859479e162aea812e258b30f4c93cb7b7adfd0622a141d36da languageName: node linkType: hard @@ -11143,14 +11212,7 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:3.0.0": - version: 3.0.0 - resolution: "lilconfig@npm:3.0.0" - checksum: 10c0/7f5ee7a658dc016cacf146815e8d88b06f06f4402823b8b0934e305a57a197f55ccc9c5cd4fb5ea1b2b821c8ccaf2d54abd59602a4931af06eabda332388d3e6 - languageName: node - linkType: hard - -"lilconfig@npm:^3.1.1": +"lilconfig@npm:^3.1.1, lilconfig@npm:~3.1.1": version: 3.1.1 resolution: "lilconfig@npm:3.1.1" checksum: 10c0/311b559794546894e3fe176663427326026c1c644145be9e8041c58e268aa9328799b8dfe7e4dd8c6a4ae305feae95a1c9e007db3569f35b42b6e1bc8274754c @@ -11165,36 +11227,36 @@ __metadata: linkType: hard "lint-staged@npm:^15.0.0": - version: 15.2.2 - resolution: "lint-staged@npm:15.2.2" + version: 15.2.5 + resolution: "lint-staged@npm:15.2.5" dependencies: - chalk: "npm:5.3.0" - commander: "npm:11.1.0" - debug: "npm:4.3.4" - execa: "npm:8.0.1" - lilconfig: "npm:3.0.0" - listr2: "npm:8.0.1" - micromatch: "npm:4.0.5" - pidtree: "npm:0.6.0" - string-argv: "npm:0.3.2" - yaml: "npm:2.3.4" + chalk: "npm:~5.3.0" + commander: "npm:~12.1.0" + debug: "npm:~4.3.4" + execa: "npm:~8.0.1" + lilconfig: "npm:~3.1.1" + listr2: "npm:~8.2.1" + micromatch: "npm:~4.0.7" + pidtree: "npm:~0.6.0" + string-argv: "npm:~0.3.2" + yaml: "npm:~2.4.2" bin: lint-staged: bin/lint-staged.js - checksum: 10c0/a1ba6c7ee53e30a0f6ea9a351d95d3d0d2be916a41b561e22907e9ea513eb18cb3dbe65bff3ec13fad15777999efe56b2e2a95427e31d12a9b7e7948c3630ee2 + checksum: 10c0/89c54489783510f86df15756659facade82e849c0cbfb564fe047b82be91c5d2b1b5608a4bfc5237bd7b9fd0e1206e66aa3e4f8cad3ac51e37a098b8492c2fa6 languageName: node linkType: hard -"listr2@npm:8.0.1": - version: 8.0.1 - resolution: "listr2@npm:8.0.1" +"listr2@npm:~8.2.1": + version: 8.2.1 + resolution: "listr2@npm:8.2.1" dependencies: cli-truncate: "npm:^4.0.0" colorette: "npm:^2.0.20" eventemitter3: "npm:^5.0.1" log-update: "npm:^6.0.0" - rfdc: "npm:^1.3.0" + rfdc: "npm:^1.3.1" wrap-ansi: "npm:^9.0.0" - checksum: 10c0/b565d6ceb3a4c2dbe0c1735c0fd907afd0d6f89de21aced8e05187b2d88ca2f8f9ebc5d743885396a00f05f13146f6be744d098a56ce0402cf1cd131485a7ff1 + checksum: 10c0/ac32cba8e5c79bcf0dbbb43c2fcc73e47902320c1fa1891074fefb3aa3dfaeef9c76348da22909f65334ba9bee1140bfc903e2f0c64427dd08ef4ba8f6b1dbd0 languageName: node linkType: hard @@ -11355,7 +11417,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": +"lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -11636,16 +11698,6 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:4.0.5, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: "npm:^3.0.2" - picomatch: "npm:^2.3.1" - checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff - languageName: node - linkType: hard - "micromatch@npm:^3.0.4, micromatch@npm:^3.1.10, micromatch@npm:^3.1.4": version: 3.1.10 resolution: "micromatch@npm:3.1.10" @@ -11667,6 +11719,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:~4.0.7": + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772 + languageName: node + linkType: hard + "miller-rabin@npm:^4.0.0": version: 4.0.1 resolution: "miller-rabin@npm:4.0.1" @@ -11788,7 +11850,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1, minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.4": version: 9.0.4 resolution: "minimatch@npm:9.0.4" dependencies: @@ -11871,10 +11933,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 10c0/6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 languageName: node linkType: hard @@ -12213,10 +12275,10 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.2.2, nwsapi@npm:^2.2.7": - version: 2.2.7 - resolution: "nwsapi@npm:2.2.7" - checksum: 10c0/44be198adae99208487a1c886c0a3712264f7bbafa44368ad96c003512fed2753d4e22890ca1e6edb2690c3456a169f2a3c33bfacde1905cf3bf01c7722464db +"nwsapi@npm:^2.2.10, nwsapi@npm:^2.2.2": + version: 2.2.10 + resolution: "nwsapi@npm:2.2.10" + checksum: 10c0/43dfa150387bd2a578e37556d0ae3330d5617f99e5a7b64e3400d4c2785620762aa6169caf8f5fbce17b7ef29c372060b602594320c374fba0a39da4163d77ed languageName: node linkType: hard @@ -12697,13 +12759,13 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.2": - version: 1.10.2 - resolution: "path-scurry@npm:1.10.2" +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" dependencies: lru-cache: "npm:^10.2.0" minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/d723777fbf9627f201e64656680f66ebd940957eebacf780e6cce1c2919c29c116678b2d7dbf8821b3a2caa758d125f4444005ccec886a25c8f324504e48e601 + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d languageName: node linkType: hard @@ -12860,10 +12922,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 languageName: node linkType: hard @@ -12874,7 +12936,7 @@ __metadata: languageName: node linkType: hard -"pidtree@npm:0.6.0": +"pidtree@npm:~0.6.0": version: 0.6.0 resolution: "pidtree@npm:0.6.0" bin: @@ -12920,7 +12982,7 @@ __metadata: languageName: node linkType: hard -"pino-abstract-transport@npm:^1.0.0, pino-abstract-transport@npm:^1.1.0, pino-abstract-transport@npm:^1.2.0": +"pino-abstract-transport@npm:^1.0.0, pino-abstract-transport@npm:^1.2.0": version: 1.2.0 resolution: "pino-abstract-transport@npm:1.2.0" dependencies: @@ -12930,25 +12992,25 @@ __metadata: languageName: node linkType: hard -"pino-http@npm:^9.0.0": - version: 9.0.0 - resolution: "pino-http@npm:9.0.0" +"pino-http@npm:^10.0.0": + version: 10.1.0 + resolution: "pino-http@npm:10.1.0" dependencies: get-caller-file: "npm:^2.0.5" - pino: "npm:^8.17.1" - pino-std-serializers: "npm:^6.2.2" + pino: "npm:^9.0.0" + pino-std-serializers: "npm:^7.0.0" process-warning: "npm:^3.0.0" - checksum: 10c0/05496cb76cc9908658e50c4620fbdf7b0b5d99fb529493d601c3e4635b0bf7ce12b8a8eed7b5b520089f643b099233d61dd71f7cdfad8b66e59b9b81d79b6512 + checksum: 10c0/d97691f2ee248b0aca0e49169d0c7ca0d4c604ee57b63ae264a6f9914fc7277cace74686d5088a876f8152a8d5b8211af904b2d24a516728a662de0e9cc79e9f languageName: node linkType: hard "pino-pretty@npm:^11.0.0": - version: 11.0.0 - resolution: "pino-pretty@npm:11.0.0" + version: 11.1.0 + resolution: "pino-pretty@npm:11.1.0" dependencies: colorette: "npm:^2.0.7" dateformat: "npm:^4.6.3" - fast-copy: "npm:^3.0.0" + fast-copy: "npm:^3.0.2" fast-safe-stringify: "npm:^2.1.1" help-me: "npm:^5.0.0" joycon: "npm:^3.1.1" @@ -12958,60 +13020,39 @@ __metadata: pump: "npm:^3.0.0" readable-stream: "npm:^4.0.0" secure-json-parse: "npm:^2.4.0" - sonic-boom: "npm:^3.0.0" + sonic-boom: "npm:^4.0.1" strip-json-comments: "npm:^3.1.1" bin: pino-pretty: bin.js - checksum: 10c0/d42213f3fdf19d92152b0a14683b2bb8443423739c81ab7c1181a5dac0e0ca7621d232c8264ece81edc01106ca2a8e165783daca0a902f0fde480027075d5540 + checksum: 10c0/418be6f854b0d62c83c65e75b0969d5311792bfadeefbfe77d8a7f8c5ba26b8bea40f549222b5f500439f440eb4d6c2fa99d712bdd02881ebae7be3a0193b581 languageName: node linkType: hard -"pino-std-serializers@npm:^6.0.0, pino-std-serializers@npm:^6.2.2": - version: 6.2.2 - resolution: "pino-std-serializers@npm:6.2.2" - checksum: 10c0/8f1c7f0f0d8f91e6c6b5b2a6bfb48f06441abeb85f1c2288319f736f9c6d814fbeebe928d2314efc2ba6018fa7db9357a105eca9fc99fc1f28945a8a8b28d3d5 - languageName: node - linkType: hard - -"pino@npm:^8.17.1": - version: 8.20.0 - resolution: "pino@npm:8.20.0" - dependencies: - atomic-sleep: "npm:^1.0.0" - fast-redact: "npm:^3.1.1" - on-exit-leak-free: "npm:^2.1.0" - pino-abstract-transport: "npm:^1.1.0" - pino-std-serializers: "npm:^6.0.0" - process-warning: "npm:^3.0.0" - quick-format-unescaped: "npm:^4.0.3" - real-require: "npm:^0.2.0" - safe-stable-stringify: "npm:^2.3.1" - sonic-boom: "npm:^3.7.0" - thread-stream: "npm:^2.0.0" - bin: - pino: bin.js - checksum: 10c0/6b973474160e1fa01fa150de0f69b7db9c6c06ae15f992d369669751825c8f2af3bb5600348eaf9be65b4952326bbdfa226f51e425820eb511f0f594fbddbaa7 +"pino-std-serializers@npm:^7.0.0": + version: 7.0.0 + resolution: "pino-std-serializers@npm:7.0.0" + checksum: 10c0/73e694d542e8de94445a03a98396cf383306de41fd75ecc07085d57ed7a57896198508a0dec6eefad8d701044af21eb27253ccc352586a03cf0d4a0bd25b4133 languageName: node linkType: hard "pino@npm:^9.0.0": - version: 9.0.0 - resolution: "pino@npm:9.0.0" + version: 9.1.0 + resolution: "pino@npm:9.1.0" dependencies: atomic-sleep: "npm:^1.0.0" fast-redact: "npm:^3.1.1" on-exit-leak-free: "npm:^2.1.0" pino-abstract-transport: "npm:^1.2.0" - pino-std-serializers: "npm:^6.0.0" + pino-std-serializers: "npm:^7.0.0" process-warning: "npm:^3.0.0" quick-format-unescaped: "npm:^4.0.3" real-require: "npm:^0.2.0" safe-stable-stringify: "npm:^2.3.1" - sonic-boom: "npm:^3.7.0" - thread-stream: "npm:^2.6.0" + sonic-boom: "npm:^4.0.1" + thread-stream: "npm:^3.0.0" bin: pino: bin.js - checksum: 10c0/10ef10aee0cf80af8ed83468cff2e29d642b6794b53cf641e1abcaf9e9958d8bcbc6e09d62757054aef3b4415c45d66a5018da11d43b81a23ba299ef5dc4e8b1 + checksum: 10c0/d060530ae2e4e8f21d04bb0f44f009f94d207d7f4337f508f618416514214ddaf1b29f8c5c265153a19ce3b6480b451461f40020f916ace9d53a5aa07624b79c languageName: node linkType: hard @@ -13099,18 +13140,18 @@ __metadata: languageName: node linkType: hard -"postcss-color-functional-notation@npm:^6.0.9": - version: 6.0.9 - resolution: "postcss-color-functional-notation@npm:6.0.9" +"postcss-color-functional-notation@npm:^6.0.11": + version: 6.0.11 + resolution: "postcss-color-functional-notation@npm:6.0.11" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/120f7bc23bf46dd1c008b3aa806fb02dd988ae180f9c0c10dca9f5ea3473bf20d7743aafae1441df5b4a3945a63ebb0dae1d4d55f7c8bcd34540529b627c4e3e + checksum: 10c0/7fd75e6881cf62f536f79dfc0ae1b709ea0b8b84833cce1671372711f6019ab4360c6a17089b654b2d376b87e7f9455b94f0d13b45ab0ab767e547b604709b3d languageName: node linkType: hard @@ -13164,46 +13205,46 @@ __metadata: languageName: node linkType: hard -"postcss-custom-media@npm:^10.0.4": - version: 10.0.4 - resolution: "postcss-custom-media@npm:10.0.4" +"postcss-custom-media@npm:^10.0.6": + version: 10.0.6 + resolution: "postcss-custom-media@npm:10.0.6" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^1.0.9" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" - "@csstools/media-query-list-parser": "npm:^2.1.9" + "@csstools/cascade-layer-name-parser": "npm:^1.0.11" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" + "@csstools/media-query-list-parser": "npm:^2.1.11" peerDependencies: postcss: ^8.4 - checksum: 10c0/2384a40f0e38abe92fbfc707000b264e4bdfe65bd0086ab18c6aab71049198f9dd1431bc4f9bbf68f7cca86b4ff0da352bac4a6ecd04e3671b7ddf6ed6ec3d04 + checksum: 10c0/98a524bc46b780a86094bbe8007f1e577137da5490823631a683d4b3df4a13e40c5e1ab52380275a54f7011abfd98bb597c6293d964c14f9f22ec6cf9d75c550 languageName: node linkType: hard -"postcss-custom-properties@npm:^13.3.8": - version: 13.3.8 - resolution: "postcss-custom-properties@npm:13.3.8" +"postcss-custom-properties@npm:^13.3.10": + version: 13.3.10 + resolution: "postcss-custom-properties@npm:13.3.10" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^1.0.9" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/cascade-layer-name-parser": "npm:^1.0.11" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/utilities": "npm:^1.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/03dd1918f897005b23d09615ebb2c3faf4a01cac67462069c9cfa87c024b2a878f64948b0cf668971bc0ca00cfc349080879b3864deb3808a32d52ff2b473319 + checksum: 10c0/52688fd0aaadccfdf4a3d86d3a2ab988163e8108088c5e33fc9145d261f75b92b8321c044a8161345abda10df5715d674330309dcc0c17f2980db5515f6a76d6 languageName: node linkType: hard -"postcss-custom-selectors@npm:^7.1.8": - version: 7.1.8 - resolution: "postcss-custom-selectors@npm:7.1.8" +"postcss-custom-selectors@npm:^7.1.10": + version: 7.1.10 + resolution: "postcss-custom-selectors@npm:7.1.10" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^1.0.9" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/cascade-layer-name-parser": "npm:^1.0.11" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" postcss-selector-parser: "npm:^6.0.13" peerDependencies: postcss: ^8.4 - checksum: 10c0/6a7d8248342177a222821531ea3b4008764362e4f7e8f7f2d5767e5880c37ffa39ac5adced2c686baeb9c1f4ed4c283fcc8a8d30ef3b4fc5f63d4ef9a691285e + checksum: 10c0/11311ae6f306420223c6bf926fb1798738f3aa525a267de204de8e8ee9de467bf63b580d9ad5dbb0fff4bd9266770a3fa7e27a24af08a2e0a4115d0727d1d043 languageName: node linkType: hard @@ -13319,18 +13360,18 @@ __metadata: languageName: node linkType: hard -"postcss-lab-function@npm:^6.0.14": - version: 6.0.14 - resolution: "postcss-lab-function@npm:6.0.14" +"postcss-lab-function@npm:^6.0.16": + version: 6.0.16 + resolution: "postcss-lab-function@npm:6.0.16" dependencies: - "@csstools/css-color-parser": "npm:^2.0.0" - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" + "@csstools/css-color-parser": "npm:^2.0.2" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/0b5d998ddb98ec6243448f1eca216f6e23872431885b152843feef1e844fc5b6b3ebe16ea8940f3d6abea732aa0c51b2ec0e57437e4326e5b2cb2bcb949e6d9f + checksum: 10c0/ba8717cd8a197ec17acaac1b61631cd4403f07bd406b0c92f2e430a55e3f786cd6c338b626c3326e9178a0f3e58ff838ebaded19f480f39197a9cb17349ecdcd languageName: node linkType: hard @@ -13486,16 +13527,16 @@ __metadata: languageName: node linkType: hard -"postcss-nesting@npm:^12.1.2": - version: 12.1.2 - resolution: "postcss-nesting@npm:12.1.2" +"postcss-nesting@npm:^12.1.5": + version: 12.1.5 + resolution: "postcss-nesting@npm:12.1.5" dependencies: "@csstools/selector-resolve-nested": "npm:^1.1.0" - "@csstools/selector-specificity": "npm:^3.0.3" - postcss-selector-parser: "npm:^6.0.13" + "@csstools/selector-specificity": "npm:^3.1.1" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/39d1d100f61863f904393b17169be83cdf82bd50d530efb3e3ae0c7b0f838b254e10e5d12e25119cf31dce9e351a2b770a03f9b2029ff33bef0ec924c0d2f642 + checksum: 10c0/8f049fe24dccb186707e065ffb697f9f0633a03b0e1139e9c24656f3d2158a738a51c7b1f405b48fdb8b4f19515ad4ad9d3cd4ec9d9fe1dd4e5f18729bf8e589 languageName: node linkType: hard @@ -13650,52 +13691,52 @@ __metadata: linkType: hard "postcss-preset-env@npm:^9.5.2": - version: 9.5.9 - resolution: "postcss-preset-env@npm:9.5.9" + version: 9.5.14 + resolution: "postcss-preset-env@npm:9.5.14" dependencies: - "@csstools/postcss-cascade-layers": "npm:^4.0.4" - "@csstools/postcss-color-function": "npm:^3.0.14" - "@csstools/postcss-color-mix-function": "npm:^2.0.14" - "@csstools/postcss-exponential-functions": "npm:^1.0.5" + "@csstools/postcss-cascade-layers": "npm:^4.0.6" + "@csstools/postcss-color-function": "npm:^3.0.16" + "@csstools/postcss-color-mix-function": "npm:^2.0.16" + "@csstools/postcss-exponential-functions": "npm:^1.0.7" "@csstools/postcss-font-format-keywords": "npm:^3.0.2" - "@csstools/postcss-gamut-mapping": "npm:^1.0.7" - "@csstools/postcss-gradients-interpolation-method": "npm:^4.0.15" - "@csstools/postcss-hwb-function": "npm:^3.0.13" + "@csstools/postcss-gamut-mapping": "npm:^1.0.9" + "@csstools/postcss-gradients-interpolation-method": "npm:^4.0.17" + "@csstools/postcss-hwb-function": "npm:^3.0.15" "@csstools/postcss-ic-unit": "npm:^3.0.6" "@csstools/postcss-initial": "npm:^1.0.1" - "@csstools/postcss-is-pseudo-class": "npm:^4.0.6" - "@csstools/postcss-light-dark-function": "npm:^1.0.3" + "@csstools/postcss-is-pseudo-class": "npm:^4.0.8" + "@csstools/postcss-light-dark-function": "npm:^1.0.5" "@csstools/postcss-logical-float-and-clear": "npm:^2.0.1" "@csstools/postcss-logical-overflow": "npm:^1.0.1" "@csstools/postcss-logical-overscroll-behavior": "npm:^1.0.1" "@csstools/postcss-logical-resize": "npm:^2.0.1" - "@csstools/postcss-logical-viewport-units": "npm:^2.0.7" - "@csstools/postcss-media-minmax": "npm:^1.1.4" - "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^2.0.7" + "@csstools/postcss-logical-viewport-units": "npm:^2.0.9" + "@csstools/postcss-media-minmax": "npm:^1.1.6" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^2.0.9" "@csstools/postcss-nested-calc": "npm:^3.0.2" "@csstools/postcss-normalize-display-values": "npm:^3.0.2" - "@csstools/postcss-oklab-function": "npm:^3.0.14" + "@csstools/postcss-oklab-function": "npm:^3.0.16" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" - "@csstools/postcss-relative-color-syntax": "npm:^2.0.14" + "@csstools/postcss-relative-color-syntax": "npm:^2.0.16" "@csstools/postcss-scope-pseudo-class": "npm:^3.0.1" - "@csstools/postcss-stepped-value-functions": "npm:^3.0.6" + "@csstools/postcss-stepped-value-functions": "npm:^3.0.8" "@csstools/postcss-text-decoration-shorthand": "npm:^3.0.6" - "@csstools/postcss-trigonometric-functions": "npm:^3.0.6" + "@csstools/postcss-trigonometric-functions": "npm:^3.0.8" "@csstools/postcss-unset-value": "npm:^3.0.1" autoprefixer: "npm:^10.4.19" browserslist: "npm:^4.22.3" css-blank-pseudo: "npm:^6.0.2" - css-has-pseudo: "npm:^6.0.3" + css-has-pseudo: "npm:^6.0.5" css-prefers-color-scheme: "npm:^9.0.1" cssdb: "npm:^8.0.0" postcss-attribute-case-insensitive: "npm:^6.0.3" postcss-clamp: "npm:^4.1.0" - postcss-color-functional-notation: "npm:^6.0.9" + postcss-color-functional-notation: "npm:^6.0.11" postcss-color-hex-alpha: "npm:^9.0.4" postcss-color-rebeccapurple: "npm:^9.0.3" - postcss-custom-media: "npm:^10.0.4" - postcss-custom-properties: "npm:^13.3.8" - postcss-custom-selectors: "npm:^7.1.8" + postcss-custom-media: "npm:^10.0.6" + postcss-custom-properties: "npm:^13.3.10" + postcss-custom-selectors: "npm:^7.1.10" postcss-dir-pseudo-class: "npm:^8.0.1" postcss-double-position-gradients: "npm:^5.0.6" postcss-focus-visible: "npm:^9.0.1" @@ -13703,9 +13744,9 @@ __metadata: postcss-font-variant: "npm:^5.0.0" postcss-gap-properties: "npm:^5.0.1" postcss-image-set-function: "npm:^6.0.3" - postcss-lab-function: "npm:^6.0.14" + postcss-lab-function: "npm:^6.0.16" postcss-logical: "npm:^7.0.1" - postcss-nesting: "npm:^12.1.2" + postcss-nesting: "npm:^12.1.5" postcss-opacity-percentage: "npm:^2.0.0" postcss-overflow-shorthand: "npm:^5.0.1" postcss-page-break: "npm:^3.0.4" @@ -13715,7 +13756,7 @@ __metadata: postcss-selector-not: "npm:^7.0.2" peerDependencies: postcss: ^8.4 - checksum: 10c0/dbe020e3fc08f0b71a3ee9d3c8a66a93bb6ba62281ac89fa59c82b8632ca58d6a911ddd9c65f15355c36aad63477633fc101cc0f3ce494dbc757193ba42eb61c + checksum: 10c0/8e0c8f5c2e7b8385a770c13185986dc50d7a73b10b98c65c2f86bb4cd2860de722caef8172b1676962dafbbc044d6be1955f2a092e951976a30d4ee33b0d7571 languageName: node linkType: hard @@ -13798,13 +13839,13 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.0.16 - resolution: "postcss-selector-parser@npm:6.0.16" +"postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-selector-parser@npm:6.1.0" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/0e11657cb3181aaf9ff67c2e59427c4df496b4a1b6a17063fae579813f80af79d444bf38f82eeb8b15b4679653fd3089e66ef0283f9aab01874d885e6cf1d2cf + checksum: 10c0/91e9c6434772506bc7f318699dd9d19d32178b52dfa05bed24cb0babbdab54f8fb765d9920f01ac548be0a642aab56bce493811406ceb00ae182bbb53754c473 languageName: node linkType: hard @@ -14214,14 +14255,14 @@ __metadata: linkType: hard "react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.0" + scheduler: "npm:^0.23.2" peerDependencies: - react: ^18.2.0 - checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a + react: ^18.3.1 + checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 languageName: node linkType: hard @@ -14298,18 +14339,18 @@ __metadata: linkType: hard "react-intl@npm:^6.4.2": - version: 6.6.5 - resolution: "react-intl@npm:6.6.5" + version: 6.6.8 + resolution: "react-intl@npm:6.6.8" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.2" - "@formatjs/icu-messageformat-parser": "npm:2.7.6" - "@formatjs/intl": "npm:2.10.1" - "@formatjs/intl-displaynames": "npm:6.6.6" - "@formatjs/intl-listformat": "npm:7.5.5" + "@formatjs/ecma402-abstract": "npm:2.0.0" + "@formatjs/icu-messageformat-parser": "npm:2.7.8" + "@formatjs/intl": "npm:2.10.4" + "@formatjs/intl-displaynames": "npm:6.6.8" + "@formatjs/intl-listformat": "npm:7.5.7" "@types/hoist-non-react-statics": "npm:^3.3.1" "@types/react": "npm:16 || 17 || 18" hoist-non-react-statics: "npm:^3.3.2" - intl-messageformat: "npm:10.5.11" + intl-messageformat: "npm:10.5.14" tslib: "npm:^2.4.0" peerDependencies: react: ^16.6.0 || 17 || 18 @@ -14317,14 +14358,14 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/31f231701af080bc923fdf25ff22ae7ad56bd7892602879fe6fa3de0c6ab95aab10ff86595372be155e0be45a7130a2cca91dbab73e558359cebc1785711ded2 + checksum: 10c0/7673507eb73ad4edd1593da7173cec68f316cf77037e0959900babd32d5984a39ba7fa10aaa0a23bcddb7b98daf7dd007cb73ddfc39127ede87c18ec780a519c languageName: node linkType: hard -"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.2.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: 10c0/6eb5e4b28028c23e2bfcf73371e72cd4162e4ac7ab445ddae2afe24e347a37d6dc22fae6e1748632cd43c6d4f9b8f86dcf26bf9275e1874f436d129952528ae0 +"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.3.1": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 languageName: node linkType: hard @@ -14408,24 +14449,21 @@ __metadata: linkType: hard "react-redux@npm:^9.0.4": - version: 9.1.1 - resolution: "react-redux@npm:9.1.1" + version: 9.1.2 + resolution: "react-redux@npm:9.1.2" dependencies: "@types/use-sync-external-store": "npm:^0.0.3" use-sync-external-store: "npm:^1.0.0" peerDependencies: "@types/react": ^18.2.25 react: ^18.0 - react-native: ">=0.69" redux: ^5.0.0 peerDependenciesMeta: "@types/react": optional: true - react-native: - optional: true redux: optional: true - checksum: 10c0/40ccdc8d48aefeed02c025f46e4a2e6641a2996fe985feb70d25feaaf8f101f6ef937cd1420909cad4c8869a8c79323ee071f5b090b011b950e5ae09100f5767 + checksum: 10c0/56ac98228e011b26e0202346af9c8dd408ad5ea8235d8761c8e05ea0953b8ca801cdf9d1f481fdec7b285d7f30ceef7238b46b3df7636ef77dd5c2ea8c5be5b2 languageName: node linkType: hard @@ -14573,15 +14611,15 @@ __metadata: linkType: hard "react-test-renderer@npm:^18.2.0": - version: 18.2.0 - resolution: "react-test-renderer@npm:18.2.0" + version: 18.3.1 + resolution: "react-test-renderer@npm:18.3.1" dependencies: - react-is: "npm:^18.2.0" + react-is: "npm:^18.3.1" react-shallow-renderer: "npm:^16.15.0" - scheduler: "npm:^0.23.0" + scheduler: "npm:^0.23.2" peerDependencies: - react: ^18.2.0 - checksum: 10c0/53dfada1da1e8dd0498a5601e9eea3dc6ca23c6c2694d1cab9712faea869c11e4ce1c9a618d674cb668a668b41fb6bcf9a7b0a078cd853b1922f002fa22f42c8 + react: ^18.3.1 + checksum: 10c0/c633558ef9af33bc68f0c4dbb5163a004c4fb9eade7bd0a7cfc0355fb367f36bd9d96533c90b7e85a146be6c525113a15f58683d269e0177ad77e2b04d4fe51c languageName: node linkType: hard @@ -14627,11 +14665,11 @@ __metadata: linkType: hard "react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: loose-envify: "npm:^1.1.0" - checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 + checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 languageName: node linkType: hard @@ -14931,10 +14969,10 @@ __metadata: languageName: node linkType: hard -"reselect@npm:^5.0.1": - version: 5.0.1 - resolution: "reselect@npm:5.0.1" - checksum: 10c0/0724b4555cd6411849de334a75177780f127af849eb71c4b709966d07ade8090d125c0c926dc6cf936866d23ebadda6aad1da93cd8340525323b889f25d56d51 +"reselect@npm:^5.1.0": + version: 5.1.0 + resolution: "reselect@npm:5.1.0" + checksum: 10c0/b0ed789f4f6f10dfbd23741823726793384932969aa7ce8f584c882ad87620a02b09b5d1146cd2ea6eaa0953b3fd9f7df22f113893af73f35f28432a8a4294de languageName: node linkType: hard @@ -15015,7 +15053,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.4": +"resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -15041,7 +15079,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -15098,10 +15136,10 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: 10c0/a17fd7b81f42c7ae4cb932abd7b2f677b04cc462a03619fb46945ae1ccae17c3bc87c020ffdde1751cbfa8549860a2883486fdcabc9b9de3f3108af32b69a667 +"rfdc@npm:^1.3.1": + version: 1.3.1 + resolution: "rfdc@npm:1.3.1" + checksum: 10c0/69f65e3ed30970f8055fac9fbbef9ce578800ca19554eab1dcbffe73a4b8aef536bc4248313889cf25e3b4e38b212c721eabe30856575bf2b2bc3d90f8ba93ef languageName: node linkType: hard @@ -15148,20 +15186,6 @@ __metadata: languageName: node linkType: hard -"rollup-plugin-terser@npm:^7.0.0": - version: 7.0.2 - resolution: "rollup-plugin-terser@npm:7.0.2" - dependencies: - "@babel/code-frame": "npm:^7.10.4" - jest-worker: "npm:^26.2.1" - serialize-javascript: "npm:^4.0.0" - terser: "npm:^5.0.0" - peerDependencies: - rollup: ^2.0.0 - checksum: 10c0/f79b851c6f7b06555d3a8ce7a4e32abd2b7cb8318e89fb8db73e662fa6e3af1a59920e881d111efc65a7437fd9582b61b1f4859b6fd839ba948616829d92432d - languageName: node - linkType: hard - "rollup@npm:^2.43.1": version: 2.79.1 resolution: "rollup@npm:2.79.1" @@ -15183,6 +15207,13 @@ __metadata: languageName: node linkType: hard +"rrweb-cssom@npm:^0.7.0": + version: 0.7.0 + resolution: "rrweb-cssom@npm:0.7.0" + checksum: 10c0/278350b1f383f76db20e37394361b709740bd4f5f27f924e1c3c3fdd7112b2ae37ed9bc7cee63776f7df395b9b0f644d1f8be104990e3028d276a3288cd7e564 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -15278,15 +15309,15 @@ __metadata: linkType: hard "sass@npm:^1.62.1": - version: 1.75.0 - resolution: "sass@npm:1.75.0" + version: 1.77.2 + resolution: "sass@npm:1.77.2" dependencies: chokidar: "npm:>=3.0.0 <4.0.0" immutable: "npm:^4.0.0" source-map-js: "npm:>=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 10c0/1564ab2c8041c99a330cec93127fe8abcf65ac63eecb471610ed7f3126a2599a58b788a3a98eb8719f7f40b9b04e00c92bc9e11a9c2180ad582b8cba9fb030b0 + checksum: 10c0/0d292339064de3c902e209d41de9c4eb2038cff326476aeebbb5be3eee1d23400d975face2b8e124ae617b10af3e93bec01580f61912f34e4c517fe137a118b6 languageName: node linkType: hard @@ -15306,12 +15337,12 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: "npm:^1.1.0" - checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd + checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 languageName: node linkType: hard @@ -15399,14 +15430,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": - version: 7.6.0 - resolution: "semver@npm:7.6.0" - dependencies: - lru-cache: "npm:^6.0.0" +"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.1": + version: 7.6.2 + resolution: "semver@npm:7.6.2" bin: semver: bin/semver.js - checksum: 10c0/fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 + checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c languageName: node linkType: hard @@ -15431,15 +15460,6 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^4.0.0": - version: 4.0.0 - resolution: "serialize-javascript@npm:4.0.0" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 10c0/510dfe7f0311c0b2f7ab06311afa1668ba2969ab2f1faaac0a4924ede76b7f22ba85cfdeaa0052ec5a047bca42c8cd8ac8df8f0efe52f9bd290b3a39ae69fe9d - languageName: node - linkType: hard - "serialize-javascript@npm:^5.0.1": version: 5.0.1 resolution: "serialize-javascript@npm:5.0.1" @@ -15449,6 +15469,15 @@ __metadata: languageName: node linkType: hard +"serialize-javascript@npm:^6.0.1": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 + languageName: node + linkType: hard + "serve-index@npm:^1.9.1": version: 1.9.1 resolution: "serve-index@npm:1.9.1" @@ -15689,6 +15718,13 @@ __metadata: languageName: node linkType: hard +"smob@npm:^1.0.0": + version: 1.5.0 + resolution: "smob@npm:1.5.0" + checksum: 10c0/a1067f23265812de8357ed27312101af49b89129eb973e3f26ab5856ea774f88cace13342e66e32470f933ccfa916e0e9d0f7ca8bbd4f92dfab2af45c15956c2 + languageName: node + linkType: hard + "snapdragon-node@npm:^2.0.1": version: 2.1.1 resolution: "snapdragon-node@npm:2.1.1" @@ -15770,12 +15806,12 @@ __metadata: languageName: node linkType: hard -"sonic-boom@npm:^3.0.0, sonic-boom@npm:^3.7.0": - version: 3.7.0 - resolution: "sonic-boom@npm:3.7.0" +"sonic-boom@npm:^4.0.1": + version: 4.0.1 + resolution: "sonic-boom@npm:4.0.1" dependencies: atomic-sleep: "npm:^1.0.0" - checksum: 10c0/57a3d560efb77f4576db111168ee2649c99e7869fda6ce0ec2a4e5458832d290ba58d74b073ddb5827d9a30f96d23cff79157993d919e1a6d5f28d8b6391c7f0 + checksum: 10c0/7b467f2bc8af7ff60bf210382f21c59728cc4b769af9b62c31dd88723f5cc472752d2320736cc366acc7c765ddd5bec3072c033b0faf249923f576a7453ba9d3 languageName: node linkType: hard @@ -16076,7 +16112,7 @@ __metadata: languageName: node linkType: hard -"string-argv@npm:0.3.2": +"string-argv@npm:~0.3.2": version: 0.3.2 resolution: "string-argv@npm:0.3.2" checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 @@ -16400,18 +16436,18 @@ __metadata: linkType: hard "stylelint@npm:^16.0.2": - version: 16.3.1 - resolution: "stylelint@npm:16.3.1" + version: 16.6.0 + resolution: "stylelint@npm:16.6.0" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.6.1" - "@csstools/css-tokenizer": "npm:^2.2.4" - "@csstools/media-query-list-parser": "npm:^2.1.9" - "@csstools/selector-specificity": "npm:^3.0.2" - "@dual-bundle/import-meta-resolve": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^2.6.3" + "@csstools/css-tokenizer": "npm:^2.3.1" + "@csstools/media-query-list-parser": "npm:^2.1.11" + "@csstools/selector-specificity": "npm:^3.1.1" + "@dual-bundle/import-meta-resolve": "npm:^4.1.0" balanced-match: "npm:^2.0.0" colord: "npm:^2.9.3" cosmiconfig: "npm:^9.0.0" - css-functions-list: "npm:^3.2.1" + css-functions-list: "npm:^3.2.2" css-tree: "npm:^2.3.1" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" @@ -16424,27 +16460,27 @@ __metadata: ignore: "npm:^5.3.1" imurmurhash: "npm:^0.1.4" is-plain-object: "npm:^5.0.0" - known-css-properties: "npm:^0.30.0" + known-css-properties: "npm:^0.31.0" mathml-tag-names: "npm:^2.1.3" meow: "npm:^13.2.0" micromatch: "npm:^4.0.5" normalize-path: "npm:^3.0.0" - picocolors: "npm:^1.0.0" + picocolors: "npm:^1.0.1" postcss: "npm:^8.4.38" postcss-resolve-nested-selector: "npm:^0.1.1" postcss-safe-parser: "npm:^7.0.0" - postcss-selector-parser: "npm:^6.0.16" + postcss-selector-parser: "npm:^6.1.0" postcss-value-parser: "npm:^4.2.0" resolve-from: "npm:^5.0.0" string-width: "npm:^4.2.3" strip-ansi: "npm:^7.1.0" supports-hyperlinks: "npm:^3.0.0" svg-tags: "npm:^1.0.0" - table: "npm:^6.8.1" + table: "npm:^6.8.2" write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/1660bb359002ff8e07cea044018b13abc73f48cf02a5062953b086f4d58611cd10677787560774c1acabeb192b6d059ce7fcf4c11defa7f64e50dca908fc664f + checksum: 10c0/acfb7983a0b71677d066b2aa570eefdac0a7be2e21351bac8884b8156deaeec19e53ad128ae7ae7933c79f6045f1de8d759ba06cfbc373b2711015860805a3e7 languageName: node linkType: hard @@ -16576,16 +16612,16 @@ __metadata: languageName: node linkType: hard -"table@npm:^6.8.1": - version: 6.8.1 - resolution: "table@npm:6.8.1" +"table@npm:^6.8.2": + version: 6.8.2 + resolution: "table@npm:6.8.2" dependencies: ajv: "npm:^8.0.1" lodash.truncate: "npm:^4.4.2" slice-ansi: "npm:^4.0.0" string-width: "npm:^4.2.3" strip-ansi: "npm:^6.0.1" - checksum: 10c0/591ed84b2438b01c9bc02248e2238e21e8bfb73654bc5acca0d469053eb39be3db2f57d600dcf08ac983b6f50f80842c44612c03877567c2afee3aec4a033e5f + checksum: 10c0/f8b348af38ee34e419d8ce7306ba00671ce6f20e861ccff22555f491ba264e8416086063ce278a8d81abfa8d23b736ec2cca7ac4029b5472f63daa4b4688b803 languageName: node linkType: hard @@ -16664,9 +16700,9 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.0.0, terser@npm:^5.3.4": - version: 5.19.4 - resolution: "terser@npm:5.19.4" +"terser@npm:^5.17.4, terser@npm:^5.3.4": + version: 5.31.0 + resolution: "terser@npm:5.31.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -16674,7 +16710,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/39c6687609f5b9061f2fb82bee02d2f9d7756fcb5bd50c67da1482f52cf5977e03e0c5df5cb4ce17e549428024c8859075137c461ec4a9ae8cf91a505759255a + checksum: 10c0/cb127a579b03fb9dcee0d293ff24814deedcd430f447933b618e8593b7454f615b5c8493c68e86a4b0188769d5ea2af5251b5d507edb208114f7e8aebdc7c850 languageName: node linkType: hard @@ -16724,12 +16760,12 @@ __metadata: languageName: node linkType: hard -"thread-stream@npm:^2.0.0, thread-stream@npm:^2.6.0": - version: 2.6.0 - resolution: "thread-stream@npm:2.6.0" +"thread-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "thread-stream@npm:3.0.0" dependencies: real-require: "npm:^0.2.0" - checksum: 10c0/276e2545b33273232eb2c22c53fc11844951c1322f8a78c522477af716ebcfe0d106ccf1fbc455f6e48d928e93231fed6377ce91fdcb3885086e8ffa1f011c88 + checksum: 10c0/1f4da5a8c93b170cdc7c1ad774af49bb2af43f73cfd9a7f8fb02b766255b483eb6d0b734502c880397baa95c0ce3490088b9a487cff32d4e481aab6fe76560f5 languageName: node linkType: hard @@ -16845,15 +16881,15 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.1.2, tough-cookie@npm:^4.1.3": - version: 4.1.3 - resolution: "tough-cookie@npm:4.1.3" +"tough-cookie@npm:^4.1.2, tough-cookie@npm:^4.1.4": + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" dependencies: psl: "npm:^1.1.33" punycode: "npm:^2.1.1" universalify: "npm:^0.2.0" url-parse: "npm:^1.5.3" - checksum: 10c0/4fc0433a0cba370d57c4b240f30440c848906dee3180bb6e85033143c2726d322e7e4614abb51d42d111ebec119c4876ed8d7247d4113563033eebbc1739c831 + checksum: 10c0/aca7ff96054f367d53d1e813e62ceb7dd2eda25d7752058a74d64b7266fd07be75908f3753a32ccf866a2f997604b414cfb1916d6e7f69bc64d9d9939b0d6c45 languageName: node linkType: hard @@ -17348,12 +17384,12 @@ __metadata: linkType: hard "utf-8-validate@npm:^6.0.3": - version: 6.0.3 - resolution: "utf-8-validate@npm:6.0.3" + version: 6.0.4 + resolution: "utf-8-validate@npm:6.0.4" dependencies: node-gyp: "npm:latest" node-gyp-build: "npm:^4.3.0" - checksum: 10c0/2ca08b07f4070540b33ff15f3f0632fa30baaee8a766fff993be47b4829b4fb30fd36fdf1270336324d03f65e0936c4608ee719d862230d75311751dcfe27a83 + checksum: 10c0/f7042d94aec6ca02461b64e725bdc7262266610dbb787331e5bbd49374ef6f75fe9900600df3fc63d97906c23614a965c8989b4bf95d70bf35dc617da99215e7 languageName: node linkType: hard @@ -17967,36 +18003,37 @@ __metadata: languageName: node linkType: hard -"workbox-background-sync@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-background-sync@npm:7.0.0" +"workbox-background-sync@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-background-sync@npm:7.1.0" dependencies: idb: "npm:^7.0.1" - workbox-core: "npm:7.0.0" - checksum: 10c0/91eb064c608cfb4cf7aa4f062215d8217a99b93d67c4ae571e5abdda1b020c5ab45c7bddab99cb77d334aae8d259f0fe91b7c42ee6e7ad10db32b4a971991489 + workbox-core: "npm:7.1.0" + checksum: 10c0/9538c49a377d8eb06acee3848fbca09bac1940a2ca9e904fed765c39aa32f77c20d72c3ba6fa1eb47bee81289b1d527556a1cd3e02728960a4c40400ce6d0e91 languageName: node linkType: hard -"workbox-broadcast-update@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-broadcast-update@npm:7.0.0" +"workbox-broadcast-update@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-broadcast-update@npm:7.1.0" dependencies: - workbox-core: "npm:7.0.0" - checksum: 10c0/3c3a6e1e72c19d2971d187297b99b242f304b1ec442f6f1ec84ea9c6e125dc01cd626d51e6ecf1c8d89226e6a286dccaa9f950bd5ef6183518af10ba0f4f524e + workbox-core: "npm:7.1.0" + checksum: 10c0/4a6e201cedcbc11b9d2f63f63477ba4564a35ce07bd54640198db6ff6a3b8347a65e0b4973c8f8463e8a622fd1ad93d7b3bab42338608811d23c7db01fef475e languageName: node linkType: hard -"workbox-build@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-build@npm:7.0.0" +"workbox-build@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-build@npm:7.1.0" dependencies: "@apideck/better-ajv-errors": "npm:^0.3.1" - "@babel/core": "npm:^7.11.1" + "@babel/core": "npm:^7.24.4" "@babel/preset-env": "npm:^7.11.0" "@babel/runtime": "npm:^7.11.2" "@rollup/plugin-babel": "npm:^5.2.0" - "@rollup/plugin-node-resolve": "npm:^11.2.1" + "@rollup/plugin-node-resolve": "npm:^15.2.3" "@rollup/plugin-replace": "npm:^2.4.1" + "@rollup/plugin-terser": "npm:^0.4.3" "@surma/rollup-plugin-off-main-thread": "npm:^2.2.3" ajv: "npm:^8.6.0" common-tags: "npm:^1.8.0" @@ -18006,169 +18043,168 @@ __metadata: lodash: "npm:^4.17.20" pretty-bytes: "npm:^5.3.0" rollup: "npm:^2.43.1" - rollup-plugin-terser: "npm:^7.0.0" source-map: "npm:^0.8.0-beta.0" stringify-object: "npm:^3.3.0" strip-comments: "npm:^2.0.1" tempy: "npm:^0.6.0" upath: "npm:^1.2.0" - workbox-background-sync: "npm:7.0.0" - workbox-broadcast-update: "npm:7.0.0" - workbox-cacheable-response: "npm:7.0.0" - workbox-core: "npm:7.0.0" - workbox-expiration: "npm:7.0.0" - workbox-google-analytics: "npm:7.0.0" - workbox-navigation-preload: "npm:7.0.0" - workbox-precaching: "npm:7.0.0" - workbox-range-requests: "npm:7.0.0" - workbox-recipes: "npm:7.0.0" - workbox-routing: "npm:7.0.0" - workbox-strategies: "npm:7.0.0" - workbox-streams: "npm:7.0.0" - workbox-sw: "npm:7.0.0" - workbox-window: "npm:7.0.0" - checksum: 10c0/a090aeee836f59d42ca9eda8b82aa5a0ee8f4ce3f3095b6fcbe157a9a154c492e4ba86b5c4d6aa50ef7c37ea1c38c965442b56d1404911fd0351d0fc9a859a3c + workbox-background-sync: "npm:7.1.0" + workbox-broadcast-update: "npm:7.1.0" + workbox-cacheable-response: "npm:7.1.0" + workbox-core: "npm:7.1.0" + workbox-expiration: "npm:7.1.0" + workbox-google-analytics: "npm:7.1.0" + workbox-navigation-preload: "npm:7.1.0" + workbox-precaching: "npm:7.1.0" + workbox-range-requests: "npm:7.1.0" + workbox-recipes: "npm:7.1.0" + workbox-routing: "npm:7.1.0" + workbox-strategies: "npm:7.1.0" + workbox-streams: "npm:7.1.0" + workbox-sw: "npm:7.1.0" + workbox-window: "npm:7.1.0" + checksum: 10c0/c482fde713bad582bd7d4861113d7367ab4722eba9c102864c71048815792c623e9117a8f79957e0388d0c08e8303962d1fb23931456da73909e87d06638d101 languageName: node linkType: hard -"workbox-cacheable-response@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-cacheable-response@npm:7.0.0" +"workbox-cacheable-response@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-cacheable-response@npm:7.1.0" dependencies: - workbox-core: "npm:7.0.0" - checksum: 10c0/ddf123b3461070e215af51d88c672f3302b540b93ecf61ad5f3853f0a997194973eedb2c9ed21e849b7419f68804ef8a8d876dced3836a7eb2c697099e3d408f + workbox-core: "npm:7.1.0" + checksum: 10c0/52ea73bb184c9ef9280cc8f00a1ab7d103d495e12a7a6378fae02fd0aa1a9b893aac5d8074f14ed8c198527123e4401f4703fbfd2be98e184ca783b9216cb4c5 languageName: node linkType: hard -"workbox-core@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-core@npm:7.0.0" - checksum: 10c0/aaaf7b66978456bf5d6a90b1068b5acd82bf451f4a23c5a416201524b50ea4e0bc62a01365499bc088b4c18cddc513fdebbe8b048ab15aff960fe7cbbf55d5bd +"workbox-core@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-core@npm:7.1.0" + checksum: 10c0/fb0b6e23a52e085da00b7a74b1f1854f06c695eb2bd4c244aa335165f59156a4febb4f116b9893b9fb7e0e8bac092d32eecceb4d00f930a93f64737cb2be9531 languageName: node linkType: hard -"workbox-expiration@npm:7.0.0, workbox-expiration@npm:^7.0.0": - version: 7.0.0 - resolution: "workbox-expiration@npm:7.0.0" +"workbox-expiration@npm:7.1.0, workbox-expiration@npm:^7.0.0": + version: 7.1.0 + resolution: "workbox-expiration@npm:7.1.0" dependencies: idb: "npm:^7.0.1" - workbox-core: "npm:7.0.0" - checksum: 10c0/990a6c2c9b177d796c012b0112913621e41b283e2736d83acb58cb9645591ddc7a6aef585145c5686f9b071d73ce12b4b1887765754624322545b0f4125d649f + workbox-core: "npm:7.1.0" + checksum: 10c0/669d76f87c1550ce9b425232c3202a26fdea4c4c9bdc1b71c1cee741a5d011423098994452e508576174d3c0b4bec0f4b35012b6d7257e300684c87fdddb7949 languageName: node linkType: hard -"workbox-google-analytics@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-google-analytics@npm:7.0.0" +"workbox-google-analytics@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-google-analytics@npm:7.1.0" dependencies: - workbox-background-sync: "npm:7.0.0" - workbox-core: "npm:7.0.0" - workbox-routing: "npm:7.0.0" - workbox-strategies: "npm:7.0.0" - checksum: 10c0/7656ab4bff15fbcbc7f546d86628ccbc74736a99139ec70a166c465fc4ff59656aecd44cc0aef45b4690fd88a4980d6c9f27ce8c6606fd12d026162259a8069d + workbox-background-sync: "npm:7.1.0" + workbox-core: "npm:7.1.0" + workbox-routing: "npm:7.1.0" + workbox-strategies: "npm:7.1.0" + checksum: 10c0/4178d94fb7f3f7b789f117c104b2ff33945256dc550418b0e9c81130c1e2c2bcd72ec6a1661d91326c04de360e6592edd505f0e2142e8e1043fe0c45f9c1a3fe languageName: node linkType: hard -"workbox-navigation-preload@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-navigation-preload@npm:7.0.0" +"workbox-navigation-preload@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-navigation-preload@npm:7.1.0" dependencies: - workbox-core: "npm:7.0.0" - checksum: 10c0/f29ac8364c7f7f392daa1f886134adc780057199b218ab6c6eef298841b8825d6cbc4bc88e655299929bdf14c700edfb9f217ca5c0b46094627247528f655011 + workbox-core: "npm:7.1.0" + checksum: 10c0/b667a3ba0cae4d43a53a6e211f0f33f6ebc1d9fec6cbb93de83f72a37b81cc39d887b969db9b1cd5c396a1ce34636c89c3b157cc64a5265635d0b274e362db0e languageName: node linkType: hard -"workbox-precaching@npm:7.0.0, workbox-precaching@npm:^7.0.0": - version: 7.0.0 - resolution: "workbox-precaching@npm:7.0.0" +"workbox-precaching@npm:7.1.0, workbox-precaching@npm:^7.0.0": + version: 7.1.0 + resolution: "workbox-precaching@npm:7.1.0" dependencies: - workbox-core: "npm:7.0.0" - workbox-routing: "npm:7.0.0" - workbox-strategies: "npm:7.0.0" - checksum: 10c0/1b47cb151bb6ec7442b2dc8981203feff22527a4383510f2399730338b620ef0d03076bd3dbc1eb9a05272d5d6f4803fb4262f320bf5645f0818981e91077f39 + workbox-core: "npm:7.1.0" + workbox-routing: "npm:7.1.0" + workbox-strategies: "npm:7.1.0" + checksum: 10c0/53b2d0a658109b4d83ee2b1913f884ee1c757a12b8931a7102272bd1e228d29f9430e7d060f328f465bca2aa24bf0719d026eef4f4d21395fa1f678f8d6a3c06 languageName: node linkType: hard -"workbox-range-requests@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-range-requests@npm:7.0.0" +"workbox-range-requests@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-range-requests@npm:7.1.0" dependencies: - workbox-core: "npm:7.0.0" - checksum: 10c0/909f0ed7a176e5dc55692792825e67b577dacf1015a3f3775389fcec34ff5b3441b15595109455fe226f0bc4dce4789a7c86e5e9c5963c13b4d6482f6d01d44f + workbox-core: "npm:7.1.0" + checksum: 10c0/bf4aa597d04cbb533796af64f4006a1f472f8a14ea91f96fe37b2d5e63ffe86dcb944dab9a41317e69d368d83bee20f03ff32b339ae5addef50f325703ad4b77 languageName: node linkType: hard -"workbox-recipes@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-recipes@npm:7.0.0" +"workbox-recipes@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-recipes@npm:7.1.0" dependencies: - workbox-cacheable-response: "npm:7.0.0" - workbox-core: "npm:7.0.0" - workbox-expiration: "npm:7.0.0" - workbox-precaching: "npm:7.0.0" - workbox-routing: "npm:7.0.0" - workbox-strategies: "npm:7.0.0" - checksum: 10c0/c024141f24b0778355bdfbfe2b4a24a3f74e279f6f7541635758533e79318e15986f9f556a899c97717a9c25a1738d9e112d17dd36aa19cebf901462ebeeb8e4 + workbox-cacheable-response: "npm:7.1.0" + workbox-core: "npm:7.1.0" + workbox-expiration: "npm:7.1.0" + workbox-precaching: "npm:7.1.0" + workbox-routing: "npm:7.1.0" + workbox-strategies: "npm:7.1.0" + checksum: 10c0/5a8c2444f6338c6092be87cc6fd69c8b0cbb413bfc0a11a8f10961bfb2b8059359c4be0264ffa0c01deff3ab5dba15bbcf61d4dedbc93d8bfe1f8a2841b1657c languageName: node linkType: hard -"workbox-routing@npm:7.0.0, workbox-routing@npm:^7.0.0": - version: 7.0.0 - resolution: "workbox-routing@npm:7.0.0" +"workbox-routing@npm:7.1.0, workbox-routing@npm:^7.0.0": + version: 7.1.0 + resolution: "workbox-routing@npm:7.1.0" dependencies: - workbox-core: "npm:7.0.0" - checksum: 10c0/74ad651a0643506cfd3ca51eee754f5fe34e3f1460e6b772ed213e0422028cf002d70f91da32d13261bc5ee2160527ffb5436ac209fdbe8d0e7071784aa65190 + workbox-core: "npm:7.1.0" + checksum: 10c0/efd630fff594bd50276770840bce274660972587e79c097a9f1a84e8347351736aac13f11c6d7655ff550b13195d370d5c3b81a075bf452f358fc144ee868ad9 languageName: node linkType: hard -"workbox-strategies@npm:7.0.0, workbox-strategies@npm:^7.0.0": - version: 7.0.0 - resolution: "workbox-strategies@npm:7.0.0" +"workbox-strategies@npm:7.1.0, workbox-strategies@npm:^7.0.0": + version: 7.1.0 + resolution: "workbox-strategies@npm:7.1.0" dependencies: - workbox-core: "npm:7.0.0" - checksum: 10c0/4fe122b80e547b347bedf187aeb2c2eb34efc3fbde2733b7709530cccb6b6e03b29adcbccecf301e4fcaad0d5cd4a74e1e704f769d949c32439dca358130a613 + workbox-core: "npm:7.1.0" + checksum: 10c0/b08712a69b1b13e354345cc228c29f0c759043f7ca7cf6ce9b82fe79c9d423142bfa4a118f91f1a57054047a730127fa4474d59d9306fb2ed42fe9ef568be01a languageName: node linkType: hard -"workbox-streams@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-streams@npm:7.0.0" +"workbox-streams@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-streams@npm:7.1.0" dependencies: - workbox-core: "npm:7.0.0" - workbox-routing: "npm:7.0.0" - checksum: 10c0/9a1a9b8200f5b315523ac49c61a9b88791009377bbdedd44cf19c4b2258e710bd2fbc6f74ef53b72db7849da7ce9965ced5983f167785ccfc7efa1df761e3371 + workbox-core: "npm:7.1.0" + workbox-routing: "npm:7.1.0" + checksum: 10c0/1d75c046fcb7b25e1cf85457e3610309dd5513f68752ef333529fcf155df2114b72f3d6f416bb68393e51b5396e3f6df7171e8e2889d0e9e1805e315754b771e languageName: node linkType: hard -"workbox-sw@npm:7.0.0": - version: 7.0.0 - resolution: "workbox-sw@npm:7.0.0" - checksum: 10c0/06d9713398ca92d8b2cad70a7d302825ec7650e05e2e0c8e68f453442fdf9a9227350c856484f7b649df6cb429cc03a103f8ecd9596e83bfa52e845bf25ffbcd +"workbox-sw@npm:7.1.0": + version: 7.1.0 + resolution: "workbox-sw@npm:7.1.0" + checksum: 10c0/2084f1b58c8509d7ca53ce8a13d93e57d1f13307e0279fedc87942e83c8cb96bc2e5ed3992a89af6245ad2a66897a92908cb60d0717fb90492056eb6fbf20dc6 languageName: node linkType: hard "workbox-webpack-plugin@npm:^7.0.0": - version: 7.0.0 - resolution: "workbox-webpack-plugin@npm:7.0.0" + version: 7.1.0 + resolution: "workbox-webpack-plugin@npm:7.1.0" dependencies: fast-json-stable-stringify: "npm:^2.1.0" pretty-bytes: "npm:^5.4.1" upath: "npm:^1.2.0" webpack-sources: "npm:^1.4.3" - workbox-build: "npm:7.0.0" + workbox-build: "npm:7.1.0" peerDependencies: - webpack: ^4.4.0 || ^5.9.0 - checksum: 10c0/3d585842bb6f801db5571e4d3e5c1d7c141f91d9ba2ed0c36b617d86a00b37bdefc055e6cc981c557f21f878ff4a9cf8b82e4b0b31084ddf4d9d149673ce8882 + webpack: ^4.4.0 || ^5.91.0 + checksum: 10c0/516fa68a6a6958ee1560299dd1146032dda68474a2ab01643cbde78fc65b75a3157aef60cb45dcc1984cc458ce44d4e3090cda08dd7cefd0952351270e963a00 languageName: node linkType: hard -"workbox-window@npm:7.0.0, workbox-window@npm:^7.0.0": - version: 7.0.0 - resolution: "workbox-window@npm:7.0.0" +"workbox-window@npm:7.1.0, workbox-window@npm:^7.0.0": + version: 7.1.0 + resolution: "workbox-window@npm:7.1.0" dependencies: "@types/trusted-types": "npm:^2.0.2" - workbox-core: "npm:7.0.0" - checksum: 10c0/8070fb80734a8543248ed6e3b186b8d3ee64419400a6d6d75f78809c44bf16321c5d9739bdf60ee62f631461ebb67a8a7dd78192504678d00bf2a9d3683f1324 + workbox-core: "npm:7.1.0" + checksum: 10c0/c989a6e3a0488f049eead3892f8249387604fb04898aa79d0cf14cd7b684f0758f1edf1996745f4755bd30c31c449f628803e507d39b2ea91cc9c36f7d5e9c72 languageName: node linkType: hard @@ -18267,9 +18303,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.11.0, ws@npm:^8.12.1, ws@npm:^8.16.0": - version: 8.16.0 - resolution: "ws@npm:8.16.0" +"ws@npm:^8.11.0, ws@npm:^8.12.1, ws@npm:^8.17.0": + version: 8.17.0 + resolution: "ws@npm:8.17.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -18278,7 +18314,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/a7783bb421c648b1e622b423409cb2a58ac5839521d2f689e84bc9dc41d59379c692dd405b15a997ea1d4c0c2e5314ad707332d0c558f15232d2bc07c0b4618a + checksum: 10c0/55241ec93a66fdfc4bf4f8bc66c8eb038fda2c7a4ee8f6f157f2ca7dc7aa76aea0c0da0bf3adb2af390074a70a0e45456a2eaf80e581e630b75df10a64b0a990 languageName: node linkType: hard @@ -18338,13 +18374,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:2.3.4": - version: 2.3.4 - resolution: "yaml@npm:2.3.4" - checksum: 10c0/cf03b68f8fef5e8516b0f0b54edaf2459f1648317fc6210391cf606d247e678b449382f4bd01f77392538429e306c7cba8ff46ff6b37cac4de9a76aff33bd9e1 - languageName: node - linkType: hard - "yaml@npm:^1.10.0": version: 1.10.2 resolution: "yaml@npm:1.10.2" @@ -18352,6 +18381,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:~2.4.2": + version: 2.4.2 + resolution: "yaml@npm:2.4.2" + bin: + yaml: bin.mjs + checksum: 10c0/280ddb2e43ffa7d91a95738e80c8f33e860749cdc25aa6d9e4d350a28e174fd7e494e4aa023108aaee41388e451e3dc1292261d8f022aabcf90df9c63d647549 + languageName: node + linkType: hard + "yargs-parser@npm:^13.1.2": version: 13.1.2 resolution: "yargs-parser@npm:13.1.2"