diff --git a/.devcontainer/codespaces/devcontainer.json b/.devcontainer/codespaces/devcontainer.json index d2358657f6d..8acffec8259 100644 --- a/.devcontainer/codespaces/devcontainer.json +++ b/.devcontainer/codespaces/devcontainer.json @@ -39,7 +39,7 @@ }, "onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}", - "postCreateCommand": "bin/setup", + "postCreateCommand": "COREPACK_ENABLE_DOWNLOAD_PROMPT=0 bin/setup", "waitFor": "postCreateCommand", "customizations": { diff --git a/.env.production.sample b/.env.production.sample index 0bf01bdc361..0b458a1aa96 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -1,5 +1,5 @@ # This is a sample configuration file. You can generate your configuration -# with the `rake mastodon:setup` interactive setup wizard, but to customize +# with the `bundle exec rails mastodon:setup` interactive setup wizard, but to customize # your setup even further, you'll need to edit it manually. This sample does # not demonstrate all available configuration options. Please look at # https://docs.joinmastodon.org/admin/config/ for the full documentation. @@ -40,14 +40,14 @@ ES_PASS=password # Secrets # ------- -# Make sure to use `rake secret` to generate secrets +# Make sure to use `bundle exec rails secret` to generate secrets # ------- SECRET_KEY_BASE= OTP_SECRET= # Web Push # -------- -# Generate with `rake mastodon:webpush:generate_vapid_key` +# Generate with `bundle exec rails mastodon:webpush:generate_vapid_key` # -------- VAPID_PRIVATE_KEY= VAPID_PUBLIC_KEY= diff --git a/.eslintrc.js b/.eslintrc.js index e3afb1c9f23..d1182628263 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,10 +20,6 @@ module.exports = defineConfig({ es6: true, }, - globals: { - ATTACHMENT_HOST: false, - }, - parser: '@typescript-eslint/parser', plugins: [ @@ -79,7 +75,7 @@ module.exports = defineConfig({ ], }, ], - 'no-empty': 'off', + 'no-empty': ['error', { "allowEmptyCatch": true }], 'no-restricted-properties': [ 'error', { property: 'substring', message: 'Use .slice instead of .substring.' }, @@ -94,7 +90,6 @@ module.exports = defineConfig({ message: "Use '·' (middle dot) instead of '•' (bullet)", }, ], - 'no-self-assign': 'off', 'no-unused-expressions': 'error', 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': [ @@ -119,12 +114,10 @@ module.exports = defineConfig({ 'react/jsx-tag-spacing': 'error', 'react/jsx-uses-react': 'off', // not needed with new JSX transform 'react/jsx-wrap-multilines': 'error', - 'react/no-deprecated': 'off', 'react/react-in-jsx-scope': 'off', // not needed with new JSX transform 'react/self-closing-comp': 'error', // recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/v6.8.0/src/index.js#L46 - 'jsx-a11y/accessible-emoji': 'warn', 'jsx-a11y/click-events-have-key-events': 'off', 'jsx-a11y/label-has-associated-control': 'off', 'jsx-a11y/media-has-caption': 'off', @@ -139,23 +132,6 @@ module.exports = defineConfig({ // ], 'jsx-a11y/no-interactive-element-to-noninteractive-role': 'off', // recommended rule is: - // 'jsx-a11y/no-noninteractive-element-interactions': [ - // 'error', - // { - // body: ['onError', 'onLoad'], - // iframe: ['onError', 'onLoad'], - // img: ['onError', 'onLoad'], - // }, - // ], - 'jsx-a11y/no-noninteractive-element-interactions': [ - 'warn', - { - handlers: [ - 'onClick', - ], - }, - ], - // recommended rule is: // 'jsx-a11y/no-noninteractive-tabindex': [ // 'error', // { @@ -165,7 +141,6 @@ module.exports = defineConfig({ // }, // ], 'jsx-a11y/no-noninteractive-tabindex': 'off', - 'jsx-a11y/no-onchange': 'off', // recommended is full 'error' 'jsx-a11y/no-static-element-interactions': [ 'warn', diff --git a/.github/workflows/bundler-audit.yml b/.github/workflows/bundler-audit.yml index e3e2da0c787..2341d6e67f6 100644 --- a/.github/workflows/bundler-audit.yml +++ b/.github/workflows/bundler-audit.yml @@ -1,8 +1,10 @@ name: Bundler Audit on: + merge_group: push: - branches-ignore: - - 'dependabot/**' + branches: + - 'main' + - 'stable-*' paths: - 'Gemfile*' - '.ruby-version' diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml index ceb385933b2..5a1c0519665 100644 --- a/.github/workflows/check-i18n.yml +++ b/.github/workflows/check-i18n.yml @@ -2,9 +2,13 @@ name: Check i18n on: push: - branches: [main] + branches: + - 'main' + - 'stable-*' pull_request: - branches: [main] + branches: + - 'main' + - 'stable-*' env: RAILS_ENV: test diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 6fb93b7fef4..8690e9ed6d1 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,11 +1,15 @@ name: 'CodeQL' on: + merge_group: push: - branches: ['main'] + branches: + - 'main' + - 'stable-*' pull_request: - # The branches below must be a subset of the branches above - branches: ['main'] + branches: + - 'main' + - 'stable-*' schedule: - cron: '22 6 * * 1' diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml index 705af12c025..c1da4088e93 100644 --- a/.github/workflows/crowdin-upload.yml +++ b/.github/workflows/crowdin-upload.yml @@ -1,9 +1,11 @@ name: Crowdin / Upload translations on: + merge_group: push: branches: - - main + - 'main' + - 'stable-*' paths: - crowdin.yml - app/javascript/mastodon/locales/en.json @@ -17,6 +19,7 @@ on: jobs: upload-translations: runs-on: ubuntu-latest + if: github.repository == 'mastodon/mastodon' steps: - name: Checkout diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index 2d483b50229..c10f350a02e 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -1,6 +1,10 @@ name: Check formatting on: + merge_group: push: + branches: + - 'main' + - 'stable-*' pull_request: jobs: diff --git a/.github/workflows/lint-css.yml b/.github/workflows/lint-css.yml index d3b8035cd86..95fcd569420 100644 --- a/.github/workflows/lint-css.yml +++ b/.github/workflows/lint-css.yml @@ -1,9 +1,10 @@ name: CSS Linting on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - 'package.json' - 'yarn.lock' diff --git a/.github/workflows/lint-haml.yml b/.github/workflows/lint-haml.yml index ca4b0c80bfd..a1a9e99c902 100644 --- a/.github/workflows/lint-haml.yml +++ b/.github/workflows/lint-haml.yml @@ -1,9 +1,10 @@ name: Haml Linting on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - '.github/workflows/haml-lint-problem-matcher.json' - '.github/workflows/lint-haml.yml' diff --git a/.github/workflows/lint-js.yml b/.github/workflows/lint-js.yml index 1c1ecc2b220..7d31a5e20e7 100644 --- a/.github/workflows/lint-js.yml +++ b/.github/workflows/lint-js.yml @@ -1,9 +1,10 @@ name: JavaScript Linting on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - 'package.json' - 'yarn.lock' diff --git a/.github/workflows/lint-ruby.yml b/.github/workflows/lint-ruby.yml index b3a89c3caf1..277e456146f 100644 --- a/.github/workflows/lint-ruby.yml +++ b/.github/workflows/lint-ruby.yml @@ -1,9 +1,10 @@ name: Ruby Linting on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - 'Gemfile*' - '.rubocop*.yml' diff --git a/.github/workflows/test-js.yml b/.github/workflows/test-js.yml index 481afdba303..e9e43ac9e80 100644 --- a/.github/workflows/test-js.yml +++ b/.github/workflows/test-js.yml @@ -1,9 +1,10 @@ name: JavaScript Testing on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - 'package.json' - 'yarn.lock' diff --git a/.github/workflows/test-migrations.yml b/.github/workflows/test-migrations.yml index 3eaf2c2d740..6a0e67c58ee 100644 --- a/.github/workflows/test-migrations.yml +++ b/.github/workflows/test-migrations.yml @@ -1,29 +1,29 @@ name: Historical data migration test on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' + paths: + - 'Gemfile*' + - '.ruby-version' + - '**/*.rb' + - '.github/workflows/test-migrations.yml' + - 'lib/tasks/tests.rake' + pull_request: + paths: + - 'Gemfile*' + - '.ruby-version' + - '**/*.rb' + - '.github/workflows/test-migrations.yml' + - 'lib/tasks/tests.rake' jobs: - pre_job: - runs-on: ubuntu-latest - - outputs: - should_skip: ${{ steps.skip_check.outputs.should_skip }} - - steps: - - id: skip_check - uses: fkirc/skip-duplicate-actions@v5 - with: - paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations.yml", "lib/tasks/tests.rake"]' - test: runs-on: ubuntu-latest - needs: pre_job - if: needs.pre_job.outputs.should_skip != 'true' strategy: fail-fast: false diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index 513de2072a8..fcfeed5fbad 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -1,10 +1,11 @@ name: Ruby Testing on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' pull_request: env: @@ -132,15 +133,17 @@ jobs: additional-system-dependencies: ffmpeg libpam-dev - name: Load database schema - run: './bin/rails db:create db:schema:load db:seed' + run: | + bin/rails db:setup + bin/flatware fan bin/rails db:test:prepare - - run: bin/rspec + - run: bin/flatware rspec -r ./spec/flatware_helper.rb - name: Upload coverage reports to Codecov if: matrix.ruby-version == '.ruby-version' uses: codecov/codecov-action@v4 with: - files: coverage/lcov/mastodon.lcov + files: coverage/lcov/*.lcov env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -221,7 +224,7 @@ jobs: - name: Load database schema run: './bin/rails db:create db:schema:load db:seed' - - run: bin/rspec --tag paperclip_processing + - run: bin/rspec --tag attachment_processing - name: Upload coverage reports to Codecov if: matrix.ruby-version == '.ruby-version' @@ -285,9 +288,13 @@ jobs: - uses: actions/download-artifact@v4 with: - path: './public' + path: './' name: ${{ github.sha }} + - name: Expand archived asset artifacts + run: | + tar xvzf artifacts.tar.gz + - name: Set up Ruby environment uses: ./.github/actions/setup-ruby with: @@ -405,7 +412,7 @@ jobs: - uses: actions/download-artifact@v4 with: - path: './public' + path: './' name: ${{ github.sha }} - name: Set up Ruby environment diff --git a/.nvmrc b/.nvmrc index c61a3d77e78..1bdd901e66f 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.14 +20.16 diff --git a/.rubocop.yml b/.rubocop.yml index cf4ee565e00..965f56f3e70 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,21 +1,14 @@ --- AllCops: CacheRootDirectory: tmp - DisplayCopNames: true DisplayStyleGuide: true Exclude: - - db/schema.rb - - bin/* - - node_modules/**/* - Vagrantfile - - vendor/**/* - config/initializers/json_ld* - lib/mastodon/migration_helpers.rb - - lib/templates/**/* ExtraDetails: true NewCops: enable TargetRubyVersion: 3.1 # Oldest supported ruby version - UseCache: true inherit_from: - .rubocop/layout.yml diff --git a/.rubocop/rails.yml b/.rubocop/rails.yml index b83928dee6b..ae31c1f2661 100644 --- a/.rubocop/rails.yml +++ b/.rubocop/rails.yml @@ -1,14 +1,13 @@ --- +Rails/BulkChangeTable: + Enabled: false # Conflicts with strong_migrations features + Rails/FilePath: EnforcedStyle: arguments Rails/HttpStatus: EnforcedStyle: numeric -Rails/LexicallyScopedActionFilter: - Exclude: - - app/controllers/auth/* # Conflicts with `Lint/UselessMethodDefinition` for inherited controller actions - Rails/NegateInclude: Enabled: false @@ -22,6 +21,3 @@ Rails/RakeEnvironment: Rails/SkipsModelValidations: Enabled: false - -Rails/UnusedIgnoredColumns: - Enabled: false # Preserve ability to migrate from arbitrary old versions diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 8a4e5980308..357ed995450 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.63.5. +# `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp` +# using RuboCop version 1.65.0. # 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 @@ -14,7 +14,7 @@ Lint/NonLocalExitFromIterator: Metrics/AbcSize: Max: 82 -# Configuration parameters: CountBlocks, Max. +# Configuration parameters: CountBlocks, CountModifierForms, Max. Metrics/BlockNesting: Exclude: - 'lib/tasks/mastodon.rake' @@ -31,14 +31,6 @@ Rails/OutputSafety: Exclude: - 'config/initializers/simple_form.rb' -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: AllowedMethods, AllowedPatterns. -# AllowedMethods: ==, equal?, eql? -Style/ClassEqualityComparison: - Exclude: - - 'app/helpers/jsonld_helper.rb' - - 'app/serializers/activitypub/outbox_serializer.rb' - # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowedVars. Style/FetchEnvVar: @@ -55,7 +47,6 @@ Style/FetchEnvVar: - 'config/initializers/vapid.rb' - 'lib/mastodon/redis_config.rb' - 'lib/tasks/repo.rake' - - 'spec/system/profile_spec.rb' # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle, MaxUnannotatedPlaceholdersAllowed, AllowedMethods, AllowedPatterns. @@ -66,40 +57,10 @@ Style/FormatStringToken: - 'config/initializers/devise.rb' - 'lib/paperclip/color_extractor.rb' -# This cop supports unsafe autocorrection (--autocorrect-all). -Style/GlobalStdStream: - Exclude: - - 'config/environments/development.rb' - - 'config/environments/production.rb' - # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: MinBodyLength, AllowConsecutiveConditionals. Style/GuardClause: - Exclude: - - 'app/lib/activitypub/activity/block.rb' - - 'app/lib/request.rb' - - 'app/lib/request_pool.rb' - - 'app/lib/webfinger.rb' - - 'app/lib/webfinger_resource.rb' - - 'app/models/concerns/account/counters.rb' - - 'app/models/concerns/user/ldap_authenticable.rb' - - 'app/models/tag.rb' - - 'app/models/user.rb' - - 'app/services/fan_out_on_write_service.rb' - - 'app/services/post_status_service.rb' - - 'app/services/process_hashtags_service.rb' - - 'app/workers/move_worker.rb' - - 'app/workers/redownload_avatar_worker.rb' - - 'app/workers/redownload_header_worker.rb' - - 'app/workers/redownload_media_worker.rb' - - 'app/workers/remote_account_refresh_worker.rb' - - 'config/initializers/devise.rb' - - 'lib/devise/strategies/two_factor_ldap_authenticatable.rb' - - 'lib/devise/strategies/two_factor_pam_authenticatable.rb' - - 'lib/mastodon/cli/accounts.rb' - - 'lib/mastodon/cli/maintenance.rb' - - 'lib/mastodon/cli/media.rb' - - 'lib/tasks/repo.rake' + Enabled: false # This cop supports unsafe autocorrection (--autocorrect-all). Style/HashTransformValues: @@ -121,16 +82,10 @@ Style/MutableConstant: - 'app/services/delete_account_service.rb' - 'lib/mastodon/migration_warning.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/NilLambda: - Exclude: - - 'config/initializers/paperclip.rb' - # Configuration parameters: AllowedMethods. # AllowedMethods: respond_to_missing? Style/OptionalBooleanParameter: Exclude: - - 'app/helpers/admin/account_moderation_notes_helper.rb' - 'app/helpers/jsonld_helper.rb' - 'app/lib/admin/system_check/message.rb' - 'app/lib/request.rb' @@ -154,13 +109,6 @@ Style/RedundantConstantBase: - 'config/environments/production.rb' - 'config/initializers/sidekiq.rb' -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength. -# AllowedMethods: present?, blank?, presence, try, try! -Style/SafeNavigation: - Exclude: - - 'app/models/concerns/account/finder_concern.rb' - # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: WordRegex. # SupportedStyles: percent, brackets diff --git a/.ruby-version b/.ruby-version index 619b5376684..a0891f563f3 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.3.3 +3.3.4 diff --git a/CHANGELOG.md b/CHANGELOG.md index c9b24d6f159..7c3d96ba4a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,37 @@ All notable changes to this project will be documented in this file. +## [4.2.10] - 2024-07-04 + +### Security + +- Fix incorrect permission checking on multiple API endpoints ([GHSA-58x8-3qxw-6hm7](https://github.com/mastodon/mastodon/security/advisories/GHSA-58x8-3qxw-6hm7)) +- Fix incorrect authorship checking when processing some activities (CVE-2024-37903, [GHSA-xjvf-fm67-4qc3](https://github.com/mastodon/mastodon/security/advisories/GHSA-xjvf-fm67-4qc3)) +- Fix ongoing streaming sessions not being invalidated when application tokens get revoked ([GHSA-vp5r-5pgw-jwqx](https://github.com/mastodon/mastodon/security/advisories/GHSA-vp5r-5pgw-jwqx)) +- Update dependencies + +### Added + +- Add yarn version specification to avoid confusion with Yarn 3 and Yarn 4 + +### Changed + +- Change preview cards generation to skip unusually long URLs ([oneiros](https://github.com/mastodon/mastodon/pull/30854)) +- Change search modifiers to be case-insensitive ([Gargron](https://github.com/mastodon/mastodon/pull/30865)) +- Change `STATSD_ADDR` handling to emit a warning rather than crashing if the address is unreachable ([timothyjrogers](https://github.com/mastodon/mastodon/pull/30691)) +- Change PWA start URL from `/home` to `/` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27377)) + +### Removed + +- Removed dependency on `posix-spawn` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18559)) + +### Fixed + +- Fix scheduled statuses scheduled in less than 5 minutes being immediately published ([danielmbrasil](https://github.com/mastodon/mastodon/pull/30584)) +- Fix encoding detection for link cards ([oneiros](https://github.com/mastodon/mastodon/pull/30780)) +- Fix `/admin/accounts/:account_id/statuses/:id` for edited posts with media attachments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30819)) +- Fix duplicate `@context` attribute in user archive export ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30653)) + ## [4.2.9] - 2024-05-30 ### Security diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b68a9bde3ea..8286fdd2f7d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,6 +11,11 @@ You can contribute in the following ways: If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon). +Please review the org-level [contribution guidelines] for high-level acceptance +criteria guidance. + +[contribution guidelines]: https://github.com/mastodon/.github/blob/main/CONTRIBUTING.md + ## API Changes and Additions Please note that any changes or additions made to the API should have an accompanying pull request on [our documentation repository](https://github.com/mastodon/documentation). diff --git a/Dockerfile b/Dockerfile index 0d7516b1088..a0af1eda6b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# syntax=docker/dockerfile:1.7 +# syntax=docker/dockerfile:1.9 # This file is designed for production server deployment, not local development work # For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/README.md#docker @@ -12,22 +12,22 @@ ARG BUILDPLATFORM=${BUILDPLATFORM} # Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.x"] # renovate: datasource=docker depName=docker.io/ruby -ARG RUBY_VERSION="3.3.3" +ARG RUBY_VERSION="3.3.4" # # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"] # renovate: datasource=node-version depName=node 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 +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.3.x-slim-bookworm) -FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} as ruby +FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby # Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA -# Example: v4.2.0-nightly.2023.11.09+something -# Overwrite existence of 'alpha.0' in version.rb [--build-arg MASTODON_VERSION_PRERELEASE="nightly.2023.11.09"] +# Example: v4.3.0-nightly.2023.11.09+pr-123456 +# Overwrite existence of 'alpha.X' in version.rb [--build-arg MASTODON_VERSION_PRERELEASE="nightly.2023.11.09"] ARG MASTODON_VERSION_PRERELEASE="" -# Append build metadata or fork information to version.rb [--build-arg MASTODON_VERSION_METADATA="pr-12345"] +# Append build metadata or fork information to version.rb [--build-arg MASTODON_VERSION_METADATA="pr-123456"] ARG MASTODON_VERSION_METADATA="" # Allow Ruby on Rails to serve static files @@ -67,7 +67,9 @@ ENV \ # Optimize jemalloc 5.x performance MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \ # Enable libvips, should not be changed - MASTODON_USE_LIBVIPS=true + MASTODON_USE_LIBVIPS=true \ +# Sidekiq will touch tmp/sidekiq_process_has_started_and_will_begin_processing_jobs to indicate it is ready. This can be used for a readiness check in Kubernetes + MASTODON_SIDEKIQ_READY_FILENAME=sidekiq_process_has_started_and_will_begin_processing_jobs # Set default shell used for running commands SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"] @@ -100,9 +102,7 @@ RUN \ apt-get dist-upgrade -yq; \ # Install jemalloc, curl and other necessary components apt-get install -y --no-install-recommends \ - ca-certificates \ curl \ - ffmpeg \ file \ libjemalloc2 \ patchelf \ @@ -119,7 +119,7 @@ RUN \ ; # Create temporary build layer from base image -FROM ruby as build +FROM ruby AS build # Copy Node package configuration files into working directory COPY package.json yarn.lock .yarnrc.yml /opt/mastodon/ @@ -137,7 +137,10 @@ RUN \ --mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \ # Install build tools and bundler dependencies from APT apt-get install -y --no-install-recommends \ + autoconf \ + automake \ build-essential \ + cmake \ git \ libgdbm-dev \ libglib2.0-dev \ @@ -146,9 +149,12 @@ RUN \ libidn-dev \ libpq-dev \ libssl-dev \ + libtool \ meson \ + nasm \ pkg-config \ shared-mime-info \ + xz-utils \ # libvips components libcgif-dev \ libexif-dev \ @@ -162,6 +168,16 @@ RUN \ libspng-dev \ libtiff-dev \ libwebp-dev \ + # ffmpeg components + libdav1d-dev \ + liblzma-dev \ + libmp3lame-dev \ + libopus-dev \ + libsnappy-dev \ + libvorbis-dev \ + libvpx-dev \ + libx264-dev \ + libx265-dev \ ; RUN \ @@ -171,7 +187,7 @@ RUN \ corepack prepare --activate; # Create temporary libvips specific build layer from build layer -FROM build as libvips +FROM build AS libvips # libvips version to compile, change with [--build-arg VIPS_VERSION="8.15.2"] # renovate: datasource=github-releases depName=libvips packageName=libvips/libvips @@ -190,8 +206,50 @@ RUN \ ninja; \ ninja install; +# Create temporary ffmpeg specific build layer from build layer +FROM build AS ffmpeg + +# ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"] +# renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg +ARG FFMPEG_VERSION=7.0.2 +# ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"] +ARG FFMPEG_URL=https://ffmpeg.org/releases + +WORKDIR /usr/local/ffmpeg/src + +RUN \ + curl -sSL -o ffmpeg-${FFMPEG_VERSION}.tar.xz ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz; \ + tar xf ffmpeg-${FFMPEG_VERSION}.tar.xz; \ + cd ffmpeg-${FFMPEG_VERSION}; \ + ./configure \ + --prefix=/usr/local/ffmpeg \ + --toolchain=hardened \ + --disable-debug \ + --disable-devices \ + --disable-doc \ + --disable-ffplay \ + --disable-network \ + --disable-static \ + --enable-ffmpeg \ + --enable-ffprobe \ + --enable-gpl \ + --enable-libdav1d \ + --enable-libmp3lame \ + --enable-libopus \ + --enable-libsnappy \ + --enable-libvorbis \ + --enable-libvpx \ + --enable-libwebp \ + --enable-libx264 \ + --enable-libx265 \ + --enable-shared \ + --enable-version3 \ + ; \ + make -j$(nproc); \ + make install; + # Create temporary bundler specific build layer from build layer -FROM build as bundler +FROM build AS bundler ARG TARGETPLATFORM @@ -213,7 +271,7 @@ RUN \ bundle install -j"$(nproc)"; # Create temporary node specific build layer from build layer -FROM build as yarn +FROM build AS yarn ARG TARGETPLATFORM @@ -230,7 +288,7 @@ RUN \ yarn workspaces focus --production @mastodon/mastodon; # Create temporary assets build layer from build layer -FROM build as precompiler +FROM build AS precompiler # Copy Mastodon sources into precompiler layer COPY . /opt/mastodon/ @@ -254,7 +312,7 @@ RUN \ rm -fr /opt/mastodon/tmp; # Prep final Mastodon Ruby layer -FROM ruby as mastodon +FROM ruby AS mastodon ARG TARGETPLATFORM @@ -289,6 +347,20 @@ RUN \ libwebp7 \ libwebpdemux2 \ libwebpmux3 \ + # ffmpeg components + libdav1d6 \ + libmp3lame0 \ + libopencore-amrnb0 \ + libopencore-amrwb0 \ + libopus0 \ + libsnappy1v5 \ + libtheora0 \ + libvorbis0a \ + libvorbisenc2 \ + libvorbisfile3 \ + libvpx7 \ + libx264-164 \ + libx265-199 \ ; # Copy Mastodon sources into final layer @@ -302,11 +374,16 @@ COPY --from=bundler /usr/local/bundle/ /usr/local/bundle/ # Copy libvips components to layer COPY --from=libvips /usr/local/libvips/bin /usr/local/bin COPY --from=libvips /usr/local/libvips/lib /usr/local/lib +# Copy ffpmeg components to layer +COPY --from=ffmpeg /usr/local/ffmpeg/bin /usr/local/bin +COPY --from=ffmpeg /usr/local/ffmpeg/lib /usr/local/lib RUN \ ldconfig; \ # Smoketest media processors - vips -v; + vips -v; \ + ffmpeg -version; \ + ffprobe -version; RUN \ # Precompile bootsnap code for faster Rails startup diff --git a/Gemfile b/Gemfile index b00eaecbcf9..cf930dadb6e 100644 --- a/Gemfile +++ b/Gemfile @@ -9,9 +9,6 @@ gem 'rack', '~> 2.2.7' gem 'rails', '~> 7.1.1' gem 'thor', '~> 1.2' -# For why irb is in the Gemfile, see: https://ruby.social/@st0012/111444685161478182 -gem 'irb', '~> 1.8' - gem 'dotenv' gem 'haml-rails', '~>2.0' gem 'pg', '~> 1.5' @@ -19,7 +16,7 @@ gem 'pghero' gem 'aws-sdk-s3', '~> 1.123', require: false gem 'blurhash', '~> 0.1' -gem 'fog-core', '<= 2.4.0' +gem 'fog-core', '<= 2.5.0' gem 'fog-openstack', '~> 1.0', require: false gem 'kt-paperclip', '~> 7.2' gem 'md-paperclip-azure', '~> 2.2', require: false @@ -28,7 +25,7 @@ gem 'ruby-vips', '~> 2.2', require: false gem 'active_model_serializers', '~> 0.10' gem 'addressable', '~> 2.8' gem 'bootsnap', '~> 1.18.0', require: false -gem 'browser' +gem 'browser', '< 6' # https://github.com/fnando/browser/issues/543 gem 'charlock_holmes', '~> 0.7.7' gem 'chewy', '~> 7.3' gem 'devise', '~> 4.9' @@ -61,6 +58,7 @@ gem 'httplog', '~> 1.7.0' gem 'i18n' gem 'idn-ruby', require: 'idn' gem 'inline_svg' +gem 'irb', '~> 1.8' gem 'kaminari', '~> 1.2' gem 'link_header', '~> 0.0' gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock' @@ -71,7 +69,7 @@ gem 'oj', '~> 3.14' gem 'ox', '~> 2.14' gem 'parslet' gem 'premailer-rails' -gem 'public_suffix', '~> 5.0' +gem 'public_suffix', '~> 6.0' gem 'pundit', '~> 2.3' gem 'rack-attack', '~> 6.6' gem 'rack-cors', '~> 2.0', require: 'rack/cors' @@ -90,7 +88,7 @@ gem 'sidekiq-unique-jobs', '~> 7.1' gem 'simple_form', '~> 5.2' gem 'simple-navigation', '~> 4.4' gem 'stoplight', '~> 4.1' -gem 'strong_migrations', '1.8.0' +gem 'strong_migrations' gem 'tty-prompt', '~> 0.23', require: false gem 'twitter-text', '~> 3.1.0' gem 'tzinfo-data', '~> 1.2023' @@ -102,12 +100,10 @@ gem 'json-ld' gem 'json-ld-preloaded', '~> 3.2' gem 'rdf-normalize', '~> 0.5' -gem 'private_address_check', '~> 0.5' - -gem 'opentelemetry-api', '~> 1.2.5' +gem 'opentelemetry-api', '~> 1.3.0' group :opentelemetry do - gem 'opentelemetry-exporter-otlp', '~> 0.27.0', require: false + gem 'opentelemetry-exporter-otlp', '~> 0.28.0', 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 @@ -118,13 +114,16 @@ group :opentelemetry do 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-rails', '~> 0.31.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 + # Enable usage of all available CPUs/cores during spec runs + gem 'flatware-rspec' + # Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab gem 'rspec-github', '~> 2.4', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 3a76cc50c4c..699e2f83e1e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -89,8 +89,8 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) aes_key_wrap (1.1.0) android_key_attestation (0.3.0) annotate (3.2.0) @@ -100,20 +100,20 @@ GEM attr_required (1.0.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.940.0) - aws-sdk-core (3.197.0) + aws-partitions (1.961.0) + aws-sdk-core (3.201.3) 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.83.0) - aws-sdk-core (~> 3, >= 3.197.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.152.3) - aws-sdk-core (~> 3, >= 3.197.0) + aws-sdk-kms (1.88.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.157.0) + aws-sdk-core (~> 3, >= 3.201.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.8) - aws-sigv4 (1.8.0) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.9.1) aws-eventstream (~> 1, >= 1.0.2) azure-storage-blob (2.0.3) azure-storage-common (~> 2.0) @@ -135,7 +135,7 @@ GEM binding_of_caller (1.0.1) debug_inspector (>= 1.2.0) blurhash (0.1.7) - bootsnap (1.18.3) + bootsnap (1.18.4) msgpack (~> 1.2) brakeman (6.1.2) racc @@ -143,7 +143,7 @@ GEM brpoplpush-redis_script (0.1.3) concurrent-ruby (~> 1.0, >= 1.0.5) redis (>= 1.0, < 6) - builder (3.2.4) + builder (3.3.0) bundler-audit (0.9.1) bundler (>= 1.2.0, < 3) thor (~> 1.0) @@ -159,7 +159,7 @@ GEM case_transform (0.2) activesupport cbor (0.5.9.8) - charlock_holmes (0.7.7) + charlock_holmes (0.7.9) chewy (7.6.0) activesupport (>= 5.2) elasticsearch (>= 7.14.0, < 8) @@ -180,7 +180,7 @@ GEM css_parser (1.17.1) addressable csv (3.3.0) - database_cleaner-active_record (2.1.0) + database_cleaner-active_record (2.2.0) activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) @@ -195,7 +195,7 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-two-factor (5.0.0) + devise-two-factor (5.1.0) activesupport (~> 7.0) devise (~> 4.0) railties (~> 7.0) @@ -208,7 +208,7 @@ GEM activerecord (>= 4.2, < 8) docile (1.4.0) domain_name (0.6.20240107) - doorkeeper (5.6.9) + doorkeeper (5.7.1) railties (>= 5) dotenv (3.1.2) drb (2.2.1) @@ -222,16 +222,16 @@ GEM elasticsearch-transport (7.17.10) faraday (>= 1, < 3) multi_json - email_spec (2.2.2) + email_spec (2.3.0) htmlentities (~> 4.3.3) - launchy (~> 2.1) + launchy (>= 2.1, < 4.0) mail (~> 2.7) - erubi (1.12.0) + erubi (1.13.0) et-orbi (1.2.11) tzinfo - excon (0.110.0) + excon (0.111.0) fabrication (2.31.0) - faker (3.4.1) + faker (3.4.2) i18n (>= 1.8.11, < 2) faraday (1.10.3) faraday-em_http (~> 1.0) @@ -264,7 +264,12 @@ GEM ffi-compiler (1.3.2) ffi (>= 1.15.5) rake - fog-core (2.4.0) + flatware (2.3.2) + thor (< 2.0) + flatware-rspec (2.3.2) + flatware (= 2.3.2) + rspec (>= 3.6) + fog-core (2.5.0) builder excon (~> 0.71) formatador (>= 0.2, < 2.0) @@ -284,7 +289,7 @@ GEM ruby-progressbar (~> 1.4) globalid (1.2.1) activesupport (>= 6.1) - google-protobuf (3.25.3) + google-protobuf (3.25.4) googleapis-common-protos-types (1.14.0) google-protobuf (~> 3.18) haml (6.3.0) @@ -341,7 +346,7 @@ GEM activesupport (>= 3.0) nokogiri (>= 1.6) io-console (0.7.2) - irb (1.13.2) + irb (1.14.0) rdoc (>= 4.0.0) reline (>= 0.4.2) jmespath (1.6.2) @@ -352,17 +357,18 @@ GEM aes_key_wrap bindata httpclient - json-ld (3.3.1) + json-ld (3.3.2) htmlentities (~> 4.3) json-canonicalization (~> 1.0) link_header (~> 0.0, >= 0.0.8) multi_json (~> 1.15) rack (>= 2.2, < 4) rdf (~> 3.3) + rexml (~> 3.2) json-ld-preloaded (3.3.0) json-ld (~> 3.3) rdf (~> 3.3) - json-schema (4.3.0) + json-schema (4.3.1) addressable (>= 2.8) jsonapi-renderer (0.2.2) jwt (2.7.1) @@ -398,6 +404,7 @@ GEM llhttp-ffi (0.5.0) ffi-compiler (~> 1.0) rake (~> 13.0) + logger (1.6.0) lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) @@ -422,10 +429,10 @@ GEM memory_profiler (1.0.2) mime-types (3.5.2) mime-types-data (~> 3.2015) - mime-types-data (3.2024.0604) + mime-types-data (3.2024.0702) mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.23.1) + minitest (5.24.1) msgpack (1.7.2) multi_json (1.15.0) multipart-post (2.4.0) @@ -434,7 +441,7 @@ GEM uri net-http-persistent (4.0.2) connection_pool (~> 2.2) - net-imap (0.4.12) + net-imap (0.4.14) date net-protocol net-ldap (0.19.0) @@ -445,7 +452,7 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.6) + nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) nsa (0.3.0) @@ -486,11 +493,11 @@ GEM openssl (3.2.0) openssl-signature_algorithm (1.3.0) openssl (> 2.0) - opentelemetry-api (1.2.5) + opentelemetry-api (1.3.0) opentelemetry-common (0.20.1) opentelemetry-api (~> 1.0) - opentelemetry-exporter-otlp (0.27.0) - google-protobuf (~> 3.14) + opentelemetry-exporter-otlp (0.28.1) + google-protobuf (>= 3.18) googleapis-common-protos-types (~> 1.3) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) @@ -506,93 +513,86 @@ GEM opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-rack (~> 0.21) - opentelemetry-instrumentation-action_view (0.7.0) + opentelemetry-instrumentation-action_view (0.7.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.1) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_job (0.7.1) + opentelemetry-instrumentation-active_job (0.7.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_model_serializers (0.20.1) + opentelemetry-instrumentation-active_model_serializers (0.20.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-active_record (0.7.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_support (0.5.1) + opentelemetry-instrumentation-active_support (0.6.0) 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-instrumentation-concurrent_ruby (0.21.4) 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-instrumentation-excon (0.22.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-http_client (0.22.4) + opentelemetry-instrumentation-faraday (0.24.6) opentelemetry-api (~> 1.0) - opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-net_http (0.22.4) + opentelemetry-instrumentation-http (0.23.4) opentelemetry-api (~> 1.0) - opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-pg (0.27.3) + opentelemetry-instrumentation-http_client (0.22.7) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-net_http (0.22.7) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-pg (0.27.4) opentelemetry-api (~> 1.0) opentelemetry-helpers-sql-obfuscation opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rack (0.24.3) + opentelemetry-instrumentation-rack (0.24.6) opentelemetry-api (~> 1.0) - opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rails (0.30.2) + opentelemetry-instrumentation-rails (0.31.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-action_mailer (~> 0.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-active_support (~> 0.6.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-redis (0.25.4) + opentelemetry-instrumentation-redis (0.25.7) opentelemetry-api (~> 1.0) - opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-sidekiq (0.25.3) + opentelemetry-instrumentation-sidekiq (0.25.7) 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-sdk (1.5.0) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-registry (~> 0.2) opentelemetry-semantic_conventions - opentelemetry-semantic_conventions (1.10.0) + opentelemetry-semantic_conventions (1.10.1) opentelemetry-api (~> 1.0) orm_adapter (0.5.0) ox (2.14.18) parallel (1.25.1) - parser (3.3.3.0) + parser (3.3.4.0) ast (~> 2.4.1) racc parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) - pg (1.5.6) - pghero (3.5.0) - activerecord (>= 6) + pg (1.5.7) + pghero (3.6.0) + activerecord (>= 6.1) premailer (1.23.0) addressable css_parser (>= 1.12.0) @@ -601,7 +601,6 @@ GEM actionmailer (>= 3) net-smtp premailer (~> 1.7, >= 1.7.9) - private_address_check (0.5.0) propshaft (0.9.0) actionpack (>= 7.0.0) activesupport (>= 7.0.0) @@ -609,13 +608,13 @@ GEM railties (>= 7.0.0) psych (5.1.2) stringio - public_suffix (5.1.1) + public_suffix (6.0.1) puma (6.4.2) nio4r (~> 2.0) pundit (2.3.2) activesupport (>= 3.0.0) raabro (1.4.0) - racc (1.8.0) + racc (1.8.1) rack (2.2.9) rack-attack (6.7.0) rack (>= 1.0, < 4) @@ -677,12 +676,13 @@ GEM zeitwerk (~> 2.6) rainbow (3.1.1) rake (13.2.1) - rdf (3.3.1) + rdf (3.3.2) bcp47_spec (~> 0.2) + bigdecimal (~> 3.1, >= 3.1.5) link_header (~> 0.0, >= 0.0.8) rdf-normalize (0.7.0) rdf (~> 3.3) - rdoc (6.6.3.1) + rdoc (6.7.0) psych (>= 4.0.0) redcarpet (3.6.0) redis (4.8.1) @@ -698,7 +698,7 @@ GEM responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.3.0) + rexml (3.3.4) strscan rotp (6.3.0) rouge (4.2.1) @@ -707,9 +707,13 @@ GEM chunky_png (~> 1.0) rqrcode_core (~> 1.0) rqrcode_core (1.2.0) + rspec (3.13.0) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) rspec-core (3.13.0) rspec-support (~> 3.13.0) - rspec-expectations (3.13.0) + rspec-expectations (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-github (2.4.0) @@ -717,7 +721,7 @@ GEM rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (6.1.2) + rspec-rails (6.1.3) actionpack (>= 6.1) activesupport (>= 6.1) railties (>= 6.1) @@ -731,13 +735,13 @@ GEM rspec-mocks (~> 3.0) sidekiq (>= 5, < 8) rspec-support (3.13.1) - rubocop (1.64.1) + rubocop (1.65.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) + regexp_parser (>= 2.4, < 3.0) rexml (>= 3.2.5, < 4.0) rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) @@ -749,12 +753,12 @@ GEM rubocop-performance (1.21.1) rubocop (>= 1.48.1, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rails (2.25.0) + rubocop-rails (2.25.1) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rspec (3.0.1) + rubocop-rspec (3.0.3) rubocop (~> 1.61) rubocop-rspec_rails (2.30.0) rubocop (~> 1.61) @@ -764,22 +768,24 @@ GEM ruby-saml (1.16.0) nokogiri (>= 1.13.10) rexml - ruby-vips (2.2.1) + ruby-vips (2.2.2) ffi (~> 1.12) + logger ruby2_keywords (0.0.5) rubyzip (2.3.2) rufus-scheduler (3.9.1) fugit (~> 1.1, >= 1.1.6) safety_net_attestation (0.4.0) jwt (~> 2.0) - sanitize (6.1.1) + sanitize (6.1.2) crass (~> 1.0.2) nokogiri (>= 1.12.0) scenic (1.8.0) activerecord (>= 4.0.0) railties (>= 4.0.0) - selenium-webdriver (4.21.1) + selenium-webdriver (4.23.0) base64 (~> 0.2) + logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) @@ -790,10 +796,10 @@ GEM redis (>= 4.5.0, < 5) sidekiq-bulk (0.2.0) sidekiq - sidekiq-scheduler (5.0.3) + sidekiq-scheduler (5.0.6) rufus-scheduler (~> 3.2) sidekiq (>= 6, < 8) - tilt (>= 1.4.0) + tilt (>= 1.4.0, < 3) sidekiq-unique-jobs (7.1.33) brpoplpush-redis_script (> 0.1.1, <= 2.0.0) concurrent-ruby (~> 1.0, >= 1.0.5) @@ -817,8 +823,8 @@ GEM stoplight (4.1.0) redlock (~> 1.0) stringio (3.1.1) - strong_migrations (1.8.0) - activerecord (>= 5.2) + strong_migrations (2.0.0) + activerecord (>= 6.1) strscan (3.1.0) swd (1.3.0) activesupport (>= 3) @@ -830,7 +836,7 @@ GEM unicode-display_width (>= 1.1.1, < 3) terrapin (1.0.1) climate_control - test-prof (1.3.3) + test-prof (1.3.3.1) thor (1.3.1) tilt (2.3.0) timeout (0.4.1) @@ -890,7 +896,7 @@ GEM railties (>= 5.2) semantic_range (>= 2.3.0) webrick (1.8.1) - websocket (1.2.10) + websocket (1.2.11) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -898,7 +904,7 @@ GEM xorcist (1.1.3) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.15) + zeitwerk (2.6.16) PLATFORMS ruby @@ -913,7 +919,7 @@ DEPENDENCIES blurhash (~> 0.1) bootsnap (~> 1.18.0) brakeman (~> 6.0) - browser + browser (< 6) bundler-audit (~> 0.9) capybara (~> 3.39) charlock_holmes (~> 0.7.7) @@ -938,7 +944,8 @@ DEPENDENCIES faker (~> 3.2) fast_blank (~> 1.0) fastimage - fog-core (<= 2.4.0) + flatware-rspec + fog-core (<= 2.5.0) fog-openstack (~> 1.0) fuubar (~> 2.5) haml-rails (~> 2.0) @@ -978,8 +985,8 @@ 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.27.0) + opentelemetry-api (~> 1.3.0) + opentelemetry-exporter-otlp (~> 0.28.0) opentelemetry-instrumentation-active_job (~> 0.7.1) opentelemetry-instrumentation-active_model_serializers (~> 0.20.1) opentelemetry-instrumentation-concurrent_ruby (~> 0.21.2) @@ -990,7 +997,7 @@ DEPENDENCIES 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-rails (~> 0.31.0) opentelemetry-instrumentation-redis (~> 0.25.3) opentelemetry-instrumentation-sidekiq (~> 0.25.2) opentelemetry-sdk (~> 1.4) @@ -999,9 +1006,8 @@ DEPENDENCIES pg (~> 1.5) pghero premailer-rails - private_address_check (~> 0.5) propshaft - public_suffix (~> 5.0) + public_suffix (~> 6.0) puma (~> 6.3) pundit (~> 2.3) rack (~> 2.2.7) @@ -1042,7 +1048,7 @@ DEPENDENCIES simplecov-lcov (~> 0.8) stackprof stoplight (~> 4.1) - strong_migrations (= 1.8.0) + strong_migrations test-prof thor (~> 1.2) tty-prompt (~> 0.23) diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb index a6997b62f7d..d7f88a71f36 100644 --- a/app/controllers/admin/instances_controller.rb +++ b/app/controllers/admin/instances_controller.rb @@ -13,6 +13,7 @@ module Admin def show authorize :instance, :show? @time_period = (6.days.ago.to_date...Time.now.utc.to_date) + @action_logs = Admin::ActionLogFilter.new(target_domain: @instance.domain).results.limit(5) end def destroy diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 4f727c398a0..4759d15bc4b 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -2,7 +2,15 @@ module Admin class TagsController < BaseController - before_action :set_tag + before_action :set_tag, except: [:index] + + PER_PAGE = 20 + + def index + authorize :tag, :index? + + @tags = filtered_tags.page(params[:page]).per(PER_PAGE) + end def show authorize @tag, :show? @@ -31,5 +39,13 @@ module Admin def tag_params params.require(:tag).permit(:name, :display_name, :trendable, :usable, :listable) end + + def filtered_tags + TagFilter.new(filter_params.with_defaults(order: 'newest')).results + end + + def filter_params + params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS) + end end end diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index c1a5e43f882..0980e0ebbc6 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -30,10 +30,10 @@ class Api::BaseController < ApplicationController protected - def limit_param(default_limit) + def limit_param(default_limit, max_limit = nil) return default_limit unless params[:limit] - [params[:limit].to_i.abs, default_limit * 2].min + [params[:limit].to_i.abs, max_limit || (default_limit * 2)].min end def params_slice(*keys) diff --git a/app/controllers/api/v1/admin/domain_allows_controller.rb b/app/controllers/api/v1/admin/domain_allows_controller.rb index 9801d832b8b..24f68aa1bd8 100644 --- a/app/controllers/api/v1/admin/domain_allows_controller.rb +++ b/app/controllers/api/v1/admin/domain_allows_controller.rb @@ -5,6 +5,7 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController include AccountableConcern LIMIT = 100 + MAX_LIMIT = 500 before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:domain_allows' }, only: [:index, :show] before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:domain_allows' }, except: [:index, :show] @@ -47,18 +48,13 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController private def set_domain_allows - @domain_allows = filtered_domain_allows.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) + @domain_allows = DomainAllow.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT, MAX_LIMIT), params_slice(:max_id, :since_id, :min_id)) end def set_domain_allow @domain_allow = DomainAllow.find(params[:id]) end - def filtered_domain_allows - # TODO: no filtering yet - DomainAllow.all - end - def next_path api_v1_admin_domain_allows_url(pagination_params(max_id: pagination_max_id)) if records_continue? end @@ -72,7 +68,7 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController end def records_continue? - @domain_allows.size == limit_param(LIMIT) + @domain_allows.size == limit_param(LIMIT, MAX_LIMIT) end def resource_params diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb index a20a4a9c7f8..b44ae2ae2a2 100644 --- a/app/controllers/api/v1/admin/domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb @@ -5,6 +5,7 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController include AccountableConcern LIMIT = 100 + MAX_LIMIT = 500 before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:domain_blocks' }, only: [:index, :show] before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:domain_blocks' }, except: [:index, :show] @@ -59,18 +60,13 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController 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)) + @domain_blocks = DomainBlock.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT, MAX_LIMIT), params_slice(:max_id, :since_id, :min_id)) end def set_domain_block @domain_block = DomainBlock.find(params[:id]) end - def filtered_domain_blocks - # TODO: no filtering yet - DomainBlock.all - end - def domain_block_params params.permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate) end @@ -88,7 +84,7 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController end def records_continue? - @domain_blocks.size == limit_param(LIMIT) + @domain_blocks.size == limit_param(LIMIT, MAX_LIMIT) end def resource_params diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb index 0e58379a382..b4207147c87 100644 --- a/app/controllers/api/v1/notifications/requests_controller.rb +++ b/app/controllers/api/v1/notifications/requests_controller.rb @@ -5,7 +5,8 @@ class Api::V1::Notifications::RequestsController < Api::BaseController before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: :index before_action :require_user! - before_action :set_request, except: :index + before_action :set_request, only: [:show, :accept, :dismiss] + before_action :set_requests, only: [:accept_bulk, :dismiss_bulk] after_action :insert_pagination_headers, only: :index @@ -28,14 +29,24 @@ class Api::V1::Notifications::RequestsController < Api::BaseController end def dismiss - @request.update!(dismissed: true) + @request.destroy! + render_empty + end + + def accept_bulk + @requests.each { |request| AcceptNotificationRequestService.new.call(request) } + render_empty + end + + def dismiss_bulk + @requests.each(&:destroy!) render_empty end private def load_requests - requests = NotificationRequest.where(account: current_account).where(dismissed: truthy_param?(:dismissed) || false).includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id( + requests = NotificationRequest.where(account: current_account).includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id( limit_param(DEFAULT_ACCOUNTS_LIMIT), params_slice(:max_id, :since_id, :min_id) ) @@ -53,6 +64,10 @@ class Api::V1::Notifications::RequestsController < Api::BaseController @request = NotificationRequest.where(account: current_account).find(params[:id]) end + def set_requests + @requests = NotificationRequest.where(account: current_account, id: Array(params[:id]).uniq.map(&:to_i)) + end + def next_path api_v1_notifications_requests_url pagination_params(max_id: pagination_max_id) unless @requests.empty? end @@ -68,8 +83,4 @@ class Api::V1::Notifications::RequestsController < Api::BaseController def pagination_since_id @requests.first.id end - - def pagination_params(core_params) - params.slice(:dismissed).permit(:dismissed).merge(core_params) - end end diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index 1d0aa10d2e7..13919b400df 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -7,6 +7,8 @@ class Api::V1::NotificationsController < Api::BaseController after_action :insert_pagination_headers, only: :index DEFAULT_NOTIFICATIONS_LIMIT = 40 + DEFAULT_NOTIFICATIONS_COUNT_LIMIT = 100 + MAX_NOTIFICATIONS_COUNT_LIMIT = 1_000 def index with_read_replica do @@ -17,6 +19,14 @@ class Api::V1::NotificationsController < Api::BaseController render json: @notifications, each_serializer: REST::NotificationSerializer, relationships: @relationships end + def unread_count + limit = limit_param(DEFAULT_NOTIFICATIONS_COUNT_LIMIT, MAX_NOTIFICATIONS_COUNT_LIMIT) + + with_read_replica do + render json: { count: browserable_account_notifications.paginate_by_min_id(limit, notification_marker&.last_read_id).count } + end + end + def show @notification = current_account.notifications.without_suspended.find(params[:id]) render json: @notification, serializer: REST::NotificationSerializer @@ -54,6 +64,10 @@ class Api::V1::NotificationsController < Api::BaseController ) end + def notification_marker + current_user.markers.find_by(timeline: 'notifications') + end + def target_statuses_from_notifications @notifications.reject { |notification| notification.target_status.nil? }.map(&:target_status) end diff --git a/app/controllers/api/v1/polls/votes_controller.rb b/app/controllers/api/v1/polls/votes_controller.rb index 513b937ef2d..ad1b82cb522 100644 --- a/app/controllers/api/v1/polls/votes_controller.rb +++ b/app/controllers/api/v1/polls/votes_controller.rb @@ -8,7 +8,7 @@ class Api::V1::Polls::VotesController < Api::BaseController before_action :set_poll def create - VoteService.new.call(current_account, @poll, vote_params[:choices]) + VoteService.new.call(current_account, @poll, vote_params) render json: @poll, serializer: REST::PollSerializer end @@ -22,6 +22,6 @@ class Api::V1::Polls::VotesController < Api::BaseController end def vote_params - params.permit(choices: []) + params.require(:choices) end end diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/reports_controller.rb index 300c9faa3f0..72f358bb5bc 100644 --- a/app/controllers/api/v1/reports_controller.rb +++ b/app/controllers/api/v1/reports_controller.rb @@ -10,7 +10,7 @@ class Api::V1::ReportsController < Api::BaseController @report = ReportService.new.call( current_account, reported_account, - report_params + report_params.merge(application: doorkeeper_token.application) ) render json: @report, serializer: REST::ReportSerializer diff --git a/app/controllers/api/v1/scheduled_statuses_controller.rb b/app/controllers/api/v1/scheduled_statuses_controller.rb index 45ee5865188..c62305d7114 100644 --- a/app/controllers/api/v1/scheduled_statuses_controller.rb +++ b/app/controllers/api/v1/scheduled_statuses_controller.rb @@ -6,6 +6,7 @@ class Api::V1::ScheduledStatusesController < Api::BaseController before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, except: [:update, :destroy] before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:update, :destroy] + before_action :require_user! before_action :set_statuses, only: :index before_action :set_status, except: :index diff --git a/app/controllers/api/v1/statuses/translations_controller.rb b/app/controllers/api/v1/statuses/translations_controller.rb index 7d406b0a36d..8cf495f78ac 100644 --- a/app/controllers/api/v1/statuses/translations_controller.rb +++ b/app/controllers/api/v1/statuses/translations_controller.rb @@ -2,6 +2,7 @@ class Api::V1::Statuses::TranslationsController < Api::V1::Statuses::BaseController before_action -> { doorkeeper_authorize! :read, :'read:statuses' } + before_action :require_user! before_action :set_translation rescue_from TranslationService::NotConfiguredError, with: :not_found diff --git a/app/controllers/api/v1/timelines/base_controller.rb b/app/controllers/api/v1/timelines/base_controller.rb index e79eba79ee5..1dba4a5bb21 100644 --- a/app/controllers/api/v1/timelines/base_controller.rb +++ b/app/controllers/api/v1/timelines/base_controller.rb @@ -3,8 +3,14 @@ class Api::V1::Timelines::BaseController < Api::BaseController after_action :insert_pagination_headers, unless: -> { @statuses.empty? } + before_action :require_user!, if: :require_auth? + private + def require_auth? + !Setting.timeline_preview + end + def pagination_collection @statuses end diff --git a/app/controllers/api/v1/timelines/link_controller.rb b/app/controllers/api/v1/timelines/link_controller.rb index af962c430ff..37ed084f062 100644 --- a/app/controllers/api/v1/timelines/link_controller.rb +++ b/app/controllers/api/v1/timelines/link_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Timelines::LinkController < Api::V1::Timelines::BaseController - before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: :show, if: :require_auth? + before_action -> { authorize_if_got_token! :read, :'read:statuses' } before_action :set_preview_card before_action :set_statuses @@ -17,10 +17,6 @@ class Api::V1::Timelines::LinkController < Api::V1::Timelines::BaseController private - def require_auth? - !Setting.timeline_preview - end - def set_preview_card @preview_card = PreviewCard.joins(:trend).merge(PreviewCardTrend.allowed).find_by!(url: params[:url]) end diff --git a/app/controllers/api/v1/timelines/public_controller.rb b/app/controllers/api/v1/timelines/public_controller.rb index d164854d6a3..029e8fc2c13 100644 --- a/app/controllers/api/v1/timelines/public_controller.rb +++ b/app/controllers/api/v1/timelines/public_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController - before_action :require_user!, only: [:show], if: :require_auth? + before_action -> { authorize_if_got_token! :read, :'read:statuses' } PERMITTED_PARAMS = %i(local remote limit only_media).freeze @@ -13,10 +13,6 @@ class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController private - def require_auth? - !Setting.timeline_preview - end - def load_statuses preloaded_public_statuses_page end diff --git a/app/controllers/api/v1/timelines/tag_controller.rb b/app/controllers/api/v1/timelines/tag_controller.rb index 3bf8f374e19..2b097aab0f8 100644 --- a/app/controllers/api/v1/timelines/tag_controller.rb +++ b/app/controllers/api/v1/timelines/tag_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Timelines::TagController < Api::V1::Timelines::BaseController - before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: :show, if: :require_auth? + before_action -> { authorize_if_got_token! :read, :'read:statuses' } before_action :load_tag PERMITTED_PARAMS = %i(local limit only_media).freeze diff --git a/app/controllers/api/v2_alpha/notifications_controller.rb b/app/controllers/api/v2_alpha/notifications_controller.rb index 19d3ac9018f..837499e8984 100644 --- a/app/controllers/api/v2_alpha/notifications_controller.rb +++ b/app/controllers/api/v2_alpha/notifications_controller.rb @@ -7,20 +7,49 @@ class Api::V2Alpha::NotificationsController < Api::BaseController after_action :insert_pagination_headers, only: :index DEFAULT_NOTIFICATIONS_LIMIT = 40 + DEFAULT_NOTIFICATIONS_COUNT_LIMIT = 100 + MAX_NOTIFICATIONS_COUNT_LIMIT = 1_000 def index with_read_replica do @notifications = load_notifications @group_metadata = load_group_metadata + @grouped_notifications = load_grouped_notifications @relationships = StatusRelationshipsPresenter.new(target_statuses_from_notifications, current_user&.account_id) + @sample_accounts = @grouped_notifications.flat_map(&:sample_accounts) + + # Preload associations to avoid N+1s + ActiveRecord::Associations::Preloader.new(records: @sample_accounts, associations: [:account_stat, { user: :role }]).call end - render json: @notifications.map { |notification| NotificationGroup.from_notification(notification) }, each_serializer: REST::NotificationGroupSerializer, relationships: @relationships, group_metadata: @group_metadata + MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#index rendering') do |span| + statuses = @grouped_notifications.filter_map { |group| group.target_status&.id } + + span.add_attributes( + 'app.notification_grouping.count' => @grouped_notifications.size, + 'app.notification_grouping.sample_account.count' => @sample_accounts.size, + 'app.notification_grouping.sample_account.unique_count' => @sample_accounts.pluck(:id).uniq.size, + 'app.notification_grouping.status.count' => statuses.size, + 'app.notification_grouping.status.unique_count' => statuses.uniq.size + ) + + presenter = GroupedNotificationsPresenter.new(@grouped_notifications) + render json: presenter, serializer: REST::DedupNotificationGroupSerializer, relationships: @relationships, group_metadata: @group_metadata + end + end + + def unread_count + limit = limit_param(DEFAULT_NOTIFICATIONS_COUNT_LIMIT, MAX_NOTIFICATIONS_COUNT_LIMIT) + + with_read_replica do + render json: { count: browserable_account_notifications.paginate_groups_by_min_id(limit, min_id: notification_marker&.last_read_id).count } + end end def show @notification = current_account.notifications.without_suspended.find_by!(group_key: params[:id]) - render json: NotificationGroup.from_notification(@notification), serializer: REST::NotificationGroupSerializer + presenter = GroupedNotificationsPresenter.new([NotificationGroup.from_notification(@notification)]) + render json: presenter, serializer: REST::DedupNotificationGroupSerializer end def clear @@ -36,25 +65,35 @@ class Api::V2Alpha::NotificationsController < Api::BaseController private def load_notifications - notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_grouped_paginated_by_id( - limit_param(DEFAULT_NOTIFICATIONS_LIMIT), - params_slice(:max_id, :since_id, :min_id) - ) + MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#load_notifications') do + notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_grouped_paginated_by_id( + limit_param(DEFAULT_NOTIFICATIONS_LIMIT), + params_slice(:max_id, :since_id, :min_id) + ) - Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses| - preload_collection(target_statuses, Status) + Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses| + preload_collection(target_statuses, Status) + end end end def load_group_metadata return {} if @notifications.empty? - browserable_account_notifications - .where(group_key: @notifications.filter_map(&:group_key)) - .where(id: (@notifications.last.id)..(@notifications.first.id)) - .group(:group_key) - .pluck(:group_key, 'min(notifications.id) as min_id', 'max(notifications.id) as max_id', 'max(notifications.created_at) as latest_notification_at') - .to_h { |group_key, min_id, max_id, latest_notification_at| [group_key, { min_id: min_id, max_id: max_id, latest_notification_at: latest_notification_at }] } + MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#load_group_metadata') do + browserable_account_notifications + .where(group_key: @notifications.filter_map(&:group_key)) + .where(id: (@notifications.last.id)..(@notifications.first.id)) + .group(:group_key) + .pluck(:group_key, 'min(notifications.id) as min_id', 'max(notifications.id) as max_id', 'max(notifications.created_at) as latest_notification_at') + .to_h { |group_key, min_id, max_id, latest_notification_at| [group_key, { min_id: min_id, max_id: max_id, latest_notification_at: latest_notification_at }] } + end + end + + def load_grouped_notifications + MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#load_grouped_notifications') do + @notifications.map { |notification| NotificationGroup.from_notification(notification, max_id: @group_metadata.dig(notification.group_key, :max_id)) } + end end def browserable_account_notifications @@ -65,6 +104,10 @@ class Api::V2Alpha::NotificationsController < Api::BaseController ) end + def notification_marker + current_user.markers.find_by(timeline: 'notifications') + end + def target_statuses_from_notifications @notifications.filter_map(&:target_status) end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 66e0f7e3051..62e3355ae62 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -20,7 +20,6 @@ class ApplicationController < ActionController::Base helper_method :current_theme helper_method :single_user_mode? helper_method :use_seamless_external_login? - helper_method :omniauth_only? helper_method :sso_account_settings helper_method :limited_federation_mode? helper_method :body_class_string @@ -137,10 +136,6 @@ class ApplicationController < ActionController::Base Devise.pam_authentication || Devise.ldap_authentication end - def omniauth_only? - ENV['OMNIAUTH_ONLY'] == 'true' - end - def sso_account_settings ENV.fetch('SSO_ACCOUNT_SETTINGS', nil) end diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index 7ca7be5f8ef..bf5c84ccf45 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -5,7 +5,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController layout 'auth' - before_action :set_body_classes before_action :set_confirmation_user!, only: [:show, :confirm_captcha] before_action :redirect_confirmed_user, if: :signed_in_confirmed_user? @@ -73,10 +72,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController user_signed_in? && current_user.confirmed? && current_user.unconfirmed_email.blank? end - def set_body_classes - @body_classes = 'lighter' - end - def after_resending_confirmation_instructions_path_for(_resource_name) if user_signed_in? if current_user.confirmed? && current_user.approved? diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb index de001f062b0..7c1ff59671d 100644 --- a/app/controllers/auth/passwords_controller.rb +++ b/app/controllers/auth/passwords_controller.rb @@ -3,7 +3,6 @@ class Auth::PasswordsController < Devise::PasswordsController skip_before_action :check_self_destruct! before_action :redirect_invalid_reset_token, only: :edit, unless: :reset_password_token_is_valid? - before_action :set_body_classes layout 'auth' @@ -24,10 +23,6 @@ class Auth::PasswordsController < Devise::PasswordsController redirect_to new_password_path(resource_name) end - def set_body_classes - @body_classes = 'lighter' - end - def reset_password_token_is_valid? resource_class.with_reset_password_token(params[:reset_password_token]).present? end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index f858c0ad932..c12960934e3 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -25,6 +25,14 @@ class Auth::RegistrationsController < Devise::RegistrationsController super(&:build_invite_request) end + def edit # rubocop:disable Lint/UselessMethodDefinition + super + end + + def create # rubocop:disable Lint/UselessMethodDefinition + super + end + def update super do |resource| resource.clear_other_sessions(current_session.session_id) if resource.saved_change_to_encrypted_password? @@ -97,7 +105,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController private def set_body_classes - @body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter' + @body_classes = 'admin' if %w(edit update).include?(action_name) end def set_invite diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 6ed7b2baacc..6210e4dbf9a 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -16,8 +16,6 @@ class Auth::SessionsController < Devise::SessionsController include Auth::TwoFactorAuthenticationConcern - before_action :set_body_classes - content_security_policy only: :new do |p| p.form_action(false) end @@ -103,10 +101,6 @@ class Auth::SessionsController < Devise::SessionsController private - def set_body_classes - @body_classes = 'lighter' - end - def home_paths(resource) paths = [about_path, '/explore'] diff --git a/app/controllers/auth/setup_controller.rb b/app/controllers/auth/setup_controller.rb index 40916d28877..ad872dc6072 100644 --- a/app/controllers/auth/setup_controller.rb +++ b/app/controllers/auth/setup_controller.rb @@ -5,7 +5,6 @@ class Auth::SetupController < ApplicationController before_action :authenticate_user! before_action :require_unconfirmed_or_pending! - before_action :set_body_classes before_action :set_user skip_before_action :require_functional! @@ -35,10 +34,6 @@ class Auth::SetupController < ApplicationController @user = current_user end - def set_body_classes - @body_classes = 'lighter' - end - def user_params params.require(:user).permit(:email) end diff --git a/app/controllers/concerns/auth/two_factor_authentication_concern.rb b/app/controllers/concerns/auth/two_factor_authentication_concern.rb index 404164751a8..0fb11428dca 100644 --- a/app/controllers/concerns/auth/two_factor_authentication_concern.rb +++ b/app/controllers/concerns/auth/two_factor_authentication_concern.rb @@ -83,7 +83,6 @@ module Auth::TwoFactorAuthenticationConcern def prompt_for_two_factor(user) register_attempt_in_session(user) - @body_classes = 'lighter' @webauthn_enabled = user.webauthn_enabled? @scheme_type = if user.webauthn_enabled? && user_params[:otp_attempt].blank? 'webauthn' diff --git a/app/controllers/concerns/challengable_concern.rb b/app/controllers/concerns/challengable_concern.rb index 09874fb4054..c8d1a0bef7f 100644 --- a/app/controllers/concerns/challengable_concern.rb +++ b/app/controllers/concerns/challengable_concern.rb @@ -42,7 +42,6 @@ module ChallengableConcern end def render_challenge - @body_classes = 'lighter' render 'auth/challenges/new', layout: 'auth' end diff --git a/app/controllers/mail_subscriptions_controller.rb b/app/controllers/mail_subscriptions_controller.rb index 1caeaaacf4c..34df75f63ad 100644 --- a/app/controllers/mail_subscriptions_controller.rb +++ b/app/controllers/mail_subscriptions_controller.rb @@ -5,7 +5,6 @@ class MailSubscriptionsController < ApplicationController skip_before_action :require_functional! - before_action :set_body_classes before_action :set_user before_action :set_type @@ -25,10 +24,6 @@ class MailSubscriptionsController < ApplicationController not_found unless @user end - def set_body_classes - @body_classes = 'lighter' - end - def set_type @type = email_type_from_param end diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 8440df6b7e6..7bb22453ca0 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -17,6 +17,7 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio def destroy Web::PushSubscription.unsubscribe_for(params[:id], current_resource_owner) + Doorkeeper::Application.find_by(id: params[:id])&.close_streaming_sessions(current_resource_owner) super end diff --git a/app/helpers/admin/tags_helper.rb b/app/helpers/admin/tags_helper.rb new file mode 100644 index 00000000000..eb928a6db2b --- /dev/null +++ b/app/helpers/admin/tags_helper.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Admin::TagsHelper + def admin_tags_moderation_options + [ + [t('admin.tags.moderation.reviewed'), 'reviewed'], + [t('admin.tags.moderation.review_requested'), 'review_requested'], + [t('admin.tags.moderation.unreviewed'), 'unreviewed'], + [t('admin.tags.moderation.trendable'), 'trendable'], + [t('admin.tags.moderation.not_trendable'), 'not_trendable'], + [t('admin.tags.moderation.usable'), 'usable'], + [t('admin.tags.moderation.not_usable'), 'not_usable'], + ] + end +end diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index b0f2077db0e..932a3420db9 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -141,7 +141,7 @@ module JsonLdHelper def safe_for_forwarding?(original, compacted) original.without('@context', 'signature').all? do |key, value| compacted_value = compacted[key] - return false unless value.class == compacted_value.class + return false unless value.instance_of?(compacted_value.class) if value.is_a?(Hash) safe_for_forwarding?(value, compacted_value) diff --git a/app/helpers/theme_helper.rb b/app/helpers/theme_helper.rb index d15259851c0..fab899a5332 100644 --- a/app/helpers/theme_helper.rb +++ b/app/helpers/theme_helper.rb @@ -3,8 +3,10 @@ module ThemeHelper def theme_style_tags(theme) if theme == 'system' - stylesheet_pack_tag('mastodon-light', media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous') + - stylesheet_pack_tag('default', media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous') + ''.html_safe.tap do |tags| + tags << stylesheet_pack_tag('mastodon-light', media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous') + tags << stylesheet_pack_tag('default', media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous') + end else stylesheet_pack_tag theme, media: 'all', crossorigin: 'anonymous' end @@ -12,8 +14,10 @@ module ThemeHelper def theme_color_tags(theme) if theme == 'system' - tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)') + - tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)') + ''.html_safe.tap do |tags| + tags << tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)') + tags << tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)') + end else tag.meta name: 'theme-color', content: theme_color_for(theme) end diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index 40a9b7c0ca6..b06675c2ee2 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -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, @@ -431,6 +431,42 @@ Rails.delegate(document, 'img.custom-emoji', 'mouseout', ({ target }) => { target.src = target.dataset.static; }); +const setInputDisabled = ( + input: HTMLInputElement | HTMLSelectElement, + disabled: boolean, +) => { + input.disabled = disabled; + + const wrapper = input.closest('.with_label'); + if (wrapper) { + wrapper.classList.toggle('disabled', input.disabled); + + const hidden = + input.type === 'checkbox' && + wrapper.querySelector('input[type=hidden][value="0"]'); + if (hidden) { + hidden.disabled = input.disabled; + } + } +}; + +Rails.delegate( + document, + '#account_statuses_cleanup_policy_enabled', + 'change', + ({ target }) => { + if (!(target instanceof HTMLInputElement) || !target.form) return; + + target.form + .querySelectorAll< + HTMLInputElement | HTMLSelectElement + >('input:not([type=hidden], #account_statuses_cleanup_policy_enabled), select') + .forEach((input) => { + setInputDisabled(input, !target.checked); + }); + }, +); + // Empty the honeypot fields in JS in case something like an extension // automatically filled them. Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => { diff --git a/app/javascript/hooks/useLinks.ts b/app/javascript/hooks/useLinks.ts new file mode 100644 index 00000000000..f08b9500da1 --- /dev/null +++ b/app/javascript/hooks/useLinks.ts @@ -0,0 +1,61 @@ +import { useCallback } from 'react'; + +import { useHistory } from 'react-router-dom'; + +import { openURL } from 'mastodon/actions/search'; +import { useAppDispatch } from 'mastodon/store'; + +const isMentionClick = (element: HTMLAnchorElement) => + element.classList.contains('mention'); + +const isHashtagClick = (element: HTMLAnchorElement) => + element.textContent?.[0] === '#' || + element.previousSibling?.textContent?.endsWith('#'); + +export const useLinks = () => { + const history = useHistory(); + const dispatch = useAppDispatch(); + + const handleHashtagClick = useCallback( + (element: HTMLAnchorElement) => { + const { textContent } = element; + + if (!textContent) return; + + history.push(`/tags/${textContent.replace(/^#/, '')}`); + }, + [history], + ); + + const handleMentionClick = useCallback( + (element: HTMLAnchorElement) => { + dispatch( + openURL(element.href, history, () => { + window.location.href = element.href; + }), + ); + }, + [dispatch, history], + ); + + const handleClick = useCallback( + (e: React.MouseEvent) => { + const target = (e.target as HTMLElement).closest('a'); + + if (!target || e.button !== 0 || e.ctrlKey || e.metaKey) { + return; + } + + if (isMentionClick(target)) { + e.preventDefault(); + handleMentionClick(target); + } else if (isHashtagClick(target)) { + e.preventDefault(); + handleHashtagClick(target); + } + }, + [handleMentionClick, handleHashtagClick], + ); + + return handleClick; +}; diff --git a/app/javascript/hooks/useTimeout.ts b/app/javascript/hooks/useTimeout.ts new file mode 100644 index 00000000000..bb1e8848dd5 --- /dev/null +++ b/app/javascript/hooks/useTimeout.ts @@ -0,0 +1,44 @@ +import { useRef, useCallback, useEffect } from 'react'; + +export const useTimeout = () => { + const timeoutRef = useRef>(); + const callbackRef = useRef<() => void>(); + + const set = useCallback((callback: () => void, delay: number) => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + + callbackRef.current = callback; + timeoutRef.current = setTimeout(callback, delay); + }, []); + + const delay = useCallback((delay: number) => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + + if (!callbackRef.current) { + return; + } + + timeoutRef.current = setTimeout(callbackRef.current, delay); + }, []); + + const cancel = useCallback(() => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + timeoutRef.current = undefined; + callbackRef.current = undefined; + } + }, []); + + useEffect( + () => () => { + cancel(); + }, + [cancel], + ); + + return [set, cancel, delay] as const; +}; diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js index cea915e5f17..9144235195e 100644 --- a/app/javascript/mastodon/actions/accounts.js +++ b/app/javascript/mastodon/actions/accounts.js @@ -1,3 +1,5 @@ +import { browserHistory } from 'mastodon/components/router'; + import api, { getLinks } from '../api'; import { @@ -676,3 +678,13 @@ export const updateAccount = ({ displayName, note, avatar, header, discoverable, dispatch(importFetchedAccount(response.data)); }); }; + +export const navigateToProfile = (accountId) => { + return (_dispatch, getState) => { + const acct = getState().accounts.getIn([accountId, 'acct']); + + if (acct) { + browserHistory.push(`/@${acct}`); + } + }; +}; diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index b07dff182a8..aa1c6de20eb 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -4,6 +4,7 @@ import axios from 'axios'; import { throttle } from 'lodash'; import api from 'mastodon/api'; +import { browserHistory } from 'mastodon/components/router'; import { search as emojiSearch } from 'mastodon/features/emoji/emoji_mart_search_light'; import { tagHistory } from 'mastodon/settings'; @@ -88,9 +89,9 @@ const messages = defineMessages({ saved: { id: 'compose.saved.body', defaultMessage: 'Post saved.' }, }); -export const ensureComposeIsVisible = (getState, routerHistory) => { +export const ensureComposeIsVisible = (getState) => { if (!getState().getIn(['compose', 'mounted'])) { - routerHistory.push('/publish'); + browserHistory.push('/publish'); } }; @@ -110,14 +111,26 @@ export function changeCompose(text) { }; } -export function replyCompose(status, routerHistory) { +export function replyCompose(status) { return (dispatch, getState) => { dispatch({ type: COMPOSE_REPLY, status: status, }); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); + }; +} + +export function replyComposeById(statusId) { + return (dispatch, getState) => { + const state = getState(); + const status = state.statuses.get(statusId); + + if (status) { + const account = state.accounts.get(status.get('account')); + dispatch(replyCompose(status.set('account', account))); + } }; } @@ -133,38 +146,44 @@ export function resetCompose() { }; } -export const focusCompose = (routerHistory, defaultText) => (dispatch, getState) => { +export const focusCompose = (defaultText) => (dispatch, getState) => { dispatch({ type: COMPOSE_FOCUS, defaultText, }); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); }; -export function mentionCompose(account, routerHistory) { +export function mentionCompose(account) { return (dispatch, getState) => { dispatch({ type: COMPOSE_MENTION, account: account, }); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); }; } -export function directCompose(account, routerHistory) { +export function mentionComposeById(accountId) { + return (dispatch, getState) => { + dispatch(mentionCompose(getState().accounts.get(accountId))); + }; +} + +export function directCompose(account) { return (dispatch, getState) => { dispatch({ type: COMPOSE_DIRECT, account: account, }); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); }; } -export function submitCompose(routerHistory) { +export function submitCompose() { return function (dispatch, getState) { const status = getState().getIn(['compose', 'text'], ''); const media = getState().getIn(['compose', 'media_attachments']); @@ -214,8 +233,8 @@ export function submitCompose(routerHistory) { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), }, }).then(function (response) { - if (routerHistory && (routerHistory.location.pathname === '/publish' || routerHistory.location.pathname === '/statuses/new') && window.history.state) { - routerHistory.goBack(); + if ((browserHistory.location.pathname === '/publish' || browserHistory.location.pathname === '/statuses/new') && window.history.state) { + browserHistory.goBack(); } dispatch(insertIntoTagHistory(response.data.tags, status)); @@ -249,7 +268,7 @@ export function submitCompose(routerHistory) { message: statusId === null ? messages.published : messages.saved, action: messages.open, dismissAfter: 10000, - onClick: () => routerHistory.push(`/@${response.data.account.username}/${response.data.id}`), + onClick: () => browserHistory.push(`/@${response.data.account.username}/${response.data.id}`), })); }).catch(function (error) { dispatch(submitComposeFail(error)); @@ -279,7 +298,7 @@ export function submitComposeFail(error) { export function uploadCompose(files) { return function (dispatch, getState) { - const uploadLimit = 4; + const uploadLimit = getState().getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments']); const media = getState().getIn(['compose', 'media_attachments']); const pending = getState().getIn(['compose', 'pending_media_attachments']); const progress = new Array(files.length).fill(0); @@ -299,7 +318,7 @@ export function uploadCompose(files) { dispatch(uploadComposeRequest()); for (const [i, file] of Array.from(files).entries()) { - if (media.size + i > 3) break; + if (media.size + i > (uploadLimit - 1)) break; const data = new FormData(); data.append('file', file); diff --git a/app/javascript/mastodon/actions/directory.js b/app/javascript/mastodon/actions/directory.js deleted file mode 100644 index 7a0748029d9..00000000000 --- a/app/javascript/mastodon/actions/directory.js +++ /dev/null @@ -1,62 +0,0 @@ -import api from '../api'; - -import { fetchRelationships } from './accounts'; -import { importFetchedAccounts } from './importer'; - -export const DIRECTORY_FETCH_REQUEST = 'DIRECTORY_FETCH_REQUEST'; -export const DIRECTORY_FETCH_SUCCESS = 'DIRECTORY_FETCH_SUCCESS'; -export const DIRECTORY_FETCH_FAIL = 'DIRECTORY_FETCH_FAIL'; - -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) => { - dispatch(fetchDirectoryRequest()); - - api().get('/api/v1/directory', { params: { ...params, limit: 20 } }).then(({ data }) => { - dispatch(importFetchedAccounts(data)); - dispatch(fetchDirectorySuccess(data)); - dispatch(fetchRelationships(data.map(x => x.id))); - }).catch(error => dispatch(fetchDirectoryFail(error))); -}; - -export const fetchDirectoryRequest = () => ({ - type: DIRECTORY_FETCH_REQUEST, -}); - -export const fetchDirectorySuccess = accounts => ({ - type: DIRECTORY_FETCH_SUCCESS, - accounts, -}); - -export const fetchDirectoryFail = error => ({ - type: DIRECTORY_FETCH_FAIL, - error, -}); - -export const expandDirectory = params => (dispatch, getState) => { - dispatch(expandDirectoryRequest()); - - const loadedItems = getState().getIn(['user_lists', 'directory', 'items']).size; - - 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))); - }).catch(error => dispatch(expandDirectoryFail(error))); -}; - -export const expandDirectoryRequest = () => ({ - type: DIRECTORY_EXPAND_REQUEST, -}); - -export const expandDirectorySuccess = accounts => ({ - type: DIRECTORY_EXPAND_SUCCESS, - accounts, -}); - -export const expandDirectoryFail = error => ({ - type: DIRECTORY_EXPAND_FAIL, - error, -}); diff --git a/app/javascript/mastodon/actions/directory.ts b/app/javascript/mastodon/actions/directory.ts new file mode 100644 index 00000000000..34ac309c66c --- /dev/null +++ b/app/javascript/mastodon/actions/directory.ts @@ -0,0 +1,37 @@ +import type { List as ImmutableList } from 'immutable'; + +import { apiGetDirectory } from 'mastodon/api/directory'; +import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; + +import { fetchRelationships } from './accounts'; +import { importFetchedAccounts } from './importer'; + +export const fetchDirectory = createDataLoadingThunk( + 'directory/fetch', + async (params: Parameters[0]) => + apiGetDirectory(params), + (data, { dispatch }) => { + dispatch(importFetchedAccounts(data)); + dispatch(fetchRelationships(data.map((x) => x.id))); + + return { accounts: data }; + }, +); + +export const expandDirectory = createDataLoadingThunk( + 'directory/expand', + async (params: Parameters[0], { getState }) => { + const loadedItems = getState().user_lists.getIn([ + 'directory', + 'items', + ]) as ImmutableList; + + return apiGetDirectory({ ...params, offset: loadedItems.size }, 20); + }, + (data, { dispatch }) => { + dispatch(importFetchedAccounts(data)); + dispatch(fetchRelationships(data.map((x) => x.id))); + + return { accounts: data }; + }, +); diff --git a/app/javascript/mastodon/actions/importer/index.js b/app/javascript/mastodon/actions/importer/index.js index d906bdfb14c..516a7a79733 100644 --- a/app/javascript/mastodon/actions/importer/index.js +++ b/app/javascript/mastodon/actions/importer/index.js @@ -76,8 +76,8 @@ export function importFetchedStatuses(statuses) { pushUnique(polls, normalizePoll(status.poll, getState().getIn(['polls', status.poll.id]))); } - if (status.card?.author_account) { - pushUnique(accounts, status.card.author_account); + if (status.card) { + status.card.authors.forEach(author => author.account && pushUnique(accounts, author.account)); } } diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js index be76b0f3916..c09a3f442c7 100644 --- a/app/javascript/mastodon/actions/importer/normalizer.js +++ b/app/javascript/mastodon/actions/importer/normalizer.js @@ -36,8 +36,15 @@ export function normalizeStatus(status, normalOldStatus) { normalStatus.poll = status.poll.id; } - if (status.card?.author_account) { - normalStatus.card = { ...status.card, author_account: status.card.author_account.id }; + if (status.card) { + normalStatus.card = { + ...status.card, + authors: status.card.authors.map(author => ({ + ...author, + accountId: author.account?.id, + account: undefined, + })), + }; } if (status.filtered) { diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js index 57f2459c016..b296a5006ac 100644 --- a/app/javascript/mastodon/actions/interactions.js +++ b/app/javascript/mastodon/actions/interactions.js @@ -1,7 +1,11 @@ +import { boostModal } from 'mastodon/initial_state'; + import api, { getLinks } from '../api'; import { fetchRelationships } from './accounts'; import { importFetchedAccounts, importFetchedStatus } from './importer'; +import { unreblog, reblog } from './interactions_typed'; +import { openModal } from './modal'; export const REBLOGS_EXPAND_REQUEST = 'REBLOGS_EXPAND_REQUEST'; export const REBLOGS_EXPAND_SUCCESS = 'REBLOGS_EXPAND_SUCCESS'; @@ -432,3 +436,49 @@ export function unpinFail(status, error) { skipLoading: true, }; } + +function toggleReblogWithoutConfirmation(status, privacy) { + return (dispatch) => { + if (status.get('reblogged')) { + dispatch(unreblog({ statusId: status.get('id') })); + } else { + dispatch(reblog({ statusId: status.get('id'), privacy })); + } + }; +} + +export function toggleReblog(statusId, skipModal = false) { + return (dispatch, getState) => { + const state = getState(); + let status = state.statuses.get(statusId); + + if (!status) + return; + + // The reblog modal expects a pre-filled account in status + // TODO: fix this by having the reblog modal get a statusId and do the work itself + status = status.set('account', state.accounts.get(status.get('account'))); + + if (boostModal && !skipModal) { + dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: (status, privacy) => dispatch(toggleReblogWithoutConfirmation(status, privacy)) } })); + } else { + dispatch(toggleReblogWithoutConfirmation(status)); + } + }; +} + +export function toggleFavourite(statusId) { + return (dispatch, getState) => { + const state = getState(); + const status = state.statuses.get(statusId); + + if (!status) + return; + + if (status.get('favourited')) { + dispatch(unfavourite(status)); + } else { + dispatch(favourite(status)); + } + }; +} diff --git a/app/javascript/mastodon/actions/markers.ts b/app/javascript/mastodon/actions/markers.ts index 03f577c540f..77d91d9b9c3 100644 --- a/app/javascript/mastodon/actions/markers.ts +++ b/app/javascript/mastodon/actions/markers.ts @@ -75,9 +75,17 @@ interface MarkerParam { } 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 - return state.getIn(['notifications', 'lastReadId']); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access + const enableBeta = state.settings.getIn( + ['notifications', 'groupingBeta'], + false, + ) as boolean; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return enableBeta + ? state.notificationGroups.lastReadId + : // @ts-expect-error state.notifications is not yet typed + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + state.getIn(['notifications', 'lastReadId']); } const buildPostMarkersParams = (state: RootState) => { diff --git a/app/javascript/mastodon/actions/notification_groups.ts b/app/javascript/mastodon/actions/notification_groups.ts new file mode 100644 index 00000000000..fc5807c8c08 --- /dev/null +++ b/app/javascript/mastodon/actions/notification_groups.ts @@ -0,0 +1,144 @@ +import { createAction } from '@reduxjs/toolkit'; + +import { + apiClearNotifications, + apiFetchNotifications, +} from 'mastodon/api/notifications'; +import type { ApiAccountJSON } from 'mastodon/api_types/accounts'; +import type { + ApiNotificationGroupJSON, + ApiNotificationJSON, +} from 'mastodon/api_types/notifications'; +import { allNotificationTypes } from 'mastodon/api_types/notifications'; +import type { ApiStatusJSON } from 'mastodon/api_types/statuses'; +import type { NotificationGap } from 'mastodon/reducers/notification_groups'; +import { + selectSettingsNotificationsExcludedTypes, + selectSettingsNotificationsQuickFilterActive, +} from 'mastodon/selectors/settings'; +import type { AppDispatch } from 'mastodon/store'; +import { + createAppAsyncThunk, + createDataLoadingThunk, +} from 'mastodon/store/typed_functions'; + +import { importFetchedAccounts, importFetchedStatuses } from './importer'; +import { NOTIFICATIONS_FILTER_SET } from './notifications'; +import { saveSettings } from './settings'; + +function excludeAllTypesExcept(filter: string) { + return allNotificationTypes.filter((item) => item !== filter); +} + +function dispatchAssociatedRecords( + dispatch: AppDispatch, + notifications: ApiNotificationGroupJSON[] | ApiNotificationJSON[], +) { + const fetchedAccounts: ApiAccountJSON[] = []; + const fetchedStatuses: ApiStatusJSON[] = []; + + notifications.forEach((notification) => { + if (notification.type === 'admin.report') { + fetchedAccounts.push(notification.report.target_account); + } + + if (notification.type === 'moderation_warning') { + fetchedAccounts.push(notification.moderation_warning.target_account); + } + + if ('status' in notification) { + fetchedStatuses.push(notification.status); + } + }); + + if (fetchedAccounts.length > 0) + dispatch(importFetchedAccounts(fetchedAccounts)); + + if (fetchedStatuses.length > 0) + dispatch(importFetchedStatuses(fetchedStatuses)); +} + +export const fetchNotifications = createDataLoadingThunk( + 'notificationGroups/fetch', + async (_params, { getState }) => { + const activeFilter = + selectSettingsNotificationsQuickFilterActive(getState()); + + return apiFetchNotifications({ + exclude_types: + activeFilter === 'all' + ? selectSettingsNotificationsExcludedTypes(getState()) + : excludeAllTypesExcept(activeFilter), + }); + }, + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); + dispatchAssociatedRecords(dispatch, notifications); + const payload: (ApiNotificationGroupJSON | NotificationGap)[] = + notifications; + + // TODO: might be worth not using gaps for that… + // if (nextLink) payload.push({ type: 'gap', loadUrl: nextLink.uri }); + if (notifications.length > 1) + payload.push({ type: 'gap', maxId: notifications.at(-1)?.page_min_id }); + + return payload; + // dispatch(submitMarkers()); + }, +); + +export const fetchNotificationsGap = createDataLoadingThunk( + 'notificationGroups/fetchGap', + async (params: { gap: NotificationGap }) => + apiFetchNotifications({ max_id: params.gap.maxId }), + + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); + dispatchAssociatedRecords(dispatch, notifications); + + return { notifications }; + }, +); + +export const processNewNotificationForGroups = createAppAsyncThunk( + 'notificationGroups/processNew', + (notification: ApiNotificationJSON, { dispatch }) => { + dispatchAssociatedRecords(dispatch, [notification]); + + return notification; + }, +); + +export const loadPending = createAction('notificationGroups/loadPending'); + +export const updateScrollPosition = createAction<{ top: boolean }>( + 'notificationGroups/updateScrollPosition', +); + +export const setNotificationsFilter = createAppAsyncThunk( + 'notifications/filter/set', + ({ filterType }: { filterType: string }, { dispatch }) => { + dispatch({ + type: NOTIFICATIONS_FILTER_SET, + path: ['notifications', 'quickFilter', 'active'], + value: filterType, + }); + // dispatch(expandNotifications({ forceLoad: true })); + void dispatch(fetchNotifications()); + dispatch(saveSettings()); + }, +); + +export const clearNotifications = createDataLoadingThunk( + 'notifications/clear', + () => apiClearNotifications(), +); + +export const markNotificationsAsRead = createAction( + 'notificationGroups/markAsRead', +); + +export const mountNotifications = createAction('notificationGroups/mount'); +export const unmountNotifications = createAction('notificationGroups/unmount'); diff --git a/app/javascript/mastodon/actions/notification_policies.ts b/app/javascript/mastodon/actions/notification_policies.ts new file mode 100644 index 00000000000..b182bcf6996 --- /dev/null +++ b/app/javascript/mastodon/actions/notification_policies.ts @@ -0,0 +1,22 @@ +import { createAction } from '@reduxjs/toolkit'; + +import { + apiGetNotificationPolicy, + apiUpdateNotificationsPolicy, +} from 'mastodon/api/notification_policies'; +import type { NotificationPolicy } from 'mastodon/models/notification_policy'; +import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; + +export const fetchNotificationPolicy = createDataLoadingThunk( + 'notificationPolicy/fetch', + () => apiGetNotificationPolicy(), +); + +export const updateNotificationsPolicy = createDataLoadingThunk( + 'notificationPolicy/update', + (policy: Partial) => apiUpdateNotificationsPolicy(policy), +); + +export const decreasePendingNotificationsCount = createAction( + 'notificationPolicy/decreasePendingNotificationCount', +); diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index fe728aa26ee..48afb003ad3 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -18,6 +18,7 @@ import { importFetchedStatuses, } from './importer'; import { submitMarkers } from './markers'; +import { decreasePendingNotificationsCount } from './notification_policies'; import { notificationsUpdate } from "./notifications_typed"; import { register as registerPushNotifications } from './push_notifications'; import { saveSettings } from './settings'; @@ -32,7 +33,6 @@ export const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL'; export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET'; -export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP'; export const NOTIFICATIONS_LOAD_PENDING = 'NOTIFICATIONS_LOAD_PENDING'; @@ -44,10 +44,6 @@ export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ'; export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT'; export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION'; -export const NOTIFICATION_POLICY_FETCH_REQUEST = 'NOTIFICATION_POLICY_FETCH_REQUEST'; -export const NOTIFICATION_POLICY_FETCH_SUCCESS = 'NOTIFICATION_POLICY_FETCH_SUCCESS'; -export const NOTIFICATION_POLICY_FETCH_FAIL = 'NOTIFICATION_POLICY_FETCH_FAIL'; - export const NOTIFICATION_REQUESTS_FETCH_REQUEST = 'NOTIFICATION_REQUESTS_FETCH_REQUEST'; export const NOTIFICATION_REQUESTS_FETCH_SUCCESS = 'NOTIFICATION_REQUESTS_FETCH_SUCCESS'; export const NOTIFICATION_REQUESTS_FETCH_FAIL = 'NOTIFICATION_REQUESTS_FETCH_FAIL'; @@ -89,6 +85,12 @@ const fetchRelatedRelationships = (dispatch, notifications) => { } }; +const selectNotificationCountForRequest = (state, id) => { + const requests = state.getIn(['notificationRequests', 'items']); + const thisRequest = requests.find(request => request.get('id') === id); + return thisRequest ? thisRequest.get('notifications_count') : 0; +}; + export const loadPending = () => ({ type: NOTIFICATIONS_LOAD_PENDING, }); @@ -178,7 +180,7 @@ const noOp = () => {}; let expandNotificationsController = new AbortController(); -export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { +export function expandNotifications({ maxId, forceLoad = false } = {}, done = noOp) { return (dispatch, getState) => { const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']); const notifications = getState().get('notifications'); @@ -261,16 +263,6 @@ export function expandNotificationsFail(error, isLoadingMore) { }; } -export function clearNotifications() { - return (dispatch) => { - dispatch({ - type: NOTIFICATIONS_CLEAR, - }); - - api().post('/api/v1/notifications/clear'); - }; -} - export function scrollTopNotifications(top) { return { type: NOTIFICATIONS_SCROLL_TOP, @@ -346,40 +338,6 @@ export function setBrowserPermission (value) { }; } -export const fetchNotificationPolicy = () => (dispatch) => { - dispatch(fetchNotificationPolicyRequest()); - - api().get('/api/v1/notifications/policy').then(({ data }) => { - dispatch(fetchNotificationPolicySuccess(data)); - }).catch(err => { - dispatch(fetchNotificationPolicyFail(err)); - }); -}; - -export const fetchNotificationPolicyRequest = () => ({ - type: NOTIFICATION_POLICY_FETCH_REQUEST, -}); - -export const fetchNotificationPolicySuccess = policy => ({ - type: NOTIFICATION_POLICY_FETCH_SUCCESS, - policy, -}); - -export const fetchNotificationPolicyFail = error => ({ - type: NOTIFICATION_POLICY_FETCH_FAIL, - error, -}); - -export const updateNotificationsPolicy = params => (dispatch) => { - dispatch(fetchNotificationPolicyRequest()); - - api().put('/api/v1/notifications/policy', params).then(({ data }) => { - dispatch(fetchNotificationPolicySuccess(data)); - }).catch(err => { - dispatch(fetchNotificationPolicyFail(err)); - }); -}; - export const fetchNotificationRequests = () => (dispatch, getState) => { const params = {}; @@ -482,11 +440,13 @@ export const fetchNotificationRequestFail = (id, error) => ({ error, }); -export const acceptNotificationRequest = id => (dispatch) => { +export const acceptNotificationRequest = (id) => (dispatch, getState) => { + const count = selectNotificationCountForRequest(getState(), id); dispatch(acceptNotificationRequestRequest(id)); api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { dispatch(acceptNotificationRequestSuccess(id)); + dispatch(decreasePendingNotificationsCount(count)); }).catch(err => { dispatch(acceptNotificationRequestFail(id, err)); }); @@ -508,11 +468,13 @@ export const acceptNotificationRequestFail = (id, error) => ({ error, }); -export const dismissNotificationRequest = id => (dispatch) => { +export const dismissNotificationRequest = (id) => (dispatch, getState) => { + const count = selectNotificationCountForRequest(getState(), id); dispatch(dismissNotificationRequestRequest(id)); api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ dispatch(dismissNotificationRequestSuccess(id)); + dispatch(decreasePendingNotificationsCount(count)); }).catch(err => { dispatch(dismissNotificationRequestFail(id, err)); }); diff --git a/app/javascript/mastodon/actions/notifications_migration.tsx b/app/javascript/mastodon/actions/notifications_migration.tsx new file mode 100644 index 00000000000..f856e56828f --- /dev/null +++ b/app/javascript/mastodon/actions/notifications_migration.tsx @@ -0,0 +1,18 @@ +import { createAppAsyncThunk } from 'mastodon/store'; + +import { fetchNotifications } from './notification_groups'; +import { expandNotifications } from './notifications'; + +export const initializeNotifications = createAppAsyncThunk( + 'notifications/initialize', + (_, { dispatch, getState }) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access + const enableBeta = getState().settings.getIn( + ['notifications', 'groupingBeta'], + false, + ) as boolean; + + if (enableBeta) void dispatch(fetchNotifications()); + else dispatch(expandNotifications()); + }, +); diff --git a/app/javascript/mastodon/actions/notifications_typed.ts b/app/javascript/mastodon/actions/notifications_typed.ts index 176362f4b1e..88d942d45e5 100644 --- a/app/javascript/mastodon/actions/notifications_typed.ts +++ b/app/javascript/mastodon/actions/notifications_typed.ts @@ -1,11 +1,6 @@ import { createAction } from '@reduxjs/toolkit'; -import type { ApiAccountJSON } from '../api_types/accounts'; -// To be replaced once ApiNotificationJSON type exists -interface FakeApiNotificationJSON { - type: string; - account: ApiAccountJSON; -} +import type { ApiNotificationJSON } from 'mastodon/api_types/notifications'; export const notificationsUpdate = createAction( 'notifications/update', @@ -13,7 +8,7 @@ export const notificationsUpdate = createAction( playSound, ...args }: { - notification: FakeApiNotificationJSON; + notification: ApiNotificationJSON; usePendingItems: boolean; playSound: boolean; }) => ({ diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js index a60b80dc2c0..340cee8024b 100644 --- a/app/javascript/mastodon/actions/statuses.js +++ b/app/javascript/mastodon/actions/statuses.js @@ -1,3 +1,5 @@ +import { browserHistory } from 'mastodon/components/router'; + import api from '../api'; import { ensureComposeIsVisible, setComposeToStatus } from './compose'; @@ -93,7 +95,7 @@ export function redraft(status, raw_text) { }; } -export const editStatus = (id, routerHistory) => (dispatch, getState) => { +export const editStatus = (id) => (dispatch, getState) => { let status = getState().getIn(['statuses', id]); if (status.get('poll')) { @@ -104,7 +106,7 @@ export const editStatus = (id, routerHistory) => (dispatch, getState) => { api().get(`/api/v1/statuses/${id}/source`).then(response => { dispatch(fetchStatusSourceSuccess()); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); dispatch(setComposeToStatus(status, response.data.text, response.data.spoiler_text)); }).catch(error => { dispatch(fetchStatusSourceFail(error)); @@ -124,7 +126,7 @@ export const fetchStatusSourceFail = error => ({ error, }); -export function deleteStatus(id, routerHistory, withRedraft = false) { +export function deleteStatus(id, withRedraft = false) { return (dispatch, getState) => { let status = getState().getIn(['statuses', id]); @@ -141,7 +143,7 @@ export function deleteStatus(id, routerHistory, withRedraft = false) { if (withRedraft) { dispatch(redraft(status, response.data.text)); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); } }).catch(error => { dispatch(deleteStatusFail(id, error)); @@ -308,6 +310,21 @@ export function revealStatus(ids) { }; } +export function toggleStatusSpoilers(statusId) { + return (dispatch, getState) => { + const status = getState().statuses.get(statusId); + + if (!status) + return; + + if (status.get('hidden')) { + dispatch(revealStatus(statusId)); + } else { + dispatch(hideStatus(statusId)); + } + }; +} + export function toggleStatusCollapse(id, isCollapsed) { return { type: STATUS_COLLAPSE, @@ -348,3 +365,15 @@ export const undoStatusTranslation = (id, pollId) => ({ id, pollId, }); + +export const navigateToStatus = (statusId) => { + return (_dispatch, getState) => { + const state = getState(); + const accountId = state.statuses.getIn([statusId, 'account']); + const acct = state.accounts.getIn([accountId, 'acct']); + + if (acct) { + browserHistory.push(`/@${acct}/${statusId}`); + } + }; +}; diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index 9daeb3c60fc..f50f41b0d9c 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -10,6 +10,7 @@ import { deleteAnnouncement, } from './announcements'; import { updateConversations } from './conversations'; +import { processNewNotificationForGroups } from './notification_groups'; import { updateNotifications, expandNotifications } from './notifications'; import { updateStatus } from './statuses'; import { @@ -77,7 +78,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti }, onDisconnect() { - dispatch(disconnectTimeline(timelineId)); + dispatch(disconnectTimeline({ timeline: timelineId })); if (options.fallback) { // @ts-expect-error @@ -98,10 +99,16 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti case 'delete': dispatch(deleteFromTimelines(data.payload)); break; - case 'notification': + case 'notification': { // @ts-expect-error - dispatch(updateNotifications(JSON.parse(data.payload), messages, locale)); + const notificationJSON = JSON.parse(data.payload); + dispatch(updateNotifications(notificationJSON, messages, locale)); + // TODO: remove this once the groups feature replaces the previous one + if(getState().notificationGroups.groups.length > 0) { + dispatch(processNewNotificationForGroups(notificationJSON)); + } break; + } case 'conversation': // @ts-expect-error dispatch(updateConversations(JSON.parse(data.payload))); diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index dc37cdf1f1f..f0ea46118e0 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -6,9 +6,11 @@ import { usePendingItems as preferPendingItems } from 'mastodon/initial_state'; import { importFetchedStatus, importFetchedStatuses } from './importer'; import { submitMarkers } from './markers'; +import {timelineDelete} from './timelines_typed'; + +export { disconnectTimeline } from './timelines_typed'; export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'; -export const TIMELINE_DELETE = 'TIMELINE_DELETE'; export const TIMELINE_CLEAR = 'TIMELINE_CLEAR'; export const TIMELINE_EXPAND_REQUEST = 'TIMELINE_EXPAND_REQUEST'; @@ -17,7 +19,6 @@ export const TIMELINE_EXPAND_FAIL = 'TIMELINE_EXPAND_FAIL'; export const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP'; export const TIMELINE_LOAD_PENDING = 'TIMELINE_LOAD_PENDING'; -export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT'; export const TIMELINE_CONNECT = 'TIMELINE_CONNECT'; export const TIMELINE_MARK_AS_PARTIAL = 'TIMELINE_MARK_AS_PARTIAL'; @@ -62,16 +63,10 @@ export function updateTimeline(timeline, status, accept) { export function deleteFromTimelines(id) { return (dispatch, getState) => { const accountId = getState().getIn(['statuses', id, 'account']); - const references = getState().get('statuses').filter(status => status.get('reblog') === id).map(status => status.get('id')); + const references = getState().get('statuses').filter(status => status.get('reblog') === id).map(status => status.get('id')).valueSeq().toJSON(); const reblogOf = getState().getIn(['statuses', id, 'reblog'], null); - dispatch({ - type: TIMELINE_DELETE, - id, - accountId, - references, - reblogOf, - }); + dispatch(timelineDelete({ statusId: id, accountId, references, reblogOf })); }; } @@ -163,6 +158,7 @@ export const expandAccountTimeline = (accountId, { maxId, withReplies, t export const expandAccountFeaturedTimeline = (accountId, { tagged } = {}) => expandTimeline(`account:${accountId}:pinned${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true, tagged }); export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 }); export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done); +export const expandLinkTimeline = (url, { maxId } = {}, done = noOp) => expandTimeline(`link:${url}`, `/api/v1/timelines/link`, { url, max_id: maxId }, done); export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}, done = noOp) => { return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, { max_id: maxId, @@ -225,12 +221,6 @@ export function connectTimeline(timeline) { }; } -export const disconnectTimeline = timeline => ({ - type: TIMELINE_DISCONNECT, - timeline, - usePendingItems: preferPendingItems, -}); - export const markAsPartial = timeline => ({ type: TIMELINE_MARK_AS_PARTIAL, timeline, diff --git a/app/javascript/mastodon/actions/timelines_typed.ts b/app/javascript/mastodon/actions/timelines_typed.ts new file mode 100644 index 00000000000..07d82b2f015 --- /dev/null +++ b/app/javascript/mastodon/actions/timelines_typed.ts @@ -0,0 +1,20 @@ +import { createAction } from '@reduxjs/toolkit'; + +import { usePendingItems as preferPendingItems } from 'mastodon/initial_state'; + +export const disconnectTimeline = createAction( + 'timeline/disconnect', + ({ timeline }: { timeline: string }) => ({ + payload: { + timeline, + usePendingItems: preferPendingItems, + }, + }), +); + +export const timelineDelete = createAction<{ + statusId: string; + accountId: string; + references: string[]; + reblogOf: string | null; +}>('timelines/delete'); diff --git a/app/javascript/mastodon/actions/trends.js b/app/javascript/mastodon/actions/trends.js index 01089fccbb7..0bdf17a5d26 100644 --- a/app/javascript/mastodon/actions/trends.js +++ b/app/javascript/mastodon/actions/trends.js @@ -51,7 +51,7 @@ export const fetchTrendingLinks = () => (dispatch) => { api() .get('/api/v1/trends/links', { params: { limit: 20 } }) .then(({ data }) => { - dispatch(importFetchedAccounts(data.map(link => link.author_account).filter(account => !!account))); + dispatch(importFetchedAccounts(data.flatMap(link => link.authors.map(author => author.account)).filter(account => !!account))); dispatch(fetchTrendingLinksSuccess(data)); }) .catch(err => dispatch(fetchTrendingLinksFail(err))); diff --git a/app/javascript/mastodon/api.ts b/app/javascript/mastodon/api.ts index e133125a29c..24672290c74 100644 --- a/app/javascript/mastodon/api.ts +++ b/app/javascript/mastodon/api.ts @@ -59,16 +59,49 @@ export default function api(withAuthorization = true) { }); } +type RequestParamsOrData = Record; + export async function apiRequest( method: Method, url: string, - params?: Record, + args: { + params?: RequestParamsOrData; + data?: RequestParamsOrData; + } = {}, ) { const { data } = await api().request({ method, url: '/api/' + url, - data: params, + ...args, }); return data; } + +export async function apiRequestGet( + url: string, + params?: RequestParamsOrData, +) { + return apiRequest('GET', url, { params }); +} + +export async function apiRequestPost( + url: string, + data?: RequestParamsOrData, +) { + return apiRequest('POST', url, { data }); +} + +export async function apiRequestPut( + url: string, + data?: RequestParamsOrData, +) { + return apiRequest('PUT', url, { data }); +} + +export async function apiRequestDelete( + url: string, + params?: RequestParamsOrData, +) { + return apiRequest('DELETE', url, { params }); +} diff --git a/app/javascript/mastodon/api/accounts.ts b/app/javascript/mastodon/api/accounts.ts index 3d89e44b267..bd1757e827e 100644 --- a/app/javascript/mastodon/api/accounts.ts +++ b/app/javascript/mastodon/api/accounts.ts @@ -1,7 +1,7 @@ -import { apiRequest } from 'mastodon/api'; +import { apiRequestPost } from 'mastodon/api'; import type { ApiRelationshipJSON } from 'mastodon/api_types/relationships'; export const apiSubmitAccountNote = (id: string, value: string) => - apiRequest('post', `v1/accounts/${id}/note`, { + apiRequestPost(`v1/accounts/${id}/note`, { comment: value, }); diff --git a/app/javascript/mastodon/api/directory.ts b/app/javascript/mastodon/api/directory.ts new file mode 100644 index 00000000000..cd39f8f2690 --- /dev/null +++ b/app/javascript/mastodon/api/directory.ts @@ -0,0 +1,15 @@ +import { apiRequestGet } from 'mastodon/api'; +import type { ApiAccountJSON } from 'mastodon/api_types/accounts'; + +export const apiGetDirectory = ( + params: { + order: string; + local: boolean; + offset?: number; + }, + limit = 20, +) => + apiRequestGet('v1/directory', { + ...params, + limit, + }); diff --git a/app/javascript/mastodon/api/interactions.ts b/app/javascript/mastodon/api/interactions.ts index 4c466a1b46d..118b5f06d20 100644 --- a/app/javascript/mastodon/api/interactions.ts +++ b/app/javascript/mastodon/api/interactions.ts @@ -1,10 +1,10 @@ -import { apiRequest } from 'mastodon/api'; +import { apiRequestPost } 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`, { + apiRequestPost<{ reblog: Status }>(`v1/statuses/${statusId}/reblog`, { visibility, }); export const apiUnreblog = (statusId: string) => - apiRequest('post', `v1/statuses/${statusId}/unreblog`); + apiRequestPost(`v1/statuses/${statusId}/unreblog`); diff --git a/app/javascript/mastodon/api/notification_policies.ts b/app/javascript/mastodon/api/notification_policies.ts new file mode 100644 index 00000000000..4032134fb58 --- /dev/null +++ b/app/javascript/mastodon/api/notification_policies.ts @@ -0,0 +1,9 @@ +import { apiRequestGet, apiRequestPut } from 'mastodon/api'; +import type { NotificationPolicyJSON } from 'mastodon/api_types/notification_policies'; + +export const apiGetNotificationPolicy = () => + apiRequestGet('/v1/notifications/policy'); + +export const apiUpdateNotificationsPolicy = ( + policy: Partial, +) => apiRequestPut('/v1/notifications/policy', policy); diff --git a/app/javascript/mastodon/api/notifications.ts b/app/javascript/mastodon/api/notifications.ts new file mode 100644 index 00000000000..ed187da5ecc --- /dev/null +++ b/app/javascript/mastodon/api/notifications.ts @@ -0,0 +1,25 @@ +import api, { apiRequest, getLinks } from 'mastodon/api'; +import type { ApiNotificationGroupsResultJSON } from 'mastodon/api_types/notifications'; + +export const apiFetchNotifications = async (params?: { + exclude_types?: string[]; + max_id?: string; +}) => { + const response = await api().request({ + method: 'GET', + url: '/api/v2_alpha/notifications', + params, + }); + + const { statuses, accounts, notification_groups } = response.data; + + return { + statuses, + accounts, + notifications: notification_groups, + links: getLinks(response), + }; +}; + +export const apiClearNotifications = () => + apiRequest('POST', 'v1/notifications/clear'); diff --git a/app/javascript/mastodon/api_types/notification_policies.ts b/app/javascript/mastodon/api_types/notification_policies.ts new file mode 100644 index 00000000000..0f4a2d132e0 --- /dev/null +++ b/app/javascript/mastodon/api_types/notification_policies.ts @@ -0,0 +1,12 @@ +// See app/serializers/rest/notification_policy_serializer.rb + +export interface NotificationPolicyJSON { + filter_not_following: boolean; + filter_not_followers: boolean; + filter_new_accounts: boolean; + filter_private_mentions: boolean; + summary: { + pending_requests_count: number; + pending_notifications_count: number; + }; +} diff --git a/app/javascript/mastodon/api_types/notifications.ts b/app/javascript/mastodon/api_types/notifications.ts new file mode 100644 index 00000000000..ed73ceda6b3 --- /dev/null +++ b/app/javascript/mastodon/api_types/notifications.ts @@ -0,0 +1,151 @@ +// See app/serializers/rest/notification_group_serializer.rb + +import type { AccountWarningAction } from 'mastodon/models/notification_group'; + +import type { ApiAccountJSON } from './accounts'; +import type { ApiReportJSON } from './reports'; +import type { ApiStatusJSON } from './statuses'; + +// See app/model/notification.rb +export const allNotificationTypes = [ + 'follow', + 'follow_request', + 'favourite', + 'reblog', + 'mention', + 'poll', + 'status', + 'update', + 'admin.sign_up', + 'admin.report', + 'moderation_warning', + 'severed_relationships', +]; + +export type NotificationWithStatusType = + | 'favourite' + | 'reblog' + | 'status' + | 'mention' + | 'poll' + | 'update'; + +export type NotificationType = + | NotificationWithStatusType + | 'follow' + | 'follow_request' + | 'moderation_warning' + | 'severed_relationships' + | 'admin.sign_up' + | 'admin.report'; + +export interface BaseNotificationJSON { + id: string; + type: NotificationType; + created_at: string; + group_key: string; + account: ApiAccountJSON; +} + +export interface BaseNotificationGroupJSON { + group_key: string; + notifications_count: number; + type: NotificationType; + sample_account_ids: string[]; + latest_page_notification_at: string; // FIXME: This will only be present if the notification group is returned in a paginated list, not requested directly + most_recent_notification_id: string; + page_min_id?: string; + page_max_id?: string; +} + +interface NotificationGroupWithStatusJSON extends BaseNotificationGroupJSON { + type: NotificationWithStatusType; + status_id: string; +} + +interface NotificationWithStatusJSON extends BaseNotificationJSON { + type: NotificationWithStatusType; + status: ApiStatusJSON; +} + +interface ReportNotificationGroupJSON extends BaseNotificationGroupJSON { + type: 'admin.report'; + report: ApiReportJSON; +} + +interface ReportNotificationJSON extends BaseNotificationJSON { + type: 'admin.report'; + report: ApiReportJSON; +} + +type SimpleNotificationTypes = 'follow' | 'follow_request' | 'admin.sign_up'; +interface SimpleNotificationGroupJSON extends BaseNotificationGroupJSON { + type: SimpleNotificationTypes; +} + +interface SimpleNotificationJSON extends BaseNotificationJSON { + type: SimpleNotificationTypes; +} + +export interface ApiAccountWarningJSON { + id: string; + action: AccountWarningAction; + text: string; + status_ids: string[]; + created_at: string; + target_account: ApiAccountJSON; + appeal: unknown; +} + +interface ModerationWarningNotificationGroupJSON + extends BaseNotificationGroupJSON { + type: 'moderation_warning'; + moderation_warning: ApiAccountWarningJSON; +} + +interface ModerationWarningNotificationJSON extends BaseNotificationJSON { + type: 'moderation_warning'; + moderation_warning: ApiAccountWarningJSON; +} + +export interface ApiAccountRelationshipSeveranceEventJSON { + id: string; + type: 'account_suspension' | 'domain_block' | 'user_domain_block'; + purged: boolean; + target_name: string; + followers_count: number; + following_count: number; + created_at: string; +} + +interface AccountRelationshipSeveranceNotificationGroupJSON + extends BaseNotificationGroupJSON { + type: 'severed_relationships'; + event: ApiAccountRelationshipSeveranceEventJSON; +} + +interface AccountRelationshipSeveranceNotificationJSON + extends BaseNotificationJSON { + type: 'severed_relationships'; + event: ApiAccountRelationshipSeveranceEventJSON; +} + +export type ApiNotificationJSON = + | SimpleNotificationJSON + | ReportNotificationJSON + | AccountRelationshipSeveranceNotificationJSON + | NotificationWithStatusJSON + | ModerationWarningNotificationJSON; + +export type ApiNotificationGroupJSON = + | SimpleNotificationGroupJSON + | ReportNotificationGroupJSON + | AccountRelationshipSeveranceNotificationGroupJSON + | NotificationGroupWithStatusJSON + | ModerationWarningNotificationGroupJSON; + +export interface ApiNotificationGroupsResultJSON { + accounts: ApiAccountJSON[]; + statuses: ApiStatusJSON[]; + notification_groups: ApiNotificationGroupJSON[]; +} diff --git a/app/javascript/mastodon/api_types/reports.ts b/app/javascript/mastodon/api_types/reports.ts new file mode 100644 index 00000000000..b11cfdd2eb5 --- /dev/null +++ b/app/javascript/mastodon/api_types/reports.ts @@ -0,0 +1,16 @@ +import type { ApiAccountJSON } from './accounts'; + +export type ReportCategory = 'other' | 'spam' | 'legal' | 'violation'; + +export interface ApiReportJSON { + id: string; + action_taken: unknown; + action_taken_at: unknown; + category: ReportCategory; + comment: string; + forwarded: boolean; + created_at: string; + status_ids: string[]; + rule_ids: string[]; + target_account: ApiAccountJSON; +} diff --git a/app/javascript/mastodon/api_types/statuses.ts b/app/javascript/mastodon/api_types/statuses.ts index c7dd33b5dad..a934faeb7a7 100644 --- a/app/javascript/mastodon/api_types/statuses.ts +++ b/app/javascript/mastodon/api_types/statuses.ts @@ -30,6 +30,12 @@ export interface ApiMentionJSON { acct: string; } +export interface ApiPreviewCardAuthorJSON { + name: string; + url: string; + account?: ApiAccountJSON; +} + export interface ApiPreviewCardJSON { url: string; title: string; @@ -38,6 +44,7 @@ export interface ApiPreviewCardJSON { type: string; author_name: string; author_url: string; + author_account?: ApiAccountJSON; provider_name: string; provider_url: string; html: string; @@ -48,6 +55,7 @@ export interface ApiPreviewCardJSON { embed_url: string; blurhash: string; published_at: string; + authors: ApiPreviewCardAuthorJSON[]; } export interface ApiStatusJSON { diff --git a/app/javascript/mastodon/components/__tests__/hashtag_bar.tsx b/app/javascript/mastodon/components/__tests__/hashtag_bar.tsx index b7225fc92e0..f86c1a2a6bc 100644 --- a/app/javascript/mastodon/components/__tests__/hashtag_bar.tsx +++ b/app/javascript/mastodon/components/__tests__/hashtag_bar.tsx @@ -165,7 +165,7 @@ describe('computeHashtagBarForStatus', () => { ); }); - it('puts the hashtags in the bar if a status content has hashtags in the only line and has a media', () => { + it('does not put the hashtags in the bar if a status content has hashtags in the only line and has a media', () => { const status = createStatus( '

This is my content! #hashtag

', ['hashtag'], diff --git a/app/javascript/mastodon/components/account.jsx b/app/javascript/mastodon/components/account.jsx index 18a31cba244..2a748e67ff1 100644 --- a/app/javascript/mastodon/components/account.jsx +++ b/app/javascript/mastodon/components/account.jsx @@ -131,7 +131,7 @@ const Account = ({ size = 46, account, onFollow, onBlock, onMute, onMuteNotifica return (
- +
diff --git a/app/javascript/mastodon/components/account_bio.tsx b/app/javascript/mastodon/components/account_bio.tsx new file mode 100644 index 00000000000..9d523c7402c --- /dev/null +++ b/app/javascript/mastodon/components/account_bio.tsx @@ -0,0 +1,20 @@ +import { useLinks } from 'mastodon/../hooks/useLinks'; + +export const AccountBio: React.FC<{ + note: string; + className: string; +}> = ({ note, className }) => { + const handleClick = useLinks(); + + if (note.length === 0 || note === '

') { + return null; + } + + return ( +
+ ); +}; diff --git a/app/javascript/mastodon/components/account_fields.tsx b/app/javascript/mastodon/components/account_fields.tsx new file mode 100644 index 00000000000..e297f99e3a1 --- /dev/null +++ b/app/javascript/mastodon/components/account_fields.tsx @@ -0,0 +1,42 @@ +import classNames from 'classnames'; + +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; +import { useLinks } from 'mastodon/../hooks/useLinks'; +import { Icon } from 'mastodon/components/icon'; +import type { Account } from 'mastodon/models/account'; + +export const AccountFields: React.FC<{ + fields: Account['fields']; + limit: number; +}> = ({ fields, limit = -1 }) => { + const handleClick = useLinks(); + + if (fields.size === 0) { + return null; + } + + return ( +
+ {fields.take(limit).map((pair, i) => ( +
+
+ +
+ {pair.get('verified_at') && ( + + )} + +
+
+ ))} +
+ ); +}; diff --git a/app/javascript/mastodon/components/avatar.tsx b/app/javascript/mastodon/components/avatar.tsx index 8f866a3c656..8b16296c2c0 100644 --- a/app/javascript/mastodon/components/avatar.tsx +++ b/app/javascript/mastodon/components/avatar.tsx @@ -11,6 +11,8 @@ interface Props { style?: React.CSSProperties; inline?: boolean; animate?: boolean; + counter?: number | string; + counterBorderColor?: string; } export const Avatar: React.FC = ({ @@ -19,6 +21,8 @@ export const Avatar: React.FC = ({ size = 20, inline = false, style: styleFromParent, + counter, + counterBorderColor, }) => { const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate); @@ -43,6 +47,14 @@ export const Avatar: React.FC = ({ style={style} > {src && } + {counter && ( +
+ {counter} +
+ )}
); }; diff --git a/app/javascript/mastodon/components/column_header.jsx b/app/javascript/mastodon/components/column_header.jsx deleted file mode 100644 index 42183f336db..00000000000 --- a/app/javascript/mastodon/components/column_header.jsx +++ /dev/null @@ -1,233 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent, useCallback } from 'react'; - -import { FormattedMessage, injectIntl, defineMessages, useIntl } from 'react-intl'; - -import classNames from 'classnames'; -import { withRouter } from 'react-router-dom'; - -import AddIcon from '@/material-icons/400-24px/add.svg?react'; -import ArrowBackIcon from '@/material-icons/400-24px/arrow_back.svg?react'; -import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; -import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; -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({ - show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' }, - hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' }, - moveLeft: { id: 'column_header.moveLeft_settings', defaultMessage: 'Move column to the left' }, - moveRight: { id: 'column_header.moveRight_settings', defaultMessage: 'Move column to the right' }, - back: { id: 'column_back_button.label', defaultMessage: 'Back' }, -}); - -const BackButton = ({ onlyIcon }) => { - const history = useAppHistory(); - const intl = useIntl(); - - const handleBackClick = useCallback(() => { - if (history.location?.state?.fromMastodon) { - history.goBack(); - } else { - history.push('/'); - } - }, [history]); - - return ( - - ); -}; - -BackButton.propTypes = { - onlyIcon: PropTypes.bool, -}; - -class ColumnHeader extends PureComponent { - static propTypes = { - identity: identityContextPropShape, - intl: PropTypes.object.isRequired, - title: PropTypes.node, - icon: PropTypes.string, - iconComponent: PropTypes.func, - active: PropTypes.bool, - multiColumn: PropTypes.bool, - extraButton: PropTypes.node, - showBackButton: PropTypes.bool, - children: PropTypes.node, - pinned: PropTypes.bool, - placeholder: PropTypes.bool, - onPin: PropTypes.func, - onMove: PropTypes.func, - onClick: PropTypes.func, - appendContent: PropTypes.node, - collapseIssues: PropTypes.bool, - ...WithRouterPropTypes, - }; - - state = { - collapsed: true, - animating: false, - }; - - handleToggleClick = (e) => { - e.stopPropagation(); - this.setState({ collapsed: !this.state.collapsed, animating: true }); - }; - - handleTitleClick = () => { - this.props.onClick?.(); - }; - - handleMoveLeft = () => { - this.props.onMove(-1); - }; - - handleMoveRight = () => { - this.props.onMove(1); - }; - - handleTransitionEnd = () => { - this.setState({ animating: false }); - }; - - handlePin = () => { - if (!this.props.pinned) { - this.props.history.replace('/'); - } - - this.props.onPin(); - }; - - render () { - const { title, icon, iconComponent, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent, collapseIssues, history } = this.props; - const { collapsed, animating } = this.state; - - const wrapperClassName = classNames('column-header__wrapper', { - 'active': active, - }); - - const buttonClassName = classNames('column-header', { - 'active': active, - }); - - const collapsibleClassName = classNames('column-header__collapsible', { - 'collapsed': collapsed, - 'animating': animating, - }); - - const collapsibleButtonClassName = classNames('column-header__button', { - 'active': !collapsed, - }); - - let extraContent, pinButton, moveButtons, backButton, collapseButton; - - if (children) { - extraContent = ( -
- {children} -
- ); - } - - if (multiColumn && pinned) { - pinButton = ; - - moveButtons = ( -
- - -
- ); - } else if (multiColumn && this.props.onPin) { - pinButton = ; - } - - if (history && !pinned && ((multiColumn && history.location?.state?.fromMastodon) || showBackButton)) { - backButton = ; - } - - const collapsedContent = [ - extraContent, - ]; - - if (multiColumn) { - collapsedContent.push( -
- {pinButton} - {moveButtons} -
- ); - } - - if (this.props.identity.signedIn && (children || (multiColumn && this.props.onPin))) { - collapseButton = ( - - ); - } - - const hasTitle = (icon || iconComponent) && title; - - const component = ( -
-

- {hasTitle && ( - <> - {backButton} - - - - )} - - {!hasTitle && backButton} - -
- {extraButton} - {collapseButton} -
-

- -
-
- {(!collapsed || animating) && collapsedContent} -
-
- - {appendContent} -
- ); - - if (placeholder) { - return component; - } else { - return ( - {component} - ); - } - } - -} - -export default injectIntl(withIdentity(withRouter(ColumnHeader))); diff --git a/app/javascript/mastodon/components/column_header.tsx b/app/javascript/mastodon/components/column_header.tsx new file mode 100644 index 00000000000..ec946cab3ed --- /dev/null +++ b/app/javascript/mastodon/components/column_header.tsx @@ -0,0 +1,301 @@ +import { useCallback, useState } from 'react'; + +import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; + +import classNames from 'classnames'; + +import AddIcon from '@/material-icons/400-24px/add.svg?react'; +import ArrowBackIcon from '@/material-icons/400-24px/arrow_back.svg?react'; +import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import SettingsIcon from '@/material-icons/400-24px/settings.svg?react'; +import type { IconProp } from 'mastodon/components/icon'; +import { Icon } from 'mastodon/components/icon'; +import { ButtonInTabsBar } from 'mastodon/features/ui/util/columns_context'; +import { useIdentity } from 'mastodon/identity_context'; + +import { useAppHistory } from './router'; + +const messages = defineMessages({ + show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' }, + hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' }, + moveLeft: { + id: 'column_header.moveLeft_settings', + defaultMessage: 'Move column to the left', + }, + moveRight: { + id: 'column_header.moveRight_settings', + defaultMessage: 'Move column to the right', + }, + back: { id: 'column_back_button.label', defaultMessage: 'Back' }, +}); + +const BackButton: React.FC<{ + onlyIcon: boolean; +}> = ({ onlyIcon }) => { + const history = useAppHistory(); + const intl = useIntl(); + + const handleBackClick = useCallback(() => { + if (history.location.state?.fromMastodon) { + history.goBack(); + } else { + history.push('/'); + } + }, [history]); + + return ( + + ); +}; + +export interface Props { + title?: string; + icon?: string; + iconComponent?: IconProp; + active?: boolean; + children?: React.ReactNode; + pinned?: boolean; + multiColumn?: boolean; + extraButton?: React.ReactNode; + showBackButton?: boolean; + placeholder?: boolean; + appendContent?: React.ReactNode; + collapseIssues?: boolean; + onClick?: () => void; + onMove?: (arg0: number) => void; + onPin?: () => void; +} + +export const ColumnHeader: React.FC = ({ + title, + icon, + iconComponent, + active, + children, + pinned, + multiColumn, + extraButton, + showBackButton, + placeholder, + appendContent, + collapseIssues, + onClick, + onMove, + onPin, +}) => { + const intl = useIntl(); + const { signedIn } = useIdentity(); + const history = useAppHistory(); + const [collapsed, setCollapsed] = useState(true); + const [animating, setAnimating] = useState(false); + + const handleToggleClick = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation(); + setCollapsed((value) => !value); + setAnimating(true); + }, + [setCollapsed, setAnimating], + ); + + const handleTitleClick = useCallback(() => { + onClick?.(); + }, [onClick]); + + const handleMoveLeft = useCallback(() => { + onMove?.(-1); + }, [onMove]); + + const handleMoveRight = useCallback(() => { + onMove?.(1); + }, [onMove]); + + const handleTransitionEnd = useCallback(() => { + setAnimating(false); + }, [setAnimating]); + + const handlePin = useCallback(() => { + if (!pinned) { + history.replace('/'); + } + + onPin?.(); + }, [history, pinned, onPin]); + + const wrapperClassName = classNames('column-header__wrapper', { + active, + }); + + const buttonClassName = classNames('column-header', { + active, + }); + + const collapsibleClassName = classNames('column-header__collapsible', { + collapsed, + animating, + }); + + const collapsibleButtonClassName = classNames('column-header__button', { + active: !collapsed, + }); + + let extraContent, pinButton, moveButtons, backButton, collapseButton; + + if (children) { + extraContent = ( +
+ {children} +
+ ); + } + + if (multiColumn && pinned) { + pinButton = ( + + ); + + moveButtons = ( +
+ + +
+ ); + } else if (multiColumn && onPin) { + pinButton = ( + + ); + } + + if ( + !pinned && + ((multiColumn && history.location.state?.fromMastodon) || showBackButton) + ) { + backButton = ; + } + + const collapsedContent = [extraContent]; + + if (multiColumn) { + collapsedContent.push( +
+ {pinButton} + {moveButtons} +
, + ); + } + + if (signedIn && (children || (multiColumn && onPin))) { + collapseButton = ( + + ); + } + + const hasIcon = icon && iconComponent; + const hasTitle = hasIcon && title; + + const component = ( +
+

+ {hasTitle && ( + <> + {backButton} + + + + )} + + {!hasTitle && backButton} + +
+ {extraButton} + {collapseButton} +
+

+ +
+
+ {(!collapsed || animating) && collapsedContent} +
+
+ + {appendContent} +
+ ); + + if (placeholder) { + return component; + } else { + return {component}; + } +}; + +// eslint-disable-next-line import/no-default-export +export default ColumnHeader; diff --git a/app/javascript/mastodon/components/domain.tsx b/app/javascript/mastodon/components/domain.tsx index ed5e8e7e4c2..aa64f0f8c3d 100644 --- a/app/javascript/mastodon/components/domain.tsx +++ b/app/javascript/mastodon/components/domain.tsx @@ -3,6 +3,8 @@ import { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react'; +import { unblockDomain } from 'mastodon/actions/domain_blocks'; +import { useAppDispatch } from 'mastodon/store'; import { IconButton } from './icon_button'; @@ -13,17 +15,15 @@ const messages = defineMessages({ }, }); -interface Props { +export const Domain: React.FC<{ domain: string; - onUnblockDomain: (domain: string) => void; -} - -export const Domain: React.FC = ({ domain, onUnblockDomain }) => { +}> = ({ domain }) => { const intl = useIntl(); + const dispatch = useAppDispatch(); const handleDomainUnblock = useCallback(() => { - onUnblockDomain(domain); - }, [domain, onUnblockDomain]); + dispatch(unblockDomain(domain)); + }, [dispatch, domain]); return (
diff --git a/app/javascript/mastodon/components/dropdown_menu.jsx b/app/javascript/mastodon/components/dropdown_menu.jsx index 524dbb927b4..d731a8e2d1f 100644 --- a/app/javascript/mastodon/components/dropdown_menu.jsx +++ b/app/javascript/mastodon/components/dropdown_menu.jsx @@ -20,7 +20,7 @@ let id = 0; class DropdownMenu extends PureComponent { static propTypes = { - items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired, + items: PropTypes.array.isRequired, loading: PropTypes.bool, scrollable: PropTypes.bool, onClose: PropTypes.func.isRequired, @@ -39,6 +39,7 @@ class DropdownMenu extends PureComponent { if (this.node && !this.node.contains(e.target)) { this.props.onClose(); e.stopPropagation(); + e.preventDefault(); } }; @@ -164,7 +165,7 @@ class Dropdown extends PureComponent { children: PropTypes.node, icon: PropTypes.string, iconComponent: PropTypes.func, - items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]), + items: PropTypes.array.isRequired, loading: PropTypes.bool, size: PropTypes.number, title: PropTypes.string, diff --git a/app/javascript/mastodon/components/follow_button.tsx b/app/javascript/mastodon/components/follow_button.tsx new file mode 100644 index 00000000000..222789318e8 --- /dev/null +++ b/app/javascript/mastodon/components/follow_button.tsx @@ -0,0 +1,109 @@ +import { useCallback, useEffect } from 'react'; + +import { useIntl, defineMessages } from 'react-intl'; + +import { useIdentity } from '@/mastodon/identity_context'; +import { fetchRelationships, followAccount } from 'mastodon/actions/accounts'; +import { openModal } from 'mastodon/actions/modal'; +import { Button } from 'mastodon/components/button'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { me } from 'mastodon/initial_state'; +import { useAppDispatch, useAppSelector } from 'mastodon/store'; + +const messages = defineMessages({ + unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, + follow: { id: 'account.follow', defaultMessage: 'Follow' }, + followBack: { id: 'account.follow_back', defaultMessage: 'Follow back' }, + mutual: { id: 'account.mutual', defaultMessage: 'Mutual' }, + edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, +}); + +export const FollowButton: React.FC<{ + accountId?: string; +}> = ({ accountId }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const { signedIn } = useIdentity(); + const account = useAppSelector((state) => + accountId ? state.accounts.get(accountId) : undefined, + ); + const relationship = useAppSelector((state) => + accountId ? state.relationships.get(accountId) : undefined, + ); + const following = relationship?.following || relationship?.requested; + + useEffect(() => { + if (accountId && signedIn) { + dispatch(fetchRelationships([accountId])); + } + }, [dispatch, accountId, signedIn]); + + const handleClick = useCallback(() => { + if (!signedIn) { + dispatch( + openModal({ + modalType: 'INTERACTION', + modalProps: { + type: 'follow', + accountId: accountId, + url: account?.url, + }, + }), + ); + } + + if (!relationship) return; + + if (accountId === me) { + return; + } else if (account && (relationship.following || relationship.requested)) { + dispatch( + openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }), + ); + } else { + dispatch(followAccount(accountId)); + } + }, [dispatch, accountId, relationship, account, signedIn]); + + let label; + + if (!signedIn) { + label = intl.formatMessage(messages.follow); + } else if (accountId === me) { + label = intl.formatMessage(messages.edit_profile); + } else if (!relationship) { + label = ; + } else if (relationship.following && relationship.followed_by) { + label = intl.formatMessage(messages.mutual); + } else if (!relationship.following && relationship.followed_by) { + label = intl.formatMessage(messages.followBack); + } else if (relationship.following || relationship.requested) { + label = intl.formatMessage(messages.unfollow); + } else { + label = intl.formatMessage(messages.follow); + } + + if (accountId === me) { + return ( + + {label} + + ); + } + + return ( + + ); +}; diff --git a/app/javascript/mastodon/components/hover_card_account.tsx b/app/javascript/mastodon/components/hover_card_account.tsx new file mode 100644 index 00000000000..8933e14a987 --- /dev/null +++ b/app/javascript/mastodon/components/hover_card_account.tsx @@ -0,0 +1,74 @@ +import { useEffect, forwardRef } from 'react'; + +import classNames from 'classnames'; +import { Link } from 'react-router-dom'; + +import { fetchAccount } from 'mastodon/actions/accounts'; +import { AccountBio } from 'mastodon/components/account_bio'; +import { AccountFields } from 'mastodon/components/account_fields'; +import { Avatar } from 'mastodon/components/avatar'; +import { FollowersCounter } from 'mastodon/components/counters'; +import { DisplayName } from 'mastodon/components/display_name'; +import { FollowButton } from 'mastodon/components/follow_button'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { ShortNumber } from 'mastodon/components/short_number'; +import { domain } from 'mastodon/initial_state'; +import { useAppSelector, useAppDispatch } from 'mastodon/store'; + +export const HoverCardAccount = forwardRef< + HTMLDivElement, + { accountId?: string } +>(({ accountId }, ref) => { + const dispatch = useAppDispatch(); + + const account = useAppSelector((state) => + accountId ? state.accounts.get(accountId) : undefined, + ); + + useEffect(() => { + if (accountId && !account) { + dispatch(fetchAccount(accountId)); + } + }, [dispatch, accountId, account]); + + return ( + + ); +}); + +HoverCardAccount.displayName = 'HoverCardAccount'; diff --git a/app/javascript/mastodon/components/hover_card_controller.tsx b/app/javascript/mastodon/components/hover_card_controller.tsx new file mode 100644 index 00000000000..057ef1aaed4 --- /dev/null +++ b/app/javascript/mastodon/components/hover_card_controller.tsx @@ -0,0 +1,189 @@ +import { useEffect, useRef, useState, useCallback } from 'react'; + +import { useLocation } from 'react-router-dom'; + +import Overlay from 'react-overlays/Overlay'; +import type { + OffsetValue, + UsePopperOptions, +} from 'react-overlays/esm/usePopper'; + +import { useTimeout } from 'mastodon/../hooks/useTimeout'; +import { HoverCardAccount } from 'mastodon/components/hover_card_account'; + +const offset = [-12, 4] as OffsetValue; +const enterDelay = 750; +const leaveDelay = 150; +const popperConfig = { strategy: 'fixed' } as UsePopperOptions; + +const isHoverCardAnchor = (element: HTMLElement) => + element.matches('[data-hover-card-account]'); + +export const HoverCardController: React.FC = () => { + const [open, setOpen] = useState(false); + const [accountId, setAccountId] = useState(); + const [anchor, setAnchor] = useState(null); + const cardRef = useRef(null); + const [setLeaveTimeout, cancelLeaveTimeout] = useTimeout(); + const [setEnterTimeout, cancelEnterTimeout, delayEnterTimeout] = useTimeout(); + const [setScrollTimeout] = useTimeout(); + const location = useLocation(); + + const handleClose = useCallback(() => { + cancelEnterTimeout(); + cancelLeaveTimeout(); + setOpen(false); + setAnchor(null); + }, [cancelEnterTimeout, cancelLeaveTimeout, setOpen, setAnchor]); + + useEffect(() => { + handleClose(); + }, [handleClose, location]); + + useEffect(() => { + let isScrolling = false; + let currentAnchor: HTMLElement | null = null; + let currentTitle: string | null = null; + + const open = (target: HTMLElement) => { + target.setAttribute('aria-describedby', 'hover-card'); + setOpen(true); + setAnchor(target); + setAccountId(target.getAttribute('data-hover-card-account') ?? undefined); + }; + + const close = () => { + currentAnchor?.removeAttribute('aria-describedby'); + currentAnchor = null; + setOpen(false); + setAnchor(null); + setAccountId(undefined); + }; + + const handleMouseEnter = (e: MouseEvent) => { + const { target } = e; + + // We've exited the window + if (!(target instanceof HTMLElement)) { + close(); + return; + } + + // We've entered an anchor + if (!isScrolling && isHoverCardAnchor(target)) { + cancelLeaveTimeout(); + + currentAnchor?.removeAttribute('aria-describedby'); + currentAnchor = target; + + currentTitle = target.getAttribute('title'); + target.removeAttribute('title'); + + setEnterTimeout(() => { + open(target); + }, enterDelay); + } + + // We've entered the hover card + if ( + !isScrolling && + (target === currentAnchor || target === cardRef.current) + ) { + cancelLeaveTimeout(); + } + }; + + const handleMouseLeave = (e: MouseEvent) => { + const { target } = e; + + if (!currentAnchor) { + return; + } + + if ( + currentTitle && + target instanceof HTMLElement && + target === currentAnchor + ) + target.setAttribute('title', currentTitle); + + if (target === currentAnchor || target === cardRef.current) { + cancelEnterTimeout(); + + setLeaveTimeout(() => { + close(); + }, leaveDelay); + } + }; + + const handleScrollEnd = () => { + isScrolling = false; + }; + + const handleScroll = () => { + isScrolling = true; + cancelEnterTimeout(); + setScrollTimeout(handleScrollEnd, 100); + }; + + const handleMouseMove = () => { + delayEnterTimeout(enterDelay); + }; + + document.body.addEventListener('mouseenter', handleMouseEnter, { + passive: true, + capture: true, + }); + + document.body.addEventListener('mousemove', handleMouseMove, { + passive: true, + capture: false, + }); + + document.body.addEventListener('mouseleave', handleMouseLeave, { + passive: true, + capture: true, + }); + + document.addEventListener('scroll', handleScroll, { + passive: true, + capture: true, + }); + + return () => { + document.body.removeEventListener('mouseenter', handleMouseEnter); + document.body.removeEventListener('mousemove', handleMouseMove); + document.body.removeEventListener('mouseleave', handleMouseLeave); + document.removeEventListener('scroll', handleScroll); + }; + }, [ + setEnterTimeout, + setLeaveTimeout, + setScrollTimeout, + cancelEnterTimeout, + cancelLeaveTimeout, + delayEnterTimeout, + setOpen, + setAccountId, + setAnchor, + ]); + + return ( + + {({ props }) => ( +
+ +
+ )} +
+ ); +}; diff --git a/app/javascript/mastodon/components/load_gap.tsx b/app/javascript/mastodon/components/load_gap.tsx index 1d4193a3595..544b5e1461b 100644 --- a/app/javascript/mastodon/components/load_gap.tsx +++ b/app/javascript/mastodon/components/load_gap.tsx @@ -9,18 +9,18 @@ const messages = defineMessages({ load_more: { id: 'status.load_more', defaultMessage: 'Load more' }, }); -interface Props { +interface Props { disabled: boolean; - maxId: string; - onClick: (maxId: string) => void; + param: T; + onClick: (params: T) => void; } -export const LoadGap: React.FC = ({ disabled, maxId, onClick }) => { +export const LoadGap = ({ disabled, param, onClick }: Props) => { const intl = useIntl(); const handleClick = useCallback(() => { - onClick(maxId); - }, [maxId, onClick]); + onClick(param); + }, [param, onClick]); return ( ; - } else if (account.getIn(['relationship', 'requested'])) { - actionBtn =
diff --git a/app/javascript/mastodon/features/explore/components/story.jsx b/app/javascript/mastodon/features/explore/components/story.jsx index a2cae942d4b..125df412a14 100644 --- a/app/javascript/mastodon/features/explore/components/story.jsx +++ b/app/javascript/mastodon/features/explore/components/story.jsx @@ -4,6 +4,8 @@ import { useState, useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; import classNames from 'classnames'; +import { Link } from 'react-router-dom'; + import { Blurhash } from 'mastodon/components/blurhash'; @@ -57,7 +59,7 @@ export const Story = ({
{author ? : {author} }} /> : } - {typeof sharedTimes === 'number' ? : } + {typeof sharedTimes === 'number' ? : }
diff --git a/app/javascript/mastodon/features/explore/links.jsx b/app/javascript/mastodon/features/explore/links.jsx index 93fd1fb6dde..035e5aaad81 100644 --- a/app/javascript/mastodon/features/explore/links.jsx +++ b/app/javascript/mastodon/features/explore/links.jsx @@ -75,7 +75,7 @@ class Links extends PureComponent { publisher={link.get('provider_name')} publishedAt={link.get('published_at')} author={link.get('author_name')} - authorAccount={link.getIn(['author_account', 'id'])} + authorAccount={link.getIn(['authors', 0, 'account', 'id'])} sharedTimes={link.getIn(['history', 0, 'accounts']) * 1 + link.getIn(['history', 1, 'accounts']) * 1} thumbnail={link.get('image')} thumbnailDescription={link.get('image_description')} diff --git a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx index c39b43badef..1b8040e55bb 100644 --- a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx +++ b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx @@ -12,12 +12,11 @@ import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import InfoIcon from '@/material-icons/400-24px/info.svg?react'; -import { followAccount, unfollowAccount } from 'mastodon/actions/accounts'; import { changeSetting } from 'mastodon/actions/settings'; import { fetchSuggestions, dismissSuggestion } from 'mastodon/actions/suggestions'; import { Avatar } from 'mastodon/components/avatar'; -import { Button } from 'mastodon/components/button'; import { DisplayName } from 'mastodon/components/display_name'; +import { FollowButton } from 'mastodon/components/follow_button'; import { Icon } from 'mastodon/components/icon'; import { IconButton } from 'mastodon/components/icon_button'; import { VerifiedBadge } from 'mastodon/components/verified_badge'; @@ -79,18 +78,8 @@ Source.propTypes = { const Card = ({ id, sources }) => { const intl = useIntl(); const account = useSelector(state => state.getIn(['accounts', id])); - const relationship = useSelector(state => state.getIn(['relationships', id])); const firstVerifiedField = account.get('fields').find(item => !!item.get('verified_at')); const dispatch = useDispatch(); - const following = relationship?.get('following') ?? relationship?.get('requested'); - - const handleFollow = useCallback(() => { - if (following) { - dispatch(unfollowAccount(id)); - } else { - dispatch(followAccount(id)); - } - }, [id, following, dispatch]); const handleDismiss = useCallback(() => { dispatch(dismissSuggestion(id)); @@ -109,7 +98,7 @@ const Card = ({ id, sources }) => { {firstVerifiedField ? : } - + ); +}; + +export const FilteredNotificationsBanner: React.FC = () => { + const dispatch = useAppDispatch(); + const policy = useAppSelector((state) => state.notificationPolicy); + const minimizeSetting = useAppSelector( + selectSettingsNotificationsMinimizeFilteredBanner, + ); + + useEffect(() => { + void dispatch(fetchNotificationPolicy()); + + const interval = setInterval(() => { + void dispatch(fetchNotificationPolicy()); + }, 120000); + + return () => { + clearInterval(interval); + }; + }, [dispatch]); + + if (policy === null || policy.summary.pending_notifications_count === 0) { + return null; + } + + if (minimizeSetting) { + return null; + } + + return ( + +
+ +
+ +
+ + + + + + +
+ + ); +}; diff --git a/app/javascript/mastodon/features/notifications/components/moderation_warning.tsx b/app/javascript/mastodon/features/notifications/components/moderation_warning.tsx index 2c1683e218e..827ec3b378b 100644 --- a/app/javascript/mastodon/features/notifications/components/moderation_warning.tsx +++ b/app/javascript/mastodon/features/notifications/components/moderation_warning.tsx @@ -1,7 +1,10 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; +import classNames from 'classnames'; + import GavelIcon from '@/material-icons/400-24px/gavel.svg?react'; import { Icon } from 'mastodon/components/icon'; +import type { AccountWarningAction } from 'mastodon/models/notification_group'; // This needs to be kept in sync with app/models/account_warning.rb const messages = defineMessages({ @@ -36,19 +39,18 @@ const messages = defineMessages({ }); interface Props { - action: - | 'none' - | 'disable' - | 'mark_statuses_as_sensitive' - | 'delete_statuses' - | 'sensitive' - | 'silence' - | 'suspend'; + action: AccountWarningAction; id: string; - hidden: boolean; + hidden?: boolean; + unread?: boolean; } -export const ModerationWarning: React.FC = ({ action, id, hidden }) => { +export const ModerationWarning: React.FC = ({ + action, + id, + hidden, + unread, +}) => { const intl = useIntl(); if (hidden) { @@ -56,23 +58,32 @@ export const ModerationWarning: React.FC = ({ action, id, hidden }) => { } return ( -
- +
+ +
-
); }; diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index 69084c2111b..f1eada13595 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -34,7 +34,7 @@ const messages = defineMessages({ favourite: { id: 'notification.favourite', defaultMessage: '{name} favorited your status' }, follow: { id: 'notification.follow', defaultMessage: '{name} followed you' }, ownPoll: { id: 'notification.own_poll', defaultMessage: 'Your poll has ended' }, - poll: { id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' }, + poll: { id: 'notification.poll', defaultMessage: 'A poll you voted in has ended' }, reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' }, status: { id: 'notification.status', defaultMessage: '{name} just posted' }, update: { id: 'notification.update', defaultMessage: '{name} edited a post' }, @@ -101,7 +101,7 @@ class Notification extends ImmutablePureComponent { e.preventDefault(); const { notification, onMention } = this.props; - onMention(notification.get('account'), this.props.history); + onMention(notification.get('account')); }; handleHotkeyFavourite = () => { @@ -340,7 +340,7 @@ class Notification extends ImmutablePureComponent { {ownPoll ? ( ) : ( - + )} @@ -435,7 +435,7 @@ class Notification extends ImmutablePureComponent { const targetAccount = report.get('target_account'); const targetDisplayNameHtml = { __html: targetAccount.get('display_name_html') }; - const targetLink = ; + const targetLink = ; return ( @@ -458,7 +458,7 @@ class Notification extends ImmutablePureComponent { const { notification } = this.props; const account = notification.get('account'); const displayNameHtml = { __html: account.get('display_name_html') }; - const link = ; + const link = ; switch(notification.get('type')) { case 'follow': diff --git a/app/javascript/mastodon/features/notifications/components/notification_request.jsx b/app/javascript/mastodon/features/notifications/components/notification_request.jsx index 3a77ef4e2e1..fc96bd2ee73 100644 --- a/app/javascript/mastodon/features/notifications/components/notification_request.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification_request.jsx @@ -38,12 +38,11 @@ export const NotificationRequest = ({ id, accountId, notificationsCount }) => { return (
- +
- {toCappedNumber(notificationsCount)}
@{account?.get('acct')} diff --git a/app/javascript/mastodon/features/notifications/components/policy_controls.tsx b/app/javascript/mastodon/features/notifications/components/policy_controls.tsx new file mode 100644 index 00000000000..1647bf6b456 --- /dev/null +++ b/app/javascript/mastodon/features/notifications/components/policy_controls.tsx @@ -0,0 +1,141 @@ +import { useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { updateNotificationsPolicy } from 'mastodon/actions/notification_policies'; +import { useAppSelector, useAppDispatch } from 'mastodon/store'; + +import { CheckboxWithLabel } from './checkbox_with_label'; + +export const PolicyControls: React.FC = () => { + const dispatch = useAppDispatch(); + + const notificationPolicy = useAppSelector( + (state) => state.notificationPolicy, + ); + + const handleFilterNotFollowing = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_not_following: checked }), + ); + }, + [dispatch], + ); + + const handleFilterNotFollowers = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_not_followers: checked }), + ); + }, + [dispatch], + ); + + const handleFilterNewAccounts = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_new_accounts: checked }), + ); + }, + [dispatch], + ); + + const handleFilterPrivateMentions = useCallback( + (checked: boolean) => { + void dispatch( + updateNotificationsPolicy({ filter_private_mentions: checked }), + ); + }, + [dispatch], + ); + + if (!notificationPolicy) return null; + + return ( +
+

+ +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ ); +}; diff --git a/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx b/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx index 738159fc5a2..3075aff31ba 100644 --- a/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx +++ b/app/javascript/mastodon/features/notifications/components/relationships_severance_event.jsx @@ -2,6 +2,8 @@ import PropTypes from 'prop-types'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; +import classNames from 'classnames'; + import HeartBrokenIcon from '@/material-icons/400-24px/heart_broken-fill.svg?react'; import { Icon } from 'mastodon/components/icon'; import { domain } from 'mastodon/initial_state'; @@ -13,7 +15,7 @@ const messages = defineMessages({ user_domain_block: { id: 'notification.relationships_severance_event.user_domain_block', defaultMessage: 'You have blocked {target}, removing {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.' }, }); -export const RelationshipsSeveranceEvent = ({ type, target, followingCount, followersCount, hidden }) => { +export const RelationshipsSeveranceEvent = ({ type, target, followingCount, followersCount, hidden, unread }) => { const intl = useIntl(); if (hidden) { @@ -21,14 +23,14 @@ export const RelationshipsSeveranceEvent = ({ type, target, followingCount, foll } return ( - - +
+
-
); }; @@ -42,4 +44,5 @@ RelationshipsSeveranceEvent.propTypes = { followersCount: PropTypes.number.isRequired, followingCount: PropTypes.number.isRequired, hidden: PropTypes.bool, + unread: PropTypes.bool, }; diff --git a/app/javascript/mastodon/features/notifications/containers/column_settings_container.js b/app/javascript/mastodon/features/notifications/containers/column_settings_container.js index de266160f85..8bcc7ab4ef7 100644 --- a/app/javascript/mastodon/features/notifications/containers/column_settings_container.js +++ b/app/javascript/mastodon/features/notifications/containers/column_settings_container.js @@ -2,29 +2,31 @@ import { defineMessages, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; +import { openModal } from 'mastodon/actions/modal'; +import { initializeNotifications } from 'mastodon/actions/notifications_migration'; + import { showAlert } from '../../../actions/alerts'; -import { openModal } from '../../../actions/modal'; -import { setFilter, clearNotifications, requestBrowserPermission, updateNotificationsPolicy } from '../../../actions/notifications'; +import { setFilter, requestBrowserPermission } from '../../../actions/notifications'; import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications'; import { changeSetting } from '../../../actions/settings'; import ColumnSettings from '../components/column_settings'; const messages = defineMessages({ - clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' }, - clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' }, permissionDenied: { id: 'notifications.permission_denied_alert', defaultMessage: 'Desktop notifications can\'t be enabled, as browser permission has been denied before' }, }); +/** + * @param {import('mastodon/store').RootState} state + */ const mapStateToProps = state => ({ settings: state.getIn(['settings', 'notifications']), pushSettings: state.get('push_notifications'), alertsEnabled: state.getIn(['settings', 'notifications', 'alerts']).includes(true), browserSupport: state.getIn(['notifications', 'browserSupport']), browserPermission: state.getIn(['notifications', 'browserPermission']), - notificationPolicy: state.get('notificationPolicy'), }); -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onChange (path, checked) { if (path[0] === 'push') { @@ -54,32 +56,22 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ } else { dispatch(changeSetting(['notifications', ...path], checked)); } + } else if(path[0] === 'groupingBeta') { + dispatch(changeSetting(['notifications', ...path], checked)); + dispatch(initializeNotifications()); } else { dispatch(changeSetting(['notifications', ...path], checked)); } }, onClear () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.clearMessage), - confirm: intl.formatMessage(messages.clearConfirm), - onConfirm: () => dispatch(clearNotifications()), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_CLEAR_NOTIFICATIONS' })); }, onRequestNotificationPermission () { dispatch(requestBrowserPermission()); }, - onChangePolicy (param, checked) { - dispatch(updateNotificationsPolicy({ - [param]: checked, - })); - }, - }); export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings)); diff --git a/app/javascript/mastodon/features/notifications/containers/notification_container.js b/app/javascript/mastodon/features/notifications/containers/notification_container.js index 650acf4ccd4..d64f2a679cf 100644 --- a/app/javascript/mastodon/features/notifications/containers/notification_container.js +++ b/app/javascript/mastodon/features/notifications/containers/notification_container.js @@ -2,17 +2,12 @@ import { connect } from 'react-redux'; import { mentionCompose } from '../../../actions/compose'; import { - reblog, - favourite, - unreblog, - unfavourite, + toggleFavourite, + toggleReblog, } from '../../../actions/interactions'; -import { openModal } from '../../../actions/modal'; import { - hideStatus, - revealStatus, + toggleStatusSpoilers, } from '../../../actions/statuses'; -import { boostModal } from '../../../initial_state'; import { makeGetNotification, makeGetStatus, makeGetReport } from '../../../selectors'; import Notification from '../components/notification'; @@ -34,40 +29,20 @@ const makeMapStateToProps = () => { }; const mapDispatchToProps = dispatch => ({ - onMention: (account, router) => { - dispatch(mentionCompose(account, router)); - }, - - onModalReblog (status, privacy) { - dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); + onMention: (account) => { + dispatch(mentionCompose(account)); }, onReblog (status, e) { - if (status.get('reblogged')) { - dispatch(unreblog({ statusId: status.get('id') })); - } else { - if (e.shiftKey || !boostModal) { - this.onModalReblog(status); - } else { - dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this.onModalReblog } })); - } - } + dispatch(toggleReblog(status.get('id'), e.shiftKey)); }, onFavourite (status) { - if (status.get('favourited')) { - dispatch(unfavourite(status)); - } else { - dispatch(favourite(status)); - } + dispatch(toggleFavourite(status.get('id'))); }, onToggleHidden (status) { - if (status.get('hidden')) { - dispatch(revealStatus(status.get('id'))); - } else { - dispatch(hideStatus(status.get('id'))); - } + dispatch(toggleStatusSpoilers(status.get('id'))); }, }); diff --git a/app/javascript/mastodon/features/notifications/index.jsx b/app/javascript/mastodon/features/notifications/index.jsx index d45f517152e..cefbd544b0a 100644 --- a/app/javascript/mastodon/features/notifications/index.jsx +++ b/app/javascript/mastodon/features/notifications/index.jsx @@ -34,7 +34,10 @@ import ColumnHeader from '../../components/column_header'; import { LoadGap } from '../../components/load_gap'; import ScrollableList from '../../components/scrollable_list'; -import { FilteredNotificationsBanner } from './components/filtered_notifications_banner'; +import { + FilteredNotificationsBanner, + FilteredNotificationsIconButton, +} from './components/filtered_notifications_banner'; import NotificationsPermissionBanner from './components/notifications_permission_banner'; import ColumnSettingsContainer from './containers/column_settings_container'; import FilterBarContainer from './containers/filter_bar_container'; @@ -202,7 +205,7 @@ class Notifications extends PureComponent { 0 ? notifications.getIn([index - 1, 'id']) : null} + param={index > 0 ? notifications.getIn([index - 1, 'id']) : null} onClick={this.handleLoadGap} /> ) : ( @@ -223,6 +226,13 @@ class Notifications extends PureComponent { let scrollContainer; + const prepend = ( + <> + {needsNotificationPermission && } + + + ); + if (signedIn) { scrollContainer = ( } + prepend={prepend} alwaysPrepend emptyMessage={emptyMessage} onLoadMore={this.handleLoadOlder} @@ -248,20 +258,21 @@ class Notifications extends PureComponent { scrollContainer = ; } - let extraButton = null; - - if (canMarkAsRead) { - extraButton = ( - - ); - } + const extraButton = ( + <> + + {canMarkAsRead && ( + + )} + + ); return ( @@ -282,8 +293,6 @@ class Notifications extends PureComponent { {filterBarContainer} - - {scrollContainer} diff --git a/app/javascript/mastodon/features/notifications/request.jsx b/app/javascript/mastodon/features/notifications/request.jsx index 09bef3beab8..7cba9461659 100644 --- a/app/javascript/mastodon/features/notifications/request.jsx +++ b/app/javascript/mastodon/features/notifications/request.jsx @@ -7,9 +7,9 @@ import { Helmet } from 'react-helmet'; import { useSelector, useDispatch } from 'react-redux'; +import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import DoneIcon from '@/material-icons/400-24px/done.svg?react'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; -import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; import { fetchNotificationRequest, fetchNotificationsForRequest, expandNotificationsForRequest, acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; @@ -101,7 +101,7 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => { showBackButton extraButton={!removed && ( <> - + )} diff --git a/app/javascript/mastodon/features/notifications/requests.jsx b/app/javascript/mastodon/features/notifications/requests.jsx index 2d10c6a06c0..2fe8dc2b6c2 100644 --- a/app/javascript/mastodon/features/notifications/requests.jsx +++ b/app/javascript/mastodon/features/notifications/requests.jsx @@ -9,16 +9,52 @@ import { useSelector, useDispatch } from 'react-redux'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import { fetchNotificationRequests, expandNotificationRequests } from 'mastodon/actions/notifications'; +import { changeSetting } from 'mastodon/actions/settings'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import ScrollableList from 'mastodon/components/scrollable_list'; import { NotificationRequest } from './components/notification_request'; +import { PolicyControls } from './components/policy_controls'; +import SettingToggle from './components/setting_toggle'; const messages = defineMessages({ title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' }, + maximize: { id: 'notification_requests.maximize', defaultMessage: 'Maximize' } }); +const ColumnSettings = () => { + const dispatch = useDispatch(); + const settings = useSelector((state) => state.settings.get('notifications')); + + const onChange = useCallback( + (key, checked) => { + dispatch(changeSetting(['notifications', ...key], checked)); + }, + [dispatch], + ); + + return ( +
+
+
+ + } + /> +
+
+ + +
+ ); +}; + export const NotificationRequests = ({ multiColumn }) => { const columnRef = useRef(); const intl = useIntl(); @@ -48,7 +84,9 @@ export const NotificationRequests = ({ multiColumn }) => { onClick={handleHeaderClick} multiColumn={multiColumn} showBackButton - /> + > + + = ({ accountId }) => { + const account = useAppSelector((state) => state.accounts.get(accountId)); + + if (!account) return null; + + return ( + + + + ); +}; + +export const AvatarGroup: React.FC<{ accountIds: string[] }> = ({ + accountIds, +}) => ( +
+ {accountIds.slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS).map((accountId) => ( + + ))} +
+); diff --git a/app/javascript/mastodon/features/notifications_v2/components/embedded_status.tsx b/app/javascript/mastodon/features/notifications_v2/components/embedded_status.tsx new file mode 100644 index 00000000000..baec0161173 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/embedded_status.tsx @@ -0,0 +1,159 @@ +import { useCallback, useRef } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { useHistory } from 'react-router-dom'; + +import type { List as ImmutableList, RecordOf } from 'immutable'; + +import BarChart4BarsIcon from '@/material-icons/400-24px/bar_chart_4_bars.svg?react'; +import PhotoLibraryIcon from '@/material-icons/400-24px/photo_library.svg?react'; +import { Avatar } from 'mastodon/components/avatar'; +import { DisplayName } from 'mastodon/components/display_name'; +import { Icon } from 'mastodon/components/icon'; +import type { Status } from 'mastodon/models/status'; +import { useAppSelector } from 'mastodon/store'; + +import { EmbeddedStatusContent } from './embedded_status_content'; + +export type Mention = RecordOf<{ url: string; acct: string }>; + +export const EmbeddedStatus: React.FC<{ statusId: string }> = ({ + statusId, +}) => { + const history = useHistory(); + const clickCoordinatesRef = useRef<[number, number] | null>(); + + const status = useAppSelector( + (state) => state.statuses.get(statusId) as Status | undefined, + ); + + const account = useAppSelector((state) => + state.accounts.get(status?.get('account') as string), + ); + + const handleMouseDown = useCallback>( + ({ clientX, clientY }) => { + clickCoordinatesRef.current = [clientX, clientY]; + }, + [clickCoordinatesRef], + ); + + const handleMouseUp = useCallback>( + ({ clientX, clientY, target, button }) => { + const [startX, startY] = clickCoordinatesRef.current ?? [0, 0]; + const [deltaX, deltaY] = [ + Math.abs(clientX - startX), + Math.abs(clientY - startY), + ]; + + let element: HTMLDivElement | null = target as HTMLDivElement; + + while (element) { + if ( + element.localName === 'button' || + element.localName === 'a' || + element.localName === 'label' + ) { + return; + } + + element = element.parentNode as HTMLDivElement | null; + } + + if (deltaX + deltaY < 5 && button === 0 && account) { + history.push(`/@${account.acct}/${statusId}`); + } + + clickCoordinatesRef.current = null; + }, + [clickCoordinatesRef, statusId, account, history], + ); + + const handleMouseEnter = useCallback>( + ({ currentTarget }) => { + const emojis = + currentTarget.querySelectorAll('.custom-emoji'); + + for (const emoji of emojis) { + const newSrc = emoji.getAttribute('data-original'); + if (newSrc) emoji.src = newSrc; + } + }, + [], + ); + + const handleMouseLeave = useCallback>( + ({ currentTarget }) => { + const emojis = + currentTarget.querySelectorAll('.custom-emoji'); + + for (const emoji of emojis) { + const newSrc = emoji.getAttribute('data-static'); + if (newSrc) emoji.src = newSrc; + } + }, + [], + ); + + if (!status) { + return null; + } + + // Assign status attributes to variables with a forced type, as status is not yet properly typed + const contentHtml = status.get('contentHtml') as string; + const poll = status.get('poll'); + const language = status.get('language') as string; + const mentions = status.get('mentions') as ImmutableList; + const mediaAttachmentsSize = ( + status.get('media_attachments') as ImmutableList + ).size; + + return ( +
+
+ + +
+ + + + {(poll || mediaAttachmentsSize > 0) && ( +
+ {!!poll && ( + <> + + + + )} + {mediaAttachmentsSize > 0 && ( + <> + + + + )} +
+ )} +
+ ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx b/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx new file mode 100644 index 00000000000..1a38be536ba --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx @@ -0,0 +1,93 @@ +import { useCallback } from 'react'; + +import { useHistory } from 'react-router-dom'; + +import type { List } from 'immutable'; + +import type { History } from 'history'; + +import type { Mention } from './embedded_status'; + +const handleMentionClick = ( + history: History, + mention: Mention, + e: MouseEvent, +) => { + if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { + e.preventDefault(); + history.push(`/@${mention.get('acct')}`); + } +}; + +const handleHashtagClick = ( + history: History, + hashtag: string, + e: MouseEvent, +) => { + if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { + e.preventDefault(); + history.push(`/tags/${hashtag.replace(/^#/, '')}`); + } +}; + +export const EmbeddedStatusContent: React.FC<{ + content: string; + mentions: List; + language: string; + className?: string; +}> = ({ content, mentions, language, className }) => { + const history = useHistory(); + + const handleContentRef = useCallback( + (node: HTMLDivElement | null) => { + if (!node) { + return; + } + + const links = node.querySelectorAll('a'); + + for (const link of links) { + if (link.classList.contains('status-link')) { + continue; + } + + link.classList.add('status-link'); + + const mention = mentions.find((item) => link.href === item.get('url')); + + if (mention) { + link.addEventListener( + 'click', + handleMentionClick.bind(null, history, mention), + false, + ); + link.setAttribute('title', `@${mention.get('acct')}`); + link.setAttribute('href', `/@${mention.get('acct')}`); + } else if ( + link.textContent?.[0] === '#' || + link.previousSibling?.textContent?.endsWith('#') + ) { + link.addEventListener( + 'click', + handleHashtagClick.bind(null, history, link.text), + false, + ); + link.setAttribute('href', `/tags/${link.text.replace(/^#/, '')}`); + } else { + link.setAttribute('title', link.href); + link.classList.add('unhandled-link'); + } + } + }, + [mentions, history], + ); + + return ( +
+ ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/names_list.tsx b/app/javascript/mastodon/features/notifications_v2/components/names_list.tsx new file mode 100644 index 00000000000..3d70cc0b623 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/names_list.tsx @@ -0,0 +1,51 @@ +import { FormattedMessage } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import { useAppSelector } from 'mastodon/store'; + +export const NamesList: React.FC<{ + accountIds: string[]; + total: number; + seeMoreHref?: string; +}> = ({ accountIds, total, seeMoreHref }) => { + const lastAccountId = accountIds[0] ?? '0'; + const account = useAppSelector((state) => state.accounts.get(lastAccountId)); + + if (!account) return null; + + const displayedName = ( + + + + ); + + if (total === 1) { + return displayedName; + } + + if (seeMoreHref) + return ( + {chunks}, + }} + /> + ); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_admin_report.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_admin_report.tsx new file mode 100644 index 00000000000..fda5798ae98 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_admin_report.tsx @@ -0,0 +1,132 @@ +import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; + +import classNames from 'classnames'; + +import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; +import { Icon } from 'mastodon/components/icon'; +import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; +import type { NotificationGroupAdminReport } from 'mastodon/models/notification_group'; +import { useAppSelector } from 'mastodon/store'; + +// This needs to be kept in sync with app/models/report.rb +const messages = defineMessages({ + other: { + id: 'report_notification.categories.other_sentence', + defaultMessage: 'other', + }, + spam: { + id: 'report_notification.categories.spam_sentence', + defaultMessage: 'spam', + }, + legal: { + id: 'report_notification.categories.legal_sentence', + defaultMessage: 'illegal content', + }, + violation: { + id: 'report_notification.categories.violation_sentence', + defaultMessage: 'rule violation', + }, +}); + +export const NotificationAdminReport: React.FC<{ + notification: NotificationGroupAdminReport; + unread?: boolean; +}> = ({ notification, notification: { report }, unread }) => { + const intl = useIntl(); + const targetAccount = useAppSelector((state) => + state.accounts.get(report.targetAccountId), + ); + const account = useAppSelector((state) => + state.accounts.get(notification.sampleAccountIds[0] ?? '0'), + ); + + if (!account || !targetAccount) return null; + + const values = { + name: ( + + ), + target: ( + + ), + category: intl.formatMessage(messages[report.category]), + count: report.status_ids.length, + }; + + let message; + + if (report.status_ids.length > 0) { + if (report.category === 'other') { + message = ( + + ); + } else { + message = ( + + ); + } + } else { + if (report.category === 'other') { + message = ( + + ); + } else { + message = ( + + ); + } + } + + return ( + +
+ +
+ +
+
+
+ {message} + +
+
+ + {report.comment.length > 0 && ( +
+ “{report.comment}” +
+ )} +
+
+ ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_admin_sign_up.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_admin_sign_up.tsx new file mode 100644 index 00000000000..9f7afc63f5b --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_admin_sign_up.tsx @@ -0,0 +1,31 @@ +import { FormattedMessage } from 'react-intl'; + +import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; +import type { NotificationGroupAdminSignUp } from 'mastodon/models/notification_group'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationGroupWithStatus } from './notification_group_with_status'; + +const labelRenderer: LabelRenderer = (values) => ( + +); + +export const NotificationAdminSignUp: React.FC<{ + notification: NotificationGroupAdminSignUp; + unread: boolean; +}> = ({ notification, unread }) => ( + +); diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_favourite.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_favourite.tsx new file mode 100644 index 00000000000..22838fe69bc --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_favourite.tsx @@ -0,0 +1,45 @@ +import { FormattedMessage } from 'react-intl'; + +import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; +import type { NotificationGroupFavourite } from 'mastodon/models/notification_group'; +import { useAppSelector } from 'mastodon/store'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationGroupWithStatus } from './notification_group_with_status'; + +const labelRenderer: LabelRenderer = (values) => ( + +); + +export const NotificationFavourite: React.FC<{ + notification: NotificationGroupFavourite; + unread: boolean; +}> = ({ notification, unread }) => { + const { statusId } = notification; + const statusAccount = useAppSelector( + (state) => + state.accounts.get(state.statuses.getIn([statusId, 'account']) as string) + ?.acct, + ); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_follow.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_follow.tsx new file mode 100644 index 00000000000..0ed96ae636c --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_follow.tsx @@ -0,0 +1,31 @@ +import { FormattedMessage } from 'react-intl'; + +import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; +import type { NotificationGroupFollow } from 'mastodon/models/notification_group'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationGroupWithStatus } from './notification_group_with_status'; + +const labelRenderer: LabelRenderer = (values) => ( + +); + +export const NotificationFollow: React.FC<{ + notification: NotificationGroupFollow; + unread: boolean; +}> = ({ notification, unread }) => ( + +); diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_follow_request.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_follow_request.tsx new file mode 100644 index 00000000000..8c9837efa34 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_follow_request.tsx @@ -0,0 +1,78 @@ +import { useCallback } from 'react'; + +import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; + +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; +import { + authorizeFollowRequest, + rejectFollowRequest, +} from 'mastodon/actions/accounts'; +import { IconButton } from 'mastodon/components/icon_button'; +import type { NotificationGroupFollowRequest } from 'mastodon/models/notification_group'; +import { useAppDispatch } from 'mastodon/store'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationGroupWithStatus } from './notification_group_with_status'; + +const messages = defineMessages({ + authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' }, + reject: { id: 'follow_request.reject', defaultMessage: 'Reject' }, +}); + +const labelRenderer: LabelRenderer = (values) => ( + +); + +export const NotificationFollowRequest: React.FC<{ + notification: NotificationGroupFollowRequest; + unread: boolean; +}> = ({ notification, unread }) => { + const intl = useIntl(); + + const dispatch = useAppDispatch(); + + const onAuthorize = useCallback(() => { + dispatch(authorizeFollowRequest(notification.sampleAccountIds[0])); + }, [dispatch, notification.sampleAccountIds]); + + const onReject = useCallback(() => { + dispatch(rejectFollowRequest(notification.sampleAccountIds[0])); + }, [dispatch, notification.sampleAccountIds]); + + const actions = ( +
+ + +
+ ); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx new file mode 100644 index 00000000000..36f033261ae --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx @@ -0,0 +1,151 @@ +import { useMemo } from 'react'; + +import { HotKeys } from 'react-hotkeys'; + +import { navigateToProfile } from 'mastodon/actions/accounts'; +import { mentionComposeById } from 'mastodon/actions/compose'; +import type { NotificationGroup as NotificationGroupModel } from 'mastodon/models/notification_group'; +import { useAppSelector, useAppDispatch } from 'mastodon/store'; + +import { NotificationAdminReport } from './notification_admin_report'; +import { NotificationAdminSignUp } from './notification_admin_sign_up'; +import { NotificationFavourite } from './notification_favourite'; +import { NotificationFollow } from './notification_follow'; +import { NotificationFollowRequest } from './notification_follow_request'; +import { NotificationMention } from './notification_mention'; +import { NotificationModerationWarning } from './notification_moderation_warning'; +import { NotificationPoll } from './notification_poll'; +import { NotificationReblog } from './notification_reblog'; +import { NotificationSeveredRelationships } from './notification_severed_relationships'; +import { NotificationStatus } from './notification_status'; +import { NotificationUpdate } from './notification_update'; + +export const NotificationGroup: React.FC<{ + notificationGroupId: NotificationGroupModel['group_key']; + unread: boolean; + onMoveUp: (groupId: string) => void; + onMoveDown: (groupId: string) => void; +}> = ({ notificationGroupId, unread, onMoveUp, onMoveDown }) => { + const notificationGroup = useAppSelector((state) => + state.notificationGroups.groups.find( + (item) => item.type !== 'gap' && item.group_key === notificationGroupId, + ), + ); + + const dispatch = useAppDispatch(); + + const accountId = + notificationGroup?.type === 'gap' + ? undefined + : notificationGroup?.sampleAccountIds[0]; + + const handlers = useMemo( + () => ({ + moveUp: () => { + onMoveUp(notificationGroupId); + }, + + moveDown: () => { + onMoveDown(notificationGroupId); + }, + + openProfile: () => { + if (accountId) dispatch(navigateToProfile(accountId)); + }, + + mention: () => { + if (accountId) dispatch(mentionComposeById(accountId)); + }, + }), + [dispatch, notificationGroupId, accountId, onMoveUp, onMoveDown], + ); + + if (!notificationGroup || notificationGroup.type === 'gap') return null; + + let content; + + switch (notificationGroup.type) { + case 'reblog': + content = ( + + ); + break; + case 'favourite': + content = ( + + ); + break; + case 'severed_relationships': + content = ( + + ); + break; + case 'mention': + content = ( + + ); + break; + case 'follow': + content = ( + + ); + break; + case 'follow_request': + content = ( + + ); + break; + case 'poll': + content = ( + + ); + break; + case 'status': + content = ( + + ); + break; + case 'update': + content = ( + + ); + break; + case 'admin.sign_up': + content = ( + + ); + break; + case 'admin.report': + content = ( + + ); + break; + case 'moderation_warning': + content = ( + + ); + break; + default: + return null; + } + + return {content}; +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_group_with_status.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_group_with_status.tsx new file mode 100644 index 00000000000..2af73c8362a --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_group_with_status.tsx @@ -0,0 +1,113 @@ +import { useMemo } from 'react'; + +import classNames from 'classnames'; + +import { HotKeys } from 'react-hotkeys'; + +import { replyComposeById } from 'mastodon/actions/compose'; +import { navigateToStatus } from 'mastodon/actions/statuses'; +import type { IconProp } from 'mastodon/components/icon'; +import { Icon } from 'mastodon/components/icon'; +import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; +import { useAppDispatch } from 'mastodon/store'; + +import { AvatarGroup } from './avatar_group'; +import { EmbeddedStatus } from './embedded_status'; +import { NamesList } from './names_list'; + +export type LabelRenderer = ( + values: Record, +) => JSX.Element; + +export const NotificationGroupWithStatus: React.FC<{ + icon: IconProp; + iconId: string; + statusId?: string; + actions?: JSX.Element; + count: number; + accountIds: string[]; + timestamp: string; + labelRenderer: LabelRenderer; + labelSeeMoreHref?: string; + type: string; + unread: boolean; +}> = ({ + icon, + iconId, + timestamp, + accountIds, + actions, + count, + statusId, + labelRenderer, + labelSeeMoreHref, + type, + unread, +}) => { + const dispatch = useAppDispatch(); + + const label = useMemo( + () => + labelRenderer({ + name: ( + + ), + }), + [labelRenderer, accountIds, count, labelSeeMoreHref], + ); + + const handlers = useMemo( + () => ({ + open: () => { + dispatch(navigateToStatus(statusId)); + }, + + reply: () => { + dispatch(replyComposeById(statusId)); + }, + }), + [dispatch, statusId], + ); + + return ( + +
+
+ +
+ +
+
+
+ + + {actions} +
+ +
+ {label} + {timestamp && } +
+
+ + {statusId && ( +
+ +
+ )} +
+
+
+ ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx new file mode 100644 index 00000000000..f8d646b07e1 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx @@ -0,0 +1,56 @@ +import { FormattedMessage } from 'react-intl'; + +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply-fill.svg?react'; +import type { StatusVisibility } from 'mastodon/api_types/statuses'; +import type { NotificationGroupMention } from 'mastodon/models/notification_group'; +import { useAppSelector } from 'mastodon/store'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationWithStatus } from './notification_with_status'; + +const labelRenderer: LabelRenderer = (values) => ( + +); + +const privateMentionLabelRenderer: LabelRenderer = (values) => ( + +); + +export const NotificationMention: React.FC<{ + notification: NotificationGroupMention; + unread: boolean; +}> = ({ notification, unread }) => { + const statusVisibility = useAppSelector( + (state) => + state.statuses.getIn([ + notification.statusId, + 'visibility', + ]) as StatusVisibility, + ); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_moderation_warning.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_moderation_warning.tsx new file mode 100644 index 00000000000..d653385fda8 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_moderation_warning.tsx @@ -0,0 +1,13 @@ +import { ModerationWarning } from 'mastodon/features/notifications/components/moderation_warning'; +import type { NotificationGroupModerationWarning } from 'mastodon/models/notification_group'; + +export const NotificationModerationWarning: React.FC<{ + notification: NotificationGroupModerationWarning; + unread: boolean; +}> = ({ notification: { moderationWarning }, unread }) => ( + +); diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_poll.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_poll.tsx new file mode 100644 index 00000000000..a7748c2c7c3 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_poll.tsx @@ -0,0 +1,41 @@ +import { FormattedMessage } from 'react-intl'; + +import BarChart4BarsIcon from '@/material-icons/400-20px/bar_chart_4_bars.svg?react'; +import { me } from 'mastodon/initial_state'; +import type { NotificationGroupPoll } from 'mastodon/models/notification_group'; + +import { NotificationWithStatus } from './notification_with_status'; + +const labelRendererOther = () => ( + +); + +const labelRendererOwn = () => ( + +); + +export const NotificationPoll: React.FC<{ + notification: NotificationGroupPoll; + unread: boolean; +}> = ({ notification, unread }) => ( + +); diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_reblog.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_reblog.tsx new file mode 100644 index 00000000000..06255686884 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_reblog.tsx @@ -0,0 +1,45 @@ +import { FormattedMessage } from 'react-intl'; + +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import type { NotificationGroupReblog } from 'mastodon/models/notification_group'; +import { useAppSelector } from 'mastodon/store'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationGroupWithStatus } from './notification_group_with_status'; + +const labelRenderer: LabelRenderer = (values) => ( + +); + +export const NotificationReblog: React.FC<{ + notification: NotificationGroupReblog; + unread: boolean; +}> = ({ notification, unread }) => { + const { statusId } = notification; + const statusAccount = useAppSelector( + (state) => + state.accounts.get(state.statuses.getIn([statusId, 'account']) as string) + ?.acct, + ); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_severed_relationships.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_severed_relationships.tsx new file mode 100644 index 00000000000..fd92498ea3d --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_severed_relationships.tsx @@ -0,0 +1,15 @@ +import { RelationshipsSeveranceEvent } from 'mastodon/features/notifications/components/relationships_severance_event'; +import type { NotificationGroupSeveredRelationships } from 'mastodon/models/notification_group'; + +export const NotificationSeveredRelationships: React.FC<{ + notification: NotificationGroupSeveredRelationships; + unread: boolean; +}> = ({ notification: { event }, unread }) => ( + +); diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_status.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_status.tsx new file mode 100644 index 00000000000..9ade355a714 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_status.tsx @@ -0,0 +1,31 @@ +import { FormattedMessage } from 'react-intl'; + +import NotificationsActiveIcon from '@/material-icons/400-24px/notifications_active-fill.svg?react'; +import type { NotificationGroupStatus } from 'mastodon/models/notification_group'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationWithStatus } from './notification_with_status'; + +const labelRenderer: LabelRenderer = (values) => ( + +); + +export const NotificationStatus: React.FC<{ + notification: NotificationGroupStatus; + unread: boolean; +}> = ({ notification, unread }) => ( + +); diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_update.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_update.tsx new file mode 100644 index 00000000000..c518367bf5a --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_update.tsx @@ -0,0 +1,31 @@ +import { FormattedMessage } from 'react-intl'; + +import EditIcon from '@/material-icons/400-24px/edit.svg?react'; +import type { NotificationGroupUpdate } from 'mastodon/models/notification_group'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationWithStatus } from './notification_with_status'; + +const labelRenderer: LabelRenderer = (values) => ( + +); + +export const NotificationUpdate: React.FC<{ + notification: NotificationGroupUpdate; + unread: boolean; +}> = ({ notification, unread }) => ( + +); diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx new file mode 100644 index 00000000000..c7dd9f6be2e --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx @@ -0,0 +1,111 @@ +import { useMemo } from 'react'; + +import classNames from 'classnames'; + +import { HotKeys } from 'react-hotkeys'; + +import { replyComposeById } from 'mastodon/actions/compose'; +import { toggleReblog, toggleFavourite } from 'mastodon/actions/interactions'; +import { + navigateToStatus, + toggleStatusSpoilers, +} from 'mastodon/actions/statuses'; +import type { IconProp } from 'mastodon/components/icon'; +import { Icon } from 'mastodon/components/icon'; +import Status from 'mastodon/containers/status_container'; +import { useAppSelector, useAppDispatch } from 'mastodon/store'; + +import { NamesList } from './names_list'; +import type { LabelRenderer } from './notification_group_with_status'; + +export const NotificationWithStatus: React.FC<{ + type: string; + icon: IconProp; + iconId: string; + accountIds: string[]; + statusId: string; + count: number; + labelRenderer: LabelRenderer; + unread: boolean; +}> = ({ + icon, + iconId, + accountIds, + statusId, + count, + labelRenderer, + type, + unread, +}) => { + const dispatch = useAppDispatch(); + + const label = useMemo( + () => + labelRenderer({ + name: , + }), + [labelRenderer, accountIds, count], + ); + + const isPrivateMention = useAppSelector( + (state) => state.statuses.getIn([statusId, 'visibility']) === 'direct', + ); + + const handlers = useMemo( + () => ({ + open: () => { + dispatch(navigateToStatus(statusId)); + }, + + reply: () => { + dispatch(replyComposeById(statusId)); + }, + + boost: () => { + dispatch(toggleReblog(statusId)); + }, + + favourite: () => { + dispatch(toggleFavourite(statusId)); + }, + + toggleHidden: () => { + dispatch(toggleStatusSpoilers(statusId)); + }, + }), + [dispatch, statusId], + ); + + return ( + +
+
+
+ +
+ {label} +
+ + is not yet typed + id={statusId} + contextType='notifications' + withDismiss + skipPrepend + avatarSize={40} + unfocusable + /> +
+
+ ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/filter_bar.tsx b/app/javascript/mastodon/features/notifications_v2/filter_bar.tsx new file mode 100644 index 00000000000..37d2d864bbd --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/filter_bar.tsx @@ -0,0 +1,145 @@ +import type { PropsWithChildren } from 'react'; +import { useCallback } from 'react'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react'; +import StarIcon from '@/material-icons/400-24px/star.svg?react'; +import { setNotificationsFilter } from 'mastodon/actions/notification_groups'; +import { Icon } from 'mastodon/components/icon'; +import { + selectSettingsNotificationsQuickFilterActive, + selectSettingsNotificationsQuickFilterAdvanced, +} from 'mastodon/selectors/settings'; +import { useAppDispatch, useAppSelector } from 'mastodon/store'; + +const tooltips = defineMessages({ + mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' }, + favourites: { + id: 'notifications.filter.favourites', + defaultMessage: 'Favorites', + }, + boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' }, + polls: { id: 'notifications.filter.polls', defaultMessage: 'Poll results' }, + follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' }, + statuses: { + id: 'notifications.filter.statuses', + defaultMessage: 'Updates from people you follow', + }, +}); + +const BarButton: React.FC< + PropsWithChildren<{ + selectedFilter: string; + type: string; + title?: string; + }> +> = ({ selectedFilter, type, title, children }) => { + const dispatch = useAppDispatch(); + + const onClick = useCallback(() => { + void dispatch(setNotificationsFilter({ filterType: type })); + }, [dispatch, type]); + + return ( + + ); +}; + +export const FilterBar: React.FC = () => { + const intl = useIntl(); + + const selectedFilter = useAppSelector( + selectSettingsNotificationsQuickFilterActive, + ); + const advancedMode = useAppSelector( + selectSettingsNotificationsQuickFilterAdvanced, + ); + + if (advancedMode) + return ( +
+ + + + + + + + + + + + + + + + + + + + + +
+ ); + else + return ( +
+ + + + + + +
+ ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/index.tsx b/app/javascript/mastodon/features/notifications_v2/index.tsx new file mode 100644 index 00000000000..05dcf422e97 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/index.tsx @@ -0,0 +1,362 @@ +import { useCallback, useEffect, useMemo, useRef } from 'react'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import { Helmet } from 'react-helmet'; + +import { createSelector } from '@reduxjs/toolkit'; + +import { useDebouncedCallback } from 'use-debounce'; + +import DoneAllIcon from '@/material-icons/400-24px/done_all.svg?react'; +import NotificationsIcon from '@/material-icons/400-24px/notifications-fill.svg?react'; +import { + fetchNotificationsGap, + updateScrollPosition, + loadPending, + markNotificationsAsRead, + mountNotifications, + unmountNotifications, +} from 'mastodon/actions/notification_groups'; +import { compareId } from 'mastodon/compare_id'; +import { Icon } from 'mastodon/components/icon'; +import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator'; +import { useIdentity } from 'mastodon/identity_context'; +import type { NotificationGap } from 'mastodon/reducers/notification_groups'; +import { + selectUnreadNotificationGroupsCount, + selectPendingNotificationGroupsCount, +} from 'mastodon/selectors/notifications'; +import { + selectNeedsNotificationPermission, + selectSettingsNotificationsExcludedTypes, + selectSettingsNotificationsQuickFilterActive, + selectSettingsNotificationsQuickFilterShow, + selectSettingsNotificationsShowUnread, +} from 'mastodon/selectors/settings'; +import { useAppDispatch, useAppSelector } from 'mastodon/store'; +import type { RootState } from 'mastodon/store'; + +import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; +import { submitMarkers } from '../../actions/markers'; +import Column from '../../components/column'; +import { ColumnHeader } from '../../components/column_header'; +import { LoadGap } from '../../components/load_gap'; +import ScrollableList from '../../components/scrollable_list'; +import { + FilteredNotificationsBanner, + FilteredNotificationsIconButton, +} from '../notifications/components/filtered_notifications_banner'; +import NotificationsPermissionBanner from '../notifications/components/notifications_permission_banner'; +import ColumnSettingsContainer from '../notifications/containers/column_settings_container'; + +import { NotificationGroup } from './components/notification_group'; +import { FilterBar } from './filter_bar'; + +const messages = defineMessages({ + title: { id: 'column.notifications', defaultMessage: 'Notifications' }, + markAsRead: { + id: 'notifications.mark_as_read', + defaultMessage: 'Mark every notification as read', + }, +}); + +const getNotifications = createSelector( + [ + selectSettingsNotificationsQuickFilterShow, + selectSettingsNotificationsQuickFilterActive, + selectSettingsNotificationsExcludedTypes, + (state: RootState) => state.notificationGroups.groups, + ], + (showFilterBar, allowedType, excludedTypes, notifications) => { + if (!showFilterBar || allowedType === 'all') { + // used if user changed the notification settings after loading the notifications from the server + // otherwise a list of notifications will come pre-filtered from the backend + // we need to turn it off for FilterBar in order not to block ourselves from seeing a specific category + return notifications.filter( + (item) => item.type === 'gap' || !excludedTypes.includes(item.type), + ); + } + return notifications.filter( + (item) => item.type === 'gap' || allowedType === item.type, + ); + }, +); + +export const Notifications: React.FC<{ + columnId?: string; + multiColumn?: boolean; +}> = ({ columnId, multiColumn }) => { + const intl = useIntl(); + const notifications = useAppSelector(getNotifications); + const dispatch = useAppDispatch(); + const isLoading = useAppSelector((s) => s.notificationGroups.isLoading); + const hasMore = notifications.at(-1)?.type === 'gap'; + + const lastReadId = useAppSelector((s) => + selectSettingsNotificationsShowUnread(s) + ? s.notificationGroups.lastReadId + : '0', + ); + + const numPending = useAppSelector(selectPendingNotificationGroupsCount); + + const unreadNotificationsCount = useAppSelector( + selectUnreadNotificationGroupsCount, + ); + + const isUnread = unreadNotificationsCount > 0; + + const canMarkAsRead = + useAppSelector(selectSettingsNotificationsShowUnread) && + unreadNotificationsCount > 0; + + const needsNotificationPermission = useAppSelector( + selectNeedsNotificationPermission, + ); + + const columnRef = useRef(null); + + const selectChild = useCallback((index: number, alignTop: boolean) => { + const container = columnRef.current?.node as HTMLElement | undefined; + + if (!container) return; + + const element = container.querySelector( + `article:nth-of-type(${index + 1}) .focusable`, + ); + + if (element) { + if (alignTop && container.scrollTop > element.offsetTop) { + element.scrollIntoView(true); + } else if ( + !alignTop && + container.scrollTop + container.clientHeight < + element.offsetTop + element.offsetHeight + ) { + element.scrollIntoView(false); + } + element.focus(); + } + }, []); + + // Keep track of mounted components for unread notification handling + useEffect(() => { + dispatch(mountNotifications()); + + return () => { + dispatch(unmountNotifications()); + dispatch(updateScrollPosition({ top: false })); + }; + }, [dispatch]); + + const handleLoadGap = useCallback( + (gap: NotificationGap) => { + void dispatch(fetchNotificationsGap({ gap })); + }, + [dispatch], + ); + + const handleLoadOlder = useDebouncedCallback( + () => { + const gap = notifications.at(-1); + if (gap?.type === 'gap') void dispatch(fetchNotificationsGap({ gap })); + }, + 300, + { leading: true }, + ); + + const handleLoadPending = useCallback(() => { + dispatch(loadPending()); + }, [dispatch]); + + const handleScrollToTop = useDebouncedCallback(() => { + dispatch(updateScrollPosition({ top: true })); + }, 100); + + const handleScroll = useDebouncedCallback(() => { + dispatch(updateScrollPosition({ top: false })); + }, 100); + + useEffect(() => { + return () => { + handleLoadOlder.cancel(); + handleScrollToTop.cancel(); + handleScroll.cancel(); + }; + }, [handleLoadOlder, handleScrollToTop, handleScroll]); + + const handlePin = useCallback(() => { + if (columnId) { + dispatch(removeColumn(columnId)); + } else { + dispatch(addColumn('NOTIFICATIONS', {})); + } + }, [columnId, dispatch]); + + const handleMove = useCallback( + (dir: unknown) => { + dispatch(moveColumn(columnId, dir)); + }, + [dispatch, columnId], + ); + + const handleHeaderClick = useCallback(() => { + columnRef.current?.scrollTop(); + }, []); + + const handleMoveUp = useCallback( + (id: string) => { + const elementIndex = + notifications.findIndex( + (item) => item.type !== 'gap' && item.group_key === id, + ) - 1; + selectChild(elementIndex, true); + }, + [notifications, selectChild], + ); + + const handleMoveDown = useCallback( + (id: string) => { + const elementIndex = + notifications.findIndex( + (item) => item.type !== 'gap' && item.group_key === id, + ) + 1; + selectChild(elementIndex, false); + }, + [notifications, selectChild], + ); + + const handleMarkAsRead = useCallback(() => { + dispatch(markNotificationsAsRead()); + void dispatch(submitMarkers({ immediate: true })); + }, [dispatch]); + + const pinned = !!columnId; + const emptyMessage = ( + + ); + + const { signedIn } = useIdentity(); + + const filterBar = signedIn ? : null; + + const scrollableContent = useMemo(() => { + if (notifications.length === 0 && !hasMore) return null; + + return notifications.map((item) => + item.type === 'gap' ? ( + + ) : ( + 0 + } + /> + ), + ); + }, [ + notifications, + isLoading, + hasMore, + lastReadId, + handleLoadGap, + handleMoveUp, + handleMoveDown, + ]); + + const prepend = ( + <> + {needsNotificationPermission && } + + + ); + + const scrollContainer = signedIn ? ( + + {scrollableContent} + + ) : ( + + ); + + const extraButton = ( + <> + + {canMarkAsRead && ( + + )} + + ); + + return ( + + + + + + {filterBar} + + {scrollContainer} + + + {intl.formatMessage(messages.title)} + + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export default Notifications; diff --git a/app/javascript/mastodon/features/notifications_wrapper.jsx b/app/javascript/mastodon/features/notifications_wrapper.jsx new file mode 100644 index 00000000000..057ed1b395f --- /dev/null +++ b/app/javascript/mastodon/features/notifications_wrapper.jsx @@ -0,0 +1,13 @@ +import Notifications from 'mastodon/features/notifications'; +import Notifications_v2 from 'mastodon/features/notifications_v2'; +import { useAppSelector } from 'mastodon/store'; + +export const NotificationsWrapper = (props) => { + const optedInGroupedNotifications = useAppSelector((state) => state.getIn(['settings', 'notifications', 'groupingBeta'], false)); + + return ( + optedInGroupedNotifications ? : + ); +}; + +export default NotificationsWrapper; \ No newline at end of file diff --git a/app/javascript/mastodon/features/onboarding/index.jsx b/app/javascript/mastodon/features/onboarding/index.jsx index 529d53f2574..d100a1c3d5f 100644 --- a/app/javascript/mastodon/features/onboarding/index.jsx +++ b/app/javascript/mastodon/features/onboarding/index.jsx @@ -3,7 +3,7 @@ import { useCallback } from 'react'; import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; import { Helmet } from 'react-helmet'; -import { Link, Switch, Route, useHistory } from 'react-router-dom'; +import { Link, Switch, Route } from 'react-router-dom'; import { useDispatch } from 'react-redux'; @@ -35,11 +35,10 @@ const Onboarding = () => { const account = useAppSelector(state => state.getIn(['accounts', me])); const dispatch = useDispatch(); const intl = useIntl(); - const history = useHistory(); const handleComposeClick = useCallback(() => { - dispatch(focusCompose(history, intl.formatMessage(messages.template))); - }, [dispatch, intl, history]); + dispatch(focusCompose(intl.formatMessage(messages.template))); + }, [dispatch, intl]); return ( 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 ba0642da288..300c8dd5b3e 100644 --- a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx +++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx @@ -15,11 +15,11 @@ import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react'; import StarIcon from '@/material-icons/400-24px/star.svg?react'; import { replyCompose } from 'mastodon/actions/compose'; -import { reblog, favourite, unreblog, unfavourite } from 'mastodon/actions/interactions'; +import { toggleReblog, toggleFavourite } 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 { me } from 'mastodon/initial_state'; import { makeGetStatus } from 'mastodon/selectors'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; @@ -31,8 +31,6 @@ const messages = defineMessages({ cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, favourite: { id: 'status.favourite', defaultMessage: 'Favorite' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, open: { id: 'status.open', defaultMessage: 'Expand this status' }, }); @@ -61,29 +59,23 @@ class Footer extends ImmutablePureComponent { }; _performReply = () => { - const { dispatch, status, onClose, history } = this.props; + const { dispatch, status, onClose } = this.props; if (onClose) { onClose(true); } - dispatch(replyCompose(status, history)); + dispatch(replyCompose(status)); }; handleReplyClick = () => { - const { dispatch, askReplyConfirmation, status, intl } = this.props; + const { dispatch, askReplyConfirmation, status, onClose } = this.props; const { signedIn } = this.props.identity; if (signedIn) { if (askReplyConfirmation) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: this._performReply, - }, - })); + onClose(true); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { this._performReply(); } @@ -104,11 +96,7 @@ class Footer extends ImmutablePureComponent { const { signedIn } = this.props.identity; if (signedIn) { - if (status.get('favourited')) { - dispatch(unfavourite(status)); - } else { - dispatch(favourite(status)); - } + dispatch(toggleFavourite(status.get('id'))); } else { dispatch(openModal({ modalType: 'INTERACTION', @@ -121,23 +109,12 @@ class Footer extends ImmutablePureComponent { } }; - _performReblog = (status, privacy) => { - const { dispatch } = this.props; - dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); - }; - handleReblogClick = e => { const { dispatch, status } = this.props; const { signedIn } = this.props.identity; if (signedIn) { - if (status.get('reblogged')) { - dispatch(unreblog({ statusId: status.get('id') })); - } else if ((e && e.shiftKey) || !boostModal) { - this._performReblog(status); - } else { - dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this._performReblog } })); - } + dispatch(toggleReblog(status.get('id'), e && e.shiftKey)); } else { dispatch(openModal({ modalType: 'INTERACTION', diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx index d6105399873..d90ca464a74 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.jsx +++ b/app/javascript/mastodon/features/status/components/action_bar.jsx @@ -4,7 +4,6 @@ import { PureComponent } from 'react'; import { defineMessages, injectIntl } from 'react-intl'; import classNames from 'classnames'; -import { withRouter } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; @@ -23,7 +22,6 @@ 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'; import { IconButton } from '../../../components/icon_button'; import DropdownMenuContainer from '../../../containers/dropdown_menu_container'; @@ -91,7 +89,6 @@ class ActionBar extends PureComponent { onPin: PropTypes.func, onEmbed: PropTypes.func, intl: PropTypes.object.isRequired, - ...WithRouterPropTypes, }; handleReplyClick = () => { @@ -111,23 +108,23 @@ class ActionBar extends PureComponent { }; handleDeleteClick = () => { - this.props.onDelete(this.props.status, this.props.history); + this.props.onDelete(this.props.status); }; handleRedraftClick = () => { - this.props.onDelete(this.props.status, this.props.history, true); + this.props.onDelete(this.props.status, true); }; handleEditClick = () => { - this.props.onEdit(this.props.status, this.props.history); + this.props.onEdit(this.props.status); }; handleDirectClick = () => { - this.props.onDirect(this.props.status.get('account'), this.props.history); + this.props.onDirect(this.props.status.get('account')); }; handleMentionClick = () => { - this.props.onMention(this.props.status.get('account'), this.props.history); + this.props.onMention(this.props.status.get('account')); }; handleMuteClick = () => { @@ -323,4 +320,4 @@ class ActionBar extends PureComponent { } -export default withRouter(connect(mapStateToProps)(withIdentity(injectIntl(ActionBar)))); +export default 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 f562e53f0ba..ee1fbe0f8fe 100644 --- a/app/javascript/mastodon/features/status/components/card.jsx +++ b/app/javascript/mastodon/features/status/components/card.jsx @@ -138,10 +138,10 @@ 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 showAuthor = !!card.getIn(['authors', 0, 'accountId']); const description = ( -
+
{provider} {card.get('published_at') && <> · } @@ -244,7 +244,7 @@ export default class Card extends PureComponent { {description} - {showAuthor && } + {showAuthor && } ); } diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx index 8843619bc93..bc81fd2dfb1 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx @@ -272,7 +272,7 @@ class DetailedStatus extends ImmutablePureComponent {
)} - +
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 c3d4fec4dba..0e73697fef7 100644 --- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js +++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js @@ -1,4 +1,4 @@ -import { defineMessages, injectIntl } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; @@ -10,10 +10,8 @@ import { directCompose, } from '../../../actions/compose'; import { - reblog, - favourite, - unreblog, - unfavourite, + toggleReblog, + toggleFavourite, pin, unpin, } from '../../../actions/interactions'; @@ -24,22 +22,12 @@ import { muteStatus, unmuteStatus, deleteStatus, - hideStatus, - revealStatus, + toggleStatusSpoilers, } from '../../../actions/statuses'; -import { boostModal, deleteModal } from '../../../initial_state'; +import { deleteModal } from '../../../initial_state'; import { makeGetStatus, makeGetPictureInPicture } from '../../../selectors'; import DetailedStatus from '../components/detailed_status'; -const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, -}); - const makeMapStateToProps = () => { const getStatus = makeGetStatus(); const getPictureInPicture = makeGetPictureInPicture(); @@ -53,48 +41,25 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ - onReply (status, router) { + onReply (status) { dispatch((_, getState) => { let state = getState(); if (state.getIn(['compose', 'text']).trim().length !== 0) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: () => dispatch(replyCompose(status, router)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { - dispatch(replyCompose(status, router)); + dispatch(replyCompose(status)); } }); }, - onModalReblog (status, privacy) { - dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); - }, - onReblog (status, e) { - if (status.get('reblogged')) { - dispatch(unreblog({ statusId: status.get('id') })); - } else { - if (e.shiftKey || !boostModal) { - this.onModalReblog(status); - } else { - dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this.onModalReblog } })); - } - } + dispatch(toggleReblog(status.get('id'), e.shiftKey)); }, onFavourite (status) { - if (status.get('favourited')) { - dispatch(unfavourite(status)); - } else { - dispatch(favourite(status)); - } + dispatch(toggleFavourite(status.get('id'))); }, onPin (status) { @@ -115,27 +80,20 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ })); }, - onDelete (status, history, withRedraft = false) { + onDelete (status, withRedraft = false) { if (!deleteModal) { - dispatch(deleteStatus(status.get('id'), history, withRedraft)); + dispatch(deleteStatus(status.get('id'), withRedraft)); } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } })); } }, - onDirect (account, router) { - dispatch(directCompose(account, router)); + onDirect (account) { + dispatch(directCompose(account)); }, - onMention (account, router) { - dispatch(mentionCompose(account, router)); + onMention (account) { + dispatch(mentionCompose(account)); }, onOpenMedia (media, index, lang) { @@ -174,11 +132,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onToggleHidden (status) { - if (status.get('hidden')) { - dispatch(revealStatus(status.get('id'))); - } else { - dispatch(hideStatus(status.get('id'))); - } + dispatch(toggleStatusSpoilers(status.get('id'))); }, }); diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index 7f37cb50d2e..7f3044c5c9b 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -38,12 +38,10 @@ import { unblockDomain, } from '../../actions/domain_blocks'; import { - favourite, - unfavourite, + toggleFavourite, bookmark, unbookmark, - reblog, - unreblog, + toggleReblog, pin, unpin, } from '../../actions/interactions'; @@ -64,7 +62,7 @@ import { import ColumnHeader from '../../components/column_header'; import { textForScreenReader, defaultMediaVisibility } from '../../components/status'; import StatusContainer from '../../containers/status_container'; -import { boostModal, deleteModal } from '../../initial_state'; +import { deleteModal } from '../../initial_state'; import { makeGetStatus, makeGetPictureInPicture } from '../../selectors'; import Column from '../ui/components/column'; import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen'; @@ -74,17 +72,10 @@ import DetailedStatus from './components/detailed_status'; const messages = defineMessages({ - deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, - deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, - redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' }, detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' }, - replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, - blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' }, }); const makeMapStateToProps = () => { @@ -244,11 +235,7 @@ class Status extends ImmutablePureComponent { const { signedIn } = this.props.identity; if (signedIn) { - if (status.get('favourited')) { - dispatch(unfavourite(status)); - } else { - dispatch(favourite(status)); - } + dispatch(toggleFavourite(status.get('id'))); } else { dispatch(openModal({ modalType: 'INTERACTION', @@ -270,21 +257,14 @@ class Status extends ImmutablePureComponent { }; handleReplyClick = (status) => { - const { askReplyConfirmation, dispatch, intl } = this.props; + const { askReplyConfirmation, dispatch } = this.props; const { signedIn } = this.props.identity; if (signedIn) { if (askReplyConfirmation) { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.replyMessage), - confirm: intl.formatMessage(messages.replyConfirm), - onConfirm: () => dispatch(replyCompose(status, this.props.history)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } })); } else { - dispatch(replyCompose(status, this.props.history)); + dispatch(replyCompose(status)); } } else { dispatch(openModal({ @@ -298,24 +278,12 @@ class Status extends ImmutablePureComponent { } }; - handleModalReblog = (status, privacy) => { - this.props.dispatch(reblog({ statusId: status.get('id'), visibility: privacy })); - }; - handleReblogClick = (status, e) => { const { dispatch } = this.props; const { signedIn } = this.props.identity; if (signedIn) { - if (status.get('reblogged')) { - dispatch(unreblog({ statusId: status.get('id') })); - } else { - if ((e && e.shiftKey) || !boostModal) { - this.handleModalReblog(status); - } else { - dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this.handleModalReblog } })); - } - } + dispatch(toggleReblog(status.get('id'), e && e.shiftKey)); } else { dispatch(openModal({ modalType: 'INTERACTION', @@ -336,33 +304,32 @@ class Status extends ImmutablePureComponent { } }; - handleDeleteClick = (status, history, withRedraft = false) => { - const { dispatch, intl } = this.props; + handleDeleteClick = (status, withRedraft = false) => { + const { dispatch } = this.props; if (!deleteModal) { - dispatch(deleteStatus(status.get('id'), history, withRedraft)); + dispatch(deleteStatus(status.get('id'), withRedraft)); } else { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), - confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } })); } }; - handleEditClick = (status, history) => { - this.props.dispatch(editStatus(status.get('id'), history)); + handleEditClick = (status) => { + const { dispatch, askReplyConfirmation } = this.props; + + if (askReplyConfirmation) { + dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } })); + } else { + dispatch(editStatus(status.get('id'))); + } }; - handleDirectClick = (account, router) => { - this.props.dispatch(directCompose(account, router)); + handleDirectClick = (account) => { + this.props.dispatch(directCompose(account)); }; - handleMentionClick = (account, router) => { - this.props.dispatch(mentionCompose(account, router)); + handleMentionClick = (account) => { + this.props.dispatch(mentionCompose(account)); }; handleOpenMedia = (media, index, lang) => { diff --git a/app/javascript/mastodon/features/ui/components/column_loading.tsx b/app/javascript/mastodon/features/ui/components/column_loading.tsx index 42174838cf3..d9563dda7a0 100644 --- a/app/javascript/mastodon/features/ui/components/column_loading.tsx +++ b/app/javascript/mastodon/features/ui/components/column_loading.tsx @@ -1,11 +1,8 @@ -import Column from '../../../components/column'; -import ColumnHeader from '../../../components/column_header'; +import Column from 'mastodon/components/column'; +import { ColumnHeader } from 'mastodon/components/column_header'; +import type { Props as ColumnHeaderProps } from 'mastodon/components/column_header'; -interface Props { - multiColumn?: boolean; -} - -export const ColumnLoading: React.FC = (otherProps) => ( +export const ColumnLoading: React.FC = (otherProps) => (
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.jsx b/app/javascript/mastodon/features/ui/components/columns_area.jsx index 19c2f40ac61..063ac28d96f 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.jsx +++ b/app/javascript/mastodon/features/ui/components/columns_area.jsx @@ -10,7 +10,7 @@ import { scrollRight } from '../../../scroll'; import BundleContainer from '../containers/bundle_container'; import { Compose, - Notifications, + NotificationsWrapper, HomeTimeline, CommunityTimeline, PublicTimeline, @@ -32,7 +32,7 @@ import NavigationPanel from './navigation_panel'; const componentMap = { 'COMPOSE': Compose, 'HOME': HomeTimeline, - 'NOTIFICATIONS': Notifications, + 'NOTIFICATIONS': NotificationsWrapper, 'PUBLIC': PublicTimeline, 'REMOTE': PublicTimeline, 'COMMUNITY': CommunityTimeline, diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modal.jsx b/app/javascript/mastodon/features/ui/components/confirmation_modal.jsx deleted file mode 100644 index 5080c0bf858..00000000000 --- a/app/javascript/mastodon/features/ui/components/confirmation_modal.jsx +++ /dev/null @@ -1,65 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { injectIntl, FormattedMessage } from 'react-intl'; - -import { Button } from '../../../components/button'; - -class ConfirmationModal extends PureComponent { - - static propTypes = { - message: PropTypes.node.isRequired, - confirm: PropTypes.string.isRequired, - onClose: PropTypes.func.isRequired, - onConfirm: PropTypes.func.isRequired, - secondary: PropTypes.string, - onSecondary: PropTypes.func, - closeWhenConfirm: PropTypes.bool, - intl: PropTypes.object.isRequired, - }; - - static defaultProps = { - closeWhenConfirm: true, - }; - - handleClick = () => { - if (this.props.closeWhenConfirm) { - this.props.onClose(); - } - this.props.onConfirm(); - }; - - handleSecondary = () => { - this.props.onClose(); - this.props.onSecondary(); - }; - - handleCancel = () => { - this.props.onClose(); - }; - - render () { - const { message, confirm, secondary } = this.props; - - return ( -
-
- {message} -
- -
- - {secondary !== undefined && ( -
-
- ); - } - -} - -export default injectIntl(ConfirmationModal); diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/clear_notifications.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/clear_notifications.tsx new file mode 100644 index 00000000000..312ec600a64 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/clear_notifications.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { clearNotifications } from 'mastodon/actions/notification_groups'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + clearTitle: { + id: 'notifications.clear_title', + defaultMessage: 'Clear notifications?', + }, + clearMessage: { + id: 'notifications.clear_confirmation', + defaultMessage: + 'Are you sure you want to permanently clear all your notifications?', + }, + clearConfirm: { + id: 'notifications.clear', + defaultMessage: 'Clear notifications', + }, +}); + +export const ConfirmClearNotificationsModal: React.FC< + BaseConfirmationModalProps +> = ({ onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + void dispatch(clearNotifications()); + }, [dispatch]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx new file mode 100644 index 00000000000..c3a0c0aa76d --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx @@ -0,0 +1,79 @@ +import { useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { Button } from 'mastodon/components/button'; + +export interface BaseConfirmationModalProps { + onClose: () => void; +} + +export const ConfirmationModal: React.FC< + { + title: React.ReactNode; + message: React.ReactNode; + confirm: React.ReactNode; + secondary?: React.ReactNode; + onSecondary?: () => void; + onConfirm: () => void; + closeWhenConfirm?: boolean; + } & BaseConfirmationModalProps +> = ({ + title, + message, + confirm, + onClose, + onConfirm, + secondary, + onSecondary, + closeWhenConfirm = true, +}) => { + const handleClick = useCallback(() => { + if (closeWhenConfirm) { + onClose(); + } + + onConfirm(); + }, [onClose, onConfirm, closeWhenConfirm]); + + const handleSecondary = useCallback(() => { + onClose(); + onSecondary?.(); + }, [onClose, onSecondary]); + + const handleCancel = useCallback(() => { + onClose(); + }, [onClose]); + + return ( +
+
+
+

{title}

+

{message}

+
+
+ +
+
+ {secondary && ( + <> + + +
+ + )} + + + + +
+
+
+ ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_list.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_list.tsx new file mode 100644 index 00000000000..8fd9d8da012 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_list.tsx @@ -0,0 +1,58 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { useHistory } from 'react-router'; + +import { removeColumn } from 'mastodon/actions/columns'; +import { deleteList } from 'mastodon/actions/lists'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + deleteListTitle: { + id: 'confirmations.delete_list.title', + defaultMessage: 'Delete list?', + }, + deleteListMessage: { + id: 'confirmations.delete_list.message', + defaultMessage: 'Are you sure you want to permanently delete this list?', + }, + deleteListConfirm: { + id: 'confirmations.delete_list.confirm', + defaultMessage: 'Delete', + }, +}); + +export const ConfirmDeleteListModal: React.FC< + { + listId: string; + columnId: string; + } & BaseConfirmationModalProps +> = ({ listId, columnId, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const history = useHistory(); + + const onConfirm = useCallback(() => { + dispatch(deleteList(listId)); + + if (columnId) { + dispatch(removeColumn(columnId)); + } else { + history.push('/lists'); + } + }, [dispatch, history, columnId, listId]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_status.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_status.tsx new file mode 100644 index 00000000000..39e80cf7410 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/delete_status.tsx @@ -0,0 +1,67 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { deleteStatus } from 'mastodon/actions/statuses'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + deleteAndRedraftTitle: { + id: 'confirmations.redraft.title', + defaultMessage: 'Delete & redraft post?', + }, + deleteAndRedraftMessage: { + id: 'confirmations.redraft.message', + defaultMessage: + 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.', + }, + deleteAndRedraftConfirm: { + id: 'confirmations.redraft.confirm', + defaultMessage: 'Delete & redraft', + }, + deleteTitle: { + id: 'confirmations.delete.title', + defaultMessage: 'Delete post?', + }, + deleteMessage: { + id: 'confirmations.delete.message', + defaultMessage: 'Are you sure you want to delete this status?', + }, + deleteConfirm: { + id: 'confirmations.delete.confirm', + defaultMessage: 'Delete', + }, +}); + +export const ConfirmDeleteStatusModal: React.FC< + { + statusId: string; + withRedraft: boolean; + } & BaseConfirmationModalProps +> = ({ statusId, withRedraft, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(deleteStatus(statusId, withRedraft)); + }, [dispatch, statusId, withRedraft]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/edit_status.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/edit_status.tsx new file mode 100644 index 00000000000..fb958518c25 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/edit_status.tsx @@ -0,0 +1,45 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { editStatus } from 'mastodon/actions/statuses'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + editTitle: { + id: 'confirmations.edit.title', + defaultMessage: 'Overwrite post?', + }, + editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' }, + editMessage: { + id: 'confirmations.edit.message', + defaultMessage: + 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?', + }, +}); + +export const ConfirmEditStatusModal: React.FC< + { + statusId: string; + } & BaseConfirmationModalProps +> = ({ statusId, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(editStatus(statusId)); + }, [dispatch, statusId]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts b/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts new file mode 100644 index 00000000000..912c99a393a --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts @@ -0,0 +1,8 @@ +export { ConfirmationModal } from './confirmation_modal'; +export { ConfirmDeleteStatusModal } from './delete_status'; +export { ConfirmDeleteListModal } from './delete_list'; +export { ConfirmReplyModal } from './reply'; +export { ConfirmEditStatusModal } from './edit_status'; +export { ConfirmUnfollowModal } from './unfollow'; +export { ConfirmClearNotificationsModal } from './clear_notifications'; +export { ConfirmLogOutModal } from './log_out'; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/log_out.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/log_out.tsx new file mode 100644 index 00000000000..48d24182ed6 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/log_out.tsx @@ -0,0 +1,40 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { logOut } from 'mastodon/utils/log_out'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + logoutTitle: { id: 'confirmations.logout.title', defaultMessage: 'Log out?' }, + logoutMessage: { + id: 'confirmations.logout.message', + defaultMessage: 'Are you sure you want to log out?', + }, + logoutConfirm: { + id: 'confirmations.logout.confirm', + defaultMessage: 'Log out', + }, +}); + +export const ConfirmLogOutModal: React.FC = ({ + onClose, +}) => { + const intl = useIntl(); + + const onConfirm = useCallback(() => { + logOut(); + }, []); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/reply.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/reply.tsx new file mode 100644 index 00000000000..cccd62e4b41 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/reply.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { replyCompose } from 'mastodon/actions/compose'; +import type { Status } from 'mastodon/models/status'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + replyTitle: { + id: 'confirmations.reply.title', + defaultMessage: 'Overwrite post?', + }, + replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, + replyMessage: { + id: 'confirmations.reply.message', + defaultMessage: + 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?', + }, +}); + +export const ConfirmReplyModal: React.FC< + { + status: Status; + } & BaseConfirmationModalProps +> = ({ status, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(replyCompose(status)); + }, [dispatch, status]); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/unfollow.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/unfollow.tsx new file mode 100644 index 00000000000..58e39da07bf --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/unfollow.tsx @@ -0,0 +1,50 @@ +import { useCallback } from 'react'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import { unfollowAccount } from 'mastodon/actions/accounts'; +import type { Account } from 'mastodon/models/account'; +import { useAppDispatch } from 'mastodon/store'; + +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import { ConfirmationModal } from './confirmation_modal'; + +const messages = defineMessages({ + unfollowTitle: { + id: 'confirmations.unfollow.title', + defaultMessage: 'Unfollow user?', + }, + unfollowConfirm: { + id: 'confirmations.unfollow.confirm', + defaultMessage: 'Unfollow', + }, +}); + +export const ConfirmUnfollowModal: React.FC< + { + account: Account; + } & BaseConfirmationModalProps +> = ({ account, onClose }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + + const onConfirm = useCallback(() => { + dispatch(unfollowAccount(account.id)); + }, [dispatch, account.id]); + + return ( + @{account.acct}
}} + /> + } + confirm={intl.formatMessage(messages.unfollowConfirm)} + onConfirm={onConfirm} + onClose={onClose} + /> + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/disabled_account_banner.jsx b/app/javascript/mastodon/features/ui/components/disabled_account_banner.jsx index 6a71bb2465e..3d1380f6669 100644 --- a/app/javascript/mastodon/features/ui/components/disabled_account_banner.jsx +++ b/app/javascript/mastodon/features/ui/components/disabled_account_banner.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -9,29 +9,15 @@ import { connect } from 'react-redux'; import { openModal } from 'mastodon/actions/modal'; import { disabledAccountId, movedToAccountId, domain } from 'mastodon/initial_state'; -import { logOut } from 'mastodon/utils/log_out'; - -const messages = defineMessages({ - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, -}); const mapStateToProps = (state) => ({ disabledAcct: state.getIn(['accounts', disabledAccountId, 'acct']), movedToAcct: movedToAccountId ? state.getIn(['accounts', movedToAccountId, 'acct']) : undefined, }); -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onLogout () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); }, }); diff --git a/app/javascript/mastodon/features/ui/components/link_footer.jsx b/app/javascript/mastodon/features/ui/components/link_footer.jsx index 08af6fa4442..49b21c2e487 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.jsx +++ b/app/javascript/mastodon/features/ui/components/link_footer.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -11,24 +11,11 @@ import { openModal } from 'mastodon/actions/modal'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'mastodon/initial_state'; import { PERMISSION_INVITE_USERS } from 'mastodon/permissions'; -import { logOut } from 'mastodon/utils/log_out'; -const messages = defineMessages({ - logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, - logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, -}); - -const mapDispatchToProps = (dispatch, { intl }) => ({ +const mapDispatchToProps = (dispatch) => ({ onLogout () { - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - message: intl.formatMessage(messages.logoutMessage), - confirm: intl.formatMessage(messages.logoutConfirm), - closeWhenConfirm: false, - onConfirm: () => logOut(), - }, - })); + dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' })); + }, }); diff --git a/app/javascript/mastodon/features/ui/components/modal_root.jsx b/app/javascript/mastodon/features/ui/components/modal_root.jsx index 404b53c7429..3e900a06670 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.jsx +++ b/app/javascript/mastodon/features/ui/components/modal_root.jsx @@ -26,7 +26,16 @@ import ActionsModal from './actions_modal'; import AudioModal from './audio_modal'; import { BoostModal } from './boost_modal'; import BundleModalError from './bundle_modal_error'; -import ConfirmationModal from './confirmation_modal'; +import { + ConfirmationModal, + ConfirmDeleteStatusModal, + ConfirmDeleteListModal, + ConfirmReplyModal, + ConfirmEditStatusModal, + ConfirmUnfollowModal, + ConfirmClearNotificationsModal, + ConfirmLogOutModal, +} from './confirmation_modals'; import FocalPointModal from './focal_point_modal'; import ImageModal from './image_modal'; import MediaModal from './media_modal'; @@ -40,6 +49,13 @@ export const MODAL_COMPONENTS = { 'IMAGE': () => Promise.resolve({ default: ImageModal }), 'BOOST': () => Promise.resolve({ default: BoostModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), + 'CONFIRM_DELETE_STATUS': () => Promise.resolve({ default: ConfirmDeleteStatusModal }), + 'CONFIRM_DELETE_LIST': () => Promise.resolve({ default: ConfirmDeleteListModal }), + 'CONFIRM_REPLY': () => Promise.resolve({ default: ConfirmReplyModal }), + 'CONFIRM_EDIT_STATUS': () => Promise.resolve({ default: ConfirmEditStatusModal }), + 'CONFIRM_UNFOLLOW': () => Promise.resolve({ default: ConfirmUnfollowModal }), + 'CONFIRM_CLEAR_NOTIFICATIONS': () => Promise.resolve({ default: ConfirmClearNotificationsModal }), + 'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }), 'MUTE': MuteModal, 'BLOCK': BlockModal, 'DOMAIN_BLOCK': DomainBlockModal, diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index ff90eef359f..2648923bfc4 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -34,6 +34,7 @@ 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'; +import { selectUnreadNotificationGroupsCount } from 'mastodon/selectors/notifications'; import ColumnLink from './column_link'; import DisabledAccountBanner from './disabled_account_banner'; @@ -59,15 +60,19 @@ const messages = defineMessages({ }); const NotificationsLink = () => { + const optedInGroupedNotifications = useSelector((state) => state.getIn(['settings', 'notifications', 'groupingBeta'], false)); const count = useSelector(state => state.getIn(['notifications', 'unread'])); const intl = useIntl(); + const newCount = useSelector(selectUnreadNotificationGroupsCount); + return ( } - activeIcon={} + icon={} + activeIcon={} text={intl.formatMessage(messages.notifications)} /> ); diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 7742f64860d..f36e0cf501f 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -13,7 +13,9 @@ import { HotKeys } from 'react-hotkeys'; import { focusApp, unfocusApp, changeLayout } from 'mastodon/actions/app'; import { synchronouslySubmitMarkers, submitMarkers, fetchMarkers } from 'mastodon/actions/markers'; +import { initializeNotifications } from 'mastodon/actions/notifications_migration'; import { INTRODUCTION_VERSION } from 'mastodon/actions/onboarding'; +import { HoverCardController } from 'mastodon/components/hover_card_controller'; import { PictureInPicture } from 'mastodon/features/picture_in_picture'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { layoutFromWindow } from 'mastodon/is_mobile'; @@ -21,10 +23,9 @@ import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../actions/compose'; import { clearHeight } from '../../actions/height_cache'; -import { expandNotifications } from '../../actions/notifications'; import { fetchServer, fetchServerTranslationLanguages } from '../../actions/server'; import { expandHomeTimeline } from '../../actions/timelines'; -import initialState, { me, owner, singleUserMode, trendsEnabled, trendsAsLanding } from '../../initial_state'; +import initialState, { me, owner, singleUserMode, trendsEnabled, trendsAsLanding, disableHoverCards } from '../../initial_state'; import BundleColumnError from './components/bundle_column_error'; import Header from './components/header'; @@ -48,13 +49,14 @@ import { Favourites, DirectTimeline, HashtagTimeline, - Notifications, + NotificationsWrapper, NotificationRequests, NotificationRequest, FollowRequests, FavouritedStatuses, BookmarkedStatuses, FollowedTags, + LinkTimeline, ListTimeline, Blocks, DomainBlocks, @@ -69,6 +71,7 @@ import { } from './util/async-components'; import { ColumnsContextProvider } from './util/columns_context'; import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers'; + // Dummy import, to make sure that ends up in the application bundle. // Without this it ends up in ~8 very commonly used bundles. import '../../components/status'; @@ -201,8 +204,9 @@ class SwitchingColumnsArea extends PureComponent { + - + @@ -402,7 +406,7 @@ class UI extends PureComponent { if (signedIn) { this.props.dispatch(fetchMarkers()); this.props.dispatch(expandHomeTimeline()); - this.props.dispatch(expandNotifications()); + this.props.dispatch(initializeNotifications()); this.props.dispatch(fetchServerTranslationLanguages()); setTimeout(() => this.props.dispatch(fetchServer()), 3000); @@ -585,6 +589,7 @@ class UI extends PureComponent { {layout !== 'mobile' && } + {!disableHoverCards && } diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index e1f5bfdaf60..7c4372d5a64 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -7,7 +7,15 @@ export function Compose () { } export function Notifications () { - return import(/* webpackChunkName: "features/notifications" */'../../notifications'); + return import(/* webpackChunkName: "features/notifications_v1" */'../../notifications'); +} + +export function Notifications_v2 () { + return import(/* webpackChunkName: "features/notifications_v2" */'../../notifications_v2'); +} + +export function NotificationsWrapper () { + return import(/* webpackChunkName: "features/notifications" */'../../notifications_wrapper'); } export function HomeTimeline () { @@ -201,3 +209,7 @@ export function NotificationRequests () { export function NotificationRequest () { return import(/*webpackChunkName: "features/notifications/request" */'../../notifications/request'); } + +export function LinkTimeline () { + return import(/*webpackChunkName: "features/link_timeline" */'../../link_timeline'); +} diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 9ec3df0df87..60b35cb31ac 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -15,6 +15,7 @@ * @property {boolean=} boost_modal * @property {boolean=} delete_modal * @property {boolean=} disable_swiping + * @property {boolean=} disable_hover_cards * @property {string=} disabled_account_id * @property {string} display_media * @property {string} domain @@ -86,6 +87,7 @@ export const autoPlayGif = getMeta('auto_play_gif'); export const boostModal = getMeta('boost_modal'); export const deleteModal = getMeta('delete_modal'); export const disableSwiping = getMeta('disable_swiping'); +export const disableHoverCards = getMeta('disable_hover_cards'); export const disabledAccountId = getMeta('disabled_account_id'); export const displayMedia = getMeta('display_media'); export const domain = getMeta('domain'); diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index e4f7f12b0ed..fee553e22d5 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -50,7 +50,6 @@ "account.requested_follow": "{name} het versoek om jou te volg", "account.share": "Deel @{name} se profiel", "account.show_reblogs": "Wys aangestuurde plasings van @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Plaas} other {{counter} Plasings}}", "account.unblock": "Deblokkeer @{name}", "account.unblock_domain": "Deblokkeer domein {domain}", "account.unblock_short": "Deblokkeer", @@ -120,8 +119,6 @@ "compose_form.spoiler.unmarked": "Voeg inhoudswaarskuwing by", "confirmation_modal.cancel": "Kanselleer", "confirmations.block.confirm": "Blokkeer", - "confirmations.cancel_follow_request.confirm": "Herroep versoek", - "confirmations.cancel_follow_request.message": "Is jy seker jy wil jou versoek om {name} te volg, terugtrek?", "confirmations.delete.confirm": "Wis uit", "confirmations.delete.message": "Is jy seker jy wil hierdie plasing uitvee?", "confirmations.delete_list.confirm": "Wis uit", diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index af5f8426d07..0757b9e597d 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -31,9 +31,7 @@ "account.follow": "Seguir", "account.followers": "Seguidores", "account.followers.empty": "Encara no sigue dengún a este usuario.", - "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}", "account.following": "Seguindo", - "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Seguindo}}", "account.follows.empty": "Este usuario encara no sigue a dengún.", "account.go_to_profile": "Ir ta lo perfil", "account.hide_reblogs": "Amagar retutz de @{name}", @@ -54,7 +52,6 @@ "account.requested_follow": "{name} ha demandau seguir-te", "account.share": "Compartir lo perfil de @{name}", "account.show_reblogs": "Amostrar retutz de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}", "account.unblock": "Desblocar a @{name}", "account.unblock_domain": "Amostrar a {domain}", "account.unblock_short": "Desblocar", @@ -133,15 +130,12 @@ "compose_form.spoiler.unmarked": "Texto no amagau", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Blocar", - "confirmations.cancel_follow_request.confirm": "Retirar solicitut", - "confirmations.cancel_follow_request.message": "Yes seguro que deseyas retirar la tuya solicitut pa seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "Yes seguro que quiers borrar esta publicación?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "Seguro que quiers borrar esta lista permanentment?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tiens cambios sin alzar en a descripción u vista previa d'o fichero audiovisual, descartar-los de totz modos?", - "confirmations.domain_block.message": "Yes seguro que quiers blocar lo dominio {domain} entero? En cheneral ye prou, y preferible, fer uns quantos bloqueyos y silenciaus concretos. Los tuyos seguidros d'ixe dominio serán eliminaus.", "confirmations.logout.confirm": "Zarrar sesión", "confirmations.logout.message": "Yes seguro de querer zarrar la sesión?", "confirmations.mute.confirm": "Silenciar", @@ -345,7 +339,6 @@ "notification.follow_request": "{name} ha solicitau seguir-te", "notification.mention": "{name} t'ha mencionau", "notification.own_poll": "La tuya enqüesta ha rematau", - "notification.poll": "Una enqüesta en a quala has votau ha rematau", "notification.reblog": "{name} ha retutau la tuya publicación", "notification.status": "{name} acaba de publicar", "notification.update": "{name} editó una publicación", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index b5ce0ae861f..5cfd587e088 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -4,7 +4,7 @@ "about.disclaimer": "ماستدون برنامج حر ومفتوح المصدر وعلامة تجارية لـ Mastodon GmbH.", "about.domain_blocks.no_reason_available": "السبب غير متوفر", "about.domain_blocks.preamble": "يسمح لك ماستدون عموماً بعرض المحتوى من المستخدمين من أي خادم آخر في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادم بالذات.", - "about.domain_blocks.silenced.explanation": "عموماً، لن ترى ملفات التعريف والمحتوى من هذا الخادم، إلا إذا كنت تبحث عنه بشكل صريح أو تختار أن تتابعه.", + "about.domain_blocks.silenced.explanation": "لن تظهر لك ملفات التعريف الشخصية والمحتوى من هذا الخادوم، إلا إن بحثت عنه عمدًا أو تابعته.", "about.domain_blocks.silenced.title": "محدود", "about.domain_blocks.suspended.explanation": "لن يتم معالجة أي بيانات من هذا الخادم أو تخزينها أو تبادلها، مما يجعل أي تفاعل أو اتصال مع المستخدمين من هذا الخادم مستحيلا.", "about.domain_blocks.suspended.title": "مُعلّق", @@ -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,12 +32,11 @@ "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} مُتابع}}", + "account.followers_counter": "{count, plural, zero {}one {{counter} متابع} two {{counter} متابعين} few {{counter} متابعين} many {{counter} متابعين} other {{counter} متابعين}}", "account.following": "الاشتراكات", - "account.following_counter": "{count, plural, zero{لا يُتابِع أحدًا} one {يُتابِعُ واحد} two{يُتابِعُ اِثنان} few{يُتابِعُ {counter}} many{يُتابِعُ {counter}} other {يُتابِعُ {counter}}}", "account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.", "account.go_to_profile": "اذهب إلى الملف الشخصي", "account.hide_reblogs": "إخفاء المعاد نشرها مِن @{name}", @@ -53,7 +52,7 @@ "account.mute_notifications_short": "كتم الإشعارات", "account.mute_short": "اكتم", "account.muted": "مَكتوم", - "account.mutual": "متبادل", + "account.mutual": "متبادلة", "account.no_bio": "لم يتم تقديم وصف.", "account.open_original_page": "افتح الصفحة الأصلية", "account.posts": "منشورات", @@ -63,7 +62,6 @@ "account.requested_follow": "لقد طلب {name} متابعتك", "account.share": "شارِك الملف التعريفي لـ @{name}", "account.show_reblogs": "اعرض إعادات نشر @{name}", - "account.statuses_counter": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}", "account.unblock": "إلغاء الحَظر عن @{name}", "account.unblock_domain": "إلغاء الحَظر عن النِّطاق {domain}", "account.unblock_short": "ألغ الحجب", @@ -73,8 +71,8 @@ "account.unmute_notifications_short": "إلغاء كَتم الإشعارات", "account.unmute_short": "إلغاء الكتم", "account_note.placeholder": "اضغط لإضافة مُلاحظة", - "admin.dashboard.daily_retention": "معدل الاحتفاظ بالمستخدم بعد التسجيل بيوم", - "admin.dashboard.monthly_retention": "معدل الاحتفاظ بالمستخدم بعد التسجيل بالشهور", + "admin.dashboard.daily_retention": "معدّل بقاء المستخدمين بعد إنشاء الحسابات، بالأيام", + "admin.dashboard.monthly_retention": "معدّل بقاء المستخدمين بعد إنشاء الحسابات، بالشهور", "admin.dashboard.retention.average": "المعدل", "admin.dashboard.retention.cohort": "شهر التسجيل", "admin.dashboard.retention.cohort_size": "المستخدمون الجدد", @@ -90,12 +88,12 @@ "attachments_list.unprocessed": "(غير معالَج)", "audio.hide": "إخفاء المقطع الصوتي", "block_modal.remote_users_caveat": "سوف نطلب من الخادم {domain} أن يحترم قرارك، لكن الالتزام غير مضمون لأن بعض الخواديم قد تتعامل مع نصوص الكتل بشكل مختلف. قد تظل المنشورات العامة مرئية للمستخدمين غير المسجلين الدخول.", - "block_modal.show_less": "أظهر الأقل", - "block_modal.show_more": "أظهر المزيد", + "block_modal.show_less": "تفاصيل أقلّ", + "block_modal.show_more": "تفاصيل أكثر", "block_modal.they_cant_mention": "لن يستطيع ذِكرك أو متابعتك.", - "block_modal.they_cant_see_posts": "لن يستطيع رؤية منشوراتك ولن ترى منشوراته.", - "block_modal.they_will_know": "يمكنه أن يرى أنه قد تم حظره.", - "block_modal.title": "أتريد حظر المستخدم؟", + "block_modal.they_cant_see_posts": "لن يستطيع مطالعة منشوراتك ولن تطالع منشوراته.", + "block_modal.they_will_know": "سيعلم أنه قد حُظِر.", + "block_modal.title": "أتريد حظر هذا المستخدم؟", "block_modal.you_wont_see_mentions": "لن تر المنشورات التي يُشار فيهم إليه.", "boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة", "bundle_column_error.copy_stacktrace": "انسخ تقرير الخطأ", @@ -159,7 +157,7 @@ "compose_form.poll.single": "اختر واحدا", "compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة", "compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط", - "compose_form.poll.type": "الأسلوب", + "compose_form.poll.type": "الطراز", "compose_form.publish": "نشر", "compose_form.publish_form": "منشور جديد", "compose_form.reply": "ردّ", @@ -169,16 +167,12 @@ "compose_form.spoiler_placeholder": "تحذير المحتوى (اختياري)", "confirmation_modal.cancel": "إلغاء", "confirmations.block.confirm": "حظر", - "confirmations.cancel_follow_request.confirm": "إلغاء الطلب", - "confirmations.cancel_follow_request.message": "متأكد من أنك تريد إلغاء طلب متابعتك لـ {name}؟", "confirmations.delete.confirm": "حذف", "confirmations.delete.message": "هل أنتَ مُتأكدٌ أنك تُريدُ حَذفَ هذا المنشور؟", "confirmations.delete_list.confirm": "حذف", "confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمة بشكلٍ دائم؟", "confirmations.discard_edit_media.confirm": "تجاهل", "confirmations.discard_edit_media.message": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، أتريد تجاهلها على أي حال؟", - "confirmations.domain_block.confirm": "حظر الخادم", - "confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.", "confirmations.edit.confirm": "تعديل", "confirmations.edit.message": "التعديل في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد تحريرها. متأكد من أنك تريد المواصلة؟", "confirmations.logout.confirm": "خروج", @@ -297,8 +291,6 @@ "filter_modal.select_filter.subtitle": "استخدم فئة موجودة أو قم بإنشاء فئة جديدة", "filter_modal.select_filter.title": "تصفية هذا المنشور", "filter_modal.title.status": "تصفية منشور", - "filtered_notifications_banner.mentions": "{count, plural, one {إشارة} two {إشارتين} few {# إشارات} other {# إشارة}}", - "filtered_notifications_banner.pending_requests": "إشعارات من {count, plural, zero {}=0 {لا أحد} one {شخص واحد قد تعرفه} two {شخصين قد تعرفهما} few {# أشخاص قد تعرفهم} many {# شخص قد تعرفهم} other {# شخص قد تعرفهم}}", "filtered_notifications_banner.title": "الإشعارات المصفاة", "firehose.all": "الكل", "firehose.local": "هذا الخادم", @@ -484,7 +476,6 @@ "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}، مما يعني أنك لم يعد بإمكانك تلقي التحديثات منهم أو التفاعل معهم.", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 80e0aa6cbf9..3843ec69dc8 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -1,7 +1,7 @@ { "about.blocks": "Sirvidores moderaos", "about.contact": "Contautu:", - "about.disclaimer": "Mastodon ye software gratuito ya de códigu llibre, ya una marca rexistrada de Mastodon gGmbH.", + "about.disclaimer": "Mastodon ye software gratuito y de códigu llibre, y una marca rexistrada de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "El motivu nun ta disponible", "about.domain_blocks.preamble": "Polo xeneral, Mastodon permítete ver el conteníu ya interactuar colos perfiles d'otros sirvidores nel fediversu. Estes son les esceiciones que se ficieron nesti sirvidor.", "about.domain_blocks.silenced.explanation": "Polo xeneral, nun ves los perfiles ya'l conteníu d'esti sirvidor sacante que los busques o decidas siguilos.", @@ -32,24 +32,22 @@ "account.followers": "Siguidores", "account.followers.empty": "Naide sigue a esti perfil.", "account.following": "Siguiendo", - "account.following_counter": "{count, plural,one {Sigue a {counter}} other {Sigue a {counter}}}", "account.follows.empty": "Esti perfil nun sigue a naide.", "account.go_to_profile": "Dir al perfil", "account.hide_reblogs": "Anubrir los artículos compartíos de @{name}", "account.in_memoriam": "N'alcordanza.", "account.joined_short": "Data de xunión", - "account.link_verified_on": "La propiedá d'esti enllaz foi comprobada'l {date}", + "account.link_verified_on": "La propiedá d'esti enllaz comprobóse'l {date}", "account.media": "Multimedia", "account.mention": "Mentar a @{name}", "account.moved_to": "{name} indicó qu'agora la so cuenta nueva ye:", "account.mute": "Desactivar los avisos de @{name}", "account.open_original_page": "Abrir la páxina orixinal", "account.posts": "Artículos", - "account.posts_with_replies": "Artículos ya rempuestes", - "account.report": "Informar de: @{name}", + "account.posts_with_replies": "Artículos y rempuestes", + "account.report": "Informar de @{name}", "account.requested_follow": "{name} solicitó siguite", "account.show_reblogs": "Amosar los artículos compartíos de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} artículu} other {{counter} artículos}}", "account.unblock": "Desbloquiar a @{name}", "account.unblock_domain": "Desbloquiar el dominiu «{domain}»", "account.unblock_short": "Desbloquiar", @@ -73,7 +71,7 @@ "bundle_column_error.routing.body": "Nun se pudo atopar la páxina solicitada. ¿De xuru que la URL de la barra de direiciones ta bien escrita?", "bundle_column_error.routing.title": "404", "bundle_modal_error.message": "Asocedió daqué malo mentanto se cargaba esti componente.", - "closed_registrations.other_server_instructions": "Darréu que Mastodon ye una rede social descentralizada, pues crear una cuenta n'otru sirvidor ya siguir interactuando con esti.", + "closed_registrations.other_server_instructions": "Darréu que Mastodon ye una rede social descentralizada, pues crear una cuenta n'otru sirvidor y siguir interactuando con esti.", "closed_registrations_modal.description": "Anguaño nun ye posible crear cuentes en {domain}, mas ten en cuenta que nun precises una cuenta nesti sirvidor pa usar Mastodon.", "closed_registrations_modal.find_another_server": "Atopar otru sirvidor", "closed_registrations_modal.preamble": "Mastodon ye una rede social descentralizada polo que nun importa ónde crees la cuenta, vas ser a siguir ya interactuar con persones d'esti sirvidor. ¡Ya tamién pues tener el to propiu sirvidor!", @@ -109,12 +107,10 @@ "compose_form.lock_disclaimer.lock": "privada", "compose_form.placeholder": "¿En qué pienses?", "compose_form.poll.option_placeholder": "Opción {number}", - "compose_form.poll.type": "Estilu", + "compose_form.poll.type": "Tipu", "compose_form.publish_form": "Artículu nuevu", "confirmation_modal.cancel": "Encaboxar", "confirmations.block.confirm": "Bloquiar", - "confirmations.cancel_follow_request.confirm": "Retirala", - "confirmations.cancel_follow_request.message": "¿De xuru que quies retirar la solicitú pa siguir a {name}?", "confirmations.delete.confirm": "Desaniciar", "confirmations.delete.message": "¿De xuru que quies desaniciar esti artículu?", "confirmations.delete_list.confirm": "Desaniciar", @@ -122,7 +118,7 @@ "confirmations.edit.message": "La edición va sobrescribir el mensaxe que tas escribiendo. ¿De xuru que quies siguir?", "confirmations.logout.confirm": "Zarrar la sesión", "confirmations.logout.message": "¿De xuru que quies zarrar la sesión?", - "confirmations.redraft.confirm": "Desaniciar ya reeditar", + "confirmations.redraft.confirm": "Desaniciar y reeditar", "confirmations.reply.confirm": "Responder", "confirmations.unfollow.confirm": "Dexar de siguir", "confirmations.unfollow.message": "¿De xuru que quies dexar de siguir a {name}?", @@ -142,7 +138,7 @@ "embed.preview": "Va apaecer asina:", "emoji_button.activity": "Actividá", "emoji_button.flags": "Banderes", - "emoji_button.food": "Comida ya bébora", + "emoji_button.food": "Comida y bébora", "emoji_button.nature": "Natura", "emoji_button.not_found": "Nun s'atoparon fustaxes que concasen", "emoji_button.objects": "Oxetos", @@ -151,7 +147,7 @@ "emoji_button.search": "Buscar…", "emoji_button.search_results": "Resultaos de la busca", "emoji_button.symbols": "Símbolos", - "emoji_button.travel": "Viaxes ya llugares", + "emoji_button.travel": "Viaxes y llugares", "empty_column.account_timeline": "¡Equí nun hai nengún artículu!", "empty_column.blocks": "Nun bloquiesti a nengún perfil.", "empty_column.bookmarked_statuses": "Nun tienes nengún artículu en Marcadores. Cuando amiestes dalgún, apaez equí.", @@ -170,7 +166,7 @@ "error.unexpected_crash.explanation": "Pola mor d'un fallu nel códigu o un problema de compatibilidá del restolador, esta páxina nun se pudo amosar correutamente.", "error.unexpected_crash.explanation_addons": "Esta páxina nun se pudo amosar correutamente. Ye probable que dalgún complementu del restolador o dalguna ferramienta de traducción automática produxere esti error.", "error.unexpected_crash.next_steps": "Prueba a anovar la páxina. Si nun sirve, ye posible que tovía seyas a usar Mastodon pente otru restolador o una aplicación nativa.", - "error.unexpected_crash.next_steps_addons": "Prueba a desactivalos ya a anovar la páxina. Si nun sirve, ye posible que tovía seyas a usar Mastodon pente otru restolador o una aplicación nativa.", + "error.unexpected_crash.next_steps_addons": "Prueba a desactivalos y a anovar la páxina. Si nun sirve, ye posible que tovía seyas a usar Mastodon pente otru restolador o una aplicación nativa.", "explore.search_results": "Resultaos de la busca", "explore.suggested_follows": "Perfiles", "explore.title": "Esploración", @@ -181,7 +177,7 @@ "filter_modal.added.context_mismatch_title": "¡El contestu nun coincide!", "filter_modal.added.expired_explanation": "Esta categoría de peñera caducó, tienes de camudar la so data de caducidá p'aplicala.", "filter_modal.added.expired_title": "¡La peñera caducó!", - "filter_modal.added.review_and_configure": "Pa revisar ya configurar a fondu esta categoría de peñera, vete a la {settings_link}.", + "filter_modal.added.review_and_configure": "Pa revisar y configurar a fondu esta categoría de peñera, vete a la {settings_link}.", "filter_modal.added.review_and_configure_title": "Configuración de la peñera", "filter_modal.added.settings_link": "páxina de configuración", "filter_modal.added.short_explanation": "Esti artículu amestóse a la categoría de peñera siguiente: {title}.", @@ -197,8 +193,10 @@ "follow_request.reject": "Refugar", "follow_requests.unlocked_explanation": "Magar que la to cuenta nun seya privada, el personal del dominiu «{domain}» pensó qu'a lo meyor quies revisar manualmente les solicitúes de siguimientu d'estes cuentes.", "follow_suggestions.dismiss": "Nun volver amosar", + "follow_suggestions.friends_of_friends_longer": "Ye popular ente los perfiles que sigues", "follow_suggestions.personalized_suggestion": "Suxerencia personalizada", "follow_suggestions.popular_suggestion": "Suxerencia popular", + "follow_suggestions.similar_to_recently_followed_longer": "Aseméyase a los perfiles que siguiesti apocayá", "follow_suggestions.view_all": "Ver too", "follow_suggestions.who_to_follow": "A quién siguir", "footer.about": "Tocante a", @@ -274,6 +272,8 @@ "lists.subheading": "Les tos llistes", "load_pending": "{count, plural, one {# elementu nuevu} other {# elementos nuevos}}", "media_gallery.toggle_visible": "{number, plural, one {Anubrir la imaxe} other {Anubrir les imáxenes}}", + "name_and_others": "{name} y {count, plural, one {# más} other {# más}}", + "name_and_others_with_link": "{name} y {count, plural, one {# más} other {# más}}", "navigation_bar.about": "Tocante a", "navigation_bar.blocks": "Perfiles bloquiaos", "navigation_bar.bookmarks": "Marcadores", @@ -283,11 +283,11 @@ "navigation_bar.explore": "Esploración", "navigation_bar.filters": "Pallabres desactivaes", "navigation_bar.follow_requests": "Solicitúes de siguimientu", - "navigation_bar.follows_and_followers": "Perfiles que sigues ya te siguen", + "navigation_bar.follows_and_followers": "Perfiles que sigues y te siguen", "navigation_bar.lists": "Llistes", "navigation_bar.logout": "Zarrar la sesión", "navigation_bar.mutes": "Perfiles colos avisos desactivaos", - "navigation_bar.opened_in_classic_interface": "Los artículos, les cuentes ya otres páxines específiques ábrense por defeutu na interfaz web clásica.", + "navigation_bar.opened_in_classic_interface": "Los artículos, les cuentes y otres páxines específiques ábrense por defeutu na interfaz web clásica.", "navigation_bar.pins": "Artículos fixaos", "navigation_bar.preferences": "Preferencies", "navigation_bar.public_timeline": "Llinia de tiempu federada", @@ -298,13 +298,13 @@ "notification.follow": "{name} siguióte", "notification.follow_request": "{name} solicitó siguite", "notification.mention": "{name} mentóte", - "notification.poll": "Finó una encuesta na que votesti", "notification.reblog": "{name} compartió'l to artículu", "notification.status": "{name} ta acabante d'espublizar", "notification.update": "{name} editó un artículu", "notifications.clear": "Borrar los avisos", "notifications.column_settings.admin.report": "Informes nuevos:", "notifications.column_settings.admin.sign_up": "Rexistros nuevos:", + "notifications.column_settings.beta.category": "Funciones esperimentales", "notifications.column_settings.follow": "Siguidores nuevos:", "notifications.column_settings.follow_request": "Solicitúes de siguimientu nueves:", "notifications.column_settings.mention": "Menciones:", @@ -321,7 +321,7 @@ "notifications.mark_as_read": "Marcar tolos avisos como lleíos", "notifications.permission_required": "Los avisos d'escritoriu nun tán disponibles porque nun se concedió'l permisu riquíu.", "onboarding.profile.note_hint": "Pues @mentar a otros perfiles o poner #etiquetes…", - "onboarding.start.lead": "Xá yes parte de Mastodon, una plataforma social multimedia descentralizada onde tu ya non un algoritmu, personalices la to esperiencia. Vamos presentate esti llugar social nuevu:", + "onboarding.start.lead": "Yá yes parte de Mastodon, una plataforma social multimedia descentralizada onde tu y non un algoritmu, personalices la to esperiencia. Vamos presentate esti llugar social nuevu:", "onboarding.start.skip": "¿Nun precises ayuda pa comenzar?", "onboarding.steps.follow_people.body": "Mastodon trata namás de siguir a cuentes interesantes.", "onboarding.steps.publish_status.body": "Saluda al mundu con semeyes, vídeos, testu o encuestes {emoji}", @@ -336,6 +336,8 @@ "poll_button.add_poll": "Amestar una encuesta", "poll_button.remove_poll": "Quitar la encuesta", "privacy.change": "Configurar la privacidá del artículu", + "privacy.direct.short": "Perfiles específicos", + "privacy.private.short": "Siguidores", "privacy.public.short": "Artículu públicu", "privacy_policy.last_updated": "Data del últimu anovamientu: {date}", "privacy_policy.title": "Política de privacidá", @@ -385,10 +387,11 @@ "report.thanks.take_action": "Equí tienes les opciones pa controlar qué ves en Mastodon:", "report.thanks.take_action_actionable": "Mentanto revisamos esti informe, pues tomar midíes contra @{name}:", "report.thanks.title": "¿Nun quies ver esti conteníu?", - "report.thanks.title_actionable": "Gracies pol informe, el casu xá ta n'investigación.", + "report.thanks.title_actionable": "Gracies pol informe, el casu yá ta n'investigación.", "report.unfollow": "Dexar de siguir a @{name}", "report.unfollow_explanation": "Sigues a esta cuenta. Pa dexar de ver los sos artículos nel to feed d'aniciu, dexa de siguila.", "report_notification.attached_statuses": "{count, plural, one {Axuntóse {count} artículu} other {Axuntáronse {count} artículos}}", + "report_notification.categories.legal_sentence": "conteníu illegal", "report_notification.open": "Abrir l'informe", "search.no_recent_searches": "Nun hai nenguna busca recién", "search.placeholder": "Buscar", @@ -398,6 +401,7 @@ "search.quick_action.status_search": "Artículos que concasen con {x}", "search.search_or_paste": "Busca o apiega una URL", "search_popout.language_code": "códigu de llingua ISO", + "search_popout.options": "Opciones de busca", "search_popout.quick_actions": "Aiciones rápides", "search_popout.recent": "Busques de recién", "search_popout.specific_date": "data específica", @@ -442,12 +446,13 @@ "status.reblog": "Compartir", "status.reblogged_by": "{name} compartió", "status.reblogs.empty": "Naide nun compartió esti artículu. Cuando daquién lo faiga, apaez equí.", - "status.redraft": "Desaniciar ya reeditar", + "status.redraft": "Desaniciar y reeditar", "status.replied_to": "En rempuesta a {name}", "status.reply": "Responder", "status.replyAll": "Responder al filu", "status.report": "Informar de @{name}", "status.sensitive_warning": "Conteníu sensible", + "status.share": "Compartir", "status.show_filter_reason": "Amosar de toes toes", "status.show_less": "Amosar menos", "status.show_more": "Amosar más", @@ -474,7 +479,7 @@ "units.short.thousand": "{count} mil", "upload_button.label": "Amestar ficheros multimedia", "upload_error.poll": "La xuba de ficheros nun ta permitida coles encuestes.", - "upload_form.audio_description": "Describi'l conteníu pa persones sordes ya/o ciegues", + "upload_form.audio_description": "Describi'l conteníu pa persones sordes y/o ciegues", "upload_form.edit": "Editar", "upload_modal.analyzing_picture": "Analizando la semeya…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 03164c4290f..58aff7da447 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Папярэджанне аб змесціве (неабавязкова)", "confirmation_modal.cancel": "Скасаваць", "confirmations.block.confirm": "Заблакіраваць", - "confirmations.cancel_follow_request.confirm": "Скасаваць запыт", - "confirmations.cancel_follow_request.message": "Сапраўды хочаце скасаваць свой запыт на падпіску на {name}?", "confirmations.delete.confirm": "Выдаліць", "confirmations.delete.message": "Вы ўпэўненыя, што хочаце выдаліць гэты допіс?", + "confirmations.delete.title": "Выдаліць допіс?", "confirmations.delete_list.confirm": "Выдаліць", "confirmations.delete_list.message": "Вы ўпэўненыя, што хочаце беззваротна выдаліць гэты чарнавік?", + "confirmations.delete_list.title": "Выдаліць спіс?", "confirmations.discard_edit_media.confirm": "Адмяніць", "confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?", - "confirmations.domain_block.confirm": "Заблакіраваць сервер", - "confirmations.domain_block.message": "Вы абсалютна дакладна ўпэўнены, што хочаце заблакіраваць {domain} зусім? У большасці выпадкаў, дастаткова некалькіх мэтавых блакіровак ці ігнараванняў. Вы перастанеце бачыць змесціва з гэтага дамену ва ўсіх стужках і апавяшчэннях. Вашы падпіскі з гэтага дамену будуць выдаленыя.", "confirmations.edit.confirm": "Рэдагаваць", "confirmations.edit.message": "Калі вы зменіце зараз, гэта ператрэ паведамленне, якое вы пішаце. Вы ўпэўнены, што хочаце працягнуць?", + "confirmations.edit.title": "Замяніць допіс?", "confirmations.logout.confirm": "Выйсці", "confirmations.logout.message": "Вы ўпэўненыя, што хочаце выйсці?", + "confirmations.logout.title": "Выйсці?", "confirmations.mute.confirm": "Ігнараваць", "confirmations.redraft.confirm": "Выдаліць і перапісаць", "confirmations.redraft.message": "Вы ўпэўнены, што хочаце выдаліць допіс і перапісаць яго? Упадабанні і пашырэнні згубяцца, а адказы да арыгінальнага допісу асірацеюць.", + "confirmations.redraft.title": "Выдаліць і перапісаць допіс?", "confirmations.reply.confirm": "Адказаць", "confirmations.reply.message": "Калі вы адкажаце зараз, гэта ператрэ паведамленне, якое вы пішаце. Вы ўпэўнены, што хочаце працягнуць?", + "confirmations.reply.title": "Замяніць допіс?", "confirmations.unfollow.confirm": "Адпісацца", "confirmations.unfollow.message": "Вы ўпэўненыя, што хочаце адпісацца ад {name}?", + "confirmations.unfollow.title": "Адпісацца ад карыстальніка?", "conversation.delete": "Выдаліць размову", "conversation.mark_as_read": "Адзначыць прачытаным", "conversation.open": "Прагледзець размову", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Скарыстайцеся існуючай катэгорыяй або стварыце новую", "filter_modal.select_filter.title": "Фільтраваць гэты допіс", "filter_modal.title.status": "Фільтраваць допіс", - "filtered_notifications_banner.mentions": "{count, plural, one {згадванне} few {згадванні} many {згадванняў} other {згадвання}}", - "filtered_notifications_banner.pending_requests": "Апавяшчэнні ад {count, plural, =0 {# людзей якіх} one {# чалавека якіх} few {# чалавек якіх} many {# людзей якіх} other {# чалавека якіх}} вы магчыма ведаеце", + "filtered_notifications_banner.pending_requests": "Ад {count, plural, =0 {# людзей якіх} one {# чалавека якіх} few {# чалавек якіх} many {# людзей якіх} other {# чалавека якіх}} вы магчыма ведаеце", "filtered_notifications_banner.title": "Адфільтраваныя апавяшчэнні", "firehose.all": "Усе", "firehose.local": "Гэты сервер", @@ -347,7 +349,7 @@ "hashtag.follow": "Падпісацца на хэштэг", "hashtag.unfollow": "Адпісацца ад хэштэга", "hashtags.and_other": "…і яшчэ {count, plural, other {#}}", - "home.column_settings.show_reblogs": "Паказаць пашырэнні", + "home.column_settings.show_reblogs": "Паказваць пашырэнні", "home.column_settings.show_replies": "Паказваць адказы", "home.hide_announcements": "Схаваць аб'явы", "home.pending_critical_update.body": "Калі ласка, абнавіце свой сервер Mastodon як мага хутчэй!", @@ -415,6 +417,7 @@ "limited_account_hint.title": "Гэты профіль быў схаваны мадэратарамі", "link_preview.author": "Ад {name}", "link_preview.more_from_author": "Больш ад {name}", + "link_preview.shares": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}", "lists.account.add": "Дадаць да спісу", "lists.account.remove": "Выдаліць са спісу", "lists.delete": "Выдаліць спіс", @@ -442,6 +445,8 @@ "mute_modal.title": "Ігнараваць карыстальніка?", "mute_modal.you_wont_see_mentions": "Вы не ўбачыце паведамленняў са згадваннем карыстальніка.", "mute_modal.you_wont_see_posts": "Карыстальнік па-ранейшаму будзе бачыць вашыя паведамленні, але вы не будзеце паведамленні карыстальніка.", + "name_and_others": "{name} і {count, plural, one {# іншы} many {# іншых} other {# іншых}}", + "name_and_others_with_link": "{name} і {count, plural, one {# іншы} many {# іншых} other {# іншых}}", "navigation_bar.about": "Пра нас", "navigation_bar.advanced_interface": "Адкрыць у пашыраным вэб-інтэрфейсе", "navigation_bar.blocks": "Заблакіраваныя карыстальнікі", @@ -469,6 +474,10 @@ "navigation_bar.security": "Бяспека", "not_signed_in_indicator.not_signed_in": "Вам трэба ўвайсці каб атрымаць доступ да гэтага рэсурсу.", "notification.admin.report": "{name} паскардзіўся на {target}", + "notification.admin.report_account": "{name} паскардзіўся на {count, plural, one {# допіс} many {# допісаў} other {# допіса}} ад {target} з прычыны {category}", + "notification.admin.report_account_other": "{name} паскардзіўся на {count, plural, one {# допіс} many {# допісаў} other {# допіса}} ад {target}", + "notification.admin.report_statuses": "{name} паскардзіўся на {target} з прычыны {category}", + "notification.admin.report_statuses_other": "{name} паскардзіўся на {target}", "notification.admin.sign_up": "{name} зарэгістраваўся", "notification.favourite": "Ваш допіс упадабаны {name}", "notification.follow": "{name} падпісаўся на вас", @@ -485,6 +494,7 @@ "notification.moderation_warning.action_suspend": "Ваш уліковы запіс быў прыпынены.", "notification.own_poll": "Ваша апытанне скончылася", "notification.poll": "Апытанне, дзе вы прынялі ўдзел, скончылася", + "notification.private_mention": "{name} згадаў вас асабіста", "notification.reblog": "{name} пашырыў ваш допіс", "notification.relationships_severance_event": "Страціў сувязь з {name}", "notification.relationships_severance_event.account_suspension": "Адміністратар з {from} прыпыніў працу {target}, што азначае, што вы больш не можаце атрымліваць ад іх абнаўлення ці ўзаемадзейнічаць з імі.", @@ -495,13 +505,18 @@ "notification.update": "Допіс {name} адрэдагаваны", "notification_requests.accept": "Прыняць", "notification_requests.dismiss": "Адхіліць", + "notification_requests.maximize": "Разгарнуць", + "notification_requests.minimize_banner": "Згарнуць банер адфільтраваных апавяшчэнняў", "notification_requests.notifications_from": "Апавяшчэнні ад {name}", "notification_requests.title": "Адфільтраваныя апавяшчэнні", "notifications.clear": "Ачысціць апавяшчэнні", "notifications.clear_confirmation": "Вы ўпэўнены, што жадаеце назаўсёды сцерці ўсё паведамленні?", + "notifications.clear_title": "Ачысціць апавяшчэнні?", "notifications.column_settings.admin.report": "Новыя скаргі:", "notifications.column_settings.admin.sign_up": "Новыя ўваходы:", "notifications.column_settings.alert": "Апавяшчэнні на працоўным стале", + "notifications.column_settings.beta.category": "Эксперыментальныя функцыі", + "notifications.column_settings.beta.grouping": "Групаваць апавяшчэннi", "notifications.column_settings.favourite": "Упадабанае:", "notifications.column_settings.filter_bar.advanced": "Паказаць усе катэгорыі", "notifications.column_settings.filter_bar.category": "Панэль хуткай фільтрацыі", @@ -665,9 +680,13 @@ "report.unfollow_explanation": "Вы падпісаныя на гэты ўліковы запіс. Каб не бачыць допісы з яго ў вашай стужцы, адпішыцеся.", "report_notification.attached_statuses": "{count, plural, one {{count} допіс прымацаваны} few {{count} допісы прымацаваны} many {{count} допісаў прымацавана} other {{count} допісу прымацавана}}", "report_notification.categories.legal": "Права", + "report_notification.categories.legal_sentence": "нелегальнае змесціва", "report_notification.categories.other": "Іншае", + "report_notification.categories.other_sentence": "іншае", "report_notification.categories.spam": "Спам", + "report_notification.categories.spam_sentence": "спам", "report_notification.categories.violation": "Парушэнне правілаў", + "report_notification.categories.violation_sentence": "парушэнне правілаў", "report_notification.open": "Адкрыць скаргу", "search.no_recent_searches": "Гісторыя пошуку пустая", "search.placeholder": "Пошук", @@ -695,8 +714,11 @@ "server_banner.about_active_users": "Людзі, якія карыстаюцца гэтым сервера на працягу апошніх 30 дзён (Штомесячна Актыўныя Карыстальнікі)", "server_banner.active_users": "актыўныя карыстальнікі", "server_banner.administered_by": "Адміністратар:", + "server_banner.is_one_of_many": "{domain} - гэта адзін з многіх незалежных сервераў Mastodon, якія вы можаце выкарыстоўваць для ўдзелу ў fediverse.", "server_banner.server_stats": "Статыстыка сервера:", "sign_in_banner.create_account": "Стварыць уліковы запіс", + "sign_in_banner.follow_anyone": "Сачыце за кім заўгодна ва ўсім fediverse і глядзіце ўсё ў храналагічным парадку. Ніякіх алгарытмаў, рэкламы або клікбэйту.", + "sign_in_banner.mastodon_is": "Mastodon - лепшы спосаб быць у курсе ўсяго, што адбываецца.", "sign_in_banner.sign_in": "Увайсці", "sign_in_banner.sso_redirect": "Уваход ці рэгістрацыя", "status.admin_account": "Адкрыць інтэрфейс мадэратара для @{name}", @@ -771,8 +793,8 @@ "time_remaining.seconds": "{number, plural, one {засталася # секунда} few {засталося # секунды} many {засталося # секунд} other {засталося # секунды}}", "timeline_hint.remote_resource_not_displayed": "{resource} з іншых сервераў не адлюстроўваецца.", "timeline_hint.resources.followers": "Падпісчыкі", - "timeline_hint.resources.follows": "Падпісаны на", - "timeline_hint.resources.statuses": "Старэйшыя допісы", + "timeline_hint.resources.follows": "Падпіскі", + "timeline_hint.resources.statuses": "Старыя допісы", "trends.counter_by_accounts": "{count, plural, one {{counter} чалавек} few {{counter} чалавекі} many {{counter} людзей} other {{counter} чалавек}} за {days, plural, one {{days} апошні дзень} few {{days} апошнія дні} many {{days} апошніх дзён} other {{days} апошніх дзён}}", "trends.trending_now": "Актуальнае", "ui.beforeunload": "Ваш чарнавік знішчыцца калі вы пакінеце Mastodon.", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 98e84c45d75..98581306682 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Предупреждение за съдържание (по избор)", "confirmation_modal.cancel": "Отказ", "confirmations.block.confirm": "Блокиране", - "confirmations.cancel_follow_request.confirm": "Оттегляне на заявката", - "confirmations.cancel_follow_request.message": "Наистина ли искате да оттеглите заявката си за последване на {name}?", "confirmations.delete.confirm": "Изтриване", "confirmations.delete.message": "Наистина ли искате да изтриете публикацията?", + "confirmations.delete.title": "Изтривате ли публикацията?", "confirmations.delete_list.confirm": "Изтриване", "confirmations.delete_list.message": "Наистина ли искате да изтриете завинаги списъка?", + "confirmations.delete_list.title": "Изтривате ли списъка?", "confirmations.discard_edit_media.confirm": "Отхвърляне", "confirmations.discard_edit_media.message": "Не сте запазили промени на описанието или огледа на мултимедията, отхвърляте ли ги?", - "confirmations.domain_block.confirm": "Блокиране на сървър", - "confirmations.domain_block.message": "Наистина ли искате да блокирате целия {domain}? В повечето случаи няколко блокирания или заглушавания са достатъчно и за предпочитане. Няма да виждате съдържание от домейна из публични часови оси или известията си. Вашите последователи от този домейн ще се премахнат.", "confirmations.edit.confirm": "Редактиране", "confirmations.edit.message": "Редактирането сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?", + "confirmations.edit.title": "Презаписвате ли публикацията?", "confirmations.logout.confirm": "Излизане", "confirmations.logout.message": "Наистина ли искате да излезете?", + "confirmations.logout.title": "Излизате ли от системата?", "confirmations.mute.confirm": "Заглушаване", "confirmations.redraft.confirm": "Изтриване и преработване", "confirmations.redraft.message": "Наистина ли искате да изтриете тази публикация и да я направите чернова? Означаванията като любими и подсилванията ще се изгубят, а и отговорите към първоначалната публикация ще осиротеят.", + "confirmations.redraft.title": "Изтривате и преработвате ли публикацията?", "confirmations.reply.confirm": "Отговор", "confirmations.reply.message": "Отговарянето сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?", + "confirmations.reply.title": "Презаписвате ли публикацията?", "confirmations.unfollow.confirm": "Без следване", "confirmations.unfollow.message": "Наистина ли искате да не следвате {name}?", + "confirmations.unfollow.title": "Спирате ли да следвате потребителя?", "conversation.delete": "Изтриване на разговора", "conversation.mark_as_read": "Маркиране като прочетено", "conversation.open": "Преглед на разговора", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Изберете съществуваща категория или създайте нова", "filter_modal.select_filter.title": "Филтриране на публ.", "filter_modal.title.status": "Филтриране на публ.", - "filtered_notifications_banner.mentions": "{count, plural, one {споменаване} other {споменавания}}", - "filtered_notifications_banner.pending_requests": "Известията от {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}", + "filtered_notifications_banner.pending_requests": "От {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}", "filtered_notifications_banner.title": "Филтрирани известия", "firehose.all": "Всичко", "firehose.local": "Този сървър", @@ -443,6 +445,8 @@ "mute_modal.title": "Заглушавате ли потребител?", "mute_modal.you_wont_see_mentions": "Няма да виждате споменаващите ги публикации.", "mute_modal.you_wont_see_posts": "Още могат да виждат публикациите ви, но вие техните не.", + "name_and_others": "{name} и {count, plural, one {# друг} other {# други}}", + "name_and_others_with_link": "{name} и {count, plural, one {# друг} other {# други}}", "navigation_bar.about": "Относно", "navigation_bar.advanced_interface": "Отваряне в разширен уебинтерфейс", "navigation_bar.blocks": "Блокирани потребители", @@ -470,6 +474,10 @@ "navigation_bar.security": "Сигурност", "not_signed_in_indicator.not_signed_in": "Трябва ви вход за достъп до ресурса.", "notification.admin.report": "{name} докладва {target}", + "notification.admin.report_account": "{name} докладва {count, plural, one {публикация} other {# публикации}} от {target} за {category}", + "notification.admin.report_account_other": "{name} докладва {count, plural, one {публикация} other {# публикации}} от {target}", + "notification.admin.report_statuses": "{name} докладва {target} за {category}", + "notification.admin.report_statuses_other": "{name} докладва {target}", "notification.admin.sign_up": "{name} се регистрира", "notification.favourite": "{name} направи любима публикацията ви", "notification.follow": "{name} ви последва", @@ -486,6 +494,7 @@ "notification.moderation_warning.action_suspend": "Вашият акаунт е спрян.", "notification.own_poll": "Анкетата ви приключи", "notification.poll": "Анкета, в която гласувахте, приключи", + "notification.private_mention": "{name} лично ви спомена", "notification.reblog": "{name} подсили ваша публикация", "notification.relationships_severance_event": "Изгуби се връзката с {name}", "notification.relationships_severance_event.account_suspension": "Администратор от {from} спря {target}, което значи че повече не може да получавате новости от тях или да взаимодействате с тях.", @@ -496,13 +505,18 @@ "notification.update": "{name} промени публикация", "notification_requests.accept": "Приемам", "notification_requests.dismiss": "Отхвърлям", + "notification_requests.maximize": "Максимизиране", + "notification_requests.minimize_banner": "Минимизиране на банера за филтрирани известия", "notification_requests.notifications_from": "Известия от {name}", "notification_requests.title": "Филтрирани известия", "notifications.clear": "Изчистване на известията", "notifications.clear_confirmation": "Наистина ли искате да изчистите завинаги всичките си известия?", + "notifications.clear_title": "Изчиствате ли известията?", "notifications.column_settings.admin.report": "Нови доклади:", "notifications.column_settings.admin.sign_up": "Нови регистрации:", "notifications.column_settings.alert": "Известия на работния плот", + "notifications.column_settings.beta.category": "Експериментални функции", + "notifications.column_settings.beta.grouping": "Групови известия", "notifications.column_settings.favourite": "Любими:", "notifications.column_settings.filter_bar.advanced": "Показване на всички категории", "notifications.column_settings.filter_bar.category": "Лента за бърз филтър", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Последвали сте този акаунт. За да не виждате повече публикациите му в началния си инфопоток, спрете да го следвате.", "report_notification.attached_statuses": "{count, plural, one {прикаченa {count} публикация} other {прикачени {count} публикации}}", "report_notification.categories.legal": "Правни въпроси", + "report_notification.categories.legal_sentence": "незаконно съдържание", "report_notification.categories.other": "Друго", + "report_notification.categories.other_sentence": "друго", "report_notification.categories.spam": "Спам", + "report_notification.categories.spam_sentence": "спам", "report_notification.categories.violation": "Нарушение на правилото", + "report_notification.categories.violation_sentence": "нарушение на правило", "report_notification.open": "Отваряне на доклада", "search.no_recent_searches": "Няма скорошни търсения", "search.placeholder": "Търсене", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 4c4138bcf12..7787c1b9cfd 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -33,9 +33,7 @@ "account.follow": "অনুসরণ", "account.followers": "অনুসরণকারী", "account.followers.empty": "এই ব্যক্তিকে এখনো কেউ অনুসরণ করে না.", - "account.followers_counter": "{count, plural,one {{counter} জন অনুসরণকারী } other {{counter} জন অনুসরণকারী}}", "account.following": "অনুসরণ করা হচ্ছে", - "account.following_counter": "{count, plural,one {{counter} জনকে অনুসরণ} other {{counter} জনকে অনুসরণ}}", "account.follows.empty": "এই সদস্য কাউকে এখনো ফলো করেন না.", "account.go_to_profile": "প্রোফাইলে যান", "account.hide_reblogs": "@{name}'র সমর্থনগুলি লুকিয়ে ফেলুন", @@ -60,7 +58,6 @@ "account.requested_follow": "{name} আপনাকে অনুসরণ করার জন্য অনুরোধ করেছে", "account.share": "@{name} র প্রোফাইল অন্যদের দেখান", "account.show_reblogs": "@{name} র সমর্থনগুলো দেখান", - "account.statuses_counter": "{count, plural,one {{counter} টুট} other {{counter} টুট}}", "account.unblock": "@{name} র কার্যকলাপ দেখুন", "account.unblock_domain": "{domain} কে আবার দেখুন", "account.unblock_short": "আনব্লক করুন", @@ -149,15 +146,12 @@ "compose_form.spoiler.unmarked": "লেখাটি লুকানো নেই", "confirmation_modal.cancel": "বাতিল করুন", "confirmations.block.confirm": "ব্লক করুন", - "confirmations.cancel_follow_request.confirm": "অনুরোধ বাতিল করুন", - "confirmations.cancel_follow_request.message": "আপনি কি নিশ্চিত যে আপনি {name} কে অনুসরণ করার অনুরোধ প্রত্যাহার করতে চান?", "confirmations.delete.confirm": "মুছে ফেলুন", "confirmations.delete.message": "আপনি কি নিশ্চিত যে এই লেখাটি মুছে ফেলতে চান ?", "confirmations.delete_list.confirm": "মুছে ফেলুন", "confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?", "confirmations.discard_edit_media.confirm": "বাতিল করো", "confirmations.discard_edit_media.message": "মিডিয়া Description বা Preview তে আপনার আপনার অসংরক্ষিত পরিবর্তন আছে, সেগুলো বাতিল করবেন?", - "confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।", "confirmations.edit.confirm": "সম্পাদন", "confirmations.edit.message": "এখন সম্পাদনা করলে আপনি যে মেসেজ লিখছেন তা overwrite করবে, চালিয়ে যেতে চান?", "confirmations.logout.confirm": "প্রস্থান", @@ -323,7 +317,6 @@ "notification.follow_request": "{name} আপনাকে অনুসরণ করার জন্য অনুরধ করেছে", "notification.mention": "{name} আপনাকে উল্লেখ করেছেন", "notification.own_poll": "আপনার পোল শেষ হয়েছে", - "notification.poll": "আপনি ভোট দিয়েছিলেন এমন এক নির্বাচনের ভোটের সময় শেষ হয়েছে", "notification.reblog": "{name} আপনার কার্যক্রমে সমর্থন দেখিয়েছেন", "notifications.clear": "প্রজ্ঞাপনগুলো মুছে ফেলতে", "notifications.clear_confirmation": "আপনি কি নির্চিত প্রজ্ঞাপনগুলো মুছে ফেলতে চান ?", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 7cd49ba59d8..b38f4363164 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -35,9 +35,8 @@ "account.follow_back": "Heuliañ d'ho tro", "account.followers": "Tud koumanantet", "account.followers.empty": "Den na heul an implijer·ez-mañ c'hoazh.", - "account.followers_counter": "{count, plural, other{{counter} Heulier·ez}}", + "account.followers_counter": "{count, plural, one {{counter} heulier} two {{counter} heulier} few {{counter} heulier} many {{counter} heulier} other {{counter} heulier}}", "account.following": "Koumanantoù", - "account.following_counter": "{count, plural, one{{counter} C'houmanant} two{{counter} Goumanant} other {{counter} a Goumanant}}", "account.follows.empty": "An implijer·ez-mañ na heul den ebet.", "account.go_to_profile": "Gwelet ar profil", "account.hide_reblogs": "Kuzh skignadennoù gant @{name}", @@ -62,7 +61,7 @@ "account.requested_follow": "Gant {name} eo bet goulennet ho heuliañ", "account.share": "Skignañ profil @{name}", "account.show_reblogs": "Diskouez skignadennoù @{name}", - "account.statuses_counter": "{count, plural, one {{counter} C'hannad} two {{counter} Gannad} other {{counter} a Gannadoù}}", + "account.statuses_counter": "{count, plural, one {{counter} embannadur} two {{counter} embannadur} few {{counter} embannadur} many {{counter} embannadur} other {{counter} embannadur}}", "account.unblock": "Diverzañ @{name}", "account.unblock_domain": "Diverzañ an domani {domain}", "account.unblock_short": "Distankañ", @@ -160,15 +159,12 @@ "compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn", "confirmation_modal.cancel": "Nullañ", "confirmations.block.confirm": "Stankañ", - "confirmations.cancel_follow_request.confirm": "Nullañ ar reked", - "confirmations.cancel_follow_request.message": "Ha sur oc'h e fell deoc'h nullañ ho reked evit heuliañ {name} ?", "confirmations.delete.confirm": "Dilemel", "confirmations.delete.message": "Ha sur oc'h e fell deoc'h dilemel an toud-mañ ?", "confirmations.delete_list.confirm": "Dilemel", "confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?", "confirmations.discard_edit_media.confirm": "Nac'hañ", "confirmations.discard_edit_media.message": "Bez ez eus kemmoù n'int ket enrollet e deskrivadur ar media pe ar rakwel, nullañ anezho evelato?", - "confirmations.domain_block.message": "Ha sur oc'h e fell deoc'h berzañ an {domain} a-bezh? Peurvuiañ eo trawalc'h berzañ pe mudañ un nebeud implijer·ezed·ien. Ne welot danvez ebet o tont eus an domani-mañ. Dilamet e vo ar c'houmanantoù war an domani-mañ.", "confirmations.edit.confirm": "Kemmañ", "confirmations.logout.confirm": "Digevreañ", "confirmations.logout.message": "Ha sur oc'h e fell deoc'h digevreañ ?", @@ -256,7 +252,6 @@ "filter_modal.select_filter.subtitle": "Implijout ur rummad a zo anezhañ pe krouiñ unan nevez", "filter_modal.select_filter.title": "Silañ an toud-mañ", "filter_modal.title.status": "Silañ un toud", - "filtered_notifications_banner.mentions": "{count, plural, one {meneg} two {veneg} few {meneg} other {a venegoù}}", "firehose.all": "Pep tra", "firehose.local": "Ar servijer-mañ", "firehose.remote": "Servijerioù all", @@ -399,7 +394,6 @@ "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", "notification.status": "Emañ {name} o paouez toudañ", "notification.update": "Gant {name} ez eus bet kemmet un toud", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 88dd34aff04..b52f5977119 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -35,9 +35,9 @@ "account.follow_back": "Segueix tu també", "account.followers": "Seguidors", "account.followers.empty": "A aquest usuari encara no el segueix ningú.", - "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} Seguidors}}", + "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidors}}", "account.following": "Seguint", - "account.following_counter": "{count, plural, other {{counter} Seguint-ne}}", + "account.following_counter": "{count, plural, other {Seguint-ne {counter}}}", "account.follows.empty": "Aquest usuari encara no segueix ningú.", "account.go_to_profile": "Vés al perfil", "account.hide_reblogs": "Amaga els impulsos de @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} ha demanat de seguir-te", "account.share": "Comparteix el perfil de @{name}", "account.show_reblogs": "Mostra els impulsos de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}", + "account.statuses_counter": "{count, plural, one {{counter} publicació} other {{counter} publicacions}}", "account.unblock": "Desbloca @{name}", "account.unblock_domain": "Desbloca el domini {domain}", "account.unblock_short": "Desbloca", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Avís de contingut (opcional)", "confirmation_modal.cancel": "Cancel·la", "confirmations.block.confirm": "Bloca", - "confirmations.cancel_follow_request.confirm": "Retirar la sol·licitud", - "confirmations.cancel_follow_request.message": "Segur que vols retirar la sol·licitud de seguiment de {name}?", "confirmations.delete.confirm": "Elimina", "confirmations.delete.message": "Segur que vols eliminar aquest tut?", + "confirmations.delete.title": "Eliminar la publicació?", "confirmations.delete_list.confirm": "Elimina", "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?", + "confirmations.delete_list.title": "Eliminar la llista?", "confirmations.discard_edit_media.confirm": "Descarta", "confirmations.discard_edit_media.message": "Tens canvis no desats en la descripció del contingut o en la previsualització, els vols descartar?", - "confirmations.domain_block.confirm": "Bloca el servidor", - "confirmations.domain_block.message": "Segur que vols blocar {domain} del tot? En la majoria dels casos, només amb blocar o silenciar uns pocs comptes n'hi ha prou i és millor. No veuràs el contingut d’aquest domini en cap de les línies de temps ni en les notificacions. S'eliminaran els teus seguidors d’aquest domini.", "confirmations.edit.confirm": "Edita", "confirmations.edit.message": "Editant ara sobreescriuràs el missatge que estàs editant. Segur que vols continuar?", + "confirmations.edit.title": "Sobreescriure la publicació?", "confirmations.logout.confirm": "Tanca la sessió", "confirmations.logout.message": "Segur que vols tancar la sessió?", + "confirmations.logout.title": "Tancar la sessió?", "confirmations.mute.confirm": "Silencia", "confirmations.redraft.confirm": "Esborra i reescriu", "confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.", + "confirmations.redraft.title": "Esborrar i reescriure la publicació?", "confirmations.reply.confirm": "Respon", "confirmations.reply.message": "Si respons ara, sobreescriuràs el missatge que estàs editant. Segur que vols continuar?", + "confirmations.reply.title": "Sobreescriure la publicació?", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?", + "confirmations.unfollow.title": "Deixar de seguir l'usuari?", "conversation.delete": "Elimina la conversa", "conversation.mark_as_read": "Marca com a llegida", "conversation.open": "Mostra la conversa", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova", "filter_modal.select_filter.title": "Filtra aquest tut", "filter_modal.title.status": "Filtra un tut", - "filtered_notifications_banner.mentions": "{count, plural, one {menció} other {mencions}}", - "filtered_notifications_banner.pending_requests": "Notificacions {count, plural, =0 {de ningú} one {d'una persona} other {de # persones}} que potser coneixes", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {De ningú} one {D'una persona} other {De # persones}} que potser coneixes", "filtered_notifications_banner.title": "Notificacions filtrades", "firehose.all": "Tots", "firehose.local": "Aquest servidor", @@ -443,6 +445,8 @@ "mute_modal.title": "Silenciem l'usuari?", "mute_modal.you_wont_see_mentions": "No veureu publicacions que els esmentin.", "mute_modal.you_wont_see_posts": "Encara poden veure les vostres publicacions, però no veureu les seves.", + "name_and_others": "{name} i {count, plural, one {# altre} other {# altres}}", + "name_and_others_with_link": "{name} i {count, plural, one {# altre} other {# altres}}", "navigation_bar.about": "Quant a", "navigation_bar.advanced_interface": "Obre en la interfície web avançada", "navigation_bar.blocks": "Usuaris blocats", @@ -470,6 +474,10 @@ "navigation_bar.security": "Seguretat", "not_signed_in_indicator.not_signed_in": "Cal que iniciïs la sessió per a accedir a aquest recurs.", "notification.admin.report": "{name} ha reportat {target}", + "notification.admin.report_account": "{name} ha reportat {count, plural, one {una publicació} other {# publicacions}} de {target} per {category}", + "notification.admin.report_account_other": "{name} ha reportat {count, plural, one {una publicació} other {# publicacions}} de {target}", + "notification.admin.report_statuses": "{name} ha reportat {target} per {category}", + "notification.admin.report_statuses_other": "{name} ha reportat {target}", "notification.admin.sign_up": "{name} s'ha registrat", "notification.favourite": "{name} ha afavorit el teu tut", "notification.follow": "{name} et segueix", @@ -485,7 +493,8 @@ "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.poll": "Ha finalitzat una enquesta que heu respost", + "notification.private_mention": "{name} us ha esmentat en privat", "notification.reblog": "{name} t'ha impulsat", "notification.relationships_severance_event": "S'han perdut les connexions amb {name}", "notification.relationships_severance_event.account_suspension": "Un administrador de {from} ha suspès {target}; això vol dir que ja no en podreu rebre actualitzacions o interactuar-hi.", @@ -496,13 +505,18 @@ "notification.update": "{name} ha editat un tut", "notification_requests.accept": "Accepta", "notification_requests.dismiss": "Ignora", + "notification_requests.maximize": "Maximitza", + "notification_requests.minimize_banner": "Minimitza el bàner de notificacions filtrades", "notification_requests.notifications_from": "Notificacions de {name}", "notification_requests.title": "Notificacions filtrades", "notifications.clear": "Esborra les notificacions", "notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?", + "notifications.clear_title": "Esborrar les notificacions?", "notifications.column_settings.admin.report": "Nous informes:", "notifications.column_settings.admin.sign_up": "Registres nous:", "notifications.column_settings.alert": "Notificacions d'escriptori", + "notifications.column_settings.beta.category": "Característiques experimentals", + "notifications.column_settings.beta.grouping": "Notificacions de grup", "notifications.column_settings.favourite": "Favorits:", "notifications.column_settings.filter_bar.advanced": "Mostra totes les categories", "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Estàs seguint aquest compte. Per no veure els seus tuts a la teva línia de temps d'Inici, deixa de seguir-lo.", "report_notification.attached_statuses": "{count, plural, one {{count} tut} other {{count} tuts}} adjunts", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "contingut no permès", "report_notification.categories.other": "Altres", + "report_notification.categories.other_sentence": "altres", "report_notification.categories.spam": "Brossa", + "report_notification.categories.spam_sentence": "brossa", "report_notification.categories.violation": "Violació de norma", + "report_notification.categories.violation_sentence": "violació de normes", "report_notification.open": "Obre l'informe", "search.no_recent_searches": "No hi ha cerques recents", "search.placeholder": "Cerca", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index c212b53a8b2..3c11ffc7155 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -35,9 +35,7 @@ "account.follow_back": "فۆڵۆو بکەنەوە", "account.followers": "شوێنکەوتووان", "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە", - "account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}", "account.following": "بەدوادا", - "account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}", "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.", "account.go_to_profile": "بڕۆ بۆ پڕۆفایلی", "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} داوای کردووە شوێنت بکەوێت", "account.share": "پرۆفایلی @{name} هاوبەش بکە", "account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", "account.unblock": "@{name} لاببە", "account.unblock_domain": "کردنەوەی دۆمەینی {domain}", "account.unblock_short": "لابردنی بەربەست", @@ -161,15 +158,12 @@ "compose_form.spoiler_placeholder": "ئاگادارکردنەوەی ناوەڕۆک (ئیختیاری)", "confirmation_modal.cancel": "هەڵوەشاندنەوه", "confirmations.block.confirm": "بلۆک", - "confirmations.cancel_follow_request.confirm": "داواکاری کشانەوە", - "confirmations.cancel_follow_request.message": "ئایا دڵنیای کە دەتەوێت داواکارییەکەت بۆ شوێنکەوتنی {ناو} بکشێنیتەوە؟", "confirmations.delete.confirm": "سڕینەوە", "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?", "confirmations.delete_list.confirm": "سڕینەوە", "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?", "confirmations.discard_edit_media.confirm": "ڕەتکردنەوە", "confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟", - "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.", "confirmations.edit.confirm": "دەستکاری", "confirmations.edit.message": "دەستکاری کردنی ئێستا: دەبێتە هۆی نووسینەوەی ئەو پەیامەی، کە ئێستا داتدەڕشت. ئایا دڵنیای، کە دەتەوێت بەردەوام بیت؟", "confirmations.logout.confirm": "چوونە دەرەوە", @@ -394,7 +388,6 @@ "notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت", "notification.mention": "{name} باسی ئێوەی کرد", "notification.own_poll": "ڕاپرسیەکەت کۆتایی هات", - "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات", "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند", "notification.status": "{name} تازە بڵاوکرایەوە", "notification.update": "{name} پۆستێکی دەستکاریکرد", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index be4cce2692a..d95213f9c10 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -16,8 +16,6 @@ "account.follow": "Siguità", "account.followers": "Abbunati", "account.followers.empty": "Nisunu hè abbunatu à st'utilizatore.", - "account.followers_counter": "{count, plural, one {{counter} Abbunatu} other {{counter} Abbunati}}", - "account.following_counter": "{count, plural, one {{counter} Abbunamentu} other {{counter} Abbunamenti}}", "account.follows.empty": "St'utilizatore ùn seguita nisunu.", "account.hide_reblogs": "Piattà spartere da @{name}", "account.link_verified_on": "A prupietà di stu ligame hè stata verificata u {date}", @@ -32,7 +30,6 @@ "account.requested": "In attesa d'apprubazione. Cliccate per annullà a dumanda", "account.share": "Sparte u prufile di @{name}", "account.show_reblogs": "Vede spartere da @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Statutu} other {{counter} Statuti}}", "account.unblock": "Sbluccà @{name}", "account.unblock_domain": "Ùn piattà più {domain}", "account.unendorse": "Ùn fà figurà nant'à u prufilu", @@ -92,7 +89,6 @@ "confirmations.delete_list.confirm": "Toglie", "confirmations.delete_list.message": "Site sicuru·a che vulete toglie sta lista?", "confirmations.discard_edit_media.confirm": "Scartà", - "confirmations.domain_block.message": "Site veramente sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà. Ùn viderete più nunda da quallà indè e linee pubbliche o e nutificazione. I vostri abbunati da stu duminiu saranu tolti.", "confirmations.logout.confirm": "Scunnettassi", "confirmations.logout.message": "Site sicuru·a che vulete scunnettà vi?", "confirmations.mute.confirm": "Piattà", @@ -243,7 +239,6 @@ "notification.follow_request": "{name} vole abbunassi à u vostru contu", "notification.mention": "{name} v'hà mintuvatu", "notification.own_poll": "U vostru scandagliu hè compiu", - "notification.poll": "Un scandagliu induve avete vutatu hè finitu", "notification.reblog": "{name} hà spartutu u vostru statutu", "notification.status": "{name} hà appena pubblicatu", "notifications.clear": "Purgà e nutificazione", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index d8d83ae5fad..2afbbfb6733 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -20,7 +20,7 @@ "account.block_short": "Zablokovat", "account.blocked": "Blokovaný", "account.browse_more_on_origin_server": "Více na původním profilu", - "account.cancel_follow_request": "Zrušit žádost o sledování", + "account.cancel_follow_request": "Zrušit sledování", "account.copy": "Kopírovat odkaz na profil", "account.direct": "Soukromě zmínit @{name}", "account.disable_notifications": "Přestat mě upozorňovat, když @{name} zveřejní příspěvek", @@ -35,9 +35,9 @@ "account.follow_back": "Také sledovat", "account.followers": "Sledující", "account.followers.empty": "Tohoto uživatele zatím nikdo nesleduje.", - "account.followers_counter": "{count, plural, one {{counter} Sledující} few {{counter} Sledující} many {{counter} Sledujících} other {{counter} Sledujících}}", + "account.followers_counter": "{count, plural, one {{counter} sledující} few {{counter} sledující} many {{counter} sledujících} other {{counter} sledujících}}", "account.following": "Sledujete", - "account.following_counter": "{count, plural, one {{counter} Sledovaný} few {{counter} Sledovaní} many {{counter} Sledovaných} other {{counter} Sledovaných}}", + "account.following_counter": "{count, plural, one {{counter} sledovaný} few {{counter} sledovaní} many {{counter} sledovaných} other {{counter} sledovaných}}", "account.follows.empty": "Tento uživatel zatím nikoho nesleduje.", "account.go_to_profile": "Přejít na profil", "account.hide_reblogs": "Skrýt boosty od @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} tě požádal o sledování", "account.share": "Sdílet profil @{name}", "account.show_reblogs": "Zobrazit boosty od @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Příspěvek} few {{counter} Příspěvky} many {{counter} Příspěvků} other {{counter} Příspěvků}}", + "account.statuses_counter": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}", "account.unblock": "Odblokovat @{name}", "account.unblock_domain": "Odblokovat doménu {domain}", "account.unblock_short": "Odblokovat", @@ -78,9 +78,9 @@ "admin.dashboard.retention.average": "Průměr", "admin.dashboard.retention.cohort": "Měsíc registrace", "admin.dashboard.retention.cohort_size": "Noví uživatelé", - "admin.impact_report.instance_accounts": "Profily účtů, které by odstranily", - "admin.impact_report.instance_followers": "Sledovatelé, o které by naši uživatelé přišli", - "admin.impact_report.instance_follows": "Následovníci jejich uživatelé by ztratili", + "admin.impact_report.instance_accounts": "Profily účtů, které by byli odstaněny", + "admin.impact_report.instance_followers": "Sledující, o které by naši uživatelé přišli", + "admin.impact_report.instance_follows": "Sledující, o které by naši uživatelé přišli", "admin.impact_report.title": "Shrnutí dopadu", "alert.rate_limited.message": "Zkuste to prosím znovu po {retry_time, time, medium}.", "alert.rate_limited.title": "Spojení omezena", @@ -89,7 +89,7 @@ "announcement.announcement": "Oznámení", "attachments_list.unprocessed": "(nezpracováno)", "audio.hide": "Skrýt zvuk", - "block_modal.remote_users_caveat": "Požádáme server {domain}, aby respektoval vaše rozhodnutí. Úplné dodržování nastavení však není zaručeno, protože některé servery mohou řešit blokování různě. Veřejné příspěvky mohou být stále viditelné pro nepřihlášené uživatele.", + "block_modal.remote_users_caveat": "Požádáme server {domain}, aby respektoval vaše rozhodnutí. Úplné dodržování nastavení však není zaručeno, protože některé servery mohou řešit blokování různě. Veřejné příspěvky mohou stále být viditelné pro nepřihlášené uživatele.", "block_modal.show_less": "Zobrazit méně", "block_modal.show_more": "Zobrazit více", "block_modal.they_cant_mention": "Nemůže vás zmiňovat ani sledovat.", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Upozornění na obsah (nepovinné)", "confirmation_modal.cancel": "Zrušit", "confirmations.block.confirm": "Blokovat", - "confirmations.cancel_follow_request.confirm": "Zrušit žádost", - "confirmations.cancel_follow_request.message": "Opravdu chcete zrušit svou žádost o sledování {name}?", "confirmations.delete.confirm": "Smazat", "confirmations.delete.message": "Opravdu chcete smazat tento příspěvek?", + "confirmations.delete.title": "Smazat příspěvek?", "confirmations.delete_list.confirm": "Smazat", "confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?", + "confirmations.delete_list.title": "Smazat seznam?", "confirmations.discard_edit_media.confirm": "Zahodit", "confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, chcete je přesto zahodit?", - "confirmations.domain_block.confirm": "Blokovat server", - "confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí blokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.", "confirmations.edit.confirm": "Upravit", "confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?", + "confirmations.edit.title": "Přepsat příspěvek?", "confirmations.logout.confirm": "Odhlásit se", "confirmations.logout.message": "Opravdu se chcete odhlásit?", + "confirmations.logout.title": "Odhlásit se?", "confirmations.mute.confirm": "Skrýt", "confirmations.redraft.confirm": "Smazat a přepsat", "confirmations.redraft.message": "Jste si jistí, že chcete odstranit tento příspěvek a vytvořit z něj koncept? Oblíbené a boosty budou ztraceny a odpovědi na původní příspěvek ztratí kontext.", + "confirmations.redraft.title": "Smazat a přepracovat příspěvek na koncept?", "confirmations.reply.confirm": "Odpovědět", "confirmations.reply.message": "Odpověď přepíše vaši rozepsanou zprávu. Opravdu chcete pokračovat?", + "confirmations.reply.title": "Přepsat příspěvek?", "confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.message": "Opravdu chcete {name} přestat sledovat?", + "confirmations.unfollow.title": "Přestat sledovat uživatele?", "conversation.delete": "Smazat konverzaci", "conversation.mark_as_read": "Označit jako přečtené", "conversation.open": "Zobrazit konverzaci", @@ -197,7 +200,7 @@ "copy_icon_button.copied": "Zkopírováno do schránky", "copypaste.copied": "Zkopírováno", "copypaste.copy_to_clipboard": "Zkopírovat do schránky", - "directory.federated": "Ze známého fedivesmíru", + "directory.federated": "Ze známého fediversu", "directory.local": "Pouze z {domain}", "directory.new_arrivals": "Nově příchozí", "directory.recently_active": "Nedávno aktivní", @@ -213,7 +216,7 @@ "domain_block_modal.block_account_instead": "Raději blokovat @{name}", "domain_block_modal.they_can_interact_with_old_posts": "Lidé z tohoto serveru mohou interagovat s vašimi starými příspěvky.", "domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.", - "domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován.", + "domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován*a.", "domain_block_modal.title": "Blokovat doménu?", "domain_block_modal.you_will_lose_followers": "Všichni vaši sledující z tohoto serveru budou odstraněni.", "domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Použít existující kategorii nebo vytvořit novou kategorii", "filter_modal.select_filter.title": "Filtrovat tento příspěvek", "filter_modal.title.status": "Filtrovat příspěvek", - "filtered_notifications_banner.mentions": "{count, plural, one {zmínka} few {zmínky} many {zmínek} other {zmínek}}", - "filtered_notifications_banner.pending_requests": "Oznámení od {count, plural, =0 {nikoho} one {jednoho člověka, kterého znáte} few {# lidí, které znáte} many {# lidí, které znáte} other {# lidí, které znáte}}", "filtered_notifications_banner.title": "Filtrovaná oznámení", "firehose.all": "Vše", "firehose.local": "Tento server", @@ -341,7 +342,7 @@ "hashtag.column_settings.tag_mode.any": "Jakýkoliv z těchto", "hashtag.column_settings.tag_mode.none": "Žádný z těchto", "hashtag.column_settings.tag_toggle": "Zahrnout v tomto sloupci další štítky", - "hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník} few {{counter} účastníci} other {{counter} účastníků}}", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník*ice} few {{counter} účastníci} other {{counter} účastníků}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}", "hashtag.counter_by_uses_today": "Dnes {count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}", "hashtag.follow": "Sledovat hashtag", @@ -414,6 +415,8 @@ "limited_account_hint.action": "Přesto profil zobrazit", "limited_account_hint.title": "Tento profil byl skryt moderátory {domain}.", "link_preview.author": "Podle {name}", + "link_preview.more_from_author": "Více od {name}", + "link_preview.shares": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}", "lists.account.add": "Přidat do seznamu", "lists.account.remove": "Odebrat ze seznamu", "lists.delete": "Smazat seznam", @@ -438,7 +441,7 @@ "mute_modal.show_options": "Zobrazit možnosti", "mute_modal.they_can_mention_and_follow": "Mohou vás zmínit a sledovat, ale neuvidíte je.", "mute_modal.they_wont_know": "Nebudou vědět, že byli skryti.", - "mute_modal.title": "Ztlumit uživatele?", + "mute_modal.title": "Ztlumit uživatele*ku?", "mute_modal.you_wont_see_mentions": "Neuvidíte příspěvky, které je zmiňují.", "mute_modal.you_wont_see_posts": "Stále budou moci vidět vaše příspěvky, ale vy jejich neuvidíte.", "navigation_bar.about": "O aplikaci", @@ -494,13 +497,17 @@ "notification.update": "Uživatel {name} upravil příspěvek", "notification_requests.accept": "Přijmout", "notification_requests.dismiss": "Zamítnout", + "notification_requests.maximize": "Maximalizovat", + "notification_requests.minimize_banner": "Minimalizovat banner filtrovaných oznámení", "notification_requests.notifications_from": "Oznámení od {name}", "notification_requests.title": "Vyfiltrovaná oznámení", "notifications.clear": "Vyčistit oznámení", "notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?", + "notifications.clear_title": "Vyčistit oznámení?", "notifications.column_settings.admin.report": "Nová hlášení:", "notifications.column_settings.admin.sign_up": "Nové registrace:", "notifications.column_settings.alert": "Oznámení na počítači", + "notifications.column_settings.beta.category": "Experimentální funkce", "notifications.column_settings.favourite": "Oblíbené:", "notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie", "notifications.column_settings.filter_bar.category": "Panel rychlého filtrování", @@ -564,8 +571,8 @@ "onboarding.share.message": "Jsem {username} na #Mastodonu! Pojď mě sledovat na {url}", "onboarding.share.next_steps": "Možné další kroky:", "onboarding.share.title": "Sdílejte svůj profil", - "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", - "onboarding.start.skip": "Want to skip right ahead?", + "onboarding.start.lead": "Nyní jste součástí Mastodonu, unikátní sociální sítě, kde vy - ne algoritmus - vytváří vaše vlastní prožitky. Začněte na této nové sociální platformě:", + "onboarding.start.skip": "Nepotřebujete pomoci začít?", "onboarding.start.title": "Dokázali jste to!", "onboarding.steps.follow_people.body": "Mastodon je o sledování zajimavých lidí.", "onboarding.steps.follow_people.title": "Přispůsobit vlastní domovský kanál", @@ -579,7 +586,7 @@ "onboarding.tips.accounts_from_other_servers": "Víte, že? Protože je Mastodon decentralizovaný, některé profily, na které narazíte, budou hostovány na jiných serverech, než je ten váš. A přesto s nimi můžete bezproblémově komunikovat! Jejich server se nachází v druhé polovině uživatelského jména!", "onboarding.tips.migration": "Víte, že? Pokud máte pocit, že {domain} pro vás v budoucnu není vhodnou volbou, můžete se přesunout na jiný Mastodon server, aniž byste přišli o své sledující. Můžete dokonce hostovat svůj vlastní server!", "onboarding.tips.verification": "Víte, že? Svůj účet můžete ověřit tak, že na své webové stránky umístíte odkaz na váš Mastodon profil a odkaz na stránku přidáte do svého profilu. Nejsou k tomu potřeba žádné poplatky ani dokumenty!", - "password_confirmation.exceeds_maxlength": "Potvrzení hesla překračuje maximální délku hesla", + "password_confirmation.exceeds_maxlength": "Potvrzení hesla překračuje maximální povolenou délku hesla", "password_confirmation.mismatching": "Zadaná hesla se neshodují", "picture_in_picture.restore": "Vrátit zpět", "poll.closed": "Uzavřeno", @@ -663,10 +670,14 @@ "report.unfollow": "Přestat sledovat @{name}", "report.unfollow_explanation": "Tento účet sledujete. Abyste už neviděli jeho příspěvky ve své domovské časové ose, přestaňte jej sledovat.", "report_notification.attached_statuses": "{count, plural, one {{count} připojený příspěvek} few {{count} připojené příspěvky} many {{count} připojených příspěvků} other {{count} připojených příspěvků}}", - "report_notification.categories.legal": "Zákonné", + "report_notification.categories.legal": "Právní ustanovení", + "report_notification.categories.legal_sentence": "nezákonný obsah", "report_notification.categories.other": "Ostatní", + "report_notification.categories.other_sentence": "další", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Porušení pravidla", + "report_notification.categories.violation_sentence": "porušení pravidla", "report_notification.open": "Otevřít hlášení", "search.no_recent_searches": "Žádná nedávná vyhledávání", "search.placeholder": "Hledat", @@ -694,8 +705,11 @@ "server_banner.about_active_users": "Lidé používající tento server během posledních 30 dní (měsíční aktivní uživatelé)", "server_banner.active_users": "aktivní uživatelé", "server_banner.administered_by": "Spravováno:", + "server_banner.is_one_of_many": "{domain} je jedním z mnoha Mastodon serverů, které můžete použít k účasti na fediversu.", "server_banner.server_stats": "Statistiky serveru:", "sign_in_banner.create_account": "Vytvořit účet", + "sign_in_banner.follow_anyone": "Sledujte kohokoli napříč fediversem a uvidíte vše v chronologickém pořadí. Bez algoritmů, reklam a clickbaitu.", + "sign_in_banner.mastodon_is": "Mastodon je ten nejlepší způsob, jak udržet krok s tím, co se právě děje.", "sign_in_banner.sign_in": "Přihlásit se", "sign_in_banner.sso_redirect": "Přihlášení nebo Registrace", "status.admin_account": "Otevřít moderátorské rozhraní pro @{name}", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 96476b14331..a5f81aad702 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -3,13 +3,13 @@ "about.contact": "Cysylltwch â:", "about.disclaimer": "Mae Mastodon yn feddalwedd cod agored rhydd ac o dan hawlfraint Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Nid yw'r rheswm ar gael", - "about.domain_blocks.preamble": "Fel rheol, mae Mastodon yn caniatáu i chi weld cynnwys gan unrhyw weinyddwr arall yn y ffederasiwn a rhyngweithio â hi. Dyma'r eithriadau a wnaed ar y gweinydd penodol hwn.", + "about.domain_blocks.preamble": "Fel rheol, mae Mastodon yn caniatáu i chi weld cynnwys gan unrhyw weinyddwr arall yn y ffedysawd a rhyngweithio â hi. Dyma'r eithriadau a wnaed ar y gweinydd penodol hwn.", "about.domain_blocks.silenced.explanation": "Fel rheol, fyddwch chi ddim yn gweld proffiliau a chynnwys o'r gweinydd hwn, oni bai eich bod yn chwilio'n benodol amdano neu yn ymuno drwy ei ddilyn.", "about.domain_blocks.silenced.title": "Cyfyngedig", "about.domain_blocks.suspended.explanation": "Ni fydd data o'r gweinydd hwn yn cael ei brosesu, ei gadw na'i gyfnewid, gan wneud unrhyw ryngweithio neu gyfathrebu gyda defnyddwyr o'r gweinydd hwn yn amhosibl.", "about.domain_blocks.suspended.title": "Ataliwyd", "about.not_available": "Nid yw'r wybodaeth hon ar gael ar y gweinydd hwn.", - "about.powered_by": "Cyfrwng cymdeithasol datganoledig sy'n cael ei yrru gan {mastodon}", + "about.powered_by": "Cyfrwng cymdeithasol datganoledig wedi ei yrru gan {mastodon}", "about.rules": "Rheolau'r gweinydd", "account.account_note_header": "Nodyn", "account.add_or_remove_from_list": "Ychwanegu neu Ddileu o'r rhestrau", @@ -35,9 +35,9 @@ "account.follow_back": "Dilyn yn ôl", "account.followers": "Dilynwyr", "account.followers.empty": "Does neb yn dilyn y defnyddiwr hwn eto.", - "account.followers_counter": "{count, plural, one {Dilynwr: {counter}} other {Dilynwyr: {counter}}}", + "account.followers_counter": "{count, plural, one {{counter} dilynwr} two {{counter} ddilynwr} other {{counter} dilynwyr}}", "account.following": "Yn dilyn", - "account.following_counter": "{count, plural, one {Yn dilyn: {counter}} other {Yn dilyn: {counter}}}", + "account.following_counter": "{count, plural, one {Yn dilyn {counter}} other {Yn dilyn {counter}}}", "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.", "account.go_to_profile": "Mynd i'r proffil", "account.hide_reblogs": "Cuddio hybiau gan @{name}", @@ -50,8 +50,8 @@ "account.mention": "Crybwyll @{name}", "account.moved_to": "Mae {name} wedi nodi fod eu cyfrif newydd yn:", "account.mute": "Tewi @{name}", - "account.mute_notifications_short": "Distewi hysbysiadau", - "account.mute_short": "Tewi", + "account.mute_notifications_short": "Diffodd hysbysiadau", + "account.mute_short": "Anwybyddu", "account.muted": "Wedi anwybyddu", "account.mutual": "Cydgydnabod", "account.no_bio": "Dim disgrifiad wedi'i gynnig.", @@ -63,7 +63,7 @@ "account.requested_follow": "Mae {name} wedi gwneud cais i'ch dilyn", "account.share": "Rhannwch broffil @{name}", "account.show_reblogs": "Dangos hybiau gan @{name}", - "account.statuses_counter": "{count, plural, one {Postiad: {counter}} other {Postiad: {counter}}}", + "account.statuses_counter": "{count, plural, one {{counter} post} two {{counter} bost} few {{counter} phost} many {{counter} post} other {{counter} post}}", "account.unblock": "Dadflocio @{name}", "account.unblock_domain": "Dadflocio parth {domain}", "account.unblock_short": "Dadflocio", @@ -95,7 +95,7 @@ "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.title": "Blocio 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", @@ -167,29 +167,32 @@ "compose_form.spoiler.marked": "Dileu rhybudd cynnwys", "compose_form.spoiler.unmarked": "Ychwanegu rhybudd cynnwys", "compose_form.spoiler_placeholder": "Rhybudd cynnwys (dewisol)", - "confirmation_modal.cancel": "Diddymu", + "confirmation_modal.cancel": "Canslo", "confirmations.block.confirm": "Blocio", - "confirmations.cancel_follow_request.confirm": "Tynnu'r cais yn ôl", - "confirmations.cancel_follow_request.message": "Ydych chi'n siŵr eich bod am dynnu'ch cais i ddilyn {name} yn ôl?", "confirmations.delete.confirm": "Dileu", "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y post hwn?", + "confirmations.delete.title": "Dileu post?", "confirmations.delete_list.confirm": "Dileu", "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?", + "confirmations.delete_list.title": "Dileu rhestr?", "confirmations.discard_edit_media.confirm": "Dileu", "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?", - "confirmations.domain_block.confirm": "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?", + "confirmations.edit.title": "Trosysgrifo post?", "confirmations.logout.confirm": "Allgofnodi", "confirmations.logout.message": "Ydych chi'n siŵr eich bod am allgofnodi?", + "confirmations.logout.title": "Allgofnodi?", "confirmations.mute.confirm": "Tewi", "confirmations.redraft.confirm": "Dileu ac ailddrafftio", "confirmations.redraft.message": "Ydych chi'n siŵr eich bod am ddileu'r postiad hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r post gwreiddiol yn mynd yn amddifad.", + "confirmations.redraft.title": "Dileu & ailddraftio post?", "confirmations.reply.confirm": "Ateb", "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n siŵr eich bod am barhau?", + "confirmations.reply.title": "Trosysgrifo post?", "confirmations.unfollow.confirm": "Dad-ddilyn", "confirmations.unfollow.message": "Ydych chi'n siŵr eich bod am ddad-ddilyn {name}?", + "confirmations.unfollow.title": "Dad-ddilyn defnyddiwr?", "conversation.delete": "Dileu sgwrs", "conversation.mark_as_read": "Nodi fel wedi'i ddarllen", "conversation.open": "Gweld sgwrs", @@ -204,17 +207,17 @@ "disabled_account_banner.account_settings": "Gosodiadau'r cyfrif", "disabled_account_banner.text": "Mae eich cyfrif {disabledAccount} wedi ei analluogi ar hyn o bryd.", "dismissable_banner.community_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl sydd â chyfrifon ar {domain}.", - "dismissable_banner.dismiss": "Diddymu", + "dismissable_banner.dismiss": "Cau", "dismissable_banner.explore_links": "Dyma straeon newyddion sy’n cael eu rhannu fwyaf ar y we gymdeithasol heddiw. Mae'r straeon newyddion diweddaraf sy'n cael eu postio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.", "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.block": "Blocio gweinydd", + "domain_block_modal.block_account_instead": "Blocio @{name} yn ei le", "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.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu blocio.", + "domain_block_modal.title": "Blocio 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.", @@ -255,7 +258,7 @@ "empty_column.bookmarked_statuses": "Nid oes gennych unrhyw bostiad wedi'u cadw fel llyfrnodau eto. Pan fyddwch yn gosod nod tudalen i un, mi fydd yn ymddangos yma.", "empty_column.community": "Mae'r ffrwd lleol yn wag. Beth am ysgrifennu rhywbeth cyhoeddus!", "empty_column.direct": "Nid oes gennych unrhyw grybwylliadau preifat eto. Pan fyddwch chi'n anfon neu'n derbyn un, bydd yn ymddangos yma.", - "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.", + "empty_column.domain_blocks": "Nid oes unrhyw barthau wedi'u blocio eto.", "empty_column.explore_statuses": "Does dim yn trendio ar hyn o bryd. Dewch nôl nes ymlaen!", "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff bostiadau eto. Pan byddwch yn hoffi un, bydd yn ymddangos yma.", "empty_column.favourites": "Nid oes unrhyw un wedi hoffi'r postiad hwn eto. Pan fydd rhywun yn gwneud hynny, byddan nhw'n ymddangos yma.", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd", "filter_modal.select_filter.title": "Hidlo'r postiad hwn", "filter_modal.title.status": "Hidlo postiad", - "filtered_notifications_banner.mentions": "{count, plural, one {crybwylliad} other {crybwylliad}}", - "filtered_notifications_banner.pending_requests": "Hysbysiadau gan {count, plural, =0 {neb} one {un person} other {# person}} efallai y gwyddoch amdanyn nhw", "filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo", "firehose.all": "Popeth", "firehose.local": "Gweinydd hwn", @@ -414,6 +415,8 @@ "limited_account_hint.action": "Dangos y proffil beth bynnag", "limited_account_hint.title": "Mae'r proffil hwn wedi cael ei guddio gan gymedrolwyr {domain}.", "link_preview.author": "Gan {name}", + "link_preview.more_from_author": "Mwy gan {name}", + "link_preview.shares": "{count, plural, one {{counter} post} two {{counter} bost} few {{counter} phost} many {{counter} post} other {{counter} post}}", "lists.account.add": "Ychwanegu at restr", "lists.account.remove": "Tynnu o'r rhestr", "lists.delete": "Dileu rhestr", @@ -441,6 +444,8 @@ "mute_modal.title": "Tewi defnyddiwr?", "mute_modal.you_wont_see_mentions": "Welwch chi ddim postiadau sy'n sôn amdanyn nhw.", "mute_modal.you_wont_see_posts": "Gallan nhw weld eich postiadau o hyd, ond fyddwch chi ddim yn gweld eu rhai hwy.", + "name_and_others": "{name} a(c) {count, plural, one {# arall} other {# eraill}}", + "name_and_others_with_link": "{name} a{count, plural, zero {}one {c # arall} two { # eraill} few { # eraill} many { # eraill} other { # eraill}}", "navigation_bar.about": "Ynghylch", "navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch", "navigation_bar.blocks": "Defnyddwyr wedi eu blocio", @@ -468,6 +473,9 @@ "navigation_bar.security": "Diogelwch", "not_signed_in_indicator.not_signed_in": "Rhaid i chi fewngofnodi i weld yr adnodd hwn.", "notification.admin.report": "Adroddwyd ar {name} {target}", + "notification.admin.report_account_other": "Adroddodd {name} {count, plural, one {un post} two {# bost} few {# phost} other {# post}} gan {target}", + "notification.admin.report_statuses": "Adroddodd {name} {target} ar gyfer {category}", + "notification.admin.report_statuses_other": "Adroddodd {name} {target}", "notification.admin.sign_up": "Cofrestrodd {name}", "notification.favourite": "Hoffodd {name} eich postiad", "notification.follow": "Dilynodd {name} chi", @@ -483,24 +491,29 @@ "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.poll": "Mae arolwg y gwnaethoch bleidleisio ynddo wedi dod i ben", + "notification.private_mention": "Mae {name} wedi eich crybwyll yn breifat", "notification.reblog": "Hybodd {name} eich post", "notification.relationships_severance_event": "Wedi colli cysylltiad â {name}", "notification.relationships_severance_event.account_suspension": "Mae gweinyddwr o {from} wedi atal {target}, sy'n golygu na allwch dderbyn diweddariadau ganddynt mwyach na rhyngweithio â nhw.", - "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.domain_block": "Mae gweinyddwr o {from} wedi blocio {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.relationships_severance_event.user_domain_block": "Rydych wedi blocio {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", "notification_requests.dismiss": "Cau", + "notification_requests.maximize": "Mwyhau", "notification_requests.notifications_from": "Hysbysiadau gan {name}", "notification_requests.title": "Hysbysiadau wedi'u hidlo", "notifications.clear": "Clirio hysbysiadau", "notifications.clear_confirmation": "Ydych chi'n siŵr eich bod am glirio'ch holl hysbysiadau am byth?", + "notifications.clear_title": "Clirio hysbysiadau?", "notifications.column_settings.admin.report": "Adroddiadau newydd:", "notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", + "notifications.column_settings.beta.category": "Nodweddion arbrofol", + "notifications.column_settings.beta.grouping": "Grŵpio hysbysiadau", "notifications.column_settings.favourite": "Ffefrynnau:", "notifications.column_settings.filter_bar.advanced": "Dangos pob categori", "notifications.column_settings.filter_bar.category": "Bar hidlo cyflym", @@ -664,9 +677,13 @@ "report.unfollow_explanation": "Rydych chi'n dilyn y cyfrif hwn. I beidio â gweld eu postiadau yn eich porthiant cartref mwyach, dad-ddilynwch nhw.", "report_notification.attached_statuses": "{count, plural, one {{count} postiad} arall {{count} postiad}} atodwyd", "report_notification.categories.legal": "Cyfreithiol", + "report_notification.categories.legal_sentence": "cynnwys anghyfreithlon", "report_notification.categories.other": "Arall", + "report_notification.categories.other_sentence": "arall", "report_notification.categories.spam": "Sbam", + "report_notification.categories.spam_sentence": "sbam", "report_notification.categories.violation": "Torri rheol", + "report_notification.categories.violation_sentence": "torri rheolau", "report_notification.open": "Agor adroddiad", "search.no_recent_searches": "Does dim chwiliadau diweddar", "search.placeholder": "Chwilio", @@ -694,8 +711,11 @@ "server_banner.about_active_users": "Pobl sy'n defnyddio'r gweinydd hwn yn ystod y 30 diwrnod diwethaf (Defnyddwyr Gweithredol Misol)", "server_banner.active_users": "defnyddwyr gweithredol", "server_banner.administered_by": "Gweinyddir gan:", + "server_banner.is_one_of_many": "Mae {domain} yn un o'r nifer o weinyddion Mastodon annibynnol y gallwch eu defnyddio i gymryd rhan yn y ffedysawd.", "server_banner.server_stats": "Ystadegau'r gweinydd:", "sign_in_banner.create_account": "Creu cyfrif", + "sign_in_banner.follow_anyone": "Dilynwch unrhyw un ar draws y ffedysawd a gweld y cyfan mewn trefn gronolegol. Dim algorithmau, hysbysebion, na straeon er mwyn cliciadau yn y golwg.", + "sign_in_banner.mastodon_is": "Mastodon yw'r ffordd orau o gadw i fyny â'r hyn sy'n digwydd.", "sign_in_banner.sign_in": "Mewngofnodi", "sign_in_banner.sso_redirect": "Mewngofnodi neu Gofrestru", "status.admin_account": "Agor rhyngwyneb cymedroli ar gyfer @{name}", @@ -806,7 +826,7 @@ "video.expand": "Ymestyn fideo", "video.fullscreen": "Sgrin llawn", "video.hide": "Cuddio fideo", - "video.mute": "Tewi sain", + "video.mute": "Diffodd sain", "video.pause": "Oedi", "video.play": "Chwarae", "video.unmute": "Dad-dewi sain" diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 5ac7128a375..2ad5bdc9658 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -35,9 +35,9 @@ "account.follow_back": "Følg tilbage", "account.followers": "Følgere", "account.followers.empty": "Ingen følger denne bruger endnu.", - "account.followers_counter": "{count, plural, one {{counter} Følger} other {{counter} Følgere}}", + "account.followers_counter": "{count, plural, one {{counter} følger} other {{counter} følgere}}", "account.following": "Følger", - "account.following_counter": "{count, plural, one {{counter} Følges} other {{counter} Følges}}", + "account.following_counter": "{count, plural, one {{counter} følger} other {{counter} følger}}", "account.follows.empty": "Denne bruger følger ikke nogen endnu.", "account.go_to_profile": "Gå til profil", "account.hide_reblogs": "Skjul boosts fra @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} har anmodet om at følge dig", "account.share": "Del @{name}s profil", "account.show_reblogs": "Vis fremhævelser fra @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Indlæg} other {{counter} Indlæg}}", + "account.statuses_counter": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}", "account.unblock": "Afblokér @{name}", "account.unblock_domain": "Afblokér domænet {domain}", "account.unblock_short": "Afblokér", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)", "confirmation_modal.cancel": "Afbryd", "confirmations.block.confirm": "Blokér", - "confirmations.cancel_follow_request.confirm": "Annullér anmodning", - "confirmations.cancel_follow_request.message": "Er du sikker på, at anmodningen om at følge {name} skal annulleres?", "confirmations.delete.confirm": "Slet", "confirmations.delete.message": "Er du sikker på, at du vil slette dette indlæg?", + "confirmations.delete.title": "Slet indlæg?", "confirmations.delete_list.confirm": "Slet", "confirmations.delete_list.message": "Er du sikker på, at du vil slette denne liste permanent?", + "confirmations.delete_list.title": "Slet liste?", "confirmations.discard_edit_media.confirm": "Kassér", "confirmations.discard_edit_media.message": "Der er ugemte ændringer i mediebeskrivelsen eller forhåndsvisningen, kassér dem alligevel?", - "confirmations.domain_block.confirm": "Blokér server", - "confirmations.domain_block.message": "Er du fuldstændig sikker på, at du vil blokere hele {domain}-domænet? Oftest vil nogle få målrettede blokeringer eller skjulninger være tilstrækkelige og at foretrække. Du vil ikke se indhold fra dette domæne i nogle offentlige tidslinjer eller i dine notifikationer, og dine følgere herfra fjernes ligeledes.", "confirmations.edit.confirm": "Redigér", "confirmations.edit.message": "Redigeres nu, overskrive den besked, der forfattes pt. Fortsæt alligevel?", + "confirmations.edit.title": "Overskriv indlæg?", "confirmations.logout.confirm": "Log ud", "confirmations.logout.message": "Er du sikker på, at du vil logge ud?", + "confirmations.logout.title": "Log ud?", "confirmations.mute.confirm": "Skjul (mute)", "confirmations.redraft.confirm": "Slet og omformulér", "confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og boosts går tabt, og svar til det oprindelige indlæg mister tilknytningen.", + "confirmations.redraft.title": "Slet og omformulér indlæg?", "confirmations.reply.confirm": "Svar", "confirmations.reply.message": "Hvis du svarer nu, vil det overskrive den besked, du er ved at skrive. Fortsæt alligevel?", + "confirmations.reply.title": "Overskriv indlæg?", "confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.message": "Er du sikker på, at du ikke længere vil følge {name}?", + "confirmations.unfollow.title": "Følg ikke længere bruger?", "conversation.delete": "Slet samtale", "conversation.mark_as_read": "Markér som læst", "conversation.open": "Vis samtale", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Vælg en eksisterende kategori eller opret en ny", "filter_modal.select_filter.title": "Filtrér dette indlæg", "filter_modal.title.status": "Filtrér et indlæg", - "filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}", - "filtered_notifications_banner.pending_requests": "Notifikationer fra {count, plural, =0 {ingen} one {én person} other {# personer}} du måske kender", + "filtered_notifications_banner.pending_requests": "Fra {count, plural, =0 {ingen} one {én person} other {# personer}}, man måske kender", "filtered_notifications_banner.title": "Filtrerede notifikationer", "firehose.all": "Alle", "firehose.local": "Denne server", @@ -443,6 +445,8 @@ "mute_modal.title": "Tavsgør bruger?", "mute_modal.you_wont_see_mentions": "Indlæg, som nævner vedkommende, vises ikke.", "mute_modal.you_wont_see_posts": "Vedkommende kan stadig se dine indlæg, med vedkommendes vise ikke.", + "name_and_others": "{name} og {count, plural, one {# anden} other {# andre}}", + "name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}}", "navigation_bar.about": "Om", "navigation_bar.advanced_interface": "Åbn i avanceret webgrænseflade", "navigation_bar.blocks": "Blokerede brugere", @@ -470,6 +474,10 @@ "navigation_bar.security": "Sikkerhed", "not_signed_in_indicator.not_signed_in": "Log ind for at tilgå denne ressource.", "notification.admin.report": "{name} anmeldte {target}", + "notification.admin.report_account": "{name} anmeldte {count, plural, one {et indlæg} other {# indlæg}} fra {target} angående {category}", + "notification.admin.report_account_other": "{name} anmeldte {count, plural, one {et indlæg} other {# indlæg}} fra {target}", + "notification.admin.report_statuses": "{name} anmeldte {target} angående {category}", + "notification.admin.report_statuses_other": "{name} anmeldte {target}", "notification.admin.sign_up": "{name} tilmeldte sig", "notification.favourite": "{name} favoritmarkerede dit indlæg", "notification.follow": "{name} begyndte at følge dig", @@ -485,7 +493,8 @@ "notification.moderation_warning.action_silence": "Din konto er blevet begrænset.", "notification.moderation_warning.action_suspend": "Din konto er suspenderet.", "notification.own_poll": "Din afstemning er afsluttet", - "notification.poll": "En afstemning, hvori du stemte, er slut", + "notification.poll": "En afstemning, hvori du har stemt, er slut", + "notification.private_mention": "{name} nævnte dig privat", "notification.reblog": "{name} boostede dit indlæg", "notification.relationships_severance_event": "Mistede forbindelser med {name}", "notification.relationships_severance_event.account_suspension": "En admin fra {from} har suspenderet {target}, hvofor opdateringer herfra eller interaktion hermed ikke længer er mulig.", @@ -496,13 +505,18 @@ "notification.update": "{name} redigerede et indlæg", "notification_requests.accept": "Acceptér", "notification_requests.dismiss": "Afvis", + "notification_requests.maximize": "Maksimér", + "notification_requests.minimize_banner": "Minimér filtrerede notifikationsbanner", "notification_requests.notifications_from": "Notifikationer fra {name}", "notification_requests.title": "Filtrerede notifikationer", "notifications.clear": "Ryd notifikationer", "notifications.clear_confirmation": "Er du sikker på, at du vil rydde alle dine notifikationer permanent?", + "notifications.clear_title": "Ryd notifikationer?", "notifications.column_settings.admin.report": "Nye anmeldelser:", "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:", "notifications.column_settings.alert": "Computernotifikationer", + "notifications.column_settings.beta.category": "Eksperimentelle funktioner", + "notifications.column_settings.beta.grouping": "Gruppér notifikationer", "notifications.column_settings.favourite": "Favoritter:", "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier", "notifications.column_settings.filter_bar.category": "Hurtigfiltreringsbjælke", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Du følger denne konto. For ikke længere at se vedkommendes indlæg i dit hjemmefeed, kan du stoppe med at følge dem.", "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} poster}} vedhæftet", "report_notification.categories.legal": "Juridisk", + "report_notification.categories.legal_sentence": "ikke-tilladt indhold", "report_notification.categories.other": "Andre", + "report_notification.categories.other_sentence": "andet", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Regelovertrædelse", + "report_notification.categories.violation_sentence": "regelovertrædelse", "report_notification.open": "Åbn anmeldelse", "search.no_recent_searches": "Ingen seneste søgninger", "search.placeholder": "Søg", @@ -696,8 +714,11 @@ "server_banner.about_active_users": "Folk, som brugte denne server de seneste 30 dage (månedlige aktive brugere)", "server_banner.active_users": "aktive brugere", "server_banner.administered_by": "Håndteres af:", + "server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, man kan bruge for at deltage i fediverset.", "server_banner.server_stats": "Serverstatstik:", "sign_in_banner.create_account": "Opret konto", + "sign_in_banner.follow_anyone": "Følg alle på tværs af fediverset og se alt i kronologisk rækkefølge. Ingen algoritmer, annoncer eller clickbait i syne.", + "sign_in_banner.mastodon_is": "Mastodon er den bedste måde at holde sig ajour med, hvad der sker.", "sign_in_banner.sign_in": "Log ind", "sign_in_banner.sso_redirect": "Log ind eller Tilmeld", "status.admin_account": "Åbn modereringsbrugerflade for @{name}", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 86438757a30..52a2cf2b9bc 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Inhaltswarnung (optional)", "confirmation_modal.cancel": "Abbrechen", "confirmations.block.confirm": "Blockieren", - "confirmations.cancel_follow_request.confirm": "Anfrage zurückziehen", - "confirmations.cancel_follow_request.message": "Möchtest du deine Anfrage, {name} zu folgen, wirklich zurückziehen?", "confirmations.delete.confirm": "Löschen", "confirmations.delete.message": "Möchtest du diesen Beitrag wirklich löschen?", + "confirmations.delete.title": "Beitrag löschen?", "confirmations.delete_list.confirm": "Löschen", "confirmations.delete_list.message": "Möchtest du diese Liste für immer löschen?", + "confirmations.delete_list.title": "Liste löschen?", "confirmations.discard_edit_media.confirm": "Verwerfen", "confirmations.discard_edit_media.message": "Du hast Änderungen an der Medienbeschreibung oder -vorschau vorgenommen, die noch nicht gespeichert sind. Trotzdem verwerfen?", - "confirmations.domain_block.confirm": "Server blockieren", - "confirmations.domain_block.message": "Möchtest du die gesamte Domain {domain} wirklich blockieren? In den meisten Fällen reichen ein paar gezielte Blockierungen oder Stummschaltungen aus. Du wirst den Inhalt von dieser Domain nicht in irgendwelchen öffentlichen Timelines oder den Benachrichtigungen finden. Auch deine Follower von dieser Domain werden entfernt.", "confirmations.edit.confirm": "Bearbeiten", "confirmations.edit.message": "Das Bearbeiten überschreibt die Nachricht, die du gerade verfasst. Möchtest du wirklich fortfahren?", + "confirmations.edit.title": "Beitrag überschreiben?", "confirmations.logout.confirm": "Abmelden", "confirmations.logout.message": "Möchtest du dich wirklich abmelden?", + "confirmations.logout.title": "Abmelden?", "confirmations.mute.confirm": "Stummschalten", "confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Favoriten und geteilte Beiträge gehen verloren, und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.", + "confirmations.redraft.title": "Beitrag löschen und neu erstellen?", "confirmations.reply.confirm": "Antworten", "confirmations.reply.message": "Wenn du jetzt darauf antwortest, wird der andere Beitrag, an dem du gerade geschrieben hast, verworfen. Möchtest du wirklich fortfahren?", + "confirmations.reply.title": "Beitrag überschreiben?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Möchtest du {name} wirklich entfolgen?", + "confirmations.unfollow.title": "Profil entfolgen?", "conversation.delete": "Unterhaltung löschen", "conversation.mark_as_read": "Als gelesen markieren", "conversation.open": "Unterhaltung anzeigen", @@ -205,10 +208,10 @@ "disabled_account_banner.text": "Dein Konto {disabledAccount} ist derzeit deaktiviert.", "dismissable_banner.community_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen, deren Konten von {domain} verwaltet werden.", "dismissable_banner.dismiss": "Ablehnen", - "dismissable_banner.explore_links": "Diese Nachrichten werden heute am häufigsten im sozialen Netzwerk geteilt. Neuere Nachrichten, die von vielen verschiedenen Profilen veröffentlicht wurden, werden höher eingestuft.", - "dismissable_banner.explore_statuses": "Diese Beiträge stammen aus dem gesamten sozialen Netzwerk und gewinnen derzeit an Reichweite. Neuere Beiträge, die häufiger geteilt und favorisiert wurden, werden höher eingestuft.", - "dismissable_banner.explore_tags": "Das sind Hashtags, die derzeit an Reichweite gewinnen. Hashtags, die von vielen verschiedenen Profilen verwendet werden, werden höher eingestuft.", - "dismissable_banner.public_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen im sozialen Netzwerk, denen Leute auf {domain} folgen.", + "dismissable_banner.explore_links": "Diese Nachrichten werden heute am häufigsten im Social Web geteilt. Neuere Nachrichten, die von vielen verschiedenen Profilen geteilt wurden, erscheinen weiter oben.", + "dismissable_banner.explore_statuses": "Diese Beiträge sind heute im Social Web sehr beliebt. Neuere Beiträge, die häufiger geteilt und favorisiert wurden, erscheinen weiter oben.", + "dismissable_banner.explore_tags": "Diese Hashtags sind heute im Social Web sehr beliebt. Hashtags, die von vielen verschiedenen Profilen verwendet werden, erscheinen weiter oben.", + "dismissable_banner.public_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen im Social Web, denen Leute auf {domain} folgen.", "domain_block_modal.block": "Server blockieren", "domain_block_modal.block_account_instead": "Stattdessen @{name} blockieren", "domain_block_modal.they_can_interact_with_old_posts": "Profile von diesem Server werden mit deinen älteren Beiträgen interagieren können.", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen", "filter_modal.select_filter.title": "Diesen Beitrag filtern", "filter_modal.title.status": "Beitrag per Filter ausblenden", - "filtered_notifications_banner.mentions": "{count, plural, one {Erwähnung} other {Erwähnungen}}", - "filtered_notifications_banner.pending_requests": "Benachrichtigungen von {count, plural, =0 {keinem Profil, das du möglicherweise kennst} one {einem Profil, das du möglicherweise kennst} other {# Profilen, die du möglicherweise kennst}}", + "filtered_notifications_banner.pending_requests": "Von {count, plural, =0 {keinem, den} one {einer Person, die} other {# Personen, die}} du möglicherweise kennst", "filtered_notifications_banner.title": "Gefilterte Benachrichtigungen", "firehose.all": "Alles", "firehose.local": "Dieser Server", @@ -443,6 +445,8 @@ "mute_modal.title": "Profil stummschalten?", "mute_modal.you_wont_see_mentions": "Du wirst keine Beiträge sehen, die dieses Profil erwähnen.", "mute_modal.you_wont_see_posts": "Deine Beiträge können weiterhin angesehen werden, aber du wirst deren Beiträge nicht mehr sehen.", + "name_and_others": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}}", + "name_and_others_with_link": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}}", "navigation_bar.about": "Über", "navigation_bar.advanced_interface": "Im erweiterten Webinterface öffnen", "navigation_bar.blocks": "Blockierte Profile", @@ -470,6 +474,10 @@ "navigation_bar.security": "Sicherheit", "not_signed_in_indicator.not_signed_in": "Du musst dich anmelden, um auf diesen Inhalt zugreifen zu können.", "notification.admin.report": "{name} meldete {target}", + "notification.admin.report_account": "{name} meldete {count, plural, one {einen Beitrag} other {# Beiträge}} von {target} wegen {category}", + "notification.admin.report_account_other": "{name} meldete {count, plural, one {einen Beitrag} other {# Beiträge}} von {target}", + "notification.admin.report_statuses": "{name} meldete {target} wegen {category}", + "notification.admin.report_statuses_other": "{name} meldete {target}", "notification.admin.sign_up": "{name} registrierte sich", "notification.favourite": "{name} favorisierte deinen Beitrag", "notification.follow": "{name} folgt dir", @@ -486,6 +494,7 @@ "notification.moderation_warning.action_suspend": "Dein Konto wurde gesperrt.", "notification.own_poll": "Deine Umfrage ist beendet", "notification.poll": "Eine Umfrage, an der du teilgenommen hast, ist beendet", + "notification.private_mention": "{name} hat dich privat erwähnt", "notification.reblog": "{name} teilte deinen Beitrag", "notification.relationships_severance_event": "Verbindungen mit {name} verloren", "notification.relationships_severance_event.account_suspension": "Ein Admin von {from} hat {target} gesperrt. Du wirst von diesem Profil keine Updates mehr erhalten und auch nicht mit ihm interagieren können.", @@ -496,13 +505,18 @@ "notification.update": "{name} bearbeitete einen Beitrag", "notification_requests.accept": "Akzeptieren", "notification_requests.dismiss": "Ablehnen", + "notification_requests.maximize": "Maximieren", + "notification_requests.minimize_banner": "Banner für gefilterte Benachrichtigungen minimieren", "notification_requests.notifications_from": "Benachrichtigungen von {name}", "notification_requests.title": "Gefilterte Benachrichtigungen", "notifications.clear": "Benachrichtigungen löschen", "notifications.clear_confirmation": "Möchtest du wirklich alle Benachrichtigungen für immer löschen?", + "notifications.clear_title": "Benachrichtigungen löschen?", "notifications.column_settings.admin.report": "Neue Meldungen:", "notifications.column_settings.admin.sign_up": "Neue Registrierungen:", "notifications.column_settings.alert": "Desktop-Benachrichtigungen", + "notifications.column_settings.beta.category": "Experimentelle Funktionen", + "notifications.column_settings.beta.grouping": "Benachrichtigungen gruppieren", "notifications.column_settings.favourite": "Favoriten:", "notifications.column_settings.filter_bar.advanced": "Alle Filterkategorien anzeigen", "notifications.column_settings.filter_bar.category": "Filterleiste", @@ -644,7 +658,7 @@ "report.placeholder": "Ergänzende Hinweise", "report.reasons.dislike": "Das gefällt mir nicht", "report.reasons.dislike_description": "Das ist etwas, das du nicht sehen möchtest", - "report.reasons.legal": "Das ist illegal", + "report.reasons.legal": "Das ist rechtswidrig", "report.reasons.legal_description": "Du glaubst, dass es gegen die Gesetze deines Landes oder des Landes des Servers verstößt", "report.reasons.other": "Es ist etwas anderes", "report.reasons.other_description": "Der Vorfall passt zu keiner dieser Kategorien", @@ -666,12 +680,16 @@ "report.unfollow_explanation": "Du folgst diesem Konto. Um die Beiträge nicht mehr auf deiner Startseite zu sehen, entfolge dem Konto.", "report_notification.attached_statuses": "{count, plural, one {{count} angehangener Beitrag} other {{count} angehängte Beiträge}}", "report_notification.categories.legal": "Rechtliches", + "report_notification.categories.legal_sentence": "rechtswidrigem Inhalt", "report_notification.categories.other": "Nicht aufgeführt", + "report_notification.categories.other_sentence": "etwas anderem", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "Spam", "report_notification.categories.violation": "Regelverstoß", + "report_notification.categories.violation_sentence": "Regelverletzung", "report_notification.open": "Meldung öffnen", "search.no_recent_searches": "Keine früheren Suchanfragen", - "search.placeholder": "Suche", + "search.placeholder": "Suchen", "search.quick_action.account_search": "Profile passend zu {x}", "search.quick_action.go_to_account": "Profil {x} aufrufen", "search.quick_action.go_to_hashtag": "Hashtag {x} aufrufen", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 47a8df62001..3b181b42a68 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -35,9 +35,9 @@ "account.follow_back": "Ακολούθησε και εσύ", "account.followers": "Ακόλουθοι", "account.followers.empty": "Κανείς δεν ακολουθεί αυτόν τον χρήστη ακόμα.", - "account.followers_counter": "{count, plural, one {{counter} Ακόλουθος} other {{counter} Ακόλουθοι}}", + "account.followers_counter": "{count, plural, one {{counter} ακόλουθος} other {{counter} ακόλουθοι}}", "account.following": "Ακολουθείτε", - "account.following_counter": "{count, plural, one {{counter} Ακολουθεί} other {{counter} Ακολουθούν}}", + "account.following_counter": "{count, plural, one {{counter} ακολουθεί} other {{counter} ακολουθούν}}", "account.follows.empty": "Αυτός ο χρήστης δεν ακολουθεί κανέναν ακόμα.", "account.go_to_profile": "Μετάβαση στο προφίλ", "account.hide_reblogs": "Απόκρυψη ενισχύσεων από @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "Ο/Η {name} αιτήθηκε να σε ακολουθήσει", "account.share": "Κοινοποίηση του προφίλ @{name}", "account.show_reblogs": "Εμφάνιση ενισχύσεων από @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Ανάρτηση} other {{counter} Αναρτήσεις}}", + "account.statuses_counter": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}", "account.unblock": "Άρση αποκλεισμού @{name}", "account.unblock_domain": "Άρση αποκλεισμού του τομέα {domain}", "account.unblock_short": "Άρση αποκλεισμού", @@ -78,6 +78,10 @@ "admin.dashboard.retention.average": "Μέσος όρος", "admin.dashboard.retention.cohort": "Μήνας εγγραφής", "admin.dashboard.retention.cohort_size": "Νέοι χρήστες", + "admin.impact_report.instance_accounts": "Προφίλ λογαριασμών που θα διαγράψει", + "admin.impact_report.instance_followers": "Ακόλουθοι που θα χάσουν οι χρήστες μας", + "admin.impact_report.instance_follows": "Ακόλουθοι που θα χάσουν οι χρήστες τους", + "admin.impact_report.title": "Περίληψη επιπτώσεων", "alert.rate_limited.message": "Παρακαλούμε δοκίμασε ξανά μετά τις {retry_time, time, medium}", "alert.rate_limited.title": "Περιορισμός συχνότητας", "alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.", @@ -85,6 +89,14 @@ "announcement.announcement": "Ανακοίνωση", "attachments_list.unprocessed": "(μη επεξεργασμένο)", "audio.hide": "Απόκρυψη αρχείου ήχου", + "block_modal.remote_users_caveat": "Θα ζητήσουμε από τον διακομιστή {domain} να σεβαστεί την απόφασή σου. Ωστόσο, η συμμόρφωση δεν είναι εγγυημένη δεδομένου ότι ορισμένοι διακομιστές ενδέχεται να χειρίζονται τους αποκλεισμούς διαφορετικά. Οι δημόσιες αναρτήσεις ενδέχεται να είναι ορατές σε μη συνδεδεμένους χρήστες.", + "block_modal.show_less": "Εμφάνιση λιγότερων", + "block_modal.show_more": "Εμφάνιση περισσότερων", + "block_modal.they_cant_mention": "Δεν μπορεί να σε επισημάνει ή να σε ακολουθήσει.", + "block_modal.they_cant_see_posts": "Δεν μπορεί να δει τις αναρτήσεις σου και δε θα δεις τις δικές του.", + "block_modal.they_will_know": "Μπορούν να δει ότι έχει αποκλειστεί.", + "block_modal.title": "Αποκλεισμός χρήστη;", + "block_modal.you_wont_see_mentions": "Δε θα βλέπεις τις αναρτήσεις που τον αναφέρουν.", "boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις την επόμενη φορά", "bundle_column_error.copy_stacktrace": "Αντιγραφή αναφοράς σφάλματος", "bundle_column_error.error.body": "Δεν ήταν δυνατή η απόδοση της σελίδας που ζήτησες. Μπορεί να οφείλεται σε σφάλμα στον κώδικά μας ή σε πρόβλημα συμβατότητας του προγράμματος περιήγησης.", @@ -111,6 +123,7 @@ "column.directory": "Περιήγηση στα προφίλ", "column.domain_blocks": "Αποκλεισμένοι τομείς", "column.favourites": "Αγαπημένα", + "column.firehose": "Ζωντανές ροές", "column.follow_requests": "Αιτήματα ακολούθησης", "column.home": "Αρχική", "column.lists": "Λίστες", @@ -143,6 +156,7 @@ "compose_form.poll.duration": "Διάρκεια δημοσκόπησης", "compose_form.poll.multiple": "Πολλαπλή επιλογή", "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.type": "Στυλ", @@ -155,15 +169,12 @@ "compose_form.spoiler_placeholder": "Προειδοποίηση περιεχομένου (προαιρετική)", "confirmation_modal.cancel": "Άκυρο", "confirmations.block.confirm": "Αποκλεισμός", - "confirmations.cancel_follow_request.confirm": "Απόσυρση αιτήματος", - "confirmations.cancel_follow_request.message": "Είσαι σίγουρος/η ότι θέλεις να αποσύρεις το αίτημά σου να ακολουθείς τον/την {name};", "confirmations.delete.confirm": "Διαγραφή", "confirmations.delete.message": "Σίγουρα θες να διαγράψεις αυτή τη δημοσίευση;", "confirmations.delete_list.confirm": "Διαγραφή", "confirmations.delete_list.message": "Σίγουρα θες να διαγράψεις οριστικά αυτή τη λίστα;", "confirmations.discard_edit_media.confirm": "Απόρριψη", "confirmations.discard_edit_media.message": "Έχεις μη αποθηκευμένες αλλαγές στην περιγραφή πολυμέσων ή στην προεπισκόπηση, απόρριψη ούτως ή άλλως;", - "confirmations.domain_block.message": "Σίγουρα θες να αποκλείσεις ολόκληρο τον {domain}; Συνήθως μερικοί συγκεκρίμένοι αποκλεισμοί ή σιγάσεις επαρκούν και προτιμούνται. Δεν θα βλέπεις περιεχόμενο από αυτό τον τομέα σε καμία δημόσια ροή ή στις ειδοποιήσεις σου. Όσους ακόλουθους έχεις αυτό αυτό τον τομέα θα αφαιρεθούν.", "confirmations.edit.confirm": "Επεξεργασία", "confirmations.edit.message": "Αν το επεξεργαστείς τώρα θα αντικατασταθεί το μήνυμα που συνθέτεις. Είσαι σίγουρος ότι θέλεις να συνεχίσεις;", "confirmations.logout.confirm": "Αποσύνδεση", @@ -193,6 +204,28 @@ "dismissable_banner.explore_links": "Αυτές οι ειδήσεις συζητούνται σε αυτόν και άλλους διακομιστές του αποκεντρωμένου δικτύου αυτή τη στιγμή.", "dismissable_banner.explore_statuses": "Αυτές είναι οι αναρτήσεις που έχουν απήχηση στο κοινωνικό δίκτυο σήμερα. Οι νεώτερες αναρτήσεις με περισσότερες προωθήσεις και προτιμήσεις κατατάσσονται ψηλότερα.", "dismissable_banner.explore_tags": "Αυτές οι ετικέτες αποκτούν απήχηση σε αυτόν και άλλους διακομιστές του αποκεντρωμένου δικτύου αυτή τη στιγμή.", + "dismissable_banner.public_timeline": "Αυτές είναι οι πιο πρόσφατες δημόσιες αναρτήσεις από άτομα στον κοινωνικό ιστό που ακολουθούν άτομα από το {domain}.", + "domain_block_modal.block": "Αποκλεισμός διακομιστή", + "domain_block_modal.block_account_instead": "Αποκλεισμός @{name} αντ' αυτού", + "domain_block_modal.they_can_interact_with_old_posts": "Άτομα από αυτόν τον διακομιστή μπορούν να αλληλεπιδράσουν με τις παλιές αναρτήσεις σου.", + "domain_block_modal.they_cant_follow": "Κανείς από αυτόν τον διακομιστή δεν μπορεί να σε ακολουθήσει.", + "domain_block_modal.they_wont_know": "Δεν θα ξέρουν ότι έχουν αποκλειστεί.", + "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 είναι σαν τη γλώσσα Mastodon μιλάει με άλλα κοινωνικά δίκτυα.", + "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": "Δραστηριότητα", @@ -210,6 +243,7 @@ "emoji_button.search_results": "Αποτελέσματα αναζήτησης", "emoji_button.symbols": "Σύμβολα", "emoji_button.travel": "Ταξίδια & Τοποθεσίες", + "empty_column.account_hides_collections": "Αυτός ο χρήστης έχει επιλέξει να μην καταστήσει αυτές τις πληροφορίες διαθέσιμες", "empty_column.account_suspended": "Λογαριασμός σε αναστολή", "empty_column.account_timeline": "Δεν έχει αναρτήσεις εδώ!", "empty_column.account_unavailable": "Μη διαθέσιμο προφίλ", @@ -219,6 +253,8 @@ "empty_column.direct": "Δεν έχεις καμία προσωπική επισήμανση ακόμα. Όταν στείλεις ή λάβεις μία, θα εμφανιστεί εδώ.", "empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμα.", "empty_column.explore_statuses": "Τίποτα δεν βρίσκεται στις τάσεις αυτή τη στιγμή. Έλεγξε αργότερα!", + "empty_column.favourited_statuses": "Δεν έχεις καμία αγαπημένη ανάρτηση ακόμα. Μόλις αγαπήσεις κάποια, θα εμφανιστεί εδώ.", + "empty_column.favourites": "Κανείς δεν έχει αγαπήσει αυτή την ανάρτηση ακόμα. Μόλις το κάνει κάποιος, θα εμφανιστεί εδώ.", "empty_column.follow_requests": "Δεν έχεις κανένα αίτημα παρακολούθησης ακόμα. Μόλις λάβεις κάποιο, θα εμφανιστεί εδώ.", "empty_column.followed_tags": "Δεν έχετε παρακολουθήσει ακόμα καμία ετικέτα. Όταν το κάνετε, θα εμφανιστούν εδώ.", "empty_column.hashtag": "Δεν υπάρχει ακόμα κάτι για αυτή την ετικέτα.", @@ -226,6 +262,7 @@ "empty_column.list": "Δεν υπάρχει τίποτα σε αυτή τη λίστα ακόμα. Όταν τα μέλη της δημοσιεύσουν νέες καταστάσεις, θα εμφανιστούν εδώ.", "empty_column.lists": "Δεν έχεις καμία λίστα ακόμα. Μόλις φτιάξεις μια, θα εμφανιστεί εδώ.", "empty_column.mutes": "Δεν έχεις κανένα χρήστη σε σίγαση ακόμα.", + "empty_column.notification_requests": "Όλα καθαρά! Δεν υπάρχει τίποτα εδώ. Όταν λαμβάνεις νέες ειδοποιήσεις, αυτές θα εμφανίζονται εδώ σύμφωνα με τις ρυθμίσεις σου.", "empty_column.notifications": "Δεν έχεις ειδοποιήσεις ακόμα. Όταν άλλα άτομα αλληλεπιδράσουν μαζί σου, θα το δεις εδώ.", "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο ή ακολούθησε χειροκίνητα χρήστες από άλλους διακομιστές για να τη γεμίσεις", "error.unexpected_crash.explanation": "Είτε λόγω σφάλματος στον κώδικά μας ή λόγω ασυμβατότητας με τον περιηγητή, η σελίδα δε μπόρεσε να εμφανιστεί σωστά.", @@ -256,12 +293,28 @@ "filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα", "filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης", "filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης", + "filtered_notifications_banner.title": "Φιλτραρισμένες ειδοποιήσεις", "firehose.all": "Όλα", "firehose.local": "Αυτός ο διακομιστής", "firehose.remote": "Άλλοι διακομιστές", "follow_request.authorize": "Εξουσιοδότησε", "follow_request.reject": "Απέρριψε", "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}.", + "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": "Ετικέτες που ακολουθούνται", "footer.about": "Σχετικά με", "footer.directory": "Κατάλογος προφίλ", @@ -282,21 +335,30 @@ "hashtag.column_settings.tag_mode.any": "Οποιοδήποτε από αυτά", "hashtag.column_settings.tag_mode.none": "Κανένα από αυτά", "hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} συμμετέχων} other {{counter} συμμετέχοντες}}", + "hashtag.counter_by_uses": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}", + "hashtag.counter_by_uses_today": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}} σήμερα", "hashtag.follow": "Παρακολούθηση ετικέτας", "hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας", + "hashtags.and_other": "…και {count, plural, one {}other {# ακόμη}}", "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων", "home.hide_announcements": "Απόκρυψη ανακοινώσεων", + "home.pending_critical_update.body": "Παρακαλούμε ενημέρωσε τον διακομιστή Mastodon σου το συντομότερο δυνατόν!", "home.pending_critical_update.link": "Δείτε ενημερώσεις", "home.pending_critical_update.title": "Κρίσιμη ενημέρωση ασφαλείας διαθέσιμη!", "home.show_announcements": "Εμφάνιση ανακοινώσεων", + "interaction_modal.description.favourite": "Με ένα συντάκτη στο Mastodon μπορείς να αγαπήσεις αυτή την ανάρτηση, για να ενημερώσεις τον συγγραφέα ότι την εκτιμάς και να την αποθηκεύσεις για αργότερα.", "interaction_modal.description.follow": "Με έναν λογαριασμό Mastodon, μπορείς να ακολουθήσεις τον/την {name} ώστε να λαμβάνεις τις αναρτήσεις του/της στη δική σου ροή.", "interaction_modal.description.reblog": "Με ένα λογαριασμό Mastodon, μπορείς να ενισχύσεις αυτή την ανάρτηση για να τη μοιραστείς με τους δικούς σου ακολούθους.", "interaction_modal.description.reply": "Με ένα λογαριασμό Mastodon, μπορείς να απαντήσεις σε αυτή την ανάρτηση.", "interaction_modal.login.action": "Take me home\nΠήγαινέ με στην αρχική σελίδα", + "interaction_modal.login.prompt": "Τομέας του οικιακού σου διακομιστή, πχ. mastodon.social", "interaction_modal.no_account_yet": "Not on Mastodon?\nΔεν είστε στο Mastodon;", "interaction_modal.on_another_server": "Σε διαφορετικό διακομιστή", "interaction_modal.on_this_server": "Σε αυτόν τον διακομιστή", + "interaction_modal.sign_in": "Δεν είσαι συνδεδεμένος σε αυτόν το διακομιστή. Πού φιλοξενείται ο λογαριασμός σου;", + "interaction_modal.sign_in_hint": "Συμβουλή: Αυτή είναι η ιστοσελίδα όπου έχεις εγγραφεί. Αν δεν θυμάσαι, αναζήτησε το καλώς ήρθες e-mail στα εισερχόμενά σου. Μπορείς επίσης να εισάγεις το πλήρες όνομα χρήστη! (πχ. @Mastodon@mastodon.social)", "interaction_modal.title.favourite": "Favorite {name}'s post\nΠροτίμησε την ανάρτηση της/του {name}", "interaction_modal.title.follow": "Ακολούθησε {name}", "interaction_modal.title.reblog": "Ενίσχυσε την ανάρτηση του {name}", @@ -314,6 +376,7 @@ "keyboard_shortcuts.down": "κίνηση προς τα κάτω στη λίστα", "keyboard_shortcuts.enter": "Εμφάνιση ανάρτησης", "keyboard_shortcuts.favourite": "Αγαπημένη δημοσίευση", + "keyboard_shortcuts.favourites": "Άνοιγμα λίστας αγαπημένων", "keyboard_shortcuts.federated": "Άνοιγμα ροής συναλλαγών", "keyboard_shortcuts.heading": "Συντομεύσεις πληκτρολογίου", "keyboard_shortcuts.home": "Άνοιγμα ροής αρχικής σελίδας", @@ -344,11 +407,15 @@ "lightbox.previous": "Προηγούμενο", "limited_account_hint.action": "Εμφάνιση προφίλ ούτως ή άλλως", "limited_account_hint.title": "Αυτό το προφίλ έχει αποκρυφτεί από τους διαχειριστές του διακομιστή {domain}.", + "link_preview.author": "Από {name}", + "link_preview.more_from_author": "Περισσότερα από {name}", + "link_preview.shares": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}", "lists.account.add": "Πρόσθεσε στη λίστα", "lists.account.remove": "Βγάλε από τη λίστα", "lists.delete": "Διαγραφή λίστας", "lists.edit": "Επεξεργασία λίστας", "lists.edit.submit": "Αλλαγή τίτλου", + "lists.exclusive": "Απόκρυψη αυτών των αναρτήσεων από την αρχική", "lists.new.create": "Προσθήκη λίστας", "lists.new.title_placeholder": "Τίτλος νέας λίστα", "lists.replies_policy.followed": "Οποιοσδήποτε χρήστης που ακολουθείς", @@ -361,7 +428,19 @@ "loading_indicator.label": "Φόρτωση…", "media_gallery.toggle_visible": "{number, plural, one {Απόκρυψη εικόνας} 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": "Δε θα ξέρει ότι είναι σε σίγαση.", + "mute_modal.title": "Σίγαση χρήστη;", + "mute_modal.you_wont_see_mentions": "Δε θα βλέπεις τις αναρτήσεις που τον αναφέρουν.", + "mute_modal.you_wont_see_posts": "Μπορεί ακόμα να δει τις αναρτήσεις σου, αλλά δε θα βλέπεις τις δικές του.", + "name_and_others": "{name} και {count, plural, one {# ακόμη} other {# ακόμη}}", + "name_and_others_with_link": "{name} και {count, plural, one {# ακόμη} other {# ακόμη}}", "navigation_bar.about": "Σχετικά με", + "navigation_bar.advanced_interface": "Άνοιγμα σε προηγμένη διεπαφή ιστού", "navigation_bar.blocks": "Αποκλεισμένοι χρήστες", "navigation_bar.bookmarks": "Σελιδοδείκτες", "navigation_bar.community_timeline": "Τοπική ροή", @@ -370,6 +449,7 @@ "navigation_bar.discover": "Ανακάλυψη", "navigation_bar.domain_blocks": "Αποκλεισμένοι τομείς", "navigation_bar.explore": "Εξερεύνηση", + "navigation_bar.favourites": "Αγαπημένα", "navigation_bar.filters": "Αποσιωπημένες λέξεις", "navigation_bar.follow_requests": "Αιτήματα ακολούθησης", "navigation_bar.followed_tags": "Ετικέτες που ακολουθούνται", @@ -386,22 +466,49 @@ "navigation_bar.security": "Ασφάλεια", "not_signed_in_indicator.not_signed_in": "Πρέπει να συνδεθείς για να αποκτήσεις πρόσβαση σε αυτόν τον πόρο.", "notification.admin.report": "Ο/Η {name} ανέφερε τον {target}", + "notification.admin.report_account": "Ο χρήστης {name} ανέφερε {count, plural, one {μία ανάρτηση} other {# αναρτήσεις}} από {target} για {category}", + "notification.admin.report_account_other": "Ο χρήστης {name} ανέφερε {count, plural, one {μία ανάρτηση} other {# αναρτήσεις}} από {target}", + "notification.admin.report_statuses": "Ο χρήστης {name} ανέφερε τον χρήστη {target} για {category}", + "notification.admin.report_statuses_other": "Ο χρήστης {name} ανέφερε τον χρήστη {target}", "notification.admin.sign_up": "{name} έχει εγγραφεί", "notification.favourite": "{name} favorited your post\n{name} προτίμησε την ανάρτηση σου", "notification.follow": "Ο/Η {name} σε ακολούθησε", "notification.follow_request": "Ο/H {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.poll": "Μία ψηφοφορία στην οποία συμμετείχες έχει τελειώσει", + "notification.private_mention": "{name} σέ επισήμανε ιδιωτικά", "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": "Αποδοχή", + "notification_requests.dismiss": "Απόρριψη", + "notification_requests.notifications_from": "Ειδοποιήσεις από {name}", + "notification_requests.title": "Φιλτραρισμένες ειδοποιήσεις", "notifications.clear": "Καθαρισμός ειδοποιήσεων", "notifications.clear_confirmation": "Σίγουρα θέλεις να καθαρίσεις μόνιμα όλες τις ειδοποιήσεις σου;", "notifications.column_settings.admin.report": "Νέες αναφορές:", "notifications.column_settings.admin.sign_up": "Νέες εγγραφές:", "notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας", + "notifications.column_settings.beta.category": "Πειραματικές λειτουργίες", + "notifications.column_settings.beta.grouping": "Ομαδοποίηση ειδοποιήσεων", "notifications.column_settings.favourite": "Αγαπημένα:", + "notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών", + "notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου", "notifications.column_settings.follow": "Νέοι ακόλουθοι:", "notifications.column_settings.follow_request": "Νέο αίτημα ακολούθησης:", "notifications.column_settings.mention": "Επισημάνσεις:", @@ -416,6 +523,7 @@ "notifications.column_settings.update": "Επεξεργασίες:", "notifications.filter.all": "Όλες", "notifications.filter.boosts": "Προωθήσεις", + "notifications.filter.favourites": "Αγαπημένα", "notifications.filter.follows": "Ακολουθείς", "notifications.filter.mentions": "Επισημάνσεις", "notifications.filter.polls": "Αποτελέσματα δημοσκόπησης", @@ -426,6 +534,15 @@ "notifications.permission_denied": "Οι ειδοποιήσεις στην επιφάνεια εργασίας δεν είναι διαθέσιμες διότι έχει απορριφθεί κάποιο προηγούμενο αίτημα άδειας", "notifications.permission_denied_alert": "Δεν είναι δυνατή η ενεργοποίηση των ειδοποιήσεων της επιφάνειας εργασίας, καθώς η άδεια του προγράμματος περιήγησης έχει απορριφθεί νωρίτερα", "notifications.permission_required": "Οι ειδοποιήσεις δεν είναι διαθέσιμες επειδή δεν έχει δοθεί η απαιτούμενη άδεια.", + "notifications.policy.filter_new_accounts.hint": "Δημιουργήθηκε εντός {days, plural, one {της τελευταίας ημέρας} other {των τελευταίων # ημερών}}", + "notifications.policy.filter_new_accounts_title": "Νέοι λογαριασμοί", + "notifications.policy.filter_not_followers_hint": "Συμπεριλαμβανομένων των ατόμων που σας έχουν ακολουθήσει λιγότερο από {days, plural, one {μια ημέρα} 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": "Για να λαμβάνεις ειδοποιήσεις όταν το Mastodon δεν είναι ανοιχτό, ενεργοποίησε τις ειδοποιήσεις επιφάνειας εργασίας. Μπορείς να ελέγξεις με ακρίβεια ποιοι τύποι αλληλεπιδράσεων δημιουργούν ειδοποιήσεις επιφάνειας εργασίας μέσω του κουμπιού {icon} μόλις ενεργοποιηθούν.", "notifications_permission_banner.title": "Μη χάσεις στιγμή", @@ -433,8 +550,15 @@ "onboarding.actions.back": "Επιστροφή", "onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_home": "Πηγαίνετε στην αρχική σας ροή", + "onboarding.compose.template": "Γειά σου #Mastodon!", + "onboarding.follows.empty": "Δυστυχώς, δεν μπορούν να εμφανιστούν αποτελέσματα αυτή τη στιγμή. Μπορείς να προσπαθήσεις να χρησιμοποιήσεις την αναζήτηση ή να περιηγηθείς στη σελίδα εξερεύνησης για να βρεις άτομα να ακολουθήσεις ή να δοκιμάσεις ξανά αργότερα.", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Δημοφιλή στο Mastodon", + "onboarding.profile.discoverable": "Κάνε το προφίλ μου ανακαλύψιμο", + "onboarding.profile.discoverable_hint": "Όταν επιλέγεις την δυνατότητα ανακάλυψης στο Mastodon, οι αναρτήσεις σου μπορεί να εμφανιστούν στα αποτελέσματα αναζήτησης και τις τάσεις, και το προφίλ σου μπορεί να προτείνεται σε άτομα με παρόμοια ενδιαφέροντα με εσένα.", + "onboarding.profile.display_name": "Εμφανιζόμενο όνομα", + "onboarding.profile.display_name_hint": "Το πλήρες ή το διασκεδαστικό σου όνομα…", + "onboarding.profile.lead": "Μπορείς πάντα να το ολοκληρώσεις αργότερα στις ρυθμίσεις, όπου είναι διαθέσιμες ακόμα περισσότερες επιλογές προσαρμογής.", "onboarding.profile.note": "Βιογραφικό", "onboarding.profile.note_hint": "Μπορείτε να @αναφέρετε άλλα άτομα ή #hashtags…", "onboarding.profile.save_and_continue": "Αποθήκευση και συνέχεια", @@ -442,7 +566,9 @@ "onboarding.profile.upload_avatar": "Μεταφόρτωση εικόνας προφίλ", "onboarding.profile.upload_header": "Μεταφόρτωση κεφαλίδας προφίλ", "onboarding.share.lead": "Let people know how they can find you on Mastodon!\nΕνημερώστε άλλα άτομα πώς μπορούν να σας βρουν στο Mastodon!", + "onboarding.share.message": "Με λένε {username} στο #Mastodon! Έλα να με ακολουθήσεις στο {url}", "onboarding.share.next_steps": "Πιθανά επόμενα βήματα:", + "onboarding.share.title": "Κοινοποίηση του προφίλ σου", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", "onboarding.start.skip": "Want to skip right ahead?", "onboarding.start.title": "You've made it!\nΤα καταφέρατε!", @@ -454,6 +580,10 @@ "onboarding.steps.setup_profile.title": "Customize your profile", "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.tips.2fa": "Το ήξερες; Μπορείς να ασφαλίσεις το λογαριασμό σου ρυθμίζοντας ταυτότητα δύο παραγόντων στις ρυθμίσεις του λογαριασμού σου. Λειτουργεί με οποιαδήποτε εφαρμογή TOTP της επιλογής σας, δεν απαιτείται αριθμός τηλεφώνου!", + "onboarding.tips.accounts_from_other_servers": "Το ήξερες; Από τη στιγμή που το Mastodon είναι αποκεντρωμένο, κάποια προφίλ που συναντάς θα φιλοξενούνται σε διακομιστές διαφορετικούς από τον δικό σου. Και παρόλα αυτά μπορείς να αλληλεπιδράσεις μαζί τους απρόσκοπτα! Ο διακομιστής τους είναι στο δεύτερο μισό του ονόματος χρήστη!", + "onboarding.tips.migration": "Το ήξερες; Αν αισθάνεσαι ότι το {domain} δεν είναι η κατάλληλη επιλογή διακομιστή για σένα στο μέλλον, μπορείς να μετακινηθείς σε άλλο διακομιστή Mastodon χωρίς να χάσεις τους ακόλουθούς σου. Μπορείς να κάνεις ακόμα και τον δικό σου διακομιστή!", + "onboarding.tips.verification": "Το ήξερες; Μπορείς να επαληθεύσεις τον λογαριασμό σου βάζοντας έναν σύνδεσμο του προφίλ σου στο Mastodon στην ιστοσελίδα σου και να προσθέσεις την ιστοσελίδα στο προφίλ σου. Χωρίς έξοδα ή έγγραφα!", "password_confirmation.exceeds_maxlength": "Η επιβεβαίωση κωδικού πρόσβασης υπερβαίνει το μέγιστο μήκος κωδικού πρόσβασης", "password_confirmation.mismatching": "Η επιβεβαίωση του κωδικού πρόσβασης δε συμπίπτει", "picture_in_picture.restore": "Βάλε το πίσω", @@ -472,7 +602,11 @@ "privacy.direct.short": "Συγκεκριμένα άτομα", "privacy.private.long": "Μόνο οι ακόλουθοί σας", "privacy.private.short": "Ακόλουθοι", + "privacy.public.long": "Όλοι εντός και εκτός του Mastodon", "privacy.public.short": "Δημόσιο", + "privacy.unlisted.additional": "Αυτό συμπεριφέρεται ακριβώς όπως το δημόσιο, εκτός από το ότι η ανάρτηση δεν θα εμφανιστεί σε ζωντανές ροές ή ετικέτες, εξερεύνηση ή αναζήτηση στο Mastodon, ακόμη και αν το έχεις επιλέξει για τον λογαριασμό σου.", + "privacy.unlisted.long": "Λιγότερα αλγοριθμικά κόλπα", + "privacy.unlisted.short": "Ήσυχα δημόσια", "privacy_policy.last_updated": "Τελευταία ενημέρωση {date}", "privacy_policy.title": "Πολιτική Απορρήτου", "recommended": "Προτεινόμενα", @@ -490,6 +624,7 @@ "relative_time.minutes": "{number}λ", "relative_time.seconds": "{number}δ", "relative_time.today": "σήμερα", + "reply_indicator.attachments": "{count, plural, one {# συνημμένο} other {# συνημμένα}}", "reply_indicator.cancel": "Άκυρο", "reply_indicator.poll": "Δημοσκόπηση", "report.block": "Αποκλεισμός", @@ -533,9 +668,14 @@ "report.unfollow": "Κατάργηση ακολούθησης του @{name}", "report.unfollow_explanation": "Ακολουθείς αυτό τον λογαριασμό. Για να μη βλέπεις τις αναρτήσεις τους στη δική σου ροή, πάψε να τον ακολουθείς.", "report_notification.attached_statuses": "{count, plural, one {{count} ανάρτηση} other {{count} αναρτήσεις}} επισυνάπτονται", + "report_notification.categories.legal": "Νομικά", + "report_notification.categories.legal_sentence": "παράνομο περιεχόμενο", "report_notification.categories.other": "Άλλες", + "report_notification.categories.other_sentence": "άλλο", "report_notification.categories.spam": "Ανεπιθύμητα", + "report_notification.categories.spam_sentence": "ανεπιθύμητα", "report_notification.categories.violation": "Παραβίαση κανόνα", + "report_notification.categories.violation_sentence": "παραβίαση κανόνα", "report_notification.open": "Ανοιχτή αναφορά", "search.no_recent_searches": "Καμία πρόσφατη αναζήτηση", "search.placeholder": "Αναζήτηση", @@ -545,8 +685,13 @@ "search.quick_action.open_url": "Άνοιγμα διεύθυνσης URL στο Mastodon", "search.quick_action.status_search": "Αναρτήσεις που ταιριάζουν με {x}", "search.search_or_paste": "Αναζήτηση ή εισαγωγή URL", + "search_popout.full_text_search_disabled_message": "Μη διαθέσιμο στο {domain}.", + "search_popout.full_text_search_logged_out_message": "Διαθέσιμο μόνο όταν συνδεθείς.", + "search_popout.language_code": "Κωδικός γλώσσας ISO", + "search_popout.options": "Επιλογές αναζήτησης", "search_popout.quick_actions": "Γρήγορες ενέργειες", "search_popout.recent": "Πρόσφατες αναζητήσεις", + "search_popout.specific_date": "συγκεκριμένη ημερομηνία", "search_popout.user": "χρήστης", "search_results.accounts": "Προφίλ", "search_results.all": "Όλα", @@ -558,8 +703,11 @@ "server_banner.about_active_users": "Άτομα που χρησιμοποιούν αυτόν τον διακομιστή κατά τις τελευταίες 30 ημέρες (Μηνιαία Ενεργοί Χρήστες)", "server_banner.active_users": "ενεργοί χρήστες", "server_banner.administered_by": "Διαχειριστής:", + "server_banner.is_one_of_many": "Το {domain} είναι ένας από τους πολλούς ανεξάρτητους διακομιστές Mastodon που μπορείς να χρησιμοποιήσεις για να συμμετάσχεις στο fediverse.", "server_banner.server_stats": "Στατιστικά διακομιστή:", "sign_in_banner.create_account": "Δημιουργία λογαριασμού", + "sign_in_banner.follow_anyone": "Ακολούθησε οποιονδήποτε κατά μήκος του fediverse και δες τα όλα με χρονολογική σειρά. Δεν υπάρχουν αλγόριθμοι, διαφημίσεις ή clickbait ούτε για δείγμα.", + "sign_in_banner.mastodon_is": "Το Mastodon είναι ο καλύτερος τρόπος για να συμβαδίσεις με τα γεγονότα.", "sign_in_banner.sign_in": "Σύνδεση", "sign_in_banner.sso_redirect": "Συνδεθείτε ή Εγγραφείτε", "status.admin_account": "Άνοιγμα διεπαφής συντονισμού για τον/την @{name}", @@ -575,15 +723,19 @@ "status.direct": "Ιδιωτική επισήμανση @{name}", "status.direct_indicator": "Ιδιωτική επισήμανση", "status.edit": "Επεξεργασία", + "status.edited": "Τελευταία επεξεργασία {date}", "status.edited_x_times": "Επεξεργάστηκε {count, plural, one {{count} φορά} other {{count} φορές}}", "status.embed": "Ενσωμάτωσε", "status.favourite": "Αγαπημένα", + "status.favourites": "{count, plural, one {# αγαπημένο} other {# αγαπημένα}}", "status.filter": "Φιλτράρισμα αυτής της ανάρτησης", "status.filtered": "Φιλτραρισμένα", "status.hide": "Απόκρυψη ανάρτησης", "status.history.created": "{name} δημιούργησε στις {date}", "status.history.edited": "{name} επεξεργάστηκε στις {date}", "status.load_more": "Φόρτωσε περισσότερα", + "status.media.open": "Κάνε κλικ για άνοιγμα", + "status.media.show": "Κάνε κλικ για εμφάνιση", "status.media_hidden": "Κρυμμένο πολυμέσο", "status.mention": "Επισήμανε @{name}", "status.more": "Περισσότερα", @@ -596,6 +748,7 @@ "status.reblog": "Ενίσχυση", "status.reblog_private": "Ενίσχυση με αρχική ορατότητα", "status.reblogged_by": "{name} προώθησε", + "status.reblogs": "{count, plural, one {# ενίσχυση} other {# ενισχύσεις}}", "status.reblogs.empty": "Κανείς δεν ενίσχυσε αυτή την ανάρτηση ακόμα. Μόλις το κάνει κάποιος, θα εμφανιστεί εδώ.", "status.redraft": "Σβήσε & ξαναγράψε", "status.remove_bookmark": "Αφαίρεση σελιδοδείκτη", @@ -614,6 +767,7 @@ "status.title.with_attachments": "{user} δημοσίευσε {attachmentCount, plural, one {ένα συνημμένο} other {{attachmentCount} συνημμένα}}", "status.translate": "Μετάφραση", "status.translated_from_with": "Μεταφράστηκε από {lang} χρησιμοποιώντας {provider}", + "status.uncached_media_warning": "Μη διαθέσιμη προεπισκόπηση", "status.unmute_conversation": "Αναίρεση σίγασης συνομιλίας", "status.unpin": "Ξεκαρφίτσωσε από το προφίλ", "subscribed_languages.lead": "Μόνο αναρτήσεις σε επιλεγμένες γλώσσες θα εμφανίζονται στην αρχική σου και θα παραθέτονται χρονοδιαγράμματα μετά την αλλαγή. Επέλεξε καμία για να λαμβάνεις αναρτήσεις σε όλες τις γλώσσες.", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 108880cc97f..eaf4f9465b6 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -35,9 +35,9 @@ "account.follow_back": "Follow back", "account.followers": "Followers", "account.followers.empty": "No one follows this user yet.", - "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", + "account.followers_counter": "{count, plural, one {{counter} follower} other {{counter} followers}}", "account.following": "Following", - "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", + "account.following_counter": "{count, plural, one {{counter} following} other {{counter} following}}", "account.follows.empty": "This user doesn't follow anyone yet.", "account.go_to_profile": "Go to profile", "account.hide_reblogs": "Hide boosts from @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} has requested to follow you", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show boosts from @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}", + "account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} posts}}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unblock domain {domain}", "account.unblock_short": "Unblock", @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Content warning (optional)", "confirmation_modal.cancel": "Cancel", "confirmations.block.confirm": "Block", - "confirmations.cancel_follow_request.confirm": "Withdraw request", - "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?", "confirmations.delete.confirm": "Delete", "confirmations.delete.message": "Are you sure you want to delete this post?", "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", - "confirmations.domain_block.confirm": "Block server", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.edit.confirm": "Edit", "confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.logout.confirm": "Log out", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Use an existing category or create a new one", "filter_modal.select_filter.title": "Filter this post", "filter_modal.title.status": "Filter a post", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}", - "filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no one} one {one person} other {# people}} you may know", "filtered_notifications_banner.title": "Filtered notifications", "firehose.all": "All", "firehose.local": "This server", @@ -414,6 +408,8 @@ "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}", + "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} posts}}", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -441,6 +437,8 @@ "mute_modal.title": "Mute user?", "mute_modal.you_wont_see_mentions": "You won't see posts that mention them.", "mute_modal.you_wont_see_posts": "They can still see your posts, but you won't see theirs.", + "name_and_others": "{name} and {count, plural, one {# other} other {# others}}", + "name_and_others_with_link": "{name} and {count, plural, one {# other} other {# others}}", "navigation_bar.about": "About", "navigation_bar.advanced_interface": "Open in advanced web interface", "navigation_bar.blocks": "Blocked users", @@ -468,6 +466,10 @@ "navigation_bar.security": "Security", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", "notification.admin.report": "{name} reported {target}", + "notification.admin.report_account": "{name} reported {count, plural, one {one post} other {# posts}} from {target} for {category}", + "notification.admin.report_account_other": "{name} reported {count, plural, one {one post} other {# posts}} from {target}", + "notification.admin.report_statuses": "{name} reported {target} for {category}", + "notification.admin.report_statuses_other": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favourited your post", "notification.follow": "{name} followed you", @@ -483,7 +485,8 @@ "notification.moderation_warning.action_silence": "Your account has been limited.", "notification.moderation_warning.action_suspend": "Your account has been suspended.", "notification.own_poll": "Your poll has ended", - "notification.poll": "A poll you have voted in has ended", + "notification.poll": "A poll you voted in has ended", + "notification.private_mention": "{name} privately mentioned you", "notification.reblog": "{name} boosted your status", "notification.relationships_severance_event": "Lost connections with {name}", "notification.relationships_severance_event.account_suspension": "An admin from {from} has suspended {target}, which means you can no longer receive updates from them or interact with them.", @@ -501,6 +504,8 @@ "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.beta.category": "Experimental features", + "notifications.column_settings.beta.grouping": "Group notifications", "notifications.column_settings.favourite": "Favourites:", "notifications.column_settings.filter_bar.advanced": "Display all categories", "notifications.column_settings.filter_bar.category": "Quick filter bar", @@ -664,9 +669,13 @@ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "illegal content", "report_notification.categories.other": "Other", + "report_notification.categories.other_sentence": "other", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Rule violation", + "report_notification.categories.violation_sentence": "rule violation", "report_notification.open": "Open report", "search.no_recent_searches": "No recent searches", "search.placeholder": "Search", @@ -694,8 +703,11 @@ "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)", "server_banner.active_users": "active users", "server_banner.administered_by": "Administered by:", + "server_banner.is_one_of_many": "{domain} is one of the many independent Mastodon servers you can use to participate in the fediverse.", "server_banner.server_stats": "Server stats:", "sign_in_banner.create_account": "Create account", + "sign_in_banner.follow_anyone": "Follow anyone across the fediverse and see it all in chronological order. No algorithms, ads, or clickbait in sight.", + "sign_in_banner.mastodon_is": "Mastodon is the best way to keep up with what's happening.", "sign_in_banner.sign_in": "Sign in", "sign_in_banner.sso_redirect": "Login or Register", "status.admin_account": "Open moderation interface for @{name}", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index f0c27ad7068..e9a1d1899fc 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -35,9 +35,9 @@ "account.follow_back": "Follow back", "account.followers": "Followers", "account.followers.empty": "No one follows this user yet.", - "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", + "account.followers_counter": "{count, plural, one {{counter} follower} other {{counter} followers}}", "account.following": "Following", - "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", + "account.following_counter": "{count, plural, one {{counter} following} other {{counter} following}}", "account.follows.empty": "This user doesn't follow anyone yet.", "account.go_to_profile": "Go to profile", "account.hide_reblogs": "Hide boosts from @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} has requested to follow you", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show boosts from @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}", + "account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} posts}}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unblock domain {domain}", "account.unblock_short": "Unblock", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Content warning (optional)", "confirmation_modal.cancel": "Cancel", "confirmations.block.confirm": "Block", - "confirmations.cancel_follow_request.confirm": "Withdraw request", - "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?", "confirmations.delete.confirm": "Delete", "confirmations.delete.message": "Are you sure you want to delete this post?", + "confirmations.delete.title": "Delete post?", "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.delete_list.title": "Delete list?", "confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", - "confirmations.domain_block.confirm": "Block server", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.edit.confirm": "Edit", "confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.edit.title": "Overwrite post?", "confirmations.logout.confirm": "Log out", "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.title": "Log out?", "confirmations.mute.confirm": "Mute", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.redraft.title": "Delete & redraft post?", "confirmations.reply.confirm": "Reply", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.reply.title": "Overwrite post?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "confirmations.unfollow.title": "Unfollow user?", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Use an existing category or create a new one", "filter_modal.select_filter.title": "Filter this post", "filter_modal.title.status": "Filter a post", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}", - "filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no one} one {one person} other {# people}} you may know", + "filtered_notifications_banner.pending_requests": "From {count, plural, =0 {no one} one {one person} other {# people}} you may know", "filtered_notifications_banner.title": "Filtered notifications", "firehose.all": "All", "firehose.local": "This server", @@ -443,6 +445,8 @@ "mute_modal.title": "Mute user?", "mute_modal.you_wont_see_mentions": "You won't see posts that mention them.", "mute_modal.you_wont_see_posts": "They can still see your posts, but you won't see theirs.", + "name_and_others": "{name} and {count, plural, one {# other} other {# others}}", + "name_and_others_with_link": "{name} and {count, plural, one {# other} other {# others}}", "navigation_bar.about": "About", "navigation_bar.advanced_interface": "Open in advanced web interface", "navigation_bar.blocks": "Blocked users", @@ -470,6 +474,10 @@ "navigation_bar.security": "Security", "not_signed_in_indicator.not_signed_in": "You need to login to access this resource.", "notification.admin.report": "{name} reported {target}", + "notification.admin.report_account": "{name} reported {count, plural, one {one post} other {# posts}} from {target} for {category}", + "notification.admin.report_account_other": "{name} reported {count, plural, one {one post} other {# posts}} from {target}", + "notification.admin.report_statuses": "{name} reported {target} for {category}", + "notification.admin.report_statuses_other": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.favourite": "{name} favorited your post", "notification.follow": "{name} followed you", @@ -485,7 +493,8 @@ "notification.moderation_warning.action_silence": "Your account has been limited.", "notification.moderation_warning.action_suspend": "Your account has been suspended.", "notification.own_poll": "Your poll has ended", - "notification.poll": "A poll you have voted in has ended", + "notification.poll": "A poll you voted in has ended", + "notification.private_mention": "{name} privately mentioned you", "notification.reblog": "{name} boosted your post", "notification.relationships_severance_event": "Lost connections with {name}", "notification.relationships_severance_event.account_suspension": "An admin from {from} has suspended {target}, which means you can no longer receive updates from them or interact with them.", @@ -496,13 +505,18 @@ "notification.update": "{name} edited a post", "notification_requests.accept": "Accept", "notification_requests.dismiss": "Dismiss", + "notification_requests.maximize": "Maximize", + "notification_requests.minimize_banner": "Minimize filtered notifications banner", "notification_requests.notifications_from": "Notifications from {name}", "notification_requests.title": "Filtered notifications", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.clear_title": "Clear notifications?", "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.beta.category": "Experimental features", + "notifications.column_settings.beta.grouping": "Group notifications", "notifications.column_settings.favourite": "Favorites:", "notifications.column_settings.filter_bar.advanced": "Display all categories", "notifications.column_settings.filter_bar.category": "Quick filter bar", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "illegal content", "report_notification.categories.other": "Other", + "report_notification.categories.other_sentence": "other", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Rule violation", + "report_notification.categories.violation_sentence": "rule violation", "report_notification.open": "Open report", "search.no_recent_searches": "No recent searches", "search.placeholder": "Search", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index bab277b4832..de91fb39dce 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -35,9 +35,7 @@ "account.follow_back": "Sekvu reen", "account.followers": "Sekvantoj", "account.followers.empty": "Ankoraŭ neniu sekvas ĉi tiun uzanton.", - "account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}", "account.following": "Sekvatoj", - "account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}", "account.follows.empty": "La uzanto ankoraŭ ne sekvas iun ajn.", "account.go_to_profile": "Iri al profilo", "account.hide_reblogs": "Kaŝi diskonigojn de @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} petis sekvi vin", "account.share": "Diskonigi la profilon de @{name}", "account.show_reblogs": "Montri diskonigojn de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Afiŝo} other {{counter} Afiŝoj}}", "account.unblock": "Malbloki @{name}", "account.unblock_domain": "Malbloki la domajnon {domain}", "account.unblock_short": "Malbloki", @@ -153,15 +150,12 @@ "compose_form.spoiler.unmarked": "Aldoni averton de enhavo", "confirmation_modal.cancel": "Nuligi", "confirmations.block.confirm": "Bloki", - "confirmations.cancel_follow_request.confirm": "Eksigi peton", - "confirmations.cancel_follow_request.message": "Ĉu vi certas ke vi volas eksigi vian peton por sekvi {name}?", "confirmations.delete.confirm": "Forigi", "confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun afiŝon?", "confirmations.delete_list.confirm": "Forigi", "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?", "confirmations.discard_edit_media.confirm": "Forĵeti", "confirmations.discard_edit_media.message": "Vi havas nekonservitajn ŝanĝojn de la priskribo aŭ la antaŭmontro de la plurmedio, ĉu vi forĵetu ilin malgraŭe?", - "confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas. Vi ne vidos enhavon de tiu domajno en publika templinio aŭ en viaj sciigoj. Viaj sekvantoj de tiu domajno estos forigitaj.", "confirmations.edit.confirm": "Redakti", "confirmations.edit.message": "Redakti nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.logout.confirm": "Adiaŭi", @@ -408,7 +402,6 @@ "notification.follow_request": "{name} petis sekvi vin", "notification.mention": "{name} menciis vin", "notification.own_poll": "Via enketo finiĝis", - "notification.poll": "Partoprenita balotenketo finiĝis", "notification.reblog": "{name} diskonigis vian afiŝon", "notification.status": "{name} ĵus afiŝis", "notification.update": "{name} redaktis afiŝon", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 7da39b88ccf..2a86e789a45 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -37,7 +37,7 @@ "account.followers.empty": "Todavía nadie sigue a este usuario.", "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}", "account.following": "Siguiendo", - "account.following_counter": "{count, plural, other {Siguiendo a {counter}}}", + "account.following_counter": "{count, plural, one {siguiendo a {counter}} other {siguiendo a {counter}}}", "account.follows.empty": "Todavía este usuario no sigue a nadie.", "account.go_to_profile": "Ir al perfil", "account.hide_reblogs": "Ocultar adhesiones de @{name}", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar solicitud", - "confirmations.cancel_follow_request.message": "¿Estás seguro que querés retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "¿Estás seguro que querés eliminar este mensaje?", + "confirmations.delete.title": "¿Eliminar mensaje?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?", + "confirmations.delete_list.title": "¿Eliminar lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tenés cambios sin guardar en la descripción de medios o en la vista previa, ¿querés descartarlos de todos modos?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "¿Estás completamente seguro que querés bloquear el {domain} entero? En la mayoría de los casos, unos cuantos bloqueos y silenciados puntuales son suficientes y preferibles. No vas a ver contenido de ese dominio en ninguna de tus líneas temporales o en tus notificaciones. Tus seguidores de ese dominio serán quitados.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", + "confirmations.edit.title": "¿Sobrescribir mensaje?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?", + "confirmations.logout.title": "¿Cerrar sesión?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Eliminar mensaje original y editarlo", "confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.", + "confirmations.redraft.title": "¿Eliminar y volver a redactar mensaje?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", + "confirmations.reply.title": "¿Sobrescribir mensaje?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?", + "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", "conversation.delete": "Eliminar conversación", "conversation.mark_as_read": "Marcar como leída", "conversation.open": "Ver conversación", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar este mensaje", "filter_modal.title.status": "Filtrar un mensaje", - "filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}", - "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todos", "firehose.local": "Este servidor", @@ -443,6 +445,8 @@ "mute_modal.title": "¿Silenciar usuario?", "mute_modal.you_wont_see_mentions": "No verás mensajes que los mencionen.", "mute_modal.you_wont_see_posts": "Todavía pueden ver tus mensajes, pero vos no verás los suyos.", + "name_and_others": "{name} y {count, plural, one {# cuenta más} other {# cuentas más}}", + "name_and_others_with_link": "{name} y {count, plural, one {# cuenta más} other {# cuentas más}}", "navigation_bar.about": "Información", "navigation_bar.advanced_interface": "Abrir en interface web avanzada", "navigation_bar.blocks": "Usuarios bloqueados", @@ -470,6 +474,10 @@ "navigation_bar.security": "Seguridad", "not_signed_in_indicator.not_signed_in": "Necesitás iniciar sesión para acceder a este recurso.", "notification.admin.report": "{name} denunció a {target}", + "notification.admin.report_account": "{name} denunció {count, plural, one {un mensaje} other {# mensajes}} de {target} por {category}", + "notification.admin.report_account_other": "{name} denunció {count, plural, one {un mensaje} other {# mensajes}} de {target}", + "notification.admin.report_statuses": "{name} denunció a {target} por {category}", + "notification.admin.report_statuses_other": "{name} denunció a {target}", "notification.admin.sign_up": "Se registró {name}", "notification.favourite": "{name} marcó tu mensaje como favorito", "notification.follow": "{name} te empezó a seguir", @@ -486,6 +494,7 @@ "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.private_mention": "{name} te mencionó en privado", "notification.reblog": "{name} adhirió a tu mensaje", "notification.relationships_severance_event": "Conexiones perdidas con {name}", "notification.relationships_severance_event.account_suspension": "Un administrador de {from} suspendió a {target}, lo que significa que ya no podés recibir actualizaciones de esa cuenta o interactuar con la misma.", @@ -496,13 +505,18 @@ "notification.update": "{name} editó un mensaje", "notification_requests.accept": "Aceptar", "notification_requests.dismiss": "Descartar", + "notification_requests.maximize": "Maximizar", + "notification_requests.minimize_banner": "Minimizar la barra de notificaciones filtradas", "notification_requests.notifications_from": "Notificaciones de {name}", "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?", + "notifications.clear_title": "¿Limpiar notificaciones?", "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", + "notifications.column_settings.beta.category": "Funciones experimentales", + "notifications.column_settings.beta.grouping": "Agrupar notificaciones", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Estás siguiendo a esta cuenta. Para no ver sus mensajes en tu línea temporal principal, dejá de seguirla.", "report_notification.attached_statuses": "{count, plural, one {{count} mensaje adjunto} other {{count} mensajes adjuntos}}", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "contenido ilegal", "report_notification.categories.other": "Otros", + "report_notification.categories.other_sentence": "[otras categorías]", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Violación de regla", + "report_notification.categories.violation_sentence": "violación de regla", "report_notification.open": "Abrir denuncia", "search.no_recent_searches": "Sin búsquedas recientes", "search.placeholder": "Buscar", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index d3e02cd6e11..7fe0ae1ba1a 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -35,9 +35,9 @@ "account.follow_back": "Seguir también", "account.followers": "Seguidores", "account.followers.empty": "Todavía nadie sigue a este usuario.", - "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}", + "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}", "account.following": "Siguiendo", - "account.following_counter": "{count, plural, other {{counter} Siguiendo}}", + "account.following_counter": "{count, plural, one {{counter} siguiendo} other {{counter} siguiendo}}", "account.follows.empty": "Este usuario todavía no sigue a nadie.", "account.go_to_profile": "Ir al perfil", "account.hide_reblogs": "Ocultar retoots de @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} ha solicitado seguirte", "account.share": "Compartir el perfil de @{name}", "account.show_reblogs": "Mostrar retoots de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", + "account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}", "account.unblock": "Desbloquear a @{name}", "account.unblock_domain": "Mostrar a {domain}", "account.unblock_short": "Desbloquear", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar solicitud", - "confirmations.cancel_follow_request.message": "¿Estás seguro de que deseas retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?", + "confirmations.delete.title": "¿Eliminar publicación?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", + "confirmations.delete_list.title": "¿Eliminar lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo, ¿deseas descartarlos de cualquier manera?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", + "confirmations.edit.title": "¿Sobrescribir publicación?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?", + "confirmations.logout.title": "¿Cerrar sesión?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.", + "confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", + "confirmations.reply.title": "¿Sobrescribir publicación?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", + "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar una publicación", - "filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}", - "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", @@ -443,6 +445,8 @@ "mute_modal.title": "¿Silenciar usuario?", "mute_modal.you_wont_see_mentions": "No verás publicaciones que los mencionen.", "mute_modal.you_wont_see_posts": "Todavía pueden ver tus publicaciones, pero tú no verás las de ellos.", + "name_and_others": "{name} y {count, plural, one {# más} other {# más}}", + "name_and_others_with_link": "{name} y {count, plural, one {# más} other {# más}}", "navigation_bar.about": "Acerca de", "navigation_bar.advanced_interface": "Abrir en interfaz web avanzada", "navigation_bar.blocks": "Usuarios bloqueados", @@ -470,6 +474,10 @@ "navigation_bar.security": "Seguridad", "not_signed_in_indicator.not_signed_in": "Necesitas iniciar sesión para acceder a este recurso.", "notification.admin.report": "{name} denunció a {target}", + "notification.admin.report_account": "{name} informó de {count, plural, one {una publicación} other {# publicaciones}} de {target} por {category}", + "notification.admin.report_account_other": "{name} informó de {count, plural, one {una publicación} other {# publicaciones}} de {target}", + "notification.admin.report_statuses": "{name} informó de {target} por {category}", + "notification.admin.report_statuses_other": "{name} informó de {target}", "notification.admin.sign_up": "{name} se unio", "notification.favourite": "{name} marcó como favorita tu publicación", "notification.follow": "{name} te empezó a seguir", @@ -485,7 +493,8 @@ "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.poll": "Una encuesta ha terminado", + "notification.private_mention": "{name} te mencionó en privado", "notification.reblog": "{name} ha retooteado tu estado", "notification.relationships_severance_event": "Conexiones perdidas con {name}", "notification.relationships_severance_event.account_suspension": "Un administrador de {from} ha suspendido {target}, lo que significa que ya no puedes recibir actualizaciones de sus cuentas o interactuar con ellas.", @@ -500,9 +509,12 @@ "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Seguro de querer borrar permanentemente todas tus notificaciones?", + "notifications.clear_title": "¿Borrar notificaciones?", "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Registros nuevos:", "notifications.column_settings.alert": "Notificaciones de escritorio", + "notifications.column_settings.beta.category": "Características experimentales", + "notifications.column_settings.beta.grouping": "Agrupar notificaciones", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", @@ -666,9 +678,13 @@ "report.unfollow_explanation": "Estás siguiendo esta cuenta. Para no ver sus publicaciones en tu inicio, deja de seguirla.", "report_notification.attached_statuses": "{count, plural, one {{count} publicación} other {{count} publicaciones}} adjunta(s)", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "contenido ilegal", "report_notification.categories.other": "Otro", + "report_notification.categories.other_sentence": "otra", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Infracción de regla", + "report_notification.categories.violation_sentence": "infracción de regla", "report_notification.open": "Abrir denuncia", "search.no_recent_searches": "Sin búsquedas recientes", "search.placeholder": "Buscar", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 849e0fa27f1..3fb1cdf0945 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -35,9 +35,9 @@ "account.follow_back": "Seguir también", "account.followers": "Seguidores", "account.followers.empty": "Todavía nadie sigue a este usuario.", - "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}", + "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}", "account.following": "Siguiendo", - "account.following_counter": "{count, plural, other {Siguiendo a {counter}}}", + "account.following_counter": "{count, plural, one {{counter} siguiendo} other {{counter} siguiendo}}", "account.follows.empty": "Este usuario todavía no sigue a nadie.", "account.go_to_profile": "Ir al perfil", "account.hide_reblogs": "Ocultar impulsos de @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} ha solicitado seguirte", "account.share": "Compartir el perfil de @{name}", "account.show_reblogs": "Mostrar impulsos de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}", + "account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}", "account.unblock": "Desbloquear a @{name}", "account.unblock_domain": "Desbloquear dominio {domain}", "account.unblock_short": "Desbloquear", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar solicitud", - "confirmations.cancel_follow_request.message": "¿Estás seguro de que deseas retirar tu solicitud para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "¿Estás seguro de que quieres borrar esta publicación?", + "confirmations.delete.title": "¿Eliminar publicación?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", + "confirmations.delete_list.title": "¿Eliminar lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo audiovisual, ¿descartarlos de todos modos?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "¿Seguro que quieres bloquear todo el dominio {domain}? En general, unos cuantos bloqueos y silenciados concretos es suficiente y preferible. No verás contenido del dominio en ninguna cronología pública ni en tus notificaciones. Se eliminarán tus seguidores procedentes de ese dominio.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar ahora reemplazará el mensaje que estás escribiendo. ¿Seguro que quieres proceder?", + "confirmations.edit.title": "¿Sobrescribir publicación?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Seguro que quieres cerrar la sesión?", + "confirmations.logout.title": "¿Cerrar sesión?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.", + "confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Seguro que deseas continuar?", + "confirmations.reply.title": "¿Sobrescribir publicación?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Seguro que quieres dejar de seguir a {name}?", + "confirmations.unfollow.title": "¿Dejar de seguir al usuario?", "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar una publicación", - "filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}", - "filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas", "filtered_notifications_banner.title": "Notificaciones filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", @@ -443,6 +445,8 @@ "mute_modal.title": "¿Silenciar usuario?", "mute_modal.you_wont_see_mentions": "No verás mensajes que los mencionen.", "mute_modal.you_wont_see_posts": "Todavía pueden ver tus publicaciones, pero tú no verás las suyas.", + "name_and_others": "{name} y {count, plural, one {# más} other {# más}}", + "name_and_others_with_link": "{name} y {count, plural, one {# más} other {# más}}", "navigation_bar.about": "Acerca de", "navigation_bar.advanced_interface": "Abrir en la interfaz web avanzada", "navigation_bar.blocks": "Usuarios bloqueados", @@ -470,6 +474,10 @@ "navigation_bar.security": "Seguridad", "not_signed_in_indicator.not_signed_in": "Necesitas iniciar sesión para acceder a este recurso.", "notification.admin.report": "{name} informó {target}", + "notification.admin.report_account": "{name} informó de {count, plural, one {una publicación} other {# publicaciones}} de {target} por {category}", + "notification.admin.report_account_other": "{name} informó de {count, plural, one {una publicación} other {# publicaciones}} de {target}", + "notification.admin.report_statuses": "{name} informó de {target} por {category}", + "notification.admin.report_statuses_other": "{name} informó de {target}", "notification.admin.sign_up": "{name} se registró", "notification.favourite": "{name} marcó como favorita tu publicación", "notification.follow": "{name} te empezó a seguir", @@ -485,7 +493,8 @@ "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.poll": "Una encuesta ha terminado", + "notification.private_mention": "{name} te mencionó en privado", "notification.reblog": "{name} ha impulsado tu publicación", "notification.relationships_severance_event": "Conexiones perdidas con {name}", "notification.relationships_severance_event.account_suspension": "Un administrador de {from} ha suspendido {target}, lo que significa que ya no puedes recibir actualizaciones de sus cuentas o interactuar con ellas.", @@ -500,9 +509,12 @@ "notification_requests.title": "Notificaciones filtradas", "notifications.clear": "Limpiar notificaciones", "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?", + "notifications.clear_title": "¿Borrar notificaciones?", "notifications.column_settings.admin.report": "Nuevos informes:", "notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.alert": "Notificaciones de escritorio", + "notifications.column_settings.beta.category": "Características experimentales", + "notifications.column_settings.beta.grouping": "Agrupar notificaciones", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", @@ -666,9 +678,13 @@ "report.unfollow_explanation": "Estás siguiendo esta cuenta. Para no ver sus publicaciones en tu muro de inicio, deja de seguirla.", "report_notification.attached_statuses": "{count, plural, one {{count} publicación} other {{count} publicaciones}} adjunta(s)", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "contenido ilegal", "report_notification.categories.other": "Otros", + "report_notification.categories.other_sentence": "otra", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Infracción de regla", + "report_notification.categories.violation_sentence": "infracción de regla", "report_notification.open": "Abrir informe", "search.no_recent_searches": "No hay búsquedas recientes", "search.placeholder": "Buscar", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 46e28b999bb..7369a89c462 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -35,9 +35,7 @@ "account.follow_back": "Jälgi vastu", "account.followers": "Jälgijad", "account.followers.empty": "Keegi ei jälgi veel seda kasutajat.", - "account.followers_counter": "{count, plural, one {{counter} jälgija} other {{counter} jälgijat}}", "account.following": "Jälgib", - "account.following_counter": "{count, plural, one {{counter} jälgitav} other {{counter} jälgitavat}}", "account.follows.empty": "See kasutaja ei jälgi veel kedagi.", "account.go_to_profile": "Mine profiilile", "account.hide_reblogs": "Peida @{name} jagamised", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} on taodelnud sinu jälgimist", "account.share": "Jaga @{name} profiili", "account.show_reblogs": "Näita @{name} jagamisi", - "account.statuses_counter": "{count, plural, one {{counter} postitus} other {{counter} postitust}}", "account.unblock": "Eemalda blokeering @{name}", "account.unblock_domain": "Tee {domain} nähtavaks", "account.unblock_short": "Eemalda blokeering", @@ -147,14 +144,14 @@ "compose.published.body": "Postitus avaldatud.", "compose.published.open": "Ava", "compose.saved.body": "Postitus salvestatud.", - "compose_form.direct_message_warning_learn_more": "Vaata täpsemalt", + "compose_form.direct_message_warning_learn_more": "Vaata lisa", "compose_form.encryption_warning": "Postitused Mastodonis ei ole otsast-otsani krüpteeritud. Ära jaga mingeid delikaatseid andmeid Mastodoni kaudu.", "compose_form.hashtag_warning": "See postitus ei ilmu ühegi märksõna all, kuna pole avalik. Vaid avalikud postitused on märksõnade kaudu leitavad.", "compose_form.lock_disclaimer": "Su konto ei ole {locked}. Igaüks saab sind jälgida, et näha su ainult-jälgijatele postitusi.", "compose_form.lock_disclaimer.lock": "lukus", "compose_form.placeholder": "Millest mõtled?", "compose_form.poll.duration": "Küsitluse kestus", - "compose_form.poll.multiple": "Valikvastustega", + "compose_form.poll.multiple": "Mitu vastust", "compose_form.poll.option_placeholder": "Valik {number}", "compose_form.poll.single": "Vali üks", "compose_form.poll.switch_to_multiple": "Muuda küsitlust mitmikvaliku lubamiseks", @@ -169,16 +166,12 @@ "compose_form.spoiler_placeholder": "Sisuhoiatus (valikuline)", "confirmation_modal.cancel": "Katkesta", "confirmations.block.confirm": "Blokeeri", - "confirmations.cancel_follow_request.confirm": "Tühista taotlus", - "confirmations.cancel_follow_request.message": "Oled kindel, et soovid kasutaja {name} jälgimistaotluse tagasi võtta?", "confirmations.delete.confirm": "Kustuta", "confirmations.delete.message": "Oled kindel, et soovid postituse kustutada?", "confirmations.delete_list.confirm": "Kustuta", "confirmations.delete_list.message": "Oled kindel, et soovid selle loetelu pöördumatult kustutada?", "confirmations.discard_edit_media.confirm": "Hülga", "confirmations.discard_edit_media.message": "Sul on salvestamata muudatusi meediakirjelduses või eelvaates, kas hülgad need?", - "confirmations.domain_block.confirm": "Blokeeri server", - "confirmations.domain_block.message": "Oled ikka päris-päris kindel, et soovid blokeerida terve {domain}? Enamikel juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatavam. Sa ei näe selle domeeni sisu ühelgi avalikul ajajoonel või enda teadetes. Su jälgijad sellest domeenist eemaldatakse.", "confirmations.edit.confirm": "Muuda", "confirmations.edit.message": "Muutes praegu kirjutatakse hetkel loodav sõnum üle. Kas oled kindel, et soovid jätkata?", "confirmations.logout.confirm": "Välju", @@ -297,7 +290,6 @@ "filter_modal.select_filter.subtitle": "Kasuta olemasolevat kategooriat või loo uus", "filter_modal.select_filter.title": "Filtreeri seda postitust", "filter_modal.title.status": "Postituse filtreerimine", - "filtered_notifications_banner.pending_requests": "Teateid {count, plural, =0 {mitte üheltki} one {ühelt} other {#}} inimeselt, keda võid teada", "filtered_notifications_banner.title": "Filtreeritud teavitused", "firehose.all": "Kõik", "firehose.local": "See server", @@ -305,15 +297,19 @@ "follow_request.authorize": "Autoriseeri", "follow_request.reject": "Hülga", "follow_requests.unlocked_explanation": "Kuigi su konto pole lukustatud, soovitab {domain} personal siiski nende kontode jälgimistaotlused käsitsi üle vaadata.", - "follow_suggestions.curated_suggestion": "Teiste valitud", + "follow_suggestions.curated_suggestion": "Meeskonna valitud", "follow_suggestions.dismiss": "Ära enam näita", - "follow_suggestions.hints.featured": "Selle kasutajaprofiili on soovitanud {domain} kasutajad.", - "follow_suggestions.hints.friends_of_friends": "See kasutajaprofiil on jälgitavate seas populaarne.", + "follow_suggestions.featured_longer": "Käsitsi valitud {domain} meeskonna poolt", + "follow_suggestions.friends_of_friends_longer": "Populaarne inimeste hulgas, keda jälgid", + "follow_suggestions.hints.featured": "Selle kasutajaprofiili on soovitanud {domain} meeskond.", + "follow_suggestions.hints.friends_of_friends": "See kasutajaprofiil on sinu jälgitavate seas populaarne.", "follow_suggestions.hints.most_followed": "See on {domain} enim jälgitud kasutajaprofiil.", - "follow_suggestions.hints.most_interactions": "See on {domain} viimasel ajal enim tähelepanu saanud kasutajaprofiil.", + "follow_suggestions.hints.most_interactions": "See kasutajaprofiil on viimasel ajal {domain} saanud palju tähelepanu.", "follow_suggestions.hints.similar_to_recently_followed": "See kasutajaprofiil sarnaneb neile, mida oled hiljuti jälgima asunud.", "follow_suggestions.personalized_suggestion": "Isikupärastatud soovitus", "follow_suggestions.popular_suggestion": "Popuplaarne soovitus", + "follow_suggestions.popular_suggestion_longer": "Populaarne kohas {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Sarnane profiilile, mida hiljuti jälgima hakkasid", "follow_suggestions.view_all": "Vaata kõiki", "follow_suggestions.who_to_follow": "Keda jälgida", "followed_tags": "Jälgitavad märksõnad", @@ -409,6 +405,8 @@ "limited_account_hint.action": "Näita profilli sellegipoolest", "limited_account_hint.title": "See profiil on peidetud {domain} moderaatorite poolt.", "link_preview.author": "{name} poolt", + "link_preview.more_from_author": "Veel kasutajalt {name}", + "link_preview.shares": "{count, plural, one {{counter} postitus} other {{counter} postitust}}", "lists.account.add": "Lisa nimekirja", "lists.account.remove": "Eemalda nimekirjast", "lists.delete": "Kustuta nimekiri", @@ -468,13 +466,21 @@ "notification.follow": "{name} alustas su jälgimist", "notification.follow_request": "{name} soovib sind jälgida", "notification.mention": "{name} mainis sind", + "notification.moderation-warning.learn_more": "Vaata lisa", + "notification.moderation_warning": "Said modereerimise hoiatuse", + "notification.moderation_warning.action_delete_statuses": "Mõni su postitus on eemaldatud.", + "notification.moderation_warning.action_disable": "Su konto on keelatud.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Mõni su postitustest on märgitud kui tundlik.", + "notification.moderation_warning.action_none": "Su konto on saanud modereerimise hoiatuse.", + "notification.moderation_warning.action_sensitive": "Su postitused märgitakse nüüdsest tundlikuks.", + "notification.moderation_warning.action_silence": "Su kontole pandi piirang.", + "notification.moderation_warning.action_suspend": "Su konto on peatatud.", "notification.own_poll": "Su küsitlus on lõppenud", - "notification.poll": "Küsitlus, milles osalesid, on lõppenud", "notification.reblog": "{name} jagas edasi postitust", "notification.relationships_severance_event": "Kadunud ühendus kasutajaga {name}", "notification.relationships_severance_event.account_suspension": "{from} admin on kustutanud {target}, mis tähendab, et sa ei saa enam neilt uuendusi või suhelda nendega.", "notification.relationships_severance_event.domain_block": "{from} admin on blokeerinud {target}, sealhulgas {followersCount} sinu jälgijat ja {followingCount, plural, one {# konto} other {# kontot}}, mida jälgid.", - "notification.relationships_severance_event.learn_more": "Saa rohkem teada", + "notification.relationships_severance_event.learn_more": "Vaata lisa", "notification.relationships_severance_event.user_domain_block": "Blokeerisid {target}, eemaldades oma jälgijate hulgast {followersCount} ja jälgitavate hulgast {followingCount, plural, one {# konto} other {# kontot}}.", "notification.status": "{name} just postitas", "notification.update": "{name} muutis postitust", @@ -680,8 +686,11 @@ "server_banner.about_active_users": "Inimesed, kes kasutavad seda serverit viimase 30 päeva jooksul (kuu aktiivsed kasutajad)", "server_banner.active_users": "aktiivsed kasutajad", "server_banner.administered_by": "Administraator:", + "server_banner.is_one_of_many": "{domain} on üks paljudest sõltumatutest Mastodoni serveritest, mida saab fediversumis osalemiseks kasutada.", "server_banner.server_stats": "Serveri statistika:", "sign_in_banner.create_account": "Loo konto", + "sign_in_banner.follow_anyone": "Jälgi ükskõik keda kogu fediversumist ja näe kõike ajalises järjestuses. Ei mingeid algoritme, reklaame või klikipüüdjaid segamas.", + "sign_in_banner.mastodon_is": "Mastodon on parim viis olemaks kursis sellega, mis toimub.", "sign_in_banner.sign_in": "Logi sisse", "sign_in_banner.sso_redirect": "Sisene või registreeru", "status.admin_account": "Ava @{name} moderaatorivaates", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 5fbac270cf8..a4b502ccc0c 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -35,9 +35,7 @@ "account.follow_back": "Jarraitu bueltan", "account.followers": "Jarraitzaileak", "account.followers.empty": "Ez du inork erabiltzaile hau jarraitzen oraindik.", - "account.followers_counter": "{count, plural, one {Jarraitzaile {counter}} other {{counter} jarraitzaile}}", "account.following": "Jarraitzen", - "account.following_counter": "{count, plural, one {{counter} jarraitzen} other {{counter} jarraitzen}}", "account.follows.empty": "Erabiltzaile honek ez du inor jarraitzen oraindik.", "account.go_to_profile": "Joan profilera", "account.hide_reblogs": "Ezkutatu @{name} erabiltzailearen bultzadak", @@ -63,7 +61,6 @@ "account.requested_follow": "{name}-(e)k zu jarraitzeko eskaera egin du", "account.share": "Partekatu @{name} erabiltzailearen profila", "account.show_reblogs": "Erakutsi @{name} erabiltzailearen bultzadak", - "account.statuses_counter": "{count, plural, one {Bidalketa {counter}} other {{counter} bidalketa}}", "account.unblock": "Desblokeatu @{name}", "account.unblock_domain": "Berriz erakutsi {domain}", "account.unblock_short": "Desblokeatu", @@ -169,23 +166,23 @@ "compose_form.spoiler_placeholder": "Edukiaren abisua (aukerakoa)", "confirmation_modal.cancel": "Utzi", "confirmations.block.confirm": "Blokeatu", - "confirmations.cancel_follow_request.confirm": "Baztertu eskaera", - "confirmations.cancel_follow_request.message": "Ziur {name} jarraitzeko eskaera bertan behera utzi nahi duzula?", "confirmations.delete.confirm": "Ezabatu", "confirmations.delete.message": "Ziur bidalketa hau ezabatu nahi duzula?", + "confirmations.delete.title": "Ezabatu bidalketa?", "confirmations.delete_list.confirm": "Ezabatu", "confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?", + "confirmations.delete_list.title": "Ezabatu zerrenda?", "confirmations.discard_edit_media.confirm": "Baztertu", "confirmations.discard_edit_media.message": "Multimediaren deskribapen edo aurrebistan gorde gabeko aldaketak daude, baztertu nahi dituzu?", - "confirmations.domain_block.confirm": "Blokeatu zerbitzaria", - "confirmations.domain_block.message": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da. Ez duzu domeinu horretako edukirik ikusiko denbora lerroetan edo jakinarazpenetan. Domeinu horretako zure jarraitzaileak kenduko dira ere.", "confirmations.edit.confirm": "Editatu", "confirmations.edit.message": "Orain editatzen baduzu, une honetan idazten ari zaren mezua gainidatziko da. Ziur jarraitu nahi duzula?", "confirmations.logout.confirm": "Amaitu saioa", "confirmations.logout.message": "Ziur saioa amaitu nahi duzula?", + "confirmations.logout.title": "Itxi saioa?", "confirmations.mute.confirm": "Mututu", "confirmations.redraft.confirm": "Ezabatu eta berridatzi", "confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.", + "confirmations.redraft.title": "Ezabatu eta berridatzi bidalketa?", "confirmations.reply.confirm": "Erantzun", "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?", "confirmations.unfollow.confirm": "Utzi jarraitzeari", @@ -297,8 +294,6 @@ "filter_modal.select_filter.subtitle": "Hautatu lehendik dagoen kategoria bat edo sortu berria", "filter_modal.select_filter.title": "Iragazi bidalketa hau", "filter_modal.title.status": "Iragazi bidalketa bat", - "filtered_notifications_banner.mentions": "{count, plural, one {aipamen} other {aipamen}}", - "filtered_notifications_banner.pending_requests": "Ezagutu {count, plural, =0 {dezakezun inoren} one {dezakezun pertsona baten} other {ditzakezun # pertsonen}} jakinarazpenak", "filtered_notifications_banner.title": "Iragazitako jakinarazpenak", "firehose.all": "Guztiak", "firehose.local": "Zerbitzari hau", @@ -483,7 +478,6 @@ "notification.moderation_warning.action_silence": "Kontua murriztu egin da.", "notification.moderation_warning.action_suspend": "Kontua itxi da.", "notification.own_poll": "Zure inkesta amaitu da", - "notification.poll": "Zuk erantzun duzun inkesta bat bukatu da", "notification.reblog": "{name}(e)k bultzada eman dio zure bidalketari", "notification.relationships_severance_event": "{name} erabiltzailearekin galdutako konexioak", "notification.relationships_severance_event.account_suspension": "{from} zerbitzariko administratzaile batek {target} bertan behera utzi du, hau da, ezin izango dituzu jaso hango eguneratzerik edo hangoekin elkarreragin.", @@ -496,9 +490,12 @@ "notification_requests.title": "Iragazitako jakinarazpenak", "notifications.clear": "Garbitu jakinarazpenak", "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?", + "notifications.clear_title": "Garbitu jakinarazpenak?", "notifications.column_settings.admin.report": "Txosten berriak:", "notifications.column_settings.admin.sign_up": "Izen-emate berriak:", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", + "notifications.column_settings.beta.category": "Ezaugarri esperimentalak", + "notifications.column_settings.beta.grouping": "Multzokatu jakinarazpenak", "notifications.column_settings.favourite": "Gogokoak:", "notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak", "notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra", @@ -663,8 +660,11 @@ "report_notification.attached_statuses": "{count, plural, one {Bidalketa {count}} other {{count} bidalketa}} erantsita", "report_notification.categories.legal": "Legala", "report_notification.categories.other": "Bestelakoak", + "report_notification.categories.other_sentence": "bestelakoak", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spama", "report_notification.categories.violation": "Arau haustea", + "report_notification.categories.violation_sentence": "arau haustea", "report_notification.open": "Ireki salaketa", "search.no_recent_searches": "Duela gutxiko bilaketarik ez", "search.placeholder": "Bilatu", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 072a67421ae..414e453fa3b 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -35,9 +35,7 @@ "account.follow_back": "دنبال کردن متقابل", "account.followers": "پی‌گیرندگان", "account.followers.empty": "هنوز کسی پی‌گیر این کاربر نیست.", - "account.followers_counter": "{count, plural, one {{counter} پی‌گیرنده} other {{counter} پی‌گیرنده}}", "account.following": "پی می‌گیرید", - "account.following_counter": "{count, plural, one {{counter} پی‌گرفته} other {{counter} پی‌گرفته}}", "account.follows.empty": "این کاربر هنوز پی‌گیر کسی نیست.", "account.go_to_profile": "رفتن به نمایه", "account.hide_reblogs": "نهفتن تقویت‌های ‎@{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} درخواست پی‌گیریتان را داد", "account.share": "هم‌رسانی نمایهٔ ‎@{name}", "account.show_reblogs": "نمایش تقویت‌های ‎@{name}", - "account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}", "account.unblock": "رفع مسدودیت ‎@{name}", "account.unblock_domain": "رفع مسدودیت دامنهٔ {domain}", "account.unblock_short": "رفع مسدودیت", @@ -89,6 +86,10 @@ "announcement.announcement": "اعلامیه", "attachments_list.unprocessed": "(پردازش نشده)", "audio.hide": "نهفتن صدا", + "block_modal.show_less": "نمایش کم‌تر", + "block_modal.show_more": "نمایش بیش‌تر", + "block_modal.title": "انسداد کاربر؟", + "block_modal.you_wont_see_mentions": "فرسته‌هایی که از اون نام برده را نخواهید دید.", "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید", "bundle_column_error.copy_stacktrace": "رونوشت از گزارش خطا", "bundle_column_error.error.body": "صفحهٔ درخواستی نتوانست پرداخت شود. ممکن است به خاطر اشکالی در کدمان یا مشکل سازگاری مرورگر باشد.", @@ -161,26 +162,30 @@ "compose_form.spoiler_placeholder": "هشدار محتوا (اختیاری)", "confirmation_modal.cancel": "لغو", "confirmations.block.confirm": "انسداد", - "confirmations.cancel_follow_request.confirm": "رد کردن درخواست", - "confirmations.cancel_follow_request.message": "مطمئنید که می خواهید درخواست پی‌گیری {name} را لغو کنید؟", "confirmations.delete.confirm": "حذف", "confirmations.delete.message": "آیا مطمئنید که می‌خواهید این فرسته را حذف کنید؟", + "confirmations.delete.title": "حذف فرسته؟", "confirmations.delete_list.confirm": "حذف", "confirmations.delete_list.message": "مطمئنید می‌خواهید این سیاهه را برای همیشه حذف کنید؟", + "confirmations.delete_list.title": "حذف سیاهه؟", "confirmations.discard_edit_media.confirm": "دور انداختن", "confirmations.discard_edit_media.message": "تغییرات ذخیره نشده‌ای در توضیحات یا پیش‌نمایش رسانه دارید. همگی نادیده گرفته شوند؟", - "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدود کردن یا خموشاندن چند حساب خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ محتوایی را از این دامنه در خط زمانی عمومی یا آگاهی‌هایتان نخواهید دید. پی‌گیرانتان از این دامنه هم برداشته خواهند شد.", "confirmations.edit.confirm": "ویرایش", "confirmations.edit.message": "در صورت ویرایش، پیامی که در حال نوشتنش بودید از بین خواهد رفت. می‌خواهید ادامه دهید؟", + "confirmations.edit.title": "رونویسی فرسته؟", "confirmations.logout.confirm": "خروج از حساب", "confirmations.logout.message": "مطمئنید می‌خواهید خارج شوید؟", + "confirmations.logout.title": "خروج؟", "confirmations.mute.confirm": "خموش", "confirmations.redraft.confirm": "حذف و بازنویسی", "confirmations.redraft.message": "مطمئنید که می‌خواهید این فرسته را حذف کنید و از نو بنویسید؟ با این کار تقویت‌ها و پسندهایش از دست رفته و پاسخ‌ها به آن بی‌مرجع می‌شود.", + "confirmations.redraft.title": "حذف و پیش‌نویسی دوبارهٔ فرسته؟", "confirmations.reply.confirm": "پاسخ", "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. می‌خواهید ادامه دهید؟", + "confirmations.reply.title": "رونویسی فرسته؟", "confirmations.unfollow.confirm": "پی‌نگرفتن", "confirmations.unfollow.message": "مطمئنید که می‌خواهید به پی‌گیری از {name} پایان دهید؟", + "confirmations.unfollow.title": "ناپی‌گیری کاربر؟", "conversation.delete": "حذف گفتگو", "conversation.mark_as_read": "علامت‌گذاری به عنوان خوانده شده", "conversation.open": "دیدن گفتگو", @@ -200,6 +205,10 @@ "dismissable_banner.explore_statuses": "هم‌اکنون این فرسته‌ها از این کارساز و دیگر کارسازهای شبکهٔ نامتمرکز داغ شده‌اند.", "dismissable_banner.explore_tags": "هم‌اکنون این برچسب‌ها بین افراد این کارساز و دیگر کارسازهای شبکهٔ نامتمرکز داغ شده‌اند.", "dismissable_banner.public_timeline": "این‌ها جدیدترین فرسته‌های عمومی از افرادی روی وب اجتماعیند که اعضای {domain} پی می‌گیرندشان.", + "domain_block_modal.block": "انسداد کارساز", + "domain_block_modal.title": "انسداد دامنه؟", + "domain_pill.server": "کارساز", + "domain_pill.username": "نام کاربری", "embed.instructions": "جاسازی این فرسته روی پایگاهتان با رونوشت کردن کد زیر.", "embed.preview": "این گونه دیده خواهد شد:", "emoji_button.activity": "فعالیت", @@ -394,6 +403,8 @@ "loading_indicator.label": "در حال بارگذاری…", "media_gallery.toggle_visible": "{number, plural, one {نهفتن تصویر} other {نهفتن تصاویر}}", "moved_to_account_banner.text": "حسابتان {disabledAccount} اکنون از کار افتاده؛ چرا که به {movedToAccount} منتقل شدید.", + "mute_modal.show_options": "نمایش گزینه‌ها", + "mute_modal.title": "خموشی کاربر؟", "navigation_bar.about": "درباره", "navigation_bar.advanced_interface": "بازکردن در رابط کاربری وب پیشرفته", "navigation_bar.blocks": "کاربران مسدود شده", @@ -426,16 +437,21 @@ "notification.follow": "‫{name}‬ پی‌گیرتان شد", "notification.follow_request": "{name} درخواست پی‌گیریتان را داد", "notification.mention": "‫{name}‬ به شما اشاره کرد", + "notification.moderation-warning.learn_more": "بیشتر بدانید", "notification.own_poll": "نظرسنجیتان پایان یافت", - "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است", "notification.reblog": "‫{name}‬ فرسته‌تان را تقویت کرد", + "notification.relationships_severance_event.learn_more": "بیشتر بدانید", "notification.status": "{name} چیزی فرستاد", "notification.update": "{name} فرسته‌ای را ویرایش کرد", + "notification_requests.accept": "پذیرش", + "notification_requests.dismiss": "دورانداختن", + "notification_requests.maximize": "بیشنه", "notifications.clear": "پاک‌سازی آگاهی‌ها", "notifications.clear_confirmation": "مطمئنید می‌خواهید همهٔ آگاهی‌هایتان را برای همیشه پاک کنید؟", "notifications.column_settings.admin.report": "گزارش‌های جدید:", "notifications.column_settings.admin.sign_up": "ثبت نام‌های جدید:", "notifications.column_settings.alert": "آگاهی‌های میزکار", + "notifications.column_settings.beta.category": "ویژگی‌های آزمایشی", "notifications.column_settings.favourite": "برگزیده‌ها:", "notifications.column_settings.follow": "پی‌گیرندگان جدید:", "notifications.column_settings.follow_request": "درخواست‌های جدید پی‌گیری:", @@ -590,8 +606,11 @@ "report.unfollow_explanation": "شما این حساب را پی‌گرفته‌اید، برای اینکه دیگر فرسته‌هایش را در خوراک خانه‌تان نبینید؛ آن را پی‌نگیرید.", "report_notification.attached_statuses": "{count, plural, one {{count} فرسته} other {{count} فرسته}} پیوست شده", "report_notification.categories.legal": "قانونی", + "report_notification.categories.legal_sentence": "محتوای غیرقانونی", "report_notification.categories.other": "دیگر", + "report_notification.categories.other_sentence": "دیگر", "report_notification.categories.spam": "هرزنامه", + "report_notification.categories.spam_sentence": "هرزنامه", "report_notification.categories.violation": "تخطّی از قانون", "report_notification.open": "گشودن گزارش", "search.no_recent_searches": "جست‌وجوی اخیری نیست", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 67e2b72b869..ae1ccc0a3c4 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,12 +1,12 @@ { "about.blocks": "Moderoidut palvelimet", - "about.contact": "Ota yhteys:", + "about.contact": "Yhteydenotto:", "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", - "about.domain_blocks.preamble": "Mastodonin avulla voidaan yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä, ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", + "about.domain_blocks.preamble": "Mastodonin avulla voi yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", "about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.", "about.domain_blocks.silenced.title": "Rajoitettu", - "about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta tai vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.", + "about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta eikä vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.", "about.domain_blocks.suspended.title": "Jäädytetty", "about.not_available": "Näitä tietoja ei ole julkaistu tällä palvelimella.", "about.powered_by": "Hajautetun sosiaalisen median tarjoaa {mastodon}", @@ -19,7 +19,7 @@ "account.block_domain": "Estä verkkotunnus {domain}", "account.block_short": "Estä", "account.blocked": "Estetty", - "account.browse_more_on_origin_server": "Selaile kattavampaa alkuperäprofiilia", + "account.browse_more_on_origin_server": "Selaa lisää alkuperäisessä profiilissa", "account.cancel_follow_request": "Peruuta seurantapyyntö", "account.copy": "Kopioi linkki profiiliin", "account.direct": "Mainitse @{name} yksityisesti", @@ -30,7 +30,7 @@ "account.endorse": "Suosittele profiilissasi", "account.featured_tags.last_status_at": "Viimeisin julkaisu {date}", "account.featured_tags.last_status_never": "Ei julkaisuja", - "account.featured_tags.title": "Käyttäjän {name} esillä pidettävät aihetunnisteet", + "account.featured_tags.title": "Käyttäjän {name} suosittelemat aihetunnisteet", "account.follow": "Seuraa", "account.follow_back": "Seuraa takaisin", "account.followers": "Seuraajat", @@ -45,7 +45,7 @@ "account.joined_short": "Liittynyt", "account.languages": "Vaihda tilattuja kieliä", "account.link_verified_on": "Linkin omistus tarkistettiin {date}", - "account.locked_info": "Tilin yksityisyystilaksi on määritetty lukittu ja tilin omistaja arvioi erikseen, kuka voi seurata häntä.", + "account.locked_info": "Tilin yksityisyystilaksi on määritetty lukittu. Tilin omistaja arvioi erikseen, kuka voi seurata häntä.", "account.media": "Media", "account.mention": "Mainitse @{name}", "account.moved_to": "{name} on ilmoittanut uudeksi tilikseen", @@ -59,30 +59,30 @@ "account.posts": "Julkaisut", "account.posts_with_replies": "Julkaisut ja vastaukset", "account.report": "Raportoi @{name}", - "account.requested": "Odottaa hyväksyntää. Peruuta seuraamispyyntö napsauttamalla", + "account.requested": "Odottaa hyväksyntää. Peruuta seurantapyyntö napsauttamalla", "account.requested_follow": "{name} on pyytänyt lupaa seurata sinua", "account.share": "Jaa käyttäjän @{name} profiili", "account.show_reblogs": "Näytä käyttäjän @{name} tehostukset", "account.statuses_counter": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}", "account.unblock": "Kumoa käyttäjän @{name} esto", "account.unblock_domain": "Kumoa verkkotunnuksen {domain} esto", - "account.unblock_short": "Poista esto", + "account.unblock_short": "Kumoa esto", "account.unendorse": "Kumoa suosittelu profiilissasi", - "account.unfollow": "Lopeta seuraaminen", + "account.unfollow": "Älä seuraa", "account.unmute": "Poista käyttäjän @{name} mykistys", "account.unmute_notifications_short": "Poista ilmoitusten mykistys", "account.unmute_short": "Poista mykistys", "account_note.placeholder": "Lisää muistiinpano napsauttamalla", - "admin.dashboard.daily_retention": "Käyttäjien pysyvyys rekisteröitymisen jälkeen päivittäin", - "admin.dashboard.monthly_retention": "Käyttäjien pysyvyys rekisteröitymisen jälkeen kuukausittain", - "admin.dashboard.retention.average": "Keskiarvo", + "admin.dashboard.daily_retention": "Käyttäjien pysyvyys päivittäin rekisteröitymisen jälkeen", + "admin.dashboard.monthly_retention": "Käyttäjien pysyvyys kuukausittain rekisteröitymisen jälkeen", + "admin.dashboard.retention.average": "Keskimäärin", "admin.dashboard.retention.cohort": "Rekisteröitymis-kk.", "admin.dashboard.retention.cohort_size": "Uusia käyttäjiä", "admin.impact_report.instance_accounts": "Tilien profiilit, jotka tämä poistaisi", "admin.impact_report.instance_followers": "Seuraajat, jotka käyttäjämme menettäisivät", "admin.impact_report.instance_follows": "Seuraajat, jotka heidän käyttäjänsä menettäisivät", "admin.impact_report.title": "Vaikutusten yhteenveto", - "alert.rate_limited.message": "Yritä uudestaan {retry_time, time, medium} jälkeen.", + "alert.rate_limited.message": "Yritä uudelleen {retry_time, time, medium} jälkeen.", "alert.rate_limited.title": "Pyyntömäärää rajoitettu", "alert.unexpected.message": "Tapahtui odottamaton virhe.", "alert.unexpected.title": "Hups!", @@ -96,14 +96,14 @@ "block_modal.they_cant_see_posts": "Hän ei voi enää nähdä julkaisujasi, etkä sinä voi nähdä hänen.", "block_modal.they_will_know": "Hän voi nähdä, että hänet on estetty.", "block_modal.title": "Estetäänkö käyttäjä?", - "block_modal.you_wont_see_mentions": "Et tule enää näkemään julkaisuja, joissa hänet mainitaan.", + "block_modal.you_wont_see_mentions": "Et näe enää julkaisuja, joissa hänet mainitaan.", "boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}", "bundle_column_error.copy_stacktrace": "Kopioi virheraportti", "bundle_column_error.error.body": "Pyydettyä sivua ei voitu hahmontaa. Se voi johtua virheestä koodissamme tai selaimen yhteensopivuudessa.", "bundle_column_error.error.title": "Voi ei!", "bundle_column_error.network.body": "Sivun lataamisessa tapahtui virhe. Tämä voi johtua tilapäisestä Internet-yhteyden tai tämän palvelimen ongelmasta.", "bundle_column_error.network.title": "Verkkovirhe", - "bundle_column_error.retry": "Yritä uudestaan", + "bundle_column_error.retry": "Yritä uudelleen", "bundle_column_error.return": "Palaa takaisin kotiin", "bundle_column_error.routing.body": "Pyydettyä sivua ei löytynyt. Oletko varma, että osoitepalkin URL-osoite on oikein?", "bundle_column_error.routing.title": "404", @@ -111,7 +111,7 @@ "bundle_modal_error.message": "Jotain meni pieleen komponenttia ladattaessa.", "bundle_modal_error.retry": "Yritä uudelleen", "closed_registrations.other_server_instructions": "Koska Mastodon on hajautettu, voit luoda tilin toiselle palvelimelle ja olla silti vuorovaikutuksessa tämän kanssa.", - "closed_registrations_modal.description": "Tilin luonti palveluun {domain} ei tällä hetkellä ole mahdollista, mutta huomioi, ettei Mastodonin käyttö edellytä juuri kyseisen palvelun tiliä.", + "closed_registrations_modal.description": "Tilin luonti palvelimelle {domain} ei tällä hetkellä ole mahdollista, mutta ota huomioon, ettei Mastodonin käyttö edellytä juuri kyseisen palvelimen tiliä.", "closed_registrations_modal.find_another_server": "Etsi toinen palvelin", "closed_registrations_modal.preamble": "Mastodon on hajautettu, joten riippumatta siitä, missä luot tilisi, voit seurata ja olla vuorovaikutuksessa kenen tahansa kanssa tällä palvelimella. Voit jopa isännöidä palvelinta!", "closed_registrations_modal.title": "Rekisteröityminen Mastodoniin", @@ -119,12 +119,12 @@ "column.blocks": "Estetyt käyttäjät", "column.bookmarks": "Kirjanmerkit", "column.community": "Paikallinen aikajana", - "column.direct": "Yksityiset maininnat", + "column.direct": "Yksityismaininnat", "column.directory": "Selaa profiileja", "column.domain_blocks": "Estetyt verkkotunnukset", "column.favourites": "Suosikit", "column.firehose": "Livesyötteet", - "column.follow_requests": "Seuraamispyynnöt", + "column.follow_requests": "Seurantapyynnöt", "column.home": "Koti", "column.lists": "Listat", "column.mutes": "Mykistetyt käyttäjät", @@ -143,7 +143,7 @@ "community.column_settings.media_only": "Vain media", "community.column_settings.remote_only": "Vain etätilit", "compose.language.change": "Vaihda kieli", - "compose.language.search": "Hae kieliä...", + "compose.language.search": "Hae kieliä…", "compose.published.body": "Julkaisu lähetetty.", "compose.published.open": "Avaa", "compose.saved.body": "Julkaisu tallennettu.", @@ -157,8 +157,8 @@ "compose_form.poll.multiple": "Monivalinta", "compose_form.poll.option_placeholder": "Vaihtoehto {number}", "compose_form.poll.single": "Valitse yksi", - "compose_form.poll.switch_to_multiple": "Muuta kysely monivalinnaksi", - "compose_form.poll.switch_to_single": "Muuta kysely sallimaan vain yksi valinta", + "compose_form.poll.switch_to_multiple": "Muuta äänestys monivalinnaksi", + "compose_form.poll.switch_to_single": "Muuta äänestys yksittäisvalinnaksi", "compose_form.poll.type": "Tyyli", "compose_form.publish": "Julkaise", "compose_form.publish_form": "Uusi julkaisu", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Sisältövaroitus (valinnainen)", "confirmation_modal.cancel": "Peruuta", "confirmations.block.confirm": "Estä", - "confirmations.cancel_follow_request.confirm": "Peruuta pyyntö", - "confirmations.cancel_follow_request.message": "Haluatko varmasti perua pyyntösi seurata käyttäjätiliä {name}?", "confirmations.delete.confirm": "Poista", "confirmations.delete.message": "Haluatko varmasti poistaa tämän julkaisun?", + "confirmations.delete.title": "Poistetaanko julkaisu?", "confirmations.delete_list.confirm": "Poista", "confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan pysyvästi?", + "confirmations.delete_list.title": "Poistetaanko lista?", "confirmations.discard_edit_media.confirm": "Hylkää", "confirmations.discard_edit_media.message": "Sinulla on tallentamattomia muutoksia median kuvaukseen tai esikatseluun. Hylätäänkö ne silti?", - "confirmations.domain_block.confirm": "Estä palvelin", - "confirmations.domain_block.message": "Haluatko aivan varmasti estää koko verkkotunnuksen {domain}? Useimmiten muutama kohdistettu esto tai mykistys on riittävä ja suositeltava toimi. Et näe sisältöä tästä verkkotunnuksesta millään julkisilla aikajanoilla tai ilmoituksissa. Tähän verkkotunnukseen kuuluvat seuraajasi poistetaan.", "confirmations.edit.confirm": "Muokkaa", "confirmations.edit.message": "Jos muokkaat viestiä nyt, se korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?", + "confirmations.edit.title": "Korvataanko julkaisu?", "confirmations.logout.confirm": "Kirjaudu ulos", "confirmations.logout.message": "Haluatko varmasti kirjautua ulos?", + "confirmations.logout.title": "Kirjaudutaanko ulos?", "confirmations.mute.confirm": "Mykistä", "confirmations.redraft.confirm": "Poista ja palauta muokattavaksi", "confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.", + "confirmations.redraft.title": "Poistetaanko julkaisu ja palautetaanko se muokattavaksi?", "confirmations.reply.confirm": "Vastaa", "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?", + "confirmations.reply.title": "Korvataanko julkaisu?", "confirmations.unfollow.confirm": "Lopeta seuraaminen", "confirmations.unfollow.message": "Haluatko varmasti lopettaa profiilin {name} seuraamisen?", + "confirmations.unfollow.title": "Lopetetaanko käyttäjän seuraaminen?", "conversation.delete": "Poista keskustelu", "conversation.mark_as_read": "Merkitse luetuksi", "conversation.open": "Näytä keskustelu", @@ -197,7 +200,7 @@ "copy_icon_button.copied": "Sisältö kopioitiin leikepöydälle", "copypaste.copied": "Kopioitu", "copypaste.copy_to_clipboard": "Kopioi leikepöydälle", - "directory.federated": "Koko tunnettu fediversumi", + "directory.federated": "Tunnetusta fediversumista", "directory.local": "Vain palvelimelta {domain}", "directory.new_arrivals": "Äskettäin saapuneet", "directory.recently_active": "Hiljattain aktiiviset", @@ -205,29 +208,29 @@ "disabled_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä.", "dismissable_banner.community_timeline": "Nämä ovat tuoreimpia julkaisuja käyttäjiltä, joiden tili on palvelimella {domain}.", "dismissable_banner.dismiss": "Hylkää", - "dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat listauksessa korkeammalle.", - "dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat listauksessa korkeammalle.", - "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat listauksessa korkeammalle.", - "dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.", + "dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat korkeammalle sijalle.", + "dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat korkeammalle sijalle.", + "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat korkeammalle sijalle.", + "dismissable_banner.public_timeline": "Nämä ovat tuoreimpia julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.", "domain_block_modal.block": "Estä palvelin", "domain_block_modal.block_account_instead": "Estä sen sijaan @{name}", - "domain_block_modal.they_can_interact_with_old_posts": "Ihmiset tältä palvelimelta eivät voi olla vuorovaikutuksessa vanhojen julkaisujesi kanssa.", + "domain_block_modal.they_can_interact_with_old_posts": "Tämän palvelimen käyttäjät eivät voi olla vuorovaikutuksessa vanhojen julkaisujesi kanssa.", "domain_block_modal.they_cant_follow": "Kukaan tältä palvelimelta ei voi seurata sinua.", - "domain_block_modal.they_wont_know": "Hän ei saa ilmoitusta tulleensa estetyksi.", + "domain_block_modal.they_wont_know": "Hän ei saa tietää tulleensa estetyksi.", "domain_block_modal.title": "Estetäänkö verkkotunnus?", "domain_block_modal.you_will_lose_followers": "Kaikki seuraajasi tältä palvelimelta poistetaan.", "domain_block_modal.you_wont_see_posts": "Et enää näe julkaisuja etkä ilmoituksia tämän palvelimen käyttäjiltä.", "domain_pill.activitypub_lets_connect": "Sen avulla voit muodostaa yhteyden ja olla vuorovaikutuksessa ihmisten kanssa, ei vain Mastodonissa vaan myös muissa sosiaalisissa sovelluksissa.", "domain_pill.activitypub_like_language": "ActivityPub on kuin kieli, jota Mastodon puhuu muiden sosiaalisten verkostojen kanssa.", "domain_pill.server": "Palvelin", - "domain_pill.their_handle": "Hänen käyttäjänimensä:", + "domain_pill.their_handle": "Hänen käyttäjätunnuksensa:", "domain_pill.their_server": "Hänen digitaalinen kotinsa, jossa kaikki hänen julkaisunsa sijaitsevat.", "domain_pill.their_username": "Hänen yksilöllinen tunnisteensa omalla palvelimellaan. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.", "domain_pill.username": "Käyttäjänimi", - "domain_pill.whats_in_a_handle": "Mitä käyttäjänimessä on?", - "domain_pill.who_they_are": "Koska käyttäjätunnukset kertovat, kuka ja missä joku on, voit olla vuorovaikutuksessa ihmisten kanssa läpi sosiaalisen verkon, joka koostuu .", - "domain_pill.who_you_are": "Koska käyttäjätunnuksesi kertoo, kuka ja missä olet, ihmiset voivat olla vaikutuksessa kanssasi läpi sosiaalisen verkon, joka koostuu .", - "domain_pill.your_handle": "Käyttäjänimesi:", + "domain_pill.whats_in_a_handle": "Mitä käyttäjätunnuksessa on?", + "domain_pill.who_they_are": "Koska käyttäjätunnukset kertovat, kuka ja missä joku on, voit olla vuorovaikutuksessa käyttäjien kanssa kaikkialla sosiaalisessa verkossa, joka koostuu .", + "domain_pill.who_you_are": "Koska käyttäjätunnuksesi kertoo, kuka ja missä olet, käyttäjät voivat olla vaikutuksessa kanssasi kaikkialla sosiaalisessa verkossa, joka koostuu .", + "domain_pill.your_handle": "Käyttäjätunnuksesi:", "domain_pill.your_server": "Digitaalinen kotisi, jossa kaikki julkaisusi sijaitsevat. Etkö pidä tästä? Siirry palvelimelta toiselle milloin tahansa ja tuo myös seuraajasi mukanasi.", "domain_pill.your_username": "Yksilöllinen tunnisteesi tällä palvelimella. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.", "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.", @@ -243,7 +246,7 @@ "emoji_button.objects": "Esineet", "emoji_button.people": "Ihmiset", "emoji_button.recent": "Usein käytetyt", - "emoji_button.search": "Etsi...", + "emoji_button.search": "Hae…", "emoji_button.search_results": "Hakutulokset", "emoji_button.symbols": "Symbolit", "emoji_button.travel": "Matkailu ja paikat", @@ -254,21 +257,21 @@ "empty_column.blocks": "Et ole vielä estänyt käyttäjiä.", "empty_column.bookmarked_statuses": "Et ole vielä lisännyt julkaisuja kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.", "empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!", - "empty_column.direct": "Yksityisiä mainintoja ei vielä ole. Jos lähetät tai sinulle lähetetään sellaisia, näet ne täällä.", + "empty_column.direct": "Yksityismainintoja ei vielä ole. Jos lähetät tai sinulle lähetetään sellaisia, näet ne täällä.", "empty_column.domain_blocks": "Verkkotunnuksia ei ole vielä estetty.", "empty_column.explore_statuses": "Mikään ei ole nyt suosittua. Tarkista myöhemmin uudelleen!", "empty_column.favourited_statuses": "Sinulla ei ole vielä yhtään suosikkijulkaisua. Kun lisäät sellaisen, näkyy se tässä.", "empty_column.favourites": "Kukaan ei ole vielä lisännyt tätä julkaisua suosikkeihinsa. Kun joku tekee niin, tulee hän tähän näkyviin.", - "empty_column.follow_requests": "Et ole vielä vastaanottanut seuraamispyyntöjä. Saamasi pyynnöt näkyvät täällä.", + "empty_column.follow_requests": "Et ole vielä vastaanottanut seurantapyyntöjä. Saamasi pyynnöt näkyvät täällä.", "empty_column.followed_tags": "Et seuraa vielä yhtäkään aihetunnistetta. Kun alat seurata, ne tulevat tähän näkyviin.", "empty_column.hashtag": "Tällä aihetunnisteella ei löydy vielä sisältöä.", - "empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia henkilöjä, niin näet enemmän sisältöä.", + "empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia käyttäjiä, niin näet enemmän sisältöä.", "empty_column.list": "Tällä listalla ei ole vielä mitään. Kun tämän listan jäsenet lähettävät uusia julkaisuja, ne näkyvät tässä.", "empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.", "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.", "empty_column.notification_requests": "Olet ajan tasalla! Täällä ei ole mitään uutta kerrottavaa. Kun saat uusia ilmoituksia, ne näkyvät täällä asetustesi mukaisesti.", - "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun keskustelet muille, näet sen täällä.", - "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti. Voit myös seurata muiden palvelimien käyttäjiä", + "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun muut ovat vuorovaikutuksessa kanssasi, näet sen täällä.", + "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti tai seuraa muiden palvelinten käyttäjiä, niin saat sisältöä", "error.unexpected_crash.explanation": "Sivua ei voida näyttää oikein ohjelmointivirheen tai selaimen yhteensopivuusvajeen vuoksi.", "error.unexpected_crash.explanation_addons": "Sivua ei voitu näyttää oikein. Tämä virhe johtuu todennäköisesti selaimen lisäosasta tai automaattisista käännöstyökaluista.", "error.unexpected_crash.next_steps": "Kokeile päivittää sivu. Jos se ei auta, voi Mastodonin käyttö ehkä onnistua eri selaimella tai natiivisovelluksella.", @@ -276,7 +279,7 @@ "errors.unexpected_crash.copy_stacktrace": "Kopioi pinon jäljitys leikepöydälle", "errors.unexpected_crash.report_issue": "Ilmoita ongelmasta", "explore.search_results": "Hakutulokset", - "explore.suggested_follows": "Henkilöt", + "explore.suggested_follows": "Käyttäjät", "explore.title": "Selaa", "explore.trending_links": "Uutiset", "explore.trending_statuses": "Julkaisut", @@ -297,21 +300,20 @@ "filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi", "filter_modal.select_filter.title": "Suodata tämä julkaisu", "filter_modal.title.status": "Suodata julkaisu", - "filtered_notifications_banner.mentions": "{count, plural, one {maininta} other {mainintaa}}", - "filtered_notifications_banner.pending_requests": "Ilmoituksia {count, plural, =0 {ei ole} one {1 henkilöltä} other {# henkilöltä}}, jonka saatat tuntea", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Ei keneltäkään, jonka} one {1 käyttäjältä, jonka} other {# käyttäjältä, jotka}} saatat tuntea", "filtered_notifications_banner.title": "Suodatetut ilmoitukset", "firehose.all": "Kaikki", "firehose.local": "Tämä palvelin", "firehose.remote": "Muut palvelimet", "follow_request.authorize": "Valtuuta", "follow_request.reject": "Hylkää", - "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, palvelimen {domain} ylläpito on arvioinut, että saatat olla halukas tarkistamaan nämä seuraamispyynnöt erikseen.", + "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, palvelimen {domain} ylläpito on arvioinut, että saatat olla halukas tarkistamaan nämä seurantapyynnöt erikseen.", "follow_suggestions.curated_suggestion": "Ehdotus ylläpidolta", "follow_suggestions.dismiss": "Älä näytä uudelleen", "follow_suggestions.featured_longer": "Palvelimen {domain} tiimin poimintoja", - "follow_suggestions.friends_of_friends_longer": "Suosittu seuraamiesi ihmisten keskuudessa", + "follow_suggestions.friends_of_friends_longer": "Suosittu seuraamiesi käyttäjien joukossa", "follow_suggestions.hints.featured": "Tämän profiilin on valinnut palvelimen {domain} tiimi.", - "follow_suggestions.hints.friends_of_friends": "Seuraamasi käyttäjät suosivat tätä profiilia.", + "follow_suggestions.hints.friends_of_friends": "Tämä profiili on suosittu seuraamiesi käyttäjien joukossa.", "follow_suggestions.hints.most_followed": "Tämä profiili on palvelimen {domain} seuratuimpia.", "follow_suggestions.hints.most_interactions": "Tämä profiili on viime aikoina saanut paljon huomiota palvelimella {domain}.", "follow_suggestions.hints.similar_to_recently_followed": "Tämä profiili on samankaltainen kuin profiilit, joita olet viimeksi seurannut.", @@ -354,7 +356,7 @@ "home.pending_critical_update.link": "Tutustu päivityssisältöihin", "home.pending_critical_update.title": "Kriittinen tietoturvapäivitys saatavilla!", "home.show_announcements": "Näytä tiedotteet", - "interaction_modal.description.favourite": "Mastodon-tilillä voit lisätä tämän julkaisun suosikkeihisi osoittaaksesi kirjoittajalle arvostavasi sitä ja tallentaaksesi sen tulevaa käyttöä varten.", + "interaction_modal.description.favourite": "Mastodon-tilillä voit lisätä tämän julkaisun suosikkeihisi osoittaaksesi tekijälle arvostavasi sitä ja tallentaaksesi sen tulevaa käyttöä varten.", "interaction_modal.description.follow": "Mastodon-tilillä voit seurata käyttäjää {name} saadaksesi hänen julkaisunsa kotisyötteeseesi.", "interaction_modal.description.reblog": "Mastodon-tilillä voit tehostaa tätä julkaisua jakaaksesi sen seuraajiesi kanssa.", "interaction_modal.description.reply": "Mastodon-tilillä voit vastata tähän julkaisuun.", @@ -364,7 +366,7 @@ "interaction_modal.on_another_server": "Toisella palvelimella", "interaction_modal.on_this_server": "Tällä palvelimella", "interaction_modal.sign_in": "Et ole kirjautunut tälle palvelimelle. Millä palvelimella tilisi sijaitsee?", - "interaction_modal.sign_in_hint": "Vihje: Se on sama verkkosivusto, jolle rekisteröidyit. Jos et muista, etsi tervetulosähköposti saapuneista viesteistäsi. Voit myös syöttää koko käyttäjätunnuksesi! (Esimerkki: @Mastodon@Mastodon.social)", + "interaction_modal.sign_in_hint": "Vihje: Se on sama verkkosivusto, jolle rekisteröidyit. Jos et muista palvelintasi, etsi tervetulosähköposti saapuneista viesteistäsi. Voit syöttää myös koko käyttäjätunnuksesi! (Esimerkki: @Mastodon@Mastodon.social)", "interaction_modal.title.favourite": "Lisää käyttäjän {name} julkaisu suosikkeihin", "interaction_modal.title.follow": "Seuraa käyttäjää {name}", "interaction_modal.title.reblog": "Tehosta käyttäjän {name} julkaisua", @@ -378,8 +380,8 @@ "keyboard_shortcuts.column": "Kohdista sarakkeeseen", "keyboard_shortcuts.compose": "Kohdista kirjoituskenttään", "keyboard_shortcuts.description": "Kuvaus", - "keyboard_shortcuts.direct": "Avaa yksityisten mainintojen sarake", - "keyboard_shortcuts.down": "Siirry listassa alaspäin", + "keyboard_shortcuts.direct": "Avaa yksityismainintojen sarake", + "keyboard_shortcuts.down": "Siirry luettelossa eteenpäin", "keyboard_shortcuts.enter": "Avaa julkaisu", "keyboard_shortcuts.favourite": "Lisää julkaisu suosikkeihin", "keyboard_shortcuts.favourites": "Avaa suosikkiluettelo", @@ -389,32 +391,32 @@ "keyboard_shortcuts.hotkey": "Pikanäppäin", "keyboard_shortcuts.legend": "Näytä tämä ohje", "keyboard_shortcuts.local": "Avaa paikallinen aikajana", - "keyboard_shortcuts.mention": "Mainitse julkaisija", + "keyboard_shortcuts.mention": "Mainitse tekijä", "keyboard_shortcuts.muted": "Avaa mykistettyjen käyttäjien luettelo", "keyboard_shortcuts.my_profile": "Avaa profiilisi", "keyboard_shortcuts.notifications": "Avaa ilmoitussarake", "keyboard_shortcuts.open_media": "Avaa media", "keyboard_shortcuts.pinned": "Avaa kiinnitettyjen julkaisujen luettelo", - "keyboard_shortcuts.profile": "Avaa kirjoittajan profiili", + "keyboard_shortcuts.profile": "Avaa tekijän profiili", "keyboard_shortcuts.reply": "Vastaa julkaisuun", - "keyboard_shortcuts.requests": "Avaa seuraamispyyntöjen luettelo", + "keyboard_shortcuts.requests": "Avaa seurantapyyntöjen luettelo", "keyboard_shortcuts.search": "Kohdista hakukenttään", - "keyboard_shortcuts.spoilers": "Näytä/piilota sisältövaroituskenttä", + "keyboard_shortcuts.spoilers": "Näytä tai piilota sisältövaroituskenttä", "keyboard_shortcuts.start": "Avaa Näin pääset alkuun -sarake", - "keyboard_shortcuts.toggle_hidden": "Näytä/piilota sisältövaroituksella merkitty teksti", - "keyboard_shortcuts.toggle_sensitivity": "Näytä/piilota media", + "keyboard_shortcuts.toggle_hidden": "Näytä tai piilota sisältövaroituksella merkitty teksti", + "keyboard_shortcuts.toggle_sensitivity": "Näytä tai piilota media", "keyboard_shortcuts.toot": "Luo uusi julkaisu", - "keyboard_shortcuts.unfocus": "Poistu teksti-/hakukentästä", - "keyboard_shortcuts.up": "Siirry listassa ylöspäin", + "keyboard_shortcuts.unfocus": "Poistu kirjoitus- tai hakukentästä", + "keyboard_shortcuts.up": "Siirry luettelossa taaksepäin", "lightbox.close": "Sulje", "lightbox.compress": "Tiivis kuvankatselunäkymä", "lightbox.expand": "Laajennettu kuvankatselunäkymä", "lightbox.next": "Seuraava", "lightbox.previous": "Edellinen", "limited_account_hint.action": "Näytä profiili joka tapauksessa", - "limited_account_hint.title": "Palvelimen {domain} valvojat ovat piilottaneet tämän käyttäjätilin.", - "link_preview.author": "Julkaissut {name}", - "link_preview.more_from_author": "Lisää käyttäjältä {name}", + "limited_account_hint.title": "Palvelimen {domain} moderaattorit ovat piilottaneet tämän profiilin.", + "link_preview.author": "Tehnyt {name}", + "link_preview.more_from_author": "Lisää tekijältä {name}", "link_preview.shares": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}", "lists.account.add": "Lisää listalle", "lists.account.remove": "Poista listalta", @@ -428,7 +430,7 @@ "lists.replies_policy.list": "Listan jäsenille", "lists.replies_policy.none": "Ei kellekään", "lists.replies_policy.title": "Näytä vastaukset:", - "lists.search": "Etsi seuraamiesi henkilöiden keskuudesta", + "lists.search": "Hae seuraamistasi käyttäjistä", "lists.subheading": "Omat listasi", "load_pending": "{count, plural, one {# uusi kohde} other {# uutta kohdetta}}", "loading_indicator.label": "Ladataan…", @@ -436,26 +438,28 @@ "moved_to_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä, koska teit siirron tiliin {movedToAccount}.", "mute_modal.hide_from_notifications": "Piilota ilmoituksista", "mute_modal.hide_options": "Piilota vaihtoehdot", - "mute_modal.indefinite": "Kunnes perun häntä koskevan mykistyksen", + "mute_modal.indefinite": "Kunnes kumoan häntä koskevan mykistyksen", "mute_modal.show_options": "Näytä vaihtoehdot", "mute_modal.they_can_mention_and_follow": "Hän voi mainita sinut ja seurata sinua, mutta sinä et näe häntä.", - "mute_modal.they_wont_know": "Hän ei saa ilmoitusta tulleensa mykistetyksi.", + "mute_modal.they_wont_know": "Hän ei saa tietää tulleensa mykistetyksi.", "mute_modal.title": "Mykistetäänkö käyttäjä?", - "mute_modal.you_wont_see_mentions": "Et tule enää näkemään julkaisuja, joissa hänet mainitaan.", + "mute_modal.you_wont_see_mentions": "Et näe enää julkaisuja, joissa hänet mainitaan.", "mute_modal.you_wont_see_posts": "Hän voi yhä nähdä julkaisusi, mutta sinä et näe hänen.", + "name_and_others": "{name} ja {count, plural, one {# muu} other {# muuta}}", + "name_and_others_with_link": "{name} ja {count, plural, one {# muu} other {# muuta}}", "navigation_bar.about": "Tietoja", "navigation_bar.advanced_interface": "Avaa edistyneessä selainkäyttöliittymässä", "navigation_bar.blocks": "Estetyt käyttäjät", "navigation_bar.bookmarks": "Kirjanmerkit", "navigation_bar.community_timeline": "Paikallinen aikajana", "navigation_bar.compose": "Luo uusi julkaisu", - "navigation_bar.direct": "Yksityiset maininnat", + "navigation_bar.direct": "Yksityismaininnat", "navigation_bar.discover": "Löydä uutta", "navigation_bar.domain_blocks": "Estetyt verkkotunnukset", "navigation_bar.explore": "Selaa", "navigation_bar.favourites": "Suosikit", "navigation_bar.filters": "Mykistetyt sanat", - "navigation_bar.follow_requests": "Seuraamispyynnöt", + "navigation_bar.follow_requests": "Seurantapyynnöt", "navigation_bar.followed_tags": "Seuratut aihetunnisteet", "navigation_bar.follows_and_followers": "Seuratut ja seuraajat", "navigation_bar.lists": "Listat", @@ -466,48 +470,58 @@ "navigation_bar.pins": "Kiinnitetyt julkaisut", "navigation_bar.preferences": "Asetukset", "navigation_bar.public_timeline": "Yleinen aikajana", - "navigation_bar.search": "Hae", + "navigation_bar.search": "Haku", "navigation_bar.security": "Turvallisuus", "not_signed_in_indicator.not_signed_in": "Sinun on kirjauduttava sisään käyttääksesi resurssia.", - "notification.admin.report": "{name} teki ilmoituksen käytäjästä {target}", + "notification.admin.report": "{name} raportoi käyttäjän {target}", + "notification.admin.report_account": "{name} raportoi {count, plural, one {julkaisun} other {# julkaisua}} käyttäjältä {target}, syynä {category}", + "notification.admin.report_account_other": "{name} raportoi {count, plural, one {julkaisun} other {# julkaisua}} käyttäjältä {target}", + "notification.admin.report_statuses": "{name} raportoi käyttäjän {target}, syynä {category}", + "notification.admin.report_statuses_other": "{name} raportoi käyttäjän {target}", "notification.admin.sign_up": "{name} rekisteröityi", "notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa", "notification.follow": "{name} seurasi sinua", - "notification.follow_request": "{name} on pyytänyt lupaa saada seurata sinua", + "notification.follow_request": "{name} on pyytänyt lupaa seurata sinua", "notification.mention": "{name} mainitsi sinut", "notification.moderation-warning.learn_more": "Lue lisää", "notification.moderation_warning": "Olet saanut moderointivaroituksen", - "notification.moderation_warning.action_delete_statuses": "Jotkin julkaisusi on poistettu.", + "notification.moderation_warning.action_delete_statuses": "Julkaisujasi on poistettu.", "notification.moderation_warning.action_disable": "Tilisi on poistettu käytöstä.", - "notification.moderation_warning.action_mark_statuses_as_sensitive": "Jotkin julkaisusi on merkitty arkaluonteisiksi.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Julkaisujasi on merkitty arkaluonteisiksi.", "notification.moderation_warning.action_none": "Tilisi on saanut moderointivaroituksen.", "notification.moderation_warning.action_sensitive": "Tästä lähtien julkaisusi merkitään arkaluonteisiksi.", "notification.moderation_warning.action_silence": "Tiliäsi on rajoitettu.", "notification.moderation_warning.action_suspend": "Tilisi on jäädytetty.", "notification.own_poll": "Äänestyksesi on päättynyt", - "notification.poll": "Kysely, johon osallistuit, on päättynyt", + "notification.poll": "Äänestys, johon osallistuit, on päättynyt", + "notification.private_mention": "{name} mainitsi sinut yksityisesti", "notification.reblog": "{name} tehosti julkaisuasi", "notification.relationships_severance_event": "Menetettiin yhteydet palvelimeen {name}", "notification.relationships_severance_event.account_suspension": "Palvelimen {from} ylläpitäjä on jäädyttänyt palvelimen {target} vuorovaikutuksen. Enää et voi siis vastaanottaa päivityksiä heiltä tai olla yhteyksissä heidän kanssaan.", "notification.relationships_severance_event.domain_block": "Palvelimen {from} ylläpitäjä on estänyt palvelimen {target} vuorovaikutuksen – mukaan lukien {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.", "notification.relationships_severance_event.learn_more": "Lue lisää", - "notification.relationships_severance_event.user_domain_block": "Olet estänyt palvelimen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.", + "notification.relationships_severance_event.user_domain_block": "Olet estänyt verkkotunnuksen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.", "notification.status": "{name} julkaisi juuri", "notification.update": "{name} muokkasi julkaisua", "notification_requests.accept": "Hyväksy", "notification_requests.dismiss": "Hylkää", + "notification_requests.maximize": "Suurenna", + "notification_requests.minimize_banner": "Pienennä suodatettujen ilmoitusten palkki", "notification_requests.notifications_from": "Ilmoitukset käyttäjältä {name}", "notification_requests.title": "Suodatetut ilmoitukset", "notifications.clear": "Tyhjennä ilmoitukset", "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?", - "notifications.column_settings.admin.report": "Uudet ilmoitukset:", + "notifications.clear_title": "Tyhjennetäänkö ilmoitukset?", + "notifications.column_settings.admin.report": "Uudet raportit:", "notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:", "notifications.column_settings.alert": "Työpöytäilmoitukset", + "notifications.column_settings.beta.category": "Kokeelliset ominaisuudet", + "notifications.column_settings.beta.grouping": "Ryhmittele ilmoitukset", "notifications.column_settings.favourite": "Suosikit:", "notifications.column_settings.filter_bar.advanced": "Näytä kaikki luokat", "notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki", "notifications.column_settings.follow": "Uudet seuraajat:", - "notifications.column_settings.follow_request": "Uudet seuraamispyynnöt:", + "notifications.column_settings.follow_request": "Uudet seurantapyynnöt:", "notifications.column_settings.mention": "Maininnat:", "notifications.column_settings.poll": "Äänestyksen tulokset:", "notifications.column_settings.push": "Puskuilmoitukset", @@ -521,23 +535,23 @@ "notifications.filter.all": "Kaikki", "notifications.filter.boosts": "Tehostukset", "notifications.filter.favourites": "Suosikit", - "notifications.filter.follows": "Seuraa", + "notifications.filter.follows": "Seuraamiset", "notifications.filter.mentions": "Maininnat", "notifications.filter.polls": "Äänestyksen tulokset", - "notifications.filter.statuses": "Päivitykset henkilöiltä, joita seuraat", - "notifications.grant_permission": "Myönnä lupa.", + "notifications.filter.statuses": "Päivitykset seuraamiltasi käyttäjiltä", + "notifications.grant_permission": "Myönnä käyttöoikeus.", "notifications.group": "{count} ilmoitusta", "notifications.mark_as_read": "Merkitse jokainen ilmoitus luetuksi", "notifications.permission_denied": "Työpöytäilmoitukset eivät ole käytettävissä, koska selaimen käyttöoikeuspyyntö on aiemmin evätty", - "notifications.permission_denied_alert": "Työpöytäilmoituksia ei voi ottaa käyttöön, koska selaimen käyttöoikeus on aiemmin estetty", - "notifications.permission_required": "Työpöytäilmoitukset eivät ole käytettävissä, koska siihen tarvittavaa lupaa ei ole myönnetty.", - "notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viimeisimmän päivän aikana} other {# viime päivän aikana}}", + "notifications.permission_denied_alert": "Työpöytäilmoituksia ei voi ottaa käyttöön, koska selaimen käyttöoikeus on aiemmin evätty", + "notifications.permission_required": "Työpöytäilmoitukset eivät ole käytettävissä, koska siihen tarvittavaa käyttöoikeutta ei ole myönnetty.", + "notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viime päivän} other {viimeisen # päivän}} aikana", "notifications.policy.filter_new_accounts_title": "Uudet tilit", - "notifications.policy.filter_not_followers_hint": "Mukaan lukien alle {days, plural, one {päivän} other {# päivän}} verran sinua seuranneet", - "notifications.policy.filter_not_followers_title": "Henkilöt, jotka eivät seuraa sinua", - "notifications.policy.filter_not_following_hint": "Kunnes hyväksyt ne omin käsin", - "notifications.policy.filter_not_following_title": "Henkilöt, joita et seuraa", - "notifications.policy.filter_private_mentions_hint": "Suodatetaan, ellei se vastaa omaan mainintaasi tai ellet seuraa lähettäjää", + "notifications.policy.filter_not_followers_hint": "Mukaan lukien alle {days, plural, one {päivän} other {# päivää}} sinua seuranneet", + "notifications.policy.filter_not_followers_title": "Käyttäjät, jotka eivät seuraa sinua", + "notifications.policy.filter_not_following_hint": "Kunnes hyväksyt heidät manuaalisesti", + "notifications.policy.filter_not_following_title": "Käyttäjät, joita et seuraa", + "notifications.policy.filter_private_mentions_hint": "Suodatetaan, ellei se ole vastaus omaan mainintaasi tai ellet seuraa lähettäjää", "notifications.policy.filter_private_mentions_title": "Ei-toivotut yksityismaininnat", "notifications.policy.title": "Suodata ilmoitukset pois kohteesta…", "notifications_permission_banner.enable": "Ota työpöytäilmoitukset käyttöön", @@ -560,8 +574,8 @@ "onboarding.profile.note_hint": "Voit @mainita muita käyttäjiä tai #aihetunnisteita…", "onboarding.profile.save_and_continue": "Tallenna ja jatka", "onboarding.profile.title": "Profiilin määritys", - "onboarding.profile.upload_avatar": "Lataa profiilikuva", - "onboarding.profile.upload_header": "Lataa profiilin otsakekuva", + "onboarding.profile.upload_avatar": "Lähetä profiilikuva", + "onboarding.profile.upload_header": "Lähetä profiilin otsakekuva", "onboarding.share.lead": "Kerro ihmisille, kuinka he voivat löytää sinut Mastodonista!", "onboarding.share.message": "Olen {username} #Mastodon⁠issa! Seuraa minua osoitteessa {url}", "onboarding.share.next_steps": "Mahdolliset seuraavat vaiheet:", @@ -569,7 +583,7 @@ "onboarding.start.lead": "Uusi Mastodon-tilisi on nyt valmiina käyttöön. Kyseessä on ainutlaatuinen, hajautettu sosiaalisen median alusta, jolla sinä itse – algoritmin sijaan – määrität käyttökokemuksesi. Näin hyödyt Mastodonista eniten:", "onboarding.start.skip": "Haluatko hypätä suoraan eteenpäin ilman alkuunpääsyohjeistuksia?", "onboarding.start.title": "Olet tehnyt sen!", - "onboarding.steps.follow_people.body": "Mastodon perustuu sinua kiinnostavien henkilöjen julkaisujen seuraamiseen.", + "onboarding.steps.follow_people.body": "Mastodonissa on kyse kiinnostavien käyttäjien seuraamisesta.", "onboarding.steps.follow_people.title": "Mukauta kotisyötettäsi", "onboarding.steps.publish_status.body": "Tervehdi maailmaa sanoin, kuvin tai äänestyksin {emoji}", "onboarding.steps.publish_status.title": "Laadi ensimmäinen julkaisusi", @@ -577,36 +591,36 @@ "onboarding.steps.setup_profile.title": "Mukauta profiiliasi", "onboarding.steps.share_profile.body": "Kerro kavereillesi, kuinka sinut löytää Mastodonista", "onboarding.steps.share_profile.title": "Jaa Mastodon-profiilisi", - "onboarding.tips.2fa": "Tiesitkö? Voit suojata tilisi ottamalla kaksivaiheisen todennuksen käyttöön tilisi asetuksista. Se toimii millä tahansa TOTP-sovelluksella, eikä sen käyttö edellytä puhelinnumeron antoa!", - "onboarding.tips.accounts_from_other_servers": "Tiesitkö? Koska Mastodon on hajautettu, osa kohtaamistasi profiileista sijaitsee muilla kuin sinun palvelimellasi. Voit silti viestiä saumattomasti heidän kanssaan! Heidän palvelimensa mainitaan käyttäjänimen jälkiosassa!", + "onboarding.tips.2fa": "Tiesitkö? Voit suojata tilisi ottamalla kaksivaiheisen todennuksen käyttöön tilisi asetuksista. Se toimii millä tahansa TOTP-sovelluksella, eikä sen käyttö edellytä puhelinnumeron luovuttamista!", + "onboarding.tips.accounts_from_other_servers": "Tiesitkö? Koska Mastodon on hajautettu, osa kohtaamistasi profiileista sijaitsee muilla kuin sinun palvelimellasi. Voit silti viestiä saumattomasti heidän kanssaan! Heidän palvelimensa mainitaan käyttäjätunnuksen jälkiosassa!", "onboarding.tips.migration": "Tiesitkö? Jos koet, ettei {domain} ole jatkossa itsellesi hyvä palvelinvalinta, voit siirtyä toiselle Mastodon-palvelimelle menettämättä seuraajiasi. Voit jopa isännöidä omaa palvelintasi!", "onboarding.tips.verification": "Tiesitkö? Voit vahvistaa tilisi lisäämällä omalle verkkosivustollesi linkin Mastodon-profiiliisi ja lisäämällä sitten verkkosivustosi osoitteen Mastodon-profiilisi lisäkenttään. Tämä ei maksa mitään, eikä sinun tarvitse lähetellä asiakirjoja!", "password_confirmation.exceeds_maxlength": "Salasanan vahvistus ylittää salasanan enimmäispituuden", "password_confirmation.mismatching": "Salasanan vahvistus ei täsmää", "picture_in_picture.restore": "Laita se takaisin", - "poll.closed": "Suljettu", + "poll.closed": "Päättynyt", "poll.refresh": "Päivitä", "poll.reveal": "Näytä tulokset", - "poll.total_people": "{count, plural, one {# henkilö} other {# henkilöä}}", + "poll.total_people": "{count, plural, one {# käyttäjä} other {# käyttäjää}}", "poll.total_votes": "{count, plural, one {# ääni} other {# ääntä}}", "poll.vote": "Äänestä", "poll.voted": "Äänestit tätä vastausta", "poll.votes": "{votes, plural, one {# ääni} other {# ääntä}}", - "poll_button.add_poll": "Lisää kysely", - "poll_button.remove_poll": "Poista kysely", + "poll_button.add_poll": "Lisää äänestys", + "poll_button.remove_poll": "Poista äänestys", "privacy.change": "Muuta julkaisun näkyvyyttä", "privacy.direct.long": "Kaikki tässä julkaisussa mainitut", - "privacy.direct.short": "Tietyt henkilöt", + "privacy.direct.short": "Tietyt käyttäjät", "privacy.private.long": "Vain seuraajasi", "privacy.private.short": "Seuraajat", "privacy.public.long": "Kuka tahansa Mastodonissa ja sen ulkopuolella", "privacy.public.short": "Julkinen", - "privacy.unlisted.additional": "Tämä on muutoin kuin julkinen julkaisu, mutta sitä ei näytetä livesyöte-, aihetunniste- tai selailunäkymissä eikä Mastodon-hakutuloksissakaan, vaikka ne olisivat käyttäjätililläsi yleisesti sallittuina.", + "privacy.unlisted.additional": "Tämä toimii muuten kuin julkinen, mutta julkaisut eivät näy livesyöte-, aihetunniste- tai selausnäkymissä eivätkä Mastodonin hakutuloksissa, vaikka ne olisivat käyttäjätililläsi yleisesti sallittuina.", "privacy.unlisted.long": "Vähemmän algoritmiperusteista sisältöä", "privacy.unlisted.short": "Vaivihkaisesti julkinen", - "privacy_policy.last_updated": "Viimeksi päivitetty {date}", + "privacy_policy.last_updated": "Päivitetty viimeksi {date}", "privacy_policy.title": "Tietosuojakäytäntö", - "recommended": "Suositeltu", + "recommended": "Suositellaan", "refresh": "Päivitä", "regeneration_indicator.label": "Ladataan…", "regeneration_indicator.sublabel": "Kotisyötettäsi valmistellaan!", @@ -623,27 +637,27 @@ "relative_time.today": "tänään", "reply_indicator.attachments": "{count, plural, one {# liite} other {# liitettä}}", "reply_indicator.cancel": "Peruuta", - "reply_indicator.poll": "Kysely", + "reply_indicator.poll": "Äänestys", "report.block": "Estä", "report.block_explanation": "Et näe hänen viestejään, eikä hän voi nähdä viestejäsi tai seurata sinua. Hän näkee, että olet estänyt hänet.", - "report.categories.legal": "Juridiset tiedot", + "report.categories.legal": "Lakiseikat", "report.categories.other": "Muu", "report.categories.spam": "Roskaposti", "report.categories.violation": "Sisältö rikkoo yhtä tai useampaa palvelimen säännöistä", "report.category.subtitle": "Valitse sopivin", "report.category.title": "Kerro meille, miksi tämä {type} pitää raportoida", - "report.category.title_account": "profiilissa", - "report.category.title_status": "julkaisussa", + "report.category.title_account": "profiili", + "report.category.title_status": "julkaisu", "report.close": "Valmis", "report.comment.title": "Onko vielä jotain muuta, mitä meidän pitäisi tietää?", - "report.forward": "Välitä kohteeseen {target}", + "report.forward": "Välitä palvelimelle {target}", "report.forward_hint": "Tämä tili on toisella palvelimella. Haluatko lähettää nimettömän raportin myös sinne?", "report.mute": "Mykistä", "report.mute_explanation": "Et näe hänen julkaisujaan. Hän voi silti seurata sinua ja nähdä julkaisusi. Hän ei tiedä, että hänet on mykistetty.", "report.next": "Seuraava", "report.placeholder": "Lisäkommentit", "report.reasons.dislike": "En pidä siitä", - "report.reasons.dislike_description": "Sisältö on sen tyyppistä, ettet halua nähdä sitä", + "report.reasons.dislike_description": "Sisältö on sellaista, jota et halua nähdä", "report.reasons.legal": "Se on laitonta", "report.reasons.legal_description": "Katsot sisällön rikkovan maasi tai palvelimen kotimaan lakeja", "report.reasons.other": "Jotain muuta", @@ -654,28 +668,32 @@ "report.reasons.violation_description": "Tiedät sisällön rikkovan tiettyjä sääntöjä", "report.rules.subtitle": "Valitse kaikki sopivat", "report.rules.title": "Mitä sääntöjä rikotaan?", - "report.statuses.subtitle": "Valitse kaikki soveltuvat julkaisut", + "report.statuses.subtitle": "Valitse kaikki sopivat", "report.statuses.title": "Onko julkaisuja, jotka tukevat tätä raporttia?", "report.submit": "Lähetä", "report.target": "Raportoidaan {target}", "report.thanks.take_action": "Tässä on vaihtoehtosi hallita näkemääsi Mastodonissa:", - "report.thanks.take_action_actionable": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimenpiteisiin käyttäjää @{name} vastaan:", + "report.thanks.take_action_actionable": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimiin käyttäjää @{name} kohtaan:", "report.thanks.title": "Etkö halua nähdä tätä?", - "report.thanks.title_actionable": "Kiitos raportista, tutkimme asiaa.", + "report.thanks.title_actionable": "Kiitos raportista – tutkimme asiaa.", "report.unfollow": "Lopeta käyttäjän @{name} seuraaminen", - "report.unfollow_explanation": "Seuraat tätä tiliä. Estääksesi tilin viestejä näykymästä kotisyötteessäsi, lopeta sen seuraaminen.", + "report.unfollow_explanation": "Seuraat tätä tiliä. Jotta et enää näkisi sen julkaisuja kotisyötteessäsi, lopeta tilin seuraaminen.", "report_notification.attached_statuses": "{count, plural, one {{count} julkaisu} other {{count} julkaisua}} liitteenä", - "report_notification.categories.legal": "Laillinen", + "report_notification.categories.legal": "Lakiseikat", + "report_notification.categories.legal_sentence": "laiton sisältö", "report_notification.categories.other": "Muu", + "report_notification.categories.other_sentence": "jokin muu", "report_notification.categories.spam": "Roskaposti", + "report_notification.categories.spam_sentence": "roskaposti", "report_notification.categories.violation": "Sääntörikkomus", + "report_notification.categories.violation_sentence": "sääntörikkomus", "report_notification.open": "Avaa raportti", "search.no_recent_searches": "Ei viimeaikaisia hakuja", "search.placeholder": "Hae", "search.quick_action.account_search": "Profiilit haulla {x}", "search.quick_action.go_to_account": "Siirry profiiliin {x}", "search.quick_action.go_to_hashtag": "Siirry aihetunnisteeseen {x}", - "search.quick_action.open_url": "Avaa verkko-osoite Mastodonissa", + "search.quick_action.open_url": "Avaa URL-osoite Mastodonissa", "search.quick_action.status_search": "Julkaisut haulla {x}", "search.search_or_paste": "Hae tai liitä URL-osoite", "search_popout.full_text_search_disabled_message": "Ei saatavilla palvelimella {domain}.", @@ -699,22 +717,22 @@ "server_banner.is_one_of_many": "{domain} on yksi monista itsenäisistä Mastodon-palvelimista, joiden välityksellä voit toimia fediversumissa.", "server_banner.server_stats": "Palvelimen tilastot:", "sign_in_banner.create_account": "Luo tili", - "sign_in_banner.follow_anyone": "Seuraa kenen tahansa julkaisuja fediversumissa ja näe ne kaikki aikajärjestyksessä. Ei algoritmejä, mainoksia tai klikkikalastelua.", + "sign_in_banner.follow_anyone": "Seuraa kenen tahansa julkaisuja fediversumissa ja näe ne kaikki aikajärjestyksessä. Ei algoritmeja, mainoksia eikä klikkausten kalastelua.", "sign_in_banner.mastodon_is": "Mastodon on paras tapa pysyä ajan tasalla siitä, mitä ympärillä tapahtuu.", "sign_in_banner.sign_in": "Kirjaudu", "sign_in_banner.sso_redirect": "Kirjaudu tai rekisteröidy", - "status.admin_account": "Avaa tilin @{name} valvontanäkymä", - "status.admin_domain": "Avaa palvelimen {domain} valvontanäkymä", - "status.admin_status": "Avaa julkaisu valvontanäkymässä", + "status.admin_account": "Avaa tilin @{name} moderointinäkymä", + "status.admin_domain": "Avaa palvelimen {domain} moderointinäkymä", + "status.admin_status": "Avaa julkaisu moderointinäkymässä", "status.block": "Estä @{name}", "status.bookmark": "Lisää kirjanmerkki", "status.cancel_reblog_private": "Peru tehostus", "status.cannot_reblog": "Tätä julkaisua ei voi tehostaa", - "status.copy": "Kopioi julkaisun linkki", + "status.copy": "Kopioi linkki julkaisuun", "status.delete": "Poista", "status.detailed_status": "Yksityiskohtainen keskustelunäkymä", "status.direct": "Mainitse @{name} yksityisesti", - "status.direct_indicator": "Yksityinen maininta", + "status.direct_indicator": "Yksityismaininta", "status.edit": "Muokkaa", "status.edited": "Viimeksi muokattu {date}", "status.edited_x_times": "Muokattu {count, plural, one {{count} kerran} other {{count} kertaa}}", @@ -765,7 +783,7 @@ "status.unpin": "Irrota profiilista", "subscribed_languages.lead": "Vain valituilla kielillä kirjoitetut julkaisut näkyvät koti- ja lista-aikajanoillasi muutoksen jälkeen. Älä valitse mitään, jos haluat nähdä julkaisuja kaikilla kielillä.", "subscribed_languages.save": "Tallenna muutokset", - "subscribed_languages.target": "Vaihda tilatut kielet {target}", + "subscribed_languages.target": "Vaihda tilattuja kieliä käyttäjältä {target}", "tabs_bar.home": "Koti", "tabs_bar.notifications": "Ilmoitukset", "time_remaining.days": "{number, plural, one {# päivä} other {# päivää}} jäljellä", @@ -773,20 +791,20 @@ "time_remaining.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} jäljellä", "time_remaining.moments": "Hetkiä jäljellä", "time_remaining.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} jäljellä", - "timeline_hint.remote_resource_not_displayed": "Muiden palvelinten {resource}-tietoa ei näytetä täällä.", - "timeline_hint.resources.followers": "Seuraajat", - "timeline_hint.resources.follows": "seurattua", - "timeline_hint.resources.statuses": "Vanhemmat julkaisut", - "trends.counter_by_accounts": "{count, plural, one {{counter} henkilö} other {{counter} henkilöä}} {days, plural, one {viime päivänä} other {viimeisenä {days} päivänä}}", + "timeline_hint.remote_resource_not_displayed": "Muiden palvelinten {resource} eivät näy tässä.", + "timeline_hint.resources.followers": "seuraajat", + "timeline_hint.resources.follows": "seuratut", + "timeline_hint.resources.statuses": "vanhemmat julkaisut", + "trends.counter_by_accounts": "{count, plural, one {{counter} käyttäjä} other {{counter} käyttäjää}} {days, plural, one {viime päivänä} other {viimeisenä {days} päivänä}}", "trends.trending_now": "Suosittua nyt", "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.", "units.short.billion": "{count} mrd.", "units.short.million": "{count} milj.", "units.short.thousand": "{count} t.", - "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", + "upload_area.title": "Lähetä raahaamalla ja pudottamalla tähän", "upload_button.label": "Lisää kuvia, video tai äänitiedosto", - "upload_error.limit": "Tiedostolatauksien rajoitus ylitetty.", - "upload_error.poll": "Tiedostojen lisääminen ei ole sallittua kyselyjen ohessa.", + "upload_error.limit": "Tiedostolähetysten rajoitus ylitetty.", + "upload_error.poll": "Tiedostojen lisääminen äänestysten oheen ei ole sallittua.", "upload_form.audio_description": "Kuvaile sisältöä kuuroille ja kuulorajoitteisille", "upload_form.description": "Kuvaile sisältöä sokeille ja näkörajoitteisille", "upload_form.edit": "Muokkaa", @@ -802,9 +820,9 @@ "upload_modal.hint": "Napsauta tai vedä ympyrä esikatselussa valitaksesi keskipiste, joka näkyy aina pienoiskuvissa.", "upload_modal.preparing_ocr": "Valmistellaan tekstintunnistusta…", "upload_modal.preview_label": "Esikatselu ({ratio})", - "upload_progress.label": "Tallennetaan...", + "upload_progress.label": "Lähetetään…", "upload_progress.processing": "Käsitellään…", - "username.taken": "Käyttäjänimi on jo varattu. Kokeile toista", + "username.taken": "Tämä käyttäjänimi on jo käytössä. Kokeile toista", "video.close": "Sulje video", "video.download": "Lataa tiedosto", "video.exit_fullscreen": "Poistu koko näytön tilasta", diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index 9e459f76719..1bdcd6f54ec 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -112,8 +112,6 @@ "compose_form.spoiler.unmarked": "Idagdag ang babala sa nilalaman", "confirmation_modal.cancel": "Pagpaliban", "confirmations.block.confirm": "Harangan", - "confirmations.cancel_follow_request.confirm": "Bawiin ang kahilingan", - "confirmations.cancel_follow_request.message": "Sigurdo ka bang gusto mong bawiin ang kahilingang sundan si/ang {name}?", "confirmations.delete.message": "Sigurado ka bang gusto mong burahin ang post na ito?", "confirmations.delete_list.confirm": "Tanggalin", "confirmations.delete_list.message": "Sigurado ka bang gusto mong burahin ang listahang ito?", @@ -186,6 +184,7 @@ "follow_request.authorize": "Tanggapin", "follow_request.reject": "Tanggihan", "follow_suggestions.dismiss": "Huwag nang ipakita muli", + "follow_suggestions.popular_suggestion_longer": "Sikat sa {domain}", "follow_suggestions.view_all": "Tingnan lahat", "follow_suggestions.who_to_follow": "Sinong maaaring sundan", "footer.about": "Tungkol dito", @@ -220,6 +219,7 @@ "link_preview.author": "Ni/ng {name}", "lists.account.add": "Idagdag sa talaan", "lists.account.remove": "Tanggalin mula sa talaan", + "lists.delete": "Burahin ang talaan", "lists.new.create": "Idagdag sa talaan", "lists.new.title_placeholder": "Bagong pangalan ng talaan", "lists.replies_policy.title": "Ipakita ang mga tugon sa:", @@ -287,9 +287,13 @@ "reply_indicator.cancel": "Ipagpaliban", "report.block": "Harangan", "report.categories.other": "Iba pa", + "report.categories.violation": "Lumalabag ang nilalaman sa isa o higit pang mga patakaran ng serbiro", + "report.category.subtitle": "Piliin ang pinakamahusay na tugma", "report.category.title": "Sabihin mo sa amin kung anong nangyari sa {type} na ito", "report.close": "Tapos na", "report.next": "Sunod", + "report.placeholder": "Mga Karagdagang Puna", + "report.reasons.dislike": "Hindi ko gusto ito", "report.reasons.violation": "Lumalabag ito sa mga panuntunan ng serbiro", "report.reasons.violation_description": "Alam mo na lumalabag ito sa mga partikular na panuntunan", "report.rules.title": "Aling mga patakaran ang nilabag?", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 7a317820bbf..5f7062b11af 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -35,7 +35,7 @@ "account.follow_back": "Fylg aftur", "account.followers": "Fylgjarar", "account.followers.empty": "Ongar fylgjarar enn.", - "account.followers_counter": "{count, plural, one {{counter} Fylgjari} other {{counter} Fylgjarar}}", + "account.followers_counter": "{count, plural, one {{counter} fylgjari} other {{counter} fylgjarar}}", "account.following": "Fylgir", "account.following_counter": "{count, plural, one {{counter} fylgir} other {{counter} fylgja}}", "account.follows.empty": "Hesin brúkari fylgir ongum enn.", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Innihaldsávaring (valfrí)", "confirmation_modal.cancel": "Strika", "confirmations.block.confirm": "Banna", - "confirmations.cancel_follow_request.confirm": "Tak umbønina aftur", - "confirmations.cancel_follow_request.message": "Er tað tilætlað, at tú tekur umbønina at fylgja {name} aftur?", "confirmations.delete.confirm": "Strika", "confirmations.delete.message": "Er tað tilætlað, at tú strikar hetta uppslagið?", + "confirmations.delete.title": "Strika post?", "confirmations.delete_list.confirm": "Strika", "confirmations.delete_list.message": "Ert tú vís/ur í, at tú vilt strika hetta uppslagið?", + "confirmations.delete_list.title": "Strika lista?", "confirmations.discard_edit_media.confirm": "Vraka", "confirmations.discard_edit_media.message": "Tú hevur broytingar í miðlalýsingini ella undansýningini, sum ikki eru goymdar. Vilt tú kortini vraka?", - "confirmations.domain_block.confirm": "Banna ambætara", - "confirmations.domain_block.message": "Ert tú púra, púra vís/ur í, at tú vilt banna øllum {domain}? Í flestu førum er nóg mikið og betri, bert at banna ella doyva onkrum ávísum. Tú fert eingi evni at síggja frá økisnavninum á nakrari almennari tíðarrás ella í tínum fráboðanum. Tínir fylgjarar undir økisnavninum verða eisini strikaðir.", "confirmations.edit.confirm": "Rætta", "confirmations.edit.message": "Rættingar, sum verða gjørdar nú, skriva yvir boðini, sum tú ert í holt við. Ert tú vís/ur í, at tú vilt halda fram?", + "confirmations.edit.title": "Skriva omaná post?", "confirmations.logout.confirm": "Rita út", "confirmations.logout.message": "Ert tú vís/ur í, at tú vilt útrita teg?", + "confirmations.logout.title": "Rita út?", "confirmations.mute.confirm": "Doyv", "confirmations.redraft.confirm": "Sletta og skriva umaftur", "confirmations.redraft.message": "Vilt tú veruliga strika hendan postin og í staðin gera hann til eina nýggja kladdu? Yndisfrámerki og framhevjanir blíva burtur, og svar til upprunapostin missa tilknýtið.", + "confirmations.redraft.title": "Strika & ger nýtt uppskot um post?", "confirmations.reply.confirm": "Svara", "confirmations.reply.message": "Svarar tú nú, verða boðini, sum tú ert í holt við at skriva yvirskrivað. Ert tú vís/ur í, at tú vilt halda fram?", + "confirmations.reply.title": "Skriva omaná post?", "confirmations.unfollow.confirm": "Fylg ikki", "confirmations.unfollow.message": "Ert tú vís/ur í, at tú vil steðga við at fylgja {name}?", + "confirmations.unfollow.title": "Gevst at fylgja brúkara?", "conversation.delete": "Strika samrøðu", "conversation.mark_as_read": "Merk sum lisið", "conversation.open": "Vís samrøðu", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Brúka ein verandi bólk ella skapa ein nýggjan", "filter_modal.select_filter.title": "Filtrera hendan postin", "filter_modal.title.status": "Filtrera ein post", - "filtered_notifications_banner.mentions": "{count, plural, one {umrøða} other {umrøður}}", - "filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir", + "filtered_notifications_banner.pending_requests": "Frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir", "filtered_notifications_banner.title": "Sáldaðar fráboðanir", "firehose.all": "Allar", "firehose.local": "Hesin ambætarin", @@ -443,6 +445,8 @@ "mute_modal.title": "Sløkk brúkara?", "mute_modal.you_wont_see_mentions": "Tú sært ikki postar, sum nevna tey.", "mute_modal.you_wont_see_posts": "Tey síggja framvegis tínar postar, men tú sært ikki teirra.", + "name_and_others": "{name} og {count, plural, one {# annar} other {# onnur}}", + "name_and_others_with_link": "{name} og {count, plural, one {# annar} other {# onnur}}", "navigation_bar.about": "Um", "navigation_bar.advanced_interface": "Lat upp í framkomnum vevmarkamóti", "navigation_bar.blocks": "Bannaðir brúkarar", @@ -470,6 +474,10 @@ "navigation_bar.security": "Trygd", "not_signed_in_indicator.not_signed_in": "Tú mást rita inn fyri at fáa atgongd til hetta tilfarið.", "notification.admin.report": "{name} hevur meldað {target}", + "notification.admin.report_account": "{name} meldaði {count, plural, one {ein post} other {# postar}} frá {target} fyri {category}", + "notification.admin.report_account_other": "{name} meldaði {count, plural, one {ein post} other {# postar}} frá {target}", + "notification.admin.report_statuses": "{name} meldaði {target} fyri {category}", + "notification.admin.report_statuses_other": "{name} meldaði {target}", "notification.admin.sign_up": "{name} meldaði seg til", "notification.favourite": "{name} dámdi postin hjá tær", "notification.follow": "{name} fylgdi tær", @@ -485,7 +493,8 @@ "notification.moderation_warning.action_silence": "Konta tín er avmarkað.", "notification.moderation_warning.action_suspend": "Konta tín er ógildað.", "notification.own_poll": "Tín atkvøðugreiðsla er endað", - "notification.poll": "Ein atkvøðugreiðsla, har tú hevur atkvøtt, er endað", + "notification.poll": "Ein atkvøðugreiðsla, har tú atkvøddi, er endað", + "notification.private_mention": "{name} nevndi teg í privatum boðum", "notification.reblog": "{name} lyfti tín post", "notification.relationships_severance_event": "Mist sambond við {name}", "notification.relationships_severance_event.account_suspension": "Ein umsitari frá {from} hevur gjørt {target} óvirkna, sum merkir, at tú ikki kanst móttaka dagføringar ella virka saman við teimum longur.", @@ -496,13 +505,17 @@ "notification.update": "{name} rættaði ein post", "notification_requests.accept": "Góðtak", "notification_requests.dismiss": "Avvís", + "notification_requests.maximize": "Mesta", "notification_requests.notifications_from": "Fráboðanir frá {name}", "notification_requests.title": "Sáldaðar fráboðanir", "notifications.clear": "Rudda fráboðanir", "notifications.clear_confirmation": "Ert tú vís/ur í, at tú vilt strika allar tínar fráboðanir?", + "notifications.clear_title": "Rudda fráboðanir?", "notifications.column_settings.admin.report": "Nýggjar fráboðanir:", "notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:", "notifications.column_settings.alert": "Skriviborðsfráboðanir", + "notifications.column_settings.beta.category": "Royndarhentleikar", + "notifications.column_settings.beta.grouping": "Bólkafráboðanir", "notifications.column_settings.favourite": "Dámdir postar:", "notifications.column_settings.filter_bar.advanced": "Vís allar bólkar", "notifications.column_settings.filter_bar.category": "Skjótfilturbjálki", @@ -666,9 +679,13 @@ "report.unfollow_explanation": "Tú fylgir hesi kontuni. Gevst at fylgja henni, um tú ikki longur ynskir at síggja postarnar á heimarásini hjá tær.", "report_notification.attached_statuses": "{count, plural, one {{count} postur atknýttur} other {{count} postar atknýttir}}", "report_notification.categories.legal": "Løgfrøðisligt", + "report_notification.categories.legal_sentence": "ólógligt innihald", "report_notification.categories.other": "Aðrir", + "report_notification.categories.other_sentence": "aðrir", "report_notification.categories.spam": "Ruskpostur", + "report_notification.categories.spam_sentence": "ruskpostur", "report_notification.categories.violation": "Brotin regla", + "report_notification.categories.violation_sentence": "brot á reglu", "report_notification.open": "Opna melding", "search.no_recent_searches": "Ongar nýggjar leitingar", "search.placeholder": "Leita", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 50b7dcf90dc..ad442df778e 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -35,9 +35,7 @@ "account.follow_back": "S'abonner en retour", "account.followers": "abonné·e·s", "account.followers.empty": "Personne ne suit ce compte pour l'instant.", - "account.followers_counter": "{count, plural, one {{counter} Abonné·e} other {{counter} Abonné·e·s}}", "account.following": "Abonné·e", - "account.following_counter": "{count, plural, one {{counter} Abonnement} other {{counter} Abonnements}}", "account.follows.empty": "Ce compte ne suit personne présentement.", "account.go_to_profile": "Voir ce profil", "account.hide_reblogs": "Masquer les boosts de @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} a demandé à vous suivre", "account.share": "Partager le profil de @{name}", "account.show_reblogs": "Afficher les boosts de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Publication} other {{counter} Publications}}", "account.unblock": "Débloquer @{name}", "account.unblock_domain": "Débloquer le domaine {domain}", "account.unblock_short": "Débloquer", @@ -169,27 +166,30 @@ "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "confirmation_modal.cancel": "Annuler", "confirmations.block.confirm": "Bloquer", - "confirmations.cancel_follow_request.confirm": "Retirer cette demande", - "confirmations.cancel_follow_request.message": "Êtes-vous sûr de vouloir retirer votre demande pour suivre {name}?", "confirmations.delete.confirm": "Supprimer", "confirmations.delete.message": "Voulez-vous vraiment supprimer cette publication?", + "confirmations.delete.title": "Supprimer la publication ?", "confirmations.delete_list.confirm": "Supprimer", "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?", + "confirmations.delete_list.title": "Supprimer la liste ?", "confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, voulez-vous quand même les supprimer?", - "confirmations.domain_block.confirm": "Bloquer le serveur", - "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.edit.confirm": "Éditer", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", + "confirmations.edit.title": "Remplacer le message ?", "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?", + "confirmations.logout.title": "Se déconnecter ?", "confirmations.mute.confirm": "Masquer", "confirmations.redraft.confirm": "Supprimer et réécrire", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses ses mises en favori et boosts seront perdus et ses réponses seront orphelines.", + "confirmations.redraft.title": "Supprimer et réécrire le message ?", "confirmations.reply.confirm": "Répondre", "confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez présentement. Voulez-vous vraiment continuer?", + "confirmations.reply.title": "Remplacer le message ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name}?", + "confirmations.unfollow.title": "Se désabonner de l'utilisateur ?", "conversation.delete": "Supprimer cette conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher cette conversation", @@ -297,7 +297,6 @@ "filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle", "filter_modal.select_filter.title": "Filtrer cette publication", "filter_modal.title.status": "Filtrer une publication", - "filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {d’une personne} other {de # personnes}} que vous pouvez connaitre", "filtered_notifications_banner.title": "Notifications filtrées", "firehose.all": "Tout", "firehose.local": "Ce serveur", @@ -469,7 +468,6 @@ "notification.follow_request": "{name} a demandé à vous suivre", "notification.mention": "{name} vous a mentionné·e", "notification.own_poll": "Votre sondage est terminé", - "notification.poll": "Un sondage auquel vous avez participé est terminé", "notification.reblog": "{name} a boosté votre message", "notification.relationships_severance_event": "Connexions perdues avec {name}", "notification.relationships_severance_event.account_suspension": "Un·e administrateur·rice de {from} a suspendu {target}, ce qui signifie que vous ne pourrez plus recevoir de mises à jour ou interagir avec lui.", @@ -484,6 +482,7 @@ "notification_requests.title": "Notifications filtrées", "notifications.clear": "Effacer notifications", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications?", + "notifications.clear_title": "Effacer les notifications ?", "notifications.column_settings.admin.report": "Nouveaux signalements:", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:", "notifications.column_settings.alert": "Notifications navigateur", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 2e565c200f5..b849ab8f87a 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -35,9 +35,7 @@ "account.follow_back": "S'abonner en retour", "account.followers": "Abonné·e·s", "account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.", - "account.followers_counter": "{count, plural, one {{counter} Abonné·e} other {{counter} Abonné·e·s}}", "account.following": "Abonnements", - "account.following_counter": "{count, plural, one {{counter} Abonnement} other {{counter} Abonnements}}", "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.", "account.go_to_profile": "Aller au profil", "account.hide_reblogs": "Masquer les partages de @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} a demandé à vous suivre", "account.share": "Partager le profil de @{name}", "account.show_reblogs": "Afficher les partages de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Message} other {{counter} Messages}}", "account.unblock": "Débloquer @{name}", "account.unblock_domain": "Débloquer le domaine {domain}", "account.unblock_short": "Débloquer", @@ -169,27 +166,30 @@ "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "confirmation_modal.cancel": "Annuler", "confirmations.block.confirm": "Bloquer", - "confirmations.cancel_follow_request.confirm": "Retirer la demande", - "confirmations.cancel_follow_request.message": "Êtes-vous sûr de vouloir retirer votre demande pour suivre {name} ?", "confirmations.delete.confirm": "Supprimer", "confirmations.delete.message": "Voulez-vous vraiment supprimer ce message ?", + "confirmations.delete.title": "Supprimer la publication ?", "confirmations.delete_list.confirm": "Supprimer", "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste ?", + "confirmations.delete_list.title": "Supprimer la liste ?", "confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, les supprimer quand même ?", - "confirmations.domain_block.confirm": "Bloquer le serveur", - "confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.edit.confirm": "Modifier", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", + "confirmations.edit.title": "Remplacer le message ?", "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?", + "confirmations.logout.title": "Se déconnecter ?", "confirmations.mute.confirm": "Masquer", "confirmations.redraft.confirm": "Supprimer et ré-écrire", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire ? Ses partages ainsi que ses mises en favori seront perdus et ses réponses seront orphelines.", + "confirmations.redraft.title": "Supprimer et réécrire le message ?", "confirmations.reply.confirm": "Répondre", "confirmations.reply.message": "Répondre maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", + "confirmations.reply.title": "Remplacer le message ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name} ?", + "confirmations.unfollow.title": "Se désabonner de l'utilisateur ?", "conversation.delete": "Supprimer la conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher la conversation", @@ -297,7 +297,6 @@ "filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle", "filter_modal.select_filter.title": "Filtrer ce message", "filter_modal.title.status": "Filtrer un message", - "filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {d’une personne} other {de # personnes}} que vous pouvez connaitre", "filtered_notifications_banner.title": "Notifications filtrées", "firehose.all": "Tout", "firehose.local": "Ce serveur", @@ -469,7 +468,6 @@ "notification.follow_request": "{name} a demandé à vous suivre", "notification.mention": "{name} vous a mentionné·e :", "notification.own_poll": "Votre sondage est terminé", - "notification.poll": "Un sondage auquel vous avez participé vient de se terminer", "notification.reblog": "{name} a partagé votre message", "notification.relationships_severance_event": "Connexions perdues avec {name}", "notification.relationships_severance_event.account_suspension": "Un·e administrateur·rice de {from} a suspendu {target}, ce qui signifie que vous ne pourrez plus recevoir de mises à jour ou interagir avec lui.", @@ -484,6 +482,7 @@ "notification_requests.title": "Notifications filtrées", "notifications.clear": "Effacer les notifications", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications ?", + "notifications.clear_title": "Effacer les notifications ?", "notifications.column_settings.admin.report": "Nouveaux signalements :", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :", "notifications.column_settings.alert": "Notifications du navigateur", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 11b11ff819f..3045def0282 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Ynhâldswarskôging (opsjoneel)", "confirmation_modal.cancel": "Annulearje", "confirmations.block.confirm": "Blokkearje", - "confirmations.cancel_follow_request.confirm": "Fersyk annulearje", - "confirmations.cancel_follow_request.message": "Binne jo wis dat jo jo fersyk om {name} te folgjen annulearje wolle?", "confirmations.delete.confirm": "Fuortsmite", "confirmations.delete.message": "Binne jo wis dat jo dit berjocht fuortsmite wolle?", "confirmations.delete_list.confirm": "Fuortsmite", "confirmations.delete_list.message": "Binne jo wis dat jo dizze list foar permanint fuortsmite wolle?", "confirmations.discard_edit_media.confirm": "Fuortsmite", "confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?", - "confirmations.domain_block.confirm": "Server blokkearje", - "confirmations.domain_block.message": "Binne jo echt wis dat jo alles fan {domain} negearje wolle? Yn de measte gefallen is it blokkearjen of negearjen fan in pear spesifike persoanen genôch en better. Jo sille gjin berjochten fan dizze server op iepenbiere tiidlinen sjen of yn jo meldingen. Jo folgers fan dizze server wurde fuortsmiten.", "confirmations.edit.confirm": "Bewurkje", "confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?", "confirmations.logout.confirm": "Ofmelde", @@ -227,6 +223,7 @@ "domain_pill.whats_in_a_handle": "Wat is in fediverse-adres?", "domain_pill.who_they_are": "Omdat jo oan in fediverse-adres sjen kinne hoe’t ien hjit en op hokker server dy sit, kinne jo mei minsken op it troch sosjale web (fediverse) kommunisearje.", "domain_pill.your_handle": "Jo fediverse-adres:", + "domain_pill.your_username": "Jo unike identifikaasje-adres op dizze server. It is mooglik dat der brûkers mei deselde brûkersnamme op ferskate servers te finen binne.", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Sa komt it der út te sjen:", "emoji_button.activity": "Aktiviteiten", @@ -302,6 +299,8 @@ "follow_requests.unlocked_explanation": "Ek al is jo account net besletten, de meiwurkers fan {domain} tinke dat jo miskien de folgjende folchfersiken hânmjittich kontrolearje.", "follow_suggestions.curated_suggestion": "Spesjaal selektearre", "follow_suggestions.dismiss": "Net mear werjaan", + "follow_suggestions.featured_longer": "Hânmjittich selektearre troch it team fan {domain}", + "follow_suggestions.friends_of_friends_longer": "Populêr ûnder minsken dy’t jo folgje", "follow_suggestions.hints.featured": "Dit profyl is hânmjittich troch it {domain}-team selektearre.", "follow_suggestions.hints.friends_of_friends": "Dit profyl is populêr ûnder de minsken dy’t jo folgje.", "follow_suggestions.hints.most_followed": "Dit profyl is ien fan de meast folge op {domain}.", @@ -309,6 +308,8 @@ "follow_suggestions.hints.similar_to_recently_followed": "Dit profyl is hast lyk oan de profilen dy’t jo koartlyn folge hawwe.", "follow_suggestions.personalized_suggestion": "Personalisearre suggestje", "follow_suggestions.popular_suggestion": "Populêre suggestje", + "follow_suggestions.popular_suggestion_longer": "Populêr op {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Fergelykber mei accounts dy’t jo sûnt koart folgje", "follow_suggestions.view_all": "Alles werjaan", "follow_suggestions.who_to_follow": "Wa te folgjen", "followed_tags": "Folge hashtags", @@ -404,6 +405,8 @@ "limited_account_hint.action": "Profyl dochs besjen", "limited_account_hint.title": "Dit profyl is troch de behearders fan {domain} ferstoppe.", "link_preview.author": "Troch {name}", + "link_preview.more_from_author": "Mear fan {name}", + "link_preview.shares": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}", "lists.account.add": "Oan list tafoegje", "lists.account.remove": "Ut list fuortsmite", "lists.delete": "List fuortsmite", @@ -422,9 +425,17 @@ "loading_indicator.label": "Lade…", "media_gallery.toggle_visible": "{number, plural, one {ôfbylding ferstopje} other {ôfbyldingen ferstopje}}", "moved_to_account_banner.text": "Omdat jo nei {movedToAccount} ferhuze binne is jo account {disabledAccount} op dit stuit útskeakele.", + "mute_modal.hide_from_notifications": "Meldingen ferstopje", "mute_modal.hide_options": "Opsjes ferstopje", "mute_modal.indefinite": "Oant ik se net mear negearje", "mute_modal.show_options": "Opsjes toane", + "mute_modal.they_can_mention_and_follow": "De persoan kin jo fermelde en folgje, mar jo sjogge neat mear fan dizze persoan.", + "mute_modal.they_wont_know": "Se krije net te witten dat se negearre wurde.", + "mute_modal.title": "Brûker negearje?", + "mute_modal.you_wont_see_mentions": "Jo sjogge gjin berjochten mear dy’t dizze account fermelde.", + "mute_modal.you_wont_see_posts": "De persoan kin jo berjochten noch hieltyd sjen, mar jo sjogge harren berjochten net mear.", + "name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}}", + "name_and_others_with_link": "{name} en {count, plural, one {# oar} other {# oaren}}", "navigation_bar.about": "Oer", "navigation_bar.advanced_interface": "Yn avansearre webomjouwing iepenje", "navigation_bar.blocks": "Blokkearre brûkers", @@ -452,14 +463,31 @@ "navigation_bar.security": "Befeiliging", "not_signed_in_indicator.not_signed_in": "Jo moatte oanmelde om tagong ta dizze ynformaasje te krijen.", "notification.admin.report": "{name} hat {target} rapportearre", + "notification.admin.report_account": "{name} rapportearre {count, plural, one {in berjocht} other {# berjochten}} fan {target} foar {category}", + "notification.admin.report_account_other": "{name} rapportearre {count, plural, one {in berjocht} other {# berjochten}} fan {target}", + "notification.admin.report_statuses": "{name} rapportearre {target} foar {category}", + "notification.admin.report_statuses_other": "{name} hat {target} rapportearre", "notification.admin.sign_up": "{name} hat harren registrearre", "notification.favourite": "{name} hat jo berjocht as favoryt markearre", "notification.follow": "{name} folget dy", "notification.follow_request": "{name} hat dy in folchfersyk stjoerd", "notification.mention": "{name} hat dy fermeld", + "notification.moderation-warning.learn_more": "Mear ynfo", + "notification.moderation_warning": "Jo hawwe in moderaasje-warskôging ûntfongen", + "notification.moderation_warning.action_delete_statuses": "Guon fan jo berjochten binne fuortsmiten.", + "notification.moderation_warning.action_disable": "Jo account is útskeakele.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Guon fan jo berjochten binne as gefoelich markearre.", + "notification.moderation_warning.action_none": "Jo account hat in moderaasje-warskôging ûntfongen.", + "notification.moderation_warning.action_sensitive": "Jo berjochten wurde fan no ôf as gefoelich markearre.", + "notification.moderation_warning.action_silence": "Jo account is beheind.", + "notification.moderation_warning.action_suspend": "Jo account is útsteld.", "notification.own_poll": "Jo poll is beëinige", - "notification.poll": "In enkête dêr’t jo yn stimd hawwe is beëinige", + "notification.poll": "In enkête dêr’t jo oan meidien hawwe is beëinige", + "notification.private_mention": "{name} hat jo in priveeberjocht stjoerd", "notification.reblog": "{name} hat jo berjocht boost", + "notification.relationships_severance_event": "Ferlerne ferbiningen mei {name}", + "notification.relationships_severance_event.account_suspension": "In behearder fan {from} hat {target} útsteld, wat betsjut dat jo gjin updates mear fan harren ûntfange kinne of mei harren kommunisearje kinne.", + "notification.relationships_severance_event.domain_block": "In behearder fan {from} hat {target} blokkearre, ynklusyf {followersCount} fan jo folgers en {followingCount, plural, one {# account} other {# accounts}} dy’t jo folgje.", "notification.relationships_severance_event.learn_more": "Mear ynfo", "notification.status": "{name} hat in berjocht pleatst", "notification.update": "{name} hat in berjocht bewurke", @@ -626,8 +654,11 @@ "report_notification.attached_statuses": "{count, plural, one {{count} berjocht} other {{count} berjochten}} tafoege", "report_notification.categories.legal": "Juridysk", "report_notification.categories.other": "Oars", + "report_notification.categories.other_sentence": "oars", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Skeinde regels", + "report_notification.categories.violation_sentence": "skeinde regels", "report_notification.open": "Rapport iepenje", "search.no_recent_searches": "Gjin resinte sykopdrachten", "search.placeholder": "Sykje", @@ -672,9 +703,11 @@ "status.direct": "Privee fermelde @{name}", "status.direct_indicator": "Priveefermelding", "status.edit": "Bewurkje", + "status.edited": "Lêst bywurke op {date}", "status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke", "status.embed": "Ynslute", "status.favourite": "Favoryt", + "status.favourites": "{count, plural, one {favoryt} other {favoriten}}", "status.filter": "Dit berjocht filterje", "status.filtered": "Filtere", "status.hide": "Berjocht ferstopje", @@ -695,6 +728,7 @@ "status.reblog": "Booste", "status.reblog_private": "Boost nei oarspronklike ûntfangers", "status.reblogged_by": "{name} hat boost", + "status.reblogs": "{count, plural, one {boost} other {boosts}}", "status.reblogs.empty": "Net ien hat dit berjocht noch boost. Wannear’t ien dit docht, falt dat hjir te sjen.", "status.redraft": "Fuortsmite en opnij opstelle", "status.remove_bookmark": "Blêdwizer fuortsmite", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 97dcc752b8c..44bc62c755f 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -17,24 +17,28 @@ "account.badges.group": "Grúpa", "account.block": "Déan cosc ar @{name}", "account.block_domain": "Bac ainm fearainn {domain}", + "account.block_short": "Bloc", "account.blocked": "Bactha", "account.browse_more_on_origin_server": "Brabhsáil níos mó ar an phróifíl bhunaidh", "account.cancel_follow_request": "Éirigh as iarratas leanta", + "account.copy": "Cóipeáil nasc chuig an bpróifíl", + "account.direct": "Luaigh @{name} go príobháideach", "account.disable_notifications": "Éirigh as ag cuir mé in eol nuair bpostálann @{name}", "account.domain_blocked": "Ainm fearainn bactha", "account.edit_profile": "Cuir an phróifíl in eagar", "account.enable_notifications": "Cuir mé in eol nuair bpostálann @{name}", "account.endorse": "Cuir ar an phróifíl mar ghné", "account.featured_tags.last_status_at": "Postáil is déanaí ar {date}", - "account.featured_tags.last_status_never": "Níl postáil ar bith ann", - "account.featured_tags.title": "Haischlib {name}", + "account.featured_tags.last_status_never": "Gan aon phoist", + "account.featured_tags.title": "Haischlib faoi thrácht {name}", "account.follow": "Lean", + "account.follow_back": "Leanúint ar ais", "account.followers": "Leantóirí", "account.followers.empty": "Ní leanann éinne an t-úsáideoir seo fós.", - "account.followers_counter": "{count, plural, one {Leantóir amháin} other {{counter} Leantóir}}", + "account.followers_counter": "{count, plural, one {{counter} leantóir} other {{counter} leantóirí}}", "account.following": "Ag leanúint", - "account.following_counter": "{count, plural, one {Ag leanúint cúntas amháin} other {Ag leanúint {counter} cúntas}}", - "account.follows.empty": "Ní leanann an t-úsáideoir seo duine ar bith fós.", + "account.following_counter": "{count, plural, one {{counter} ag leanúint} other {{counter} ag leanúint}}", + "account.follows.empty": "Ní leanann an t-úsáideoir seo aon duine go fóill.", "account.go_to_profile": "Téigh go dtí próifíl", "account.hide_reblogs": "Folaigh moltaí ó @{name}", "account.in_memoriam": "Cuimhneachán.", @@ -42,11 +46,15 @@ "account.languages": "Athraigh teangacha foscríofa", "account.link_verified_on": "Seiceáladh úinéireacht an naisc seo ar {date}", "account.locked_info": "Tá an socrú príobháideachais don cuntas seo curtha go 'faoi ghlas'. Déanann an t-úinéir léirmheas ar cén daoine atá ceadaithe an cuntas leanúint.", - "account.media": "Ábhair", + "account.media": "Meáin", "account.mention": "Luaigh @{name}", "account.moved_to": "Tá tugtha le fios ag {name} gurb é an cuntas nua atá acu ná:", "account.mute": "Balbhaigh @{name}", + "account.mute_notifications_short": "Balbhaigh fógraí", + "account.mute_short": "Balbhaigh", "account.muted": "Balbhaithe", + "account.mutual": "Frithpháirteach", + "account.no_bio": "Níor tugadh tuairisc.", "account.open_original_page": "Oscail an leathanach bunaidh", "account.posts": "Postálacha", "account.posts_with_replies": "Postálacha agus freagraí", @@ -55,13 +63,14 @@ "account.requested_follow": "D'iarr {name} ort do chuntas a leanúint", "account.share": "Roinn próifíl @{name}", "account.show_reblogs": "Taispeáin moltaí ó @{name}", - "account.statuses_counter": "{count, plural, one {Postáil amháin} other {{counter} Postáil}}", + "account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} poist}}", "account.unblock": "Bain bac de @{name}", "account.unblock_domain": "Bain bac den ainm fearainn {domain}", - "account.unblock_short": "Bain bac de", + "account.unblock_short": "Díbhlocáil", "account.unendorse": "Ná chuir ar an phróifíl mar ghné", "account.unfollow": "Ná lean a thuilleadh", "account.unmute": "Díbhalbhaigh @{name}", + "account.unmute_notifications_short": "Díbhalbhaigh fógraí", "account.unmute_short": "Díbhalbhaigh", "account_note.placeholder": "Cliceáil chun nóta a chuir leis", "admin.dashboard.daily_retention": "Ráta coinneála an úsáideora de réir an lae tar éis clárú", @@ -69,6 +78,10 @@ "admin.dashboard.retention.average": "Meán", "admin.dashboard.retention.cohort": "Mí cláraraithe", "admin.dashboard.retention.cohort_size": "Úsáideoirí nua", + "admin.impact_report.instance_accounts": "Próifílí cuntais a scriosfadh sé seo", + "admin.impact_report.instance_followers": "Leanúna a chaillfeadh ár n-úsáideoirí", + "admin.impact_report.instance_follows": "Leanúna a bheadh ​​​​a n-úsáideoirí chailleadh", + "admin.impact_report.title": "Achoimre ar an tionchar", "alert.rate_limited.message": "Atriail aris tar éis {retry_time, time, medium}.", "alert.rate_limited.title": "Rátatheoranta", "alert.unexpected.message": "Tharla earráid gan choinne.", @@ -76,10 +89,18 @@ "announcement.announcement": "Fógra", "attachments_list.unprocessed": "(neamhphróiseáilte)", "audio.hide": "Cuir fuaim i bhfolach", + "block_modal.remote_users_caveat": "Iarrfaimid ar an bhfreastalaí {domain} meas a bheith agat ar do chinneadh. Mar sin féin, ní ráthaítear comhlíonadh toisc go bhféadfadh roinnt freastalaithe bloic a láimhseáil ar bhealach difriúil. Seans go mbeidh postálacha poiblí fós le feiceáil ag úsáideoirí nach bhfuil logáilte isteach.", + "block_modal.show_less": "Taispeáin níos lú", + "block_modal.show_more": "Taispeáin níos mó", + "block_modal.they_cant_mention": "Ní féidir leo tú a lua ná a leanúint.", + "block_modal.they_cant_see_posts": "Ní féidir leo do chuid postálacha a fheiceáil agus ní fheicfidh tú a gcuid postanna.", + "block_modal.they_will_know": "Is féidir leo a fheiceáil go bhfuil bac orthu.", + "block_modal.title": "An bhfuil fonn ort an t-úsáideoir a bhlocáil?", + "block_modal.you_wont_see_mentions": "Ní fheicfidh tú postálacha a luann iad.", "boost_modal.combo": "Is féidir leat {combo} a bhrú chun é seo a scipeáil an chéad uair eile", "bundle_column_error.copy_stacktrace": "Cóipeáil tuairisc earráide", "bundle_column_error.error.body": "Ní féidir an leathanach a iarradh a sholáthar. Seans gurb amhlaidh mar gheall ar fhabht sa chód, nó mar gheall ar mhíréireacht leis an mbrabhsálaí.", - "bundle_column_error.error.title": "Ná habair!", + "bundle_column_error.error.title": "Ó, níl sé sin go maith!", "bundle_column_error.network.body": "Tharla earráid agus an leathanach á lódáil. Seans gur mar gheall ar fhadhb shealadach le do nasc idirlín nó i ndáil leis an bhfreastalaí seo atá sé.", "bundle_column_error.network.title": "Earráid líonra", "bundle_column_error.retry": "Bain triail as arís", @@ -98,8 +119,11 @@ "column.blocks": "Cuntais choiscthe", "column.bookmarks": "Leabharmharcanna", "column.community": "Amlíne áitiúil", + "column.direct": "Luann príobháideach", "column.directory": "Brabhsáil próifílí", "column.domain_blocks": "Fearainn bhactha", + "column.favourites": "Ceanáin", + "column.firehose": "Fothaí beo", "column.follow_requests": "Iarratais leanúnaí", "column.home": "Baile", "column.lists": "Liostaí", @@ -111,15 +135,18 @@ "column_header.hide_settings": "Folaigh socruithe", "column_header.moveLeft_settings": "Bog an colún ar chlé", "column_header.moveRight_settings": "Bog an colún ar dheis", - "column_header.pin": "Greamaigh", + "column_header.pin": "Pionna", "column_header.show_settings": "Taispeáin socruithe", - "column_header.unpin": "Díghreamaigh", + "column_header.unpin": "Bain pionna", "column_subheading.settings": "Socruithe", "community.column_settings.local_only": "Áitiúil amháin", "community.column_settings.media_only": "Meáin Amháin", "community.column_settings.remote_only": "Cian amháin", "compose.language.change": "Athraigh teanga", "compose.language.search": "Cuardaigh teangacha...", + "compose.published.body": "Post foilsithe.", + "compose.published.open": "Oscail", + "compose.saved.body": "Postáil sábháilte.", "compose_form.direct_message_warning_learn_more": "Tuilleadh eolais", "compose_form.encryption_warning": "Ní criptiú taobh-go-taobh déanta ar theachtaireachtaí ar Mhastodon. Ná roinn eolas íogair ar Mhastodon.", "compose_form.hashtag_warning": "Ní áireofar an teachtaireacht seo faoi haischlib ar bith mar níl sí ar fáil don phobal. Ní féidir ach teachtaireachtaí poiblí a chuardach de réir haischlib.", @@ -127,35 +154,52 @@ "compose_form.lock_disclaimer.lock": "faoi ghlas", "compose_form.placeholder": "Cad atá ag tarlú?", "compose_form.poll.duration": "Achar suirbhéanna", + "compose_form.poll.multiple": "Ilrogha", + "compose_form.poll.option_placeholder": "Rogha {number}", + "compose_form.poll.single": "Roghnaigh ceann amháin", "compose_form.poll.switch_to_multiple": "Athraigh suirbhé chun cead a thabhairt do ilrogha", "compose_form.poll.switch_to_single": "Athraigh suirbhé chun cead a thabhairt do rogha amháin", - "compose_form.publish_form": "Foilsigh\n", + "compose_form.poll.type": "Stíl", + "compose_form.publish": "Postáil", + "compose_form.publish_form": "Post nua", + "compose_form.reply": "Freagra", + "compose_form.save_changes": "Nuashonrú", "compose_form.spoiler.marked": "Bain rabhadh ábhair", "compose_form.spoiler.unmarked": "Cuir rabhadh ábhair", + "compose_form.spoiler_placeholder": "Rabhadh ábhair (roghnach)", "confirmation_modal.cancel": "Cealaigh", "confirmations.block.confirm": "Bac", - "confirmations.cancel_follow_request.confirm": "Éirigh as iarratas", - "confirmations.cancel_follow_request.message": "An bhfuil tú cinnte gur mhaith leat éirigh as an iarratas leanta {name}?", "confirmations.delete.confirm": "Scrios", "confirmations.delete.message": "An bhfuil tú cinnte gur mhaith leat an phostáil seo a scriosadh?", + "confirmations.delete.title": "Scrios postáil?", "confirmations.delete_list.confirm": "Scrios", "confirmations.delete_list.message": "An bhfuil tú cinnte gur mhaith leat an liosta seo a scriosadh go buan?", + "confirmations.delete_list.title": "Scrios liosta?", "confirmations.discard_edit_media.confirm": "Faigh réidh de", "confirmations.discard_edit_media.message": "Tá athruithe neamhshlánaithe don tuarascáil gné nó réamhamharc agat, faigh réidh dóibh ar aon nós?", - "confirmations.domain_block.message": "An bhfuil tú iontach cinnte gur mhaith leat bac an t-ainm fearainn {domain} in iomlán? I bhformhór na gcásanna, is leor agus is fearr cúpla baic a cur i bhfeidhm nó cúpla úsáideoirí a balbhú. Ní fheicfidh tú ábhair ón t-ainm fearainn sin in amlíne ar bith, nó i d'fhógraí. Scaoilfear do leantóirí ón ainm fearainn sin.", + "confirmations.edit.confirm": "Eagar", + "confirmations.edit.message": "Má dhéanann tú eagarthóireacht anois, déanfar an teachtaireacht atá á cumadh agat faoi láthair a fhorscríobh. An bhfuil tú cinnte gur mhaith leat leanúint ar aghaidh?", + "confirmations.edit.title": "Forscríobh postáil?", "confirmations.logout.confirm": "Logáil amach", "confirmations.logout.message": "An bhfuil tú cinnte gur mhaith leat logáil amach?", + "confirmations.logout.title": "Logáil Amach?", "confirmations.mute.confirm": "Balbhaigh", "confirmations.redraft.confirm": "Scrios ⁊ athdhréachtaigh", + "confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an postáil seo a scriosadh agus é a athdhréachtú? Caillfear ceanáin agus treisithe, agus dílleachtaí freagraí ar an mbunphostála.", + "confirmations.redraft.title": "Scrios & athdhréachtú postáil?", "confirmations.reply.confirm": "Freagair", "confirmations.reply.message": "Scriosfaidh freagra láithreach an teachtaireacht atá a chumadh anois agat. An bhfuil tú cinnte gur mhaith leat leanúint leat?", + "confirmations.reply.title": "Forscríobh postáil?", "confirmations.unfollow.confirm": "Ná lean", "confirmations.unfollow.message": "An bhfuil tú cinnte gur mhaith leat {name} a dhíleanúint?", + "confirmations.unfollow.title": "Dílean ​​an t-úsáideoir?", "conversation.delete": "Scrios comhrá", "conversation.mark_as_read": "Marcáil mar léite", "conversation.open": "Féach ar comhrá", "conversation.with": "Le {names}", + "copy_icon_button.copied": "Cóipeáladh chuig an ngearrthaisce", "copypaste.copied": "Cóipeáilte", + "copypaste.copy_to_clipboard": "Cóipeáil chuig an ngearrthaisce", "directory.federated": "Ó chomhchruinne aitheanta", "directory.local": "Ó {domain} amháin", "directory.new_arrivals": "Daoine atá tar éis teacht", @@ -165,7 +209,30 @@ "dismissable_banner.community_timeline": "Seo iad na postála is déanaí ó dhaoine le cuntais ar {domain}.", "dismissable_banner.dismiss": "Diúltaigh", "dismissable_banner.explore_links": "Tá na scéalta nuachta seo á phlé anseo agus ar fhreastalaithe eile ar an líonra díláraithe faoi láthair.", - "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", + "dismissable_banner.explore_statuses": "Is postálacha iad seo ó ar fud an ghréasáin shóisialta atá ag éirí níos tarraingtí inniu. Rangaítear poist níos nuaí le níos mó teanntáin agus ceanáin níos airde.", + "dismissable_banner.explore_tags": "Is hashtags iad seo atá ag tarraingt ar an ngréasán sóisialta inniu. Tá na hashtags a úsáideann níos mó daoine difriúla rangaithe níos airde.", + "dismissable_banner.public_timeline": "Seo iad na postálacha poiblí is déanaí ó dhaoine ar an ngréasán sóisialta a leanann daoine ar {domain}.", + "domain_block_modal.block": "Bloc freastalaí", + "domain_block_modal.block_account_instead": "Cuir bac ar @{name} ina ionad sin", + "domain_block_modal.they_can_interact_with_old_posts": "Is féidir le daoine ón bhfreastalaí seo idirghníomhú le do sheanphoist.", + "domain_block_modal.they_cant_follow": "Ní féidir le duine ar bith ón bhfreastalaí seo tú a leanúint.", + "domain_block_modal.they_wont_know": "Ní bheidh a fhios acu go bhfuil bac orthu.", + "domain_block_modal.title": "Blocáil fearann?", + "domain_block_modal.you_will_lose_followers": "Bainfear do leantóirí go léir ón bhfreastalaí seo.", + "domain_block_modal.you_wont_see_posts": "Ní fheicfidh tú postálacha nó fógraí ó úsáideoirí ar an bhfreastalaí seo.", + "domain_pill.activitypub_lets_connect": "Ligeann sé duit ceangal agus idirghníomhú le daoine, ní hamháin ar Mastodon, ach thar aipeanna sóisialta éagsúla freisin.", + "domain_pill.activitypub_like_language": "Tá GníomhaíochtPub cosúil leis an teanga a labhraíonn Mastodon le líonraí sóisialta eile.", + "domain_pill.server": "Freastalaí", + "domain_pill.their_handle": "A láimhseáil:", + "domain_pill.their_server": "A dteach digiteach, áit a bhfuil a gcuid post go léir ina gcónaí.", + "domain_pill.their_username": "Aitheantóir uathúil ar a bhfreastalaí. Is féidir teacht ar úsáideoirí leis an ainm úsáideora céanna ar fhreastalaithe éagsúla.", + "domain_pill.username": "Ainm úsáideora", + "domain_pill.whats_in_a_handle": "Cad atá i láimhseáil?", + "domain_pill.who_they_are": "Ós rud é go ndeir láimhseálaithe cé hé duine agus cá bhfuil siad, is féidir leat idirghníomhú le daoine ar fud an ghréasáin shóisialta de .", + "domain_pill.who_you_are": "Toisc go ndeir do láimhseáil cé tú féin agus cén áit a bhfuil tú, is féidir le daoine idirghníomhú leat ar fud an ghréasáin shóisialta de .", + "domain_pill.your_handle": "Do láimhseáil:", + "domain_pill.your_server": "Do theach digiteach, áit a bhfuil do phoist go léir ina gcónaí. Nach maith leat an ceann seo? Aistrigh freastalaithe am ar bith agus tabhair leat do leantóirí freisin.", + "domain_pill.your_username": "D'aitheantóir uathúil ar an bhfreastalaí seo. Is féidir teacht ar úsáideoirí leis an ainm úsáideora céanna ar fhreastalaithe éagsúla.", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Seo an chuma a bheidh air:", "emoji_button.activity": "Gníomhaíocht", @@ -183,49 +250,80 @@ "emoji_button.search_results": "Torthaí cuardaigh", "emoji_button.symbols": "Comharthaí", "emoji_button.travel": "Taisteal ⁊ Áiteanna", + "empty_column.account_hides_collections": "Roghnaigh an t-úsáideoir seo gan an fhaisnéis seo a chur ar fáil", "empty_column.account_suspended": "Cuntas ar fionraí", "empty_column.account_timeline": "Níl postálacha ar bith anseo!", "empty_column.account_unavailable": "Níl an phróifíl ar fáil", "empty_column.blocks": "Níl aon úsáideoir bactha agat fós.", "empty_column.bookmarked_statuses": "Níl aon phostáil leabharmharcaithe agat fós. Nuair a dhéanann tú leabharmharc, beidh sé le feiceáil anseo.", "empty_column.community": "Tá an amlíne áitiúil folamh. Foilsigh rud éigin go poiblí le tús a chur le cúrsaí!", + "empty_column.direct": "Níl aon tagairtí príobháideacha agat fós. Nuair a sheolann tú nó a gheobhaidh tú ceann, beidh sé le feiceáil anseo.", "empty_column.domain_blocks": "Níl aon fearainn bhactha ann go fóill.", "empty_column.explore_statuses": "Níl rud ar bith ag treochtáil faoi láthair. Tar ar ais ar ball!", + "empty_column.favourited_statuses": "Níl aon postálacha is fearr leat fós. Nuair is fearr leat ceann, beidh sé le feiceáil anseo.", + "empty_column.favourites": "Níor thaitin an post seo le haon duine go fóill. Nuair a dhéanann duine, taispeánfaidh siad suas anseo.", "empty_column.follow_requests": "Níl aon phostáil leabharmharcaithe agat fós. Nuair a dhéanann tú leabharmharc, feicfear anseo é.", + "empty_column.followed_tags": "Níor lean tú aon hashtags fós. Nuair a dhéanann tú, beidh siad a thaispeáint suas anseo.", "empty_column.hashtag": "Níl rud ar bith faoin haischlib seo go fóill.", "empty_column.home": "Tá d'amlíne baile folamh! B'fhiú duit cúpla duine eile a leanúint lena líonadh! {suggestions}", - "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.list": "Níl aon rud ar an liosta seo fós. Nuair a fhoilseoidh baill an liosta seo postálacha nua, beidh siad le feiceáil anseo.", "empty_column.lists": "Níl aon liostaí fós agat. Nuair a chruthaíonn tú ceann, feicfear anseo é.", "empty_column.mutes": "Níl aon úsáideoir balbhaithe agat fós.", + "empty_column.notification_requests": "Gach soiléir! Níl aon rud anseo. Nuair a gheobhaidh tú fógraí nua, beidh siad le feiceáil anseo de réir do shocruithe.", "empty_column.notifications": "Níl aon fógraí agat fós. Nuair a dhéanann daoine eile idirghníomhú leat, feicfear anseo é.", "empty_column.public": "Faic anseo! Scríobh rud éigin go poiblí, nó lean úsáideoirí ar fhreastalaithe eile chun é a líonadh", "error.unexpected_crash.explanation": "De bharr fabht inár gcód, nó fadhb le chomhoiriúnacht brabhsálaí, níorbh fhéadfadh an leathanach seo a léiriú i gceart.", "error.unexpected_crash.explanation_addons": "Ní taispeántar an leathanach seo mar is ceart. Is dócha go gcruthaíonn breiseán brabhsálaí nó uirlisí uathaistriúcháin an fhadhb seo.", + "error.unexpected_crash.next_steps": "Bain triail as an leathanach a athnuachan. Mura gcabhraíonn sé sin, seans go mbeidh tú fós in ann Mastodon a úsáid trí bhrabhsálaí nó aip dhúchais eile.", + "error.unexpected_crash.next_steps_addons": "Déan iarracht iad a dhíchumasú agus an leathanach a athnuachan. Mura gcabhraíonn sé sin, seans go mbeidh tú fós in ann Mastodon a úsáid trí bhrabhsálaí nó aip dhúchais eile.", + "errors.unexpected_crash.copy_stacktrace": "Cóipeáil rian cruachta go dtí an ghearrthaisce", "errors.unexpected_crash.report_issue": "Tuairiscigh deacracht", "explore.search_results": "Torthaí cuardaigh", + "explore.suggested_follows": "Daoine", "explore.title": "Féach thart", "explore.trending_links": "Nuacht", "explore.trending_statuses": "Postálacha", "explore.trending_tags": "Haischlibeanna", + "filter_modal.added.context_mismatch_explanation": "Ní bhaineann an chatagóir scagaire seo leis an gcomhthéacs ina bhfuair tú rochtain ar an bpostáil seo. Más mian leat an postáil a scagadh sa chomhthéacs seo freisin, beidh ort an scagaire a chur in eagar.", + "filter_modal.added.context_mismatch_title": "Neamhréir comhthéacs!", + "filter_modal.added.expired_explanation": "Tá an chatagóir scagaire seo imithe in éag, beidh ort an dáta éaga a athrú chun é a chur i bhfeidhm.", "filter_modal.added.expired_title": "Scagaire as feidhm!", + "filter_modal.added.review_and_configure": "Chun an chatagóir scagaire seo a athbhreithniú agus a chumrú tuilleadh, téigh chuig {settings_link}.", "filter_modal.added.review_and_configure_title": "Socruithe scagtha", "filter_modal.added.settings_link": "leathan socruithe", + "filter_modal.added.short_explanation": "Cuireadh an postáil seo leis an gcatagóir scagaire seo a leanas: {title}.", "filter_modal.added.title": "Scagaire curtha leis!", "filter_modal.select_filter.context_mismatch": "ní bhaineann sé leis an gcomhthéacs seo", - "filter_modal.select_filter.expired": "as feidhm", + "filter_modal.select_filter.expired": "imithe in éag", "filter_modal.select_filter.prompt_new": "Catagóir nua: {name}", "filter_modal.select_filter.search": "Cuardaigh nó cruthaigh", "filter_modal.select_filter.subtitle": "Bain úsáid as catagóir reatha nó cruthaigh ceann nua", "filter_modal.select_filter.title": "Déan scagadh ar an bpostáil seo", "filter_modal.title.status": "Déan scagadh ar phostáil", + "filtered_notifications_banner.pending_requests": "Ó {count, plural, =0 {duine ar bith} one {duine amháin} two {# daoine} few {# daoine} many {# daoine} other {# daoine}} b’fhéidir go bhfuil aithne agat orthu", + "filtered_notifications_banner.title": "Fógraí scagtha", + "firehose.all": "Gach", + "firehose.local": "An freastalaí seo", + "firehose.remote": "Freastalaithe eile", "follow_request.authorize": "Ceadaigh", "follow_request.reject": "Diúltaigh", "follow_requests.unlocked_explanation": "Cé nach bhfuil do chuntas faoi ghlas, cheap foireann {domain} gur mhaith leat súil siar ar iarratais leanúnaí as na cuntais seo.", + "follow_suggestions.curated_suggestion": "Pioc foirne", "follow_suggestions.dismiss": "Ná taispeáin arís", + "follow_suggestions.featured_longer": "Lámh-roghnaithe ag an bhfoireann {domain}", + "follow_suggestions.friends_of_friends_longer": "Coitianta i measc na ndaoine a leanann tú", + "follow_suggestions.hints.featured": "Tá an phróifíl seo roghnaithe de láimh ag foireann {domain}.", + "follow_suggestions.hints.friends_of_friends": "Tá an-tóir ar an bpróifíl seo i measc na ndaoine a leanann tú.", + "follow_suggestions.hints.most_followed": "Tá an phróifíl seo ar cheann de na cinn is mó a leantar ar {domain}.", + "follow_suggestions.hints.most_interactions": "Tá an phróifíl seo ag tarraingt go leor airde ar {domain} le déanaí.", + "follow_suggestions.hints.similar_to_recently_followed": "Tá an phróifíl seo cosúil leis na próifílí a lean tú le déanaí.", "follow_suggestions.personalized_suggestion": "Nod pearsantaithe", "follow_suggestions.popular_suggestion": "Nod coiteann", + "follow_suggestions.popular_suggestion_longer": "Tá an-tóir ar {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Cosúil le próifílí a lean tú le déanaí", "follow_suggestions.view_all": "Féach uile", "follow_suggestions.who_to_follow": "Cé le leanúint", + "followed_tags": "Hashtags le leanúint", "footer.about": "Maidir le", "footer.directory": "Eolaire próifílí", "footer.get_app": "Faigh an aip", @@ -233,6 +331,7 @@ "footer.keyboard_shortcuts": "Aicearraí méarchláir", "footer.privacy_policy": "Polasaí príobháideachais", "footer.source_code": "Féach ar an gcód foinseach", + "footer.status": "Stádas", "generic.saved": "Sábháilte", "getting_started.heading": "Ag tosú amach", "hashtag.column_header.tag_mode.all": "agus {additional}", @@ -241,15 +340,34 @@ "hashtag.column_settings.select.no_options_message": "Moltaí ar bith faighte", "hashtag.column_settings.select.placeholder": "Iontráil haischlibeanna…", "hashtag.column_settings.tag_mode.all": "Iad seo go léir", - "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.column_settings.tag_mode.any": "Aon cheann díobh seo", + "hashtag.column_settings.tag_mode.none": "Níl aon cheann díobh seo", + "hashtag.column_settings.tag_toggle": "Cuir clibeanna breise san áireamh don cholún seo", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} rannpháirtí} two {{counter} rannpháirtí} few {{counter} rannpháirtí} many {{counter} rannpháirtí} other {{counter} rannpháirtí}}", + "hashtag.counter_by_uses": "{count, plural, one {{counter} post} two {{counter} post} few {{counter} post} many {{counter} post} other {{counter} poist}}", + "hashtag.counter_by_uses_today": "{count, plural, one {{counter} post inniu} other {{counter} poist inniu}} inniu", "hashtag.follow": "Lean haischlib", "hashtag.unfollow": "Ná lean haischlib", + "hashtags.and_other": "agus {count, plural, one {} two {# níos} few {# níos} many {# níos} other {# níos}}", "home.column_settings.show_reblogs": "Taispeáin moltaí", "home.column_settings.show_replies": "Taispeán freagraí", "home.hide_announcements": "Cuir fógraí i bhfolach", + "home.pending_critical_update.body": "Nuashonraigh do fhreastalaí Mastodon chomh luath agus is féidir!", + "home.pending_critical_update.link": "Féach nuashonruithe", + "home.pending_critical_update.title": "Nuashonrú slándála ríthábhachtach ar fáil!", "home.show_announcements": "Taispeáin fógraí", + "interaction_modal.description.favourite": "Le cuntas ar Mastodon, is fearr leat an postáil seo chun a chur in iúl don údar go bhfuil meas agat air agus é a shábháil ar feadh níos déanaí.", + "interaction_modal.description.follow": "Le cuntas ar Mastodon, is féidir leat {name} a leanúint chun a gcuid postálacha a fháil i do fhotha baile.", + "interaction_modal.description.reblog": "Le cuntas ar Mastodon, is féidir leat an postáil seo a threisiú chun é a roinnt le do leantóirí féin.", + "interaction_modal.description.reply": "Le cuntas ar Mastodon, is féidir leat freagra a thabhairt ar an bpostáil seo.", + "interaction_modal.login.action": "Thabhairt dom abhaile", + "interaction_modal.login.prompt": "Fearann ​​do fhreastalaí baile, e.g. mastodon.sóisialta", + "interaction_modal.no_account_yet": "Ní ar Mastodon?", "interaction_modal.on_another_server": "Ar freastalaí eile", "interaction_modal.on_this_server": "Ar an freastalaí seo", + "interaction_modal.sign_in": "Níl tú logáilte isteach ar an bhfreastalaí seo. Cá bhfuil do chuntas á óstáil?", + "interaction_modal.sign_in_hint": "Leid: Sin é an suíomh Gréasáin inar chláraigh tú. Mura cuimhin leat, lorg an ríomhphost fáilte i do bhosca isteach. Is féidir leat d'ainm úsáideora iomlán a chur isteach freisin! (m.sh. @Mastodon@mastodon.social)", + "interaction_modal.title.favourite": "An postáil {name} is fearr leat", "interaction_modal.title.follow": "Lean {name}", "interaction_modal.title.reblog": "Mol postáil de chuid {name}", "interaction_modal.title.reply": "Freagair postáil {name}", @@ -259,45 +377,53 @@ "keyboard_shortcuts.back": "Nasclean siar", "keyboard_shortcuts.blocked": "Oscail liosta na n-úsáideoirí bactha", "keyboard_shortcuts.boost": "Treisigh postáil", - "keyboard_shortcuts.column": "to focus a status in one of the columns", - "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.description": "Cuntas", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.column": "Colún fócas", + "keyboard_shortcuts.compose": "Fócas a chumadh textarea", + "keyboard_shortcuts.description": "Cur síos", + "keyboard_shortcuts.direct": "chun colún lua príobháideach a oscailt", "keyboard_shortcuts.down": "Bog síos ar an liosta", "keyboard_shortcuts.enter": "Oscail postáil", + "keyboard_shortcuts.favourite": "Postáil is fearr leat", + "keyboard_shortcuts.favourites": "Oscail liosta ceanáin", "keyboard_shortcuts.federated": "Oscail amlíne cónaidhmithe", "keyboard_shortcuts.heading": "Aicearraí méarchláir", "keyboard_shortcuts.home": "Oscail amlíne bhaile", "keyboard_shortcuts.hotkey": "Eochair aicearra", - "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.legend": "Taispeáin an finscéal seo", "keyboard_shortcuts.local": "Oscail an amlíne áitiúil", "keyboard_shortcuts.mention": "Luaigh údar", "keyboard_shortcuts.muted": "Oscail liosta na n-úsáideoirí balbhaithe", "keyboard_shortcuts.my_profile": "Oscail do phróifíl", - "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.notifications": "Oscail colún fógraí", "keyboard_shortcuts.open_media": "Oscail meáin", - "keyboard_shortcuts.pinned": "to open pinned posts list", + "keyboard_shortcuts.pinned": "Oscail liosta postálacha pinn", "keyboard_shortcuts.profile": "Oscail próifíl an t-údar", "keyboard_shortcuts.reply": "Freagair ar phostáil", "keyboard_shortcuts.requests": "Oscail liosta iarratas leanúnaí", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.spoilers": "to show/hide CW field", - "keyboard_shortcuts.start": "to open \"get started\" column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.search": "Díriú ar an mbosca cuardaigh", + "keyboard_shortcuts.spoilers": "Taispeáin / folaigh réimse CW", + "keyboard_shortcuts.start": "Oscail an colún “tosaigh”", + "keyboard_shortcuts.toggle_hidden": "Taispeáin/folaigh an téacs taobh thiar de CW", "keyboard_shortcuts.toggle_sensitivity": "Taispeáin / cuir i bhfolach meáin", "keyboard_shortcuts.toot": "Cuir tús le postáil nua", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.unfocus": "Unfocus cum textarea/search", "keyboard_shortcuts.up": "Bog suas ar an liosta", "lightbox.close": "Dún", + "lightbox.compress": "Comhbhrúigh an bosca amhairc íomhá", + "lightbox.expand": "Leathnaigh an bosca amhairc íomhá", "lightbox.next": "An céad eile", "lightbox.previous": "Roimhe seo", "limited_account_hint.action": "Taispeáin an phróifíl ar aon nós", "limited_account_hint.title": "Tá an phróifíl seo curtha i bhfolach ag na modhnóra {domain}.", + "link_preview.author": "Le {name}", + "link_preview.more_from_author": "Tuilleadh ó {name}", + "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} poist}}", "lists.account.add": "Cuir leis an liosta", "lists.account.remove": "Scrios as an liosta", "lists.delete": "Scrios liosta", "lists.edit": "Cuir an liosta in eagar", "lists.edit.submit": "Athraigh teideal", + "lists.exclusive": "Folaigh na poist seo ón mbaile", "lists.new.create": "Cruthaigh liosta", "lists.new.title_placeholder": "Teideal liosta nua", "lists.replies_policy.followed": "Úsáideoir ar bith atá á leanúint", @@ -306,40 +432,92 @@ "lists.replies_policy.title": "Taispeáin freagraí:", "lists.search": "Cuardaigh i measc daoine atá á leanúint agat", "lists.subheading": "Do liostaí", + "load_pending": "{count, plural, one {# mír nua} two {# mír nua} few {# mír nua} many {# mír nua} other {# mír nua}}", + "loading_indicator.label": "Á lódáil…", + "media_gallery.toggle_visible": "{number, plural, one {Folaigh íomhá} two {Folaigh íomhánna} few {Folaigh íomhánna} many {Folaigh íomhánna} other {Folaigh íomhánna}}", + "moved_to_account_banner.text": "Tá do chuntas {disabledAccount} díchumasaithe faoi láthair toisc gur bhog tú go {movedToAccount}.", + "mute_modal.hide_from_notifications": "Folaigh ó fhógraí", + "mute_modal.hide_options": "Folaigh roghanna", + "mute_modal.indefinite": "Go dtí go ndíbhalfaidh mé iad", + "mute_modal.show_options": "Taispeáin roghanna", + "mute_modal.they_can_mention_and_follow": "Is féidir leo tú a lua agus a leanúint, ach ní fheicfidh tú iad.", + "mute_modal.they_wont_know": "Ní bheidh a fhios acu go bhfuil balbhú orthu.", + "mute_modal.title": "An bhfuil fonn ort úsáideoir a bhalbhú?", + "mute_modal.you_wont_see_mentions": "Ní fheicfidh tú postálacha a luann iad.", + "mute_modal.you_wont_see_posts": "Is féidir leo do phoist a fheiceáil go fóill, ach ní fheicfidh tú a gcuid postanna.", + "name_and_others": "{name} and {count, plural, one {# eile} two {# eile} few {# eile} many {# eile} other {# eile}}", + "name_and_others_with_link": "{name} agus {count, plural, one {# eile} two {# eile} few {# eile} many {# eile} other {# eile}}", "navigation_bar.about": "Maidir le", + "navigation_bar.advanced_interface": "Oscail i gcomhéadan gréasáin chun cinn", "navigation_bar.blocks": "Cuntais bhactha", "navigation_bar.bookmarks": "Leabharmharcanna", "navigation_bar.community_timeline": "Amlíne áitiúil", "navigation_bar.compose": "Cum postáil nua", + "navigation_bar.direct": "Luann príobháideach", "navigation_bar.discover": "Faigh amach", "navigation_bar.domain_blocks": "Fearainn bhactha", "navigation_bar.explore": "Féach thart", + "navigation_bar.favourites": "Ceanáin", "navigation_bar.filters": "Focail bhalbhaithe", "navigation_bar.follow_requests": "Iarratais leanúnaí", + "navigation_bar.followed_tags": "Haischlibeanna ina dhiaidh", "navigation_bar.follows_and_followers": "Ag leanúint agus do do leanúint", "navigation_bar.lists": "Liostaí", "navigation_bar.logout": "Logáil Amach", "navigation_bar.mutes": "Úsáideoirí balbhaithe", + "navigation_bar.opened_in_classic_interface": "Osclaítear poist, cuntais agus leathanaigh shonracha eile de réir réamhshocraithe sa chomhéadan gréasáin clasaiceach.", "navigation_bar.personal": "Pearsanta", "navigation_bar.pins": "Postálacha pionnáilte", "navigation_bar.preferences": "Sainroghanna pearsanta", "navigation_bar.public_timeline": "Amlíne cónaidhmithe", "navigation_bar.search": "Cuardaigh", "navigation_bar.security": "Slándáil", - "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "not_signed_in_indicator.not_signed_in": "Ní mór duit logáil isteach chun rochtain a fháil ar an acmhainn seo.", "notification.admin.report": "Tuairiscigh {name} {target}", + "notification.admin.report_account": "{name} thuairiscigh {count, plural, one {aon phost} two {# phost} few {# phost} many {# bpost} other {# bpost}} ó {target} do {category}", + "notification.admin.report_account_other": "{name} thuairiscigh {count, plural, one {aon phost} two {# phost} few {# phost} many {# bpost} other {# bpost}} ó {target}", + "notification.admin.report_statuses": "Thuairiscigh {name} {target} le haghaidh {category}", + "notification.admin.report_statuses_other": "{name} tuairiscithe {target}", "notification.admin.sign_up": "Chláraigh {name}", + "notification.favourite": "Is fearr le {name} do phostáil", "notification.follow": "Lean {name} thú", "notification.follow_request": "D'iarr {name} ort do chuntas a leanúint", "notification.mention": "Luaigh {name} tú", + "notification.moderation-warning.learn_more": "Foghlaim níos mó", + "notification.moderation_warning": "Tá rabhadh modhnóireachta faighte agat", + "notification.moderation_warning.action_delete_statuses": "Baineadh cuid de do phostálacha.", + "notification.moderation_warning.action_disable": "Díchumasaíodh do chuntas.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Tá cuid de do phostálacha marcáilte mar íogair.", + "notification.moderation_warning.action_none": "Tá rabhadh modhnóireachta faighte ag do chuntas.", + "notification.moderation_warning.action_sensitive": "Déanfar do phostálacha a mharcáil mar íogair as seo amach.", + "notification.moderation_warning.action_silence": "Tá do chuntas teoranta.", + "notification.moderation_warning.action_suspend": "Cuireadh do chuntas ar fionraí.", "notification.own_poll": "Tá do suirbhé críochnaithe", - "notification.poll": "Tá suirbhé inar vótáil tú tar éis críochnú", + "notification.poll": "Tá deireadh le vótaíocht inar vótáil tú", + "notification.private_mention": "luaigh {name} tú go príobháideach", "notification.reblog": "Mhol {name} do phostáil", + "notification.relationships_severance_event": "Cailleadh naisc le {name}", + "notification.relationships_severance_event.account_suspension": "Chuir riarthóir ó {from} {target} ar fionraí, rud a chiallaíonn nach féidir leat nuashonruithe a fháil uathu a thuilleadh ná idirghníomhú leo.", + "notification.relationships_severance_event.domain_block": "Chuir riarthóir ó {from} bac ar {target}, lena n-áirítear {followersCount} de do leantóirí agus {followingCount, plural, one {#cuntas} other {#cuntas}} leanann tú.", + "notification.relationships_severance_event.learn_more": "Foghlaim níos mó", + "notification.relationships_severance_event.user_domain_block": "Chuir tú bac ar {target}, bhain tú {followersCount} de do leantóirí agus {followingCount, plural, one {# cuntas} other {# cuntais}} a leanann tú.", "notification.status": "Phostáil {name} díreach", "notification.update": "Chuir {name} postáil in eagar", + "notification_requests.accept": "Glac", + "notification_requests.dismiss": "Díbhe", + "notification_requests.notifications_from": "Fógraí ó {name}", + "notification_requests.title": "Fógraí scagtha", "notifications.clear": "Glan fógraí", + "notifications.clear_confirmation": "An bhfuil tú cinnte gur mhaith leat d'fhógraí go léir a ghlanadh go buan?", + "notifications.clear_title": "Glan fógraí?", "notifications.column_settings.admin.report": "Tuairiscí nua:", + "notifications.column_settings.admin.sign_up": "Clárúcháin nua:", "notifications.column_settings.alert": "Fógraí deisce", + "notifications.column_settings.beta.category": "Gnéithe turgnamhacha", + "notifications.column_settings.beta.grouping": "Fógraí grúpa", + "notifications.column_settings.favourite": "Ceanáin:", + "notifications.column_settings.filter_bar.advanced": "Taispeáin gach catagóir", + "notifications.column_settings.filter_bar.category": "Barra scagairí tapa", "notifications.column_settings.follow": "Leantóirí nua:", "notifications.column_settings.follow_request": "Iarratais leanúnaí nua:", "notifications.column_settings.mention": "Tráchtanna:", @@ -350,33 +528,77 @@ "notifications.column_settings.sound": "Seinn an fhuaim", "notifications.column_settings.status": "Postálacha nua:", "notifications.column_settings.unread_notifications.category": "Brúfhógraí neamhléite", + "notifications.column_settings.unread_notifications.highlight": "Aibhsigh fógraí neamhléite", "notifications.column_settings.update": "Eagair:", "notifications.filter.all": "Uile", "notifications.filter.boosts": "Treisithe", + "notifications.filter.favourites": "Ceanáin", "notifications.filter.follows": "Ag leanúint", "notifications.filter.mentions": "Tráchtanna", "notifications.filter.polls": "Torthaí suirbhéanna", "notifications.filter.statuses": "Nuashonruithe ó dhaoine a leanann tú", "notifications.grant_permission": "Tabhair cead.", "notifications.group": "{count} fógraí", + "notifications.mark_as_read": "Marcáil gach fógra mar atá léite", + "notifications.permission_denied": "Níl fógraí deisce ar fáil mar gheall ar iarratas ar chead brabhsálaí a diúltaíodh roimhe seo", + "notifications.permission_denied_alert": "Ní féidir fógraí deisce a chumasú, mar gur diúltaíodh cead brabhsálaí roimhe seo", + "notifications.permission_required": "Níl fógraí deisce ar fáil toisc nár tugadh an cead riachtanach.", + "notifications.policy.filter_new_accounts.hint": "Cruthaithe laistigh den {days, plural, one {lae amháin} two {# lá} few {# lá} many {# lá} other {# lá}}", + "notifications.policy.filter_new_accounts_title": "Cuntais nua", + "notifications.policy.filter_not_followers_hint": "Agus daoine a bhfuil siad ag leanúint ort le níos lú ná {days, plural, one {lae amháin} two {# lá} few {# lá} many {# lá} other {# lá}}", + "notifications.policy.filter_not_followers_title": "Daoine nach leanann tú", + "notifications.policy.filter_not_following_hint": "Go dtí go gceadaíonn tú iad de láimh", + "notifications.policy.filter_not_following_title": "Daoine nach leanann tú", + "notifications.policy.filter_private_mentions_hint": "Scagtha mura bhfuil sé mar fhreagra ar do lua féin nó má leanann tú an seoltóir", + "notifications.policy.filter_private_mentions_title": "Tagairtí príobháideacha gan iarraidh", + "notifications.policy.title": "Scag fógraí ó…", "notifications_permission_banner.enable": "Ceadaigh fógraí ar an deasc", + "notifications_permission_banner.how_to_control": "Chun fógraí a fháil nuair nach bhfuil Mastodon oscailte, cumasaigh fógraí deisce. Is féidir leat a rialú go beacht cé na cineálacha idirghníomhaíochtaí a ghineann fógraí deisce tríd an gcnaipe {icon} thuas nuair a bhíonn siad cumasaithe.", "notifications_permission_banner.title": "Ná caill aon rud go deo", - "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", - "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", - "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", - "onboarding.start.skip": "Want to skip right ahead?", - "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", - "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", - "onboarding.steps.publish_status.body": "Say hello to the world.", - "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", - "onboarding.steps.setup_profile.title": "Customize your profile", - "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.action.back": "Tóg ar ais mé", + "onboarding.actions.back": "Tóg ar ais mé", + "onboarding.actions.go_to_explore": "Tóg mé chun trending", + "onboarding.actions.go_to_home": "Tóg go dtí mo bheathú baile mé", + "onboarding.compose.template": "Dia duit #Mastodon!", + "onboarding.follows.empty": "Ar an drochuair, ní féidir aon torthaí a thaispeáint faoi láthair. Is féidir leat triail a bhaint as cuardach nó brabhsáil ar an leathanach taiscéalaíochta chun teacht ar dhaoine le leanúint, nó bain triail eile as níos déanaí.", + "onboarding.follows.lead": "Is é do bheathú baile an príomhbhealach chun taithí a fháil ar Mastodon. Dá mhéad daoine a leanann tú, is ea is gníomhaí agus is suimiúla a bheidh sé. Chun tú a chur ar bun, seo roinnt moltaí:", + "onboarding.follows.title": "Cuir do chuid fotha baile in oiriúint duit féin", + "onboarding.profile.discoverable": "Déan mo phróifíl a fháil amach", + "onboarding.profile.discoverable_hint": "Nuair a roghnaíonn tú infhionnachtana ar Mastodon, d’fhéadfadh do phoist a bheith le feiceáil i dtorthaí cuardaigh agus treochtaí, agus d’fhéadfaí do phróifíl a mholadh do dhaoine a bhfuil na leasanna céanna acu leat.", + "onboarding.profile.display_name": "Ainm taispeána", + "onboarding.profile.display_name_hint": "D’ainm iomlán nó d’ainm spraíúil…", + "onboarding.profile.lead": "Is féidir leat é seo a chomhlánú i gcónaí níos déanaí sna socruithe, áit a bhfuil níos mó roghanna saincheaptha ar fáil.", + "onboarding.profile.note": "Bith", + "onboarding.profile.note_hint": "Is féidir leat @ daoine eile a lua nó #hashtags…", + "onboarding.profile.save_and_continue": "Sábháil agus lean ar aghaidh", + "onboarding.profile.title": "Socrú próifíle", + "onboarding.profile.upload_avatar": "Íosluchtaigh pictiúr próifíl", + "onboarding.profile.upload_header": "Íoslódáil an ceanntásca próifíl", + "onboarding.share.lead": "Cuir in iúl do dhaoine conas is féidir leo tú a aimsiú ar Mastodon!", + "onboarding.share.message": "Is {username} mé ar #Mastodon! Tar lean mé ag {url}", + "onboarding.share.next_steps": "Na chéad chéimeanna eile is féidir:", + "onboarding.share.title": "Roinn do phróifíl", + "onboarding.start.lead": "Tá tú mar chuid de Mastodon anois, ardán meán sóisialta díláraithe uathúil ina ndéanann tú - ní algartam - do thaithí féin a choimeád. Cuirimis tús leat ar an teorainn shóisialta nua seo:", + "onboarding.start.skip": "Nach bhfuil cabhair uait le tosú?", + "onboarding.start.title": "Tá sé déanta agat!", + "onboarding.steps.follow_people.body": "Is éard atá i gceist le daoine suimiúla a leanúint ná Mastodon.", + "onboarding.steps.follow_people.title": "Cuir do chuid fotha baile in oiriúint duit féin", + "onboarding.steps.publish_status.body": "Abair heileo leis an domhan le téacs, grianghraif, físeáin nó pobalbhreith {emoji}", + "onboarding.steps.publish_status.title": "Déan do chéad phostáil", + "onboarding.steps.setup_profile.body": "Cuir le d'idirghníomhaíochtaí trí phróifíl chuimsitheach a bheith agat.", + "onboarding.steps.setup_profile.title": "Déan do phróifíl a phearsantú", + "onboarding.steps.share_profile.body": "Cuir in iúl do do chairde conas tú a aimsiú ar Mastodon", + "onboarding.steps.share_profile.title": "Roinn do phróifíl Mastodon", + "onboarding.tips.2fa": "An raibh a fhios agat? Is féidir leat do chuntas a dhéanamh slán trí fhíordheimhniú dhá fhachtóir a shocrú i socruithe do chuntais. Oibríonn sé le haon aip TOTP de do rogha féin, níl aon uimhir theileafóin riachtanach!", + "onboarding.tips.accounts_from_other_servers": "An raibh a fhios agat? Ós rud é go bhfuil Mastodon díláraithe, déanfar roinnt próifílí a dtagann tú trasna orthu a óstáil ar fhreastalaithe seachas do fhreastalaithe. Agus fós is féidir leat idirghníomhú leo gan uaim! Tá an freastalaí acu sa dara leath dá n-ainm úsáideora!", + "onboarding.tips.migration": "An raibh a fhios agat? Más dóigh leat nach rogha freastalaí iontach é {domain} amach anseo, is féidir leat bogadh go freastalaí Mastodon eile gan do leantóirí a chailliúint. Is féidir leat do fhreastalaí féin a óstáil fiú!", + "onboarding.tips.verification": "An raibh a fhios agat? Is féidir leat do chuntas a fhíorú trí nasc a chur le do phróifíl Mastodon ar do shuíomh Gréasáin féin agus an suíomh Gréasáin a chur le do phróifíl. Níl aon táillí nó doiciméid riachtanach!", + "password_confirmation.exceeds_maxlength": "Sáraíonn dearbhú pasfhocail uasfhad an phasfhocail", + "password_confirmation.mismatching": "Ní hionann dearbhú pasfhocail", "picture_in_picture.restore": "Cuir é ar ais", "poll.closed": "Dúnta", "poll.refresh": "Athnuaigh", + "poll.reveal": "Féach torthaí", "poll.total_people": "{count, plural, one {# duine} other {# duine}}", "poll.total_votes": "{count, plural, one {# vóta} other {# vóta}}", "poll.vote": "Vótáil", @@ -384,11 +606,22 @@ "poll.votes": "{votes, plural, one {# vóta} other {# vóta}}", "poll_button.add_poll": "Cruthaigh suirbhé", "poll_button.remove_poll": "Bain suirbhé", - "privacy.change": "Adjust status privacy", + "privacy.change": "Athraigh príobháideacht postála", + "privacy.direct.long": "Luaigh gach duine sa phost", + "privacy.direct.short": "Daoine ar leith", + "privacy.private.long": "Do leanúna amháin", + "privacy.private.short": "Leantóirí", + "privacy.public.long": "Duine ar bith ar agus amach Mastodon", "privacy.public.short": "Poiblí", + "privacy.unlisted.additional": "Iompraíonn sé seo díreach mar a bheadh ​​poiblí, ach amháin ní bheidh an postáil le feiceáil i bhfothaí beo nó i hashtags, in iniúchadh nó i gcuardach Mastodon, fiú má tá tú liostáilte ar fud an chuntais.", + "privacy.unlisted.long": "Níos lú fanfarraí algarthacha", + "privacy.unlisted.short": "Poiblí ciúin", + "privacy_policy.last_updated": "Nuashonraithe {date}", "privacy_policy.title": "Polasaí príobháideachais", + "recommended": "Molta", "refresh": "Athnuaigh", "regeneration_indicator.label": "Ag lódáil…", + "regeneration_indicator.sublabel": "Tá do bheathú baile á ullmhú!", "relative_time.days": "{number}l", "relative_time.full.days": "{number, plural, one {# lá} other {# lá}} ó shin", "relative_time.full.hours": "{number, plural, one {# uair} other {# uair}} ó shin", @@ -400,77 +633,135 @@ "relative_time.minutes": "{number}n", "relative_time.seconds": "{number}s", "relative_time.today": "inniu", + "reply_indicator.attachments": "{count, plural, one {# alán} two {# aláin} few {# aláin} many {# aláin} other {# aláin}}", "reply_indicator.cancel": "Cealaigh", + "reply_indicator.poll": "Vótaíocht", "report.block": "Bac", "report.block_explanation": "Ní fheicfidh tú a c(h)úid postálacha. Ní bheidh sé/sí in ann do chuid postálacha a fheiceáil ná tú féin a leanúint. Beidh sé/sí in ann a dhéanamh amach go bhfuil sé/sí bactha.", + "report.categories.legal": "Dlíthiúil", "report.categories.other": "Eile", "report.categories.spam": "Turscar", "report.categories.violation": "Sáraíonn ábhar riail freastalaí amháin nó níos mó", "report.category.subtitle": "Roghnaigh an toradh is fearr", + "report.category.title": "Inis dúinn cad atá ar siúl leis an {type} seo", "report.category.title_account": "próifíl", "report.category.title_status": "postáil", "report.close": "Déanta", + "report.comment.title": "An bhfuil aon rud eile ba chóir dúinn a fhios agat, dar leat?", "report.forward": "Seol ar aghaidh chun {target}", + "report.forward_hint": "Is ó fhreastalaí eile an cuntas. Cuir cóip gan ainm den tuarascáil ansin freisin?", "report.mute": "Balbhaigh", "report.mute_explanation": "Ní fheicfidh tú a postálacha. Is féidir an té seo tú a leanúint agus do phostálacha a fheiceáil, agus ní fhios go bhfuil iad balbhaithe.", "report.next": "An céad eile", "report.placeholder": "Ráitis bhreise", "report.reasons.dislike": "Ní maith liom é", + "report.reasons.dislike_description": "Ní rud é ba mhaith leat a fheiceáil", + "report.reasons.legal": "Tá sé mídhleathach", + "report.reasons.legal_description": "Creideann tú go sáraíonn sé dlí do thíre nó do thír an fhreastalaí", "report.reasons.other": "Is rud eile é", + "report.reasons.other_description": "Ní luíonn an cheist le catagóirí eile", "report.reasons.spam": "Is turscar é", + "report.reasons.spam_description": "Naisc mhailíseacha, rannpháirtíocht bhréige, nó freagraí athchleachtach", "report.reasons.violation": "Sáraíonn sé rialacha an fhreastalaí", "report.reasons.violation_description": "Tá a fhios agat go sáraíonn sé rialacha ar leith", "report.rules.subtitle": "Roghnaigh gach atá i bhfeidhm", "report.rules.title": "Cén rialacha atá á sárú?", "report.statuses.subtitle": "Roghnaigh gach atá i bhfeidhm", + "report.statuses.title": "An bhfuil aon phoist a thacaíonn leis an tuarascáil seo?", "report.submit": "Cuir isteach", "report.target": "Ag tuairisciú {target}", + "report.thanks.take_action": "Seo do roghanna chun an méid a fheiceann tú ar Mastodon a rialú:", + "report.thanks.take_action_actionable": "Agus é seo á athbhreithniú againn, is féidir leat caingean a dhéanamh in aghaidh @{name}:", + "report.thanks.title": "Ná bí ag iarraidh é seo a fheiceáil?", + "report.thanks.title_actionable": "Go raibh maith agat as tuairisc a thabhairt, scrúdóimid é seo.", "report.unfollow": "Ná lean @{name}", + "report.unfollow_explanation": "Tá tú ag leanúint an chuntais seo. Chun nach bhfeicfidh tú a bpoist i do fhotha baile a thuilleadh, dílean ​​iad.", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", + "report_notification.categories.legal": "Dlíthiúil", + "report_notification.categories.legal_sentence": "ábhar mídhleathach", "report_notification.categories.other": "Eile", + "report_notification.categories.other_sentence": "eile", "report_notification.categories.spam": "Turscar", + "report_notification.categories.spam_sentence": "turscar", "report_notification.categories.violation": "Sárú rialach", + "report_notification.categories.violation_sentence": "sárú riail", "report_notification.open": "Oscail tuairisc", + "search.no_recent_searches": "Níl aon chuardach le déanaí", "search.placeholder": "Cuardaigh", + "search.quick_action.account_search": "Próifílí a mheaitseálann {x}", + "search.quick_action.go_to_account": "Téigh go próifíl {x}", + "search.quick_action.go_to_hashtag": "Téigh chuig hashtag {x}", + "search.quick_action.open_url": "Oscail URL i Mastodon", + "search.quick_action.status_search": "Postálacha a mheaitseálann {x}", "search.search_or_paste": "Cuardaigh nó cuir URL isteach", - "search_results.all": "Uile", - "search_results.hashtags": "Haischlibeanna", + "search_popout.full_text_search_disabled_message": "Níl sé ar fáil ar {domain}.", + "search_popout.full_text_search_logged_out_message": "Ar fáil ach amháin nuair atá tú logáilte isteach.", + "search_popout.language_code": "Cód teanga ISO", + "search_popout.options": "Roghanna cuardaigh", + "search_popout.quick_actions": "Gníomhartha tapa", + "search_popout.recent": "Cuardach le déanaí", + "search_popout.specific_date": "dáta ar leith", + "search_popout.user": "úsáideoir", + "search_results.accounts": "Próifílí", + "search_results.all": "Gach", + "search_results.hashtags": "Haischlib", + "search_results.nothing_found": "Níorbh fhéidir aon rud a aimsiú do na téarmaí cuardaigh seo", + "search_results.see_all": "Gach rud a fheicáil", "search_results.statuses": "Postálacha", "search_results.title": "Cuardaigh ar thóir {q}", + "server_banner.about_active_users": "Daoine a úsáideann an freastalaí seo le 30 lá anuas (Úsáideoirí Gníomhacha Míosúla)", "server_banner.active_users": "úsáideoirí gníomhacha", + "server_banner.administered_by": "Arna riar ag:", + "server_banner.is_one_of_many": "Tá {domain} ar cheann de na freastalaithe Mastodon neamhspleácha go leor is féidir leat a úsáid chun páirt a ghlacadh sa feiliúnach.", "server_banner.server_stats": "Staitisticí freastalaí:", "sign_in_banner.create_account": "Cruthaigh cuntas", + "sign_in_banner.follow_anyone": "Lean aon duine ar fud an fhealsúnachta agus féach ar fad in ord croineolaíoch. Gan algartam, fógraí, nó clickbait i radharc.", + "sign_in_banner.mastodon_is": "Is é Mastodon an bealach is fearr le coinneáil suas lena bhfuil ag tarlú.", "sign_in_banner.sign_in": "Sinigh isteach", - "status.admin_status": "Open this status in the moderation interface", + "sign_in_banner.sso_redirect": "Logáil isteach nó Cláraigh", + "status.admin_account": "Oscail comhéadan modhnóireachta do @{name}", + "status.admin_domain": "Oscail comhéadan modhnóireachta le haghaidh {domain}", + "status.admin_status": "Oscail an postáil seo sa chomhéadan modhnóireachta", "status.block": "Bac @{name}", "status.bookmark": "Leabharmharcanna", "status.cancel_reblog_private": "Dímhol", "status.cannot_reblog": "Ní féidir an phostáil seo a mholadh", - "status.copy": "Copy link to status", + "status.copy": "Cóipeáil an nasc chuig an bpostáil", "status.delete": "Scrios", + "status.detailed_status": "Amharc comhrá mionsonraithe", + "status.direct": "Luaigh @{name} go príobháideach", + "status.direct_indicator": "Lua príobháideach", "status.edit": "Cuir in eagar", + "status.edited": "Arna chuir in eagar anuas {date}", "status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}", "status.embed": "Leabaigh", + "status.favourite": "Is fearr leat", + "status.favourites": "{count, plural, one {a bhfuil grá agat do} two {gráite} few {gráite} many {gráite} other {gráite}}", "status.filter": "Déan scagadh ar an bpostáil seo", "status.filtered": "Scagtha", "status.hide": "Cuir postáil i bhfolach", "status.history.created": "Chruthaigh {name} {date}", "status.history.edited": "Curtha in eagar ag {name} in {date}", "status.load_more": "Lódáil a thuilleadh", + "status.media.open": "Cliceáil chun oscailt", + "status.media.show": "Cliceáil chun a thaispeáint", "status.media_hidden": "Cuirtear meáin i bhfolach", "status.mention": "Luaigh @{name}", "status.more": "Tuilleadh", "status.mute": "Balbhaigh @{name}", "status.mute_conversation": "Balbhaigh comhrá", - "status.open": "Expand this status", + "status.open": "Leathnaigh an post seo", "status.pin": "Pionnáil ar do phróifíl", "status.pinned": "Postáil pionnáilte", "status.read_more": "Léan a thuilleadh", - "status.reblog": "Mol", + "status.reblog": "Treisiú", "status.reblog_private": "Mol le léargas bunúsach", "status.reblogged_by": "Mhol {name}", + "status.reblogs": "{count, plural, one {buaic} other {buaic}}", "status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.", "status.redraft": "Scrios ⁊ athdhréachtaigh", + "status.remove_bookmark": "Bain leabharmharc", + "status.replied_to": "D'fhreagair {name}", "status.reply": "Freagair", "status.replyAll": "Freagair le snáithe", "status.report": "Tuairiscigh @{name}", @@ -482,41 +773,57 @@ "status.show_more": "Taispeáin níos mó", "status.show_more_all": "Taispeáin níos mó d'uile", "status.show_original": "Taispeáin bunchóip", - "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", + "status.title.with_attachments": "{user} a sheol {attachmentCount, plural, one {ceangal} two {{attachmentCount} ceangal} few {{attachmentCount} ceangail} many {{attachmentCount} ceangal} other {{attachmentCount} ceangal}}", "status.translate": "Aistrigh", "status.translated_from_with": "D'Aistrigh ón {lang} ag úsáid {provider}", + "status.uncached_media_warning": "Níl an réamhamharc ar fáil", "status.unmute_conversation": "Díbhalbhaigh comhrá", "status.unpin": "Díphionnáil de do phróifíl", + "subscribed_languages.lead": "Ní bheidh ach postálacha i dteangacha roghnaithe le feiceáil ar do bhaile agus liostaí amlínte tar éis an athraithe. Roghnaigh ceann ar bith chun postálacha a fháil i ngach teanga.", "subscribed_languages.save": "Sábháil athruithe", + "subscribed_languages.target": "Athraigh teangacha suibscríofa le haghaidh {target}", "tabs_bar.home": "Baile", "tabs_bar.notifications": "Fógraí", "time_remaining.days": "{number, plural, one {# lá} other {# lá}} fágtha", "time_remaining.hours": "{number, plural, one {# uair} other {# uair}} fágtha", "time_remaining.minutes": "{number, plural, one {# nóiméad} other {# nóiméad}} fágtha", + "time_remaining.moments": "Chuimhneacháin fágtha", "time_remaining.seconds": "{number, plural, one {# soicind} other {# soicind}} fágtha", + "timeline_hint.remote_resource_not_displayed": "Níl {resource} ó fhreastalaithe eile ar taispeáint.", "timeline_hint.resources.followers": "Leantóirí", "timeline_hint.resources.follows": "Cuntais leanta", "timeline_hint.resources.statuses": "Postáilí níos sine", "trends.counter_by_accounts": "{count, plural, one {{counter} duine} other {{counter} duine}} le {days, plural, one {lá} other {{days} lá}} anuas", "trends.trending_now": "Ag treochtáil anois", + "ui.beforeunload": "Caillfear do dhréacht má fhágann tú Mastodon.", "units.short.billion": "{count}B", "units.short.million": "{count}M", "units.short.thousand": "{count}k", "upload_area.title": "Tarraing ⁊ scaoil chun uaslódáil", - "upload_form.audio_description": "Describe for people with hearing loss", + "upload_button.label": "Cuir íomhánna, físeán nó comhad fuaime leis", + "upload_error.limit": "Sáraíodh an teorainn uaslódála comhaid.", + "upload_error.poll": "Ní cheadaítear uaslódáil comhad le pobalbhreith.", + "upload_form.audio_description": "Déan cur síos ar dhaoine bodhra nó lagéisteachta", "upload_form.description": "Describe for the visually impaired", "upload_form.edit": "Cuir in eagar", - "upload_form.video_description": "Describe for people with hearing loss or visual impairment", + "upload_form.thumbnail": "Athraigh mionsamhail", + "upload_form.video_description": "Déan cur síos ar dhaoine atá bodhar, lagéisteachta, dall nó lagamhairc", "upload_modal.analyzing_picture": "Ag anailísiú íomhá…", "upload_modal.apply": "Cuir i bhFeidhm", "upload_modal.applying": "Á gcur i bhfeidhm…", "upload_modal.choose_image": "Roghnaigh íomhá", "upload_modal.description_placeholder": "Chuaigh bé mhórsách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig", + "upload_modal.detect_text": "Braith téacs ó phictiúr", "upload_modal.edit_media": "Cuir gné in eagar", + "upload_modal.hint": "Cliceáil nó tarraing an ciorcal ar an réamhamharc chun an pointe fócasach a roghnú a bheidh le feiceáil i gcónaí ar na mionsamhlacha go léir.", + "upload_modal.preparing_ocr": "OCR á ullmhú…", + "upload_modal.preview_label": "Réamhamharc ({ratio})", "upload_progress.label": "Ag uaslódáil...", "upload_progress.processing": "Ag próiseáil…", + "username.taken": "Glactar leis an ainm úsáideora sin. Bain triail eile as", "video.close": "Dún físeán", "video.download": "Íoslódáil comhad", + "video.exit_fullscreen": "Scoir scáileán iomlán", "video.expand": "Leath físeán", "video.fullscreen": "Lánscáileán", "video.hide": "Cuir físeán i bhfolach", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 714fa6e364b..440654b0db5 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -35,9 +35,9 @@ "account.follow_back": "Lean air ais", "account.followers": "Luchd-leantainn", "account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.", - "account.followers_counter": "{count, plural, one {{counter} neach-leantainn} two {{counter} neach-leantainn} few {{counter} luchd-leantainn} other {{counter} luchd-leantainn}}", + "account.followers_counter": "{count, plural, one {{counter} neach-leantainn} other {{counter} luchd-leantainn}}", "account.following": "A’ leantainn", - "account.following_counter": "{count, plural, one {A’ leantainn {counter}} two {A’ leantainn {counter}} few {A’ leantainn {counter}} other {A’ leantainn {counter}}}", + "account.following_counter": "{count, plural, one {Tha {counter} a’ leantainn} other {Tha {counter} a’ leantainn}}", "account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn neach sam bith fhathast.", "account.go_to_profile": "Tadhail air a’ phròifil", "account.hide_reblogs": "Falaich na brosnachaidhean o @{name}", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Rabhadh susbainte (roghainneil)", "confirmation_modal.cancel": "Sguir dheth", "confirmations.block.confirm": "Bac", - "confirmations.cancel_follow_request.confirm": "Cuir d’ iarrtas dhan dàrna taobh", - "confirmations.cancel_follow_request.message": "A bheil thu cinnteach gu bheil thu airson d’ iarrtas airson {name} a leantainn a chur dhan dàrna taobh?", "confirmations.delete.confirm": "Sguab às", "confirmations.delete.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às?", + "confirmations.delete.title": "A bheil thu airson am post a sguabadh às?", "confirmations.delete_list.confirm": "Sguab às", "confirmations.delete_list.message": "A bheil thu cinnteach gu bheil thu airson an liosta seo a sguabadh às gu buan?", + "confirmations.delete_list.title": "A bheil thu airson an liosta a sguabadh às?", "confirmations.discard_edit_media.confirm": "Tilg air falbh", "confirmations.discard_edit_media.message": "Tha atharraichean gun sàbhaladh agad ann an tuairisgeul no ro-shealladh a’ mheadhain, a bheil thu airson an tilgeil air falbh co-dhiù?", - "confirmations.domain_block.confirm": "Bac am frithealaiche", - "confirmations.domain_block.message": "A bheil thu cinnteach dha-rìribh gu bheil thu airson an àrainn {domain} a bhacadh uile gu lèir? Mar as trice, foghnaidh gun dèan thu bacadh no mùchadh no dhà gu sònraichte agus bhiodh sin na b’ fheàrr. Chan fhaic thu susbaint on àrainn ud air loidhne-ama phoblach sam bith no am measg nam brathan agad. Thèid an luchd-leantainn agad on àrainn ud a thoirt air falbh.", "confirmations.edit.confirm": "Deasaich", "confirmations.edit.message": "Ma nì thu deasachadh an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", + "confirmations.edit.title": "A bheil thu airson sgrìobhadh thairis air a’ phost?", "confirmations.logout.confirm": "Clàraich a-mach", "confirmations.logout.message": "A bheil thu cinnteach gu bheil thu airson clàradh a-mach?", + "confirmations.logout.title": "A bheil thu airson clàradh a-mach?", "confirmations.mute.confirm": "Mùch", "confirmations.redraft.confirm": "Sguab às ⁊ dèan dreachd ùr", "confirmations.redraft.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às agus dreachd ùr a thòiseachadh? Caillidh tu gach annsachd is brosnachadh air agus thèid freagairtean dhan phost thùsail ’nan dìlleachdanan.", + "confirmations.redraft.title": "A bheil thu airson am post a sguabadh às ⁊ dreachd ùr a dhèanamh dheth?", "confirmations.reply.confirm": "Freagair", "confirmations.reply.message": "Ma bheir thu freagairt an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", + "confirmations.reply.title": "A bheil thu airson sgrìobhadh thairis air a’ phost?", "confirmations.unfollow.confirm": "Na lean tuilleadh", "confirmations.unfollow.message": "A bheil thu cinnteach nach eil thu airson {name} a leantainn tuilleadh?", + "confirmations.unfollow.title": "A bheil thu airson sgur de leantainn a chleachdaiche?", "conversation.delete": "Sguab às an còmhradh", "conversation.mark_as_read": "Cuir comharra gun deach a leughadh", "conversation.open": "Seall an còmhradh", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Cleachd roinn-seòrsa a tha ann no cruthaich tè ùr", "filter_modal.select_filter.title": "Criathraich am post seo", "filter_modal.title.status": "Criathraich post", - "filtered_notifications_banner.mentions": "{count, plural, one {iomradh} two {iomradh} few {iomraidhean} other {iomradh}}", - "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil brath ann o dhaoine} one {Tha brathan ann o # neach} two {Tha brathan ann o # neach} few {Tha brathan ann o # daoine} other {Tha brathan ann o # duine}} air a bheil thu eòlach ’s dòcha", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil gin ann} one {O # neach} two {O # neach} few {O # daoine} other {O # duine}} air a bheil thu eòlach ’s dòcha", "filtered_notifications_banner.title": "Brathan criathraichte", "firehose.all": "Na h-uile", "firehose.local": "Am frithealaiche seo", @@ -308,6 +310,7 @@ "follow_requests.unlocked_explanation": "Ged nach eil an cunntas agad glaiste, tha sgioba {domain} dhen bheachd gum b’ fheàirrde thu lèirmheas a dhèanamh air na h-iarrtasan leantainn o na cunntasan seo a làimh.", "follow_suggestions.curated_suggestion": "Roghainn an sgioba", "follow_suggestions.dismiss": "Na seall seo a-rithist", + "follow_suggestions.featured_longer": "Chaidh a thaghadh a làmh leis an sgioba aig {domain}", "follow_suggestions.friends_of_friends_longer": "Fèill mhòr am measg nan daoine a leanas tu", "follow_suggestions.hints.featured": "Chaidh a’ phròifil seo a thaghadh le sgioba {domain} a làimh.", "follow_suggestions.hints.friends_of_friends": "Tha fèill mhòr air a’ phròifil seo am measg nan daoine a leanas tu.", @@ -317,6 +320,7 @@ "follow_suggestions.personalized_suggestion": "Moladh pearsanaichte", "follow_suggestions.popular_suggestion": "Moladh air a bheil fèill mhòr", "follow_suggestions.popular_suggestion_longer": "Fèill mhòr air {domain}", + "follow_suggestions.similar_to_recently_followed_longer": "Tha e coltach ri pròifilean a lean thu o chionn goirid", "follow_suggestions.view_all": "Seall na h-uile", "follow_suggestions.who_to_follow": "Molaidhean leantainn", "followed_tags": "Tagaichean hais ’gan leantainn", @@ -412,6 +416,8 @@ "limited_account_hint.action": "Seall a’ phròifil co-dhiù", "limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir {domain}.", "link_preview.author": "Le {name}", + "link_preview.more_from_author": "Barrachd le {name}", + "link_preview.shares": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}", "lists.account.add": "Cuir ris an liosta", "lists.account.remove": "Thoir air falbh on liosta", "lists.delete": "Sguab às an liosta", @@ -439,6 +445,8 @@ "mute_modal.title": "A bheil thu airson an cleachdaiche a mhùchadh?", "mute_modal.you_wont_see_mentions": "Chan fhaic thu na postaichean a bheir iomradh orra.", "mute_modal.you_wont_see_posts": "Chì iad na postaichean agad fhathast ach chan fhaic thu na postaichean aca-san.", + "name_and_others": "{name} ’s {count, plural, one {# eile} other {# eile}}", + "name_and_others_with_link": "{name} ’s {count, plural, one {# eile} other {# eile}}", "navigation_bar.about": "Mu dhèidhinn", "navigation_bar.advanced_interface": "Fosgail san eadar-aghaidh-lìn adhartach", "navigation_bar.blocks": "Cleachdaichean bacte", @@ -466,14 +474,27 @@ "navigation_bar.security": "Tèarainteachd", "not_signed_in_indicator.not_signed_in": "Feumaidh tu clàradh a-steach mus fhaigh thu cothrom air a’ ghoireas seo.", "notification.admin.report": "Rinn {name} gearan mu {target}", + "notification.admin.report_account": "Rinn {name} gearan mu {count, plural, one {# phost} two {# phost} few {# postaichean} other {# post}} le {target} air adhbhar {category}", + "notification.admin.report_account_other": "Rinn {name} gearan mu {count, plural, one {# phost} two {# phost} few {# postaichean} other {# post}} le {target}", + "notification.admin.report_statuses": "Rinn {name} gearan mu {target} air adhbhar {category}", + "notification.admin.report_statuses_other": "Rinn {name} gearan mu {target}", "notification.admin.sign_up": "Chlàraich {name}", "notification.favourite": "Is annsa le {name} am post agad", "notification.follow": "Tha {name} ’gad leantainn a-nis", "notification.follow_request": "Dh’iarr {name} ’gad leantainn", "notification.mention": "Thug {name} iomradh ort", "notification.moderation-warning.learn_more": "Barrachd fiosrachaidh", + "notification.moderation_warning": "Fhuair thu rabhadh on mhaorsainneachd", + "notification.moderation_warning.action_delete_statuses": "Chaidh cuid dhe na postaichean agad a thoirt air falbh.", + "notification.moderation_warning.action_disable": "Chaidh an cunntas agad a chur à comas.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Chaidh comharra a chur ri cuid dhe na postaichean agad gu bheil iad frionasach.", + "notification.moderation_warning.action_none": "Fhuair an cunntas agad rabhadh on mhaorsainneachd.", + "notification.moderation_warning.action_sensitive": "Thèid comharra na frionasachd a chur ris na postaichean agad o seo a-mach.", + "notification.moderation_warning.action_silence": "Chaidh an cunntas agad a chuingeachadh.", + "notification.moderation_warning.action_suspend": "Chaidh an cunntas agad a chur à rèim.", "notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch", "notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch", + "notification.private_mention": "Thug {name} iomradh ort gu prìobhaideach", "notification.reblog": "Bhrosnaich {name} am post agad", "notification.relationships_severance_event": "Chaill thu dàimhean le {name}", "notification.relationships_severance_event.account_suspension": "Chuir rianaire aig {from} {target} à rèim agus is ciall dha sin nach fhaigh thu naidheachdan uapa ’s nach urrainn dhut conaltradh leotha.", @@ -488,9 +509,12 @@ "notification_requests.title": "Brathan criathraichte", "notifications.clear": "Falamhaich na brathan", "notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?", + "notifications.clear_title": "A bheil thu airson na brathan fhalamhachadh?", "notifications.column_settings.admin.report": "Gearanan ùra:", "notifications.column_settings.admin.sign_up": "Clàraidhean ùra:", "notifications.column_settings.alert": "Brathan deasga", + "notifications.column_settings.beta.category": "Gleusan deuchainneil", + "notifications.column_settings.beta.grouping": "Buidhnich na brathan", "notifications.column_settings.favourite": "Annsachdan:", "notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa", "notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath", @@ -527,7 +551,7 @@ "notifications.policy.filter_not_following_title": "Daoine nach eil thu a’ leantainn", "notifications.policy.filter_private_mentions_hint": "Criathraichte ach ma tha e a’ freagairt do dh’iomradh agad fhèin no ma tha thu a’ leantainn an t-seòladair", "notifications.policy.filter_private_mentions_title": "Iomraidhean prìobhaideach o choigrich", - "notifications.policy.title": "Falamhaich na brathan o…", + "notifications.policy.title": "Falaich na brathan o…", "notifications_permission_banner.enable": "Cuir brathan deasga an comas", "notifications_permission_banner.how_to_control": "Airson brathan fhaighinn nuair nach eil Mastodon fosgailte, cuir na brathan deasga an comas. Tha an smachd agad fhèin air dè na seòrsaichean de chonaltradh a ghineas brathan deasga leis a’ phutan {icon} gu h-àrd nuair a bhios iad air an cur an comas.", "notifications_permission_banner.title": "Na caill dad gu bràth tuilleadh", @@ -654,9 +678,13 @@ "report.unfollow_explanation": "Tha thu a’ leantainn a’ chunntais seo. Sgur dhen leantainn ach nach fhaic thu na puist aca nad dhachaigh.", "report_notification.attached_statuses": "Tha {count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}} ceangailte ris", "report_notification.categories.legal": "Laghail", + "report_notification.categories.legal_sentence": "susbaint mhì-laghail", "report_notification.categories.other": "Eile", + "report_notification.categories.other_sentence": "eile", "report_notification.categories.spam": "Spama", + "report_notification.categories.spam_sentence": "spama", "report_notification.categories.violation": "Briseadh riaghailte", + "report_notification.categories.violation_sentence": "briseadh riaghailte", "report_notification.open": "Fosgail an gearan", "search.no_recent_searches": "Cha do rinn thu lorg o chionn goirid", "search.placeholder": "Lorg", @@ -684,8 +712,11 @@ "server_banner.about_active_users": "Daoine a chleachd am frithealaiche seo rè an 30 latha mu dheireadh (Cleachdaichean gnìomhach gach mìos)", "server_banner.active_users": "cleachdaichean gnìomhach", "server_banner.administered_by": "Rianachd le:", + "server_banner.is_one_of_many": "Is {domain} fear de dh’iomadh frithealaiche Mastodon neo-eisimeileach as urrainn dhut cleachdadh airson pàirt a ghabhail sa cho-shaoghal.", "server_banner.server_stats": "Stadastaireachd an fhrithealaiche:", "sign_in_banner.create_account": "Cruthaich cunntas", + "sign_in_banner.follow_anyone": "Lean duine sam bith air a’ cho-shaoghal agus faic a h-uile càil a-rèir an ama. Chan eil sgeul air algairimean, sanasachd no clickbait.", + "sign_in_banner.mastodon_is": "Is Mastodon an dòigh as fheàrr airson sùil a chumail air na tha a’ dol.", "sign_in_banner.sign_in": "Clàraich a-steach", "sign_in_banner.sso_redirect": "Clàraich a-steach no clàraich leinn", "status.admin_account": "Fosgail eadar-aghaidh na maorsainneachd dha @{name}", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 7b77f980349..137130e9e9d 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -35,9 +35,9 @@ "account.follow_back": "Seguir tamén", "account.followers": "Seguidoras", "account.followers.empty": "Aínda ninguén segue esta usuaria.", - "account.followers_counter": "{count, plural, one {{counter} Seguidora} other {{counter} Seguidoras}}", + "account.followers_counter": "{count, plural, one {{counter} seguidora} other {{counter} seguidoras}}", "account.following": "Seguindo", - "account.following_counter": "{count, plural, one {{counter} Seguindo} other {{counter} Seguindo}}", + "account.following_counter": "{count, plural, one {{counter} seguimento} other {{counter} seguimentos}}", "account.follows.empty": "Esta usuaria aínda non segue a ninguén.", "account.go_to_profile": "Ir ao perfil", "account.hide_reblogs": "Agochar promocións de @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} solicitou seguirte", "account.share": "Compartir o perfil de @{name}", "account.show_reblogs": "Amosar compartidos de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicacións}}", + "account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicacións}}", "account.unblock": "Desbloquear @{name}", "account.unblock_domain": "Amosar {domain}", "account.unblock_short": "Desbloquear", @@ -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 poden seguir nin mencionar.", + "block_modal.they_cant_mention": "Non te pode 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?", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Aviso sobre o contido (optativo)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar solicitude", - "confirmations.cancel_follow_request.message": "Tes a certeza de querer retirar a solicitude para seguir a {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "Tes a certeza de querer eliminar esta publicación?", + "confirmations.delete.title": "Eliminar a publicación?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?", + "confirmations.delete_list.title": "Eliminar a lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tes cambios sen gardar para a vista previa ou descrición do multimedia, descartamos os cambios?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. As túas seguidoras deste dominio serán eliminadas.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Ao editar sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", + "confirmations.edit.title": "Editar a publicación?", "confirmations.logout.confirm": "Pechar sesión", "confirmations.logout.message": "Desexas pechar a sesión?", + "confirmations.logout.title": "Pechar sesión?", "confirmations.mute.confirm": "Acalar", "confirmations.redraft.confirm": "Eliminar e reescribir", "confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.", + "confirmations.redraft.title": "Eliminar e reescribir a publicación?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Ao responder sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", + "confirmations.reply.title": "Editar a publicación?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Desexas deixar de seguir a {name}?", + "confirmations.unfollow.title": "Deixar de seguir á usuaria?", "conversation.delete": "Eliminar conversa", "conversation.mark_as_read": "Marcar como lido", "conversation.open": "Ver conversa", @@ -216,7 +219,7 @@ "domain_block_modal.they_wont_know": "Non saberá que a bloqueaches.", "domain_block_modal.title": "Bloquear dominio?", "domain_block_modal.you_will_lose_followers": "Vanse eliminar todas as túas seguidoras deste servidor.", - "domain_block_modal.you_wont_see_posts": "Non verás publicacións ou notificación das usuarias neste servidor.", + "domain_block_modal.you_wont_see_posts": "Non verás publicacións ou notificacións das usuarias deste servidor.", "domain_pill.activitypub_lets_connect": "Permíteche conectar e interactuar con persoas non só de Mastodon, se non tamén con outras apps sociais.", "domain_pill.activitypub_like_language": "ActivityPub é algo así como o idioma que Mastodon fala con outras redes sociais.", "domain_pill.server": "Servidor", @@ -224,7 +227,7 @@ "domain_pill.their_server": "O seu fogar dixital, onde están as súas publicacións.", "domain_pill.their_username": "O seu identificador único no seu servidor. É posible atopar usuarias co mesmo nome de usuaria en diferentes servidores.", "domain_pill.username": "Nome de usuaria", - "domain_pill.whats_in_a_handle": "Que é o alcume?", + "domain_pill.whats_in_a_handle": "As partes do alcume?", "domain_pill.who_they_are": "O alcume dinos quen é esa persoa e onde está, para que poidas interactuar con ela en toda a web social de .", "domain_pill.who_you_are": "Como o teu alcume informa de quen es e onde estás, as persoas poden interactuar contigo desde toda a web social de .", "domain_pill.your_handle": "O teu alcume:", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usar unha categoría existente ou crear unha nova", "filter_modal.select_filter.title": "Filtrar esta publicación", "filter_modal.title.status": "Filtrar unha publicación", - "filtered_notifications_banner.mentions": "{count, plural, one {mención} other {mencións}}", - "filtered_notifications_banner.pending_requests": "Notificacións de {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que poderías coñecer", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que igual coñeces", "filtered_notifications_banner.title": "Notificacións filtradas", "firehose.all": "Todo", "firehose.local": "Este servidor", @@ -443,6 +445,8 @@ "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.", + "name_and_others": "{name} e {count, plural, one {outra máis} other {# máis}}", + "name_and_others_with_link": "{name} e {count, plural, one {outra máis} other {# máis}}", "navigation_bar.about": "Sobre", "navigation_bar.advanced_interface": "Abrir coa interface web avanzada", "navigation_bar.blocks": "Usuarias bloqueadas", @@ -470,6 +474,10 @@ "navigation_bar.security": "Seguranza", "not_signed_in_indicator.not_signed_in": "Debes acceder para ver este recurso.", "notification.admin.report": "{name} denunciou a {target}", + "notification.admin.report_account": "{name} denunciou {count, plural, one {unha publicación} other {# publicacións}} de {target} por {category}", + "notification.admin.report_account_other": "{name} denunciou {count, plural, one {unha publicación} other {# publicacións}} de {target}", + "notification.admin.report_statuses": "{name} deununciou a {target} por {category}", + "notification.admin.report_statuses_other": "{name} denunciou a {target}", "notification.admin.sign_up": "{name} rexistrouse", "notification.favourite": "{name} marcou como favorita a túa publicación", "notification.follow": "{name} comezou a seguirte", @@ -486,6 +494,7 @@ "notification.moderation_warning.action_suspend": "A túa conta foi suspendida.", "notification.own_poll": "A túa enquisa rematou", "notification.poll": "Rematou a enquisa na que votaches", + "notification.private_mention": "{name} mencionoute de xeito privado", "notification.reblog": "{name} compartiu a túa publicación", "notification.relationships_severance_event": "Perdeuse a conexión con {name}", "notification.relationships_severance_event.account_suspension": "A administración de {from} suspendeu a {target}, o que significa que xa non vas recibir actualizacións de esa conta ou interactuar con ela.", @@ -496,13 +505,18 @@ "notification.update": "{name} editou unha publicación", "notification_requests.accept": "Aceptar", "notification_requests.dismiss": "Desbotar", + "notification_requests.maximize": "Maximizar", + "notification_requests.minimize_banner": "Minimizar o anuncio de notificacións filtradas", "notification_requests.notifications_from": "Notificacións de {name}", "notification_requests.title": "Notificacións filtradas", "notifications.clear": "Limpar notificacións", "notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?", + "notifications.clear_title": "Limpar as notificacións?", "notifications.column_settings.admin.report": "Novas denuncias:", "notifications.column_settings.admin.sign_up": "Novas usuarias:", "notifications.column_settings.alert": "Notificacións de escritorio", + "notifications.column_settings.beta.category": "Características experimentais", + "notifications.column_settings.beta.grouping": "Notificacións de grupo", "notifications.column_settings.favourite": "Favoritas:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorías", "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Estás a seguir esta conta. Deixar de ver as súas publicacións na túa cronoloxía, non seguila.", "report_notification.attached_statuses": "Achegou {count, plural, one {{count} publicación} other {{count} publicacións}}", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "contido ilegal", "report_notification.categories.other": "Outro", + "report_notification.categories.other_sentence": "outra", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Faltou ás regras", + "report_notification.categories.violation_sentence": "violación das regras", "report_notification.open": "Abrir a denuncia", "search.no_recent_searches": "Non hai buscas recentes", "search.placeholder": "Procurar", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 1c50ba8e1f3..a1f718d24f4 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -1,5 +1,5 @@ { - "about.blocks": "שרתים מוגבלים", + "about.blocks": "שרתים שנחסמו על ידי המנהלים", "about.contact": "יצירת קשר:", "about.disclaimer": "מסטודון היא תוכנת קוד פתוח חינמית וסימן מסחרי של Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "הסיבה אינה זמינה", @@ -35,9 +35,9 @@ "account.follow_back": "לעקוב בחזרה", "account.followers": "עוקבים", "account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.", - "account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}", + "account.followers_counter": "{count, plural,one {עוקב אחד} other {{count} עוקבים}}", "account.following": "נעקבים", - "account.following_counter": "{count, plural,one {עוקב אחרי {counter}}other {עוקב אחרי {counter}}}", + "account.following_counter": "{count, plural,one {עוקב אחרי {count}}other {עוקב אחרי {count}}}", "account.follows.empty": "משתמש זה עדיין לא עוקב אחרי אף אחד.", "account.go_to_profile": "מעבר לפרופיל", "account.hide_reblogs": "להסתיר הידהודים מאת @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} ביקשו לעקוב אחריך", "account.share": "שתף את הפרופיל של @{name}", "account.show_reblogs": "הצג הדהודים מאת @{name}", - "account.statuses_counter": "{count, plural, one {הודעה} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}", + "account.statuses_counter": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}", "account.unblock": "להסיר חסימה ל- @{name}", "account.unblock_domain": "הסירי את החסימה של קהילת {domain}", "account.unblock_short": "הסר חסימה", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "אזהרת תוכן (לא חובה)", "confirmation_modal.cancel": "ביטול", "confirmations.block.confirm": "לחסום", - "confirmations.cancel_follow_request.confirm": "ויתור על בקשה", - "confirmations.cancel_follow_request.message": "לבטל את בקשת המעקב אחרי {name}?", "confirmations.delete.confirm": "למחוק", "confirmations.delete.message": "בטוח/ה שאת/ה רוצה למחוק את ההודעה?", + "confirmations.delete.title": "למחוק הודעה?", "confirmations.delete_list.confirm": "למחוק", "confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?", + "confirmations.delete_list.title": "למחוק רשימה?", "confirmations.discard_edit_media.confirm": "השלך", "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?", - "confirmations.domain_block.confirm": "חסימת שרת", - "confirmations.domain_block.message": "בטוחה שברצונך באמת לחסום את קהילת {domain}? ברב המקרים השתקה וחסימה של מספר משתמשים עשוייה להספיק. לא תראי תוכל מכלל שם המתחם בפידים הציבוריים או בהתראות שלך. העוקבים שלך מהקהילה הזאת יוסרו", "confirmations.edit.confirm": "עריכה", "confirmations.edit.message": "עריכה תדרוס את ההודעה שכבר התחלת לכתוב. האם להמשיך?", + "confirmations.edit.title": "לבצע החלפת תוכן?", "confirmations.logout.confirm": "התנתקות", "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?", + "confirmations.logout.title": "להתנתק?", "confirmations.mute.confirm": "להשתיק", "confirmations.redraft.confirm": "מחיקה ועריכה מחדש", "confirmations.redraft.message": "למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות להודעה המקורית ישארו יתומות.", + "confirmations.redraft.title": "מחיקה ועריכה מחדש?", "confirmations.reply.confirm": "תגובה", "confirmations.reply.message": "תגובה עכשיו תמחק את ההודעה שכבר התחלת לכתוב. להמשיך?", + "confirmations.reply.title": "לבצע החלפת תוכן?", "confirmations.unfollow.confirm": "הפסקת מעקב", "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", + "confirmations.unfollow.title": "לבטל מעקב אחר המשתמש.ת?", "conversation.delete": "מחיקת שיחה", "conversation.mark_as_read": "סמן כנקרא", "conversation.open": "צפו בשיחה", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה", "filter_modal.select_filter.title": "סינון ההודעה הזו", "filter_modal.title.status": "סנן הודעה", - "filtered_notifications_banner.mentions": "{count, plural, one {איזכור} other {איזכורים} two {איזכוריים}}", - "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}two {יש התראותיים ממשתמשים }other {יש # התראות ממשתמשים }}מוכרים לך", + "filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין בקשות ממשתמשים }one {בקשה אחת ממישהו/מישהי }two {יש בקשותיים ממשתמשים }other {יש # בקשות ממשתמשים }}שאולי מוכרים לך", "filtered_notifications_banner.title": "התראות מסוננות", "firehose.all": "הכל", "firehose.local": "שרת זה", @@ -443,6 +445,8 @@ "mute_modal.title": "להשתיק משתמש?", "mute_modal.you_wont_see_mentions": "לא תראה הודעות שמאזכרות אותם.", "mute_modal.you_wont_see_posts": "הם יכולים לראות את הודעותכם, אבל אתם לא תוכלו לראות את שלהם.", + "name_and_others": "{name} ועוד {count, plural,one {אחד נוסף}other {# נוספים}}", + "name_and_others_with_link": "{name} ועוד {count, plural,one {אחד נוסף}other {# נוספים}}", "navigation_bar.about": "אודות", "navigation_bar.advanced_interface": "פתח במנשק ווב מתקדם", "navigation_bar.blocks": "משתמשים חסומים", @@ -470,6 +474,10 @@ "navigation_bar.security": "אבטחה", "not_signed_in_indicator.not_signed_in": "יש להיות מאומת כדי לגשת למשאב זה.", "notification.admin.report": "{name} דיווח.ה על {target}", + "notification.admin.report_account": "{name} דווחו על {count, plural, one {הודעה אחת} two {הודעותיים} many {# הודעות} other {# הודעות}} מאת {target} בגין {category}", + "notification.admin.report_account_other": "{name} דווחו על {count, plural, one {הודעה אחת} two {הודעותיים} many {# הודעות} other {# הודעות}} מאת {target}", + "notification.admin.report_statuses": "{name} דווחו על {target} בגין {category}", + "notification.admin.report_statuses_other": "{name} דיווח.ה על {target}", "notification.admin.sign_up": "{name} נרשמו", "notification.favourite": "הודעתך חובבה על ידי {name}", "notification.follow": "{name} במעקב אחרייך", @@ -486,6 +494,7 @@ "notification.moderation_warning.action_suspend": "חשבונך הושעה.", "notification.own_poll": "הסקר שלך הסתיים", "notification.poll": "סקר שהצבעת בו הסתיים", + "notification.private_mention": "{name} פנה/פנתה אליך בפרטיות", "notification.reblog": "הודעתך הודהדה על ידי {name}", "notification.relationships_severance_event": "אבד הקשר עם {name}", "notification.relationships_severance_event.account_suspension": "מנהל.ת משרת {from} השע(ת)ה את {target}, ולפיכך לא תעודכנו יותר על ידם ולא תוכלו להיות איתם בקשר.", @@ -496,13 +505,18 @@ "notification.update": "{name} ערכו הודעה", "notification_requests.accept": "לקבל", "notification_requests.dismiss": "לבטל", + "notification_requests.maximize": "הגדלה למקסימום", + "notification_requests.minimize_banner": "להקטין את כותרת ההודעות המפולטרות", "notification_requests.notifications_from": "התראות מ־ {name}", "notification_requests.title": "התראות מסוננות", "notifications.clear": "הסרת התראות", "notifications.clear_confirmation": "להסיר את כל ההתראות לצמיתות ? ", + "notifications.clear_title": "לנקות התראות?", "notifications.column_settings.admin.report": "דו\"חות חדשים", "notifications.column_settings.admin.sign_up": "הרשמות חדשות:", "notifications.column_settings.alert": "התראות לשולחן העבודה", + "notifications.column_settings.beta.category": "יכולות ניסיוניות", + "notifications.column_settings.beta.grouping": "התראות קבוצה", "notifications.column_settings.favourite": "חיבובים:", "notifications.column_settings.filter_bar.advanced": "להציג את כל הקטגוריות", "notifications.column_settings.filter_bar.category": "שורת סינון מהיר", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "אתם עוקבים אחרי החשבון הזה. כדי להפסיק לראות את הפרסומים שלו בפיד הבית שלכם, הפסיקו לעקוב אחריו.", "report_notification.attached_statuses": "{count, plural, one {הודעה מצורפת} two {הודעותיים מצורפות} many {{count} הודעות מצורפות} other {{count} הודעות מצורפות}}", "report_notification.categories.legal": "חוקי", + "report_notification.categories.legal_sentence": "תוכן בלתי חוקי", "report_notification.categories.other": "שונות", + "report_notification.categories.other_sentence": "אחר", "report_notification.categories.spam": "ספאם (דואר זבל)", + "report_notification.categories.spam_sentence": "ספאם (דואר זבל)", "report_notification.categories.violation": "הפרת כלל", + "report_notification.categories.violation_sentence": "הפרת כלל", "report_notification.open": "פתח דו\"ח", "search.no_recent_searches": "לא נמצאו חיפושים אחרונים", "search.placeholder": "חיפוש", @@ -696,8 +714,11 @@ "server_banner.about_active_users": "משתמשים פעילים בשרת ב־30 הימים האחרונים (משתמשים פעילים חודשיים)", "server_banner.active_users": "משתמשים פעילים", "server_banner.administered_by": "מנוהל ע\"י:", + "server_banner.is_one_of_many": "{domain} הוא שרת אחד משרתי מסטודון עצמאיים רבים שדרגם תוכלו להשתתף בפדיוורס (רשת חברתית מבוזרת).", "server_banner.server_stats": "סטטיסטיקות שרת:", "sign_in_banner.create_account": "יצירת חשבון", + "sign_in_banner.follow_anyone": "תוכלו לעקוב אחרי כל משמתמש בפדיוורס ולקרוא הכל לפי סדר הפרסום בציר הזמן. אין אלגוריתמים, פרסומות, או קליקבייט מטעם בעלי הרשת.", + "sign_in_banner.mastodon_is": "מסטודון הוא הדרך הטובה ביותר לעקוב אחרי מה שקורה.", "sign_in_banner.sign_in": "התחברות", "sign_in_banner.sso_redirect": "התחברות/הרשמה", "status.admin_account": "פתח/י ממשק ניהול עבור @{name}", @@ -774,7 +795,7 @@ "timeline_hint.resources.followers": "עוקבים", "timeline_hint.resources.follows": "נעקבים", "timeline_hint.resources.statuses": "הודעות ישנות יותר", - "trends.counter_by_accounts": "{count, plural, one {אדם {count}} other {{count} א.נשים}} {days, plural, one {מאז אתמול} two {ביומיים האחרונים} other {במשך {days} הימים האחרונים}}", + "trends.counter_by_accounts": "{count, plural, one {אדם אחד} other {{count} א.נשים}} {days, plural, one {מאז אתמול} two {ביומיים האחרונים} other {במשך {days} הימים האחרונים}}", "trends.trending_now": "נושאים חמים", "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.", "units.short.billion": "{count} מליארד", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 5dc99dd76e4..c2a961b32c6 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -35,9 +35,7 @@ "account.follow_back": "फॉलो करें", "account.followers": "फॉलोवर", "account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है", - "account.followers_counter": "{count, plural, one {{counter} अनुगामी} other {{counter} समर्थक}}", "account.following": "फॉलोइंग", - "account.following_counter": "{count, plural, one {{counter} निम्नलिखित} other {{counter} निम्नलिखित}}", "account.follows.empty": "यह यूज़र् अभी तक किसी को फॉलो नहीं करता है।", "account.go_to_profile": "प्रोफाइल में जाएँ", "account.hide_reblogs": "@{name} के बूस्ट छुपाएं", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} ने आपको फॉलो करने के लिए अनुरोध किया है", "account.share": "@{name} की प्रोफाइल शेयर करे", "account.show_reblogs": "@{name} के बूस्ट दिखाए", - "account.statuses_counter": "{count, plural, one {{counter} भोंपू} other {{counter} भोंपू}}", "account.unblock": "@{name} को अनब्लॉक करें", "account.unblock_domain": "{domain} दिखाए", "account.unblock_short": "अनब्लॉक", @@ -80,6 +77,7 @@ "admin.dashboard.retention.cohort_size": "नये उपयोगकर्ता", "admin.impact_report.instance_accounts": "ये अकाउंट प्रोफाइल मिटा देगा", "admin.impact_report.instance_followers": "हमारे यूजर्स इन फॉलोअर्स को खो देंगे", + "admin.impact_report.instance_follows": "उनके उपयोगकर्ता इतने फ़ॉलोअर खो देंगे", "admin.impact_report.title": "प्रभावकां सारांश", "alert.rate_limited.message": "कृप्या {retry_time, time, medium} के बाद दुबारा कोशिश करें", "alert.rate_limited.title": "सीमित दर", @@ -88,6 +86,7 @@ "announcement.announcement": "घोषणा", "attachments_list.unprocessed": "(असंसाधित)", "audio.hide": "हाईड ऑडियो", + "block_modal.remote_users_caveat": "हम {domain} को आपके निर्णय का सम्मान करने को कहेंगे।हालाकि इसकी आपूर्ति कि प्रत्याभूति नहीं हे। क्योंकि कुछ सर्वर ब्लॉक को अलग तरह से निभा सकते हे। अभी भी सार्वजानिक पोस्ट लोग- इन बगैर के उपयोगकर्ताओं को दिख सकती हैं।", "block_modal.show_less": "कम दिखाएं", "block_modal.show_more": "और दिखाएँ", "block_modal.they_cant_mention": "वे आपको मेंशन या फॉलो नहीं कर सकते", @@ -167,16 +166,12 @@ "compose_form.spoiler_placeholder": "सामग्री चेतावनी (वैकल्पिक)", "confirmation_modal.cancel": "रद्द करें", "confirmations.block.confirm": "ब्लॉक", - "confirmations.cancel_follow_request.confirm": "रिक्वेस्ट वापस लें", - "confirmations.cancel_follow_request.message": "क्या आप सुनिश्चित है की आप {name} का फॉलो रिक्वेस्ट वापिस लेना चाहते हैं?", "confirmations.delete.confirm": "मिटाए", "confirmations.delete.message": "क्या आप वाकई इस स्टेटस को हटाना चाहते हैं?", "confirmations.delete_list.confirm": "मिटाए", "confirmations.delete_list.message": "क्या आप वाकई इस लिस्ट को हमेशा के लिये मिटाना चाहते हैं?", "confirmations.discard_edit_media.confirm": "डिस्कार्ड", "confirmations.discard_edit_media.message": "लिस्ट में जोड़ें", - "confirmations.domain_block.confirm": "सर्वर ब्लॉक करें", - "confirmations.domain_block.message": "क्या आप वास्तव में, वास्तव में आप पूरे {domain} को ब्लॉक करना चाहते हैं? ज्यादातर मामलों में कुछ लक्षित ब्लॉक या म्यूट पर्याप्त और बेहतर हैं। आप किसी भी सार्वजनिक समय-सीमा या अपनी सूचनाओं में उस डोमेन की सामग्री नहीं देखेंगे। उस डोमेन से आपके फॉलोवर्स को हटा दिया जाएगा।", "confirmations.edit.confirm": "संशोधित करें", "confirmations.edit.message": "अभी संपादन किया तो वो संदेश मिट जायेगा जिसे आप लिख रहे थे। क्या आप जारी रखना चाहते हैं?", "confirmations.logout.confirm": "लॉग आउट करें", @@ -205,7 +200,12 @@ "dismissable_banner.dismiss": "डिसमिस", "dismissable_banner.explore_links": "इन समाचारों के बारे में लोगों द्वारा इस पर और डेसेंट्रलीसेड नेटवर्क के अन्य सर्वरों पर अभी बात की जा रही है।", "dismissable_banner.explore_tags": "ये हैशटैग अभी इस पर और डेसेंट्रलीसेड नेटवर्क के अन्य सर्वरों पर लोगों के बीच कर्षण प्राप्त कर रहे हैं।", + "dismissable_banner.public_timeline": "यह ताजा सार्वजनिक पोस्ट है जिसका सामाजिक वेब {domain} के लोगो द्वारा अनुसरण हो रहा हैं।", "domain_block_modal.block": "सर्वर ब्लॉक करें", + "domain_block_modal.block_account_instead": "इसकी जगह यह @{name} रखें", + "domain_block_modal.they_can_interact_with_old_posts": "इस सर्वर की लोग आपकी पूरानी पोस्ट्स का अनुसरण किया जा sakta है।", + "domain_block_modal.they_cant_follow": "इस सर्वर मेसे कोई भी आपका अनुसरण नहीं कर सकता।", + "domain_block_modal.they_wont_know": "उनको पता नहीं चलेगा कि वे अवरोधित किए गए है।", "domain_block_modal.title": "डोमेन ब्लॉक करें", "domain_pill.server": "सर्वर", "domain_pill.username": "यूज़रनेम", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index d952945c464..5598732465d 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -35,9 +35,7 @@ "account.follow_back": "Slijedi natrag", "account.followers": "Pratitelji", "account.followers.empty": "Nitko još ne prati korisnika/cu.", - "account.followers_counter": "{count, plural, one {{counter} pratitelj} other {{counter} pratitelja}}", "account.following": "Pratim", - "account.following_counter": "{count, plural, one {{counter} praćeni} few{{counter} praćena} other {{counter} praćenih}}", "account.follows.empty": "Korisnik/ca još ne prati nikoga.", "account.go_to_profile": "Idi na profil", "account.hide_reblogs": "Sakrij boostove od @{name}", @@ -62,7 +60,6 @@ "account.requested_follow": "{name} zatražio/la je praćenje", "account.share": "Podijeli profil @{name}", "account.show_reblogs": "Prikaži boostove od @{name}", - "account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toota}}", "account.unblock": "Deblokiraj @{name}", "account.unblock_domain": "Deblokiraj domenu {domain}", "account.unblock_short": "Deblokiraj", @@ -147,14 +144,12 @@ "compose_form.spoiler.unmarked": "Tekst nije skriven", "confirmation_modal.cancel": "Otkaži", "confirmations.block.confirm": "Blokiraj", - "confirmations.cancel_follow_request.confirm": "Povuci zahtjev", "confirmations.delete.confirm": "Obriši", "confirmations.delete.message": "Stvarno želite obrisati ovaj toot?", "confirmations.delete_list.confirm": "Obriši", "confirmations.delete_list.message": "Jeste li sigurni da želite trajno obrisati ovu listu?", "confirmations.discard_edit_media.confirm": "Odbaciti", "confirmations.discard_edit_media.message": "Postoje nespremljene promjene u opisu medija ili u pretpregledu, svejedno ih odbaciti?", - "confirmations.domain_block.message": "Jeste li zaista, zaista sigurni da želite blokirati cijelu domenu {domain}? U većini slučajeva dovoljno je i preferirano nekoliko ciljanih blokiranja ili utišavanja. Nećete vidjeti sadržaj s te domene ni u kojim javnim vremenskim crtama ili Vašim obavijestima. Vaši pratitelji s te domene bit će uklonjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.logout.confirm": "Odjavi se", "confirmations.logout.message": "Jeste li sigurni da se želite odjaviti?", @@ -345,7 +340,6 @@ "notification.follow_request": "{name} zatražio/la je da Vas prati", "notification.mention": "{name} Vas je spomenuo", "notification.own_poll": "Vaša anketa je završila", - "notification.poll": "Anketa u kojoj ste glasali je završila", "notification.reblog": "{name} je boostao/la Vaš status", "notifications.clear": "Očisti obavijesti", "notifications.clear_confirmation": "Želite li zaista trajno očistiti sve Vaše obavijesti?", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 6164335da82..4acff61740c 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -35,9 +35,9 @@ "account.follow_back": "Viszontkövetés", "account.followers": "Követő", "account.followers.empty": "Ezt a felhasználót még senki sem követi.", - "account.followers_counter": "{count, plural, one {{counter} Követő} other {{counter} Követő}}", + "account.followers_counter": "{count, plural, one {{counter} követő} other {{counter} követő}}", "account.following": "Követve", - "account.following_counter": "{count, plural, one {{counter} Követett} other {{counter} Követett}}", + "account.following_counter": "{count, plural, one {{counter} követett} other {{counter} követett}}", "account.follows.empty": "Ez a felhasználó még senkit sem követ.", "account.go_to_profile": "Ugrás a profilhoz", "account.hide_reblogs": "@{name} megtolásainak elrejtése", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} kérte, hogy követhessen", "account.share": "@{name} profiljának megosztása", "account.show_reblogs": "@{name} megtolásainak mutatása", - "account.statuses_counter": "{count, plural, one {{counter} Bejegyzés} other {{counter} Bejegyzés}}", + "account.statuses_counter": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}", "account.unblock": "@{name} letiltásának feloldása", "account.unblock_domain": "{domain} domain tiltásának feloldása", "account.unblock_short": "Tiltás feloldása", @@ -160,7 +160,7 @@ "compose_form.poll.switch_to_multiple": "Szavazás megváltoztatása több választásosra", "compose_form.poll.switch_to_single": "Szavazás megváltoztatása egyetlen választásosra", "compose_form.poll.type": "Stílus", - "compose_form.publish": "Bejegyzés", + "compose_form.publish": "Közzététel", "compose_form.publish_form": "Új bejegyzés", "compose_form.reply": "Válasz", "compose_form.save_changes": "Frissítés", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Tartalmi figyelmeztetés (opcionális)", "confirmation_modal.cancel": "Mégsem", "confirmations.block.confirm": "Letiltás", - "confirmations.cancel_follow_request.confirm": "Kérés visszavonása", - "confirmations.cancel_follow_request.message": "Biztos, hogy visszavonod a(z) {name} felhasználóra vonatkozó követési kérésedet?", "confirmations.delete.confirm": "Törlés", "confirmations.delete.message": "Biztos, hogy törölni szeretnéd ezt a bejegyzést?", + "confirmations.delete.title": "Törlöd a bejegyzést?", "confirmations.delete_list.confirm": "Törlés", "confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?", + "confirmations.delete_list.title": "Törlöd a listát?", "confirmations.discard_edit_media.confirm": "Elvetés", "confirmations.discard_edit_media.message": "Mentetlen változtatásaid vannak a média leírásában vagy előnézetében, mindenképp elveted?", - "confirmations.domain_block.confirm": "Kiszolgáló letiltása", - "confirmations.domain_block.message": "Biztos, hogy le szeretnéd tiltani a teljes {domain} domaint? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő, és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se az idővonalakon, se az értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.", "confirmations.edit.confirm": "Szerkesztés", "confirmations.edit.message": "Ha most szerkeszted, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?", + "confirmations.edit.title": "Felülírod a bejegyzést?", "confirmations.logout.confirm": "Kijelentkezés", "confirmations.logout.message": "Biztos, hogy kijelentkezel?", + "confirmations.logout.title": "Kijelentkezel?", "confirmations.mute.confirm": "Némítás", "confirmations.redraft.confirm": "Törlés és újraírás", "confirmations.redraft.message": "Biztos, hogy ezt a bejegyzést szeretnéd törölni és újraírni? Minden megtolást és kedvencnek jelölést elvesztesz, az eredetire adott válaszok pedig elárvulnak.", + "confirmations.redraft.title": "Törlöd és újraírod a bejegyzést?", "confirmations.reply.confirm": "Válasz", "confirmations.reply.message": "Ha most válaszolsz, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?", + "confirmations.reply.title": "Felülírod a bejegyzést?", "confirmations.unfollow.confirm": "Követés visszavonása", "confirmations.unfollow.message": "Biztos, hogy vissza szeretnéd vonni {name} követését?", + "confirmations.unfollow.title": "Megszünteted a felhasználó követését?", "conversation.delete": "Beszélgetés törlése", "conversation.mark_as_read": "Megjelölés olvasottként", "conversation.open": "Beszélgetés megtekintése", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat", "filter_modal.select_filter.title": "E bejegyzés szűrése", "filter_modal.title.status": "Egy bejegyzés szűrése", - "filtered_notifications_banner.mentions": "{count, plural, one {említés} other {említés}}", - "filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {nincsenek} one {egy valósztínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {senkitől} one {egy valószínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}", "filtered_notifications_banner.title": "Szűrt értesítések", "firehose.all": "Összes", "firehose.local": "Ez a kiszolgáló", @@ -443,6 +445,8 @@ "mute_modal.title": "Elnémítsuk a felhasználót?", "mute_modal.you_wont_see_mentions": "Nem látsz majd őt említő bejegyzéseket.", "mute_modal.you_wont_see_posts": "Továbbra is látni fogja a bejegyzéseidet, de te nem fogod látni az övéit.", + "name_and_others": "{name} és {count, plural, one {# másik} other {# másik}}", + "name_and_others_with_link": "{name} és {count, plural, one {# másik} other {# másik}}", "navigation_bar.about": "Névjegy", "navigation_bar.advanced_interface": "Megnyitás a speciális webes felületben", "navigation_bar.blocks": "Letiltott felhasználók", @@ -470,6 +474,10 @@ "navigation_bar.security": "Biztonság", "not_signed_in_indicator.not_signed_in": "Az erőforrás eléréséhez be kell jelentkezned.", "notification.admin.report": "{name} jelentette: {target}", + "notification.admin.report_account": "{name} jelentett {count, plural, one {egy bejegyzést} other {# bejegyzést}} itt: {target}, ezért: {category}", + "notification.admin.report_account_other": "{name} jelentett {count, plural, one {egy bejegyzést} other {# bejegyzést}} itt: {target}", + "notification.admin.report_statuses": "{name} jelentette: {target}, ezért: {category}", + "notification.admin.report_statuses_other": "{name} jelentette: {target}", "notification.admin.sign_up": "{name} regisztrált", "notification.favourite": "{name} kedvencnek jelölte a bejegyzésedet", "notification.follow": "{name} követ téged", @@ -485,7 +493,8 @@ "notification.moderation_warning.action_silence": "A fiókod korlátozásra került.", "notification.moderation_warning.action_suspend": "A fiókod felfüggesztésre került.", "notification.own_poll": "A szavazásod véget ért", - "notification.poll": "Egy szavazás, melyben részt vettél, véget ért", + "notification.poll": "Véget ért egy szavazás, melyben részt vettél", + "notification.private_mention": "{name} privátban megemlített", "notification.reblog": "{name} megtolta a bejegyzésedet", "notification.relationships_severance_event": "Elvesztek a kapcsolatok vele: {name}", "notification.relationships_severance_event.account_suspension": "Egy admin a(z) {from} kiszolgálóról felfüggesztette {target} fiókját, ami azt jelenti, hogy mostantól nem fogsz róla értesítést kapni, és nem fogsz tudni vele kapcsolatba lépni.", @@ -496,13 +505,18 @@ "notification.update": "{name} szerkesztett egy bejegyzést", "notification_requests.accept": "Elfogadás", "notification_requests.dismiss": "Elvetés", + "notification_requests.maximize": "Maximalizálás", + "notification_requests.minimize_banner": "Szűrt értesítések sávjának minimalizálása", "notification_requests.notifications_from": "{name} értesítései", "notification_requests.title": "Szűrt értesítések", "notifications.clear": "Értesítések törlése", "notifications.clear_confirmation": "Biztos, hogy véglegesen törölni akarod az összes értesítésed?", + "notifications.clear_title": "Törlöd az értesítéseket?", "notifications.column_settings.admin.report": "Új jelentések:", "notifications.column_settings.admin.sign_up": "Új regisztrálók:", "notifications.column_settings.alert": "Asztali értesítések", + "notifications.column_settings.beta.category": "Kísérleti funkciók", + "notifications.column_settings.beta.grouping": "Csoportértesítések", "notifications.column_settings.favourite": "Kedvencek:", "notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése", "notifications.column_settings.filter_bar.category": "Gyorsszűrő sáv", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Követed ezt a fiókot. Hogy ne lásd a bejegyzéseit a saját idővonaladon, szüntesd meg a követését.", "report_notification.attached_statuses": "{count} bejegyzés mellékelve", "report_notification.categories.legal": "Jogi", + "report_notification.categories.legal_sentence": "illegális tartalom", "report_notification.categories.other": "Egyéb", + "report_notification.categories.other_sentence": "egyéb", "report_notification.categories.spam": "Kéretlen üzenet", + "report_notification.categories.spam_sentence": "kéretlen üzenet", "report_notification.categories.violation": "Szabálysértés", + "report_notification.categories.violation_sentence": "szabálysértés", "report_notification.open": "Bejelentés megnyitása", "search.no_recent_searches": "Nincsenek keresési előzmények", "search.placeholder": "Keresés", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index cd29f441df7..e9b9e85ff9e 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -28,9 +28,7 @@ "account.follow": "Հետեւել", "account.followers": "Հետեւողներ", "account.followers.empty": "Այս օգտատիրոջը դեռ ոչ մէկ չի հետեւում։", - "account.followers_counter": "{count, plural, one {{counter} Հետեւորդ} other {{counter} Հետեւորդ}}", "account.following": "Հետեւած", - "account.following_counter": "{count, plural, one {{counter} Հետեւած} other {{counter} Հետեւած}}", "account.follows.empty": "Այս օգտատէրը դեռ ոչ մէկի չի հետեւում։", "account.go_to_profile": "Գնալ անձնական հաշիւ", "account.hide_reblogs": "Թաքցնել @{name}֊ի տարածածները", @@ -52,7 +50,6 @@ "account.requested_follow": "{name}-ը ցանկանում է հետեւել քեզ", "account.share": "Կիսուել @{name}֊ի էջով", "account.show_reblogs": "Ցուցադրել @{name}֊ի տարածածները", - "account.statuses_counter": "{count, plural, one {{counter} Գրառում} other {{counter} Գրառումներ}}", "account.unblock": "Ապաարգելափակել @{name}֊ին", "account.unblock_domain": "Ցուցադրել {domain} թաքցուած տիրոյթի գրառումները", "account.unblock_short": "Արգելաբացել", @@ -124,13 +121,11 @@ "compose_form.spoiler.unmarked": "Տեքստը թաքցուած չէ", "confirmation_modal.cancel": "Չեղարկել", "confirmations.block.confirm": "Արգելափակել", - "confirmations.cancel_follow_request.confirm": "Կասեցնել հայցը", "confirmations.delete.confirm": "Ջնջել", "confirmations.delete.message": "Վստա՞հ ես, որ ուզում ես ջնջել այս գրառումը։", "confirmations.delete_list.confirm": "Ջնջել", "confirmations.delete_list.message": "Վստա՞հ ես, որ ուզում ես մշտապէս ջնջել այս ցանկը։", "confirmations.discard_edit_media.confirm": "Չեղարկել", - "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրոյթը։ Սովորաբար մի երկու թիրախաւորուած արգելափակում կամ լռեցում բաւական է ու նախընտրելի։", "confirmations.edit.confirm": "Խմբագրել", "confirmations.logout.confirm": "Ելք", "confirmations.logout.message": "Համոզո՞ւած ես, որ ուզում ես դուրս գալ", @@ -327,7 +322,6 @@ "notification.follow_request": "{name} քեզ հետեւելու հայց է ուղարկել", "notification.mention": "{name} նշեց քեզ", "notification.own_poll": "Հարցումդ աւարտուեց", - "notification.poll": "Հարցումը, ուր դու քուէարկել ես, աւարտուեց։", "notification.reblog": "{name} տարածեց գրառումդ", "notification.status": "{name} հենց նոր գրառում արեց", "notification.update": "{name}-ը փոխել է գրառումը", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 72bbe606fa6..60838c3a5dd 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -169,27 +169,28 @@ "compose_form.spoiler_placeholder": "Advertimento de contento (optional)", "confirmation_modal.cancel": "Cancellar", "confirmations.block.confirm": "Blocar", - "confirmations.cancel_follow_request.confirm": "Retirar requesta", - "confirmations.cancel_follow_request.message": "Es tu secur que tu vole retirar tu requesta de sequer {name}?", "confirmations.delete.confirm": "Deler", "confirmations.delete.message": "Es tu secur que tu vole deler iste message?", + "confirmations.delete.title": "Deler message?", "confirmations.delete_list.confirm": "Deler", "confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?", + "confirmations.delete_list.title": "Deler lista?", "confirmations.discard_edit_media.confirm": "Abandonar", "confirmations.discard_edit_media.message": "Tu ha cambiamentos non salvate in le description o previsualisation del objecto multimedial. Abandonar los?", - "confirmations.domain_block.confirm": "Blocar le servitor", - "confirmations.domain_block.message": "Es tu realmente, absolutemente secur de voler blocar tote le dominio {domain}? In le major parte del casos es preferibile blocar o silentiar alcun personas specific. Si tu bloca tote le dominio, tu non videra alcun contento de ille dominio in alcun chronologia public o in tu notificationes, e tu sequitores de ille dominio essera removite.", "confirmations.edit.confirm": "Modificar", "confirmations.edit.message": "Si tu modifica isto ora, le message in curso de composition essera perdite. Es tu secur de voler continuar?", "confirmations.logout.confirm": "Clauder session", "confirmations.logout.message": "Es tu secur que tu vole clauder le session?", + "confirmations.logout.title": "Clauder session?", "confirmations.mute.confirm": "Silentiar", "confirmations.redraft.confirm": "Deler e rescriber", "confirmations.redraft.message": "Es tu secur de voler deler iste message e rescriber lo? Le favorites e le impulsos essera perdite, e le responsas al message original essera orphanate.", + "confirmations.redraft.title": "Deler e rescriber le message?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Si tu responde ora, le message in curso de composition essera perdite. Es tu secur de voler continuar?", "confirmations.unfollow.confirm": "Non plus sequer", "confirmations.unfollow.message": "Es tu secur que tu vole cessar de sequer {name}?", + "confirmations.unfollow.title": "Cessar de sequer le usator?", "conversation.delete": "Deler conversation", "conversation.mark_as_read": "Marcar como legite", "conversation.open": "Vider conversation", @@ -297,8 +298,6 @@ "filter_modal.select_filter.subtitle": "Usa un categoria existente o crea un nove", "filter_modal.select_filter.title": "Filtrar iste message", "filter_modal.title.status": "Filtrar un message", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentiones}}", - "filtered_notifications_banner.pending_requests": "Notificationes ab {count, plural, =0 {nemo} one {un persona} other {# personas}} tu poterea cognoscer", "filtered_notifications_banner.title": "Notificationes filtrate", "firehose.all": "Toto", "firehose.local": "Iste servitor", @@ -354,7 +353,7 @@ "home.pending_critical_update.link": "Vider actualisationes", "home.pending_critical_update.title": "Actualisation de securitate critic disponibile!", "home.show_announcements": "Monstrar annuncios", - "interaction_modal.description.favourite": "Con un conto sur Mastodon, tu pote marcar iste message como favorite pro informar le autor que tu lo apprecia e salveguarda pro plus tarde.", + "interaction_modal.description.favourite": "Con un conto sur Mastodon, tu pote marcar iste message como favorite pro informar le autor que tu lo apprecia e lo salva pro plus tarde.", "interaction_modal.description.follow": "Con un conto sur Mastodon, tu pote sequer {name} e reciper su messages in tu fluxo de initio.", "interaction_modal.description.reblog": "Con un conto sur Mastodon, tu pote impulsar iste message pro condivider lo con tu proprie sequitores.", "interaction_modal.description.reply": "Con un conto sur Mastodon, tu pote responder a iste message.", @@ -443,6 +442,8 @@ "mute_modal.title": "Silentiar le usator?", "mute_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.", "mute_modal.you_wont_see_posts": "Iste persona pote totevia vider tu messages, ma tu non videra le sues.", + "name_and_others": "{name} e {count, plural, one {# altere} other {# alteres}}", + "name_and_others_with_link": "{name} e {count, plural, one {# altere} other {# alteres}}", "navigation_bar.about": "A proposito", "navigation_bar.advanced_interface": "Aperir in le interfacie web avantiate", "navigation_bar.blocks": "Usatores blocate", @@ -485,7 +486,6 @@ "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", "notification.relationships_severance_event": "Connexiones perdite con {name}", "notification.relationships_severance_event.account_suspension": "Un administrator de {from} ha suspendiute {target}. Isto significa que tu non pote plus reciper actualisationes de iste persona o interager con ille.", @@ -500,9 +500,12 @@ "notification_requests.title": "Notificationes filtrate", "notifications.clear": "Rader notificationes", "notifications.clear_confirmation": "Es tu secur que tu vole rader permanentemente tote tu notificationes?", + "notifications.clear_title": "Rader le notificationes?", "notifications.column_settings.admin.report": "Nove reportos:", "notifications.column_settings.admin.sign_up": "Nove inscriptiones:", "notifications.column_settings.alert": "Notificationes de scriptorio", + "notifications.column_settings.beta.category": "Functionalitates experimental", + "notifications.column_settings.beta.grouping": "Notificationes de gruppo", "notifications.column_settings.favourite": "Favorites:", "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias", "notifications.column_settings.filter_bar.category": "Barra de filtro rapide", @@ -696,8 +699,11 @@ "server_banner.about_active_users": "Personas que ha usate iste servitor in le ultime 30 dies (usatores active per mense)", "server_banner.active_users": "usatores active", "server_banner.administered_by": "Administrate per:", + "server_banner.is_one_of_many": "{domain} es un de multe servitores independente de Mastodon que tu pote usar pro participar in le fediverso.", "server_banner.server_stats": "Statos del servitor:", "sign_in_banner.create_account": "Crear un conto", + "sign_in_banner.follow_anyone": "Seque quicunque in le fediverso, e tu videra toto in ordine chronologic. Sin algorithmo, sin publicitate, sin titulos de esca.", + "sign_in_banner.mastodon_is": "Mastodon es le melior maniera de sequer lo que passa.", "sign_in_banner.sign_in": "Aperir session", "sign_in_banner.sso_redirect": "Aperir session o crear conto", "status.admin_account": "Aperir le interfacie de moderation pro @{name}", @@ -761,7 +767,7 @@ "status.unmute_conversation": "Non plus silentiar conversation", "status.unpin": "Disfixar del profilo", "subscribed_languages.lead": "Solmente le messages in le linguas seligite apparera in tu chronologias de initio e de listas post le cambiamento. Selige necun pro reciper messages in tote le linguas.", - "subscribed_languages.save": "Salveguardar le cambiamentos", + "subscribed_languages.save": "Salvar le cambiamentos", "subscribed_languages.target": "Cambiar le linguas subscribite pro {target}", "tabs_bar.home": "Initio", "tabs_bar.notifications": "Notificationes", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index d86b5854f4d..e740fb009cf 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -35,9 +35,7 @@ "account.follow_back": "Ikuti balik", "account.followers": "Pengikut", "account.followers.empty": "Pengguna ini belum ada pengikut.", - "account.followers_counter": "{count, plural, other {{counter} Pengikut}}", "account.following": "Mengikuti", - "account.following_counter": "{count, plural, other {{counter} Mengikuti}}", "account.follows.empty": "Pengguna ini belum mengikuti siapa pun.", "account.go_to_profile": "Buka profil", "account.hide_reblogs": "Sembunyikan boosts dari @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} ingin mengikuti Anda", "account.share": "Bagikan profil @{name}", "account.show_reblogs": "Tampilkan boost dari @{name}", - "account.statuses_counter": "{count, plural, other {{counter} Kiriman}}", "account.unblock": "Buka blokir @{name}", "account.unblock_domain": "Buka blokir domain {domain}", "account.unblock_short": "Buka blokir", @@ -169,16 +166,12 @@ "compose_form.spoiler_placeholder": "Peringatan konten (opsional)", "confirmation_modal.cancel": "Batal", "confirmations.block.confirm": "Blokir", - "confirmations.cancel_follow_request.confirm": "Batalkan permintaan", - "confirmations.cancel_follow_request.message": "Apakah Anda yakin ingin membatalkan permintaan Anda untuk mengikuti {name}?", "confirmations.delete.confirm": "Hapus", "confirmations.delete.message": "Apakah Anda yakin untuk menghapus kiriman ini?", "confirmations.delete_list.confirm": "Hapus", "confirmations.delete_list.message": "Apakah Anda yakin untuk menghapus daftar ini secara permanen?", "confirmations.discard_edit_media.confirm": "Buang", "confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan deskripsi atau pratinjau media, buang saja?", - "confirmations.domain_block.confirm": "Blokir server", - "confirmations.domain_block.message": "Apakah Anda benar-benar yakin untuk memblokir keseluruhan {domain}? Dalam kasus tertentu beberapa pemblokiran atau penyembunyian lebih baik.", "confirmations.edit.confirm": "Ubah", "confirmations.edit.message": "Mengubah akan menimpa pesan yang sedang anda tulis. Apakah anda yakin ingin melanjutkan?", "confirmations.logout.confirm": "Keluar", @@ -429,7 +422,6 @@ "notification.follow_request": "{name} ingin mengikuti Anda", "notification.mention": "{name} menyebut Anda", "notification.own_poll": "Japat Anda telah berakhir", - "notification.poll": "Japat yang Anda ikuti telah berakhir", "notification.reblog": "{name} mem-boost kiriman Anda", "notification.status": "{name} baru saja mengirim", "notification.update": "{name} mengedit kiriman", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index f15b9828892..27519b4776b 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -35,9 +35,7 @@ "account.follow_back": "Sequer reciprocmen", "account.followers": "Sequitores", "account.followers.empty": "Ancor nequi seque ti-ci usator.", - "account.followers_counter": "{count, plural, one {{counter} Sequitor} other {{counter} Sequitor}}", "account.following": "Sequent", - "account.following_counter": "{count, plural, one {{counter} Sequent} other {{counter} Sequent}}", "account.follows.empty": "Ti-ci usator ancor ne seque quemcunc.", "account.go_to_profile": "Ear a profil", "account.hide_reblogs": "Celar boosts de @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} ha petit sequer te", "account.share": "Distribuer li profil de @{name}", "account.show_reblogs": "Monstrar boosts de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Posta} other {{counter} Postas}}", "account.unblock": "Desbloccar @{name}", "account.unblock_domain": "Desbloccar dominia {domain}", "account.unblock_short": "Desbloccar", @@ -169,16 +166,12 @@ "compose_form.spoiler_placeholder": "Advertiment de contenete (optional)", "confirmation_modal.cancel": "Anullar", "confirmations.block.confirm": "Bloccar", - "confirmations.cancel_follow_request.confirm": "Retraer petition", - "confirmations.cancel_follow_request.message": "Esque tu vermen vole retraer tui petition sequer {name}?", "confirmations.delete.confirm": "Deleter", "confirmations.delete.message": "Esque tu vermen vole deleter ti-ci posta?", "confirmations.delete_list.confirm": "Deleter", "confirmations.delete_list.message": "Esque tu vermen vole permanentmen deleter ti-ci liste?", "confirmations.discard_edit_media.confirm": "Forjettar", "confirmations.discard_edit_media.message": "Tu have ínconservat changes al descrition de medie o al previse, forjettar les sin egarda?", - "confirmations.domain_block.confirm": "Bloccar servitor", - "confirmations.domain_block.message": "Esque tu es certissim que tu vole bloccar li tot {domain}? In mult casus, bloccar o silentiar quelc specific contos es suficent e preferibil. Tu ne va vider contenete de ti dominia in quelcunc public témpor-linea o in tui notificationes. Tui sequitores de ti dominia va esser removet.", "confirmations.edit.confirm": "Redacter", "confirmations.edit.message": "Redacter nu va remplazzar li missage quel tu actualmen composi. Esque tu vermen vole proceder?", "confirmations.logout.confirm": "Exear", @@ -297,8 +290,6 @@ "filter_modal.select_filter.subtitle": "Usar un existent categorie o crear nov", "filter_modal.select_filter.title": "Filtrar ti-ci posta", "filter_modal.title.status": "Filtrar un posta", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentiones}}", - "filtered_notifications_banner.pending_requests": "Notificationes de {count, plural, =0 {nequi} one {un person} other {# persones}} quel tu possibilmen conosse", "filtered_notifications_banner.title": "Filtrat notificationes", "firehose.all": "Omno", "firehose.local": "Ti-ci servitor", @@ -483,7 +474,6 @@ "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.", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 016a111c46c..6ff957bc800 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -33,9 +33,7 @@ "account.follow": "Sequar", "account.followers": "Sequanti", "account.followers.empty": "Nulu sequas ca uzanto til nun.", - "account.followers_counter": "{count, plural, one {{counter} Sequanto} other {{counter} Sequanti}}", "account.following": "Sequata", - "account.following_counter": "{count, plural, one {{counter} Sequas} other {{counter} Sequanti}}", "account.follows.empty": "Ca uzanto ne sequa irgu til nun.", "account.go_to_profile": "Irez al profilo", "account.hide_reblogs": "Celez repeti de @{name}", @@ -60,7 +58,6 @@ "account.requested_follow": "{name} demandis sequar tu", "account.share": "Partigez profilo di @{name}", "account.show_reblogs": "Montrez repeti de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Posto} other {{counter} Posti}}", "account.unblock": "Desblokusar @{name}", "account.unblock_domain": "Desblokusar {domain}", "account.unblock_short": "Desblokusar", @@ -150,15 +147,12 @@ "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "Anulez", "confirmations.block.confirm": "Restriktez", - "confirmations.cancel_follow_request.confirm": "Desendez demando", - "confirmations.cancel_follow_request.message": "Ka vu certe volas desendar vua demando di sequar {name}?", "confirmations.delete.confirm": "Efacez", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "Efacez", "confirmations.delete_list.message": "Ka vu certe volas netempale efacar ca listo?", "confirmations.discard_edit_media.confirm": "Efacez", "confirmations.discard_edit_media.message": "Vu havas nesparita chanji di mediodeskript o prevido, vu volas jus efacar?", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", "confirmations.edit.confirm": "Modifikez", "confirmations.edit.message": "Modifikar nun remplasos la mesajo quon vu nune skribas. Ka vu certe volas procedar?", "confirmations.logout.confirm": "Ekirez", @@ -405,7 +399,6 @@ "notification.follow_request": "{name} demandas sequar vu", "notification.mention": "{name} mencionis tu", "notification.own_poll": "Vua votposto finigis", - "notification.poll": "Votposto quo havas vua voto finigis", "notification.reblog": "{name} repetis tua mesajo", "notification.status": "{name} nove postigis", "notification.update": "{name} modifikis posto", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 08605f5238d..a38e56714ac 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -63,7 +63,7 @@ "account.requested_follow": "{name} hefur beðið um að fylgjast með þér", "account.share": "Deila notandasniði fyrir @{name}", "account.show_reblogs": "Sýna endurbirtingar frá @{name}", - "account.statuses_counter": "{count, plural, one {Færsla: {counter}} other {Færslur: {counter}}}", + "account.statuses_counter": "{count, plural, one {{counter} færsla} other {{counter} færslur}}", "account.unblock": "Aflétta útilokun af @{name}", "account.unblock_domain": "Aflétta útilokun lénsins {domain}", "account.unblock_short": "Hætta að loka á", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Aðvörun vegna efnis (valkvætt)", "confirmation_modal.cancel": "Hætta við", "confirmations.block.confirm": "Útiloka", - "confirmations.cancel_follow_request.confirm": "Taka beiðni til baka", - "confirmations.cancel_follow_request.message": "Ertu viss um að þú viljir taka til baka beiðnina um að fylgjast með {name}?", "confirmations.delete.confirm": "Eyða", "confirmations.delete.message": "Ertu viss um að þú viljir eyða þessari færslu?", + "confirmations.delete.title": "Eyða færslu?", "confirmations.delete_list.confirm": "Eyða", "confirmations.delete_list.message": "Ertu viss um að þú viljir eyða þessum lista endanlega?", + "confirmations.delete_list.title": "Eyða lista?", "confirmations.discard_edit_media.confirm": "Henda", "confirmations.discard_edit_media.message": "Þú ert með óvistaðar breytingar á lýsingu myndefnis eða forskoðunar, henda þeim samt?", - "confirmations.domain_block.confirm": "Útiloka netþjón", - "confirmations.domain_block.message": "Ertu alveg algjörlega viss um að þú viljir loka á allt {domain}? Í flestum tilfellum er vænlegra að nota færri en markvissari útilokanir eða að þagga niður tiltekna aðila. Þú munt ekki sjá efni frá þessu léni í neinum opinberum tímalínum eða í tilkynningunum þínum. Fylgjendur þínir frá þessu léni verða fjarlægðir.", "confirmations.edit.confirm": "Breyta", "confirmations.edit.message": "Ef þú breytir núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?", + "confirmations.edit.title": "Skrifa yfir færslu?", "confirmations.logout.confirm": "Skrá út", "confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?", + "confirmations.logout.title": "Skrá út?", "confirmations.mute.confirm": "Þagga", "confirmations.redraft.confirm": "Eyða og endurvinna drög", "confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.", + "confirmations.redraft.title": "Eyða og byrja ný drög að færslu?", "confirmations.reply.confirm": "Svara", "confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?", + "confirmations.reply.title": "Skrifa yfir færslu?", "confirmations.unfollow.confirm": "Hætta að fylgja", "confirmations.unfollow.message": "Ertu viss um að þú viljir hætta að fylgjast með {name}?", + "confirmations.unfollow.title": "Hætta að fylgjast með viðkomandi?", "conversation.delete": "Eyða samtali", "conversation.mark_as_read": "Merkja sem lesið", "conversation.open": "Skoða samtal", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Notaðu fyrirliggjandi flokk eða útbúðu nýjan", "filter_modal.select_filter.title": "Sía þessa færslu", "filter_modal.title.status": "Sía færslu", - "filtered_notifications_banner.mentions": "{count, plural, one {tilvísun} other {tilvísanir}}", - "filtered_notifications_banner.pending_requests": "Tilkynningar frá {count, plural, =0 {engum} one {einum aðila} other {# aðilum}} sem þú gætir þekkt", + "filtered_notifications_banner.pending_requests": "Frá {count, plural, =0 {engum} one {einum aðila} other {# manns}} sem þú gætir þekkt", "filtered_notifications_banner.title": "Síaðar tilkynningar", "firehose.all": "Allt", "firehose.local": "þessum netþjóni", @@ -443,6 +445,8 @@ "mute_modal.title": "Þagga niður í notanda?", "mute_modal.you_wont_see_mentions": "Þú munt ekki sjá færslur sem minnast á viðkomandi aðila.", "mute_modal.you_wont_see_posts": "Viðkomandi geta áfram séð færslurnar þínar en þú munt ekki sjá færslurnar þeirra.", + "name_and_others": "{name} og {count, plural, one {# annar} other {# aðrir}}", + "name_and_others_with_link": "{name} og {count, plural, one {# annar} other {# aðrir}}", "navigation_bar.about": "Um hugbúnaðinn", "navigation_bar.advanced_interface": "Opna í ítarlegu vefviðmóti", "navigation_bar.blocks": "Útilokaðir notendur", @@ -470,6 +474,10 @@ "navigation_bar.security": "Öryggi", "not_signed_in_indicator.not_signed_in": "Þú þarft að skrá þig inn til að nota þetta tilfang.", "notification.admin.report": "{name} kærði {target}", + "notification.admin.report_account": "{name} kærði {count, plural, one {eina færslu} other {# færslur}} frá {target} fyrir {category}", + "notification.admin.report_account_other": "{name} kærði {count, plural, one {eina færslu} other {# færslur}} frá {target}", + "notification.admin.report_statuses": "{name} kærði {target} fyrir {category}", + "notification.admin.report_statuses_other": "{name} kærði {target}", "notification.admin.sign_up": "{name} skráði sig", "notification.favourite": "{name} setti færsluna þína í eftirlæti", "notification.follow": "{name} fylgist með þér", @@ -485,7 +493,8 @@ "notification.moderation_warning.action_silence": "Notandaaðgangurinn þinn hefur verið takmarkaður.", "notification.moderation_warning.action_suspend": "Notandaaðgangurinn þinn hefur verið settur í frysti.", "notification.own_poll": "Könnuninni þinni er lokið", - "notification.poll": "Könnun sem þú tókst þátt í er lokið", + "notification.poll": "Könnun sem þú greiddir atkvæði í er lokið", + "notification.private_mention": "{name} minntist á þig í einrúmi", "notification.reblog": "{name} endurbirti færsluna þína", "notification.relationships_severance_event": "Missti tengingar við {name}", "notification.relationships_severance_event.account_suspension": "Stjórnandi á {from} hefur fryst {target}, sem þýðir að þú færð ekki lengur skilaboð frá viðkomandi né átt í samskiptum við viðkomandi.", @@ -496,13 +505,18 @@ "notification.update": "{name} breytti færslu", "notification_requests.accept": "Samþykkja", "notification_requests.dismiss": "Afgreiða", + "notification_requests.maximize": "Hámarka", + "notification_requests.minimize_banner": "Minnka borða með síuðum tilkynningum", "notification_requests.notifications_from": "Tilkynningar frá {name}", "notification_requests.title": "Síaðar tilkynningar", "notifications.clear": "Hreinsa tilkynningar", "notifications.clear_confirmation": "Ertu viss um að þú viljir endanlega eyða öllum tilkynningunum þínum?", + "notifications.clear_title": "Hreinsa tilkynningar?", "notifications.column_settings.admin.report": "Nýjar kærur:", "notifications.column_settings.admin.sign_up": "Nýjar skráningar:", "notifications.column_settings.alert": "Tilkynningar á skjáborði", + "notifications.column_settings.beta.category": "Eiginleikar á tilraunastigi", + "notifications.column_settings.beta.grouping": "Tilkynningar hópa", "notifications.column_settings.favourite": "Eftirlæti:", "notifications.column_settings.filter_bar.advanced": "Birta alla flokka", "notifications.column_settings.filter_bar.category": "Skyndisíustika", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Þú ert að fylgjast með þessum aðgangi. Til að hætta að sjá viðkomandi færslur á streyminu þínu, skaltu hætta að fylgjast með viðkomandi.", "report_notification.attached_statuses": "{count, plural, one {{count} færsla} other {{count} færslur}} viðhengdar", "report_notification.categories.legal": "Löglegt", + "report_notification.categories.legal_sentence": "ólöglegt efni", "report_notification.categories.other": "Annað", + "report_notification.categories.other_sentence": "annað", "report_notification.categories.spam": "Ruslpóstur", + "report_notification.categories.spam_sentence": "ruslpóstur", "report_notification.categories.violation": "Brot á reglum", + "report_notification.categories.violation_sentence": "brot á reglum", "report_notification.open": "Opin kæra", "search.no_recent_searches": "Engar nýlegar leitir", "search.placeholder": "Leita", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 3672b5fd7a1..b317e9e64cb 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -35,9 +35,9 @@ "account.follow_back": "Segui a tua volta", "account.followers": "Follower", "account.followers.empty": "Ancora nessuno segue questo utente.", - "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}", + "account.followers_counter": "{count, plural, one {{counter} seguace} other {{counter} seguaci}}", "account.following": "Seguiti", - "account.following_counter": "{count, plural, one {{counter} Seguiti} other {{counter} Seguiti}}", + "account.following_counter": "{count, plural, one {{counter} segui} other {{counter} segui}}", "account.follows.empty": "Questo utente non segue ancora nessuno.", "account.go_to_profile": "Vai al profilo", "account.hide_reblogs": "Nascondi potenziamenti da @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} ha richiesto di seguirti", "account.share": "Condividi il profilo di @{name}", "account.show_reblogs": "Mostra potenziamenti da @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Post}}", + "account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} post}}", "account.unblock": "Sblocca @{name}", "account.unblock_domain": "Sblocca il dominio {domain}", "account.unblock_short": "Sblocca", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Contenuto sensibile (facoltativo)", "confirmation_modal.cancel": "Annulla", "confirmations.block.confirm": "Blocca", - "confirmations.cancel_follow_request.confirm": "Annulla la richiesta", - "confirmations.cancel_follow_request.message": "Sei sicuro di voler annullare la tua richiesta per seguire {name}?", "confirmations.delete.confirm": "Elimina", "confirmations.delete.message": "Sei sicuro di voler eliminare questo post?", + "confirmations.delete.title": "Eliminare il post?", "confirmations.delete_list.confirm": "Elimina", "confirmations.delete_list.message": "Sei sicuro/a di voler eliminare permanentemente questo elenco?", + "confirmations.delete_list.title": "Eliminare la lista?", "confirmations.discard_edit_media.confirm": "Scarta", "confirmations.discard_edit_media.message": "Hai delle modifiche non salvate alla descrizione o anteprima del media, scartarle comunque?", - "confirmations.domain_block.confirm": "Blocca il server", - "confirmations.domain_block.message": "Sei davvero sicuro di voler bloccare l'intero {domain}? In gran parte dei casi, è sufficiente e preferibile bloccare o silenziare alcuni profili. Non visualizzerai i contenuti da quel dominio in alcuna cronologia pubblica o tra le tue notifiche. I tuoi seguaci da quel dominio saranno rimossi.", "confirmations.edit.confirm": "Modifica", "confirmations.edit.message": "Modificare ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?", + "confirmations.edit.title": "Sovrascrivere il post?", "confirmations.logout.confirm": "Disconnettiti", "confirmations.logout.message": "Sei sicuro di volerti disconnettere?", + "confirmations.logout.title": "Uscire?", "confirmations.mute.confirm": "Silenzia", "confirmations.redraft.confirm": "Elimina e riscrivi", "confirmations.redraft.message": "Sei sicuro di voler eliminare questo post e riscriverlo? I preferiti e i boost andranno persi e le risposte al post originale non saranno più collegate.", + "confirmations.redraft.title": "Eliminare e riformulare il post?", "confirmations.reply.confirm": "Rispondi", "confirmations.reply.message": "Rispondere ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?", + "confirmations.reply.title": "Sovrascrivere il post?", "confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.message": "Sei sicuro di voler smettere di seguire {name}?", + "confirmations.unfollow.title": "Smettere di seguire l'utente?", "conversation.delete": "Elimina conversazione", "conversation.mark_as_read": "Segna come letto", "conversation.open": "Visualizza conversazione", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Usa una categoria esistente o creane una nuova", "filter_modal.select_filter.title": "Filtra questo post", "filter_modal.title.status": "Filtra un post", - "filtered_notifications_banner.mentions": "{count, plural, one {menzione} other {menzioni}}", - "filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere", + "filtered_notifications_banner.pending_requests": "Da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere", "filtered_notifications_banner.title": "Notifiche filtrate", "firehose.all": "Tutto", "firehose.local": "Questo server", @@ -443,6 +445,8 @@ "mute_modal.title": "Silenziare l'utente?", "mute_modal.you_wont_see_mentions": "Non vedrai i post che li menzionano.", "mute_modal.you_wont_see_posts": "Possono ancora vedere i tuoi post, ma tu non vedrai i loro.", + "name_and_others": "{name} e {count, plural, one {# un altro} other {# altri}}", + "name_and_others_with_link": "{name} e {count, plural, one {# un altro} other {# altri}}", "navigation_bar.about": "Info", "navigation_bar.advanced_interface": "Apri nell'interfaccia web avanzata", "navigation_bar.blocks": "Utenti bloccati", @@ -470,6 +474,10 @@ "navigation_bar.security": "Sicurezza", "not_signed_in_indicator.not_signed_in": "Devi accedere per consultare questa risorsa.", "notification.admin.report": "{name} ha segnalato {target}", + "notification.admin.report_account": "{name} ha segnalato {count, plural, one {un post} other {# post}} da {target} per {category}", + "notification.admin.report_account_other": "{name} ha segnalato {count, plural, one {un post} other {# post}} da {target}", + "notification.admin.report_statuses": "{name} ha segnalato {target} per {category}", + "notification.admin.report_statuses_other": "{name} ha segnalato {target}", "notification.admin.sign_up": "{name} si è iscritto", "notification.favourite": "{name} ha aggiunto il tuo post ai preferiti", "notification.follow": "{name} ha iniziato a seguirti", @@ -486,6 +494,7 @@ "notification.moderation_warning.action_suspend": "Il tuo account è stato sospeso.", "notification.own_poll": "Il tuo sondaggio è terminato", "notification.poll": "Un sondaggio in cui hai votato è terminato", + "notification.private_mention": "{name} ti ha citato privatamente", "notification.reblog": "{name} ha rebloggato il tuo post", "notification.relationships_severance_event": "Connessioni perse con {name}", "notification.relationships_severance_event.account_suspension": "Un amministratore da {from} ha sospeso {target}, il che significa che non puoi più ricevere aggiornamenti da loro o interagire con loro.", @@ -496,13 +505,18 @@ "notification.update": "{name} ha modificato un post", "notification_requests.accept": "Accetta", "notification_requests.dismiss": "Ignora", + "notification_requests.maximize": "Ingrandisci", + "notification_requests.minimize_banner": "Riduci al minimo il banner delle notifiche filtrate", "notification_requests.notifications_from": "Notifiche da {name}", "notification_requests.title": "Notifiche filtrate", "notifications.clear": "Cancella le notifiche", "notifications.clear_confirmation": "Sei sicuro di voler cancellare permanentemente tutte le tue notifiche?", + "notifications.clear_title": "Cancellare le notifiche?", "notifications.column_settings.admin.report": "Nuove segnalazioni:", "notifications.column_settings.admin.sign_up": "Nuove iscrizioni:", "notifications.column_settings.alert": "Notifiche desktop", + "notifications.column_settings.beta.category": "Funzioni sperimentali", + "notifications.column_settings.beta.grouping": "Notifiche di gruppo", "notifications.column_settings.favourite": "Preferiti:", "notifications.column_settings.filter_bar.advanced": "Mostra tutte le categorie", "notifications.column_settings.filter_bar.category": "Barra del filtro veloce", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Segui questo profilo. Per non visualizzare più i suoi post nel feed della tua home, smetti di seguirlo.", "report_notification.attached_statuses": "{count, plural, one {{count} post allegato} other {{count} post allegati}}", "report_notification.categories.legal": "Legale", + "report_notification.categories.legal_sentence": "contenuti illegali", "report_notification.categories.other": "Altro", + "report_notification.categories.other_sentence": "altri", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Violazione delle regole", + "report_notification.categories.violation_sentence": "violazione delle regole", "report_notification.open": "Apri segnalazione", "search.no_recent_searches": "Nessuna ricerca recente", "search.placeholder": "Cerca", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 90a46edd5b9..9a1ef03efc8 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -35,9 +35,9 @@ "account.follow_back": "フォローバック", "account.followers": "フォロワー", "account.followers.empty": "まだ誰もフォローしていません。", - "account.followers_counter": "{counter} フォロワー", + "account.followers_counter": "{count, plural, other {{counter} フォロワー}}", "account.following": "フォロー中", - "account.following_counter": "{counter} フォロー", + "account.following_counter": "{count, plural, other {{counter} フォロー}}", "account.follows.empty": "まだ誰もフォローしていません。", "account.go_to_profile": "プロフィールページへ", "account.hide_reblogs": "@{name}さんからのブーストを非表示", @@ -63,7 +63,7 @@ "account.requested_follow": "{name}さんがあなたにフォローリクエストしました", "account.share": "@{name}さんのプロフィールを共有する", "account.show_reblogs": "@{name}さんからのブーストを表示", - "account.statuses_counter": "{counter} 投稿", + "account.statuses_counter": "{count, plural, other {{counter} 投稿}}", "account.unblock": "@{name}さんのブロックを解除", "account.unblock_domain": "{domain}のブロックを解除", "account.unblock_short": "ブロック解除", @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "閲覧注意 (オプション)", "confirmation_modal.cancel": "キャンセル", "confirmations.block.confirm": "ブロック", - "confirmations.cancel_follow_request.confirm": "フォローリクエストを取り消す", - "confirmations.cancel_follow_request.message": "{name}に対するフォローリクエストを取り消しますか?", "confirmations.delete.confirm": "削除", "confirmations.delete.message": "本当に削除しますか?", "confirmations.delete_list.confirm": "削除", "confirmations.delete_list.message": "本当にこのリストを完全に削除しますか?", "confirmations.discard_edit_media.confirm": "破棄", "confirmations.discard_edit_media.message": "メディアの説明またはプレビューに保存されていない変更があります。それでも破棄しますか?", - "confirmations.domain_block.confirm": "サーバーをブロック", - "confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。公開タイムラインにそのドメインのコンテンツが表示されなくなり、通知も届かなくなります。そのドメインのフォロワーはアンフォローされます。", "confirmations.edit.confirm": "編集", "confirmations.edit.message": "今編集すると現在作成中のメッセージが上書きされます。本当に実行しますか?", "confirmations.logout.confirm": "ログアウト", @@ -297,8 +293,7 @@ "filter_modal.select_filter.subtitle": "既存のカテゴリーを使用するか新規作成します", "filter_modal.select_filter.title": "この投稿をフィルターする", "filter_modal.title.status": "投稿をフィルターする", - "filtered_notifications_banner.mentions": "{count, plural, one {メンション} other {メンション}}", - "filtered_notifications_banner.pending_requests": "{count, plural, =0 {通知がブロックされているアカウントはありません} other {#アカウントからの通知がブロックされています}}", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {すべて完了しました} other {#人の通知がブロックされています}}", "filtered_notifications_banner.title": "保留中の通知", "firehose.all": "すべて", "firehose.local": "このサーバー", @@ -414,6 +409,8 @@ "limited_account_hint.action": "構わず表示する", "limited_account_hint.title": "このプロフィールは{domain}のモデレーターによって非表示にされています。", "link_preview.author": "{name}", + "link_preview.more_from_author": "{name}さんの投稿をもっと読む", + "link_preview.shares": "{count, plural, other {{counter}件の投稿}}", "lists.account.add": "リストに追加", "lists.account.remove": "リストから外す", "lists.delete": "リストを削除", @@ -483,7 +480,6 @@ "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} さんを停止したため、今後このユーザーとの交流や新しい投稿の受け取りができなくなりました。", @@ -494,6 +490,7 @@ "notification.update": "{name}さんが投稿を編集しました", "notification_requests.accept": "受け入れる", "notification_requests.dismiss": "無視", + "notification_requests.minimize_banner": "「保留中の通知」のバナーを最小化する", "notification_requests.notifications_from": "{name}からの通知", "notification_requests.title": "保留中の通知", "notifications.clear": "通知を消去", @@ -501,6 +498,8 @@ "notifications.column_settings.admin.report": "新しい通報:", "notifications.column_settings.admin.sign_up": "新規登録:", "notifications.column_settings.alert": "デスクトップ通知", + "notifications.column_settings.beta.category": "実験段階の機能", + "notifications.column_settings.beta.grouping": "通知をグループにまとめる", "notifications.column_settings.favourite": "お気に入り:", "notifications.column_settings.filter_bar.advanced": "すべてのカテゴリを表示", "notifications.column_settings.filter_bar.category": "クイックフィルターバー:", @@ -694,8 +693,11 @@ "server_banner.about_active_users": "過去30日間にこのサーバーを使用している人 (月間アクティブユーザー)", "server_banner.active_users": "人のアクティブユーザー", "server_banner.administered_by": "管理者", + "server_banner.is_one_of_many": "{domain} は、数々の独立したMastodonサーバーのうちのひとつです。サーバーに登録してFediverseのコミュニティに加わってみませんか。", "server_banner.server_stats": "サーバーの情報", "sign_in_banner.create_account": "アカウント作成", + "sign_in_banner.follow_anyone": "連合内の誰でもフォローして投稿を時系列で見ることができます。アルゴリズム、広告、クリックベイトはありません。", + "sign_in_banner.mastodon_is": "Mastodonに参加して、世界で起きていることを見つけよう。", "sign_in_banner.sign_in": "ログイン", "sign_in_banner.sso_redirect": "ログインまたは登録", "status.admin_account": "@{name}さんのモデレーション画面を開く", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 7af4dccd86b..d61a29d7a33 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -26,7 +26,6 @@ "account.requested": "დამტკიცების მოლოდინში. დააწკაპუნეთ რომ უარყოთ დადევნების მოთხონვა", "account.share": "გააზიარე @{name}-ის პროფილი", "account.show_reblogs": "აჩვენე ბუსტები @{name}-სგან", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "განბლოკე @{name}", "account.unblock_domain": "გამოაჩინე {domain}", "account.unendorse": "არ გამოირჩეს პროფილზე", @@ -75,7 +74,6 @@ "confirmations.delete.message": "დარწმუნებული ხართ, გსურთ გააუქმოთ ეს სტატუსი?", "confirmations.delete_list.confirm": "გაუქმება", "confirmations.delete_list.message": "დარწმუნებული ხართ, გსურთ სამუდამოდ გააუქმოთ ეს სია?", - "confirmations.domain_block.message": "ნაღდად, ნაღდად, დარწმუნებული ხართ, გსურთ დაბლოკოთ მთელი {domain}? უმეტეს შემთხვევაში რამდენიმე გამიზნული ბლოკი ან გაჩუმება საკმარისი და უკეთესია. კონტენტს ამ დომენიდან ვერ იხილავთ ვერც ერთ ღია თაიმლაინზე ან თქვენს შეტყობინებებში. ამ დომენიდან არსებული მიმდევრები ამოიშლება.", "confirmations.mute.confirm": "გაჩუმება", "confirmations.redraft.confirm": "გაუქმება და გადანაწილება", "confirmations.unfollow.confirm": "ნუღარ მიჰყვები", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 5aa46bafde4..b8fd039b8db 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -1,6 +1,10 @@ { + "about.blocks": "Ulac agbur", "about.contact": "Anermis:", "about.disclaimer": "Mastodon d aseɣẓan ilelli, d aseɣẓan n uɣbalu yeldin, d tnezzut n Mastodon gGmbH.", + "about.domain_blocks.preamble": "Maṣṭudun s umata yeḍmen-ak ad teẓreḍ agbur, ad tesdemreḍ akked yimseqdacen-nniḍen seg yal aqeddac deg fedivers. Ha-tent-an ɣur-k tsuraf i yellan deg uqeddac-agi.", + "about.domain_blocks.silenced.title": "Ɣur-s talast", + "about.domain_blocks.suspended.title": "Yeḥbes", "about.not_available": "Talɣut-a ur tettwabder ara deg uqeddac-a.", "about.powered_by": "Azeṭṭa inmetti yettwasɣelsen sɣur {mastodon}", "about.rules": "Ilugan n uqeddac", @@ -16,30 +20,32 @@ "account.cancel_follow_request": "Sefsex taḍfart", "account.copy": "Nɣel assaɣ ɣer umaɣnu", "account.direct": "Bder-d @{name} weḥd-s", - "account.disable_notifications": "Ḥbes ur iyi-d-ttazen ara ilɣa mi ara d-isuffeɣ @{name}", + "account.disable_notifications": "Ḥbes ur iyi-d-ttazen ara alɣuten mi ara d-isuffeɣ @{name}", "account.domain_blocked": "Taɣult yeffren", "account.edit_profile": "Ẓreg amaɣnu", - "account.enable_notifications": "Azen-iyi-d ilɣa mi ara d-isuffeɣ @{name}", + "account.enable_notifications": "Azen-iyi-d alɣuten mi ara d-isuffeɣ @{name}", "account.endorse": "Welleh fell-as deg umaɣnu-inek", "account.featured_tags.last_status_at": "Tasuffeɣt taneggarut ass n {date}", "account.featured_tags.last_status_never": "Ulac tisuffaɣ", "account.follow": "Ḍfer", + "account.follow_back": "Ḍfer-it ula d kečč·mm", "account.followers": "Imeḍfaren", "account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.", - "account.followers_counter": "{count, plural, one {{count} n umeḍfar} other {{count} n imeḍfaren}}", + "account.followers_counter": "{count, plural, one {{counter} n umḍfar} other {{counter} n yimeḍfaren}}", "account.following": "Yeṭṭafaṛ", "account.following_counter": "{count, plural, one {{counter} yettwaḍfaren} other {{counter} yettwaḍfaren}}", "account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.", "account.go_to_profile": "Ddu ɣer umaɣnu", "account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}", "account.joined_short": "Izeddi da seg ass n", + "account.languages": "Beddel tutlayin yettwajerden", "account.link_verified_on": "Taɣara n useɣwen-a tettwasenqed ass n {date}", "account.locked_info": "Amiḍan-agi uslig isekweṛ. D bab-is kan i izemren ad yeǧǧ, s ufus-is, win ara t-iḍefṛen.", "account.media": "Timidyatin", "account.mention": "Bder-d @{name}", "account.moved_to": "{name} yenna-d dakken amiḍan-is amaynut yuɣal :", "account.mute": "Sgugem @{name}", - "account.mute_notifications_short": "Susem ilɣa", + "account.mute_notifications_short": "Susem alɣuten", "account.mute_short": "Sgugem", "account.muted": "Yettwasgugem", "account.no_bio": "Ulac aglam i d-yettunefken.", @@ -97,7 +103,7 @@ "column.home": "Agejdan", "column.lists": "Tibdarin", "column.mutes": "Imiḍanen yettwasgugmen", - "column.notifications": "Tilɣa", + "column.notifications": "Alɣuten", "column.pins": "Tisuffaɣ yettwasenṭḍen", "column.public": "Tasuddemt tamatut", "column_back_button.label": "Tuɣalin", @@ -140,7 +146,6 @@ "confirmations.delete_list.confirm": "Kkes", "confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?", "confirmations.discard_edit_media.confirm": "Sefsex", - "confirmations.domain_block.confirm": "Sewḥel aqeddac", "confirmations.edit.confirm": "Ẓreg", "confirmations.edit.message": "Abeddel tura ad d-yaru izen-nni i d-tegreḍ akka tura. Tetḥeqqeḍ tebɣiḍ ad tkemmleḍ?", "confirmations.logout.confirm": "Ffeɣ", @@ -169,6 +174,7 @@ "dismissable_banner.explore_tags": "D wiyi i d ihacṭagen i d-yettawin tamyigawt deg web anmetti ass-a. Ihacṭagen i sseqdacen ugar n medden, εlayit d imezwura.", "domain_block_modal.block": "Sewḥel aqeddac", "domain_block_modal.they_cant_follow": "Yiwen ur yezmir ad k·m-id-yeḍfer seg uqeddac-a.", + "domain_block_modal.title": "Sewḥel taɣult?", "domain_pill.activitypub_like_language": "ActivityPub am tutlayt yettmeslay Mastodon d izeḍwan inmettiyen nniḍen.", "domain_pill.server": "Aqeddac", "domain_pill.username": "Isem n useqdac", @@ -203,7 +209,7 @@ "empty_column.list": "Ar tura ur yelli kra deg umuɣ-a. Ad d-yettwasken da ticki iɛeggalen n wumuɣ-a suffɣen-d kra.", "empty_column.lists": "Ulac ɣur-k·m kra n wumuɣ yakan. Ad d-tettwasken da ticki tesluleḍ-d yiwet.", "empty_column.mutes": "Ulac ɣur-k·m imseqdacen i yettwasgugmen.", - "empty_column.notifications": "Ulac ɣur-k·m tilɣa. Sedmer akked yemdanen-nniḍen akken ad tebduḍ adiwenni.", + "empty_column.notifications": "Ulac ɣur-k·m alɣuten. Sedmer akked yemdanen-nniḍen akken ad tebduḍ adiwenni.", "empty_column.public": "Ulac kra da! Aru kra, neɣ ḍfeṛ imdanen i yellan deg yiqeddacen-nniḍen akken ad d-teččar tsuddemt tazayezt", "error.unexpected_crash.next_steps": "Smiren asebter-a, ma ur yekkis ara wugur, ẓer d akken tzemreḍ ad tesqedceḍ Maṣṭudun deg yiminig-nniḍen neɣ deg usnas anaṣli.", "errors.unexpected_crash.copy_stacktrace": "Nɣel stacktrace ɣef wafus", @@ -217,6 +223,7 @@ "filter_modal.added.review_and_configure_title": "Iɣewwaṛen n imzizdig", "filter_modal.added.settings_link": "asebter n yiɣewwaṛen", "filter_modal.added.short_explanation": "Tasuffeɣt-a tettwarna ɣer taggayt-a n yimsizdegen: {title}.", + "filter_modal.added.title": "Yettwarna umsizdeg!", "filter_modal.select_filter.expired": "yemmut", "filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}", "filter_modal.select_filter.search": "Nadi neɣ snulfu-d", @@ -227,9 +234,12 @@ "firehose.remote": "Iqeddacen nniḍen", "follow_request.authorize": "Ssireg", "follow_request.reject": "Agi", - "follow_suggestions.dismiss": "Ur ttɛawad ara ad t-id-sekneṭ", + "follow_suggestions.dismiss": "Dayen ur t-id-skan ara", + "follow_suggestions.featured_longer": "Yettwafraned s ufus sɣur agraw n {domain}", + "follow_suggestions.hints.featured": "Amaɣnu-a ifren-it-id wegraw n {domain} s ufus.", + "follow_suggestions.popular_suggestion_longer": "Yettwassen deg {domain}", "follow_suggestions.view_all": "Wali-ten akk", - "follow_suggestions.who_to_follow": "Menhu ara ḍefṛeḍ", + "follow_suggestions.who_to_follow": "Ad tḍefreḍ?", "followed_tags": "Ihacṭagen yettwaḍfaren", "footer.about": "Ɣef", "footer.directory": "Akaram n imeɣna", @@ -238,6 +248,7 @@ "footer.keyboard_shortcuts": "Inegzumen n unasiw", "footer.privacy_policy": "Tasertit tabaḍnit", "footer.source_code": "Wali tangalt taɣbalut", + "footer.status": "Addad", "generic.saved": "Yettwasekles", "getting_started.heading": "Bdu", "hashtag.column_header.tag_mode.all": "d {additional}", @@ -295,7 +306,7 @@ "keyboard_shortcuts.mention": "akken ad d-bedreḍ ameskar", "keyboard_shortcuts.muted": "akken ad teldiḍ tabdart n yimseqdacen yettwasgugmen", "keyboard_shortcuts.my_profile": "akken ad d-teldiḍ amaɣnu-ik", - "keyboard_shortcuts.notifications": "akken ad d-teldiḍ ajgu n tilɣa", + "keyboard_shortcuts.notifications": "akken ad d-teldiḍ ajgu n walɣuten", "keyboard_shortcuts.open_media": "i tiɣwalin yeldin", "keyboard_shortcuts.pinned": "akken ad teldiḍ tabdart n tjewwiqin yettwasentḍen", "keyboard_shortcuts.profile": "akken ad d-teldiḍ amaɣnu n umeskar", @@ -316,11 +327,14 @@ "lightbox.previous": "Ɣer deffir", "limited_account_hint.action": "Wali amaɣnu akken yebɣu yili", "link_preview.author": "S-ɣur {name}", + "link_preview.more_from_author": "Ugar sɣur {name}", + "link_preview.shares": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}}", "lists.account.add": "Rnu ɣer tebdart", "lists.account.remove": "Kkes seg tebdart", "lists.delete": "Kkes tabdart", "lists.edit": "Ẓreg tabdart", "lists.edit.submit": "Beddel azwel", + "lists.exclusive": "Ffer tisuffaɣ-a seg ugejdan", "lists.new.create": "Rnu tabdart", "lists.new.title_placeholder": "Azwel amaynut n tebdart", "lists.replies_policy.followed": "Kra n useqdac i yettwaḍefren", @@ -341,6 +355,7 @@ "navigation_bar.bookmarks": "Ticraḍ", "navigation_bar.community_timeline": "Tasuddemt tadigant", "navigation_bar.compose": "Aru tajewwiqt tamaynut", + "navigation_bar.direct": "Tibdarin tusligin", "navigation_bar.discover": "Ẓer", "navigation_bar.domain_blocks": "Tiɣula yeffren", "navigation_bar.explore": "Snirem", @@ -360,20 +375,26 @@ "navigation_bar.search": "Nadi", "navigation_bar.security": "Taɣellist", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "notification.admin.report": "Yemla-t-id {name} {target}", + "notification.admin.sign_up": "Ijerred {name}", + "notification.favourite": "{name} yesmenyaf addad-ik·im", "notification.follow": "iṭṭafar-ik·em-id {name}", "notification.follow_request": "{name} yessuter-d ad k·m-yeḍfeṛ", "notification.mention": "{name} yebder-ik-id", + "notification.moderation-warning.learn_more": "Issin ugar", + "notification.moderation_warning.action_suspend": "Yettwaseḥbes umiḍan-ik.", "notification.own_poll": "Tafrant-ik·im tfuk", - "notification.poll": "Tfukk tefrant ideg tettekkaḍ", "notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen", "notification.relationships_severance_event.learn_more": "Issin ugar", "notification.status": "{name} akken i d-yessufeɣ", "notification_requests.accept": "Qbel", "notification_requests.dismiss": "Agi", - "notification_requests.notifications_from": "Ilɣa sɣur {name}", - "notifications.clear": "Sfeḍ tilɣa", - "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?", - "notifications.column_settings.alert": "Tilɣa n tnarit", + "notification_requests.notifications_from": "Alɣuten sɣur {name}", + "notifications.clear": "Sfeḍ alɣuten", + "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk alɣuten-inek·em i lebda?", + "notifications.column_settings.admin.report": "Ineqqisen imaynuten:", + "notifications.column_settings.alert": "Alɣuten n tnarit", + "notifications.column_settings.beta.grouping": "Segrew alɣuten", "notifications.column_settings.favourite": "Imenyafen:", "notifications.column_settings.filter_bar.advanced": "Sken-d akk taggayin", "notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib", @@ -381,12 +402,13 @@ "notifications.column_settings.follow_request": "Isuturen imaynuten n teḍfeṛt:", "notifications.column_settings.mention": "Abdar:", "notifications.column_settings.poll": "Igemmaḍ n usenqed:", - "notifications.column_settings.push": "Tilɣa yettudemmren", + "notifications.column_settings.push": "Alɣuten yettudemmren", "notifications.column_settings.reblog": "Seǧhed:", "notifications.column_settings.show": "Ssken-d tilɣa deg ujgu", "notifications.column_settings.sound": "Rmed imesli", "notifications.column_settings.status": "Tisuffaɣ timaynutin :", - "notifications.column_settings.unread_notifications.category": "Ilɣa ur nettwaɣra", + "notifications.column_settings.unread_notifications.category": "Alɣuten ur nettwaɣra", + "notifications.column_settings.update": "Iẓreg:", "notifications.filter.all": "Akk", "notifications.filter.boosts": "Seǧhed", "notifications.filter.favourites": "Imenyafen", @@ -395,9 +417,9 @@ "notifications.filter.polls": "Igemmaḍ n usenqed", "notifications.filter.statuses": "Ileqman n yimdanen i teṭṭafareḍ", "notifications.grant_permission": "Mudd tasiregt.", - "notifications.group": "{count} n tilɣa", - "notifications.mark_as_read": "Creḍ meṛṛa iilɣa am wakken ttwaɣran", - "notifications.permission_denied": "D awezɣi ad yili wermad n yilɣa n tnarit axateṛ turagt tettwagdel.", + "notifications.group": "{count} n walɣuten", + "notifications.mark_as_read": "Creḍ meṛṛa alɣuten am wakken ttwaɣran", + "notifications.permission_denied": "D awezɣi ad yili wermad n walɣuten n tnarit axateṛ turagt tettwagdel", "notifications.policy.filter_new_accounts.hint": "Imiḍanen imaynuten i d-yennulfan deg {days, plural, one {yiwen n wass} other {# n wussan}} yezrin", "notifications.policy.filter_new_accounts_title": "Imiḍan imaynuten", "notifications.policy.filter_not_followers_hint": "Ula d wid akked tid i k·m-id-iḍefren, ur wwiḍen ara {days, plural, one {yiwen n wass} other {# n wussan}}", @@ -405,8 +427,8 @@ "notifications.policy.filter_not_following_hint": "Alamma tqebleḍ-ten s ufus", "notifications.policy.filter_not_following_title": "Wid akked tid ur tettḍafareḍ ara", "notifications.policy.filter_private_mentions_title": "Abdar uslig ur yettwasferken ara", - "notifications.policy.title": "Sizdeg ilɣa sɣur …", - "notifications_permission_banner.enable": "Rmed talɣutin n tnarit", + "notifications.policy.title": "Sizdeg alɣuten sɣur …", + "notifications_permission_banner.enable": "Rmed alɣuten n tnarit", "notifications_permission_banner.title": "Ur zeggel acemma", "onboarding.action.back": "Tuɣalin ɣer deffir", "onboarding.actions.back": "Tuɣalin ɣer deffir", @@ -416,6 +438,7 @@ "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Ttwassnen deg Mastodon", "onboarding.profile.display_name": "Isem ara d-yettwaskanen", + "onboarding.profile.display_name_hint": "Isem-ik·im ummid neɣ isem-ik·im n uqeṣṣer…", "onboarding.profile.note": "Tameddurt", "onboarding.profile.note_hint": "Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen …", "onboarding.profile.save_and_continue": "Sekles, tkemmleḍ", @@ -444,6 +467,7 @@ "poll.total_votes": "{count, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}", "poll.vote": "Dɣeṛ", "poll.voted": "Tdeɣṛeḍ ɣef tririt-ayi", + "poll.votes": "{votes, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}", "poll_button.add_poll": "Rnu asenqed", "poll_button.remove_poll": "Kkes asenqed", "privacy.change": "Seggem tabaḍnit n yizen", @@ -468,9 +492,12 @@ "relative_time.seconds": "{number}tas", "relative_time.today": "assa", "reply_indicator.cancel": "Sefsex", + "reply_indicator.poll": "Afmiḍi", "report.block": "Sewḥel", + "report.categories.legal": "Azerfan", "report.categories.other": "Tiyyaḍ", "report.categories.spam": "Aspam", + "report.category.subtitle": "Fren amṣada akk ufrin", "report.category.title_account": "ameɣnu", "report.category.title_status": "tasuffeɣt", "report.close": "Immed", @@ -479,13 +506,25 @@ "report.next": "Uḍfiṛ", "report.placeholder": "Iwenniten-nniḍen", "report.reasons.dislike": "Ur t-ḥemmleɣ ara", + "report.reasons.dislike_description": "D ayen akk ur bɣiɣ ara ad waliɣ", "report.reasons.other": "D ayen nniḍen", + "report.reasons.other_description": "Ugur ur yemṣada ara akk d taggayin-nniḍen", "report.reasons.spam": "D aspam", + "report.reasons.spam_description": "Yir iseɣwan, yir agman d tririyin i d-yettuɣalen", + "report.reasons.violation": "Truẓi n yilugan n uqeddac", + "report.reasons.violation_description": "Teẓriḍ y·tettruẓu kra n yilugan", + "report.rules.subtitle": "Fren ayen akk yemṣadan", + "report.rules.title": "Acu n yilugan i yettwarẓan?", + "report.statuses.subtitle": "Fren ayen akk yemṣadan", + "report.statuses.title": "Llant tsuffaɣ ara isdemren aneqqis-a?", "report.submit": "Azen", "report.target": "Mmel {target}", + "report.thanks.take_action_actionable": "Ideg nekkni nessenqad tuttra-inek•inem, tzemreḍ ad tḥadreḍ mgal @{name}:", "report.thanks.title": "Ur tebɣiḍ ara ad twaliḍ aya?", + "report.thanks.title_actionable": "Tanemmirt ɣef uneqqis, ad nwali deg waya.", "report.unfollow": "Seḥbes aḍfar n @{name}", - "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", + "report_notification.attached_statuses": "{count, plural, one {{count} n tsuffeɣt} other {{count} n tsuffiɣin}} ttwaqnent", + "report_notification.categories.legal": "Azerfan", "report_notification.categories.other": "Ayen nniḍen", "report_notification.categories.spam": "Aspam", "report_notification.open": "Ldi aneqqis", @@ -500,6 +539,7 @@ "search_popout.full_text_search_disabled_message": "Ur yelli ara deg {domain}.", "search_popout.language_code": "Tangalt ISO n tutlayt", "search_popout.options": "Iwellihen n unadi", + "search_popout.quick_actions": "Tigawin tiruradin", "search_popout.recent": "Inadiyen ineggura", "search_popout.user": "amseqdac", "search_results.accounts": "Imeɣna", @@ -508,7 +548,9 @@ "search_results.see_all": "Wali-ten akk", "search_results.statuses": "Tisuffaɣ", "search_results.title": "Anadi ɣef {q}", + "server_banner.active_users": "iseqdacen urmiden", "server_banner.administered_by": "Yettwadbel sɣur :", + "server_banner.server_stats": "Tidaddanin n uqeddac:", "sign_in_banner.create_account": "Snulfu-d amiḍan", "sign_in_banner.sign_in": "Qqen", "sign_in_banner.sso_redirect": "Qqen neɣ jerred", @@ -519,13 +561,21 @@ "status.cannot_reblog": "Tasuffeɣt-a ur tezmir ara ad tettwabḍu tikelt-nniḍen", "status.copy": "Nɣel assaɣ ɣer tasuffeɣt", "status.delete": "Kkes", + "status.direct": "Bder-d @{name} weḥd-s", + "status.direct_indicator": "Abdar uslig", "status.edit": "Ẓreg", "status.edited_x_times": "Tettwaẓreg {count, plural, one {{count} n tikkelt} other {{count} n tikkal}}", "status.embed": "Seddu", + "status.favourite": "Amenyaf", + "status.favourites": "{count, plural, one {n usmenyaf} other {n ismenyafen}}", "status.filter": "Sizdeg tassufeɣt-a", "status.filtered": "Yettwasizdeg", "status.hide": "Ffer tasuffeɣt", + "status.history.created": "Yerna-t {name} {date}", + "status.history.edited": "Ibeddel-it {name} {date}", "status.load_more": "Sali ugar", + "status.media.open": "Sit i ulday", + "status.media.show": "Sit i uskan", "status.media_hidden": "Amidya yettwaffer", "status.mention": "Bder-d @{name}", "status.more": "Ugar", @@ -533,10 +583,11 @@ "status.mute_conversation": "Sgugem adiwenni", "status.open": "Semɣeṛ tasuffeɣt-ayi", "status.pin": "Senteḍ-itt deg umaɣnu", - "status.pinned": "Tijewwiqin yettwasentḍen", + "status.pinned": "Tisuffaɣ yettwasentḍen", "status.read_more": "Issin ugar", "status.reblog": "Bḍu", "status.reblogged_by": "Yebḍa-tt {name}", + "status.reblogs": "{count, plural, one {n usnerni} other {n yisnernuyen}}", "status.reblogs.empty": "Ula yiwen ur yebḍi tajewwiqt-agi ar tura. Ticki yebḍa-tt yiwen, ad d-iban da.", "status.redraft": "Kkes tɛiwdeḍ tira", "status.remove_bookmark": "Kkes tacreḍt", @@ -551,6 +602,7 @@ "status.show_less_all": "Semẓi akk tisuffɣin", "status.show_more": "Ssken-d ugar", "status.show_more_all": "Ẓerr ugar lebda", + "status.show_original": "Sken aɣbalu", "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", "status.translate": "Suqel", "status.translated_from_with": "Yettwasuqel seg {lang} s {provider}", @@ -558,7 +610,7 @@ "status.unpin": "Kkes asenteḍ seg umaɣnu", "subscribed_languages.save": "Sekles ibeddilen", "tabs_bar.home": "Agejdan", - "tabs_bar.notifications": "Tilɣa", + "tabs_bar.notifications": "Alɣuten", "time_remaining.days": "Mazal {number, plural, one {# n wass} other {# n wussan}}", "time_remaining.hours": "Mazal {number, plural, one {# n usrag} other {# n yesragen}}", "time_remaining.minutes": "Mazal {number, plural, one {# n tesdat} other {# n tesdatin}}", @@ -585,6 +637,7 @@ "upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neɣ deg yiẓri", "upload_modal.analyzing_picture": "Tasleḍt n tugna tetteddu…", "upload_modal.apply": "Snes", + "upload_modal.applying": "Asnas…", "upload_modal.choose_image": "Fren tugna", "upload_modal.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis", "upload_modal.detect_text": "Sefru-d aḍris seg tugna", @@ -592,6 +645,7 @@ "upload_modal.preparing_ocr": "Aheyyi n OCR…", "upload_modal.preview_label": "Taskant ({ratio})", "upload_progress.label": "Asali iteddu...", + "upload_progress.processing": "Asesfer…", "username.taken": "Yettwaṭṭef yisem-a n useqdac. Ɛreḍ wayeḍ", "video.close": "Mdel tabidyutt", "video.download": "Sidered afaylu", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index bd0a806cdb9..fbaa371843a 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -31,9 +31,7 @@ "account.follow": "Жазылу", "account.followers": "Жазылушы", "account.followers.empty": "Бұл қолданушыға әлі ешкім жазылмаған.", - "account.followers_counter": "{count, plural, one {{counter} жазылушы} other {{counter} жазылушы}}", "account.following": "Жазылым", - "account.following_counter": "{count, plural, one {{counter} жазылым} other {{counter} жазылым}}", "account.follows.empty": "Бұл қолданушы әлі ешкімге жазылмаған.", "account.go_to_profile": "Профиліне өту", "account.hide_reblogs": "@{name} бустарын жасыру", @@ -52,7 +50,6 @@ "account.requested": "Растауын күтіңіз. Жазылудан бас тарту үшін басыңыз", "account.share": "@{name} профилін бөлісу\"", "account.show_reblogs": "@{name} бөліскендерін көрсету", - "account.statuses_counter": "{count, plural, one {{counter} Пост} other {{counter} Пост}}", "account.unblock": "Бұғаттан шығару @{name}", "account.unblock_domain": "Бұғаттан шығару {domain}", "account.unendorse": "Профильде рекомендемеу", @@ -110,7 +107,6 @@ "confirmations.delete.message": "Бұл жазбаны өшіресіз бе?", "confirmations.delete_list.confirm": "Өшіру", "confirmations.delete_list.message": "Бұл тізімді жоясыз ба шынымен?", - "confirmations.domain_block.message": "Бұл домендегі {domain} жазбаларды шынымен бұғаттайсыз ба? Кейде үнсіз қылып тастау да жеткілікті.", "confirmations.logout.confirm": "Шығу", "confirmations.logout.message": "Шығатыныңызға сенімдісіз бе?", "confirmations.mute.confirm": "Үнсіз қылу", @@ -251,7 +247,6 @@ "notification.follow_request": "{name} сізге жазылғысы келеді", "notification.mention": "{name} сізді атап өтті", "notification.own_poll": "Сауалнама аяқталды", - "notification.poll": "Бұл сауалнаманың мерзімі аяқталыпты", "notification.reblog": "{name} жазбаңызды бөлісті", "notifications.clear": "Ескертпелерді тазарт", "notifications.clear_confirmation": "Шынымен барлық ескертпелерді өшіресіз бе?", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index ceb0f8b9b61..24592e37fc0 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -16,7 +16,6 @@ "account.posts": "ಟೂಟ್‌ಗಳು", "account.posts_with_replies": "Toots and replies", "account.requested": "Awaiting approval", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock_domain": "Unhide {domain}", "account_note.placeholder": "Click to add a note", "alert.unexpected.title": "ಅಯ್ಯೋ!", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index aa05887d655..a9b634dbaeb 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -32,12 +32,12 @@ "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": "{counter} 팔로워", + "account.followers_counter": "{count, plural, other {{counter} 팔로워}}", "account.following": "팔로잉", - "account.following_counter": "{counter} 팔로잉", + "account.following_counter": "{count, plural, other {{counter} 팔로잉}}", "account.follows.empty": "이 사용자는 아직 아무도 팔로우하고 있지 않습니다.", "account.go_to_profile": "프로필로 이동", "account.hide_reblogs": "@{name}의 부스트를 숨기기", @@ -53,7 +53,7 @@ "account.mute_notifications_short": "알림 뮤트", "account.mute_short": "뮤트", "account.muted": "뮤트됨", - "account.mutual": "상호 팔로우", + "account.mutual": "맞팔로우 중", "account.no_bio": "제공된 설명이 없습니다.", "account.open_original_page": "원본 페이지 열기", "account.posts": "게시물", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} 님이 팔로우 요청을 보냈습니다", "account.share": "@{name}의 프로필 공유", "account.show_reblogs": "@{name}의 부스트 보기", - "account.statuses_counter": "{counter} 게시물", + "account.statuses_counter": "{count, plural, other {{counter} 게시물}}", "account.unblock": "차단 해제", "account.unblock_domain": "도메인 {domain} 차단 해제", "account.unblock_short": "차단 해제", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "내용 경고 (선택사항)", "confirmation_modal.cancel": "취소", "confirmations.block.confirm": "차단", - "confirmations.cancel_follow_request.confirm": "요청 삭제", - "confirmations.cancel_follow_request.message": "정말 {name}님에 대한 팔로우 요청을 취소하시겠습니까?", "confirmations.delete.confirm": "삭제", "confirmations.delete.message": "정말로 이 게시물을 삭제하시겠습니까?", + "confirmations.delete.title": "게시물을 삭제할까요?", "confirmations.delete_list.confirm": "삭제", "confirmations.delete_list.message": "정말로 이 리스트를 영구적으로 삭제하시겠습니까?", + "confirmations.delete_list.title": "리스트를 삭제할까요?", "confirmations.discard_edit_media.confirm": "저장 안함", "confirmations.discard_edit_media.message": "미디어 설명이나 미리보기에 대한 저장하지 않은 변경사항이 있습니다. 버리시겠습니까?", - "confirmations.domain_block.confirm": "서버 차단", - "confirmations.domain_block.message": "정말로 {domain} 전체를 차단하시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 콘텐츠를 보지 못합니다. 해당 도메인에 속한 팔로워와의 관계가 사라집니다.", "confirmations.edit.confirm": "수정", "confirmations.edit.message": "지금 편집하면 작성 중인 메시지를 덮어씁니다. 진행이 확실한가요?", + "confirmations.edit.title": "게시물을 덮어쓸까요?", "confirmations.logout.confirm": "로그아웃", "confirmations.logout.message": "정말로 로그아웃 하시겠습니까?", + "confirmations.logout.title": "로그아웃 할까요?", "confirmations.mute.confirm": "뮤트", "confirmations.redraft.confirm": "삭제하고 다시 쓰기", "confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 게시물에 대한 부스트와 좋아요를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.", + "confirmations.redraft.title": "삭제하고 다시 작성할까요?", "confirmations.reply.confirm": "답글", "confirmations.reply.message": "지금 답장하면 작성 중인 메시지를 덮어쓰게 됩니다. 정말 진행합니까?", + "confirmations.reply.title": "게시물을 덮어쓸까요?", "confirmations.unfollow.confirm": "팔로우 해제", "confirmations.unfollow.message": "정말로 {name} 님을 팔로우 해제하시겠습니까?", + "confirmations.unfollow.title": "사용자를 언팔로우 할까요?", "conversation.delete": "대화 삭제", "conversation.mark_as_read": "읽은 상태로 표시", "conversation.open": "대화 보기", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다", "filter_modal.select_filter.title": "이 게시물을 필터", "filter_modal.title.status": "게시물 필터", - "filtered_notifications_banner.mentions": "{count, plural, other {멘션}}", - "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터의 알림", + "filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터", "filtered_notifications_banner.title": "걸러진 알림", "firehose.all": "모두", "firehose.local": "이 서버", @@ -443,6 +445,8 @@ "mute_modal.title": "사용자를 뮤트할까요?", "mute_modal.you_wont_see_mentions": "그를 멘션하는 게시물을 더는 보지 않게 됩니다.", "mute_modal.you_wont_see_posts": "내가 작성한 게시물을 볼 수는 있지만, 나는 그가 작성한 것을 보지 않게 됩니다.", + "name_and_others": "{name} 외 {count, plural, other {# 명}}", + "name_and_others_with_link": "{name} 외 {count, plural, other {# 명}}", "navigation_bar.about": "정보", "navigation_bar.advanced_interface": "고급 웹 인터페이스에서 열기", "navigation_bar.blocks": "차단한 사용자", @@ -470,6 +474,10 @@ "navigation_bar.security": "보안", "not_signed_in_indicator.not_signed_in": "이 정보에 접근하려면 로그인을 해야 합니다.", "notification.admin.report": "{name} 님이 {target}를 신고했습니다", + "notification.admin.report_account": "{name} 님이 {target}의 게시물 {count, plural, other {# 개}}를 {category}로 신고했습니다", + "notification.admin.report_account_other": "{name} 님이 {target}의 게시물 {count, plural, other {# 개}}를 신고했습니다", + "notification.admin.report_statuses": "{name} 님이 {target}을 {category}로 신고했습니다", + "notification.admin.report_statuses_other": "{name} 님이 {target}을 신고했습니다", "notification.admin.sign_up": "{name} 님이 가입했습니다", "notification.favourite": "{name} 님이 내 게시물을 좋아합니다", "notification.follow": "{name} 님이 나를 팔로우했습니다", @@ -485,7 +493,8 @@ "notification.moderation_warning.action_silence": "계정이 제한되었습니다.", "notification.moderation_warning.action_suspend": "계정이 정지되었습니다.", "notification.own_poll": "설문을 마침", - "notification.poll": "참여한 설문이 종료됨", + "notification.poll": "참여한 투표가 끝났습니다", + "notification.private_mention": "{name} 님이 나를 개인적으로 멘션했습니다", "notification.reblog": "{name} 님이 부스트했습니다", "notification.relationships_severance_event": "{name} 님과의 연결이 끊어졌습니다", "notification.relationships_severance_event.account_suspension": "{from}의 관리자가 {target}를 정지시켰기 때문에 그들과 더이상 상호작용 할 수 없고 정보를 받아볼 수 없습니다.", @@ -500,9 +509,12 @@ "notification_requests.title": "걸러진 알림", "notifications.clear": "알림 비우기", "notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?", + "notifications.clear_title": "알림을 모두 지울까요?", "notifications.column_settings.admin.report": "새 신고:", "notifications.column_settings.admin.sign_up": "새로운 가입:", "notifications.column_settings.alert": "데스크탑 알림", + "notifications.column_settings.beta.category": "실험적인 기능", + "notifications.column_settings.beta.grouping": "알림 그룹화", "notifications.column_settings.favourite": "좋아요:", "notifications.column_settings.filter_bar.advanced": "모든 범주 표시", "notifications.column_settings.filter_bar.category": "빠른 필터 막대", @@ -666,9 +678,13 @@ "report.unfollow_explanation": "이 계정을 팔로우하고 있습니다. 홈 피드에서 더 이상 게시물을 받아 보지 않으려면 팔로우를 해제하십시오.", "report_notification.attached_statuses": "{count}개의 게시물 첨부됨", "report_notification.categories.legal": "법령", + "report_notification.categories.legal_sentence": "불법적인 내용", "report_notification.categories.other": "기타", + "report_notification.categories.other_sentence": "기타", "report_notification.categories.spam": "스팸", + "report_notification.categories.spam_sentence": "스팸", "report_notification.categories.violation": "규칙 위반", + "report_notification.categories.violation_sentence": "규칙 위반", "report_notification.open": "신고 열기", "search.no_recent_searches": "최근 검색 기록이 없습니다", "search.placeholder": "검색", @@ -760,7 +776,7 @@ "status.title.with_attachments": "{user} 님이 {attachmentCount, plural, one {첨부파일} other {{attachmentCount}개의 첨부파일}}과 함께 게시함", "status.translate": "번역", "status.translated_from_with": "{provider}에 의해 {lang}에서 번역됨", - "status.uncached_media_warning": "마리보기 허용되지 않음", + "status.uncached_media_warning": "미리보기를 사용할 수 없습니다", "status.unmute_conversation": "이 대화의 뮤트 해제하기", "status.unpin": "고정 해제", "subscribed_languages.lead": "변경 후에는 선택한 언어들로 작성된 게시물들만 홈 타임라인과 리스트 타임라인에 나타나게 됩니다. 아무 것도 선택하지 않으면 모든 언어로 작성된 게시물을 받아봅니다.", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 83fcef26fb2..3d3c20424cf 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -32,9 +32,7 @@ "account.follow": "Bişopîne", "account.followers": "Şopîner", "account.followers.empty": "Kesekî hin ev bikarhêner neşopandiye.", - "account.followers_counter": "{count, plural, one {{counter} Şopîner} other {{counter} Şopîner}}", "account.following": "Dişopîne", - "account.following_counter": "{count, plural, one {{counter} Dişopîne} other {{counter} Dişopîne}}", "account.follows.empty": "Ev bikarhêner hin kesekî heya niha neşopandiye.", "account.go_to_profile": "Biçe bo profîlê", "account.hide_reblogs": "Bilindkirinên ji @{name} veşêre", @@ -56,7 +54,6 @@ "account.requested_follow": "{name} dixwaze te bişopîne", "account.share": "Profîla @{name} parve bike", "account.show_reblogs": "Bilindkirinên ji @{name} nîşan bike", - "account.statuses_counter": "{count, plural,one {{counter} Şandî}other {{counter} Şandî}}", "account.unblock": "Astengê li ser @{name} rake", "account.unblock_domain": "Astengê li ser navperê {domain} rake", "account.unblock_short": "Astengiyê rake", @@ -136,15 +133,12 @@ "compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike", "confirmation_modal.cancel": "Dev jê berde", "confirmations.block.confirm": "Asteng bike", - "confirmations.cancel_follow_request.confirm": "Daxwazê vekişîne", - "confirmations.cancel_follow_request.message": "Tu dixwazî ​​daxwaza xwe ya şopandina {name} vekşînî?", "confirmations.delete.confirm": "Jê bibe", "confirmations.delete.message": "Ma tu dixwazî vê şandiyê jê bibî?", "confirmations.delete_list.confirm": "Jê bibe", "confirmations.delete_list.message": "Tu ji dil dixwazî vê lîsteyê bi awayekî mayînde jê bibî?", "confirmations.discard_edit_media.confirm": "Biavêje", "confirmations.discard_edit_media.message": "Guhertinên neqedandî di danasîna an pêşdîtina medyayê de hene, wan bi her awayî bavêje?", - "confirmations.domain_block.message": "Tu pê bawerî ku tu dixwazî tevahiya {domain} asteng bikî? Di gelek rewşan de astengkirin an jî bêdengkirin têrê dike û tê hilbijartin. Tu nikarî naveroka vê navperê di demnameyê an jî agahdariyên xwe de bibînî. Şopînerên te yê di vê navperê wê werin jêbirin.", "confirmations.edit.confirm": "Serrast bike", "confirmations.logout.confirm": "Derkeve", "confirmations.logout.message": "Ma tu dixwazî ku derkevî?", @@ -352,7 +346,6 @@ "notification.follow_request": "{name} dixwazê te bişopîne", "notification.mention": "{name} qale te kir", "notification.own_poll": "Rapirsîya te qediya", - "notification.poll": "Rapirsiyeke ku te deng daye qediya", "notification.reblog": "{name} şandiya te bilind kir", "notification.status": "{name} niha şand", "notification.update": "{name} şandiyek serrast kir", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index 794cbd9ede3..7ebe71b24ca 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -17,8 +17,6 @@ "account.follow": "Holya", "account.followers": "Holyoryon", "account.followers.empty": "Ny wra nagonan holya'n devnydhyer ma hwath.", - "account.followers_counter": "{count, plural, one {{counter} Holyer} other {{counter} Holyer}}", - "account.following_counter": "{count, plural, one {Ow holya {counter}} other {Ow holya {counter}}}", "account.follows.empty": "Ny wra'n devnydhyer ma holya nagonan hwath.", "account.hide_reblogs": "Kudha kenerthow a @{name}", "account.link_verified_on": "Perghenogeth an kolm ma a veu checkys dhe {date}", @@ -33,7 +31,6 @@ "account.requested": "Ow kortos komendyans. Klyckyewgh dhe hedhi govyn holya", "account.share": "Kevrenna profil @{name}", "account.show_reblogs": "Diskwedhes kenerthow a @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Tout} other {{counter} Tout}}", "account.unblock": "Anlettya @{name}", "account.unblock_domain": "Anlettya gorfarth {domain}", "account.unendorse": "Na wra diskwedhes yn profil", @@ -91,7 +88,6 @@ "confirmations.delete.message": "Owgh hwi sur a vynnes dilea'n post ma?", "confirmations.delete_list.confirm": "Dilea", "confirmations.delete_list.message": "Owgh hwi sur a vynnes dilea'n rol ma yn fast?", - "confirmations.domain_block.message": "Owgh hwi wir, wir sur a vynnes lettya'n {domain} dhien? Y'n brassa rann a gasow, boghes lettyansow medrys po tawheansow yw lowr ha gwell. Ny wrewgh hwi gweles dalgh a'n worfarth na yn py amserlin boblek pynag po yn agas gwarnyansow. Agas holyoryon an worfarth na a vydh diles.", "confirmations.logout.confirm": "Digelmi", "confirmations.logout.message": "Owgh hwi sur a vynnes digelmi?", "confirmations.mute.confirm": "Tawhe", @@ -242,7 +238,6 @@ "notification.follow_request": "{name} a bysis agas holya", "notification.mention": "{name} a wrug agas meneges", "notification.own_poll": "Agas sondyans a worfennas", - "notification.poll": "An sondyans may hwrussowgh ragleva a worfennas", "notification.reblog": "{name} a generthas agas post", "notification.status": "{name} a wrug nowydh postya", "notifications.clear": "Dilea gwarnyansow", diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json index d867034f01f..1e2d54396aa 100644 --- a/app/javascript/mastodon/locales/la.json +++ b/app/javascript/mastodon/locales/la.json @@ -14,12 +14,9 @@ "account.edit_profile": "Recolere notionem", "account.featured_tags.last_status_never": "Nulla contributa", "account.featured_tags.title": "Hashtag notātī {name}", - "account.followers_counter": "{count, plural, one {{counter} Sectator} other {{counter} Sectatores}}", - "account.following_counter": "{count, plural, one {{counter} Sequens} other {{counter} Sequentes}}", "account.moved_to": "{name} significavit eum suam rationem novam nunc esse:", "account.muted": "Confutatus", "account.requested_follow": "{name} postulavit ut te sequeretur", - "account.statuses_counter": "{count, plural, one {{counter} Nuntius} other {{counter} Nuntii}}", "account.unblock_short": "Solvere impedimentum", "account_note.placeholder": "Click to add a note", "admin.dashboard.retention.average": "Mediocritas", @@ -85,7 +82,6 @@ "empty_column.notification_requests": "Omnia clara sunt! Nihil hic est. Cum novās notificātiōnēs accipīs, hic secundum tua praecepta apparebunt.", "empty_column.notifications": "Nōn adhūc habēs ullo notificātiōnēs. Cum aliī tē interagunt, hīc videbis.", "explore.trending_statuses": "Contributa", - "filtered_notifications_banner.mentions": "{count, plural, one {mentiō} other {mentiōnēs}}", "firehose.all": "Omnis", "footer.about": "De", "generic.saved": "Servavit", @@ -153,7 +149,6 @@ "notification.moderation_warning.action_silence": "Ratio tua est limitata.", "notification.moderation_warning.action_suspend": "Ratio tua suspensus est.", "notification.own_poll": "Suffragium tuum terminatum est.", - "notification.poll": "Electione in quam suffragium dedisti finita est.", "notification.reblog": "{name} tuum nuntium amplificavit.", "notification.relationships_severance_event.account_suspension": "Admin ab {from} {target} suspendit, quod significat nōn iam posse tē novitātēs ab eīs accipere aut cum eīs interagere.", "notification.relationships_severance_event.domain_block": "Admin ab {from} {target} obsēcāvit, includēns {followersCount} ex tuīs sectātōribus et {followingCount, plural, one {# ratione} other {# rationibus}} quās sequeris.", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index bf676a6020f..96ca615e211 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -35,9 +35,7 @@ "account.follow_back": "Sige tamyen", "account.followers": "Suivantes", "account.followers.empty": "Por agora dingun no sige a este utilizador.", - "account.followers_counter": "{count, plural, one {{counter} suivante} other {{counter} suivantes}}", "account.following": "Sigiendo", - "account.following_counter": "{count, plural, other {Sigiendo a {counter}}}", "account.follows.empty": "Este utilizador ainda no sige a dingun.", "account.go_to_profile": "Va al profil", "account.hide_reblogs": "Eskonde repartajasyones de @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} tiene solisitado segirte", "account.share": "Partaja el profil de @{name}", "account.show_reblogs": "Amostra repartajasyones de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", "account.unblock": "Dezbloka a @{name}", "account.unblock_domain": "Dezbloka domeno {domain}", "account.unblock_short": "Dezbloka", @@ -167,16 +164,12 @@ "compose_form.spoiler_placeholder": "Avertensya de kontenido (opsyonal)", "confirmation_modal.cancel": "Anula", "confirmations.block.confirm": "Bloka", - "confirmations.cancel_follow_request.confirm": "Anula solisitud", - "confirmations.cancel_follow_request.message": "Estas siguro ke keres anular tu solisitud de segir a {name}?", "confirmations.delete.confirm": "Efasa", "confirmations.delete.message": "Estas siguro ke keres efasar esta publikasyon?", "confirmations.delete_list.confirm": "Efasa", "confirmations.delete_list.message": "Estas siguro ke keres permanentemente efasar esta lista?", "confirmations.discard_edit_media.confirm": "Anula", "confirmations.discard_edit_media.message": "Tienes trokamientos no guadrados en la deskripsion o vista previa. Keres efasarlos entanto?", - "confirmations.domain_block.confirm": "Bloka sirvidor", - "confirmations.domain_block.message": "Estas totalmente siguro ke keres blokar todo el domeno {domain}? En djeneral unos kuantos blokos o silensiamientos son sufisientes i preferavles. No veras kontenido de akel domeno en dinguna linya de tiempo publika ni ent tus avizos. Tus suivantes de akel domeno seran kitados.", "confirmations.edit.confirm": "Edita", "confirmations.edit.message": "Si edites agora, kitaras el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", "confirmations.logout.confirm": "Sal", @@ -285,7 +278,6 @@ "filter_modal.select_filter.subtitle": "Kulanea una kategoria egzistente o kriya mueva", "filter_modal.select_filter.title": "Filtra esta publikasyon", "filter_modal.title.status": "Filtra una publikasyon", - "filtered_notifications_banner.pending_requests": "Avizos de {count, plural, =0 {dingun} one {una persona} other {# personas}} ke puedes koneser", "filtered_notifications_banner.title": "Avizos filtrados", "firehose.all": "Todo", "firehose.local": "Este sirvidor", @@ -303,6 +295,7 @@ "follow_suggestions.hints.similar_to_recently_followed": "Este profil es similar a otros ke tienes segido resientemente.", "follow_suggestions.personalized_suggestion": "Sujestion personalizada", "follow_suggestions.popular_suggestion": "Sujestion populara", + "follow_suggestions.popular_suggestion_longer": "Popular en {domain}", "follow_suggestions.view_all": "Ve todos", "follow_suggestions.who_to_follow": "A ken segir", "followed_tags": "Etiketas segidas", @@ -399,6 +392,7 @@ "limited_account_hint.title": "Este profil fue eskondido por los moderadores de {domain}.", "link_preview.author": "Publikasyon de {name}", "link_preview.more_from_author": "Mas de {name}", + "link_preview.shares": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", "lists.account.add": "Adjusta a lista", "lists.account.remove": "Kita de lista", "lists.delete": "Efasa lista", @@ -451,12 +445,16 @@ "navigation_bar.security": "Segurita", "not_signed_in_indicator.not_signed_in": "Nesesitas konektarse kon tu kuento para akseder este rekurso.", "notification.admin.report": "{name} raporto {target}", + "notification.admin.report_statuses_other": "{name} raporto {target}", "notification.admin.sign_up": "{name} kriyo un konto", "notification.favourite": "A {name} le plaze tu publikasyon", "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_disable": "Tu kuento tiene sido inkapasitado.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algunas de tus publikasyones tienen sido markadas komo sensivles.", + "notification.moderation_warning.action_sensitive": "Tus publikasyones seran markadas komo sensivles dizde agora.", "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", @@ -637,8 +635,11 @@ "report_notification.attached_statuses": "{count, plural, one {{count} publikasyon} other {{count} publikasyones}} atadas", "report_notification.categories.legal": "Legal", "report_notification.categories.other": "Otros", + "report_notification.categories.other_sentence": "otros", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Violasyon de reglas", + "report_notification.categories.violation_sentence": "violasyon de reglas", "report_notification.open": "Avre raporto", "search.no_recent_searches": "No ay bushkedas resientes", "search.placeholder": "Bushka", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index b365d645896..2d3626ff9aa 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -1,18 +1,18 @@ { "about.blocks": "Prižiūrimi serveriai", - "about.contact": "Kontaktai:", - "about.disclaimer": "Mastodon – tai nemokama atvirojo kodo programinė įranga ir Mastodon gGmbH prekės ženklas.", + "about.contact": "Kontaktuoti:", + "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.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).", "about.domain_blocks.silenced.title": "Ribota", "about.domain_blocks.suspended.explanation": "Jokie duomenys iš šio serverio nebus apdorojami, saugomi ar keičiami, todėl bet kokia sąveika ar bendravimas su šio serverio naudotojais bus neįmanomas.", - "about.domain_blocks.suspended.title": "Uždrausta", + "about.domain_blocks.suspended.title": "Pristabdyta", "about.not_available": "Ši informacija nebuvo pateikta šiame serveryje.", - "about.powered_by": "Decentralizuota socialinė medija, kurią valdo {mastodon}", + "about.powered_by": "Decentralizuota socialinė medija, veikianti pagal „{mastodon}“", "about.rules": "Serverio taisyklės", "account.account_note_header": "Pastaba", - "account.add_or_remove_from_list": "Pridėti arba ištrinti iš sąrašų", + "account.add_or_remove_from_list": "Pridėti arba pašalinti iš sąrašų", "account.badges.bot": "Automatizuotas", "account.badges.group": "Grupė", "account.block": "Blokuoti @{name}", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Turinio įspėjimas (pasirinktinis)", "confirmation_modal.cancel": "Atšaukti", "confirmations.block.confirm": "Blokuoti", - "confirmations.cancel_follow_request.confirm": "Atšaukti prašymą", - "confirmations.cancel_follow_request.message": "Ar tikrai nori atšaukti savo prašymą sekti {name}?", "confirmations.delete.confirm": "Ištrinti", "confirmations.delete.message": "Ar tikrai nori ištrinti šį įrašą?", + "confirmations.delete.title": "Ištrinti įrašą?", "confirmations.delete_list.confirm": "Ištrinti", "confirmations.delete_list.message": "Ar tikrai nori visam laikui ištrinti šį sąrašą?", + "confirmations.delete_list.title": "Ištrinti sąrašą?", "confirmations.discard_edit_media.confirm": "Atmesti", "confirmations.discard_edit_media.message": "Turi neišsaugotų medijos aprašymo ar peržiūros pakeitimų, vis tiek juos atmesti?", - "confirmations.domain_block.confirm": "Blokuoti serverį", - "confirmations.domain_block.message": "Ar tikrai, tikrai nori užblokuoti visą {domain}? Daugeliu atvejų užtenka kelių tikslinių blokavimų arba nutildymų. Šio domeno turinio nematysi jokiose viešose laiko skalėse ar pranešimuose. Tavo sekėjai iš to domeno bus pašalinti.", "confirmations.edit.confirm": "Redaguoti", "confirmations.edit.message": "Redaguojant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?", + "confirmations.edit.title": "Perrašyti įrašą?", "confirmations.logout.confirm": "Atsijungti", "confirmations.logout.message": "Ar tikrai nori atsijungti?", + "confirmations.logout.title": "Atsijungti?", "confirmations.mute.confirm": "Nutildyti", "confirmations.redraft.confirm": "Ištrinti ir perrašyti", "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parašyti jį iš naujo? Bus prarastos mėgstamai ir pakėlimai, o atsakymai į originalinį įrašą taps liekamojais.", + "confirmations.redraft.title": "Ištrinti ir iš naujo parengti įrašą?", "confirmations.reply.confirm": "Atsakyti", "confirmations.reply.message": "Atsakant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?", + "confirmations.reply.title": "Perrašyti įrašą?", "confirmations.unfollow.confirm": "Nebesekti", "confirmations.unfollow.message": "Ar tikrai nori nebesekti {name}?", + "confirmations.unfollow.title": "Nebesekti naudotoją?", "conversation.delete": "Ištrinti pokalbį", "conversation.mark_as_read": "Žymėti kaip skaitytą", "conversation.open": "Peržiūrėti pokalbį", @@ -230,7 +233,7 @@ "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ų su tuo pačiu naudotojo vardu.", - "embed.instructions": "Įterpk šį įrašą į savo svetainę nukopijavus (-usi) toliau pateiktą kodą.", + "embed.instructions": "Įterpk šį įrašą į savo svetainę nukopijuojant toliau pateiktą kodą.", "embed.preview": "Štai kaip tai atrodys:", "emoji_button.activity": "Veikla", "emoji_button.clear": "Išvalyti", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.", "filter_modal.select_filter.title": "Filtruoti šį įrašą", "filter_modal.title.status": "Filtruoti įrašą", - "filtered_notifications_banner.mentions": "{count, plural, one {paminėjimas} few {paminėjimai} many {paminėjimo} other {paminėjimų}}", - "filtered_notifications_banner.pending_requests": "Pranešimai iš {count, plural, =0 {nė vieno} one {vienos žmogaus} few {# žmonių} many {# žmonių} other {# žmonių}}, kuriuos galbūt pažįsti", "filtered_notifications_banner.title": "Filtruojami pranešimai", "firehose.all": "Visi", "firehose.local": "Šis serveris", @@ -443,6 +444,8 @@ "mute_modal.title": "Nutildyti naudotoją?", "mute_modal.you_wont_see_mentions": "Nematysi įrašus, kuriuose jie paminimi.", "mute_modal.you_wont_see_posts": "Jie vis tiek gali matyti tavo įrašus, bet tu nematysi jų.", + "name_and_others": "{name} ir {count, plural, one {# kitas} few {# kiti} many {# kito} other {# kitų}}", + "name_and_others_with_link": "{name} ir {count, plural, one {# kitas} few {# kiti} many {# kito} other {# kitų}}", "navigation_bar.about": "Apie", "navigation_bar.advanced_interface": "Atidaryti išplėstinę žiniatinklio sąsają", "navigation_bar.blocks": "Užblokuoti naudotojai", @@ -470,6 +473,10 @@ "navigation_bar.security": "Apsauga", "not_signed_in_indicator.not_signed_in": "Norint pasiekti šį išteklį, reikia prisijungti.", "notification.admin.report": "{name} pranešė {target}", + "notification.admin.report_account": "{name} pranešė {count, plural, one {# įrašą} few {# įrašus} many {# įrašo} other {# įrašų}} iš {target} kategorijai {category}", + "notification.admin.report_account_other": "{name} pranešė {count, plural, one {# įrašą} few {# įrašus} many {# įrašo} other {# įrašų}} iš {target}", + "notification.admin.report_statuses": "{name} pranešė {target} kategorijai {category}", + "notification.admin.report_statuses_other": "{name} pranešė {target}", "notification.admin.sign_up": "{name} užsiregistravo", "notification.favourite": "{name} pamėgo tavo įrašą", "notification.follow": "{name} seka tave", @@ -485,7 +492,8 @@ "notification.moderation_warning.action_silence": "Tavo paskyra buvo apribota.", "notification.moderation_warning.action_suspend": "Tavo paskyra buvo sustabdyta.", "notification.own_poll": "Tavo apklausa baigėsi", - "notification.poll": "Apklausa, kurioje balsavai, pasibaigė", + "notification.poll": "Baigėsi apklausa, kurioje balsavai", + "notification.private_mention": "{name} privačiai paminėjo tave", "notification.reblog": "{name} pakėlė tavo įrašą", "notification.relationships_severance_event": "Prarasti sąryšiai su {name}", "notification.relationships_severance_event.learn_more": "Sužinoti daugiau", @@ -498,9 +506,12 @@ "notification_requests.title": "Filtruojami pranešimai", "notifications.clear": "Išvalyti pranešimus", "notifications.clear_confirmation": "Ar tikrai nori visam laikui išvalyti visus pranešimus?", + "notifications.clear_title": "Valyti pranešimus?", "notifications.column_settings.admin.report": "Naujos ataskaitos:", "notifications.column_settings.admin.sign_up": "Naujos registracijos:", "notifications.column_settings.alert": "Darbalaukio pranešimai", + "notifications.column_settings.beta.category": "Eksperimentinės funkcijos", + "notifications.column_settings.beta.grouping": "Grupuoti pranešimus", "notifications.column_settings.favourite": "Mėgstami:", "notifications.column_settings.filter_bar.advanced": "Rodyti visas kategorijas", "notifications.column_settings.filter_bar.category": "Spartaus filtro juosta", @@ -661,9 +672,13 @@ "report.unfollow_explanation": "Tu seki šią paskyrą. Jei nori nebematyti jų įrašų savo pagrindiniame sraute, nebesek jų.", "report_notification.attached_statuses": "Pridėti {count, plural, one {{count} įrašas} few {{count} įrašai} many {{count} įrašo} other {{count} įrašų}}", "report_notification.categories.legal": "Teisinės", + "report_notification.categories.legal_sentence": "nelegalus turinys", "report_notification.categories.other": "Kita", + "report_notification.categories.other_sentence": "kita", "report_notification.categories.spam": "Šlamštas", + "report_notification.categories.spam_sentence": "šlamštas", "report_notification.categories.violation": "Taisyklės pažeidimas", + "report_notification.categories.violation_sentence": "taisyklės pažeidimas", "report_notification.open": "Atidaryti ataskaitą", "search.no_recent_searches": "Nėra naujausių paieškų.", "search.placeholder": "Paieška", @@ -696,7 +711,7 @@ "sign_in_banner.create_account": "Sukurti paskyrą", "sign_in_banner.follow_anyone": "Sek bet kurį asmenį visoje fediverse ir žiūrėk viską chronologine tvarka. Jokių algoritmų, reklamų ar paspaudimų.", "sign_in_banner.mastodon_is": "„Mastodon“ – tai geriausias būdas sekti, kas vyksta.", - "sign_in_banner.sign_in": "Prisijungimas", + "sign_in_banner.sign_in": "Prisijungti", "sign_in_banner.sso_redirect": "Prisijungti arba užsiregistruoti", "status.admin_account": "Atidaryti prižiūrėjimo sąsają @{name}", "status.admin_domain": "Atidaryti prižiūrėjimo sąsają {domain}", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 13ceec21c82..86ed6262a93 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -35,9 +35,8 @@ "account.follow_back": "Sekot atpakaļ", "account.followers": "Sekotāji", "account.followers.empty": "Šim lietotājam vēl nav sekotāju.", - "account.followers_counter": "{count, plural, zero {{counter} sekotāju} one {{counter} sekotājs} other {{counter} sekotāji}}", + "account.followers_counter": "{count, plural, zero {{count} sekotāju} one {{count} sekotājs} other {{count} sekotāji}}", "account.following": "Seko", - "account.following_counter": "{count, plural, zero{{counter} sekojamo} one {{counter} sekojamais} other {{counter} sekojamie}}", "account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.", "account.go_to_profile": "Doties uz profilu", "account.hide_reblogs": "Paslēpt @{name} pastiprinātos ierakstus", @@ -63,7 +62,6 @@ "account.requested_follow": "{name} nosūtīja Tev sekošanas pieprasījumu", "account.share": "Dalīties ar @{name} profilu", "account.show_reblogs": "Parādīt @{name} pastiprinātos ierakstus", - "account.statuses_counter": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}}", "account.unblock": "Atbloķēt @{name}", "account.unblock_domain": "Atbloķēt domēnu {domain}", "account.unblock_short": "Atbloķēt", @@ -165,15 +163,12 @@ "compose_form.spoiler_placeholder": "Satura brīdinājums (pēc izvēles)", "confirmation_modal.cancel": "Atcelt", "confirmations.block.confirm": "Bloķēt", - "confirmations.cancel_follow_request.confirm": "Atsaukt pieprasījumu", - "confirmations.cancel_follow_request.message": "Vai tiešām vēlies atsaukt pieprasījumu sekot {name}?", "confirmations.delete.confirm": "Dzēst", "confirmations.delete.message": "Vai tiešām vēlies dzēst šo ierakstu?", "confirmations.delete_list.confirm": "Dzēst", "confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?", "confirmations.discard_edit_media.confirm": "Atmest", "confirmations.discard_edit_media.message": "Ir nesaglabātas izmaiņas informācijas nesēja aprakstā vai priekšskatījumā. Vēlies tās atmest tik un tā?", - "confirmations.domain_block.message": "Vai tu tiešām vēlies bloķēt visu domēnu {domain}? Parasti pietiek, ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.", "confirmations.edit.confirm": "Labot", "confirmations.edit.message": "Labošana pārrakstīs ziņojumu, kas šobrīd tiek sastādīts. Vai tiešām turpināt?", "confirmations.logout.confirm": "Iziet", @@ -273,7 +268,6 @@ "filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu", "filter_modal.select_filter.title": "Filtrēt šo ziņu", "filter_modal.title.status": "Filtrēt ziņu", - "filtered_notifications_banner.pending_requests": "Paziņojumi no {count, plural, =0 {neviena} one {viena cilvēka} other {# cilvēkiem}}, ko Tu varētu zināt", "firehose.all": "Visi", "firehose.local": "Šis serveris", "firehose.remote": "Citi serveri", @@ -315,9 +309,9 @@ "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", - "home.pending_critical_update.body": "Lūdzu, pēc iespējas ātrāk atjaunini savu Mastodon serveri!", + "home.pending_critical_update.body": "Lūgums pēc iespējas drīzāk atjaunināt savu Mastodon serveri.", "home.pending_critical_update.link": "Skatīt jauninājumus", - "home.pending_critical_update.title": "Pieejams kritisks drošības jauninājums!", + "home.pending_critical_update.title": "Ir pieejams būtisks drošības atjauninājums.", "home.show_announcements": "Rādīt paziņojumus", "interaction_modal.description.favourite": "Ar Mastodon kontu tu vari pievienot šo ziņu izlasei, lai informētu autoru, ka to novērtē, un saglabātu to vēlākai lasīšanai.", "interaction_modal.description.follow": "Ar Mastodon kontu Tu vari sekot {name}, lai saņemtu lietotāja ierakstus savā mājas plūsmā.", @@ -442,7 +436,6 @@ "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", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index d8a470ed47e..b1f3b9fab94 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -38,7 +38,6 @@ "account.requested": "Се чека одобрување. Кликни за да одкажиш барање за следење", "account.share": "Сподели @{name} профил", "account.show_reblogs": "Прикажи бустови од @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "Одблокирај @{name}", "account.unblock_domain": "Прикажи {domain}", "account.unendorse": "Не прикажувај на профил", @@ -85,7 +84,6 @@ "confirmations.delete.message": "Сигурни сте дека го бришите статусот?", "confirmations.delete_list.confirm": "Избриши", "confirmations.delete_list.message": "Дали сте сигурни дека сакате да го избришете списоков?", - "confirmations.domain_block.message": "Дали скроз сте сигурни дека ќе блокирате сѐ од {domain}? Во повеќето случаеви неколку таргетирани блокирања или заќутувања се доволни и предложени. Нема да ја видите содржината од тој домеин во никој јавен времеплов или вашите нотификации. Вашите следбеници од тој домеин ќе бидат остранети.", "confirmations.logout.confirm": "Одјави се", "confirmations.logout.message": "Дали сте сигурни дека сакате да се одјавите?", "confirmations.mute.confirm": "Заќути", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 8fb4e818db2..d9caccef346 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -22,9 +22,7 @@ "account.follow": "പിന്തുടരുക", "account.followers": "പിന്തുടരുന്നവർ", "account.followers.empty": "ഈ ഉപയോക്താവിനെ ആരും ഇതുവരെ പിന്തുടരുന്നില്ല.", - "account.followers_counter": "{count, plural, one {{counter} പിന്തുടരുന്നവർ} other {{counter} പിന്തുടരുന്നവർ}}", "account.following": "പിന്തുടരുന്നു", - "account.following_counter": "{count, plural, one {{counter} പിന്തുടരുന്നു} other {{counter} പിന്തുടരുന്നു}}", "account.follows.empty": "ഈ ഉപയോക്താവ് ആരേയും ഇതുവരെ പിന്തുടരുന്നില്ല.", "account.go_to_profile": "പ്രൊഫൈലിലേക്ക് പോകാം", "account.hide_reblogs": "@{name} ബൂസ്റ്റ് ചെയ്തവ മറയ്കുക", @@ -42,7 +40,6 @@ "account.requested": "അനുവാദത്തിനായി കാത്തിരിക്കുന്നു. പിന്തുടരാനുള്ള അപേക്ഷ റദ്ദാക്കുവാൻ ഞെക്കുക", "account.share": "@{name} ന്റെ പ്രൊഫൈൽ പങ്കിടുക", "account.show_reblogs": "@{name} ൽ നിന്നുള്ള ബൂസ്റ്റുകൾ കാണിക്കുക", - "account.statuses_counter": "{count, plural, one {{counter} ടൂട്ട്} other {{counter} ടൂട്ടുകൾ}}", "account.unblock": "@{name} തടഞ്ഞത് മാറ്റുക", "account.unblock_domain": "{domain} എന്ന മേഖല വെളിപ്പെടുത്തുക", "account.unblock_short": "അൺബ്ലോക്കു ചെയ്യുക", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index c07294d90a7..2757b96f940 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -35,9 +35,7 @@ "account.follow_back": "आपणही अनुसरण करा", "account.followers": "अनुयायी", "account.followers.empty": "ह्या वापरकर्त्याचा आतापर्यंत कोणी अनुयायी नाही.", - "account.followers_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.following": "अनुसरण", - "account.following_counter": "{count, plural, one {{counter} following} other {{counter} following}}", "account.follows.empty": "हा वापरकर्ता अजूनपर्यंत कोणाचा अनुयायी नाही.", "account.go_to_profile": "प्रोफाइल वर जा", "account.hide_reblogs": "@{name} पासून सर्व बूस्ट लपवा", @@ -59,7 +57,6 @@ "account.requested_follow": "{name} ने आपल्याला फॉलो करण्याची रिक्वेस्ट केली आहे", "account.share": "@{name} चे प्रोफाइल शेअर करा", "account.show_reblogs": "{name}चे सर्व बुस्ट्स दाखवा", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "@{name} ला ब्लॉक करा", "account.unblock_domain": "उघड करा {domain}", "account.unblock_short": "अनब्लॉक करा", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 3d7992faf7d..17af770b9b5 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -35,9 +35,7 @@ "account.follow_back": "Ikut balik", "account.followers": "Pengikut", "account.followers.empty": "Belum ada yang mengikuti pengguna ini.", - "account.followers_counter": "{count, plural, one {{counter} Pengikut} other {{counter} Pengikut}}", "account.following": "Mengikuti", - "account.following_counter": "{count, plural, one {{counter} Diikuti} other {{counter} Diikuti}}", "account.follows.empty": "Pengguna ini belum mengikuti sesiapa.", "account.go_to_profile": "Pergi ke profil", "account.hide_reblogs": "Sembunyikan galakan daripada @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} has requested to follow you", "account.share": "Kongsi profil @{name}", "account.show_reblogs": "Tunjukkan galakan daripada @{name}", - "account.statuses_counter": "{count, plural, other {{counter} kiriman}}", "account.unblock": "Nyahsekat @{name}", "account.unblock_domain": "Nyahsekat domain {domain}", "account.unblock_short": "Nyahsekat", @@ -161,15 +158,12 @@ "compose_form.spoiler_placeholder": "Amaran kandungan (pilihan)", "confirmation_modal.cancel": "Batal", "confirmations.block.confirm": "Sekat", - "confirmations.cancel_follow_request.confirm": "Tarik balik permintaan", - "confirmations.cancel_follow_request.message": "Adakah anda pasti ingin menarik balik permintaan anda untuk mengikut {name}?", "confirmations.delete.confirm": "Padam", "confirmations.delete.message": "Adakah anda pasti anda ingin memadam hantaran ini?", "confirmations.delete_list.confirm": "Padam", "confirmations.delete_list.message": "Adakah anda pasti anda ingin memadam senarai ini secara kekal?", "confirmations.discard_edit_media.confirm": "Singkir", "confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan pada penerangan atau pratonton media. Anda ingin membuangnya?", - "confirmations.domain_block.message": "Adakah anda betul-betul, sungguh-sungguh pasti anda ingin menyekat keseluruhan {domain}? Selalunya, beberapa sekatan atau pembisuan tersasar sudah memadai dan lebih diutamakan. Anda tidak akan nampak kandungan daripada domain tersebut di mana-mana garis masa awam mahupun pemberitahuan anda. Pengikut anda daripada domain tersebut juga akan dibuang.", "confirmations.edit.confirm": "Sunting", "confirmations.edit.message": "Mengedit sekarang akan menimpa mesej yang sedang anda karang. Adakah anda pasti mahu meneruskan?", "confirmations.logout.confirm": "Log keluar", @@ -424,7 +418,6 @@ "notification.follow_request": "{name} meminta untuk mengikuti anda", "notification.mention": "{name} menyebut anda", "notification.own_poll": "Undian anda telah tamat", - "notification.poll": "Sebuah undian yang anda undi telah tamat", "notification.reblog": "{name} menggalak hantaran anda", "notification.status": "{name} baru sahaja mengirim hantaran", "notification.update": "{name} menyunting hantaran", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index e3287f3f327..cb08d76bd30 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -34,9 +34,7 @@ "account.follow": "စောင့်ကြည့်", "account.followers": "စောင့်ကြည့်သူများ", "account.followers.empty": "ဤသူကို စောင့်ကြည့်သူ မရှိသေးပါ။", - "account.followers_counter": "{count, plural, one {စောင့်ကြည့်သူ {counter}} other {စောင့်ကြည့်သူများ {counter}}}", "account.following": "စောင့်ကြည့်နေသည်", - "account.following_counter": "{count, plural, one {စောင့်ကြည့်ထားသူ {counter}} other {စောင့်ကြည့်ထားသူများ {counter}}}", "account.follows.empty": "ဤသူသည် မည်သူ့ကိုမျှ စောင့်ကြည့်ခြင်း မရှိသေးပါ။", "account.go_to_profile": "ပရိုဖိုင်းသို့ သွားရန်", "account.hide_reblogs": "@{name} ၏ မျှဝေမှုကို ဝှက်ထားရန်", @@ -61,7 +59,6 @@ "account.requested_follow": "{name} က သင့်ကို စောင့်ကြည့်ရန် တောင်းဆိုထားသည်", "account.share": "{name}၏ပရိုဖိုင်ကိုမျှဝေပါ", "account.show_reblogs": "@{name} မှ မျှ၀ေမှုများကို ပြပါ\n", - "account.statuses_counter": "{count, plural, one {{counter} ပိုစ့်များ} other {{counter} ပိုစ့်များ}}", "account.unblock": "{name} ကို ဘလော့ဖြုတ်မည်", "account.unblock_domain": " {domain} ဒိုမိန်းကိုပြန်ဖွင့်မည်", "account.unblock_short": "ဘလော့ဖြုတ်ရန်", @@ -151,15 +148,12 @@ "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "ပယ်ဖျက်မည်", "confirmations.block.confirm": "ဘလော့မည်", - "confirmations.cancel_follow_request.confirm": "ပန်ကြားချက်ကို ပယ်ဖျက်မည်", - "confirmations.cancel_follow_request.message": "{name} ကို စောင့်ကြည့်ခြင်းအားပယ်ဖျက်ရန် သေချာပါသလား။", "confirmations.delete.confirm": "ဖျက်မည်", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "ဖျက်မည်", "confirmations.delete_list.message": "ဖျက်ရန် သေချာပါသလား?", "confirmations.discard_edit_media.confirm": "ဖယ်ထုတ်ပါ", "confirmations.discard_edit_media.message": "သင်သည် မီဒီယာဖော်ပြချက် သို့မဟုတ် အစမ်းကြည့်ရှုခြင်းတွင် မသိမ်းဆည်းရသေးသော အပြောင်းအလဲများရှိသည်။ မည်သို့ပင်ဖြစ်စေ ဖျက်ပစ်မည်လား။", - "confirmations.domain_block.message": "{domain} တစ်ခုလုံးကို ဘလော့လုပ်ရန် တကယ် သေချာပါသလား? များသောအားဖြင့် အနည်းစုကို ပစ်မှတ်ထား ဘလော့လုပ်ခြင်းသည် လုံလောက်ပါသည်။ ထို ဒိုမိန်းမှ အကြောင်းအရာ တစ်ခုမှ မြင်ရမည်မဟုတ်သည့်အပြင် ထို ဒိုမိန်းတွင်ရှိသော သင်၏ စောင့်ကြည့်သူများပါ ဖယ်ရှားပစ်မည်ဖြစ်သည်။", "confirmations.edit.confirm": "ပြင်ရန်", "confirmations.edit.message": "ယခုပြင်ဆင်ခြင်းတွင် သင်လက်ရှိမက်ဆေ့ချ်ကို ဖျက်ပစ်ပြီး အသစ်ရေးပါမည်။ ရှေ့ဆက်လိုသည်မှာ သေချာပါသလား။", "confirmations.logout.confirm": "အကောင့်မှထွက်မည်", @@ -405,7 +399,6 @@ "notification.follow_request": "{name} က သင့်ကို စောင့်ကြည့်ရန် တောင်းဆိုထားသည်", "notification.mention": "{name} က သင့်ကို ဖော်ပြခဲ့သည်", "notification.own_poll": "စစ်တမ်းကောက်မှု ပြီးဆုံးပါပြီ", - "notification.poll": "သင်ပါဝင်ခဲ့သော စစ်တမ်းပြီးပါပြီ", "notification.reblog": "{name} boosted your status", "notification.status": "{name} က အခုလေးတင် ပို့စ်တင်လိုက်ပါပြီ", "notification.update": "{name} က ပို့စ်တစ်ခုကို ပြင်ဆင်ခဲ့သည်", diff --git a/app/javascript/mastodon/locales/ne.json b/app/javascript/mastodon/locales/ne.json index 500261a34be..ca23a1f7814 100644 --- a/app/javascript/mastodon/locales/ne.json +++ b/app/javascript/mastodon/locales/ne.json @@ -39,7 +39,6 @@ "account.requested_follow": "{name} ले तपाईंलाई फलो गर्न अनुरोध गर्नुभएको छ", "account.share": "@{name} को प्रोफाइल सेयर गर्नुहोस्", "account.show_reblogs": "@{name} को बूस्टहरू देखाउनुहोस्", - "account.statuses_counter": "{count, plural, one {{counter} पोस्ट} other {{counter} पोस्टहरू}}", "account.unblock": "@{name} लाई अनब्लक गर्नुहोस्", "account.unblock_domain": "{domain} डोमेनलाई अनब्लक गर्नुहोस्", "account.unblock_short": "अनब्लक गर्नुहोस्", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 8246d8dfd2d..dd5a931b6fc 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Inhoudswaarschuwing (optioneel)", "confirmation_modal.cancel": "Annuleren", "confirmations.block.confirm": "Blokkeren", - "confirmations.cancel_follow_request.confirm": "Verzoek annuleren", - "confirmations.cancel_follow_request.message": "Weet je zeker dat je jouw verzoek om {name} te volgen wilt annuleren?", "confirmations.delete.confirm": "Verwijderen", "confirmations.delete.message": "Weet je het zeker dat je dit bericht wilt verwijderen?", + "confirmations.delete.title": "Bericht verwijderen?", "confirmations.delete_list.confirm": "Verwijderen", "confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?", + "confirmations.delete_list.title": "Lijst verwijderen?", "confirmations.discard_edit_media.confirm": "Weggooien", "confirmations.discard_edit_media.message": "Je hebt niet-opgeslagen wijzigingen in de mediabeschrijving of voorvertonning, wil je deze toch weggooien?", - "confirmations.domain_block.confirm": "Server blokkeren", - "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt blokkeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je ziet geen berichten van deze server meer op openbare tijdlijnen of in jouw meldingen. Jouw volgers van deze server worden verwijderd.", "confirmations.edit.confirm": "Bewerken", "confirmations.edit.message": "Door nu te reageren overschrijf je het bericht dat je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", + "confirmations.edit.title": "Bericht overschrijven?", "confirmations.logout.confirm": "Uitloggen", "confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?", + "confirmations.logout.title": "Uitloggen?", "confirmations.mute.confirm": "Negeren", "confirmations.redraft.confirm": "Verwijderen en herschrijven", "confirmations.redraft.message": "Weet je zeker dat je dit bericht wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op het originele bericht raak je kwijt.", + "confirmations.redraft.title": "Bericht verwijderen en herschrijven?", "confirmations.reply.confirm": "Reageren", "confirmations.reply.message": "Door nu te reageren overschrijf je het bericht dat je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", + "confirmations.reply.title": "Bericht overschrijven?", "confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", + "confirmations.unfollow.title": "Gebruiker ontvolgen?", "conversation.delete": "Gesprek verwijderen", "conversation.mark_as_read": "Als gelezen markeren", "conversation.open": "Gesprek tonen", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Een bestaande categorie gebruiken of een nieuwe aanmaken", "filter_modal.select_filter.title": "Dit bericht filteren", "filter_modal.title.status": "Een bericht filteren", - "filtered_notifications_banner.mentions": "{count, plural, one {vermelding} other {vermeldingen}}", - "filtered_notifications_banner.pending_requests": "Meldingen van {count, plural, =0 {niemand} one {één persoon} other {# mensen}} die je misschien kent", + "filtered_notifications_banner.pending_requests": "Van {count, plural, =0 {niemand} one {een persoon} other {# personen}} die je mogelijk kent", "filtered_notifications_banner.title": "Gefilterde meldingen", "firehose.all": "Alles", "firehose.local": "Deze server", @@ -443,6 +445,8 @@ "mute_modal.title": "Gebruiker negeren?", "mute_modal.you_wont_see_mentions": "Je ziet geen berichten meer die dit account vermelden.", "mute_modal.you_wont_see_posts": "De persoon kan nog steeds jouw berichten zien, maar diens berichten zie je niet meer.", + "name_and_others": "{name} en {count, plural, one {# ander} other {# anderen}}", + "name_and_others_with_link": "{name} en {count, plural, one {# ander} other {# anderen}}", "navigation_bar.about": "Over", "navigation_bar.advanced_interface": "In geavanceerde webinterface openen", "navigation_bar.blocks": "Geblokkeerde gebruikers", @@ -470,6 +474,10 @@ "navigation_bar.security": "Beveiliging", "not_signed_in_indicator.not_signed_in": "Je moet inloggen om toegang tot deze informatie te krijgen.", "notification.admin.report": "{name} heeft {target} geapporteerd", + "notification.admin.report_account": "{name} rapporteerde {count, plural, one {een bericht} other {# berichten}} van {target} voor {category}", + "notification.admin.report_account_other": "{name} rapporteerde {count, plural, one {een bericht} other {# berichten}} van {target}", + "notification.admin.report_statuses": "{name} rapporteerde {target} voor {category}", + "notification.admin.report_statuses_other": "{name} rapporteerde {target}", "notification.admin.sign_up": "{name} heeft zich geregistreerd", "notification.favourite": "{name} markeerde jouw bericht als favoriet", "notification.follow": "{name} volgt jou nu", @@ -486,6 +494,7 @@ "notification.moderation_warning.action_suspend": "Jouw account is opgeschort.", "notification.own_poll": "Jouw peiling is beëindigd", "notification.poll": "Een peiling waaraan jij hebt meegedaan is beëindigd", + "notification.private_mention": "{name} heeft je een privébericht gestuurd", "notification.reblog": "{name} boostte jouw bericht", "notification.relationships_severance_event": "Verloren verbindingen met {name}", "notification.relationships_severance_event.account_suspension": "Een beheerder van {from} heeft {target} geschorst, wat betekent dat je geen updates meer van hen kunt ontvangen of met hen kunt communiceren.", @@ -496,13 +505,18 @@ "notification.update": "{name} heeft een bericht bewerkt", "notification_requests.accept": "Accepteren", "notification_requests.dismiss": "Afwijzen", + "notification_requests.maximize": "Maximaliseer", + "notification_requests.minimize_banner": "Banner met gefilterde meldingen minimaliseren", "notification_requests.notifications_from": "Meldingen van {name}", "notification_requests.title": "Gefilterde meldingen", "notifications.clear": "Meldingen verwijderen", "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?", + "notifications.clear_title": "Meldingen verwijderen?", "notifications.column_settings.admin.report": "Nieuwe rapportages:", "notifications.column_settings.admin.sign_up": "Nieuwe registraties:", "notifications.column_settings.alert": "Desktopmeldingen", + "notifications.column_settings.beta.category": "Experimentele functies", + "notifications.column_settings.beta.grouping": "Gegroepeerde meldingen", "notifications.column_settings.favourite": "Favorieten:", "notifications.column_settings.filter_bar.advanced": "Alle categorieën tonen", "notifications.column_settings.filter_bar.category": "Snelle filterbalk", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Je volgt dit account. Om diens berichten niet meer op jouw starttijdlijn te zien, kun je diegene ontvolgen.", "report_notification.attached_statuses": "{count, plural, one {{count} bericht} other {{count} berichten}} toegevoegd", "report_notification.categories.legal": "Juridisch", + "report_notification.categories.legal_sentence": "illegale inhoud", "report_notification.categories.other": "Overig", + "report_notification.categories.other_sentence": "overig", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Overtreden regel(s)", + "report_notification.categories.violation_sentence": "serverregel overtreden", "report_notification.open": "Rapportage openen", "search.no_recent_searches": "Geen recente zoekopdrachten", "search.placeholder": "Zoeken", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 93b44f29a13..26973f830f0 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -35,9 +35,9 @@ "account.follow_back": "Fylg tilbake", "account.followers": "Fylgjarar", "account.followers.empty": "Ingen fylgjer denne brukaren enno.", - "account.followers_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}", + "account.followers_counter": "{count, plural, one {{counter} følgjar} other {{counter} følgjarar}}", "account.following": "Fylgjer", - "account.following_counter": "{count, plural, one {Fylgjer {counter}} other {Fylgjer {counter}}}", + "account.following_counter": "{count, plural, one {{counter} følgjer} other {{counter} følgjer}}", "account.follows.empty": "Denne brukaren fylgjer ikkje nokon enno.", "account.go_to_profile": "Gå til profil", "account.hide_reblogs": "Gøym framhevingar frå @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} har bedt om å få fylgja deg", "account.share": "Del @{name} sin profil", "account.show_reblogs": "Vis framhevingar frå @{name}", - "account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tut}}", + "account.statuses_counter": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}", "account.unblock": "Stopp blokkering av @{name}", "account.unblock_domain": "Stopp blokkering av domenet {domain}", "account.unblock_short": "Stopp blokkering", @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Innhaldsåtvaring (valfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.confirm": "Blokker", - "confirmations.cancel_follow_request.confirm": "Trekk attende førespurnad", - "confirmations.cancel_follow_request.message": "Er du sikker på at du vil trekkje attende førespurnaden din om å fylgje {name}?", "confirmations.delete.confirm": "Slett", "confirmations.delete.message": "Er du sikker på at du vil sletta denne statusen?", "confirmations.delete_list.confirm": "Slett", "confirmations.delete_list.message": "Er du sikker på at du vil sletta denne lista for alltid?", "confirmations.discard_edit_media.confirm": "Forkast", "confirmations.discard_edit_media.message": "Du har ulagra endringar i mediaskildringa eller førehandsvisinga. Vil du forkasta dei likevel?", - "confirmations.domain_block.confirm": "Blokker tenaren", - "confirmations.domain_block.message": "Er du heilt, heilt sikker på at du vil skjula heile {domain}? I dei fleste tilfelle er det godt nok og føretrekt med nokre få målretta blokkeringar eller dempingar. Du kjem ikkje til å sjå innhald frå domenet i fødererte tidsliner eller i varsla dine. Fylgjarane dine frå domenet vert fjerna.", "confirmations.edit.confirm": "Rediger", "confirmations.edit.message": "Å redigera no vil overskriva den meldinga du er i ferd med å skriva. Er du sikker på at du vil halda fram?", "confirmations.logout.confirm": "Logg ut", @@ -297,8 +293,7 @@ "filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny", "filter_modal.select_filter.title": "Filtrer dette innlegget", "filter_modal.title.status": "Filtrer eit innlegg", - "filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}", - "filtered_notifications_banner.pending_requests": "Varsel frå {count, plural, =0 {ingen} one {ein person} other {# folk}} du kanskje kjenner", + "filtered_notifications_banner.pending_requests": "Frå {count, plural, =0 {ingen} one {éin person} other {# personar}} du kanskje kjenner", "filtered_notifications_banner.title": "Filtrerte varslingar", "firehose.all": "Alle", "firehose.local": "Denne tenaren", @@ -485,7 +480,6 @@ "notification.moderation_warning.action_silence": "Kontoen din har blitt avgrensa.", "notification.moderation_warning.action_suspend": "Kontoen din har blitt suspendert.", "notification.own_poll": "Rundspørjinga di er ferdig", - "notification.poll": "Ei rundspørjing du har røysta i er ferdig", "notification.reblog": "{name} framheva innlegget ditt", "notification.relationships_severance_event": "Tapte samband med {name}", "notification.relationships_severance_event.account_suspension": "Ein administrator på {from} har utvist {target}, som tyder at du ikkje lenger får oppdateringar frå dei eller kan samhandla med dei.", @@ -696,8 +690,11 @@ "server_banner.about_active_users": "Personar som har brukt denne tenaren dei siste 30 dagane (Månadlege Aktive Brukarar)", "server_banner.active_users": "aktive brukarar", "server_banner.administered_by": "Administrert av:", + "server_banner.is_one_of_many": "{domain} er ein av dei mange uavhengige Mastodon-serverane du kan bruke til å delta i Fødiverset.", "server_banner.server_stats": "Tenarstatistikk:", "sign_in_banner.create_account": "Opprett konto", + "sign_in_banner.follow_anyone": "Følg kven som helst på tvers av Fødiverset og sjå alt i kronologisk rekkjefølgje. Ingen algoritmar, reklamar eller clickbait i sikte.", + "sign_in_banner.mastodon_is": "Mastodon er den beste måten å følgje med på det som skjer.", "sign_in_banner.sign_in": "Logg inn", "sign_in_banner.sso_redirect": "Logg inn eller registrer deg", "status.admin_account": "Opne moderasjonsgrensesnitt for @{name}", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 213ba8af12b..0f9e0d5a79c 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -35,9 +35,7 @@ "account.follow_back": "Følg tilbake", "account.followers": "Følgere", "account.followers.empty": "Ingen følger denne brukeren ennå.", - "account.followers_counter": "{count, plural, one {{counter} følger} other {{counter} følgere}}", "account.following": "Følger", - "account.following_counter": "{count, plural, one {{counter} som følges} other {{counter} som følges}}", "account.follows.empty": "Denne brukeren følger ikke noen enda.", "account.go_to_profile": "Gå til profil", "account.hide_reblogs": "Skjul fremhevinger fra @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} har bedt om å få følge deg", "account.share": "Del @{name} sin profil", "account.show_reblogs": "Vis fremhevinger fra @{name}", - "account.statuses_counter": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}", "account.unblock": "Opphev blokkering av @{name}", "account.unblock_domain": "Opphev blokkering av {domain}", "account.unblock_short": "Opphev blokkering", @@ -161,15 +158,12 @@ "compose_form.spoiler_placeholder": "Innholdsadvarsel (valgfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.confirm": "Blokkèr", - "confirmations.cancel_follow_request.confirm": "Trekk tilbake forespørsel", - "confirmations.cancel_follow_request.message": "Er du sikker på at du vil trekke tilbake forespørselen din for å følge {name}?", "confirmations.delete.confirm": "Slett", "confirmations.delete.message": "Er du sikker på at du vil slette dette innlegget?", "confirmations.delete_list.confirm": "Slett", "confirmations.delete_list.message": "Er du sikker på at du vil slette denne listen permanent?", "confirmations.discard_edit_media.confirm": "Forkast", "confirmations.discard_edit_media.message": "Du har ulagrede endringer i mediebeskrivelsen eller i forhåndsvisning, forkast dem likevel?", - "confirmations.domain_block.message": "Er du sikker på at du vil skjule hele domenet {domain}? I de fleste tilfeller er det bedre med målrettet blokkering eller demping.", "confirmations.edit.confirm": "Redigér", "confirmations.edit.message": "Å redigere nå vil overskrive meldingen du skriver for øyeblikket. Er du sikker på at du vil fortsette?", "confirmations.logout.confirm": "Logg ut", @@ -417,7 +411,6 @@ "notification.follow_request": "{name} har bedt om å få følge deg", "notification.mention": "{name} nevnte deg", "notification.own_poll": "Avstemningen din er ferdig", - "notification.poll": "En avstemning du stemte på har avsluttet", "notification.reblog": "{name} fremhevet ditt innlegg", "notification.status": "{name} la nettopp ut", "notification.update": "{name} redigerte et innlegg", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index d8e11415880..00701cbdf9b 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -32,9 +32,7 @@ "account.follow_back": "Sègre en retorn", "account.followers": "Seguidors", "account.followers.empty": "Degun sèc pas aqueste utilizaire pel moment.", - "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}", "account.following": "Abonat", - "account.following_counter": "{count, plural, one {{counter} Abonaments} other {{counter} Abonaments}}", "account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.", "account.go_to_profile": "Anar al perfil", "account.hide_reblogs": "Rescondre los partatges de @{name}", @@ -60,7 +58,6 @@ "account.requested_follow": "{name} a demandat a vos sègre", "account.share": "Partejar lo perfil a @{name}", "account.show_reblogs": "Mostrar los partatges de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}", "account.unblock": "Desblocar @{name}", "account.unblock_domain": "Desblocar {domain}", "account.unblock_short": "Desblocat", @@ -138,14 +135,11 @@ "compose_form.spoiler.unmarked": "Lo tèxte es pas rescondut", "confirmation_modal.cancel": "Anullar", "confirmations.block.confirm": "Blocar", - "confirmations.cancel_follow_request.confirm": "Retirar la demandar", - "confirmations.cancel_follow_request.message": "Volètz vertadièrament retirar la demanda de seguiment de {name} ?", "confirmations.delete.confirm": "Escafar", "confirmations.delete.message": "Volètz vertadièrament escafar l’estatut ?", "confirmations.delete_list.confirm": "Suprimir", "confirmations.delete_list.message": "Volètz vertadièrament suprimir aquesta lista per totjorn ?", "confirmations.discard_edit_media.confirm": "Ignorar", - "confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.\nVeiretz pas cap de contengut d’aquel domeni dins cap de flux public o dins vòstras notificacions. Vòstres seguidors d’aquel domeni seràn levats.", "confirmations.edit.confirm": "Modificar", "confirmations.logout.confirm": "Desconnexion", "confirmations.logout.message": "Volètz vertadièrament vos desconnectar ?", @@ -360,7 +354,6 @@ "notification.follow_request": "{name} a demandat a vos sègre", "notification.mention": "{name} vos a mencionat", "notification.own_poll": "Vòstre sondatge es acabat", - "notification.poll": "Avètz participat a un sondatge que ven de s’acabar", "notification.reblog": "{name} a partejat vòstre estatut", "notification.status": "{name} ven de publicar", "notification.update": "{name} modiquè sa publicacion", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 46924d737de..feca55fad45 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -25,12 +25,13 @@ "account.follow_back": "ਵਾਪਸ ਫਾਲ਼ੋ ਕਰੋ", "account.followers": "ਫ਼ਾਲੋਅਰ", "account.followers.empty": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਹਾਲੇ ਕੋਈ ਫ਼ਾਲੋ ਨਹੀਂ ਕਰਦਾ ਹੈ।", - "account.followers_counter": "{count, plural, one {{counter} ਫ਼ਾਲੋਅਰ} other {{counter} ਫ਼ਾਲੋਅਰ}}", "account.following": "ਫ਼ਾਲੋ ਕੀਤਾ", - "account.following_counter": "{count, plural, one {{counter} ਨੂੰ ਫ਼ਾਲੋ} other {{counter} ਨੂੰ ਫ਼ਾਲੋ}}", "account.follows.empty": "ਇਹ ਵਰਤੋਂਕਾਰ ਹਾਲੇ ਕਿਸੇ ਨੂੰ ਫ਼ਾਲੋ ਨਹੀਂ ਕਰਦਾ ਹੈ।", "account.go_to_profile": "ਪਰੋਫਾਇਲ ਉੱਤੇ ਜਾਓ", "account.media": "ਮੀਡੀਆ", + "account.mute": "{name} ਨੂੰ ਮੌਨ ਕਰੋ", + "account.mute_notifications_short": "ਨੋਟਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਮੌਨ ਕਰੋ", + "account.mute_short": "ਮੌਨ ਕਰੋ", "account.muted": "ਮੌਨ ਕੀਤੀਆਂ", "account.mutual": "ਸਾਂਝੇ", "account.no_bio": "ਕੋਈ ਵਰਣਨ ਨਹੀਂ ਦਿੱਤਾ।", @@ -41,7 +42,6 @@ "account.requested": "ਮਨਜ਼ੂਰੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। ਫ਼ਾਲੋ ਬੇਨਤੀਆਂ ਨੂੰ ਰੱਦ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ", "account.requested_follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ", "account.share": "{name} ਦਾ ਪਰੋਫ਼ਾਇਲ ਸਾਂਝਾ ਕਰੋ", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "@{name} ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਓ", "account.unblock_domain": "{domain} ਡੋਮੇਨ ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਓ", "account.unblock_short": "ਪਾਬੰਦੀ ਹਟਾਓ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index ddfe1d4fbcd..2136d3fa826 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Ostrzeżenie o treści (opcjonalne)", "confirmation_modal.cancel": "Anuluj", "confirmations.block.confirm": "Zablokuj", - "confirmations.cancel_follow_request.confirm": "Wycofaj prośbę", - "confirmations.cancel_follow_request.message": "Czy na pewno chcesz wycofać prośbę o możliwość obserwowania {name}?", "confirmations.delete.confirm": "Usuń", "confirmations.delete.message": "Czy na pewno chcesz usunąć ten wpis?", + "confirmations.delete.title": "Usunąć wpis?", "confirmations.delete_list.confirm": "Usuń", "confirmations.delete_list.message": "Czy na pewno chcesz bezpowrotnie usunąć tą listę?", + "confirmations.delete_list.title": "Usunąć listę?", "confirmations.discard_edit_media.confirm": "Odrzuć", "confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?", - "confirmations.domain_block.confirm": "Blokuj serwer", - "confirmations.domain_block.message": "Czy na pewno chcesz zablokować całą domenę {domain}? Zwykle lepszym rozwiązaniem jest blokada lub wyciszenie kilku użytkowników.", "confirmations.edit.confirm": "Edytuj", "confirmations.edit.message": "Edytowanie wpisu nadpisze wiadomość, którą obecnie piszesz. Czy na pewno chcesz to zrobić?", + "confirmations.edit.title": "Nadpisać wpis?", "confirmations.logout.confirm": "Wyloguj", "confirmations.logout.message": "Czy na pewno chcesz się wylogować?", + "confirmations.logout.title": "Wylogować?", "confirmations.mute.confirm": "Wycisz", "confirmations.redraft.confirm": "Usuń i przeredaguj", "confirmations.redraft.message": "Czy na pewno chcesz usunąć i przeredagować ten wpis? Polubienia i podbicia zostaną utracone, a odpowiedzi do oryginalnego wpisu zostaną osierocone.", + "confirmations.redraft.title": "Usunąć i przeredagować wpis?", "confirmations.reply.confirm": "Odpowiedz", "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?", + "confirmations.reply.title": "Nadpisać wpis?", "confirmations.unfollow.confirm": "Przestań obserwować", "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać obserwować {name}?", + "confirmations.unfollow.title": "Przestać obserwować?", "conversation.delete": "Usuń konwersację", "conversation.mark_as_read": "Oznacz jako przeczytane", "conversation.open": "Zobacz konwersację", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Użyj istniejącej kategorii lub utwórz nową", "filter_modal.select_filter.title": "Filtruj ten wpis", "filter_modal.title.status": "Filtruj wpis", - "filtered_notifications_banner.mentions": "{count, plural, one {wzmianka} few {wzmianki} other {wzmianek}}", - "filtered_notifications_banner.pending_requests": "Powiadomienia od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}", + "filtered_notifications_banner.pending_requests": "Od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}", "filtered_notifications_banner.title": "Powiadomienia filtrowane", "firehose.all": "Wszystko", "firehose.local": "Ten serwer", @@ -443,6 +445,8 @@ "mute_modal.title": "Wyciszyć użytkownika?", "mute_modal.you_wont_see_mentions": "Nie zobaczysz wpisów, które wspominają tego użytkownika.", "mute_modal.you_wont_see_posts": "Użytkownik dalej będzie widzieć Twoje posty, ale Ty nie będziesz widzieć jego.", + "name_and_others": "{name} i {count, plural, one {# inny} few {# inne} many {# innych} other {# innych}}", + "name_and_others_with_link": "{name} i {count, plural, one {# inny} few {# inne} many {# innych} other {# innych}}", "navigation_bar.about": "O serwerze", "navigation_bar.advanced_interface": "Otwórz w zaawansowanym interfejsie użytkownika", "navigation_bar.blocks": "Zablokowani użytkownicy", @@ -470,6 +474,10 @@ "navigation_bar.security": "Bezpieczeństwo", "not_signed_in_indicator.not_signed_in": "Musisz się zalogować, aby uzyskać dostęp do tego zasobu.", "notification.admin.report": "{name} zgłosił {target}", + "notification.admin.report_account": "{name} zgłosił(a) {count, plural, one {1 wpis} few {# wpisy} other {# wpisów}} z {target} w kategorii {category}", + "notification.admin.report_account_other": "{name} zgłosił(a) {count, plural, one {1 wpis} few {# wpisy} other {# wpisów}} z {target}", + "notification.admin.report_statuses": "{name} zgłosił(a) {target} w kategorii {category}", + "notification.admin.report_statuses_other": "{name} zgłosił(a) {target}", "notification.admin.sign_up": "Użytkownik {name} zarejestrował się", "notification.favourite": "{name} dodaje Twój wpis do ulubionych", "notification.follow": "{name} obserwuje Cię", @@ -485,7 +493,8 @@ "notification.moderation_warning.action_silence": "Twoje konto zostało ograniczone.", "notification.moderation_warning.action_suspend": "Twoje konto zostało zawieszone.", "notification.own_poll": "Twoje głosowanie zakończyło się", - "notification.poll": "Głosowanie w którym brałeś(-aś) udział zakończyło się", + "notification.poll": "Głosowanie, w którym brałeś(-aś) udział, zostało zakończone", + "notification.private_mention": "{name} prywatnie o tobie wspomniał(a)", "notification.reblog": "Twój post został podbity przez {name}", "notification.relationships_severance_event": "Utracone związki z {name}", "notification.relationships_severance_event.account_suspension": "Administrator z {from} zawiesił {target}, więc nie dostaniesz wieści ani nie wejdziesz w interakcje z użytkownikami z tego serwera.", @@ -495,13 +504,18 @@ "notification.update": "{name} edytował(a) post", "notification_requests.accept": "Akceptuj", "notification_requests.dismiss": "Odrzuć", + "notification_requests.maximize": "Zmaksymalizuj", + "notification_requests.minimize_banner": "Zminimalizuj baner powiadomień filtrowanych", "notification_requests.notifications_from": "Powiadomienia od {name}", "notification_requests.title": "Powiadomienia filtrowane", "notifications.clear": "Wyczyść powiadomienia", "notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?", + "notifications.clear_title": "Wyczyścić powiadomienia?", "notifications.column_settings.admin.report": "Nowe zgłoszenia:", "notifications.column_settings.admin.sign_up": "Nowe rejestracje:", "notifications.column_settings.alert": "Powiadomienia na pulpicie", + "notifications.column_settings.beta.category": "Funkcje eksperymentalne", + "notifications.column_settings.beta.grouping": "Powiadomienia grupowe", "notifications.column_settings.favourite": "Ulubione:", "notifications.column_settings.filter_bar.advanced": "Wyświetl wszystkie kategorie", "notifications.column_settings.filter_bar.category": "Szybkie filtrowanie", @@ -665,9 +679,13 @@ "report.unfollow_explanation": "Obserwujesz to konto. Jeśli nie chcesz już widzieć postów z tego konta w swojej głównej osi czasu, przestań je obserwować.", "report_notification.attached_statuses": "{count, plural, one {{count} wpis} few {{count} wpisy} many {{counter} wpisów} other {{counter} wpisów}}", "report_notification.categories.legal": "Prawne", + "report_notification.categories.legal_sentence": "treść nielegalna", "report_notification.categories.other": "Inne", + "report_notification.categories.other_sentence": "inne", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Naruszenie zasad", + "report_notification.categories.violation_sentence": "naruszenie zasad", "report_notification.open": "Otwórz zgłoszenie", "search.no_recent_searches": "Brak ostatnich wyszukiwań", "search.placeholder": "Szukaj", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index afe54905476..3f831dba250 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -35,9 +35,7 @@ "account.follow_back": "Seguir de volta", "account.followers": "Seguidores", "account.followers.empty": "Nada aqui.", - "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}", "account.following": "Seguindo", - "account.following_counter": "{count, plural, one {segue {counter}} other {segue {counter}}}", "account.follows.empty": "Nada aqui.", "account.go_to_profile": "Ir ao perfil", "account.hide_reblogs": "Ocultar boosts de @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} quer te seguir", "account.share": "Compartilhar perfil de @{name}", "account.show_reblogs": "Mostrar boosts de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "Desbloquear @{name}", "account.unblock_domain": "Desbloquear domínio {domain}", "account.unblock_short": "Desbloquear", @@ -169,27 +166,30 @@ "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Cancelar a solicitação", - "confirmations.cancel_follow_request.message": "Tem certeza de que deseja cancelar seu pedido para seguir {name}?", "confirmations.delete.confirm": "Excluir", "confirmations.delete.message": "Você tem certeza de que deseja excluir este toot?", + "confirmations.delete.title": "Excluir publicação?", "confirmations.delete_list.confirm": "Excluir", "confirmations.delete_list.message": "Você tem certeza de que deseja excluir esta lista?", + "confirmations.delete_list.title": "Excluir lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Há mudanças não salvas na descrição ou pré-visualização da mídia. Descartar assim mesmo?", - "confirmations.domain_block.confirm": "Servidor de blocos", - "confirmations.domain_block.message": "Você tem certeza de que deseja bloquear tudo de {domain}? Você não verá mais o conteúdo desta instância em nenhuma linha do tempo pública ou nas suas notificações. Seus seguidores desta instância serão removidos.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar agora irá substituir a mensagem que está sendo criando. Tem certeza de que deseja continuar?", + "confirmations.edit.title": "Sobrescrever o post?", "confirmations.logout.confirm": "Sair", "confirmations.logout.message": "Você tem certeza de que deseja sair?", + "confirmations.logout.title": "Sair da sessão?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Excluir e rascunhar", "confirmations.redraft.message": "Você tem certeza de que quer apagar essa postagem e rascunhá-la? Favoritos e impulsos serão perdidos, e respostas à postagem original ficarão órfãs.", + "confirmations.redraft.title": "Excluir e rascunhar publicação?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder agora sobrescreverá o toot que você está compondo. Deseja continuar?", + "confirmations.reply.title": "Sobrescrever o post?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que deseja deixar de seguir {name}?", + "confirmations.unfollow.title": "Deixar de seguir o usuário?", "conversation.delete": "Excluir conversa", "conversation.mark_as_read": "Marcar como lida", "conversation.open": "Ver conversa", @@ -297,8 +297,6 @@ "filter_modal.select_filter.subtitle": "Use uma categoria existente ou crie uma nova", "filter_modal.select_filter.title": "Filtrar esta publicação", "filter_modal.title.status": "Filtrar uma publicação", - "filtered_notifications_banner.mentions": "{count, plural, one {menção} other {menções}}", - "filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {no one} one {one person} other {# people}} que você talvez conheça", "filtered_notifications_banner.title": "Notificações filtradas", "firehose.all": "Tudo", "firehose.local": "Este servidor", @@ -415,6 +413,7 @@ "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}", + "link_preview.shares": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", "lists.account.add": "Adicionar à lista", "lists.account.remove": "Remover da lista", "lists.delete": "Excluir lista", @@ -484,7 +483,6 @@ "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", "notification.relationships_severance_event": "Conexões perdidas com {name}", "notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, o que significa que você não pode mais receber atualizações deles ou interagir com eles.", @@ -499,6 +497,7 @@ "notification_requests.title": "Notificações filtradas", "notifications.clear": "Limpar notificações", "notifications.clear_confirmation": "Você tem certeza de que deseja limpar todas as suas notificações?", + "notifications.clear_title": "Limpar notificações?", "notifications.column_settings.admin.report": "Novas denúncias:", "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no computador", @@ -695,8 +694,11 @@ "server_banner.about_active_users": "Pessoas usando este servidor durante os últimos 30 dias (Usuários ativos mensalmente)", "server_banner.active_users": "usuários ativos", "server_banner.administered_by": "Administrado por:", + "server_banner.is_one_of_many": "{domain} é um dos muitos servidores Mastodon independentes que você pode usar para participar do fediverso.", "server_banner.server_stats": "Estatísticas do servidor:", "sign_in_banner.create_account": "Criar conta", + "sign_in_banner.follow_anyone": "Siga alguém pelo fediverso e veja tudo em ordem cronológica. Sem algoritmos, anúncios ou clickbait à vista.", + "sign_in_banner.mastodon_is": "O Mastodon é a melhor maneira de acompanhar o que está acontecendo.", "sign_in_banner.sign_in": "Entrar", "sign_in_banner.sso_redirect": "Entrar ou Registrar-se", "status.admin_account": "Abrir interface de moderação para @{name}", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 9446d5ee251..a4340f95d51 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -37,7 +37,7 @@ "account.followers.empty": "Ainda ninguém segue este utilizador.", "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}", "account.following": "A seguir", - "account.following_counter": "{count, plural, other {A seguir {counter}}}", + "account.following_counter": "{count, plural, one {A seguir {counter}} other {A seguir {counter}}}", "account.follows.empty": "Este utilizador ainda não segue ninguém.", "account.go_to_profile": "Ir para o perfil", "account.hide_reblogs": "Esconder partilhas de @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} pediu para segui-lo", "account.share": "Partilhar o perfil @{name}", "account.show_reblogs": "Mostrar partilhas de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", + "account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", "account.unblock": "Desbloquear @{name}", "account.unblock_domain": "Desbloquear o domínio {domain}", "account.unblock_short": "Desbloquear", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", - "confirmations.cancel_follow_request.confirm": "Retirar pedido", - "confirmations.cancel_follow_request.message": "Tem a certeza que pretende retirar o pedido para seguir {name}?", "confirmations.delete.confirm": "Eliminar", "confirmations.delete.message": "De certeza que quer eliminar esta publicação?", + "confirmations.delete.title": "Eliminar publicação?", "confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.message": "Tens a certeza de que deseja eliminar permanentemente esta lista?", + "confirmations.delete_list.title": "Eliminar lista?", "confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.message": "Tem alterações por guardar na descrição ou pré-visualização do conteúdo. Descartar mesmo assim?", - "confirmations.domain_block.confirm": "Bloquear servidor", - "confirmations.domain_block.message": "De certeza que queres bloquear completamente o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é suficiente e é o recomendado. Não irás ver conteúdo daquele domínio em cronologia alguma nem nas tuas notificações. Os teus seguidores daquele domínio serão removidos.", "confirmations.edit.confirm": "Editar", "confirmations.edit.message": "Editar agora irá sobrescrever a mensagem que está a compor. Tem a certeza de que deseja continuar?", + "confirmations.edit.title": "Sobrescrever publicação?", "confirmations.logout.confirm": "Terminar sessão", "confirmations.logout.message": "Tem a certeza de que quer terminar a sessão?", + "confirmations.logout.title": "Terminar sessão?", "confirmations.mute.confirm": "Silenciar", "confirmations.redraft.confirm": "Eliminar & reescrever", "confirmations.redraft.message": "Tem a certeza de que quer eliminar e reescrever esta publicação? Os favoritos e partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.", + "confirmations.redraft.title": "Eliminar e reescrever publicação?", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Responder agora irá reescrever a mensagem que está a compor actualmente. Tem a certeza que quer continuar?", + "confirmations.reply.title": "Sobrescrever publicação?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", + "confirmations.unfollow.title": "Deixar de seguir utilizador?", "conversation.delete": "Eliminar conversa", "conversation.mark_as_read": "Marcar como lida", "conversation.open": "Ver conversa", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Utilize uma categoria existente ou crie uma nova", "filter_modal.select_filter.title": "Filtrar esta publicação", "filter_modal.title.status": "Filtrar uma publicação", - "filtered_notifications_banner.mentions": "{count, plural, one {menção} other {menções}}", - "filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que talvez conheça", + "filtered_notifications_banner.pending_requests": "De {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que pode conhecer", "filtered_notifications_banner.title": "Notificações filtradas", "firehose.all": "Todas", "firehose.local": "Este servidor", @@ -443,6 +445,8 @@ "mute_modal.title": "Silenciar utilizador?", "mute_modal.you_wont_see_mentions": "Não verá publicações que os mencionem.", "mute_modal.you_wont_see_posts": "Eles podem continuar a ver as suas publicações, mas você não verá as deles.", + "name_and_others": "{name} e {count, plural, one {# outro} other {# outros}}", + "name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}}", "navigation_bar.about": "Sobre", "navigation_bar.advanced_interface": "Abrir na interface web avançada", "navigation_bar.blocks": "Utilizadores bloqueados", @@ -470,6 +474,10 @@ "navigation_bar.security": "Segurança", "not_signed_in_indicator.not_signed_in": "Necessita de iniciar sessão para utilizar esta funcionalidade.", "notification.admin.report": "{name} denunciou {target}", + "notification.admin.report_account": "{name} denunciou {count, plural, one {uma publicação} other {# publicações}} de {target} por {category}", + "notification.admin.report_account_other": "{name} denunciou {count, plural, one {uma publicação} other {# publicações}} de {target}", + "notification.admin.report_statuses": "{name} denunicou {target} por {category}", + "notification.admin.report_statuses_other": "{name} denunciou {target}", "notification.admin.sign_up": "{name} inscreveu-se", "notification.favourite": "{name} assinalou a sua publicação como favorita", "notification.follow": "{name} começou a seguir-te", @@ -486,6 +494,7 @@ "notification.moderation_warning.action_suspend": "A sua conta foi suspensa.", "notification.own_poll": "A sua votação terminou", "notification.poll": "Uma votação em que participaste chegou ao fim", + "notification.private_mention": "{name} mencionou-o em privado", "notification.reblog": "{name} reforçou a tua publicação", "notification.relationships_severance_event": "Perdeu as ligações com {name}", "notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, o que significa que já não pode receber atualizações dele ou interagir com ele.", @@ -496,13 +505,18 @@ "notification.update": "{name} editou uma publicação", "notification_requests.accept": "Aceitar", "notification_requests.dismiss": "Descartar", + "notification_requests.maximize": "Maximizar", + "notification_requests.minimize_banner": "Minimizar o cabeçalho das notificações filtradas", "notification_requests.notifications_from": "Notificações de {name}", "notification_requests.title": "Notificações filtradas", "notifications.clear": "Limpar notificações", "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?", + "notifications.clear_title": "Limpar notificações?", "notifications.column_settings.admin.report": "Novas denúncias:", "notifications.column_settings.admin.sign_up": "Novas inscrições:", "notifications.column_settings.alert": "Notificações no ambiente de trabalho", + "notifications.column_settings.beta.category": "Funcionalidades experimentais", + "notifications.column_settings.beta.grouping": "Agrupar notificações", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias", "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Está a seguir esta conta. Para não voltar a ver as publicações desta conta na sua página inicial, deixe de a seguir.", "report_notification.attached_statuses": "{count, plural,one {{count} publicação} other {{count} publicações}} em anexo", "report_notification.categories.legal": "Legal", + "report_notification.categories.legal_sentence": "conteúdo ilegal", "report_notification.categories.other": "Outro", + "report_notification.categories.other_sentence": "outro", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Violação de regra", + "report_notification.categories.violation_sentence": "violação de regra", "report_notification.open": "Abrir denúncia", "search.no_recent_searches": "Nenhuma pesquisa recente", "search.placeholder": "Pesquisar", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 3a2fab90564..c4d05350202 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -35,9 +35,7 @@ "account.follow_back": "Urmăreşte înapoi", "account.followers": "Urmăritori", "account.followers.empty": "Acest utilizator nu are încă urmăritori.", - "account.followers_counter": "{count, plural, one {Un abonat} few {{counter} abonați} other {{counter} de abonați}}", "account.following": "Urmăriți", - "account.following_counter": "{count, plural, one {Un abonament} few {{counter} abonamente} other {{counter} de abonamente}}", "account.follows.empty": "Momentan acest utilizator nu are niciun abonament.", "account.go_to_profile": "Mergi la profil", "account.hide_reblogs": "Ascunde distribuirile de la @{name}", @@ -62,7 +60,6 @@ "account.requested_follow": "{name} A cerut să vă urmărească", "account.share": "Distribuie profilul lui @{name}", "account.show_reblogs": "Afișează distribuirile de la @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "Deblochează pe @{name}", "account.unblock_domain": "Deblochează domeniul {domain}", "account.unblock_short": "Deblochează", @@ -156,15 +153,12 @@ "compose_form.spoiler_placeholder": "Atenționare de conținut (opțional)", "confirmation_modal.cancel": "Anulează", "confirmations.block.confirm": "Blochează", - "confirmations.cancel_follow_request.confirm": "Retrage cererea", - "confirmations.cancel_follow_request.message": "Sunteți sigur că doriți să retrageți cererea dvs. de urmărire pentru {name}?", "confirmations.delete.confirm": "Elimină", "confirmations.delete.message": "Ești sigur că vrei să elimini această postare?", "confirmations.delete_list.confirm": "Elimină", "confirmations.delete_list.message": "Ești sigur că vrei să elimini definitiv această listă?", "confirmations.discard_edit_media.confirm": "Renunță", "confirmations.discard_edit_media.message": "Ai modificări nesalvate în descrierea sau previzualizarea media, renunți oricum?", - "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi tot domeniul {domain}? În cele mai multe cazuri, raportarea sau blocarea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea niciun conținut din acest domeniu în vreun flux public sau în vreo notificare. Abonații tăi din acest domeniu vor fi eliminați.", "confirmations.edit.confirm": "Modifică", "confirmations.edit.message": "Editarea acum va suprascrie mesajul pe care îl compuneți în prezent. Sunteți sigur că vreți să continuați?", "confirmations.logout.confirm": "Deconectare", @@ -396,7 +390,6 @@ "notification.follow_request": "{name} a trimis o cerere de abonare", "notification.mention": "{name} te-a menționat", "notification.own_poll": "Sondajul tău s-a încheiat", - "notification.poll": "Un sondaj pentru care ai votat s-a încheiat", "notification.reblog": "{name} ți-a distribuit postarea", "notification.status": "{name} tocmai a postat", "notification.update": "{name} și-a modificat o postare", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 40ca8481476..61395c17abe 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -35,9 +35,7 @@ "account.follow_back": "Подписаться в ответ", "account.followers": "Подписчики", "account.followers.empty": "На этого пользователя пока никто не подписан.", - "account.followers_counter": "{count, plural, one {{counter} подписчик} many {{counter} подписчиков} other {{counter} подписчика}}", "account.following": "Подписки", - "account.following_counter": "{count, plural, one {{counter} подписка} many {{counter} подписок} other {{counter} подписки}}", "account.follows.empty": "Этот пользователь пока ни на кого не подписался.", "account.go_to_profile": "Перейти к профилю", "account.hide_reblogs": "Скрыть продвижения от @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} отправил(а) вам запрос на подписку", "account.share": "Поделиться профилем @{name}", "account.show_reblogs": "Показывать продвижения от @{name}", - "account.statuses_counter": "{count, plural, one {{counter} пост} many {{counter} постов} other {{counter} поста}}", "account.unblock": "Разблокировать @{name}", "account.unblock_domain": "Разблокировать {domain}", "account.unblock_short": "Разблокировать", @@ -169,16 +166,12 @@ "compose_form.spoiler_placeholder": "Предупреждение о контенте (опционально)", "confirmation_modal.cancel": "Отмена", "confirmations.block.confirm": "Заблокировать", - "confirmations.cancel_follow_request.confirm": "Отменить запрос", - "confirmations.cancel_follow_request.message": "Вы уверены, что хотите отозвать свой запрос на подписку {name}?", "confirmations.delete.confirm": "Удалить", "confirmations.delete.message": "Вы уверены, что хотите удалить этот пост?", "confirmations.delete_list.confirm": "Удалить", "confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?", "confirmations.discard_edit_media.confirm": "Отменить", "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?", - "confirmations.domain_block.confirm": "Заблокировать сервер", - "confirmations.domain_block.message": "Вы точно уверены, что хотите заблокировать {domain} полностью? В большинстве случаев нескольких блокировок и игнорирований вполне достаточно. Вы перестанете видеть публичную ленту и уведомления оттуда. Ваши подписчики из этого домена будут удалены.", "confirmations.edit.confirm": "Редактировать", "confirmations.edit.message": "В данный момент, редактирование перезапишет составляемое вами сообщение. Вы уверены, что хотите продолжить?", "confirmations.logout.confirm": "Выйти", @@ -297,8 +290,6 @@ "filter_modal.select_filter.subtitle": "Используйте существующую категорию или создайте новую", "filter_modal.select_filter.title": "Фильтровать этот пост", "filter_modal.title.status": "Фильтровать пост", - "filtered_notifications_banner.mentions": "{count, plural, one {упоминание} other {упоминания}}", - "filtered_notifications_banner.pending_requests": "Уведомления от {count, plural, =0 {никого} one {# человека} other {# других людей, с кем вы можете быть знакомы}}", "filtered_notifications_banner.title": "Отфильтрованные уведомления", "firehose.all": "Все", "firehose.local": "Текущий сервер", @@ -485,7 +476,6 @@ "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}, что означает, что вы больше не сможете получать обновления от них или взаймодествовать с ними.", diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json index 67aad910054..cbd9e3d928c 100644 --- a/app/javascript/mastodon/locales/ry.json +++ b/app/javascript/mastodon/locales/ry.json @@ -3,6 +3,8 @@ "about.contact": "Контакт:", "about.disclaimer": "Mastodon є задарьнов проґрамов из удпертым кодом тай торговов значков Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Причины не ясні", + "about.domain_blocks.preamble": "Майбульш Mastodon поволят вам позирати контент тай комуніковати из хосновачами из другых федерованых серверув. Туй лиш уняткы учинені про сись конкретный сервер.", + "about.domain_blocks.silenced.explanation": "Вы майбульш не будете видіти профілі тай контент из сього сервера, кидь не будете го самі глядати авадь пудпишете ся на нього.", "about.domain_blocks.silenced.title": "Обмежено", "about.domain_blocks.suspended.explanation": "Ниякі податкы из сього сервера не будут уброблені, усокочені ци поміняні, што чинит невозможнов хоть-яку інтеракцію ци зязок из хосновачами из сього сервера.", "about.domain_blocks.suspended.title": "Заблоковано", @@ -20,6 +22,7 @@ "account.browse_more_on_origin_server": "Позирайте бульше на ориґіналнум профілю", "account.cancel_follow_request": "Удмінити пудписку", "account.copy": "Зкопіровати удкликованя на профіл", + "account.direct": "Пошептати @{name}", "account.disable_notifications": "Бульше не сповіщати ми коли {name} пише", "account.domain_blocked": "Домен заблокованый", "account.edit_profile": "Управити профіл", @@ -39,8 +42,10 @@ "account.joined_short": "Датум прикапчованя", "account.languages": "Поміняти убрані языкы", "account.link_verified_on": "Властность сього удкликованя было звірено {date}", + "account.locked_info": "Сись профіл є замкнутый. Ґазда акаунта буде ручно провіряти тко го може зафоловити.", "account.media": "Медіа", - "account.moved_to": "Хосновач {name} указав, ож новый профіл йим є:", + "account.mention": "Спомянути @{name}", + "account.moved_to": "Хосновач {name} указав, ож новый профіл му є:", "account.mute": "Стишити {name}", "account.mute_notifications_short": "Стишити голошіня", "account.mute_short": "Стишити", @@ -60,9 +65,12 @@ "account.unblock_short": "Розблоковати", "account.unendorse": "Не указовати на профілови", "account.unfollow": "Удписати ся", + "account.unmute": "Указовати {name}", "account.unmute_notifications_short": "Указовати голошіня", "account.unmute_short": "Указовати", "account_note.placeholder": "Клопкніт обы додати примітку", + "admin.dashboard.retention.average": "Середньоє", + "admin.dashboard.retention.cohort": "Місяць прикапчованя", "admin.dashboard.retention.cohort_size": "Нові хосновачі", "admin.impact_report.instance_accounts": "Профілі из акаунтув, котрі ся удалят", "admin.impact_report.instance_followers": "Пудписникы, котрых стратят наші хосновачі", @@ -70,11 +78,78 @@ "admin.impact_report.title": "Вплыв цілком", "alert.rate_limited.message": "Попробуйте зась по {retry_time, time, medium}.", "alert.rate_limited.title": "Частота обмежена", + "alert.unexpected.message": "Стала ся нечекана хыба.", + "alert.unexpected.title": "Ийой!", + "announcement.announcement": "Голошіня", + "audio.hide": "Зпрятати звук", + "block_modal.remote_users_caveat": "Попросиме ґазду сервера {domain} честовати вашоє рішеня. Айбо не ґарантуєме повный соглас, бо даякі серверы можут брати блокованя по-инчакому. Публичні дописы годно быти видко незалоґованым хосновачам.", + "block_modal.show_less": "Указати менше", + "block_modal.show_more": "Указати бульше", + "block_modal.they_cant_mention": "Они не можут вас споминати авадь слідовати.", + "block_modal.they_cant_see_posts": "Они не можут видіти ваші публикації, тай наспак — вы йихні.", + "block_modal.they_will_know": "Они видят, ож сут заблоковані.", + "block_modal.title": "Заблоковати хосновача?", + "block_modal.you_wont_see_mentions": "Не будете видіти публикації тай споминкы сього хосновача.", + "boost_modal.combo": "Можете клынцнути {combo} другый раз обы сесе пропустити", + "bundle_column_error.copy_stacktrace": "Укопіровати звіт за хыбу", + "bundle_column_error.error.body": "Не годни сьме указати зажадану сторунку. Годно быти спозад хыбы у нашум сістемі, авадь проблемы зумісности бравзера.", + "bundle_column_error.error.title": "Ийой!", + "bundle_column_error.network.body": "Стала ся хыба як сьме пробовали напаровати сторунку. Годно ся йсе было стати спозад слабого споєня вашого інтернета, авадь сервера.", + "bundle_column_error.network.title": "Хыба споєня", + "bundle_column_error.retry": "Попробуйте зась", "bundle_column_error.return": "Вернути ся на головну", "bundle_column_error.routing.body": "Не можеме найти сяку сторунку. Бизувні сьте, ож URL у адресному шорикови є добрый?", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Заперти", "bundle_modal_error.message": "Штось ся показило, закидь сьме ладовали сись компонент.", "bundle_modal_error.retry": "Попробовати зась", - "closed_registrations.other_server_instructions": "Mastodon є децентралізованов платформов, можете си учинити профіл и на другому серверови тай комуніковати из сим." + "closed_registrations.other_server_instructions": "Mastodon є децентралізованов платформов, можете си учинити профіл и на другому серверови тай комуніковати из сим.", + "closed_registrations_modal.description": "Раз не мож учинити профіл на {domain}, айбо не мусите мати профіл ипен на серверови {domain} обы хосновати Mastodon.", + "closed_registrations_modal.find_another_server": "Найти другый сервер", + "column.about": "За сайт", + "column.blocks": "Заблоковані хосновачі", + "column.bookmarks": "Усокоченоє", + "column.direct": "Шептаня", + "column.directory": "Никати профілі", + "column.domain_blocks": "Заблоковані домены", + "column.favourites": "Убраноє", + "column.follow_requests": "Запросы на пудписку", + "column.lists": "Исписы", + "column.mutes": "Стишені хосновачі", + "column.notifications": "Убвіщеня", + "column.pins": "Закріплені публикації", + "column_back_button.label": "Назад", + "column_header.hide_settings": "Спрятати штімованя", + "column_header.moveLeft_settings": "Посунути колонку до ліва", + "column_header.moveRight_settings": "Посунути колонку до права", + "column_header.pin": "Закріпити", + "column_header.show_settings": "Указати штімованя", + "column_header.unpin": "Удкріпити", + "column_subheading.settings": "Штімованя", + "compose.language.change": "Поміняти язык", + "compose.language.search": "Глядати языкы...", + "compose.published.body": "Пост опубликованый.", + "compose.published.open": "Удкрыти", + "compose.saved.body": "Пост усокоченый.", + "compose_form.direct_message_warning_learn_more": "Читайте бульше", + "compose_form.encryption_warning": "Публикації на Mastodon не шіфрувут ся. Не шырьте чутливу інформацію через Mastodon.", + "compose_form.hashtag_warning": "Сись пост не буде ся появляти у исписови по гештеґови, бо вун не є публичный. Лишек публичні посты буде видко за гештеґом.", + "compose_form.lock_disclaimer": "Ваш профіл є {locked}. Хоть-тко може ся на вас пудписати, обы видїти ваші ексклузівні посты.", + "compose_form.lock_disclaimer.lock": "замкнено", + "compose_form.placeholder": "Што нового?", + "compose_form.poll.duration": "Трывалость убзвідованя", + "compose_form.poll.multiple": "Дакулько варіантув", + "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.type": "Стіл", + "compose_form.publish": "Публикація", + "compose_form.publish_form": "Нова публикація", + "compose_form.reply": "Удповідь", + "copypaste.copy_to_clipboard": "Копіровати у памнять", + "directory.recently_active": "Недавно актівні", + "disabled_account_banner.account_settings": "Штімованя акаунта", + "disabled_account_banner.text": "Ваш акаунт {disabledAccount} раз є неактівный.", + "dismissable_banner.community_timeline": "Туй сут недавні публикації уд профілув на серверови {domain}." } diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 58654deb039..ea18ba20915 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -32,9 +32,7 @@ "account.follow": "अनुस्रियताम्", "account.followers": "अनुसर्तारः", "account.followers.empty": "नाऽनुसर्तारो वर्तन्ते", - "account.followers_counter": "{count, plural, one {{counter} अनुसर्ता} two {{counter} अनुसर्तारौ} other {{counter} अनुसर्तारः}}", "account.following": "अनुसरति", - "account.following_counter": "{count, plural, one {{counter} अनुसृतः} two {{counter} अनुसृतौ} other {{counter} अनुसृताः}}", "account.follows.empty": "न कोऽप्यनुसृतो वर्तते", "account.go_to_profile": "प्रोफायिलं गच्छ", "account.hide_reblogs": "@{name} मित्रस्य प्रकाशनानि छिद्यन्ताम्", @@ -56,7 +54,6 @@ "account.requested_follow": "{name} त्वामनुसर्तुमयाचीत्", "account.share": "@{name} मित्रस्य विवरणं विभाज्यताम्", "account.show_reblogs": "@{name} मित्रस्य प्रकाशनानि दृश्यन्ताम्", - "account.statuses_counter": "{count, plural, one {{counter} पत्रम्} two{{counter} पत्रे} other {{counter} पत्राणि}}", "account.unblock": "निषेधता नश्यताम् @{name}", "account.unblock_domain": "प्रदेशनिषेधता नश्यताम् {domain}", "account.unblock_short": "अनवरुन्धि", @@ -136,15 +133,12 @@ "compose_form.spoiler.unmarked": "अप्रच्छन्नाक्षरं विद्यते", "confirmation_modal.cancel": "नश्यताम्", "confirmations.block.confirm": "निषेधः", - "confirmations.cancel_follow_request.confirm": "अनुरोधनमपनय", - "confirmations.cancel_follow_request.message": "{name} अनुसरणस्यानुरोधमपनेतुं दृढीकृतं वा?", "confirmations.delete.confirm": "मार्जय", "confirmations.delete.message": "निश्चयेन पत्रमिदं मार्जितुमिच्छसि?", "confirmations.delete_list.confirm": "मार्जय", "confirmations.delete_list.message": "सूचिरियं निश्चयेन स्थायित्वेन च मार्जितुमिच्छसि वा?", "confirmations.discard_edit_media.confirm": "अपास्य", "confirmations.discard_edit_media.message": "माध्यमवर्णनां प्रदर्शनञ्च अरक्षितानि परिवर्तनानि सन्ति, तानि अपासितुमिच्छसि वा?", - "confirmations.domain_block.message": "नूनं निश्चयेनैव विनष्टुमिच्छति पूर्णप्रदेशमेव {domain} ? अधिकांशसन्दर्भेऽस्थायित्वेन निषेधता निःशब्दत्वञ्च पर्याप्तं चयनीयञ्च । न तस्मात् प्रदेशात्सर्वे विषया द्रष्टुमशक्याः किस्यांश्चिदपि सर्वजनिकसमयतालिकायां वा स्वीयसूचनापटले । सर्वेऽनुसर्तारस्ते प्रदेशात् ये सन्ति ते नश्यन्ते ।", "confirmations.edit.confirm": "सम्पादय", "confirmations.edit.message": "सम्पादनमिदानीं लिख्यते तर्हि पूर्वलिखितसन्देशं विनश्य पुनः लिख्यते। निश्चयेनैवं कर्तव्यम्?", "confirmations.logout.confirm": "बहिर्गम्यताम्", @@ -358,7 +352,6 @@ "notification.follow_request": "{name} त्वामनुसर्तुमयाचीत्", "notification.mention": "{name} त्वामुल्लिलेख", "notification.own_poll": "तव निर्वाचनं समाप्तम्", - "notification.poll": "यस्मिन्निर्वाचने मतमदास्तन्निर्वाचनं समाप्तम्", "notification.reblog": "{name} तव पत्रं बुस्तिमिति अकार्षीत्", "notification.status": "{name} अधुना अस्थापयिष्ट", "notification.update": "{name} पत्रमेकं समपादयिष्ट", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index a0b5b327117..050e1e6faef 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -1,45 +1,60 @@ { "about.blocks": "Serbidores moderados", - "about.contact": "Contatu:", - "about.disclaimer": "Mastodon est software de còdigu lìberu e unu màrchiu de Mastodon gGmbH.", - "about.domain_blocks.no_reason_available": "Rasone no a disponimentu", + "about.contact": "Cuntatu:", + "about.disclaimer": "Mastodon est software de còdighe lìberu e unu màrchiu de Mastodon gGmbH.", + "about.domain_blocks.no_reason_available": "Peruna resone a disponimentu", "about.domain_blocks.preamble": "Mastodon ti permitit de bìdere su cuntenutu de utentes de cale si siat àteru serbidore de su fediversu. Custas sunt etzetziones fatas in custu serbidore ispetzìficu.", - "about.domain_blocks.silenced.explanation": "As a bìere perfilos e contenutos dae custu serbidore sceti chi ddos chircas o detzidas de ddu sighere.", + "about.domain_blocks.silenced.explanation": "As a bìdere profilos e cuntenutos dae custu serbidore isceti chi ddos chircas o detzides de ddu sighire.", "about.domain_blocks.silenced.title": "Limitadu", + "about.domain_blocks.suspended.explanation": "Perunu datu de custu serbidore at a èssere protzessadu, immagasinadu o cuncambiadu; est impossìbile duncas cale si siat interatzione o comunicatzione cun is utentes de custu serbidore.", "about.domain_blocks.suspended.title": "Suspèndidu", + "about.not_available": "Custa informatzione no est istada posta a disponimentu in custu serbidore.", + "about.powered_by": "Rete sotziale detzentralizada impulsada dae {mastodon}", "about.rules": "Règulas de su serbidore", "account.account_note_header": "Nota", "account.add_or_remove_from_list": "Agiunghe o boga dae is listas", - "account.badges.bot": "Robot", + "account.badges.bot": "Automatizadu", "account.badges.group": "Grupu", "account.block": "Bloca @{name}", "account.block_domain": "Bloca su domìniu {domain}", "account.block_short": "Bloca", "account.blocked": "Blocadu", "account.browse_more_on_origin_server": "Esplora de prus in su profilu originale", - "account.cancel_follow_request": "Withdraw follow request", + "account.cancel_follow_request": "Annulla sa sighidura", + "account.copy": "Còpia su ligòngiu a su profilu", + "account.direct": "Mèntova a @{name} in privadu", "account.disable_notifications": "Non mi notìfiches prus cando @{name} pùblichet messàgios", "account.domain_blocked": "Domìniu blocadu", "account.edit_profile": "Modìfica profilu", "account.enable_notifications": "Notìfica·mi cando @{name} pùblicat messàgios", "account.endorse": "Cussìgia in su profilu tuo", + "account.featured_tags.last_status_never": "Peruna publicatzione", + "account.featured_tags.title": "Etichetas de {name} in evidèntzia", "account.follow": "Sighi", + "account.follow_back": "Sighi tue puru", "account.followers": "Sighiduras", "account.followers.empty": "Nemos sighit ancora custa persone.", "account.followers_counter": "{count, plural, one {{counter} sighidura} other {{counter} sighiduras}}", "account.following": "Sighende", - "account.following_counter": "{count, plural, one {Sighende a {counter}} other {Sighende a {counter}}}", + "account.following_counter": "{count, plural, one {sighende a {counter}} other {sighende a {counter}}}", "account.follows.empty": "Custa persone non sighit ancora a nemos.", + "account.go_to_profile": "Bae a su profilu", "account.hide_reblogs": "Cua is cumpartziduras de @{name}", "account.in_memoriam": "In memoriam.", "account.joined_short": "At aderidu", + "account.languages": "Muda is idiomas sutiscritos", "account.link_verified_on": "Sa propiedade de custu ligòngiu est istada controllada su {date}", "account.locked_info": "S'istadu de riservadesa de custu contu est istadu cunfiguradu comente blocadu. Sa persone chi tenet sa propiedade revisionat a manu chie dda podet sighire.", "account.media": "Cuntenutu multimediale", "account.mention": "Mèntova a @{name}", + "account.moved_to": "{name} at indicadu chi su contu nou issoro immoe est:", "account.mute": "Pone a @{name} a sa muda", + "account.mute_notifications_short": "Pone is notìficas a sa muda", "account.mute_short": "A sa muda", "account.muted": "A sa muda", + "account.mutual": "Pari-pari", + "account.no_bio": "Peruna descritzione frunida.", + "account.open_original_page": "Aberi sa pàgina originale", "account.posts": "Publicatziones", "account.posts_with_replies": "Publicatziones e rispostas", "account.report": "Signala @{name}", @@ -50,30 +65,51 @@ "account.statuses_counter": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}", "account.unblock": "Isbloca a @{name}", "account.unblock_domain": "Isbloca su domìniu {domain}", + "account.unblock_short": "Isbloca", "account.unendorse": "Non cussiges in su profilu", "account.unfollow": "Non sigas prus", "account.unmute": "Torra a ativare a @{name}", + "account.unmute_notifications_short": "Ativa is notìficas", + "account.unmute_short": "Ativa su sonu", "account_note.placeholder": "Incarca pro agiùnghere una nota", + "admin.dashboard.retention.cohort_size": "Utentes noos", + "admin.impact_report.instance_accounts": "Contos de profilu chi custu diat cantzellare", + "admin.impact_report.instance_followers": "Sighiduras chi is utentes nostros diant pèrdere", + "admin.impact_report.instance_follows": "Sighiduras chi is utentes issoro diant pèrdere", "alert.rate_limited.message": "Torra·bi a proare a pustis de {retry_time, time, medium}.", "alert.rate_limited.title": "Màssimu de rechestas barigadu", "alert.unexpected.message": "Ddoe est istada una faddina.", "alert.unexpected.title": "Oh!", "announcement.announcement": "Annùntziu", + "attachments_list.unprocessed": "(non protzessadu)", "audio.hide": "Cua s'àudio", + "block_modal.show_less": "Ammustra·nde prus pagu", + "block_modal.show_more": "Ammustra·nde prus", + "block_modal.they_cant_mention": "Non ti podent mentovare nen sighire.", + "block_modal.they_cant_see_posts": "Non podent bìdere is publicatziones tuas e tue non podes bìdere cussas issoro.", + "block_modal.they_will_know": "Non podent bìdere chi ddos as blocadu.", + "block_modal.title": "Boles blocare s'utente?", + "block_modal.you_wont_see_mentions": "No as a bìdere is publicatziones chi mèntovent custa persone.", "boost_modal.combo": "Podes incarcare {combo} pro brincare custu sa borta chi benit", + "bundle_column_error.copy_stacktrace": "Còpia s'informe de faddina", "bundle_column_error.error.title": "Oh, no!", "bundle_column_error.network.title": "Faddina de connessione", "bundle_column_error.retry": "Torra·bi a proare", + "bundle_column_error.return": "Torra a sa pàgina printzipale", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Serra", "bundle_modal_error.message": "Faddina in su carrigamentu de custu cumponente.", "bundle_modal_error.retry": "Torra·bi a proare", + "closed_registrations_modal.find_another_server": "Agata un'àteru serbidore", "column.about": "Informatziones", "column.blocks": "Persones blocadas", "column.bookmarks": "Sinnalibros", "column.community": "Lìnia de tempus locale", + "column.direct": "Mentziones privadas", "column.directory": "Nàviga in is profilos", "column.domain_blocks": "Domìnios blocados", + "column.favourites": "Preferidos", + "column.firehose": "Publicatziones in direta", "column.follow_requests": "Rechestas de sighidura", "column.home": "Printzipale", "column.lists": "Listas", @@ -92,31 +128,42 @@ "community.column_settings.local_only": "Isceti locale", "community.column_settings.media_only": "Isceti multimediale", "community.column_settings.remote_only": "Isceti remotu", - "compose.language.change": "Càmbia sa limba", + "compose.language.change": "Càmbia s'idioma", + "compose.language.search": "Chirca idiomas...", + "compose.published.body": "Publicadu.", + "compose.published.open": "Aberi", + "compose.saved.body": "Publicatzione sarvada.", "compose_form.direct_message_warning_learn_more": "Àteras informatziones", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", - "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", + "compose_form.hashtag_warning": "Custa publicatzione no at a èssere ammustrada in peruna eticheta, dae chi no est pùblica. Isceti is publicatziones pùblicas podent èssere chircadas cun etichetas.", "compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.", "compose_form.lock_disclaimer.lock": "blocadu", "compose_form.placeholder": "A ite ses pensende?", "compose_form.poll.duration": "Longària de su sondàgiu", + "compose_form.poll.option_placeholder": "Optzione {number}", + "compose_form.poll.single": "Sèbera·nde una", "compose_form.poll.switch_to_multiple": "Muda su sondàgiu pro permìtere multi-optziones", "compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti", - "compose_form.publish_form": "Publish", + "compose_form.poll.type": "Istile", + "compose_form.publish": "Pùblica", + "compose_form.publish_form": "Publicatzione noa", + "compose_form.reply": "Risponde", + "compose_form.save_changes": "Atualiza", "compose_form.spoiler.marked": "Boga avisu de cuntenutu", "compose_form.spoiler.unmarked": "Agiunghe avisu de cuntenutu", + "compose_form.spoiler_placeholder": "Avisu de cuntenutu (optzionale)", "confirmation_modal.cancel": "Annulla", "confirmations.block.confirm": "Bloca", "confirmations.delete.confirm": "Cantzella", "confirmations.delete.message": "Seguru chi boles cantzellare custa publicatzione?", "confirmations.delete_list.confirm": "Cantzella", "confirmations.delete_list.message": "Seguru chi boles cantzellare custa lista in manera permanente?", - "confirmations.domain_block.message": "Boles de seguru, ma a beru a beru, blocare {domain}? In sa parte manna de is casos, pagos blocos o silentziamentos de persones sunt sufitzientes e preferìbiles. No as a bìdere cuntenutos dae custu domìniu in peruna lìnia de tempus pùblica o in is notìficas tuas. Sa gente chi ti sighit dae cussu domìniu at a èssere bogada.", + "confirmations.discard_edit_media.confirm": "Iscarta", "confirmations.edit.confirm": "Modìfica", "confirmations.logout.confirm": "Essi·nche", "confirmations.logout.message": "Seguru chi boles essire?", "confirmations.mute.confirm": "A sa muda", "confirmations.redraft.confirm": "Cantzella e torra a fàghere", + "confirmations.redraft.message": "Seguru chi boles cantzellare e torrare a fàghere custa publicatzione? As a pèrdere is preferidos e is cumpartziduras, e is rispostas a su messàgiu originale ant a abarrare òrfanas.", "confirmations.reply.confirm": "Risponde", "confirmations.reply.message": "Rispondende immoe as a subrascrìere su messàgiu chi ses iscriende. Seguru chi boles sighire?", "confirmations.unfollow.confirm": "Non sigas prus", @@ -125,22 +172,30 @@ "conversation.mark_as_read": "Signala comente lèghidu", "conversation.open": "Ammustra arresonada", "conversation.with": "Cun {names}", + "copy_icon_button.copied": "Copiadu in punta de billete", + "copypaste.copied": "Copiadu", + "copypaste.copy_to_clipboard": "Còpia in punta de billete", "directory.federated": "Dae unu fediversu connotu", "directory.local": "Isceti dae {domain}", "directory.new_arrivals": "Arribos noos", "directory.recently_active": "Cun atividade dae pagu", "disabled_account_banner.account_settings": "Cunfiguratziones de su contu", - "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", - "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", + "disabled_account_banner.text": "Su contu tuo {disabledAccount} no est ativu.", + "dismissable_banner.dismiss": "Iscarta", + "domain_block_modal.block": "Bloca su serbidore", + "domain_block_modal.title": "Boles blocare su domìniu?", + "domain_pill.server": "Serbidore", + "domain_pill.username": "Nòmine de utente", "embed.instructions": "Inserta custa publicatzione in su situ web tuo copiende su còdighe de suta.", "embed.preview": "At a aparèssere aici:", "emoji_button.activity": "Atividade", + "emoji_button.clear": "Isbòida", "emoji_button.custom": "Personalizadu", "emoji_button.flags": "Banderas", "emoji_button.food": "Mandigòngiu e bufòngiu", "emoji_button.label": "Inserta un'emoji", "emoji_button.nature": "Natura", - "emoji_button.not_found": "Emojis no!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "Perunu emoji agatadu", "emoji_button.objects": "Ogetos", "emoji_button.people": "Gente", "emoji_button.recent": "Impreadu a fitianu", @@ -171,17 +226,41 @@ "errors.unexpected_crash.report_issue": "Sinnala unu problema", "explore.search_results": "Resurtados de sa chirca", "explore.suggested_follows": "Gente", + "explore.title": "Esplora", + "explore.trending_links": "Noas", "explore.trending_statuses": "Publicatziones", "explore.trending_tags": "Etichetas", + "filter_modal.added.expired_title": "Filtru iscadidu.", + "filter_modal.added.review_and_configure_title": "Cunfiguratziones de filtru", + "filter_modal.added.settings_link": "pàgina de cunfiguratzione", + "filter_modal.added.short_explanation": "Custa publicatzione est istada agiunta a sa categoria de filtros imbeniente: {title}.", + "filter_modal.added.title": "Filtru agiuntu!", "filter_modal.select_filter.expired": "iscadidu", + "filter_modal.select_filter.prompt_new": "Categoria noa: {name}", + "filter_modal.select_filter.search": "Chirca o crea", + "filter_modal.select_filter.subtitle": "Imprea una categoria chi esistit giai o crea·nde una", + "filter_modal.select_filter.title": "Filtra custa publicatzione", + "filter_modal.title.status": "Filtra una publicatzione", + "filtered_notifications_banner.title": "Notìficas filtradas", "firehose.all": "Totus", + "firehose.local": "Custu serbidore", + "firehose.remote": "Àteros serbidores", "follow_request.authorize": "Autoriza", "follow_request.reject": "Refuda", "follow_requests.unlocked_explanation": "Fintzas si su contu tuo no est blocadu, su personale de {domain} at pensadu chi forsis bolias revisionare a manu is rechestas de custos contos.", + "follow_suggestions.curated_suggestion": "Sa seletzione de s'iscuadra de traballu", + "follow_suggestions.dismiss": "No ammustres prus", + "follow_suggestions.featured_longer": "Seberadu a manu dae s'iscuadra de {domain}", + "follow_suggestions.friends_of_friends_longer": "Populare intre persones chi sighis", + "follow_suggestions.hints.featured": "Custu profilu est istadu seberadu a manu dae s'iscuadra {domain}.", + "follow_suggestions.view_all": "Ammustra totu", "footer.about": "Informatziones", + "footer.directory": "Diretòriu de profilos", + "footer.get_app": "Otene s'aplicatzione", "footer.invite": "Invita gente", "footer.keyboard_shortcuts": "Incurtzaduras de tecladu", "footer.privacy_policy": "Polìtica de riservadesa", + "footer.source_code": "Ammustra su còdighe de orìgine", "footer.status": "Istadu", "generic.saved": "Sarvadu", "getting_started.heading": "Comente cumintzare", @@ -194,56 +273,64 @@ "hashtag.column_settings.tag_mode.any": "Cale si siat de custos", "hashtag.column_settings.tag_mode.none": "Perunu de custos", "hashtag.column_settings.tag_toggle": "Include etichetas additzionales pro custa colunna", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} partetzipante} other {{counter} partetzipantes}}", + "hashtag.counter_by_uses": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}", + "hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}} oe", "hashtag.follow": "Sighi su hashtag", + "hashtag.unfollow": "Non sigas prus s'eticheta", "home.column_settings.show_reblogs": "Ammustra is cumpartziduras", "home.column_settings.show_replies": "Ammustra rispostas", "home.hide_announcements": "Cua annùntzios", + "home.pending_critical_update.body": "Atualiza su serbidore Mastodon tuo su prima possìbile.", + "home.pending_critical_update.link": "Ammustra is atualizatziones", + "home.pending_critical_update.title": "Atualizatzione de seguresa crìtica a disponimentu.", "home.show_announcements": "Ammustra annùntzios", - "interaction_modal.description.reply": "Podes arrespondere a custu post con una conta in Mastodon.", + "interaction_modal.description.reply": "Podes rispòndere a custa publicatzione cun unu contu de Mastodon.", "interaction_modal.on_this_server": "In custu serbidore", "interaction_modal.title.follow": "Sighi a {name}", - "interaction_modal.title.reply": "Arresponde a su post de {name}", + "interaction_modal.title.reply": "Risponde a sa publicatzione de {name}", "intervals.full.days": "{number, plural, one {# die} other {# dies}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", "intervals.full.minutes": "{number, plural, one {# minutu} other {# minutos}}", - "keyboard_shortcuts.back": "pro navigare a coa", - "keyboard_shortcuts.blocked": "pro abèrrere sa lista de persones blocadas", - "keyboard_shortcuts.boost": "pro cumpartzire", - "keyboard_shortcuts.column": "pro atzentrare una publicatzione in una de is colunnas", - "keyboard_shortcuts.compose": "pro atzentrare in s'àrea de cumpositzione de testu", + "keyboard_shortcuts.back": "Nàviga a coa", + "keyboard_shortcuts.blocked": "Aberi sa lista de persones blocadas", + "keyboard_shortcuts.boost": "Potèntzia sa publicatzione", + "keyboard_shortcuts.column": "Atzentra sa colunna", + "keyboard_shortcuts.compose": "Atzentra s'àrea de cumpositzione de testu", "keyboard_shortcuts.description": "Descritzione", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "pro mòere in bàsciu in sa lista", - "keyboard_shortcuts.enter": "pro abèrrere una publicatzione", - "keyboard_shortcuts.federated": "pro abèrrere sa lìnia de tempus federada", + "keyboard_shortcuts.direct": "pro abèrrere sa colunna de mèntovos privados", + "keyboard_shortcuts.down": "Move in bàsciu in sa lista", + "keyboard_shortcuts.enter": "Aberi una publicatzione", + "keyboard_shortcuts.favourites": "Aberi sa lista de preferidos", + "keyboard_shortcuts.federated": "Aberi sa lìnia de tempus federada", "keyboard_shortcuts.heading": "Incurtzaduras de tecladu", - "keyboard_shortcuts.home": "pro abèrrere sa lìnia de tempus printzipale", + "keyboard_shortcuts.home": "Aberi sa lìnia de tempus printzipale", "keyboard_shortcuts.hotkey": "Tecla de atzessu diretu", - "keyboard_shortcuts.legend": "pro ammustrare custa didascalia", - "keyboard_shortcuts.local": "pro abèrrere sa lìnia de tempus locale", - "keyboard_shortcuts.mention": "pro mentovare s'atributzione", - "keyboard_shortcuts.muted": "pro abèrrere sa lista de persones a sa muda", - "keyboard_shortcuts.my_profile": "pro abèrrere su profilu tuo", - "keyboard_shortcuts.notifications": "pro abèrrere sa colunna de notificatziones", - "keyboard_shortcuts.open_media": "pro abèrrere elementos multimediales", - "keyboard_shortcuts.pinned": "pro abèrrere sa lista de publicatziones apicadas", - "keyboard_shortcuts.profile": "pro abèrrere su profilu de s'autore", - "keyboard_shortcuts.reply": "pro rispòndere", - "keyboard_shortcuts.requests": "pro abèrrere sa lista de rechestas de sighidura", - "keyboard_shortcuts.search": "pro atzentrare sa chirca", - "keyboard_shortcuts.spoilers": "pro ammustrare/cuare su campu AC", - "keyboard_shortcuts.start": "pro abèrrere sa colunna \"Cumintza\"", - "keyboard_shortcuts.toggle_hidden": "pro ammustrare o cuare testu de is AC", - "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare elementos multimediales", - "keyboard_shortcuts.toot": "pro cumintzare a iscrìere una publicatzione noa", - "keyboard_shortcuts.unfocus": "pro essire de s'àrea de cumpositzione de testu o de chirca", - "keyboard_shortcuts.up": "pro mòere in susu in sa lista", + "keyboard_shortcuts.legend": "Ammustra custa didascalia", + "keyboard_shortcuts.local": "Aberi sa lìnia de tempus locale", + "keyboard_shortcuts.mention": "Mèntova a s'atributzione", + "keyboard_shortcuts.muted": "Aberi sa lista de persones a sa muda", + "keyboard_shortcuts.my_profile": "Aberi su profilu tuo", + "keyboard_shortcuts.notifications": "Aberi sa colunna de notificatziones", + "keyboard_shortcuts.open_media": "Aberi is elementos multimediales", + "keyboard_shortcuts.pinned": "Aberi sa lista de publicatziones apicadas", + "keyboard_shortcuts.profile": "Aberi su profilu de s'autore", + "keyboard_shortcuts.reply": "Risponde a sa publicatzioe", + "keyboard_shortcuts.requests": "Aberi sa lista de rechestas de sighiduras", + "keyboard_shortcuts.search": "Atzentra sa barra de chirca", + "keyboard_shortcuts.spoilers": "Ammustra/cua su campu AC", + "keyboard_shortcuts.start": "Aberi sa colunna \"Cumintza\"", + "keyboard_shortcuts.toggle_hidden": "Ammustra o cua su testu de is AC", + "keyboard_shortcuts.toggle_sensitivity": "Ammustra/cua elementos multimediales", + "keyboard_shortcuts.toot": "Cumintza a iscrìere una publicatzione noa", + "keyboard_shortcuts.unfocus": "Essi de s'àrea de cumpositzione de testu o de chirca", + "keyboard_shortcuts.up": "Move in susu in sa lista", "lightbox.close": "Serra", "lightbox.compress": "Cumprime sa casella de visualizatzione de is immàgines", "lightbox.expand": "Ismànnia sa casella de visualizatzione de is immàgines", "lightbox.next": "Imbeniente", "lightbox.previous": "Pretzedente", - "limited_account_hint.title": "Custu perfilu dd'ant cuadu is moderadores de {domain}.", + "limited_account_hint.title": "Custu profilu est istadu cuadu dae sa moderatzione de {domain}.", "lists.account.add": "Agiunghe a sa lista", "lists.account.remove": "Boga dae sa lista", "lists.delete": "Cantzella sa lista", @@ -265,8 +352,11 @@ "navigation_bar.bookmarks": "Sinnalibros", "navigation_bar.community_timeline": "Lìnia de tempus locale", "navigation_bar.compose": "Cumpone una publicatzione noa", + "navigation_bar.direct": "Mentziones privadas", "navigation_bar.discover": "Iscoberi", "navigation_bar.domain_blocks": "Domìnios blocados", + "navigation_bar.explore": "Esplora", + "navigation_bar.favourites": "Preferidos", "navigation_bar.filters": "Faeddos a sa muda", "navigation_bar.follow_requests": "Rechestas de sighidura", "navigation_bar.follows_and_followers": "Gente chi sighis e sighiduras", @@ -279,18 +369,42 @@ "navigation_bar.public_timeline": "Lìnia de tempus federada", "navigation_bar.search": "Chirca", "navigation_bar.security": "Seguresa", - "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "not_signed_in_indicator.not_signed_in": "Ti depes identificare pro atzèdere a custa resursa.", + "notification.admin.sign_up": "{name} at aderidu", "notification.favourite": "{name} at marcadu comente a preferidu s'istadu tuo", "notification.follow": "{name} ti sighit", "notification.follow_request": "{name} at dimandadu de ti sighire", "notification.mention": "{name} t'at mentovadu", + "notification.moderation-warning.learn_more": "Àteras informatziones", + "notification.moderation_warning": "T'ant imbiadu un'avisu de moderatzione", + "notification.moderation_warning.action_delete_statuses": "Unas cantas de is publicatziones tuas sunt istadas cantzelladas.", + "notification.moderation_warning.action_disable": "Su contu tuo est istadu disativadu.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Unas cantas de is publicatziones tuas sunt istadas marcadas comente sensìbiles.", + "notification.moderation_warning.action_none": "Su contu tuo at retzidu un'avisu de moderatzione.", + "notification.moderation_warning.action_sensitive": "Is publicatziones tuas ant a èssere marcadas comente sensìbiles dae immoe.", + "notification.moderation_warning.action_silence": "Su contu tuo est istadu limitadu.", + "notification.moderation_warning.action_suspend": "Su contu tuo est istadu suspèndidu.", "notification.own_poll": "Sondàgiu acabbadu", "notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu", + "notification.private_mention": "{name} t'at mentovadu in privadu", "notification.reblog": "{name} at cumpartzidu sa publicatzione tua", + "notification.relationships_severance_event": "Connessiones pèrdidas cun {name}", + "notification.relationships_severance_event.learn_more": "Àteras informatziones", "notification.status": "{name} at publicadu cosa", + "notification.update": "{name} at modificadu una publicatzione", + "notification_requests.accept": "Atzeta", + "notification_requests.dismiss": "Iscarta", + "notification_requests.notifications_from": "Notìficas dae {name}", + "notification_requests.title": "Notìficas filtradas", "notifications.clear": "Lìmpia notìficas", "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?", + "notifications.column_settings.admin.report": "Informes noos:", "notifications.column_settings.alert": "Notìficas de iscrivania", + "notifications.column_settings.beta.category": "Funtzionalidades isperimentales", + "notifications.column_settings.beta.grouping": "Notìficas de grupu", + "notifications.column_settings.favourite": "Preferidos:", + "notifications.column_settings.filter_bar.advanced": "Ammustra totu is categorias", + "notifications.column_settings.filter_bar.category": "Barra de filtru lestru", "notifications.column_settings.follow": "Sighiduras noas:", "notifications.column_settings.follow_request": "Rechestas noas de sighidura:", "notifications.column_settings.mention": "Mèntovos:", @@ -300,8 +414,12 @@ "notifications.column_settings.show": "Ammustra in sa colunna", "notifications.column_settings.sound": "Reprodue unu sonu", "notifications.column_settings.status": "Publicatziones noas:", + "notifications.column_settings.unread_notifications.category": "Notìficas de lèghere", + "notifications.column_settings.unread_notifications.highlight": "Evidèntzia is notìficas de lèghere", + "notifications.column_settings.update": "Modìficas:", "notifications.filter.all": "Totus", "notifications.filter.boosts": "Cumpartziduras", + "notifications.filter.favourites": "Preferidos", "notifications.filter.follows": "Sighende", "notifications.filter.mentions": "Mèntovos", "notifications.filter.polls": "Resurtados de su sondàgiu", @@ -312,27 +430,23 @@ "notifications.permission_denied": "Is notìficas de iscrivania non sunt a disponimentu pro neghe de rechestas de permissu chi sunt istadas dennegadas in antis", "notifications.permission_denied_alert": "Is notìficas de iscrivania non podent èssere abilitadas, ca su permissu de su navigadore est istadu dennegadu in antis", "notifications.permission_required": "Is notìficas de iscrivania no sunt a disponimentu ca ammancat su permissu rechèdidu.", + "notifications.policy.filter_new_accounts.hint": "Creadu {days, plural, one {erisero} other {in is ùrtimas # dies}}", + "notifications.policy.filter_new_accounts_title": "Contos noos", + "notifications.policy.filter_not_followers_title": "Gente chi non ti sighit", + "notifications.policy.filter_not_following_hint": "Fintzas a cando no donas s'aprovatzione tua", + "notifications.policy.filter_not_following_title": "Gente chi non sighis", "notifications_permission_banner.enable": "Abilita is notìficas de iscrivania", "notifications_permission_banner.how_to_control": "Pro retzire notìficas cando Mastodon no est abertu, abilita is notìficas de iscrivania. Podes controllare cun pretzisione is castas de interatziones chi ingendrant notìficas de iscrivania pro mèdiu de su butone {icon} in subra, cando sunt abilitadas.", "notifications_permission_banner.title": "Non ti perdas mai nudda", - "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", - "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", + "onboarding.compose.template": "Salude #Mastodon!", "onboarding.profile.display_name": "Nòmine visìbile", "onboarding.profile.note": "Biografia", - "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", - "onboarding.start.skip": "Want to skip right ahead?", - "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", - "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", - "onboarding.steps.publish_status.body": "Say hello to the world.", - "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", - "onboarding.steps.setup_profile.title": "Customize your profile", - "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.steps.setup_profile.title": "Personaliza su profilu tuo", + "onboarding.steps.share_profile.title": "Cumpartzi su profilu tuo", "picture_in_picture.restore": "Torra·ddu a ue fiat", "poll.closed": "Serradu", "poll.refresh": "Atualiza", + "poll.reveal": "Ammustra is resurtados", "poll.total_people": "{count, plural, one {# persone} other {# persones}}", "poll.total_votes": "{count, plural, one {# votu} other {# votos}}", "poll.vote": "Vota", @@ -342,20 +456,30 @@ "poll_button.remove_poll": "Cantzella su sondàgiu", "privacy.change": "Modìfica s'istadu de riservadesa", "privacy.public.short": "Pùblicu", + "privacy_policy.last_updated": "Ùrtima atualizatzione: {date}", + "privacy_policy.title": "Polìtica de riservadesa", "recommended": "Cussigiadu", "refresh": "Atualiza", "regeneration_indicator.label": "Carrighende…", "regeneration_indicator.sublabel": "Preparende sa lìnia de tempus printzipale tua.", "relative_time.days": "{number} dies a oe", - "relative_time.full.just_now": "immoe etotu", + "relative_time.full.days": "{number, plural, one {# die} other {# dies}} a oe", + "relative_time.full.hours": "{number, plural, one {# ora} other {# oras}} a immoe", + "relative_time.full.just_now": "immoe immoe", + "relative_time.full.minutes": "{number, plural, one {# minutu} other {# minutos}} a immoe", + "relative_time.full.seconds": "{number, plural, one {# segundu} other {# segundos}} a immoe", "relative_time.hours": "{number} oras a immoe", "relative_time.just_now": "immoe", "relative_time.minutes": "{number} minutos a immoe", "relative_time.seconds": "{number} segundos a immoe", "relative_time.today": "oe", + "reply_indicator.attachments": "{count, plural, one {# alligongiadu} other {# alligongiados}}", "reply_indicator.cancel": "Annulla", + "reply_indicator.poll": "Sondàgiu", "report.block": "Bloca", + "report.categories.legal": "Giurìdicu", "report.categories.other": "Àteru", + "report.categories.spam": "Àliga", "report.category.title_account": "profilu", "report.category.title_status": "publicatzione", "report.close": "Fatu", @@ -364,19 +488,31 @@ "report.mute": "A sa muda", "report.next": "Imbeniente", "report.placeholder": "Cummentos additzionales", + "report.reasons.dislike": "Non mi praghet", + "report.reasons.dislike_description": "Est una cosa chi non boles bìdere", + "report.reasons.legal": "Illegale", + "report.reasons.other": "Un'àtera cosa", + "report.reasons.spam": "Est àliga", "report.submit": "Imbia", "report.target": "Informende de {target}", + "report.unfollow": "Non sigas prus a @{name}", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", + "report_notification.categories.legal": "Giurìdicu", + "report_notification.categories.legal_sentence": "cuntenutu illegale", "report_notification.categories.other": "Àteru", + "report_notification.categories.other_sentence": "àteru", + "report_notification.categories.spam": "Àliga", "search.placeholder": "Chirca", "search_popout.user": "utente", "search_results.accounts": "Profilos", "search_results.all": "Totus", "search_results.hashtags": "Etichetas", "search_results.statuses": "Publicatziones", + "server_banner.active_users": "utentes ativos", "server_banner.administered_by": "Amministradu dae:", "server_banner.server_stats": "Istatìsticas de su serbidore:", - "sign_in_banner.sign_in": "Sign in", + "sign_in_banner.create_account": "Crea contu", + "sign_in_banner.sign_in": "Identificatzione", "status.admin_account": "Aberi s'interfache de moderatzione pro @{name}", "status.admin_status": "Aberi custa publicatzione in s'interfache de moderatzione", "status.block": "Bloca a @{name}", @@ -387,8 +523,9 @@ "status.delete": "Cantzella", "status.detailed_status": "Visualizatzione de detàlliu de arresonada", "status.edit": "Modìfica", - "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", + "status.edited_x_times": "Modificadu {count, plural, one {{count} # borta} other {{count} bortas}}", "status.embed": "Afissa", + "status.favourites": "{count, plural, one {preferidu} other {preferidos}}", "status.filtered": "Filtradu", "status.load_more": "Càrriga·nde àteros", "status.media_hidden": "Elementos multimediales cuados", @@ -415,7 +552,7 @@ "status.show_less_all": "Ammustra·nde prus pagu pro totus", "status.show_more": "Ammustra·nde prus", "status.show_more_all": "Ammustra·nde prus pro totus", - "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", + "status.title.with_attachments": "{user} at publicadu {attachmentCount, plural, one {un'alligongiadu} other {{attachmentCount} alligongiados}}", "status.unmute_conversation": "Torra a ativare s'arresonada", "status.unpin": "Boga dae pitzu de su profilu", "subscribed_languages.save": "Sarva is modìficas", @@ -426,11 +563,11 @@ "time_remaining.minutes": "{number, plural, one {abarrat # minutu} other {abarrant # minutos}}", "time_remaining.moments": "Abarrant pagu momentos", "time_remaining.seconds": "{number, plural, one {abarrat # segundu} other {abarrant # segundos}}", - "timeline_hint.remote_resource_not_displayed": "{resource} dae àteros serbidores non benint ammustrados.", + "timeline_hint.remote_resource_not_displayed": "Is {resource} dae àteros serbidores non benint ammustradas.", "timeline_hint.resources.followers": "Sighiduras", "timeline_hint.resources.follows": "Sighende", "timeline_hint.resources.statuses": "Publicatziones prus betzas", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", + "trends.counter_by_accounts": "{count, plural, one {{counter} persone} other {{counter} persones}} in {days, plural, one {s'ùrtima die} other {{days} is ùrtimas dies}}", "trends.trending_now": "Est tendèntzia immoe", "ui.beforeunload": "S'abbotzu tuo at a èssere pèrdidu si essis dae Mastodon.", "units.short.billion": "{count}Mrd", @@ -441,10 +578,10 @@ "upload_error.limit": "Lìmite de càrriga de archìvios barigadu.", "upload_error.poll": "Non si permitit s'imbiu de archìvios in is sondàgios.", "upload_form.audio_description": "Descritzione pro persones cun pèrdida auditiva", - "upload_form.description": "Descritzione pro persones cun problemas visuales", + "upload_form.description": "Descritzione pro persones cun pèrdida visuale", "upload_form.edit": "Modìfica", "upload_form.thumbnail": "Càmbia sa miniadura", - "upload_form.video_description": "Descritzione pro persones cun pèrdida auditiva o problemas visuales", + "upload_form.video_description": "Descritzione pro persones cun pèrdida auditiva o visuale", "upload_modal.analyzing_picture": "Analizende immàgine…", "upload_modal.apply": "Àplica", "upload_modal.choose_image": "Sèbera un'immàgine", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index 53501a59370..99f474ace50 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -31,9 +31,7 @@ "account.follow": "Follae", "account.followers": "Follaers", "account.followers.empty": "Naebody follaes this uiser yit.", - "account.followers_counter": "{count, plural, one {{counter} Follaer} other {{counter} Follaers}}", "account.following": "Follaein", - "account.following_counter": "{count, plural, one {{counter} Follaein} other {{counter} Follaein}}", "account.follows.empty": "This uiser disnae follae oniebody yit.", "account.go_to_profile": "Gang tae profile", "account.hide_reblogs": "Dinnae shaw heezes fae @{name}", @@ -53,7 +51,6 @@ "account.requested": "Haudin fir approval. Chap tae cancel follae request", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Shaw heezes frae @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}", "account.unblock": "Undingie @{name}", "account.unblock_domain": "Undingie domain {domain}", "account.unblock_short": "Undingie", @@ -132,15 +129,12 @@ "compose_form.spoiler.unmarked": "Pit on a content warnin", "confirmation_modal.cancel": "Stap", "confirmations.block.confirm": "Dingie", - "confirmations.cancel_follow_request.confirm": "Tak back yer request", - "confirmations.cancel_follow_request.message": "Ye shair thit ye'r wantin tae tak back yer request fir tae follae {name}?", "confirmations.delete.confirm": "Delete", "confirmations.delete.message": "Ye shair thit ye'r wantin tae delete this post?", "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Ye shair thit ye'r wantin fir tae delete this post fir ever?", "confirmations.discard_edit_media.confirm": "Fling awa", "confirmations.discard_edit_media.message": "Ye'v chynges tae the media description or preview thit ye'v no saved, fling them awa onie weys?", - "confirmations.domain_block.message": "Ye a hunner percent shair thit ye'r wantin tae dingie the hail {domain}? In maist cases a haunfae tairgtit dingies an wheeshts are eneuch an preferit. Ye wullnae see content fae that domain in onie public timelines or in yer notes. Yer follaers fae that domain wull be taen awa.", "confirmations.logout.confirm": "Log oot", "confirmations.logout.message": "Ye shair thit ye'r wantin tae log oot?", "confirmations.mute.confirm": "Wheesht", @@ -341,7 +335,6 @@ "notification.follow_request": "{name} is wantin tae follae ye", "notification.mention": "{name} menshied ye", "notification.own_poll": "Yer poll is duin", - "notification.poll": "A poll thit ye votit in is duin", "notification.reblog": "{name} heezed yer post", "notification.status": "{name} juist postit", "notification.update": "{name} editit a post", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 22320daefc1..c4f82c41336 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -23,9 +23,7 @@ "account.follow": "අනුගමනය", "account.followers": "අනුගාමිකයින්", "account.followers.empty": "කිසිවෙක් අනුගමනය කර නැත.", - "account.followers_counter": "{count, plural, one {අනුගාමිකයින් {counter}} other {අනුගාමිකයින් {counter}}}", "account.following": "අනුගමන", - "account.following_counter": "{count, plural, one {අනුගමන {counter}} other {අනුගමන {counter}}}", "account.follows.empty": "තවමත් කිසිවෙක් අනුගමනය නොකරයි.", "account.go_to_profile": "පැතිකඩට යන්න", "account.joined_short": "එක් වූ දිනය", @@ -35,11 +33,11 @@ "account.mute": "@{name} නිහඬ කරන්න", "account.mute_short": "නිහඬ", "account.muted": "නිහඬ කළා", + "account.open_original_page": "මුල් පිටුව අරින්න", "account.posts": "ලිපි", "account.posts_with_replies": "ලිපි සහ පිළිතුරු", "account.report": "@{name} වාර්තා කරන්න", "account.share": "@{name} ගේ පැතිකඩ බෙදාගන්න", - "account.statuses_counter": "{count, plural, one {ලිපි {counter}} other {ලිපි {counter}}}", "account.unblock": "@{name} අනවහිර කරන්න", "account.unblock_domain": "{domain} වසම අනවහිර කරන්න", "account.unblock_short": "අනවහිර", @@ -54,6 +52,10 @@ "alert.unexpected.title": "අපොයි!", "announcement.announcement": "නිවේදනය", "audio.hide": "හඬපටය සඟවන්න", + "block_modal.show_less": "අඩුවෙන් පෙන්වන්න", + "block_modal.show_more": "තව පෙන්වන්න", + "block_modal.they_will_know": "අවහිර කළ බව දකිනු ඇත.", + "block_modal.title": "අවහිර කරන්නද?", "boost_modal.combo": "ඊළඟ වතාවේ මෙය මඟ හැරීමට {combo} එබීමට හැකිය", "bundle_column_error.copy_stacktrace": "දෝෂ වාර්තාවේ පිටපතක්", "bundle_column_error.error.title": "අපොයි!", @@ -103,10 +105,13 @@ "compose_form.lock_disclaimer.lock": "අගුළු දමා ඇත", "compose_form.placeholder": "ඔබගේ සිතුවිලි මොනවාද?", "compose_form.poll.duration": "මත විමසීමේ කාලය", + "compose_form.poll.option_placeholder": "විකල්පය {number}", "compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයකට මත විමසුම වෙනස් කරන්න", "compose_form.poll.switch_to_single": "තනි තේරීමකට මත විමසුම වෙනස් කරන්න", + "compose_form.poll.type": "ශෛලිය", "compose_form.publish": "ප්‍රකාශනය", "compose_form.publish_form": "නව ලිපිය", + "compose_form.reply": "පිළිතුරු", "compose_form.spoiler.marked": "අන්තර්ගත අවවාදය ඉවත් කරන්න", "compose_form.spoiler.unmarked": "අන්තර්ගත අවවාදයක් එක් කරන්න", "confirmation_modal.cancel": "අවලංගු", @@ -126,6 +131,7 @@ "conversation.mark_as_read": "කියවූ බව යොදන්න", "conversation.open": "සංවාදය බලන්න", "conversation.with": "{names} සමඟ", + "copy_icon_button.copied": "පසුරුපුවරුවට පිටපත් විය", "copypaste.copied": "පිටපත් විය", "copypaste.copy_to_clipboard": "පසුරුපුවරුවට පිටපතක්", "directory.federated": "දන්නා ෆෙඩිවර්ස් වෙතින්", @@ -133,6 +139,9 @@ "directory.new_arrivals": "නව පැමිණීම්", "directory.recently_active": "මෑත දී සක්‍රියයි", "disabled_account_banner.account_settings": "ගිණුමේ සැකසුම්", + "dismissable_banner.dismiss": "ඉවතලන්න", + "domain_pill.server": "සේවාදායකය", + "domain_pill.username": "පරිශ්‍රීලක නාමය", "embed.instructions": "පහත කේතය පිටපත් කිරීමෙන් මෙම ලිපිය ඔබගේ අඩවියට කාවද්දන්න.", "embed.preview": "මෙන්න එය පෙනෙන අන්දම:", "emoji_button.activity": "ක්‍රියාකාරකම", @@ -181,9 +190,13 @@ "filter_modal.select_filter.search": "සොයන්න හෝ සාදන්න", "filter_modal.select_filter.title": "මෙම ලිපිය පෙරන්න", "filter_modal.title.status": "ලිපියක් පෙරන්න", + "filtered_notifications_banner.title": "පෙරූ දැනුම්දීම්", + "firehose.all": "සියල්ල", "firehose.local": "මෙම සේවාදායකය", "firehose.remote": "වෙනත් සේවාදායක", "follow_request.reject": "ප්‍රතික්‍ෂේප", + "follow_suggestions.dismiss": "නැවත පෙන්වන්න එපා", + "follow_suggestions.view_all": "සියල්ල බලන්න", "footer.about": "පිළිබඳව", "footer.directory": "පැතිකඩ නාමාවලිය", "footer.get_app": "යෙදුම ගන්න", @@ -205,6 +218,7 @@ "home.pending_critical_update.link": "යාවත්කාල බලන්න", "home.show_announcements": "නිවේදන පෙන්වන්න", "interaction_modal.login.action": "මුලට ගෙනයන්න", + "interaction_modal.on_another_server": "වෙනත් සේවාදායකයක", "interaction_modal.on_this_server": "මෙම සේවාදායකයෙහි", "interaction_modal.title.favourite": "{name}ගේ ලිපිය ප්‍රිය කරන්න", "interaction_modal.title.follow": "{name} අනුගමනය", @@ -275,7 +289,6 @@ "notification.follow": "{name} ඔබව අනුගමනය කළා", "notification.mention": "{name} ඔබව සඳහන් කර ඇත", "notification.own_poll": "ඔබගේ මත විමසුම නිමයි", - "notification.poll": "ඔබ ඡන්දය දුන් මත විමසුමක් නිමයි", "notification.status": "{name} දැන් පළ කළා", "notification.update": "{name} ලිපියක් සංස්කරණය කළා", "notifications.clear": "දැනුම්දීම් මකන්න", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 4c152a21434..57cfd25bf7e 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -35,9 +35,7 @@ "account.follow_back": "Sledovať späť", "account.followers": "Sledovatelia", "account.followers.empty": "Tento účet ešte nikto nesleduje.", - "account.followers_counter": "{count, plural, one {{counter} sledujúci účet} few {{counter} sledujúce účty} many {{counter} sledujúcich účtov} other {{counter} sledujúcich účtov}}", "account.following": "Sledovaný účet", - "account.following_counter": "{count, plural, one {{counter} sledovaný účet} few {{counter} sledované účty} many {{counter} sledovaných účtov} other {{counter} sledovaných účtov}}", "account.follows.empty": "Tento účet ešte nikoho nesleduje.", "account.go_to_profile": "Prejsť na profil", "account.hide_reblogs": "Skryť zdieľania od @{name}", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} vás chce sledovať", "account.share": "Zdieľaj profil @{name}", "account.show_reblogs": "Zobrazovať zdieľania od @{name}", - "account.statuses_counter": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}}", "account.unblock": "Odblokovať @{name}", "account.unblock_domain": "Odblokovať doménu {domain}", "account.unblock_short": "Odblokovať", @@ -91,7 +88,10 @@ "audio.hide": "Skryť zvuk", "block_modal.show_less": "Zobraziť menej", "block_modal.show_more": "Zobraziť viac", + "block_modal.they_cant_mention": "Nemôžu ťa spomenúť, alebo nasledovať.", + "block_modal.they_will_know": "Môžu vidieť, že sú zablokovaní/ý.", "block_modal.title": "Blokovať užívateľa?", + "block_modal.you_wont_see_mentions": "Neuvidíš príspevky, ktoré ich spomínajú.", "boost_modal.combo": "Nabudúce môžete preskočiť stlačením {combo}", "bundle_column_error.copy_stacktrace": "Kopírovať chybovú hlášku", "bundle_column_error.error.body": "Požadovanú stránku nebolo možné vykresliť. Môže to byť spôsobené chybou v našom kóde alebo problémom s kompatibilitou prehliadača.", @@ -164,27 +164,30 @@ "compose_form.spoiler_placeholder": "Varovanie o obsahu (voliteľné)", "confirmation_modal.cancel": "Zruš", "confirmations.block.confirm": "Zablokovať", - "confirmations.cancel_follow_request.confirm": "Stiahnuť žiadosť", - "confirmations.cancel_follow_request.message": "Určite chcete stiahnuť svoju žiadosť o sledovanie {name}?", "confirmations.delete.confirm": "Vymazať", "confirmations.delete.message": "Určite chcete tento príspevok vymazať?", + "confirmations.delete.title": "Vymazať príspevok?", "confirmations.delete_list.confirm": "Vymazať", "confirmations.delete_list.message": "Určite chcete tento zoznam trvalo vymazať?", + "confirmations.delete_list.title": "Vymazať zoznam?", "confirmations.discard_edit_media.confirm": "Zahodiť", "confirmations.discard_edit_media.message": "Máte neuložené zmeny v popise alebo náhľade média, zahodiť ich aj tak?", - "confirmations.domain_block.confirm": "Blokovať server", - "confirmations.domain_block.message": "Určite chcete blokovať celú doménu {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych účtov, čo aj odporúčame. Obsah z tejto domény neuvidíte v žiadnej verejnej časovej osi ani v upozorneniach. Vaši sledujúci pochádzajúci z tejto domény budú odstránení.", "confirmations.edit.confirm": "Upraviť", "confirmations.edit.message": "Úpravou prepíšete príspevok, ktorý máte rozpísaný. Určite chcete pokračovať?", + "confirmations.edit.title": "Prepísať príspevok?", "confirmations.logout.confirm": "Odhlásiť sa", "confirmations.logout.message": "Určite sa chcete odhlásiť?", + "confirmations.logout.title": "Odhlásiť sa?", "confirmations.mute.confirm": "Stíšiť", "confirmations.redraft.confirm": "Vymazať a prepísať", "confirmations.redraft.message": "Určite chcete tento príspevok vymazať a prepísať? Prídete o jeho zdieľania a ohviezdičkovania a odpovede na pôvodný príspevok budú odlúčené.", + "confirmations.redraft.title": "Vymazať a prepísať príspevok?", "confirmations.reply.confirm": "Odpovedať", "confirmations.reply.message": "Odpovedaním akurát teraz prepíšeš správu, ktorú máš práve rozpísanú. Si si istý/á, že chceš pokračovať?", + "confirmations.reply.title": "Prepísať príspevok?", "confirmations.unfollow.confirm": "Prestať sledovať", "confirmations.unfollow.message": "Určite chcete prestať sledovať {name}?", + "confirmations.unfollow.title": "Prestať sledovať užívateľa?", "conversation.delete": "Vymazať konverzáciu", "conversation.mark_as_read": "Označiť ako prečítanú", "conversation.open": "Zobraziť konverzáciu", @@ -206,7 +209,12 @@ "dismissable_banner.public_timeline": "Toto sú najnovšie verejné príspevky od účtov na sociálnej sieti, ktoré sú sledované účtami z {domain}.", "domain_block_modal.block": "Blokovať server", "domain_block_modal.block_account_instead": "Namiesto toho zablokuj @{name}", + "domain_block_modal.they_can_interact_with_old_posts": "Ľudia z tohto servera môžu interaktovať s tvojimi starými príspevkami.", + "domain_block_modal.they_cant_follow": "Nikto z tohoto servera ťa nemôže nasledovať.", + "domain_block_modal.they_wont_know": "Nebude vedieť, že bol/a zablokovaný/á.", "domain_block_modal.title": "Blokovať doménu?", + "domain_block_modal.you_will_lose_followers": "Všetci tvoji nasledovatelia z tohto servera budú odstránení.", + "domain_block_modal.you_wont_see_posts": "Neuvidíš príspevky, ani oboznámenia od užívateľov na tomto serveri.", "domain_pill.server": "Server", "domain_pill.their_server": "Ich digitálny domov, kde žijú všetky ich príspevky.", "domain_pill.username": "Používateľské meno", @@ -277,7 +285,6 @@ "filter_modal.select_filter.subtitle": "Použite existujúcu kategóriu alebo vytvorte novú", "filter_modal.select_filter.title": "Filtrovanie tohto príspevku", "filter_modal.title.status": "Filtrovanie príspevku", - "filtered_notifications_banner.pending_requests": "Oboznámenia od {count, plural, =0 {nikoho} one {jedného človeka} other {# ľudí}} čo môžeš poznať", "filtered_notifications_banner.title": "Filtrované oznámenia", "firehose.all": "Všetko", "firehose.local": "Tento server", @@ -442,17 +449,18 @@ "navigation_bar.security": "Zabezpečenie", "not_signed_in_indicator.not_signed_in": "Ak chcete získať prístup k tomuto zdroju, prihláste sa.", "notification.admin.report": "Účet {name} nahlásil {target}", + "notification.admin.report_statuses_other": "{name} nahlásil/a {target}", "notification.admin.sign_up": "Nová registráciu účtu {name}", "notification.favourite": "{name} hviezdičkuje váš príspevok", "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_delete_statuses": "Niektoré z tvojich príspevkov boli odstránené.", "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ť.", @@ -465,6 +473,7 @@ "notification_requests.title": "Filtrované oboznámenia", "notifications.clear": "Vyčistiť upozornenia", "notifications.clear_confirmation": "Určite chcete nenávratne odstrániť všetky svoje upozornenia?", + "notifications.clear_title": "Vyčistiť upozornenia?", "notifications.column_settings.admin.report": "Nové hlásenia:", "notifications.column_settings.admin.sign_up": "Nové registrácie:", "notifications.column_settings.alert": "Upozornenia na ploche", @@ -626,7 +635,9 @@ "report.unfollow_explanation": "Tento účet sledujete. Ak už nechcete vidieť jeho príspevky vo svojom domovskom kanáli, prestaňte ho sledovať.", "report_notification.attached_statuses": "{count, plural, one {{count} príspevok} few {{count} príspevky} other {{count} príspevkov}} ako príloha", "report_notification.categories.legal": "Právne", + "report_notification.categories.legal_sentence": "nelegálny obsah", "report_notification.categories.other": "Ostatné", + "report_notification.categories.other_sentence": "ostatné", "report_notification.categories.spam": "Spam", "report_notification.categories.violation": "Porušenie pravidla", "report_notification.open": "Otvoriť hlásenie", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 195797143b2..77bd899ad8c 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -35,9 +35,9 @@ "account.follow_back": "Sledi nazaj", "account.followers": "Sledilci", "account.followers.empty": "Nihče ne sledi temu uporabniku.", - "account.followers_counter": "{count, plural, one {ima {counter} sledilca} two {ima {counter} sledilca} few {ima {counter} sledilce} other {ima {counter} sledilcev}}", + "account.followers_counter": "{count, plural, one {{counter} sledilec} two {{counter} sledilca} few {{counter} sledilci} other {{counter} sledilcev}}", "account.following": "Sledim", - "account.following_counter": "{count, plural, one {sledi {count} osebi} two {sledi {count} osebama} few {sledi {count} osebam} other {sledi {count} osebam}}", + "account.following_counter": "{count, plural, one {{counter} sleden} two {{counter} sledena} few {{counter} sledeni} other {{counter} sledenih}}", "account.follows.empty": "Ta uporabnik še ne sledi nikomur.", "account.go_to_profile": "Pojdi na profil", "account.hide_reblogs": "Skrij izpostavitve od @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} vam želi slediti", "account.share": "Deli profil osebe @{name}", "account.show_reblogs": "Pokaži izpostavitve osebe @{name}", - "account.statuses_counter": "{count, plural, one {{count} objava} two {{count} objavi} few {{count} objave} other {{count} objav}}", + "account.statuses_counter": "{count, plural, one {{counter} objava} two {{counter} objavi} few {{counter} objave} other {{counter} objav}}", "account.unblock": "Odblokiraj @{name}", "account.unblock_domain": "Odblokiraj domeno {domain}", "account.unblock_short": "Odblokiraj", @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Opozorilo o vsebini (ni obvezno)", "confirmation_modal.cancel": "Prekliči", "confirmations.block.confirm": "Blokiraj", - "confirmations.cancel_follow_request.confirm": "Umakni zahtevo", - "confirmations.cancel_follow_request.message": "Ali ste prepričani, da želite umakniti svojo zahtevo, da bi sledili {name}?", "confirmations.delete.confirm": "Izbriši", "confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to objavo?", "confirmations.delete_list.confirm": "Izbriši", "confirmations.delete_list.message": "Ali ste prepričani, da želite trajno izbrisati ta seznam?", "confirmations.discard_edit_media.confirm": "Opusti", "confirmations.discard_edit_media.message": "Imate ne shranjene spremembe za medijski opis ali predogled; jih želite kljub temu opustiti?", - "confirmations.domain_block.confirm": "Blokiraj strežnik", - "confirmations.domain_block.message": "Ali ste res, res prepričani, da želite blokirati celotno {domain}? V večini primerov je nekaj ciljnih blokiranj ali utišanj dovolj in boljše. Vsebino iz te domene ne boste videli v javnih časovnicah ali obvestilih. Vaši sledilci iz te domene bodo odstranjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.edit.message": "Urejanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?", "confirmations.logout.confirm": "Odjava", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Uporabite obstoječo kategorijo ali ustvarite novo", "filter_modal.select_filter.title": "Filtriraj to objavo", "filter_modal.title.status": "Filtrirajte objavo", - "filtered_notifications_banner.mentions": "{count, plural, one {omemba} two {omembi} few {omembe} other {omemb}}", - "filtered_notifications_banner.pending_requests": "Obvestila od {count, plural, =0 {nikogar, ki bi ga} one {# človeka, ki bi ga} two {# ljudi, ki bi ju} few {# ljudi, ki bi jih} other {# ljudi, ki bi jih}} lahko poznali", "filtered_notifications_banner.title": "Filtrirana obvestila", "firehose.all": "Vse", "firehose.local": "Ta strežnik", @@ -443,6 +437,8 @@ "mute_modal.title": "Utišaj uporabnika?", "mute_modal.you_wont_see_mentions": "Objav, ki jih omenjajo, ne boste videli.", "mute_modal.you_wont_see_posts": "Še vedno vidijo vaše objave, vi pa ne njihovih.", + "name_and_others": "{name} in {count, plural, one {# drug} two {# druga} few {# drugi} other {# drugih}}", + "name_and_others_with_link": "{name} in {count, plural, one {# drug} two {# druga} few {# drugi} other {# drugih}}", "navigation_bar.about": "O Mastodonu", "navigation_bar.advanced_interface": "Odpri v naprednem spletnem vmesniku", "navigation_bar.blocks": "Blokirani uporabniki", @@ -470,6 +466,10 @@ "navigation_bar.security": "Varnost", "not_signed_in_indicator.not_signed_in": "Za dostop do tega vira se morate prijaviti.", "notification.admin.report": "{name} je prijavil/a {target}", + "notification.admin.report_account": "{name} je prijavil/a {count, plural, one {# objavo} two {# objavi} few {# objave} other {# objav}} od {target} zaradi {category}", + "notification.admin.report_account_other": "{name} je prijavil/a {count, plural, one {# objavo} two {# objavi} few {# objave} other {# objav}} od {target}", + "notification.admin.report_statuses": "{name} je prijavil/a {target} zaradi {category}", + "notification.admin.report_statuses_other": "{name} je prijavil/a {target}", "notification.admin.sign_up": "{name} se je vpisal/a", "notification.favourite": "{name} je vzljubil/a vašo objavo", "notification.follow": "{name} vam sledi", @@ -486,6 +486,7 @@ "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.private_mention": "{name} vas je zasebno omenil/a", "notification.reblog": "{name} je izpostavila/a vašo objavo", "notification.relationships_severance_event": "Povezave z {name} prekinjene", "notification.relationships_severance_event.account_suspension": "Skrbnik na {from} je suspendiral račun {target}, kar pomeni, da od računa ne morete več prejemati posodobitev ali imeti z njim interakcij.", @@ -503,6 +504,8 @@ "notifications.column_settings.admin.report": "Nove prijave:", "notifications.column_settings.admin.sign_up": "Novi vpisi:", "notifications.column_settings.alert": "Namizna obvestila", + "notifications.column_settings.beta.category": "Poskusne funkcionalnosti", + "notifications.column_settings.beta.grouping": "Skupine obvestil", "notifications.column_settings.favourite": "Priljubljeni:", "notifications.column_settings.filter_bar.advanced": "Prikaži vse kategorije", "notifications.column_settings.filter_bar.category": "Vrstica za hitro filtriranje", @@ -666,9 +669,13 @@ "report.unfollow_explanation": "Temu računu sledite. Da ne boste več videli njegovih objav v svojem domačem viru, mu prenehajte slediti.", "report_notification.attached_statuses": "{count, plural, one {{count} objava pripeta} two {{count} objavi pripeti} few {{count} objave pripete} other {{count} objav pripetih}}", "report_notification.categories.legal": "Legalno", + "report_notification.categories.legal_sentence": "nedovoljena vsebina", "report_notification.categories.other": "Drugo", + "report_notification.categories.other_sentence": "drugo", "report_notification.categories.spam": "Neželeno", + "report_notification.categories.spam_sentence": "neželeno", "report_notification.categories.violation": "Kršitev pravila", + "report_notification.categories.violation_sentence": "kršitev pravila", "report_notification.open": "Odpri prijavo", "search.no_recent_searches": "Ni nedavnih iskanj", "search.placeholder": "Iskanje", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 6903bceff6e..e7b79c08bb3 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -35,9 +35,9 @@ "account.follow_back": "Ndiqe gjithashtu", "account.followers": "Ndjekës", "account.followers.empty": "Këtë përdorues ende s’e ndjek kush.", - "account.followers_counter": "{count, plural, one {{counter} Ndjekës} other {{counter} Ndjekës}}", + "account.followers_counter": "{count, plural, one {{counter} ndjekës} other {{counter} ndjekës}}", "account.following": "Ndjekje", - "account.following_counter": "{count, plural, one {{counter} i Ndjekur} other {{counter} të Ndjekur}}", + "account.following_counter": "{count, plural, one {{counter} i ndjekur} other {{counter} të ndjekur}}", "account.follows.empty": "Ky përdorues ende s’ndjek kënd.", "account.go_to_profile": "Kalo te profili", "account.hide_reblogs": "Fshih përforcime nga @{name}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} ka kërkuar t’ju ndjekë", "account.share": "Ndajeni profilin e @{name} me të tjerët", "account.show_reblogs": "Shfaq përforcime nga @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Mesazh} other {{counter} Mesazhe}}", + "account.statuses_counter": "{count, plural, one {{counter} postim} other {{counter} postime}}", "account.unblock": "Zhbllokoje @{name}", "account.unblock_domain": "Zhblloko përkatësinë {domain}", "account.unblock_short": "Zhbllokoje", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Sinjalizim lënde (opsional)", "confirmation_modal.cancel": "Anuloje", "confirmations.block.confirm": "Bllokoje", - "confirmations.cancel_follow_request.confirm": "Tërhiqeni mbrapsht kërkesën", - "confirmations.cancel_follow_request.message": "Jeni i sigurt se doni të tërhiqni mbrapsht kërkesën tuaj për ndjekje të {name}?", "confirmations.delete.confirm": "Fshije", "confirmations.delete.message": "Jeni i sigurt se doni të fshihet kjo gjendje?", + "confirmations.delete.title": "Të fshihet postimi?", "confirmations.delete_list.confirm": "Fshije", "confirmations.delete_list.message": "Jeni i sigurt se doni të fshihet përgjithmonë kjo listë?", + "confirmations.delete_list.title": "Të fshihet lista?", "confirmations.discard_edit_media.confirm": "Hidhe tej", "confirmations.discard_edit_media.message": "Keni ndryshime të paruajtura te përshkrimi ose paraparja e medias, të hidhen tej, sido qoftë?", - "confirmations.domain_block.confirm": "Bllokoje shërbyesin", - "confirmations.domain_block.message": "Jeni i sigurt, shumë i sigurt se doni të bllokohet krejt {domain}? Në shumicën e rasteve, ndoca bllokime ose heshtime me synim të caktuar janë të mjaftueshme dhe të parapëlqyera. S’keni për të parë lëndë nga kjo përkatësi në ndonjë rrjedhë kohore publike, apo te njoftimet tuaja. Ndjekësit tuaj prej asaj përkatësie do të hiqen.", "confirmations.edit.confirm": "Përpunojeni", "confirmations.edit.message": "Përpunimi tani do të sjellë mbishkrim të mesazhit që po hartoni aktualisht. Jeni i sigurt se doni të vazhdohet?", + "confirmations.edit.title": "Të mbishkruhet postimi?", "confirmations.logout.confirm": "Dilni", "confirmations.logout.message": "Jeni i sigurt se doni të dilet?", + "confirmations.logout.title": "Të dilet?", "confirmations.mute.confirm": "Heshtoje", "confirmations.redraft.confirm": "Fshijeni & rihartojeni", "confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Të parapëlqyerit dhe përforcimet do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.", + "confirmations.redraft.title": "Të fshihet & riharothet postimi?", "confirmations.reply.confirm": "Përgjigjuni", "confirmations.reply.message": "Po të përgjigjeni tani, mesazhi që po hartoni, do të mbishkruhet. Jeni i sigurt se doni të vazhdohet më tej?", + "confirmations.reply.title": "Të mbishkruhet postimi?", "confirmations.unfollow.confirm": "Resht së ndjekuri", "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?", + "confirmations.unfollow.title": "Të ndalet ndjekja e përdoruesit?", "conversation.delete": "Fshije bisedën", "conversation.mark_as_read": "Vëri shenjë si të lexuar", "conversation.open": "Shfaq bisedën", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Përdorni një kategori ekzistuese, ose krijoni një të re", "filter_modal.select_filter.title": "Filtroje këtë postim", "filter_modal.title.status": "Filtroni një postim", - "filtered_notifications_banner.mentions": "{count, plural, one {përmendje} other {përmendje}}", - "filtered_notifications_banner.pending_requests": "Njoftime prej {count, plural, =0 {askujt} one {një personi} other {# vetësh}} që mund të njihni", + "filtered_notifications_banner.pending_requests": "Nga {count, plural, =0 {askush} one {një person} other {# vetë}} që mund të njihni", "filtered_notifications_banner.title": "Njoftime të filtruar", "firehose.all": "Krejt", "firehose.local": "Këtë shërbyes", @@ -443,6 +445,8 @@ "mute_modal.title": "Të heshtohet përdoruesi?", "mute_modal.you_wont_see_mentions": "S’do të shihni postime ku përmenden.", "mute_modal.you_wont_see_posts": "Ata munden ende të shohin postimet tuaja, por ju s’do të shihni të tyret.", + "name_and_others": "{name} dhe {count, plural, one {# tjetër} other {# të tjerë}}", + "name_and_others_with_link": "{name} dhe {count, plural, one {# tjetër} other {# të tjerë}}", "navigation_bar.about": "Mbi", "navigation_bar.advanced_interface": "Hape në ndërfaqe web të thelluar", "navigation_bar.blocks": "Përdorues të bllokuar", @@ -470,6 +474,10 @@ "navigation_bar.security": "Siguri", "not_signed_in_indicator.not_signed_in": "Që të përdorni këtë burim, lypset të bëni hyrjen.", "notification.admin.report": "{name} raportoi {target}", + "notification.admin.report_account": "{name} raportoi për {count, plural, one {një postim} other {# postime}} nga {target} për {category}", + "notification.admin.report_account_other": "{name} raportoi për {count, plural, one {një postim} other {# postime}} nga {target}", + "notification.admin.report_statuses": "{name} raportoi {target} për {category}", + "notification.admin.report_statuses_other": "{name} raportoi {target}", "notification.admin.sign_up": "{name} u regjistrua", "notification.favourite": "{name} i vuri shenjë postimit tuaj si të parapëlqyer", "notification.follow": "{name} zuri t’ju ndjekë", @@ -485,7 +493,8 @@ "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.poll": "Ka përfunduar një pyetësor në të cilin keni marrë pjesë", + "notification.private_mention": "{name} ju përmendi privatisht", "notification.reblog": "{name} përforcoi mesazhin tuaj", "notification.relationships_severance_event": "Lidhje të humbura me {name}", "notification.relationships_severance_event.account_suspension": "Një përgjegjës nga {from} ka pezulluar {target}, që do të thotë se s’mund të merrni më përditësime prej tij, apo të ndërveproni me të.", @@ -496,13 +505,18 @@ "notification.update": "{name} përpunoi një postim", "notification_requests.accept": "Pranoje", "notification_requests.dismiss": "Hidhe tej", + "notification_requests.maximize": "Maksimizoje", + "notification_requests.minimize_banner": "Minimizo banderolë njoftimesh të filtruara", "notification_requests.notifications_from": "Njoftime prej {name}", "notification_requests.title": "Njoftime të filtruar", "notifications.clear": "Spastroji njoftimet", "notifications.clear_confirmation": "Jeni i sigurt se doni të spastrohen përgjithmonë krejt njoftimet tuaja?", + "notifications.clear_title": "Të spastrohen njoftimet?", "notifications.column_settings.admin.report": "Raportime të reja:", "notifications.column_settings.admin.sign_up": "Regjistrime të reja:", "notifications.column_settings.alert": "Njoftime desktopi", + "notifications.column_settings.beta.category": "Veçori eksperimentale", + "notifications.column_settings.beta.grouping": "Njoftime grupi", "notifications.column_settings.favourite": "Të parapëlqyer:", "notifications.column_settings.filter_bar.advanced": "Shfaq krejt kategoritë", "notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Po e ndiqni këtë llogari. Për të mos parë më postimet e tyre te prurja juaj e kreut, ndalni ndjekjen e tyre.", "report_notification.attached_statuses": "{count, plural, one {{count} postim} other {{count} postime}} bashkëngjitur", "report_notification.categories.legal": "Ligjore", + "report_notification.categories.legal_sentence": "lëndë e paligjshme", "report_notification.categories.other": "Tjetër", + "report_notification.categories.other_sentence": "tjetër", "report_notification.categories.spam": "I padëshiruar", + "report_notification.categories.spam_sentence": "mesazh i padëshiruar", "report_notification.categories.violation": "Cenim rregullash", + "report_notification.categories.violation_sentence": "cenim rregullash", "report_notification.open": "Hape raportimin", "search.no_recent_searches": "Pa kërkime së fundi", "search.placeholder": "Kërkoni", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 63b2e03c96c..a58376af041 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -63,7 +63,7 @@ "account.requested_follow": "{name} je zatražio da vas prati", "account.share": "Podeli profil korisnika @{name}", "account.show_reblogs": "Prikaži podržavanja od korisnika @{name}", - "account.statuses_counter": "{count, plural, one {{counter} objavio} few {{counter} objavio} other {{counter} objavio}}", + "account.statuses_counter": "{count, plural, one {{counter} objava} few {{counter} objave} other {{counter} objava}}", "account.unblock": "Odblokiraj korisnika @{name}", "account.unblock_domain": "Odblokiraj domen {domain}", "account.unblock_short": "Odblokiraj", @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Upozorenje o sadržaju (opciono)", "confirmation_modal.cancel": "Otkaži", "confirmations.block.confirm": "Blokiraj", - "confirmations.cancel_follow_request.confirm": "Povuci zahtev", - "confirmations.cancel_follow_request.message": "Da li ste sigurni da želite da povučete zahtev da pratite {name}?", "confirmations.delete.confirm": "Izbriši", "confirmations.delete.message": "Da li ste sigurni da želite da izbrišete ovu objavu?", "confirmations.delete_list.confirm": "Izbriši", "confirmations.delete_list.message": "Da li ste sigurni da želite da trajno izbrišete ovu listu?", "confirmations.discard_edit_media.confirm": "Odbaci", "confirmations.discard_edit_media.message": "Imate nesačuvane promene u opisu ili pregledu medija, da li ipak hoćete da ih odbacite?", - "confirmations.domain_block.confirm": "Blokiraj server", - "confirmations.domain_block.message": "Da li ste zaista sigurni da želite da blokirate ceo domen {domain}? U većini slučajeva, dovoljno je i poželjno nekoliko ciljanih blokiranja ili ignorisanja. Nećete videti sadržaj sa tog domena ni u jednoj javnoj vremenskoj liniji ili u vašim obaveštenjima. Vaši pratioci sa tog domena će biti uklonjeni.", "confirmations.edit.confirm": "Uredi", "confirmations.edit.message": "Uređivanjem će se obrisati poruka koju trenutno sastavljate. Da li ste sigurni da želite da nastavite?", "confirmations.logout.confirm": "Odjava", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Koristite postojeću kategoriju ili kreirajte novu", "filter_modal.select_filter.title": "Filtriraj ovu objavu", "filter_modal.title.status": "Filtriraj objavu", - "filtered_notifications_banner.mentions": "{count, plural, one {pominjanje} few {pominjanja} other {pominjanja}}", - "filtered_notifications_banner.pending_requests": "Obaveštenja od {count, plural, =0 {nikoga koga možda poznajete} one {# osobe koju možda poznajete} few {# osobe koje možda poznajete} other {# osoba koje možda poznajete}}", "filtered_notifications_banner.title": "Filtrirana obaveštenja", "firehose.all": "Sve", "firehose.local": "Ovaj server", @@ -485,7 +479,6 @@ "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", "notification.relationships_severance_event": "Izgubljena veza sa {name}", "notification.relationships_severance_event.account_suspension": "Administrator sa {from} je suspendovao {target}, što znači da više ne možete da primate ažuriranja od njih niti da komunicirate sa njima.", @@ -696,8 +689,11 @@ "server_banner.about_active_users": "Ljudi koji su koristili ovaj server u prethodnih 30 dana (mesečno aktivnih korisnika)", "server_banner.active_users": "aktivnih korisnika", "server_banner.administered_by": "Administrira:", + "server_banner.is_one_of_many": "{domain} je jedan od mnogih nezavisnih Mastodon servera koje možete koristiti za učešće u fediverzumu.", "server_banner.server_stats": "Statistike servera:", "sign_in_banner.create_account": "Napravite nalog", + "sign_in_banner.follow_anyone": "Pratite bilo koga širom fediverzuma i pogledajte sve hronološkim redom. Nema algoritama, reklama ili mamaca za klikove na vidiku.", + "sign_in_banner.mastodon_is": "Mastodon je najbolji način da budete u toku sa onim što se dešava.", "sign_in_banner.sign_in": "Prijavite se", "sign_in_banner.sso_redirect": "Prijavite se ili se registrujte", "status.admin_account": "Otvori moderatorsko okruženje za @{name}", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index c6b969e982f..2c9948299da 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -63,7 +63,7 @@ "account.requested_follow": "{name} је затражио да вас прати", "account.share": "Подели профил корисника @{name}", "account.show_reblogs": "Прикажи подржавања од корисника @{name}", - "account.statuses_counter": "{count, plural, one {{counter} објавио} few {{counter} објавио} other {{counter} објавио}}", + "account.statuses_counter": "{count, plural, one {{counter} објава} few {{counter} објаве} other {{counter} објава}}", "account.unblock": "Одблокирај корисника @{name}", "account.unblock_domain": "Одблокирај домен {domain}", "account.unblock_short": "Одблокирај", @@ -169,16 +169,12 @@ "compose_form.spoiler_placeholder": "Упозорење о садржају (опционо)", "confirmation_modal.cancel": "Откажи", "confirmations.block.confirm": "Блокирај", - "confirmations.cancel_follow_request.confirm": "Повуци захтев", - "confirmations.cancel_follow_request.message": "Да ли сте сигурни да желите да повучете захтев да пратите {name}?", "confirmations.delete.confirm": "Избриши", "confirmations.delete.message": "Да ли сте сигурни да желите да избришете ову објаву?", "confirmations.delete_list.confirm": "Избриши", "confirmations.delete_list.message": "Да ли сте сигурни да желите да трајно избришете ову листу?", "confirmations.discard_edit_media.confirm": "Одбаци", "confirmations.discard_edit_media.message": "Имате несачуване промене у опису или прегледу медија, да ли ипак хоћете да их одбаците?", - "confirmations.domain_block.confirm": "Блокирај сервер", - "confirmations.domain_block.message": "Да ли сте заиста сигурни да желите да блокирате цео домен {domain}? У већини случајева, довољно је и пожељно неколико циљаних блокирања или игнорисања. Нећете видети садржај са тог домена ни у једној јавној временској линији или у вашим обавештењима. Ваши пратиоци са тог домена ће бити уклоњени.", "confirmations.edit.confirm": "Уреди", "confirmations.edit.message": "Уређивањем ће се обрисати порука коју тренутно састављате. Да ли сте сигурни да желите да наставите?", "confirmations.logout.confirm": "Одјава", @@ -297,8 +293,6 @@ "filter_modal.select_filter.subtitle": "Користите постојећу категорију или креирајте нову", "filter_modal.select_filter.title": "Филтрирај ову објаву", "filter_modal.title.status": "Филтрирај објаву", - "filtered_notifications_banner.mentions": "{count, plural, one {помињање} few {помињања} other {помињања}}", - "filtered_notifications_banner.pending_requests": "Обавештења од {count, plural, =0 {никога кога можда познајете} one {# особе коју можда познајете} few {# особе које можда познајете} other {# особа које можда познајете}}", "filtered_notifications_banner.title": "Филтрирана обавештења", "firehose.all": "Све", "firehose.local": "Овај сервер", @@ -485,7 +479,6 @@ "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}, што значи да више не можете да примате ажурирања од њих нити да комуницирате са њима.", @@ -696,8 +689,11 @@ "server_banner.about_active_users": "Људи који су користили овај сервер у претходних 30 дана (месечно активних корисника)", "server_banner.active_users": "активних корисника", "server_banner.administered_by": "Администрира:", + "server_banner.is_one_of_many": "{domain} је један од многих независних Mastodon сервера које можете користити за учешће у федиверзуму.", "server_banner.server_stats": "Статистике сервера:", "sign_in_banner.create_account": "Направите налог", + "sign_in_banner.follow_anyone": "Пратите било кога широм федиверзума и погледајте све хронолошким редом. Нема алгоритама, реклама или мамаца за кликове на видику.", + "sign_in_banner.mastodon_is": "Mastodon је најбољи начин да будете у току са оним што се дешава.", "sign_in_banner.sign_in": "Пријавите се", "sign_in_banner.sso_redirect": "Пријавите се или се региструјте", "status.admin_account": "Отвори модераторско окружење за @{name}", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index ced6c36054f..b3f70cf2ede 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -37,7 +37,7 @@ "account.followers.empty": "Ingen följer denna användare än.", "account.followers_counter": "{count, plural, one {{counter} följare} other {{counter} följare}}", "account.following": "Följer", - "account.following_counter": "{count, plural, one {{counter} följd} other {{counter} följda}}", + "account.following_counter": "{count, plural, one {{counter} följer} other {{counter} följer}}", "account.follows.empty": "Denna användare följer inte någon än.", "account.go_to_profile": "Gå till profilen", "account.hide_reblogs": "Dölj boostar från @{name}", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Innehållsvarning (valfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.confirm": "Blockera", - "confirmations.cancel_follow_request.confirm": "Återkalla förfrågan", - "confirmations.cancel_follow_request.message": "Är du säker på att du vill återkalla din begäran om att följa {name}?", "confirmations.delete.confirm": "Radera", "confirmations.delete.message": "Är du säker på att du vill radera detta inlägg?", + "confirmations.delete.title": "Ta bort inlägg?", "confirmations.delete_list.confirm": "Radera", "confirmations.delete_list.message": "Är du säker på att du vill radera denna lista permanent?", + "confirmations.delete_list.title": "Ta bort listan?", "confirmations.discard_edit_media.confirm": "Kasta", "confirmations.discard_edit_media.message": "Du har osparade ändringar till mediabeskrivningen eller förhandsgranskningen, kasta bort dem ändå?", - "confirmations.domain_block.confirm": "Blockera server", - "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer inte se innehåll från den domänen i den allmänna tidslinjen eller i dina aviseringar. Dina följare från den domänen komer att tas bort.", "confirmations.edit.confirm": "Redigera", "confirmations.edit.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skapa. Är du säker på att du vill fortsätta?", + "confirmations.edit.title": "Skriva över inlägg?", "confirmations.logout.confirm": "Logga ut", "confirmations.logout.message": "Är du säker på att du vill logga ut?", + "confirmations.logout.title": "Logga ut?", "confirmations.mute.confirm": "Tysta", "confirmations.redraft.confirm": "Radera & gör om", "confirmations.redraft.message": "Är du säker på att du vill radera detta inlägg och göra om det? Favoritmarkeringar, boostar och svar till det ursprungliga inlägget kommer förlora sitt sammanhang.", + "confirmations.redraft.title": "Ta bort & gör om inlägget?", "confirmations.reply.confirm": "Svara", "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skapa. Är du säker på att du vill fortsätta?", + "confirmations.reply.title": "Skriva över inlägget?", "confirmations.unfollow.confirm": "Avfölj", "confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?", + "confirmations.unfollow.title": "Avfölj %s?", "conversation.delete": "Radera konversation", "conversation.mark_as_read": "Markera som läst", "conversation.open": "Visa konversation", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "Använd en befintlig kategori eller skapa en ny", "filter_modal.select_filter.title": "Filtrera detta inlägg", "filter_modal.title.status": "Filtrera ett inlägg", - "filtered_notifications_banner.mentions": "{count, plural, one {omnämning} other {omnämnanden}}", - "filtered_notifications_banner.pending_requests": "Aviseringar från {count, plural, =0 {ingen} one {en person} other {# personer}} du kanske känner", "filtered_notifications_banner.title": "Filtrerade aviseringar", "firehose.all": "Allt", "firehose.local": "Denna server", @@ -443,6 +444,8 @@ "mute_modal.title": "Tysta användare?", "mute_modal.you_wont_see_mentions": "Du kommer inte att se inlägg som nämner dem.", "mute_modal.you_wont_see_posts": "De kan fortfarande se dina inlägg, men du kan inte se deras.", + "name_and_others": "{name} och {count, plural, one {# annan} other {# andra}}", + "name_and_others_with_link": "{name} och {count, plural, one {# annan} other {# andra}}", "navigation_bar.about": "Om", "navigation_bar.advanced_interface": "Öppna i avancerat webbgränssnitt", "navigation_bar.blocks": "Blockerade användare", @@ -470,6 +473,10 @@ "navigation_bar.security": "Säkerhet", "not_signed_in_indicator.not_signed_in": "Du behöver logga in för att få åtkomst till denna resurs.", "notification.admin.report": "{name} rapporterade {target}", + "notification.admin.report_account": "{name} rapporterade {count, plural, one {ett inlägg} other {# inlägg}} från {target} för {category}", + "notification.admin.report_account_other": "{name} rapporterade {count, plural, one {ett inlägg} other {# inlägg}} från {target}", + "notification.admin.report_statuses": "{name} rapporterade {target} för {category}", + "notification.admin.report_statuses_other": "{name} rapporterade {target}", "notification.admin.sign_up": "{name} registrerade sig", "notification.favourite": "{name} favoritmarkerade ditt inlägg", "notification.follow": "{name} följer dig", @@ -485,7 +492,8 @@ "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.poll": "En enkät som du röstat i har avslutats", + "notification.private_mention": "{name} nämnde dig privat", "notification.reblog": "{name} boostade ditt inlägg", "notification.relationships_severance_event": "Förlorade kontakter med {name}", "notification.relationships_severance_event.account_suspension": "En administratör från {from} har stängt av {target}, vilket innebär att du inte längre kan ta emot uppdateringar från dem eller interagera med dem.", @@ -500,9 +508,12 @@ "notification_requests.title": "Filtrerade meddelanden", "notifications.clear": "Rensa aviseringar", "notifications.clear_confirmation": "Är du säker på att du vill rensa alla dina aviseringar permanent?", + "notifications.clear_title": "Rensa aviseringar?", "notifications.column_settings.admin.report": "Nya rapporter:", "notifications.column_settings.admin.sign_up": "Nya registreringar:", "notifications.column_settings.alert": "Skrivbordsaviseringar", + "notifications.column_settings.beta.category": "Experimentella funktioner", + "notifications.column_settings.beta.grouping": "Gruppera notifikationer", "notifications.column_settings.favourite": "Favoriter:", "notifications.column_settings.filter_bar.advanced": "Visa alla kategorier", "notifications.column_settings.filter_bar.category": "Snabbfilter", @@ -666,9 +677,13 @@ "report.unfollow_explanation": "Du följer detta konto. Avfölj hen för att inte se hens inlägg i ditt hemflöde.", "report_notification.attached_statuses": "bifogade {count, plural, one {{count} inlägg} other {{count} inlägg}}", "report_notification.categories.legal": "Rättsligt", + "report_notification.categories.legal_sentence": "olagligt innehåll", "report_notification.categories.other": "Övrigt", + "report_notification.categories.other_sentence": "övrigt", "report_notification.categories.spam": "Skräppost", + "report_notification.categories.spam_sentence": "skräppost", "report_notification.categories.violation": "Regelöverträdelse", + "report_notification.categories.violation_sentence": "regelöverträdelse", "report_notification.open": "Öppna rapport", "search.no_recent_searches": "Inga sökningar nyligen", "search.placeholder": "Sök", @@ -696,8 +711,11 @@ "server_banner.about_active_users": "Personer som använt denna server de senaste 30 dagarna (månatligt aktiva användare)", "server_banner.active_users": "aktiva användare", "server_banner.administered_by": "Administrerad av:", + "server_banner.is_one_of_many": "{domain} är en av de många oberoende Mastodon-servrar som du kan använda för att delta i Fediversen.", "server_banner.server_stats": "Serverstatistik:", "sign_in_banner.create_account": "Skapa konto", + "sign_in_banner.follow_anyone": "Följ vem som helst över Fediverse och se allt i kronologisk ordning. Inga algoritmer, inga annonser och inga klickbeten i sikte.", + "sign_in_banner.mastodon_is": "Mastodon är det bästa sättet att hänga med i vad som händer.", "sign_in_banner.sign_in": "Logga in", "sign_in_banner.sso_redirect": "Logga in eller registrera dig", "status.admin_account": "Öppet modereringsgränssnitt för @{name}", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index 43cfc78d5bb..34d086eb48c 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -23,7 +23,6 @@ "account.posts": "Toots", "account.posts_with_replies": "Toots and replies", "account.requested": "Awaiting approval", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account_note.placeholder": "Click to add a note", "column.pins": "Pinned toot", "community.column_settings.media_only": "Media only", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index ac0984293af..ef3255a7dad 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -24,9 +24,7 @@ "account.follow_back": "பின்தொடரு", "account.followers": "பின்தொடர்பவர்கள்", "account.followers.empty": "இதுவரை யாரும் இந்த பயனரைப் பின்தொடரவில்லை.", - "account.followers_counter": "{count, plural, one {{counter} வாசகர்} other {{counter} வாசகர்கள்}}", "account.following": "பின்தொடரும்", - "account.following_counter": "{count, plural,one {{counter} சந்தா} other {{counter} சந்தாக்கள்}}", "account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.", "account.go_to_profile": "சுயவிவரத்திற்குச் செல்லவும்", "account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}", @@ -45,7 +43,6 @@ "account.requested": "ஒப்புதலுக்காகக் காத்திருக்கிறது. பின்தொடரும் கோரிக்கையை நீக்க அழுத்தவும்", "account.share": "@{name} உடைய விவரத்தை பகிர்", "account.show_reblogs": "காட்டு boosts இருந்து @{name}", - "account.statuses_counter": "{count, plural, one {{counter} டூட்} other {{counter} டூட்டுகள்}}", "account.unblock": "@{name} மீது தடை நீக்குக", "account.unblock_domain": "{domain} ஐ காண்பி", "account.unblock_short": "தடையை நீக்கு", @@ -133,7 +130,6 @@ "confirmations.delete_list.message": "இப்பட்டியலை நிரந்தரமாக நீக்க நிச்சயம் விரும்புகிறீர்களா?", "confirmations.discard_edit_media.confirm": "நிராகரி", "confirmations.discard_edit_media.message": "சேமிக்கப்படாத மாற்றங்கள் ஊடக விளக்கம் அல்லது முன்னோட்டத்தில் உள்ளது. அவற்றை நிராகரிக்கவா?", - "confirmations.domain_block.message": "நீங்கள் முழு {domain} களத்தையும் நிச்சயமாக, நிச்சயமாகத் தடுக்க விரும்புகிறீர்களா? பெரும்பாலும் சில குறிப்பிட்ட பயனர்களைத் தடுப்பதே போதுமானது. முழு களத்தையும் தடுத்தால், அதிலிருந்து வரும் எந்தப் பதிவையும் உங்களால் காண முடியாது, மேலும் அப்பதிவுகள் குறித்த அறிவிப்புகளும் உங்களுக்கு வராது. அந்தக் களத்தில் இருக்கும் பின்தொடர்பவர்கள் உங்கள் பக்கத்திலிருந்து நீக்கப்படுவார்கள்.", "confirmations.logout.confirm": "வெளியேறு", "confirmations.logout.message": "நிச்சயமாக நீங்கள் வெளியேற விரும்புகிறீர்களா?", "confirmations.mute.confirm": "அமைதியாக்கு", @@ -281,7 +277,6 @@ "notification.follow_request": "{name} உங்களைப் பின்தொடரக் கோருகிறார்", "notification.mention": "{name} நீங்கள் குறிப்பிட்டுள்ளீர்கள்", "notification.own_poll": "கருத்துக்கணிப்பு நிறைவடைந்தது", - "notification.poll": "நீங்கள் வாக்களித்த வாக்கெடுப்பு முடிவடைந்தது", "notification.reblog": "{name} உங்கள் நிலை அதிகரித்தது", "notifications.clear": "அறிவிப்புகளை அழிக்கவும்", "notifications.clear_confirmation": "உங்கள் எல்லா அறிவிப்புகளையும் நிரந்தரமாக அழிக்க விரும்புகிறீர்களா?", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index 825cfb93bdf..cad6e8eaa5a 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -9,7 +9,6 @@ "account.posts": "Huah-siann", "account.posts_with_replies": "Huah-siann kah huê-ìng", "account.requested": "Tán-thāi phue-tsún", - "account.statuses_counter": "{count, plural, one {{counter} Huah-siann} other {{counter} Huah-siann}}", "account_note.placeholder": "Tiám tsi̍t-ē ka-thiam pī-tsù", "column.pins": "Tah thâu-tsîng ê huah-siann", "community.column_settings.media_only": "Kan-na muî-thé", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 284102c381b..d3e1026889f 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -25,7 +25,6 @@ "account.requested": "ఆమోదం కోసం వేచి ఉంది. అభ్యర్థనను రద్దు చేయడానికి క్లిక్ చేయండి", "account.share": "@{name} యొక్క ప్రొఫైల్ను పంచుకోండి", "account.show_reblogs": "@{name}నుంచి బూస్ట్ లను చూపించు", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "@{name}పై బ్లాక్ ను తొలగించు", "account.unblock_domain": "{domain}ను దాచవద్దు", "account.unendorse": "ప్రొఫైల్లో చూపించవద్దు", @@ -74,7 +73,6 @@ "confirmations.delete.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించాలనుకుంటున్నారా?", "confirmations.delete_list.confirm": "తొలగించు", "confirmations.delete_list.message": "మీరు ఖచ్చితంగా ఈ జాబితాను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", - "confirmations.domain_block.message": "మీరు నిజంగా నిజంగా మొత్తం {domain} ని బ్లాక్ చేయాలనుకుంటున్నారా? చాలా సందర్భాలలో కొన్ని లక్ష్యంగా ఉన్న బ్లాక్స్ లేదా మ్యూట్స్ సరిపోతాయి మరియు ఉత్తమమైనవి. మీరు ఆ డొమైన్ నుండి కంటెంట్ను ఏ ప్రజా కాలక్రమాలలో లేదా మీ నోటిఫికేషన్లలో చూడలేరు. ఆ డొమైన్ నుండి మీ అనుచరులు తీసివేయబడతారు.", "confirmations.mute.confirm": "మ్యూట్ చేయి", "confirmations.redraft.confirm": "తొలగించు & తిరగరాయు", "confirmations.reply.confirm": "ప్రత్యుత్తరమివ్వు", @@ -188,7 +186,6 @@ "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", "notification.follow": "{name} మిమ్మల్ని అనుసరిస్తున్నారు", "notification.mention": "{name} మిమ్మల్ని ప్రస్తావించారు", - "notification.poll": "మీరు పాల్గొనిన ఎన్సిక ముగిసినది", "notification.reblog": "{name} మీ స్టేటస్ ను బూస్ట్ చేసారు", "notifications.clear": "ప్రకటనలను తుడిచివేయు", "notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 64abb394bfc..b4d259f174f 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "คำเตือนเนื้อหา (ไม่จำเป็น)", "confirmation_modal.cancel": "ยกเลิก", "confirmations.block.confirm": "ปิดกั้น", - "confirmations.cancel_follow_request.confirm": "ถอนคำขอ", - "confirmations.cancel_follow_request.message": "คุณแน่ใจหรือไม่ว่าต้องการถอนคำขอเพื่อติดตาม {name} ของคุณ?", "confirmations.delete.confirm": "ลบ", "confirmations.delete.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้?", + "confirmations.delete.title": "ลบโพสต์?", "confirmations.delete_list.confirm": "ลบ", "confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?", + "confirmations.delete_list.title": "ลบรายการ?", "confirmations.discard_edit_media.confirm": "ละทิ้ง", "confirmations.discard_edit_media.message": "คุณมีการเปลี่ยนแปลงคำอธิบายหรือตัวอย่างสื่อที่ยังไม่ได้บันทึก ละทิ้งการเปลี่ยนแปลงเหล่านั้นต่อไป?", - "confirmations.domain_block.confirm": "ปิดกั้นเซิร์ฟเวอร์", - "confirmations.domain_block.message": "คุณแน่ใจจริง ๆ หรือไม่ว่าต้องการปิดกั้นทั้ง {domain}? ในกรณีส่วนใหญ่ การปิดกั้นหรือการซ่อนแบบกำหนดเป้าหมายไม่กี่รายการนั้นเพียงพอและเป็นที่นิยม คุณจะไม่เห็นเนื้อหาจากโดเมนนั้นในเส้นเวลาสาธารณะใด ๆ หรือการแจ้งเตือนของคุณ จะเอาผู้ติดตามของคุณจากโดเมนนั้นออก", "confirmations.edit.confirm": "แก้ไข", "confirmations.edit.message": "การแก้ไขในตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียนในปัจจุบัน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "confirmations.edit.title": "เขียนทับโพสต์?", "confirmations.logout.confirm": "ออกจากระบบ", "confirmations.logout.message": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?", + "confirmations.logout.title": "ออกจากระบบ?", "confirmations.mute.confirm": "ซ่อน", "confirmations.redraft.confirm": "ลบแล้วร่างใหม่", "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะสูญหาย และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน", + "confirmations.redraft.title": "ลบแล้วร่างโพสต์ใหม่?", "confirmations.reply.confirm": "ตอบกลับ", "confirmations.reply.message": "การตอบกลับในตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียนในปัจจุบัน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "confirmations.reply.title": "เขียนทับโพสต์?", "confirmations.unfollow.confirm": "เลิกติดตาม", "confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?", + "confirmations.unfollow.title": "เลิกติดตามผู้ใช้?", "conversation.delete": "ลบการสนทนา", "conversation.mark_as_read": "ทำเครื่องหมายว่าอ่านแล้ว", "conversation.open": "ดูการสนทนา", @@ -297,8 +300,6 @@ "filter_modal.select_filter.subtitle": "ใช้หมวดหมู่ที่มีอยู่หรือสร้างหมวดหมู่ใหม่", "filter_modal.select_filter.title": "กรองโพสต์นี้", "filter_modal.title.status": "กรองโพสต์", - "filtered_notifications_banner.mentions": "{count, plural, other {การกล่าวถึง}}", - "filtered_notifications_banner.pending_requests": "การแจ้งเตือนจาก {count, plural, =0 {ไม่มีใคร} other {# คน}} ที่คุณอาจรู้จัก", "filtered_notifications_banner.title": "การแจ้งเตือนที่กรองอยู่", "firehose.all": "ทั้งหมด", "firehose.local": "เซิร์ฟเวอร์นี้", @@ -443,6 +444,8 @@ "mute_modal.title": "ซ่อนผู้ใช้?", "mute_modal.you_wont_see_mentions": "คุณจะไม่เห็นโพสต์ที่กล่าวถึงเขา", "mute_modal.you_wont_see_posts": "เขายังคงสามารถเห็นโพสต์ของคุณ แต่คุณจะไม่เห็นโพสต์ของเขา", + "name_and_others": "{name} และ {count, plural, other {# อื่น ๆ}}", + "name_and_others_with_link": "{name} และ {count, plural, other {# อื่น ๆ}}", "navigation_bar.about": "เกี่ยวกับ", "navigation_bar.advanced_interface": "เปิดในส่วนติดต่อเว็บขั้นสูง", "navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่", @@ -470,6 +473,10 @@ "navigation_bar.security": "ความปลอดภัย", "not_signed_in_indicator.not_signed_in": "คุณจำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงทรัพยากรนี้", "notification.admin.report": "{name} ได้รายงาน {target}", + "notification.admin.report_account": "{name} ได้รายงาน {count, plural, other {# โพสต์}}จาก {target} สำหรับ {category}", + "notification.admin.report_account_other": "{name} ได้รายงาน {count, plural, other {# โพสต์}}จาก {target}", + "notification.admin.report_statuses": "{name} ได้รายงาน {target} สำหรับ {category}", + "notification.admin.report_statuses_other": "{name} ได้รายงาน {target}", "notification.admin.sign_up": "{name} ได้ลงทะเบียน", "notification.favourite": "{name} ได้ชื่นชอบโพสต์ของคุณ", "notification.follow": "{name} ได้ติดตามคุณ", @@ -486,6 +493,7 @@ "notification.moderation_warning.action_suspend": "ระงับบัญชีของคุณแล้ว", "notification.own_poll": "การสำรวจความคิดเห็นของคุณได้สิ้นสุดแล้ว", "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว", + "notification.private_mention": "{name} ได้กล่าวถึงคุณแบบส่วนตัว", "notification.reblog": "{name} ได้ดันโพสต์ของคุณ", "notification.relationships_severance_event": "สูญเสียการเชื่อมต่อกับ {name}", "notification.relationships_severance_event.account_suspension": "ผู้ดูแลจาก {from} ได้ระงับ {target} ซึ่งหมายความว่าคุณจะไม่สามารถรับการอัปเดตจากเขาหรือโต้ตอบกับเขาได้อีกต่อไป", @@ -500,9 +508,12 @@ "notification_requests.title": "การแจ้งเตือนที่กรองอยู่", "notifications.clear": "ล้างการแจ้งเตือน", "notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?", + "notifications.clear_title": "ล้างการแจ้งเตือน?", "notifications.column_settings.admin.report": "รายงานใหม่:", "notifications.column_settings.admin.sign_up": "การลงทะเบียนใหม่:", "notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป", + "notifications.column_settings.beta.category": "คุณลักษณะการทดลอง", + "notifications.column_settings.beta.grouping": "การแจ้งเตือนกลุ่ม", "notifications.column_settings.favourite": "รายการโปรด:", "notifications.column_settings.filter_bar.advanced": "แสดงหมวดหมู่ทั้งหมด", "notifications.column_settings.filter_bar.category": "แถบตัวกรองด่วน", @@ -666,9 +677,13 @@ "report.unfollow_explanation": "คุณกำลังติดตามบัญชีนี้ เพื่อไม่ให้เห็นโพสต์ของเขาในฟีดหน้าแรกของคุณอีกต่อไป ให้เลิกติดตามเขา", "report_notification.attached_statuses": "{count, plural, other {{count} โพสต์}}ที่แนบมา", "report_notification.categories.legal": "กฎหมาย", + "report_notification.categories.legal_sentence": "เนื้อหาที่ผิดกฎหมาย", "report_notification.categories.other": "อื่น ๆ", + "report_notification.categories.other_sentence": "อื่น ๆ", "report_notification.categories.spam": "สแปม", + "report_notification.categories.spam_sentence": "สแปม", "report_notification.categories.violation": "การละเมิดกฎ", + "report_notification.categories.violation_sentence": "การละเมิดกฎ", "report_notification.open": "รายงานที่เปิด", "search.no_recent_searches": "ไม่มีการค้นหาล่าสุด", "search.placeholder": "ค้นหา", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 80d412a20bc..cf76b31f927 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -130,15 +130,12 @@ "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", "confirmation_modal.cancel": "o pini", "confirmations.block.confirm": "o weka", - "confirmations.cancel_follow_request.confirm": "o weka e wile sina", - "confirmations.cancel_follow_request.message": "sina awen ala awen wile weka e wile kute sina lon {name}?", "confirmations.delete.confirm": "o weka", "confirmations.delete.message": "sina wile ala wile weka e toki ni?", "confirmations.delete_list.confirm": "o weka", "confirmations.delete_list.message": "sina wile ala wile weka e lipu ni?", "confirmations.discard_edit_media.confirm": "o weka", "confirmations.discard_edit_media.message": "toki sitelen anu lukin lili sitelen la ante pi awen ala li lon. sina wile weka e ante ni?", - "confirmations.domain_block.message": "sina wile ala a wile a len e ma {domain} ꞏ ken suli la len jan taso li pona ꞏ len pi ma ni la sina ken ala lukin e ijo pi ma ni lon lipu toki ale anu lukin toki ꞏ len ni la jan kute sina pi ma ni li weka", "confirmations.edit.confirm": "o ante", "confirmations.edit.message": "sina ante e toki sina la toki pali sina li weka. sina wile ala wile e ni?", "confirmations.logout.confirm": "o weka", @@ -170,6 +167,8 @@ "domain_block_modal.block": "o weka e ma", "domain_block_modal.you_will_lose_followers": "ma ni la jan alasa ale sina li weka", "domain_block_modal.you_wont_see_posts": "sina ken ala lukin e toki tan jan pi ma ni", + "domain_pill.server": "ma", + "domain_pill.username": "nimi jan", "embed.preview": "ni li jo e sitelen ni:", "emoji_button.activity": "musi", "emoji_button.flags": "len ma", @@ -274,6 +273,7 @@ "load_pending": "{count, plural, other {ijo sin #}}", "loading_indicator.label": "ni li kama…", "media_gallery.toggle_visible": "{number, plural, other {o len e sitelen}}", + "mute_modal.title": "sina wile ala wile kute e jan ni?", "navigation_bar.about": "sona", "navigation_bar.blocks": "jan weka", "navigation_bar.compose": "o pali e toki sin", @@ -290,24 +290,32 @@ "notification.follow": " {name} li kute e sina", "notification.follow_request": "{name} li wile kute e sina", "notification.mention": "jan {name} li toki e sina", - "notification.poll": "sina pana lon pana la pana ni li pini", + "notification.moderation-warning.learn_more": "o kama sona e ijo ante", "notification.reblog": "{name} li wawa e toki sina", "notification.status": "{name} li toki", "notification.update": "{name} li ante e toki", + "notification_requests.dismiss": "o weka", "notifications.column_settings.favourite": "ijo pona:", "notifications.column_settings.follow": "jan kute sin", "notifications.column_settings.poll": "pana lon pana ni:", "notifications.column_settings.reblog": "wawa:", + "notifications.column_settings.status": "toki sin:", "notifications.column_settings.update": "ante toki:", "notifications.filter.all": "ale", + "notifications.filter.boosts": "wawa", "notifications.filter.favourites": "ijo pona", + "notifications.filter.mentions": "toki pi toki sina", "notifications.filter.polls": "pana lon pana ni", + "onboarding.action.back": "o tawa monsi", + "onboarding.actions.back": "o tawa monsi", "onboarding.compose.template": "toki a, #Mastodon o!", "onboarding.profile.display_name": "nimi tawa jan ante", + "onboarding.profile.note": "sona sina", "onboarding.share.lead": "o toki lon nasin Masoton pi alasa sina tawa jan", "onboarding.share.message": "ilo #Mastodon la mi jan {username} a! o kute e mi lon ni: {url}", "onboarding.start.title": "sina o kama pona a!", "onboarding.tips.migration": "sina sona ala sona e ni? tenpo kama la sina pilin ike tawa ma {domain} la, sina ken tawa ma ante lon ilo Masoton. jan li kute e sina la jan ni li awen kute e sina. kin la sina ken lawa e ma pi sina taso a!", + "poll.closed": "ona li pini", "poll.total_people": "{count, plural, other {jan #}}", "poll.total_votes": "{count, plural, other {pana #}}", "poll.vote": "o pana", @@ -315,9 +323,15 @@ "poll.votes": "{votes, plural, other {pana #}}", "privacy.direct.long": "jan ale lon toki", "privacy.public.short": "tawa ale", + "regeneration_indicator.label": "ni li kama…", + "relative_time.days": "{number}d", "relative_time.full.just_now": "tenpo ni", + "relative_time.hours": "{number}h", "relative_time.just_now": "tenpo ni", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", "relative_time.today": "tenpo suno ni", + "reply_indicator.cancel": "o ala", "report.block": "o weka e jan", "report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.", "report.categories.other": "ante", @@ -336,6 +350,7 @@ "report.thanks.title": "sina wile ala lukin e ni anu seme?", "report.unfollow": "o pini kute e {name}", "report_notification.categories.legal": "ike tawa nasin lawa", + "report_notification.categories.other": "ante", "search.placeholder": "o alasa", "search.quick_action.go_to_account": "o tawa lipu jan {x}", "search_popout.language_code": "nimi toki kepeken nasin ISO", @@ -343,6 +358,7 @@ "search_results.see_all": "ale", "search_results.statuses": "toki", "search_results.title": "o alasa e {q}", + "server_banner.administered_by": "jan lawa:", "status.block": "o weka e @{name}", "status.cancel_reblog_private": "o pini e pana", "status.delete": "o weka", @@ -356,12 +372,14 @@ "status.media.open": "o open", "status.media.show": "o lukin", "status.media_hidden": "sitelen li len", + "status.more": "kin", "status.mute": "o len e @{name}", "status.mute_conversation": "o kute ala e ijo pi toki ni", "status.pin": "o sewi lon lipu sina", "status.pinned": "toki sewi", "status.reblog": "o wawa", "status.share": "o pana tawa ante", + "status.show_filter_reason": "o lukin", "status.show_less": "o lili e ni", "status.show_less_all": "o lili e ale", "status.show_more": "o suli e ni", @@ -378,7 +396,9 @@ "timeline_hint.resources.follows": "jan lukin", "timeline_hint.resources.statuses": "ijo pi tenpo suli", "trends.trending_now": "jan mute li toki", + "units.short.billion": "{count}B", "units.short.million": "{count}AAA", + "units.short.thousand": "{count}K", "upload_button.label": "o pana e sitelen anu kalama", "upload_error.limit": "ilo li ken ala e suli pi ijo ni.", "upload_form.audio_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili", @@ -386,6 +406,7 @@ "upload_form.edit": "o ante", "upload_form.thumbnail": "o ante e sitelen lili", "upload_form.video_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili, e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", + "upload_modal.analyzing_picture": "ilo li lukin e sitelen...", "upload_modal.choose_image": "o wile e sitelen", "upload_modal.description_placeholder": "mi pu jaki tan soweli", "upload_modal.detect_text": "ilo o alasa e nimi tan sitelen", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 0bb2a0e4a60..198ee75eb82 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -35,9 +35,9 @@ "account.follow_back": "Geri takip et", "account.followers": "Takipçi", "account.followers.empty": "Henüz kimse bu kullanıcıyı takip etmiyor.", - "account.followers_counter": "{count, plural, one {{counter} Takipçi} other {{counter} Takipçi}}", + "account.followers_counter": "{count, plural, one {{counter} takipçi} other {{counter} takipçi}}", "account.following": "Takip Ediliyor", - "account.following_counter": "{count, plural, one {{counter} Takip Edilen} other {{counter} Takip Edilen}}", + "account.following_counter": "{count, plural, one {{counter} takip edilen} other {{counter} takip edilen}}", "account.follows.empty": "Bu kullanıcı henüz kimseyi takip etmiyor.", "account.go_to_profile": "Profile git", "account.hide_reblogs": "@{name} kişisinin boostlarını gizle", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} size takip isteği gönderdi", "account.share": "@{name} adlı kişinin profilini paylaş", "account.show_reblogs": "@{name} kişisinin yeniden paylaşımlarını göster", - "account.statuses_counter": "{count, plural, one {{counter} Gönderi} other {{counter} Gönderi}}", + "account.statuses_counter": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}", "account.unblock": "@{name} adlı kişinin engelini kaldır", "account.unblock_domain": "{domain} alan adının engelini kaldır", "account.unblock_short": "Engeli kaldır", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "İçerik uyarısı (isteğe bağlı)", "confirmation_modal.cancel": "İptal", "confirmations.block.confirm": "Engelle", - "confirmations.cancel_follow_request.confirm": "İsteği geri çek", - "confirmations.cancel_follow_request.message": "{name} kişisini takip etme isteğini geri çekmek istediğinden emin misin?", "confirmations.delete.confirm": "Sil", "confirmations.delete.message": "Bu tootu silmek istediğinden emin misin?", + "confirmations.delete.title": "Gönderiyi sil?", "confirmations.delete_list.confirm": "Sil", "confirmations.delete_list.message": "Bu listeyi kalıcı olarak silmek istediğinden emin misin?", + "confirmations.delete_list.title": "Listeyi sil?", "confirmations.discard_edit_media.confirm": "Vazgeç", "confirmations.discard_edit_media.message": "Medya açıklaması veya ön izlemede kaydedilmemiş değişiklikleriniz var, yine de vazgeçmek istiyor musunuz?", - "confirmations.domain_block.confirm": "Sunucuyu engelle", - "confirmations.domain_block.message": "{domain} alanının tamamını engellemek istediğinden gerçekten emin misin? Genellikle hedeflenen birkaç engelleme veya sessize alma yeterlidir ve tercih edilir. Bu alan adından gelen içeriği herhangi bir genel zaman çizelgesinde veya bildirimlerinde görmezsin. Bu alan adındaki takipçilerin kaldırılır.", "confirmations.edit.confirm": "Düzenle", "confirmations.edit.message": "Şimdi düzenlersen şu an oluşturduğun iletinin üzerine yazılır. Devam etmek istediğine emin misin?", + "confirmations.edit.title": "Gönderinin üzerine yaz?", "confirmations.logout.confirm": "Oturumu kapat", "confirmations.logout.message": "Oturumu kapatmak istediğinden emin misin?", + "confirmations.logout.title": "Oturumu kapat?", "confirmations.mute.confirm": "Sessize al", "confirmations.redraft.confirm": "Sil Düzenle ve yeniden paylaş", "confirmations.redraft.message": "Bu gönderiyi silip taslak haline getirmek istediğinize emin misiniz? Mevcut favoriler ve boostlar silinecek ve gönderiye verilen yanıtlar başıboş kalacak.", + "confirmations.redraft.title": "Gönderiyi sil veya taslağa dönüştür?", "confirmations.reply.confirm": "Yanıtla", "confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğun mesajın üzerine yazılır. Devam etmek istediğine emin misin?", + "confirmations.reply.title": "Gönderinin üzerine yaz?", "confirmations.unfollow.confirm": "Takibi bırak", "confirmations.unfollow.message": "{name} adlı kullanıcıyı takibi bırakmak istediğinden emin misin?", + "confirmations.unfollow.title": "Kullanıcıyı takipten çık?", "conversation.delete": "Sohbeti sil", "conversation.mark_as_read": "Okundu olarak işaretle", "conversation.open": "Sohbeti görüntüle", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Mevcut bir kategoriyi kullan veya yeni bir tane oluştur", "filter_modal.select_filter.title": "Bu gönderiyi süzgeçle", "filter_modal.title.status": "Bir gönderi süzgeçle", - "filtered_notifications_banner.mentions": "{count, plural, one {bahsetme} other {bahsetme}}", - "filtered_notifications_banner.pending_requests": "Bildiğiniz {count, plural, =0 {hiç kimseden} one {bir kişiden} other {# kişiden}} bildirim", + "filtered_notifications_banner.pending_requests": "Bildiğiniz {count, plural, =0 {hiç kimseden} one {bir kişiden} other {# kişiden}}", "filtered_notifications_banner.title": "Filtrelenmiş bildirimler", "firehose.all": "Tümü", "firehose.local": "Bu sunucu", @@ -443,6 +445,8 @@ "mute_modal.title": "Kullanıcıyı sustur?", "mute_modal.you_wont_see_mentions": "Onlardan bahseden gönderiler göremezsiniz.", "mute_modal.you_wont_see_posts": "Onlar sizin gönderilerinizi görmeye devam edebilir, ancak siz onlarınkini göremezsiniz.", + "name_and_others": "{name} ve {count, plural, one {# diğer} other {# diğerleri}}", + "name_and_others_with_link": "{name} ve {count, plural, one {# diğer} other {# diğerleri}}", "navigation_bar.about": "Hakkında", "navigation_bar.advanced_interface": "Gelişmiş web arayüzünde aç", "navigation_bar.blocks": "Engellenen kullanıcılar", @@ -470,6 +474,10 @@ "navigation_bar.security": "Güvenlik", "not_signed_in_indicator.not_signed_in": "Bu kaynağa erişmek için oturum açmanız gerekir.", "notification.admin.report": "{name}, {target} kişisini bildirdi", + "notification.admin.report_account": "{name}, {category} kategorisi için {target} kişisini {count, plural, one {bir gönderi} other {# gönderi}} bildirdi", + "notification.admin.report_account_other": "{name}, {target} kişisinden {count, plural, one {bir gönderi} other {# gönderi}} bildirdi", + "notification.admin.report_statuses": "{name}, {category} kategorisi için {target} kişisini bildirdi", + "notification.admin.report_statuses_other": "{name}, {target} kişisini bildirdi", "notification.admin.sign_up": "{name} kaydoldu", "notification.favourite": "{name} gönderinizi beğendi", "notification.follow": "{name} seni takip etti", @@ -486,6 +494,7 @@ "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.private_mention": "{name} gizlice sizden bahsetti", "notification.reblog": "{name} gönderini yeniden paylaştı", "notification.relationships_severance_event": "{name} ile bağlantılar koptu", "notification.relationships_severance_event.account_suspension": "{from} yöneticisi, {target} askıya aldı, bunun anlamı onlardan artık güncelleme alamayacak veya etkileşemeyeceksiniz demektir.", @@ -496,13 +505,18 @@ "notification.update": "{name} bir gönderiyi düzenledi", "notification_requests.accept": "Onayla", "notification_requests.dismiss": "Yoksay", + "notification_requests.maximize": "Büyüt", + "notification_requests.minimize_banner": "Filtrelenmiş bildirimler başlığını küçült", "notification_requests.notifications_from": "{name} bildirimleri", "notification_requests.title": "Filtrelenmiş bildirimler", "notifications.clear": "Bildirimleri temizle", "notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?", + "notifications.clear_title": "Bildirimleri temizle?", "notifications.column_settings.admin.report": "Yeni bildirimler:", "notifications.column_settings.admin.sign_up": "Yeni kayıtlar:", "notifications.column_settings.alert": "Masaüstü bildirimleri", + "notifications.column_settings.beta.category": "Deneysel özellikler", + "notifications.column_settings.beta.grouping": "Grup bildirimleri", "notifications.column_settings.favourite": "Favorilerin:", "notifications.column_settings.filter_bar.advanced": "Tüm kategorileri görüntüle", "notifications.column_settings.filter_bar.category": "Hızlı filtre çubuğu", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Bu hesabı takip ediyorsunuz. Ana akışınızda gönderilerini görmek istemiyorsanız, onu takip etmeyi bırakın.", "report_notification.attached_statuses": "{count, plural, one {{count} gönderi} other {{count} gönderi}} eklendi", "report_notification.categories.legal": "Yasal", + "report_notification.categories.legal_sentence": "yasadışı içerik", "report_notification.categories.other": "Diğer", + "report_notification.categories.other_sentence": "diğer", "report_notification.categories.spam": "İstenmeyen", + "report_notification.categories.spam_sentence": "i̇stenmeyen", "report_notification.categories.violation": "Kural ihlali", + "report_notification.categories.violation_sentence": "kural ihlali", "report_notification.open": "Bildirim aç", "search.no_recent_searches": "Son arama yok", "search.placeholder": "Ara", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 273c1a6de70..1c150c99c6c 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -31,9 +31,7 @@ "account.follow": "Язылу", "account.followers": "Язылучы", "account.followers.empty": "Әле беркем дә язылмаган.", - "account.followers_counter": "{count, plural,one {{counter} язылучы} other {{counter} язылучы}}", "account.following": "Язылулар", - "account.following_counter": "{count, plural, one {{counter} язылу} other {{counter} язылу}}", "account.follows.empty": "Беркемгә дә язылмаган әле.", "account.go_to_profile": "Профильгә күчү", "account.hide_reblogs": "Скрывать көчен нче @{name}", @@ -55,7 +53,6 @@ "account.requested_follow": "{name} Сезгә язылу соравын җиберде", "account.share": "@{name} профиле белән уртаклашу", "account.show_reblogs": "Күрсәтергә көчәйтү нче @{name}", - "account.statuses_counter": "{count, plural, one {{counter} язма} other {{counter} язма}}", "account.unblock": "@{name} бикләвен чыгу", "account.unblock_domain": "{domain} бикләвен чыгу", "account.unblock_short": "Бикләүне чыгу", @@ -135,15 +132,12 @@ "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "Баш тарту", "confirmations.block.confirm": "Блоклау", - "confirmations.cancel_follow_request.confirm": "Сорауны баш тарту", - "confirmations.cancel_follow_request.message": "Сез абонемент соравыгызны кире кайтарырга телисез {name}?", "confirmations.delete.confirm": "Бетерү", "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "Бетерү", "confirmations.delete_list.message": "Сез бу исемлекне мәңгегә бетерергә телисезме?", "confirmations.discard_edit_media.confirm": "Баш тарту", "confirmations.discard_edit_media.message": "Сезнең медиа тасвирламасында яки алдан карау өчен сакланмаган үзгәрешләр бармы? ", - "confirmations.domain_block.message": "Сез чыннан да барысын да блокларга телисез {domain}? Күпчелек очракта берничә максатлы блоклар яки тавышсызлар җитәрлек һәм өстенлекле. Сез бу доменнан эчтәлекне җәмәгать срокларында яки хәбәрләрегездә күрмәячәксез. Бу доменнан сезнең шәкертләр бетереләчәк.", "confirmations.edit.confirm": "Үзгәртү", "confirmations.logout.confirm": "Чыгу", "confirmations.logout.message": "Сез чыгарга телисезме?", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 4120d4483b2..e3dd0e6b118 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -6,7 +6,6 @@ "account.posts": "Toots", "account.posts_with_replies": "Toots and replies", "account.requested": "Awaiting approval", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account_note.placeholder": "Click to add a note", "column.pins": "Pinned toot", "community.column_settings.media_only": "Media only", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 22cd15bd231..a1c674caa19 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -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, one {{counter} підписник} few {{counter} підписники} many {{counter} підписників} other {{counter} підписники}}", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} надсилає запит на стеження", "account.share": "Поділитися профілем @{name}", "account.show_reblogs": "Показати поширення від @{name}", - "account.statuses_counter": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} дописи}}", + "account.statuses_counter": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}}", "account.unblock": "Розблокувати @{name}", "account.unblock_domain": "Розблокувати {domain}", "account.unblock_short": "Розблокувати", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Попередження про вміст (необов'язково)", "confirmation_modal.cancel": "Скасувати", "confirmations.block.confirm": "Заблокувати", - "confirmations.cancel_follow_request.confirm": "Відкликати запит", - "confirmations.cancel_follow_request.message": "Ви дійсно бажаєте відкликати запит на стеження за {name}?", "confirmations.delete.confirm": "Видалити", "confirmations.delete.message": "Ви впевнені, що хочете видалити цей допис?", + "confirmations.delete.title": "Видалити допис?", "confirmations.delete_list.confirm": "Видалити", "confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?", + "confirmations.delete_list.title": "Видалити список?", "confirmations.discard_edit_media.confirm": "Відкинути", "confirmations.discard_edit_media.message": "У вас є незбережені зміни в описі медіа або попереднього перегляду, все одно відкинути їх?", - "confirmations.domain_block.confirm": "Блокувати сервер", - "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або приховати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.", "confirmations.edit.confirm": "Змінити", "confirmations.edit.message": "Редагування перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", + "confirmations.edit.title": "Перезаписати допис?", "confirmations.logout.confirm": "Вийти", "confirmations.logout.message": "Ви впевнені, що хочете вийти?", + "confirmations.logout.title": "Вийти?", "confirmations.mute.confirm": "Приховати", "confirmations.redraft.confirm": "Видалити та виправити", "confirmations.redraft.message": "Ви впевнені, що хочете видалити цей допис та переписати його? Додавання у вибране та поширення буде втрачено, а відповіді на оригінальний допис залишаться без першоджерела.", + "confirmations.redraft.title": "Видалити та переробити допис?", "confirmations.reply.confirm": "Відповісти", "confirmations.reply.message": "Нова відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", + "confirmations.reply.title": "Перезаписати допис?", "confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", + "confirmations.unfollow.title": "Відписатися від користувача?", "conversation.delete": "Видалити бесіду", "conversation.mark_as_read": "Позначити як прочитане", "conversation.open": "Переглянути бесіду", @@ -217,18 +220,18 @@ "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.activitypub_lets_connect": "Це дозволяє вам спілкуватися та взаємодіяти з людьми не лише на Mastodon, але й у різних соціальних застосунках.", + "domain_pill.activitypub_like_language": "ActivityPub - це як мова, якою Mastodon розмовляє з іншими соціальними мережами.", "domain_pill.server": "Сервер", "domain_pill.their_handle": "Їхня адреса:", - "domain_pill.their_server": "Їхній цифровий дім, де живуть усі їхні пости.", + "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_server": "Ваш цифровий дім, де живуть усі ваші дописи. Не подобається цей? Перенесіть сервери в будь-який час і залучайте своїх підписників.", "domain_pill.your_username": "Ваш унікальний ідентифікатор на цьому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.", "embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.", "embed.preview": "Ось який вигляд це матиме:", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Використати наявну категорію або створити нову", "filter_modal.select_filter.title": "Фільтрувати цей допис", "filter_modal.title.status": "Фільтрувати допис", - "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}", - "filtered_notifications_banner.pending_requests": "Сповіщення від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати", + "filtered_notifications_banner.pending_requests": "Від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати", "filtered_notifications_banner.title": "Відфільтровані сповіщення", "firehose.all": "Всі", "firehose.local": "Цей сервер", @@ -415,6 +417,7 @@ "limited_account_hint.title": "Цей профіль сховали модератори {domain}.", "link_preview.author": "Від {name}", "link_preview.more_from_author": "Більше від {name}", + "link_preview.shares": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}}", "lists.account.add": "Додати до списку", "lists.account.remove": "Вилучити зі списку", "lists.delete": "Видалити список", @@ -442,6 +445,8 @@ "mute_modal.title": "Ігнорувати користувача?", "mute_modal.you_wont_see_mentions": "Ви не бачитимете дописів, де їх згадано.", "mute_modal.you_wont_see_posts": "Вони все ще можуть бачити ваші дописи, але ви не бачитимете їхніх.", + "name_and_others": "{name} і {count, plural, one {# інший} few {# інших} many {# інших} other {# інший}}", + "name_and_others_with_link": "{name} і {count, plural, one {# інший} few {# інших} many {# інших} other {# інший}}", "navigation_bar.about": "Про застосунок", "navigation_bar.advanced_interface": "Відкрити в розширеному вебінтерфейсі", "navigation_bar.blocks": "Заблоковані користувачі", @@ -469,6 +474,10 @@ "navigation_bar.security": "Безпека", "not_signed_in_indicator.not_signed_in": "Ви повинні увійти, щоб отримати доступ до цього ресурсу.", "notification.admin.report": "Скарга від {name} на {target}", + "notification.admin.report_account": "{name} повідомляє про {count, plural, one {один допис} few {# дописи} many {# дописів} other {# дописів}} від {target} в категорії {category}", + "notification.admin.report_account_other": "{name} повідомляє про {count, plural, one {один допис} few {# дописи} many {# дописів} other {# дописів}} від {target}", + "notification.admin.report_statuses": "{name} повідомляє про {target} в категорії {category}", + "notification.admin.report_statuses_other": "{name} повідомляє про {target}", "notification.admin.sign_up": "{name} приєдналися", "notification.favourite": "Ваш допис сподобався {name}", "notification.follow": "{name} підписалися на вас", @@ -484,24 +493,30 @@ "notification.moderation_warning.action_silence": "Ваш обліковий запис було обмежено.", "notification.moderation_warning.action_suspend": "Ваш обліковий запис було заблоковано.", "notification.own_poll": "Ваше опитування завершилося", - "notification.poll": "Опитування, у якому ви голосували, скінчилося", + "notification.poll": "Опитування, в якому ви проголосували, завершено", + "notification.private_mention": "{name} приватно згадує вас", "notification.reblog": "{name} поширює ваш допис", "notification.relationships_severance_event": "Втрачено з'єднання з {name}", "notification.relationships_severance_event.account_suspension": "Адміністратор з {from} призупинив {target}, що означає, що ви більше не можете отримувати оновлення від них або взаємодіяти з ними.", - "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.relationships_severance_event.domain_block": "Адміністратор з {from} заблокував {target}, включаючи {followersCount} ваших підписників і {followingCount , plural, one {# обліковий запис} few {# облікові записи} many {# облікових записів} other {# обліковий запис}}, на які ви підписані.", + "notification.relationships_severance_event.learn_more": "Докладніше", + "notification.relationships_severance_event.user_domain_block": "Ви заблокували {target}, видаливши {followersCount} ваших підписників і {followingCount, plural, one {# обліковий запис} few {# облікові записи} many {# облікових записів} other {# обліковий запис}}, за якими ви стежите.", "notification.status": "{name} щойно дописує", "notification.update": "{name} змінює допис", "notification_requests.accept": "Прийняти", "notification_requests.dismiss": "Відхилити", + "notification_requests.maximize": "Розгорнути", + "notification_requests.minimize_banner": "Мінімізувати відфільтрований банер сповіщень", "notification_requests.notifications_from": "Сповіщення від {name}", "notification_requests.title": "Відфільтровані сповіщення", "notifications.clear": "Очистити сповіщення", "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщення?", + "notifications.clear_title": "Очистити сповіщення?", "notifications.column_settings.admin.report": "Нові скарги:", "notifications.column_settings.admin.sign_up": "Нові реєстрації:", "notifications.column_settings.alert": "Сповіщення стільниці", + "notifications.column_settings.beta.category": "Експериментальні функції", + "notifications.column_settings.beta.grouping": "Групові сповіщення", "notifications.column_settings.favourite": "Уподобане:", "notifications.column_settings.filter_bar.advanced": "Показати всі категорії", "notifications.column_settings.filter_bar.category": "Панель швидкого фільтра", @@ -665,9 +680,13 @@ "report.unfollow_explanation": "Ви підписані на цього користувача. Щоб більше не бачити їхні дописи у вашій стрічці, відпишіться від них.", "report_notification.attached_statuses": "{count, plural, one {{count} допис} few {{count} дописи} many {{count} дописів} other {{count} дописи}} прикріплено", "report_notification.categories.legal": "Правові", + "report_notification.categories.legal_sentence": "незаконний контент", "report_notification.categories.other": "Інше", + "report_notification.categories.other_sentence": "інше", "report_notification.categories.spam": "Спам", + "report_notification.categories.spam_sentence": "спам", "report_notification.categories.violation": "Порушення правил", + "report_notification.categories.violation_sentence": "порушення правил", "report_notification.open": "Відкрити скаргу", "search.no_recent_searches": "Немає останніх пошуків", "search.placeholder": "Пошук", @@ -698,6 +717,7 @@ "server_banner.is_one_of_many": "{domain} - один з багатьох незалежних серверів Mastodon, які ви можете використати, щоб брати участь у федівері.", "server_banner.server_stats": "Статистика сервера:", "sign_in_banner.create_account": "Створити обліковий запис", + "sign_in_banner.follow_anyone": "Слідкуйте за ким завгодно у всьому fediverse і дивіться все це в хронологічному порядку. Немає алгоритмів, реклами чи наживок для натискань при перегляді.", "sign_in_banner.mastodon_is": "Мастодон - найкращий спосіб продовжувати свою справу.", "sign_in_banner.sign_in": "Увійти", "sign_in_banner.sso_redirect": "Увійдіть або зареєструйтесь", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index 1b9f8d9691d..d82e52ae505 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -29,9 +29,7 @@ "account.follow_back": "اکاؤنٹ کو فالو بیک ", "account.followers": "پیروکار", "account.followers.empty": "ہنوز اس صارف کی کوئی پیروی نہیں کرتا.", - "account.followers_counter": "{count, plural,one {{counter} پیروکار} other {{counter} پیروکار}}", "account.following": "فالو کر رہے ہیں", - "account.following_counter": "{count, plural, one {{counter} پیروی کر رہے ہیں} other {{counter} پیروی کر رہے ہیں}}", "account.follows.empty": "\"یہ صارف ہنوز کسی کی پیروی نہیں کرتا ہے\".", "account.go_to_profile": "پروفائل پر جائیں", "account.hide_reblogs": "@{name} سے فروغ چھپائیں", @@ -57,7 +55,6 @@ "account.requested_follow": "{name} آپ کو فالو کرنا چھاتا ہے۔", "account.share": "@{name} کے مشخص کو بانٹیں", "account.show_reblogs": "@{name} کی افزائشات کو دکھائیں", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "@{name} کو بحال کریں", "account.unblock_domain": "{domain} کو نہ چھپائیں", "account.unblock_short": "بلاک ختم کریں", @@ -129,7 +126,6 @@ "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.delete_list.confirm": "ڈیلیٹ", "confirmations.delete_list.message": "کیا آپ واقعی اس فہرست کو مستقل طور پر ڈیلیٹ کرنا چاہتے ہیں؟", - "confirmations.domain_block.message": "کیا آپ واقعی، واقعی یقین رکھتے ہیں کہ آپ پورے {domain} کو بلاک کرنا چاہتے ہیں؟ زیادہ تر معاملات میں چند ٹارگٹیڈ بلاکس یا خاموش کرنا کافی اور افضل ہیں۔ آپ اس ڈومین کا مواد کسی بھی عوامی ٹائم لائنز یا اپنی اطلاعات میں نہیں دیکھیں گے۔ اس ڈومین سے آپ کے پیروکاروں کو ہٹا دیا جائے گا۔", "confirmations.logout.confirm": "لاگ آؤٹ", "confirmations.logout.message": "کیا واقعی آپ لاگ آؤٹ ہونا چاہتے ہیں؟", "confirmations.mute.confirm": "خاموش", @@ -243,7 +239,6 @@ "notification.follow_request": "{name} نے آپ کی پیروی کی درخواست کی", "notification.mention": "{name} نے آپ کا تذکرہ کیا", "notification.own_poll": "آپ کا پول ختم ہو گیا ہے", - "notification.poll": "آپ کا ووٹ دیا گیا ایک پول ختم ہو گیا ہے", "notification.reblog": "{name} boosted your status", "notification.status": "{name} نے ابھی ابھی پوسٹ کیا", "notifications.clear": "اطلاعات ہٹائیں", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index 77892914a42..d0bcb90924c 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -31,9 +31,7 @@ "account.follow": "Obuna bo‘lish", "account.followers": "Obunachilar", "account.followers.empty": "Bu foydalanuvchini hali hech kim kuzatmaydi.", - "account.followers_counter": "{count, plural, one {{counter} Muxlis} other {{counter} Muxlislar}}", "account.following": "Kuzatish", - "account.following_counter": "{count, plural, one {{counter} ga Muxlis} other {{counter} larga muxlis}}", "account.follows.empty": "Bu foydalanuvchi hali hech kimni kuzatmagan.", "account.go_to_profile": "Profilga o'tish", "account.hide_reblogs": "@{name} dan boostlarni yashirish", @@ -54,7 +52,6 @@ "account.requested_follow": "{name} sizni kuzatishni soʻradi", "account.share": "@{name} profilini ulashing", "account.show_reblogs": "@{name} dan bootlarni ko'rsatish", - "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Postlar}}", "account.unblock": "@{name} ni blokdan chiqarish", "account.unblock_domain": "{domain} domenini blokdan chiqarish", "account.unblock_short": "Blokdan chiqarish", @@ -133,15 +130,12 @@ "compose_form.spoiler.unmarked": "Kontent haqida ogohlantirish qo'shing", "confirmation_modal.cancel": "Bekor qilish", "confirmations.block.confirm": "Bloklash", - "confirmations.cancel_follow_request.confirm": "Bekor qilish", - "confirmations.cancel_follow_request.message": "Haqiqatan ham {name}ga obuna boʻlish soʻrovingizni qaytarib olmoqchimisiz?", "confirmations.delete.confirm": "Oʻchirish", "confirmations.delete.message": "Haqiqatan ham bu postni oʻchirib tashlamoqchimisiz?", "confirmations.delete_list.confirm": "Oʻchirish", "confirmations.delete_list.message": "Haqiqatan ham bu roʻyxatni butunlay oʻchirib tashlamoqchimisiz?", "confirmations.discard_edit_media.confirm": "Bekor qilish", "confirmations.discard_edit_media.message": "Sizda media tavsifi yoki oldindan ko‘rishda saqlanmagan o‘zgarishlar bor, ular baribir bekor qilinsinmi?", - "confirmations.domain_block.message": "Haqiqatan ham, {domain} ni butunlay bloklamoqchimisiz? Ko'pgina hollarda bir nechta maqsadli bloklar yoki ovozni o'chirish etarli va afzaldir. Siz oʻsha domendagi kontentni hech qanday umumiy vaqt jadvallarida yoki bildirishnomalaringizda koʻrmaysiz. Bu domendagi obunachilaringiz olib tashlanadi.", "confirmations.logout.confirm": "Chiqish", "confirmations.logout.message": "Chiqishingizga aminmisiz?", "confirmations.mute.confirm": "Ovozsiz", @@ -331,7 +325,6 @@ "navigation_bar.security": "Xavfsizlik", "not_signed_in_indicator.not_signed_in": "Ushbu manbaga kirish uchun tizimga kirishingiz kerak.", "notification.own_poll": "So‘rovingiz tugadi", - "notification.poll": "Siz ovoz bergan soʻrovnoma yakunlandi", "notification.reblog": "{name} boosted your status", "onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_home": "Go to your home feed", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 18f0fec3c57..0f5eeebd07b 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -35,9 +35,9 @@ "account.follow_back": "Theo dõi lại", "account.followers": "Người theo dõi", "account.followers.empty": "Chưa có người theo dõi nào.", - "account.followers_counter": "{count, plural, one {{counter} Người theo dõi} other {{counter} Người theo dõi}}", + "account.followers_counter": "{count, plural, other {{counter} người theo dõi}}", "account.following": "Đang theo dõi", - "account.following_counter": "{count, plural, one {{counter} Theo dõi} other {{counter} Theo dõi}}", + "account.following_counter": "{count, plural, other {{counter} đang theo dõi}}", "account.follows.empty": "Người này chưa theo dõi ai.", "account.go_to_profile": "Xem hồ sơ", "account.hide_reblogs": "Ẩn tút @{name} đăng lại", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} yêu cầu theo dõi bạn", "account.share": "Chia sẻ @{name}", "account.show_reblogs": "Hiện tút do @{name} đăng lại", - "account.statuses_counter": "{count, plural, one {{counter} Tút} other {{counter} Tút}}", + "account.statuses_counter": "{count, plural, other {{counter} tút}}", "account.unblock": "Bỏ chặn @{name}", "account.unblock_domain": "Bỏ ẩn {domain}", "account.unblock_short": "Bỏ chặn", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "Nội dung ẩn (tùy chọn)", "confirmation_modal.cancel": "Hủy bỏ", "confirmations.block.confirm": "Chặn", - "confirmations.cancel_follow_request.confirm": "Thu hồi yêu cầu", - "confirmations.cancel_follow_request.message": "Bạn có chắc muốn thu hồi yêu cầu theo dõi của bạn với {name}?", "confirmations.delete.confirm": "Xóa bỏ", "confirmations.delete.message": "Bạn thật sự muốn xóa tút này?", + "confirmations.delete.title": "Xóa tút?", "confirmations.delete_list.confirm": "Xóa bỏ", "confirmations.delete_list.message": "Bạn thật sự muốn xóa vĩnh viễn danh sách này?", + "confirmations.delete_list.title": "Xóa danh sách?", "confirmations.discard_edit_media.confirm": "Bỏ qua", "confirmations.discard_edit_media.message": "Bạn chưa lưu thay đổi đối với phần mô tả hoặc bản xem trước của media, vẫn bỏ luôn?", - "confirmations.domain_block.confirm": "Chặn máy chủ", - "confirmations.domain_block.message": "Bạn thật sự muốn ẩn toàn bộ nội dung từ {domain}? Sẽ hợp lý hơn nếu bạn chỉ chặn hoặc ẩn một vài tài khoản cụ thể. Ẩn toàn bộ nội dung từ máy chủ sẽ khiến bạn không còn thấy nội dung từ máy chủ đó ở bất kỳ nơi nào, kể cả thông báo. Người quan tâm bạn từ máy chủ đó cũng sẽ bị xóa luôn.", "confirmations.edit.confirm": "Sửa", "confirmations.edit.message": "Nội dung tút cũ sẽ bị ghi đè, bạn có tiếp tục?", + "confirmations.edit.title": "Viết đè lên tút cũ?", "confirmations.logout.confirm": "Đăng xuất", "confirmations.logout.message": "Bạn có thật sự muốn thoát?", + "confirmations.logout.title": "Đăng xuất?", "confirmations.mute.confirm": "Ẩn", "confirmations.redraft.confirm": "Xóa & viết lại", "confirmations.redraft.message": "Bạn thật sự muốn xóa tút và viết lại? Điều này sẽ xóa mất những lượt thích và đăng lại của tút, cũng như những trả lời sẽ không còn nội dung gốc.", + "confirmations.redraft.title": "Xóa & viết lại?", "confirmations.reply.confirm": "Trả lời", "confirmations.reply.message": "Nội dung bạn đang soạn thảo sẽ bị ghi đè, bạn có tiếp tục?", + "confirmations.reply.title": "Viết đè lên tút cũ?", "confirmations.unfollow.confirm": "Bỏ theo dõi", "confirmations.unfollow.message": "Bạn thật sự muốn bỏ theo dõi {name}?", + "confirmations.unfollow.title": "Bỏ theo dõi?", "conversation.delete": "Xóa tin nhắn này", "conversation.mark_as_read": "Đánh dấu là đã đọc", "conversation.open": "Xem toàn bộ tin nhắn", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "Sử dụng một danh mục hiện có hoặc tạo một danh mục mới", "filter_modal.select_filter.title": "Lọc tút này", "filter_modal.title.status": "Lọc một tút", - "filtered_notifications_banner.mentions": "{count, plural, other {lượt nhắc}}", - "filtered_notifications_banner.pending_requests": "Thông báo từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết", + "filtered_notifications_banner.pending_requests": "Từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết", "filtered_notifications_banner.title": "Thông báo đã lọc", "firehose.all": "Toàn bộ", "firehose.local": "Máy chủ này", @@ -443,6 +445,8 @@ "mute_modal.title": "Ẩn người này?", "mute_modal.you_wont_see_mentions": "Bạn sẽ không nhìn thấy tút có nhắc đến họ.", "mute_modal.you_wont_see_posts": "Bạn sẽ không nhìn thấy tút của họ.", + "name_and_others": "{name} và {count, plural, other {# người khác}}", + "name_and_others_with_link": "{name} và {count, plural, other {# người khác}}", "navigation_bar.about": "Giới thiệu", "navigation_bar.advanced_interface": "Dùng bố cục nhiều cột", "navigation_bar.blocks": "Người đã chặn", @@ -470,6 +474,10 @@ "navigation_bar.security": "Bảo mật", "not_signed_in_indicator.not_signed_in": "Bạn cần đăng nhập để truy cập mục này.", "notification.admin.report": "{name} báo cáo {target}", + "notification.admin.report_account": "{name} báo cáo {count, plural, other {# tút}} của {target} vì {category}", + "notification.admin.report_account_other": "{name} báo cáo {count, plural, other {# tút}} của {target}", + "notification.admin.report_statuses": "{name} báo cáo {target} vì {category}", + "notification.admin.report_statuses_other": "{name} báo cáo {target}", "notification.admin.sign_up": "{name} tham gia máy chủ của bạn", "notification.favourite": "{name} thích tút của bạn", "notification.follow": "{name} theo dõi bạn", @@ -485,7 +493,8 @@ "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.poll": "Cuộc bình chọn có bạn tham gia đã kết thúc", + "notification.private_mention": "{name} nhắn riêng đến bạn", "notification.reblog": "{name} đăng lại tút của bạn", "notification.relationships_severance_event": "Mất kết nối với {name}", "notification.relationships_severance_event.account_suspension": "Quản trị viên {from} đã vô hiệu hóa {target}, điều này có nghĩa là bạn không còn có thể nhận được cập nhật từ họ hoặc tương tác với họ nữa.", @@ -496,13 +505,18 @@ "notification.update": "{name} đã sửa tút", "notification_requests.accept": "Chấp nhận", "notification_requests.dismiss": "Bỏ qua", + "notification_requests.maximize": "Tối đa", + "notification_requests.minimize_banner": "Tinh giản banner lọc thông báo", "notification_requests.notifications_from": "Thông báo từ {name}", "notification_requests.title": "Thông báo đã lọc", "notifications.clear": "Xóa hết thông báo", "notifications.clear_confirmation": "Bạn thật sự muốn xóa vĩnh viễn tất cả thông báo của mình?", + "notifications.clear_title": "Xóa hết thông báo?", "notifications.column_settings.admin.report": "Báo cáo mới:", "notifications.column_settings.admin.sign_up": "Người mới tham gia:", "notifications.column_settings.alert": "Báo trên máy tính", + "notifications.column_settings.beta.category": "Tính năng thử nghiệm", + "notifications.column_settings.beta.grouping": "Gộp thông báo theo loại", "notifications.column_settings.favourite": "Lượt thích:", "notifications.column_settings.filter_bar.advanced": "Toàn bộ", "notifications.column_settings.filter_bar.category": "Thanh lọc nhanh", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "Bạn đang theo dõi người này. Để không thấy tút của họ trên trang chủ nữa, hãy bỏ theo dõi.", "report_notification.attached_statuses": "{count, plural, other {{count} tút}} đính kèm", "report_notification.categories.legal": "Pháp lý", + "report_notification.categories.legal_sentence": "nội dung bất hợp pháp", "report_notification.categories.other": "Khác", + "report_notification.categories.other_sentence": "khác", "report_notification.categories.spam": "Spam", + "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Vi phạm nội quy", + "report_notification.categories.violation_sentence": "vi phạm nội quy", "report_notification.open": "Mở báo cáo", "search.no_recent_searches": "Không có tìm kiếm gần đây", "search.placeholder": "Tìm kiếm", diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index 1d3a22108cd..b42bb7589ce 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -19,7 +19,6 @@ "account.posts_with_replies": "Toots and replies", "account.requested": "Awaiting approval", "account.share": "ⴱⴹⵓ ⵉⴼⵔⵙ ⵏ @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unfollow": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ", "account_note.placeholder": "Click to add a note", "bundle_column_error.retry": "ⴰⵍⵙ ⴰⵔⵎ", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 3456f99d25c..53fe9b98534 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -1,5 +1,5 @@ { - "about.blocks": "服务器被限制", + "about.blocks": "被限制的服务器", "about.contact": "联系方式:", "about.disclaimer": "Mastodon 是自由的开源软件,商标由 Mastodon gGmbH 持有。", "about.domain_blocks.no_reason_available": "原因不可用", @@ -35,9 +35,9 @@ "account.follow_back": "回关", "account.followers": "关注者", "account.followers.empty": "目前无人关注此用户。", - "account.followers_counter": "被 {counter} 人关注", + "account.followers_counter": "{count, plural, other {{counter} 关注者}}", "account.following": "正在关注", - "account.following_counter": "正在关注 {counter} 人", + "account.following_counter": "{count, plural, other {{counter} 关注}}", "account.follows.empty": "此用户目前未关注任何人。", "account.go_to_profile": "前往个人资料页", "account.hide_reblogs": "隐藏来自 @{name} 的转嘟", @@ -63,7 +63,7 @@ "account.requested_follow": "{name} 已经向你发送了关注请求", "account.share": "分享 @{name} 的个人资料页", "account.show_reblogs": "显示来自 @{name} 的转嘟", - "account.statuses_counter": "{counter} 条嘟文", + "account.statuses_counter": "{count, plural, other {{counter} 条嘟文}}", "account.unblock": "取消屏蔽 @{name}", "account.unblock_domain": "取消屏蔽 {domain} 域名", "account.unblock_short": "取消屏蔽", @@ -89,14 +89,14 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未处理)", "audio.hide": "隐藏音频", - "block_modal.remote_users_caveat": "我们将要求服务器 {domain} 尊重您的决定。然而,无法保证对方一定遵从,因为某些服务器可能会以不同的方式处理屏蔽操作。公开嘟文仍然可能对未登录用户可见。", - "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.title": "屏蔽用户?", - "block_modal.you_wont_see_mentions": "你不会看到提及他们的嘟文。", + "block_modal.they_will_know": "他们将能看到他们被屏蔽。", + "block_modal.title": "屏蔽该用户?", + "block_modal.you_wont_see_mentions": "你将无法看到提及他们的嘟文。", "boost_modal.combo": "下次按住 {combo} 即可跳过此提示", "bundle_column_error.copy_stacktrace": "复制错误报告", "bundle_column_error.error.body": "请求的页面无法渲染,可能是代码出现错误或浏览器存在兼容性问题。", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "内容警告 (可选)", "confirmation_modal.cancel": "取消", "confirmations.block.confirm": "屏蔽", - "confirmations.cancel_follow_request.confirm": "撤回请求", - "confirmations.cancel_follow_request.message": "确定撤回关注 {name} 的请求吗?", "confirmations.delete.confirm": "删除", "confirmations.delete.message": "你确定要删除这条嘟文吗?", + "confirmations.delete.title": "确认删除嘟文?", "confirmations.delete_list.confirm": "删除", "confirmations.delete_list.message": "确定永久删除这个列表吗?", + "confirmations.delete_list.title": "确认删除列表?", "confirmations.discard_edit_media.confirm": "丢弃", "confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍要丢弃吗?", - "confirmations.domain_block.confirm": "屏蔽服务器", - "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,对几个特定的用户进行屏蔽或禁用对他们的消息提醒就足够了。屏蔽后,来自该域名的内容将不再出现在你任何的公共时间轴或通知列表里,你来自该域名下的关注者也将被移除。", "confirmations.edit.confirm": "编辑", "confirmations.edit.message": "编辑此消息将会覆盖当前正在撰写的信息。仍要继续吗?", + "confirmations.edit.title": "确认覆盖嘟文?", "confirmations.logout.confirm": "退出登录", "confirmations.logout.message": "确定要退出登录吗?", + "confirmations.logout.title": "是否退出登录?", "confirmations.mute.confirm": "隐藏", "confirmations.redraft.confirm": "删除并重新编辑", "confirmations.redraft.message": "确定删除这条嘟文并重写吗?所有相关的喜欢和转嘟都将丢失,嘟文的回复也会失去关联。", + "confirmations.redraft.title": "是否删除并重新编辑嘟文?", "confirmations.reply.confirm": "回复", "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?", + "confirmations.reply.title": "确认覆盖嘟文?", "confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", + "confirmations.unfollow.title": "是否取消关注用户?", "conversation.delete": "删除对话", "conversation.mark_as_read": "标记为已读", "conversation.open": "查看对话", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "使用一个已存在类别,或创建一个新类别", "filter_modal.select_filter.title": "过滤此嘟文", "filter_modal.title.status": "过滤一条嘟文", - "filtered_notifications_banner.mentions": "{count, plural, other {提及}}", - "filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}的通知", + "filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}", "filtered_notifications_banner.title": "通知(已过滤)", "firehose.all": "全部", "firehose.local": "此服务器", @@ -443,6 +445,8 @@ "mute_modal.title": "隐藏用户?", "mute_modal.you_wont_see_mentions": "你看不到提及他们的嘟文。", "mute_modal.you_wont_see_posts": "他们可以看到你的嘟文,但是你看不到他们的。", + "name_and_others": "{name} 和其它 {count, plural, other {# 人}}", + "name_and_others_with_link": "{name} 和其它 {count, plural, other {# 人}}", "navigation_bar.about": "关于", "navigation_bar.advanced_interface": "在高级网页界面中打开", "navigation_bar.blocks": "已屏蔽的用户", @@ -470,6 +474,10 @@ "navigation_bar.security": "安全", "not_signed_in_indicator.not_signed_in": "您需要登录才能访问此资源。", "notification.admin.report": "{name} 举报了 {target}", + "notification.admin.report_account": "{name} 举报了来自 {target} 的 {count, plural, other {# 条嘟文}},原因为 {category}", + "notification.admin.report_account_other": "{name} 举报了来自 {target} 的 {count, plural, other {# 条嘟文}}", + "notification.admin.report_statuses": "{name} 举报了 {target},原因为 {category}", + "notification.admin.report_statuses_other": "{name} 举报了 {target}", "notification.admin.sign_up": "{name} 注册了", "notification.favourite": "{name} 喜欢了你的嘟文", "notification.follow": "{name} 开始关注你", @@ -485,7 +493,8 @@ "notification.moderation_warning.action_silence": "你的账号已被限制。", "notification.moderation_warning.action_suspend": "你的账号已被封禁.", "notification.own_poll": "你的投票已经结束", - "notification.poll": "你参与的一个投票已经结束", + "notification.poll": "你参与的一项投票已结束", + "notification.private_mention": "{name} 私下提及了你", "notification.reblog": "{name} 转发了你的嘟文", "notification.relationships_severance_event": "与 {name} 的联系已断开", "notification.relationships_severance_event.account_suspension": "一名来自 {from} 的管理员已经封禁了{target},这意味着你将无法再收到他们的更新或与他们互动。", @@ -496,13 +505,18 @@ "notification.update": "{name} 编辑了嘟文", "notification_requests.accept": "接受", "notification_requests.dismiss": "拒绝", + "notification_requests.maximize": "最大化", + "notification_requests.minimize_banner": "最小化被过滤通知的横幅", "notification_requests.notifications_from": "来自 {name} 的通知", "notification_requests.title": "通知(已过滤)", "notifications.clear": "清空通知列表", "notifications.clear_confirmation": "你确定要永久清空通知列表吗?", + "notifications.clear_title": "是否清空通知?", "notifications.column_settings.admin.report": "新举报:", "notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.alert": "桌面通知", + "notifications.column_settings.beta.category": "实验性功能", + "notifications.column_settings.beta.grouping": "通知分组", "notifications.column_settings.favourite": "喜欢:", "notifications.column_settings.filter_bar.advanced": "显示所有类别", "notifications.column_settings.filter_bar.category": "快速筛选栏", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "你正在关注此账户。如果不想继续在主页看到他们的嘟文,取消对他们的关注即可。", "report_notification.attached_statuses": "附上 {count} 条嘟文", "report_notification.categories.legal": "法律义务", + "report_notification.categories.legal_sentence": "非法内容", "report_notification.categories.other": "其他", + "report_notification.categories.other_sentence": "其它", "report_notification.categories.spam": "骚扰", + "report_notification.categories.spam_sentence": "骚扰", "report_notification.categories.violation": "违反规则", + "report_notification.categories.violation_sentence": "违反规则", "report_notification.open": "打开举报", "search.no_recent_searches": "无最近搜索", "search.placeholder": "搜索", @@ -699,6 +717,7 @@ "server_banner.is_one_of_many": "{domain} 是可用于参与联邦宇宙的众多独立 Mastodon 服务器之一。", "server_banner.server_stats": "服务器统计数据:", "sign_in_banner.create_account": "创建账户", + "sign_in_banner.follow_anyone": "关注联邦宇宙中的任何人,并按时间顺序查看所有内容。没有算法、广告或诱导链接。", "sign_in_banner.mastodon_is": "Mastodon 是了解最新动态的最佳途径。", "sign_in_banner.sign_in": "登录", "sign_in_banner.sso_redirect": "登录或注册", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 5dff466201e..389b5c4a3a5 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -35,9 +35,7 @@ "account.follow_back": "追蹤對方", "account.followers": "追蹤者", "account.followers.empty": "尚未有人追蹤這位使用者。", - "account.followers_counter": "有 {count, plural,one {{counter} 個} other {{counter} 個}}追蹤者", "account.following": "正在追蹤", - "account.following_counter": "正在追蹤 {count, plural,one {{counter}}other {{counter} 人}}", "account.follows.empty": "這位使用者尚未追蹤任何人。", "account.go_to_profile": "前往個人檔案", "account.hide_reblogs": "隱藏 @{name} 的轉推", @@ -63,7 +61,6 @@ "account.requested_follow": "{name} 要求追蹤你", "account.share": "分享 @{name} 的個人檔案", "account.show_reblogs": "顯示 @{name} 的轉推", - "account.statuses_counter": "{count, plural,one {{counter} 篇}other {{counter} 篇}}帖文", "account.unblock": "解除封鎖 @{name}", "account.unblock_domain": "解除封鎖網域 {domain}", "account.unblock_short": "解除封鎖", @@ -169,20 +166,18 @@ "compose_form.spoiler_placeholder": "內容警告 (選用)", "confirmation_modal.cancel": "取消", "confirmations.block.confirm": "封鎖", - "confirmations.cancel_follow_request.confirm": "撤回請求", - "confirmations.cancel_follow_request.message": "您確定要撤回追蹤 {name} 的請求嗎?", "confirmations.delete.confirm": "刪除", "confirmations.delete.message": "你確定要刪除這文章嗎?", + "confirmations.delete.title": "刪除帖文?", "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您在媒體描述或預覽有尚未儲存的變更。確定要捨棄它們嗎?", - "confirmations.domain_block.confirm": "封鎖伺服器", - "confirmations.domain_block.message": "你真的真的確定要封鎖整個 {domain} ?多數情況下,封鎖或靜音幾個特定目標就已經有效,也是比較建議的做法。若然封鎖全站,你將不會再在這裏看到該站的內容和通知。來自該站的關注者亦會被移除。", "confirmations.edit.confirm": "編輯", "confirmations.edit.message": "現在編輯將會覆蓋你目前正在撰寫的訊息。你確定要繼續嗎?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "確定要登出嗎?", + "confirmations.logout.title": "登出?", "confirmations.mute.confirm": "靜音", "confirmations.redraft.confirm": "刪除並編輯", "confirmations.redraft.message": "你確定要移除並重新起草這篇帖文嗎?你將會失去最愛和轉推,而回覆也會與原始帖文斷開連接。", @@ -297,8 +292,6 @@ "filter_modal.select_filter.subtitle": "使用既有類別,或創建一個新類別", "filter_modal.select_filter.title": "過濾此帖文", "filter_modal.title.status": "過濾一則帖文", - "filtered_notifications_banner.mentions": "{count, plural, one {則提及} other {則提及}}", - "filtered_notifications_banner.pending_requests": "來自 {count, plural, =0 {0 位} other {# 位}}你可能認識的人的通知", "filtered_notifications_banner.title": "已過濾之通知", "firehose.all": "全部", "firehose.local": "本伺服器", @@ -482,7 +475,6 @@ "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} 停權,這表示你無法再收到他們的更新或與他們互動。", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index e6cd62162bc..8be00b273a1 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -35,9 +35,9 @@ "account.follow_back": "跟隨回去", "account.followers": "跟隨者", "account.followers.empty": "尚未有人跟隨這位使用者。", - "account.followers_counter": "被 {count, plural, other {{counter} 人}}跟隨", + "account.followers_counter": "被 {count, plural, other {{count} 人}}跟隨", "account.following": "跟隨中", - "account.following_counter": "正在跟隨 {count,plural,other {{counter} 人}}", + "account.following_counter": "正在跟隨 {count,plural,other {{count} 人}}", "account.follows.empty": "這位使用者尚未跟隨任何人。", "account.go_to_profile": "前往個人檔案", "account.hide_reblogs": "隱藏來自 @{name} 的轉嘟", @@ -62,8 +62,8 @@ "account.requested": "正在等候審核。按一下以取消跟隨請求", "account.requested_follow": "{name} 要求跟隨您", "account.share": "分享 @{name} 的個人檔案", - "account.show_reblogs": "顯示來自 @{name} 的嘟文", - "account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文", + "account.show_reblogs": "顯示來自 @{name} 的轉嘟", + "account.statuses_counter": "{count, plural, other {{count} 則嘟文}}", "account.unblock": "解除封鎖 @{name}", "account.unblock_domain": "解除封鎖網域 {domain}", "account.unblock_short": "解除封鎖", @@ -113,7 +113,7 @@ "closed_registrations.other_server_instructions": "因為 Mastodon 是去中心化的,所以您也能於其他伺服器上建立帳號,並仍然與這個伺服器互動。", "closed_registrations_modal.description": "目前無法於 {domain} 建立新帳號,但也請別忘了,您並不一定需要有 {domain} 伺服器的帳號,也能使用 Mastodon。", "closed_registrations_modal.find_another_server": "尋找另一個伺服器", - "closed_registrations_modal.preamble": "Mastodon 是去中心化的,所以無論您於哪個伺服器新增帳號,都可以與此伺服器上的任何人跟隨及互動。您甚至能自行架設一個自己的伺服器!", + "closed_registrations_modal.preamble": "Mastodon 是去中心化的,所以無論您於哪個伺服器新增帳號,都可以與此伺服器上的任何人跟隨及互動。您甚至能自行架設自己的伺服器!", "closed_registrations_modal.title": "註冊 Mastodon", "column.about": "關於", "column.blocks": "已封鎖的使用者", @@ -169,27 +169,30 @@ "compose_form.spoiler_placeholder": "內容警告 (可選的)", "confirmation_modal.cancel": "取消", "confirmations.block.confirm": "封鎖", - "confirmations.cancel_follow_request.confirm": "收回跟隨請求", - "confirmations.cancel_follow_request.message": "您確定要收回跟隨 {name} 的請求嗎?", "confirmations.delete.confirm": "刪除", "confirmations.delete.message": "您確定要刪除這則嘟文嗎?", + "confirmations.delete.title": "是否刪除該嘟文?", "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "您確定要永久刪除此列表嗎?", + "confirmations.delete_list.title": "是否刪除該列表?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您於媒體描述或預覽區塊有未儲存的變更。是否要捨棄這些變更?", - "confirmations.domain_block.confirm": "封鎖伺服器", - "confirmations.domain_block.message": "您真的非常確定要封鎖整個 {domain} 網域嗎?大部分情況下,封鎖或靜音少數特定的帳號就能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。", "confirmations.edit.confirm": "編輯", "confirmations.edit.message": "編輯嘟文將覆蓋掉您目前正在撰寫之嘟文內容。您是否仍要繼續?", + "confirmations.edit.title": "是否覆寫該嘟文?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "您確定要登出嗎?", + "confirmations.logout.title": "您確定要登出嗎?", "confirmations.mute.confirm": "靜音", "confirmations.redraft.confirm": "刪除並重新編輯", "confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去這則嘟文之轉嘟及最愛,且對此嘟文之回覆會變成獨立的嘟文。", + "confirmations.redraft.title": "是否刪除並重新編輯該嘟文?", "confirmations.reply.confirm": "回覆", "confirmations.reply.message": "回覆嘟文將覆蓋掉您目前正在撰寫之嘟文內容。您是否仍要繼續?", + "confirmations.reply.title": "是否覆寫該嘟文?", "confirmations.unfollow.confirm": "取消跟隨", "confirmations.unfollow.message": "您確定要取消跟隨 {name} 嗎?", + "confirmations.unfollow.title": "是否取消跟隨該使用者?", "conversation.delete": "刪除對話", "conversation.mark_as_read": "標記為已讀", "conversation.open": "檢視對話", @@ -271,7 +274,7 @@ "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或者跟隨其他伺服器的使用者後,就會有嘟文出現了", "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,無法正常顯示此頁面。", "error.unexpected_crash.explanation_addons": "此頁面無法被正常顯示,這可能是由瀏覽器附加元件或網頁自動翻譯工具造成的。", - "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有改善,您可以使用不同的瀏覽器或應用程式來檢視來使用 Mastodon。", + "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有改善,您可以使用不同的瀏覽器或應用程式以檢視來使用 Mastodon。", "error.unexpected_crash.next_steps_addons": "請嘗試關閉它們然後重新整理頁面。如果狀況沒有改善,您可以使用不同的瀏覽器或應用程式來檢視來使用 Mastodon。", "errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿", "errors.unexpected_crash.report_issue": "回報問題", @@ -297,8 +300,7 @@ "filter_modal.select_filter.subtitle": "使用既有的類別或是新增", "filter_modal.select_filter.title": "過濾此嘟文", "filter_modal.title.status": "過濾一則嘟文", - "filtered_notifications_banner.mentions": "{count, plural, other {# 則提及}}", - "filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}} 之通知", + "filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}}", "filtered_notifications_banner.title": "已過濾之通知", "firehose.all": "全部", "firehose.local": "本站", @@ -356,7 +358,7 @@ "home.show_announcements": "顯示公告", "interaction_modal.description.favourite": "若於 Mastodon 上有個帳號,您可以將此嘟文加入最愛使作者知道您欣賞它且將它儲存下來。", "interaction_modal.description.follow": "若於 Mastodon 上有個帳號,您可以跟隨 {name} 以於首頁時間軸接收他們的嘟文。", - "interaction_modal.description.reblog": "若於 Mastodon 上有個帳號,您可以轉嘟此嘟文以分享給您的跟隨者們。", + "interaction_modal.description.reblog": "若於 Mastodon 上有個帳號,您可以轉嘟此嘟文以向您的跟隨者們分享。", "interaction_modal.description.reply": "若於 Mastodon 上有個帳號,您可以回覆此嘟文。", "interaction_modal.login.action": "返回首頁", "interaction_modal.login.prompt": "您帳號所屬伺服器之網域,例如:mastodon.social", @@ -443,6 +445,8 @@ "mute_modal.title": "是否靜音該使用者?", "mute_modal.you_wont_see_mentions": "您不會見到提及他們的嘟文。", "mute_modal.you_wont_see_posts": "他們仍可讀取您的嘟文,但您不會見到他們的。", + "name_and_others": "{name} 與 {count, plural, other {# 個人}}", + "name_and_others_with_link": "{name} 與 {count, plural, other {# 個人}}", "navigation_bar.about": "關於", "navigation_bar.advanced_interface": "以進階網頁介面開啟", "navigation_bar.blocks": "已封鎖的使用者", @@ -470,6 +474,10 @@ "navigation_bar.security": "安全性", "not_signed_in_indicator.not_signed_in": "您需要登入才能存取此資源。", "notification.admin.report": "{name} 已檢舉 {target}", + "notification.admin.report_account": "{name} 已檢舉來自 {target} 關於 {category} 之 {count, plural, other {# 則嘟文}} ", + "notification.admin.report_account_other": "{name} 已檢舉來自 {target} 之 {count, plural, other {# 則嘟文}} ", + "notification.admin.report_statuses": "{name} 已檢舉 {target} 關於 {category}", + "notification.admin.report_statuses_other": "{name} 已檢舉 {target}", "notification.admin.sign_up": "{name} 已經註冊", "notification.favourite": "{name} 已將您的嘟文加入最愛", "notification.follow": "{name} 已跟隨您", @@ -486,6 +494,7 @@ "notification.moderation_warning.action_suspend": "您的帳號已被停權。", "notification.own_poll": "您的投票已結束", "notification.poll": "您曾投過的投票已經結束", + "notification.private_mention": "{name} 私訊您", "notification.reblog": "{name} 已轉嘟您的嘟文", "notification.relationships_severance_event": "與 {name} 失去連結", "notification.relationships_severance_event.account_suspension": "{from} 之管理員已將 {target} 停權,意味著您將不再收到來自他們的更新或與之互動。", @@ -496,13 +505,18 @@ "notification.update": "{name} 已編輯嘟文", "notification_requests.accept": "接受", "notification_requests.dismiss": "關閉", + "notification_requests.maximize": "最大化", + "notification_requests.minimize_banner": "最小化已過濾通知橫幅", "notification_requests.notifications_from": "來自 {name} 之通知", "notification_requests.title": "已過濾之通知", "notifications.clear": "清除通知", "notifications.clear_confirmation": "您確定要永久清除您的通知嗎?", + "notifications.clear_title": "是否清除推播通知?", "notifications.column_settings.admin.report": "新檢舉報告:", "notifications.column_settings.admin.sign_up": "新註冊帳號:", "notifications.column_settings.alert": "桌面通知", + "notifications.column_settings.beta.category": "實驗性功能", + "notifications.column_settings.beta.grouping": "分組通知", "notifications.column_settings.favourite": "最愛:", "notifications.column_settings.filter_bar.advanced": "顯示所有分類", "notifications.column_settings.filter_bar.category": "快速過濾器", @@ -552,7 +566,7 @@ "onboarding.follows.lead": "您的首頁時間軸是 Mastodon 的核心體驗。若您跟隨更多人,它將會變得更活躍有趣。這些個人檔案也許是個好起點,您可以隨時取消跟隨他們!", "onboarding.follows.title": "客製化您的首頁時間軸", "onboarding.profile.discoverable": "使我的個人檔案可以被找到", - "onboarding.profile.discoverable_hint": "當您於 Mastodon 上選擇加入可發現性時,您的嘟文可能會顯示於搜尋結果與趨勢中。您的個人檔案可能會被推薦給與您志趣相投的人。", + "onboarding.profile.discoverable_hint": "當您於 Mastodon 上選擇加入可發現性時,您的嘟文可能會顯示於搜尋結果與趨勢中。您的個人檔案可能會被推薦至與您志趣相投的人。", "onboarding.profile.display_name": "顯示名稱", "onboarding.profile.display_name_hint": "完整名稱或暱稱...", "onboarding.profile.lead": "您隨時可以稍候於設定中完成此操作,將有更多自訂選項可使用。", @@ -666,9 +680,13 @@ "report.unfollow_explanation": "您正在跟隨此帳號。如不欲於首頁時間軸再見到他們的嘟文,請取消跟隨。", "report_notification.attached_statuses": "{count, plural, one {{count} 則} other {{count} 則}} 嘟文", "report_notification.categories.legal": "合法性", + "report_notification.categories.legal_sentence": "違法內容", "report_notification.categories.other": "其他", + "report_notification.categories.other_sentence": "其他", "report_notification.categories.spam": "垃圾訊息", + "report_notification.categories.spam_sentence": "垃圾訊息", "report_notification.categories.violation": "違反規則", + "report_notification.categories.violation_sentence": "違反規則", "report_notification.open": "開啟檢舉報告", "search.no_recent_searches": "尚無最近的搜尋紀錄", "search.placeholder": "搜尋", @@ -797,7 +815,7 @@ "upload_modal.applying": "正在套用...", "upload_modal.choose_image": "選擇圖片", "upload_modal.description_placeholder": "我能吞下玻璃而不傷身體", - "upload_modal.detect_text": "從圖片中偵測文字", + "upload_modal.detect_text": "自圖片中偵測文字", "upload_modal.edit_media": "編輯媒體", "upload_modal.hint": "於預覽中點擊或拖曳圓圈以選擇將於所有縮圖中顯示的焦點。", "upload_modal.preparing_ocr": "準備 OCR 中……", diff --git a/app/javascript/mastodon/models/notification_group.ts b/app/javascript/mastodon/models/notification_group.ts new file mode 100644 index 00000000000..76034e644e9 --- /dev/null +++ b/app/javascript/mastodon/models/notification_group.ts @@ -0,0 +1,206 @@ +import type { + ApiAccountRelationshipSeveranceEventJSON, + ApiAccountWarningJSON, + BaseNotificationGroupJSON, + ApiNotificationGroupJSON, + ApiNotificationJSON, + NotificationType, + NotificationWithStatusType, +} from 'mastodon/api_types/notifications'; +import type { ApiReportJSON } from 'mastodon/api_types/reports'; + +// Maximum number of avatars displayed in a notification group +// This corresponds to the max lenght of `group.sampleAccountIds` +export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8; + +interface BaseNotificationGroup + extends Omit { + sampleAccountIds: string[]; +} + +interface BaseNotificationWithStatus + extends BaseNotificationGroup { + type: Type; + statusId: string; +} + +interface BaseNotification + extends BaseNotificationGroup { + type: Type; +} + +export type NotificationGroupFavourite = + BaseNotificationWithStatus<'favourite'>; +export type NotificationGroupReblog = BaseNotificationWithStatus<'reblog'>; +export type NotificationGroupStatus = BaseNotificationWithStatus<'status'>; +export type NotificationGroupMention = BaseNotificationWithStatus<'mention'>; +export type NotificationGroupPoll = BaseNotificationWithStatus<'poll'>; +export type NotificationGroupUpdate = BaseNotificationWithStatus<'update'>; +export type NotificationGroupFollow = BaseNotification<'follow'>; +export type NotificationGroupFollowRequest = BaseNotification<'follow_request'>; +export type NotificationGroupAdminSignUp = BaseNotification<'admin.sign_up'>; + +export type AccountWarningAction = + | 'none' + | 'disable' + | 'mark_statuses_as_sensitive' + | 'delete_statuses' + | 'sensitive' + | 'silence' + | 'suspend'; +export interface AccountWarning + extends Omit { + targetAccountId: string; +} + +export interface NotificationGroupModerationWarning + extends BaseNotification<'moderation_warning'> { + moderationWarning: AccountWarning; +} + +type AccountRelationshipSeveranceEvent = + ApiAccountRelationshipSeveranceEventJSON; +export interface NotificationGroupSeveredRelationships + extends BaseNotification<'severed_relationships'> { + event: AccountRelationshipSeveranceEvent; +} + +interface Report extends Omit { + targetAccountId: string; +} + +export interface NotificationGroupAdminReport + extends BaseNotification<'admin.report'> { + report: Report; +} + +export type NotificationGroup = + | NotificationGroupFavourite + | NotificationGroupReblog + | NotificationGroupStatus + | NotificationGroupMention + | NotificationGroupPoll + | NotificationGroupUpdate + | NotificationGroupFollow + | NotificationGroupFollowRequest + | NotificationGroupModerationWarning + | NotificationGroupSeveredRelationships + | NotificationGroupAdminSignUp + | NotificationGroupAdminReport; + +function createReportFromJSON(reportJSON: ApiReportJSON): Report { + const { target_account, ...report } = reportJSON; + return { + targetAccountId: target_account.id, + ...report, + }; +} + +function createAccountWarningFromJSON( + warningJSON: ApiAccountWarningJSON, +): AccountWarning { + const { target_account, ...warning } = warningJSON; + return { + targetAccountId: target_account.id, + ...warning, + }; +} + +function createAccountRelationshipSeveranceEventFromJSON( + eventJson: ApiAccountRelationshipSeveranceEventJSON, +): AccountRelationshipSeveranceEvent { + return eventJson; +} + +export function createNotificationGroupFromJSON( + groupJson: ApiNotificationGroupJSON, +): NotificationGroup { + const { sample_account_ids: sampleAccountIds, ...group } = groupJson; + + switch (group.type) { + case 'favourite': + case 'reblog': + case 'status': + case 'mention': + case 'poll': + case 'update': { + const { status_id: statusId, ...groupWithoutStatus } = group; + return { + statusId, + sampleAccountIds, + ...groupWithoutStatus, + }; + } + case 'admin.report': { + const { report, ...groupWithoutTargetAccount } = group; + return { + report: createReportFromJSON(report), + sampleAccountIds, + ...groupWithoutTargetAccount, + }; + } + case 'severed_relationships': + return { + ...group, + event: createAccountRelationshipSeveranceEventFromJSON(group.event), + sampleAccountIds, + }; + + case 'moderation_warning': { + const { moderation_warning, ...groupWithoutModerationWarning } = group; + return { + ...groupWithoutModerationWarning, + moderationWarning: createAccountWarningFromJSON(moderation_warning), + sampleAccountIds, + }; + } + default: + return { + sampleAccountIds, + ...group, + }; + } +} + +export function createNotificationGroupFromNotificationJSON( + notification: ApiNotificationJSON, +) { + const group = { + sampleAccountIds: [notification.account.id], + group_key: notification.group_key, + notifications_count: 1, + type: notification.type, + most_recent_notification_id: notification.id, + page_min_id: notification.id, + page_max_id: notification.id, + latest_page_notification_at: notification.created_at, + } as NotificationGroup; + + switch (notification.type) { + case 'favourite': + case 'reblog': + case 'status': + case 'mention': + case 'poll': + case 'update': + return { ...group, statusId: notification.status.id }; + case 'admin.report': + return { ...group, report: createReportFromJSON(notification.report) }; + case 'severed_relationships': + return { + ...group, + event: createAccountRelationshipSeveranceEventFromJSON( + notification.event, + ), + }; + case 'moderation_warning': + return { + ...group, + moderationWarning: createAccountWarningFromJSON( + notification.moderation_warning, + ), + }; + default: + return group; + } +} diff --git a/app/javascript/mastodon/models/notification_policy.ts b/app/javascript/mastodon/models/notification_policy.ts new file mode 100644 index 00000000000..eb65403292e --- /dev/null +++ b/app/javascript/mastodon/models/notification_policy.ts @@ -0,0 +1,3 @@ +import type { NotificationPolicyJSON } from 'mastodon/api_types/notification_policies'; + +export type NotificationPolicy = NotificationPolicyJSON; // No changes from the API type diff --git a/app/javascript/mastodon/models/status.ts b/app/javascript/mastodon/models/status.ts index 7907fc34f8e..3900df4e38e 100644 --- a/app/javascript/mastodon/models/status.ts +++ b/app/javascript/mastodon/models/status.ts @@ -1,4 +1,12 @@ +import type { RecordOf } from 'immutable'; + +import type { ApiPreviewCardJSON } from 'mastodon/api_types/statuses'; + export type { StatusVisibility } from 'mastodon/api_types/statuses'; // Temporary until we type it correctly export type Status = Immutable.Map; + +type CardShape = Required; + +export type Card = RecordOf; diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index 97218e9f750..9f66c09631d 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -1,5 +1,7 @@ import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; +import { timelineDelete } from 'mastodon/actions/timelines_typed'; + import { COMPOSE_MOUNT, COMPOSE_UNMOUNT, @@ -51,7 +53,6 @@ import { } from '../actions/compose'; import { REDRAFT } from '../actions/statuses'; import { STORE_HYDRATE } from '../actions/store'; -import { TIMELINE_DELETE } from '../actions/timelines'; import { me } from '../initial_state'; import { unescapeHTML } from '../utils/html'; import { uuid } from '../uuid'; @@ -446,10 +447,10 @@ export default function compose(state = initialState, action) { return updateSuggestionTags(state, action.token); case COMPOSE_TAG_HISTORY_UPDATE: return state.set('tagHistory', fromJS(action.tags)); - case TIMELINE_DELETE: - if (action.id === state.get('in_reply_to')) { + case timelineDelete.type: + if (action.payload.statusId === state.get('in_reply_to')) { return state.set('in_reply_to', null); - } else if (action.id === state.get('id')) { + } else if (action.payload.statusId === state.get('id')) { return state.set('id', null); } else { return state; diff --git a/app/javascript/mastodon/reducers/contexts.js b/app/javascript/mastodon/reducers/contexts.js index f7d7419a4e3..b2c6f3f1abe 100644 --- a/app/javascript/mastodon/reducers/contexts.js +++ b/app/javascript/mastodon/reducers/contexts.js @@ -1,11 +1,13 @@ import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; +import { timelineDelete } from 'mastodon/actions/timelines_typed'; + import { blockAccountSuccess, muteAccountSuccess, } from '../actions/accounts'; import { CONTEXT_FETCH_SUCCESS } from '../actions/statuses'; -import { TIMELINE_DELETE, TIMELINE_UPDATE } from '../actions/timelines'; +import { TIMELINE_UPDATE } from '../actions/timelines'; import { compareId } from '../compare_id'; const initialState = ImmutableMap({ @@ -97,8 +99,8 @@ export default function replies(state = initialState, action) { return filterContexts(state, action.payload.relationship, action.payload.statuses); case CONTEXT_FETCH_SUCCESS: return normalizeContext(state, action.id, action.ancestors, action.descendants); - case TIMELINE_DELETE: - return deleteFromContexts(state, [action.id]); + case timelineDelete.type: + return deleteFromContexts(state, [action.payload.statusId]); case TIMELINE_UPDATE: return updateContext(state, action.status); default: diff --git a/app/javascript/mastodon/reducers/index.ts b/app/javascript/mastodon/reducers/index.ts index 6296ef20269..b92de0dbcda 100644 --- a/app/javascript/mastodon/reducers/index.ts +++ b/app/javascript/mastodon/reducers/index.ts @@ -24,6 +24,7 @@ import { markersReducer } from './markers'; import media_attachments from './media_attachments'; import meta from './meta'; import { modalReducer } from './modal'; +import { notificationGroupsReducer } from './notification_groups'; import { notificationPolicyReducer } from './notification_policy'; import { notificationRequestsReducer } from './notification_requests'; import notifications from './notifications'; @@ -65,6 +66,7 @@ const reducers = { search, media_attachments, notifications, + notificationGroups: notificationGroupsReducer, height_cache, custom_emojis, lists, diff --git a/app/javascript/mastodon/reducers/markers.ts b/app/javascript/mastodon/reducers/markers.ts index ec85d0f1732..b1f10b5fa23 100644 --- a/app/javascript/mastodon/reducers/markers.ts +++ b/app/javascript/mastodon/reducers/markers.ts @@ -1,6 +1,7 @@ import { createReducer } from '@reduxjs/toolkit'; -import { submitMarkersAction } from 'mastodon/actions/markers'; +import { submitMarkersAction, fetchMarkers } from 'mastodon/actions/markers'; +import { compareId } from 'mastodon/compare_id'; const initialState = { home: '0', @@ -15,4 +16,23 @@ export const markersReducer = createReducer(initialState, (builder) => { if (notifications) state.notifications = notifications; }, ); + builder.addCase( + fetchMarkers.fulfilled, + ( + state, + { + payload: { + markers: { home, notifications }, + }, + }, + ) => { + if (home && compareId(home.last_read_id, state.home) > 0) + state.home = home.last_read_id; + if ( + notifications && + compareId(notifications.last_read_id, state.notifications) > 0 + ) + state.notifications = notifications.last_read_id; + }, + ); }); diff --git a/app/javascript/mastodon/reducers/modal.ts b/app/javascript/mastodon/reducers/modal.ts index 368f26542c0..ca85eb8c7f5 100644 --- a/app/javascript/mastodon/reducers/modal.ts +++ b/app/javascript/mastodon/reducers/modal.ts @@ -1,10 +1,11 @@ import type { Reducer } from '@reduxjs/toolkit'; import { Record as ImmutableRecord, Stack } from 'immutable'; +import { timelineDelete } from 'mastodon/actions/timelines_typed'; + import { COMPOSE_UPLOAD_CHANGE_SUCCESS } from '../actions/compose'; import type { ModalType } from '../actions/modal'; import { openModal, closeModal } from '../actions/modal'; -import { TIMELINE_DELETE } from '../actions/timelines'; export type ModalProps = Record; interface Modal { @@ -72,10 +73,10 @@ export const modalReducer: Reducer = (state = initialState, action) => { // TODO: type those actions else if (action.type === COMPOSE_UPLOAD_CHANGE_SUCCESS) return popModal(state, { modalType: 'FOCAL_POINT', ignoreFocus: false }); - else if (action.type === TIMELINE_DELETE) + else if (timelineDelete.match(action)) return state.update('stack', (stack) => stack.filterNot( - (modal) => modal.get('modalProps').statusId === action.id, + (modal) => modal.get('modalProps').statusId === action.payload.statusId, ), ); else return state; diff --git a/app/javascript/mastodon/reducers/notification_groups.ts b/app/javascript/mastodon/reducers/notification_groups.ts new file mode 100644 index 00000000000..e59f3e7ca11 --- /dev/null +++ b/app/javascript/mastodon/reducers/notification_groups.ts @@ -0,0 +1,508 @@ +import { createReducer, isAnyOf } from '@reduxjs/toolkit'; + +import { + authorizeFollowRequestSuccess, + blockAccountSuccess, + muteAccountSuccess, + rejectFollowRequestSuccess, +} from 'mastodon/actions/accounts_typed'; +import { focusApp, unfocusApp } from 'mastodon/actions/app'; +import { blockDomainSuccess } from 'mastodon/actions/domain_blocks_typed'; +import { fetchMarkers } from 'mastodon/actions/markers'; +import { + clearNotifications, + fetchNotifications, + fetchNotificationsGap, + processNewNotificationForGroups, + loadPending, + updateScrollPosition, + markNotificationsAsRead, + mountNotifications, + unmountNotifications, +} from 'mastodon/actions/notification_groups'; +import { + disconnectTimeline, + timelineDelete, +} from 'mastodon/actions/timelines_typed'; +import type { ApiNotificationJSON } from 'mastodon/api_types/notifications'; +import { compareId } from 'mastodon/compare_id'; +import { usePendingItems } from 'mastodon/initial_state'; +import { + NOTIFICATIONS_GROUP_MAX_AVATARS, + createNotificationGroupFromJSON, + createNotificationGroupFromNotificationJSON, +} from 'mastodon/models/notification_group'; +import type { NotificationGroup } from 'mastodon/models/notification_group'; + +const NOTIFICATIONS_TRIM_LIMIT = 50; + +export interface NotificationGap { + type: 'gap'; + maxId?: string; + sinceId?: string; +} + +interface NotificationGroupsState { + groups: (NotificationGroup | NotificationGap)[]; + pendingGroups: (NotificationGroup | NotificationGap)[]; + scrolledToTop: boolean; + isLoading: boolean; + lastReadId: string; + mounted: number; + isTabVisible: boolean; +} + +const initialState: NotificationGroupsState = { + groups: [], + pendingGroups: [], // holds pending groups in slow mode + scrolledToTop: false, + isLoading: false, + // The following properties are used to track unread notifications + lastReadId: '0', // used for unread notifications + mounted: 0, // number of mounted notification list components, usually 0 or 1 + isTabVisible: true, +}; + +function filterNotificationsForAccounts( + groups: NotificationGroupsState['groups'], + accountIds: string[], + onlyForType?: string, +) { + groups = groups + .map((group) => { + if ( + group.type !== 'gap' && + (!onlyForType || group.type === onlyForType) + ) { + const previousLength = group.sampleAccountIds.length; + + group.sampleAccountIds = group.sampleAccountIds.filter( + (id) => !accountIds.includes(id), + ); + + const newLength = group.sampleAccountIds.length; + const removed = previousLength - newLength; + + group.notifications_count -= removed; + } + + return group; + }) + .filter( + (group) => group.type === 'gap' || group.sampleAccountIds.length > 0, + ); + mergeGaps(groups); + return groups; +} + +function filterNotificationsForStatus( + groups: NotificationGroupsState['groups'], + statusId: string, +) { + groups = groups.filter( + (group) => + group.type === 'gap' || + !('statusId' in group) || + group.statusId !== statusId, + ); + mergeGaps(groups); + return groups; +} + +function removeNotificationsForAccounts( + state: NotificationGroupsState, + accountIds: string[], + onlyForType?: string, +) { + state.groups = filterNotificationsForAccounts( + state.groups, + accountIds, + onlyForType, + ); + state.pendingGroups = filterNotificationsForAccounts( + state.pendingGroups, + accountIds, + onlyForType, + ); +} + +function removeNotificationsForStatus( + state: NotificationGroupsState, + statusId: string, +) { + state.groups = filterNotificationsForStatus(state.groups, statusId); + state.pendingGroups = filterNotificationsForStatus( + state.pendingGroups, + statusId, + ); +} + +function isNotificationGroup( + groupOrGap: NotificationGroup | NotificationGap, +): groupOrGap is NotificationGroup { + return groupOrGap.type !== 'gap'; +} + +// Merge adjacent gaps in `groups` in-place +function mergeGaps(groups: NotificationGroupsState['groups']) { + for (let i = 0; i < groups.length; i++) { + const firstGroupOrGap = groups[i]; + + if (firstGroupOrGap?.type === 'gap') { + let lastGap = firstGroupOrGap; + let j = i + 1; + + for (; j < groups.length; j++) { + const groupOrGap = groups[j]; + if (groupOrGap?.type === 'gap') lastGap = groupOrGap; + else break; + } + + if (j - i > 1) { + groups.splice(i, j - i, { + type: 'gap', + maxId: firstGroupOrGap.maxId, + sinceId: lastGap.sinceId, + }); + } + } + } +} + +// Checks if `groups[index-1]` and `groups[index]` are gaps, and merge them in-place if they are +function mergeGapsAround( + groups: NotificationGroupsState['groups'], + index: number, +) { + if (index > 0) { + const potentialFirstGap = groups[index - 1]; + const potentialSecondGap = groups[index]; + + if ( + potentialFirstGap?.type === 'gap' && + potentialSecondGap?.type === 'gap' + ) { + groups.splice(index - 1, 2, { + type: 'gap', + maxId: potentialFirstGap.maxId, + sinceId: potentialSecondGap.sinceId, + }); + } + } +} + +function processNewNotification( + groups: NotificationGroupsState['groups'], + notification: ApiNotificationJSON, +) { + const existingGroupIndex = groups.findIndex( + (group) => + group.type !== 'gap' && group.group_key === notification.group_key, + ); + + // In any case, we are going to add a group at the top + // If there is currently a gap at the top, now is the time to update it + if (groups.length > 0 && groups[0]?.type === 'gap') { + groups[0].maxId = notification.id; + } + + if (existingGroupIndex > -1) { + const existingGroup = groups[existingGroupIndex]; + + if ( + existingGroup && + existingGroup.type !== 'gap' && + !existingGroup.sampleAccountIds.includes(notification.account.id) // This can happen for example if you like, then unlike, then like again the same post + ) { + // Update the existing group + if ( + existingGroup.sampleAccountIds.unshift(notification.account.id) > + NOTIFICATIONS_GROUP_MAX_AVATARS + ) + existingGroup.sampleAccountIds.pop(); + + existingGroup.most_recent_notification_id = notification.id; + existingGroup.page_max_id = notification.id; + existingGroup.latest_page_notification_at = notification.created_at; + existingGroup.notifications_count += 1; + + groups.splice(existingGroupIndex, 1); + mergeGapsAround(groups, existingGroupIndex); + + groups.unshift(existingGroup); + } + } else { + // Create a new group + groups.unshift(createNotificationGroupFromNotificationJSON(notification)); + } +} + +function trimNotifications(state: NotificationGroupsState) { + if (state.scrolledToTop) { + state.groups.splice(NOTIFICATIONS_TRIM_LIMIT); + } +} + +function shouldMarkNewNotificationsAsRead( + { + isTabVisible, + scrolledToTop, + mounted, + lastReadId, + groups, + }: NotificationGroupsState, + ignoreScroll = false, +) { + const isMounted = mounted > 0; + const oldestGroup = groups.findLast(isNotificationGroup); + const hasMore = groups.at(-1)?.type === 'gap'; + const oldestGroupReached = + !hasMore || + lastReadId === '0' || + (oldestGroup?.page_min_id && + compareId(oldestGroup.page_min_id, lastReadId) <= 0); + + return ( + isTabVisible && + (ignoreScroll || scrolledToTop) && + isMounted && + oldestGroupReached + ); +} + +function updateLastReadId( + state: NotificationGroupsState, + group: NotificationGroup | undefined = undefined, +) { + if (shouldMarkNewNotificationsAsRead(state)) { + group = group ?? state.groups.find(isNotificationGroup); + if ( + group?.page_max_id && + compareId(state.lastReadId, group.page_max_id) < 0 + ) + state.lastReadId = group.page_max_id; + } +} + +export const notificationGroupsReducer = createReducer( + initialState, + (builder) => { + builder + .addCase(fetchNotifications.fulfilled, (state, action) => { + state.groups = action.payload.map((json) => + json.type === 'gap' ? json : createNotificationGroupFromJSON(json), + ); + state.isLoading = false; + updateLastReadId(state); + }) + .addCase(fetchNotificationsGap.fulfilled, (state, action) => { + const { notifications } = action.payload; + + // find the gap in the existing notifications + const gapIndex = state.groups.findIndex( + (groupOrGap) => + groupOrGap.type === 'gap' && + groupOrGap.sinceId === action.meta.arg.gap.sinceId && + groupOrGap.maxId === action.meta.arg.gap.maxId, + ); + + if (gapIndex < 0) + // We do not know where to insert, let's return + return; + + // Filling a disconnection gap means we're getting historical data + // about groups we may know or may not know about. + + // The notifications timeline is split in two by the gap, with + // group information newer than the gap, and group information older + // than the gap. + + // Filling a gap should not touch anything before the gap, so any + // information on groups already appearing before the gap should be + // discarded, while any information on groups appearing after the gap + // can be updated and re-ordered. + + const oldestPageNotification = notifications.at(-1)?.page_min_id; + + // replace the gap with the notifications + a new gap + + const newerGroupKeys = state.groups + .slice(0, gapIndex) + .filter(isNotificationGroup) + .map((group) => group.group_key); + + const toInsert: NotificationGroupsState['groups'] = notifications + .map((json) => createNotificationGroupFromJSON(json)) + .filter( + (notification) => !newerGroupKeys.includes(notification.group_key), + ); + + const apiGroupKeys = (toInsert as NotificationGroup[]).map( + (group) => group.group_key, + ); + + const sinceId = action.meta.arg.gap.sinceId; + if ( + notifications.length > 0 && + !( + oldestPageNotification && + sinceId && + compareId(oldestPageNotification, sinceId) <= 0 + ) + ) { + // If we get an empty page, it means we reached the bottom, so we do not need to insert a new gap + // Similarly, if we've fetched more than the gap's, this means we have completely filled it + toInsert.push({ + type: 'gap', + maxId: notifications.at(-1)?.page_max_id, + sinceId, + } as NotificationGap); + } + + // Remove older groups covered by the API + state.groups = state.groups.filter( + (groupOrGap) => + groupOrGap.type !== 'gap' && + !apiGroupKeys.includes(groupOrGap.group_key), + ); + + // Replace the gap with API results (+ the new gap if needed) + state.groups.splice(gapIndex, 1, ...toInsert); + + // Finally, merge any adjacent gaps that could have been created by filtering + // groups earlier + mergeGaps(state.groups); + + state.isLoading = false; + + updateLastReadId(state); + }) + .addCase(processNewNotificationForGroups.fulfilled, (state, action) => { + const notification = action.payload; + processNewNotification( + usePendingItems ? state.pendingGroups : state.groups, + notification, + ); + updateLastReadId(state); + trimNotifications(state); + }) + .addCase(disconnectTimeline, (state, action) => { + if (action.payload.timeline === 'home') { + if (state.groups.length > 0 && state.groups[0]?.type !== 'gap') { + state.groups.unshift({ + type: 'gap', + sinceId: state.groups[0]?.page_min_id, + }); + } + } + }) + .addCase(timelineDelete, (state, action) => { + removeNotificationsForStatus(state, action.payload.statusId); + }) + .addCase(clearNotifications.pending, (state) => { + state.groups = []; + state.pendingGroups = []; + }) + .addCase(blockAccountSuccess, (state, action) => { + removeNotificationsForAccounts(state, [action.payload.relationship.id]); + }) + .addCase(muteAccountSuccess, (state, action) => { + if (action.payload.relationship.muting_notifications) + removeNotificationsForAccounts(state, [ + action.payload.relationship.id, + ]); + }) + .addCase(blockDomainSuccess, (state, action) => { + removeNotificationsForAccounts( + state, + action.payload.accounts.map((account) => account.id), + ); + }) + .addCase(loadPending, (state) => { + // First, remove any existing group and merge data + state.pendingGroups.forEach((group) => { + if (group.type !== 'gap') { + const existingGroupIndex = state.groups.findIndex( + (groupOrGap) => + isNotificationGroup(groupOrGap) && + groupOrGap.group_key === group.group_key, + ); + if (existingGroupIndex > -1) { + const existingGroup = state.groups[existingGroupIndex]; + if (existingGroup && existingGroup.type !== 'gap') { + group.notifications_count += existingGroup.notifications_count; + group.sampleAccountIds = group.sampleAccountIds + .concat(existingGroup.sampleAccountIds) + .slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS); + state.groups.splice(existingGroupIndex, 1); + } + } + } + trimNotifications(state); + }); + + // Then build the consolidated list and clear pending groups + state.groups = state.pendingGroups.concat(state.groups); + state.pendingGroups = []; + }) + .addCase(updateScrollPosition, (state, action) => { + state.scrolledToTop = action.payload.top; + updateLastReadId(state); + trimNotifications(state); + }) + .addCase(markNotificationsAsRead, (state) => { + const mostRecentGroup = state.groups.find(isNotificationGroup); + if ( + mostRecentGroup?.page_max_id && + compareId(state.lastReadId, mostRecentGroup.page_max_id) < 0 + ) + state.lastReadId = mostRecentGroup.page_max_id; + }) + .addCase(fetchMarkers.fulfilled, (state, action) => { + if ( + action.payload.markers.notifications && + compareId( + state.lastReadId, + action.payload.markers.notifications.last_read_id, + ) < 0 + ) + state.lastReadId = action.payload.markers.notifications.last_read_id; + }) + .addCase(mountNotifications, (state) => { + state.mounted += 1; + updateLastReadId(state); + }) + .addCase(unmountNotifications, (state) => { + state.mounted -= 1; + }) + .addCase(focusApp, (state) => { + state.isTabVisible = true; + updateLastReadId(state); + }) + .addCase(unfocusApp, (state) => { + state.isTabVisible = false; + }) + .addMatcher( + isAnyOf(authorizeFollowRequestSuccess, rejectFollowRequestSuccess), + (state, action) => { + removeNotificationsForAccounts( + state, + [action.payload.id], + 'follow_request', + ); + }, + ) + .addMatcher( + isAnyOf(fetchNotifications.pending, fetchNotificationsGap.pending), + (state) => { + state.isLoading = true; + }, + ) + .addMatcher( + isAnyOf(fetchNotifications.rejected, fetchNotificationsGap.rejected), + (state) => { + state.isLoading = false; + }, + ); + }, +); diff --git a/app/javascript/mastodon/reducers/notification_policy.js b/app/javascript/mastodon/reducers/notification_policy.js deleted file mode 100644 index 8edb4d12a15..00000000000 --- a/app/javascript/mastodon/reducers/notification_policy.js +++ /dev/null @@ -1,12 +0,0 @@ -import { fromJS } from 'immutable'; - -import { NOTIFICATION_POLICY_FETCH_SUCCESS } from 'mastodon/actions/notifications'; - -export const notificationPolicyReducer = (state = null, action) => { - switch(action.type) { - case NOTIFICATION_POLICY_FETCH_SUCCESS: - return fromJS(action.policy); - default: - return state; - } -}; diff --git a/app/javascript/mastodon/reducers/notification_policy.ts b/app/javascript/mastodon/reducers/notification_policy.ts new file mode 100644 index 00000000000..ed912dde5d6 --- /dev/null +++ b/app/javascript/mastodon/reducers/notification_policy.ts @@ -0,0 +1,26 @@ +import { createReducer, isAnyOf } from '@reduxjs/toolkit'; + +import { + fetchNotificationPolicy, + decreasePendingNotificationsCount, + updateNotificationsPolicy, +} from 'mastodon/actions/notification_policies'; +import type { NotificationPolicy } from 'mastodon/models/notification_policy'; + +export const notificationPolicyReducer = + createReducer(null, (builder) => { + builder + .addCase(decreasePendingNotificationsCount, (state, action) => { + if (state) { + state.summary.pending_notifications_count -= action.payload; + state.summary.pending_requests_count -= 1; + } + }) + .addMatcher( + isAnyOf( + fetchNotificationPolicy.fulfilled, + updateNotificationsPolicy.fulfilled, + ), + (_state, action) => action.payload, + ); + }); diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 64cddcb6668..622f5e8e884 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -1,6 +1,7 @@ import { fromJS, Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { blockDomainSuccess } from 'mastodon/actions/domain_blocks'; +import { timelineDelete } from 'mastodon/actions/timelines_typed'; import { authorizeFollowRequestSuccess, @@ -15,13 +16,13 @@ import { import { fetchMarkers, } from '../actions/markers'; +import { clearNotifications } from '../actions/notification_groups'; import { notificationsUpdate, NOTIFICATIONS_EXPAND_SUCCESS, NOTIFICATIONS_EXPAND_REQUEST, NOTIFICATIONS_EXPAND_FAIL, NOTIFICATIONS_FILTER_SET, - NOTIFICATIONS_CLEAR, NOTIFICATIONS_SCROLL_TOP, NOTIFICATIONS_LOAD_PENDING, NOTIFICATIONS_MOUNT, @@ -30,7 +31,7 @@ import { NOTIFICATIONS_SET_BROWSER_SUPPORT, NOTIFICATIONS_SET_BROWSER_PERMISSION, } from '../actions/notifications'; -import { TIMELINE_DELETE, TIMELINE_DISCONNECT } from '../actions/timelines'; +import { disconnectTimeline } from '../actions/timelines'; import { compareId } from '../compare_id'; const initialState = ImmutableMap({ @@ -289,13 +290,13 @@ export default function notifications(state = initialState, action) { case authorizeFollowRequestSuccess.type: case rejectFollowRequestSuccess.type: return filterNotifications(state, [action.payload.id], 'follow_request'); - case NOTIFICATIONS_CLEAR: + case clearNotifications.pending.type: return state.set('items', ImmutableList()).set('pendingItems', ImmutableList()).set('hasMore', false); - case TIMELINE_DELETE: - return deleteByStatus(state, action.id); - case TIMELINE_DISCONNECT: - return action.timeline === 'home' ? - state.update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items) : + case timelineDelete.type: + return deleteByStatus(state, action.payload.statusId); + case disconnectTimeline.type: + return action.payload.timeline === 'home' ? + state.update(action.payload.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items) : state; case NOTIFICATIONS_MARK_AS_READ: const lastNotification = state.get('items').find(item => item !== null); diff --git a/app/javascript/mastodon/reducers/picture_in_picture.ts b/app/javascript/mastodon/reducers/picture_in_picture.ts index 0feddcb7063..10d4f1fae51 100644 --- a/app/javascript/mastodon/reducers/picture_in_picture.ts +++ b/app/javascript/mastodon/reducers/picture_in_picture.ts @@ -4,8 +4,7 @@ import { deployPictureInPictureAction, removePictureInPicture, } from 'mastodon/actions/picture_in_picture'; - -import { TIMELINE_DELETE } from '../actions/timelines'; +import { timelineDelete } from 'mastodon/actions/timelines_typed'; export interface PIPMediaProps { src: string; @@ -49,8 +48,9 @@ export const pictureInPictureReducer: Reducer = ( ...action.payload.props, }; else if (removePictureInPicture.match(action)) return initialState; - else if (action.type === TIMELINE_DELETE) - if (state.type && state.statusId === action.id) return initialState; + else if (timelineDelete.match(action)) + if (state.type && state.statusId === action.payload.statusId) + return initialState; return state; }; diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js index 0e353e0d1b7..6f55241dc1c 100644 --- a/app/javascript/mastodon/reducers/settings.js +++ b/app/javascript/mastodon/reducers/settings.js @@ -51,6 +51,7 @@ const initialState = ImmutableMap({ dismissPermissionBanner: false, showUnread: true, + minimizeFilteredBanner: false, shows: ImmutableMap({ follow: true, diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js index ca766f73a36..d92174f8063 100644 --- a/app/javascript/mastodon/reducers/statuses.js +++ b/app/javascript/mastodon/reducers/statuses.js @@ -1,5 +1,7 @@ import { Map as ImmutableMap, fromJS } from 'immutable'; +import { timelineDelete } from 'mastodon/actions/timelines_typed'; + import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer'; import { normalizeStatusTranslation } from '../actions/importer/normalizer'; import { @@ -27,7 +29,6 @@ import { STATUS_FETCH_REQUEST, STATUS_FETCH_FAIL, } from '../actions/statuses'; -import { TIMELINE_DELETE } from '../actions/timelines'; const importStatus = (state, status) => state.set(status.id, fromJS(status)); @@ -114,8 +115,8 @@ export default function statuses(state = initialState, action) { }); case STATUS_COLLAPSE: return state.setIn([action.id, 'collapsed'], action.isCollapsed); - case TIMELINE_DELETE: - return deleteStatus(state, action.id, action.references); + case timelineDelete.type: + return deleteStatus(state, action.payload.statusId, action.payload.references); case STATUS_TRANSLATE_SUCCESS: return statusTranslateSuccess(state, action.id, action.translation); case STATUS_TRANSLATE_UNDO: diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js index 4c9ab98a82e..b07281ab877 100644 --- a/app/javascript/mastodon/reducers/timelines.js +++ b/app/javascript/mastodon/reducers/timelines.js @@ -1,5 +1,7 @@ import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; +import { timelineDelete } from 'mastodon/actions/timelines_typed'; + import { blockAccountSuccess, muteAccountSuccess, @@ -7,19 +9,18 @@ import { } from '../actions/accounts'; import { TIMELINE_UPDATE, - TIMELINE_DELETE, TIMELINE_CLEAR, TIMELINE_EXPAND_SUCCESS, TIMELINE_EXPAND_REQUEST, TIMELINE_EXPAND_FAIL, TIMELINE_SCROLL_TOP, TIMELINE_CONNECT, - TIMELINE_DISCONNECT, TIMELINE_LOAD_PENDING, TIMELINE_MARK_AS_PARTIAL, TIMELINE_INSERT, TIMELINE_GAP, TIMELINE_SUGGESTIONS, + disconnectTimeline, } from '../actions/timelines'; import { compareId } from '../compare_id'; @@ -158,7 +159,7 @@ const filterTimelines = (state, relationship, statuses) => { return; } - references = statuses.filter(item => item.get('reblog') === status.get('id')).map(item => item.get('id')); + references = statuses.filter(item => item.get('reblog') === status.get('id')).map(item => item.get('id')).valueSeq().toJSON(); state = deleteStatus(state, status.get('id'), references, relationship.id); }); @@ -201,8 +202,8 @@ export default function timelines(state = initialState, action) { return expandNormalizedTimeline(state, action.timeline, fromJS(action.statuses), action.next, action.partial, action.isLoadingRecent, action.usePendingItems); case TIMELINE_UPDATE: return updateTimeline(state, action.timeline, fromJS(action.status), action.usePendingItems); - case TIMELINE_DELETE: - return deleteStatus(state, action.id, action.references, action.reblogOf); + case timelineDelete.type: + return deleteStatus(state, action.payload.statusId, action.payload.references, action.payload.reblogOf); case TIMELINE_CLEAR: return clearTimeline(state, action.timeline); case blockAccountSuccess.type: @@ -214,11 +215,11 @@ export default function timelines(state = initialState, action) { return updateTop(state, action.timeline, action.top); case TIMELINE_CONNECT: return state.update(action.timeline, initialTimeline, map => reconnectTimeline(map, action.usePendingItems)); - case TIMELINE_DISCONNECT: + case disconnectTimeline.type: return state.update( - action.timeline, + action.payload.timeline, initialTimeline, - map => map.set('online', false).update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(TIMELINE_GAP) : items), + map => map.set('online', false).update(action.payload.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(TIMELINE_GAP) : items), ); case TIMELINE_MARK_AS_PARTIAL: return state.update( diff --git a/app/javascript/mastodon/reducers/user_lists.js b/app/javascript/mastodon/reducers/user_lists.js index 2f17fed5fdb..7a4c04c5c7c 100644 --- a/app/javascript/mastodon/reducers/user_lists.js +++ b/app/javascript/mastodon/reducers/user_lists.js @@ -1,12 +1,8 @@ import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; import { - DIRECTORY_FETCH_REQUEST, - DIRECTORY_FETCH_SUCCESS, - DIRECTORY_FETCH_FAIL, - DIRECTORY_EXPAND_REQUEST, - DIRECTORY_EXPAND_SUCCESS, - DIRECTORY_EXPAND_FAIL, + expandDirectory, + fetchDirectory } from 'mastodon/actions/directory'; import { FEATURED_TAGS_FETCH_REQUEST, @@ -117,6 +113,7 @@ const normalizeFeaturedTags = (state, path, featuredTags, accountId) => { })); }; +/** @type {import('@reduxjs/toolkit').Reducer} */ export default function userLists(state = initialState, action) { switch(action.type) { case FOLLOWERS_FETCH_SUCCESS: @@ -194,16 +191,6 @@ export default function userLists(state = initialState, action) { case MUTES_FETCH_FAIL: case MUTES_EXPAND_FAIL: return state.setIn(['mutes', 'isLoading'], false); - case DIRECTORY_FETCH_SUCCESS: - return normalizeList(state, ['directory'], action.accounts, action.next); - case DIRECTORY_EXPAND_SUCCESS: - return appendToList(state, ['directory'], action.accounts, action.next); - case DIRECTORY_FETCH_REQUEST: - case DIRECTORY_EXPAND_REQUEST: - return state.setIn(['directory', 'isLoading'], true); - case DIRECTORY_FETCH_FAIL: - case DIRECTORY_EXPAND_FAIL: - return state.setIn(['directory', 'isLoading'], false); case FEATURED_TAGS_FETCH_SUCCESS: return normalizeFeaturedTags(state, ['featured_tags', action.id], action.tags, action.id); case FEATURED_TAGS_FETCH_REQUEST: @@ -211,6 +198,17 @@ export default function userLists(state = initialState, action) { case FEATURED_TAGS_FETCH_FAIL: return state.setIn(['featured_tags', action.id, 'isLoading'], false); default: - return state; + if(fetchDirectory.fulfilled.match(action)) + return normalizeList(state, ['directory'], action.payload.accounts, undefined); + else if( expandDirectory.fulfilled.match(action)) + return appendToList(state, ['directory'], action.payload.accounts, undefined); + else if(fetchDirectory.pending.match(action) || + expandDirectory.pending.match(action)) + return state.setIn(['directory', 'isLoading'], true); + else if(fetchDirectory.rejected.match(action) || + expandDirectory.rejected.match(action)) + return state.setIn(['directory', 'isLoading'], false); + else + return state; } } diff --git a/app/javascript/mastodon/selectors/notifications.ts b/app/javascript/mastodon/selectors/notifications.ts new file mode 100644 index 00000000000..1b1ed2154cd --- /dev/null +++ b/app/javascript/mastodon/selectors/notifications.ts @@ -0,0 +1,34 @@ +import { createSelector } from '@reduxjs/toolkit'; + +import { compareId } from 'mastodon/compare_id'; +import type { RootState } from 'mastodon/store'; + +export const selectUnreadNotificationGroupsCount = createSelector( + [ + (s: RootState) => s.notificationGroups.lastReadId, + (s: RootState) => s.notificationGroups.pendingGroups, + (s: RootState) => s.notificationGroups.groups, + ], + (notificationMarker, pendingGroups, groups) => { + return ( + groups.filter( + (group) => + group.type !== 'gap' && + group.page_max_id && + compareId(group.page_max_id, notificationMarker) > 0, + ).length + + pendingGroups.filter( + (group) => + group.type !== 'gap' && + group.page_max_id && + compareId(group.page_max_id, notificationMarker) > 0, + ).length + ); + }, +); + +export const selectPendingNotificationGroupsCount = createSelector( + [(s: RootState) => s.notificationGroups.pendingGroups], + (pendingGroups) => + pendingGroups.filter((group) => group.type !== 'gap').length, +); diff --git a/app/javascript/mastodon/selectors/settings.ts b/app/javascript/mastodon/selectors/settings.ts new file mode 100644 index 00000000000..93276c66920 --- /dev/null +++ b/app/javascript/mastodon/selectors/settings.ts @@ -0,0 +1,45 @@ +import type { RootState } from 'mastodon/store'; + +/* eslint-disable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ +// state.settings is not yet typed, so we disable some ESLint checks for those selectors +export const selectSettingsNotificationsShows = (state: RootState) => + state.settings.getIn(['notifications', 'shows']).toJS() as Record< + string, + boolean + >; + +export const selectSettingsNotificationsExcludedTypes = (state: RootState) => + Object.entries(selectSettingsNotificationsShows(state)) + .filter(([_type, enabled]) => !enabled) + .map(([type, _enabled]) => type); + +export const selectSettingsNotificationsQuickFilterShow = (state: RootState) => + state.settings.getIn(['notifications', 'quickFilter', 'show']) as boolean; + +export const selectSettingsNotificationsQuickFilterActive = ( + state: RootState, +) => state.settings.getIn(['notifications', 'quickFilter', 'active']) as string; + +export const selectSettingsNotificationsQuickFilterAdvanced = ( + state: RootState, +) => + state.settings.getIn(['notifications', 'quickFilter', 'advanced']) as boolean; + +export const selectSettingsNotificationsShowUnread = (state: RootState) => + state.settings.getIn(['notifications', 'showUnread']) as boolean; + +export const selectNeedsNotificationPermission = (state: RootState) => + (state.settings.getIn(['notifications', 'alerts']).includes(true) && + state.notifications.get('browserSupport') && + state.notifications.get('browserPermission') === 'default' && + !state.settings.getIn([ + 'notifications', + 'dismissPermissionBanner', + ])) as boolean; + +export const selectSettingsNotificationsMinimizeFilteredBanner = ( + state: RootState, +) => + state.settings.getIn(['notifications', 'minimizeFilteredBanner']) as boolean; + +/* eslint-enable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts index dae37e62255..e5820149dbd 100644 --- a/app/javascript/mastodon/store/typed_functions.ts +++ b/app/javascript/mastodon/store/typed_functions.ts @@ -82,13 +82,19 @@ export function createThunk( const discardLoadDataInPayload = Symbol('discardLoadDataInPayload'); type DiscardLoadData = typeof discardLoadDataInPayload; -type OnData = ( +type OnData = ( data: LoadDataResult, api: AppThunkApi & { + actionArg: ActionArg; discardLoadData: DiscardLoadData; }, ) => ReturnedData | DiscardLoadData | Promise; +type LoadData = ( + args: Args, + api: AppThunkApi, +) => Promise; + type ArgsType = Record | undefined; // Overload when there is no `onData` method, the payload is the `onData` result @@ -101,18 +107,18 @@ export function createDataLoadingThunk( // Overload when the `onData` method returns discardLoadDataInPayload, then the payload is empty export function createDataLoadingThunk( name: string, - loadData: (args: Args) => Promise, + loadData: LoadData, onDataOrThunkOptions?: | AppThunkOptions - | OnData, + | 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, + loadData: LoadData, + onDataOrThunkOptions?: AppThunkOptions | OnData, thunkOptions?: AppThunkOptions, ): ReturnType>; @@ -123,8 +129,10 @@ export function createDataLoadingThunk< Returned, >( name: string, - loadData: (args: Args) => Promise, - onDataOrThunkOptions?: AppThunkOptions | OnData, + loadData: LoadData, + onDataOrThunkOptions?: + | AppThunkOptions + | OnData, thunkOptions?: AppThunkOptions, ): ReturnType>; @@ -159,11 +167,13 @@ export function createDataLoadingThunk< Returned, >( name: string, - loadData: (args: Args) => Promise, - onDataOrThunkOptions?: AppThunkOptions | OnData, + loadData: LoadData, + onDataOrThunkOptions?: + | AppThunkOptions + | OnData, maybeThunkOptions?: AppThunkOptions, ) { - let onData: OnData | undefined; + let onData: OnData | undefined; let thunkOptions: AppThunkOptions | undefined; if (typeof onDataOrThunkOptions === 'function') onData = onDataOrThunkOptions; @@ -177,7 +187,10 @@ export function createDataLoadingThunk< return createThunk( name, async (arg, { getState, dispatch }) => { - const data = await loadData(arg); + const data = await loadData(arg, { + dispatch, + getState, + }); if (!onData) return data as Returned; @@ -185,6 +198,7 @@ export function createDataLoadingThunk< dispatch, getState, discardLoadData: discardLoadDataInPayload, + actionArg: arg, }); // if there is no return in `onData`, we return the `onData` result diff --git a/app/javascript/mastodon/test_helpers.tsx b/app/javascript/mastodon/test_helpers.tsx index 93b5a8453ac..f4050907306 100644 --- a/app/javascript/mastodon/test_helpers.tsx +++ b/app/javascript/mastodon/test_helpers.tsx @@ -2,6 +2,7 @@ import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router'; +import type { RenderOptions } from '@testing-library/react'; // eslint-disable-next-line import/no-extraneous-dependencies import { render as rtlRender } from '@testing-library/react'; @@ -9,7 +10,11 @@ import { IdentityContext } from './identity_context'; function render( ui: React.ReactElement, - { locale = 'en', signedIn = true, ...renderOptions } = {}, + { + locale = 'en', + signedIn = true, + ...renderOptions + }: RenderOptions & { locale?: string; signedIn?: boolean } = {}, ) { const fakeIdentity = { signedIn: signedIn, diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 07e9d9868b4..0ad8e1028ea 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -23,7 +23,7 @@ html { // Change default background colors of columns .interaction-modal { background: $white; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); } .rules-list li::before { @@ -48,6 +48,10 @@ html { } } +.icon-button:disabled { + color: darken($action-button-color, 25%); +} + .account__header__bar .avatar .account__avatar { border-color: $white; } @@ -71,8 +75,8 @@ html { } .getting-started .navigation-bar { - border-top: 1px solid lighten($ui-base-color, 8%); - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-top: 1px solid var(--background-border-color); + border-bottom: 1px solid var(--background-border-color); @media screen and (max-width: $no-gap-breakpoint) { border-top: 0; @@ -84,7 +88,7 @@ html { .setting-text, .report-dialog-modal__textarea, .audio-player { - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); } .report-dialog-modal .dialog-option .poll__input { @@ -136,7 +140,6 @@ html { .actions-modal ul li:not(:empty) a:focus button, .actions-modal ul li:not(:empty) a:hover, .actions-modal ul li:not(:empty) a:hover button, -.admin-wrapper .sidebar ul .simple-navigation-active-leaf a, .simple_form .block-button, .simple_form .button, .simple_form button { @@ -171,7 +174,7 @@ html { .picture-in-picture__footer, .reactions-bar__item { background: $white; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); } .reactions-bar__item:hover, @@ -213,7 +216,7 @@ html { .column-header__collapsible-inner { background: darken($ui-base-color, 4%); - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-bottom: 0; } @@ -255,7 +258,7 @@ html { .embed-modal .embed-modal__container .embed-modal__html { background: $white; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); &:focus { border-color: lighten($ui-base-color, 12%); @@ -294,25 +297,7 @@ html { .directory__tag > a, .directory__tag > div { background: $white; - border: 1px solid lighten($ui-base-color, 8%); - - @media screen and (max-width: $no-gap-breakpoint) { - border-left: 0; - border-right: 0; - border-top: 0; - } -} - -.simple_form { - input[type='text'], - input[type='number'], - input[type='email'], - input[type='password'], - textarea { - &:hover { - border-color: lighten($ui-base-color, 12%); - } - } + border: 1px solid var(--background-border-color); } .picture-in-picture-placeholder { @@ -327,10 +312,6 @@ html { &:focus { background: $ui-base-color; } - - @media screen and (max-width: $no-gap-breakpoint) { - border: 0; - } } .batch-table { @@ -342,7 +323,7 @@ html { } .activity-stream { - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); &--under-tabs { border-top: 0; @@ -407,6 +388,22 @@ html { color: $ui-highlight-color; background-color: rgba($ui-highlight-color, 0.1); } + + input[type='text'], + input[type='number'], + input[type='email'], + input[type='password'], + input[type='url'], + input[type='datetime-local'], + textarea { + background: darken($ui-base-color, 10%); + } + + select { + background: darken($ui-base-color, 10%) + url("data:image/svg+xml;utf8,") + no-repeat right 8px center / auto 14px; + } } .compose-form .compose-form__warning { @@ -445,8 +442,24 @@ html { box-shadow: none; } +.card { + &__img { + background: darken($ui-base-color, 10%); + } + + & > a { + &:hover, + &:active, + &:focus { + .card__bar { + background: darken($ui-base-color, 10%); + } + } + } +} + .mute-modal select { - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); background: $simple-background-color url("data:image/svg+xml;utf8,") no-repeat right 8px center / auto 16px; @@ -487,6 +500,7 @@ html { .search__popout, .emoji-mart-search input, .language-dropdown__dropdown .emoji-mart-search input, +// .strike-card, .poll__option input[type='text'] { background: darken($ui-base-color, 10%); } @@ -503,3 +517,43 @@ html { .inline-follow-suggestions__body__scroll-button__icon { color: $white; } + +a.sparkline { + &:hover, + &:focus, + &:active { + background: darken($ui-base-color, 10%); + } +} + +.dashboard__counters { + & > div { + & > a { + &:hover, + &:focus, + &:active { + background: darken($ui-base-color, 10%); + } + } + } +} + +.directory { + &__tag { + & > a { + &:hover, + &:focus, + &:active { + background: darken($ui-base-color, 10%); + } + } + } +} + +.strike-entry { + &:hover, + &:focus, + &:active { + background: darken($ui-base-color, 10%); + } +} diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss index 09a75a834b1..9f571b3f260 100644 --- a/app/javascript/styles/mastodon-light/variables.scss +++ b/app/javascript/styles/mastodon-light/variables.scss @@ -56,11 +56,13 @@ $account-background-color: $white !default; $emojis-requiring-inversion: 'chains'; -.theme-mastodon-light { +body { --dropdown-border-color: #d9e1e8; --dropdown-background-color: #fff; + --modal-border-color: #d9e1e8; + --modal-background-color: var(--background-color-tint); --background-border-color: #d9e1e8; --background-color: #fff; - --background-color-tint: rgba(255, 255, 255, 90%); + --background-color-tint: rgba(255, 255, 255, 80%); --background-filter: blur(10px); } diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss index d7f8586dd29..899b494e549 100644 --- a/app/javascript/styles/mastodon/_mixins.scss +++ b/app/javascript/styles/mastodon/_mixins.scss @@ -1,16 +1,3 @@ -@mixin avatar-radius { - border-radius: 4px; - background: transparent no-repeat; - background-position: 50%; - background-clip: padding-box; -} - -@mixin avatar-size($size: 48px) { - width: $size; - height: $size; - background-size: $size $size; -} - @mixin search-input { outline: 0; box-sizing: border-box; diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index 80d6c13cef7..894332acb58 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -10,7 +10,7 @@ &:active, &:focus { .card__bar { - background: lighten($ui-base-color, 8%); + background: $ui-base-color; } } } @@ -18,7 +18,9 @@ &__img { height: 130px; position: relative; - background: darken($ui-base-color, 12%); + background: $ui-base-color; + border: 1px solid var(--background-border-color); + border-bottom: none; img { display: block; @@ -39,7 +41,9 @@ display: flex; justify-content: flex-start; align-items: center; - background: lighten($ui-base-color, 4%); + background: var(--background-color); + border: 1px solid var(--background-border-color); + border-top: none; .avatar { flex: 0 0 auto; @@ -346,6 +350,10 @@ color: $primary-text-color; font-weight: 700; } + + .warning-hint { + font-weight: normal !important; + } } &__body { diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 06a3b520216..810f59b9a53 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1,7 +1,7 @@ @use 'sass:math'; -$no-columns-breakpoint: 600px; -$sidebar-width: 240px; +$no-columns-breakpoint: 890px; +$sidebar-width: 300px; $content-width: 840px; .admin-wrapper { @@ -26,7 +26,7 @@ $content-width: 840px; &__inner { display: flex; justify-content: flex-end; - background: $ui-base-color; + background: var(--background-color); height: 100%; } } @@ -38,7 +38,7 @@ $content-width: 840px; &__toggle { display: none; - background: darken($ui-base-color, 4%); + background: var(--background-color); border-bottom: 1px solid lighten($ui-base-color, 4%); align-items: center; @@ -103,7 +103,6 @@ $content-width: 840px; ul { list-style: none; - border-radius: 4px 0 0 4px; overflow: hidden; margin-bottom: 20px; @@ -112,13 +111,13 @@ $content-width: 840px; } a { + font-size: 14px; display: block; padding: 15px; color: $darker-text-color; text-decoration: none; transition: all 200ms linear; transition-property: color, background-color; - border-radius: 4px 0 0 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -129,19 +128,13 @@ $content-width: 840px; &:hover { color: $primary-text-color; - background-color: darken($ui-base-color, 5%); transition: all 100ms linear; transition-property: color, background-color; } - - &.selected { - border-radius: 4px 0 0; - } } ul { - background: darken($ui-base-color, 4%); - border-radius: 0 0 0 4px; + background: var(--background-color); margin: 0; a { @@ -156,16 +149,10 @@ $content-width: 840px; } .simple-navigation-active-leaf a { - color: $primary-text-color; - background-color: $ui-highlight-color; + color: $highlight-text-color; border-bottom: 0; - border-radius: 0; } } - - & > ul > .simple-navigation-active-leaf a { - border-radius: 4px 0 0 4px; - } } .content-wrapper { @@ -299,7 +286,7 @@ $content-width: 840px; color: $darker-text-color; padding-bottom: 8px; margin-bottom: 8px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); } h6 { @@ -372,7 +359,7 @@ $content-width: 840px; width: 100%; height: 0; border: 0; - border-bottom: 1px solid rgba($ui-base-lighter-color, 0.6); + border-bottom: 1px solid var(--background-border-color); margin: 20px 0; &.spacer { @@ -410,14 +397,14 @@ $content-width: 840px; inset-inline-start: 0; bottom: 0; overflow-y: auto; - background: $ui-base-color; + background: var(--background-color); } } ul a, ul ul a { + font-size: 16px; border-radius: 0; - border-bottom: 1px solid lighten($ui-base-color, 4%); transition: none; &:hover { @@ -683,8 +670,10 @@ body, line-height: 20px; padding: 15px; padding-inline-start: 15px * 2 + 40px; - background: $ui-base-color; - border-bottom: 1px solid darken($ui-base-color, 8%); + background: var(--background-color); + border-right: 1px solid var(--background-border-color); + border-left: 1px solid var(--background-border-color); + border-bottom: 1px solid var(--background-border-color); position: relative; text-decoration: none; color: $darker-text-color; @@ -693,18 +682,13 @@ body, &:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; + border-top: 1px solid var(--background-border-color); } &:last-child { border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; - border-bottom: 0; - } - - &:hover, - &:focus, - &:active { - background: lighten($ui-base-color, 4%); + border-bottom: 1px solid var(--background-border-color); } &__avatar { @@ -744,6 +728,47 @@ body, } } +.strike-entry { + display: block; + line-height: 20px; + padding: 15px; + padding-inline-start: 15px * 2 + 40px; + background: var(--background-color); + border: 1px solid var(--background-border-color); + border-radius: 4px; + position: relative; + text-decoration: none; + color: $darker-text-color; + font-size: 14px; + margin-bottom: 15px; + + &__avatar { + position: absolute; + inset-inline-start: 15px; + top: 15px; + + .avatar { + border-radius: 4px; + width: 40px; + height: 40px; + } + } + + &__title { + word-wrap: break-word; + } + + &__timestamp { + color: $dark-text-color; + } + + &:hover, + &:focus, + &:active { + background: $ui-base-color; + } +} + a.name-tag, .name-tag, a.inline-name-tag, @@ -751,6 +776,10 @@ a.inline-name-tag, text-decoration: none; color: $secondary-text-color; + &:hover { + color: $highlight-text-color; + } + .username { font-weight: 500; } @@ -830,7 +859,8 @@ a.name-tag, } .report-card { - background: $ui-base-color; + background: var(--background-color); + border: 1px solid var(--background-border-color); border-radius: 4px; margin-bottom: 20px; @@ -842,7 +872,6 @@ a.name-tag, .account { padding: 0; - border: 0; &__avatar-wrapper { margin-inline-start: 0; @@ -863,7 +892,7 @@ a.name-tag, &:focus, &:hover, &:active { - color: lighten($darker-text-color, 8%); + color: $highlight-text-color; } } @@ -877,11 +906,7 @@ a.name-tag, &__item { display: flex; justify-content: flex-start; - border-top: 1px solid darken($ui-base-color, 4%); - - &:hover { - background: lighten($ui-base-color, 2%); - } + border-top: 1px solid var(--background-border-color); &__reported-by, &__assigned { @@ -904,7 +929,6 @@ a.name-tag, max-width: calc(100% - 300px); &__icon { - color: $dark-text-color; margin-inline-end: 4px; font-weight: 500; } @@ -917,6 +941,10 @@ a.name-tag, padding: 15px; text-decoration: none; color: $darker-text-color; + + &:hover { + color: $highlight-text-color; + } } } } @@ -952,14 +980,15 @@ a.name-tag, .account__header__fields, .account__header__content { - background: lighten($ui-base-color, 8%); + background: var(--background-color); + border: 1px solid var(--background-border-color); border-radius: 4px; height: 100%; } .account__header__fields { margin: 0; - border: 0; + border: 1px solid var(--background-border-color); a { color: $highlight-text-color; @@ -988,8 +1017,8 @@ a.name-tag, .applications-list__item, .filters-list__item { padding: 15px 0; - background: $ui-base-color; - border: 1px solid lighten($ui-base-color, 4%); + background: var(--background-color); + border: 1px solid var(--background-border-color); border-radius: 4px; margin-top: 15px; } @@ -1000,13 +1029,13 @@ a.name-tag, .announcements-list, .filters-list { - border: 1px solid lighten($ui-base-color, 4%); + border: 1px solid var(--background-border-color); border-radius: 4px; + border-bottom: none; &__item { padding: 15px 0; - background: $ui-base-color; - border-bottom: 1px solid lighten($ui-base-color, 4%); + border-bottom: 1px solid var(--background-border-color); &__title { padding: 0 15px; @@ -1018,6 +1047,10 @@ a.name-tag, text-decoration: none; margin-bottom: 10px; + &:hover { + color: $highlight-text-color; + } + .account-role { vertical-align: middle; } @@ -1056,10 +1089,6 @@ a.name-tag, &__permissions { margin-top: 10px; } - - &:last-child { - border-bottom: 0; - } } } @@ -1109,7 +1138,7 @@ a.name-tag, &__table { &__number { - color: $secondary-text-color; + color: var(--background-color); padding: 10px; } @@ -1136,7 +1165,7 @@ a.name-tag, &__box { box-sizing: border-box; - background: $ui-highlight-color; + background: var(--background-color); padding: 10px; font-weight: 500; color: $primary-text-color; @@ -1158,8 +1187,9 @@ a.name-tag, .sparkline { display: block; text-decoration: none; - background: lighten($ui-base-color, 4%); + background: var(--background-color); border-radius: 4px; + border: 1px solid var(--background-border-color); padding: 0; position: relative; padding-bottom: 55px + 20px; @@ -1231,12 +1261,12 @@ a.sparkline { &:hover, &:focus, &:active { - background: lighten($ui-base-color, 6%); + background: $ui-base-color; } } .skeleton { - background-color: lighten($ui-base-color, 8%); + background-color: var(--background-color); background-image: linear-gradient( 90deg, lighten($ui-base-color, 8%), @@ -1316,17 +1346,13 @@ a.sparkline { .report-reason-selector { border-radius: 4px; - background: $ui-base-color; + background: var(--background-color); margin-bottom: 20px; &__category { cursor: pointer; border-bottom: 1px solid darken($ui-base-color, 8%); - &:last-child { - border-bottom: 0; - } - &__label { padding: 15px; display: flex; @@ -1355,7 +1381,7 @@ a.sparkline { &__details { &__item { - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); padding: 15px 0; &:last-child { @@ -1386,7 +1412,7 @@ a.sparkline { .account-card { border-radius: 4px; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); position: relative; &__warning-badge { @@ -1474,7 +1500,6 @@ a.sparkline { position: absolute; bottom: 0; inset-inline-end: 15px; - background: linear-gradient(to left, $ui-base-color, transparent); pointer-events: none; } @@ -1550,11 +1575,11 @@ a.sparkline { margin-bottom: 20px; &__item { - background: $ui-base-color; + background: var(--background-color); position: relative; padding: 15px; padding-inline-start: 15px * 2 + 40px; - border-bottom: 1px solid darken($ui-base-color, 8%); + border: 1px solid var(--background-border-color); &:first-child { border-top-left-radius: 4px; @@ -1564,11 +1589,6 @@ a.sparkline { &:last-child { border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; - border-bottom: 0; - } - - &:hover { - background-color: lighten($ui-base-color, 4%); } &__avatar { @@ -1646,13 +1666,10 @@ a.sparkline { } .report-actions { - border: 1px solid darken($ui-base-color, 8%); - &__item { display: flex; align-items: center; line-height: 18px; - border-bottom: 1px solid darken($ui-base-color, 8%); &:last-child { border-bottom: 0; @@ -1715,8 +1732,6 @@ a.sparkline { .strike-card { padding: 15px; - border-radius: 4px; - background: $ui-base-color; font-size: 15px; line-height: 20px; word-wrap: break-word; @@ -1724,6 +1739,8 @@ a.sparkline { color: $primary-text-color; box-sizing: border-box; min-height: 100%; + border: 1px solid var(--background-border-color); + border-radius: 4px; a { color: $highlight-text-color; @@ -1764,15 +1781,14 @@ a.sparkline { &__statuses-list { border-radius: 4px; - border: 1px solid darken($ui-base-color, 8%); + border: 1px solid var(--background-border-color); font-size: 13px; line-height: 18px; overflow: hidden; &__item { padding: 16px; - background: lighten($ui-base-color, 2%); - border-bottom: 1px solid darken($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); &:last-child { border-bottom: 0; diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index 2e7d5e5e9c5..1f961cb9e12 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -66,10 +66,6 @@ body { } } - &.lighter { - background: $ui-base-color; - } - &.with-modals { overflow-x: hidden; overflow-y: scroll; @@ -109,7 +105,6 @@ body { } &.embed { - background: lighten($ui-base-color, 4%); margin: 0; padding-bottom: 0; @@ -122,15 +117,12 @@ body { } &.admin { - background: darken($ui-base-color, 4%); padding: 0; } &.error { position: absolute; text-align: center; - color: $darker-text-color; - background: $ui-base-color; width: 100%; height: 100%; padding: 0; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 73d0e6220f4..fa25a08150f 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -120,8 +120,27 @@ text-decoration: none; } - &:disabled { - opacity: 0.5; + &.button--destructive { + &:active, + &:focus, + &:hover { + border-color: $ui-button-destructive-focus-background-color; + color: $ui-button-destructive-focus-background-color; + } + } + + &:disabled, + &.disabled { + opacity: 0.7; + border-color: $ui-primary-color; + color: $ui-primary-color; + + &:active, + &:focus, + &:hover { + border-color: $ui-primary-color; + color: $ui-primary-color; + } } } @@ -502,7 +521,7 @@ body > [data-popper-placement] { gap: 16px; flex: 0 1 auto; border-radius: 4px; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); transition: border-color 300ms linear; min-height: 0; position: relative; @@ -568,7 +587,7 @@ body > [data-popper-placement] { .autosuggest-input { flex: 1 1 auto; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); } } @@ -1347,6 +1366,8 @@ body > [data-popper-placement] { min-height: 54px; border-bottom: 1px solid var(--background-border-color); cursor: auto; + opacity: 1; + animation: fade 150ms linear; @keyframes fade { 0% { @@ -1358,9 +1379,6 @@ body > [data-popper-placement] { } } - opacity: 1; - animation: fade 150ms linear; - .media-gallery, .video-player, .audio-player, @@ -1434,7 +1452,7 @@ body > [data-popper-placement] { } &--first-in-thread { - border-top: 1px solid lighten($ui-base-color, 8%); + border-top: 1px solid var(--background-border-color); } &__line { @@ -1593,14 +1611,19 @@ body > [data-popper-placement] { } } -.status__wrapper-direct { +.status__wrapper-direct, +.notification-ungrouped--direct { background: rgba($ui-highlight-color, 0.05); &:focus { - background: rgba($ui-highlight-color, 0.05); + background: rgba($ui-highlight-color, 0.1); } +} - .status__prepend { +.status__wrapper-direct, +.notification-ungrouped--direct { + .status__prepend, + .notification-ungrouped__header { color: $highlight-text-color; } } @@ -1771,7 +1794,6 @@ body > [data-popper-placement] { .account { padding: 16px; - border-bottom: 1px solid var(--background-border-color); .account__display-name { flex: 1 1 auto; @@ -1958,17 +1980,15 @@ body > [data-popper-placement] { } .account__avatar { - @include avatar-radius; - display: block; position: relative; - overflow: hidden; img { display: block; width: 100%; height: 100%; object-fit: cover; + border-radius: 4px; } &-inline { @@ -2005,6 +2025,29 @@ body > [data-popper-placement] { font-size: 15px; } } + + &__counter { + $height: 16px; + $h-padding: 5px; + + position: absolute; + bottom: -3px; + inset-inline-end: -3px; + padding-left: $h-padding; + padding-right: $h-padding; + height: $height; + border-radius: $height; + min-width: $height - 2 * $h-padding; // to ensure that it is never narrower than a circle + line-height: $height + 1px; // to visually center the numbers + background-color: $ui-button-background-color; + color: $white; + border-width: 1px; + border-style: solid; + border-color: var(--background-color); + font-size: 11px; + font-weight: 500; + text-align: center; + } } a .account__avatar { @@ -2191,41 +2234,28 @@ a.account__display-name { } } -.notification__relationships-severance-event, -.notification__moderation-warning { - display: flex; - gap: 16px; +.notification-group--link { color: $secondary-text-color; text-decoration: none; - align-items: flex-start; - padding: 16px 32px; - border-bottom: 1px solid var(--background-border-color); - &:hover { - color: $primary-text-color; - } - - .icon { - padding: 2px; - color: $highlight-text-color; - } - - &__content { + .notification-group__main { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; flex-grow: 1; - font-size: 16px; - line-height: 24px; + font-size: 15px; + line-height: 22px; - strong { + strong, + bdi { font-weight: 700; } .link-button { font-size: inherit; line-height: inherit; + font-weight: inherit; } } } @@ -2420,7 +2450,7 @@ a.account__display-name { } .dropdown-animation { - animation: dropdown 150ms cubic-bezier(0.1, 0.7, 0.1, 1); + animation: dropdown 250ms cubic-bezier(0.1, 0.7, 0.1, 1); @keyframes dropdown { from { @@ -3056,6 +3086,11 @@ $ui-header-logo-wordmark-width: 99px; .explore__search-header { display: flex; } + + .explore__search-results { + border: 0; + border-radius: 0; + } } .icon-with-badge { @@ -3315,7 +3350,7 @@ $ui-header-logo-wordmark-width: 99px; .copy-paste-text { background: lighten($ui-base-color, 4%); border-radius: 8px; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); padding: 16px; color: $primary-text-color; font-size: 15px; @@ -4718,7 +4753,7 @@ a.status-card { section { padding: 16px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); &:last-child { border-bottom: 0; @@ -4832,8 +4867,10 @@ a.status-card { &__menu { @include search-popout; - padding: 0; - background: $ui-secondary-color; + & { + padding: 0; + background: $ui-secondary-color; + } } &__menu-list { @@ -5304,7 +5341,7 @@ a.status-card { input { padding: 8px 12px; background: $ui-base-color; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); color: $darker-text-color; @media screen and (width <= 600px) { @@ -5390,7 +5427,7 @@ a.status-card { margin-top: -2px; width: 100%; background: $ui-base-color; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-radius: 0 0 4px 4px; box-shadow: var(--dropdown-shadow); z-index: 99; @@ -6044,6 +6081,25 @@ a.status-card { } } + &__confirmation { + font-size: 14px; + line-height: 20px; + color: $darker-text-color; + + h1 { + font-size: 16px; + line-height: 24px; + color: $primary-text-color; + font-weight: 500; + margin-bottom: 8px; + } + + strong { + font-weight: 700; + color: $primary-text-color; + } + } + &__bullet-points { display: flex; flex-direction: column; @@ -6129,11 +6185,8 @@ a.status-card { } .boost-modal, -.confirmation-modal, .report-modal, .actions-modal, -.mute-modal, -.block-modal, .compare-history-modal { background: lighten($ui-secondary-color, 8%); color: $inverted-text-color; @@ -6155,10 +6208,7 @@ a.status-card { } } -.boost-modal__action-bar, -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.block-modal__action-bar { +.boost-modal__action-bar { display: flex; justify-content: space-between; align-items: center; @@ -6181,16 +6231,6 @@ a.status-card { } } -.mute-modal, -.block-modal { - line-height: 24px; -} - -.mute-modal .react-toggle, -.block-modal .react-toggle { - vertical-align: middle; -} - .report-modal { width: 90vw; max-width: 700px; @@ -6585,34 +6625,6 @@ a.status-card { } } -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.block-modal__action-bar { - .confirmation-modal__secondary-button { - flex-shrink: 1; - } -} - -.confirmation-modal__secondary-button, -.confirmation-modal__cancel-button, -.mute-modal__cancel-button, -.block-modal__cancel-button { - background-color: transparent; - color: $lighter-text-color; - font-size: 14px; - font-weight: 500; - - &:hover, - &:focus, - &:active { - color: darken($lighter-text-color, 4%); - background-color: transparent; - } -} - -.confirmation-modal__container, -.mute-modal__container, -.block-modal__container, .report-modal__target { padding: 30px; font-size: 16px; @@ -6646,31 +6658,10 @@ a.status-card { } } -.confirmation-modal__container, .report-modal__target { text-align: center; } -.block-modal, -.mute-modal { - &__explanation { - margin-top: 20px; - } - - .setting-toggle { - margin-top: 20px; - margin-bottom: 24px; - display: flex; - align-items: center; - - &__label { - color: $inverted-text-color; - margin: 0; - margin-inline-start: 8px; - } - } -} - .report-modal__target { padding: 15px; @@ -7368,6 +7359,11 @@ a.status-card { display: flex; flex-shrink: 0; + @media screen and (max-width: $no-gap-breakpoint - 1px) { + border-right: 0; + border-left: 0; + } + button { background: transparent; border: 0; @@ -8085,16 +8081,17 @@ noscript { .verified { border: 1px solid rgba($valid-value-color, 0.5); margin-top: -1px; + margin-inline: -1px; &:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; - margin-top: 0; } &:last-child { border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; + margin-bottom: -1px; } dt, @@ -8772,13 +8769,13 @@ noscript { } .search__input { - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); padding: 10px; padding-inline-end: 30px; } .search__popout { - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); } .search .icon { @@ -9097,7 +9094,7 @@ noscript { &__input { @include search-input; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); padding: 4px 6px; color: $primary-text-color; font-size: 16px; @@ -9132,7 +9129,7 @@ noscript { margin-top: -1px; padding-top: 5px; padding-bottom: 5px; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); } &.focused &__input { @@ -10172,10 +10169,9 @@ noscript { .filtered-notifications-banner { display: flex; align-items: center; - border: 1px solid var(--background-border-color); - border-top: 0; - padding: 24px 32px; - gap: 16px; + border-bottom: 1px solid var(--background-border-color); + padding: 16px 24px; + gap: 8px; color: $darker-text-color; text-decoration: none; @@ -10185,10 +10181,8 @@ noscript { color: $secondary-text-color; } - .icon { - width: 24px; - height: 24px; - padding: 2px; + .notification-group__icon { + color: inherit; } &__text { @@ -10204,25 +10198,10 @@ noscript { } &__badge { - display: flex; - align-items: center; - border-radius: 999px; - background: var(--background-border-color); - color: $darker-text-color; - padding: 4px; - padding-inline-end: 8px; - gap: 6px; - font-weight: 500; - font-size: 11px; - line-height: 16px; - word-break: keep-all; - - &__badge { - background: $ui-button-background-color; - color: $white; - border-radius: 100px; - padding: 2px 8px; - } + background: $ui-button-background-color; + color: $white; + border-radius: 100px; + padding: 2px 8px; } } @@ -10263,6 +10242,12 @@ noscript { letter-spacing: 0.5px; line-height: 24px; color: $secondary-text-color; + + bdi { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } } .filtered-notifications-banner__badge { @@ -10325,3 +10310,404 @@ noscript { } } } + +.notification-group { + display: flex; + align-items: flex-start; + gap: 8px; + padding: 16px 24px; + border-bottom: 1px solid var(--background-border-color); + + &__icon { + width: 40px; + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + color: $dark-text-color; + + .icon { + width: 28px; + height: 28px; + } + } + + &--follow &__icon, + &--follow-request &__icon { + color: $highlight-text-color; + } + + &--favourite &__icon { + color: $gold-star; + } + + &--reblog &__icon { + color: $valid-value-color; + } + + &--relationships-severance-event &__icon, + &--admin-report &__icon, + &--admin-sign-up &__icon { + color: $dark-text-color; + } + + &--moderation-warning &__icon { + color: $red-bookmark; + } + + &--follow-request &__actions { + align-items: center; + display: flex; + gap: 8px; + + .icon-button { + border: 1px solid var(--background-border-color); + border-radius: 50%; + padding: 1px; + } + } + + &__main { + display: flex; + flex-direction: column; + gap: 8px; + flex: 1 1 auto; + overflow: hidden; + + &__header { + display: flex; + flex-direction: column; + gap: 8px; + + &__wrapper { + display: flex; + justify-content: space-between; + } + + &__label { + display: flex; + gap: 8px; + font-size: 15px; + line-height: 22px; + color: $darker-text-color; + + a { + color: inherit; + text-decoration: none; + } + + bdi { + font-weight: 700; + color: $primary-text-color; + } + + time { + color: $dark-text-color; + } + } + } + + &__status { + border: 1px solid var(--background-border-color); + border-radius: 8px; + padding: 8px; + } + } + + &__avatar-group { + display: flex; + gap: 8px; + height: 28px; + overflow-y: hidden; + flex-wrap: wrap; + } + + .status { + padding: 0; + border: 0; + } + + &__embedded-status { + cursor: pointer; + + &__account { + display: flex; + align-items: center; + gap: 4px; + margin-bottom: 8px; + color: $dark-text-color; + + bdi { + color: inherit; + } + } + + .account__avatar { + opacity: 0.5; + } + + &__content { + display: -webkit-box; + font-size: 15px; + line-height: 22px; + color: $dark-text-color; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; + max-height: 4 * 22px; + overflow: hidden; + + p, + a { + color: inherit; + } + } + } +} + +.notification-ungrouped { + padding: 16px 24px; + border-bottom: 1px solid var(--background-border-color); + + &__header { + display: flex; + align-items: center; + gap: 8px; + color: $dark-text-color; + font-size: 15px; + line-height: 22px; + font-weight: 500; + padding-inline-start: 24px; + margin-bottom: 16px; + + &__icon { + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + + .icon { + width: 16px; + height: 16px; + } + } + + a { + color: inherit; + text-decoration: none; + } + } + + .status { + border: 0; + padding: 0; + + &__avatar { + width: 40px; + height: 40px; + } + } + + .status__wrapper-direct { + background: transparent; + } + + $icon-margin: 48px; // 40px avatar + 8px gap + + .status__content, + .status__action-bar, + .media-gallery, + .video-player, + .audio-player, + .attachment-list, + .picture-in-picture-placeholder, + .more-from-author, + .status-card, + .hashtag-bar { + margin-inline-start: $icon-margin; + width: calc(100% - $icon-margin); + } + + .more-from-author { + width: calc(100% - $icon-margin + 2px); + } + + .status__content__read-more-button { + margin-inline-start: $icon-margin; + } + + .notification__report { + border: 0; + padding: 0; + } +} + +.notification-group--unread, +.notification-ungrouped--unread { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + inset-inline-start: 0; + width: 100%; + height: 100%; + border-inline-start: 4px solid $highlight-text-color; + pointer-events: none; + } +} + +.hover-card-controller[data-popper-reference-hidden='true'] { + opacity: 0; + pointer-events: none; +} + +.hover-card { + box-shadow: var(--dropdown-shadow); + background: var(--modal-background-color); + backdrop-filter: var(--background-filter); + border: 1px solid var(--modal-border-color); + border-radius: 8px; + padding: 16px; + width: 270px; + display: flex; + flex-direction: column; + gap: 12px; + + &--loading { + position: relative; + min-height: 100px; + } + + &__name { + display: flex; + gap: 12px; + text-decoration: none; + color: inherit; + } + + &__number { + font-size: 15px; + line-height: 22px; + color: $secondary-text-color; + + strong { + font-weight: 700; + } + } + + &__text-row { + display: flex; + flex-direction: column; + gap: 8px; + } + + &__bio { + color: $secondary-text-color; + font-size: 14px; + line-height: 20px; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + max-height: 2 * 20px; + overflow: hidden; + + p { + margin-bottom: 0; + } + + a { + color: inherit; + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + } + } + + .display-name { + font-size: 15px; + line-height: 22px; + + bdi { + font-weight: 500; + color: $primary-text-color; + } + + &__account { + display: block; + color: $dark-text-color; + } + } + + .account-fields { + color: $secondary-text-color; + font-size: 14px; + line-height: 20px; + + a { + color: inherit; + text-decoration: none; + + &:focus, + &:hover, + &:active { + text-decoration: underline; + } + } + + dl { + display: flex; + align-items: center; + gap: 4px; + + dt { + flex: 0 1 auto; + color: $dark-text-color; + min-width: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + dd { + flex: 1 1 auto; + font-weight: 500; + min-width: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-align: end; + } + + &.verified { + dd { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 4px; + overflow: hidden; + white-space: nowrap; + color: $valid-value-color; + + & > span { + overflow: hidden; + text-overflow: ellipsis; + } + + a { + font-weight: 500; + } + + .icon { + width: 16px; + height: 16px; + } + } + } + } + } +} diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index 8a472d75b13..9363e428b38 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -63,7 +63,7 @@ padding: 20px 0; margin-top: 40px; margin-bottom: 10px; - border-bottom: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid var(--background-border-color); @media screen and (width <= 440px) { width: 100%; diff --git a/app/javascript/styles/mastodon/dashboard.scss b/app/javascript/styles/mastodon/dashboard.scss index 36a7f44253f..12d0a6b92f9 100644 --- a/app/javascript/styles/mastodon/dashboard.scss +++ b/app/javascript/styles/mastodon/dashboard.scss @@ -13,8 +13,9 @@ & > div, & > a { padding: 20px; - background: lighten($ui-base-color, 4%); + background: var(--background-color); border-radius: 4px; + border: 1px solid var(--background-border-color); box-sizing: border-box; height: 100%; } @@ -27,7 +28,7 @@ &:hover, &:focus, &:active { - background: lighten($ui-base-color, 8%); + background: $ui-base-color; } } } diff --git a/app/javascript/styles/mastodon/emoji_picker.scss b/app/javascript/styles/mastodon/emoji_picker.scss index b9fdaa58473..3652ad4abbb 100644 --- a/app/javascript/styles/mastodon/emoji_picker.scss +++ b/app/javascript/styles/mastodon/emoji_picker.scss @@ -105,7 +105,7 @@ width: 100%; background: $ui-base-color; color: $darker-text-color; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-radius: 4px; &::-moz-focus-inner { diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 26bb2bee145..13a731f7f63 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -414,7 +414,7 @@ code { } .input.static .label_input__wrapper { - font-size: 16px; + font-size: 14px; padding: 10px; border: 1px solid $dark-text-color; border-radius: 4px; @@ -436,13 +436,14 @@ code { outline: 0; font-family: inherit; resize: vertical; - background: darken($ui-base-color, 10%); - border: 1px solid darken($ui-base-color, 10%); - border-radius: 8px; + background: $ui-base-color; + border: 1px solid var(--background-border-color); + border-radius: 4px; padding: 10px 16px; &::placeholder { - color: lighten($darker-text-color, 4%); + color: $dark-text-color; + opacity: 1; } &:invalid { @@ -453,11 +454,6 @@ code { border-color: $valid-value-color; } - &:active, - &:focus { - border-color: $highlight-text-color; - } - @media screen and (width <= 600px) { font-size: 16px; } @@ -576,21 +572,25 @@ code { select { appearance: none; box-sizing: border-box; - font-size: 16px; + font-size: 14px; color: $primary-text-color; display: block; width: 100%; outline: 0; font-family: inherit; resize: vertical; - background: darken($ui-base-color, 10%) + background: $ui-base-color url("data:image/svg+xml;utf8,") - no-repeat right 8px center / auto 16px; - border: 1px solid darken($ui-base-color, 14%); + no-repeat right 8px center / auto 14px; + border: 1px solid var(--background-border-color); border-radius: 4px; padding-inline-start: 10px; padding-inline-end: 30px; height: 41px; + + @media screen and (width <= 600px) { + font-size: 16px; + } } h4 { @@ -644,8 +644,9 @@ code { } .flash-message { - background: lighten($ui-base-color, 8%); - color: $darker-text-color; + background: var(--background-color); + color: $highlight-text-color; + border: 1px solid $highlight-text-color; border-radius: 4px; padding: 15px 10px; margin-bottom: 30px; @@ -1335,7 +1336,7 @@ code { &__toggle > div { display: flex; - border-inline-start: 1px solid lighten($ui-base-color, 8%); + border-inline-start: 1px solid var(--background-border-color); padding-inline-start: 16px; } } diff --git a/app/javascript/styles/mastodon/rtl.scss b/app/javascript/styles/mastodon/rtl.scss index b5c4836bcd7..8d3efcb5726 100644 --- a/app/javascript/styles/mastodon/rtl.scss +++ b/app/javascript/styles/mastodon/rtl.scss @@ -46,7 +46,7 @@ body.rtl { } .simple_form select { - background: darken($ui-base-color, 10%) + background: $ui-base-color url("data:image/svg+xml;utf8,") no-repeat left 8px center / auto 16px; } diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index dd5b483ec48..65f42d0467b 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -9,9 +9,9 @@ padding: 8px; line-height: 18px; vertical-align: top; - border-top: 1px solid $ui-base-color; + border-bottom: 1px solid var(--background-border-color); text-align: start; - background: darken($ui-base-color, 4%); + background: var(--background-color); &.critical { font-weight: 700; @@ -21,8 +21,6 @@ & > thead > tr > th { vertical-align: bottom; - border-bottom: 2px solid $ui-base-color; - border-top: 0; font-weight: 500; } @@ -32,15 +30,20 @@ & > tbody > tr:nth-child(odd) > td, & > tbody > tr:nth-child(odd) > th { - background: $ui-base-color; + background: var(--background-color); + } + + & > tbody > tr:last-child > td, + & > tbody > tr:last-child > th { + border-bottom: 0; } a { - color: $highlight-text-color; - text-decoration: underline; + color: $darker-text-color; + text-decoration: none; &:hover { - text-decoration: none; + color: $highlight-text-color; } } @@ -78,7 +81,7 @@ & > tbody > tr > td { padding: 11px 10px; background: transparent; - border: 1px solid lighten($ui-base-color, 8%); + border: 1px solid var(--background-border-color); color: $secondary-text-color; } @@ -90,18 +93,18 @@ &.batch-table { & > thead > tr > th { - background: $ui-base-color; - border-top: 1px solid darken($ui-base-color, 8%); - border-bottom: 1px solid darken($ui-base-color, 8%); + background: var(--background-color); + border-top: 1px solid var(--background-border-color); + border-bottom: 1px solid var(--background-border-color); &:first-child { border-radius: 4px 0 0; - border-inline-start: 1px solid darken($ui-base-color, 8%); + border-inline-start: 1px solid var(--background-border-color); } &:last-child { border-radius: 0 4px 0 0; - border-inline-end: 1px solid darken($ui-base-color, 8%); + border-inline-end: 1px solid var(--background-border-color); } } } @@ -136,7 +139,7 @@ a.table-action-link { font-weight: 500; &:hover { - color: $primary-text-color; + color: $highlight-text-color; } i.fa { @@ -186,9 +189,9 @@ a.table-action-link { position: sticky; top: 0; z-index: 1; - border: 1px solid darken($ui-base-color, 8%); - background: $ui-base-color; - border-radius: 4px 0 0; + border: 1px solid var(--background-border-color); + background: var(--background-color); + border-radius: 4px 4px 0 0; height: 47px; align-items: center; @@ -199,11 +202,11 @@ a.table-action-link { } &__select-all { - background: $ui-base-color; + background: var(--background-color); height: 47px; align-items: center; justify-content: center; - border: 1px solid darken($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-top: 0; color: $secondary-text-color; display: none; @@ -249,9 +252,9 @@ a.table-action-link { &__form { padding: 16px; - border: 1px solid darken($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-top: 0; - background: $ui-base-color; + background: var(--background-color); .fields-row { padding-top: 0; @@ -260,26 +263,18 @@ a.table-action-link { } &__row { - border: 1px solid darken($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-top: 0; - background: darken($ui-base-color, 4%); + background: var(--background-color); @media screen and (max-width: $no-gap-breakpoint) { .optional &:first-child { - border-top: 1px solid darken($ui-base-color, 8%); + border-top: 1px solid var(--background-border-color); } } - &:hover { - background: darken($ui-base-color, 2%); - } - &:nth-child(even) { - background: $ui-base-color; - - &:hover { - background: lighten($ui-base-color, 2%); - } + background: var(--background-color); } &__content { @@ -291,6 +286,10 @@ a.table-action-link { padding: 0; } + &--padded { + padding: 12px 16px 16px; + } + &--with-image { display: flex; align-items: center; @@ -357,12 +356,13 @@ a.table-action-link { } .nothing-here { - border: 1px solid darken($ui-base-color, 8%); + border: 1px solid var(--background-border-color); border-top: 0; box-shadow: none; + background: var(--background-color); @media screen and (max-width: $no-gap-breakpoint) { - border-top: 1px solid darken($ui-base-color, 8%); + border-top: 1px solid var(--background-border-color); } } diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index 1f69f0cf01c..0d56bd9c48b 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -204,7 +204,7 @@ } .directory { - background: $ui-base-color; + background: var(--background-color); border-radius: 4px; box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); @@ -217,7 +217,7 @@ display: flex; align-items: center; justify-content: space-between; - background: $ui-base-color; + border: 1px solid lighten($ui-base-color, 8%); border-radius: 4px; padding: 15px; text-decoration: none; @@ -229,7 +229,7 @@ &:hover, &:active, &:focus { - background: lighten($ui-base-color, 8%); + background: $ui-base-color; } } @@ -351,7 +351,7 @@ &:focus, &:hover, &:active { - text-decoration: underline; + color: $highlight-text-color; } } } diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 7ec7e84bd16..d539ce41a07 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -104,7 +104,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def find_existing_status status = status_from_uri(object_uri) status ||= Status.find_by(uri: @object['atomUri']) if @object['atomUri'].present? - status + status if status&.account_id == @account.id end def process_status_params @@ -336,13 +336,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def fetch_replies(status) collection = @object['replies'] - return if collection.nil? + return if collection.blank? replies = ActivityPub::FetchRepliesService.new.call(status, collection, allow_synchronous_requests: false, request_id: @options[:request_id]) return unless replies.nil? uri = value_or_id(collection) ActivityPub::FetchRepliesWorker.perform_async(status.id, uri, { 'request_id' => @options[:request_id] }) unless uri.nil? + rescue => e + Rails.logger.warn "Error fetching replies: #{e}" end def conversation_from_uri(uri) diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb index 098b6296fb0..5b9437eb8da 100644 --- a/app/lib/activitypub/adapter.rb +++ b/app/lib/activitypub/adapter.rb @@ -20,6 +20,6 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base serialized_hash = serialized_hash.select { |k, _| options[:fields].include?(k) } if options[:fields] serialized_hash = self.class.transform_key_casing!(serialized_hash, instance_options) - { '@context' => serialized_context(named_contexts, context_extensions) }.merge(serialized_hash) + { '@context': serialized_context(named_contexts, context_extensions) }.merge(serialized_hash) 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 a260a66e2af..84ffc41d742 100644 --- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb +++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb @@ -85,7 +85,14 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim def imagemagick_version return if Rails.configuration.x.use_vips - version = `convert -version`.match(/Version: ImageMagick ([\d\.]+)/)[1] + imagemagick_binary = Paperclip.options[:is_windows] ? 'magick convert' : 'convert' + + version_output = Terrapin::CommandLine.new(imagemagick_binary, '-version').run + version_match = version_output.match(/Version: ImageMagick (\S+)/)[1].strip + + return nil unless version_match + + version = version_match { key: 'imagemagick', @@ -93,12 +100,13 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim value: version, human_value: version, } - rescue Errno::ENOENT + rescue Terrapin::CommandNotFoundError, Terrapin::ExitStatusError, Paperclip::Errors::CommandNotFoundError, Paperclip::Errors::CommandFailedError nil end def ffmpeg_version - version = `ffmpeg -version`.match(/ffmpeg version ([\d\.]+)/)[1] + version_output = Terrapin::CommandLine.new(Rails.configuration.x.ffprobe_binary, '-show_program_version -v 0 -of json').run + version = Oj.load(version_output, mode: :strict, symbol_keys: true).dig(:program_version, :version) { key: 'ffmpeg', @@ -106,7 +114,7 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim value: version, human_value: version, } - rescue Errno::ENOENT + rescue Terrapin::CommandNotFoundError, Terrapin::ExitStatusError, Oj::ParseError nil end diff --git a/app/lib/admin/metrics/measure/active_users_measure.rb b/app/lib/admin/metrics/measure/active_users_measure.rb index e6f09d4bcf6..c085ced6291 100644 --- a/app/lib/admin/metrics/measure/active_users_measure.rb +++ b/app/lib/admin/metrics/measure/active_users_measure.rb @@ -22,12 +22,4 @@ class Admin::Metrics::Measure::ActiveUsersMeasure < Admin::Metrics::Measure::Bas def activity_tracker @activity_tracker ||= ActivityTracker.new('activity:logins', :unique) end - - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end end diff --git a/app/lib/admin/metrics/measure/base_measure.rb b/app/lib/admin/metrics/measure/base_measure.rb index e33a6c494f9..8b7fe39b55a 100644 --- a/app/lib/admin/metrics/measure/base_measure.rb +++ b/app/lib/admin/metrics/measure/base_measure.rb @@ -86,11 +86,11 @@ class Admin::Metrics::Measure::BaseMeasure end def time_period - (@start_at..@end_at) + (@start_at.to_date..@end_at.to_date) end def previous_time_period - ((@start_at - length_of_period)..(@end_at - length_of_period)) + ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) end def length_of_period diff --git a/app/lib/admin/metrics/measure/instance_accounts_measure.rb b/app/lib/admin/metrics/measure/instance_accounts_measure.rb index 746780ee771..889a5e6f05f 100644 --- a/app/lib/admin/metrics/measure/instance_accounts_measure.rb +++ b/app/lib/admin/metrics/measure/instance_accounts_measure.rb @@ -48,14 +48,6 @@ class Admin::Metrics::Measure::InstanceAccountsMeasure < Admin::Metrics::Measure SQL end - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end - def params @params.permit(:domain, :include_subdomains) end diff --git a/app/lib/admin/metrics/measure/instance_followers_measure.rb b/app/lib/admin/metrics/measure/instance_followers_measure.rb index 0693d5a64a9..fa934c6b96c 100644 --- a/app/lib/admin/metrics/measure/instance_followers_measure.rb +++ b/app/lib/admin/metrics/measure/instance_followers_measure.rb @@ -49,14 +49,6 @@ class Admin::Metrics::Measure::InstanceFollowersMeasure < Admin::Metrics::Measur SQL end - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end - def params @params.permit(:domain, :include_subdomains) end diff --git a/app/lib/admin/metrics/measure/instance_follows_measure.rb b/app/lib/admin/metrics/measure/instance_follows_measure.rb index 90d38193585..3f3ab73fc90 100644 --- a/app/lib/admin/metrics/measure/instance_follows_measure.rb +++ b/app/lib/admin/metrics/measure/instance_follows_measure.rb @@ -49,14 +49,6 @@ class Admin::Metrics::Measure::InstanceFollowsMeasure < Admin::Metrics::Measure: SQL end - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end - def params @params.permit(:domain, :include_subdomains) end diff --git a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb index 89f8b414973..996ca52e0bb 100644 --- a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb +++ b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb @@ -58,14 +58,6 @@ class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics: SQL end - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end - def params @params.permit(:domain, :include_subdomains) end diff --git a/app/lib/admin/metrics/measure/instance_reports_measure.rb b/app/lib/admin/metrics/measure/instance_reports_measure.rb index 5f58387a640..ae1bb6e68de 100644 --- a/app/lib/admin/metrics/measure/instance_reports_measure.rb +++ b/app/lib/admin/metrics/measure/instance_reports_measure.rb @@ -49,14 +49,6 @@ class Admin::Metrics::Measure::InstanceReportsMeasure < Admin::Metrics::Measure: SQL end - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end - def params @params.permit(:domain, :include_subdomains) end diff --git a/app/lib/admin/metrics/measure/instance_statuses_measure.rb b/app/lib/admin/metrics/measure/instance_statuses_measure.rb index 5873c6e71fc..324d427b18b 100644 --- a/app/lib/admin/metrics/measure/instance_statuses_measure.rb +++ b/app/lib/admin/metrics/measure/instance_statuses_measure.rb @@ -58,14 +58,6 @@ class Admin::Metrics::Measure::InstanceStatusesMeasure < Admin::Metrics::Measure Mastodon::Snowflake.id_at(@end_at.end_of_day, with_random: false) end - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end - def params @params.permit(:domain, :include_subdomains) end diff --git a/app/lib/admin/metrics/measure/interactions_measure.rb b/app/lib/admin/metrics/measure/interactions_measure.rb index 7a2b7e0fac4..f4b4836b4a8 100644 --- a/app/lib/admin/metrics/measure/interactions_measure.rb +++ b/app/lib/admin/metrics/measure/interactions_measure.rb @@ -22,12 +22,4 @@ class Admin::Metrics::Measure::InteractionsMeasure < Admin::Metrics::Measure::Ba def activity_tracker @activity_tracker ||= ActivityTracker.new('activity:interactions', :basic) end - - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end end diff --git a/app/lib/admin/metrics/measure/query_helper.rb b/app/lib/admin/metrics/measure/query_helper.rb index 5969a96ba9f..47cfc63e5c5 100644 --- a/app/lib/admin/metrics/measure/query_helper.rb +++ b/app/lib/admin/metrics/measure/query_helper.rb @@ -18,7 +18,7 @@ module Admin::Metrics::Measure::QueryHelper def generated_series_days Arel.sql( <<~SQL.squish - SELECT generate_series(timestamp :start_at, :end_at, '1 day')::date AS period + SELECT generate_series(:start_at::timestamp, :end_at::timestamp, '1 day')::date AS period SQL ) end diff --git a/app/lib/admin/metrics/measure/tag_accounts_measure.rb b/app/lib/admin/metrics/measure/tag_accounts_measure.rb index 8f4512efe7c..906277b7d54 100644 --- a/app/lib/admin/metrics/measure/tag_accounts_measure.rb +++ b/app/lib/admin/metrics/measure/tag_accounts_measure.rb @@ -27,14 +27,6 @@ class Admin::Metrics::Measure::TagAccountsMeasure < Admin::Metrics::Measure::Bas @tag ||= Tag.find(params[:id]) end - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end - def params @params.permit(:id) end diff --git a/app/lib/admin/metrics/measure/tag_uses_measure.rb b/app/lib/admin/metrics/measure/tag_uses_measure.rb index bce86b89f10..2be96a02b37 100644 --- a/app/lib/admin/metrics/measure/tag_uses_measure.rb +++ b/app/lib/admin/metrics/measure/tag_uses_measure.rb @@ -27,14 +27,6 @@ class Admin::Metrics::Measure::TagUsesMeasure < Admin::Metrics::Measure::BaseMea @tag ||= Tag.find(params[:id]) end - def time_period - (@start_at.to_date..@end_at.to_date) - end - - def previous_time_period - ((@start_at.to_date - length_of_period)..(@end_at.to_date - length_of_period)) - end - def params @params.permit(:id) end diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb index 2fea1057cb6..d7aaeba5bde 100644 --- a/app/lib/application_extension.rb +++ b/app/lib/application_extension.rb @@ -16,7 +16,7 @@ module ApplicationExtension # dependent: delete_all, which means the ActiveRecord callback in # AccessTokenExtension is not run, so instead we manually announce to # streaming that these tokens are being deleted. - before_destroy :push_to_streaming_api, prepend: true + before_destroy :close_streaming_sessions, prepend: true end def confirmation_redirect_uri @@ -29,10 +29,12 @@ module ApplicationExtension redirect_uri.split end - def push_to_streaming_api + def close_streaming_sessions(resource_owner = nil) # TODO: #28793 Combine into a single topic payload = Oj.dump(event: :kill) - access_tokens.in_batches do |tokens| + scope = access_tokens + scope = scope.where(resource_owner_id: resource_owner.id) unless resource_owner.nil? + scope.in_batches do |tokens| redis.pipelined do |pipeline| tokens.ids.each do |id| pipeline.publish("timeline:access_token:#{id}", payload) diff --git a/app/lib/cache_buster.rb b/app/lib/cache_buster.rb index 554f2ba95d7..d3395f8f0a3 100644 --- a/app/lib/cache_buster.rb +++ b/app/lib/cache_buster.rb @@ -2,13 +2,8 @@ class CacheBuster def initialize(options = {}) - Rails.application.deprecators[:mastodon].warn('Default values for the cache buster secret header name and values will be removed in Mastodon 4.3. Please set them explicitely if you rely on those.') unless options[:http_method] || (options[:secret] && options[:secret_header]) - - @secret_header = options[:secret_header] || - (options[:http_method] ? nil : 'Secret-Header') - @secret = options[:secret] || - (options[:http_method] ? nil : 'True') - + @secret_header = options[:secret_header] + @secret = options[:secret] @http_method = options[:http_method] || 'GET' end diff --git a/app/lib/extractor.rb b/app/lib/extractor.rb index 9090773ae9b..7e647a75873 100644 --- a/app/lib/extractor.rb +++ b/app/lib/extractor.rb @@ -86,10 +86,6 @@ module Extractor possible_entries end - def extract_cashtags_with_indices(_text) - [] - end - def extract_extra_uris_with_indices(text) return [] unless text&.index(':') diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb index 2e49d3fb4f5..bd78aef7a9f 100644 --- a/app/lib/link_details_extractor.rb +++ b/app/lib/link_details_extractor.rb @@ -62,7 +62,8 @@ class LinkDetailsExtractor end def author_name - author['name'] + name = author['name'] + name.is_a?(Array) ? name.join(', ') : name end def author_url @@ -100,7 +101,7 @@ class LinkDetailsExtractor end def json - @json ||= root_array(Oj.load(@data)).find { |obj| SUPPORTED_TYPES.include?(obj['@type']) } || {} + @json ||= root_array(Oj.load(@data)).compact.find { |obj| SUPPORTED_TYPES.include?(obj['@type']) } || {} end end @@ -156,11 +157,11 @@ class LinkDetailsExtractor end def title - html_entities.decode(structured_data&.headline || opengraph_tag('og:title') || document.xpath('//title').map(&:content).first).strip + html_entities_decode(structured_data&.headline || opengraph_tag('og:title') || document.xpath('//title').map(&:content).first)&.strip end def description - html_entities.decode(structured_data&.description || opengraph_tag('og:description') || meta_tag('description')) + html_entities_decode(structured_data&.description || opengraph_tag('og:description') || meta_tag('description')) end def published_at @@ -180,7 +181,7 @@ class LinkDetailsExtractor end def provider_name - html_entities.decode(structured_data&.publisher_name || opengraph_tag('og:site_name')) + html_entities_decode(structured_data&.publisher_name || opengraph_tag('og:site_name')) end def provider_url @@ -188,7 +189,7 @@ class LinkDetailsExtractor end def author_name - html_entities.decode(structured_data&.author_name || opengraph_tag('og:author') || opengraph_tag('og:author:username')) + html_entities_decode(structured_data&.author_name || opengraph_tag('og:author') || opengraph_tag('og:author:username')) end def author_url @@ -257,7 +258,7 @@ class LinkDetailsExtractor next if json_ld.blank? - structured_data = StructuredData.new(html_entities.decode(json_ld)) + structured_data = StructuredData.new(html_entities_decode(json_ld)) next unless structured_data.valid? @@ -269,14 +270,27 @@ class LinkDetailsExtractor end def document - @document ||= Nokogiri::HTML(@html, nil, encoding) + @document ||= detect_encoding_and_parse_document end - def encoding - @encoding ||= begin - guess = detector.detect(@html, @html_charset) - guess&.fetch(:confidence, 0).to_i > 60 ? guess&.fetch(:encoding, nil) : nil + def detect_encoding_and_parse_document + [detect_encoding, nil, header_encoding].uniq.each do |encoding| + document = Nokogiri::HTML(@html, nil, encoding) + return document if document.to_s.valid_encoding? end + Nokogiri::HTML(@html, nil, 'UTF-8') + end + + def detect_encoding + guess = detector.detect(@html, @html_charset) + guess&.fetch(:confidence, 0).to_i > 60 ? guess&.fetch(:encoding, nil) : nil + end + + def header_encoding + Encoding.find(@html_charset).name if @html_charset + rescue ArgumentError + # Encoding from HTTP header is not recognized by ruby + nil end def detector @@ -285,6 +299,15 @@ class LinkDetailsExtractor end end + def html_entities_decode(string) + return if string.nil? + + unicode_string = string.to_s.encode('UTF-8') + raise EncodingError, 'cannot convert string to valid UTF-8' unless unicode_string.valid_encoding? + + html_entities.decode(unicode_string) + end + def html_entities @html_entities ||= HTMLEntities.new(:expanded) end diff --git a/app/lib/oauth_pre_authorization_extension.rb b/app/lib/oauth_pre_authorization_extension.rb new file mode 100644 index 00000000000..1885e0823d8 --- /dev/null +++ b/app/lib/oauth_pre_authorization_extension.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module OauthPreAuthorizationExtension + extend ActiveSupport::Concern + + included do + validate :code_challenge_method_s256, error: Doorkeeper::Errors::InvalidCodeChallengeMethod + end + + def validate_code_challenge_method_s256 + code_challenge.blank? || code_challenge_method == 'S256' + end +end diff --git a/app/lib/private_address_check.rb b/app/lib/private_address_check.rb new file mode 100644 index 00000000000..d00b16e66b5 --- /dev/null +++ b/app/lib/private_address_check.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module PrivateAddressCheck + module_function + + CIDR_LIST = [ + IPAddr.new('0.0.0.0/8'), # Current network (only valid as source address) + IPAddr.new('100.64.0.0/10'), # Shared Address Space + IPAddr.new('172.16.0.0/12'), # Private network + IPAddr.new('192.0.0.0/24'), # IETF Protocol Assignments + IPAddr.new('192.0.2.0/24'), # TEST-NET-1, documentation and examples + IPAddr.new('192.88.99.0/24'), # IPv6 to IPv4 relay (includes 2002::/16) + IPAddr.new('198.18.0.0/15'), # Network benchmark tests + IPAddr.new('198.51.100.0/24'), # TEST-NET-2, documentation and examples + IPAddr.new('203.0.113.0/24'), # TEST-NET-3, documentation and examples + IPAddr.new('224.0.0.0/4'), # IP multicast (former Class D network) + IPAddr.new('240.0.0.0/4'), # Reserved (former Class E network) + IPAddr.new('255.255.255.255'), # Broadcast + IPAddr.new('64:ff9b::/96'), # IPv4/IPv6 translation (RFC 6052) + IPAddr.new('100::/64'), # Discard prefix (RFC 6666) + IPAddr.new('2001::/32'), # Teredo tunneling + IPAddr.new('2001:10::/28'), # Deprecated (previously ORCHID) + IPAddr.new('2001:20::/28'), # ORCHIDv2 + IPAddr.new('2001:db8::/32'), # Addresses used in documentation and example source code + IPAddr.new('2002::/16'), # 6to4 + IPAddr.new('fc00::/7'), # Unique local address + IPAddr.new('ff00::/8'), # Multicast + ].freeze + + def private_address?(address) + address.private? || address.loopback? || address.link_local? || CIDR_LIST.any? { |cidr| cidr.include?(address) } + end +end diff --git a/app/lib/search_query_transformer.rb b/app/lib/search_query_transformer.rb index 927495eace9..606819ed404 100644 --- a/app/lib/search_query_transformer.rb +++ b/app/lib/search_query_transformer.rb @@ -225,7 +225,7 @@ class SearchQueryTransformer < Parslet::Transform end rule(clause: subtree(:clause)) do - prefix = clause[:prefix][:term].to_s if clause[:prefix] + prefix = clause[:prefix][:term].to_s.downcase if clause[:prefix] operator = clause[:operator]&.to_s term = clause[:phrase] ? clause[:phrase].map { |term| term[:term].to_s }.join(' ') : clause[:term].to_s diff --git a/app/lib/themes.rb b/app/lib/themes.rb index b6da980733f..183258d62f8 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -8,7 +8,7 @@ class Themes THEME_COLORS = { dark: '#191b22', - light: '#f3f5f7', + light: '#ffffff', }.freeze def initialize diff --git a/app/lib/webfinger.rb b/app/lib/webfinger.rb index ae8a3b1eae0..01a5dbc21d9 100644 --- a/app/lib/webfinger.rb +++ b/app/lib/webfinger.rb @@ -6,6 +6,8 @@ class Webfinger class RedirectError < Error; end class Response + ACTIVITYPUB_READY_TYPE = ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].freeze + attr_reader :uri def initialize(uri, body) @@ -20,17 +22,28 @@ class Webfinger end def link(rel, attribute) - links.dig(rel, attribute) + links.dig(rel, 0, attribute) + end + + def self_link_href + self_link.fetch('href') end private def links - @links ||= @json['links'].index_by { |link| link['rel'] } + @links ||= @json.fetch('links', []).group_by { |link| link['rel'] } + end + + def self_link + links.fetch('self', []).find do |link| + ACTIVITYPUB_READY_TYPE.include?(link['type']) + end end def validate_response! raise Webfinger::Error, "Missing subject in response for #{@uri}" if subject.blank? + raise Webfinger::Error, "Missing self link in response for #{@uri}" if self_link.blank? end end diff --git a/app/models/account.rb b/app/models/account.rb index 8a990bb831d..23ff07c7696 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -68,7 +68,7 @@ class Account < ApplicationRecord INSTANCE_ACTOR_ID = -99 USERNAME_RE = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i - MENTION_RE = %r{(? :poll, }.freeze + # Please update app/javascript/api_types/notification.ts if you change this PROPERTIES = { mention: { filterable: true, @@ -137,31 +138,51 @@ class Notification < ApplicationRecord end end + def paginate_groups(limit, pagination_order) + raise ArgumentError unless %i(asc desc).include?(pagination_order) + + query = reorder(id: pagination_order) + + unscoped + .with_recursive( + grouped_notifications: [ + # Base case: fetching one notification and annotating it with visited groups + query + .select('notifications.*', "ARRAY[COALESCE(notifications.group_key, 'ungrouped-' || notifications.id)] AS groups") + .limit(1), + # Recursive case, always yielding at most one annotated notification + unscoped + .from( + [ + # Expose the working table as `wt`, but quit early if we've reached the limit + unscoped + .select('id', 'groups') + .from('grouped_notifications') + .where('array_length(grouped_notifications.groups, 1) < :limit', limit: limit) + .arel.as('wt'), + # Recursive query, using `LATERAL` so we can refer to `wt` + query + .where(pagination_order == :desc ? 'notifications.id < wt.id' : 'notifications.id > wt.id') + .where.not("COALESCE(notifications.group_key, 'ungrouped-' || notifications.id) = ANY(wt.groups)") + .limit(1) + .arel.lateral('notifications'), + ] + ) + .select('notifications.*', "array_append(wt.groups, COALESCE(notifications.group_key, 'ungrouped-' || notifications.id))"), + ] + ) + .from('grouped_notifications AS notifications') + .order(id: pagination_order) + .limit(limit) + end + # This returns notifications from the request page, but with at most one notification per group. # Notifications that have no `group_key` each count as a separate group. def paginate_groups_by_max_id(limit, max_id: nil, since_id: nil) query = reorder(id: :desc) query = query.where(id: ...max_id) if max_id.present? query = query.where(id: (since_id + 1)...) if since_id.present? - - unscoped - .with_recursive( - grouped_notifications: [ - query - .select('notifications.*', "ARRAY[COALESCE(notifications.group_key, 'ungrouped-' || notifications.id)] groups") - .limit(1), - query - .joins('CROSS JOIN grouped_notifications') - .where('array_length(grouped_notifications.groups, 1) < :limit', limit: limit) - .where('notifications.id < grouped_notifications.id') - .where.not("COALESCE(notifications.group_key, 'ungrouped-' || notifications.id) = ANY(grouped_notifications.groups)") - .select('notifications.*', "array_append(grouped_notifications.groups, COALESCE(notifications.group_key, 'ungrouped-' || notifications.id))") - .limit(1), - ] - ) - .from('grouped_notifications AS notifications') - .order(id: :desc) - .limit(limit) + query.paginate_groups(limit, :desc) end # Differs from :paginate_groups_by_max_id in that it gives the results immediately following min_id, @@ -171,25 +192,7 @@ class Notification < ApplicationRecord query = reorder(id: :asc) query = query.where(id: (min_id + 1)...) if min_id.present? query = query.where(id: ...max_id) if max_id.present? - - unscoped - .with_recursive( - grouped_notifications: [ - query - .select('notifications.*', "ARRAY[COALESCE(notifications.group_key, 'ungrouped-' || notifications.id)] groups") - .limit(1), - query - .joins('CROSS JOIN grouped_notifications') - .where('array_length(grouped_notifications.groups, 1) < :limit', limit: limit) - .where('notifications.id > grouped_notifications.id') - .where.not("COALESCE(notifications.group_key, 'ungrouped-' || notifications.id) = ANY(grouped_notifications.groups)") - .select('notifications.*', "array_append(grouped_notifications.groups, COALESCE(notifications.group_key, 'ungrouped-' || notifications.id))") - .limit(1), - ] - ) - .from('grouped_notifications AS notifications') - .order(id: :asc) - .limit(limit) + query.paginate_groups(limit, :asc) end def to_a_grouped_paginated_by_id(limit, options = {}) diff --git a/app/models/notification_group.rb b/app/models/notification_group.rb index 43612d49bbd..223945f07bf 100644 --- a/app/models/notification_group.rb +++ b/app/models/notification_group.rb @@ -3,13 +3,20 @@ class NotificationGroup < ActiveModelSerializers::Model attributes :group_key, :sample_accounts, :notifications_count, :notification, :most_recent_notification_id - def self.from_notification(notification) + # Try to keep this consistent with `app/javascript/mastodon/models/notification_group.ts` + SAMPLE_ACCOUNTS_SIZE = 8 + + def self.from_notification(notification, max_id: nil) if notification.group_key.present? - # TODO: caching and preloading - most_recent_notifications = notification.account.notifications.where(group_key: notification.group_key).order(id: :desc).take(3) + # TODO: caching, and, if caching, preloading + scope = notification.account.notifications.where(group_key: notification.group_key) + scope = scope.where(id: ..max_id) if max_id.present? + + # Ideally, we would not load accounts for each notification group + most_recent_notifications = scope.order(id: :desc).includes(:from_account).take(SAMPLE_ACCOUNTS_SIZE) most_recent_id = most_recent_notifications.first.id sample_accounts = most_recent_notifications.map(&:from_account) - notifications_count = notification.account.notifications.where(group_key: notification.group_key).count + notifications_count = scope.count else most_recent_id = notification.id sample_accounts = [notification.from_account] @@ -29,5 +36,6 @@ class NotificationGroup < ActiveModelSerializers::Model :target_status, :report, :account_relationship_severance_event, + :account_warning, to: :notification, prefix: false end diff --git a/app/models/notification_policy.rb b/app/models/notification_policy.rb index f10b0c2a816..2bb58004e37 100644 --- a/app/models/notification_policy.rb +++ b/app/models/notification_policy.rb @@ -31,6 +31,6 @@ class NotificationPolicy < ApplicationRecord private def pending_notification_requests - @pending_notification_requests ||= notification_requests.where(dismissed: false).limit(MAX_MEANINGFUL_COUNT).pick(Arel.sql('count(*), coalesce(sum(notifications_count), 0)::bigint')) + @pending_notification_requests ||= notification_requests.limit(MAX_MEANINGFUL_COUNT).pick(Arel.sql('count(*), coalesce(sum(notifications_count), 0)::bigint')) end end diff --git a/app/models/notification_request.rb b/app/models/notification_request.rb index 6e9cae66255..2f601ac36b7 100644 --- a/app/models/notification_request.rb +++ b/app/models/notification_request.rb @@ -9,12 +9,13 @@ # from_account_id :bigint(8) not null # last_status_id :bigint(8) # notifications_count :bigint(8) default(0), not null -# dismissed :boolean default(FALSE), not null # created_at :datetime not null # updated_at :datetime not null # class NotificationRequest < ApplicationRecord + self.ignored_columns += %w(dismissed) + include Paginable MAX_MEANINGFUL_COUNT = 100 @@ -34,8 +35,6 @@ class NotificationRequest < ApplicationRecord end def reconsider_existence! - return if dismissed? - prepare_notifications_count if notifications_count.positive? diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb index cbfc3937865..5a11351e588 100644 --- a/app/models/preview_card.rb +++ b/app/models/preview_card.rb @@ -46,6 +46,11 @@ class PreviewCard < ApplicationRecord y_comp: 4, }.freeze + # URL size limit to safely store in PosgreSQL's unique indexes + # Technically this is a byte-size limit but we use it as a + # character limit to work with length validation + URL_CHARACTER_LIMIT = 2692 + self.inheritance_column = false enum :type, { link: 0, photo: 1, video: 2, rich: 3 } @@ -63,7 +68,7 @@ class PreviewCard < ApplicationRecord convert_options: { all: '-quality 90 +profile "!icc,*" +set date:modify +set date:create +set date:timestamp' }, validate_media_type: false - validates :url, presence: true, uniqueness: true, url: true + validates :url, presence: true, uniqueness: true, url: true, length: { maximum: URL_CHARACTER_LIMIT } validates_attachment_content_type :image, content_type: IMAGE_MIME_TYPES validates_attachment_size :image, less_than: LIMIT remotable_attachment :image, LIMIT @@ -128,6 +133,22 @@ class PreviewCard < ApplicationRecord @history ||= Trends::History.new('links', id) end + def authors + @authors ||= [PreviewCard::Author.new(self)] + end + + class Author < ActiveModelSerializers::Model + attributes :name, :url, :account + + def initialize(preview_card) + super( + name: preview_card.author_name, + url: preview_card.author_url, + account: preview_card.author_account, + ) + end + end + class << self private diff --git a/app/models/report.rb b/app/models/report.rb index 3df5a20e181..17c1503436f 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -18,6 +18,7 @@ # category :integer default("other"), not null # action_taken_at :datetime # rule_ids :bigint(8) is an Array +# application_id :bigint(8) # class Report < ApplicationRecord @@ -31,6 +32,7 @@ class Report < ApplicationRecord rate_limit by: :account, family: :reports belongs_to :account + belongs_to :application, class_name: 'Doorkeeper::Application', optional: true with_options class_name: 'Account' do belongs_to :target_account diff --git a/app/models/site_upload.rb b/app/models/site_upload.rb index 6431d1007d1..273dd6de9fd 100644 --- a/app/models/site_upload.rb +++ b/app/models/site_upload.rb @@ -31,17 +31,10 @@ class SiteUpload < ApplicationRecord [:"#{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: FAVICON_SIZES.to_h do |size| [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }] - end - ).freeze, + end.freeze, thumbnail: { '@1x': { diff --git a/app/models/status.rb b/app/models/status.rb index baa65780055..73f00526735 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -288,7 +288,7 @@ class Status < ApplicationRecord else map = media_attachments.index_by(&:id) ordered_media_attachment_ids.filter_map { |media_attachment_id| map[media_attachment_id] } - end + end.take(MEDIA_ATTACHMENTS_LIMIT) end def replies_count diff --git a/app/models/status_edit.rb b/app/models/status_edit.rb index 50dabb91f5b..6e25a6f3bbd 100644 --- a/app/models/status_edit.rb +++ b/app/models/status_edit.rb @@ -42,7 +42,7 @@ class StatusEdit < ApplicationRecord scope :ordered, -> { order(id: :asc) } delegate :local?, :application, :edited?, :edited_at, - :discarded?, :visibility, to: :status + :discarded?, :visibility, :language, to: :status def emojis return @emojis if defined?(@emojis) @@ -53,12 +53,14 @@ class StatusEdit < ApplicationRecord def ordered_media_attachments return @ordered_media_attachments if defined?(@ordered_media_attachments) - @ordered_media_attachments = if ordered_media_attachment_ids.nil? - [] - else - map = status.media_attachments.index_by(&:id) - ordered_media_attachment_ids.map.with_index { |media_attachment_id, index| PreservedMediaAttachment.new(media_attachment: map[media_attachment_id], description: media_descriptions[index]) } - end + @ordered_media_attachments = begin + if ordered_media_attachment_ids.nil? + [] + else + map = status.media_attachments.index_by(&:id) + ordered_media_attachment_ids.map.with_index { |media_attachment_id, index| PreservedMediaAttachment.new(media_attachment: map[media_attachment_id], description: media_descriptions[index]) } + end + end.take(Status::MEDIA_ATTACHMENTS_LIMIT) end def proper diff --git a/app/models/tag.rb b/app/models/tag.rb index 3f88cb06807..9006e1f25d9 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -37,7 +37,7 @@ class Tag < ApplicationRecord HASHTAG_LAST_SEQUENCE = '([[:word:]_]*[[:alpha:]][[:word:]_]*)' HASHTAG_NAME_PAT = "#{HASHTAG_FIRST_SEQUENCE}|#{HASHTAG_LAST_SEQUENCE}" - HASHTAG_RE = %r{(? { where(reviewed_at: nil) } scope :pending_review, -> { unreviewed.where.not(requested_review_at: nil) } scope :usable, -> { where(usable: [true, nil]) } + scope :not_usable, -> { where(usable: false) } scope :listable, -> { where(listable: [true, nil]) } scope :trendable, -> { Setting.trendable_by_default ? where(trendable: [true, nil]) : where(trendable: true) } scope :not_trendable, -> { where(trendable: false) } @@ -74,6 +75,10 @@ class Tag < ApplicationRecord attributes['display_name'] || name end + def formatted_name + "##{display_name}" + end + def usable boolean_with_default('usable', true) end @@ -132,8 +137,10 @@ class Tag < ApplicationRecord def search_for(term, limit = 5, offset = 0, options = {}) stripped_term = term.strip + options.reverse_merge!({ exclude_unlistable: true, exclude_unreviewed: false }) - query = Tag.listable.matches_name(stripped_term) + query = Tag.matches_name(stripped_term) + query = query.merge(Tag.listable) if options[:exclude_unlistable] query = query.merge(matching_name(stripped_term).or(where.not(reviewed_at: nil))) if options[:exclude_unreviewed] query.order(Arel.sql('length(name) ASC, name ASC')) diff --git a/app/models/user.rb b/app/models/user.rb index 8bc0b23ce84..72854569260 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -117,6 +117,7 @@ class User < ApplicationRecord scope :pending, -> { where(approved: false) } scope :approved, -> { where(approved: true) } scope :confirmed, -> { where.not(confirmed_at: nil) } + scope :unconfirmed, -> { where(confirmed_at: nil) } scope :enabled, -> { where(disabled: false) } scope :disabled, -> { where(disabled: true) } scope :active, -> { confirmed.signed_in_recently.account_not_suspended } diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb index 6571632fcd7..0ae8ab8ec79 100644 --- a/app/models/user_settings.rb +++ b/app/models/user_settings.rb @@ -25,6 +25,7 @@ class UserSettings setting :use_pending_items, default: false setting :use_system_font, default: false setting :disable_swiping, default: false + setting :disable_hover_cards, default: false setting :delete_modal, default: true setting :reblog_modal, default: false setting :reduce_motion, default: false diff --git a/app/presenters/grouped_notifications_presenter.rb b/app/presenters/grouped_notifications_presenter.rb new file mode 100644 index 00000000000..f01acfd41c7 --- /dev/null +++ b/app/presenters/grouped_notifications_presenter.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class GroupedNotificationsPresenter < ActiveModelSerializers::Model + def initialize(grouped_notifications) + super() + + @grouped_notifications = grouped_notifications + end + + def notification_groups + @grouped_notifications + end + + def statuses + @grouped_notifications.filter_map(&:target_status).uniq(&:id) + end + + def accounts + @grouped_notifications.flat_map(&:sample_accounts).uniq(&:id) + end +end diff --git a/app/presenters/oauth_metadata_presenter.rb b/app/presenters/oauth_metadata_presenter.rb index 546503bfcca..1e4d25165c7 100644 --- a/app/presenters/oauth_metadata_presenter.rb +++ b/app/presenters/oauth_metadata_presenter.rb @@ -7,6 +7,7 @@ class OauthMetadataPresenter < ActiveModelSerializers::Model :revocation_endpoint, :scopes_supported, :response_types_supported, :response_modes_supported, :grant_types_supported, :token_endpoint_auth_methods_supported, + :code_challenge_methods_supported, :service_documentation, :app_registration_endpoint def issuer @@ -59,6 +60,10 @@ class OauthMetadataPresenter < ActiveModelSerializers::Model %w(client_secret_basic client_secret_post) end + def code_challenge_methods_supported + %w(S256) + end + private def doorkeeper diff --git a/app/serializers/activitypub/outbox_serializer.rb b/app/serializers/activitypub/outbox_serializer.rb index 4f4f950a5ac..4d3d9706def 100644 --- a/app/serializers/activitypub/outbox_serializer.rb +++ b/app/serializers/activitypub/outbox_serializer.rb @@ -2,7 +2,7 @@ class ActivityPub::OutboxSerializer < ActivityPub::CollectionSerializer def self.serializer_for(model, options) - if model.class.name == 'ActivityPub::ActivityPresenter' + if model.instance_of?(::ActivityPub::ActivityPresenter) ActivityPub::ActivitySerializer else super diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 72aaabcfcb1..13f332c95c4 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -24,6 +24,7 @@ class InitialStateSerializer < ActiveModel::Serializer store[:expand_spoilers] = object_account_user.setting_expand_spoilers store[:reduce_motion] = object_account_user.setting_reduce_motion store[:disable_swiping] = object_account_user.setting_disable_swiping + store[:disable_hover_cards] = object_account_user.setting_disable_hover_cards store[:advanced_layout] = object_account_user.setting_advanced_layout store[:use_blurhash] = object_account_user.setting_use_blurhash store[:use_pending_items] = object_account_user.setting_use_pending_items diff --git a/app/serializers/oauth_metadata_serializer.rb b/app/serializers/oauth_metadata_serializer.rb index 5f3dc7b87e2..2afb4208fbc 100644 --- a/app/serializers/oauth_metadata_serializer.rb +++ b/app/serializers/oauth_metadata_serializer.rb @@ -5,5 +5,6 @@ class OauthMetadataSerializer < ActiveModel::Serializer :revocation_endpoint, :scopes_supported, :response_types_supported, :response_modes_supported, :grant_types_supported, :token_endpoint_auth_methods_supported, + :code_challenge_methods_supported, :service_documentation, :app_registration_endpoint end diff --git a/app/serializers/rest/dedup_notification_group_serializer.rb b/app/serializers/rest/dedup_notification_group_serializer.rb new file mode 100644 index 00000000000..fd0c6b3c415 --- /dev/null +++ b/app/serializers/rest/dedup_notification_group_serializer.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class REST::DedupNotificationGroupSerializer < ActiveModel::Serializer + has_many :accounts, serializer: REST::AccountSerializer + has_many :statuses, serializer: REST::StatusSerializer + has_many :notification_groups, serializer: REST::NotificationGroupSerializer +end diff --git a/app/serializers/rest/notification_group_serializer.rb b/app/serializers/rest/notification_group_serializer.rb index 9aa5663f4e0..b855f1cba9c 100644 --- a/app/serializers/rest/notification_group_serializer.rb +++ b/app/serializers/rest/notification_group_serializer.rb @@ -1,18 +1,27 @@ # frozen_string_literal: true class REST::NotificationGroupSerializer < ActiveModel::Serializer + # Please update app/javascript/api_types/notification.ts when making changes to the attributes attributes :group_key, :notifications_count, :type, :most_recent_notification_id attribute :page_min_id, if: :paginated? attribute :page_max_id, if: :paginated? attribute :latest_page_notification_at, if: :paginated? - has_many :sample_accounts, serializer: REST::AccountSerializer - belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer + attribute :sample_account_ids + attribute :status_id, if: :status_type? belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer belongs_to :account_relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer belongs_to :account_warning, key: :moderation_warning, if: :moderation_warning_event?, serializer: REST::AccountWarningSerializer + def sample_account_ids + object.sample_accounts.pluck(:id).map(&:to_s) + end + + def status_id + object.target_status&.id&.to_s + end + def status_type? [:favourite, :reblog, :status, :mention, :poll, :update].include?(object.type) end diff --git a/app/serializers/rest/notification_policy_serializer.rb b/app/serializers/rest/notification_policy_serializer.rb index a50ba9e66b8..8bf85250fa5 100644 --- a/app/serializers/rest/notification_policy_serializer.rb +++ b/app/serializers/rest/notification_policy_serializer.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class REST::NotificationPolicySerializer < ActiveModel::Serializer + # Please update `app/javascript/mastodon/api_types/notification_policies.ts` when making changes to the attributes + attributes :filter_not_following, :filter_not_followers, :filter_new_accounts, diff --git a/app/serializers/rest/notification_serializer.rb b/app/serializers/rest/notification_serializer.rb index 417245d19dd..320bc86961d 100644 --- a/app/serializers/rest/notification_serializer.rb +++ b/app/serializers/rest/notification_serializer.rb @@ -1,7 +1,10 @@ # frozen_string_literal: true class REST::NotificationSerializer < ActiveModel::Serializer - attributes :id, :type, :created_at + # Please update app/javascript/api_types/notification.ts when making changes to the attributes + attributes :id, :type, :created_at, :group_key + + attribute :filtered, if: :filtered? belongs_to :from_account, key: :account, serializer: REST::AccountSerializer belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer @@ -13,6 +16,10 @@ class REST::NotificationSerializer < ActiveModel::Serializer object.id.to_s end + def group_key + object.group_key || "ungrouped-#{object.id}" + end + def status_type? [:favourite, :reblog, :status, :mention, :poll, :update].include?(object.type) end @@ -28,4 +35,6 @@ class REST::NotificationSerializer < ActiveModel::Serializer def moderation_warning_event? object.type == :moderation_warning end + + delegate :filtered?, to: :object end diff --git a/app/serializers/rest/preview_card_serializer.rb b/app/serializers/rest/preview_card_serializer.rb index 7d4c99c2d1f..f73a051ac0f 100644 --- a/app/serializers/rest/preview_card_serializer.rb +++ b/app/serializers/rest/preview_card_serializer.rb @@ -1,6 +1,11 @@ # frozen_string_literal: true class REST::PreviewCardSerializer < ActiveModel::Serializer + class AuthorSerializer < ActiveModel::Serializer + attributes :name, :url + has_one :account, serializer: REST::AccountSerializer + end + include RoutingHelper attributes :url, :title, :description, :language, :type, @@ -8,7 +13,7 @@ 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? } + has_many :authors, serializer: AuthorSerializer def url object.original_url.presence || object.url diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index b86c9b9e7ed..dab5f748bfd 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -28,9 +28,7 @@ class AccountSearchService < BaseService }, functions: [ - reputation_score_function, followers_score_function, - time_distance_function, ], }, }, @@ -81,36 +79,12 @@ class AccountSearchService < BaseService } end - # This function deranks accounts that follow more people than follow them - def reputation_score_function - { - script_score: { - script: { - source: "(Math.max(doc['followers_count'].value, 0) + 0.0) / (Math.max(doc['followers_count'].value, 0) + Math.max(doc['following_count'].value, 0) + 1)", - }, - }, - } - end - # This function promotes accounts that have more followers def followers_score_function { script_score: { script: { - source: "(Math.max(doc['followers_count'].value, 0) / (Math.max(doc['followers_count'].value, 0) + 1))", - }, - }, - } - end - - # This function deranks accounts that haven't posted in a long time - def time_distance_function - { - gauss: { - last_status_at: { - scale: '30d', - offset: '30d', - decay: 0.3, + source: "Math.log10((Math.max(doc['followers_count'].value, 0) + 1))", }, }, } @@ -126,10 +100,24 @@ class AccountSearchService < BaseService def core_query { - multi_match: { - query: @query, - type: 'bool_prefix', - fields: %w(username^2 username.*^2 display_name display_name.*), + dis_max: { + queries: [ + { + multi_match: { + query: @query, + type: 'most_fields', + fields: %w(username username.*), + }, + }, + + { + multi_match: { + query: @query, + type: 'most_fields', + fields: %w(display_name display_name.*), + }, + }, + ], }, } end @@ -142,7 +130,7 @@ class AccountSearchService < BaseService { multi_match: { query: @query, - type: 'most_fields', + type: 'best_fields', fields: %w(username^2 display_name^2 text text.*), operator: 'and', }, diff --git a/app/services/activitypub/fetch_remote_actor_service.rb b/app/services/activitypub/fetch_remote_actor_service.rb index 86a134bb4ed..2c372c2ec3f 100644 --- a/app/services/activitypub/fetch_remote_actor_service.rb +++ b/app/services/activitypub/fetch_remote_actor_service.rb @@ -49,7 +49,7 @@ class ActivityPub::FetchRemoteActorService < BaseService confirmed_username, confirmed_domain = split_acct(webfinger.subject) if @username.casecmp(confirmed_username).zero? && @domain.casecmp(confirmed_domain).zero? - raise Error, "Webfinger response for #{@username}@#{@domain} does not loop back to #{@uri}" if webfinger.link('self', 'href') != @uri + raise Error, "Webfinger response for #{@username}@#{@domain} does not loop back to #{@uri}" if webfinger.self_link_href != @uri return end @@ -58,8 +58,7 @@ class ActivityPub::FetchRemoteActorService < BaseService @username, @domain = split_acct(webfinger.subject) raise Webfinger::RedirectError, "Too many webfinger redirects for URI #{@uri} (stopped at #{@username}@#{@domain})" unless confirmed_username.casecmp(@username).zero? && confirmed_domain.casecmp(@domain).zero? - - raise Error, "Webfinger response for #{@username}@#{@domain} does not loop back to #{@uri}" if webfinger.link('self', 'href') != @uri + raise Error, "Webfinger response for #{@username}@#{@domain} does not loop back to #{@uri}" if webfinger.self_link_href != @uri rescue Webfinger::RedirectError => e raise Error, e.message rescue Webfinger::Error => e diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb index 1e901843768..133a7648735 100644 --- a/app/services/backup_service.rb +++ b/app/services/backup_service.rb @@ -19,8 +19,8 @@ class BackupService < BaseService def build_outbox_json!(file) skeleton = serialize(collection_presenter, ActivityPub::CollectionSerializer) - skeleton['@context'] = full_context - skeleton['orderedItems'] = ['!PLACEHOLDER!'] + skeleton[:@context] = full_context + skeleton[:orderedItems] = ['!PLACEHOLDER!'] skeleton = Oj.dump(skeleton) prepend, append = skeleton.split('"!PLACEHOLDER!"') add_comma = false @@ -33,7 +33,7 @@ class BackupService < BaseService file.write(statuses.map do |status| item = serialize_payload(ActivityPub::ActivityPresenter.from_status(status), ActivityPub::ActivitySerializer) - item.delete('@context') + item.delete(:@context) unless item[:type] == 'Announce' || item[:object][:attachment].blank? item[:object][:attachment].each do |attachment| diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 900cb9863dd..49b82055747 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -29,7 +29,7 @@ class FetchLinkCardService < BaseService end attach_card if @card&.persisted? - rescue HTTP::Error, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e + rescue HTTP::Error, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, EncodingError, ActiveRecord::RecordInvalid => e Rails.logger.debug { "Error fetching link #{@original_url}: #{e}" } nil end @@ -45,7 +45,13 @@ class FetchLinkCardService < BaseService def html return @html if defined?(@html) - @html = Request.new(:get, @url).add_headers('Accept' => 'text/html', 'User-Agent' => "#{Mastodon::Version.user_agent} Bot").perform do |res| + headers = { + 'Accept' => 'text/html', + 'Accept-Language' => "#{I18n.default_locale}, *;q=0.5", + 'User-Agent' => "#{Mastodon::Version.user_agent} Bot", + } + + @html = Request.new(:get, @url).add_headers(headers).perform do |res| next unless res.code == 200 && res.mime_type == 'text/html' # We follow redirects, and ideally we want to save the preview card for diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index d69b5af1412..23f92c816b8 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -4,7 +4,6 @@ class NotifyService < BaseService include Redisable MAXIMUM_GROUP_SPAN_HOURS = 12 - MAXIMUM_GROUP_GAP_TIME = 4.hours.to_i NON_EMAIL_TYPES = %i( admin.report @@ -217,9 +216,8 @@ class NotifyService < BaseService previous_bucket = redis.get(redis_key).to_i hour_bucket = previous_bucket if hour_bucket < previous_bucket + MAXIMUM_GROUP_SPAN_HOURS - # Do not track groups past a given inactivity time # We do not concern ourselves with race conditions since we use hour buckets - redis.set(redis_key, hour_bucket, ex: MAXIMUM_GROUP_GAP_TIME) + redis.set(redis_key, hour_bucket, ex: MAXIMUM_GROUP_SPAN_HOURS.hours.to_i) "#{type_prefix}-#{hour_bucket}" end diff --git a/app/services/report_service.rb b/app/services/report_service.rb index dea6df7b0a1..c95e216c790 100644 --- a/app/services/report_service.rb +++ b/app/services/report_service.rb @@ -10,6 +10,7 @@ class ReportService < BaseService @comment = options.delete(:comment).presence || '' @category = options[:rule_ids].present? ? 'violation' : (options.delete(:category).presence || 'other') @rule_ids = options.delete(:rule_ids).presence + @application = options.delete(:application).presence @options = options raise ActiveRecord::RecordNotFound if @target_account.unavailable? @@ -35,7 +36,8 @@ class ReportService < BaseService uri: @options[:uri], forwarded: forward_to_origin?, category: @category, - rule_ids: @rule_ids + rule_ids: @rule_ids, + application: @application ) end diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb index 078a0423f28..8a5863baba6 100644 --- a/app/services/resolve_account_service.rb +++ b/app/services/resolve_account_service.rb @@ -106,8 +106,6 @@ class ResolveAccountService < BaseService end def fetch_account! - return unless activitypub_ready? - with_redis_lock("resolve:#{@username}@#{@domain}") do @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url, suppress_errors: @options[:suppress_errors]) end @@ -122,12 +120,8 @@ class ResolveAccountService < BaseService @options[:skip_cache] || @account.nil? || @account.possibly_stale? end - def activitypub_ready? - ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(@webfinger.link('self', 'type')) - end - def actor_url - @actor_url ||= @webfinger.link('self', 'href') + @actor_url ||= @webfinger.self_link_href end def gone_from_origin? diff --git a/app/views/admin/instances/show.html.haml b/app/views/admin/instances/show.html.haml index d916203d0c6..c55eb89dc94 100644 --- a/app/views/admin/instances/show.html.haml +++ b/app/views/admin/instances/show.html.haml @@ -114,6 +114,16 @@ - if @instance.persisted? %hr.spacer/ + %h3= t('admin.instances.audit_log.title') + - if @action_logs.empty? + %p= t('accounts.nothing_here') + - else + .report-notes + = render partial: 'admin/action_logs/action_log', collection: @action_logs + = link_to t('admin.instances.audit_log.view_all'), admin_action_logs_path(target_domain: @instance.domain), class: 'button' + + %hr.spacer/ + %h3= t('admin.instances.availability.title') %p diff --git a/app/views/admin/reports/_header_details.html.haml b/app/views/admin/reports/_header_details.html.haml index 45790b9cd50..434231f7333 100644 --- a/app/views/admin/reports/_header_details.html.haml +++ b/app/views/admin/reports/_header_details.html.haml @@ -14,6 +14,12 @@ = admin_account_link_to report.account - else = report.account.domain + - if report.application.present? + .report-header__details__item + .report-header__details__item__header + %strong= t('admin.reports.reported_with_application') + .report-header__details__item__content + = report.application.name .report-header__details__item .report-header__details__item__header %strong= t('admin.reports.status') diff --git a/app/views/admin/roles/index.html.haml b/app/views/admin/roles/index.html.haml index 4f6c511b4fa..90a647cc8a8 100644 --- a/app/views/admin/roles/index.html.haml +++ b/app/views/admin/roles/index.html.haml @@ -8,10 +8,10 @@ %hr.spacer/ -.applications-list +.announcements-list = render partial: 'role', collection: @roles.select(&:everyone?) %hr.spacer/ -.applications-list +.announcements-list = render partial: 'role', collection: @roles.reject(&:everyone?) diff --git a/app/views/admin/statuses/index.html.haml b/app/views/admin/statuses/index.html.haml index 770d972d934..b03b8ac51b9 100644 --- a/app/views/admin/statuses/index.html.haml +++ b/app/views/admin/statuses/index.html.haml @@ -8,7 +8,7 @@ %strong= t('admin.statuses.media.title') %ul %li= filter_link_to t('generic.all'), media: nil, id: nil - %li= filter_link_to t('admin.statuses.with_media'), media: '1' + %li= filter_link_to t('admin.statuses.with_media'), media: true .back-link - if params[:report_id] = link_to admin_report_path(params[:report_id].to_i) do diff --git a/app/views/admin/tags/_tag.html.haml b/app/views/admin/tags/_tag.html.haml new file mode 100644 index 00000000000..322eee0407f --- /dev/null +++ b/app/views/admin/tags/_tag.html.haml @@ -0,0 +1,27 @@ +.batch-table__row{ class: [!tag.requires_review? && !tag.usable? && 'batch-table__row--muted'] } + .batch-table__row__content.batch-table__row__content--padded.pending-account + .pending-account__header + %strong + = link_to tag.formatted_name, admin_tag_path(tag.id) + + %br/ + + - if tag.usable? + = t('admin.tags.moderation.usable') + - else + = t('admin.tags.moderation.not_usable') + + · + - if tag.trendable? + = t('admin.tags.moderation.trendable') + - else + = t('admin.tags.moderation.not_trendable') + + - if tag.requested_review? || tag.requires_review? + · + - if tag.requested_review? + %span.negative-hint + = t('admin.tags.moderation.review_requested') + - else + %span.warning-hint + = t('admin.tags.moderation.pending_review') diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml new file mode 100644 index 00000000000..8d76d8ffa74 --- /dev/null +++ b/app/views/admin/tags/index.html.haml @@ -0,0 +1,39 @@ +- content_for :page_title do + = t('admin.tags.title') + += form_with url: admin_tags_url, method: :get, class: :simple_form do |form| + .filters + .filter-subset.filter-subset--with-select + %strong= t('admin.tags.moderation.title') + .input.select.optional + = form.select :status, + options_for_select(admin_tags_moderation_options, params[:status]), + prompt: t('generic.all') + + .filter-subset.filter-subset--with-select + %strong= t 'generic.order_by' + .input.select + = form.select :order, + options_for_select([[t('admin.tags.newest'), 'newest'], [t('admin.tags.oldest'), 'oldest']], params[:order]) + + .fields-group + .input.string.optional + = form.text_field :name, + value: params[:name], + class: 'string optional', + placeholder: t('admin.tags.name') + + .actions + %button.button= t('admin.tags.search') + = link_to t('admin.tags.reset'), admin_tags_path, class: 'button negative' + +%hr.spacer/ + +.batch-table + .batch-table__body + - if @tags.empty? + = nothing_here 'nothing-here--under-tabs' + - else + = render partial: 'tag', collection: @tags + += paginate @tags diff --git a/app/views/admin/tags/show.html.haml b/app/views/admin/tags/show.html.haml index f2d87b54b04..f6155575ae2 100644 --- a/app/views/admin/tags/show.html.haml +++ b/app/views/admin/tags/show.html.haml @@ -1,12 +1,13 @@ - content_for :page_title do - = "##{@tag.display_name}" + = @tag.formatted_name -- if current_user.can?(:view_dashboard) - - content_for :heading_actions do +- content_for :heading_actions do + - if current_user.can?(:view_dashboard) = l(@time_period.first) = ' - ' = l(@time_period.last) +- if current_user.can?(:view_dashboard) .dashboard .dashboard__item = react_admin_component :counter, diff --git a/app/views/admin/trends/tags/_tag.html.haml b/app/views/admin/trends/tags/_tag.html.haml index 8cc0d713b9e..b1e714a9124 100644 --- a/app/views/admin/trends/tags/_tag.html.haml +++ b/app/views/admin/trends/tags/_tag.html.haml @@ -4,9 +4,7 @@ .batch-table__row__content.pending-account .pending-account__header - = link_to admin_tag_path(tag.id) do - = material_symbol 'tag' - = tag.display_name + = link_to tag.formatted_name, admin_tag_path(tag.id) %br/ diff --git a/app/views/auth/registrations/_account_warning.html.haml b/app/views/auth/registrations/_account_warning.html.haml index 19e5746ff63..c51179b49da 100644 --- a/app/views/auth/registrations/_account_warning.html.haml +++ b/app/views/auth/registrations/_account_warning.html.haml @@ -1,14 +1,14 @@ -= link_to disputes_strike_path(account_warning), class: 'log-entry' do - .log-entry__header - .log-entry__avatar += link_to disputes_strike_path(account_warning), class: 'strike-entry' do + .strike-entry__header + .strike-entry__avatar .indicator-icon{ class: account_warning.overruled? ? 'success' : 'failure' } = fa_icon 'warning' - .log-entry__content - .log-entry__title + .strike-entry__content + .strike-entry__title = t 'disputes.strikes.title', action: t(account_warning.action, scope: 'disputes.strikes.title_actions'), date: l(account_warning.created_at.to_date) - .log-entry__timestamp + .strike-entry__timestamp %time.formatted{ datetime: account_warning.created_at.iso8601 }= l(account_warning.created_at) - if account_warning.overruled? diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index e7f1a595e53..0c0512e812f 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -11,8 +11,6 @@ - if storage_host? %link{ rel: 'dns-prefetch', href: storage_host }/ - %link{ rel: 'icon', href: favicon_path('ico') || '/favicon.ico', type: 'image/x-icon' }/ - - 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' }/ diff --git a/app/views/oauth/authorizations/new.html.haml b/app/views/oauth/authorizations/new.html.haml index c50c224cce6..d4563b2f01d 100644 --- a/app/views/oauth/authorizations/new.html.haml +++ b/app/views/oauth/authorizations/new.html.haml @@ -26,6 +26,8 @@ value: @pre_auth.client.uid = form.hidden_field :redirect_uri, value: @pre_auth.redirect_uri + = form.hidden_field :code_challenge, value: @pre_auth.code_challenge + = form.hidden_field :code_challenge_method, value: @pre_auth.code_challenge_method = form.hidden_field :state, value: @pre_auth.state = form.hidden_field :response_type, @@ -40,6 +42,8 @@ value: @pre_auth.client.uid = form.hidden_field :redirect_uri, value: @pre_auth.redirect_uri + = form.hidden_field :code_challenge, value: @pre_auth.code_challenge + = form.hidden_field :code_challenge_method, value: @pre_auth.code_challenge_method = form.hidden_field :state, value: @pre_auth.state = form.hidden_field :response_type, diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index e89e015b298..f34ce4a6aa5 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -56,6 +56,7 @@ = ff.input :'web.auto_play', wrapper: :with_label, recommended: true, label: I18n.t('simple_form.labels.defaults.setting_auto_play_gif') = ff.input :'web.reduce_motion', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_reduce_motion') = ff.input :'web.disable_swiping', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_swiping') + = ff.input :'web.disable_hover_cards', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_hover_cards') = ff.input :'web.use_system_font', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_system_font_ui') %h4= t 'appearance.discovery' diff --git a/app/views/statuses_cleanup/show.html.haml b/app/views/statuses_cleanup/show.html.haml index 07e833537ec..78ed6a4fc4e 100644 --- a/app/views/statuses_cleanup/show.html.haml +++ b/app/views/statuses_cleanup/show.html.haml @@ -14,6 +14,7 @@ wrapper: :with_label .fields-row__column.fields-row__column-6.fields-group = f.input :min_status_age, + disabled: !@policy.enabled?, collection: AccountStatusesCleanupPolicy::ALLOWED_MIN_STATUS_AGE.map(&:to_i), hint: false, include_blank: false, @@ -28,11 +29,13 @@ .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :keep_pinned, + disabled: !@policy.enabled?, hint: t('statuses_cleanup.keep_pinned_hint'), label: t('statuses_cleanup.keep_pinned'), wrapper: :with_label .fields-row__column.fields-row__column-6.fields-group = f.input :keep_direct, + disabled: !@policy.enabled?, hint: t('statuses_cleanup.keep_direct_hint'), label: t('statuses_cleanup.keep_direct'), wrapper: :with_label @@ -40,11 +43,13 @@ .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :keep_self_fav, + disabled: !@policy.enabled?, hint: t('statuses_cleanup.keep_self_fav_hint'), label: t('statuses_cleanup.keep_self_fav'), wrapper: :with_label .fields-row__column.fields-row__column-6.fields-group = f.input :keep_self_bookmark, + disabled: !@policy.enabled?, hint: t('statuses_cleanup.keep_self_bookmark_hint'), label: t('statuses_cleanup.keep_self_bookmark'), wrapper: :with_label @@ -52,11 +57,13 @@ .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :keep_polls, + disabled: !@policy.enabled?, hint: t('statuses_cleanup.keep_polls_hint'), label: t('statuses_cleanup.keep_polls'), wrapper: :with_label .fields-row__column.fields-row__column-6.fields-group = f.input :keep_media, + disabled: !@policy.enabled?, hint: t('statuses_cleanup.keep_media_hint'), label: t('statuses_cleanup.keep_media'), wrapper: :with_label @@ -66,12 +73,14 @@ .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :min_favs, + disabled: !@policy.enabled?, hint: t('statuses_cleanup.min_favs_hint'), input_html: { min: 1, placeholder: t('statuses_cleanup.ignore_favs') }, label: t('statuses_cleanup.min_favs'), wrapper: :with_label .fields-row__column.fields-row__column-6.fields-group = f.input :min_reblogs, + disabled: !@policy.enabled?, hint: t('statuses_cleanup.min_reblogs_hint'), input_html: { min: 1, placeholder: t('statuses_cleanup.ignore_reblogs') }, label: t('statuses_cleanup.min_reblogs'), diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb index 74abc237018..9f58d9225b3 100644 --- a/app/workers/scheduler/user_cleanup_scheduler.rb +++ b/app/workers/scheduler/user_cleanup_scheduler.rb @@ -16,7 +16,7 @@ class Scheduler::UserCleanupScheduler private def clean_unconfirmed_accounts! - User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch| + User.unconfirmed.where(confirmation_sent_at: ..UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch| # We have to do it separately because of missing database constraints AccountModerationNote.where(target_account_id: batch.map(&:account_id)).delete_all Account.where(id: batch.map(&:account_id)).delete_all diff --git a/babel.config.js b/babel.config.js index 9ced748a961..4c2fe5682bb 100644 --- a/babel.config.js +++ b/babel.config.js @@ -68,7 +68,7 @@ module.exports = (api) => { plugins, overrides: [ { - test: /tesseract\.js/, + test: [/tesseract\.js/, /fuzzysort\.js/], presets: [ ['@babel/env', { ...envOptions, modules: 'commonjs' }], ], diff --git a/bin/flatware b/bin/flatware new file mode 100755 index 00000000000..337ce9277e4 --- /dev/null +++ b/bin/flatware @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'flatware' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("flatware", "flatware") diff --git a/config/application.rb b/config/application.rb index 65407da05c9..3c62a492289 100644 --- a/config/application.rb +++ b/config/application.rb @@ -49,6 +49,7 @@ 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/stoplight/redis_data_store_extensions' require_relative '../lib/active_record/database_tasks_extensions' require_relative '../lib/active_record/batches' require_relative '../lib/active_record/with_recursive' @@ -117,6 +118,7 @@ module Mastodon Doorkeeper::Application.include ApplicationExtension Doorkeeper::AccessGrant.include AccessGrantExtension Doorkeeper::AccessToken.include AccessTokenExtension + Doorkeeper::OAuth::PreAuthorization.include OauthPreAuthorizationExtension Devise::FailureApp.include AbstractController::Callbacks Devise::FailureApp.include Localized end diff --git a/config/imagemagick/policy.xml b/config/imagemagick/policy.xml index 2730a9f84e3..e2aa202f274 100644 --- a/config/imagemagick/policy.xml +++ b/config/imagemagick/policy.xml @@ -23,5 +23,5 @@ - + diff --git a/config/initializers/i18n.rb b/config/initializers/i18n.rb index 8643060fa66..5e8d3a545e7 100644 --- a/config/initializers/i18n.rb +++ b/config/initializers/i18n.rb @@ -41,6 +41,7 @@ Rails.application.configure do :hr, :hu, :hy, + :ia, :id, :ie, :ig, diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 53b02edc402..5b2f317bf2e 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -5,6 +5,23 @@ require_relative '../../lib/mastodon/sidekiq_middleware' Sidekiq.configure_server do |config| config.redis = REDIS_SIDEKIQ_PARAMS + # This is used in Kubernetes setups, to signal that the Sidekiq process has started and will begin processing jobs + # This comes from https://github.com/sidekiq/sidekiq/wiki/Kubernetes#sidekiq + ready_filename = ENV.fetch('MASTODON_SIDEKIQ_READY_FILENAME', nil) + if ready_filename + raise 'MASTODON_SIDEKIQ_READY_FILENAME is not a valid filename' if File.basename(ready_filename) != ready_filename + + ready_path = Rails.root.join('tmp', ready_filename) + + config.on(:startup) do + FileUtils.touch(ready_path) + end + + config.on(:shutdown) do + FileUtils.rm_f(ready_path) + end + end + config.server_middleware do |chain| chain.add Mastodon::SidekiqMiddleware end diff --git a/config/initializers/statsd.rb b/config/initializers/statsd.rb index a655c107165..f1628a9d12c 100644 --- a/config/initializers/statsd.rb +++ b/config/initializers/statsd.rb @@ -3,13 +3,17 @@ if ENV['STATSD_ADDR'].present? host, port = ENV['STATSD_ADDR'].split(':') - statsd = Statsd.new(host, port) - statsd.namespace = ENV.fetch('STATSD_NAMESPACE') { ['Mastodon', Rails.env].join('.') } + begin + statsd = Statsd.new(host, port) + statsd.namespace = ENV.fetch('STATSD_NAMESPACE') { ['Mastodon', Rails.env].join('.') } - NSA.inform_statsd(statsd) do |informant| - informant.collect(:action_controller, :web) - informant.collect(:active_record, :db) - informant.collect(:active_support_cache, :cache) - informant.collect(:sidekiq, :sidekiq) if ENV['STATSD_SIDEKIQ'] == 'true' + NSA.inform_statsd(statsd) do |informant| + informant.collect(:action_controller, :web) + informant.collect(:active_record, :db) + informant.collect(:active_support_cache, :cache) + informant.collect(:sidekiq, :sidekiq) if ENV['STATSD_SIDEKIQ'] == 'true' + end + rescue + Rails.logger.warn("statsd address #{ENV['STATSD_ADDR']} not reachable, proceeding without statsd") end end diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb index 9ca4eb0da9a..b932e97e2fa 100644 --- a/config/initializers/twitter_regex.rb +++ b/config/initializers/twitter_regex.rb @@ -9,7 +9,7 @@ module Twitter::TwitterText class Regex REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}<>()?]/iou - REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}()?!*"'「」<>;:=,.$%\[\]~&|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou + REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}()?!*"'「」<>;:=,.$%\[\]~&|]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou REGEXEN[:valid_url_balanced_parens] = / \( (?: diff --git a/config/initializers/vapid.rb b/config/initializers/vapid.rb index 7dd870c8b7d..551ede34fb9 100644 --- a/config/initializers/vapid.rb +++ b/config/initializers/vapid.rb @@ -5,7 +5,7 @@ Rails.application.configure do # You should only generate this once per instance. If you later decide to change it, all push subscription will # be invalidated, requiring the users to access the website again to resubscribe. # - # Generate with `rake mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web rake mastodon:webpush:generate_vapid_key` if you use docker compose) + # Generate with `bundle exec rails mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web bundle exec rails mastodon:webpush:generate_vapid_key` if you use docker compose) # # For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html diff --git a/config/initializers/vips.rb b/config/initializers/vips.rb index 25a17b2a171..a539d7035c4 100644 --- a/config/initializers/vips.rb +++ b/config/initializers/vips.rb @@ -5,7 +5,11 @@ if Rails.configuration.x.use_vips require 'vips' - abort('Incompatible libvips version, please install libvips >= 8.13') unless Vips.at_least_libvips?(8, 13) + unless Vips.at_least_libvips?(8, 13) + abort <<~ERROR.squish + Incompatible libvips version (#{Vips.version_string}), please install libvips >= 8.13 + ERROR + end Vips.block('VipsForeign', true) @@ -25,3 +29,11 @@ if Rails.configuration.x.use_vips Vips.block_untrusted(true) end + +# In some places of the code, we rescue this exception, but we don't always +# load libvips, so it may be an undefined constant: +unless defined?(Vips) + module Vips + class Error < StandardError; end + end +end diff --git a/config/locales/activerecord.ast.yml b/config/locales/activerecord.ast.yml index 2d532071a9b..d139a325704 100644 --- a/config/locales/activerecord.ast.yml +++ b/config/locales/activerecord.ast.yml @@ -18,7 +18,7 @@ ast: account: attributes: username: - invalid: ha contener namás lletres, númberos ya guiones baxos + invalid: ha contener namás lletres, númberos y guiones baxos reserved: ta acutáu admin/webhook: attributes: diff --git a/config/locales/activerecord.el.yml b/config/locales/activerecord.el.yml index 01e9a75f98e..1c3bcc6ebf5 100644 --- a/config/locales/activerecord.el.yml +++ b/config/locales/activerecord.el.yml @@ -36,14 +36,14 @@ el: status: attributes: reblog: - taken: της κατάστασης ήδη υπάρχει + taken: της ανάρτησης υπάρχει ήδη user: attributes: email: blocked: χρησιμοποιεί μη επιτρεπόμενο πάροχο e-mail unreachable: δεν φαίνεται να υπάρχει role_id: - elevated: δεν μπορεί να είναι μεγαλύτερο από τον τρέχοντα ρόλο σας + elevated: δεν μπορεί να είναι υψηλότερο από τον τρέχοντα ρόλο σου user_role: attributes: permissions_as_keys: diff --git a/config/locales/activerecord.fi.yml b/config/locales/activerecord.fi.yml index feb4fbf4c58..9da69b7dbd0 100644 --- a/config/locales/activerecord.fi.yml +++ b/config/locales/activerecord.fi.yml @@ -28,7 +28,7 @@ fi: doorkeeper/application: attributes: website: - invalid: ei ole kelvollinen verkko-osoite + invalid: ei ole kelvollinen URL-osoite import: attributes: data: @@ -40,15 +40,15 @@ fi: user: attributes: email: - blocked: käyttää kiellettyä sähköpostipalvelun tarjoajaa + blocked: käyttää kiellettyä sähköpostipalveluntarjoajaa unreachable: ei näytä olevan olemassa role_id: elevated: ei voi olla korkeampi kuin nykyinen roolisi user_role: attributes: permissions_as_keys: - dangerous: sisältää oikeuksia, jotka eivät ole turvallisia perusroolille - elevated: ei voi sisältää oikeuksia, joita nykyisellä roolillasi ei ole + dangerous: sisällytä käyttöoikeuksia, jotka eivät ole turvallisia perusroolille + elevated: ei voi sisältää käyttöoikeuksia, joita nykyisellä roolillasi ei ole own_role: ei voi muuttaa nykyisellä roolillasi position: elevated: ei voi olla korkeampi kuin nykyinen roolisi diff --git a/config/locales/activerecord.ga.yml b/config/locales/activerecord.ga.yml index 236cc479e17..1b61edb2e2f 100644 --- a/config/locales/activerecord.ga.yml +++ b/config/locales/activerecord.ga.yml @@ -19,8 +19,41 @@ ga: account: attributes: username: + invalid: ní mór go mbeadh litreacha, uimhreacha agus pointí béime amháin reserved: in áirithe + admin/webhook: + attributes: + url: + invalid: nach URL bailí é + doorkeeper/application: + attributes: + website: + invalid: nach URL bailí é import: attributes: data: malformed: míchumtha + status: + attributes: + reblog: + taken: den phost cheana féin + user: + attributes: + email: + blocked: úsáideann soláthraí ríomhphoist dícheadaithe + unreachable: ní cosúil go bhfuil sé ann + role_id: + elevated: ní féidir leat a bheith níos airde ná do ról reatha + user_role: + attributes: + permissions_as_keys: + dangerous: cuir san áireamh ceadanna nach bhfuil sábháilte don ról bunúsach + elevated: ní féidir ceadanna nach bhfuil ag do ról reatha a áireamh + own_role: ní féidir é a athrú le do ról reatha + position: + elevated: ní féidir leat a bheith níos airde ná do ról reatha + own_role: ní féidir é a athrú le do ról reatha + webhook: + attributes: + events: + invalid_permissions: ní féidir imeachtaí nach bhfuil na cearta agat ina leith a chur san áireamh diff --git a/config/locales/activerecord.kab.yml b/config/locales/activerecord.kab.yml index b3ca90069b5..8cdc6501cbb 100644 --- a/config/locales/activerecord.kab.yml +++ b/config/locales/activerecord.kab.yml @@ -21,6 +21,18 @@ kab: username: invalid: ilaq ad ilin isekkilen, uṭṭunen d yijerriden n wadda kan reserved: yettwaṭṭef + admin/webhook: + attributes: + url: + invalid: mačči d URL ameɣtu + doorkeeper/application: + attributes: + website: + invalid: mačči d URL ameɣtu + import: + attributes: + data: + malformed: yir amsal status: attributes: reblog: @@ -28,4 +40,20 @@ kab: user: attributes: email: + blocked: isseqdac asaǧǧaw n yimayl ur yettusirgen ara unreachable: ur d-ttban ara d akken yella + role_id: + elevated: ur yezmir ara ad iεeddi tamlilt-ik tamirant + user_role: + attributes: + permissions_as_keys: + dangerous: deg-s tisirag tiriɣelsanin i temlilt tazadurt + elevated: ur yezmir ara ad yesεu tirirag ur nelli ara deg temlilit-ik tamirant + own_role: ur yezmir ara ad yettwabeddel s temlilt-ik tamirant + position: + elevated: ur yezmir ara ad iεeddi tamlilt-ik tamirant + own_role: ur yezmir ara ad yettwabeddel s temlilt-ik tamirant + webhook: + attributes: + events: + invalid_permissions: ur yezmir ara ad yesεu tidyanin iwumi ur tesεiḍ ara tisirag diff --git a/config/locales/activerecord.sc.yml b/config/locales/activerecord.sc.yml index aadd00287f5..cd474ea542c 100644 --- a/config/locales/activerecord.sc.yml +++ b/config/locales/activerecord.sc.yml @@ -24,7 +24,7 @@ sc: status: attributes: reblog: - taken: de s'istadu esistet giai + taken: de sa publicatzione esistet giai user: attributes: email: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 2ca7538c324..4df24c984c0 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1762,6 +1762,10 @@ ar: webauthn_authentication: مفاتيح الأمان severed_relationships: download: تنزيل (%{count}) + lost_followers: المتابعون المفقودون + lost_follows: المتابعات المفقودة + preamble: بحجبكم اسم نطاق قد تخسرون متابَعاتٍ، و كذلك إذا قرّر مديرو الخادوم حظر خادوم ما. و في هذه الحالات يكون بوسعكم تنزيل قائمة بالصلات المبتورة لمعاينتها، مع القدرة على استيرادها إلى خادوم آخر. + purged: حذف مدير خادومكم المعلومات عن هذا الخادوم. statuses: attached: audio: @@ -1978,6 +1982,7 @@ ar: edit_profile_title: قم بتخصيص ملفك التعريفي explanation: ها هي بعض النصائح قبل بداية الاستخدام feature_action: اعرف المزيد + feature_audience: يتيح لكم مًستُدون إدارة جمهوركم بلا وسطاء. فبتنصيب و تشغيل مَستُودون على بنيتكم التحتية تمكنكم متابعة مستخدمي مَستُدون من أيّ خادوم،كما يمكنهم متابعتكم، بلا تحكُّم من أي طرف ثالث. feature_audience_title: اِبنوا جُمهورَكم بِثِقَة feature_control: أنتم الأدرى بالمحتوى الذي تريدون أن تطالعوه في فيض المنشورات الرئيس. لا خوارزميات تتحكم فيما يظهر لكم ولا إعلانات تضيع وقتكم. بحساب واحد تمكنكم متابعة من تشاؤون على أيّ خادوم ماستدون، وتلقّى منشوراتهم بترتيبها الزمني، لتصنعوا ركنكم الأليف في الإنترنت. feature_control_title: تحكَّموا في فيض المنشورات الخاص بكم diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 9e6ec6d2330..567e5357ebc 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -1,7 +1,7 @@ --- ast: about: - about_mastodon_html: 'La rede social del futuru: ¡ensin anuncios nin vixilancia, con un diseñu éticu ya descentralizáu! Controla los tos datos con Mastodon.' + about_mastodon_html: 'La rede social del futuru: ¡ensin anuncios nin vixilancia, con un diseñu éticu y descentralizáu! Controla los tos datos con Mastodon.' contact_unavailable: N/D hosted_on: 'Mastodon ta agospiáu en: %{domain}' title: Tocante a @@ -45,11 +45,12 @@ ast: title: Moderación most_recent_activity: L'actividá más recién most_recent_ip: La IP más recién + no_limits_imposed: S'impunxo nenguna llende perform_full_suspension: Suspender protocol: Protocolu rejected_msg: Refugóse correutamente la solicitú de rexistru de «%{username}» resend_confirmation: - already_confirmed: Esti perfil xá ta confirmáu + already_confirmed: Esti perfil yá ta confirmáu role: Rol search: Buscar search_same_email_domain: Otros perfiles col mesmu dominiu de corréu electrónicu @@ -125,7 +126,7 @@ ast: no_emoji_selected: Nun camudó nengún fustaxe darréu que nun se seleicionó nengún not_permitted: Nun tienes permisu pa facer esta aición shortcode: Códigu curtiu - shortcode_hint: De 2 caráuteres como muncho, namás caráuteres alfanumbéricos ya guiones baxos + shortcode_hint: De 2 caráuteres como muncho, namás caráuteres alfanumbéricos y guiones baxos title: Fustaxes personalizaos uncategorized: Ensin categoría update_failed_msg: Nun se pudo anovar esi fustaxe @@ -176,7 +177,7 @@ ast: export_domain_allows: no_file: Nun se seleicionó nengún ficheru follow_recommendations: - description_html: "La recomendación de cuentes ayuda a que los perfiles nuevos atopen aína conteníu interesante. Cuando una cuenta nun interactuó abondo con otros perfiles como pa formar recomendaciones personalizaes, estes cuentes van ser les que se recomienden. Recalcúlense caldía a partir d'un mecíu de cuentes con más actividá recién ya mayor númberu de siguidores llocales pa una llingua determinada." + description_html: "La recomendación de cuentes ayuda a que los perfiles nuevos atopen aína conteníu interesante. Cuando una cuenta nun interactuó abondo con otros perfiles como pa formar recomendaciones personalizaes, estes cuentes van ser les que se recomienden. Recalcúlense caldía a partir d'un mecíu de cuentes con más actividá recién y mayor númberu de siguidores llocales pa una llingua determinada." language: Pa la llingua status: Estáu title: Recomendación de cuentes @@ -240,7 +241,7 @@ ast: one: "%{count} nota" other: "%{count} notes" actions: - silence_description_html: La cuenta va ser visible namás pa quien xá la siguiere o la buscare manualmente, lo que llenda'l so algame. Esta decisión pue desfacese en cualesquier momentu. Si escueyes esta opción, zárrense tolos informes escontra esta cuenta. + silence_description_html: La cuenta va ser visible namás pa quien yá la siguiere o la buscare manualmente, lo que llenda'l so algame. Esta decisión pue desfacese en cualesquier momentu. Si escueyes esta opción, zárrense tolos informes escontra esta cuenta. actions_description_html: Decidi qué aición tomar pa resolver esti informe. Si tomes una aición punitiva escontra la cuenta de la que s'informó, va unviase un avisu per corréu electrónicu a esa cuenta, esceuto cuando se seleiciona la categoría Puxarra. add_to_report: Amestar más al informe are_you_sure: "¿De xuru que quies facer esta aición?" @@ -314,7 +315,7 @@ ast: preamble: Personaliza la interfaz web de Mastodon. title: Aspeutu branding: - preamble: La marca del to sirvidor estrémalu d'otros sirvidores de la rede. Ye posible qu'esta información apaeza nuna variedá d'entornos, como la interfaz web de Mastodon, les aplicaciones natives, nes previsualizaciones de los enllaces d'otros sitios web, dientro de les aplicaciones de mensaxería, etc. Por esti motivu, lo meyor ye qu'esta información seya clara, curtia ya concisa. + preamble: La marca del to sirvidor estrémalu d'otros sirvidores de la rede. Ye posible qu'esta información apaeza nuna variedá d'entornos, como la interfaz web de Mastodon, les aplicaciones natives, nes previsualizaciones de los enllaces d'otros sitios web, dientro de les aplicaciones de mensaxería, etc. Por esti motivu, lo meyor ye qu'esta información seya clara, curtia y concisa. title: Marca content_retention: preamble: Controla cómo s'atroxa'l conteníu xeneráu polos perfiles en Mastodon. @@ -438,8 +439,8 @@ ast: empty: Nun tienes nengún nomatu. appearance: advanced_web_interface: Interfaz web avanzada - advanced_web_interface_hint: 'Si quies asegúrate de que s''use tol llargor de la pantalla, la interfaz web avanzada permítete configurar columnes estremaes pa ver muncha más información al empar: Aniciu, avisos, llinia de tiempu federada ya cualesquier cantidá de llistes ya etiquetes.' - animations_and_accessibility: Animaciones ya accesibilidá + advanced_web_interface_hint: 'Si quies asegúrate de que s''use tol llargor de la pantalla, la interfaz web avanzada permítete configurar columnes estremaes pa ver muncha más información al empar: Aniciu, avisos, llinia de tiempu federada y cualesquier cantidá de llistes y etiquetes.' + animations_and_accessibility: Animaciones y accesibilidá confirmation_dialogs: Diálogos de confirmación discovery: Descubrimientu localization: @@ -470,7 +471,7 @@ ast: logout: Zarrar la sesión migrate_account: Cambéu de cuenta migrate_account_html: Si quies redirixir esta cuenta a otra diferente, pues configurar esta opción equí. - privacy_policy_agreement_html: Lleí ya acepto la política de privacidá + privacy_policy_agreement_html: Lleí y acepto la política de privacidá providers: cas: CAS saml: SAML @@ -491,7 +492,7 @@ ast: status: account_status: Estáu de la cuenta functional: La cuenta ta completamente operativa. - pending: La to solicitú ta pendiente de que la revise'l nuesu personal ya ye posible que tarde tiempu. Vas recibir un mensaxe si s'aprueba. + pending: La to solicitú ta pendiente de que la revise'l nuesu personal y ye posible que tarde tiempu. Vas recibir un mensaxe si s'aprueba. too_fast: El formulariu xubióse mui rápido, volvi tentalo. challenge: confirm: Siguir @@ -536,7 +537,7 @@ ast: recipient: Dirixóse a reject_appeal: Refugar l'apellación status: 'Artículu #%{id}' - status_removed: L'artículu xá se quitó del sistema + status_removed: L'artículu yá se quitó del sistema your_appeal_approved: Aprobóse la to apellación your_appeal_pending: Unviesti una apellación your_appeal_rejected: Refugóse la to apellación @@ -548,7 +549,7 @@ ast: '403': Nun tienes permisu pa ver esta páxina. '404': La páxina que busques nun ta equí. '406': Esta páxina nun ta disponible nel formatu solicitáu. - '410': La páxina que busques xá nun esiste. + '410': La páxina que busques yá nun esiste. '422': content: La verificación de seguranza falló. ¿Tas bloquiando les cookies? title: La verificación de seguranza falló @@ -561,7 +562,7 @@ ast: exports: archive_takeout: date: Data - hint_html: Pues solicitar un archivu colos tos artículos ya ficheros xubíos. Los datos esportaos van tar nel formatu ActivityPub, llexible pa cualesquier software que seya compatible. Pues solicitar un archivu cada 7 díes. + hint_html: Pues solicitar un archivu colos tos artículos y ficheros xubíos. Los datos esportaos van tar nel formatu ActivityPub, llexible pa cualesquier software que seya compatible. Pues solicitar un archivu cada 7 díes. in_progress: Compilando l'archivu... request: Solicitar l'archivu size: Tamañu @@ -576,7 +577,7 @@ ast: filters: contexts: account: Perfiles - home: Aniciu ya llistes + home: Aniciu y llistes notifications: Avisos public: Llinies de tiempu públiques thread: Conversaciones @@ -617,7 +618,7 @@ ast: over_rows_processing_limit: contién más de %{count} fileres modes: merge: Mecíu - merge_long: Caltién los rexistros esistentes ya amiesta otros nuevos + merge_long: Caltién los rexistros esistentes y amiesta otros nuevos overwrite: Sobrescritura overwrite_long: Troca los rexistros actuales por otros nuevos preface: Pues importar los datos qu'esportares dende otru sirvidor, como la llista de perfiles bloquiaos o que sigas. @@ -645,7 +646,7 @@ ast: max_uses: one: 1 usu other: "%{count} usos" - prompt: Xenera ya comparti enllaces con otres persones pa conceder l'accesu a esti sirvidor + prompt: Xenera y comparti enllaces con otres persones pa conceder l'accesu a esti sirvidor table: expires_at: Data de caducidá uses: Usos @@ -657,7 +658,7 @@ ast: successful_sign_in_html: Anicióse correutamente la sesión col métodu «%{method}» dende %{ip} (%{browser}) media_attachments: validations: - images_and_video: Nun se pue axuntar nengún videu a un artículu que xá contién imáxenes + images_and_video: Nun se pue axuntar nengún videu a un artículu que yá contién imáxenes too_many: Nun se puen axuntar más de 4 ficheros migrations: errors: @@ -707,16 +708,16 @@ ast: description_html: Si actives l'autenticación en dos pasos con una aplicación autenticadora, al aniciar la sesión va ser obligatorio que tengas el teléfonu a mano, preséu que xenera los pases que tienes d'introducir. enable: Activar instructions_html: "Escania esti códigu QR con Google Authenticator o otra aplicación asemeyada nel móvil. Dende agora, esa aplicación va xenerar los pases que tienes d'introducir cuando anicies la sesión." - manual_instructions: 'Si nun pues escaniar el códigu QR ya tienes d''introducilu manualmente, equí tienes el secretu en testu ensin formatu:' + manual_instructions: 'Si nun pues escaniar el códigu QR y tienes d''introducilu manualmente, equí tienes el secretu en testu ensin formatu:' setup: Configurar - wrong_code: "¡El códigu introducíu nun yera válidu! ¿La hora del sirvidor ya la del preséu son correutes?" + wrong_code: "¡El códigu introducíu nun yera válidu! ¿La hora del sirvidor y la del preséu son correutes?" pagination: next: Siguiente truncate: "…" polls: errors: - already_voted: Xá votesti nesta encuesta - expired: La encuesta xá finó + already_voted: Yá votesti nesta encuesta + expired: La encuesta yá finó invalid_choice: La opción de votu escoyida nun esiste too_many_options: nun pue contener más de %{max} elementos preferences: @@ -724,13 +725,13 @@ ast: posting_defaults: Configuración predeterminada del espublizamientu d'artículos public_timelines: Llinies de tiempu públiques privacy: - hint_html: "Personaliza cómo quies s'atope esti perfil ya los sos artículos. Hai una variedá de funciones de Mastodon que puen ayudate a algamar audiencies más grandes cuando s'activen. Dedica un momentu pa revisar estes opciones y asegurate de que s'axusten al to casu." + hint_html: "Personaliza cómo quies que s'atope esti perfil y los sos artículos. Hai una variedá de funciones de Mastodon que puen ayudate a algamar audiencies más grandes cuando s'activen. Dedica un momentu pa revisar estes opciones y asegurate de que s'axusten al to casu." privacy: Privacidá reach: Algame - reach_hint_html: Controla si quies que te descubran ya te sigan perfiles nuevos. ¿Quies que los tos artículos apaezan na pantalla «Esploración»? ¿Quies qu'otres persones te vean na recomendación de cuentes? ¿Quies aceptar toles solicitúes de siguimientu automáticamente o tener un control minuciosu de caúna? + reach_hint_html: Controla si quies que te descubran y te sigan perfiles nuevos. ¿Quies que los tos artículos apaezan na pantalla «Esploración»? ¿Quies qu'otres persones te vean na recomendación de cuentes? ¿Quies aceptar toles solicitúes de siguimientu automáticamente o tener un control minuciosu de caúna? search: Busca search_hint_html: Controla cómo quies que t'atopen. ¿Quies que la xente t'atope polo qu'espublices públicamente? ¿Quies que la xente fuera de Mástodon atope esti perfil cuando busque na web? Ten en cuenta que nun se pue garantizar la esclusión total de tolos motores de busca. - title: Privacidá ya algame + title: Privacidá y algame privacy_policy: title: Política de privacidá relationships: @@ -797,11 +798,11 @@ ast: export: Esportación de datos featured_tags: Etiquetes destacaes import: Importación - import_and_export: Importación ya esportación + import_and_export: Importación y esportación migrate: Migración de la cuenta preferences: Preferencies profile: Perfil públicu - relationships: Perfiles que sigues ya te siguen + relationships: Perfiles que sigues y te siguen statuses_cleanup: Desaniciu automáticu d'artículos two_factor_authentication: Autenticación en dos pasos webauthn_authentication: Llaves de seguranza @@ -822,7 +823,7 @@ ast: open_in_web: Abrir na web pin_errors: direct: Nun se puen fixar los artículos que son visibles namás pa los usuarios mentaos - limit: Xá fixesti'l númberu máximu d'artículos + limit: Yá fixesti'l númberu máximu d'artículos ownership: Nun se pue fixar l'artículu d'otru perfil reblog: Nun se pue fixar un artículu compartíu poll: @@ -877,15 +878,15 @@ ast: webauthn: Llaves de seguranza user_mailer: suspicious_sign_in: - explanation: Detectemos un aniciu de sesión a la to cuenta dende una direición IP nueva. + explanation: Detectemos un aniciu de sesión na to cuenta dende una direición IP nueva. subject: Accedióse a la to cuenta dende una direición IP nueva warning: appeal: Unviar una apellación appeal_description: Si te paez que ye un error, pues unviar una apellación al personal de %{instance}. explanation: - disable: Xá nun pues usar la cuenta mas el perfil ya otros datos siguen intautos. Pues solicitar una copia de seguranza de los datos, camudar la configuración de la cuenta o desaniciar la cuenta. - silence: Pues siguir usando la cuenta mas namás vas ver los artículos de los perfiles que xá siguieres nesti sirvidor ya ye posible que se t'escluya de dalgunes funciones de descubrimientu. Por embargu, otros perfiles entá puen siguite manualmente. - suspend: Xá nun pues usar la cuenta nin se pue acceder a los datos del to perfil. Pues aniciar la sesión pa pidir una copia de seguranza de los tos datos hasta que se desanicien en 30 díes, mas vamos caltener dalgunos datos básicos pa evitar que te saltes la suspensión. + disable: Yá nun pues usar la cuenta mas el perfil y otros datos siguen intautos. Pues solicitar una copia de seguranza de los datos, camudar la configuración de la cuenta o desaniciar la cuenta. + silence: Pues siguir usando la cuenta mas namás vas ver los artículos de los perfiles que yá siguieres nesti sirvidor y ye posible que se t'escluya de dalgunes funciones de descubrimientu. Por embargu, otros perfiles entá puen siguite manualmente. + suspend: Yá nun pues usar la cuenta nin se pue acceder a los datos del to perfil. Pues aniciar la sesión pa pidir una copia de seguranza de los tos datos hasta que se desanicien en 30 díes, mas vamos caltener dalgunos datos básicos pa evitar que te saltes la suspensión. reason: 'Motivu:' statuses: 'Artículos citaos:' subject: @@ -896,14 +897,27 @@ ast: none: Alvertencia suspend: Cuenta suspendida welcome: + apps_title: Aplicaciones de Mastodon + edit_profile_title: Personalización del perfil explanation: Equí tienes dalgunos conseyos pa que comiences + feature_action: Saber más + follows_title: A quién siguir + follows_view_more: Ver más perfiles a los que siguir + hashtags_recent_count: + one: "%{people} persona nos últimos 2 díes" + other: "%{people} persones nos últimos 2 díes" + hashtags_subtitle: Esplora qué ta en tendencia dende hai 2 díes + hashtags_title: Etiquetes en tendencia + hashtags_view_more: Ver más etiquetes en tendencia + post_step: Saluda al mundu con semeyes, vídeos, testu o encuestes. + sign_in_action: Aniciar la sesión subject: Afáyate en Mastodon title: "¡Afáyate, %{name}!" users: follow_limit_reached: Nun pues siguir a más de %{limit} persones invalid_otp_token: El códigu de l'autenticación en dos pasos nun ye válidu rate_limited: Fixéronse milenta intentos d'autenticación. Volvi tentalo dempués. - seamless_external_login: Aniciesti la sesión pente un serviciu esternu, polo que la configuración de la contraseña ya de la direición de corréu electrónicu nun tán disponibles. + seamless_external_login: Aniciesti la sesión pente un serviciu esternu, polo que la configuración de la contraseña y de la direición de corréu electrónicu nun tán disponibles. signed_in_as: 'Aniciesti la sesión como:' verification: verification: Verificación diff --git a/config/locales/be.yml b/config/locales/be.yml index a14ba3d2243..2e3d6558dcd 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -232,6 +232,7 @@ be: update_custom_emoji: Абнавіць адвольныя эмодзі update_domain_block: Актуалізаваць блакіроўку дамена update_ip_block: Абнавіць IP правіла + update_report: Абнавіць скаргу update_status: Абнавіць допіс update_user_role: Абнавіць ролю actions: @@ -299,6 +300,7 @@ be: filter_by_action: Фільтраваць па дзеянню filter_by_user: Адфільтраваць па карыстальніку title: Аўдыт + unavailable_instance: "(імя дамена недаступнае)" announcements: destroyed_msg: Аб'ява паспяхова выдалена! edit: @@ -485,6 +487,9 @@ be: title: Рэкамендацыі падпісак unsuppress: Аднавіць рэкамендацыі падпісак instances: + audit_log: + title: Нядаўнія журналы аўдыту + view_all: Праглядзець поўныя журналы аўдыту availability: description_html: few: Калі дастаўка на дамен не атрымоўваецца праз %{count} іншыя дні, далейшыя спробы дастаўкі не будуць зроблены, пакуль не будзе атрымана дастаўка з дамена. @@ -661,6 +666,7 @@ be: report: 'Скарга #%{id}' reported_account: Уліковы запіс парушальніка reported_by: Адпраўнік скаргі + reported_with_application: Паведамлена праз праграму resolved: Вырашана resolved_msg: Скарга была паспяхова вырашана! skip_to_actions: Прапусціць дзеянні @@ -907,7 +913,23 @@ be: action: Для падрабязнасцей націсніце тут message_html: "Ваша сховішча не наладжана. Прыватнасць карыстальнікаў пад пагрозай." tags: + moderation: + not_trendable: Не ў трэндзе + not_usable: Непрыгодныя + pending_review: Чакае праверкі + review_requested: Патрабуюць прагледжвання + reviewed: Прагледжаныя + title: Стан + trendable: У трэндзе + unreviewed: Непрагледжаныя + usable: Прыгодныя + name: Назва + newest: Спачатку новыя + oldest: Спачатку старыя + reset: Скінуць review: Стан праверкі + search: Пошук + title: Хэштэгі updated_msg: Налады хэштэгаў паспяхова змененыя title: Адміністрацыя trends: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 602a26225c2..c71fab2177e 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -12,7 +12,7 @@ bg: one: Последовател other: Последователи following: Следва - instance_actor_flash: Акаунтът е виртуално действащо лице, представляващо сървъра, а не отделен потребител. Използва се за федерацията и не бива да се спира. + instance_actor_flash: Акаунтът е виртуално действащо лице, представляващо сървъра, а не отделен потребител. Използва се за целите на федериране и не бива да се спира. last_active: последна дейност link_verified_on: Собствеността върху тази връзка е проверена на %{date} nothing_here: Тук няма нищо! @@ -226,6 +226,7 @@ bg: update_custom_emoji: Обновяване на персонализираното емоджи update_domain_block: Обновяване на блокирането за домейна update_ip_block: Обновяване на правило за IP + update_report: Обновяване на доклада update_status: Обновяване на публикация update_user_role: Обновяване на ролята actions: @@ -470,6 +471,9 @@ bg: title: Препоръки за следване unsuppress: Възстановяване на препоръките за следване instances: + audit_log: + title: Скорошни одитни дневници + view_all: Преглед на пълните одитни дневници availability: description_html: one: Ако доставянето до домейна не е успешно за %{count} ден, няма да има последващи опити, докато не се получи доставка от домейна. @@ -638,6 +642,7 @@ bg: report: 'Докладване на #%{id}' reported_account: Докладван акаунт reported_by: Докладвано от + reported_with_application: Докладвано с приложението resolved: Разрешено resolved_msg: Успешно разрешен доклад! skip_to_actions: Прескок към действия @@ -880,7 +885,23 @@ bg: action: Щракнете тук за повече информация message_html: "Вашето съхранение на предмети е погрешно конфигурирано. Поверителността на потребителите ви е изложена на риск." tags: + moderation: + not_trendable: Не изгряващо + not_usable: Не употребимо + pending_review: Чака се преглед + review_requested: Иска се преглед + reviewed: Прегледано + title: Състояние + trendable: Изгряващо + unreviewed: Непрегледано + usable: Употребимо + name: Име + newest: Най-нови + oldest: Най-стари + reset: Нулиране review: Преглед на състояние + search: Търсене + title: Хаштагове updated_msg: Успешно осъвременени настройки на хаштага title: Администрация trends: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index f892df02c1e..f3fd91d11f6 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -226,6 +226,7 @@ ca: update_custom_emoji: Actualitza l'emoji personalitzat update_domain_block: Actualitza el Bloqueig de Domini update_ip_block: Actualitza norma IP + update_report: Actualitza l'informe update_status: Actualitza l'estat update_user_role: Actualitza Rol actions: @@ -470,6 +471,9 @@ ca: title: Recomanacions de comptes a seguir unsuppress: Restaurar les recomanacions de seguiment instances: + audit_log: + title: Registres recents d'auditoria + view_all: Mostra els registres d'auditoria complets availability: description_html: one: Si la tramesa cap el domini falla %{count} dia sense èxit, no es faran més intents d'entrega a no ser que es rebi una tramesa des de el domini. @@ -638,6 +642,7 @@ ca: report: 'Informe #%{id}' reported_account: Compte denunciat reported_by: Denunciat per + reported_with_application: Reportat amb l'aplicació resolved: Resolt resolved_msg: Informe resolt correctament! skip_to_actions: Salta a les accions @@ -880,7 +885,23 @@ ca: action: Consulta aquí per a més informació message_html: "El teu emagatzamatge d'objectes no està ben configurat. La privacitat dels teus usuaris està en risc." tags: + moderation: + not_trendable: No pot ser en tendència + not_usable: No es pot fer servir + pending_review: Pendent de revisió + review_requested: Revisió demanada + reviewed: Revisada + title: Estat + trendable: Pot ser tendència + unreviewed: No revisada + usable: Es pot fer servir + name: Nom + newest: Més nous + oldest: Més vells + reset: Restableix review: Revisar l'estat + search: Cerca + title: Etiquetes updated_msg: Ajustaments d'etiquetes actualitzats amb èxit title: Administració trends: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 17c743f1de5..9046769a213 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -81,7 +81,7 @@ cs: invite_request_text: Důvody založení invited_by: Pozván uživatelem ip: IP adresa - joined: Uživatel založen + joined: Uživatelem od location: all: Všechny local: Místní @@ -118,7 +118,7 @@ cs: promote: Povýšit protocol: Protokol public: Veřejný - push_subscription_expires: Odebírání PuSH expiruje + push_subscription_expires: Odebírání PuSH vyprší redownload: Obnovit profil redownloaded_msg: Profil účtu %{username} byl úspěšně obnoven ze zdroje reject: Zamítnout @@ -232,6 +232,7 @@ cs: update_custom_emoji: Aktualizovat vlastní emoji update_domain_block: Změnit blokaci domény update_ip_block: Aktualizovat pravidlo IP + update_report: Upravit hlášení update_status: Aktualizovat Příspěvek update_user_role: Aktualizovat roli actions: @@ -291,6 +292,7 @@ cs: update_custom_emoji_html: Uživatel %{name} aktualizoval emoji %{target} update_domain_block_html: "%{name} aktualizoval blokaci domény %{target}" update_ip_block_html: "%{name} změnil pravidlo pro IP %{target}" + update_report_html: "%{name} aktualizoval hlášení %{target}" update_status_html: Uživatel %{name} aktualizoval příspěvek uživatele %{target} update_user_role_html: "%{name} změnil %{target} roli" deleted_account: smazaný účet @@ -298,6 +300,7 @@ cs: filter_by_action: Filtrovat podle akce filter_by_user: Filtrovat podle uživatele title: Protokol auditu + unavailable_instance: "(doména není k dispozici)" announcements: destroyed_msg: Oznámení bylo úspěšně odstraněno! edit: @@ -484,6 +487,9 @@ cs: title: Doporučená sledování unsuppress: Obnovit doporučení sledování instances: + audit_log: + title: Nedávné protokoly auditu + view_all: Zobrazit úplné protokoly auditu availability: description_html: few: Pokud doručování na doménu selže ve %{count} různých dnech, nebudou činěny žádné další pokusy o doručení, dokud nedorazí doručení od domény. @@ -660,6 +666,7 @@ cs: report: 'Hlášení #%{id}' reported_account: Nahlášený účet reported_by: Nahlášeno uživatelem + reported_with_application: Nahlášeno aplikací resolved: Vyřešeno resolved_msg: Hlášení úspěšně vyřešeno! skip_to_actions: Přeskočit k akcím @@ -906,7 +913,23 @@ cs: action: Pro více informací se podívejte zde message_html: "Váš object storage je špatně nakonfigurován. Soukromí vašich uživatelů je ohroženo." tags: + moderation: + not_trendable: Netrendovatelné + not_usable: Nepoužitelné + pending_review: Čeká na posouzení + review_requested: Posouzení vyžádáno + reviewed: Posouzené + title: Stav + trendable: Trendovatelné + unreviewed: Neposouzené + usable: Použitelné + name: Název + newest: Nejnovější + oldest: Nejstarší + reset: Resetovat review: Stav posouzení + search: Hledat + title: Hashtagy updated_msg: Nastavení hashtagů bylo úspěšně aktualizováno title: Administrace trends: @@ -984,6 +1007,7 @@ cs: delete: Smazat edit_preset: Upravit předlohu pro varování empty: Zatím jste nedefinovali žádné předlohy varování. + title: Předvolby varování webhooks: add_new: Přidat koncový bod delete: Smazat diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 35ed5ade8aa..5b26322be33 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -17,11 +17,11 @@ cy: zero: Dilynwyr following: Yn dilyn instance_actor_flash: Mae'r cyfrif hwn yn actor rhithwir sy'n cael ei ddefnyddio i gynrychioli'r gweinydd ei hun ac nid unrhyw ddefnyddiwr unigol. Fe'i defnyddir at ddibenion ffederasiwn ac ni ddylid ei atal. - last_active: y diweddaraf + last_active: gweithgar ddiwethaf link_verified_on: Gwiriwyd perchnogaeth y ddolen yma ar %{date} nothing_here: Does dim byd yma! pin_errors: - following: Rhaid i chi fod yn dilyn yn barod y person rydych am ei gymeradwyo + following: Rhaid i chi fod yn dilyn y person rydych am ei gymeradwyo, yn barod. posts: few: Postiadau many: Postiadau @@ -238,6 +238,7 @@ cy: update_custom_emoji: Diweddaru Emoji Addasedig update_domain_block: Diweddaru'r Blocio Parth update_ip_block: Diweddaru rheol IP + update_report: Diweddaru Adroddiad update_status: Diweddaru Postiad update_user_role: Diweddaru Rôl actions: @@ -305,6 +306,7 @@ cy: filter_by_action: Hidlo yn ôl gweithred filter_by_user: Hidlo yn ôl defnyddiwr title: Cofnod archwilio + unavailable_instance: "(nid yw enw'r parth ar gael)" announcements: destroyed_msg: Cyhoeddiad wedi'i ddileu'n llwyddiannus! edit: @@ -501,6 +503,9 @@ cy: title: Dilyn yr argymhellion unsuppress: Adfer argymhelliad dilyn instances: + audit_log: + title: Cofnodion Archwilio Diweddar + view_all: Gweld y cofnodion archwilio llawn availability: description_html: few: Os bydd anfon i'r parth yn methu ar %{count} o ddiwrnodau gwahanol heb lwyddo, ni fydd unrhyw ymdrechion dosbarthu pellach yn cael eu gwneud oni bai y bydd danfoniad yn cael ei dderbyn o'r parth. @@ -685,6 +690,7 @@ cy: report: 'Adroddiad #%{id}' reported_account: Cyfrif wedi ei adrodd reported_by: Adroddwyd gan + reported_with_application: Adroddwyd gydag ap resolved: Wedi ei ddatrys resolved_msg: Llwyddwyd i ddatrys yr adroddiad! skip_to_actions: Mynd i gamau gweithredu @@ -935,7 +941,23 @@ cy: action: Ewch yma am fwy o wybodaeth message_html: "Mae eich storfa gwrthrychau wedi'i cham ffurfweddu. Mae preifatrwydd eich defnyddwyr mewn perygl." tags: + moderation: + not_trendable: Ddim yn dueddol + not_usable: Ddim yn ddefnyddiadwy + pending_review: O dan ystyriaeth + review_requested: Gofynnwyd am adolygiad + reviewed: Adolygwyd + title: Statws + trendable: Tueddadwy + unreviewed: Heb ei adolygu + usable: Defnyddiadwy + name: Enw + newest: Mwyaf newydd + oldest: Hynaf + reset: Ailosod review: Adolygu statws + search: Chwilio + title: Hashnodau updated_msg: Gosodiadau hashnodau wedi'i diweddaru'n llwyddiannus title: Gweinyddiaeth trends: @@ -1436,7 +1458,7 @@ cy: domain_blocking_html: Rydych ar fin rhwystro hyd at %{total_items} parth o %{filename} . following_html: Rydych ar fin dilyn hyd at %{total_items} cyfrif gan %{filename} . lists_html: Rydych ar fin ychwanegu hyd at %{total_items} o gyfrifon o %{filename} at eich rhestrau . Bydd rhestrau newydd yn cael eu creu os nad oes rhestr i ychwanegu ati. - muting_html: Rydych ar fin tewi hyd at %{total_items} cyfrif o %{filename} . + muting_html: Rydych ar fin anwybyddu hyd at %{total_items} cyfrif o %{filename}. preface: Gallwch fewnforio data rydych chi wedi'i allforio o weinydd arall, fel rhestr o'r bobl rydych chi'n eu dilyn neu'n eu blocio. recent_imports: Mewnforion diweddar states: @@ -1529,9 +1551,9 @@ cy: too_many: Methu atodi mwy na 4 ffeil migrations: acct: Symudwyd i - cancel: Diddymu ailgyfeirio - cancel_explanation: Bydd diddymu'r ailgyfeiriad yn ail agor eich cyfrif cyfredol, ond ni fydd yn dod â dilynwyr sydd wedi'u symud i'r cyfrif hwnnw yn ôl. - cancelled_msg: Wedi diddymu'r ailgyfeiriad yn llwyddiannus. + cancel: Canslo ailgyfeirio + cancel_explanation: Bydd canslo'r ailgyfeiriad yn ail agor eich cyfrif cyfredol, ond ni fydd yn dod â dilynwyr sydd wedi'u symud i'r cyfrif hwnnw yn ôl. + cancelled_msg: Wedi canslo'r ailgyfeiriad yn llwyddiannus. errors: already_moved: yw'r un cyfrif rydych chi wedi symud iddo eisoes missing_also_known_as: nid yw'n arallenw o'r cyfrif hwn diff --git a/config/locales/da.yml b/config/locales/da.yml index fc7373cc94c..90a669ccb9d 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -226,6 +226,7 @@ da: update_custom_emoji: Opdatér tilpasset emoji update_domain_block: Opdatér domæneblokering update_ip_block: Opdatér IP-regel + update_report: Opdatér anmeldelse update_status: Opdatér indlæg update_user_role: Opdatér rolle actions: @@ -470,6 +471,9 @@ da: title: Følg-anbefalinger unsuppress: Genopret følg-anbefaling instances: + audit_log: + title: Seneste Revisionslogger + view_all: Vis alle revisionslogger availability: description_html: one: Lykkes det ikke at levere til domænet i løbet af %{count} dag, foretages ingen yderligere leveringsforsøg, medmindre en levering fra domænet modtages. @@ -638,6 +642,7 @@ da: report: 'Anmeldelse #%{id}' reported_account: Anmeldt konto reported_by: Anmeldt af + reported_with_application: Rapporteret via applikation resolved: Løst resolved_msg: Anmeldelse løst! skip_to_actions: Overspring til foranstaltninger @@ -880,7 +885,23 @@ da: action: Tjek her for flere oplysninger message_html: "Objektlageret er fejlopsat. Brugernes fortrolighed er i fare." tags: + moderation: + not_trendable: Ikke trendegnet + not_usable: Ikke brugbar + pending_review: Afventer revision + review_requested: Revision anmodet + reviewed: Revideret + title: Status + trendable: Trendegnet + unreviewed: Urevideret + usable: Brugbar + name: Navn + newest: Seneste + oldest: Ældste + reset: Nulstil review: Revisionsstatus + search: Søg + title: Hashtags updated_msg: Hashtag-indstillinger opdateret title: Administration trends: diff --git a/config/locales/de.yml b/config/locales/de.yml index 82ed9d8178c..1e6d2910684 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1,7 +1,7 @@ --- de: about: - about_mastodon_html: 'Das soziale Netzwerk der Zukunft: Keine Werbung, keine Überwachung durch Unternehmen – dafür dezentral und mit Anstand! Beherrsche deine Daten mit Mastodon!' + about_mastodon_html: 'Das soziale Netzwerk der Zukunft: Keine Werbung, keine Überwachung durch Unternehmen – dafür dezentral und mit Anstand! Behalte mit Mastodon die Kontrolle über deine Daten!' contact_missing: Nicht festgelegt contact_unavailable: Nicht verfügbar hosted_on: Mastodon, gehostet auf %{domain} @@ -151,7 +151,7 @@ de: subscribe: Abonnieren suspend: Sperren suspended: Gesperrt - suspension_irreversible: Die Daten dieses Kontos wurden unwiderruflich gelöscht. Du kannst das Konto entsperren, um es wieder nutzbar zu machen, aber es wird keine Daten wiederherstellen, die es davor hatte. + suspension_irreversible: Die Daten dieses Kontos wurden unwiderruflich gelöscht. Du kannst das Konto entsperren, um es wieder zu verwenden, aber es wird keine Daten wiederherstellen, die es davor hatte. suspension_reversible_hint_html: Das Konto wurde gesperrt und die Daten werden am %{date} vollständig gelöscht. Bis dahin kann das Konto ohne irgendwelche negativen Auswirkungen wiederhergestellt werden. Wenn du alle Daten des Kontos sofort entfernen möchtest, kannst du das nachfolgend tun. title: Konten unblock_email: E-Mail-Adresse entsperren @@ -226,6 +226,7 @@ de: update_custom_emoji: Eigenes Emoji aktualisieren update_domain_block: Domain-Sperre aktualisieren update_ip_block: IP-Regel aktualisieren + update_report: Meldung aktualisieren update_status: Beitrag aktualisieren update_user_role: Rolle bearbeiten actions: @@ -292,7 +293,7 @@ de: empty: Protokolle nicht gefunden. filter_by_action: Nach Aktion filtern filter_by_user: Nach Benutzer*in filtern - title: Protokoll + title: Audit-Log unavailable_instance: "(Server nicht verfügbar)" announcements: destroyed_msg: Ankündigung erfolgreich gelöscht! @@ -470,6 +471,9 @@ de: title: Folgeempfehlungen unsuppress: Folgeempfehlung nicht mehr unterbinden instances: + audit_log: + title: Neueste Audit-Logs + view_all: Alle Audit-Logs anzeigen availability: description_html: one: Wenn die Zustellung an die Domain %{count} Tag lang erfolglos bleibt, werden keine weiteren Zustellversuche unternommen, bis eine Zustellung von der Domain empfangen wird. @@ -587,7 +591,7 @@ de: notes: one: "%{count} Notiz" other: "%{count} Notizen" - action_log: Protokoll + action_log: Audit-Log action_taken_by: Maßnahme ergriffen von actions: delete_description_html: Der gemeldete Beitrag wird gelöscht und die ergriffene Maßnahme wird aufgezeichnet, um dir bei zukünftigen Verstößen des gleichen Kontos zu helfen. @@ -638,6 +642,7 @@ de: report: "%{id}. Meldung" reported_account: Gemeldetes Konto reported_by: Gemeldet von + reported_with_application: Per App gemeldet resolved: Geklärt resolved_msg: Meldung erfolgreich geklärt! skip_to_actions: Zur Maßnahme springen @@ -880,7 +885,23 @@ de: action: Für weitere Informationen hier klicken message_html: "Die Konfiguration deines Objektspeichers ist fehlerhaft. Die Privatsphäre deiner Benutzer*innen ist gefährdet." tags: + moderation: + not_trendable: Nicht trendfähig + not_usable: Nicht verwendbar + pending_review: Überprüfung ausstehend + review_requested: Überprüfung angefordert + reviewed: Überprüft + title: Status + trendable: Trendfähig + unreviewed: Ungeprüft + usable: Verwendbar + name: Name + newest: Neueste + oldest: Älteste + reset: Zurücksetzen review: Prüfstatus + search: Suchen + title: Hashtags updated_msg: Hashtag-Einstellungen erfolgreich aktualisiert title: Administration trends: @@ -1109,7 +1130,7 @@ de: new_confirmation_instructions_sent: In wenigen Minuten wirst du eine neue E-Mail mit dem Bestätigungslink erhalten! title: Überprüfe dein E-Mail-Postfach sign_in: - preamble_html: Melde dich mit deinen Zugangsdaten für %{domain} an. Solltest du dein Konto auf einem anderen Server registriert haben, ist eine Anmeldung hier nicht möglich. + preamble_html: Melde dich mit deinen Zugangsdaten für %{domain} an. Falls dein Konto auf einem anderen Server erstellt wurde, ist eine Anmeldung hier nicht möglich. title: Bei %{domain} anmelden sign_up: manual_review: Registrierungen für den Server %{domain} werden manuell durch unsere Moderator*innen überprüft. Um uns dabei zu unterstützen, schreibe etwas über dich und sage uns, weshalb du ein Konto auf %{domain} anlegen möchtest. @@ -1450,7 +1471,7 @@ de: backreference_required: Das neue Konto muss zuerst auf das alte Konto verweisen before: 'Bevor du fortfährst, lies bitte diese Hinweise sorgfältig durch:' cooldown: Nach dem Umzug wird es eine Weile dauern, bis du erneut umziehen darfst - disabled_account: Dein altes Konto ist nur noch eingeschränkt nutzbar. Du kannst jedoch deine Daten exportieren und das Konto wieder reaktivieren. + disabled_account: Dein altes Konto ist nur noch eingeschränkt verwendbar. Du kannst jedoch deine Daten exportieren und das Konto wieder reaktivieren. followers: Alle Follower werden vom alten zum neuen Konto übertragen only_redirect_html: Alternativ kannst du auch nur eine Weiterleitung zu deinem neuen Konto einrichten, ohne die Follower zu übertragen. other_data: Keine anderen Daten werden automatisch zum neuen Konto übertragen diff --git a/config/locales/devise.ast.yml b/config/locales/devise.ast.yml index 47372c2f07a..c3536070439 100644 --- a/config/locales/devise.ast.yml +++ b/config/locales/devise.ast.yml @@ -6,7 +6,7 @@ ast: send_instructions: Nunos minutos vas recibir un mensaxe coles instrucciones pa saber cómo confirmar la direición de corréu electrónicu. Revisa la carpeta Puxarra si nun recibiesti esti mensaxe. send_paranoid_instructions: Si la direición de corréu electrónicu esiste na nuesa base de datos, nunos minutos vas recibir un mensaxe coles instrucciones pa saber cómo confirmala. Revisa la carpeta Puxarra si nun recibiesti esti mensaxe. failure: - already_authenticated: Xá aniciesti la sesión. + already_authenticated: Yá aniciesti la sesión. last_attempt: Quédate un intentu más enantes de bloquiar la cuenta. locked: La cuenta ta bloquiada. pending: La cuenta sigue en revisión. @@ -16,9 +16,9 @@ ast: mailer: confirmation_instructions: action: Verificar la direición de corréu electrónicu - explanation: Creesti una cuenta en %{host} con esta direición de corréu electrónicu ya tas a un calcu d'activala. Si nun fixesti esta aición, inora esti mensaxe. - explanation_when_pending: Solicitesti una invitación a %{host} con esta direición de corréu electrónicu. Namás que confirmes la direición de corréu electrónicu, vamos revisar la solicitú. Entrín ya non, pues aniciar la sesión pa camudar los detalles o desaniciar la cuenta, mas nun pues acceder a la mayoría de funciones hasta que la cuenta nun tea aprobada. Si se refuga la solicitú, nun ye necesario que faigas nada más o si, per otra parte, tu nun fixesti esta aición, inora esti mensaxe. - extra_html: Revisa tamién les normes del sirvidor ya los nuesos términos del serviciu. + explanation: Creesti una cuenta en %{host} con esta direición de corréu electrónicu y tas a un calcu d'activala. Si nun fixesti esta aición, inora esti mensaxe. + explanation_when_pending: Solicitesti una invitación a %{host} con esta direición de corréu electrónicu. Namás que confirmes la direición de corréu electrónicu, vamos revisar la solicitú. Entrín y non, pues aniciar la sesión pa camudar los detalles o desaniciar la cuenta, mas nun pues acceder a la mayoría de funciones hasta que la cuenta nun tea aprobada. Si se refuga la solicitú, nun ye necesario que faigas nada más o si, per otra parte, tu nun fixesti esta aición, inora esti mensaxe. + extra_html: Revisa tamién les normes del sirvidor y los nuesos términos del serviciu. subject: 'Mastodon: instrucciones de confirmación de «%{instance}»' title: Verificación de la direición de corréu electrónicu email_changed: @@ -38,7 +38,7 @@ ast: reset_password_instructions: action: Camudar la contraseña explanation: Solicitesti una contraseña nueva pa la to cuenta. - extra: Si nun solicitesti esta aición, inora esti mensaxe. La contraseña nun va camudar hasta que nun accedas al enllaz d'arriba ya crees una. + extra: Si nun solicitesti esta aición, inora esti mensaxe. La contraseña nun va camudar hasta que nun accedas al enllaz d'arriba y crees una. subject: 'Mastodon: instrucciones pa camudar la contraseña' title: Cambéu de la contaseña two_factor_disabled: @@ -48,7 +48,7 @@ ast: subject: 'Mastodon: activóse l''autenticación en dos pasos' title: Autenticación de dos pasos desactivada two_factor_recovery_codes_changed: - explanation: Invalidáronse los códigos de recuperación anteriores ya xeneráronse otros nuevos. + explanation: Invalidáronse los códigos de recuperación anteriores y xeneráronse otros nuevos. subject: 'Mastodon: volvieron xenerase los códigos de recuperación de l''autenticación en dos pasos' unlock_instructions: subject: 'Mastodon: instrucciones de desbloquéu' @@ -68,16 +68,16 @@ ast: passwords: send_instructions: Si la direición de corréu electrónicu esiste na nuesa base de datos, nunos minutos vas recibir un enllaz pa recuperar la contraseña. Revisa la carpeta Puxarra si nun recibiesti esti mensaxe. send_paranoid_instructions: Si la direición de corréu electrónicu esiste na nuesa base de datos, nunos minutos vas recibir un enllaz pa recuperar la contraseña. Revisa la carpeta Puxarra si nun recibiesti esti mensaxe. - updated: La contraseña camudó correutamente. Xá aniciesti la sesión. + updated: La contraseña camudó correutamente. yá aniciesti la sesión. updated_not_active: La contraseña camudó correutamente. registrations: destroyed: "¡Ta llueu! La cuenta anulóse correutamente. Esperamos volver vete pronto." signed_up: "¡Afáyate! Rexistréstite correutamente." signed_up_but_inactive: Rexistréstite correutamente. Por embargu, nun se pudo aniciar la sesión porque la cuenta entá nun s'activó. signed_up_but_locked: Rexistréstite correutamente. Por embargu, nun se pudo aniciar la sesión porque la cuenta ta bloquiada. - signed_up_but_pending: Unvióse un mensaxe a la direición de corréu electrónicu que contién un enllaz de confirmación. Darréu de calcar nel enllaz, vamos revisar la solicitú ya si s'aprueba, avisámoste. - signed_up_but_unconfirmed: Unvióse un mensaxe de confirmación a la to direición de corréu electrónicu. Sigui l'enllaz p'activar la cuenta ya revisa la carpeta Puxarra si nun recibiesti esti mensaxe. - update_needs_confirmation: Anovesti la cuenta correutamente, mas tenemos de verificar la direición de corréu electrónicu nueva. Revisa'l to corréu electrónicu ya sigui l'enllaz de confirmación pa confirmar esta direición. Si nun recibiesti'l mensaxe, revisa la carpeta Puxarra. + signed_up_but_pending: Unvióse un mensaxe a la direición de corréu electrónicu que contién un enllaz de confirmación. Darréu de calcar nel enllaz, vamos revisar la solicitú y si s'aprueba, avisámoste. + signed_up_but_unconfirmed: Unvióse un mensaxe de confirmación a la to direición de corréu electrónicu. Sigui l'enllaz p'activar la cuenta y revisa la carpeta Puxarra si nun recibiesti esti mensaxe. + update_needs_confirmation: Anovesti la cuenta correutamente, mas tenemos de verificar la direición de corréu electrónicu nueva. Revisa'l to corréu electrónicu y sigui l'enllaz de confirmación pa confirmar esta direición. Si nun recibiesti'l mensaxe, revisa la carpeta Puxarra. updated: La cuenta anovóse correutamente. sessions: already_signed_out: Zarresti la sesión correutamente. @@ -89,7 +89,7 @@ ast: unlocked: La cuenta desbloquióse correutamente. Anicia la sesión pa siguir. errors: messages: - already_confirmed: xá se confirmó, prueba a aniciar la sesión + already_confirmed: yá se confirmó, prueba a aniciar la sesión not_saved: one: '1 error torgó que «%{resource}» se guardare:' other: "%{count} errores torgaron que «%{resource}» se guardaren:" diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml index 523ae70b049..b41e12f85d6 100644 --- a/config/locales/devise.cy.yml +++ b/config/locales/devise.cy.yml @@ -93,7 +93,7 @@ cy: updated: Mae eich cyfrinair wedi'i newid yn llwyddiannus. Rydych chi bellach wedi mewngofnodi. updated_not_active: Mae eich cyfrinair wedi ei newid yn llwyddiannus. registrations: - destroyed: Hwyl fawr! Mae eich cyfrif wedi ei ddiddymu'n llwyddiannus. Gobeithiwn eich gweld chi eto'n fuan. + destroyed: Hwyl fawr! Mae eich cyfrif wedi ei chanslo'n llwyddiannus. Gobeithiwn eich gweld chi eto'n fuan. signed_up: Croeso! Rydych wedi cofrestru'n llwyddiannus. signed_up_but_inactive: Yr ydych wedi cofrestru'n llwyddiannus. Fodd bynnag, ni allwn eich mewngofnodi achos nid yw eich cyfrif wedi ei hagor eto. signed_up_but_locked: Rydych chi wedi cofrestru'n llwyddiannus. Fodd bynnag, ni allem eich mewngofnodi oherwydd bod eich cyfrif wedi'i gloi. diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml index 8963bf5a45b..61d58981d84 100644 --- a/config/locales/devise.fi.yml +++ b/config/locales/devise.fi.yml @@ -2,9 +2,9 @@ fi: devise: confirmations: - confirmed: Sähköpostiosoitteesi on vahvistettu. - send_instructions: Saat pian sähköpostitse ohjeet sähköpostiosoitteesi vahvistamiseen. Jos et saanut viestiä, tarkista roskapostikansiosi. - send_paranoid_instructions: Jos sähköpostiosoitteesi on tiedossammme, saat pian sähköpostiisi ohjeet sen vahvistamiseen. Jos et saanut viestiä, tarkista roskapostikansiosi. + confirmed: Sähköpostiosoitteesi vahvistus onnistui. + send_instructions: Saat pian sähköpostiisi ohjeet sähköpostiosoitteesi vahvistamiseen. Jos viestiä ei kuulu, tarkista roskapostikansiosi. + send_paranoid_instructions: Jos sähköpostiosoitteesi on tiedossammme, saat pian sähköpostiisi ohjeet sen vahvistamiseen. Jos viestiä ei kuulu, tarkista roskapostikansiosi. failure: already_authenticated: Olet jo kirjautunut sisään. inactive: Tiliäsi ei ole vielä aktivoitu. @@ -14,7 +14,7 @@ fi: not_found_in_database: Virheellinen %{authentication_keys} tai salasana. omniauth_user_creation_failure: Virhe luotaessa tiliä tälle henkilöllisyydelle. pending: Tilisi on vielä tarkistamatta. - timeout: Istuntosi on vanhentunut. Jatkaaksesi käyttöä, kirjaudu uudelleen. + timeout: Istuntosi on vanhentunut. Jatka kirjautumalla uudelleen sisään. unauthenticated: Sinun on kirjauduttava tai rekisteröidyttävä ennen kuin voit jatkaa. unconfirmed: Vahvista sähköpostiosoitteesi, ennen kuin jatkat. mailer: @@ -24,34 +24,34 @@ fi: explanation: Olet luonut käyttäjätilin palvelimelle %{host} tätä sähköpostiosoitetta käyttäen. Olet painalluksen päässä tilin aktivoinnista. Jos et luonut tiliä itse, voit jättää tämän viestin huomiotta. explanation_when_pending: Teit hakemuksen kutsusta palvelimelle %{host} tällä sähköpostiosoitteella. Kun olet vahvistanut sähköpostiosoitteesi, tarkistamme hakemuksesi. Voit kirjautua sisään muuttaaksesi hakemuksen sisältöä tai poistaaksesi tilin, mutta et voi käyttää suurinta osaa toiminnallisuudesta ennen kuin hakemuksesi on hyväksytty. Jos hakemuksesi hylätään, tietosi poistetaan eikä sinulta tarvita enempää toimia. Jos sinä et tehnyt hakemusta, voit jättää tämän viestin huomiotta. extra_html: Tutustu myös palvelimen sääntöihin ja palveluehtoihimme. - subject: 'Mastodon: Vahvistusohjeet instanssille %{instance}' + subject: 'Mastodon: vahvistusohjeet palvelimelle %{instance}' title: Vahvista sähköpostiosoite email_changed: explanation: 'Tilin sähköpostiosoitteeksi vaihdetaan:' extra: Jos et vaihtanut sähköpostiosoitettasi, joku muu on todennäköisesti päässyt käyttämään tiliäsi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitoon, ellet pääse sisään käyttäjätilillesi. - subject: 'Mastodon: Sähköpostiosoite vaihdettu' + subject: 'Mastodon: sähköpostiosoite vaihdettu' title: Uusi sähköpostiosoite password_change: explanation: Tilisi salasana on vaihdettu. - extra: Ellet vaihtanut salasanaasi, joku muu on todennäköisesti päässyt käyttäjätilillesi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitoon, jos kirjautuminen käyttäjätilillesi ei onnistu. + extra: Jos et vaihtanut salasanaasi, joku muu on todennäköisesti päässyt käyttämään tiliäsi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitoon, ellet pääse sisään käyttäjätilillesi. subject: 'Mastodon: salasana vaihdettu' title: Salasana vaihdettu reconfirmation_instructions: explanation: Vahvista uusi sähköpostiosoite, niin muutos astuu voimaan. - extra: Jos et tehnyt muutosta itse, voit jättää tämän viestin huomiotta. Mastodon-tilin sähköpostiosoitetta ei vaihdeta, ennen kuin klikkaat yllä olevaa linkkiä. - subject: 'Mastodon: Vahvista sähköpostiosoite palvelimelle %{instance}' + extra: Jos et tehnyt muutosta itse, voit jättää tämän viestin huomiotta. Mastodon-tilin sähköpostiosoitetta ei vaihdeta, ennen kuin painat edellä olevaa linkkiä. + subject: 'Mastodon: vahvista sähköpostiosoite palvelimelle %{instance}' title: Vahvista sähköpostiosoite reset_password_instructions: action: Vaihda salasana explanation: Pyysit tilillesi uuden salasanan. - extra: Jos et tehnyt pyyntöä itse, voit jättää tämän viestin huomiotta. Salasanaasi ei vaihdeta, ennen kuin klikkaat yllä olevaa linkkiä ja luot uuden salasanan. + extra: Jos et tehnyt pyyntöä itse, voit jättää tämän viestin huomiotta. Salasanaasi ei vaihdeta, ennen kuin painat edellä olevaa linkkiä ja luot uuden salasanan. subject: 'Mastodon: ohjeet salasanan vaihtoon' title: Salasanan vaihto two_factor_disabled: explanation: Sisäänkirjautuminen on nyt mahdollista pelkällä sähköpostiosoitteella ja salasanalla. subject: 'Mastodon: kaksivaiheinen todennus poistettu käytöstä' subtitle: Kaksivaiheinen todennus on poistettu käytöstä tililtäsi. - title: 2-vaiheinen todennus pois käytöstä + title: Kaksivaiheinen todennus poissa käytöstä two_factor_enabled: explanation: Sisäänkirjautuminen edellyttää liitetyn TOTP-sovelluksen luomaa aikarajattua kertatunnuslukua. subject: 'Mastodon: kaksivaiheinen todennus otettu käyttöön' @@ -59,37 +59,37 @@ fi: title: Kaksivaiheinen todennus käytössä two_factor_recovery_codes_changed: explanation: Uudet palautuskoodit on nyt luotu ja vanhat mitätöity. - subject: 'Mastodon: Kaksivaihetodennuksen palautuskoodit luotiin uudelleen' + subject: 'Mastodon: kaksivaiheisen todennuksen palautuskoodit luotiin uudelleen' subtitle: Aiemmat palautuskoodit on mitätöity, ja korvaavat uudet koodit on luotu. - title: 2-vaiheisen todennuksen palautuskoodit vaihdettiin + title: Kaksivaiheisen todennuksen palautuskoodit vaihdettiin unlock_instructions: - subject: 'Mastodon: lukituksen poistamisen ohjeet' + subject: 'Mastodon: ohjeet lukituksen poistoon' webauthn_credential: added: explanation: Seuraava suojausavain on lisätty tilillesi - subject: 'Mastodon: Uusi suojausavain' + subject: 'Mastodon: uusi suojausavain' title: Uusi suojausavain on lisätty deleted: explanation: Seuraava suojausavain on poistettu tililtäsi - subject: 'Mastodon: Suojausavain poistettu' + subject: 'Mastodon: suojausavain poistettu' title: Yksi suojausavaimistasi on poistettu webauthn_disabled: - explanation: Turva-avaimin kirjautuminen tilillesi on kytketty pois käytöstä. + explanation: Suojausavaimella todennus on poissa käytöstä tililläsi. extra: Olet nyt mahdollistanut sisäänkirjautumisen käyttäjätilillesi pelkästään palveluun liitetyn TOTP-sovelluksen luomalla aikarajoitteisella kertatunnusluvulla. - subject: 'Mastodon: Turva-avaintodennus on poistettu käytöstä' + subject: 'Mastodon: suojausavaimella todennus poistettu käytöstä' title: Suojausavaimet poistettu käytöstä webauthn_enabled: - explanation: Turva-avaimella kirjautuminen on otettu käyttöön tilillesi. - extra: Voit nyt kirjautua sisään turva-avaimellasi. - subject: 'Mastodon: Todennus suojausavaimella on otettu käyttöön' + explanation: Suojausavaimella todennus on käytössä tililläsi. + extra: Voit nyt kirjautua sisään suojausavaimellasi. + subject: 'Mastodon: suojausavaimella todennus otettu käyttöön' title: Suojausavaimet käytössä omniauth_callbacks: - failure: Tunnistautuminen lähteestä %{kind} ei onnistunut, koska "%{reason}". - success: Tunnistautuminen tililtä %{kind} onnistui. + failure: Todentaminen lähteestä %{kind} ei onnistunut, syynä ”%{reason}”. + success: Todentaminen tililtä %{kind} onnistui. passwords: no_token: Tälle sivulle pääsee vain salasananvaihtoviestin kautta. Jos tiedät tulevasi sen kautta, varmista, että käytät viestissä mainittua URL-osoitetta kokonaisuudessaan. - send_instructions: Jos sähköpostiosoite on tietokannassamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. - send_paranoid_instructions: Jos sähköpostiosoite on tietokannassamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. + send_instructions: Jos sähköpostiosoiteesi on tiedossamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Jos viestiä ei kuulu, tarkista roskapostikansiosi. + send_paranoid_instructions: Jos sähköpostiosoiteesi on tiedossamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Jos viestiä ei kuulu, tarkista roskapostikansiosi. updated: Salasanan vaihto onnistui. Olet nyt kirjautunut sisään. updated_not_active: Salasanan vaihto onnistui. registrations: @@ -98,16 +98,16 @@ fi: signed_up_but_inactive: Rekisteröityminen onnistui. Emme kuitenkaan voi kirjata sinua sisään, sillä käyttäjätiliäsi ei ole vielä aktivoitu. signed_up_but_locked: Rekisteröityminen onnistui. Emme kuitenkaan voi kirjata sinua sisään, sillä käyttäjätilisi on lukittuna. signed_up_but_pending: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Sen avattuasi tarkistamme hakemuksesi, ja ilmoitamme hyväksynnästä. - signed_up_but_unconfirmed: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Aktivoi käyttäjätilisi seuraamalla linkkiä. Mikäli sitä ei kuulu, tarkista myös roskapostisi. - update_needs_confirmation: Tilin päivitys onnistui. Uusi sähköpostiosoite on kuitenkin vahvistettava. Tarkista saapuneet viestisi, ja vahvista uusi sähköpostiosoitteesi vahvistuslinkkiä seuraten. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. + signed_up_but_unconfirmed: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Aktivoi käyttäjätilisi seuraamalla linkkiä. Jos sitä ei kuulu, tarkista roskapostikansiosi. + update_needs_confirmation: Tilin päivitys onnistui. Uusi sähköpostiosoite on kuitenkin vahvistettava. Tarkista saapuneet viestisi, ja vahvista uusi sähköpostiosoitteesi vahvistuslinkkiä seuraten. Jos viestiä ei kuulu, tarkista myös roskapostikansiosi. updated: Käyttäjätilisi tietojen päivittäminen onnistui. sessions: already_signed_out: Uloskirjautuminen onnistui. signed_in: Sisäänkirjautuminen onnistui. signed_out: Uloskirjautuminen onnistui. unlocks: - send_instructions: Saat pian sähköpostitse ohjeet tilin lukituksen poistoon. Jos et saanut viestiä, tarkista roskapostikansio. - send_paranoid_instructions: Jos tili on olemassa, saat pian sähköpostitse ohjeet tilin lukituksen poistoon. Jos et saanut viestiä, tarkista roskapostikansio. + send_instructions: Saat pian sähköpostiisi ohjeet tilin lukituksen poistoon. Jos viestiä ei kuulu, tarkista roskapostikansiosi. + send_paranoid_instructions: Jos tili on olemassa, saat pian sähköpostiisi ohjeet tilin lukituksen poistoon. Jos viestiä ei kuulu, tarkista roskapostikansiosi. unlocked: Tilisi lukituksen poisto onnistui. Jatka kirjautumalla sisään. errors: messages: diff --git a/config/locales/devise.ga.yml b/config/locales/devise.ga.yml index 6e6bd0a0136..ca51bb9467d 100644 --- a/config/locales/devise.ga.yml +++ b/config/locales/devise.ga.yml @@ -11,19 +11,114 @@ ga: invalid: "%{authentication_keys} nó pasfhocal neamhbhailí." last_attempt: Tá iarracht amháin eile agat sula gcuirtear do chuntas faoi ghlas. locked: Tá do chuntas faoi ghlas. + not_found_in_database: "%{authentication_keys} nó pasfhocal neamhbhailí." + omniauth_user_creation_failure: Earráid agus cuntas á chruthú don aitheantas seo. pending: Tá do chuntas fós faoi athbhreithniú. + timeout: Chuaigh do sheisiún in éag. Logáil isteach arís chun leanúint ar aghaidh. unauthenticated: Ní mór duit lógáil isteach nó síniú suas roimh leanúint leat. unconfirmed: Caithfidh tú do r-phost a dheimhniú roimh leanúint leat. mailer: confirmation_instructions: action: Deimhnigh seoladh r-phost action_with_app: Deimhnigh agus fill ar %{app} + explanation: Tá cuntas cruthaithe agat ar %{host} leis an seoladh ríomhphoist seo. Tá tú ceann cliceáil ar shiúl ó é a ghníomhachtú. Mura tusa a bhí ann, déan neamhaird den ríomhphost seo le do thoil. + explanation_when_pending: Chuir tú isteach ar chuireadh chuig %{host} leis an seoladh ríomhphoist seo. Nuair a dheimhníonn tú do sheoladh r-phoist, déanfaimid athbhreithniú ar d’iarratas. Is féidir leat logáil isteach chun do shonraí a athrú nó chun do chuntas a scriosadh, ach ní féidir leat rochtain a fháil ar fhormhór na bhfeidhmeanna go dtí go mbeidh do chuntas faofa. Má dhiúltaítear do d’iarratas, bainfear do shonraí, mar sin ní bheidh aon ghníomh eile ag teastáil uait. Mura tusa a bhí ann, déan neamhaird den ríomhphost seo le do thoil. + extra_html: Seiceáil freisin rialacha an fhreastalaí agus ár dtéarmaí seirbhíse. + subject: 'Mastodon: Treoracha dearbhaithe do %{instance}' + title: Fíoraigh seoladh ríomhphoist email_changed: + explanation: 'Tá seoladh ríomhphoist do chuntais á athrú go:' + extra: Murar athraigh tú do ríomhphost, is dócha go bhfuil rochtain faighte ag duine éigin ar do chuntas. Athraigh do phasfhocal láithreach le do thoil nó déan teagmháil le riarthóir an fhreastalaí má tá tú glasáilte amach as do chuntas. + subject: 'Mastodon: Athraíodh an ríomhphost' title: Seoladh ríomhphoist nua password_change: + explanation: Athraíodh an pasfhocal do do chuntas. + extra: Murar athraigh tú do phasfhocal, is dócha go bhfuil rochtain faighte ag duine éigin ar do chuntas. Athraigh do phasfhocal láithreach le do thoil nó déan teagmháil le riarthóir an fhreastalaí má tá tú glasáilte amach as do chuntas. + subject: 'Mastodon: Athraíodh an pasfhocal' title: Pasfhocal athraithe + reconfirmation_instructions: + explanation: Deimhnigh an seoladh nua chun do ríomhphost a athrú. + extra: Murar tusa a thionscain an t-athrú seo, déan neamhaird den ríomhphost seo le do thoil. Ní athrófar seoladh ríomhphoist an chuntais Mastodon go dtí go bhfaighidh tú rochtain ar an nasc thuas. + subject: 'Mastodon: Deimhnigh ríomhphost le haghaidh %{instance}' + title: Fíoraigh seoladh ríomhphoist reset_password_instructions: action: Athraigh pasfhocal + explanation: D'iarr tú pasfhocal nua do do chuntas. + extra: Murar iarr tú é seo, déan neamhaird den ríomhphost seo le do thoil. Ní athrófar do phasfhocal go dtí go bhfaighidh tú rochtain ar an nasc thuas agus go gcruthóidh tú ceann nua. + subject: 'Mastodon: Athshocraigh treoracha pasfhocail' + title: Athshocrú pasfhocal + two_factor_disabled: + explanation: Is féidir logáil isteach anois ach úsáid a bhaint as seoladh ríomhphoist agus pasfhocal amháin. + subject: 'Mastodon: Díchumasaíodh fíordheimhniú dhá fhachtóir' + subtitle: Díchumasaíodh fíordheimhniú dhá-fhachtóir do do chuntas. + title: 2FA díchumasaithe + two_factor_enabled: + explanation: Beidh comhartha ginte ag an aip TOTP péireáilte ag teastáil chun logáil isteach. + subject: 'Mastodon: Fíordheimhniú dhá-fhachtóir cumasaithe' + subtitle: Cumasaíodh fíordheimhniú dhá fhachtóir do do chuntas. + title: 2FA cumasaithe + two_factor_recovery_codes_changed: + explanation: Tá na cóid athshlánaithe roimhe seo neamhbhailí agus gineadh cinn nua. + subject: 'Mastodon: Cóid aisghabhála dhá-fhachtóir athghinte' + subtitle: Tá na cóid athshlánaithe roimhe seo neamhbhailí agus gineadh cinn nua. + title: Athraíodh cóid aisghabhála 2FA + unlock_instructions: + subject: 'Mastodon: Díghlasáil treoracha' + webauthn_credential: + added: + explanation: Cuireadh an eochair shlándála seo a leanas le do chuntas + subject: 'Mastodon: Eochair shlándála nua' + title: Tá eochair shlándála nua curtha leis + deleted: + explanation: Scriosadh an eochair shlándála seo a leanas ó do chuntas + subject: 'Mastodon: Scriosadh an eochair shlándála' + title: Scriosadh ceann de d'eochracha slándála + webauthn_disabled: + explanation: Díchumasaíodh fíordheimhniú le heochracha slándála do do chuntas. + extra: Is féidir logáil isteach anois ag baint úsáide as an comhartha a ghineann an aip TOTP péireáilte amháin. + subject: 'Mastodon: Díchumasaíodh fíordheimhniú le heochracha slándála' + title: Eochracha slándála díchumasaithe + webauthn_enabled: + explanation: Cumasaíodh fíordheimhniú eochair shlándála do do chuntas. + extra: Is féidir d'eochair shlándála a úsáid le logáil isteach anois. + subject: 'Mastodon: Fíordheimhniú eochair shlándála cumasaithe' + title: Eochracha slándála cumasaithe + omniauth_callbacks: + failure: Níorbh fhéidir tú a fhíordheimhniú ó %{kind} toisc "%{reason}". + success: D'éirigh le fíordheimhniú ó chuntas %{kind}. + passwords: + no_token: Ní féidir leat rochtain a fháil ar an leathanach seo gan teacht ó ríomhphost athshocraithe pasfhocail. Má thagann tú ó ríomhphost athshocraithe pasfhocail, cinntigh le do thoil gur úsáid tú an URL iomlán a cuireadh ar fáil. + send_instructions: Má tá do sheoladh ríomhphoist inár mbunachar sonraí, gheobhaidh tú nasc athshlánaithe pasfhocail ag do sheoladh ríomhphoist i gceann cúpla nóiméad. Seiceáil d'fhillteán turscair mura bhfuair tú an ríomhphost seo. + send_paranoid_instructions: Má tá do sheoladh ríomhphoist inár mbunachar sonraí, gheobhaidh tú nasc athshlánaithe pasfhocail ag do sheoladh ríomhphoist i gceann cúpla nóiméad. Seiceáil d'fhillteán turscair mura bhfuair tú an ríomhphost seo. + updated: Athraíodh do phasfhocal go rathúil. Tá tú sínithe isteach anois. + updated_not_active: Athraíodh do phasfhocal go rathúil. + registrations: + destroyed: Slán! Cealaíodh do chuntas go rathúil. Tá súil againn tú a fheiceáil arís go luath. + signed_up: Fáilte romhat! D'éirigh leat síniú suas. + signed_up_but_inactive: D'éirigh leat síniú suas. Mar sin féin, níorbh fhéidir linn tú a shíniú isteach toisc nach bhfuil do chuntas gníomhachtaithe fós. + signed_up_but_locked: D'éirigh leat síniú suas. Mar sin féin, níorbh fhéidir linn tú a shíniú isteach toisc go bhfuil do chuntas glasáilte. + signed_up_but_pending: Tá teachtaireacht le nasc deimhnithe seolta chuig do sheoladh ríomhphoist. Tar éis duit an nasc a chliceáil, déanfaimid athbhreithniú ar d’iarratas. Cuirfear in iúl duit má cheadaítear é. + signed_up_but_unconfirmed: Tá teachtaireacht le nasc deimhnithe seolta chuig do sheoladh ríomhphoist. Lean an nasc chun do chuntas a ghníomhachtú. Seiceáil d'fhillteán turscair mura bhfuair tú an ríomhphost seo. + update_needs_confirmation: D'éirigh leat do chuntas a nuashonrú, ach caithfimid do sheoladh ríomhphoist nua a fhíorú. Seiceáil do ríomhphost agus lean an nasc dearbhaithe chun do sheoladh ríomhphoist nua a dhearbhú. Seiceáil d'fhillteán turscair mura bhfuair tú an ríomhphost seo. + updated: D'éirigh le do chuntas a nuashonrú. + sessions: + already_signed_out: D'éirigh le síniú amach. + signed_in: D'éirigh le síniú isteach. + signed_out: D'éirigh le síniú amach. + unlocks: + send_instructions: Gheobhaidh tú ríomhphost le treoracha maidir le conas do chuntas a dhíghlasáil i gceann cúpla nóiméad. Seiceáil d'fhillteán turscair mura bhfuair tú an ríomhphost seo. + send_paranoid_instructions: Má tá do chuntas ann, gheobhaidh tú ríomhphost le treoracha maidir le conas é a dhíghlasáil i gceann cúpla nóiméad. Seiceáil d'fhillteán turscair mura bhfuair tú an ríomhphost seo. + unlocked: Díghlasáladh do chuntas go rathúil. Logáil isteach le do thoil chun leanúint ar aghaidh. errors: messages: + already_confirmed: deimhníodh cheana féin, bain triail as síniú isteach + confirmation_period_expired: ní mór é a dhearbhú laistigh de %{period}, iarr ceann nua le do thoil + expired: imithe in éag, iarr ceann nua le do thoil not_found: níor aimsíodh é + not_locked: nach raibh faoi ghlas + not_saved: + few: 'Chuir %{count} earráid cosc ​​ar an %{resource} seo a shábháil:' + many: 'Chuir %{count} earráid cosc ​​ar an %{resource} seo a shábháil:' + one: 'Chuir earráid 1 cosc ​​ar an %{resource} seo a shábháil:' + other: 'Chuir %{count} earráid cosc ​​ar an %{resource} seo a shábháil:' + two: 'Chuir %{count} earráid cosc ​​ar an %{resource} seo a shábháil:' diff --git a/config/locales/devise.kab.yml b/config/locales/devise.kab.yml index 438c1df2b9a..3fbc58c1f57 100644 --- a/config/locales/devise.kab.yml +++ b/config/locales/devise.kab.yml @@ -12,6 +12,7 @@ kab: last_attempt: Γur-k yiwen n uɛraḍ-nniḍen kan send ad yettucekkel umiḍan-ik. locked: Amiḍan-ik yettwargel. not_found_in_database: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir. + omniauth_user_creation_failure: Tuccḍa lawan n tmerna n umiḍan i timagit-a. pending: Amiḍan-inek mazal-it deg ɛiwed n tmuγli. timeout: Tiɣimit n tuqqna tezri. Ma ulac aɣilif ɛiwed tuqqna akken ad tkemmleḍ. unauthenticated: Ilaq ad teqqneḍ neɣ ad tjerrḍeḍ akken ad tkemmelḍ. @@ -47,21 +48,41 @@ kab: subject: 'Mastodon: Iwellihen n uwennez n wawal uffir' title: Aɛiwed n wawal uffir two_factor_disabled: + explanation: Tuqqna tella tura s useqdec n tansa n yimayl tasuft d wawal n uεeddi. subject: 'Mastodon: Asesteb s snat n tarrayin yensa' + subtitle: Asesteb s snat tarrayin i umiḍan-ik yensan. title: Asesteb s snat n tarrayin insa two_factor_enabled: + explanation: Ajuṭu yettusirwen s usnas TOTP yeqqnen ilaq i wakken ad teqqneḍ. subject: 'Mastodon: Asesteb s snat n tarrayin yermed' + subtitle: Asesteb s snat tarrayin yettwarmed i umiḍan-ik. title: Asesteb s snat n tarrayin irmed two_factor_recovery_codes_changed: explanation: Tangalt n tuɣalin tettwaḥbes sakin nesnulfa-d yiwet d tamaynut. subject: 'Mastodon: Tingalin n tuɣalin n snat n tarayin ttwarnanat i tikkelt-nniḍen' + subtitle: Tangalt n tuɣalin tettwaḥbes sakin nesnulfa-d yiwet d tamaynut. title: Tangalt n tuɣalin 2FA tettwabeddel unlock_instructions: subject: 'Mastodon: iwelihhen n userreḥ' webauthn_credential: added: + explanation: Tasarut-a n tɣellist tettwarna ɣer umiḍan-ik·im subject: 'Maṣṭudun : Tasarutt tamaynutt n tɣellist' title: Tasarut tamaynutt n tɣellist tamaynut tettwarna + deleted: + explanation: Tasarut-a n tɣellist tettwakkes seg umiḍan-ik·im + subject: 'Mastodon: Tasarut n tɣellsit tettwakkes' + title: Yiwet seg tsura-k·m n tɣellist tettwakkes + webauthn_disabled: + explanation: Yensa usesteb s tsura n tɣellist i umiḍan-ik. + extra: Tzemreḍ ad tkecmeḍ tura s useqdec asuf n ujuṭu yettwasran s usnas TOPTP yeqqnen. + subject: 'Mastodon: Asesteb s tsura n tɣellist yensa' + title: Tisura n tɣellist nsant + webauthn_enabled: + explanation: Asesteb n tsarut n tɣellist tettwarmed i umiḍan-ik. + extra: Tasarut-ik n tɣellist tezmer tura ad tettuseqdec i unekcum. + subject: 'Mastodon: Asesteb n tsarut n tɣellist yermed' + title: Tisura n tɣellist remdent omniauth_callbacks: failure: Ur nezmir ara ad ak·akem-nsesṭeb seg %{kind} acku "%{reason}". success: Asesṭeb idda akken iwata seg umiḍan %{kind}. diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index ab6ae84db4d..662401a57a6 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -75,7 +75,7 @@ nl: title: Een van jouw beveiligingssleutels is verwijderd webauthn_disabled: explanation: Verificatie met beveiligingssleutels is uitgeschakeld voor je account. - extra: Het is nu alleen mogelijk om in te loggen met een door de authenticatie-app gegeneerde toegangscode. + extra: Het is nu alleen mogelijk om in te loggen met een door de authenticatie-app gegeneerde toegangscode als extra controle. subject: 'Mastodon: Verificatie met beveiligingssleutels is uitgeschakeld' title: Beveiligingssleutels uitgeschakeld webauthn_enabled: diff --git a/config/locales/devise.sc.yml b/config/locales/devise.sc.yml index 5486371a4c6..dde8fd229e9 100644 --- a/config/locales/devise.sc.yml +++ b/config/locales/devise.sc.yml @@ -14,7 +14,7 @@ sc: not_found_in_database: "%{authentication_keys} o crae non vàlida." pending: Su contu tuo est ancora in revisione. timeout: Sa sessione tua est iscadida. Torra·bi a intrare pro sighire. - unauthenticated: Tocat a ti autenticare o ti registrare prima de sighire. + unauthenticated: Ti depes identificare o registrare prima de sighire. unconfirmed: Depes cunfirmare s'indiritzu tuo de posta eletrònica prima de sighire. mailer: confirmation_instructions: @@ -74,7 +74,7 @@ sc: subject: 'Mastodon: Autenticatzione cun sa crae de seguresa ativada' title: Craes de seguresa abilitadas omniauth_callbacks: - failure: Faddina in s'autenticatzione dae %{kind}, ca "%{reason}". + failure: 'Faddina in s''autenticatzione dae %{kind}; resone: "%{reason}".' success: Autenticatzione curreta dae su contu de %{kind}. passwords: no_token: No podes intrare a custa pàgina sena passare dae unu messàgiu de posta eletrònica pro resetare sa crae. Si benes dae su messàgiu de posta pro resetare sa crae, faghe in modu de impreare s'URL intreu chi t'ant donadu. diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index 7ead831e4f7..3e3af9f3239 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -75,7 +75,7 @@ zh-TW: title: 您的一支安全密鑰已經被移除 webauthn_disabled: explanation: 您的帳號已停用安全金鑰身份驗證。 - extra: 現在僅可使用配對的 TOTP 應用程式產生之 token 登入。 + extra: 目前僅可使用配對的 TOTP 應用程式產生之 token 登入。 subject: Mastodon:安全密鑰認證方式已停用 title: 已停用安全密鑰 webauthn_enabled: @@ -90,7 +90,7 @@ zh-TW: no_token: 您必須透過密碼重設信件才能存取此頁面。若確實如此,請確定輸入的網址是完整的。 send_instructions: 若電子郵件地址存在於我們的資料庫,幾分鐘後您將於信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 send_paranoid_instructions: 若電子郵件地址存在於我們的資料庫,幾分鐘後您將於信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 - updated: 您的密碼已成功變更,現在已經登入。 + updated: 您的密碼已成功變更,您現在已經成功登入。 updated_not_active: 您的密碼已成功變更。 registrations: destroyed: 再見!您的帳號已成功取消,期待再相逢。 diff --git a/config/locales/doorkeeper.ast.yml b/config/locales/doorkeeper.ast.yml index 0564e49dac1..0df15a07b62 100644 --- a/config/locales/doorkeeper.ast.yml +++ b/config/locales/doorkeeper.ast.yml @@ -44,7 +44,7 @@ ast: prompt_html: "%{client_name}, que ye una aplicación de terceros, quier tener accesu a la cuenta. Si nun t'enfotes nella, nun habríes autorizala." review_permissions: Revisión de los permisos show: - title: Copia esti códigu d'autorización ya apiégalu na aplicación. + title: Copia esti códigu d'autorización y apiégalu na aplicación. authorized_applications: buttons: revoke: Revocar @@ -67,7 +67,7 @@ ast: grouped_scopes: access: read: Accesu de namás llectura - read/write: Accesu de llectura ya escritura + read/write: Accesu de llectura y escritura write: Accesu de namás escritura title: accounts: Cuentes @@ -111,14 +111,14 @@ ast: read:statuses: mira tolos artículos write: modifica los datos de les cuentes write:accounts: modifica los perfiles - write:blocks: bloquia cuentes ya dominios + write:blocks: bloquia cuentes y dominios write:bookmarks: meter artículos en Marcadores - write:conversations: desaniciar ya desactivar los avisos de conversaciones + write:conversations: desaniciar y desactivar los avisos de conversaciones write:filters: crea peñeres write:follows: sigue a perfiles write:lists: crea llistes write:media: xube ficheros multimedia - write:mutes: desactiva los avisos de perfiles ya de conversaciones + write:mutes: desactiva los avisos de perfiles y de conversaciones write:notifications: borra los avisos write:reports: informa d'otros perfiles write:statuses: espubliza artículos diff --git a/config/locales/doorkeeper.be.yml b/config/locales/doorkeeper.be.yml index f4faed1f09e..75f9930e1a6 100644 --- a/config/locales/doorkeeper.be.yml +++ b/config/locales/doorkeeper.be.yml @@ -83,6 +83,7 @@ be: access_denied: Уласнік рэсурсу або сэрвер аўтарызацыі адхіліў ваш запыт. credential_flow_not_configured: Resource Owner Password Credentials flow не прайшоў з-за таго, што ўласцівасць Doorkeeper.configure.resource_owner_from_credentials была не вызначана. invalid_client: Збой аўтэнтыфікацыі кліента з-за невядомага кліента, адсутнасці аўтэнтыфікацыі кліента або метаду аўтэнтыфікацыі, які не падтрымліваецца. + invalid_code_challenge_method: Метад праверкі кода павінен быць S256, просты тэкст не падтрымліваецца. invalid_grant: Прадастаўлены дазвол на аўтарызацыю несапраўдны, пратэрмінованы, быў адкліканы, не адпавядае URI перанакіравання, які выкарыстоўваецца ў запыце аўтарызацыі або быў выдадзены іншаму кліенту. invalid_redirect_uri: Прадстаўлены URI перанакіравання не сапраўдны. invalid_request: diff --git a/config/locales/doorkeeper.bg.yml b/config/locales/doorkeeper.bg.yml index dd536618276..a1ef1778547 100644 --- a/config/locales/doorkeeper.bg.yml +++ b/config/locales/doorkeeper.bg.yml @@ -83,6 +83,7 @@ bg: access_denied: Заявката беше отказана от собственика на ресурса или от сървъра за упълномощаване. credential_flow_not_configured: Resource Owner Password Credentials предизвика грешка, заради това, че настройките за Doorkeeper.configure.resource_owner_from_credentials липсват. invalid_client: Удостоверяването на клиента предизвика грешка, поради непознат клиент, липсващо клиентско удостоверяване, или заради това, че методът на удостоверяване не се поддържа. + invalid_code_challenge_method: Методът на предизвикателството на кода трябва да е S256, обикновен не се поддържа. invalid_grant: Предоставеното удостоверение за достъп е невалидно, изтекло, отхвърлено, не съвпада с пренасочващото URI, използвано в заявката за удостоверение, или е бил издадено от друг клиент. invalid_redirect_uri: Включеният пренасочващ Uri е невалиден. invalid_request: diff --git a/config/locales/doorkeeper.ca.yml b/config/locales/doorkeeper.ca.yml index 0323656dabf..85a09b5b433 100644 --- a/config/locales/doorkeeper.ca.yml +++ b/config/locales/doorkeeper.ca.yml @@ -83,6 +83,7 @@ ca: access_denied: El propietari del recurs o servidor d'autorizació ha denegat la petició. credential_flow_not_configured: Les credencials de contrasenya del propietari del recurs han fallat degut a que Doorkeeper.configure.resource_owner_from_credentials està sense configurar. invalid_client: La autentificació del client ha fallat perquè és un client desconegut o no està inclòsa l'autentificació del client o el mètode d'autenticació no està confirmat. + invalid_code_challenge_method: El mètode de desafiament de codi ha de ser S256, no es permet que sigui pla. invalid_grant: La concessió d'autorizació oferta és invàlida, ha vençut, s'ha revocat, no coincideix amb l'URI de redirecció utilizada en la petició d'autorizació, o fou emesa per a un altre client. invalid_redirect_uri: L'uri de redirecció inclòsa no és vàlida. invalid_request: diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml index 3323834685a..3101779edf1 100644 --- a/config/locales/doorkeeper.cs.yml +++ b/config/locales/doorkeeper.cs.yml @@ -166,6 +166,7 @@ cs: admin:write:reports: provádět moderátorské akce s hlášeními crypto: používat end-to-end šifrování follow: upravovat vztahy mezi profily + profile: číst pouze základní informace o vašem účtu push: přijímat vaše push oznámení read: vidět všechna data vašeho účtu read:accounts: vidět informace o účtech diff --git a/config/locales/doorkeeper.cy.yml b/config/locales/doorkeeper.cy.yml index e79aa0359f6..f15d74d7214 100644 --- a/config/locales/doorkeeper.cy.yml +++ b/config/locales/doorkeeper.cy.yml @@ -20,7 +20,7 @@ cy: applications: buttons: authorize: Awdurdodi - cancel: Diddymu + cancel: Canslo destroy: Dinistrio edit: Golygu submit: Cyflwyno @@ -72,7 +72,7 @@ cy: revoke: Ydych chi'n siŵr? index: authorized_at: Wedi'i awdurdodi ar %{date} - description_html: Mae'r rhain yn raglenni sy'n gallu cael mynediad i'ch cyfrif gan ddefnyddio'r API. Os oes yna rhaglenni nad ydych chi'n eu hadnabod yma, neu os yw rhaglen yn camymddwyn, gallwch chi ddiddymu ei fynediad. + description_html: Mae'r rhain yn raglenni sy'n gallu cael mynediad i'ch cyfrif gan ddefnyddio'r API. Os oes yna rhaglenni nad ydych chi'n eu hadnabod yma, neu os yw rhaglen yn camymddwyn, gallwch chi ddirymu ei fynediad. last_used_at: Defnyddiwyd ddiwethaf ar %{date} never_used: Erioed wedi'i ddefnyddio scopes: Caniatâd @@ -83,7 +83,8 @@ cy: access_denied: Mae perchennog yr adnodd neu'r gweinydd awdurdodi wedi atal y cais. credential_flow_not_configured: Llif meini prawf cyfrinair perchennog yr adnodd wedi methu achos fod Doorkeeper.configure.resource_owner_from_credentials heb ei ffurfweddu. invalid_client: Methodd dilysu cleient oherwydd cleient anhysbys, dim dilysiad cleient wedi'i gynnwys, neu ddull dilysu heb ei gefnogi. - invalid_grant: Mae'r grant awdurdodi ar yr amod yn annilys, wedi dod i ben, wedi'i ddiddymu, nid yw'n cyfateb i'r URI ailgyfeirio a ddefnyddiwyd yn y cais am awdurdodiad, neu wedi'i roi i gleient arall. + invalid_code_challenge_method: Rhaid i'r dull herio cod fod yn S256, nid oes cefnogaeth i'r plaen. + invalid_grant: Mae'r grant awdurdodi ar yr amod yn annilys, wedi dod i ben, wedi'i ddirymu, nid yw'n cyfateb i'r URI ailgyfeirio a ddefnyddiwyd yn y cais am awdurdodiad, neu wedi'i roi i gleient arall. invalid_redirect_uri: Nid yw'r uri ailgyfeirio a gynhwysir yn ddilys. invalid_request: missing_param: 'Paramedr gofynnol ar goll: %{value}.' @@ -135,6 +136,7 @@ cy: media: Atodiadau cyfryngau mutes: Anwybyddiadau notifications: Hysbysiadau + profile: Eich proffil Mastodon push: Hysbysiadau gwthiadwy reports: Adroddiadau search: Chwilio @@ -165,6 +167,7 @@ cy: admin:write:reports: cyflawni camau cymedroli ar adroddiadau crypto: defnyddio amgryptio ben i ben follow: addasu perthnasau cyfrif + profile: darllen dim ond gwybodaeth proffil eich cyfrif push: derbyn eich hysbysiadau gwthiadwy read: darllen holl ddata eich cyfrif read:accounts: gweld gwybodaeth y cyfrif diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml index d462f43d3bc..cd11dcf4e39 100644 --- a/config/locales/doorkeeper.da.yml +++ b/config/locales/doorkeeper.da.yml @@ -83,6 +83,7 @@ da: access_denied: Ressourceejeren eller godkendelsesserveren afviste anmodningen. credential_flow_not_configured: Ressourceejeradgangskodeakkreditiver-flow mislykkedes grundet ikke-opsat Doorkeeper.configure.resource_owner_from_credentials. invalid_client: Klientgodkendelse mislykkedes grundet en ukendt klient, ingen inkluderet klientgodkendelse eller uunderstøttet godkendelsesmetode. + invalid_code_challenge_method: Kodeudfordringsmetoden skal være S256, simpel (plain) er uunderstøttet. invalid_grant: Den leverede godkendelse er ugyldig, udløbet, ophævet, matcher ikke omdirigerings-URI'en brugt i godkendelsesanmodningen eller er udstedt til en anden klient. invalid_redirect_uri: Inkluderede ormdirigerings-URI er ugyldig. invalid_request: diff --git a/config/locales/doorkeeper.de.yml b/config/locales/doorkeeper.de.yml index f303aa23a26..b29d668b2ed 100644 --- a/config/locales/doorkeeper.de.yml +++ b/config/locales/doorkeeper.de.yml @@ -83,6 +83,7 @@ de: access_denied: Diese Anfrage wurde von den Inhaber*innen oder durch den Autorisierungsserver abgelehnt. credential_flow_not_configured: Das Konto konnte nicht gefunden werden, da Doorkeeper.configure.resource_owner_from_credentials nicht konfiguriert ist. invalid_client: 'Client-Authentisierung ist fehlgeschlagen: Client unbekannt, keine Authentisierung mitgeliefert oder Authentisierungsmethode wird nicht unterstützt.' + invalid_code_challenge_method: Die Code-Challenge-Methode muss „S256“ sein, „plain“ wird nicht unterstützt. invalid_grant: Die beigefügte Autorisierung ist ungültig, abgelaufen, wurde widerrufen oder einem anderen Client ausgestellt, oder der Weiterleitungs-URI stimmt nicht mit der Autorisierungs-Anfrage überein. invalid_redirect_uri: Der beigefügte Weiterleitungs-URI ist ungültig. invalid_request: diff --git a/config/locales/doorkeeper.el.yml b/config/locales/doorkeeper.el.yml index 1cb9b3513bb..167cc6bd44e 100644 --- a/config/locales/doorkeeper.el.yml +++ b/config/locales/doorkeeper.el.yml @@ -4,7 +4,7 @@ el: attributes: doorkeeper/application: name: Όνομα εφαρμογής - redirect_uri: URI Ανακατεύθυνσης (Ενιαίο Αναγνωριστικό Πόρων) + redirect_uri: URI Ανακατεύθυνσης scopes: Εύρος εφαρμογής website: Ιστότοπος εφαρμογής errors: @@ -13,21 +13,21 @@ el: attributes: redirect_uri: fragment_present: δεν μπορεί να περιέχει τμήμα διεύθυνσης. - invalid_uri: πρέπει να είναι έγκυρο URI (Ενιαίο Αναγνωριστικό Πόρων). - relative_uri: πρέπει να είναι απόλυτο URI (Ενιαίο Αναγνωριστικό Πόρων). - secured_uri: πρέπει να είναι HTTPS/SSL URI (Ενιαίο Αναγνωριστικό Πόρων). + invalid_uri: πρέπει να είναι έγκυρο URI. + relative_uri: πρέπει να είναι απόλυτο URI. + secured_uri: πρέπει να είναι HTTPS/SSL URI. doorkeeper: applications: buttons: - authorize: Ενέκρινε + authorize: Έγκριση cancel: Άκυρο destroy: Καταστροφή - edit: Αλλαγή + edit: Επεξεργασία submit: Υποβολή confirmations: destroy: Σίγουρα; edit: - title: Αλλαγή εφαρμογής + title: Επεξεργασία εφαρμογής form: error: Ώπα! Έλεγξε τη φόρμα σου για πιθανά λάθη help: @@ -36,9 +36,9 @@ el: scopes: Διαχώρησε το κάθε εύρος εφαρμογής με κενά. Άστο κενό για χρήση των προεπιλεγμένων ευρών εφαρμογής. index: application: Εφαρμογή - callback_url: URL επιστροφής (Callback) + callback_url: Callback URL delete: Διαγραφή - empty: Δεν έχετε αιτήσεις. + empty: Δεν έχεις εφαρμογές. name: Όνομα new: Νέα εφαρμογή scopes: Εύρος εφαρμογής @@ -49,32 +49,32 @@ el: show: actions: Ενέργειες application_id: Κλειδί πελάτη - callback_urls: URL επιστροφής (Callback) + callback_urls: Callback URLs scopes: Εύρος εφαρμογής secret: Μυστικό πελάτη title: 'Εφαρμογή: %{name}' authorizations: buttons: - authorize: Ενέκρινε - deny: Απόρριψε + authorize: Έγκριση + deny: Απόρριψη error: title: Εμφανίστηκε σφάλμα new: - prompt_html: Ο/Η %{client_name} θα ήθελε άδεια πρόσβασης στο λογαριασμό σας. Είναι μια εφαρμογή από τρίτους. Αν δεν το εμπιστεύεστε, τότε δεν πρέπει να το εξουσιοδοτήσετε. - review_permissions: Αναθεώρηση δικαιωμάτων + prompt_html: Το %{client_name} θα ήθελε άδεια πρόσβασης στο λογαριασμό σου. Είναι μια εφαρμογή τρίτων. Αν δεν το εμπιστεύεσαι, τότε δεν πρέπει να το εγκρίνεις. + review_permissions: Ανασκόπηση δικαιωμάτων title: Απαιτείται έγκριση show: title: Αντέγραψε αυτό τον κωδικό έγκρισης στην εφαρμογή. authorized_applications: buttons: - revoke: Ανακάλεσε + revoke: Ανάκληση confirmations: revoke: Σίγουρα; index: authorized_at: Εξουσιοδοτήθηκε στις %{date} - description_html: Αυτές είναι εφαρμογές που μπορούν να έχουν πρόσβαση στο λογαριασμό σας χρησιμοποιώντας το API. Αν υπάρχουν εφαρμογές που δεν αναγνωρίζετε εδώ ή μια εφαρμογή δεν συμπεριφέρεται σωστά, μπορείτε να ανακαλέσετε την πρόσβασή της. + description_html: Αυτές είναι εφαρμογές που μπορούν να έχουν πρόσβαση στο λογαριασμό σου χρησιμοποιώντας το API. Αν υπάρχουν εφαρμογές που δεν αναγνωρίζεις εδώ ή μια εφαρμογή δεν συμπεριφέρεται σωστά, μπορείς να ανακαλέσεις την πρόσβασή της. last_used_at: Τελευταία χρήση στις %{date} - never_used: Ποτέ σε χρήση + never_used: Δεν έχει χρησιμοποιηθεί scopes: Δικαιώματα superapp: Εσωτερική title: Οι εφαρμογές που έχεις εγκρίνει @@ -84,23 +84,23 @@ el: credential_flow_not_configured: Η ροή Resource Owner Password Credentials απέτυχε επειδή το Doorkeeper.configure.resource_owner_from_credentials δεν έχει ρυθμιστεί. invalid_client: Η ταυτοποίηση του πελάτη απέτυχε είτε λόγω άγνωστου πελάτη, είτε λόγω έλλειψης ταυτοποιημένου πελάτη ή λόγω μη υποστηριζόμενης μεθόδου ταυτοποίησης. invalid_grant: Η άδεια πιστοποίησης που δόθηκε είναι άκυρη, ληγμένη, έχει ανακληθεί, δεν συμφωνεί με το URI ανακατεύθυνσης που δόθηκε στο αίτημα πιστοποίησης ή εκδόθηκε προς άλλο πελάτη. - invalid_redirect_uri: Το URI ανακατεύθυνσης που δόθηκε δεν είναι έγκυρο. + invalid_redirect_uri: Το uri ανακατεύθυνσης που δόθηκε δεν είναι έγκυρο. invalid_request: - missing_param: 'Λείπει η απαιτούμενη παράμετρος: %{value}.' + missing_param: 'Λείπει απαιτούμενη παράμετρος: %{value}.' request_not_authorized: Το αίτημα πρέπει να είναι εξουσιοδοτημένο. Η απαιτούμενη παράμετρος για την έγκριση της αίτησης λείπει ή είναι άκυρη. unknown: Από το αίτημα λείπει μία υποχρεωτική παράμετρος ή περιλαμβάνει μια μη υποστηριζόμενη τιμή ή έχει λανθασμένη μορφή με κάποιο άλλο τρόπο. - invalid_resource_owner: Τα διαπιστευτήρια που έδωσε ο ιδιοκτήτης του πόρου δεν είναι έγκυρα, ή δεν βρέθηκε ο ιδιοκτήτης του πόρου + invalid_resource_owner: Τα διαπιστευτήρια που έδωσε ο ιδιοκτήτης του πόρου δεν είναι έγκυρα ή δεν βρέθηκε ο ιδιοκτήτης του πόρου invalid_scope: Το αιτούμενο εύρος εφαρμογής είναι άκυρο, άγνωστο ή λάθος διατυπωμένο. invalid_token: expired: Το διακριτικό πρόσβασης έληξε revoked: Το διακριτικό πρόσβασης ανακλήθηκε unknown: Το διακριτικό πρόσβασης δεν είναι έγκυρο resource_owner_authenticator_not_configured: Η αναζήτηση του ιδιοκτήτη του πόρου απέτυχε επειδή το Doorkeeper.configure.resource_owner_authenticator δεν έχει ρυθμιστεί. - server_error: Ο εξυπηρετητής έγκρισης (authorization server) αντιμετώπισε μια απροσδόκητη συνθήκη που τον απέτρεψε να ικανοποιήσει το αίτημα. - temporarily_unavailable: Ο εξυπηρετητής έγκρισης (authorization server) προς το παρόν δεν είναι διαθέσιμος να αναλάβει το αίτημα λόγω προσωρινής υπερφόρτωσης ή συντήρησής του. + server_error: Ο εξυπηρετητής έγκρισης αντιμετώπισε μια απροσδόκητη συνθήκη που τον απέτρεψε να ικανοποιήσει το αίτημα. + temporarily_unavailable: Ο εξυπηρετητής έγκρισης προς το παρόν δεν είναι δυνατό να αναλάβει το αίτημα λόγω προσωρινής υπερφόρτωσης ή συντήρησής του. unauthorized_client: Ο πελάτης δεν έχει άδεια να εκτελέσει αυτό το αίτημα χρησιμοποιώντας αυτή τη μέθοδο. - unsupported_grant_type: Το είδος άδειας έγκρισης δεν υποστηρίζεται από τον εξυπηρετητή έγκρισης (authorization server). - unsupported_response_type: Ο εξυπηρετητής έγκρισης (authorization server) δεν υποστηρίζει αυτό το είδος απάντησης. + unsupported_grant_type: Το είδος άδειας έγκρισης δεν υποστηρίζεται από τον εξυπηρετητή έγκρισης. + unsupported_response_type: Ο εξυπηρετητής έγκρισης δεν υποστηρίζει αυτό το είδος απάντησης. flash: applications: create: @@ -122,19 +122,20 @@ el: admin/accounts: Διαχείριση λογαριασμών admin/all: Όλες οι λειτουργίες διαχείρησης admin/reports: Διαχείριση αναφορών - all: Πλήρης πρόσβαση στο λογαριασμό σας στο Mastodon + all: Πλήρης πρόσβαση στο λογαριασμό σου στο Mastodon blocks: Αποκλεισμοί bookmarks: Σελιδοδείκτες conversations: Συνομιλίες crypto: Κρυπτογράφηση από άκρο σε άκρο favourites: Αγαπημένα filters: Φίλτρα - follow: Ακολουθείτε, σε Σίγαση και Αποκλεισμοί - follows: Ακολουθείτε + follow: Ακολουθείς, σε Σίγαση και Αποκλεισμοί + follows: Ακολουθείς lists: Λίστες media: Συνημμένα πολυμέσα - mutes: Αποσιωπήσεις + mutes: Σιγάσεις notifications: Ειδοποιήσεις + profile: Το προφίλ σου στο Mastodon push: Άμεσες ειδοποιήσεις reports: Αναφορές search: Αναζήτηση @@ -147,43 +148,45 @@ el: application: title: Απαιτείται έγκριση OAuth scopes: - admin:read: ανάγνωση δεδομένων στον διακομιστή + admin:read: ανάγνωση όλων των δεδομένων στον διακομιστή admin:read:accounts: ανάγνωση ευαίσθητων πληροφοριών όλων των λογαριασμών admin:read:canonical_email_blocks: ανάγνωση ευαίσθητων πληροφοριών όλων των αποκλεισμένων email admin:read:domain_allows: ανάγνωση ευαίσθητων πληροφοριών όλων των επιτρεπόμενων τομέων admin:read:domain_blocks: ανάγνωση ευαίσθητων πληροφοριών όλων των αποκλεισμένων τομέων admin:read:email_domain_blocks: ανάγνωση ευαίσθητων πληροφοριών όλων των αποκλεισμένων τομέων email admin:read:ip_blocks: ανάγνωση ευαίσθητων πληροφοριών όλων των αποκλεισμένων IP - admin:read:reports: ανάγνωση ευαίσθητων πληροφοριών όλων των καταγγελιών και των καταγγελλομένων λογαριασμών - admin:write: αλλαγή δεδομένων στον διακομιστή - admin:write:accounts: εκτέλεση διαχειριστικών ενεργειών σε λογαριασμούς - admin:write:canonical_email_blocks: εκτέλεση ενεργειών διαχείρισης σε αποκλεισμένα email - admin:write:domain_allows: εκτέλεση ενεργειών διαχείρισης σε επιτρεπτούς τομείς - admin:write:domain_blocks: εκτέλεση ενεργειών διαχείρισης σε αποκλεισμένους τομείς - admin:write:email_domain_blocks: εκτελέστε ενέργειες διαχείρισης σε αποκλεισμένους τομείς email - admin:write:ip_blocks: εκτέλεση ενεργειών διαχείρισης σε αποκλεισμένες IP - admin:write:reports: εκτέλεση διαχειριστικών ενεργειών σε καταγγελίες + admin:read:reports: ανάγνωση ευαίσθητων πληροφοριών όλων των αναφορών και των αναφερομένων λογαριασμών + admin:write: τροποποίηση όλων των δεδομένων στον διακομιστή + admin:write:accounts: εκτέλεση συντονιστικών ενεργειών σε λογαριασμούς + admin:write:canonical_email_blocks: εκτέλεση ενεργειών συντονισμού σε αποκλεισμένα email + admin:write:domain_allows: εκτέλεση ενεργειών συντονισμού σε επιτρεπτούς τομείς + admin:write:domain_blocks: εκτέλεση ενεργειών συντονισμού σε αποκλεισμένους τομείς + admin:write:email_domain_blocks: εκτέλεση ενέργειες συντονισμού σε αποκλεισμένους τομείς email + admin:write:ip_blocks: εκτέλεση ενεργειών συντονισμού σε αποκλεισμένες IP + admin:write:reports: εκτέλεση ενεργειών συντονισμού σε αναφορές crypto: χρήση κρυπτογράφησης από άκρο σε άκρο - follow: να αλλάζει τις σχέσεις με λογαριασμούς - push: να λαμβάνει τις ειδοποιήσεις σου - read: να διαβάζει όλα τα στοιχεία του λογαριασμού σου - read:accounts: να βλέπει τα στοιχεία λογαριασμών - read:blocks: να βλέπει τους αποκλεισμένους σου - read:bookmarks: εμφάνιση των σελιδοδεικτών σας - read:favourites: δείτε τα αγαπημένα σας - read:filters: να βλέπει τα φίλτρα σου - read:follows: δές ποιους ακολουθείς - read:lists: δές τις λίστες σου - read:mutes: να βλέπει ποιους αποσιωπείς - read:notifications: να βλέπει τις ειδοποιήσεις σου - read:reports: να βλέπει τις καταγγελίες σου - read:search: να ψάχνει για εσένα + follow: τροποποίηση σχέσεων λογαριασμών + profile: ανάγνωση μόνο των πληροφοριών προφίλ του λογαριασμού σου + push: λήψη των ειδοποιήσεων σου + read: ανάγνωση όλων των στοιχείων του λογαριασμού σου + read:accounts: προβολή πληροφοριών λογαριασμών + read:blocks: προβολή των αποκλεισμών σου + read:bookmarks: προβολή των σελιδοδεικτών σου + read:favourites: προβολή των αγαπημένα σου + read:filters: προβολή των φίλτρων σου + read:follows: προβολή αυτών που ακολουθείς + read:lists: προβολή των λιστών σου + read:mutes: προβολή των σιγάσεων σου + read:notifications: προβολή των ειδοποιήσεων σου + read:reports: προβολή των αναφορών σου + read:search: αναζήτηση εκ μέρους σου read:statuses: να βλέπει όλες τις δημοσιεύσεις σου write: να αλλάζει όλα τα στοιχεία του λογαριασμού σου write:accounts: να αλλάζει το προφίλ σου write:blocks: να μπλοκάρει λογαριασμούς και τομείς write:bookmarks: προσθήκη σελιδοδεικτών write:conversations: σίγαση και διαγραφή συνομιλιών + write:favourites: αγαπημένες αναρτήσεις write:filters: να δημιουργεί φίλτρα write:follows: ακολουθήστε ανθρώπους write:lists: δημιουργία λιστών diff --git a/config/locales/doorkeeper.en-GB.yml b/config/locales/doorkeeper.en-GB.yml index b3ceffb13f7..f254825b1ba 100644 --- a/config/locales/doorkeeper.en-GB.yml +++ b/config/locales/doorkeeper.en-GB.yml @@ -135,6 +135,7 @@ en-GB: media: Media attachments mutes: Mutes notifications: Notifications + profile: Your Mastodon profile push: Push notifications reports: Reports search: Search @@ -165,6 +166,7 @@ en-GB: admin:write:reports: perform moderation actions on reports crypto: use end-to-end encryption follow: modify account relationships + profile: read only your account's profile information push: receive your push notifications read: read all your account's data read:accounts: see accounts information diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml index b623cc71350..e28f6a79664 100644 --- a/config/locales/doorkeeper.en.yml +++ b/config/locales/doorkeeper.en.yml @@ -83,6 +83,7 @@ en: access_denied: The resource owner or authorization server denied the request. credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured. invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method. + invalid_code_challenge_method: The code challenge method must be S256, plain is unsupported. invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. invalid_redirect_uri: The redirect uri included is not valid. invalid_request: diff --git a/config/locales/doorkeeper.es-AR.yml b/config/locales/doorkeeper.es-AR.yml index 0b04696b6a1..91f41912477 100644 --- a/config/locales/doorkeeper.es-AR.yml +++ b/config/locales/doorkeeper.es-AR.yml @@ -83,6 +83,7 @@ es-AR: access_denied: El propietario del recurso o servidor de autorización denegó la petición. credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso fallaron debido a que "Doorkeeper.configure.resource_owner_from_credentials" está sin configurar. invalid_client: La autenticación del cliente falló debido a que es un cliente desconocido, o no está incluída la autenticación del cliente, o el método de autenticación no está soportado. + invalid_code_challenge_method: El método de desafío de código debe ser S256, «plain» no está soportado. invalid_grant: La concesión de autorización ofrecida no es válida, venció, se revocó, no coincide con la dirección web de redireccionamiento usada en la petición de autorización, o fue emitida para otro cliente. invalid_redirect_uri: La dirección web de redireccionamiento incluida no es válida. invalid_request: diff --git a/config/locales/doorkeeper.es-MX.yml b/config/locales/doorkeeper.es-MX.yml index 54386c4c332..b5987676d28 100644 --- a/config/locales/doorkeeper.es-MX.yml +++ b/config/locales/doorkeeper.es-MX.yml @@ -83,6 +83,7 @@ es-MX: access_denied: El propietario del recurso o servidor de autorización denegó la petición. credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_from_credentials está sin configurar. invalid_client: La autentificación del cliente falló ya que es un cliente desconocido, no está incluída la autentificación del cliente o el método de autentificación no es compatible. + invalid_code_challenge_method: El método de desafío de código debe ser S256, «plain» no está soportado. invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente. invalid_redirect_uri: La URI de redirección incluida no es válida. invalid_request: diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml index 9be036a1d46..b3c7ccddd46 100644 --- a/config/locales/doorkeeper.es.yml +++ b/config/locales/doorkeeper.es.yml @@ -83,6 +83,7 @@ es: access_denied: El propietario del recurso o servidor de autorización denegó la petición. credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_from_credentials está sin configurar. invalid_client: La autentificación del cliente falló debido o a que es un cliente desconocido o no está incluída la autentificación del cliente o el método de autentificación no está confirmado. + invalid_code_challenge_method: El método de desafío de código debe ser S256, «plain» no está soportado. invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente. invalid_redirect_uri: La URI de redirección incluida no es válida. invalid_request: diff --git a/config/locales/doorkeeper.et.yml b/config/locales/doorkeeper.et.yml index 1843031706a..13d3f40fea5 100644 --- a/config/locales/doorkeeper.et.yml +++ b/config/locales/doorkeeper.et.yml @@ -135,6 +135,7 @@ et: media: Lisatud meedia mutes: Vaigistused notifications: Teavitused + profile: Sinu Mastodoni profiil push: Tõuketeated reports: Teavitused search: Otsing @@ -165,6 +166,7 @@ et: admin:write:reports: teostada moderaatori tegevusi teavitustel crypto: kasuta otspunktkrüpeerimist follow: muuta kontode suhteid + profile: loe vaid oma konto profiili infot push: saab tõuketeateid read: lugeda konto kõiki andmeid read:accounts: näha konto informatsiooni diff --git a/config/locales/doorkeeper.fi.yml b/config/locales/doorkeeper.fi.yml index b028c10a826..ce8aef4a9fc 100644 --- a/config/locales/doorkeeper.fi.yml +++ b/config/locales/doorkeeper.fi.yml @@ -4,7 +4,7 @@ fi: attributes: doorkeeper/application: name: Sovelluksen nimi - redirect_uri: Uudelleenohjauksen URI + redirect_uri: Uudelleenohjaus-URI scopes: Oikeudet website: Sovelluksen verkkosivusto errors: @@ -12,10 +12,10 @@ fi: doorkeeper/application: attributes: redirect_uri: - fragment_present: ei voi sisältää osia. + fragment_present: ei voi sisältää ankkuria (#). invalid_uri: on oltava kelvollinen URI. relative_uri: on oltava täysi URI. - secured_uri: on oltava HTTPS/SSL-URI. + secured_uri: on oltava HTTPS-/SSL-URI. doorkeeper: applications: buttons: @@ -31,7 +31,7 @@ fi: form: error: Hupsis! Tarkista, ettei lomakkeessasi ole virheitä help: - native_redirect_uri: Käytä %{native_redirect_uri} paikallisiin testeihin + native_redirect_uri: Käytä tunnistetta %{native_redirect_uri} paikallisiin testeihin redirect_uri: Lisää jokainen URI omalle rivilleen scopes: Erota oikeudet välilyönneillä. Jätä kenttä tyhjäksi, jos haluat käyttää oletusoikeuksia. index: @@ -43,15 +43,15 @@ fi: new: Uusi sovellus scopes: Oikeudet show: Näytä - title: Omat sovellukset + title: Omat sovelluksesi new: title: Uusi sovellus show: actions: Toiminnot - application_id: Ohjelman tunnus + application_id: Asiakasohjelman tunnus callback_urls: Takaisinkutsu-URL:t scopes: Oikeudet - secret: Ohjelman salaisuus + secret: Asiakasohjelman salaisuus title: 'Sovellus: %{name}' authorizations: buttons: @@ -60,14 +60,14 @@ fi: error: title: Tapahtui virhe new: - prompt_html: "%{client_name} pyytää lupaa käyttää tiliäsi. Se on kolmannen osapuolen sovellus. Jos et luota siihen, älä valtuuta sitä." + prompt_html: "%{client_name} pyytää oikeutta käyttää tiliäsi. Se on kolmannen osapuolen sovellus. Jos et luota siihen, älä valtuuta sitä." review_permissions: Tarkista käyttöoikeudet title: Valtuutus vaaditaan show: title: Kopioi tämä valtuutuskoodi ja liitä se sovellukseen. authorized_applications: buttons: - revoke: Hylkää + revoke: Poista confirmations: revoke: Oletko varma? index: @@ -75,19 +75,20 @@ fi: description_html: Nämä sovellukset voivat käyttää tiliäsi ohjelmointirajapinnan kautta. Jos tässä on sovelluksia, joita et tunnista, tai sovellus toimii väärin, voit peruuttaa sen käyttöoikeuden. last_used_at: Käytetty viimeksi %{date} never_used: Ei käytetty - scopes: Oikeudet + scopes: Käyttöoikeudet superapp: Sisäinen - title: Valtuutetut sovellukset + title: Valtuuttamasi sovellukset errors: messages: access_denied: Resurssin omistaja tai valtuutuspalvelin hylkäsi pyynnön. credential_flow_not_configured: Resurssin omistajan salasanatietojen luku epäonnistui, koska asetusta Doorkeeper.configure.resource_owner_from_credentials ei ole konfiguroitu. - invalid_client: Asiakasohjelman valtuutus epäonnistui, koska asiakas on tuntematon, asiakkaan valtuutus ei ollut mukana tai valtuutustapaa ei tueta. - invalid_grant: Valtuutuslupa on virheellinen, umpeutunut, peruttu, valtuutuspyynnössä käytettyä uudelleenohjaus-URI:tä vastaamaton tai myönnetty toiselle asiakkaalle. + invalid_client: Asiakasohjelman todennus epäonnistui, koska asiakas on tuntematon, asiakkaan todennus ei ollut mukana tai todennustapaa ei tueta. + invalid_code_challenge_method: Koodihaastemenetelmän tulee olla S256 – selväkielistä ei tueta. + invalid_grant: Valtuutuslupa on virheellinen, vanhentunut, peruttu, valtuutuspyynnössä käytettyä uudelleenohjaus-URI:tä vastaamaton tai myönnetty toiselle asiakkaalle. invalid_redirect_uri: Uudelleenohjaus-URI on virheellinen. invalid_request: missing_param: 'Vaadittu parametri puuttuu: %{value}.' - request_not_authorized: Pyyntö on hyväksyttävä. Vaadittu parametri pyynnön hyväksymiseksi puuttuu tai on virheellinen. + request_not_authorized: Pyyntö on valtuutettava. Vaadittu parametri pyynnön valtuuttamiseksi puuttuu tai on virheellinen. unknown: Pyynnöstä puuttuu vaadittu parametri, se sisältää tukemattoman parametriarvon tai on muulla tavoin väärin muotoiltu. invalid_resource_owner: Annetut resurssin omistajan tunnnukset ovat virheelliset, tai resurssin omistajaa ei löydy invalid_scope: Pyydetyt oikeudet ovat virheellisiä, tuntemattomia tai väärin muotoiltuja. @@ -129,8 +130,8 @@ fi: crypto: Päästä päähän -salaus favourites: Suosikit filters: Suodattimet - follow: Seuraamiset, mykistykset ja estot - follows: Seuraa + follow: Seuratut, mykistykset ja estot + follows: Seuratut lists: Listat media: Medialiitteet mutes: Mykistykset @@ -139,7 +140,7 @@ fi: push: Puskuilmoitukset reports: Raportit search: Hae - statuses: Viestit + statuses: Julkaisut layouts: admin: nav: @@ -157,18 +158,18 @@ fi: admin:read:ip_blocks: lue arkaluonteisia tietoja kaikista estetyistä IP-osoitteista admin:read:reports: lue arkaluonteisia tietoja kaikista raporteista ja raportoiduista tileistä admin:write: muokkaa kaikkia palvelimen tietoja - admin:write:accounts: suorita valvontatoimia tileille - admin:write:canonical_email_blocks: suorita valvontatoimia estetyille kanonisille sähköpostiosoitteille - admin:write:domain_allows: suorita valvontatoimia sallituille verkkotunnuksille - admin:write:domain_blocks: suorita valvontatoimia estetyille verkkotunnuksille - admin:write:email_domain_blocks: suorita valvontatoimia estetyille sähköpostiverkkotunnuksille - admin:write:ip_blocks: suorita valvontatoimia estetyille IP-osoitteille - admin:write:reports: suorita valvontatoimia raporteille + admin:write:accounts: suorita moderointitoimia tileille + admin:write:canonical_email_blocks: suorita moderointitoimia estetyille kanonisille sähköpostiosoitteille + admin:write:domain_allows: suorita moderointitoimia sallituille verkkotunnuksille + admin:write:domain_blocks: suorita moderointitoimia estetyille verkkotunnuksille + admin:write:email_domain_blocks: suorita moderointitoimia estetyille sähköpostiverkkotunnuksille + admin:write:ip_blocks: suorita moderointitoimia estetyille IP-osoitteille + admin:write:reports: suorita moderointitoimia raporteille crypto: käytä päästä päähän -salausta - follow: muokkaa tilin suhteita + follow: muokkaa tilin seurantasuhteita profile: lue vain tilisi profiilitietoja - push: vastaanota puskuilmoituksiasi - read: lue kaikkia tilin tietoja + push: vastaanota puskuilmoituksesi + read: lue kaikkia tilisi tietoja read:accounts: katso tilien tietoja read:blocks: katso estojasi read:bookmarks: katso kirjanmerkkejäsi @@ -186,7 +187,7 @@ fi: write:blocks: estä tilejä ja verkkotunnuksia write:bookmarks: lisää julkaisuja kirjanmerkkeihin write:conversations: mykistä ja poista keskusteluja - write:favourites: suosikkijulkaisut + write:favourites: lisää julkaisuja suosikkeihin write:filters: luo suodattimia write:follows: seuraa käyttäjiä write:lists: luo listoja diff --git a/config/locales/doorkeeper.fo.yml b/config/locales/doorkeeper.fo.yml index bd9457b620b..29f8cd3387e 100644 --- a/config/locales/doorkeeper.fo.yml +++ b/config/locales/doorkeeper.fo.yml @@ -83,6 +83,7 @@ fo: access_denied: Tilfarseigarin ella váttanarambætarin noktaðu umbønina. credential_flow_not_configured: Resource Owner Password Credentials floymurin eydnaðist ikki. Orsøkin var, at Doorkeeper.configure.resource_owner_from_credentials var ikki sett upp. invalid_client: Viðskiftaraváttan miseydnaðist. Orsøkin var ein ókendur viðskiftari, at eingin viðskiftaraváttan var við ella at váttanarmannagongdin er ókend. + invalid_code_challenge_method: Koduavbjóðingarmetodan má vera S256, einfalt format riggar ikki. invalid_grant: Veitta váttanarheimildin er antin ógildug, útgingin, tikin aftur, samsvarar ikki við endursendingar-URI'ið, sum bleiv brúkt í váttanarumbønini ella var flýggjað øðrum viðskiftara. invalid_redirect_uri: Endursendingar-URI'ið, sum var viðheft, er ógyldugt. invalid_request: diff --git a/config/locales/doorkeeper.ga.yml b/config/locales/doorkeeper.ga.yml index a263a6b15dc..95c3c4d2237 100644 --- a/config/locales/doorkeeper.ga.yml +++ b/config/locales/doorkeeper.ga.yml @@ -5,7 +5,17 @@ ga: doorkeeper/application: name: Ainm feidhmchláir redirect_uri: Atreoraigh URI + scopes: Scóip website: Suíomh gréasáin feidhmchláir + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: ní féidir blúire a bheith ann. + invalid_uri: caithfidh gur URI bailí é. + relative_uri: a bheith ina URI iomlán. + secured_uri: caithfidh gur URI HTTPS/SSL é. doorkeeper: applications: buttons: @@ -16,36 +26,173 @@ ga: submit: Cuir isteach confirmations: destroy: An bhfuil tú cinnte? + edit: + title: Cuir feidhmchlár in eagar + form: + error: Úps! Seiceáil d'fhoirm le haghaidh earráidí féideartha + help: + native_redirect_uri: Úsáid %{native_redirect_uri} le haghaidh tástálacha logánta + redirect_uri: Úsáid líne amháin in aghaidh an URI + scopes: Scóipeanna ar leith le spásanna. Fág bán chun na scóip réamhshocraithe a úsáid. index: application: Ainm feidhmchláir + callback_url: URL aisghlaoch delete: Scrios + empty: Níl aon iarratais agat. name: Ainm + new: Feidhmchlár nua + scopes: Scóip show: Taispeáin + title: D'iarratais + new: + title: Feidhmchlár nua show: + actions: Gníomhartha application_id: Eochair chliaint + callback_urls: URLanna aisghlaoch + scopes: Scóip secret: Rún cliaint title: 'Ainm feidhmchláir: %{name}' authorizations: buttons: authorize: Ceadaigh deny: Diúltaigh + error: + title: Tharla earráid + new: + prompt_html: Ba mhaith le %{client_name} cead rochtain a fháil ar do chuntas. Is iarratas tríú páirtí é. Mura bhfuil muinín agat as, níor cheart duit é a údarú. + review_permissions: Ceadanna a athbhreithniú + title: Tá údarú ag teastáil + show: + title: Cóipeáil an cód údaraithe seo agus greamaigh don fheidhmchlár é. authorized_applications: + buttons: + revoke: Cúlghair confirmations: revoke: An bhfuil tú cinnte? index: + authorized_at: Ceadaithe ar %{date} + description_html: Is feidhmchláir iad seo ar féidir rochtain a fháil ar do chuntas leis an API. Má tá feidhmchláir ann nach n-aithníonn tú anseo, nó má tá feidhmchlár mí-iompair, is féidir leat a rochtain a chúlghairm. + last_used_at: Úsáidte an uair dheireanach ar %{date} + never_used: Ná húsáideadh scopes: Ceadanna superapp: Inmheánach + title: D’iarratais údaraithe + errors: + messages: + access_denied: Shéan úinéir na hacmhainne nó an freastalaí údaraithe an t-iarratas. + credential_flow_not_configured: Theip ar shreabhadh Dintiúir Pasfhocal Úinéir Acmhainne toisc go raibh Doorkeeper.configure.resource_owner_from_credentials díchumraithe. + invalid_client: Theip ar fhíordheimhniú cliant de bharr cliant anaithnid, níl fíordheimhniú cliant san áireamh, nó modh fíordheimhnithe nach dtacaítear leis. + invalid_code_challenge_method: Ní mór gur S256 an modh dúshlán cód, ach ní thacaítear leis. + invalid_grant: Tá an deonú údaraithe ar choinníoll neamhbhailí, imithe in éag, cúlghairthe, nach ionann é agus an URI atreoraithe a úsáideadh san iarratas ar údarú, nó gur eisíodh é chuig cliant eile. + invalid_redirect_uri: Níl an uri atreoraithe atá san áireamh bailí. + invalid_request: + missing_param: 'Paraiméadar riachtanach in easnamh: %{value}.' + request_not_authorized: Ní mór an t-iarratas a údarú. Tá an paraiméadar riachtanach chun iarratas a údarú in easnamh nó neamhbhailí. + unknown: Tá paraiméadar riachtanach in easnamh ar an iarratas, folaíonn sé luach paraiméadar nach dtacaítear leis, nó tá sé míchumtha ar shlí eile. + invalid_resource_owner: Níl na dintiúir úinéara acmhainne a soláthraíodh bailí, nó ní féidir úinéir na hacmhainne a aimsiú + invalid_scope: Tá an scóip iarrtha neamhbhailí, anaithnid nó míchumtha. + invalid_token: + expired: Chuaigh an comhartha rochtana in éag + revoked: Cúlghairmeadh an comhartha rochtana + unknown: Tá an comhartha rochtana neamhbhailí + resource_owner_authenticator_not_configured: Theip ar aimsiú Úinéir Acmhainne toisc go bhfuil Doorkeeper.configure.resource_owner_authenticator díchumraithe. + server_error: Tháinig an freastalaí údaraithe ar riocht gan choinne a chuir cosc ​​air an t-iarratas a chomhlíonadh. + temporarily_unavailable: Ní féidir leis an bhfreastalaí údaraithe an t-iarratas a láimhseáil mar gheall ar ró-ualú sealadach nó cothabháil an fhreastalaí. + unauthorized_client: Níl an cliant údaraithe an t-iarratas seo a dhéanamh leis an modh seo. + unsupported_grant_type: Ní thacaíonn an freastalaí údaraithe leis an gcineál deontais údaraithe. + unsupported_response_type: Ní thacaíonn an freastalaí údaraithe leis an gcineál freagartha seo. + flash: + applications: + create: + notice: Cruthaíodh feidhmchlár. + destroy: + notice: Scriosadh an feidhmchlár. + update: + notice: Feidhmchlár nuashonraithe. + authorized_applications: + destroy: + notice: Cúlghairmeadh an t-iarratas. grouped_scopes: + access: + read: Rochtain inléite-amháin + read/write: Léigh agus scríobh rochtain + write: Rochtain scríofa-amháin title: accounts: Cuntais + admin/accounts: Cuntas a riar + admin/all: Feidhmeanna riaracháin go léir + admin/reports: Tuarascálacha a riar + all: Rochtain iomlán ar do chuntas Mastodon + blocks: Bloic bookmarks: Leabharmharcanna conversations: Comhráite + crypto: Criptiú ceann-go-deireadh + favourites: Ceanáin filters: Scagairí + follow: Leanann, Múchann agus Blocálann follows: Cuntais leanta lists: Liostaí + media: Ceangaltáin meán + mutes: Múchann notifications: Fógraí + profile: Do phróifíl Mastodon + push: Fógraí a bhrú + reports: Tuarascálacha search: Cuardaigh statuses: Postálacha + layouts: + admin: + nav: + applications: Feidhmchláir + oauth2_provider: Soláthraí OAuth2 + application: + title: Tá údarú OAuth riachtanach scopes: + admin:read: léigh na sonraí go léir ar an bhfreastalaí + admin:read:accounts: faisnéis íogair na gcuntas go léir a léamh + admin:read:canonical_email_blocks: léigh faisnéis íogair ar gach bloc ríomhphoist canónach + admin:read:domain_allows: léigh faisnéis íogair gach fearainn + admin:read:domain_blocks: léigh faisnéis íogair gach bloc fearainn + admin:read:email_domain_blocks: léigh faisnéis íogair gach bloc fearainn ríomhphoist + admin:read:ip_blocks: léigh faisnéis íogair gach bloic IP + admin:read:reports: faisnéis íogair na dtuarascálacha agus na gcuntas tuairiscithe go léir a léamh + admin:write: na sonraí go léir ar an bhfreastalaí a mhodhnú + admin:write:accounts: gníomhartha modhnóireachta a dhéanamh ar chuntais + admin:write:canonical_email_blocks: gníomhartha modhnóireachta a dhéanamh ar bhlocanna ríomhphoist chanónacha + admin:write:domain_allows: gníomhartha modhnóireachta a dhéanamh ar cheadaíonn fearainn + admin:write:domain_blocks: gníomhartha modhnóireachta a dhéanamh ar bhlocanna fearainn + admin:write:email_domain_blocks: gníomhartha modhnóireachta a dhéanamh ar bhlocanna fearainn ríomhphoist + admin:write:ip_blocks: gníomhartha modhnóireachta a dhéanamh ar bhlocanna IP + admin:write:reports: gníomhartha modhnóireachta a dhéanamh ar thuarascálacha + crypto: úsáid criptiú ceann-go-ceann + follow: caidrimh chuntais a mhodhnú + profile: léigh faisnéis phróifíle do chuntais amháin + push: faigh do bhrúfhógraí + read: léigh sonraí do chuntais go léir + read:accounts: féach eolas cuntais + read:blocks: féach ar do bloic + read:bookmarks: féach ar do leabharmharcanna + read:favourites: féach ar do cheanáin + read:filters: féach ar do chuid scagairí + read:follows: féach do chuid seo a leanas + read:lists: féach ar do liostaí + read:mutes: féach ar do bhalbh + read:notifications: féach ar do chuid fógraí + read:reports: féach ar do thuarascálacha + read:search: cuardach ar do shon + read:statuses: féach ar gach post + write: sonraí do chuntais go léir a mhodhnú + write:accounts: do phróifíl a mhodhnú + write:blocks: cuntais agus fearainn a bhlocáil + write:bookmarks: poist leabharmharcála + write:conversations: comhráite balbh agus scrios + write:favourites: poist is fearr leat write:filters: cruthaigh scagairí + write:follows: daoine a leanúint write:lists: cruthaigh liostaí + write:media: uaslódáil comhaid meáin + write:mutes: balbhaigh daoine agus comhráite + write:notifications: soiléir do chuid fógraí + write:reports: tuairisc a thabhairt do dhaoine eile + write:statuses: foilsigh poist diff --git a/config/locales/doorkeeper.gd.yml b/config/locales/doorkeeper.gd.yml index 4db4497b4ea..1db1a90f801 100644 --- a/config/locales/doorkeeper.gd.yml +++ b/config/locales/doorkeeper.gd.yml @@ -83,6 +83,7 @@ gd: access_denied: Dhiùlt sealbhadair a’ ghoireis no am frithealaiche ùghdarrachaidh an t-iarrtas. credential_flow_not_configured: Dh’fhàillig le sruth cruthachadh teisteas facail-fhaire do shealbhadair a’ ghoireis ri linn Doorkeeper.configure.resource_owner_from_credentials gun rèiteachadh. invalid_client: Dh’fhàillig le dearbhadh a’ chliant ri linn cliant nach aithne dhuinn, dearbhadh cliant nach deach gabhail a-staigh no dòigh dearbhaidh ris nach cuirear taic. + invalid_code_challenge_method: Feumaidh an dòigh an dùbhlain a bhith na S256, chan eil taic ri plain. invalid_grant: Chan eil an t-ùghdarrachadh a chaidh a thoirt seachad dligheach, dh’fhalbh an ùine air, chaidh a chùl-ghairm no chan eil e a-rèir URI an ath-stiùiridh a chaidh a chleachdadh san iarrtas ùghdarrachaidh no chaidh fhoillseachadh le cliant eile. invalid_redirect_uri: Chan eil an URI ath-stiùiridh a chaidh a ghabhail a-staigh dligheach. invalid_request: @@ -135,6 +136,7 @@ gd: media: Ceanglachain mheadhanan mutes: Mùchaidhean notifications: Brathan + profile: A’ phròifil Mastodon agad push: Brathan putaidh reports: Gearanan search: Lorg @@ -165,6 +167,7 @@ gd: admin:write:reports: gnìomhan na maorsainneachd air gearanan crypto: cleachdadh crioptachaidh o cheann gu ceann follow: atharrachadh dàimhean chunntasan + profile: leughadh fiosrachadh pròifil a’ chunntais agad a-mhàin push: faighinn nam brathan putaidh agad read: leughadh dàta sam bith a’ cunntais agad read:accounts: sealltainn fiosrachadh nan cunntasan diff --git a/config/locales/doorkeeper.he.yml b/config/locales/doorkeeper.he.yml index 7a664c486e2..16a8fc94cf5 100644 --- a/config/locales/doorkeeper.he.yml +++ b/config/locales/doorkeeper.he.yml @@ -83,6 +83,7 @@ he: access_denied: בעלי המשאב או שרת ההרשאה דחו את הבקשה. credential_flow_not_configured: התהליך "Resource Owner Password Credentials" נכשל בשל חוסר בתצורת Doorkeeper.configure.resource_owner_from_credentials. invalid_client: הרשאת הלקוח נכשלה עקב לקוח שאינו ידוע, חוסר בהרשאת לקוח או שיטת הרשאה שאינה נתמכת. + invalid_code_challenge_method: הצופן חייב להיות בשיטת S256, לא תומכים בבלתי מוצפן. invalid_grant: חוזה ההרשאה המצורף אינו חוקי, אינו תקף, מבוטל, או שאינו מתאים לקישורית ההפניה שבשימוש על ידי בקשת ההרשאה, או שהופק על ידי לקוח אחר. invalid_redirect_uri: קישורית ההפניה המצורפת אינה חוקית. invalid_request: diff --git a/config/locales/doorkeeper.hu.yml b/config/locales/doorkeeper.hu.yml index b2e51a47c1f..b3cd00f4bee 100644 --- a/config/locales/doorkeeper.hu.yml +++ b/config/locales/doorkeeper.hu.yml @@ -20,7 +20,7 @@ hu: applications: buttons: authorize: Hitelesítés - cancel: Mégsem + cancel: Mégse destroy: Törlés edit: Szerkesztés submit: Elküldés @@ -51,20 +51,20 @@ hu: application_id: Ügyfélkulcs callback_urls: Visszahívási URL-ek scopes: Hatáskörök - secret: Ügyfél titkos kulcs + secret: Ügyféltitok title: 'Alkalmazás: %{name}' authorizations: buttons: - authorize: Hitelesítés + authorize: Engedélyezés deny: Tiltás error: title: Hiba történt new: prompt_html: "%{client_name} szeretné elérni a fiókodat. Ez egy harmadik féltől származó alkalmazás. Ha nem bízol meg benne, ne addj felhatalmazást neki." review_permissions: Jogosultságok áttekintése - title: Hitelesítés szükséges + title: Engedélyezés szükséges show: - title: Másold le ezt az engedélyező kódot és írd be az alkalmazásba. + title: Másold le ezt az engedélyezési kódot és írd be az alkalmazásba. authorized_applications: buttons: revoke: Visszavonás @@ -83,6 +83,7 @@ hu: access_denied: Az erőforrás tulajdonosa vagy az engedélyező kiszolgáló elutasította a kérést. credential_flow_not_configured: Az erőforrás tulajdonos jelszóadatainak átadása megszakadt, mert a Doorkeeper.configure.resource_owner_from_credentials beállítatlan. invalid_client: A kliens hitelesítése megszakadt, mert ismeretlen a kliens, a kliens nem küldött hitelesítést, vagy a hitelesítés módja nem támogatott. + invalid_code_challenge_method: A kódkihívási módszernek S256-nak kell lennie, az egyszerű kód nem támogatott. invalid_grant: A biztosított hitelesítés érvénytelen, lejárt, visszavont, vagy nem egyezik a hitelesítési kérésben használt URI-val, vagy más kliensnek címezték. invalid_redirect_uri: Az átirányító URI nem valós. invalid_request: diff --git a/config/locales/doorkeeper.is.yml b/config/locales/doorkeeper.is.yml index 84a4d389547..01093f44298 100644 --- a/config/locales/doorkeeper.is.yml +++ b/config/locales/doorkeeper.is.yml @@ -83,6 +83,7 @@ is: access_denied: Eigandi tilfangs eða auðkenningarþjónn höfnuðu beininni. credential_flow_not_configured: Flæði á lykilorðsauðkennum eiganda tilfangs (Resource Owner) brást vegna þess að Doorkeeper.configure.resource_owner_from_credentials er óskilgreint. invalid_client: Auðkenning á biðlara brást vegna þess að biðlarinn er óþekktur, að auðkenning biðlarans fylgdi ekki með, eða að notuð var óstudd auðkenningaraðferð. + invalid_code_challenge_method: Aðferð við ráðningu kóðans verður að vera í S256, hreinn texti er ekki studdur. invalid_grant: Uppgefin auðkenningarheimild er ógild, útrunnin, afturkölluð, samsvarar ekki endurbirtingarslóðinni í auðkenningarbeiðninni, eða var gefin út til annars biðlara. invalid_redirect_uri: Endurbeiningarslóðin sem fylgdi er ekki gild. invalid_request: diff --git a/config/locales/doorkeeper.it.yml b/config/locales/doorkeeper.it.yml index f5df14deac3..9654cb2a20b 100644 --- a/config/locales/doorkeeper.it.yml +++ b/config/locales/doorkeeper.it.yml @@ -83,6 +83,7 @@ it: access_denied: Il proprietario della risorsa o il server d'autorizzazione ha negato la richiesta. credential_flow_not_configured: Il processo delle Credenziali Password del Proprietario della Risorsa è fallito a causa della mancata configurazione di Doorkeeper.configure.resource_owner_from_credentials. invalid_client: Autenticazione del client fallita a causa di un client sconosciuto, di nessun'autenticazione del client inclusa o di un metodo d'autenticazione non supportato. + invalid_code_challenge_method: Il metodo di verifica del codice deve essere S256, semplice non è supportato. invalid_grant: L'autorizzazione fornita non è valida, è scaduta, è stata revocata, non corrisponde all'URI di reindirizzamento utilizzato nella richiesta d'autorizzazione o è stata emessa a un altro client. invalid_redirect_uri: L'uri di reindirizzamento incluso non è valido. invalid_request: diff --git a/config/locales/doorkeeper.kab.yml b/config/locales/doorkeeper.kab.yml index 1b1a7df9576..d79c711e609 100644 --- a/config/locales/doorkeeper.kab.yml +++ b/config/locales/doorkeeper.kab.yml @@ -5,6 +5,7 @@ kab: doorkeeper/application: name: Isem n usnas redirect_uri: URI n uwelleh + scopes: Tinerfadin website: Asmel web n usnas errors: models: @@ -39,6 +40,7 @@ kab: empty: Ulac ɣur-k·m isnasen. name: Isem new: Asnas amaynut + scopes: Tinerfadin show: Ẓer title: Isnasen-ik·im new: @@ -47,6 +49,8 @@ kab: actions: Tigawin application_id: ID n usnas callback_urls: URL n tririt n wawal + scopes: Tinerfadin + secret: Tuffirt n umsaɣ title: 'Asnas: %{name}' authorizations: buttons: @@ -55,6 +59,7 @@ kab: error: title: Tella-d tuccḍa new: + review_permissions: Asenqed n tsirag title: Tlaq tsiregt show: title: Nɣel tangalt n wurag sakkin senteḍ-itt deg usnas. @@ -64,8 +69,12 @@ kab: confirmations: revoke: Tetḥeqqeḍ? index: + authorized_at: Yettwasireg ɣef %{date} description_html: Ha-t-an yisnasen i izemren ad kecmen ɣer umiḍan-ik·im, s useqdec n API. Ma llan yisnasen ur teεqileḍ ara da, neɣ kra n wesnas ur iteddu ara akken ilaq, tzemreḍ ad tekkseḍ anekcum-is. last_used_at: Yettwaseqdec i tikkelt taneggarut ass n %{date} + never_used: Urǧin yettwaseqdac + scopes: Tisirag + superapp: Adigan title: Isnasen-ik·im yettusirgen errors: messages: @@ -82,14 +91,29 @@ kab: destroy: notice: Yettwaḥwi wesnas. grouped_scopes: + access: + read: Anekcum i tɣuri kan + read/write: Anekcum i tɣuri d tira + write: Anekcum i tira kan title: accounts: Imiḍanen admin/accounts: Tadbelt n imiḍan + admin/all: Akk timahilin tinebdalin + admin/reports: Tadbelt n yineqqisen + blocks: Yewḥel + bookmarks: Ticraḍ + conversations: Idiwenniyen crypto: Awgelhen seg yixef ɣer yixef + favourites: Imenyafen filters: Imzizdigen + follow: Aḍfar, asgugem akked usewḥel + follows: Aḍfar lists: Tibdarin - notifications: Tilɣa - push: Tilɣa yettudemmren + media: Imeddayen n umidya + mutes: Yeggugem + notifications: Alɣuten + profile: Amaɣnu-k Mastodon + push: Alɣuten yettudemmren reports: Ineqqisen search: Nadi statuses: Tisuffaɣ @@ -103,7 +127,7 @@ kab: admin:read: ad iɣeṛ akk isefka ɣef uqeddac admin:write: ẓreg akk isefka γef uqeddac follow: beddel assaγen n umiḍan - push: ṭṭef-d tilγa-ik yettwademren + push: ṭṭef-d alɣuten-ik·im yettwademren read: γeṛ akk isefka n umiḍan-ik read:accounts: ẓer isallen n yimiḍanen read:blocks: ẓer imiḍanen i tesḥebseḍ @@ -112,7 +136,7 @@ kab: read:follows: ẓer imeḍfaṛen-ik read:lists: ẓer tibdarin-ik·im read:mutes: ẓer wid i tesgugmeḍ - read:notifications: ad ẓer tilɣa-inek·inem + read:notifications: ad iẓer alɣuten-inek·inem read:reports: ẓer ineqqisen-ik·im read:search: anadi deg umkan-ik·im read:statuses: ẓer meṛṛa tisuffaɣ @@ -124,4 +148,4 @@ kab: write:follows: ḍfeṛ imdanen write:lists: ad yesnulfu tibdarin write:media: ad yessali ifuyla n umidya - write:notifications: sfeḍ tilɣa-k·m + write:notifications: sfeḍ alɣuten-ik·im diff --git a/config/locales/doorkeeper.ko.yml b/config/locales/doorkeeper.ko.yml index 3ab0698d51c..f35333f1df3 100644 --- a/config/locales/doorkeeper.ko.yml +++ b/config/locales/doorkeeper.ko.yml @@ -31,7 +31,7 @@ ko: form: error: 이런! 오류를 확인하세요 help: - native_redirect_uri: "%{native_redirect_uri}에서 로컬 테스트를 할 수 있습니다." + native_redirect_uri: "%{native_redirect_uri}를 이용해 로컬 테스트를 할 수 있습니다" redirect_uri: 한 줄에 하나의 URI를 작성하세요 scopes: 스페이스로 범위를 구분하세요. 빈 칸으로 놔두면 기본 범위를 사용합니다. index: @@ -83,6 +83,7 @@ ko: access_denied: 리소스 소유자 또는 인증 서버가 요청을 거부했습니다. credential_flow_not_configured: Doorkeeper.configure.resource_owner_from_credentials의 설정이 되어있지 않아 리소스 소유자 암호 자격증명이 실패하였습니다. invalid_client: 클라이언트를 확인할 수 없기 때문에 인증이 실패하였습니다. 클라이언트 자격 증명이 포함되지 않았거나 지원되지 않는 메소드입니다. + invalid_code_challenge_method: 코드 챌린지는 S256이어야 합니다. 평문은 지원되지 않습니다. invalid_grant: 제공된 권한 부여가 잘못되거나, 만료되었거나, 취소되었거나, 권한 부여 요청에 사용된 리디렉션 URI가 일치하지 않거나, 다른 클라이언트에 지정되었습니다. invalid_redirect_uri: 리디렉션 URI가 올바르지 않습니다 invalid_request: diff --git a/config/locales/doorkeeper.lt.yml b/config/locales/doorkeeper.lt.yml index 38bb17ad139..d04e4c9f2c9 100644 --- a/config/locales/doorkeeper.lt.yml +++ b/config/locales/doorkeeper.lt.yml @@ -83,6 +83,7 @@ lt: access_denied: Išteklių savininkas (-ė) arba įgaliojimų serveris atmetė užklausą. credential_flow_not_configured: Išteklių savininko slaptažodžio kredencialų srautas nepavyko, nes Doorkeeper.configure.resource_owner_from_credentials nėra nesukonfigūruotas. invalid_client: Kliento tapatybės nustatymas nepavyko dėl nežinomo kliento, neįtraukto kliento tapatybės nustatymo arba nepalaikomo tapatybės nustatymo metodo. + invalid_code_challenge_method: Kodo iššūkio būdas turi būti S256. Paprastas nepalaikomas. invalid_grant: Pateiktas įgaliojimas yra netinkamas, pasibaigęs, panaikintas, neatitinka įgaliojimo užklausoje naudoto nukreipimo URI arba buvo išduotas kitam klientui. invalid_redirect_uri: Nukreipimo uri įtrauktas yra netinkamas. invalid_request: diff --git a/config/locales/doorkeeper.lv.yml b/config/locales/doorkeeper.lv.yml index 5aa5daef3f6..11c50203050 100644 --- a/config/locales/doorkeeper.lv.yml +++ b/config/locales/doorkeeper.lv.yml @@ -25,7 +25,7 @@ lv: edit: Labot submit: Apstiprināt confirmations: - destroy: Vai esi pārliecināts? + destroy: Vai tiešām? edit: title: Labot lietotni form: @@ -69,7 +69,7 @@ lv: buttons: revoke: Atsaukt confirmations: - revoke: Vai esi pārliecināts? + revoke: Vai tiešām? index: authorized_at: Autorizētas %{date} description_html: Šīs ir lietotnes, kas var piekļūt Tavam kontam ar API. Ja šeit ir lietotnes, kuras neatpazīsti, vai lietotne darbojas ne tā, kā paredzēts, vari atsaukt tās piekļuvi. @@ -135,6 +135,7 @@ lv: media: Multividesu pielikumi mutes: Apklusinātie notifications: Paziņojumi + profile: Tavs Mastodon profils push: Uznirstošie paziņojumi reports: Ziņojumi search: Meklēt @@ -165,6 +166,7 @@ lv: admin:write:reports: veikt moderācijas darbības pārskatos crypto: lieto pilnīgu šifrēšanu follow: mainīt konta attiecības + profile: lasīt tikai Tava konta profila informāciju push: saņemt savus push paziņojumus read: lasīt visus sava konta datus read:accounts: apskatīt kontu informāciju diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml index 4115e0a17eb..65ef826d387 100644 --- a/config/locales/doorkeeper.nl.yml +++ b/config/locales/doorkeeper.nl.yml @@ -83,6 +83,7 @@ nl: access_denied: De resource-eigenaar of autorisatie-server weigerde het verzoek. credential_flow_not_configured: De wachtwoordgegevens-flow van de resource-eigenaar is mislukt omdat Doorkeeper.configure.resource_owner_from_credentials niet is ingesteld. invalid_client: Clientverificatie is mislukt door een onbekende client, ontbrekende client-authenticatie of een niet ondersteunde authenticatie-methode. + invalid_code_challenge_method: De code challenge method moet S256 zijn, plain wordt niet ondersteund. invalid_grant: De verstrekte autorisatie is ongeldig, verlopen, ingetrokken, komt niet overeen met de redirect-URI die is opgegeven of werd uitgegeven aan een andere client. invalid_redirect_uri: De opgegeven redirect-URI is ongeldig. invalid_request: @@ -129,7 +130,7 @@ nl: crypto: End-to-end-encryptie favourites: Favorieten filters: Filters - follow: Volgers, genegeerde en geblokkeerde gebruikers + follow: Gevolgde, genegeerde en geblokkeerde gebruikers follows: Volgend lists: Lijsten media: Mediabijlagen diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml index a18a86e9790..bf2da6f8083 100644 --- a/config/locales/doorkeeper.pl.yml +++ b/config/locales/doorkeeper.pl.yml @@ -83,6 +83,7 @@ pl: access_denied: Właściciel zasobu lub serwer autoryzujący odrzuciły żądanie. credential_flow_not_configured: Ścieżka "Resource Owner Password Credentials" zakończyła się błędem, ponieważ Doorkeeper.configure.resource_owner_from_credentials nie został skonfigurowany. invalid_client: Autoryzacja klienta nie powiodła się z powodu nieznanego klienta, braku uwierzytelnienia klienta, lub niewspieranej metody uwierzytelniania. + invalid_code_challenge_method: Metodą wyzwania kodowego musi być S256, plain jest nieobsługiwany. invalid_grant: Grant uwierzytelnienia jest niepoprawny, przeterminowany, unieważniony, nie pasuje do URI przekierowwania użytego w żądaniu uwierzytelnienia, lub został wystawiony przez innego klienta. invalid_redirect_uri: URI przekierowania jest nieprawidłowy. invalid_request: diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml index d7e9353b59b..6b076e9081c 100644 --- a/config/locales/doorkeeper.pt-BR.yml +++ b/config/locales/doorkeeper.pt-BR.yml @@ -135,6 +135,7 @@ pt-BR: media: Mídias anexadas mutes: Silenciados notifications: Notificações + profile: Seu perfil do Mastodon push: Notificações push reports: Denúncias search: Buscar @@ -165,6 +166,7 @@ pt-BR: admin:write:reports: executar ações de moderação em denúncias crypto: usar criptografia de ponta-a-ponta follow: alterar o relacionamento das contas + profile: ler somente as informações do perfil da sua conta push: receber notificações push read: ler todos os dados da sua conta read:accounts: ver informações das contas diff --git a/config/locales/doorkeeper.pt-PT.yml b/config/locales/doorkeeper.pt-PT.yml index f03cee6b3a6..30ea62d9eb5 100644 --- a/config/locales/doorkeeper.pt-PT.yml +++ b/config/locales/doorkeeper.pt-PT.yml @@ -83,6 +83,7 @@ pt-PT: access_denied: O proprietário do recurso ou servidor de autorização negou o pedido. credential_flow_not_configured: As credenciais da palavra-passe do proprietário do recurso falhou devido a que Doorkeeper.configure.resource_owner_from_credentials não foram configuradas. invalid_client: Autenticação do cliente falhou por causa de um cliente desconhecido, nenhum cliente de autenticação incluído ou método de autenticação não suportado. + invalid_code_challenge_method: O método de validação do código tem de ser S256, o método simples não é suportado. invalid_grant: A concessão de autorização fornecida é inválida, expirou, foi revogada, não corresponde à URI de redirecionamento usada no pedido de autorização ou foi emitida para outro cliente. invalid_redirect_uri: A URI de redirecionamento incluída não é válida. invalid_request: diff --git a/config/locales/doorkeeper.sc.yml b/config/locales/doorkeeper.sc.yml index 297d6bd8f0c..4c18e461970 100644 --- a/config/locales/doorkeeper.sc.yml +++ b/config/locales/doorkeeper.sc.yml @@ -110,10 +110,11 @@ sc: accounts: Contos bookmarks: Sinnalibros conversations: Arresonadas + favourites: Preferidos filters: Filtros follows: Sighende lists: Listas - media: Allegados multimediales + media: Elementos multimediales alligongiados notifications: Notìficas push: Notìficas push reports: Informes @@ -139,6 +140,7 @@ sc: read:accounts: bìdere is informatziones in su contu read:blocks: bìdere is blocos tuos read:bookmarks: bìdere is sinnalibros tuos + read:favourites: bide is preferidos tuos read:filters: bìdere is filtros tuos read:follows: bìdere is sighiduras tuas read:lists: bìdere is listas tuas @@ -146,11 +148,11 @@ sc: read:notifications: bìdere is notìficas tuas read:reports: bìdere is sinnalatziones tuas read:search: chircare a nòmine tuo - read:statuses: bìdere totu is istados + read:statuses: bide totu is publicatziones write: modificare totu is datos de su contu tuo write:accounts: modificare su profilu tuo write:blocks: blocare contos e domìnios - write:bookmarks: agiùnghere is istados a is sinnalibros + write:bookmarks: agiunghe is publicatziones a is sinnalibros write:filters: creare filtros write:follows: sighire persones write:lists: creare listas @@ -158,4 +160,4 @@ sc: write:mutes: pònnere persones e arresonadas a sa muda write:notifications: isboidare is notìficas tuas write:reports: sinnalare àteras persones - write:statuses: publicare istados + write:statuses: pùblica diff --git a/config/locales/doorkeeper.sq.yml b/config/locales/doorkeeper.sq.yml index de341540671..651f90b3b4c 100644 --- a/config/locales/doorkeeper.sq.yml +++ b/config/locales/doorkeeper.sq.yml @@ -83,6 +83,7 @@ sq: access_denied: I zoti i burimit ose shërbyesi i autorizimit e hodhi poshtë kërkesën. credential_flow_not_configured: Rrjedha për Kredenciale Fjalëkalimi të të Zotit të Burimit dështoi për shkak se Doorkeeper.configure.resource_owner_from_credentials është i paformësuar. invalid_client: Mirëfilltësimi i klientit dështoi për shkak klienti të panjohur, mospërfshirjeje mirëfilltësimi klienti, ose metode të pambuluar mirëfilltësimi. + invalid_code_challenge_method: Metoda me kod duhet të jetë e llojit S256, e thjeshta nuk mbulohet. invalid_grant: Autorizimi i dhënë është i pavlefshëm, ka skaduar, është shfuqizuar, s’përputhet me URI-n e ridrejtimit të përdorur te kërkesa e autorizimit, ose është emetuar për klient tjetër. invalid_redirect_uri: URI e ridrejtimit s’është e vlefshme. invalid_request: diff --git a/config/locales/doorkeeper.sv.yml b/config/locales/doorkeeper.sv.yml index b46c16d4de0..83927d10977 100644 --- a/config/locales/doorkeeper.sv.yml +++ b/config/locales/doorkeeper.sv.yml @@ -83,6 +83,7 @@ sv: access_denied: Resursägaren eller behörighetsservern nekade begäran. credential_flow_not_configured: Resurs Ägare Lösenord Credentials flöde misslyckades på grund av att Doorkeeper.configure.resource_owner_from_credentials är okonfigurerad. invalid_client: Klientautentisering misslyckades på grund av okänd klient, ingen klientautentisering inkluderad eller icke godkänd autentiseringsmetod. + invalid_code_challenge_method: Kodutmaningsmetoden måste vara S256, en slät stöds inte. invalid_grant: Det beviljade godkännandetillskottet är ogiltigt, upphört, återkallat, matchar inte den omdirigering URI som användes i auktorisationsförfrågan eller har utfärdats till en annan klient. invalid_redirect_uri: Den omdirigerade uri är inte giltig. invalid_request: diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml index b0d0549d1df..3735386ba38 100644 --- a/config/locales/doorkeeper.th.yml +++ b/config/locales/doorkeeper.th.yml @@ -83,6 +83,7 @@ th: access_denied: เจ้าของทรัพยากรหรือเซิร์ฟเวอร์การอนุญาตปฏิเสธคำขอ credential_flow_not_configured: โฟลว์ข้อมูลประจำตัวรหัสผ่านเจ้าของทรัพยากรล้มเหลวเนื่องจากไม่ได้กำหนดค่า Doorkeeper.configure.resource_owner_from_credentials invalid_client: การรับรองความถูกต้องไคลเอ็นต์ล้มเหลวเนื่องจากไคลเอ็นต์ที่ไม่รู้จัก ไม่ได้รวมการรับรองความถูกต้องไคลเอ็นต์ หรือวิธีการรับรองความถูกต้องที่ไม่รองรับ + invalid_code_challenge_method: วิธีการทดสอบรหัสต้องเป็น S256 ไม่รองรับแบบธรรมดา invalid_grant: การให้การรับรองความถูกต้องที่ให้มาไม่ถูกต้อง หมดอายุแล้ว เพิกถอนแล้ว ไม่ตรงกับ URI การเปลี่ยนเส้นทางที่ใช้ในคำขอการรับรองความถูกต้อง หรือออกให้ไคลเอ็นต์อื่น invalid_redirect_uri: URI การเปลี่ยนเส้นทางที่รวมอยู่ไม่ถูกต้อง invalid_request: diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml index 330449b1b5f..41996d96035 100644 --- a/config/locales/doorkeeper.tr.yml +++ b/config/locales/doorkeeper.tr.yml @@ -83,6 +83,7 @@ tr: access_denied: Kaynak sahibi veya yetkilendirme sunucusu isteği reddetti. credential_flow_not_configured: Kaynak Sahibi Parolası Kimlik Bilgileri akışı Doorkeeper.configure.resource_owner_from_credentials 'ın yapılandırılmamış olması nedeniyle başarısız oldu. invalid_client: İstemcinin kimlik doğrulaması bilinmeyen istemci, istemci kimlik doğrulamasının dahil olmaması veya desteklenmeyen kimlik doğrulama yöntemi nedeniyle başarısız oldu. + invalid_code_challenge_method: Kod zorluk metodu S256 olmalı, düz yöntem desteklenmiyor. invalid_grant: Sağlanan yetkilendirme izni geçersiz, süresi dolmuş, iptal edilmiş, yetkilendirme isteğinde kullanılan yönlendirme URL'siyle eşleşmiyor veya başka bir istemciye verilmiş. invalid_redirect_uri: Dahil edilmiş yönlendirme uri'si geçersiz. invalid_request: diff --git a/config/locales/doorkeeper.uk.yml b/config/locales/doorkeeper.uk.yml index ca54fcb65a8..55b91fd69da 100644 --- a/config/locales/doorkeeper.uk.yml +++ b/config/locales/doorkeeper.uk.yml @@ -83,6 +83,7 @@ uk: access_denied: Власник ресурсу або сервер авторизації відхилив Ваш запит. credential_flow_not_configured: Не вдалося перевірити парольні дані клієнту через неналаштований параметр Doorkeeper.configure.resource_owner_from_credentials. invalid_client: Не вдалося аутентифікувати клієнта (клієнт невідомий, аутентифікацію клієнта не увімкнено, або непідтримуваний метод аутентифікації). + invalid_code_challenge_method: Метод виклику коду повинен бути S256, простий не підтримується. invalid_grant: Наданий санкціонований дозвіл недійсний, прострочений, анульований, не відповідає URI перенаправлення, що використовується в запиті авторизації, або був виданий іншому клієнту. invalid_redirect_uri: Включений uri перенаправлення не є дійсним. invalid_request: diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml index d0bdd2cc7b1..5837961737a 100644 --- a/config/locales/doorkeeper.vi.yml +++ b/config/locales/doorkeeper.vi.yml @@ -83,6 +83,7 @@ vi: access_denied: Chủ sở hữu tài nguyên hoặc máy chủ đã từ chối yêu cầu. credential_flow_not_configured: Resource Owner Password Credentials không thành công do Doorkeeper.configure.resource_owner_from_credentials không được định cấu hình. invalid_client: Xác minh ứng dụng khách không thành công do máy khách mơ hồ, không bao gồm xác thực ứng dụng khách hoặc phương thức xác thực không được hỗ trợ. + invalid_code_challenge_method: Phương pháp thử thách mã phải là S256, phương pháp plain không được hỗ trợ. invalid_grant: Yêu cầu không hợp lệ, hết hạn, bị gỡ hoặc không khớp với tài khoản đã cấp phép. Hoặc xung đột với ứng dụng khác. invalid_redirect_uri: URL chuyển hướng không hợp lệ. invalid_request: diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml index 18477bc8458..36bbe2b8745 100644 --- a/config/locales/doorkeeper.zh-CN.yml +++ b/config/locales/doorkeeper.zh-CN.yml @@ -83,6 +83,7 @@ zh-CN: access_denied: 资源所有者或验证服务器拒绝了此请求 credential_flow_not_configured: 由于 Doorkeeper.configure.resource_owner_from_credentials 尚未配置,应用验证授权流程失败。 invalid_client: 由于应用信息未知、未提交认证信息或使用了不支持的认证方式,认证失败 + invalid_code_challenge_method: 代码验证方法必须是 S256,不支持明文。 invalid_grant: 授权方式无效、过期或已被撤销、与授权请求中的回调地址不一致,或使用了其他应用的回调地址 invalid_redirect_uri: 无效的登录回调地址 invalid_request: diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml index d12651a6486..1a4c62fdbf6 100644 --- a/config/locales/doorkeeper.zh-TW.yml +++ b/config/locales/doorkeeper.zh-TW.yml @@ -83,6 +83,7 @@ zh-TW: access_denied: 資源持有者或授權伺服器拒絕請求。 credential_flow_not_configured: 因為 Doorkeeper.configure.resource_owner_from_credentials 未設定,所以資源持有者密碼認證程序失敗。 invalid_client: 用戶端驗證失敗,可能是因為未知的用戶端程式、未包含用戶端驗證、或使用了不支援的認證方法。 + invalid_code_challenge_method: code challenge 方式必須為 S256 (SHA256),不支援 plain 方式。 invalid_grant: 授權申請不正確、逾期、已被註銷、與授權請求內的重新導向 URI 不符、或屬於別的用戶端程式。 invalid_redirect_uri: 包含的重新導向 URI 是不正確的。 invalid_request: diff --git a/config/locales/el.yml b/config/locales/el.yml index 47b2250f0e0..e177bf342af 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -5,14 +5,14 @@ el: contact_missing: Δεν έχει οριστεί contact_unavailable: Μη διαθέσιμο hosted_on: Το Mastodon φιλοξενείται στο %{domain} - title: Σχετικά με + title: Σχετικά accounts: follow: Ακολούθησε followers: one: Ακόλουθος other: Ακόλουθοι following: Ακολουθείτε - instance_actor_flash: Αυτός ο λογαριασμός είναι εικονικός και χρησιμοποιείται για να αντιπροσωπεύει τον ίδιο τον διακομιστή και όχι κάποιον μεμονωμένο χρήστη. Χρησιμοποιείται για σκοπούς συναλλαγών και δεν πρέπει να ανασταλεί. + instance_actor_flash: Αυτός ο λογαριασμός είναι εικονικός και χρησιμοποιείται για να αντιπροσωπεύει τον ίδιο τον διακομιστή και όχι κάποιον μεμονωμένο χρήστη. Χρησιμοποιείται για σκοπούς ομοσπονδίας και δεν πρέπει να ανασταλεί. last_active: τελευταία ενεργός/ή link_verified_on: Η ιδιοκτησία αυτού του συνδέσμου ελέγχθηκε στις %{date} nothing_here: Δεν υπάρχει τίποτα εδώ! @@ -159,7 +159,7 @@ el: unconfirmed_email: Ανεπιβεβαίωτο email undo_sensitized: Άρση ευαίσθητου undo_silenced: Άρση περιορισμού - undo_suspension: Αναίρεση παύσης + undo_suspension: Αναίρεση αναστολής unsilenced_msg: Επιτυχής άρση περιορισμών λογαριασμού του/της %{username} unsubscribe: Κατάργηση εγγραφής unsuspended_msg: Επιτυχής άρση αναστολής λογαριασμού του/της %{username} @@ -167,7 +167,7 @@ el: view_domain: Προβολή περίληψης τομέα warn: Προειδοποίηση web: Διαδίκτυο - whitelisted: Εγκεκριμένοι για συναλλαγές + whitelisted: Εγκεκριμένοι για ομοσπονδία action_logs: action_types: approve_appeal: Έγκριση Έφεσης @@ -185,7 +185,7 @@ el: create_email_domain_block: Δημουργία Αποκλεισμού Τομέα email create_ip_block: Δημιουργία κανόνα IP create_unavailable_domain: Δημιουργία Μη Διαθέσιμου Τομέα - create_user_role: Δημιουργία ρόλου + create_user_role: Δημιουργία Ρόλου demote_user: Υποβιβασμός Χρήστη destroy_announcement: Διαγραφή Ανακοίνωσης destroy_canonical_email_block: Διαγραφή Αποκλεισμού email @@ -226,6 +226,7 @@ el: update_custom_emoji: Ενημέρωση Προσαρμοσμένου Emoji update_domain_block: Ενημέρωση Αποκλεισμού Τομέα update_ip_block: Ενημέρωση κανόνα IP + update_report: Ενημέρωση Αναφοράς update_status: Ενημέρωση Ανάρτησης update_user_role: Ενημέρωση ρόλου actions: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 07eb84ebbef..a7e6ed7a665 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -226,6 +226,7 @@ en-GB: update_custom_emoji: Update Custom Emoji update_domain_block: Update Domain Block update_ip_block: Update IP rule + update_report: Update Report update_status: Update Post update_user_role: Update Role actions: @@ -285,6 +286,7 @@ en-GB: 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 @@ -292,6 +294,7 @@ en-GB: filter_by_action: Filter by action filter_by_user: Filter by user title: Audit log + unavailable_instance: "(domain name unavailable)" announcements: destroyed_msg: Announcement successfully deleted! edit: @@ -468,6 +471,9 @@ en-GB: title: Follow recommendations unsuppress: Restore follow recommendation instances: + audit_log: + title: Recent Audit Logs + view_all: View full audit logs availability: description_html: one: If delivering to the domain fails %{count} day without succeeding, no further delivery attempts will be made unless a delivery from the domain is received. @@ -636,6 +642,7 @@ en-GB: report: 'Report #%{id}' reported_account: Reported account reported_by: Reported by + reported_with_application: Reported with application resolved: Resolved resolved_msg: Report successfully resolved! skip_to_actions: Skip to actions @@ -950,6 +957,7 @@ en-GB: delete: Delete edit_preset: Edit warning preset empty: You haven't defined any warning presets yet. + title: Warning presets webhooks: add_new: Add endpoint delete: Delete diff --git a/config/locales/en.yml b/config/locales/en.yml index 20df80c272f..aab8db18153 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -226,6 +226,7 @@ en: update_custom_emoji: Update Custom Emoji update_domain_block: Update Domain Block update_ip_block: Update IP rule + update_report: Update Report update_status: Update Post update_user_role: Update Role actions: @@ -470,6 +471,9 @@ en: title: Follow recommendations unsuppress: Restore follow recommendation instances: + audit_log: + title: Recent Audit Logs + view_all: View full audit logs availability: description_html: one: If delivering to the domain fails %{count} day without succeeding, no further delivery attempts will be made unless a delivery from the domain is received. @@ -638,6 +642,7 @@ en: report: 'Report #%{id}' reported_account: Reported account reported_by: Reported by + reported_with_application: Reported with application resolved: Resolved resolved_msg: Report successfully resolved! skip_to_actions: Skip to actions @@ -880,7 +885,23 @@ en: action: Check here for more information message_html: "Your object storage is misconfigured. The privacy of your users is at risk." tags: + moderation: + not_trendable: Not trendable + not_usable: Not usable + pending_review: Pending review + review_requested: Review requested + reviewed: Reviewed + title: Status + trendable: Trendable + unreviewed: Unreviewed + usable: Usable + name: Name + newest: Newest + oldest: Oldest + reset: Reset review: Review status + search: Search + title: Hashtags updated_msg: Hashtag settings updated successfully title: Administration trends: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index fda1566e22c..8ebe203560a 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -226,6 +226,7 @@ es-AR: update_custom_emoji: Actualizar emoji personalizado update_domain_block: Actualizar bloque de dominio update_ip_block: Actualizar regla de dirección IP + update_report: Actualizar denuncia update_status: Actualizar mensaje update_user_role: Actualizar rol actions: @@ -470,6 +471,9 @@ es-AR: title: Recom. de cuentas a seguir unsuppress: Restablecer recomendaciones de cuentas para seguir instances: + audit_log: + title: Registros de auditoría recientes + view_all: Ver registros de auditoría completos availability: description_html: one: Si el envío al dominio falla durante %{count} día sin éxito, no se harán más intentos de entrega a menos que se reciba un envío desde el dominio. @@ -638,6 +642,7 @@ es-AR: report: 'Denuncia #%{id}' reported_account: Cuenta denunciada reported_by: Denunciada por + reported_with_application: Denunciado con aplicación resolved: Resueltas resolved_msg: "¡Denuncia exitosamente resuelta!" skip_to_actions: Ir directamente a las acciones @@ -880,7 +885,23 @@ es-AR: action: Revisá acá para más información message_html: "El almacenamiento de tu objeto está mal configurado. La privacidad de tus usuarios está en riesgo." tags: + moderation: + not_trendable: No disponible para tendencia + not_usable: No disponible para uso + pending_review: Revisión pendiente + review_requested: Revisión solicitada + reviewed: Revisada + title: Estado + trendable: Disponible para tendencia + unreviewed: No revisada + usable: Disponible para uso + name: Nombre + newest: Lo más reciente + oldest: Lo más antiguo + reset: Restablecer review: Estado de revisión + search: Buscar + title: Etiquetas updated_msg: La configuración de la etiqueta se actualizó exitosamente title: Administración trends: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 976b7a4f30c..1623d110267 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -226,6 +226,7 @@ es-MX: update_custom_emoji: Actualizar Emoji Personalizado update_domain_block: Actualizar el Bloqueo de Dominio update_ip_block: Actualizar regla IP + update_report: Actualizar informe update_status: Actualizar Estado update_user_role: Actualizar Rol actions: @@ -470,6 +471,9 @@ es-MX: title: Recomendaciones de cuentas unsuppress: Restaurar recomendaciones de cuentas instances: + audit_log: + title: Registros de auditoría recientes + view_all: Ver registros de auditoría completos availability: description_html: one: Si el envío al dominio falla %{count} día sin éxito, no se harán más intentos de entrega a menos que se reciba un envío desde el dominio. @@ -638,6 +642,7 @@ es-MX: report: 'Reportar #%{id}' reported_account: Cuenta reportada reported_by: Reportado por + reported_with_application: Informado a través de la aplicación resolved: Resuelto resolved_msg: "¡La denuncia se ha resuelto correctamente!" skip_to_actions: Ir directamente a las acciones @@ -880,7 +885,23 @@ es-MX: action: Para más información aquí message_html: "Su almacenamiento no está configurado. Está en riesgo la privacidad de sus usuarios." tags: + moderation: + not_trendable: No puede ser tendencia + not_usable: No disponible + pending_review: Pendientes de revisión + review_requested: Revisión solicitada + reviewed: Revisada + title: Estado + trendable: Puede ser tendencia + unreviewed: Sin revisar + usable: Disponible + name: Nombre + newest: Más reciente + oldest: Menos reciente + reset: Reiniciar review: Estado de revisión + search: Buscar + title: Etiquetas updated_msg: Hashtags actualizados exitosamente title: Administración trends: diff --git a/config/locales/es.yml b/config/locales/es.yml index aef5100a6d1..9e3689557ac 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -226,6 +226,7 @@ es: update_custom_emoji: Actualizar Emoji Personalizado update_domain_block: Actualizar el Bloqueo de Dominio update_ip_block: Actualizar regla IP + update_report: Actualizar informe update_status: Actualizar Publicación update_user_role: Actualizar Rol actions: @@ -470,6 +471,9 @@ es: title: Recomendaciones de cuentas unsuppress: Restaurar recomendaciones de cuentas instances: + audit_log: + title: Registros de auditoría recientes + view_all: Ver registros de auditoría completos availability: description_html: one: Si el envío al dominio falla %{count} día sin éxito, no se harán más intentos de entrega a menos que se reciba un envío desde el dominio. @@ -638,6 +642,7 @@ es: report: 'Reportar #%{id}' reported_account: Cuenta reportada reported_by: Reportado por + reported_with_application: Informado a través de la aplicación resolved: Resuelto resolved_msg: "¡La denuncia se ha resuelto correctamente!" skip_to_actions: Ir directamente a las acciones @@ -880,7 +885,23 @@ es: action: Haga clic aquí para obtener más información message_html: "El almacenamiento de su objeto está mal configurado. La privacidad de sus usuarios está en riesgo." tags: + moderation: + not_trendable: No puede ser tendencia + not_usable: No disponible + pending_review: Pendientes de revisión + review_requested: Revisión solicitada + reviewed: Revisada + title: Estado + trendable: Puede ser tendencia + unreviewed: Sin revisar + usable: Disponible + name: Nombre + newest: Más reciente + oldest: Menos reciente + reset: Reiniciar review: Estado de revisión + search: Buscar + title: Etiquetas updated_msg: Hashtags actualizados exitosamente title: Administración trends: diff --git a/config/locales/et.yml b/config/locales/et.yml index 172aad25b93..30d75d25ee4 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -285,6 +285,7 @@ et: update_custom_emoji_html: "%{name} uuendas emotikoni %{target}" update_domain_block_html: "%{name} uuendas domeeni %{target} keeldu" update_ip_block_html: "%{name} muutis IP-aadressi %{target} reeglit" + update_report_html: "%{name} uuendas raportit %{target}" update_status_html: "%{name} muutis %{target} postitust" update_user_role_html: "%{name} muutis %{target} rolli" deleted_account: kustutatud konto @@ -292,6 +293,7 @@ et: filter_by_action: Filtreeri tegevuse järgi filter_by_user: Filtreeri kasutaja järgi title: Auditilogi + unavailable_instance: "(domeeni nimi pole saadaval)" announcements: destroyed_msg: Teadaande kustutamine õnnestus! edit: @@ -751,6 +753,7 @@ et: desc_html: See tugineb välistele hCaptcha skriptidele, mis võib olla turvalisuse ja privaatsuse probleem. Lisaks võib see muuta registreerimisprotsessi mõnede inimeste (eriti puudega inimeste) jaoks, oluliselt vähem ligipääsetavaks. Neil põhjustel kaalu palun teisi võimalusi, näiteks kinnitamis- või kutsepõhiseid registreerimislahendusi. title: Nõua uutelt kasutajatelt konto kinnitamiseks CAPTCHA lahendamist content_retention: + danger_zone: Ohutsoon preamble: Määra, kuidas kasutajate loodud sisu Mastodonis talletatakse. title: Sisu talletamine default_noindex: @@ -770,7 +773,7 @@ et: disabled: Mitte kellelegi users: Sisseloginud kohalikele kasutajatele registrations: - moderation_recommandation: Enne registreeringute avamist kõigile veendu, et oleks olemas adekvaatne ja reageerimisvalmis modereerijaskond! + moderation_recommandation: Enne kõigi jaoks registreerimise avamist veendu, et oleks olemas adekvaatne ja reageerimisvalmis modereerijaskond! preamble: Kes saab serveril konto luua. title: Registreerimised registrations_mode: @@ -791,7 +794,7 @@ et: software_updates: critical_update: Kriitiline — uuenda kiiresti description: On soovitav hoida oma Mastodoni paigaldus kõige uuemal kujul, et saada kasu kõige värskematest parandustest ja oskustest. Lisaks, vahel on Mastodoni kiire uuendamine kriitiline, et vältida turvaprobleeme. Neil põhjustel kontrollib Mastodon uuendusi iga 30 minuti tagant ja teavitab sind vastavalt su e-posti teavituste eelistustele. - documentation_link: Saa rohkem teada + documentation_link: Vaata lisa release_notes: Väljalaskemärkused title: Saadaval uuendused type: Tüüp @@ -949,6 +952,7 @@ et: delete: Kustuta edit_preset: Hoiatuse eelseadistuse muutmine empty: Hoiatuste eelseadeid pole defineeritud. + title: Hoiatuste eelhäälestused webhooks: add_new: Lisa lõpp-punkt delete: Kustuta @@ -1814,8 +1818,8 @@ et: title: Arhiivi väljavõte failed_2fa: details: 'Sisenemise üksikasjad:' - explanation: Keegi püüdis Su kontole siseneda, ent sisestas vale teisese autentimisfaktori. - further_actions_html: Kui see polnud Sina, siis soovitame viivitamata %{action}, kuna see võib olla lekkinud. + explanation: Keegi püüdis Su kontole siseneda, ent sisestas vale kaheastmelise autentimise faktori. + further_actions_html: Kui see polnud Sina, siis soovitame viivitamata %{action}, kuna see võib olla ohus. subject: Kaheastmelise autentimise nurjumine title: Kaheastmeline autentimine nurjus suspicious_sign_in: @@ -1857,9 +1861,9 @@ et: silence: Konto limiteeritud suspend: Konto kustutatud welcome: - apps_android_action: Google Play poest + apps_android_action: Laadi see Google Playst apps_ios_action: Allalaadimine App Store'ist - apps_step: Meie ametlikud rakendused. + apps_step: Laadi meie ametlikud rakendused. apps_title: Mastodoni rakendused checklist_subtitle: 'Kuidas sel uudsel sotsiaalmeediarindel pihta hakata:' checklist_title: Millest alustada @@ -1872,7 +1876,7 @@ et: feature_audience_title: Kogu enesekindlalt jälgijaid feature_control: Tead ise kõige paremini, mida soovid oma koduvoos näha. Ei aega raiskavaid algoritme ega reklaame. Jälgi ühe kasutajakonto kaudu keda iganes mistahes Mastodoni serveris ja näe postitusi ajalises järjestuses, muutes oma nurgakese Internetist rohkem endale meelepärasemaks. feature_control_title: Säilita oma ajajoone üle kontroll - feature_creativity: Mastodon toetab audiot, video- ja pildipostitusi, liigipääsetavuse kirjeldusi, küsitlusi, sisuhoiatusi, animeeritud avatare, kohandatud emotikone, pisipiltide lõikeeelistusi ja enamatki, et end võrgus väljendada. Kas avaldad kunsti, muusikat või taskuhäälingusaadet, Mastodon on mõeldud Sinu jaoks. + feature_creativity: Mastodon toetab audiot, video- ja pildipostitusi, ligipääsetavuse kirjeldusi, küsitlusi, sisuhoiatusi, animeeritud avatare, kohandatud emotikone, pisipiltide lõikeeelistusi ja enamatki, et end võrgus väljendada. Kas avaldad kunsti, muusikat või taskuhäälingut, Mastodon on mõeldud Sinu jaoks. feature_creativity_title: Võrreldamatu loovus feature_moderation: Mastodon annab otsustusõiguse tagasi Sinu kätte. Igal serveril on oma reeglid ja regulatsioonid, mida hallatakse kohapeal, mitte nagu ülalt-alla korporatiivses sotsiaalmeedias, võimaldades enim paindlikku vastavust erinevate vajadustega gruppide ja inimeste eelistustele. Liitu sobivate reeglitega serveriga, või käivita oma server. feature_moderation_title: Modereerimine, nagu see olema peab diff --git a/config/locales/fi.yml b/config/locales/fi.yml index f108718e5ee..28906f9dbfc 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -12,24 +12,24 @@ fi: one: seuraaja other: seuraajaa following: seurattu(a) - instance_actor_flash: Tämä tili on virtuaalinen toimija, jota käytetään edustamaan itse palvelinta eikä yksittäistä käyttäjää. Sitä käytetään liittoutumistarkoituksiin, eikä sitä tule jäädyttää. + instance_actor_flash: Tämä tili on virtuaalinen toimija, jota käytetään edustamaan itse palvelinta eikä yksittäistä käyttäjää. Sitä käytetään federointitarkoituksiin, eikä sitä tule jäädyttää. last_active: viimeksi aktiivinen link_verified_on: Tämän linkin omistus on tarkastettu %{date} nothing_here: Täällä ei ole mitään! pin_errors: - following: Sinun täytyy seurata henkilöä jota haluat tukea + following: Sinun täytyy seurata käyttäjää, jota haluat tukea posts: one: Julkaisu other: viestiä posts_tab_heading: Julkaisut admin: account_actions: - action: Suorita toimenpide - title: Suorita valvontatoimi käyttäjälle %{acct} + action: Suorita toimi + title: Suorita moderointitoimi käyttäjälle %{acct} account_moderation_notes: create: Jätä muistiinpano - created_msg: Valvontamuistiinpanon luonti onnistui! - destroyed_msg: Valvontamuistiinpanon poisto onnistui! + created_msg: Moderointimuistiinpanon luonti onnistui! + destroyed_msg: Moderointimuistiinpanon poisto onnistui! accounts: add_email_domain_block: Estä sähköpostiverkkotunnus approve: Hyväksy @@ -38,17 +38,17 @@ fi: avatar: Profiilikuva by_domain: Verkkotunnus change_email: - changed_msg: Sähköpostin vaihto onnistui! - current_email: Nykyinen sähköposti - label: Vaihda sähköposti - new_email: Uusi sähköposti - submit: Vaihda sähköposti + changed_msg: Sähköpostiosoitteen vaihto onnistui! + current_email: Nykyinen sähköpostiosoite + label: Vaihda sähköpostiosoite + new_email: Uusi sähköpostiosoite + submit: Vaihda sähköpostiosoite title: Vaihda käyttäjän %{username} sähköposti-osoite change_role: - changed_msg: Rooli vaihdettu onnistuneesti! - label: Vaihda roolia + changed_msg: Roolin vaihto onnistui! + label: Vaihda rooli no_role: Ei roolia - title: Vaihda käyttäjän %{username} roolia + title: Vaihda käyttäjän %{username} rooli confirm: Vahvista confirmed: Vahvistettu confirming: Vahvistetaan @@ -57,23 +57,23 @@ fi: deleted: Poistettu demote: Alenna destroyed_msg: Käyttäjän %{username} tiedot ovat nyt jonossa poistettavaksi välittömästi - disable: Poista käytöstä - disable_sign_in_token_auth: Poista sähköpostitunnuksen todennus käytöstä - disable_two_factor_authentication: Poista 2FA käytöstä - disabled: Poistettu käytöstä + disable: Jäädytä + disable_sign_in_token_auth: Poista sähköpostitunnuksella todennus käytöstä + disable_two_factor_authentication: Poista kaksivaiheinen todennus käytöstä + disabled: Jäädytetty display_name: Näyttönimi domain: Verkkotunnus edit: Muokkaa - email: Sähköposti - email_status: Sähköpostin tila - enable: Ota käyttöön - enable_sign_in_token_auth: Ota sähköpostitunnuksen todennus käyttöön + email: Sähköpostiosoite + email_status: Sähköpostiosoitteen tila + enable: Kumoa jäädytys + enable_sign_in_token_auth: Ota sähköpostitunnuksella todennus käyttöön enabled: Käytössä - enabled_msg: Käyttäjän %{username} tili palautettu onnistuneesti käyttöön + enabled_msg: Käyttäjän %{username} tilin jäädytys kumottiin onnistuneesti followers: Seuraajat follows: Seuratut header: Otsakekuva - inbox_url: Saapuvan postilaatikon osoite + inbox_url: Postilaatikon osoite invite_request_text: Syitä liittymiseen invited_by: Kutsuja ip: IP-osoite @@ -86,24 +86,24 @@ fi: login_status: Sisäänkirjautumisen tila media_attachments: Medialiitteet memorialize: Muuta muistosivuksi - memorialized: Muutettu muistotiliksi - memorialized_msg: Käyttäjän %{username} tili muutettu onnistuneesti muistotiliksi + memorialized: Muutettu muistosivuksi + memorialized_msg: Käyttäjän %{username} tili muutettiin muistosivuksi onnistuneesti moderation: - active: Aktiivinen + active: Aktiiviset all: Kaikki - disabled: Ei käytössä + disabled: Eivät käytössä pending: Odottavat - silenced: Rajoitettu - suspended: Jäädytetty - title: Valvonta - moderation_notes: Valvontamuistiinpanot + silenced: Rajoitetut + suspended: Jäädytetyt + title: Moderointi + moderation_notes: Moderointimuistiinpanot most_recent_activity: Viimeisin toiminta - most_recent_ip: Viimeisin IP + most_recent_ip: Viimeisin IP-osoite no_account_selected: Tilejä ei muutettu, koska yhtään ei ollut valittuna - no_limits_imposed: Rajoituksia ei ole asetettu - no_role_assigned: Roolia ei ole määritetty + no_limits_imposed: Ei asetettuja rajoituksia + no_role_assigned: Roolia ei asetettu not_subscribed: Ei tilaaja - pending: Odottaa tarkistusta + pending: Odottaa tarkastusta perform_full_suspension: Jäädytä previous_strikes: Aiemmat varoitukset previous_strikes_description_html: @@ -113,34 +113,34 @@ fi: protocol: Protokolla public: Julkinen push_subscription_expires: PuSH-tilaus vanhenee - redownload: Päivitä profiilikuva - redownloaded_msg: Käyttäjän %{username} profiilin päivittäminen alkuperästä onnistui + redownload: Päivitä profiili + redownloaded_msg: Käyttäjän %{username} profiili päivitettiin alkuperästä onnistuneesti reject: Hylkää rejected_msg: Käyttäjän %{username} rekisteröitymishakemus hylättiin remote_suspension_irreversible: Tämän tilin tiedot on poistettu peruuttamattomasti. remote_suspension_reversible_hint_html: Tili on jäädytetty omalla palvelimellaan, ja kaikki tiedot poistetaan %{date}. Sitä ennen etäpalvelin voi palauttaa tilin ongelmitta. Jos haluat poistaa kaikki tilin tiedot heti, onnistuu se alta. remove_avatar: Poista profiilikuva remove_header: Poista otsakekuva - removed_avatar_msg: Käyttäjän %{username} avatar-kuva poistettu onnistuneesti + removed_avatar_msg: Käyttäjän %{username} avatar-kuva poistettiin onnistuneesti removed_header_msg: Käyttäjän %{username} otsakekuva poistettiin onnistuneesti resend_confirmation: already_confirmed: Tämä käyttäjä on jo vahvistettu send: Lähetä vahvistuslinkki uudelleen - success: Vahvistuslinkki on lähetetty! + success: Vahvistuslinkin lähetys onnistui! reset: Palauta reset_password: Palauta salasana resubscribe: Tilaa uudelleen role: Rooli search: Hae - search_same_email_domain: Muut käyttäjät, joilla on sama sähköpostin verkkotunnus + search_same_email_domain: Muut käyttäjät, joilla on sama sähköpostiverkkotunnus search_same_ip: Muut käyttäjät, joilla on sama IP-osoite security: Turvallisuus security_measures: only_password: Vain salasana - password_and_2fa: Salasana ja kaksivaiheinen tunnistautuminen + password_and_2fa: Salasana ja kaksivaiheinen todennus sensitive: Pakota arkaluonteiseksi sensitized: Merkitty arkaluonteiseksi - shared_inbox_url: Jaetun saapuvan postilaatikon osoite + shared_inbox_url: Jaetun postilaatikon osoite show: created_reports: Tämän tilin luomat raportit targeted_reports: Tästä tilistä tehdyt raportit @@ -154,31 +154,31 @@ fi: suspension_irreversible: Tämän tilin tiedot on poistettu peruuttamattomasti. Voit kumota tilin jäädytyksen, jolloin siitä tulee käyttökelpoinen, mutta toiminto ei palauta sillä aiemmin olleita tietoja. suspension_reversible_hint_html: Tili on jäädytetty, ja tiedot poistetaan kokonaan %{date}. Siihen asti tili voidaan palauttaa ongelmitta. Jos haluat poistaa kaikki tilin tiedot heti, onnistuu se alta. title: Tilit - unblock_email: Poista sähköpostiosoitteen esto + unblock_email: Kumoa sähköpostiosoitteen esto unblocked_email_msg: Käyttäjän %{username} sähköpostiosoitteen esto kumottiin - unconfirmed_email: Sähköpostia ei vahvistettu + unconfirmed_email: Vahvistamaton sähköpostiosoite undo_sensitized: Kumoa pakotus arkaluonteiseksi undo_silenced: Kumoa rajoitus - undo_suspension: Peru jäähy - unsilenced_msg: Tilin %{username} rajoituksen kumoaminen onnistui + undo_suspension: Kumoa jäädytys + unsilenced_msg: Tilin %{username} rajoitus kumottiin onnistuneesti unsubscribe: Lopeta tilaus - unsuspended_msg: Tilin %{username} jäädytyksen kumoaminen onnistui + unsuspended_msg: Tilin %{username} jäädytys kumottiin onnistuneesti username: Käyttäjänimi view_domain: Näytä verkkotunnuksen yhteenveto warn: Varoita web: Verkko - whitelisted: Sallittu liittoutua + whitelisted: Salli federointi action_logs: action_types: approve_appeal: Hyväksy valitus approve_user: Hyväksy käyttäjä - assigned_to_self_report: Määritä raportti - change_email_user: Vaihda sähköposti käyttäjälle - change_role_user: Muuta käyttäjän roolia + assigned_to_self_report: Ota raportti käsiteltäväksi + change_email_user: Vaihda käyttäjän sähköpostiosoite + change_role_user: Vaihda käyttäjän rooli confirm_user: Vahvista käyttäjä create_account_warning: Luo varoitus create_announcement: Luo tiedote - create_canonical_email_block: Luo sähköpostin esto + create_canonical_email_block: Luo sähköpostiosoitteen esto create_custom_emoji: Luo mukautettu emoji create_domain_allow: Luo verkkotunnuksen salliminen create_domain_block: Luo verkkotunnuksen esto @@ -188,7 +188,7 @@ fi: create_user_role: Luo rooli demote_user: Alenna käyttäjä destroy_announcement: Poista tiedote - destroy_canonical_email_block: Poista sähköpostin esto + destroy_canonical_email_block: Poista sähköpostiosoitteen esto destroy_custom_emoji: Poista mukautettu emoji destroy_domain_allow: Poista verkkotunnuksen salliminen destroy_domain_block: Poista verkkotunnuksen esto @@ -198,27 +198,27 @@ fi: destroy_status: Poista julkaisu destroy_unavailable_domain: Poista ei-saatavilla oleva verkkotunnus destroy_user_role: Hävitä rooli - disable_2fa_user: Poista kaksivaiheinen tunnistautuminen käytöstä + disable_2fa_user: Poista kaksivaiheinen todennus käytöstä disable_custom_emoji: Poista mukautettu emoji käytöstä - disable_sign_in_token_auth_user: Estä käyttäjältä sähköpostitunnuksen todennus + disable_sign_in_token_auth_user: Poista sähköpostitunnuksella todennus käytöstä käyttäjältä disable_user: Poista tili käytöstä - enable_custom_emoji: Käytä mukautettuja emojeita - enable_sign_in_token_auth_user: Salli käyttäjälle sähköpostitunnuksen todennus + enable_custom_emoji: Ota mukautettu emoji käyttöön + enable_sign_in_token_auth_user: Salli käyttäjälle sähköpostitunnuksella todennus enable_user: Ota tili käyttöön memorialize_account: Muuta muistotiliksi - promote_user: Käyttäjä ylennetty + promote_user: Ylennä käyttäjä reject_appeal: Hylkää valitus reject_user: Hylkää käyttäjä - remove_avatar_user: Profiilikuvan poisto - reopen_report: Uudelleenavaa raportti + remove_avatar_user: Poista profiilikuva + reopen_report: Avaa raportti uudelleen resend_user: Lähetä vahvistusviesti uudelleen - reset_password_user: Nollaa salasana + reset_password_user: Palauta salasana resolve_report: Selvitä raportti - sensitive_account: Pakotus arkaluonteiseksi tiliksi + sensitive_account: Pakota arkaluonteiseksi tiliksi silence_account: Rajoita tiliä suspend_account: Jäädytä tili - unassigned_report: Peruuta raportin määritys - unblock_email_account: Poista sähköpostiosoitteen esto + unassigned_report: Poista raportti käsittelystä + unblock_email_account: Kumoa sähköpostiosoitteen esto unsensitive_account: Kumoa pakotus arkaluonteiseksi tiliksi unsilence_account: Kumoa tilin rajoitus unsuspend_account: Kumoa tilin jäädytys @@ -226,48 +226,49 @@ fi: update_custom_emoji: Päivitä mukautettu emoji update_domain_block: Päivitä verkkotunnuksen esto update_ip_block: Päivitä IP-sääntö + update_report: Päivitä raportti update_status: Päivitä julkaisu update_user_role: Päivitä rooli actions: - approve_appeal_html: "%{name} hyväksyi valvontapäätöksen valituksen käyttäjältä %{target}" - approve_user_html: "%{name} hyväksyi käyttäjän rekisteröitymisen kohteesta %{target}" - assigned_to_self_report_html: "%{name} otti raportin %{target} tehtäväkseen" + approve_appeal_html: "%{name} hyväksyi käyttäjän %{target} valituksen moderointipäätöksestä" + approve_user_html: "%{name} hyväksyi käyttäjän %{target} rekisteröitymisen" + assigned_to_self_report_html: "%{name} otti raportin %{target} käsiteltäväkseen" change_email_user_html: "%{name} vaihtoi käyttäjän %{target} sähköpostiosoitteen" - change_role_user_html: "%{name} muutti käyttäjän %{target} roolia" + change_role_user_html: "%{name} vaihtoi käyttäjän %{target} roolin" confirm_user_html: "%{name} vahvisti käyttäjän %{target} sähköpostiosoitteen" create_account_warning_html: "%{name} lähetti varoituksen käyttäjälle %{target}" create_announcement_html: "%{name} loi uuden tiedotteen %{target}" - create_canonical_email_block_html: "%{name} esti sähköpostin tiivisteellä %{target}" + create_canonical_email_block_html: "%{name} esti tiivistettä %{target} vastaavan sähköpostiosoitteen" create_custom_emoji_html: "%{name} lähetti uuden emojin %{target}" - create_domain_allow_html: "%{name} salli liittoutumisen verkkotunnuksen %{target} kanssa" + create_domain_allow_html: "%{name} salli federoinnin verkkotunnuksen %{target} kanssa" create_domain_block_html: "%{name} esti verkkotunnuksen %{target}" create_email_domain_block_html: "%{name} esti sähköpostiverkkotunnuksen %{target}" - create_ip_block_html: "%{name} loi IP-säännön %{target}" + create_ip_block_html: "%{name} loi säännön IP-osoitteelle %{target}" create_unavailable_domain_html: "%{name} pysäytti toimituksen verkkotunnukseen %{target}" create_user_role_html: "%{name} loi roolin %{target}" demote_user_html: "%{name} alensi käyttäjän %{target}" destroy_announcement_html: "%{name} poisti tiedotteen %{target}" - destroy_canonical_email_block_html: "%{name} poisti sähköpostin eston tiivisteellä %{target}" + destroy_canonical_email_block_html: "%{name} kumosi eston tiivistettä %{target} vastaavalta sähköpostiosoitteelta" destroy_custom_emoji_html: "%{name} poisti emojin %{target}" - destroy_domain_allow_html: "%{name} kielsi liittoutumisen verkkotunnuksen %{target} kanssa" - destroy_domain_block_html: "%{name} poisti verkkotunnuksen %{target} eston" - destroy_email_domain_block_html: "%{name} poisti sähköpostiverkkotunnuksen %{target} eston" + destroy_domain_allow_html: "%{name} kielsi federoinnin verkkotunnuksen %{target} kanssa" + destroy_domain_block_html: "%{name} kumosi verkkotunnuksen %{target} eston" + destroy_email_domain_block_html: "%{name} kumosi sähköpostiverkkotunnuksen %{target} eston" destroy_instance_html: "%{name} tyhjensi verkkotunnuksen %{target}" - destroy_ip_block_html: "%{name} poisti IP-säännön %{target}" + destroy_ip_block_html: "%{name} poisti säännön IP-osoitteelta %{target}" destroy_status_html: "%{name} poisti käyttäjän %{target} julkaisun" destroy_unavailable_domain_html: "%{name} jatkoi toimitusta verkkotunnukseen %{target}" destroy_user_role_html: "%{name} poisti roolin %{target}" - disable_2fa_user_html: "%{name} poisti käyttäjältä %{target} vaatimuksen kaksivaiheisen todentamiseen" - disable_custom_emoji_html: "%{name} poisti käytöstä emojin %{target}" - disable_sign_in_token_auth_user_html: "%{name} poisti sähköpostitunnuksen %{target} todennuksen käytöstä" - disable_user_html: "%{name} poisti kirjautumisen käyttäjältä %{target}" - enable_custom_emoji_html: "%{name} otti käyttöön emojin %{target}" - enable_sign_in_token_auth_user_html: "%{name} otti todennuksen sähköpostivaltuutuksella käyttöön käyttäjälle %{target}" + disable_2fa_user_html: "%{name} poisti käyttäjältä %{target} vaatimuksen kaksivaiheiseen todentamiseen" + disable_custom_emoji_html: "%{name} poisti emojin %{target} käytöstä" + disable_sign_in_token_auth_user_html: "%{name} poisti sähköpostitunnuksella todennuksen käytöstä käyttäjältä %{target}" + disable_user_html: "%{name} poisti kirjautumisen käytöstä käyttäjältä %{target}" + enable_custom_emoji_html: "%{name} otti emojin %{target} käyttöön" + enable_sign_in_token_auth_user_html: "%{name} otti sähköpostitunnuksella todennuksen käyttöön käyttäjälle %{target}" enable_user_html: "%{name} otti kirjautumisen käyttöön käyttäjälle %{target}" memorialize_account_html: "%{name} muutti käyttäjän %{target} tilin muistosivuksi" promote_user_html: "%{name} ylensi käyttäjän %{target}" - reject_appeal_html: "%{name} hylkäsi valvontapäätöksen valituksen käyttäjältä %{target}" - reject_user_html: "%{name} hylkäsi käyttäjän rekisteröitymisen kohteesta %{target}" + reject_appeal_html: "%{name} hylkäsi käyttäjän %{target} valituksen moderointipäätöksestä" + reject_user_html: "%{name} hylkäsi käyttäjän %{target} rekisteröitymisen" remove_avatar_user_html: "%{name} poisti käyttäjän %{target} profiilikuvan" reopen_report_html: "%{name} avasi uudelleen raportin %{target}" resend_user_html: "%{name} lähetti vahvistussähköpostiviestin uudelleen käyttäjälle %{target}" @@ -276,26 +277,26 @@ fi: sensitive_account_html: "%{name} merkitsi käyttäjän %{target} median arkaluonteiseksi" silence_account_html: "%{name} rajoitti käyttäjän %{target} tiliä" suspend_account_html: "%{name} jäädytti käyttäjän %{target} tilin" - unassigned_report_html: "%{name} peruutti raportin määrityksen %{target}" - unblock_email_account_html: "%{name} poisti käyttäjän %{target} sähköpostiosoitteen eston" + unassigned_report_html: "%{name} poisti raportin %{target} käsittelystä" + unblock_email_account_html: "%{name} kumosi käyttäjän %{target} sähköpostiosoitteen eston" unsensitive_account_html: "%{name} kumosi käyttäjän %{target} median arkaluonteisuusmerkinnän" - unsilence_account_html: "%{name} kumosi käyttäjän %{target} rajoituksen" + unsilence_account_html: "%{name} kumosi käyttäjän %{target} tilin rajoituksen" unsuspend_account_html: "%{name} kumosi käyttäjän %{target} tilin jäädytyksen" update_announcement_html: "%{name} päivitti tiedotteen %{target}" update_custom_emoji_html: "%{name} päivitti emojin %{target}" update_domain_block_html: "%{name} päivitti verkkotunnuksen %{target} eston" - update_ip_block_html: "%{name} muutti sääntöä IP-osoitteelle %{target}" + update_ip_block_html: "%{name} muutti IP-osoitteen %{target} sääntöä" update_report_html: "%{name} päivitti raportin %{target}" update_status_html: "%{name} päivitti käyttäjän %{target} julkaisun" update_user_role_html: "%{name} muutti roolia %{target}" deleted_account: poisti tilin empty: Lokeja ei löytynyt. - filter_by_action: Suodata tapahtuman mukaan + filter_by_action: Suodata toimen mukaan filter_by_user: Suodata käyttäjän mukaan - title: Auditointiloki - unavailable_instance: "(verkkotunnus ei ole saatavilla)" + title: Tarkastusloki + unavailable_instance: "(verkkotunnus ei saatavilla)" announcements: - destroyed_msg: Tiedote poistettu onnistuneesti! + destroyed_msg: Tiedotteen poisto onnistui! edit: title: Muokkaa tiedotetta empty: Tiedotteita ei löytynyt. @@ -304,31 +305,31 @@ fi: create: Luo tiedote title: Uusi tiedote publish: Julkaise - published_msg: Tiedote julkaistu onnistuneesti! + published_msg: Tiedotteen julkaisu onnistui! scheduled_for: Ajoitettu %{time} scheduled_msg: Tiedotteen julkaisu ajoitettu! title: Tiedotteet unpublish: Lopeta julkaisu - unpublished_msg: Tiedotteen julkaisu lopetettu onnistuneesti! - updated_msg: Tiedote päivitetty onnistuneesti! + unpublished_msg: Tiedotteen julkaisun lopetus onnistui! + updated_msg: Tiedotteen päivitys onnistui! critical_update_pending: Kriittinen päivitys odottaa custom_emojis: assign_category: Aseta luokka by_domain: Verkkotunnus - copied_msg: Emojin paikallisen kopion luonti onnistui + copied_msg: Emojista luotiin paikallinen kopio onnistuneesti copy: Kopioi copy_failed_msg: Emojista ei voitu tehdä paikallista kopiota create_new_category: Luo uusi luokka created_msg: Emojin luonti onnistui! delete: Poista - destroyed_msg: Emojon poisto onnistui! + destroyed_msg: Emojon hävitys onnistui! disable: Poista käytöstä disabled: Ei käytössä - disabled_msg: Emojin käytöstäpoisto onnistui + disabled_msg: Emoji poistettiin käytöstä onnistuneesti emoji: Emoji enable: Ota käyttöön enabled: Käytössä - enabled_msg: Emojin käyttöönotto onnistui + enabled_msg: Emoji otettiin käyttöön onnistuneesti image_hint: PNG tai GIF, enintään %{size} list: Lisää listalle listed: Listalla @@ -338,7 +339,7 @@ fi: not_permitted: Sinulla ei ole oikeutta suorittaa tätä toimintoa overwrite: Korvaa shortcode: Lyhennekoodi - shortcode_hint: Vähintään kaksi merkkiä, vain kirjaimia, numeroita ja alaviivoja + shortcode_hint: Vähintään 2 merkkiä, vain kirjaimia, numeroita ja alaviivoja title: Mukautetut emojit uncategorized: Luokittelemattomat unlist: Poista listalta @@ -353,8 +354,8 @@ fi: new_users: uudet käyttäjät opened_reports: avatut raportit pending_appeals_html: - one: "%{count} vireillä oleva valitus" - other: "%{count} vireillä olevaa valitusta" + one: "%{count} odottava valitus" + other: "%{count} odottavaa valitusta" pending_reports_html: one: "%{count} odottava raportti" other: "%{count} odottavaa raporttia" @@ -368,7 +369,7 @@ fi: software: Ohjelmisto sources: Rekisteröitymislähteet space: Tilankäyttö - title: Hallintapaneeli + title: Koontinäyttö top_languages: Aktiivisimmat kielet top_servers: Aktiivisimmat palvelimet website: Sivusto @@ -377,34 +378,34 @@ fi: empty: Valituksia ei löytynyt. title: Valitukset domain_allows: - add_new: Salli liittoutuminen tämän verkkotunnuksen kanssa - created_msg: Verkkotunnuksen on onnistuneesti sallittu liittoutua - destroyed_msg: Verkkotunnusta on kielletty liittoutumasta + add_new: Salli federointi tämän verkkotunnuksen kanssa + created_msg: Verkkotunnuksen kanssa federointi on onnistuneesti sallittu + destroyed_msg: Verkkotunnuksen kanssa federointi on kielletty export: Vie import: Tuo - undo: Kiellä liittoutuminen tämän verkkotunnuksen kanssa + undo: Kiellä federointi tämän verkkotunnuksen kanssa domain_blocks: add_new: Lisää uusi verkkotunnuksen esto confirm_suspension: cancel: Peruuta confirm: Jäädytä - permanent_action: Jäädytyksen kumoaminen ei palauta mitään tietoja tai suhteita. + permanent_action: Jäädytyksen kumoaminen ei palauta mitään tietoja tai seurantasuhteita. preamble_html: Olet jäädyttämässä verkkotunnuksen %{domain} aliverkkotunnuksineen. - remove_all_data: Tämä toiminto poistaa palvelimeltasi kaiken sisällön, median ja profiilitiedot tämän palvelun tileiltä. + remove_all_data: Tämä poistaa palvelimeltasi kaiken sisällön, median ja profiilitiedot tämän verkkotunnuksen tileiltä. stop_communication: Palvelimesi lopettaa viestinnän näiden palvelinten kanssa. title: Vahvista verkkotunnuksen %{domain} esto - undo_relationships: Tämä kumoaa näiden palvelimien ja sinun tilien välisen seurannan. + undo_relationships: Tämä kumoaa näiden palvelinten ja sinun palvelimesi tilien väliset seurantasuhteet. created_msg: Verkkotunnuksen estoa käsitellään - destroyed_msg: Verkkotunnuksen esto on peruttu + destroyed_msg: Verkkotunnuksen esto on kumottu domain: Verkkotunnus edit: Muokkaa verkkotunnuksen estoa existing_domain_block: Olet jo asettanut tiukemmat rajoitukset käyttäjälle %{name}. - existing_domain_block_html: Olet jo asettanut tiukemmat rajoitukset käyttäjälle %{name}, joten sinun täytyy poistaa sen esto ensin. + existing_domain_block_html: Olet jo asettanut tiukemmat rajoitukset käyttäjälle %{name}, joten sinun täytyy kumota sen esto ensin. export: Vie import: Tuo new: create: Luo esto - hint: Verkkotunnuksen esto ei estä tilien lisäämistä tietokantaan, mutta se soveltaa näihin tileihin takautuvasti ja automaattisesti tiettyjä valvontatoimia. + hint: Verkkotunnuksen esto ei estä tilien lisäämistä tietokantaan, mutta se soveltaa näihin tileihin takautuvasti ja automaattisesti tiettyjä moderointitoimia. severity: desc_html: Valinta Rajoita piilottaa tässä verkkotunnuksessa sijaitsevien tilien julkaisut kaikilta, jotka eivät seuraa näitä tilejä. Valinta Jäädytä poistaa palvelimeltasi kaikkien tässä verkkotunnuksessa sijaitsevien tilien sisällön, median ja profiilitiedot. Käytä valintaa Ei mitään, jos haluat vain hylätä mediatiedostot. noop: Ei mitään @@ -412,26 +413,26 @@ fi: suspend: Jäädytä title: Uusi verkkotunnuksen esto no_domain_block_selected: Verkkotunnusten estoja ei muutettu, koska yhtään ei ollut valittuna - not_permitted: Nykyiset käyttöoikeutesi eivät kata tätä toimintoa - obfuscate: Peitä verkkotunnuksen nimi + not_permitted: Sinulla ei ole oikeutta suorittaa tätä toimintoa + obfuscate: Peitä verkkotunnus obfuscate_hint: Peitä verkkotunnus osittain luettelossa, jos julkinen verkkotunnusten rajoitusluettelo on käytössä private_comment: Yksityinen kommentti - private_comment_hint: Kommentoi tätä verkkotunnuksen rajoitusta, valvojien sisäiseen käyttöön. + private_comment_hint: Kommentoi tätä verkkotunnuksen rajoitusta, moderaattorien sisäiseen käyttöön. public_comment: Julkinen kommentti public_comment_hint: Kommentoi tätä verkkotunnuksen rajoitusta suurelle yleisölle, jos julkinen verkkotunnusten rajoitusluettelo on käytössä. reject_media: Hylkää mediatiedostot - reject_media_hint: Poistaa paikallisesti tallennetut mediatiedostot eikä lataa niitä enää jatkossa. Ei merkitystä jäähyn kohdalla + reject_media_hint: Poistaa paikallisesti tallennetut mediatiedostot eikä lataa niitä enää jatkossa. Ei vaikuta jäädytyksiin reject_reports: Hylkää raportit - reject_reports_hint: Ohita kaikki tästä verkkotunnuksesta tulevat raportit. Erottamisen kannalta ei merkitystä - undo: Peru verkkotunnuksen esto + reject_reports_hint: Ohita kaikki tästä verkkotunnuksesta tulevat raportit. Ei vaikuta jäädytyksiin + undo: Kumoa verkkotunnuksen esto view: Näytä verkkotunnuksen esto email_domain_blocks: add_new: Lisää uusi allow_registrations_with_approval: Salli rekisteröitymiset hyväksynnällä attempts_over_week: - one: "%{count} yritystä viimeisen viikon aikana" + one: "%{count} rekisteröitymisyritys viimeisen viikon aikana" other: "%{count} rekisteröitymisyritystä viimeisen viikon aikana" - created_msg: Sähköpostiverkkotunnus estetty onnistuneesti + created_msg: Sähköpostiverkkotunnus estettiin onnistuneesti delete: Poista dns: types: @@ -439,12 +440,12 @@ fi: domain: Verkkotunnus new: create: Lisää verkkotunnus - resolve: Ratkaise verkkotunnus + resolve: Selvitä verkkotunnus title: Estä uusi sähköpostiverkkotunnus no_email_domain_block_selected: Sähköpostin verkkotunnuksia ei muutettu, koska yhtään ei ollut valittuna not_permitted: Ei sallittu resolved_dns_records_hint_html: Verkkotunnuksen nimi määräytyy seuraaviin MX-verkkotunnuksiin, jotka ovat viime kädessä vastuussa sähköpostin vastaanottamisesta. MX-verkkotunnuksen estäminen estää rekisteröitymisen mistä tahansa sähköpostiosoitteesta, joka käyttää samaa MX-verkkotunnusta, vaikka näkyvä verkkotunnuksen nimi olisikin erilainen. Varo estämästä suuria sähköpostin palveluntarjoajia. - resolved_through_html: Ratkaistu %{domain} kautta + resolved_through_html: Ratkaistu verkkotunnuksen %{domain} kautta title: Estetyt sähköpostiverkkotunnukset export_domain_allows: new: @@ -453,8 +454,8 @@ fi: export_domain_blocks: import: description_html: Olet tuomassa verkkotunnusten estoluetteloa. Tarkista luettelo huolella – etenkin, jos et ole laatinut sitä itse. - existing_relationships_warning: Olemassa olevat seuraussuhteet - private_comment_description_html: 'Seurataksesi tuotujen estojen alkuperää lisätään estojen yhteyteen seuraava yksityinen kommentti: %{comment}' + existing_relationships_warning: Olemassa olevat seurantasuhteet + private_comment_description_html: 'Seurataksesi tuotujen estojen alkuperää estojen yhteyteen lisätään seuraava yksityinen kommentti: %{comment}' private_comment_template: Tuotu lähteestä %{source} %{date} title: Tuo verkkotunnusten estoja invalid_domain_block: 'Yksi tai useampi verkkotunnuksen esto ohitettiin seuraavien virheiden vuoksi: %{error}' @@ -462,25 +463,28 @@ fi: title: Tuo verkkotunnusten estoja no_file: Yhtäkään tiedostoa ei ole valittu follow_recommendations: - description_html: "Seuraamissuositukset auttavat uusia käyttäjiä löytämään nopeasti kiinnostavaa sisältöä. Kun käyttäjä ei ole ollut tarpeeksi vuorovaikutuksessa muiden kanssa, jotta hänelle olisi muodostunut henkilökohtaisia seuraamissuosituksia, suositellaan niiden sijaan näitä tilejä. Ne lasketaan päivittäin uudelleen yhdistelmästä tilejä, jotka ovat viime aikoina olleet aktiivisimmin sitoutuneita ja joilla on suurimmat paikalliset seuraajamäärät tietyllä kielellä." + description_html: "Seurantasuositukset auttavat uusia käyttäjiä löytämään nopeasti kiinnostavaa sisältöä. Kun käyttäjä ei ole ollut tarpeeksi vuorovaikutuksessa muiden kanssa, jotta hänelle olisi muodostunut henkilökohtaisia seuraamissuosituksia, suositellaan niiden sijaan näitä tilejä. Ne lasketaan päivittäin uudelleen yhdistelmästä tilejä, jotka ovat viime aikoina olleet aktiivisimmin sitoutuneita ja joilla on suurimmat paikalliset seuraajamäärät tietyllä kielellä." language: Kielelle status: Tila - suppress: Hylkää seuraamissuositus - suppressed: Hylätty - title: Seuraamissuositukset - unsuppress: Palauta seuraamissuositus + suppress: Hylkää seurantasuositus + suppressed: Hylätyt + title: Seurantasuositukset + unsuppress: Palauta seurantasuositus instances: + audit_log: + title: Viimeaikaiset tarkastuslokit + view_all: Näytä kaikki tarkastuslokit availability: description_html: - one: Jos toimitus verkkotunnukseen epäonnistuu %{count} päivä ilman onnistumista, uusia yrityksiä ei tehdä ennen kuin toimitus alkaen verkkotunnukselta on vastaanotettu. - other: Jos toimitus verkkotunnukselle, epäonnistuu %{count} eri päivänä ilman onnistumista, uusia yrityksiä ei tehdä ennen kuin toimitus alkaen verkkotunnuselta on vastaanotettu. - failure_threshold_reached: Epäonnistumisen kynnys saavutettu %{date}. + one: Jos toimitus verkkotunnukseen epäonnistuu päivän ajan, sitä ei yritetä uudelleen ennen kuin verkkotunnuksesta vastaanotetaan toimitus. + other: Jos toimitus verkkotunnukseen epäonnistuu %{count} päivän ajan, sitä ei yritetä uudelleen ennen kuin verkkotunnuksesta vastaanotetaan toimitus. + failure_threshold_reached: Epäonnistumisten yläraja saavutettu %{date}. failures_recorded: - one: Epäonnistuneita yrityksiä %{count} päivässä. - other: Epäonnistuneita yrityksiä %{count} päivää. - no_failures_recorded: Ei epäonnistumisia kirjattu. + one: Epäonnistuneita yrityksiä %{count} päivänä. + other: Epäonnistuneita yrityksiä %{count} päivänä. + no_failures_recorded: Ei kirjattuja epäonnistumisia. title: Saatavuus - warning: Viimeisin yritys yhdistää yhteys tähän palvelimeen on epäonnistunut + warning: Viimeisin yritys yhdistää tähän palvelimeen epäonnistui back_to_all: Kaikki back_to_limited: Rajoitettu back_to_warning: Varoitus @@ -488,67 +492,67 @@ fi: confirm_purge: Haluatko varmasti poistaa pysyvästi tämän verkkotunnuksen tiedot? content_policies: comment: Sisäinen muistiinpano - description_html: Voit määrittää sisältökäytännöt, joita sovelletaan kaikkiin tämän verkkotunnuksen ja sen aliverkkotunnuksien tileihin. + description_html: Voit määritellä sisältökäytännöt, joita sovelletaan kaikkiin tämän verkkotunnuksen ja sen aliverkkotunnusten tileihin. limited_federation_mode_description_html: Voit valita sallitaanko federointi tällä verkkotunnuksella. policies: reject_media: Hylkää media reject_reports: Hylkää raportit silence: Rajoita suspend: Jäädytä - policy: Käytännöt + policy: Käytäntö reason: Julkinen syy - title: Sisällön toimintatavat + title: Sisältökäytännöt dashboard: instance_accounts_dimension: Seuratuimmat tilit instance_accounts_measure: tallennetut tilit instance_followers_measure: seuraajamme siellä instance_follows_measure: heidän seuraajansa täällä instance_languages_dimension: Suosituimmat kielet - instance_media_attachments_measure: tallennetut median liitteet - instance_reports_measure: niitä koskevat raportit + instance_media_attachments_measure: tallennetut medialiitteet + instance_reports_measure: heitä koskevat raportit instance_statuses_measure: tallennetut julkaisut delivery: all: Kaikki clear: Tyhjennä toimitusvirheet - failing: Epäonnistuminen + failing: Epäonnistuneet restart: Käynnistä toimitus uudelleen stop: Lopeta toimitus - unavailable: Ei saatavilla + unavailable: Eivät saatavilla delivery_available: Toimitus on saatavilla delivery_error_days: Toimitusvirheen päivät - delivery_error_hint: Jos toimitus ei ole mahdollista %{count} päivän aikana, se merkitään automaattisesti toimittamattomaksi. - destroyed_msg: Tiedot %{domain} on nyt jonossa välitöntä poistoa varten. + delivery_error_hint: Jos toimitus ei ole mahdollista %{count} päivään, se merkitään automaattisesti toimituskelvottomaksi. + destroyed_msg: Palvelimelta %{domain} peräisin olevat tiedot ovat nyt jonossa poistattaviksi. empty: Verkkotunnuksia ei löytynyt. known_accounts: one: "%{count} tunnettu tili" other: "%{count} tunnettua tiliä" moderation: all: Kaikki - limited: Rajoitettu - title: Valvonta + limited: Rajoitetut + title: Moderointi private_comment: Yksityinen kommentti public_comment: Julkinen kommentti purge: Tyhjennä - purge_description_html: Jos uskot, että tämä verkkotunnus on offline-tilassa tarkoituksella, voit poistaa kaikki verkkotunnuksen tilitietueet ja niihin liittyvät tiedot tallennustilastasi. Tämä voi kestää jonkin aikaa. - title: Liittoutuminen + purge_description_html: Jos uskot, että tämä verkkotunnus on yhteydettömässä tilassa tarkoituksella, voit poistaa kaikki verkkotunnuksen tilitietueet ja niihin liittyvät tiedot tallennustilastasi. Tämä voi kestää jonkin aikaa. + title: Federointi total_blocked_by_us: Estämämme total_followed_by_them: Heidän seuraama total_followed_by_us: Meidän seuraama - total_reported: Niitä koskevat raportit + total_reported: Heitä koskevat raportit total_storage: Medialiitteet - totals_time_period_hint_html: Alla näkyvät yhteenlasketut tiedot sisältävät koko ajan. + totals_time_period_hint_html: Seuraavassa näkyvät määrät sisältävät tiedot koko ajalta. unknown_instance: Tällä palvelimella ei tällä hetkellä ole tähän verkkotunnukseen liittyviä tietueita. invites: deactivate_all: Poista kaikki käytöstä filter: all: Kaikki available: Saatavilla - expired: Vanhentunut - title: Suodata + expired: Vanhentuneet + title: Suodatus title: Kutsut ip_blocks: add_new: Luo sääntö - created_msg: Lisätty uusi IP-sääntö onnistuneesti + created_msg: Uusi IP-sääntö lisättiin onnistuneesti delete: Poista expires_in: '1209600': 2 viikkoa @@ -562,11 +566,11 @@ fi: no_ip_block_selected: IP-sääntöjä ei muutettu, koska yhtään ei ollut valittuna title: IP-säännöt relationships: - title: "%{acct}n suhteet" + title: Tilin %{acct} seurantasuhteet relays: add_new: Lisää uusi välittäjä delete: Poista - description_html: "Liittoutumisvälittäjä on välityspalvelin, joka siirtää suuria määriä julkisia julkaisuja siihen liittyneiden palvelinten välillä. Se voi auttaa pieniä ja keskisuuria palvelimia löytämään fediversumin sisältöä, mikä muutoin vaatisi paikallisia käyttäjiä seuraamaan etäpalvalinten käyttäjiä manuaalisesti." + description_html: "Federoinninvälittäjä on välityspalvelin, joka siirtää suuria määriä julkisia julkaisuja siihen liittyneiden palvelinten välillä. Se voi auttaa pieniä ja keskisuuria palvelimia löytämään fediversumin sisältöä, mikä muutoin vaatisi paikallisia käyttäjiä seuraamaan etäpalvalinten käyttäjiä manuaalisesti." disable: Poista käytöstä disabled: Poissa käytöstä enable: Ota käyttöön @@ -576,12 +580,12 @@ fi: pending: Odotetaan välittäjän hyväksyntää save_and_enable: Tallenna ja ota käyttöön setup: Määritä yhteys välittäjään - signatures_not_enabled: Välittäjät eivät toimi oikein, kun turvallinen tai rajoitettu federaatio -tila on käytössä + signatures_not_enabled: Välittäjät eivät välttämättä toimi oikein, kun turvallinen tai rajoitetun federoinnin tila on käytössä status: Tila title: Välittäjät report_notes: - created_msg: Muistiinpano lisätty raporttiin onnistuneesti! - destroyed_msg: Muistiinpano poistettu raportista onnistuneesti! + created_msg: Muistiinpanon lisäys raporttiin onnistui! + destroyed_msg: Muistiinpanon poisto raportista onnistui! reports: account: notes: @@ -594,18 +598,18 @@ fi: mark_as_sensitive_description_html: Raportoitujen julkaisujen media merkitään arkaluonteiseksi ja kirjataan varoitus, joka auttaa suhtautumaan vakavammin saman tilin tuleviin rikkomuksiin. other_description_html: Katso lisää vaihtoehtoja tilin käytöksen hallitsemiseksi ja raportoidulle tilille kohdistuvan viestinnän mukauttamiseksi. resolve_description_html: Ilmoitettua tiliä kohtaan ei ryhdytä toimiin, varoitusta ei kirjata ja raportti suljetaan. - silence_description_html: Tili näkyy vain niille, jotka jo seuraavat sitä tai etsivät sen manuaalisesti, mikä rajoittaa merkittävästi sen tavoitettavuutta. Voidaan perua milloin vain. Sulkee kaikki tilin vastaiset raportit. - suspend_description_html: Tili ja mikään sen sisältö eivät ole käytettävissä, ja lopulta ne poistetaan, ja vuorovaikutus tilin kanssa on mahdotonta. Peruttavissa 30 päivän ajan. Sulkee kaikki tämän tilin vastaiset raportit. + silence_description_html: Tili näkyy vain niille, jotka jo seuraavat sitä tai etsivät sen manuaalisesti, mikä rajoittaa merkittävästi sen tavoitettavuutta. Voidaan perua milloin vain. Sulkee kaikki tiliin kohdistuvat raportit. + suspend_description_html: Tili ja mikään sen sisältö eivät ole käytettävissä, ja lopulta ne poistetaan ja vuorovaikutus tilin kanssa on mahdotonta. Peruttavissa 30 päivän ajan. Sulkee kaikki tiliin kohdistuvat raportit. actions_description_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Jos ryhdyt rangaistustoimeen ilmoitettua tiliä kohtaan, hänelle lähetetään sähköposti-ilmoitus, paitsi jos Roskaposti-luokka on valittuna. - actions_description_remote_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Tämä vaikuttaa vain siihen, miten palvelimesi kommunikoi tämän etätilin kanssa ja käsittelee sen sisältöä. + actions_description_remote_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Tämä vaikuttaa vain siihen, miten sinun palvelimesi viestii tämän etätilin kanssa ja käsittelee sen sisältöä. add_to_report: Lisää raporttiin already_suspended_badges: local: Jäädytetty jo tällä palvelimella remote: Jäädytetty jo tällä palvelimella are_you_sure: Oletko varma? - assign_to_self: Ota tehtäväksi - assigned: Määritetty valvoja - by_target_domain: Ilmoitetun tilin verkkotunnus + assign_to_self: Ota käsiteltäväkseni + assigned: Määritetty moderaattori + by_target_domain: Raportoidun tilin verkkotunnus cancel: Peruuta category: Luokka category_description_html: Syy siihen, miksi tämä tili ja/tai sisältö raportoitiin, mainitaan ilmoitetun tilin kanssa viestiessä @@ -613,12 +617,12 @@ fi: none: Ei mitään comment_description_html: 'Antaakseen lisätietoja %{name} kirjoitti:' confirm: Vahvista - confirm_action: Vahvista valvontatoimi käyttäjää @%{acct} kohtaan + confirm_action: Vahvista moderointitoimi käyttäjää @%{acct} kohtaan created_at: Raportoitu delete_and_resolve: Poista julkaisut forwarded: Välitetty forwarded_replies_explanation: Tämä raportti on etäkäyttäjältä ja koskee etäsisältöä. Se on välitetty sinulle, koska raportoitu sisältö on vastaus jollekin käyttäjällesi. - forwarded_to: Välitetty %{domain} + forwarded_to: Välitetty palvelimelle %{domain} mark_as_resolved: Merkitse ratkaistuksi mark_as_sensitive: Merkitse arkaluonteiseksi mark_as_unresolved: Merkitse ratkaisemattomaksi @@ -628,22 +632,23 @@ fi: create_and_resolve: Ratkaise ja lisää muistiinpano create_and_unresolve: Avaa uudelleen ja lisää muistiinpano delete: Poista - placeholder: Kuvaile mitä toimia on tehty tai muita päivityksiä tähän raporttiin… + placeholder: Kuvaile tehtyjä toimia tai lisää muita käyttäjään liittyviä merkintöjä… title: Muistiinpanot - notes_description_html: Tarkastele ja jätä muistiinpanoja muille valvojille ja itsellesi tulevaisuuteen - processed_msg: 'Raportti #%{id} käsitelty' - quick_actions_description_html: 'Suorita nopea toiminto tai vieritä alas nähdäksesi raportoitu sisältö:' - remote_user_placeholder: etäkäyttäjä instanssista %{instance} - reopen: Avaa raportti uudestaan + notes_description_html: Tarkastele ja jätä muistiinpanoja muille moderaattoreille ja itsellesi tulevaisuuteen + processed_msg: Raportin nro %{id} käsittely onnistui + quick_actions_description_html: 'Suorita pikatoiminto tai vieritä alas nähdäksesi raportoitu sisältö:' + remote_user_placeholder: etäkäyttäjä palvelimelta %{instance} + reopen: Avaa raportti uudelleen report: Raportti nro %{id} reported_account: Raportoitu tili - reported_by: Raportoija + reported_by: Raportoinut + reported_with_application: Raportoitu sovelluksella resolved: Ratkaistut - resolved_msg: Raportti onnistuneesti ratkaistu! - skip_to_actions: Siirry toimintoihin + resolved_msg: Raportin ratkaisu onnistui! + skip_to_actions: Siirry toimiin status: Tila statuses: Raportoitu sisältö - statuses_description_html: Loukkaava sisältö mainitaan ilmoitetun tilin yhteydessä + statuses_description_html: Loukkaava sisältö mainitaan raportoidun tilin yhteydessä summary: action_preambles: delete_html: 'Olet aikeissa poistaa käyttäjän @%{acct} julkaisuja. Tästä seuraa:' @@ -655,17 +660,17 @@ fi: mark_as_sensitive_html: Merkitse loukkaavien julkaisujen media arkaluonteiseksi silence_html: Rajoita merkittävästi käyttäjän @%{acct} tavoitettavuutta tekemällä profiilista ja sen sisällöstä näkyviä vain niille, jotka jo seuraavat tiliä tai etsivät sen manuaalisesti suspend_html: Jäädytä @%{acct}, jolloin hänen profiilinsa ja sisältönsä ei ole käytettävissä ja hänen kanssaan on mahdotonta olla vuorovaikutuksessa - close_report: 'Merkitse raportti #%{id} selvitetyksi' + close_report: Merkitse raportti nro %{id} ratkaistuksi close_reports_html: Merkitse kaikki käyttäjään @%{acct} kohdistuvat raportit ratkaistuiksi delete_data_html: Poista käyttäjän @%{acct} profiili ja sen sisältö 30 päivän kuluttua, ellei jäädytystä sillä välin kumota preview_preamble_html: "@%{acct} saa varoituksen, jonka sisältö on seuraava:" - record_strike_html: Tallenna varoitus @%{acct} vastaan, joka auttaa sinua selvittämään tulevia rikkomuksia tältä tililtä + record_strike_html: Kirjaa käyttäjään @%{acct} kohdistuva varoitus, joka auttaa suhtautumaan vakavammin tämän tilin tuleviin rikkomuksiin send_email_html: Lähetä käyttäjälle @%{acct} varoitus sähköpostitse - warning_placeholder: Valinnaiset lisäperustelut valvontatoimelle. + warning_placeholder: Valinnaiset lisäperustelut moderointitoimelle. target_origin: Raportoidun tilin alkuperä title: Raportit - unassign: Määrittämätön - unknown_action_msg: 'Tuntematon toiminto: %{action}' + unassign: Poista käsittelystä + unknown_action_msg: 'Tuntematon toimi: %{action}' unresolved: Ratkaisemattomat updated_at: Päivitetty view_profile: Näytä profiili @@ -678,13 +683,13 @@ fi: administration: Ylläpito devops: DevOps invites: Kutsut - moderation: Valvonta + moderation: Moderointi special: Erityistä delete: Poista - description_html: "Käyttäjärooleilla voit muokata, mihin toimintoihin ja alueisiin käyttäjäsi pääsevät käsiksi." + description_html: "Käyttäjärooleilla voit mukauttaa, mihin Mastodonin toimintoihin ja alueisiin käyttäjäsi on pääsy." edit: Muokkaa roolia ”%{name}” everyone: Oletuskäyttöoikeudet - everyone_full_description_html: Tämä on perusrooli, joka vaikuttaa kaikkiin käyttäjiin, jopa ilman määrättyä roolia. Kaikki muut roolit perivät sen käyttöoikeudet. + everyone_full_description_html: Tämä on perusrooli, joka vaikuttaa kaikkiin käyttäjiin, jopa ilman asetettua roolia. Kaikki muut roolit perivät sen käyttöoikeudet. permissions_count: one: "%{count} käyttöoikeus" other: "%{count} käyttöoikeutta" @@ -692,23 +697,23 @@ fi: administrator: Ylläpitäjä administrator_description: Käyttäjät, joilla on tämä käyttöoikeus, ohittavat jokaisen käyttöoikeuden delete_user_data: Poistaa käyttäjän tiedot - delete_user_data_description: Salli käyttäjien poistaa muiden käyttäjien tiedot viipymättä + delete_user_data_description: Sallii käyttäjien poistaa muiden käyttäjien tiedot viipymättä invite_users: Kutsua käyttäjiä invite_users_description: Sallii käyttäjien kutsua uusia ihmisiä palvelimelle manage_announcements: Hallita tiedotteita - manage_announcements_description: Sallii käyttäjien hallita tiedotteita palvelimella + manage_announcements_description: Sallii käyttäjien hallita palvelimen tiedotteita manage_appeals: Hallita valituksia - manage_appeals_description: Sallii käyttäjien tarkistaa valvontatoimia koskevia valituksia + manage_appeals_description: Sallii käyttäjien tarkistaa moderointitoimiin kohdistuvia valituksia manage_blocks: Hallita estoja manage_blocks_description: Sallii käyttäjien estää sähköpostipalveluntarjoajia ja IP-osoitteita manage_custom_emojis: Hallita mukautettuja emojeita manage_custom_emojis_description: Sallii käyttäjien hallita mukautettuja emojeita palvelimella - manage_federation: Hallita liittoutumista - manage_federation_description: Sallii käyttäjien estää tai sallia liittoutuminen muiden verkkotunnusten kanssa ja hallita toimitusta + manage_federation: Hallita federointia + manage_federation_description: Sallii käyttäjien estää tai sallia federointi muiden verkkotunnusten kanssa ja hallita toimitusta manage_invites: Hallita kutsuja - manage_invites_description: Sallii käyttäjien selata ja poistaa kutsulinkkejä käytöstä + manage_invites_description: Sallii käyttäjien selata kutsulinkkejä ja poistaa niitä käytöstä manage_reports: Hallita raportteja - manage_reports_description: Sallii käyttäjien tarkistaa raportteja ja suorittaa valvontatoimia niitä vastaan + manage_reports_description: Sallii käyttäjien tarkistaa raportteja ja suorittaa moderointitoimia niiden perusteella manage_roles: Hallita rooleja manage_roles_description: Sallii käyttäjien hallita ja määrittää rooleja heidän alapuolellaan manage_rules: Hallita sääntöjä @@ -718,15 +723,15 @@ fi: manage_taxonomies: Hallita luokittelua manage_taxonomies_description: Sallii käyttäjien tarkistaa suositun sisällön ja päivittää aihetunnisteiden asetuksia manage_user_access: Hallita käyttäjäoikeuksia - manage_user_access_description: Sallii käyttäjien poistaa muiden käyttäjien kaksivaiheinen todennus käytöstä, vaihtaa heidän sähköpostiosoitteensa ja nollata heidän salasanansa + manage_user_access_description: Sallii käyttäjien poistaa muiden käyttäjien kaksivaiheinen todennus käytöstä, vaihtaa heidän sähköpostiosoitteensa ja palauttaa heidän salasanansa manage_users: Hallita käyttäjiä - manage_users_description: Sallii käyttäjien tarkastella muiden käyttäjien tietoja ja suorittaa valvontatoimia heitä kohtaan + manage_users_description: Sallii käyttäjien tarkastella muiden käyttäjien tietoja ja suorittaa moderointitoimia heitä kohtaan manage_webhooks: Hallita webhookeja manage_webhooks_description: Sallii käyttäjien luoda webhookeja hallinnollisiin tapahtumiin - view_audit_log: Katsoa valvontalokia + view_audit_log: Katsoa tarkastuslokia view_audit_log_description: Sallii käyttäjien nähdä palvelimen hallinnollisten toimien historian view_dashboard: Katsoa koontinäyttöä - view_dashboard_description: Sallii käyttäjien käyttää kojelautaa ja erilaisia mittareita + view_dashboard_description: Sallii käyttäjille pääsyn koontinäyttöön ja erilaisiin mittareihin view_devops: DevOps view_devops_description: Sallii käyttäjille pääsyn Sidekiq- ja pgHero-hallintapaneeleihin title: Roolit @@ -740,27 +745,27 @@ fi: settings: about: manage_rules: Hallitse palvelimen sääntöjä - preamble: Anna perusteellista tietoa siitä, miten palvelinta käytetään, valvotaan ja rahoitetaan. + preamble: Kerro syventävästi siitä, kuinka palvelinta käytetään, moderoidaan ja rahoitetaan. rules_hint: On olemassa erityinen alue sääntöjä, joita käyttäjien odotetaan noudattavan. title: Tietoja appearance: preamble: Mukauta Mastodonin selainkäyttöliittymää. title: Ulkoasu branding: - preamble: Palvelimesi brändäys erottaa sen muista verkon palvelimista. Nämä tiedot voivat näkyä monissa eri ympäristöissä, kuten Mastodonin selainkäyttöliittymässä, natiivisovelluksissa, linkkien esikatseluissa muilla sivustoilla, viestintäsovelluksissa ja niin edelleen. Siksi nämä tiedot kannattaa pitää selkeinä, lyhyinä ja ytimekkäinä. + preamble: Palvelimesi brändäys erottaa sen muista verkon palvelimista. Nämä tiedot voivat näkyä monissa eri ympäristöissä, kuten Mastodonin selainkäyttöliittymässä, natiivisovelluksissa, linkkien esikatseluissa muilla sivustoilla, viestintäsovelluksissa ja niin edelleen. Siksi nämä tiedot kannattaa pitää selvinä, lyhyinä ja ytimekkäinä. title: Brändäys captcha_enabled: - desc_html: Tämä perustuu ulkoisiin skripteihin hCaptchasta, mikä voi olla turvallisuus- ja yksityisyysongelma. Lisäksi tämä voi tehdä rekisteröinnin ihmisille huomattavasti (erityisesti vammaisten) helpommaksi. Harkitse vaihtoehtoisia toimenpiteitä, kuten hyväksymisperusteista tai kutsupohjaista rekisteröintiä. + desc_html: Tämä perustuu ulkoisiin hCaptchan skripteihin, mikä voi olla turvallisuus- ja yksityisyysongelma. Lisäksi tämä voi tehdä rekisteröitymisprosessista joillekin (erityisesti vammaisille) ihmisille huomattavasti vähemmän saavutettavan. Harkitse siksi vaihtoehtoisia toimia, kuten hyväksymis- tai kutsuperusteista rekisteröitymistä. title: Vaadi uusia käyttäjiä vahvistaamaan tilinsä ratkaisemalla CAPTCHA-vahvistus content_retention: danger_zone: Vaaravyöhyke preamble: Määritä, miten käyttäjän luoma sisältö tallennetaan Mastodoniin. - title: Sisällön säilyttäminen + title: Sisällön säilytys default_noindex: desc_html: Vaikuttaa kaikkiin käyttäjiin, jotka eivät ole muuttaneet tätä asetusta itse title: Jätä käyttäjät oletusarvoisesti hakukoneindeksoinnin ulkopuolelle discovery: - follow_recommendations: Seuraamissuositukset + follow_recommendations: Seurantasuositukset preamble: Mielenkiintoisen sisällön esille tuominen auttaa saamaan uusia käyttäjiä, jotka eivät ehkä tunne ketään Mastodonista. Määrittele, kuinka erilaiset löytämisominaisuudet toimivat palvelimellasi. profile_directory: Profiilihakemisto public_timelines: Julkiset aikajanat @@ -770,10 +775,10 @@ fi: trends: Trendit domain_blocks: all: Kaikille - disabled: Ei kenellekkään + disabled: Ei kenellekään users: Kirjautuneille paikallisille käyttäjille registrations: - moderation_recommandation: Varmista, että sinulla on riittävä ja toimintavalmis joukko moderaattoreita, ennen kuin vapautat rekisteröitymismenettelyn kaikille! + moderation_recommandation: Varmista, että sinulla on riittävä ja toimintavalmis joukko moderaattoreita, ennen kuin avaat rekisteröitymisen kaikille! preamble: Määritä, kuka voi luoda tilin palvelimellesi. title: Rekisteröityminen registrations_mode: @@ -783,14 +788,14 @@ fi: open: Kaikki voivat rekisteröityä warning_hint: Suosittelemme käyttämään asetusta ”Rekisteröityminen vaatii hyväksynnän”, ellet ole varma siitä, että moderaattorit ovat valmiina käsittelemään roskapostia ja haittarekisteröitymisiä oikea-aikaisesti. security: - authorized_fetch: Vaadi todennus liittoutuvilta palvelimilta - authorized_fetch_hint: Todennuksen vaatiminen liittoutuvilta palvelimilta mahdollistaa sekä käyttäjä- että palvelintason estojen tiukemman valvonnan. Tämä tapahtuu kuitenkin suorituskyvyn kustannuksella, vähentää vastauksiesi tavoittavuutta ja voi aiheuttaa yhteensopivuusongelmia joidenkin liittoutuvien palvelujen kanssa. Tämä ei myöskään estä omistautuneita toimijoita hakemasta julkisia julkaisujasi ja tilejäsi. + authorized_fetch: Vaadi todennus federoivilta palvelimilta + authorized_fetch_hint: Todennuksen vaatiminen federoivilta palvelimilta mahdollistaa sekä käyttäjä- että palvelintason estojen tiukemman valvonnan. Tämä tapahtuu kuitenkin suorituskyvyn kustannuksella, vähentää vastauksiesi tavoittavuutta ja voi aiheuttaa yhteensopivuusongelmia joidenkin federoivien palvelujen kanssa. Tämä ei myöskään estä asialleen omistautuneita toimijoita hakemasta julkisia julkaisujasi ja tilejäsi. authorized_fetch_overridden_hint: Et voi tällä hetkellä muuttaa tätä asetusta, koska se on ohitettu ympäristömuuttujalla. - federation_authentication: Liittoutumisen todentamisen täytäntöönpano + federation_authentication: Federoinnin todennuksen valvonta title: Palvelimen asetukset site_uploads: - delete: Poista ladattu tiedosto - destroyed_msg: Sivuston lataus onnistuneesti poistettu! + delete: Poista lähetetty tiedosto + destroyed_msg: Sivustolatauksen poisto onnistui! software_updates: critical_update: Kriittinen – päivitä viivyttelemättä description: On suositeltavaa pitää Mastodon-asennus ajantasaisena ja siten hyödyntää uusimpia korjauksia sekä ominaisuuksia. Lisäksi joskus on ratkaisevan tärkeää päivittää Mastodon ajoissa tietoturvaongelmien välttämiseksi. Näistä syistä Mastodon tarkistaa päivitykset 30 minuutin välein, ja ilmoittaa sinulle sähköposti-ilmoitusasetustesi mukaisesti. @@ -833,20 +838,20 @@ fi: delete_statuses: "%{name} poisti käyttäjän %{target} julkaisut" disable: "%{name} jäädytti %{target} tilin" mark_statuses_as_sensitive: "%{name} merkitsi käyttäjän %{target} julkaisut arkaluonteisiksi" - none: "%{name} lähetti varoituksen henkilölle %{target}" + none: "%{name} lähetti varoituksen käyttäjälle %{target}" sensitive: "%{name} merkitsi käyttäjän %{target} tilin arkaluonteiseksi" silence: "%{name} rajoitti käyttäjän %{target} tiliä" suspend: "%{name} jäädytti käyttäjän %{target} tilin" - appeal_approved: Valitti + appeal_approved: Valittanut appeal_pending: Valitus vireillä - appeal_rejected: Vetoomus hylättiin + appeal_rejected: Valitus hylätty system_checks: database_schema_check: message_html: Tietokannan siirto on vireillä. Suorita ne varmistaaksesi, että sovellus toimii odotetulla tavalla elasticsearch_health_red: message_html: Elasticsearch-klusteri on vikatilassa (punainen tila), joten hakuominaisuudet eivät ole käytettävissä elasticsearch_health_yellow: - message_html: Elasticsearch-klusteri on häiriötilassa (keltainen tila), joten suosittelemme tutkimaan syyn + message_html: Elasticsearch-klusteri on vikatilassa (keltainen tila), joten suosittelemme tutkimaan syyn elasticsearch_index_mismatch: message_html: Elasticsearch-indeksin sidokset ovat vanhentuneet. Suorita tootctl search deploy --only=%{value} elasticsearch_preset: @@ -858,13 +863,13 @@ fi: elasticsearch_reset_chewy: message_html: Elasticsearch-järjestelmäindeksi on vanhentunut asetusmuutoksen vuoksi. Suorita tootctl search deploy --reset-chewy päivittääksesi sen. elasticsearch_running_check: - message_html: Ei saatu yhteyttä Elasticsearchiin. Tarkista, että se on käynnissä tai poista kokotekstihaku käytöstä + message_html: Elasticsearchiin ei saatu yhteyttä. Tarkista, että se on käynnissä, tai poista kokotekstihaku käytöstä elasticsearch_version_check: message_html: 'Yhteensopimaton Elasticsearch-versio: %{value}' - version_comparison: Elasticsearch %{running_version} on käynnissä, kun %{required_version} vaaditaan + version_comparison: Käynnissä on Elasticsearch %{running_version}, kun vaaditaan %{required_version} rules_check: action: Hallitse palvelimen sääntöjä - message_html: Et ole määrittänyt lainkaan palvelimen sääntöjä. + message_html: Et ole määritellyt palvelimen sääntöjä lainkaan. sidekiq_process_check: message_html: Ei ole Sidekiq-prosessia käynnissä jonossa %{value}. Tarkista Sidekiq-asetukset software_version_critical_check: @@ -874,79 +879,95 @@ fi: action: Näytä saatavilla olevat päivitykset message_html: Mastodonin virhekorjauspäivitys on saatavilla. upload_check_privacy_error: - action: Katso täältä lisätietoja - message_html: "Verkkopalvelimesi on määritetty väärin. Käyttäjiesi yksityisyys on vaarassa." + action: Katso lisätietoja täältä + message_html: "Verkkopalvelimesi on määritetty väärin. Käyttäjiesi tietosuoja on vaarassa." upload_check_privacy_error_object_storage: - action: Katso täältä lisätietoja - message_html: "Objektivarastosi on määritetty virheellisesti, ja käyttäjiesi yksityisyys on vaarassa." + action: Katso lisätietoja täältä + message_html: "Oliovarastosi on määritetty virheellisesti. Käyttäjiesi tietosuoja on vaarassa." tags: - review: Tarkista tila - updated_msg: Aihetunnisteen asetukset päivitetty onnistuneesti + moderation: + not_trendable: Ei trendattava + not_usable: Ei käytettävissä + pending_review: Odottaa tarkastusta + review_requested: Tarkastus pyydetty + reviewed: Tarkastettu + title: Tila + trendable: Trendattava + unreviewed: Tarkastamaton + usable: Käytettävissä + name: Nimi + newest: Uusimmat + oldest: Vanhimmat + reset: Palauta + review: Tarkastuksen tila + search: Hae + title: Aihetunnisteet + updated_msg: Aihetunnisteiden asetusten päivitys onnistui title: Ylläpito trends: allow: Salli - approved: Hyväksytty - disallow: Estä + approved: Hyväksytyt + disallow: Kiellä links: allow: Salli linkki allow_provider: Salli julkaisija - description_html: Nämä ovat linkkejä, joita jaetaan tällä hetkellä paljon tileillä, joilta palvelimesi näkee viestejä. Se voi auttaa käyttäjiäsi saamaan selville, mitä maailmassa tapahtuu. Linkkejä ei näytetä julkisesti, ennen kuin hyväksyt julkaisijan. Voit myös sallia tai hylätä yksittäiset linkit. - disallow: Hylkää linkki - disallow_provider: Estä julkaisija + description_html: Näitä linkkejä jaetaan parhaillaan paljon tileillä, joiden julkaisuja palvelimesi näkee. Luettelo voi auttaa käyttäjiäsi saamaan selville, mitä maailmassa tapahtuu. Linkit eivät näy julkisesti ennen kuin hyväksyt julkaisijan. Voit myös sallia tai hylätä yksittäisiä linkkejä. + disallow: Kiellä linkki + disallow_provider: Kiellä julkaisija no_link_selected: Linkkejä ei muutettu, koska yhtään ei ollut valittuna publishers: no_publisher_selected: Julkaisijoita ei muutettu, koska yhtään ei ollut valittuna shared_by_over_week: - one: Yksi henkilö jakanut viimeisen viikon aikana - other: Jakanut %{count} henkilöä viimeisen viikon aikana + one: Jakanut yksi käyttäjä viimeisen viikon aikana + other: Jakanut %{count} käyttäjää viimeisen viikon aikana title: Suositut linkit - usage_comparison: Jaettu %{today} kertaa tänään verrattuna eilen %{yesterday} + usage_comparison: Jaettu tänään %{today} kertaa verrattuna eilisen %{yesterday} kertaan not_allowed_to_trend: Ei saa trendata - only_allowed: Vain sallittu - pending_review: Odottaa tarkistusta + only_allowed: Vain sallitut + pending_review: Odottaa tarkastusta preview_card_providers: - allowed: Tämän julkaisijan linkit voivat trendata - description_html: Nämä ovat verkkotunnuksia, joiden linkkejä jaetaan usein palvelimellasi. Linkit eivät trendaa julkisesti, ellei linkin verkkotunnusta ole hyväksytty. Hyväksyntäsi (tai hylkäys) ulottuu aliverkkotunnuksiin. - rejected: Tämän julkaisijan linkit eivät voi trendata + allowed: Tämän julkaisijan lähettämät linkit voivat trendata + description_html: Näistä verkkotunnuksista lähetettyjä linkkejä jaetaan usein palvelimellasi. Linkit eivät trendaa julkisesti, ellei linkin verkkotunnusta ole hyväksytty. Hyväksyntäsi (tai hylkäyksesi) ulottuu aliverkkotunnuksiin. + rejected: Tämän julkaisijan lähettämät linkit eivät voi trendata title: Julkaisijat - rejected: Hylätty + rejected: Hylätyt statuses: allow: Salli julkaisu allow_account: Salli tekijä - description_html: Nämä ovat julkaisuja, joita palvelimesi tietää jaettavan ja lisättävän suosikkeihin paljon tällä hetkellä. Listaus voi auttaa uusia ja palaavia käyttäjiäsi löytämään lisää seurattavia. Julkaisut eivät näy julkisesti ennen kuin hyväksyt niiden julkaisijan ja julkaisija sallii tilinsä ehdottamisen. Voit myös sallia tai hylätä yksittäisiä julkaisuja. + description_html: Näitä julkaisuja palvelimesi tietää parhaillaan jaettavan ja lisättävän suosikkeihin paljon. Luettelo voi auttaa uusia ja palaavia käyttäjiäsi löytämään lisää seurattavia. Julkaisut eivät näy julkisesti ennen kuin hyväksyt niiden tekijän ja tekijä sallii tilinsä ehdottamisen. Voit myös sallia tai hylätä yksittäisiä julkaisuja. disallow: Kiellä julkaisu - disallow_account: Estä tekijä + disallow_account: Kiellä tekijä no_status_selected: Suosittuja julkaisuja ei muutettu, koska yhtään ei ollut valittuna not_discoverable: Tekijä ei ole ilmoittanut olevansa löydettävissä shared_by: one: Jaettu tai lisätty suosikkeihin kerran - other: Jaettu tai merkitty suosikiksi %{friendly_count} kertaa + other: Jaettu tai lisätty suosikkeihin %{friendly_count} kertaa title: Suositut julkaisut tags: current_score: Nykyinen tulos %{score} dashboard: - tag_accounts_measure: uniikit käyttötarkoitukset + tag_accounts_measure: uniikit käyttökerrat tag_languages_dimension: Suosituimmat kielet tag_servers_dimension: Suosituimmat palvelimet tag_servers_measure: eri palvelimet - tag_uses_measure: käyttökerrat - description_html: Nämä ovat aihetunnisteita, jotka näkyvät tällä hetkellä monissa julkaisuissa, jotka palvelimesi näkee. Tämä voi auttaa käyttäjiäsi selvittämään, mistä ihmiset puhuvat eniten tällä hetkellä. Mitään aihetunnisteita ei näytetä julkisesti, ennen kuin hyväksyt ne. - listable: Voidaan ehdottaa + tag_uses_measure: käyttökerrat yhteensä + description_html: Nämä aihetunnisteet näkyvät parhaillaan monissa julkaisuissa, jotka palvelimesi näkee. Tämä luettelo voi auttaa käyttäjiäsi selvittämään, mistä puhutaan eniten juuri nyt. Mitkään aihetunnisteet ei näy julkisesti ennen kuin hyväksyt ne. + listable: Voi ehdottaa no_tag_selected: Tunnisteita ei muutettu, koska yhtään ei ollut valittuna - not_listable: Ei tulla ehdottamaan - not_trendable: Ei näy trendien alla - not_usable: Ei voida käyttää + not_listable: Ei ehdoteta + not_trendable: Ei näy trendeissä + not_usable: Ei voi käyttää peaked_on_and_decaying: Saavutti huipun %{date}, nyt hiipuu title: Suositut aihetunnisteet - trendable: Voi näkyä trendien alla - trending_rank: 'Suosittua #%{rank}' - usable: Voidaan käyttää - usage_comparison: Käytetty %{today} kertaa tänään, verrattuna %{yesterday} eiliseen + trendable: Voi näkyä trendeissä + trending_rank: Suosittu, sijalla %{rank} + usable: Voi käyttää + usage_comparison: Käytetty tänään %{today} kertaa, verrattuna elisen %{yesterday} kertaan used_by_over_week: - one: Yhden henkilön käyttämä viime viikon aikana - other: Käyttänyt %{count} henkilöä viimeisen viikon aikana + one: Käyttänyt yksi käyttäjä viimeisen viikon aikana + other: Käyttänyt %{count} käyttäjää viimeisen viikon aikana title: Trendit - trending: Suosittua + trending: Trendaus warning_presets: add_new: Lisää uusi delete: Poista @@ -958,7 +979,7 @@ fi: delete: Poista description_html: "Webhookin avulla Mastodon voi puskea sovellukseesi reaaliaikaisia ilmoituksia valituista tapahtumista, jotta sovelluksesi voi laukaista reaktioita automaattisesti." disable: Poista käytöstä - disabled: Pois käytöstä + disabled: Poissa käytöstä edit: Muokkaa päätepistettä empty: Et ole vielä määrittänyt webhook-päätepisteitä. enable: Ota käyttöön @@ -968,40 +989,40 @@ fi: other: "%{count} aktivoitua tapahtumaa" events: Tapahtumat new: Uusi webhook - rotate_secret: Vaihda salaus - secret: Salainen tunnus + rotate_secret: Vaihda salaisuus + secret: Allekirjoituksen salaisuus status: Tila title: Webhookit webhook: Webhook admin_mailer: auto_close_registrations: - body: Palvelimen %{instance} moderaattorit eivät ole olleet viime aikoina aktiivisia. Tästä syystä rekisteröitymismenettely on automaattisesti vaihdettu erillishyväksyntöjä edellyttäväksi. Näin vähennetään riskiä palvelimen %{instance} käyttöön haitallisten toimijoiden alustana. Voit koska tahansa palauttaa käyttöön vapaat rekisteröitymiset. + body: Palvelimen %{instance} moderaattorit eivät ole olleet viime aikoina aktiivisia. Tästä syystä rekisteröitymismenettely on automaattisesti vaihdettu erillishyväksyntöjä edellyttäväksi. Näin vähennetään riskiä palvelimen %{instance} käyttöön haitallisten toimijoiden alustana. Voit milloin tahansa palauttaa käyttöön vapaat rekisteröitymiset. subject: Rekisteröitymiset palvelimelle %{instance} on automaattisesti vaihdettu vaatimaan hyväksyntää new_appeal: actions: delete_statuses: poistaa hänen julkaisunsa - disable: jäädyttää heidän tilinsä + disable: jäädyttää hänen tilinsä mark_statuses_as_sensitive: merkitä hänen julkaisunsa arkaluonteisiksi none: varoitus - sensitive: merkitä heidän tilinsä arkaluonteiseksi + sensitive: merkitä hänen tilinsä arkaluonteiseksi silence: rajoittaa hänen tiliään suspend: jäädyttää hänen tilinsä - body: "%{target} valittaa valvojan %{action_taken_by} päätöksestä %{date}, joka oli %{type}. Hän kirjoitti:" - next_steps: Voit hyväksyä valituksen, jolloin valvontapäätös kumoutuu, tai sivuuttaa sen. - subject: "%{username} valittaa valvontapäätöksestä, joka koskee instanssia %{instance}" + body: "%{target} valittaa moderaattorin %{action_taken_by} päätöksestä %{date}, joka oli %{type}. Hän kirjoitti:" + next_steps: Voit hyväksyä valituksen, jolloin moderointipäätös kumoutuu, tai sivuuttaa sen. + subject: "%{username} valittaa palvelinta %{instance} koskevasta moderointipäätöksestä" new_critical_software_updates: body: Mastodonin uusia kriittisen tärkeitä versioita on julkaistu, joten saatat haluta päivittää niin pian kuin mahdollista! - subject: Kriittisiä Mastodon-päivityksiä on saatavilla instanssille %{instance}! + subject: Palvelimelle %{instance} on saatavilla kriittisiä Mastodon-päivityksiä! new_pending_account: body: Uuden tilin tiedot ovat alla. Voit hyväksyä tai hylätä tämän hakemuksen. - subject: Uusi tili tarkastettavana instanssissa %{instance} (%{username}) + subject: Uusi tili tarkastettavana palvelimella %{instance} (%{username}) new_report: body: "%{reporter} on raportoinut kohteen %{target}" - body_remote: Joku palvelimelta %{domain} raportoi käyttäjän %{target} - subject: Uusi raportti instanssista %{instance} (nro %{id}) + body_remote: Joku palvelimelta %{domain} raportoi kohteen %{target} + subject: Uusi raportti palvelimesta %{instance} (nro %{id}) new_software_updates: body: Uusia Mastodon-versioita on julkaistu, joten saatat haluta päivittää! - subject: Uusia Mastodon-versioita ovat saatavilla instanssille %{instance}! + subject: Palvelimelle %{instance} ovat saatavilla uusia Mastodon-versioita! new_trends: body: 'Seuraavat kohteet on tarkistettava ennen kuin ne voidaan näyttää julkisesti:' new_trending_links: @@ -1010,19 +1031,19 @@ fi: title: Suositut julkaisut new_trending_tags: title: Suositut aihetunnisteet - subject: Uusia trendejä tarkistettavaksi instanssissa %{instance} + subject: Palvelimella %{instance} on uusia trendejä tarkistettavaksi aliases: add_new: Luo alias - created_msg: Uusi alias luotiin onnistuneesti. Voit nyt aloittaa siirron vanhasta tilistä. - deleted_msg: Alias poistettiin onnistuneesti. Siirtyminen tuolta tililtä tähän ei ole enää mahdollista. + created_msg: Uusi alias luotiin onnistuneesti. Voit nyt aloittaa muuton vanhasta tilistä. + deleted_msg: Alias poistettiin onnistuneesti. Muuttaminen tuolta tililtä tähän ei ole enää mahdollista. empty: Sinulla ei ole aliaksia. - hint_html: Jos haluat muuttaa toiselta tililtä tälle tilille, voit luoda tässä aliaksen, mitä vaaditaan ennen kuin voit edetä siirtämään seuraajat vanhalta tililtä tälle tilille. Tänä toiminto on itsessään vaaraton ja kumottavissa. Tilin muuttaminen aloitetaan vanhalta tililtä. + hint_html: Jos haluat muuttaa toisesta tilistä tähän tiliin, voit luoda tässä aliaksen, mitä vaaditaan ennen kuin voit edetä siirtämään seuraajasi vanhalta tililtä tälle tilille. Tänä toiminto on itsessään vaaraton ja kumottavissa. Tilin muuttaminen aloitetaan vanhalta tililtä. remove: Poista aliaksen linkitys appearance: advanced_web_interface: Edistynyt selainkäyttöliittymä advanced_web_interface_hint: 'Jos haluat hyödyntää näytön koko leveyttä, edistyneen selainkäyttöliittymän avulla voit määrittää useita erilaisia sarakkeita, niin näet kerralla niin paljon tietoa kuin haluat: kotisyöte, ilmoitukset, yleinen aikajana, mikä tahansa määrä listoja ja aihetunnisteita.' animations_and_accessibility: Animaatiot ja saavutettavuus - confirmation_dialogs: Vahvistusvalinnat + confirmation_dialogs: Vahvistusikkunat discovery: Löytäminen localization: body: Mastodonin ovat kääntäneet vapaaehtoiset. @@ -1031,7 +1052,7 @@ fi: sensitive_content: Arkaluonteinen sisältö application_mailer: notification_preferences: Muuta sähköpostiasetuksia - salutation: "%{name}," + salutation: "%{name}" settings: 'Muuta sähköpostiasetuksia: %{link}' unsubscribe: Lopeta tilaus view: 'Näytä:' @@ -1041,18 +1062,18 @@ fi: created: Sovelluksen luonti onnistui destroyed: Sovelluksen poisto onnistui logout: Kirjaudu ulos - regenerate_token: Luo pääsytunnus uudelleen - token_regenerated: Pääsytunnuksen uudelleenluonti onnistui - warning: Säilytä tietoa hyvin. Älä milloinkaan jaa sitä muille! - your_token: Pääsytunnus + regenerate_token: Luo uusi käyttöoikeustunnus + token_regenerated: Uuden käyttöoikeustunnuksen luonti onnistui + warning: Ole varovainen näiden tietojen kanssa. Älä koskaan jaa niitä muille! + your_token: Käyttöoikeustunnus auth: apply_for_account: Pyydä tiliä captcha_confirmation: help_html: Jos kohtaat ongelmia CAPTCHAn ratkaisemisessa, voit pyytää meiltä apua osoitteella %{email}. - hint_html: Vielä yksi juttu! Meidän on vahvistettava, että olet ihminen (tämän avulla pidämme roskapostin poissa!). Ratkaise alla oleva CAPTCHA-vahvistus ja paina "Jatka". + hint_html: Vielä yksi asia! Meidän on vahvistettava, että olet ihminen (tämän avulla pidämme roskapostin poissa!). Ratkaise alla oleva CAPTCHA-vahvistus ja paina ”Jatka”. title: Turvatarkastus confirmations: - awaiting_review: Sähköpostiosoitteesi on vahvistettu! Seuraavaksi palvelimen %{domain} ylläpito tarkistaa rekisteröitymisesi, ja saat lopuksi ilmoituksen sähköpostitse, jos tilisi hyväksytään! + awaiting_review: Sähköpostiosoitteesi on vahvistettu! Seuraavaksi palvelimen %{domain} ylläpito tarkastaa rekisteröitymisesi, ja saat lopuksi ilmoituksen sähköpostitse, jos tilisi hyväksytään! awaiting_review_title: Rekisteröitymisesi on tarkistettavana clicking_this_link: napsauttaa tätä linkkiä login_link: kirjautumalla sisään @@ -1071,7 +1092,7 @@ fi: dont_have_your_security_key: Eikö sinulla ole suojausavainta? forgot_password: Unohditko salasanasi? invalid_reset_password_token: Salasanan palautustunnus on virheellinen tai vanhentunut. Pyydä uusi. - link_to_otp: Syötä puhelimesi kaksivaiheisen todennuksen koodi tai palautuskoodi + link_to_otp: Syötä kaksivaiheisen todennuksen tunnusluku puhelimestasi tai palautuskoodi link_to_webauth: Käytä suojausavaintasi log_in_with: Kirjaudu käyttäen login: Kirjaudu sisään @@ -1079,7 +1100,7 @@ fi: migrate_account: Muuta toiseen tiliin migrate_account_html: Jos haluat ohjata tämän tilin toiseen, voit asettaa toisen tilin tästä. or_log_in_with: Tai käytä kirjautumiseen - privacy_policy_agreement_html: Olen lukenut ja hyväksynyt tietosuojakäytännön + privacy_policy_agreement_html: Olen lukenut ja hyväksyn tietosuojakäytännön progress: confirm: Vahvista sähköpostiosoite details: Omat tietosi @@ -1095,26 +1116,26 @@ fi: rules: accept: Hyväksy back: Takaisin - invited_by: 'Seuraavalta käyttäjältä vastaanottamasi kutsun ansiosta voit liittyä palvelimelle %{domain}:' - preamble: Palvelimen %{domain} valvojat määrittävät ja valvovat sääntöjä. - preamble_invited: Ennen kuin jatkat, ota huomioon palvelimen %{domain} valvojien asettamat perussäännöt. + invited_by: 'Voit liittyä palvelimelle %{domain} kutsulla, jonka sait seuraavalta käyttäjältä:' + preamble: Palvelimen %{domain} moderaattorit määrittävät ja valvovat sääntöjä. + preamble_invited: Ennen kuin jatkat ota huomioon palvelimen %{domain} moderaattorien asettamat perussäännöt. title: Joitakin perussääntöjä. title_invited: Sinut on kutsuttu. - security: Tunnukset + security: Turvallisuus set_new_password: Aseta uusi salasana setup: email_below_hint_html: Tarkista roskapostikansiosi tai pyydä uusi viesti. Voit korjata sähköpostiosoitteesi, jos se oli väärin. email_settings_hint_html: Napsauta lähettämäämme linkkiä vahvistaaksesi osoitteen %{email}. Odotamme täällä. link_not_received: Etkö saanut linkkiä? - new_confirmation_instructions_sent: Saat uuden vahvistuslinkin sisältävän sähköpostiviestin muutamassa minuutissa! + new_confirmation_instructions_sent: Saat pian uuden vahvistuslinkin sisältävän sähköpostiviestin! title: Tarkista sähköpostilaatikkosi sign_in: - preamble_html: Kirjaudu %{domain}-tunnuksellasi. Jos tilisi sijaitsee eri palvelimella, et voi kirjautua tässä. + preamble_html: Kirjaudu %{domain}-tunnuksellasi. Jos tilisi on eri palvelimella, et voi kirjautua tässä. title: Kirjaudu palvelimelle %{domain} sign_up: - manual_review: Palvelimen %{domain} valvojat tarkistavat rekisteröitymiset käsin. Helpottaaksesi rekisteröitymisesi käsittelyä kerro hieman itsestäsi ja miksi haluat luoda käyttäjätilin palvelimelle %{domain}. - preamble: Kun sinulla on tili tällä Mastodon-palvelimella, voit seurata kaikkia muita verkossa olevia henkilöitä riippumatta siitä, missä heidän tilinsä on. - title: Otetaan sinulle käyttöön %{domain}. + manual_review: Palvelimen %{domain} ylläpito tarkastaa rekisteröitymiset käsin. Helpottaaksesi rekisteröitymisesi käsittelyä kerro hieman itsestäsi ja siitä, miksi haluat luoda käyttäjätilin palvelimelle %{domain}. + preamble: Kun sinulla on tili tällä Mastodon-palvelimella, voit seurata kaikkia muita verkossa olevia käyttäjiä riippumatta siitä, missä heidän tilinsä on. + title: Otetaan %{domain} käyttöösi. status: account_status: Tilin tila confirming: Odotetaan sähköpostivahvistuksen valmistumista. @@ -1122,7 +1143,7 @@ fi: pending: Hakemuksesi odottaa palvelimen ylläpidon tarkastusta. Tämä voi kestää jonkin aikaa. Saat sähköpostiviestin, jos hakemuksesi hyväksytään. redirecting_to: Tilisi ei ole aktiivinen, koska se ohjaa tällä hetkellä tilille %{acct}. self_destruct: Koska %{domain} sulkeutuu, voit käyttää tiliäsi vain rajoitetusti. - view_strikes: Näytä tiliäsi koskevia aiempia varoituksia + view_strikes: Näytä aiemmat tiliäsi koskevat varoitukset too_fast: Lomake lähetettiin liian nopeasti, yritä uudelleen. use_security_key: Käytä suojausavainta challenge: @@ -1160,20 +1181,20 @@ fi: success_msg: Tilin poisto onnistui warning: before: 'Ennen kuin etenet, lue nämä huomautukset huolellisesti:' - caches: Muiden palvelimien välimuistiin tallentamaa sisältöä voi vielä löytyä + caches: Muiden palvelinten välimuistiinsa tallentamaa sisältöä voi säilyä data_removal: Julkaisusi ja muut tietosi poistetaan pysyvästi email_change_html: Voit muuttaa sähköpostiosoitettasi poistamatta tiliäsi email_contact_html: Jos ei saavu perille, voit pyytää apua sähköpostilla %{email} email_reconfirmation_html: Jos et saa vahvistuksen sähköpostia, niin voit pyytää sitä uudelleen - irreversible: Et voi palauttaa tiliäsi tai aktivoida sitä uudelleen - more_details_html: Lisätietoja saat tietosuojakäytännöstämme. - username_available: Käyttäjänimesi tulee saataville uudestaan - username_unavailable: Käyttäjänimesi ei tule saataville enää uudestaan + irreversible: Et voi palauttaa tiliäsi etkä aktivoida sitä uudelleen + more_details_html: Tarkempia tietoja saat tietosuojakäytännöstämme. + username_available: Käyttäjänimesi tulee saataville uudelleen + username_unavailable: Käyttäjänimesi ei tule saataville enää uudelleen disputes: strikes: action_taken: Tehty toimi - appeal: Vetoomus - appeal_approved: Tähän valitukseen on haettu muutosta, eikä se ole enää voimassa + appeal: Valitus + appeal_approved: Tähän varoitukseen haettiin onnistuneesti muutosta, eikä se ole enää voimassa appeal_rejected: Valitus on hylätty appeal_submitted_at: Valitus lähetetty appealed_msg: Valituksesi on lähetetty. Jos se hyväksytään, sinulle ilmoitetaan. @@ -1182,10 +1203,10 @@ fi: approve_appeal: Hyväksy valitus associated_report: Liittyvä raportti created_at: Päivätty - description_html: Nämä ovat tiliäsi koskevia toimia ja varoituksia, jotka instanssin %{instance} ylläpito on lähettänyt sinulle. + description_html: Nämä ovat tiliisi kohdistuvia toimia sekä varoituksia, jotka palvelimen %{instance} ylläpito on lähettänyt sinulle. recipient: Osoitettu reject_appeal: Hylkää valitus - status: 'Julkaisu #%{id}' + status: Julkaisu nro %{id} status_removed: Julkaisu on jo poistettu järjestelmästä title: "%{action} alkaen %{date}" title_actions: @@ -1200,14 +1221,14 @@ fi: your_appeal_pending: Olet lähettänyt valituksen your_appeal_rejected: Valituksesi on hylätty domain_validator: - invalid_domain: ei ole kelvollinen toimialueen nimi + invalid_domain: ei ole kelvollinen verkkotunnus edit_profile: basic_information: Perustiedot - hint_html: "Mukauta, mitä ihmiset näkevät julkisessa profiilissasi ja julkaisujesi vieressä. Ihmiset seuraavat sinua takaisin ja ovat kanssasi vuorovaikutuksessa todennäköisemmin, kun sinulla on täytetty profiili ja profiilikuva." + hint_html: "Mukauta, mitä ihmiset näkevät julkisessa profiilissasi ja julkaisujesi vieressä. Sinua seurataan takaisin ja kanssasi ollaan vuorovaikutuksessa todennäköisemmin, kun sinulla on täytetty profiili ja profiilikuva." other: Muut errors: '400': Lähettämäsi pyyntö oli virheellinen tai muotoiltu virheellisesti. - '403': Sinulla ei ole lupaa nähdä tätä sivua. + '403': Sinulla ei ole oikeutta nähdä tätä sivua. '404': Etsimääsi sivua ei ole olemassa. '406': Tämä sivu ei ole saatavilla pyydetyssä muodossa. '410': Etsimääsi sivua ei ole enää olemassa. @@ -1222,13 +1243,13 @@ fi: noscript_html: Käyttääksesi Mastodonin verkkosovellusta, ota JavaScript käyttöön. Vaihtoehtoisesti voit kokeilla käyttämällesi alustalle kehitettyjä Mastodonin natiivisovelluksia. existing_username_validator: not_found: paikallista käyttäjää ei löydy kyseisellä käyttäjänimellä - not_found_multiple: "%{usernames} ei löytynyt" + not_found_multiple: käyttäjänimiä %{usernames} ei löytynyt exports: archive_takeout: date: Päiväys download: Lataa arkisto hint_html: Voit pyytää arkistoa omista julkaisuista ja mediasta. Viedyt tiedot ovat ActivityPub-muodossa, ja ne voi lukea millä tahansa yhteensopivalla ohjelmalla. Voit pyytää arkistoa 7 päivän välein. - in_progress: Arkistoa kootaan... + in_progress: Arkistoa kootaan… request: Pyydä arkisto size: Koko blocks: Estot @@ -1236,13 +1257,13 @@ fi: csv: CSV domain_blocks: Verkkotunnusten estot lists: Listat - mutes: Mykistetyt - storage: Media-arkisto + mutes: Mykistykset + storage: Mediatiedostot featured_tags: add_new: Lisää uusi errors: - limit: Pidät jo esillä aihetunnisteiden enimmäismäärää - hint_html: "Pidä tärkeimpiä aihetunnisteitasi esillä profiilissasi. Erinomainen työkalu, jolla pidät kirjaa luovista teoksistasi ja pitkäaikaisista projekteistasi. Esillä pitämäsi aihetunnisteet ovat näyttävällä paikalla profiilissasi ja mahdollistavat nopean pääsyn omiin julkaisuihisi." + limit: Suosittelet jo aihetunnisteiden enimmäismäärää + hint_html: "Suosittele tärkeimpiä aihetunnisteitasi profiilissasi. Erinomainen työkalu, jolla pidät kirjaa luovista teoksistasi ja pitkäaikaisista projekteistasi. Suosittelemasi aihetunnisteet ovat näyttävällä paikalla profiilissasi ja mahdollistavat nopean pääsyn julkaisuihisi." filters: contexts: account: Profiilit @@ -1260,7 +1281,7 @@ fi: deprecated_api_multiple_keywords: Näitä parametreja ei voi muuttaa tästä sovelluksesta, koska ne koskevat useampaa kuin yhtä suodattimen avainsanaa. Käytä uudempaa sovellusta tai selainkäyttöliittymää. invalid_context: Ei sisältöä tai se on virheellinen index: - contexts: Suodattaa kontektissa %{contexts} + contexts: Suodattaa kontekstissa %{contexts} delete: Poista empty: Sinulla ei ole suodattimia. expires_in: Vanhenee %{distance} @@ -1291,8 +1312,8 @@ fi: one: "%{count} kohde tällä sivulla on valittu." other: Kaikki %{count} kohdetta tällä sivulla on valittu. all_matching_items_selected_html: - one: "%{count} kohde, joka vastaa hakuasi." - other: Kaikki %{count} hakuasi vastaavaa kohdetta. + one: "%{count} hakuasi vastaava kohde on valittuna." + other: Kaikki %{count} hakuasi vastaavat kohteet ovat valittuina. cancel: Peruuta changes_saved_msg: Muutosten tallennus onnistui! confirm: Vahvista @@ -1303,7 +1324,7 @@ fi: order_by: Järjestys save_changes: Tallenna muutokset select_all_matching_items: - one: Valitse %{count} kohde, joka vastaa hakuasi. + one: Valitse %{count} hakuasi vastaava kohde. other: Valitse kaikki %{count} hakuasi vastaavaa kohdetta. today: tänään validation_errors: @@ -1333,20 +1354,20 @@ fi: muting_html: Olet aikeissa korvata mykistettyjen tilien luettelosi kaikkiaan %{total_items} tilillä tiedostosta %{filename}. preambles: blocking_html: Olet aikeissa estää kaikkiaan %{total_items} tiliä tiedostosta %{filename}. - bookmarks_html: Olet lisäämässä kaikkiaan %{total_items} julkaisua tiedostosta %{filename}kirjanmerkkeihisi. + bookmarks_html: Olet aikeissa lisätä kaikkiaan %{total_items} julkaisua tiedostosta %{filename}kirjanmerkkeihisi. domain_blocking_html: Olet aikeissa estää kaikkiaan %{total_items} verkkotunnusta tiedostosta %{filename}. following_html: Olet aikeissa seurata kaikkiaan %{total_items} tiliä tiedostosta %{filename}. - lists_html: Olet lisäämässä listoihisi kaikkiaan %{total_items} tiliä tiedostosta %{filename}. Uusia listoja luodaan, jos sopivaa kohdelistaa ei ole olemassa. + lists_html: Olet aikeissa lisätä listoihisi kaikkiaan %{total_items} tiliä tiedostosta %{filename}. Uusia listoja luodaan, jos sopivaa kohdelistaa ei ole olemassa. muting_html: Olet aikeissa mykistää kaikkiaan %{total_items} tiliä tiedostosta %{filename}. - preface: Voit tuoda toiselta palvelimelta viemiäsi tietoja, kuten seuraamiesi tai estämiesi henkilöiden luettelon. + preface: Voit tuoda toiselta palvelimelta viemiäsi tietoja, kuten seuraamiesi tai estämiesi käyttäjien luettelon. recent_imports: Viimeksi tuotu states: finished: Valmis - in_progress: Toiminto käynnissä + in_progress: Käynnissä scheduled: Ajoitettu unconfirmed: Varmistamaton status: Tila - success: Tietojen lähettäminen onnistui, ja ne käsitellään kohtapuoliin + success: Tietojen lähettäminen onnistui, ja ne käsitellään aivan pian time_started: Aloitettu titles: blocking: Tuodaan estettyjä tilejä @@ -1355,7 +1376,7 @@ fi: following: Tuodaan seurattuja tilejä lists: Tuodaan listoja muting: Tuodaan mykistettyjä tilejä - type: Tuonnin tyyppi + type: Tuontityyppi type_groups: constructive: Seuratut ja kirjanmerkit destructive: Estot ja mykistykset @@ -1365,7 +1386,7 @@ fi: domain_blocking: Verkkotunnusten estoluettelo following: Seurattujen luettelo lists: Listat - muting: Mykistettyjen luettelo + muting: Mykistysluettelo upload: Lähetä invites: delete: Poista käytöstä @@ -1385,24 +1406,24 @@ fi: one: kertakäyttöinen other: "%{count} käyttökertaa" max_uses_prompt: Ei rajoitusta - prompt: Luo linkkejä ja jaa niiden avulla muille pääsyoikeus tähän instanssiin + prompt: Luo linkkejä ja jaa niiden avulla muille pääsyoikeus tälle palvelimelle table: expires_at: Vanhenee - uses: Käytetty + uses: Käyttökertoja title: Kutsu ihmisiä lists: errors: limit: Sinulla on enimmäismäärä listoja login_activities: authentication_methods: - otp: kaksivaiheisen todennuksen sovellus - password: salasana - sign_in_token: sähköpostin turvakoodi - webauthn: suojausavaimet - description_html: Jos näet toimintaa, jota et tunnista, harkitse salasanan vaihtamista ja kaksivaiheisen todennuksen ottamista käyttöön. + otp: kaksivaiheisen todennuksen sovelluksella + password: salasanalla + sign_in_token: sähköpostin suojauskoodilla + webauthn: suojausavaimella + description_html: Jos näet toimintaa, jota et tunnista, harkitse salasanan vaihtamista ja kaksivaiheisen todennuksen käyttöön ottamista. empty: Todennushistoriaa ei ole saatavilla - failed_sign_in_html: Kirjautumisyritys epäonnistui %{method} - %{ip} (%{browser}) - successful_sign_in_html: Kirjautuminen onnistui %{method} - %{ip} (%{browser}) + failed_sign_in_html: Epäonnistunut kirjautumisyritys %{method} IP-osoitteesta %{ip} (%{browser}) + successful_sign_in_html: Onnistunut kirjautuminen %{method} IP-osoitteesta %{ip} (%{browser}) title: Todennushistoria mail_subscriptions: unsubscribe: @@ -1413,7 +1434,7 @@ fi: notification_emails: favourite: sähköposti-ilmoituksia suosikkeihin lisäämisistä follow: sähköposti-ilmoituksia seuraamisista - follow_request: sähköposti-ilmoituksia seuraamispyynnöistä + follow_request: sähköposti-ilmoituksia seurantapyynnöistä mention: sähköposti-ilmoituksia maininnoista reblog: sähköposti-ilmoituksia tehostuksista resubscribe_html: Jos olet perunut tilauksen erehdyksessä, voit tilata ilmoitusviestejä uudelleen sähköposti-ilmoitusten asetuksista. @@ -1434,9 +1455,9 @@ fi: missing_also_known_as: ei ole tämän tilin alias move_to_self: ei voi olla nykyinen tili not_found: ei voitu löytää - on_cooldown: Sinä olet jäähyllä + on_cooldown: Olet jäähyllä followers_count: Seuraajat muuton aikana - incoming_migrations: Muutto toiselta tililtä + incoming_migrations: Muutto toisesta tilistä incoming_migrations_html: Muuttaaksesi toisesta tilistä tähän, sinun täytyy ensin luoda tilin alias. moved_msg: Tilisi ohjaa nyt kohteeseen %{acct} ja seuraajiasi siirretään. not_redirecting: Tilisi ei ohjaa tällä hetkellä mihinkään muuhun tiliin. @@ -1447,20 +1468,20 @@ fi: redirecting_to: 'Tilisi uudelleenohjaa nyt kohteeseen: %{acct}.' set_redirect: Aseta uudelleenohjaus warning: - backreference_required: Uusi tili on ensin määritettävä viittaamaan tähän tiliin + backreference_required: Uusi tili on ensin määritettävä viittaamaan takaisin tähän tiliin before: 'Ennen kuin etenet, lue nämä huomautukset huolellisesti:' - cooldown: Muuton jälkeen on odotusaika, jonka aikana et pysty enää muuttamaan - disabled_account: Nykyinen tilisi ei ole täysin käytettävissä tämän jälkeen. Sinulla on kuitenkin pääsy tietojen vientiin ja uudelleenaktivointiin. - followers: Tämä toiminto siirtää kaikki seuraajat nykyisestä tilistä uudelle tilille + cooldown: Muuton jälkeen on odotusaika, jonka aikana et voi muuttaa uudelleen + disabled_account: Nykyinen tilisi ei ole täysin käytettävissä tämän jälkeen. Sinulla on kuitenkin pääsy tietojen vientiin ja tilin uudelleenaktivointiin. + followers: Tämä toiminto siirtää kaikki seuraajasi nykyiseltä tililtä uudelle tilille only_redirect_html: Vaihtoehtoisesti voit asettaa vain ohjauksen profiiliisi. other_data: Muita tietoja ei siirretä automaattisesti - redirect: Nykyisen tilisi profiili päivitetään ohjaushuomautuksella ja suljetaan pois hauista + redirect: Nykyisen tilisi profiili päivitetään uudelleenohjaushuomautuksella ja suljetaan pois hauista moderation: - title: Valvonta + title: Moderointi move_handler: carry_blocks_over_text: Tämä käyttäjä siirtyi paikasta %{acct}, jonka olit estänyt. - carry_mutes_over_text: Tämä käyttäjä siirtyi tililtä %{acct}, jonka olet mykistänyt. - copy_account_note_text: 'Tämä käyttäjä siirtyi paikasta %{acct}, tässä olivat aiemmat muistiinpanosi niistä:' + carry_mutes_over_text: Tämä käyttäjä muutti tilistä %{acct}, jonka olet mykistänyt. + copy_account_note_text: 'Tämä käyttäjä siirtyi tililtä %{acct}. Nämä olivat muistiinpanosi hänestä:' navigation: toggle_menu: Avaa/sulje valikko notification_mailer: @@ -1478,10 +1499,10 @@ fi: subject: "%{name} seuraa nyt sinua" title: Uusi seuraaja follow_request: - action: Hallitse seuraamispyyntöjä - body: "%{name} haluaa seurata sinua" + action: Hallitse seurantapyyntöjä + body: "%{name} on pyytänyt lupaa seurata sinua" subject: 'Odottava seuraamispyyntö: %{name}' - title: Uusi seuraamispyyntö + title: Uusi seurantapyyntö mention: action: Vastaa body: "%{name} mainitsi sinut:" @@ -1531,7 +1552,7 @@ fi: duplicate_options: sisältää kaksoiskappaleita duration_too_long: on liian kaukana tulevaisuudessa duration_too_short: on liian aikainen - expired: Äänestys on jo loppunut + expired: Äänestys on jo päättynyt invalid_choice: Valittua äänestysvaihtoehtoa ei ole over_character_limit: voi olla enintään %{max} merkkiä self_vote: Et voi äänestää omissa äänestyksissäsi @@ -1546,9 +1567,9 @@ fi: privacy: Yksityisyys privacy_hint_html: Määritä, kuinka paljon muita avustavia tietoja haluat paljastaa. Käyttäjät löytävät kiinnostavia profiileja ja hienoja sovelluksia, kun he selaavat toisten seuraamia käyttäjiä ja kun he näkevät, millä sovelluksilla nämä julkaisevat. Saatat kuitenkin haluta piilottaa nämä tiedot. reach: Tavoittavuus - reach_hint_html: Määritä, haluatko tulla uusien käyttäjien löytämäksi ja seuraamaksi. Haluatko julkaisujesi näkyvän Selaa-sivulla? Haluatko muiden käyttäjien näkevän sinut seuraamissuosituksissaan? Haluatko hyväksyä kaikki uudet seuraajat automaattisesti vai päättää jokaisesta erikseen? - search: Hae - search_hint_html: Määritä, kuinka haluat tulla löydetyksi. Haluatko, että ihmiset löytävät sinut julkisten julkaisujesi perusteella? Haluatko, että ihmiset Mastodonin ulkopuolella löytävät profiilisi tehdessään hakuja verkossa? Otathan huomioon, ettei julkisten tietojen täyttä kaikista hakukoneista poisjäämistä voi taata. + reach_hint_html: Määritä, haluatko tulla uusien käyttäjien löytämäksi ja seuraamaksi. Haluatko julkaisujesi näkyvän Selaa-sivulla? Haluatko muiden käyttäjien näkevän sinut seurantasuosituksissaan? Haluatko hyväksyä kaikki uudet seuraajat automaattisesti vai päättää jokaisesta erikseen? + search: Haku + search_hint_html: Määritä, kuinka haluat tulla löydetyksi. Haluatko, että sinut löydetään julkisten julkaisujesi perusteella? Haluatko, että Mastodonin ulkopuoliset ihmiset löytävät profiilisi tehdessään hakuja verkossa? Otathan huomioon, ettei julkisten tietojen täyttä kaikista hakukoneista poisjäämistä voi taata. title: Yksityisyys ja tavoittavuus privacy_policy: title: Tietosuojakäytäntö @@ -1575,7 +1596,7 @@ fi: moved: Muuttaneet mutual: Seuraatte toisianne primary: Ensisijaiset - relationship: Suhde + relationship: Seurantasuhde remove_selected_domains: Poista kaikki seuraajat valituista verkkotunnuksista remove_selected_followers: Poista valitut seuraajat remove_selected_follows: Lopeta valittujen käyttäjien seuraaminen @@ -1604,41 +1625,41 @@ fi: alipay: Alipay blackberry: BlackBerry chrome: Chrome - edge: Microsoft Edge + edge: Edge electron: Electron firefox: Firefox - generic: Tuntematon selain + generic: tuntematon selain huawei_browser: Huawei-selain ie: Internet Explorer micro_messenger: MicroMessenger - nokia: Nokia S40 Ovi -selain + nokia: Nokia S40:n Ovi-selain opera: Opera otter: Otter phantom_js: PhantomJS qq: QQ Browser safari: Safari uc_browser: UC Browser - unknown_browser: Tuntematon selain + unknown_browser: tuntematon selain weibo: Weibo current_session: Nykyinen istunto date: Päiväys - description: "%{browser} alustalla %{platform}" - explanation: Nämä verkkoselaimet ovat tällä hetkellä kirjautuneena Mastodon-tilillesi. + description: "%{browser} %{platform}" + explanation: Nämä verkkoselaimet ovat parhaillaan kirjautuneena Mastodon-tilillesi. ip: IP-osoite platforms: - adobe_air: Adobe AIR - android: Android - blackberry: BlackBerry - chrome_os: ChromeOS - firefox_os: Firefox OS - ios: iOS - kai_os: KaiOS - linux: Linux - mac: macOS - unknown_platform: Tuntematon alusta - windows: Windows - windows_mobile: Windows Mobile - windows_phone: Windows Phone + adobe_air: alustalla Adobe Air + android: alustalla Android + blackberry: alustalla BlackBerry + chrome_os: alustalla ChromeOS + firefox_os: alustalla Firefox OS + ios: alustalla iOS + kai_os: alustalla KaiOS + linux: alustalla Linux + mac: alustalla macOS + unknown_platform: tuntemattomalla alustalla + windows: alustalla Windows + windows_mobile: alustalla Windows Mobile + windows_phone: alustalla Windows Phone revoke: Hylkää revoke_success: Istunnon hylkäys onnistui title: Istunnot @@ -1654,17 +1675,17 @@ fi: development: Kehitys edit_profile: Muokkaa profiilia export: Vie tietoja - featured_tags: Esillä pidettävät aihetunnisteet - import: Tuo + featured_tags: Suositellut aihetunnisteet + import: Tuo tietoja import_and_export: Tuonti ja vienti - migrate: Tilin muutto muualle + migrate: Tilin muutto toisaalle notifications: Sähköposti-ilmoitukset - preferences: Ominaisuudet + preferences: Asetukset profile: Julkinen profiili relationships: Seuratut ja seuraajat - severed_relationships: Katkenneet seurantasuhteet - statuses_cleanup: Autom. julkaisujen poisto - strikes: Valvontavaroitukset + severed_relationships: Katkenneet suhteet + statuses_cleanup: Julkaisujen automaattipoisto + strikes: Moderointivaroitukset two_factor_authentication: Kaksivaiheinen todennus webauthn_authentication: Suojausavaimet severed_relationships: @@ -1675,7 +1696,7 @@ fi: user_domain_block: Estit käyttäjän %{target_name} lost_followers: Menetetyt seuraajat lost_follows: Menetetyt seuratut - preamble: Voit menettää seurattusi ja seuraajasi, kun estät verkkotunnuksen tai kun valvojasi päättävät jäädyttää etäpalvelimen. Kun näin tapahtuu, voit ladata luetteloita katkenneista seurantasuhteista, jotta voit tarkastella niitä ja mahdollisesti viedä ne toiselle palvelimelle. + preamble: Voit menettää seurattusi ja seuraajasi, kun estät verkkotunnuksen tai kun moderaattorisi päättävät jäädyttää etäpalvelimen. Kun näin tapahtuu, voit ladata luetteloita katkenneista seurantasuhteista, jotta voit tarkastella niitä ja mahdollisesti viedä ne toiselle palvelimelle. purged: Palvelimesi ylläpitäjät ovat tyhjentäneet tämän palvelimen tiedot. type: Tapahtuma statuses: @@ -1708,8 +1729,8 @@ fi: reblog: Tehostusta ei voi kiinnittää poll: total_people: - one: "%{count} henkilö" - other: "%{count} henkilöä" + one: "%{count} käyttäjä" + other: "%{count} käyttäjää" total_votes: one: "%{count} ääni" other: "%{count} ääntä" @@ -1727,9 +1748,9 @@ fi: unlisted_long: Kaikki voivat nähdä, mutta ei näytetä julkisilla aikajanoilla statuses_cleanup: enabled: Poista vanhat julkaisut automaattisesti - enabled_hint: Poistaa julkaisusi automaattisesti, kun ne saavuttavat valitun ikärajan, ellei jokin alla olevista poikkeuksista tule kyseeseen + enabled_hint: Poistaa julkaisusi automaattisesti, kun ne saavuttavat valitun ikäkynnyksen, ellei jokin alla olevista poikkeuksista tule kyseeseen exceptions: Poikkeukset - explanation: Koska julkaisujen poistaminen on raskas toimi, se tapahtuu hitaasti ajan mittaan, kun palvelin ei ole muutoin ruuhkainen. Siksi viestejäsi voi poistua vasta tovi sen jälkeen, kun ne ovat saavuttaneet ikärajan. + explanation: Koska julkaisujen poistaminen on raskas toimi, se tapahtuu hitaasti aikaa myöten silloin kun palvelin ei ole muutoin ruuhkainen. Siksi viestejäsi voi poistua vasta tovi sen jälkeen kun ne ovat ylittäneet ikäkynnyksen. ignore_favs: Ohita suosikit ignore_reblogs: Ohita tehostukset interaction_exceptions: Vuorovaikutuksiin perustuvat poikkeukset @@ -1755,9 +1776,9 @@ fi: '604800': 1 viikko '63113904': 2 vuotta '7889238': 3 kuukautta - min_age_label: Ikäraja + min_age_label: Ikäkynnys min_favs: Säilytä julkaisut, joilla on suosikiksi lisäyksiä vähintään - min_favs_hint: Ei poista julkaisujasi, joita on lisätty suosikeihin vähintään näin monta kertaa. Jätä tyhjäksi, jos haluat poistaa julkaisuja riippumatta suosikkeihin lisäysmääristä + min_favs_hint: Ei poista julkaisujasi, joita on lisätty suosikeihin vähintään näin monta kertaa. Jätä tyhjäksi, jos haluat poistaa julkaisuja riippumatta niiden suosikkeihin lisäämisen määrästä min_reblogs: Säilytä julkaisut, joilla on tehostuksia vähintään min_reblogs_hint: Ei poista julkaisujasi, joita on tehostettu vähintään näin monta kertaa. Jätä tyhjäksi, jos haluat poistaa julkaisuja riippumatta niiden tehostusten määrästä stream_entries: @@ -1784,13 +1805,13 @@ fi: too_many_requests: Käännöspalvelulle on hiljattain esitetty liian monta pyyntöä. two_factor_authentication: add: Lisää - disable: Poista 2FA käytöstä - disabled_success: Kaksivaiheinen todennus on poistettu käytöstä + disable: Poista kaksivaiheinen todennus käytöstä + disabled_success: Kaksivaiheisen todennuksen käytöstäpoisto onnistui edit: Muokkaa - enabled: Kaksivaiheinen todennus käytössä + enabled: Kaksivaiheinen todennus on käytössä enabled_success: Kaksivaiheisen todennuksen käyttöönotto onnistui generate_recovery_codes: Luo palautuskoodit - lost_recovery_codes: Palautuskoodien avulla voit käyttää tiliä, jos menetät puhelimesi. Jos olet hukannut palautuskoodisi, voit luoda uudet tästä. Vanhat palautuskoodit poistetaan käytöstä. + lost_recovery_codes: Palautuskoodien avulla saat jälleen pääsyn tilillesi, jos menetät puhelimesi. Jos olet hukannut palautuskoodisi, voit luoda uudet tästä. Vanhat palautuskoodit poistuvat käytöstä. methods: Kaksivaiheisen todennuksen menetelmät otp: Todennussovellus recovery_codes: Ota palautuskoodit talteen @@ -1800,14 +1821,14 @@ fi: user_mailer: appeal_approved: action: Tilin asetukset - explanation: Valitus tiliäsi koskevasta varoituksesta %{strike_date} jonka lähetit %{appeal_date} on hyväksytty. Tilisi on jälleen hyvässä kunnossa. + explanation: "%{appeal_date} lähettämäsi valitus tiliisi kohdistuvasta varoituksesta %{strike_date} on hyväksytty. Tilisi on jälleen hyvässä kunnossa." subject: Valituksesi %{date} on hyväksytty subtitle: Tilisi on jälleen normaalissa tilassa. title: Valitus hyväksytty appeal_rejected: - explanation: Valitus tiliäsi koskevasta varoituksesta %{strike_date} jonka lähetit %{appeal_date} on hylätty. - subject: Valituksesi %{date} on hylätty - subtitle: Vetoomuksesi on hylätty. + explanation: "%{appeal_date} lähettämäsi valitus tiliisi kohdistuvasta varoituksesta %{strike_date} on hylätty." + subject: "%{date} lähettämäsi valitus on hylätty" + subtitle: Valituksesi on hylätty. title: Valitus hylätty backup_ready: explanation: Olet pyytänyt täyden varmuuskopion Mastodon-tilistäsi. @@ -1816,10 +1837,10 @@ fi: title: Arkiston tallennus failed_2fa: details: 'Sisäänkirjautumispyrkimyksen yksityiskohtaiset tiedot:' - explanation: Joku on yrittänyt kirjautua tilillesi antaen väärän toisen todennustunnisteen. + explanation: Joku on yrittänyt kirjautua tilillesi mutta antoi väärän toisen todennustunnisteen. further_actions_html: Jos se et ollut sinä, suosittelemme, että %{action} välittömästi, sillä se on saattanut vaarantua. subject: Kaksivaiheisen todennuksen virhe - title: Kaksivaiheisen kirjautumisen toinen vaihe epäonnistui + title: Kaksivaiheisen todennuksen toinen vaihe epäonnistui suspicious_sign_in: change_password: vaihda salasanasi details: 'Tässä on tiedot kirjautumisesta:' @@ -1829,15 +1850,15 @@ fi: title: Uusi kirjautuminen warning: appeal: Lähetä valitus - appeal_description: Jos uskot, että tämä on virhe, voit hakea muutosta instanssin %{instance} ylläpidolta. + appeal_description: Jos uskot, että tämä on virhe, voit hakea muutosta palvelimen %{instance} ylläpidolta. categories: spam: Roskaposti violation: Sisältö rikkoo seuraavia yhteisön sääntöjä explanation: - delete_statuses: Joidenkin julkaisuistasi on havaittu rikkovan ainakin yhtä yhteisön sääntöä, joten instanssin %{instance} valvojat ovat poistaneet ne. + delete_statuses: Joidenkin julkaisuistasi on havaittu rikkovan ainakin yhtä yhteisön sääntöä, joten palvelimen %{instance} moderaattorit ovat poistaneet ne. disable: Et voi enää käyttää tiliäsi, mutta profiilisi ja muut tiedot pysyvät muuttumattomina. Voit pyytää varmuuskopiota tiedoistasi, vaihtaa tilin asetuksia tai poistaa tilisi. - mark_statuses_as_sensitive: Palvelimen %{instance} valvojat ovat merkinneet osan julkaisuistasi arkaluonteisiksi. Tämä tarkoittaa sitä, että ihmisten täytyy napauttaa mediaa ennen kuin sen esikatselu näytetään. Voit merkitä median itse arkaluonteiseksi, kun julkaiset tulevaisuudessa. - sensitive: Tästä lähtien kaikki ladatut mediatiedostot merkitään arkaluonteisiksi ja piilotetaan napsautusvaroituksen taakse. + mark_statuses_as_sensitive: Palvelimen %{instance} moderaattorit ovat merkinneet osan julkaisuistasi arkaluonteisiksi. Tämä tarkoittaa sitä, että mediaa täytyy napauttaa ennen kuin sen esikatselu näytetään. Voit merkitä median itse arkaluonteiseksi, kun julkaiset tulevaisuudessa. + sensitive: Tästä lähtien kaikki lähetetyt mediatiedostot merkitään arkaluonteisiksi ja piilotetaan napsautusvaroituksen taakse. silence: Voit edelleen käyttää tiliäsi, mutta vain sinua jo seuraavat käyttäjät näkevät julkaisusi tällä palvelimella ja sinut voidaan sulkea pois eri löytämisominaisuuksista. Toiset voivat kuitenkin edelleen seurata sinua manuaalisesti. suspend: Et voi enää käyttää tiliäsi, eivätkä profiilisi ja muut tiedot ole enää käytettävissä. Voit silti kirjautua sisään pyytääksesi tietojesi varmuuskopiota, kunnes tiedot on poistettu kokonaan noin 30 päivän kuluttua. Säilytämme kuitenkin joitain perustietoja, jotka estävät sinua kiertämästä jäädytystä. reason: 'Syy:' @@ -1866,11 +1887,11 @@ fi: checklist_subtitle: 'Näin pääset alkuun tällä uudella sosiaalisella alustalla:' checklist_title: Tervetulon tarkistuslista edit_profile_action: Mukauta - edit_profile_step: Tehosta vuorovaikutuksiasi kattavin profiilitiedoin. + edit_profile_step: Täydentämällä profiilisi tietoja tehostat vuorovaikutteisuutta. edit_profile_title: Mukauta profiiliasi explanation: Näillä vinkeillä pääset alkuun feature_action: Lue lisää - feature_audience: Mastodon tarjoaa sinulle ainutlaatuisen mahdollisuuden hallita yleisöäsi ilman välikäsiä. Omassa infrastruktuurissasi toimiva Mastodon on täysin hallinnassasi, ja mahdollistaa sinun seurata mitä tahansa Mastodon-palvelimia sekä niin ikään olla seurattu niiltä päin. + feature_audience: Mastodon tarjoaa sinulle ainutlaatuisen mahdollisuuden hallita yleisöäsi ilman välikäsiä. Omassa infrastruktuurissasi toimiva Mastodon on täysin hallinnassasi ja antaa sinun seurata ja tulla seuratuksi miltä tahansa verkon Mastodon-palvelimelta. feature_audience_title: Rakenna yleisöäsi luottavaisin mielin feature_control: Tiedät itse parhaiten, mitä haluat nähdä kotisyötteessäsi. Ei algoritmeja eikä mainoksia tuhlaamassa aikaasi. Seuraa yhdellä tilillä ketä tahansa, miltä tahansa Mastodon-palvelimelta, vastaanota heidän julkaisunsa aikajärjestyksessä ja tee omasta internetin nurkastasi hieman enemmän omanlaisesi. feature_control_title: Pidä aikajanasi hallussasi @@ -1879,15 +1900,15 @@ fi: feature_moderation: Mastodon palauttaa päätöksenteon käsiisi. Jokainen palvelin luo omat sääntönsä ja määräyksensä, joita valvotaan paikallisesti eikä ylhäältä alas kuten kaupallisessa sosiaalisessa mediassa, mikä tekee siitä joustavimman vastaamaan eri ihmisryhmien tarpeisiin. Liity palvelimelle, jonka säännöt sopivat sinulle, tai ylläpidä omaa palvelinta. feature_moderation_title: Moderointi juuri kuten sen pitäisi olla follow_action: Seuraa - follow_step: Mastodon perustuu sinua kiinnostavien henkilöjen julkaisujen seuraamiseen. + follow_step: Mastodonissa on kyse kiinnostavien käyttäjien seuraamisesta. follow_title: Mukauta kotisyötettäsi follows_subtitle: Seuraa tunnettuja tilejä follows_title: Seurantaehdotuksia - follows_view_more: Näytä lisää seurattavia henkilöitä + follows_view_more: Näytä lisää seurattavia käyttäjiä hashtags_recent_count: - one: "%{people} henkilö viimeisen 2 päivän aikana" - other: "%{people} henkilöä viimeisen 2 päivän aikana" - hashtags_subtitle: Tutki, mikä on ollut suosittua 2 edeltävän päivän jälkeen + one: "%{people} käyttäjä viimeisenä 2 päivänä" + other: "%{people} käyttäjää viimeisenä 2 päivänä" + hashtags_subtitle: Tutki, mikä on ollut suosittua viimeisenä 2 päivänä hashtags_title: Suositut aihetunnisteet hashtags_view_more: Näytä lisää suosittuja aihetunnisteita post_action: Kirjoita @@ -1900,9 +1921,9 @@ fi: subject: Tervetuloa Mastodoniin title: Tervetuloa mukaan, %{name}! users: - follow_limit_reached: Et voi seurata yli %{limit} henkilöä + follow_limit_reached: Et voi seurata yli %{limit} käyttäjää go_to_sso_account_settings: Avaa identiteettitarjoajasi tiliasetukset - invalid_otp_token: Virheellinen kaksivaiheisen todentamisen koodi + invalid_otp_token: Virheellinen kaksivaiheisen todennuksen koodi otp_lost_help_html: Jos sinulla ei ole pääsyä kumpaankaan, voit ottaa yhteyden osoitteeseen %{email} rate_limited: Liian monta todennusyritystä – yritä uudelleen myöhemmin. seamless_external_login: Olet kirjautunut ulkoisen palvelun kautta, joten salasana- ja sähköpostiasetukset eivät ole käytettävissä. @@ -1911,20 +1932,20 @@ fi: extra_instructions_html: Vinkki: Verkkosivustollasi oleva linkki voi olla myös näkymätön. Olennainen osuus on rel="me", joka estää toiseksi henkilöksi tekeytymisen verkkosivustoilla, joilla on käyttäjien luomaa sisältöä. Voit käyttää jopa link-elementtiä sivun head-osassa elementin a sijaan, mutta HTML:n pitää olla käytettävissä ilman JavaScript-koodin suorittamista. here_is_how: Näin voit tehdä sen hint_html: "Henkilöllisyyden vahvistaminen on Mastodonissa jokaisen käyttäjän ulottuvilla. Se perustuu avoimiin standardeihin ja on maksutonta nyt ja aina. Tarvitset vain henkilökohtaisen verkkosivuston, jonka perusteella sinut voidaan tunnistaa. Kun teet linkin tuolle verkkosivulle profiilistasi, tarkistamme, että verkkosivustolla on linkki takaisin profiiliisi, ja näytämme profiilissasi visuaalisen ilmaisimen." - instructions_html: Kopioi ja liitä alla oleva koodi verkkosivustosi HTML-lähdekoodiin. Lisää sitten verkkosivustosi osoite johonkin profiilisi lisäkentistä ”Muokkaa profiilia” -välilehdellä ja tallenna muutokset. + instructions_html: Kopioi ja liitä seuraava koodi verkkosivustosi HTML-lähdekoodiin. Lisää sitten verkkosivustosi osoite johonkin profiilisi lisäkentistä ”Muokkaa profiilia” -välilehdellä ja tallenna muutokset. verification: Vahvistus verified_links: Vahvistetut linkkisi webauthn_credentials: add: Lisää uusi suojausavain create: error: Suojausavaimen lisäämisessä oli ongelma. Yritä uudelleen. - success: Suojausavaimesi lisääminen onnistui. + success: Suojausavaimesi lisäys onnistui. delete: Poista delete_confirmation: Haluatko varmasti poistaa tämän suojausavaimen? - description_html: Jos otat suojausavaimen todennuksen käyttöön, kirjautuminen edellyttää jonkin suojausavaimen käyttämistä. + description_html: Jos otat suojausavaimella todennuksen käyttöön, kirjautuminen edellyttää jonkin suojausavaimesi käyttämistä. destroy: error: Suojausavaimen poistamisessa oli ongelma. Yritä uudelleen. - success: Suojausavaimesi poistaminen onnistui. + success: Suojausavaimesi poisto onnistui. invalid_credential: Virheellinen suojausavain nickname_hint: Anna uuden suojausaivaimesi lempinimi not_enabled: Et ole vielä ottanut WebAuthn-ohjelmaa käyttöön diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 945a2216a3d..74b37c759ef 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -226,6 +226,7 @@ fo: update_custom_emoji: Dagfør Sergjørt Kenslutekn update_domain_block: Dagfør Domain forðing update_ip_block: Dagfør IP reglur + update_report: Dagfør frágreiðing update_status: Dagfør Uppslag update_user_role: Dagfør Leiklut actions: @@ -470,6 +471,9 @@ fo: title: Tilmæli at fylgja unsuppress: Endurskapa tilmæli at fylgja instances: + audit_log: + title: Feskir kanningarloggar + view_all: Vís fullar kanningarloggar availability: description_html: one: Um veiting til navnaøkið ikki riggar í %{count} dag, so verða ongar royndir at veita gjørdar, uttan so, at ein veiting frá navnaøkinum er móttikin. @@ -638,6 +642,7 @@ fo: report: 'Melding #%{id}' reported_account: Meldað konta reported_by: Meldað av + reported_with_application: Fráboðað við umsókn resolved: Loyst resolved_msg: Melding avgreidd! skip_to_actions: Leyp til atgerðir @@ -880,7 +885,23 @@ fo: action: Kekka her fyri at fáa fleiri upplýsingar message_html: "Objekt-goymslan hjá tær er skeivt uppsett. Privatlívið hjá brúkarunum hjá tær er í vanda." tags: + moderation: + not_trendable: Ikki rákbært + not_usable: Kann ikki brúkast + pending_review: Viðgerð í gongd + review_requested: Viðgerð umbiðin + reviewed: Viðgjørt + title: Støða + trendable: Rákbært + unreviewed: Ikki viðgjørt + usable: Ónýtiligt + name: Navn + newest: Nýggjasta/u + oldest: Elsta/u + reset: Endurstilla review: Eftirkanna støðu + search: Leita + title: Frámerki updated_msg: Frámerkjastillingar dagførdar title: Umsiting trends: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 54e28608efa..054ae2fab2a 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -226,6 +226,7 @@ fy: update_custom_emoji: Lokale emoji bywurkje update_domain_block: Domeinblokkade bywurkje update_ip_block: IP-rigel bywurkje + update_report: Rapportaazje bywurkje update_status: Berjocht bywurkje update_user_role: Rol bywurkje actions: @@ -293,6 +294,7 @@ fy: filter_by_action: Op aksje filterje filter_by_user: Op brûker filterje title: Auditlogboek + unavailable_instance: "(domeinnamme net beskikber)" announcements: destroyed_msg: Fuortsmiten fan meidieling slagge! edit: @@ -469,6 +471,9 @@ fy: title: Oanrekommandearre accounts unsuppress: Account wer oanrekommandearje instances: + audit_log: + title: Resinte auditlochboeken + view_all: Folsleine auditlochboeken besjen availability: description_html: one: As de besoarging oan it domein nei %{count} dag mislearjen bliuwt, dan sille der gjin fierdere besykjen ta besoarging dien wurde oant in besoarging fan it domein ûntfongen is. @@ -637,6 +642,7 @@ fy: report: 'Rapportaazje #%{id}' reported_account: Rapportearre account reported_by: Rapportearre troch + reported_with_application: Mei applikaasje rapportearre resolved: Oplost resolved_msg: Rapportaazje oplosse slagge! skip_to_actions: Gean daliks nei de maatregels @@ -780,6 +786,7 @@ fy: approved: Goedkarring fereaske om te registrearje te kinnen none: Net ien kin harren registrearje open: Elkenien kin harren registrearje + warning_hint: Wy riede jo oan om ‘Goedkarring fereaske om registrearje te kinnen’ te brûken, útsein jo der wis fan binne dat jo moderaasjeteam spam en kweawollende registraasjes tidich ôfhannelje kin. security: authorized_fetch: Ferifikaasje fan fedearre servers fereaskje authorized_fetch_hint: Ferifikaasje fereaskje fan federearre servers, makket in striktere hanthaving fan sawol brûkersnivo as server-levelblokken mooglik. Dit giet wol ten koste fan de prestaasjes, ferminderet it berik fan jo antwurden en kin kompatibiliteitsproblemen mei guon federearre services opleverje. Boppedat sil dit net foarkomme dat tawijde spilers jo iepenbiere artikelen en accounts ophelje. @@ -950,6 +957,7 @@ fy: delete: Fuortsmite edit_preset: Foarynstelling foar warskôging bewurkje empty: Jo hawwe noch gjin foarynstellingen foar warskôgingen tafoege. + title: Foarynstellingen foar warskôgingen webhooks: add_new: Einpunt tafoegje delete: Fuortsmite @@ -971,6 +979,9 @@ fy: title: Webhooks webhook: Webhook admin_mailer: + auto_close_registrations: + body: Yn ferbân mei in gebrek oan resinte moderatoraktiviteit, is de registraasjemodus op %{instance} automatysk wizige nei hânmjittige beoardieling troch moderatoren. Dit om foar te kommen dat %{instance} as platfoarm foar eventueel misbrûk brûkt wurde kin. Jo kinne op elk winske momint werom skeakelje nei iepen registraasjes. + subject: De registraasjemodus op %{instance} is automatysk wizige nei hânmjittige beoardieling troch moderatoren new_appeal: actions: delete_statuses: it fuortsmiten fan harren berjochten @@ -1669,6 +1680,8 @@ fy: user_domain_block: Jo hawwe %{target_name} blokkearre lost_followers: Ferlerne folgers lost_follows: Ferlerne folge accounts + preamble: Jo kinne folge accounts en folgers ferlieze wannear’t jo in domein blokkearje of wannear’t de moderators fan jo server beslisse om in eksterne server út te sluten. Wannear’t dat bart, kinne jo listen fan ferbrutsen folchrelaasjes downloade, dizze ynspektearje en mooglik ymportearje op in oare server. + purged: Ynformaasje oer dizze server is fuortsmiten troch de behearders fan jo server. type: Barren statuses: attached: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index a3ad293e5bd..0de8a2fede8 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -3,13 +3,24 @@ ga: about: about_mastodon_html: 'Líonra sóisialta a sheasfaidh an aimsir: Gan fógraíocht, gan faire chorparáideach, le leagan amach eiticiúil agus dílárú. Bíodh do chuid sonraí agatsa féin le Mastodon!' contact_missing: Gan socrú - contact_unavailable: N/B + contact_unavailable: N/A hosted_on: Mastodon arna óstáil ar %{domain} title: Maidir le accounts: follow: Lean + followers: + few: Leantóirí + many: Leantóirí + one: Leantóir + other: LeantóiríLeantóirí + two: Leantóirí following: Ag leanúint + instance_actor_flash: Is gníomhaí fíorúil é an cuntas seo a úsáidtear chun an freastalaí féin agus ní aon úsáideoir aonair a léiriú. Úsáidtear é chun críocha cónaidhme agus níor cheart é a chur ar fionraí. + last_active: deireanach gníomhach + link_verified_on: Seiceáladh úinéireacht an naisc seo ar %{date} nothing_here: Níl rud ar bith anseo! + pin_errors: + following: Ní mór duit a bheith ag leanúint an duine is mian leat a fhormhuiniú cheana féin posts: few: Postálacha many: Postálacha @@ -23,12 +34,17 @@ ga: title: Dean gníomh modhnóireachta ar %{acct} account_moderation_notes: create: Fág nóta + created_msg: Cruthaíodh nóta modhnóireachta go rathúil! + destroyed_msg: Nóta measarthachta scriosta go rathúil! accounts: + add_email_domain_block: Cuir bac ar fhearann ​​​​ríomhphoist approve: Faomh + approved_msg: D'éirigh le feidhmchlár sínithe %{username} a cheadú are_you_sure: An bhfuil tú cinnte? avatar: Abhatár by_domain: Fearann change_email: + changed_msg: D'éirigh leis an ríomhphost a athrú! current_email: Ríomhphost reatha label: Athraigh ríomhphost new_email: Ríomhphost nua @@ -46,7 +62,9 @@ ga: delete: Scrios sonraí deleted: Scriosta demote: Ísligh + destroyed_msg: Tá sonraí %{username} ciúáilte anois le scriosadh gan mhoill disable: Reoigh + disable_sign_in_token_auth: Díchumasaigh fíordheimhniú comhartha r-phoist disable_two_factor_authentication: Díchumasaigh 2FA disabled: Reoite display_name: Ainm taispeána @@ -55,22 +73,31 @@ ga: email: Ríomhphost email_status: Stádas ríomhphoist enable: Dí-reoigh + enable_sign_in_token_auth: Cumasaigh fíordheimhniú comhartha ríomhphoist enabled: Ar chumas + enabled_msg: D'éirigh le dí-reoite cuntas %{username} followers: Leantóirí follows: Ag leanúint header: Ceanntásc + inbox_url: URL an Bhosca Isteach + invite_request_text: Cúiseanna le bheith páirteach + invited_by: Ar cuireadh ó ip: IP joined: Cláraithe location: all: Uile local: Áitiúil remote: Cian + title: Suíomh login_status: Stádas logála isteach + media_attachments: Ceangaltáin meán memorialize: Déan cuntas chuimhneacháin de memorialized: Cuntas chuimhneacháin + memorialized_msg: D'éirigh le %{username} a iompú ina chuntas cuimhneacháin moderation: active: Gníomhach all: Uile + disabled: Faoi mhíchumas pending: Ar feitheamh silenced: Teoranta suspended: Ar fionraí @@ -78,111 +105,389 @@ ga: moderation_notes: Nótaí modhnóireacht most_recent_activity: Gníomhaíocht is déanaí most_recent_ip: IP is déanaí + no_account_selected: Níor athraíodh aon chuntas mar níor roghnaíodh ceann ar bith + no_limits_imposed: Ní fhorchuirtear aon teorainneacha + no_role_assigned: Níl aon ról sannta + not_subscribed: Gan suibscríofa + pending: Athbhreithniú ar feitheamh perform_full_suspension: Fionraí previous_strikes: Cionta roimhe seo + previous_strikes_description_html: + few: Tá %{count} buailte ag an gcuntas seo. + many: Tá %{count} buailte ag an gcuntas seo. + one: Tá buail amháin ag an gcuntas seo. + other: Tá %{count} buailte ag an gcuntas seo. + two: Tá %{count} buailte ag an gcuntas seo. promote: Ardaigh protocol: Prótacal public: Poiblí + push_subscription_expires: Téann síntiús PuSH in éag redownload: Athnuaigh próifíl + redownloaded_msg: D'éirigh le hathnuachan próifíl %{username} ón mbunús reject: Diúltaigh + rejected_msg: D'éirigh le diúltú le feidhmchlár sínithe %{username} + remote_suspension_irreversible: Scriosadh sonraí an chuntais seo go do-aisiompaithe. + remote_suspension_reversible_hint_html: Cuireadh an cuntas ar fionraí ar a fhreastalaí, agus bainfear na sonraí go hiomlán ar %{date}. Go dtí sin, is féidir leis an gcianfhreastalaí an cuntas seo a chur ar ais gan aon drochéifeachtaí. Más mian leat sonraí uile an chuntais a bhaint láithreach, is féidir leat é sin a dhéanamh thíos. remove_avatar: Bain abhatár remove_header: Bain ceanntásc + removed_avatar_msg: D'éirigh leis an íomhá avatar %{username} a bhaint + removed_header_msg: D'éirigh le híomhá ceanntásc %{username} a bhaint + resend_confirmation: + already_confirmed: Tá an t-úsáideoir seo deimhnithe cheana féin + send: Seol an nasc deimhnithe arís + success: D'éirigh le nasc deimhnithe seolta! reset: Athshocraigh reset_password: Athshocraigh pasfhocal resubscribe: Athchláraigh role: Ról search: Cuardaigh + search_same_email_domain: Úsáideoirí eile a bhfuil an fearann ​​ríomhphoist céanna acu + search_same_ip: Úsáideoirí eile a bhfuil an IP céanna acu + security: Slándáil security_measures: only_password: Pasfhocal amháin password_and_2fa: Pasfhocal agus fíordheimhniú déshraithe + sensitive: Fórsa-íogair sensitized: Marcáladh mar íogair + shared_inbox_url: URL an bhosca isteach roinnte + show: + created_reports: Tuarascálacha déanta + targeted_reports: Thuairiscigh daoine eile silence: Teorannaigh silenced: Teoranta statuses: Postálacha + strikes: Stailceanna roimhe seo subscribe: Cláraigh suspend: Cuir ar fionraí suspended: Ar fionraí + suspension_irreversible: Scriosadh sonraí an chuntais seo go do-aisiompaithe. Is féidir leat an cuntas a chur ar fionraí chun é a dhéanamh inúsáidte ach ní dhéanfaidh sé aon sonraí a bhí aige roimhe seo a aisghabháil. + suspension_reversible_hint_html: Tá an cuntas curtha ar fionraí, agus bainfear na sonraí go hiomlán ar %{date}. Go dtí sin, is féidir an cuntas a chur ar ais gan aon drochthionchar. Más mian leat sonraí uile an chuntais a bhaint láithreach, is féidir leat é sin a dhéanamh thíos. title: Cuntais + unblock_email: Bain an bac den seoladh ríomhphoist + unblocked_email_msg: D'éirigh leis an mbac a bhain le seoladh ríomhphoist %{username} + unconfirmed_email: Ríomhphost neamhdheimhnithe + undo_sensitized: Cealaigh fórsa-íogair + undo_silenced: Cealaigh teorainn + undo_suspension: Cealaigh fionraí + unsilenced_msg: D'éirigh leis an teorainn chuntas %{username} a bhaint + unsubscribe: Díliostáil + unsuspended_msg: D'éirigh le dífhorlannú cuntas %{username} username: Ainm úsáideora + view_domain: Féach ar achoimre le haghaidh fearainn warn: Rabhadh a thabhairt web: Gréasán + whitelisted: Ceadaithe do chónaidhm action_logs: action_types: + approve_appeal: Achomharc a cheadú + approve_user: Úsáideoir a cheadú assigned_to_self_report: Sann Tuairisc + change_email_user: Athraigh Ríomhphost don Úsáideoir + change_role_user: Athrú Ról an Úsáideora + confirm_user: Deimhnigh Úsáideoir create_account_warning: Cruthaigh Rabhadh + create_announcement: Cruthaigh Fógra + create_canonical_email_block: Cruthaigh Bloc Ríomhphoist + create_custom_emoji: Cruthaigh Emoji Saincheaptha + create_domain_allow: Cruthaigh Ceadaigh Fearainn + create_domain_block: Cruthaigh Bloc Fearainn + create_email_domain_block: Cruthaigh Bloc Fearainn Ríomhphoist create_ip_block: Cruthaigh riail IP + create_unavailable_domain: Cruthaigh Fearann ​​Gan Fáil create_user_role: Cruthaigh Ról demote_user: Ísligh úsáideoir destroy_announcement: Scrios Fógra + destroy_canonical_email_block: Scrios Bloc Ríomhphoist + destroy_custom_emoji: Scrios Saincheaptha Emoji + destroy_domain_allow: Scrios Ceadaigh Fearainn + destroy_domain_block: Scrios Bloc Fearainn + destroy_email_domain_block: Scrios Bloc Fearainn R-phoist + destroy_instance: Fearann ​​Purge destroy_ip_block: Scrios riail IP destroy_status: Scrios Postáil + destroy_unavailable_domain: Scrios Fearann ​​Gan Fáil destroy_user_role: Scrios ról + disable_2fa_user: Díchumasaigh 2FA + disable_custom_emoji: Díchumasaigh Emoji Saincheaptha + disable_sign_in_token_auth_user: Díchumasaigh Fíordheimhniú Comhartha R-phoist don Úsáideoir + disable_user: Díchumasaigh Úsáideoir + enable_custom_emoji: Cumasaigh Emoji Saincheaptha + enable_sign_in_token_auth_user: Cumasaigh Fíordheimhniú Comhartha R-phoist don Úsáideoir + enable_user: Cumasaigh Úsáideoir + memorialize_account: Cuntas Cuimhneacháin + promote_user: Úsáideoir a chur chun cinn + reject_appeal: Diúltaigh Achomharc + reject_user: Diúltaigh Úsáideoir remove_avatar_user: Bain Abhatár reopen_report: Athoscail tuairisc + resend_user: Seol Ríomhphost Deimhnithe arís reset_password_user: Athshocraigh Pasfhocal resolve_report: Réitigh tuairisc + sensitive_account: Cuntas Íogair Fórsa + silence_account: Cuntas Teorainn + suspend_account: Cuntas a Fhionraí unassigned_report: Díshann Tuairisc + unblock_email_account: Bain an bac den seoladh ríomhphoist + unsensitive_account: Cealaigh Cuntas Íogair Fórsa + unsilence_account: Cealaigh an Cuntas Teorainn + unsuspend_account: Díghlasáil Cuntas update_announcement: Nuashonraigh Fógra + update_custom_emoji: Nuashonraigh Emoji Saincheaptha + update_domain_block: Nuashonraigh Emoji Saincheaptha + update_ip_block: Íoslódáil an riail IP + update_report: Tuairisc Nuashonraithe update_status: Nuashonraigh Postáil update_user_role: Nuashonraigh Ról actions: + approve_appeal_html: Cheadaigh %{name} achomharc ar chinneadh modhnóireachta ó %{target} + approve_user_html: Cheadaigh %{name} clárú ó %{target} + assigned_to_self_report_html: Shann %{name} tuairisc %{target} dóibh féin + change_email_user_html: D'athraigh %{name} seoladh ríomhphoist úsáideora %{target} + change_role_user_html: D'athraigh %{name} ról %{target} + confirm_user_html: Dhearbhaigh %{name} seoladh ríomhphoist úsáideora %{target} create_account_warning_html: Sheol %{name} rabhadh chuig %{target} + create_announcement_html: Chruthaigh %{name} fógra nua %{target} + create_canonical_email_block_html: Chuir %{name} bac ar ríomhphost leis an hash %{target} + create_custom_emoji_html: D'uaslódáil %{name} emoji nua %{target} + create_domain_allow_html: Cheadaigh %{name} cónaidhm le fearann ​​%{target} + create_domain_block_html: "%{name} fearann ​​bactha %{target}" + create_email_domain_block_html: Chuir %{name} bac ar fhearann ​​ríomhphoist %{target} + create_ip_block_html: Chruthaigh %{name} riail don IP %{target} + create_unavailable_domain_html: Chuir %{name} deireadh leis an seachadadh chuig fearann ​​%{target} + create_user_role_html: Chruthaigh %{name} %{target} ról + demote_user_html: "%{name} úsáideoir scriosta %{target}" + destroy_announcement_html: "%{name} fógra scriosta %{target}" + destroy_canonical_email_block_html: "%{name} ríomhphost díchoiscthe leis an hash %{target}" + destroy_custom_emoji_html: Scriosadh %{name} emoji %{target} + destroy_domain_allow_html: Dhiúltaigh %{name} cónaidhm le fearann ​​%{target} + destroy_domain_block_html: "%{name} fearann ​​%{target} bainte de" + destroy_email_domain_block_html: "%{name} bain an bac den fhearann ​​ríomhphoist %{target}" + destroy_instance_html: Glanadh %{name} fearann ​​%{target} + destroy_ip_block_html: "%{name} scriosta riail le haghaidh IP %{target}" + destroy_status_html: Bhain %{name} postáil le %{target} + destroy_unavailable_domain_html: D'athchrom %{name} ar an seachadadh chuig fearann ​​%{target} destroy_user_role_html: Scrios %{name} ról %{target} + disable_2fa_user_html: Dhíchumasaigh %{name} riachtanas dhá fhachtóir don úsáideoir %{target} + disable_custom_emoji_html: Dhíchumasaigh %{name} emoji %{target} + disable_sign_in_token_auth_user_html: Dhíchumasaigh %{name} fíordheimhniú comhartha ríomhphoist le haghaidh %{target} + disable_user_html: "%{name} logáil isteach díchumasaithe d'úsáideoir %{target}" + enable_custom_emoji_html: "%{name} emoji cumasaithe %{target}" + enable_sign_in_token_auth_user_html: Chuir %{name} fíordheimhniú comhartha ríomhphoist ar chumas %{target} + enable_user_html: "%{name} logáil isteach cumasaithe don úsáideoir %{target}" + memorialize_account_html: Rinne %{name} cuntas %{target} a iompú ina leathanach cuimhneacháin + promote_user_html: Chuir %{name} úsáideoir %{target} chun cinn + reject_appeal_html: Dhiúltaigh %{name} achomharc ar chinneadh modhnóireachta ó %{target} + reject_user_html: Dhiúltaigh %{name} síniú suas ó %{target} + remove_avatar_user_html: Bhain %{name} avatar %{target} + reopen_report_html: D'athoscail %{name} tuairisc %{target} + resend_user_html: "%{name} athsheoladh ríomhphost deimhnithe le haghaidh %{target}" + reset_password_user_html: Athshocraigh %{name} pasfhocal úsáideora %{target} + resolve_report_html: Réitigh %{name} tuairisc %{target} + sensitive_account_html: Mharcáil %{name} meán %{target} mar íogair + silence_account_html: Chuir %{name} teorainn le cuntas %{target} + suspend_account_html: Chuir %{name} cuntas %{target} ar fionraí + unassigned_report_html: "%{name} tuairisc neamhshannta %{target}" + unblock_email_account_html: Bhain %{name} seoladh ríomhphoist %{target} amach + unsensitive_account_html: "%{name} meán %{target} gan mharcáil mar íogair" + unsilence_account_html: Chealaigh %{name} teorainn chuntas %{target} + unsuspend_account_html: Níor chuir %{name} cuntas %{target} ar fionraí + update_announcement_html: "%{name} fógra nuashonraithe %{target}" + update_custom_emoji_html: "%{name} emoji nuashonraithe %{target}" + update_domain_block_html: "%{name} nuashonraithe bloc fearainn le haghaidh %{target}" + update_ip_block_html: D'athraigh %{name} riail an IP %{target} + update_report_html: "%{name} tuairisc nuashonraithe %{target}" + update_status_html: "%{name} postáil nuashonraithe faoi %{target}" update_user_role_html: D'athraigh %{name} ról %{target} deleted_account: cuntas scriosta + empty: Níor aimsíodh aon logaí. + filter_by_action: Scag de réir gnímh + filter_by_user: Scag de réir úsáideora + title: Loga iniúchta + unavailable_instance: "(ainm fearainn ar fáil)" announcements: + destroyed_msg: D'éirigh leis an bhfógra a scriosadh! edit: title: Cuir fógra in eagar + empty: Níor aimsíodh aon fhógraí. live: Beo new: create: Cruthaigh fógra title: Fógra nua publish: Foilsigh + published_msg: D’éirigh leis an bhfógra a fhoilsiú! + scheduled_for: Sceidealta le haghaidh %{time} + scheduled_msg: Tá an fógra le foilsiú! title: Fógraí + unpublish: Dífhoilsiú + unpublished_msg: D’éirigh leis an bhfógra neamhfhoilsithe! + updated_msg: D'éirigh leis an bhfógra a nuashonrú! + critical_update_pending: Nuashonrú criticiúil ar feitheamh custom_emojis: + assign_category: Sann catagóir by_domain: Fearann + copied_msg: Cruthaíodh cóip áitiúil den emoji go rathúil copy: Cóipeáil + copy_failed_msg: Níorbh fhéidir cóip áitiúil den emoji sin a dhéanamh create_new_category: Cruthaigh catagóir nua created_msg: Cruthaíodh emoji go rathúil! delete: Scrios destroyed_msg: Scriosadh emoji go rathúil! disable: Díchumasaigh disabled: Díchumasaithe + disabled_msg: D'éirigh leis an emoji sin a dhíchumasú emoji: Emoji enable: Cumasaigh enabled: Ar chumas + enabled_msg: D'éirigh leis an emoji sin a chumasú + image_hint: PNG nó GIF suas go %{size} list: Liosta listed: Liostaithe + new: + title: Cuir emoji saincheaptha nua leis + no_emoji_selected: Níor athraíodh emojis ar bith mar níor roghnaíodh ceann ar bith + not_permitted: Níl cead agat an gníomh seo a dhéanamh overwrite: Forscríobh + shortcode: Gearrchód + shortcode_hint: 2 charachtar ar a laghad, gan ach carachtair alfa-uimhriúla agus béim ar leith + title: Emojis saincheaptha uncategorized: Neamhchatagóirithe unlist: Neamhliostaigh unlisted: Neamhliostaithe + update_failed_msg: Níorbh fhéidir an emoji sin a nuashonrú + updated_msg: D'éirigh le Emoji a nuashonrú! upload: Uaslódáil dashboard: active_users: úsáideoirí gníomhacha + interactions: idirghníomhaíochtaí + media_storage: Stóráil meáin new_users: úsáideoirí nua opened_reports: tuairiscí oscailte + pending_appeals_html: + few: "%{count} achomharc ar feitheamh" + many: "%{count} achomharc ar feitheamh" + one: "%{count} ar feitheamh achomhairc" + other: "%{count} achomharc ar feitheamh" + two: "%{count} achomharc ar feitheamh" + pending_reports_html: + few: "%{count} tuairiscí ar feitheamh" + many: "%{count} tuairiscí ar feitheamh" + one: "%{count} tuairisc ar feitheamh" + other: "%{count} tuairiscí ar feitheamh" + two: "%{count} tuairiscí ar feitheamh" + pending_tags_html: + few: "%{count} hashtags ar feitheamh" + many: "%{count} hashtags ar feitheamh" + one: "%{count} hashtag ar feitheamh" + other: "%{count} hashtags ar feitheamh" + two: "%{count} hashtags ar feitheamh" + pending_users_html: + few: "%{count} úsáideoirí ar feitheamh" + many: "%{count} úsáideoirí ar feitheamh" + one: "%{count} úsáideoir ar feitheamh" + other: "%{count} úsáideoirí ar feitheamh" + two: "%{count} úsáideoirí ar feitheamh" + resolved_reports: tuarascálacha réitithe software: Bogearraí + sources: Foinsí sínithe + space: Úsáid spáis title: Deais + top_languages: Barr teangacha gníomhacha + top_servers: Barr freastalaithe gníomhacha website: Suíomh Gréasáin disputes: appeals: + empty: Níor aimsíodh aon achomharc. title: Achomhairc domain_allows: + add_new: Ceadaigh cónaidhm leis an bhfearann + created_msg: Ceadaíodh fearann ​​don chónaidhm go rathúil + destroyed_msg: Dícheadaíodh an fearann ​​ón gcónaidhm export: Easpórtáil import: Iompórtáil + undo: Dícheadaigh cónaidhm leis an bhfearann domain_blocks: + add_new: Cuir bloc fearainn nua leis + confirm_suspension: + cancel: Cealaigh + confirm: Fionraí + permanent_action: Má dhéantar an fionraí a chealú, ní dhéanfar aon sonraí nó gaol a athbhunú. + preamble_html: Tá tú ar tí %{domain} agus a fhofhearainn a chur ar fionraí. + remove_all_data: Bainfidh sé seo gach ábhar, meán agus sonraí próifíle do chuntais an fhearainn seo de do fhreastalaí. + stop_communication: Stopfaidh do fhreastalaí ag cumarsáid leis na freastalaithe seo. + title: Deimhnigh bloc fearainn le haghaidh %{domain} + undo_relationships: Déanfaidh sé seo aon ghaol leantach idir cuntais na bhfreastalaithe seo agus do chuid féin a chealú. + created_msg: Tá bloc fearainn á phróiseáil anois + destroyed_msg: Tá an bloc fearainn cealaithe domain: Fearann + edit: Cuir bloc fearainn in eagar + existing_domain_block: Chuir tú teorainneacha níos déine ar %{name} cheana féin. + existing_domain_block_html: Chuir tú teorainneacha níos déine ar %{name} cheana féin, ní mór duit an bac a bhaint as ar dtús. export: Easpórtáil import: Iompórtáil new: + create: Cruthaigh bloc + hint: Ní choiscfidh an bloc fearainn iontrálacha cuntais a chruthú sa bhunachar sonraí, ach cuirfidh sé modhanna modhnóireachta sonracha i bhfeidhm go haisghníomhach agus go huathoibríoch ar na cuntais sin. severity: + desc_html: Déanfaidh Teorainn postálacha ó chuntais ag an bhfearann ​​seo dofheicthe d'aon duine nach bhfuil á leanúint. Bainfidh Fionraí gach ábhar, meán agus sonraí próifíle do chuntais an fhearainn seo de do fhreastalaí. Úsáid Dada más mian leat comhaid meán a dhiúltú. + noop: Dada silence: Teorannaigh suspend: Cuir ar fionraí + title: Bloc fearainn nua + no_domain_block_selected: Níor athraíodh aon bhloc fearainn mar níor roghnaíodh ceann ar bith + not_permitted: Níl cead agat an gníomh seo a dhéanamh + obfuscate: Obfuscate ainm fearainn + obfuscate_hint: Cuir bac páirteach ar an ainm fearainn sa liosta má tá fógraíocht ar an liosta teorainneacha fearainn cumasaithe + private_comment: Trácht príobháideach + private_comment_hint: Déan trácht ar an teorannú fearainn seo le haghaidh úsáid inmheánach ag na modhnóirí. + public_comment: Trácht poiblí + public_comment_hint: Déan trácht ar an teorannú fearainn seo don phobal i gcoitinne, má tá fógraíocht ar an liosta teorainneacha fearainn cumasaithe. + reject_media: Diúltaigh comhaid meán + reject_media_hint: Baintear comhaid meán atá stóráilte go háitiúil agus diúltaíonn sé aon cheann a íoslódáil amach anseo. Ní bhaineann le fionraí + reject_reports: Diúltaigh tuarascálacha + reject_reports_hint: Déan neamhaird de gach tuairisc a thagann ón bhfearann ​​seo. Ní bhaineann le fionraí + undo: Cealaigh bloc fearainn + view: Féach ar bhloc fearainn email_domain_blocks: + add_new: Cuir nua leis + allow_registrations_with_approval: Ceadaigh clárúcháin le ceadú + attempts_over_week: + few: "%{count} iarracht chun síniú suas le seachtain anuas" + many: "%{count} iarracht chun síniú suas le seachtain anuas" + one: "%{count} iarracht le seachtain anuas" + other: "%{count} iarracht chun síniú suas le seachtain anuas" + two: "%{count} iarracht chun síniú suas le seachtain anuas" + created_msg: D'éirigh leis an bhfearann ​​ríomhphoist a bhlocáil delete: Scrios + dns: + types: + mx: Taifead MX domain: Fearann + new: + create: Cuir fearann ​​leis + resolve: Réitigh fearann + title: Cuir bac ar fhearann ​​​​r-phoist nua + no_email_domain_block_selected: Níor athraíodh aon bhloc fearainn ríomhphoist mar níor roghnaíodh ceann ar bith + not_permitted: Níl sé ceadaithe + resolved_dns_records_hint_html: Réitíonn an t-ainm fearainn chuig na fearainn MX seo a leanas, atá freagrach sa deireadh as glacadh le ríomhphost. Má dhéantar fearann ​​MX a bhlocáil, cuirfear bac ar chlárúcháin ó aon seoladh ríomhphoist a úsáideann an fearann ​​MX céanna, fiú má tá an t-ainm fearainn infheicthe difriúil. Bí cúramach gan bac a chur ar phríomhsholáthraithe ríomhphoist. + resolved_through_html: Réitithe trí %{domain} + title: Fearainn ríomhphoist bactha + export_domain_allows: + new: + title: Ceadaíonn fearann ​​​​iomportála + no_file: Níor roghnaíodh aon chomhad + export_domain_blocks: + import: + description_html: Tá tú ar tí liosta de bhlocanna fearainn a allmhairiú. Athbhreithnigh an liosta seo go han-chúramach, le do thoil, go háirithe murar scríobh tú féin an liosta seo. + existing_relationships_warning: Caidreamh leantach atá ann cheana féin + private_comment_description_html: 'Chun cabhrú leat teacht ar cad as a dtagann bloic iompórtáilte, cruthófar bloic iompórtáilte leis an nóta tráchta príobháideach seo a leanas: %{comment}' + private_comment_template: Iompórtáilte ó %{source} ar %{date} + title: Iompórtáil bloic fearainn + invalid_domain_block: 'Léiríodh bloc fearainn amháin nó níos mó mar gheall ar an earráid(í): %{error}' + new: + title: Iompórtáil bloic fearainn + no_file: Níor roghnaíodh aon chomhad follow_recommendations: + description_html: "Lean na moltaí cabhraíonn sé le húsáideoirí nua ábhar suimiúil a aimsiú go tapa. Nuair nach mbíonn go leor idirghníomhaithe ag úsáideoir le daoine eile chun moltaí pearsantaithe a leanúint, moltar na cuntais seo ina ionad sin. Déantar iad a athríomh ar bhonn laethúil ó mheascán de chuntais a bhfuil na rannpháirtíochtaí is airde acu le déanaí agus na háirimh áitiúla is airde leanúna do theanga ar leith." language: Don teanga status: Stádas suppress: Coisc moladh leanúna @@ -190,36 +495,97 @@ ga: title: Moltaí leanúna unsuppress: Aischuir moladh leanúna instances: + audit_log: + title: Logchomhaid Iniúchta le Déanaí + view_all: Féach ar logaí iniúchta iomlána + availability: + description_html: + few: Má theipeann ar sheachadadh chuig an bhfearann ​​ar %{count} laethanta éagsúla gan rath, ní dhéanfar aon iarrachtaí seachadta eile mura bhfaightear ó seachadadh ón bhfearann. + many: Má theipeann ar sheachadadh chuig an bhfearann ​​ar %{count} laethanta éagsúla gan rath, ní dhéanfar aon iarrachtaí seachadta eile mura bhfaightear ó seachadadh ón bhfearann. + one: Má theipeann ar sheachadadh chuig an bhfearann ​​%{count} day gan rath, ní dhéanfar aon iarrachtaí seachadta eile mura bhfaightear ó seachadadh ón bhfearann. + other: Má theipeann ar sheachadadh chuig an bhfearann ​​ar %{count} laethanta éagsúla gan rath, ní dhéanfar aon iarrachtaí seachadta eile mura bhfaightear ó seachadadh ón bhfearann. + two: Má theipeann ar sheachadadh chuig an bhfearann ​​ar %{count} laethanta éagsúla gan rath, ní dhéanfar aon iarrachtaí seachadta eile mura bhfaightear ó seachadadh ón bhfearann. + failure_threshold_reached: Baineadh an tairseach teipe amach ar %{date}. + failures_recorded: + few: Theip ar iarrachtaí ar %{count} lá difriúil. + many: Theip ar iarrachtaí ar %{count} lá difriúil. + one: Theip ar iarracht ar %{count} lá. + other: Theip ar iarrachtaí ar %{count} lá difriúil. + two: Theip ar iarrachtaí ar %{count} lá difriúil. + no_failures_recorded: Uimh teipeanna ar taifead. + title: Infhaighteacht + warning: Níor éirigh leis an iarracht dheireanach chun ceangal leis an bhfreastalaí seo back_to_all: Uile back_to_limited: Teoranta back_to_warning: Rabhadh by_domain: Fearann + confirm_purge: An bhfuil tú cinnte gur mian leat sonraí a scriosadh go buan ón bhfearann ​​seo? content_policies: comment: Nóta inmheánach + description_html: Is féidir leat beartais inneachair a shainiú a chuirfear i bhfeidhm ar gach cuntas ón bhfearann ​​seo agus aon cheann dá fhofhearainn. + limited_federation_mode_description_html: Is féidir leat an rogha a dhéanamh maidir le cónaidhm a cheadú leis an bhfearann ​​seo. policies: + reject_media: Na meáin a dhiúltú + reject_reports: Diúltaigh tuarascálacha silence: Teorannaigh suspend: Cuir ar fionraí policy: Polasaí + reason: Cúis phoiblí + title: Polasaithe ábhair dashboard: + instance_accounts_dimension: Cuntais a lean a bhformhór + instance_accounts_measure: cuntais stóráilte + instance_followers_measure: ár leantóirí ann + instance_follows_measure: a lucht leanta anseo instance_languages_dimension: Teangacha is airde + instance_media_attachments_measure: ceangaltáin meáin stóráilte + instance_reports_measure: tuairiscí mar gheall orthu + instance_statuses_measure: postanna stóráilte delivery: all: Uile + clear: Earráidí seachadta soiléir failing: Ag teip + restart: Seachadadh a atosú + stop: Stad seachadadh unavailable: Níl ar fáil + delivery_available: Tá seachadadh ar fáil + delivery_error_days: Laethanta earráide seachadta + delivery_error_hint: Mura féidir seachadadh a dhéanamh ar feadh %{count} lá, marcálfar go huathoibríoch é mar dosheachadta. + destroyed_msg: Tá sonraí ó %{domain} ciúáilte anois le haghaidh scriosadh gan mhoill. + empty: Níor aimsíodh aon fhearainn. + known_accounts: + few: "%{count} cuntas aitheanta" + many: "%{count} cuntas aitheanta" + one: "%{count} cuntas aitheanta" + other: "%{count} cuntas aitheanta" + two: "%{count} cuntas aitheanta" moderation: all: Uile limited: Teoranta + title: Measarthacht + private_comment: Trácht príobháideach + public_comment: Trácht poiblí purge: Glan + purge_description_html: Má chreideann tú go bhfuil an fearann ​​seo as líne ar feadh tamaill mhaith, is féidir leat gach taifead cuntais agus sonraí gaolmhara ón bhfearann ​​​​seo a scriosadh ó do stór. Seans go dtógfaidh sé seo tamall. title: Cónascadh + total_blocked_by_us: Blocáilte ag dúinn + total_followed_by_them: Ina dhiaidh sin iad total_followed_by_us: Á leanúint againn + total_reported: Tuarascálacha mar gheall orthu + total_storage: Ceangaltáin meán + totals_time_period_hint_html: Áiríonn na hiomláin a thaispeántar thíos sonraí don am ar fad. + unknown_instance: Níl aon taifead den fhearann ​​seo ar an bhfreastalaí seo faoi láthair. invites: + deactivate_all: Díghníomhachtaigh go léir filter: all: Uile available: Ar fáil + expired: Imithe in éag title: Scag title: Cuirí ip_blocks: add_new: Cruthaigh riail + created_msg: Cuireadh riail IP nua leis go rathúil delete: Scrios expires_in: '1209600': Coicís @@ -228,111 +594,625 @@ ga: '31556952': Bliain amháin '86400': Lá amháin '94670856': 3 bhliain + new: + title: Cruthaigh riail IP nua + no_ip_block_selected: Níor athraíodh aon rialacha IP mar níor roghnaíodh ceann ar bith title: Rialacha IP + relationships: + title: Caidrimh %{acct} relays: + add_new: Cuir sealaíochta nua leis delete: Scrios + description_html: Is freastalaí idirghabhálaí é athsheachadán cónaidhme a mhalartaíonn líon mór postálacha poiblí idir freastalaithe a shíníonn dó agus a fhoilsíonn é. Is féidir leis cabhrú le freastalaithe beaga agus meánmhéide inneachar a aimsiú ón bhfeideas, rud a d'éileodh ar úsáideoirí áitiúla daoine eile a leanúint de láimh ar fhreastalaithe cianda. disable: Díchumasaigh disabled: Díchumasaithe enable: Cumasaigh + enable_hint: Nuair a bheidh sé cumasaithe, liostóidh do fhreastalaí le gach postáil phoiblí ón athsheoladh seo, agus tosóidh sé ag seoladh postálacha poiblí an fhreastalaí seo chuige. enabled: Ar chumas + inbox_url: URL Athsheolta + pending: Ag fanacht le ceadú sealaíochta save_and_enable: Sábháil agus cumasaigh + setup: Socraigh nasc sealaíochta + signatures_not_enabled: Seans nach n-oibreoidh athsheachadáin i gceart agus mód slán nó modh cónaidhmthe teoranta cumasaithe status: Stádas + title: Athsheachadáin + report_notes: + created_msg: Cruthaíodh nóta tuairisce go rathúil! + destroyed_msg: D'éirigh leis an nóta tuairisce a scriosadh! reports: + account: + notes: + few: "%{count} nótaí" + many: "%{count} nótaí" + one: "%{count} nóta" + other: "%{count} nótaí" + two: "%{count} nótaí" + action_log: Loga iniúchta + action_taken_by: Gníomh arna ghlacadh ag + actions: + delete_description_html: Scriosfar na postálacha tuairiscithe agus déanfar stailc a thaifeadadh chun cabhrú leat dul in airde ar sháruithe sa todhchaí tríd an gcuntas céanna. + mark_as_sensitive_description_html: Déanfar na meáin sna poist tuairiscithe a mharcáil mar íogair agus déanfar stailc a thaifeadadh chun cabhrú leat sárú a dhéanamh ar sháruithe sa todhchaí tríd an gcuntas céanna. + other_description_html: Féach ar a thuilleadh roghanna chun iompar an chuntais a rialú agus cumarsáid a shaincheapadh chuig an gcuntas tuairiscithe. + resolve_description_html: Ní dhéanfar aon ghníomhaíocht i gcoinne an chuntais thuairiscithe, ní dhéanfar aon stailc a thaifeadadh, agus dúnfar an tuarascáil. + silence_description_html: Ní bheidh an cuntas le feiceáil ach amháin dóibh siúd a leanann é cheana féin nó a bhreathnaíonn suas de láimh air, rud a chuirfidh srian mór ar a rochtain. Is féidir é a chur ar ais i gcónaí. Dúnann sé gach tuairisc i gcoinne an chuntais seo. + suspend_description_html: Beidh an cuntas agus a bhfuil ann go léir dorochtana agus scriosfar iad ar deireadh, agus beidh sé dodhéanta idirghníomhú leis. Inchúlaithe laistigh de 30 lá. Dúnann sé gach tuairisc i gcoinne an chuntais seo. + actions_description_html: Déan cinneadh ar an ngníomh atá le déanamh chun an tuarascáil seo a réiteach. Má dhéanann tú beart pionósach in aghaidh an chuntais tuairiscithe, seolfar fógra ríomhphoist chucu, ach amháin nuair a roghnaítear an chatagóir Turscar. + actions_description_remote_html: Déan cinneadh ar an ngníomh atá le déanamh chun an tuarascáil seo a réiteach. Ní bheidh tionchar aige seo ach ar an gcaoi a ndéanann do fhreastalaí cumarsáid leis an gcianchuntas seo agus a láimhseálann sé a ábhar. + add_to_report: Cuir tuilleadh leis an tuairisc + already_suspended_badges: + local: Ar fionraí cheana féin ar an bhfreastalaí seo + remote: Ar fionraí cheana féin ar a bhfreastalaí are_you_sure: An bhfuil tú cinnte? + assign_to_self: Sann dom + assigned: Modhnóir sannta + by_target_domain: Fearann ​​an chuntais tuairiscithe cancel: Cealaigh category: Catagóir + category_description_html: Luafar an chúis ar tuairiscíodh an cuntas seo agus/nó an t-ábhar seo i gcumarsáid leis an gcuntas tuairiscithe + comment: + none: Dada + comment_description_html: 'Chun tuilleadh eolais a sholáthar, scríobh %{name}:' + confirm: Deimhnigh + confirm_action: Deimhnigh gníomh modhnóireachta i gcoinne @%{acct} created_at: Tuairiscithe delete_and_resolve: Scrios postálacha + forwarded: Ar aghaidh + forwarded_replies_explanation: Is ó chianúsáideoir an tuairisc seo agus faoi chianábhar. Tá sé curtha ar aghaidh chugat toisc go bhfuil an t-ábhar tuairiscithe mar fhreagra ar cheann de na húsáideoirí atá agat. + forwarded_to: Ar aghaidh chuig %{domain} mark_as_resolved: Marcáil mar réitithe mark_as_sensitive: Marcáil mar íogair + mark_as_unresolved: Marcáil mar gan réiteach no_one_assigned: Duine ar bith notes: create: Cruthaigh nóta create_and_resolve: Réitigh le nóta + create_and_unresolve: Oscail arís le nóta delete: Scrios + placeholder: Déan cur síos ar na bearta a rinneadh, nó ar aon nuashonruithe gaolmhara eile... title: Nótaí + notes_description_html: Féach ar agus fág nótaí do mhodhnóirí eile agus duit féin amach anseo + processed_msg: 'D''éirigh le próiseáil an tuairisc # %{id}' + quick_actions_description_html: 'Déan gníomh tapa nó scrollaigh síos chun ábhar tuairiscithe a fheiceáil:' + remote_user_placeholder: an cianúsáideoir ó %{instance} + reopen: Tuairisc a athoscailt + report: 'Tuairiscigh # %{id}' + reported_account: Cuntas tuairiscithe + reported_by: Tuairiscithe ag + reported_with_application: Tuairiscíodh leis an iarratas + resolved: Réitithe + resolved_msg: D'éirigh le réiteach an tuairisc! + skip_to_actions: Léim ar ghníomhartha status: Stádas + statuses: Ábhar tuairiscithe + statuses_description_html: Luafar ábhar ciontach i gcumarsáid leis an gcuntas tuairiscithe + summary: + action_preambles: + delete_html: 'Tá tú ar tí cuid de phostálacha @%{acct} a bhaint. Déanfaidh sé seo:' + mark_as_sensitive_html: 'Tá tú ar tí marcáil ar chuid de phostálacha @%{acct} mar íogair. Déanfaidh sé seo:' + silence_html: 'Tá tú ar tí teorannú a dhéanamh ar chuntas @%{acct}. Déanfaidh sé seo:' + suspend_html: 'Tá tú ar tí cuntas a chur ar fionraí @%{acct}. Déanfaidh sé seo:' + actions: + delete_html: Bain na postálacha ciontaithe + mark_as_sensitive_html: Marcáil meáin na bpost ciontaithe mar íogair + silence_html: Cuir teorainn mhór le rochtain @%{acct} trí a bpróifíl agus a n-inneachar a dhéanamh infheicthe ag daoine atá á leanúint cheana féin nó ag breathnú uirthi de láimh + suspend_html: Cuir @%{acct} ar fionraí, rud a fhágann go bhfuil a bpróifíl agus a bhfuil iontu dorochtana agus dodhéanta idirghníomhú leo + close_report: 'Marcáil an tuairisc #%{id} mar réitithe' + close_reports_html: Marcáil gach tuairisc in aghaidh @%{acct} mar réitithe + delete_data_html: Scrios próifíl agus inneachar @%{acct} 30 lá ó anois mura mbeidh siad curtha ar fionraí idir an dá linn + preview_preamble_html: 'Gheobhaidh @%{acct} rabhadh leis an ábhar seo a leanas:' + record_strike_html: Taifead stailc in aghaidh @%{acct} chun cabhrú leat dul i ngleic le sáruithe amach anseo ón gcuntas seo + send_email_html: Seol ríomhphost rabhaidh chuig @%{acct} + warning_placeholder: Réasúnaíocht bhreise roghnach don ghníomh modhnóireachta. + target_origin: Bunús an chuntais tuairiscithe title: Tuairiscí + unassign: Díshannadh + unknown_action_msg: 'Gníomh anaithnid: %{action}' + unresolved: Gan réiteach + updated_at: Nuashonraithe + view_profile: Féach ar phróifíl roles: add_new: Cruthaigh ról + assigned_users: + few: "%{count} úsáideoirí" + many: "%{count} úsáideoirí" + one: "%{count} úsáideoir" + other: "%{count} úsáideoirí" + two: "%{count} úsáideoirí" categories: administration: Riar + devops: DevOps invites: Cuirí + moderation: Measarthacht + special: Speisialta delete: Scrios + description_html: Le róil úsáideora, is féidir leat na feidhmeanna agus na réimsí de Mastodon ar féidir le d'úsáideoirí rochtain a fháil orthu a shaincheapadh. + edit: Cuir ról '%{name}' in eagar + everyone: Ceadanna réamhshocraithe + everyone_full_description_html: Seo é an bunról a théann i bhfeidhm ar gach úsáideoir, fiú iad siúd nach bhfuil ról sannta acu. Faigheann gach ról eile cead uaidh. + permissions_count: + few: "%{count} ceadanna" + many: "%{count} ceadanna" + one: "%{count} cead" + other: "%{count} ceadanna" + two: "%{count} ceadanna" privileges: administrator: Riarthóir + administrator_description: Seachnóidh úsáideoirí a bhfuil an cead seo acu gach cead delete_user_data: Scrios Sonraí Úsáideora + delete_user_data_description: Ligeann sé d'úsáideoirí sonraí úsáideoirí eile a scriosadh gan mhoill + invite_users: Tabhair cuireadh d'Úsáideoirí + invite_users_description: Ligeann sé d'úsáideoirí cuireadh a thabhairt do dhaoine nua chuig an bhfreastalaí + manage_announcements: Bainistigh Fógraí + manage_announcements_description: Ligeann sé d'úsáideoirí fógraí ar an bhfreastalaí a bhainistiú + manage_appeals: Achomharc a bhainistiú + manage_appeals_description: Ligeann sé d'úsáideoirí athbhreithniú a dhéanamh ar achomhairc i gcoinne gníomhartha modhnóireachta + manage_blocks: Bainistigh Bloic + manage_blocks_description: Ligeann sé d'úsáideoirí bac a chur ar sholáthraithe ríomhphoist agus seoltaí IP + manage_custom_emojis: Bainistigh Emojis Saincheaptha + manage_custom_emojis_description: Ligeann sé d'úsáideoirí emojis saincheaptha a bhainistiú ar an bhfreastalaí + manage_federation: Cónaidhm a bhainistiú + manage_federation_description: Ligeann sé d’úsáideoirí cónaidhm a bhlocáil nó a cheadú le fearainn eile, agus inseachadacht a rialú + manage_invites: Bainistigh Cuirí + manage_invites_description: Ligeann sé d'úsáideoirí naisc cuireadh a bhrabhsáil agus a dhíghníomhachtú + manage_reports: Tuarascálacha a bhainistiú + manage_reports_description: Ligeann sé d’úsáideoirí tuarascálacha a athbhreithniú agus gníomhartha modhnóireachta a dhéanamh ina gcoinne + manage_roles: Bainistigh Róil + manage_roles_description: Ligeann sé d'úsáideoirí róil faoina gcuid féin a bhainistiú agus a shannadh + manage_rules: Rialacha a bhainistiú + manage_rules_description: Ligeann sé d'úsáideoirí rialacha freastalaí a athrú + manage_settings: Bainistigh Socruithe + manage_settings_description: Ligeann sé d'úsáideoirí socruithe suímh a athrú + manage_taxonomies: Tacsanomaíochtaí a bhainistiú + manage_taxonomies_description: Ligeann sé d'úsáideoirí athbhreithniú a dhéanamh ar inneachar treochta agus socruithe hashtag a nuashonrú + manage_user_access: Bainistigh Rochtain Úsáideoir + manage_user_access_description: Ligeann sé d'úsáideoirí fíordheimhniú dhá fhachtóir úsáideoirí eile a dhíchumasú, a seoladh r-phoist a athrú, agus a bpasfhocal a athshocrú + manage_users: Bainistigh Úsáideoirí + manage_users_description: Ligeann sé d'úsáideoirí sonraí úsáideoirí eile a fheiceáil agus gníomhartha modhnóireachta a dhéanamh ina gcoinne + manage_webhooks: Bainistigh cuacha Gréasáin + manage_webhooks_description: Ligeann sé d'úsáideoirí cuacha gréasáin a shocrú le haghaidh imeachtaí riaracháin + view_audit_log: Féach ar Loga Iniúchta + view_audit_log_description: Ligeann sé d'úsáideoirí stair gníomhartha riaracháin a fheiceáil ar an bhfreastalaí + view_dashboard: Amharc ar an Deais + view_dashboard_description: Ligeann sé d’úsáideoirí rochtain a fháil ar an deais agus ar mhéadrachtaí éagsúla + view_devops: DevOps + view_devops_description: Ligeann sé d’úsáideoirí rochtain a fháil ar dheais Sidekiq agus pgHero title: Róil rules: add_new: Cruthaigh riail delete: Scrios + description_html: Cé go maíonn a bhformhór gur léigh siad agus go n-aontaíonn siad leis na téarmaí seirbhíse, de ghnáth ní léann daoine tríd go dtí go dtagann fadhb chun cinn. Déan rialacha do fhreastalaí a fheiceáil go sracfhéachaint trí iad a sholáthar i liosta comhréidh de phointe urchair. Déan iarracht rialacha aonair a choinneáil gearr simplí, ach déan iarracht gan iad a roinnt ina go leor míreanna ar leith ach an oiread. + edit: Cuir riail in eagar + empty: Níl aon rialacha freastalaí sainmhínithe fós. + title: Rialacha freastalaí settings: + about: + manage_rules: Bainistigh rialacha freastalaí + preamble: Cuir eolas domhain ar fáil faoin gcaoi a n-oibrítear, a ndéantar modhnóireacht agus maoiniú ar an bhfreastalaí. + rules_hint: Tá réimse tiomnaithe rialacha ann a bhfuiltear ag súil go gcloífidh d’úsáideoirí leis. + title: Faoi appearance: + preamble: Saincheap comhéadan gréasáin Mastodon. title: Cuma + branding: + preamble: Déanann brandáil do fhreastalaí é a idirdhealú ó fhreastalaithe eile sa líonra. Féadfar an fhaisnéis seo a thaispeáint ar fud timpeallachtaí éagsúla, mar shampla comhéadan gréasáin Mastodon, feidhmchláir dhúchasacha, i réamhamhairc naisc ar láithreáin ghréasáin eile agus laistigh d’aipeanna teachtaireachtaí, agus mar sin de. Ar an ábhar sin, is fearr an fhaisnéis seo a choinneáil soiléir, gearr agus gonta. + title: Brandáil + captcha_enabled: + desc_html: Braitheann sé seo ar scripteanna seachtracha ó hCaptcha, rud a d’fhéadfadh a bheith ina ábhar imní maidir le slándáil agus príobháideacht. Ina theannta sin, is féidir leis seo an próiseas clárúcháin a dhéanamh i bhfad níos lú inrochtana ag roinnt daoine (go háirithe faoi mhíchumas). Ar na cúiseanna seo, smaoinigh le do thoil ar bhearta eile amhail clárú bunaithe ar fhormheas nó ar chuireadh. + title: A cheangal ar úsáideoirí nua CAPTCHA a réiteach chun a gcuntas a dhearbhú + content_retention: + danger_zone: Crios contúirte + preamble: Rialú conas a stóráiltear ábhar a ghintear ag úsáideoirí i Mastodon. + title: Coinneáil ábhair default_noindex: desc_html: I bhfeidhm do ghach úsáideoir nár athraigh an socrú seo iad féin title: Diúltaigh d'innéacsú inneall cuardaigh mar réamhshocrú d'úsáideoirí + discovery: + follow_recommendations: Lean na moltaí + preamble: Tá sé ríthábhachtach dromchla a chur ar ábhar suimiúil chun úsáideoirí nua a chur ar bord nach bhfuil aithne acu ar dhuine ar bith Mastodon. Rialú conas a oibríonn gnéithe fionnachtana éagsúla ar do fhreastalaí. + profile_directory: Eolaire próifíle + public_timelines: Amlínte poiblí + publish_discovered_servers: Foilsigh freastalaithe aimsithe + publish_statistics: Staitisticí a fhoilsiú + title: Fionnachtain + trends: Treochtaí + domain_blocks: + all: Do chách + disabled: Do dhuine ar bith + users: Chun úsáideoirí áitiúla logáilte isteach registrations: + moderation_recommandation: Cinntigh le do thoil go bhfuil foireann mhodhnóireachta imoibríoch leordhóthanach agat sula n-osclaíonn tú clárúcháin do gach duine! + preamble: Rialú cé atá in ann cuntas a chruthú ar do fhreastalaí. title: Clárúcháin + registrations_mode: + modes: + approved: Teastaíonn ceadú le clárú + none: Ní féidir le duine ar bith clárú + open: Is féidir le duine ar bith clárú + warning_hint: Molaimid úsáid a bhaint as “Faomhadh riachtanach chun clárú” ach amháin má tá tú muiníneach gur féidir le d’fhoireann mhodhnóireachta clárú turscair agus mailíseach a láimhseáil go tráthúil. + security: + authorized_fetch: Teastaíonn fíordheimhniú ó fhreastalaithe cónasctha + authorized_fetch_hint: Toisc go n-éilítear fíordheimhniú ó fhreastalaithe cónasctha, is féidir bloic ar leibhéal an úsáideora agus ar leibhéal an fhreastalaí araon a fhorfheidhmiú níos déine. Mar sin féin, tagann sé seo ar chostas pionós feidhmíochta, laghdaítear an teacht ar do chuid freagraí, agus d'fhéadfadh saincheisteanna comhoiriúnachta a thabhairt isteach le roinnt seirbhísí cónasctha. Ina theannta sin, ní chuirfidh sé seo cosc ​​ar aisteoirí tiomnaithe do phoist phoiblí agus do chuntais phoiblí a fháil. + authorized_fetch_overridden_hint: Ní féidir leat an socrú seo a athrú faoi láthair toisc go bhfuil sé sáraithe ag athróg timpeallachta. + federation_authentication: Forghníomhú fíordheimhnithe Cónaidhm + title: Socruithe freastalaí site_uploads: delete: Scrios comhad uaslódáilte + destroyed_msg: D'éirigh le huaslódáil an tsuímh a scriosadh! + software_updates: + critical_update: Criticiúil - nuashonraigh go tapa le do thoil + description: Moltar do shuiteáil Mastodon a choinneáil cothrom le dáta chun leas a bhaint as na socruithe agus na gnéithe is déanaí. Ina theannta sin, tá sé ríthábhachtach uaireanta Mastodon a nuashonrú go tráthúil chun saincheisteanna slándála a sheachaint. Ar na cúiseanna seo, seiceálann Mastodon nuashonruithe gach 30 nóiméad, agus tabharfaidh sé fógra duit de réir do shainroghanna fógra ríomhphoist. + documentation_link: Foghlaim níos mó + release_notes: Nótaí scaoilte + title: Nuashonruithe ar fáil + type: Cineál + types: + major: Mórscaoileadh + minor: Mionscaoileadh + patch: Scaoileadh paiste - ceartúcháin agus athruithe atá éasca a chur i bhfeidhm + version: Leagan statuses: account: Údar + application: Iarratas back_to_account: Ar ais go leathanach cuntais + back_to_report: Ar ais go leathanach tuairisce + batch: + remove_from_report: Bain den tuairisc + report: Tuairisc deleted: Scriosta favourites: Toghanna + history: Stair leagan + in_reply_to: Ag freagairt do language: Teanga media: title: Meáin metadata: Meiteashonraí + no_status_selected: Níor athraíodh aon phostáil mar níor roghnaíodh ceann ar bith open: Oscail postáil original_status: Bunphostáil reblogs: Athbhlaganna status_changed: Athraíodh postáil + title: Poist chuntais trending: Ag treochtáil + visibility: Infheictheacht with_media: Le meáin strikes: actions: delete_statuses: Scrios %{name} postálacha de chuid %{target} + disable: Reoite %{name} cuntas %{target} + mark_statuses_as_sensitive: Mharcáil %{name} postálacha %{target} mar íogair + none: Sheol %{name} rabhadh chuig %{target} + sensitive: Mharcáil %{name} cuntas %{target} mar íogair + silence: Chuir %{name} teorainn le cuntas %{target} + suspend: Chuir %{name} cuntas %{target} ar fionraí + appeal_approved: Achomharc + appeal_pending: Achomharc ar feitheamh + appeal_rejected: Diúltaíodh don achomharc + system_checks: + database_schema_check: + message_html: Tá aistrithe bunachar sonraí ar feitheamh. Rith iad le do thoil chun a chinntiú go n-iompraíonn an t-iarratas mar a bhíothas ag súil leis + elasticsearch_health_red: + message_html: Tá braisle Elasticsearch míshláintiúil (stádas dearg), níl gnéithe cuardaigh ar fáil + elasticsearch_health_yellow: + message_html: Tá braisle Elasticsearch míshláintiúil (stádas buí), b'fhéidir gur mhaith leat an chúis a fhiosrú + elasticsearch_index_mismatch: + message_html: Tá mapálacha innéacs Elasticsearch as dáta. Rith tootctl search deploy --only=%{value} le do thoil + elasticsearch_preset: + action: Féach doiciméadú + message_html: Tá níos mó ná nód amháin ag do bhraisle Elasticsearch, ach níl Mastodon cumraithe chun iad a úsáid. + elasticsearch_preset_single_node: + action: Féach doiciméadú + message_html: Níl ach nód amháin ag do bhraisle Elasticsearch, ba cheart ES_PRESET a shocrú go single_node_cluster. + elasticsearch_reset_chewy: + message_html: Tá d'innéacs córais Elasticsearch as dáta mar gheall ar athrú socruithe. Rith tootctl search deploy --reset-chewy chun é a nuashonrú. + elasticsearch_running_check: + message_html: Níorbh fhéidir ceangal le Elasticsearch. Cinntigh go bhfuil sé ar siúl, nó díchumasaigh cuardach téacs iomlán + elasticsearch_version_check: + message_html: 'Leagan neamh-chomhoiriúnach le Elasticsearch: %{value}' + version_comparison: Tá Elasticsearch %{running_version} ag rith agus %{required_version} ag teastáil + rules_check: + action: Bainistigh rialacha freastalaí + message_html: Níl aon rialacha freastalaí sainmhínithe agat. + sidekiq_process_check: + message_html: Níl próiseas Sidekiq ag rith don scuaine/(scuainí) %{value}. Déan athbhreithniú ar do chumraíocht Sidekiq + software_version_critical_check: + action: Féach nuashonruithe atá ar fáil + message_html: Tá nuashonrú ríthábhachtach Mastodon ar fáil, nuashonraigh chomh tapa agus is féidir le do thoil. + software_version_patch_check: + action: Féach nuashonruithe atá ar fáil + message_html: Tá nuashonrú bugfix Mastodon ar fáil. + upload_check_privacy_error: + action: Seiceáil anseo le haghaidh tuilleadh eolais + message_html: "Tá do fhreastalaí gréasáin míchumraithe. Tá príobháideacht d'úsáideoirí i mbaol." + upload_check_privacy_error_object_storage: + action: Seiceáil anseo le haghaidh tuilleadh eolais + message_html: "Tá do stór oibiachtaí míchumraithe. Tá príobháideacht d'úsáideoirí i mbaol." tags: + moderation: + not_trendable: Ní trendable + not_usable: Ní inúsáidte + pending_review: Athbhreithniú ar feitheamh + review_requested: Athbhreithniú iarrtha + reviewed: Athbhreithnithe + title: Stádas + trendable: Treocht + unreviewed: Gan athbhreithniú + usable: Inúsáidte + name: Ainm + newest: Is nuaí + oldest: Is sine + reset: Athshocraigh review: Stádas athbhreithnithe + search: Cuardach + title: Haischlibeanna + updated_msg: D'éirigh le socruithe hashtag a nuashonrú title: Riar trends: allow: Ceadaigh + approved: Ceadaithe disallow: Dícheadaigh + links: + allow: Ceadaigh nasc + allow_provider: Ceadaigh foilsitheoir + description_html: Is naisc iad seo atá á roinnt go mór faoi láthair ag cuntais a bhfeiceann do fhreastalaí postálacha uathu. Is féidir leis cabhrú le d’úsáideoirí a fháil amach cad atá ar siúl ar fud an domhain. Ní thaispeánfar naisc ar bith go poiblí go dtí go gceadaíonn tú an foilsitheoir. Is féidir leat naisc aonair a cheadú nó a dhiúltú freisin. + disallow: Nasc a dhícheadú + disallow_provider: Dícheadaigh foilsitheoir + no_link_selected: Níor athraíodh aon nasc mar níor roghnaíodh ceann ar bith + publishers: + no_publisher_selected: Níor athraíodh aon fhoilsitheoir mar níor roghnaíodh ceann ar bith + shared_by_over_week: + few: Roinnte ag %{count} duine le seachtain anuas + many: Roinnte ag %{count} duine le seachtain anuas + one: Roinnte ag duine amháin le seachtain anuas + other: Roinnte ag %{count} duine le seachtain anuas + two: Roinnte ag %{count} duine le seachtain anuas + title: Naisc treochta + usage_comparison: Roinnte %{today} uair inniu, i gcomparáid le %{yesterday} inné + not_allowed_to_trend: Ní cheadaítear treocht + only_allowed: Ní cheadaítear ach + pending_review: Athbhreithniú ar feitheamh preview_card_providers: + allowed: Is féidir le naisc ón bhfoilsitheoir seo treocht + description_html: Is fearainn iad seo óna roinntear naisc go minic ar do fhreastalaí. Ní threochtóidh naisc go poiblí mura gceadaítear fearann ​​an naisc. Síneann do cheadú (nó diúltú) chuig fofhearainn. + rejected: Ní bheidh treocht ag naisc ón bhfoilsitheoir seo title: Foilsitheoirí rejected: Diúltaithe statuses: allow: Ceadaigh postáil allow_account: Ceadaigh údar + description_html: Is postálacha iad seo a bhfuil do fhreastalaí ar an eolas fúthu agus atá á roinnt faoi láthair agus is fearr leat go mór faoi láthair. Is féidir leis cabhrú le d’úsáideoirí nua agus úsáideoirí atá ag filleadh níos mó daoine a aimsiú le leanúint. Ní thaispeánfar postálacha ar bith go poiblí go dtí go gceadaíonn tú an t-údar, agus ceadaíonn an t-údar a gcuntas a mholadh do dhaoine eile. Is féidir leat postálacha aonair a cheadú nó a dhiúltú freisin. + disallow: Dícheadaigh postáil + disallow_account: Údar a dhícheadú + no_status_selected: Níor athraíodh aon phostáil treochta mar níor roghnaíodh ceann ar bith + not_discoverable: Níor roghnaigh an t-údar a bheith in-aimsithe + shared_by: + few: Roinnte agus ansa leat %{friendly_count} uair + many: Roinnte agus ansa leat %{friendly_count} uair + one: Roinnte nó is fearr leat am amháin + other: Roinnte agus ansa leat %{friendly_count} uair + two: Roinnte agus ansa leat %{friendly_count} uair + title: Poist trending + tags: + current_score: Scór reatha %{score} + dashboard: + tag_accounts_measure: úsáidí uathúla + tag_languages_dimension: Barrtheangacha + tag_servers_dimension: Barrtheangacha + tag_servers_measure: freastalaithe éagsúla + tag_uses_measure: úsáidí iomlána + description_html: Is hashtags iad seo atá le feiceáil faoi láthair i go leor postálacha a fheiceann do fhreastalaí. Is féidir leis cabhrú le d’úsáideoirí a fháil amach cad é is mó atá ag caint faoi dhaoine faoi láthair. Ní thaispeánfar aon hashtags go poiblí go dtí go gceadaíonn tú iad. + listable: Is féidir a mholadh + no_tag_selected: Níor athraíodh aon chlib mar níor roghnaíodh ceann ar bith + not_listable: Ní mholfar + not_trendable: Ní bheidh le feiceáil faoi threochtaí + not_usable: Ní féidir é a úsáid + peaked_on_and_decaying: Buaicphointe ar %{date}, ag lobhadh anois + title: Haischlib treochta + trendable: Is féidir le feiceáil faoi threochtaí + trending_rank: 'Ag treochtáil # %{rank}' + usable: Is féidir é a úsáid + usage_comparison: Úsáidte %{today} uair inniu, i gcomparáid le %{yesterday} inné + used_by_over_week: + few: Úsáidte ag %{count} duine le seachtain anuas + many: Úsáidte ag %{count} duine le seachtain anuas + one: Úsáidte ag duine amháin le seachtain anuas + other: Úsáidte ag %{count} duine le seachtain anuas + two: Úsáidte ag %{count} duine le seachtain anuas + title: Treochtaí + trending: Treocht warning_presets: + add_new: Cuir nua leis delete: Scrios + edit_preset: Cuir réamhshocrú rabhaidh in eagar + empty: Níl aon réamhshocruithe rabhaidh sainithe agat fós. + title: Réamhshocruithe rabhaidh webhooks: + add_new: Cuir críochphointe leis delete: Scrios + description_html: Cuireann cuadóg gréasáin ar chumas Mastodon fógraí fíor-ama faoi imeachtaí roghnaithe a bhrú le d'iarratas féin, ionas gur féidir le d'iarratas imoibrithe a spreagadh go huathoibríoch. disable: Díchumasaigh disabled: Díchumasaithe + edit: Cuir críochphointe in eagar + empty: Níl aon chríochphointí cuaille gréasáin agat fós. enable: Cumasaigh enabled: Gníomhach + enabled_events: + few: "%{count} imeacht cumasaithe" + many: "%{count} imeacht cumasaithe" + one: 1 imeacht cumasaithe + other: "%{count} imeacht cumasaithe" + two: "%{count} imeacht cumasaithe" events: Eachtraí + new: Cuaille gréasáin nua + rotate_secret: Rothlaigh an rún + secret: Rún a shíniú status: Stádas + title: Crúcaí gréasáin + webhook: Crúca gréasáin admin_mailer: + auto_close_registrations: + body: De bharr easpa gníomhaíochta modhnóra le déanaí, aistríodh clárúcháin ar %{instance} go huathoibríoch chuig athbhreithniú de láimh chun nach n-úsáidfear %{instance} mar ardán do dhrochghníomhaithe féideartha. Is féidir leat é a athrú ar ais chuig clárúcháin a oscailt am ar bith. + subject: Athraíodh clárúcháin le haghaidh %{instance} go huathoibríoch chuig a dteastaíonn ceadú uathu new_appeal: actions: delete_statuses: a gcuid postálacha a scrios + disable: a gcuntas a reo + mark_statuses_as_sensitive: a bpoist a mharcáil mar íogair none: rabhadh + sensitive: a gcuntas a mharcáil mar íogair + silence: a gcuntas a theorannú + suspend: a gcuntas a chur ar fionraí + body: 'Tá %{target} ag achomharc in aghaidh cinneadh modhnóireachta ó %{action_taken_by} ó %{date}, arbh é %{type} é. Scríobh siad:' + next_steps: Is féidir leat an t-achomharc a cheadú chun an cinneadh modhnóireachta a chealú, nó neamhaird a dhéanamh air. + subject: Tá %{username} ag achomharc in aghaidh cinneadh modhnóireachta ar %{instance} + new_critical_software_updates: + body: Tá leaganacha criticiúla nua de Mastodon eisithe, b'fhéidir gur mhaith leat a nuashonrú chomh luath agus is féidir! + subject: Tá nuashonruithe Critical Mastodon ar fáil do %{instance}! + new_pending_account: + body: Tá sonraí an chuntais nua thíos. Is féidir leat an t-iarratas seo a cheadú nó a dhiúltú. + subject: Cuntas nua le léirmheas ar %{instance} (%{username}) + new_report: + body: Thuairiscigh %{reporter} %{target} + body_remote: Thuairiscigh duine éigin ó %{domain} %{target} + subject: Tuairisc nua do %{instance} (#%{id}) + new_software_updates: + body: Tá leaganacha nua Mastodon eisithe, b'fhéidir gur mhaith leat a nuashonrú! + subject: Tá leaganacha nua Mastodon ar fáil do %{instance}! + new_trends: + body: 'Is gá na míreanna seo a leanas a athbhreithniú sular féidir iad a thaispeáint go poiblí:' + new_trending_links: + title: Naisc treochta + new_trending_statuses: + title: Poist trending + new_trending_tags: + title: Hashtags treochta + subject: Treochtaí nua le hathbhreithniú ar %{instance} + aliases: + add_new: Cruthaigh ailias + created_msg: D'éirigh le hailias nua a chruthú. Is féidir leat an t-aistriú ón seanchuntas a thionscnamh anois. + deleted_msg: D'éirigh leis an ailias a bhaint. Ní bheidh sé indéanta a thuilleadh bogadh ón gcuntas sin chuig an gceann seo. + empty: Níl aon ailiasanna agat. + hint_html: Más mian leat bogadh ó chuntas eile go dtí an ceann seo, anseo is féidir leat ailias a chruthú, a theastaíonn sular féidir leat leanúint ar aghaidh le leantóirí a bhogadh ón seanchuntas go dtí an ceann seo. Tá an gníomh seo ann féin neamhdhíobhálach agus inchúlaithe. Cuirtear tús leis an aistriú cuntais ón seanchuntas. + remove: Dícheangail ailias + appearance: + advanced_web_interface: Comhéadan gréasáin chun cinn + advanced_web_interface_hint: 'Más mian leat úsáid a bhaint as do leithead scáileáin ar fad, ceadaíonn an comhéadan gréasáin ardleibhéil duit go leor colúin éagsúla a chumrú chun an oiread faisnéise a fheiceáil ag an am céanna agus is mian leat: Baile, fógraí, amlíne chónaidhme, aon líon liostaí agus hashtags.' + animations_and_accessibility: Beochan agus inrochtaineacht + confirmation_dialogs: Dialóga deimhnithe + discovery: Fionnachtain + localization: + body: Aistríonn oibrithe deonacha Mastodon. + guide_link: https://crowdin.com/project/mastodon + guide_link_text: Is féidir le gach duine rannchuidiú. + sensitive_content: Ábhar íogair + application_mailer: + notification_preferences: Athraigh roghanna ríomhphoist + salutation: "%{name}," + settings: 'Athraigh sainroghanna ríomhphoist: %{link}' + unsubscribe: Díliostáil + view: 'Amharc:' + view_profile: Féach ar phróifíl + view_status: Féach ar phostáil + applications: + created: D'éirigh leis an bhfeidhmchlár a chruthú + destroyed: D'éirigh leis an bhfeidhmchlár a scriosadh + logout: Logáil Amach + regenerate_token: Athghin comhartha rochtana + token_regenerated: D'éirigh le hathghiniúint an comhartha rochtana + warning: Bí an-chúramach leis na sonraí seo. Ná roinn é le haon duine riamh! + your_token: Do chomhartha rochtana auth: + apply_for_account: Iarr cuntas + captcha_confirmation: + help_html: Má tá fadhbanna agat ag réiteach an CAPTCHA, is féidir leat dul i dteagmháil linn trí %{email} agus is féidir linn cabhrú leat. + hint_html: Ach rud amháin eile! Ní mór dúinn a dhearbhú gur duine daonna thú (tá sé seo ionas gur féidir linn an turscar a choinneáil amach!). Réitigh an CAPTCHA thíos agus cliceáil "Ar aghaidh". + title: Seiceáil slándála + confirmations: + awaiting_review: Tá do sheoladh r-phoist deimhnithe! Tá do chlárúchán á athbhreithniú ag foireann %{domain} anois. Gheobhaidh tú r-phost má fhaomhann siad do chuntas! + awaiting_review_title: Tá do chlárú á athbhreithniú + clicking_this_link: ag cliceáil ar an nasc seo + login_link: logáil isteach + proceed_to_login_html: Is féidir leat dul ar aghaidh chuig %{login_link} anois. + redirect_to_app_html: Ba cheart go ndearnadh tú a atreorú chuig an aip %{app_name}. Murar tharla sin, bain triail as %{clicking_this_link} nó fill ar an aip de láimh. + registration_complete: Tá do chlárú ar %{domain} críochnaithe anois! + welcome_title: Fáilte, %{name}! + wrong_email_hint: Mura bhfuil an seoladh ríomhphoist sin ceart, is féidir leat é a athrú i socruithe cuntais. delete_account: Scrios cuntas + delete_account_html: Más mian leat do chuntas a scriosadh, is féidir leat leanúint ar aghaidh anseo. Iarrfar ort deimhniú. + description: + prefix_invited_by_user: Tugann @%{name} cuireadh duit páirt a ghlacadh sa fhreastalaí seo de Mastodon! + prefix_sign_up: Cláraigh ar Mastodon inniu! + suffix: Le cuntas, beidh tú in ann daoine a leanúint, nuashonruithe a phostáil agus teachtaireachtaí a mhalartú le húsáideoirí ó aon fhreastalaí Mastodon agus níos mó! + didnt_get_confirmation: Nach bhfuair tú nasc deimhnithe? + dont_have_your_security_key: Nach bhfuil d'eochair shlándála agat? + forgot_password: Ar rinne tú dearmad ar do Phásfhocail? + invalid_reset_password_token: Tá comhartha athshocraithe pasfhocail neamhbhailí nó imithe in éag. Iarr ceann nua le do thoil. + link_to_otp: Cuir isteach cód dhá fhachtóir ó do ghuthán nó cód aisghabhála + link_to_webauth: Úsáid d'eochair shlándála gléas + log_in_with: Logáil isteach le login: Logáil isteach logout: Logáil Amach + migrate_account: Bog chuig cuntas eile + migrate_account_html: Más mian leat an cuntas seo a atreorú chuig ceann eile, is féidir leat é a chumrú anseo. or_log_in_with: Nó logáil isteach le + privacy_policy_agreement_html: Léigh mé agus aontaím leis an polasaí príobháideachais + progress: + confirm: Deimhnigh Ríomhphost + details: Do chuid sonraí + review: Ár léirmheas + rules: Glac le rialacha + providers: + cas: CAS + saml: SAML register: Clárú + registration_closed: Níl %{instance} ag glacadh le baill nua + resend_confirmation: Seol an nasc deimhnithe arís + reset_password: Athshocraigh pasfhocal + rules: + accept: Glac + back: Ar ais + invited_by: 'Is féidir leat páirt a ghlacadh i %{domain} a bhuíochas leis an gcuireadh a fuair tú ó:' + preamble: Socraíonn agus cuireann na modhnóirí %{domain} iad seo i bhfeidhm. + preamble_invited: Sula dtéann tú ar aghaidh, smaoinigh le do thoil ar na bunrialacha atá socraithe ag modhnóirí %{domain}. + title: Roinnt bunrialacha. + title_invited: Tá cuireadh faighte agat. security: Slándáil + set_new_password: Socraigh pasfhocal nua + setup: + email_below_hint_html: Seiceáil d'fhillteán turscair, nó iarr ceann eile. Is féidir leat do sheoladh r-phoist a cheartú má tá sé mícheart. + email_settings_hint_html: Cliceáil ar an nasc a sheol muid chugat chun %{email} a fhíorú. Beidh muid ag fanacht ar dheis anseo. + link_not_received: Nach bhfuair tú nasc? + new_confirmation_instructions_sent: Gheobhaidh tú r-phost nua leis an nasc deimhnithe i gceann cúpla bomaite! + title: Seiceáil do bhosca isteach + sign_in: + preamble_html: Logáil isteach le do dhintiúir %{domain}. Má tá do chuntas á óstáil ar fhreastalaí eile, ní bheidh tú in ann logáil isteach anseo. + title: Logáil isteach go %{domain} + sign_up: + manual_review: Téann clárúcháin ar %{domain} trí athbhreithniú láimhe ag ár modhnóirí. Chun cabhrú linn do chlárúchán a phróiseáil, scríobh beagán fút féin agus cén fáth a bhfuil cuntas uait ar %{domain}. + preamble: Le cuntas ar an bhfreastalaí Mastodon seo, beidh tú in ann aon duine eile ar an líonra a leanúint, beag beann ar an áit a bhfuil a gcuntas á óstáil. + title: Déanaimis tú a shocrú ar %{domain}. status: account_status: Stádas cuntais + confirming: Ag fanacht le deimhniú r-phoist a bheith críochnaithe. + functional: Tá do chuntas ag feidhmiú go hiomlán. + pending: Tá d’iarratas ar feitheamh athbhreithnithe ag ár bhfoireann. Seans go dtógfaidh sé seo roinnt ama. Gheobhaidh tú ríomhphost má cheadaítear d’iarratas. + redirecting_to: Tá do chuntas neamhghníomhach toisc go bhfuil sé á atreorú chuig %{acct} faoi láthair. + self_destruct: Toisc go bhfuil %{domain} ag dúnadh síos, ní bhfaighidh tú ach rochtain theoranta ar do chuntas. + view_strikes: Féach ar stailceanna san am atá caite i gcoinne do chuntais too_fast: Cuireadh an fhoirm isteach róthapa, triail arís. + use_security_key: Úsáid eochair shlándála challenge: confirm: Lean ar aghaidh + hint_html: "Leid: Ní iarrfaimid do phasfhocal ort arís go ceann uair an chloig eile." + invalid_password: Pasfhocal neamhbhailí + prompt: Deimhnigh an pasfhocal chun leanúint ar aghaidh + crypto: + errors: + invalid_key: nach eochair bhailí Ed25519 nó Curve25519 í + invalid_signature: nach síniú bailí Ed25519 é + date: + formats: + default: "%b %d, %Y" + with_month_name: "%B %d, %Y" datetime: distance_in_words: about_x_hours: "%{count}u" @@ -340,6 +1220,7 @@ ga: about_x_years: "%{count}b" almost_x_years: "%{count}b" half_a_minute: Díreach anois + less_than_x_minutes: "%{count}m" less_than_x_seconds: Díreach anois over_x_years: "%{count}b" x_days: "%{count}l" @@ -347,45 +1228,243 @@ ga: x_months: "%{count}m" x_seconds: "%{count}s" deletes: + challenge_not_passed: Ní raibh an fhaisnéis a d'iontráil tú ceart + confirm_password: Cuir isteach do phasfhocal reatha chun d'aitheantas a fhíorú + confirm_username: Cuir isteach d'ainm úsáideora chun an nós imeachta a dhearbhú proceed: Scrios cuntas + success_msg: Scriosadh do chuntas go rathúil + warning: + before: 'Sula dtéann tú ar aghaidh, léigh na nótaí seo go cúramach le do thoil:' + caches: Seans go seasfaidh inneachar atá i dtaisce ag freastalaithe eile + data_removal: Bainfear do phostálacha agus sonraí eile go buan + email_change_html: Is féidir leat do sheoladh ríomhphoist a athrú gan do chuntas a scriosadh + email_contact_html: Mura dtagann sé fós, is féidir leat ríomhphost a chur chuig %{email} chun cabhair a fháil + email_reconfirmation_html: Mura bhfuil an ríomhphost deimhnithe á fháil agat, is féidir é a iarraidh arís + irreversible: Ní bheidh tú in ann do chuntas a aischur nó a athghníomhachtú + more_details_html: Le haghaidh tuilleadh sonraí, féach an polasaí príobháideachais. + username_available: Cuirfear d'ainm úsáideora ar fáil arís + username_unavailable: Ní bheidh d'ainm úsáideora ar fáil fós disputes: strikes: + action_taken: Gníomh déanta + appeal: Achomharc + appeal_approved: D’éirigh le hachomharc a dhéanamh ar an stailc seo agus níl sé bailí a thuilleadh + appeal_rejected: Diúltaíodh don achomharc appeal_submitted_at: Achomharc curtha isteach appealed_msg: Cuireadh isteach d'achomharc. Má ceadófar é, cuirfear ar an eolas tú. appeals: submit: Cuir achomharc isteach + approve_appeal: Achomharc a cheadú + associated_report: Tuarascáil ghaolmhar + created_at: Dátaithe + description_html: Is gníomhartha iad seo a rinneadh i gcoinne do chuntais agus rabhaidh a sheol foireann %{instance} chugat. + recipient: Seolta chuig + reject_appeal: Diúltú achomharc + status: 'Postáil # %{id}' + status_removed: Baineadh an postáil den chóras cheana féin + title: "%{action} ó %{date}" title_actions: + delete_statuses: Post a bhaint + disable: Reo cuntais + mark_statuses_as_sensitive: Postálacha a mharcáil mar íogair none: Rabhadh + sensitive: An cuntas a mharcáil mar íogair + silence: Teorainn le cuntas + suspend: Cuntas a fhionraí + your_appeal_approved: Tá d’achomharc ceadaithe your_appeal_pending: Chuir tú achomharc isteach + your_appeal_rejected: Diúltaíodh do d'achomharc + domain_validator: + invalid_domain: nach ainm fearainn bailí é + edit_profile: + basic_information: Eolas bunúsach + hint_html: "Saincheap a bhfeiceann daoine ar do phróifíl phoiblí agus in aice le do phostálacha. Is dóichí go leanfaidh daoine eile ar ais tú agus go n-idirghníomhóidh siad leat nuair a bhíonn próifíl líonta agus pictiúr próifíle agat." + other: Eile + errors: + '400': Bhí an t-iarratas a chuir tú isteach neamhbhailí nó míchumtha. + '403': Níl cead agat an leathanach seo a fheiceáil. + '404': Níl an leathanach atá uait anseo. + '406': Níl an leathanach seo ar fáil san fhormáid iarrtha. + '410': Níl an leathanach a bhí á lorg agat ann a thuilleadh. + '422': + content: Theip ar fhíorú slándála. An bhfuil tú ag cur bac ar fhianáin? + title: Theip ar fhíorú slándála + '429': An iomarca iarratas + '500': + content: Tá brón orainn, ach chuaigh rud éigin mícheart ar ár deireadh. + title: Níl an leathanach seo ceart + '503': Níorbh fhéidir an leathanach a sheirbheáil mar gheall ar theip shealadach ar an bhfreastalaí. + noscript_html: Chun feidhmchlár gréasáin Mastodon a úsáid, cumasaigh JavaScript le do thoil. Nó, bain triail as ceann de na aipeanna dúchasacha do Mastodon do d'ardán. + existing_username_validator: + not_found: níorbh fhéidir úsáideoir áitiúil a aimsiú leis an ainm úsáideora sin + not_found_multiple: níorbh fhéidir %{usernames} a aimsiú exports: archive_takeout: date: Dáta + download: Íosluchtaigh cartlann do rang + hint_html: Is féidir leat cartlann de do postálacha agus meáin uaslódáilte a iarraidh. Beidh na sonraí easpórtáilte i bhformáid ActivityPub, inléite ag aon bhogearraí comhlíontacha. Is féidir leat cartlann a iarraidh gach 7 lá. + in_progress: Do chartlann á tiomsú... + request: Iarr do chartlann size: Méid + blocks: Bac leat + bookmarks: Leabharmharcanna + csv: CSV + domain_blocks: Bloic fearainn lists: Liostaí + mutes: Balbhaíonn tú + storage: Stóráil meáin + featured_tags: + add_new: Cuir nua leis + errors: + limit: Tá uaslíon na hashtags le feiceáil agat cheana féin + hint_html: "Áirigh na haischlibeanna is tábhachtaí ar do phróifíl. Uirlis iontach chun súil a choinneáil ar do shaothair chruthaitheacha agus do thionscadail fhadtéarmacha, taispeántar haischlibeanna faoi thrácht in áit fheiceálach ar do phróifíl agus ceadaíonn siad rochtain thapa ar do phostálacha féin." filters: contexts: + account: Próifílí home: Baile agus liostaí notifications: Fógraí + public: Amlínte poiblí thread: Comhráite edit: add_keyword: Cruthaigh eochairfhocal keywords: Eochairfhocal + statuses: Poist aonair + statuses_hint_html: Baineann an scagaire seo le postálacha aonair a roghnú is cuma má mheaitseálann siad leis na heochairfhocail thíos. Déan postálacha a athbhreithniú nó a bhaint den scagaire. + title: Cuir an scagaire in eagar + errors: + deprecated_api_multiple_keywords: Ní féidir na paraiméadair seo a athrú ón bhfeidhmchlár seo toisc go mbaineann siad le níos mó ná eochairfhocal scagaire amháin. Úsáid feidhmchlár níos déanaí nó an comhéadan gréasáin. + invalid_context: Níor soláthraíodh aon cheann nó comhthéacs neamhbhailí index: + contexts: Scagairí i %{contexts} delete: Scrios empty: Níl aon scagairí agat. + expires_in: In éag i %{distance} + expires_on: Rachaidh sé in éag ar %{date} + keywords: + few: "%{count} eochairfhocal" + many: "%{count} eochairfhocal" + one: "%{count} eochairfhocal" + other: "%{count} eochairfhocal" + two: "%{count} eochairfhocal" + statuses: + few: "%{count} postáil" + many: "%{count} postáil" + one: "%{count} postáil" + other: "%{count} postáil" + two: "%{count} postáil" + statuses_long: + few: "%{count} postáil aonair folaithe" + many: "%{count} postáil aonair folaithe" + one: "%{count} postáil aonair i bhfolach" + other: "%{count} postáil aonair folaithe" + two: "%{count} postáil aonair folaithe" title: Scagairí + new: + save: Sábháil scagaire nua + title: Cuir scagaire nua leis + statuses: + back_to_filter: Ar ais go dtí an scagaire + batch: + remove: Bain as an scagaire + index: + hint: Baineann an scagaire seo le poist aonair a roghnú beag beann ar chritéir eile. Is féidir leat tuilleadh postálacha a chur leis an scagaire seo ón gcomhéadan gréasáin. + title: Postálacha scagtha generic: + all: Gach + all_items_on_page_selected_html: + few: Tá gach %{count} mír ar an leathanach seo roghnaithe. + many: Tá gach %{count} mír ar an leathanach seo roghnaithe. + one: Tá %{count} mír ar an leathanach seo roghnaithe. + other: Tá gach %{count} mír ar an leathanach seo roghnaithe. + two: Tá gach %{count} mír ar an leathanach seo roghnaithe. + all_matching_items_selected_html: + few: Tá gach %{count} mír a thagann le do chuardach roghnaithe. + many: Tá gach %{count} mír a thagann le do chuardach roghnaithe. + one: Tá %{count} mír a thagann le do chuardach roghnaithe. + other: Tá gach %{count} mír a thagann le do chuardach roghnaithe. + two: Tá gach %{count} mír a thagann le do chuardach roghnaithe. + cancel: Cealaigh + changes_saved_msg: Sábháladh na hathruithe! + confirm: Deimhnigh copy: Cóipeáil delete: Scrios + deselect: Díroghnaigh go léir + none: Dada + order_by: Ordú le + save_changes: Sabháil na hathruithe + select_all_matching_items: + few: Roghnaigh gach %{count} mír a thagann le do chuardach. + many: Roghnaigh gach %{count} mír a thagann le do chuardach. + one: Roghnaigh %{count} mír a thagann le do chuardach. + other: Roghnaigh gach %{count} mír a thagann le do chuardach. + two: Roghnaigh gach %{count} mír a thagann le do chuardach. today: inniu + validation_errors: + few: Níl rud éigin ceart go leor fós! Déan athbhreithniú ar %{count} earráid thíos + many: Níl rud éigin ceart go leor fós! Déan athbhreithniú ar %{count} earráid thíos + one: Níl rud éigin ceart go leor fós! Déan athbhreithniú ar an earráid thíos + other: Níl rud éigin ceart go leor fós! Déan athbhreithniú ar %{count} earráid thíos + two: Níl rud éigin ceart go leor fós! Déan athbhreithniú ar %{count} earráid thíos imports: + errors: + empty: Comhad CSV folamh + incompatible_type: Neamh-chomhoiriúnach leis an gcineál iompórtála roghnaithe + invalid_csv_file: 'Comhad CSV neamhbhailí. Earráid: %{error}' + over_rows_processing_limit: níos mó ná %{count} sraitheanna + too_large: Tá an comhad ró-mhór + failures: Teipeanna + imported: Iompórtáilte + mismatched_types_warning: Is cosúil gur roghnaigh tú an cineál mícheart don iompórtáil seo, seiceáil arís le do thoil. modes: merge: Cumaisc + merge_long: Coinnigh taifid atá ann cheana féin agus cuir cinn nua leis overwrite: Forscríobh + overwrite_long: Cuir na cinn nua in ionad na dtaifead reatha + overwrite_preambles: + blocking_html: Tá tú ar tí do liosta bloc a chur in ionad suas le %{total_items} cuntas ó %{filename}. + bookmarks_html: Tá tú ar tí do leabharmharcanna a chur in ionad suas le %{total_items} postáil ó %{filename}. + domain_blocking_html: Tá tú ar tí do liosta bloc fearainn a chur in ionad suas le %{total_items} fearainn ó %{filename}. + following_html: Tá tú ar tí leanúint suas go dtí %{total_items} cuntas ó %{filename} agus stop a leanúint aon duine eile. + lists_html: Tá tú ar tí do liostaí a chur in ionad inneachair %{filename}. Cuirfear suas le %{total_items} cuntas le liostaí nua. + muting_html: Tá tú ar tí do liosta cuntas balbhaithe a chur in ionad suas le %{total_items} cuntas ó %{filename}. + preambles: + blocking_html: Tá tú ar tí bloc suas le %{total_items} cuntas ó %{filename}. + bookmarks_html: Tá tú ar tí %{total_items} postáil ó %{filename} a chur le do leabharmharcanna. + domain_blocking_html: Tá tú ar tí bloc suas le %{total_items} fearainn ó %{filename}. + following_html: Tá tú ar tí leanúint suas go dtí %{total_items} cuntas ó %{filename}. + lists_html: Tá tú ar tí %{total_items} cuntas ó %{filename} a chur le do liostaí. Cruthófar liostaí nua mura bhfuil aon liosta le cur leis. + muting_html: Tá tú ar tí balbhú suas le %{total_items} cuntas ó %{filename}. + preface: Is féidir leat sonraí a d’easpórtáil tú a allmhairiú ó fhreastalaí eile, mar shampla liosta de na daoine a bhfuil tú ag leanúint nó ag cur bac orthu. + recent_imports: Allmhairí le déanaí + states: + finished: Críochnaithe + in_progress: Ar siúl + scheduled: Sceidealta + unconfirmed: Neamhdhearbhaithe + status: Stádas + success: Uaslódáladh do shonraí go rathúil agus próiseálfar iad in am trátha + time_started: Thosaigh ag + titles: + blocking: Cuntais bhlocáilte á n-iompórtáil + bookmarks: Leabharmharcanna á n-iompórtáil + domain_blocking: Fearainn blocáilte á n-iompórtáil + following: Cuntais leanta á n-iompórtáil + lists: Liostaí á n-iompórtáil + muting: Cuntais bhalbhaithe á n-iompórtáil + type: Cineál iompórtála + type_groups: + constructive: Seo a leanas & Leabharmharcanna + destructive: Bloic agus balbhaigh types: + blocking: Liosta blocála bookmarks: Leabharmharcanna + domain_blocking: Liosta blocála fearainn + following: Liosta ina dhiaidh sin + lists: Liostaí + muting: Liosta muting upload: Uaslódáil invites: + delete: Díghníomhachtaigh expired: As feidhm expires_in: '1800': 30 nóiméid @@ -395,43 +1474,230 @@ ga: '604800': Seachtain amháin '86400': Lá amháin expires_in_prompt: In am ar bith + generate: Gin nasc cuireadh + invalid: Níl an cuireadh seo bailí + invited_by: 'Fuair ​​tú cuireadh ó:' + max_uses: + few: Úsáideann %{count} + many: Úsáideann %{count} + one: 1 úsáid + other: Úsáideann %{count} + two: Úsáideann %{count} + max_uses_prompt: Gan teorainn + prompt: Gin agus roinn naisc le daoine eile chun rochtain a dheonú ar an bhfreastalaí seo + table: + expires_at: In éag + uses: Úsáidí + title: Tabhair cuireadh do dhaoine + lists: + errors: + limit: Tá uaslíon na liostaí sroichte agat login_activities: authentication_methods: + otp: app fíordheimhnithe dhá-fachtóir password: pasfhocal + sign_in_token: cód slándála ríomhphoist webauthn: eochracha slándála + description_html: Má fheiceann tú gníomhaíocht nach n-aithníonn tú, smaoinigh ar do phasfhocal a athrú agus fíordheimhniú dhá fhachtóir a chumasú. + empty: Níl aon stair fíordheimhnithe ar fáil + failed_sign_in_html: Theip ar iarracht síniú isteach le %{method} ó %{ip} (%{browser}) + successful_sign_in_html: D'éirigh le síniú isteach le %{method} ó %{ip} (%{browser}) + title: Stair fíordheimhnithe + mail_subscriptions: + unsubscribe: + action: Sea, díliostáil + complete: Gan liostáil + confirmation_html: An bhfuil tú cinnte gur mhaith leat díliostáil ó %{type} a fháil do Mastodon ar %{domain} chuig do ríomhphost ag %{email}? Is féidir leat liostáil arís i gcónaí ó do socruithe fógra ríomhphoist. + emails: + notification_emails: + favourite: r-phoist fógra is fearr leat + follow: r-phoist fógra a leanúint + follow_request: r-phoist iarratais a leanúint + mention: trácht ar r-phoist fógra + reblog: r-phoist fógra a threisiú + resubscribe_html: Má dhíliostáil tú de dhearmad, is féidir leat liostáil arís ó do socruithe fógra ríomhphoist. + success_html: Ní bhfaighidh tú %{type} le haghaidh Mastodon ar %{domain} chuig do ríomhphost ag %{email} a thuilleadh. + title: Díliostáil + media_attachments: + validations: + images_and_video: Ní féidir físeán a cheangal le postáil a bhfuil íomhánna ann cheana féin + not_ready: Ní féidir comhaid nach bhfuil próiseáil críochnaithe acu a cheangal. Bain triail eile as i gceann nóiméad! + too_many: Ní féidir níos mó ná 4 chomhad a cheangal + migrations: + acct: Bogtha go + cancel: Cealaigh atreorú + cancel_explanation: Má chuirtear an t-atreorú ar ceal, déanfar do chuntas reatha a athghníomhú, ach ní thabharfaidh sé seo leantóirí a aistríodh chuig an gcuntas sin ar ais. + cancelled_msg: D'éirigh leis an atreorú a chealú. + errors: + already_moved: an cuntas céanna ar bhog tú chuige cheana + missing_also_known_as: nach ailias den chuntas seo é + move_to_self: ní féidir é a bheith ina chuntas reatha + not_found: níorbh fhéidir a fháil + on_cooldown: Tá tú ar fuarú + followers_count: Leantóirí ag am aistrithe + incoming_migrations: Ag bogadh ó chuntas eile + incoming_migrations_html: Chun bogadh ó chuntas eile go dtí an ceann seo, ní mór duit ailias cuntais a chruthú ar dtús. + moved_msg: Tá do chuntas á atreorú chuig %{acct} anois agus tá do leantóirí á bhogadh anonn. + not_redirecting: Níl do chuntas á atreorú chuig aon chuntas eile faoi láthair. + on_cooldown: D'aistrigh tú do chuntas le déanaí. Beidh an fheidhm seo ar fáil arís i gceann %{count} lá. + past_migrations: Imirce san am a chuaigh thart + proceed_with_move: Bog leantóirí + redirected_msg: Tá do chuntas á atreorú chuig %{acct} anois. + redirecting_to: Tá do chuntas á atreorú chuig %{acct}. + set_redirect: Socraigh atreorú + warning: + backreference_required: Ní mór an cuntas nua a chumrú ar dtús chun cúltagairt a dhéanamh don cheann seo + before: 'Sula dtéann tú ar aghaidh, léigh na nótaí seo go cúramach le do thoil:' + cooldown: Tar éis bogadh tá tréimhse feithimh ann nach mbeidh tú in ann bogadh arís + disabled_account: Ní bheidh do chuntas reatha inúsáidte go hiomlán ina dhiaidh sin. Mar sin féin, beidh rochtain agat ar onnmhairiú sonraí chomh maith le hathghníomhú. + followers: Bogfaidh an gníomh seo gach leantóir ón gcuntas reatha go dtí an cuntas nua + only_redirect_html: Nó, ní féidir leat ach atreorú a chur suas ar do phróifíl. + other_data: Ní bhogfar aon sonraí eile go huathoibríoch + redirect: Déanfar próifíl do chuntais reatha a nuashonrú le fógra atreoraithe agus fágfar as an áireamh é ó chuardaigh + moderation: + title: Measarthacht + move_handler: + carry_blocks_over_text: Bhog an t-úsáideoir seo ó %{acct}, rud a chuir tú bac air. + carry_mutes_over_text: Bhog an t-úsáideoir seo ó %{acct}, rud a bhalbhaigh tú. + copy_account_note_text: 'Bhog an úsáideoir seo ó %{acct}, seo do nótaí roimhe seo fúthu:' + navigation: + toggle_menu: Scoránaigh roghchlár notification_mailer: admin: report: subject: Chuir %{name} tuairisc isteach + sign_up: + subject: Chláraigh %{name} + favourite: + body: 'B''fhearr le %{name} do phostáil:' + subject: B'fhearr le %{name} do phostáil + title: Nua is fearr leat follow: body: Tá %{name} do do leanúint anois! subject: Tá %{name} do do leanúint anois title: Leantóirí nua + follow_request: + action: Bainistigh iarratais leantacha + body: D'iarr %{name} tú a leanúint + subject: 'Leantóir ar feitheamh: %{name}' + title: Iarratas leantach nua mention: action: Freagair + body: 'Luaigh %{name} thú i:' + subject: Luaigh %{name} thú + title: Lua nua + poll: + subject: Tháinig deireadh le vótaíocht le %{name} reblog: + body: 'Treisíodh do phostáil le %{name}:' subject: Mhol %{name} do phostáil title: Moladh nua + status: + subject: Tá %{name} díreach postáilte + update: + subject: Chuir %{name} postáil in eagar + notifications: + administration_emails: Fógraí r-phoist admin + email_events: Imeachtaí le haghaidh fógraí ríomhphoist + email_events_hint: 'Roghnaigh imeachtaí ar mhaith leat fógraí a fháil ina leith:' + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T otp_authentication: + code_hint: Cuir isteach an cód ginte ag d'aip fíordheimhnitheora le deimhniú + description_html: Má chumasaíonn tú fíordheimhniú dhá fhachtóir ag baint úsáide as aip fíordheimhneora, beidh ort do ghuthán a bheith i seilbh logáil isteach, rud a ghinfidh comharthaí chun tú a chur isteach. enable: Cumasaigh + instructions_html: "Scan an cód QR seo isteach i Google Authenticator nó aip eile TOTP ar do ghuthán. As seo amach, ginfidh an aip sin comharthaí a chaithfidh tú a chur isteach agus tú ag logáil isteach." + manual_instructions: 'Mura féidir leat an cód QR a scanadh agus más gá duit é a chur isteach de láimh, seo an rún gnáth-théacs:' + setup: Socraigh suas + wrong_code: Bhí an cód a iontráladh neamhbhailí! An bhfuil am freastalaí agus am gléis ceart? pagination: newer: Níos nuaí next: An céad eile older: Níos sine prev: Ceann roimhe seo + truncate: "…" + polls: + errors: + already_voted: Tá tú tar éis vótáil ar an vótaíocht seo cheana féin + duplicate_options: go bhfuil míreanna dúblacha + duration_too_long: rófhada amach anseo + duration_too_short: ró-luath + expired: Tá deireadh leis an vótaíocht cheana féin + invalid_choice: Níl an rogha vótála roghnaithe ann + over_character_limit: ní féidir leis a bheith níos faide ná %{max} carachtar an ceann + self_vote: Ní féidir leat vótáil i do phobalbhreith féin + too_few_options: caithfidh níos mó ná mír amháin a bheith ann + too_many_options: ní féidir níos mó ná %{max} mír a bheith ann preferences: other: Eile + posting_defaults: Réamhshocruithe á bpostáil + public_timelines: Amlínte poiblí + privacy: + hint_html: "Saincheap conas is mian leat do phróifíl agus do phostálacha a fháil. Is féidir le gnéithe éagsúla i Mastodon cabhrú leat teacht ar lucht féachana níos leithne nuair atá tú cumasaithe. Tóg nóiméad chun athbhreithniú a dhéanamh ar na socruithe seo chun a chinntiú go n-oireann siad do do chás úsáide." + privacy: Príobháideacht + privacy_hint_html: Rialú ar an méid is mian leat a nochtadh ar mhaithe le daoine eile. Aimsíonn daoine próifílí suimiúla agus aipeanna fionnuara trí na haipeanna seo a leanas a bhrabhsáil agus a fheiceáil cé na haipeanna a bpostálann siad, ach b’fhéidir gurbh fhearr leat é a choinneáil faoi cheilt. + reach: Shroich + reach_hint_html: Smacht a fháil ar cé acu is mian leat a fháil amach agus daoine nua a leanúint. Ar mhaith leat do phostálacha a thaispeáint ar an scáileán Explore? Ar mhaith leat go bhfeicfeadh daoine eile tú sna moltaí a leanann siad? Ar mhaith leat glacadh le gach leantóir nua go huathoibríoch, nó smacht gráinneach a bheith agat ar gach leantóir? + search: Cuardach + search_hint_html: Rialú conas ba mhaith leat a fháil. Ar mhaith leat go bhfaighidh daoine tú tríd an rud a chuir tú suas go poiblí faoi? Ar mhaith leat go bhfaighidh daoine lasmuigh de Mastodon do phróifíl agus iad ag cuardach an ghréasáin? Tabhair faoi deara le do thoil nach féidir eisiamh iomlán ó gach inneall cuardaigh a chinntiú mar fhaisnéis don phobal. + title: Príobháideacht agus teacht + privacy_policy: + title: Beartas Príobháideachais + reactions: + errors: + limit_reached: Teorainn frithghníomhartha éagsúla bainte amach + unrecognized_emoji: ní emoji aitheanta é + redirects: + prompt: Má tá muinín agat as an nasc seo, cliceáil air chun leanúint ar aghaidh. + title: Tá tú ag fágáil %{instance}. relationships: + activity: Gníomhaíocht chuntais + confirm_follow_selected_followers: An bhfuil tú cinnte gur mhaith leat na leantóirí roghnaithe a leanúint? + confirm_remove_selected_followers: An bhfuil tú cinnte gur mhaith leat na leantóirí roghnaithe a bhaint? + confirm_remove_selected_follows: An bhfuil tú cinnte gur mhaith leat na nithe seo a leanas roghnaithe a bhaint? + dormant: Díomhaoin + follow_failure: Níorbh fhéidir cuid de na cuntais roghnaithe a leanúint. follow_selected_followers: Lean leantóirí roghnaithe followers: Leantóirí following: Ag leanúint + invited: Cuireadh + last_active: Gníomhach seo caite + most_recent: Is déanaí + moved: Ar athraíodh a ionad + mutual: Frithpháirteach primary: Príomha + relationship: Gaol + remove_selected_domains: Bain gach leantóir ó na fearainn roghnaithe remove_selected_followers: Bain leantóirí roghnaithe remove_selected_follows: Dí-lean úsáideoirí roghnaithe status: Stádas cuntais + remote_follow: + missing_resource: Níorbh fhéidir an URL atreoraithe riachtanach do do chuntas a aimsiú + reports: + errors: + invalid_rules: ní thagraíonn sé do rialacha bailí rss: content_warning: 'Rabhadh ábhair:' + descriptions: + account: Postálacha poiblí ó @%{acct} + tag: 'Postálacha poiblí clibáilte # %{hashtag}' + scheduled_statuses: + over_daily_limit: Tá an teorainn de %{limit} postáil sceidealaithe sáraithe agat don lá atá inniu ann + over_total_limit: Tá an teorainn de %{limit} postáil sceidealaithe sáraithe agat + too_soon: Caithfidh an dáta sceidealta a bheith sa todhchaí + self_destruct: + lead_html: Ar an drochuair, tá %{domain} ag dúnadh síos go buan. Má bhí cuntas agat ann, ní bheidh tú in ann leanúint ar aghaidh á úsáid, ach is féidir leat cúltaca de do shonraí a iarraidh fós. + title: Tá an freastalaí seo ag dúnadh sessions: + activity: An ghníomhaíocht dheireanach browser: Brabhsálaí browsers: alipay: Alipay @@ -441,41 +1707,162 @@ ga: electron: Electron firefox: Firefox generic: Brabhsálaí anaithnid + huawei_browser: Brabhsálaí Huawei + ie: Internet Explorer + micro_messenger: Micreascannán + nokia: Nokia s40 Ovi Brabhsálaí + opera: Opera + otter: Dobharchú + phantom_js: PhantomJS + qq: Brabhsálaí QQ + safari: Safari + uc_browser: Brabhsálaí UC + unknown_browser: Brabhsálaí Anaithnid + weibo: Weibo + current_session: Seisiún reatha + date: Dáta + description: "%{browser} ar %{platform}" + explanation: Seo iad na brabhsálaithe gréasáin atá logáilte isteach i do chuntas Mastodon faoi láthair. + 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: Ardán Anaithnid windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone + revoke: Aisghair + revoke_success: Seisiún aisghairthe go rathúil title: Seisiúin + view_authentication_history: Féach ar stair fíordheimhnithe do chuntais settings: account: Cuntas account_settings: Socruithe cuntais + aliases: Ailiasanna cuntais appearance: Cuma + authorized_apps: Aipeanna údaraithe back: Ar ais go Mastodon + delete: Scriosadh cuntais development: Forbairt edit_profile: Cuir an phróifíl in eagar + export: Easpórtáil sonraí + featured_tags: Haischlib faoi thrácht import: Iompórtáil + import_and_export: Iompórtáil agus easpórtáil + migrate: Imirce cuntais + notifications: Fógraí ríomhphoist preferences: Sainroghanna pearsanta profile: Próifíl + relationships: Leantóirí agus leanúna + severed_relationships: Caidrimh dhearfa + statuses_cleanup: Uathscriosadh postála + strikes: Stailceanna measarthachta + two_factor_authentication: Údar dhá-fhachtóir webauthn_authentication: Eochracha slándála + severed_relationships: + download: Íoslódáil (%{count}) + event_type: + account_suspension: Fionraí cuntais (%{target_name}) + domain_block: Freastalaí ar fionraí (%{target_name}) + user_domain_block: Chuir tú bac ar %{target_name} + lost_followers: Leanúna caillte + lost_follows: Seo a leanas caillte + preamble: Seans go gcaillfidh tú seo a leanas agus a leantóirí nuair a bhacálann tú fearann ​​nó nuair a shocraíonn do mhodhnóirí cianfhreastalaí a chur ar fionraí. Nuair a tharlaíonn sé sin, beidh tú in ann liostaí de chaidreamh deighilte a íoslódáil, lena n-iniúchadh agus b'fhéidir iompórtáil ar fhreastalaí eile. + purged: Glanadh faisnéis faoin bhfreastalaí seo ag riarthóirí do fhreastalaí. + type: Imeacht statuses: + attached: + audio: + few: "%{count} fuaime" + many: "%{count} fuaime" + one: "%{count} fuaime" + other: "%{count} fuaime" + two: "%{count} fuaime" + description: 'Ceangailte: %{attached}' + image: + few: "%{count} híomhánna" + many: "%{count} híomhánna" + one: "%{count} íomhá" + other: "%{count} híomhánna" + two: "%{count} híomhánna" + video: + few: "%{count} físeáin" + many: "%{count} físeáin" + one: "%{count} físeán" + other: "%{count} físeáin" + two: "%{count} físeáin" boosted_from_html: Molta ó %{acct_link} content_warning: 'Rabhadh ábhair: %{warning}' + default_language: Mar an gcéanna le teanga an chomhéadain + disallowed_hashtags: + few: 'bhí na Haischlib dícheadaithe: %{tags}' + many: 'bhí na Haischlib dícheadaithe: %{tags}' + one: 'bhí haischlib dícheadaithe: %{tags}' + other: 'bhí na Haischlib dícheadaithe: %{tags}' + two: 'bhí na Haischlib dícheadaithe: %{tags}' + edited_at_html: "%{date} curtha in eagar" + errors: + in_reply_not_found: Is cosúil nach ann don phostáil a bhfuil tú ag iarraidh freagra a thabhairt air. + open_in_web: Oscail i ngréasán + over_character_limit: teorainn carachtar %{max} sáraithe + pin_errors: + direct: Ní féidir postálacha nach bhfuil le feiceáil ach ag úsáideoirí luaite a phinnáil + limit: Tá uaslíon na bpostálacha pinn agat cheana féin + ownership: Ní féidir postáil duine éigin eile a phionnáil + reblog: Ní féidir treisiú a phinnáil poll: + total_people: + few: "%{count} daoine" + many: "%{count} daoine" + one: "%{count} duine" + other: "%{count} daoine" + two: "%{count} daoine" + total_votes: + few: "%{count} vótaí" + many: "%{count} vótaí" + one: "%{count} vóta" + other: "%{count} vótaí" + two: "%{count} vótaí" vote: Vótáil show_more: Taispeáin níos mó show_thread: Taispeáin snáithe + title: '%{name}: "%{quote}"' visibilities: + direct: Díreach private: Leantóirí amháin private_long: Taispeáin do leantóirí amháin + public: Poiblí + public_long: Is féidir le gach duine a fheiceáil + unlisted: Neamhliostaithe + unlisted_long: Is féidir le gach duine a fheiceáil, ach nach bhfuil liostaithe ar amlínte poiblí statuses_cleanup: + enabled: Scrios seanphostálacha go huathoibríoch + enabled_hint: Scriostar do phostálacha go huathoibríoch nuair a shroicheann siad tairseach aoise sonraithe, ach amháin má thagann siad le ceann de na heisceachtaí thíos + exceptions: Eisceachtaí + explanation: Toisc gur oibríocht chostasach é postálacha a scriosadh, déantar é seo go mall le himeacht ama nuair nach mbíonn an freastalaí gnóthach ar bhealach eile. Ar an ábhar sin, d’fhéadfadh sé go scriosfar do phostálacha tamall tar éis dóibh an tairseach aoise a bhaint amach. ignore_favs: Tabhair neamhaird ar toghanna + ignore_reblogs: Déan neamhaird de boosts + interaction_exceptions: Eisceachtaí bunaithe ar idirghníomhaíochtaí + interaction_exceptions_explanation: Tabhair faoi deara nach bhfuil aon ráthaíocht go scriosfar postálacha má théann siad faoi bhun na tairsí is ansa leat nó an teanndáileog tar éis dóibh dul thar iad uair amháin. + keep_direct: Coinnigh teachtaireachtaí díreacha + keep_direct_hint: Ní scriosann sé aon cheann de do theachtaireachtaí díreacha + keep_media: Coinnigh postálacha le ceangaltáin meán + keep_media_hint: Ní scriosann sé aon cheann de do phostálacha a bhfuil ceangaltáin meán acu + keep_pinned: Coinnigh postálacha pinn + keep_pinned_hint: Ní scriosann sé aon cheann de do phostálacha pinn + keep_polls: Coinnigh pobalbhreith + keep_polls_hint: Ní scriosann sé aon cheann de do vótaíochtaí + keep_self_bookmark: Coinnigh postálacha leabharmharcáilte agat + keep_self_bookmark_hint: Ní scriosann sé do phostálacha féin má tá leabharmharcáilte agat + keep_self_fav: Coinnigh na poist a thaitin leat + keep_self_fav_hint: Ní scriosann sé do phostálacha féin más fearr leat iad min_age: '1209600': Coicís '15778476': 6 mhí @@ -485,20 +1872,182 @@ ga: '604800': Seachtain amháin '63113904': 2 bhliain '7889238': 3 mhí + min_age_label: Tairseach aoise + min_favs: Coinnigh na poist is fearr leat ar a laghad + min_favs_hint: Ní scriosann sé aon cheann de do phostálacha a fuair ar a laghad an líon ceanán seo. Fág bán chun postálacha a scriosadh beag beann ar líon na gceanán atá acu + min_reblogs: Coinnigh postálacha treisithe ar a laghad + min_reblogs_hint: Ní scriosann sé aon cheann de do phostálacha a cuireadh leis an líon seo uaireanta ar a laghad. Fág bán chun postálacha a scriosadh beag beann ar a líon teanndáileog stream_entries: sensitive_content: Ábhar íogair + strikes: + errors: + too_late: Tá sé ró-dhéanach achomharc a dhéanamh faoin stailc seo + tags: + does_not_match_previous_name: nach meaitseálann an t-ainm roimhe seo + themes: + contrast: Mastodon (Codarsnacht ard) + default: Mastodon (Dorcha) + mastodon-light: Mastodon (Solas) + system: Uathoibríoch (úsáid téama córais) + time: + formats: + default: "%b %d, %Y, %H:%M" + month: "%b %Y" + time: "%H:%M" + with_time_zone: "%b %d, %Y, %H:%M %Z" + translation: + errors: + quota_exceeded: Sáraíodh an cuóta úsáide uile-fhreastalaí don tseirbhís aistriúcháin. + too_many_requests: Tá an iomarca iarratas ar an tseirbhís aistriúcháin le déanaí. two_factor_authentication: + add: Cuir + disable: Díchumasaigh 2FA + disabled_success: D'éirigh le fíordheimhniú dhá-fhachtóir a dhíchumasú edit: Cuir in eagar + enabled: Tá fíordheimhniú dhá fhachtóir cumasaithe + enabled_success: D'éirigh le fíordheimhniú dhá fhachtóir a chumasú + generate_recovery_codes: Gin cóid athshlánaithe + lost_recovery_codes: Ligeann cóid athshlánaithe duit rochtain a fháil ar do chuntas arís má chailleann tú do ghuthán. Má tá do chóid athshlánaithe caillte agat, is féidir leat iad a athnuachan anseo. Déanfar do sheanchóid athshlánaithe a neamhbhailíochtú. + methods: Modhanna dhá-fhachtóir + otp: Aip fíordheimhnitheora + recovery_codes: Cóid aisghabhála cúltaca + recovery_codes_regenerated: D'éirigh le hathghiniúint cóid athshlánaithe + recovery_instructions_html: Má chailleann tú rochtain ar do ghuthán riamh, is féidir leat ceann de na cóid athshlánaithe thíos a úsáid chun rochtain a fháil ar do chuntas arís. Coinnigh na cóid athshlánaithe slán. Mar shampla, is féidir leat iad a phriontáil agus iad a stóráil le doiciméid thábhachtacha eile. webauthn: Eochracha slándála user_mailer: + appeal_approved: + action: Socruithe cuntas + explanation: Ceadaíodh achomharc na stailce i gcoinne do chuntais ar %{strike_date} a chuir tú isteach ar %{appeal_date}. Tá seasamh maith ag do chuntas arís. + subject: Ceadaíodh d'achomharc ó %{date} + subtitle: Tá seasamh maith ag do chuntas arís. + title: Achomharc ceadaithe + appeal_rejected: + explanation: Diúltaíodh d'achomharc na stailce in aghaidh do chuntais ar %{strike_date} a chuir tú isteach ar %{appeal_date}. + subject: Diúltaíodh do d'achomharc ó %{date} + subtitle: Diúltaíodh do d'achomharc. + title: Diúltaíodh don achomharc + backup_ready: + explanation: D'iarr tú cúltaca iomlán de do chuntas Mastodon. + extra: Tá sé réidh le híoslódáil anois! + subject: Tá do chartlann réidh le híoslódáil + title: Tógáil cartlainne + failed_2fa: + details: 'Seo sonraí na hiarrachta síniú isteach:' + explanation: Rinne duine éigin iarracht síniú isteach ar do chuntas ach sholáthair sé fachtóir fíordheimhnithe dara neamhbhailí. + further_actions_html: Mura tusa a bhí ann, molaimid duit %{action} a dhéanamh láithreach toisc go bhféadfadh sé a bheith i gcontúirt. + subject: Teip fíordheimhnithe dara fachtóir + title: Theip ar fhíordheimhniú an dara fachtóir + suspicious_sign_in: + change_password: do phasfhocal a athrú + details: 'Seo sonraí faoin síniú isteach:' + explanation: Bhraitheamar síniú isteach ar do chuntas ó sheoladh IP nua. + further_actions_html: Mura tusa a bhí ann, molaimid duit %{action} a dhéanamh láithreach agus fíordheimhniú dhá fhachtóir a chumasú chun do chuntas a choinneáil slán. + subject: Fuarthas rochtain ar do chuntas ó sheoladh IP nua + title: Síniú isteach nua warning: appeal: Cuir achomharc isteach + appeal_description: Má chreideann tú gur earráid é seo, is féidir leat achomharc a chur isteach chuig foireann %{instance}. categories: spam: Turscar + violation: Sáraíonn ábhar na treoirlínte pobail seo a leanas + explanation: + delete_statuses: Fuarthas amach gur sháraigh roinnt de do chuid postálacha treoirlínte pobail amháin nó níos mó agus bhain modhnóirí %{instance} iad ina dhiaidh sin. + disable: Ní féidir leat do chuntas a úsáid a thuilleadh, ach fanann do phróifíl agus sonraí eile slán. Is féidir leat cúltaca de do shonraí a iarraidh, socruithe cuntais a athrú nó do chuntas a scriosadh. + mark_statuses_as_sensitive: Tá cuid de do chuid postálacha marcáilte mar íogair ag modhnóirí %{instance}. Ciallaíonn sé seo go mbeidh ar dhaoine na meáin a thapáil sna poist sula dtaispeánfar réamhamharc. Is féidir leat na meáin a mharcáil mar íogair tú féin agus tú ag postáil amach anseo. + sensitive: As seo amach, beidh gach do chomhaid meán uaslódáilte a mharcáil mar íogair agus i bhfolach taobh thiar de rabhadh cliceáil-trí. + silence: Is féidir leat do chuntas a úsáid go fóill ach ní fheicfidh ach na daoine atá ag leanúint ort cheana féin do phostálacha ar an bhfreastalaí seo, agus seans go mbeidh tú eisiata ó ghnéithe éagsúla fionnachtana. Féadfaidh daoine eile tú a leanúint de láimh, áfach. + suspend: Ní féidir leat do chuntas a úsáid a thuilleadh, agus níl rochtain ar do phróifíl ná ar shonraí eile a thuilleadh. Is féidir leat logáil isteach fós chun cúltaca de do shonraí a iarraidh go dtí go mbaintear na sonraí go hiomlán i gceann thart ar 30 lá, ach coinneoimid roinnt sonraí bunúsacha chun cosc ​​a chur ort an fionraí a sheachaint. reason: 'Fáth:' + statuses: 'Postálacha a luadh:' subject: + delete_statuses: Baineadh do phostálacha ar %{acct} + disable: Tá do chuntas %{acct} reoite + mark_statuses_as_sensitive: Marcáladh do phostálacha ar %{acct} mar íogair none: Rabhadh do %{acct} + sensitive: Marcálfar do phostálacha ar %{acct} mar íogair as seo amach + silence: Tá do chuntas %{acct} teoranta + suspend: Tá do chuntas %{acct} curtha ar fionraí title: + delete_statuses: Baineadh postálacha + disable: Cuntas reoite + mark_statuses_as_sensitive: Postálacha marcáilte mar íogair none: Rabhadh + sensitive: Cuntas marcáilte mar íogair + silence: Cuntas teoranta + suspend: Cuntas ar fionraí + welcome: + apps_android_action: Faigh é ar Google Play + apps_ios_action: Íoslódáil ar an App Store + apps_step: Íoslódáil ár n-aipanna oifigiúla. + apps_title: Aipeanna Mastodon + checklist_subtitle: 'Cuirimis tús leat ar an teorainn shóisialta nua seo:' + checklist_title: Seicliosta Fáilte + edit_profile_action: Pearsanú + edit_profile_step: Cuir le d'idirghníomhaíochtaí trí phróifíl chuimsitheach a bheith agat. + edit_profile_title: Déan do phróifíl a phearsantú + explanation: Seo roinnt leideanna chun tú a chur ar bun + feature_action: Foghlaim níos mó + feature_audience: Soláthraíonn Mastodon deis uathúil duit do lucht féachana a bhainistiú gan fir lár. Ligeann Mastodon a imlonnaítear ar do bhonneagar féin duit leanúint agus leanúint ó aon fhreastalaí Mastodon eile ar líne agus níl sé faoi smacht aon duine ach mise. + feature_audience_title: Tóg do lucht féachana faoi rún + feature_control: Is fearr a fhios agat cad ba mhaith leat a fheiceáil ar do bheathú baile. Gan algartam nó fógraí chun do chuid ama a chur amú. Lean aon duine ar fud aon fhreastalaí Mastodon ó chuntas amháin agus faigh a gcuid post in ord croineolaíoch, agus déan do chúinne den idirlíon beagán níos mó cosúil leatsa. + feature_control_title: Coinnigh smacht ar d’amlíne féin + feature_creativity: Tacaíonn Mastodon le postálacha fuaime, físe agus pictiúr, tuairiscí inrochtaineachta, pobalbhreitheanna, rabhaidh inneachair, avatars beoite, emojis saincheaptha, rialú barr mionsamhlacha, agus níos mó, chun cabhrú leat tú féin a chur in iúl ar líne. Cibé an bhfuil do chuid ealaíne, do cheol nó do phodchraoladh á fhoilsiú agat, tá Mastodon ann duit. + feature_creativity_title: Cruthaitheacht gan sárú + feature_moderation: Cuireann Mastodon cinnteoireacht ar ais i do lámha. Cruthaíonn gach freastalaí a rialacha agus a rialacháin féin, a chuirtear i bhfeidhm go háitiúil agus nach bhfuil ó bharr anuas cosúil le meáin shóisialta chorparáideacha, rud a fhágann gurb é an ceann is solúbtha é chun freagairt do riachtanais grúpaí éagsúla daoine. Bí ar fhreastalaí leis na rialacha a n-aontaíonn tú leo, nó do chuid féin a óstáil. + feature_moderation_title: Ag maolú ar an mbealach ar cheart dó a bheith + follow_action: Lean + follow_step: Is éard atá i gceist le daoine suimiúla a leanúint ná Mastodon. + follow_title: Cuir do chuid fotha baile in oiriúint duit féin + follows_subtitle: Lean cuntais aitheanta + follows_title: Cé a leanúint + follows_view_more: Féach ar níos mó daoine a leanúint + hashtags_recent_count: + few: "%{people} daoine le 2 lá anuas" + many: "%{people} daoine le 2 lá anuas" + one: "%{people} duine le 2 lá anuas" + other: "%{people} daoine le 2 lá anuas" + two: "%{people} daoine le 2 lá anuas" + hashtags_subtitle: Déan iniúchadh ar a bhfuil ag dul chun cinn le 2 lá anuas + hashtags_title: Haischlib treochta + hashtags_view_more: Féach ar níos mó Haischlib treochta + post_action: Cum + post_step: Abair hello leis an domhan le téacs, grianghraif, físeáin, nó pobalbhreith. + post_title: Déan do chéad phostáil + share_action: Comhroinn + share_step: Cuir in iúl do do chairde conas tú a aimsiú ar Mastodon. + share_title: Roinn do phróifíl Mastodon + sign_in_action: Sínigh isteach + subject: Fáilte go Mastodon + title: Fáilte ar bord, %{name}! + users: + follow_limit_reached: Ní féidir leat níos mó ná %{limit} duine a leanúint + go_to_sso_account_settings: Téigh chuig socruithe cuntais do sholáthraí aitheantais + invalid_otp_token: Cód dhá-fhachtóir neamhbhailí + otp_lost_help_html: Má chaill tú rochtain ar an dá cheann, is féidir leat dul i dteagmháil le %{email} + rate_limited: An iomarca iarrachtaí fíordheimhnithe, bain triail eile as ar ball. + seamless_external_login: Tá tú logáilte isteach trí sheirbhís sheachtrach, mar sin níl socruithe pasfhocail agus ríomhphoist ar fáil. + signed_in_as: 'Sínithe isteach mar:' + verification: + extra_instructions_html: Leid: Is féidir an nasc ar do shuíomh Gréasáin a bheith dofheicthe. Is í an chuid thábhachtach ná rel="me" a chuireann cosc ​​ar phearsanú ar shuímh Ghréasáin a bhfuil inneachar a ghintear leis an úsáideoir. Is féidir leat fiú clib nasc a úsáid i gceanntásc an leathanaigh in ionad a, ach caithfidh an HTML a bheith inrochtana gan JavaScript a chur i gcrích. + here_is_how: Seo é an chaoi + hint_html: "Is do chách é d'aitheantas a fhíorú ar Mastodon. Bunaithe ar chaighdeáin oscailte gréasáin, saor in aisce anois agus go deo. Níl uait ach láithreán gréasáin pearsanta a aithníonn daoine thú. Nuair a nascann tú leis an suíomh Gréasáin seo ó do phróifíl, seiceóimid go bhfuil nasc idir an suíomh Gréasáin agus do phróifíl agus taispeánfaimid táscaire amhairc air." + instructions_html: Cóipeáil agus greamaigh an cód thíos isteach i HTML do shuíomh Gréasáin. Ansin cuir seoladh do shuíomh Gréasáin isteach i gceann de na réimsí breise ar do phróifíl ón gcluaisín "Cuir próifíl in eagar" agus sábháil athruithe. + verification: Fíorú + verified_links: Do naisc fhíoraithe webauthn_credentials: + add: Cuir eochair shlándála nua leis + create: + error: Bhí fadhb ann agus d'eochair shlándála á cur leis. Arís, le d'thoil. + success: Cuireadh d'eochair shlándála leis. delete: Scrios + delete_confirmation: An bhfuil tú cinnte gur mhaith leat an eochair shlándála seo a scriosadh? + description_html: Má chumasaíonn tú fíordheimhniú eochrach slándála, beidh ort ceann de na heochracha slándála a úsáid chun logáil isteach. + destroy: + error: Bhí fadhb ann agus d'eochair shlándála á scriosadh. Arís, le d'thoil. + success: Scriosadh d'eochair shlándála go rathúil. + invalid_credential: Eochair shlándála neamhbhailí + nickname_hint: Cuir isteach leasainm d'eochair shlándála nua + not_enabled: Níl WebAuthn cumasaithe agat fós + not_supported: Ní thacaíonn an brabhsálaí seo le heochracha slándála + otp_required: Chun eochracha slándála a úsáid cumasaigh fíordheimhniú dhá fhachtóir ar dtús. + registered_on: Cláraithe ar %{date} diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 52b25e28543..b9f0260f524 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -232,6 +232,7 @@ gd: update_custom_emoji: Ùraich an t-Emoji gnàthaichte update_domain_block: Ùraich bacadh na h-àrainne update_ip_block: Ùraich an riaghailt IP + update_report: Ùraich an gearan update_status: Ùraich am post update_user_role: Ùraich an dreuchd actions: @@ -291,6 +292,7 @@ gd: update_custom_emoji_html: Dh’ùraich %{name} an Emoji %{target} update_domain_block_html: Dh’ùraich %{name} bacadh na h-àrainne %{target} update_ip_block_html: Sguab %{name} às riaghailt dhan IP %{target} + update_report_html: Dh’ùraich %{name} an gearan %{target} update_status_html: Dh’ùraich %{name} post le %{target} update_user_role_html: Dh’atharraich %{name} an dreuchd %{target} deleted_account: chaidh an cunntas a sguabadh às @@ -298,6 +300,7 @@ gd: filter_by_action: Criathraich a-rèir gnìomha filter_by_user: Criathraich a-rèir cleachdaiche title: Sgrùd an loga + unavailable_instance: "(chan eil ainm na h-àrainn ri fhaighinn)" announcements: destroyed_msg: Chaidh am brath-fios a sguabadh às! edit: @@ -484,6 +487,9 @@ gd: title: Molaidhean leantainn unsuppress: Aisig am moladh leantainn instances: + audit_log: + title: Logaichean sgrùdaidh o chionn goirid + view_all: Seall na logaichean sgrùdaidh slàna availability: description_html: few: Ma dh’fhàilligeas an lìbhrigeadh dhan àrainn fad %{count} làithean, chan fheuch sinn a-rithist leis an lìbhrigeadh ach às dèidh lìbhrigeadh fhaighinn on àrainn ud fhèin. @@ -660,6 +666,7 @@ gd: report: 'Gearan air #%{id}' reported_account: Cunntas mun a chaidh a ghearan reported_by: Chaidh gearan a dhèanamh le + reported_with_application: Chaidh an gearan a dhèanamh le aplacaid resolved: Air fhuasgladh resolved_msg: Chaidh an gearan fhuasgladh! skip_to_actions: Geàrr leum dha na gnìomhan @@ -779,6 +786,7 @@ gd: desc_html: Tha seo an eisimeil air sgriobtaichean hCaptcha on taobh a-muigh a dh’fhaodadh a bhith ’na dhragh tèarainteachd ’s prìobhaideachd. A bharrachd air sin, nì seo an clàradh mòran nas do-ruigsinn no chuid (gu h-àraidh an fheadhainn air a bheil ciorram). Air na h-adhbharan sin, beachdaich air dòighean eile mar clàradh stèidhichte air aontachadh no cuireadh. title: Iarr air cleachdaichean ùra gum fuasgail iad CAPTCHA gus an cunntas aca a dhearbhadh content_retention: + danger_zone: Earrann chunnartach preamble: Stiùirich mar a tha susbaint an luchd-cleachdaidh ’ga stòradh ann am Mastodon. title: Glèidheadh na susbaint default_noindex: @@ -905,7 +913,23 @@ gd: action: Thoir sùil an-seo airson barrachd fiosrachaidh message_html: "Chaidh stòras nan oibseactan agad a dhroch-rèiteachadh. Tha prìobhaideachd an luchd-cleachdaidh agad fo chunnart." tags: + moderation: + not_trendable: Chan fhaod a threandadh + not_usable: Cha ghabh a chleachdadh + pending_review: A’ feitheamh air lèirmheas + review_requested: Chaidh lèirmheas iarraidh + reviewed: Chaidh lèirmheas a dhèanamh air + title: Staid + trendable: Faodaidh a threandadh + unreviewed: Gun lèirmheas + usable: Gabhaidh a chleachdadh + name: Ainm + newest: As ùire + oldest: As sine + reset: Ath-shuidhich review: Dèan lèirmheas air an staid + search: Lorg + title: Tagaichean hais updated_msg: Chaidh roghainnean an taga hais ùrachadh title: Rianachd trends: @@ -983,6 +1007,7 @@ gd: delete: Sguab às edit_preset: Deasaich rabhadh ro-shuidhichte empty: Cha do mhìnich thu ro-sheataichean rabhaidhean fhathast. + title: Ro-sheataichean rabhaidhean webhooks: add_new: Cuir puing-dheiridh ris delete: Sguab às diff --git a/config/locales/gl.yml b/config/locales/gl.yml index ad4744e15b3..d6c00d205ca 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -31,18 +31,18 @@ gl: created_msg: Nota de moderación creada correctamente! destroyed_msg: Nota de moderación eliminada de xeito correcto! accounts: - add_email_domain_block: Bloquear o dominio do email + add_email_domain_block: Bloquear o dominio do enderezo approve: Aprobar approved_msg: Aprobada a solicitude de rexistro de %{username} are_you_sure: Está segura? avatar: Imaxe de perfil by_domain: Dominio change_email: - changed_msg: Email mudado de xeito correcto! - current_email: Email actual - label: Mudar email - new_email: Novo email - submit: Mudar email + changed_msg: Correo cambiado de xeito correcto! + current_email: Enderezo actual + label: Cambiar de enderezo + new_email: Novo enderezo + submit: Cambiar de enderezo title: Mudar email de %{username} change_role: changed_msg: Rol mudado correctamente! @@ -64,10 +64,10 @@ gl: display_name: Nome a amosar domain: Dominio edit: Editar - email: Email - email_status: Estado do email + email: Enderezo de correo + email_status: Estado do correo enable: Activar - enable_sign_in_token_auth: Activar autenticación cun token no email + enable_sign_in_token_auth: Activar autenticación cun token no correo enabled: Activado enabled_msg: Desbloqueada a conta de %{username} followers: Seguidoras @@ -132,7 +132,7 @@ gl: resubscribe: Resubscribir role: Rol search: Procurar - search_same_email_domain: Outras usuarias co mesmo dominio de email + search_same_email_domain: Outras usuarias co mesmo dominio de correo search_same_ip: Outras usuarias co mesmo IP security: Seguridade security_measures: @@ -154,9 +154,9 @@ gl: suspension_irreversible: Elimináronse de xeito irreversible os datos desta conta. Podes reactivar a conta para facela usable novamente pero non recuperará os datos eliminados. suspension_reversible_hint_html: Esta conta foi suspendida, e os datos serán totalmente eliminados o %{date}. Ata entón, a conta pode ser restaurada sen danos. Se desexas eliminar agora mesmo todos os datos da conta, podes facelo aquí embaixo. title: Contas - unblock_email: Desbloquear enderezo de email - unblocked_email_msg: Enderezo de email de %{username} desbloqueado - unconfirmed_email: Email non confirmado + unblock_email: Desbloquear enderezo de correo + unblocked_email_msg: Enderezo de correo de %{username} desbloqueado + unconfirmed_email: Enderezo de correo sen confirmar undo_sensitized: Desmarcar como sensible undo_silenced: Desfacer acalar undo_suspension: Desfacer suspensión @@ -173,12 +173,12 @@ gl: approve_appeal: Aprobar apelación approve_user: Aprobar Usuaria assigned_to_self_report: Asignar denuncia - change_email_user: Editar email da usuaria + change_email_user: Editar correo electrónico da usuaria change_role_user: Cambiar Rol da Usuaria confirm_user: Confirmar usuaria create_account_warning: Crear aviso create_announcement: Crear anuncio - create_canonical_email_block: Crear Bloqueo de email + create_canonical_email_block: Crear Bloqueo de correo electrónico create_custom_emoji: Crear emoticonas personalizadas create_domain_allow: Crear Dominio Permitido create_domain_block: Crear bloquedo do Dominio @@ -188,7 +188,7 @@ gl: create_user_role: Crear Rol demote_user: Degradar usuaria destroy_announcement: Eliminar anuncio - destroy_canonical_email_block: Eliminar Bloqueo de email + destroy_canonical_email_block: Eliminar Bloqueo de correo electrónico destroy_custom_emoji: Eliminar emoticona personalizada destroy_domain_allow: Eliminar Dominio permitido destroy_domain_block: Eliminar bloqueo do Dominio @@ -200,7 +200,7 @@ gl: destroy_user_role: Eliminar Rol disable_2fa_user: Desactivar 2FA disable_custom_emoji: Desactivar emoticona personalizada - disable_sign_in_token_auth_user: Desactivar Autenticación por token no email para Usuaria + disable_sign_in_token_auth_user: Desactivar Autenticación con token no correo para Usuaria disable_user: Desactivar usuaria enable_custom_emoji: Activar emoticona personalizada enable_sign_in_token_auth_user: Activar Autenticación con token no email para Usuaria @@ -211,14 +211,14 @@ gl: reject_user: Rexeitar Usuaria remove_avatar_user: Eliminar avatar reopen_report: Reabrir denuncia - resend_user: Reenviar o email de confirmación + resend_user: Reenviar o correo de confirmación reset_password_user: Restabelecer contrasinal resolve_report: Resolver denuncia sensitive_account: Marca o multimedia da túa conta como sensible silence_account: Silenciar conta suspend_account: Suspender conta unassigned_report: Desasignar denuncia - unblock_email_account: Desbloquear enderezo de email + unblock_email_account: Desbloquear enderezo de correo unsensitive_account: Retira a marca de sensible do multimedia da conta unsilence_account: Deixar de silenciar conta unsuspend_account: Retirar suspensión de conta @@ -226,6 +226,7 @@ gl: update_custom_emoji: Actualizar emoticona personalizada update_domain_block: Actualizar bloqueo do dominio update_ip_block: Actualizar regra IP + update_report: Actualización da denuncia update_status: Actualizar publicación update_user_role: Actualizar Rol actions: @@ -470,6 +471,9 @@ gl: title: Recomendacións de seguimento unsuppress: Restablecer recomendación de seguimento instances: + audit_log: + title: Rexistros de Auditoría recentes + view_all: Ver os rexistros de auditoría completos availability: description_html: one: Se fallan as entregas ao dominio por %{count} día, non se farán máis intentos a menos que se reciba unha solicitude desde ese dominio. @@ -638,6 +642,7 @@ gl: report: 'Denuncia #%{id}' reported_account: Conta denunciada reported_by: Denunciado por + reported_with_application: Denunciado coa aplicación resolved: Resolto resolved_msg: Resolveuse con éxito a denuncia! skip_to_actions: Ir a accións @@ -660,7 +665,7 @@ gl: delete_data_html: Eliminar o perfil e contidos de @%{acct} para os próximos 30 días a non ser que sexa suspendida nese período preview_preamble_html: "@%{acct} vai recibir un aviso co seguinte contido:" record_strike_html: Anotar un aviso contra @%{acct} para axudarche a xestionar futuros problemas con esta conta - send_email_html: Enviar un email de aviso a @%{acct} + send_email_html: Enviar un correo de aviso a @%{acct} warning_placeholder: Razóns adicionais optativas para a acción de moderación. target_origin: Orixe da conta denunciada title: Denuncias @@ -880,7 +885,23 @@ gl: action: Mira aquí para máis información message_html: "A almacenaxe de obxectos está mal configurada. A privacidade das usuarias está en risco." tags: + moderation: + not_trendable: Non permitir en voga + not_usable: Non utilizable + pending_review: Pendente de revisión + review_requested: Revisión solicitada + reviewed: Revisada + title: Estado + trendable: Permitir en voga + unreviewed: Sen revisar + usable: Utilizable + name: Nome + newest: Máis recente + oldest: Máis antiga + reset: Restabelecer review: Estado de revisión + search: Buscar + title: Cancelos updated_msg: Actualizaronse os axustes dos cancelos title: Administración trends: @@ -1060,7 +1081,7 @@ gl: redirect_to_app_html: Ímoste redirixir á app %{app_name}. Se iso non acontece, proba %{clicking_this_link} ou volve ti manualmente á app. registration_complete: Completouse a creación da conta en %{domain}! welcome_title: Benvida, %{name}! - wrong_email_hint: Se o enderezo de email non é correcto, podes cambialo nos axustes da conta. + wrong_email_hint: Se o enderezo de correo non é correcto, podes cambialo nos axustes da conta. delete_account: Eliminar conta delete_account_html: Se queres eliminar a túa conta, podes facelo aquí. Deberás confirmar a acción. description: diff --git a/config/locales/he.yml b/config/locales/he.yml index 3ba823f99bc..8e09bed939c 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -232,6 +232,7 @@ he: update_custom_emoji: עדכון סמלון מותאם אישית update_domain_block: עדכון חסימת שם מתחם update_ip_block: עדכון כלל IP + update_report: עדכון דו"ח עבירה update_status: סטטוס עדכון update_user_role: עדכון תפקיד actions: @@ -486,6 +487,9 @@ he: title: המלצות מעקב unsuppress: שחזור המלצות מעקב instances: + audit_log: + title: יומני ביקורת אחרונים + view_all: צפיה ביומני הביקורת המלאים availability: description_html: many: אם משלוח לדומיין נכשל במשך %{count} ימים שונים ולא מצליח, נסיונות משלוח נוספים לא יעשו אלא אם התקבל משלוח מהדומיין. @@ -662,6 +666,7 @@ he: report: 'דווח על #%{id}' reported_account: חשבון מדווח reported_by: דווח על ידי + reported_with_application: דיווחים באמצעות יישומון resolved: פתור resolved_msg: הדו"ח נפתר בהצלחה! skip_to_actions: דלג/י לפעולות @@ -908,7 +913,23 @@ he: action: למידע נוסף message_html: "שרות אחסון הענן שלך אינו מוגדר כראוי. פרטיות המשתמשות והמשתמשים שלך בסכנה." tags: + moderation: + not_trendable: לא מזוהה כאופנתי + not_usable: בלתי שמיש + pending_review: ממתינים לסקירה + review_requested: התבקשה סקירה + reviewed: נסקר + title: מצב + trendable: ניתן לאפיון כאופנה + unreviewed: לא נסקר + usable: שמיש + name: שם + newest: החדש ביותר + oldest: הישן ביותר + reset: איפוס review: סקירת מצב + search: חיפוש + title: תגיות updated_msg: הגדרות תגיות עודכנו בהצלחה title: ניהול trends: diff --git a/config/locales/hi.yml b/config/locales/hi.yml index b67de192f25..d6a8e3cc355 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -32,12 +32,31 @@ hi: silence: सीमा silenced: सीमित title: खाते + reports: + reported_with_application: एप्लीकेशन से रिपोर्ट किया गया system_checks: upload_check_privacy_error: message_html: " आपके वेब सर्वर का कन्फिगरेशन सही नहीं है। उपयोगकर्ताओं की निजता खतरे में है। " upload_check_privacy_error_object_storage: action: अधिक जानकारी हेतु यहां क्लिक करें। message_html: " आपके वेब सर्वर का कन्फिगरेशन सही नहीं है। उपयोगकर्ताओं की निजता खतरे में है। " + tags: + moderation: + not_trendable: ट्रेंड नहीं किया जाएगा + not_usable: उपयोगी नहीं + pending_review: लंबित समीक्षा + review_requested: समीक्षा की मांग की गई + reviewed: समीक्षित + title: स्टेटस + trendable: चर्चा में + unreviewed: गैर समीक्षित + usable: उपयुक्त + name: नाम + newest: नवीनतम + oldest: सबसे पुराने + reset: पुनः नियत करें + search: खोजें + title: हैशटैग redirects: prompt: अगर आपको इस लिंक पर भरोसा है तो आगे बढ़ने के लिए इसे क्लिक करें title: आप इस %{instance} को छोड़ने वाले हैं diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 19076910e29..e4f5c1b847b 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -226,6 +226,7 @@ hu: update_custom_emoji: Egyéni emodzsi frissítése update_domain_block: Domain tiltás frissítése update_ip_block: IP-szabály frissítése + update_report: Bejelentés frissítése update_status: Bejegyzés frissítése update_user_role: Szerepkör frissítése actions: @@ -470,6 +471,9 @@ hu: title: Követési ajánlatok unsuppress: Követési ajánlatok visszaállítása instances: + audit_log: + title: Legutóbbi auditnapló + view_all: Teljes auditnapló megtekintése availability: description_html: one: Ha a domainre történő kézbesítés %{count} teljes nap sikertelen, további kézbesítéseket már nem kísérlünk meg, hacsak mi nem kapunk kézbesítést a domaintől. @@ -638,6 +642,7 @@ hu: report: "#%{id} számú jelentés" reported_account: Bejelentett fiók reported_by: 'Jelentette:' + reported_with_application: Alkalmazással bejelentve resolved: Megoldott resolved_msg: A bejelentést sikeresen megoldottuk! skip_to_actions: Tovább az intézkedésekhez @@ -880,7 +885,23 @@ hu: action: Itt találsz több információt message_html: "Az objektumtárolód félre van konfigurálva. Kockázat merül fel a felhasználóid adatainak biztonságával kapcsolatban." tags: + moderation: + not_trendable: Nem lehet felkapott + not_usable: Nem használható + pending_review: Ellenőrzésre vár + review_requested: Ellenőrzés kérve + reviewed: Ellenőrizve + title: Állapot + trendable: Lehet felkapott + unreviewed: Nem ellenőrzött + usable: Használható + name: Név + newest: Legújabb + oldest: Legrégebbi + reset: Visszaállítás review: Engedélyezés állapota + search: Keresés + title: Hashtagek updated_msg: A hashtag beállításokat sikeresen frissítettük title: Karbantartás trends: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 4932d42acfb..9d8e00cb7ef 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -226,6 +226,7 @@ ia: update_custom_emoji: Actualisar emoji personalisate update_domain_block: Actualisar blocada de dominio update_ip_block: Actualisar le regula IP + update_report: Actualisar le reporto update_status: Actualisar le message update_user_role: Actualisar rolo actions: @@ -574,7 +575,7 @@ ia: enabled: Activate inbox_url: URL del repetitor pending: Attende le approbation del repetitor - save_and_enable: Salveguardar e activar + save_and_enable: Salvar 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 @@ -638,6 +639,7 @@ ia: report: 'Reporto #%{id}' reported_account: Conto reportate reported_by: Reportate per + reported_with_application: Signalate con le application resolved: Resolvite resolved_msg: Reporto resolvite con successo! skip_to_actions: Saltar al actiones @@ -880,7 +882,13 @@ ia: action: Consulta hic pro plus information message_html: "Tu immagazinage de objectos es mal configurate. Le confidentialitate de tu usatores es in risco." tags: + moderation: + pending_review: Attende revision + title: Stato + name: Nomine review: Revide le stato + search: Cercar + title: Hashtags updated_msg: Parametros de hashtag actualisate con successo title: Administration trends: @@ -1276,7 +1284,7 @@ ia: other: "%{count} messages individual celate" title: Filtros new: - save: Salveguardar nove filtro + save: Salvar nove filtro title: Adder nove filtro statuses: back_to_filter: Retro al filtro @@ -1294,14 +1302,14 @@ ia: one: "%{count} elemento correspondente al recerca es seligite." other: Tote le %{count} elementos correspondente al recerca es seligite. cancel: Cancellar - changes_saved_msg: Cambios salveguardate con successo! + changes_saved_msg: Le cambiamentos ha essite salvate! confirm: Confirmar copy: Copiar delete: Deler deselect: Deseliger toto none: Necun order_by: Ordinar per - save_changes: Salvar le cambios + save_changes: Salvar le cambiamentos select_all_matching_items: one: Selige %{count} elemento correspondente a tu recerca. other: Selige %{count} elementos correspondente a tu recerca. diff --git a/config/locales/is.yml b/config/locales/is.yml index 7ac50cd572d..4aa05fb10cd 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -226,6 +226,7 @@ is: update_custom_emoji: Uppfæra sérsniðið tjáningartákn update_domain_block: Uppfæra útilokun léns update_ip_block: Uppfæra reglu IP-vistfangs + update_report: Uppfæra kæru update_status: Uppfæra færslu update_user_role: Uppfæra hlutverk actions: @@ -470,6 +471,9 @@ is: title: Fylgja meðmælum unsuppress: Endurheimta að fylgja meðmælum instances: + audit_log: + title: Nýlegar atvikaskráningar + view_all: Skoða heildar-atvikaskráningar availability: description_html: one: Ef afhending til lénsins mistekst í %{count} dag, verður ekki reynt aftur að afhenda til lénsins nema ef afhending frá léninu berst. @@ -638,6 +642,7 @@ is: report: 'Kæra #%{id}' reported_account: Kærður notandaaðgangur reported_by: Kært af + reported_with_application: Kærði með forritinu resolved: Leyst resolved_msg: Það tókst að leysa kæruna! skip_to_actions: Sleppa og fara í aðgerðir @@ -882,7 +887,23 @@ is: action: Skoðaðu hér til að fá frekari upplýsingar message_html: "Gagnageymslan þín er ekki rétt stillt. Friðhelgi notendanna þinna gæti verið í hættu." tags: + moderation: + not_trendable: Getur ekki orðið vinsælt + not_usable: Ekki nothæft + pending_review: Bíður eftir yfirferð + review_requested: Beðið um yfirferð + reviewed: Yfirfarið + title: Staða + trendable: Getur orðið vinsælt + unreviewed: Óyfirfarið + usable: Nothæft + name: Nafn + newest: Nýjast + oldest: Elsta + reset: Endurstilla review: Yfirfara stöðufærslu + search: Leita + title: Myllumerki updated_msg: Það tókst að uppfæra stillingar myllumerkja title: Stjórnendur trends: diff --git a/config/locales/it.yml b/config/locales/it.yml index 1e17c5cbd0c..d552d08a45c 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -226,6 +226,7 @@ it: update_custom_emoji: Aggiorna Emoji Personalizzata update_domain_block: Aggiorna Blocco del Dominio update_ip_block: Aggiorna regola IP + update_report: Aggiorna segnalazione update_status: Aggiorna Toot update_user_role: Aggiorna Ruolo actions: @@ -470,6 +471,9 @@ it: title: Consigli su chi seguire unsuppress: Ripristina consigli su chi seguire instances: + audit_log: + title: Log di Controllo Recenti + view_all: Visualizza tutti i log availability: description_html: one: Se la consegna al dominio fallisce %{count} giorno, non sarà effettuato alcun tentativo di consegna ulteriore a meno che la consegna dal dominio non sia ricevuta. @@ -638,6 +642,7 @@ it: report: 'Rapporto #%{id}' reported_account: Account segnalato reported_by: Inviato da + reported_with_application: Segnalato con applicazione resolved: Risolto resolved_msg: Rapporto risolto! skip_to_actions: Passa alle azioni @@ -880,7 +885,23 @@ it: action: Controlla qui per maggiori informazioni message_html: "La tua archiviazione oggetti è mal configurata. La privacy dei tuoi utenti è a rischio." tags: + moderation: + not_trendable: Non di tendenza + not_usable: Non utilizzabile + pending_review: In attesa di revisione + review_requested: Revisione richiesta + reviewed: Controllato + title: Stato + trendable: Di tendenza + unreviewed: Non revisionato + usable: Utilizzabile + name: Nome + newest: Più recenti + oldest: Più vecchio + reset: Ripristina review: Esamina status + search: Cerca + title: Hashtag updated_msg: Impostazioni hashtag aggiornate con successo title: Amministrazione trends: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index ec6963517ab..0eeb055170a 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -223,6 +223,7 @@ ja: update_custom_emoji: カスタム絵文字を更新 update_domain_block: ドメインブロックを更新 update_ip_block: IPルールを更新 + update_report: 通報の更新 update_status: 投稿を更新 update_user_role: ロールを更新 actions: @@ -290,6 +291,7 @@ ja: filter_by_action: アクションでフィルター filter_by_user: ユーザーでフィルター title: 操作履歴 + unavailable_instance: "(ドメイン名が利用できません)" announcements: destroyed_msg: お知らせが削除されました edit: @@ -625,6 +627,7 @@ ja: report: '通報 #%{id}' reported_account: 報告対象アカウント reported_by: 報告者 + reported_with_application: 報告に使用されたアプリ resolved: 解決済み resolved_msg: 通報を解決済みにしました! skip_to_actions: アクションに移動 diff --git a/config/locales/kab.yml b/config/locales/kab.yml index b2fc9d84773..d6295ec9ae0 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -604,7 +604,7 @@ kab: filters: contexts: account: Imeɣna - notifications: Ilɣa + notifications: Alɣuten thread: Idiwenniyen edit: add_keyword: Rnu awal tasarut @@ -810,7 +810,7 @@ kab: video: one: "%{count} n tbidyutt" other: "%{count} n tbidyutin" - edited_at_html: Tettwaẓreg %{date} + edited_at_html: Tettwaẓreg ass n %{date} open_in_web: Ldi deg Web poll: total_people: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index a8e2ade61df..4d21a7dd3d0 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -223,6 +223,7 @@ ko: update_custom_emoji: 커스텀 에모지 업데이트 update_domain_block: 도메인 차단 갱신 update_ip_block: IP 규칙 수정 + update_report: 신고 업데이트 update_status: 게시물 수정 update_user_role: 역할 수정 actions: @@ -464,6 +465,9 @@ ko: title: 팔로우 추천 unsuppress: 팔로우 추천 복원 instances: + audit_log: + title: 최근 감사 기록 + view_all: 감사 기록 전체 보기 availability: description_html: other: 도메인에 대한 전달이 성공 없이 %{count}일 실패한다면, 이후의 전달 시도는 해당 도메인에서 전달이 오기 전까지는 만들어지지 않습니다. @@ -628,6 +632,7 @@ ko: report: '신고 #%{id}' reported_account: 신고 대상 계정 reported_by: 신고자 + reported_with_application: 신고에 사용된 앱 resolved: 해결 resolved_msg: 신고를 잘 해결했습니다! skip_to_actions: 작업으로 건너뛰기 @@ -868,7 +873,23 @@ ko: action: 더 많은 정보를 보려면 여기를 확인하세요 message_html: "오브젝트 스토리지가 잘못 설정되어 있습니다. 사용자의 개인정보가 위험한 상태입니다." tags: + moderation: + not_trendable: 유행에 오를 수 없음 + not_usable: 사용 불가 + pending_review: 심사 대기 + review_requested: 검토 요청 + reviewed: 검토함 + title: 게시물 + trendable: 유행에 오를 수 있음 + unreviewed: 검토되지 않음 + usable: 사용 가능 + name: 이름 + newest: 최신 + oldest: 오래된 순 + reset: 초기화 review: 심사 상태 + search: 검색 + title: 해시태그 updated_msg: 해시태그 설정이 성공적으로 갱신되었습니다 title: 관리 trends: @@ -1741,7 +1762,7 @@ ko: contrast: 마스토돈 (고대비) default: 마스토돈 (어두움) mastodon-light: 마스토돈 (밝음) - system: 자동 선택 (시스템 테마 이용) + system: 자동 (시스템 테마 사용) time: formats: default: "%Y-%m-%d %H:%M" diff --git a/config/locales/lt.yml b/config/locales/lt.yml index e731deedc8e..5e18751e098 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -232,6 +232,7 @@ lt: update_custom_emoji: Atnaujinti pasirinktinį jaustuką update_domain_block: Atnaujinti domeno bloką update_ip_block: Atnaujinti IP taisyklę + update_report: Atnaujinti ataskaitą update_status: Atnaujinti įrašą update_user_role: Atnaujinti vaidmenį actions: @@ -347,7 +348,7 @@ lt: shortcode_hint: Bent du ženklai, tik raidiniai skaitmeniniai ženklai bei akcentai(_) title: Asmeniniai jaustukai uncategorized: Be kategorijos - unlist: Išbraukti iš sąrašo + unlist: Neįtraukti į sąrašą unlisted: Neįtrauktas į sąrašą update_failed_msg: Jaustukas negalėjo būti pakeistas updated_msg: Jaustukas sėkmingai pakeistas! @@ -445,6 +446,9 @@ lt: import: description_html: Netrukus importuosi domenų blokavimų sąrašą. Labai atidžiai peržiūrėk šį sąrašą, ypač jei ne tu jį sudarei. instances: + audit_log: + title: Naujausi audito žurnalai + view_all: Peržiūrėti visus audito žurnalus availability: title: Prieinamumas warning: Paskutinis bandymas prisijungti prie šio serverio buvo nesėkmingas @@ -522,6 +526,7 @@ lt: report: 'Skundas #%{id}' reported_account: Reportuota paskyra reported_by: Skundas sukurtas + reported_with_application: Pranešta su programėle resolved: Išspręsta resolved_msg: Skundas sėkmingai įšspręstas! status: Statusas @@ -542,6 +547,8 @@ lt: manage_taxonomies_description: Leidžia naudotojams peržiūrėti tendencingą turinį ir atnaujinti saitažodžių nustatymus manage_user_access_description: Leidžia naudotojams išjungti kitų naudotojų dvigubo tapatybės nustatymą, pakeisti el. pašto adresą ir iš naujo nustatyti slaptažodį. settings: + branding: + title: Firminio ženklo kūrimas 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: @@ -604,6 +611,23 @@ lt: message_html: Tavo Elasticsearch klasteris turi tik vieną mazgą, ES_PRESET turėtų būti nustatyta į single_node_cluster. elasticsearch_running_check: message_html: Nepavyko prijungti prie Elasticsearch. Patikrink, ar ji veikia, arba išjunk viso teksto paiešką. + tags: + moderation: + not_trendable: Netendencinga + not_usable: Nenaudojama + pending_review: Laukiama peržiūros + review_requested: Paprašyta peržiūros + reviewed: Peržiūrėta + title: Statusas + trendable: Tendencinga + unreviewed: Neperžiūrėta + usable: Naudojama + name: Pavadinimas + newest: Naujausias + oldest: Seniausias + reset: Atkurti + search: Paieška + title: Saitažodžiai title: Administracija trends: allow: Leisti @@ -663,7 +687,19 @@ lt: edit_preset: Keisti įspėjimo nustatymus title: Įspėjamieji numatytieji webhooks: + add_new: Pridėti galutinį tašką + delete: Ištrinti 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." + disable: Išjungti + disabled: Išjungta + edit: Redaguoti galutinį tašką + enable: Įjungti + enabled: Aktyvi + enabled_events: + few: "%{count} įjungti įvykiai" + many: "%{count} įjungto įvykio" + one: "%{count} įjungtas įvykis" + other: "%{count} įjungtų įvykių" events: Įvykiai admin_mailer: auto_close_registrations: @@ -909,6 +945,7 @@ lt: login_activities: authentication_methods: otp: dvigubas tapatybės nustatymo programėlė + webauthn: saugumo raktai description_html: Jei pastebėjei neatpažįstamą veiklą, apsvarstyk galimybę pakeisti slaptažodį ir įjungti dvigubą tapatybės nustatymą. empty: Tapatybės nustatymas istorijos nėra title: Tapatybės nustatymo istorija @@ -1049,6 +1086,7 @@ lt: relationships: Sekimai ir sekėjai severed_relationships: Nutrūkę sąryšiai two_factor_authentication: Dvigubas tapatybės nustatymas + webauthn_authentication: Saugumo raktai 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į. @@ -1083,7 +1121,7 @@ lt: private_long: rodyti tik sekėjams public: Vieša public_long: visi gali matyti - unlisted: Neįtrauktas į sąrašus + unlisted: Neįtrauktas į sąrašą unlisted_long: matyti gali visi, bet nėra išvardyti į viešąsias laiko skales statuses_cleanup: enabled_hint: Automatiškai ištrina įrašus, kai jie pasiekia nustatytą amžiaus ribą, nebent jie atitinka vieną iš toliau nurodytų išimčių @@ -1110,6 +1148,7 @@ lt: recovery_codes: Atsarginio atkūrimo kodai recovery_codes_regenerated: Atkūrimo kodai sėkmingai sugeneruoti recovery_instructions_html: Jeigu prarandate prieiga prie telefono, jūs galite naudoti atkūrimo kodus esančius žemiau, kad atgautumėte priega prie savo paskyros.Laikykite atkūrimo kodus saugiai Pavyzdžiui, galite norėti juos išspausdinti, ir laikyti kartu su kitais svarbiais dokumentais. + webauthn: Saugumo raktai user_mailer: appeal_approved: action: Paskyros nustatymai @@ -1196,9 +1235,11 @@ lt: verification: Patvirtinimas verified_links: Tavo patikrintos nuorodos webauthn_credentials: + add: Pridėti naują saugumo raktą create: error: Kilo problema pridedant saugumo raktą. Bandyk dar kartą. success: Tavo saugumo raktas buvo sėkmingai pridėtas. + delete: Ištrinti delete_confirmation: Ar tikrai nori ištrinti šį saugumo raktą? description_html: Jei įjungsi saugumo rakto tapatybės nustatymą, prisijungiant reikės naudoti vieną iš savo saugumo raktų. destroy: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index baab2cb587a..da1684e8a9b 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -226,6 +226,7 @@ nl: update_custom_emoji: Lokale emoji bijwerken update_domain_block: Domeinblokkade bijwerken update_ip_block: IP-regel bijwerken + update_report: Rapportage bijwerken update_status: Bericht bijwerken update_user_role: Rol bijwerken actions: @@ -470,6 +471,9 @@ nl: title: Aanbevolen accounts unsuppress: Account weer aanbevelen instances: + audit_log: + title: Recente audit-logboeken + view_all: Volledige audit-logboeken inzien availability: description_html: one: Wanneer de bezorging aan het domein gedurende %{count} dag blijft mislukken dan worden er geen bezorgpogingen meer gedaan, totdat een bezorging van het domein wordt ontvangen. @@ -638,6 +642,7 @@ nl: report: 'Rapportage #%{id}' reported_account: Gerapporteerde account reported_by: Gerapporteerd door + reported_with_application: Gerapporteerd met applicatie resolved: Opgelost resolved_msg: Rapportage succesvol opgelost! skip_to_actions: Ga direct naar de maatregelen @@ -880,7 +885,23 @@ nl: action: Klik hier voor meer informatie message_html: "Jouw objectopslag is verkeerd geconfigureerd. De privacy van je gebruikers is in gevaar." tags: + moderation: + not_trendable: Niet trendbaar + not_usable: Niet bruikbaar + pending_review: In afwachting van beoordeling + review_requested: Beoordeling aangevraagd + reviewed: Beoordeeld + title: Status + trendable: Trendbaar + unreviewed: Onbeoordeeld + usable: Bruikbaar + name: Naam + newest: Nieuwste + oldest: Oudste + reset: Opnieuw review: Status beoordelen + search: Zoeken + title: Hashtags updated_msg: Instellingen hashtag succesvol bijgewerkt title: Beheer trends: @@ -975,7 +996,7 @@ nl: webhook: Webhook admin_mailer: auto_close_registrations: - body: In verband met een gebrek aan recentelijke moderator-activiteit, is de registratie-modus op %{instance} automatisch veranderd naar handmatige beoordeling door moderatoren. Dit om te voorkomen dat %{instance} als platform voor eventueel misbruik kan worden gebruikt. Je kunt op elk gewenst moment veel terugschakelen naar open registraties. + body: In verband met een gebrek aan recentelijke moderatoractiviteit, is de registratiemodus op %{instance} automatisch gewijzigd naar handmatige beoordeling door moderatoren. Dit om te voorkomen dat %{instance} als platform voor eventueel misbruik kan worden gebruikt. Je kunt op elk gewenst moment weer terugschakelen naar open registraties. subject: De registratie-modus op %{instance} is automatisch veranderd naar handmatige beoordeling door moderatoren new_appeal: actions: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index d82c92c262a..ec77a2edf87 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -226,6 +226,7 @@ nn: update_custom_emoji: Oppdater tilpassa emoji update_domain_block: Oppdater domene-sperring update_ip_block: Oppdater IP-regel + update_report: Oppdater rapport update_status: Oppdater tut update_user_role: Oppdater rolla actions: @@ -293,6 +294,7 @@ nn: filter_by_action: Sorter etter handling filter_by_user: Sorter etter brukar title: Revisionslogg + unavailable_instance: "(domenenamn er utilgjengeleg)" announcements: destroyed_msg: Kunngjøringen er slettet! edit: @@ -637,6 +639,7 @@ nn: report: 'Rapporter #%{id}' reported_account: Rapportert konto reported_by: Rapportert av + reported_with_application: Rapportert med app resolved: Oppløyst resolved_msg: Rapporten er løyst! skip_to_actions: Gå til handlingar diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 7497f178438..1477396999f 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -232,6 +232,7 @@ pl: update_custom_emoji: Aktualizuj niestandardowe emoji update_domain_block: Zaktualizuj blokadę domeny update_ip_block: Aktualizuj regułę IP + update_report: Wiadomości or raporcie update_status: Aktualizuj wpis update_user_role: Aktualizuj rolę actions: @@ -486,6 +487,9 @@ pl: title: Polecane konta unsuppress: Przywróć polecenie obserwacji konta instances: + audit_log: + title: Niedawne zdarzenia z dzienniku + view_all: Pokaż pełny dziennik zdarzeń availability: description_html: few: Jeśli dostarczenie do domeny nie powiedzie się %{count} dni bez powodzenia, nie zostaną podjęte dalsze próby dostawy, chyba że otrzymano dostawę od domeny. @@ -662,6 +666,7 @@ pl: report: 'Zgłoszenie #%{id}' reported_account: Zgłoszone konto reported_by: Zgłaszający + reported_with_application: Zareportowano przez aplikację resolved: Rozwiązane resolved_msg: Pomyślnie rozwiązano zgłoszenie. skip_to_actions: Przejdź do akcji @@ -908,7 +913,23 @@ pl: action: Kliknij tutaj, aby dowiedzieć się więcej message_html: "Pamięć obiektu jest nieprawidłowa. Prywatność twoich użytkowników jest zagrożona." tags: + moderation: + not_trendable: Nie mogą trendować + not_usable: Nieużywalne + pending_review: Oczekuje na przejrzenie + review_requested: Prośba o przejrzenie + reviewed: Przejrzane + title: Status + trendable: Mogą trendować + unreviewed: Nieprzejrzane + usable: Używalne + name: Nazwa + newest: Najnowsze + oldest: Najstarsze + reset: Resetuj review: Stan przeglądu + search: Szukaj + title: Hashtagi updated_msg: Pomyślnie uaktualniono ustawienia hashtagów title: Administracja trends: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 8d3b53f777d..584a9253b81 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -293,6 +293,7 @@ pt-BR: filter_by_action: Filtrar por ação filter_by_user: Filtrar por usuário title: Auditar histórico + unavailable_instance: "(nome de domínio indisponível)" announcements: destroyed_msg: Anúncio excluído! edit: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 839ae2184ed..ed6a8a4028c 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -226,6 +226,7 @@ pt-PT: update_custom_emoji: Atualizar Emoji Personalizado update_domain_block: Atualizar Bloqueio de Domínio update_ip_block: Atualizar regra de IP + update_report: Atualizar Relatório update_status: Atualizar Estado update_user_role: Atualizar Função actions: @@ -470,6 +471,9 @@ pt-PT: title: Seguir recomendações unsuppress: Restaurar recomendações de contas a seguir instances: + audit_log: + title: Registos de auditoria recentes + view_all: Ver registos de auditoria completos availability: description_html: one: Se a transmissão ao domínio falhar ao final de %{count} dia(s), não será feita mais nenhuma tentativa de transmissão a menos que seja recebida uma transmissão proveniente desse domínio. @@ -638,6 +642,7 @@ pt-PT: report: 'Denúncia #%{id}' reported_account: Conta denunciada reported_by: Denunciado por + reported_with_application: Reportado com a aplicação resolved: Resolvido resolved_msg: Denúncia correctamente resolvida! skip_to_actions: Passar para as ações @@ -880,7 +885,23 @@ pt-PT: action: Verifique aqui para mais informações message_html: "O seu armazenamento de objetos está mal configurado. A privacidade dos seus utilizadores está em risco." tags: + moderation: + not_trendable: Não pode ser tendência + not_usable: Não utilizável + pending_review: Pendente de revisão + review_requested: Revisão solicitada + reviewed: Revista + title: Estado + trendable: Pode ser tendência + unreviewed: Não revista + usable: Utilizável + name: Nome + newest: Mais recente + oldest: Mais antiga + reset: Repor review: Estado da revisão + search: Pesquisar + title: Hashtags updated_msg: 'Definições de #etiquetas correctamente actualizadas' title: Administração trends: diff --git a/config/locales/ro.yml b/config/locales/ro.yml index cd54d51051d..79bc2a275f4 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -116,6 +116,8 @@ ro: redownloaded_msg: S-a reîmprospătat cu succes profilul %{username} de la origine reject: Respinge rejected_msg: S-a respins cu succes cererea de înregistrare a utilizatorului %{username} + remote_suspension_irreversible: Datele acestui cont au fost șterse în mod ireversibil. + remote_suspension_reversible_hint_html: Contul a fost suspendat pe server-ul respectiv, iar datele vor fi șterse complet pe %{date}. Până atunci, server-ul remote poate restabili acest cont fără consecințe negative. Dacă dorești să elimini toate datele contului numaidecât, poți face acest lucru mai jos. remove_avatar: Elimină avatar remove_header: Elimină antet removed_avatar_msg: S-a îndepărtat cu succes poza de profil a utilizatorului %{username} diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 6dff92bb6d5..5f5b3676fb6 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1699,6 +1699,7 @@ ru: import: Импорт import_and_export: Импорт и экспорт migrate: Миграция учётной записи + notifications: Уведомления по электронной почте preferences: Настройки profile: Профиль relationships: Подписки и подписчики @@ -1706,6 +1707,9 @@ ru: strikes: Замечания модерации two_factor_authentication: Подтверждение входа webauthn_authentication: Ключи безопасности + severed_relationships: + event_type: + user_domain_block: Вы заблокировали %{target_name} statuses: attached: audio: diff --git a/config/locales/ry.yml b/config/locales/ry.yml index 6fe57b65cdb..e384b7f1b74 100644 --- a/config/locales/ry.yml +++ b/config/locales/ry.yml @@ -1 +1,21 @@ +--- ry: + accounts: + follow: Пудписати ся + following: Пудпискы + posts: + few: Публикації + one: Публикація + other: Публикації + posts_tab_heading: Публикації + imports: + titles: + following: Імпортованя пудписок + types: + following: Испис пудписок + notification_mailer: + follow: + body: "%{name} ся пудписує ся на вас!" + subject: "%{name} ся пудписує ся на вас" + relationships: + following: Пудпискы diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 449d8d9c7f3..6f4fd6eb30d 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -118,7 +118,7 @@ sc: search_same_ip: Àteras persones cun sa pròpiu IP security: Seguresa sensitive: Sensìbile - sensitized: marcadu comente a sensìbile + sensitized: Marcadu comente sensìbile shared_inbox_url: URL de intrada cumpartzida show: created_reports: Informes creados @@ -127,13 +127,13 @@ sc: silenced: Limitadas statuses: Tuts subscribe: Sutascrie·ti - suspend: Suspensione + suspend: Suspende suspended: Suspèndidu suspension_irreversible: Is datos de custu contu sunt istados cantzellados in manera irreversìbile. Podes bogare sa suspensione a su contu pro chi si potzat impreare, ma no at a recuperare datu perunu de is chi teniat in antis. suspension_reversible_hint_html: Su contu est istadu suspèndidu, e is datos ant a èssere cantzelladu de su totu su %{date}. Finas a tando, su contu si podet ripristinare sena efetu malu perunu. Si boles cantzellare totu is datos de su contu immediatamente ddu podes fàghere inoghe in bassu. title: Contos unconfirmed_email: Posta eletrònica sena cunfirmare - undo_sensitized: Boga sa marcadura comente "sensìbile" + undo_sensitized: Boga sa marcadura comente sensìbile undo_silenced: Non pòngias a sa muda undo_suspension: Iscontza sa suspensione unsilenced_msg: As bogadu is lìmites a su contu de %{username} @@ -280,36 +280,44 @@ sc: updated_msg: Emoji atualizadu upload: Càrriga dashboard: - media_storage: Immagasinamentu + active_users: utentes ativos + interactions: interatziones + media_storage: Immagasinamentu multimèdia + new_users: utentes noos + opened_reports: informes abertos software: Programmas space: Impreu de ispàtziu title: Pannellu + website: Situ web domain_allows: add_new: Permite sa federatzione cun domìniu created_msg: Sa federatzione cun su domìniu est istada permìtida destroyed_msg: Sa federatzione cun su domìniu no est istada permìtida - import: Importatzione + export: Esporta + import: Importa undo: Non permitas sa federatzione cun su domìniu domain_blocks: add_new: Agiunghe blocu de domìniu nou confirm_suspension: cancel: Annulla - confirm: Suspensione + confirm: Suspende + title: Cunfirma su blocu de domìniu de %{domain} created_msg: Protzessende su blocu de domìniu destroyed_msg: Su blocu de domìniu est istadu iscontzadu domain: Domìniu edit: Modìfica su blocu de su domìniu existing_domain_block_html: As giai impostu lìmites prus astrintos a %{name}, ddu dias dèpere isblocare prima. - import: Importatzione + export: Esporta + import: Importa new: create: Crea unu blocu hint: Su blocu de domìniu no at a impedire sa creatzione de contos noos in sa base de datos, ma ant a èssere aplicados in manera retroativa mètodos de moderatzione ispetzìficos subra custos contos. severity: noop: Perunu - silence: A sa muda + silence: Lìmita suspend: Suspensione title: Blocu de domìniu nou - not_permitted: Non tenes su permissu de fàghere custa atzione + not_permitted: Non tenes permissu pro fàghere custa atzione obfuscate: Cua su nòmine de domìniu obfuscate_hint: Cua una parte de su nòmine de domìniu in sa lista si sa visualizatzione de sa lista de domìnios limitados est ativa private_comment: Cummentu privadu @@ -330,7 +338,16 @@ sc: new: create: Agiunghe unu domìniu title: Bloca su domìniu de posta eletrònica nou + not_permitted: Non permìtidu title: Domìnios de posta eletrònica blocados + export_domain_allows: + no_file: Perunu archìviu seletzionadu + export_domain_blocks: + import: + title: Importa blocos de domìniu + new: + title: Importa blocos de domìniu + no_file: Perunu archìviu seletzionadu follow_recommendations: description_html: "Is cussìgios de sighiduras agiudant a is persones noas a agatare deretu cuntenutu interessante. Si una persone at interagidu cun pagu gente e non podet retzire cussìgios de sighiduras personalizados, custos contos ant a èssere ammustrados. Ant a èssere torrados a carculare dae un'ammisturu de contos cun is pertzentuales de cumpromissu prus artos e su nùmeru prus artu de sighiduras pro un'idioma ispetzìficu." language: Pro idioma @@ -341,15 +358,22 @@ sc: unsuppress: Recùpera su cussìgiu de sighidura instances: back_to_all: Totus - back_to_limited: Limitadu + back_to_limited: Limitadas back_to_warning: Atentzione by_domain: Domìniu content_policies: + comment: Apuntu internu policies: + reject_media: Refuda elementos multimediales reject_reports: Refuda informes - silence: A sa muda - suspend: Suspensione + silence: Lìmita + suspend: Suspende + policy: Polìtica + reason: Resone pùblica + title: Polìticas de cuntenutu dashboard: + instance_accounts_dimension: Contos prus sighidos + instance_accounts_measure: contos sarvados instance_reports_measure: informes a subra de àtere delivery: all: Totus @@ -426,10 +450,12 @@ sc: assigned: Moderatzione assignada by_target_domain: Domìniu de su contu signaladu cancel: Annulla + category: Categoria comment: none: Perunu confirm: Cunfirma created_at: Sinnaladu + delete_and_resolve: Cantzella publicatziones forwarded: Torradu a imbiare forwarded_to: Torradu a imbiare a %{domain} mark_as_resolved: Marca comente a isòrvidu @@ -442,12 +468,14 @@ sc: create_and_unresolve: Torra a abèrrere cun una nota delete: Cantzella placeholder: Descrie is atziones chi as pigadu o cale si siat àtera atualizatzione de importu... + title: Notas reopen: Torra a abèrrere s'informe report: 'Informe #%{id}' reported_account: Contu sinnaladu reported_by: Sinnaladu dae resolved: Isòrvidu resolved_msg: Informe isòrvidu. + skip_to_actions: Brinca a is atziones status: Istadu title: Informes unassign: Boga s'assignatzione @@ -455,13 +483,18 @@ sc: updated_at: Atualizadu view_profile: Visualiza profilu roles: + assigned_users: + one: "%{count} utente" + other: "%{count} utentes" categories: administration: Amministratzione invites: Invitos moderation: Moderatzione + special: Ispetziale delete: Cantzella privileges: administrator: Amministratzione + invite_users: Invita gente rules: add_new: Agiunghe règula delete: Cantzella @@ -481,7 +514,8 @@ sc: discovery: follow_recommendations: Cussìgios de sighidura profile_directory: Diretòriu de profilos - public_timelines: Lìnias de tempos pùblicas + public_timelines: Lìnias de tempus pùblicas + publish_statistics: Pùblica istatìsticas title: Iscoberta trends: Tendèntzias domain_blocks: @@ -495,19 +529,32 @@ sc: approved: Aprovatzione rechesta pro si registrare none: Nemos si podet registrare open: Chie si siat si podet registrare + title: Cunfiguratziones de su serbidore site_uploads: delete: Cantzella s'archìviu carrigadu destroyed_msg: Càrriga de su situ cantzellada. software_updates: documentation_link: Àteras informatziones + title: Atualizatziones a disponimentu + type: Casta + version: Versione statuses: + account: Autore application: Aplicatzione back_to_account: Torra a sa pàgina de su contu deleted: Cantzelladu + favourites: Preferidos + language: Idioma media: title: Elementos multimediales + metadata: Metadatos no_status_selected: Perunu istadu est istadu mudadu dae chi non nd'as seletzionadu + open: Aberi sa publicatzione + original_status: Publicatzione originale + status_changed: Publicatzione modificada title: Istados de su contu + trending: Populares + visibility: Visibilidade with_media: Cun elementos multimediales strikes: actions: @@ -515,7 +562,7 @@ sc: suspend: "%{name} at suspèndidu su contu de %{target}" system_checks: database_schema_check: - message_html: Ddoe at tràmudas de base de datos in suspesu. Pone·ddas in esecutzione pro ti assegurare chi s'aplicatzione funtzionet comente si tocat + message_html: Ddoe at tràmudas de bases de datos in suspesu. Pone·ddas in esecutzione pro ti assegurare chi s'aplicatzione funtzionet comente si tocat rules_check: action: Gesti is règulas de su serbidore message_html: No as cunfiguradu peruna règula de su serbidore. @@ -527,6 +574,12 @@ sc: title: Amministratzione trends: pending_review: De revisionare + rejected: Refudadas + statuses: + allow: Permite sa publicatzione + allow_account: Permite a s'autore + disallow: Non permitas sa publicatzione + disallow_account: Non permitas a s'autore tags: title: Etichetas de tendèntzia title: Tendèntzias @@ -541,8 +594,17 @@ sc: disabled: Disativadu enable: Ativa enabled: Ativu + events: Eventos status: Istadu admin_mailer: + new_appeal: + actions: + delete_statuses: cantzellare is publicatziones issoro + mark_statuses_as_sensitive: marcare is publicatziones issoro comente sensìbiles + none: un'avisu + sensitive: marcare su contu issoro comente sensìbile + silence: limitare su contu issoro + suspend: suspèndere su contu issoro new_pending_account: body: Is detàllios de su contu nou sunt a suta. Podes aprovare o refudare custa rechesta. subject: Contu nou de revisionare in %{instance} (%{username}) @@ -551,6 +613,10 @@ sc: body_remote: Una persone de su domìniu %{domain} at sinnaladu %{target} subject: Informe nou pro %{instance} (#%{id}) new_trends: + new_trending_links: + title: Ligòngios populares + new_trending_statuses: + title: Publicatziones populares new_trending_tags: title: Etichetas de tendèntzia aliases: @@ -588,8 +654,11 @@ sc: warning: Dae cara a custos datos. Non ddos cumpartzas mai cun nemos! your_token: S'identificadore tuo de atzessu auth: + apply_for_account: Pedi unu contu confirmations: + clicking_this_link: incarchende custu ligòngiu login_link: intra + welcome_title: Ti donamus su benebènnidu, %{name}! delete_account: Cantzella su contu delete_account_html: Si boles cantzellare su contu, ddu podes fàghere inoghe. T'amus a dimandare una cunfirmatzione. description: @@ -601,21 +670,32 @@ sc: invalid_reset_password_token: Su còdighe de autorizatzione pro resetare sa crae no est vàlidu o est iscadidu. Dimanda·nde un'àteru. link_to_otp: Inserta unu còdighe a duas fases dae su telèfono tuo o unu còdighe de recùperu link_to_webauth: Imprea su dispositivu tuo de crae de seguresa + log_in_with: Intra cun login: Intra logout: Essi migrate_account: Moe a unu contu diferente migrate_account_html: Si boles torrare a indiritzare custu contu a un'àteru, ddu as a pòdere fàghere inoghe. or_log_in_with: O intra cun + progress: + confirm: Cunfirma s'indiritzu de posta eletrònica + details: Is detàllios tuos + review: Sa revisione nostra + rules: Atzeta is règulas providers: cas: CAS saml: SAML register: Registru registration_closed: "%{instance} no atzetat àteras persones" + resend_confirmation: Torra a imbiare su ligòngiu de cunfirmatzione reset_password: Reseta sa crae rules: + accept: Atzeta back: A coa + title_invited: As retzidu un'invitu. security: Seguresa set_new_password: Cunfigura una crae noa + setup: + link_not_received: No as retzidu su ligòngiu? status: account_status: Istadu de su contu confirming: Isetende chi sa posta eletrònica siat cumpletada. @@ -670,11 +750,15 @@ sc: username_unavailable: Su nòmine de utente tuo no at a abarrare a disponimentu disputes: strikes: + status_removed: Sa publicatzione est giai istada cantzellada de su sistema + title: "%{action} de sa data imbeniente: %{date}" title_actions: + delete_statuses: Cantzelladura de publicatziones none: Atentzione domain_validator: invalid_domain: no est unu nòmine de domìniu vàlidu edit_profile: + basic_information: Informatzione bàsica other: Àteru errors: '400': Sa dimanda chi as imbiadu non fiat vàlida o non fiat curreta. @@ -720,15 +804,36 @@ sc: public: Lìnias de tempos pùblicas thread: Arresonadas edit: + add_keyword: Agiunghe paràulas crae + keywords: Paràulas crae + statuses: Publicatziones individuales title: Modìfica filtru errors: invalid_context: Cuntestu mancante o non vàlidu index: delete: Cantzella empty: Non tenes perunu filtru. + expires_in: Iscadit in %{distance} + expires_on: Iscadit su %{date} + keywords: + one: "%{count} paràula crae" + other: "%{count} paràulas crae" + statuses: + one: "%{count} publicatzione" + other: "%{count} publicatziones" + statuses_long: + one: "%{count} publicatzione individuale cuada" + other: "%{count} publicatziones individuales cuadas" title: Filtros new: + save: Sarva filtru nou title: Agiunghe unu filtru nou + statuses: + back_to_filter: Torra a su filtru + batch: + remove: Boga dae su filtru + index: + title: Publicatziones filtradas generic: all: Totus cancel: Annulla @@ -736,6 +841,7 @@ sc: confirm: Cunfirma copy: Còpia delete: Cantzella + deselect: Boga sa seletzione none: Perunu order_by: Òrdina pro save_changes: Sarva is modìficas @@ -745,7 +851,12 @@ sc: other: Calicuna cosa ancora no est andende. Bide is %{count} faddinas in bàsciu imports: errors: + empty: Archìviu CSV bòidu over_rows_processing_limit: cuntenet prus de %{count} filas + too_large: S'archìviu est tropu mannu + failures: Faddinas + imported: Importadu + mismatched_types_warning: Forsis as seletzionadu unu tipu chi no est curretu pro s'importatzione. modes: merge: Uni merge_long: Mantene is registros chi esistint e agiunghe·nde àteros @@ -836,8 +947,8 @@ sc: copy_account_note_text: 'Custa persone s''est tramudada dae %{acct}, custas sunt is notas antepostas tuas chi ddi pertocant:' notification_mailer: favourite: - body: "%{name} at marcadu comente a preferidu s'istadu tuo:" - subject: "%{name} at marcadu comente a preferidu s'istadu tuo" + body: "%{name} at marcadu comente preferida sa publicatzione tua:" + subject: "%{name} at marcadu comente preferida sa publicatzione tua" title: Preferidu nou follow: body: "%{name} t'est sighende!" @@ -904,7 +1015,10 @@ sc: posting_defaults: Valores predefinidos de publicatzione public_timelines: Lìnias de tempos pùblicas privacy: + privacy: Riservadesa search: Chirca + privacy_policy: + title: Polìtica de riservadesa reactions: errors: limit_reached: Lìmite de reatziones diferentes cròmpidu @@ -928,8 +1042,13 @@ sc: status: Istadu de su contu remote_follow: missing_resource: Impossìbile agatare sa rechesta de indiritzamentu URL pro su contu tuo + rss: + content_warning: 'Avisu de cuntenutu:' + descriptions: + account: Publicatziones pùblicas dae @%{acct} + tag: 'Publicatziones pùblicas etichetadas cun #%{hashtag}' scheduled_statuses: - over_daily_limit: As superadu su lìmite de %{limit} tuts programmados pro cudda die + over_daily_limit: As superadu su lìmite de %{limit} publicatziones programmadas pro cudda die over_total_limit: As superadu su lìmite de %{limit} tuts programmados too_soon: Sa data programmada depet èssere benidora sessions: @@ -937,11 +1056,13 @@ sc: browser: Navigadore browsers: alipay: Alipay + blackberry: BlackBerry chrome: Chrome edge: Microsoft Edge electron: Electron firefox: Firefox generic: Navigadore disconnotu + huawei_browser: Navigadore Huawei ie: Internet Explorer micro_messenger: MicroMessenger nokia: Navigadore Nokia S40 Ovi @@ -950,19 +1071,25 @@ sc: phantom_js: PhantomJS qq: QQ Browser safari: Safari + uc_browser: Navigadore UC + unknown_browser: Navigadore disconnotu weibo: Weibo current_session: Sessione atuale + date: Data description: "%{browser} de %{platform}" explanation: Custos sunt is navigadores web de is chi ses intradu in su contu tuo de Mastodon. ip: IP platforms: adobe_air: Adobe Air android: Android + blackberry: BlackBerry chrome_os: ChromeOS firefox_os: Firefox OS ios: iOS + kai_os: KaiOS linux: Linux mac: macOS + unknown_platform: Prataforma disconnota windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone @@ -984,8 +1111,9 @@ sc: import: Importatzione import_and_export: Importatzione e esportatzione migrate: Tràmuda de contu + notifications: Notìficas tràmite posta eletrònica preferences: Preferèntzias - profile: Profilu + profile: Profilu pùblicu relationships: Gente chi sighis e sighiduras two_factor_authentication: Autenticatzione de duos fatores webauthn_authentication: Craes de seguresa @@ -1034,6 +1162,7 @@ sc: unlisted: Esclùidu de sa lista unlisted_long: Podet èssere bidu dae chie si siat, però non podet èssere ammustradu in lìnias de tempus pùblicas statuses_cleanup: + exceptions: Etzetziones min_age: '1209600': 2 chidas '15778476': 6 meses @@ -1055,6 +1184,8 @@ sc: formats: default: "%d %b %Y, %H:%M" month: "%b %Y" + time: "%H:%M" + with_time_zone: "%d %b, %Y, %H:%M %Z" two_factor_authentication: add: Agiunghe disable: Disativa 2FA @@ -1071,23 +1202,47 @@ sc: recovery_instructions_html: Si una die as a pèrdere s'atzessu a su telèfonu tuo, as a pòdere impreare unu de is còdighes de recùperu inoghe in suta pro recuperare s'atzessu a su contu tuo. Cunserva is còdighes in manera segura. Pro esèmpiu, ddos dias pòdere imprentare e archiviare in paris a àteros documentos de importu. webauthn: Craes de seguresa user_mailer: + appeal_approved: + action: Cunfiguratziones de su contu backup_ready: subject: S'archìviu tuo est prontu pro èssere iscarrigadu title: Collida dae s'archìviu + suspicious_sign_in: + change_password: muda sa crae + details: 'Custos sunt is detàllios de s''identificatzione:' warning: + categories: + spam: Àliga reason: 'Resone:' + statuses: 'Publicatziones tzitadas:' subject: disable: Su contu tuo %{acct} est istadu cungeladu none: Avisu pro %{acct} silence: Su contu tuo %{acct} est istadu limitadu suspend: Su contu tuo %{acct} est istadu suspèndidu title: + delete_statuses: Publicatziones cantzelladas disable: Contu congeladu + mark_statuses_as_sensitive: Publicatziones marcadas comente sensìbiles none: Atentzione + sensitive: Contu marcadu comente sensìbile silence: Contu limitadu suspend: Contu suspèndidu welcome: + apps_ios_action: Iscàrriga·dda dae sa butega de aplicatziones + apps_step: Iscàrriga is aplicatziones ufitziales nostras. + apps_title: Aplicatziones de Mastodon + edit_profile_action: Personaliza + edit_profile_title: Personaliza su profilu tuo explanation: Inoghe ddoe at una paja de impòsitos pro cumintzare + feature_action: Àteras informatziones + follow_action: Sighi + follow_title: Personaliza s'ischermu printzipale + post_action: Iscrie + post_title: Pùblica pro sa primu borta + share_action: Cumpartzi + share_title: Cumpartzi su profilu tuo de Mastodon + sign_in_action: Intra subject: Ti donamus su benebènnidu a Mastodon title: Ti donamus su benebènnidu, %{name}! users: @@ -1101,13 +1256,13 @@ sc: webauthn_credentials: add: Agiunghe una crae de seguresa noa create: - error: Ddoe at àpidu unu problema cun s'agiunta de sa crae de seguresa tua. Torra a proare. + error: Ddoe est istadu unu problema cun s'agiunta de sa crae de seguresa tua. Torra a proare. success: Sa crae de seguresa tua est istada agiunta. delete: Cantzella delete_confirmation: Seguru chi boles cantzellare custa crae de seguresa? description_html: Si permites s'autenticatzione cun crae de seguresa, as a tènnere bisòngiu de impreare una de is craes de seguresa tuas pro ti identificare. destroy: - error: Ddoe at àpidu unu problema cun sa cantzelladura de sa crae de seguresa tua. Torra a proare. + error: Ddoe est istadu unu problema cun sa cantzelladura de sa crae de seguresa tua. Torra a proare. success: Sa crae de seguresa tua est istada cantzellada. invalid_credential: Crae de seguresa non vàlida nickname_hint: Inserta su nomìngiu de sa crae de seguresa tua noa diff --git a/config/locales/simple_form.an.yml b/config/locales/simple_form.an.yml index e409c39ae10..7119aadba25 100644 --- a/config/locales/simple_form.an.yml +++ b/config/locales/simple_form.an.yml @@ -271,7 +271,6 @@ an: listable: Permitir que esta etiqueta amaneixca en as busquedas y en o directorio d'o perfil name: Etiqueta trendable: Permitir que esta etiqueta amaneixca baixo tendencias - usable: Permitir a las publicacions usar esta etiqueta user: role: Rol user_role: diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 370667d48ea..744da9d0554 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -311,7 +311,6 @@ ar: listable: اسمح لهذا الوسم بالظهور في البحث وفي دليل الصفحات التعريفية name: الوسم trendable: السماح لهذه الكلمة المفتاحية بالظهور تحت المتداوَلة - usable: اسمح للمنشورات استخدام هذا الوسم user: role: الدور time_zone: النطاق الزمني diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index d1950ab15f8..5e3f1af89a5 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -6,7 +6,7 @@ ast: note: 'Pues @mentar a otros perfiles o poner #etiquetes.' unlocked: Los perfiles van ser a siguite ensin solicitar la to aprobación. Desmarca esta opción si quies revisar les solicitúes de siguimientu y escoyer si aceptales o refugales. admin_account_action: - text_html: Opcional. Pues usar la sintaxis de los artículos ya amestar alvertencies preconfiguraes p'aforrar tiempu + text_html: Opcional. Pues usar la sintaxis de los artículos y amestar alvertencies preconfiguraes p'aforrar tiempu type_html: Escueyi qué facer con %{acct} types: none: Usa esta opción pa unviar una alvertencia al perfil, ensin aicionar nenguna otra aición. @@ -18,14 +18,14 @@ ast: text: Pues usar la sintaxis de los artículos. Ten en cuenta l'espaciu que l'anunciu va ocupar na pantalla del usuariu/a defaults: autofollow: Les persones que se rexistren pente la invitación van siguite automáticamente - bot: Avisa a otres persones de qu'esta cuenta fai principalmente aiciones automatizaes ya de que ye posible que nun tean supervisaes - digest: Namás s'unvia dempués d'un periodu llongu d'inactividá ya namás si recibiesti dalgún mensaxe personal demientres la to ausencia + bot: Avisa a otres persones de qu'esta cuenta fai principalmente aiciones automatizaes y de que ye posible que nun tean supervisaes + digest: Namás s'unvia dempués d'un periodu llongu d'inactividá y namás si recibiesti dalgún mensaxe personal demientres la to ausencia irreversible: Los artículos peñeraos desapaecen de forma irreversible, magar que la peñera se quite dempués - locale: La llingua de la interfaz, los mensaxes per corréu electrónicu ya los avisos push + locale: La llingua de la interfaz, los mensaxes per corréu electrónicu y los avisos push password: Usa polo menos 8 caráuteres - setting_aggregate_reblogs: Nun amuesa los artículos compartíos nuevos que xá se compartieren de recién (namás afeuta a los artículos compartíos d'agora) + setting_aggregate_reblogs: Nun amuesa los artículos compartíos nuevos que yá se compartieren de recién (namás afeuta a los artículos compartíos d'agora) setting_always_send_emails: Los avisos nun se suelen unviar per corréu electrónicu si uses activamente Mastodon - setting_default_sensitive: El conteníu multimedia sensible anúbrese por defeutu ya pue amosase al calcar nelli + setting_default_sensitive: El conteníu multimedia sensible anúbrese por defeutu y pue amosase al calcar nelli setting_display_media_default: Anubrilu cuando se marque como sensible setting_display_media_hide_all: Anubrilu siempres setting_display_media_show_all: Amosalu siempres @@ -37,10 +37,10 @@ ast: custom_css: Pues aplicar estilos personalizaos a la versión web de Mastodon. mascot: Anula la ilustración na interfaz web avanzada. 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_extended_description: Cualesquier tipu d'información adicional que pueda ser útil pa visitantes y 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? - theme: L'estilu que los visitantes ya los perfiles nuevos usen. - trends: Les tendencies amuesen artículos, etiquetes ya noticies que tean ganando popularidá nesti sirvidor. + theme: L'estilu que los visitantes y los perfiles nuevos usen. + trends: Les tendencies amuesen artículos, etiquetes y noticies que tean ganando popularidá nesti sirvidor. form_challenge: current_password: Tas entrando a una área segura imports: @@ -49,7 +49,7 @@ ast: text: Esto va ayudanos a revisar la to solicitú ip_block: comment: Opcional. Un recordatoriu de por qué amestesti esta norma. - expires_in: Les direiciones IP son un recursu finitu, suelen compartise ya cambiar de manes. Por esti motivu, nun s'aconseyen los bloqueos indefiníos de direiciones IP. + expires_in: Les direiciones IP son un recursu finitu, suelen compartise y cambiar de manes. Por esti motivu, nun s'aconseyen los bloqueos indefiníos de direiciones IP. severities: no_access: Bloquia l'accesu a tolos recursos sign_up_block: Fai que nun se puedan rexistrar cuentes nueves @@ -58,11 +58,12 @@ ast: chosen_languages: Namás los artículos de les llingües que marques son los que van apaecer nes llinies de tiempu públiques labels: account: - discoverable: Destacar el perfil ya los artículos nos algoritmos de descubrimientu + discoverable: Destacar el perfil y los artículos nos algoritmos de descubrimientu fields: name: Etiqueta value: Conteníu indexable: Incluyir los artículos públicos nos resultaos de busca + show_collections: Amosar los perfiles a los que sigues y los que te siguen account_warning_preset: title: Títulu admin_account_action: @@ -109,10 +110,11 @@ ast: setting_default_privacy: Privacidá de los artículos setting_default_sensitive: Marcar siempres tol conteníu como sensible setting_delete_modal: Amosar el diálogu de confirmación enantes de desaniciar un artículu + setting_disable_hover_cards: Desactivar la previsualización de perfiles al pasar el mur penriba setting_disable_swiping: Desactivar el movimientu de desplazamientu setting_display_media: Conteníu multimedia setting_expand_spoilers: Espander siempres los artículos marcaos con alvertencies de conteníu - setting_hide_network: Anubrir les cuentes que sigas ya te sigan + setting_hide_network: Anubrir les cuentes que sigas y te sigan setting_reduce_motion: Amenorgar el movimientu de les animaciones setting_system_font_ui: Usar la fonte predeterminada del sistema setting_theme: Estilu del sitiu @@ -173,11 +175,11 @@ ast: text: Norma settings: indexable: Incluyir la páxina del perfil nos motores de busca + show_application: Amosar l'aplicación dende la que s'unvien los artículos tag: - listable: Permitir qu'esta etiqueta apaeza nes busques ya nes suxerencies + listable: Permitir qu'esta etiqueta apaeza nes busques y nes suxerencies name: Etiqueta trendable: Permitir qu'esta etiqueta apaeza nes tendencies - usable: Permitir que los artículos usen esta etiqueta user: role: Rol time_zone: Fusu horariu diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 101d40f1173..a50db22987a 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -211,6 +211,7 @@ be: setting_default_privacy: Прыватнасць допісаў setting_default_sensitive: Заўсёды пазначаць кантэнт як далікатны setting_delete_modal: Паказваць акно пацвярджэння перад выдаленнем допісу + setting_disable_hover_cards: Адключыць перадпрагляд профілю пры навядзенні setting_disable_swiping: Адключыць прагортванні setting_display_media: Адлюстраванне медыя setting_display_media_default: Перадвызначана @@ -242,11 +243,13 @@ be: warn: Схаваць з папярэджаннем form_admin_settings: activity_api_enabled: Апублікаваць зводную статыстыку аб актыўнасці карыстальнікаў API + app_icon: Значок праграмы backups_retention_period: Працягласць захавання архіву карыстальніка bootstrap_timeline_accounts: Заўсёды раіць гэтыя ўліковыя запісы новым карыстальнікам closed_registrations_message: Уласнае паведамленне, калі рэгістрацыя немагчымая content_cache_retention_period: Перыяд захоўвання выдаленага змесціва custom_css: CSS карыстальніка + favicon: Значок сайта mascot: Уласны маскот(спадчына) media_cache_retention_period: Працягласць захавання кэшу для медыя peers_api_enabled: Апублікаваць спіс знойдзеных сервераў у API @@ -311,7 +314,7 @@ be: listable: Дазволіць паказ хэштэгу ў пошуку і ў каталозе профіляў name: Хэштэг trendable: Дазволіць паказ гэтага хэштэга ў трэндах - usable: Дазволіць выкарыстанне хэштэгу ў допісах + usable: Дазволіць допісам выкарыстоўваць гэты хэштэг лакальна user: role: Роля time_zone: Часавы пояс diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index f14a21b0c70..333ab25c825 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -211,6 +211,7 @@ bg: setting_default_privacy: Поверителност на публикуване setting_default_sensitive: Все да се бележи мултимедията като деликатна setting_delete_modal: Показване на прозорче за потвърждение преди изтриване на публикация + setting_disable_hover_cards: Изключване на прегледа на профила, премествайки показалеца отгоре setting_disable_swiping: Деактивиране на бързо плъзгащи движения setting_display_media: Показване на мултимедия setting_display_media_default: Стандартно @@ -242,11 +243,13 @@ bg: warn: Скриване зад предупреждение form_admin_settings: activity_api_enabled: Публикуване на агрегатна статистика относно потребителската дейност в API + app_icon: Икона на приложение backups_retention_period: Период за съхранение на потребителския архив bootstrap_timeline_accounts: Винаги да се препоръчват следните акаунти на нови потребители closed_registrations_message: Съобщение при неналична регистрация content_cache_retention_period: Период на запазване на отдалечено съдържание custom_css: Персонализиран CSS + favicon: Сайтоикона mascot: Плашило талисман по избор (остаряло) media_cache_retention_period: Период на запазване на мултимедийния кеш peers_api_enabled: Публикуване на списъка с открити сървъри в API @@ -311,7 +314,7 @@ bg: listable: Позволяване на хаштага да се появява при търсене и предложения name: Хаштаг trendable: Показване на хаштага да се появява под нашумели - usable: Позволяване на публикациите да употребяват този хаштаг + usable: Позволяване на публикациите да употребяват този хаштаг локално user: role: Роля time_zone: Часова зона diff --git a/config/locales/simple_form.br.yml b/config/locales/simple_form.br.yml index 196711aee97..f4d442cfdab 100644 --- a/config/locales/simple_form.br.yml +++ b/config/locales/simple_form.br.yml @@ -72,7 +72,6 @@ br: tag: name: Hashtag trendable: Aotren an hashtag-mañ da zont war wel dindan tuadurioù - usable: Aotren an embannadurioù da implijout an hashtag-mañ user: role: Roll time_zone: Gwerzhid eur diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index d3dc4b13f11..4daf657234b 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -211,6 +211,7 @@ ca: setting_default_privacy: Privacitat dels tuts setting_default_sensitive: Marcar sempre el contingut gràfic com a sensible setting_delete_modal: Mostra la finestra de confirmació abans d'esborrar un tut + setting_disable_hover_cards: Deshabilita la vista prèvia del perfil en passar-hi per sobre setting_disable_swiping: Desactiva les animacions setting_display_media: Visualització multimèdia setting_display_media_default: Per defecte @@ -242,11 +243,13 @@ ca: warn: Oculta amb un avís form_admin_settings: activity_api_enabled: Publica a l'API estadístiques agregades sobre l'activitat dels usuaris + app_icon: Icona de l'aplicació 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ó del contingut remot custom_css: CSS personalitzat + favicon: Icona de preferits mascot: Mascota personalitzada (llegat) media_cache_retention_period: Període de retenció del cau multimèdia peers_api_enabled: Publica a l'API la llista de servidors descoberts @@ -311,7 +314,7 @@ ca: listable: Permet que aquesta etiqueta aparegui en les cerques i en el directori de perfils name: Etiqueta trendable: Permet que aquesta etiqueta aparegui en les tendències - usable: Permet als tuts emprar aquesta etiqueta + usable: Permet a les publicacions emprar aquesta etiqueta localment user: role: Rol time_zone: Zona horària diff --git a/config/locales/simple_form.ckb.yml b/config/locales/simple_form.ckb.yml index 3c1d8315e32..cfadea034da 100644 --- a/config/locales/simple_form.ckb.yml +++ b/config/locales/simple_form.ckb.yml @@ -182,7 +182,6 @@ ckb: listable: ڕیگەبدە ئەم هاشتاگە لە پێرستی هەڵبژاردەی بەکارهێنەران و پەڕەی گەڕان نیشان بدرێت name: هەشتاگ trendable: ڕێگەبدە ئەم هەشتاگە لە نووسراوەی بەرچاوکراو نیسان بدرێت - usable: ڕێگەبدە بە توتەکان بۆ بەکارهێنانی ئەم هەشتاگە 'no': نە recommended: پێشنیارکراوە required: diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index dfec033469e..06c993f406a 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -186,7 +186,6 @@ co: listable: Auturizà stu hashtag à esse vistu nant'à l'annuariu di i prufili name: Hashtag trendable: Auturizà stu hashtag à esse vistu in e tendenze - usable: Auturizà i statuti à utilizà stu hashtag 'no': Nò recommended: Ricumandati required: diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 0b1a34e1b99..d4d370ff5be 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -59,7 +59,7 @@ cs: setting_display_media_default: Skrývat média označená jako citlivá setting_display_media_hide_all: Vždy skrývat média setting_display_media_show_all: Vždy zobrazovat média - setting_use_blurhash: Gradienty jsou založeny na barvách skryté grafiky, ale zakrývají jakékoliv detaily + setting_use_blurhash: Gradienty jsou vytvořeny na základě barvev skrytých médií, ale zakrývají veškeré detaily setting_use_pending_items: Aktualizovat časovou osu až po kliknutí namísto automatického rolování kanálu username: Pouze písmena, číslice a podtržítka whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikován pouze, pokud se shoduje s celým slovem @@ -242,11 +242,13 @@ cs: warn: Skrýt s varováním form_admin_settings: activity_api_enabled: Zveřejnit souhrnné statistiky o aktivitě uživatele v API + app_icon: Ikona aplikace 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ávání vzdáleného obsahu custom_css: Vlastní CSS + favicon: Favicon mascot: Vlastní maskot (zastaralé) media_cache_retention_period: Doba uchovávání mezipaměti médií peers_api_enabled: Zveřejnit seznam nalezených serverů v API @@ -311,7 +313,6 @@ cs: listable: Povolit zobrazení tohoto hashtagu ve vyhledávání a návrzích name: Hashtag trendable: Povolit zobrazení tohoto hashtagu mezi populárními - usable: Povolit používat tento hashtag v příspěvcích user: role: Role time_zone: Časové pásmo diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 5e8fd85293f..22545a776a6 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -211,6 +211,7 @@ cy: setting_default_privacy: Preifatrwydd cyhoeddi setting_default_sensitive: Marcio cyfryngau fel eu bod yn sensitif bob tro setting_delete_modal: Dangos deialog cadarnhau cyn dileu postiad + setting_disable_hover_cards: Analluogi rhagolwg proffil ar lusgo setting_disable_swiping: Analluogi cynigion llusgo setting_display_media: Dangos cyfryngau setting_display_media_default: Rhagosodiad @@ -242,11 +243,13 @@ cy: warn: Cuddio â rhybudd form_admin_settings: activity_api_enabled: Cyhoeddi ystadegau cyfanredol am weithgarwch defnyddwyr yn yr API + app_icon: Eicon ap 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 cynnwys o bell custom_css: CSS cyfaddas + favicon: Favicon mascot: Mascot cyfaddas (hen) media_cache_retention_period: Cyfnod cadw storfa cyfryngau peers_api_enabled: Cyhoeddi rhestr o weinyddion a ddarganfuwyd yn yr API @@ -311,7 +314,7 @@ cy: listable: Caniatáu i'r hashnod hwn ymddangos mewn chwiliadau ac awgrymiadau name: Hashnod trendable: Caniatáu i'r hashnod hwn ymddangos o dan bynciau llosg - usable: Caniatáu i bostiadau ddefnyddio'r hashnod hwn + usable: Caniatáu i bostiadau ddefnyddio'r hashnod hwn yn lleol user: role: Rôl time_zone: Cylchfa amser diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 0719e26430d..5763885ac4b 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -211,6 +211,7 @@ da: setting_default_privacy: Fortrolighed for indlæg setting_default_sensitive: Markér altid medier som sensitive setting_delete_modal: Vis bekræftelsesdialog før et indlæg slettes + setting_disable_hover_cards: Deaktivér profilforhåndsvisning ved svæv (hover) setting_disable_swiping: Deaktivér strygebevægelser setting_display_media: Medievisning setting_display_media_default: Standard @@ -242,11 +243,13 @@ da: warn: Skjul bag en advarsel form_admin_settings: activity_api_enabled: Offentliggør samlede statistikker vedr. brugeraktivitet i API'en + app_icon: App-ikon 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: Opbevaringsperiode for eksternt indhold custom_css: Tilpasset CSS + favicon: Favikon mascot: Tilpasset maskot (ældre funktion) media_cache_retention_period: Media-cache opbevaringsperiode peers_api_enabled: Udgiv liste over fundne server i API'en @@ -311,7 +314,7 @@ da: listable: Tillad visning af dette hashtag i søgninger og forslag name: Hashtag trendable: Tillad visning af dette hashtag under trends - usable: Tillad indlæg at benytte dette hashtag + usable: Tillad indlæg at benytte dette hashtag lokalt user: role: Rolle time_zone: Tidszone diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 7d397866977..fb7bda94896 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -211,6 +211,7 @@ de: setting_default_privacy: Beitragssichtbarkeit setting_default_sensitive: Medien immer mit einer Inhaltswarnung versehen setting_delete_modal: Bestätigungsdialog beim Löschen eines Beitrags anzeigen + setting_disable_hover_cards: Profilvorschau deaktivieren, wenn die Maus über das Profil bewegt wird setting_disable_swiping: Wischgesten deaktivieren setting_display_media: Darstellung von Medien setting_display_media_default: Standard @@ -242,11 +243,13 @@ de: warn: Mit einer Inhaltswarnung ausblenden form_admin_settings: activity_api_enabled: Aggregierte Nutzungsdaten über die API veröffentlichen + app_icon: App-Symbol 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 externe Inhalte custom_css: Eigenes CSS + favicon: Favicon mascot: Benutzerdefiniertes Maskottchen (Legacy) media_cache_retention_period: Aufbewahrungsfrist für Medien im Cache peers_api_enabled: Die entdeckten Server im Fediverse über die API veröffentlichen @@ -311,7 +314,7 @@ de: listable: Erlaube, dass dieser Hashtag in Suchen und Empfehlungen erscheint name: Hashtag trendable: Erlaube, dass dieser Hashtag in den Trends erscheint - usable: Erlaube, dass dieser Hashtag in Beiträgen erscheint + usable: Beiträge dürfen diesen Hashtag lokal verwenden user: role: Rolle time_zone: Zeitzone diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 29b9f59e14a..af93f65fecd 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -276,7 +276,6 @@ el: listable: Εμφάνιση αυτής της ετικέτας στο δημόσιο κατάλογο name: Ετικέτα trendable: Εμφάνιση της ετικέτας στις τάσεις - usable: Χρήση της ετικέτας σε τουτ user: role: Ρόλος user_role: diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index eaf0501a27b..606b9a4d404 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -211,6 +211,7 @@ en-GB: setting_default_privacy: Posting privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialogue before deleting a post + setting_disable_hover_cards: Disable profile preview on hover setting_disable_swiping: Disable swiping motions setting_display_media: Media display setting_display_media_default: Default @@ -242,11 +243,13 @@ en-GB: warn: Hide with a warning form_admin_settings: activity_api_enabled: Publish aggregate statistics about user activity in the API + app_icon: App icon 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: Remote content retention period custom_css: Custom CSS + favicon: Favicon mascot: Custom mascot (legacy) media_cache_retention_period: Media cache retention period peers_api_enabled: Publish list of discovered servers in the API @@ -311,7 +314,6 @@ en-GB: listable: Allow this hashtag to appear in searches and suggestions name: Hashtag trendable: Allow this hashtag to appear under trends - usable: Allow posts to use this hashtag user: role: Role time_zone: Time Zone diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index fdc9f61813d..fee3a6151ad 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -211,6 +211,7 @@ en: setting_default_privacy: Posting privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a post + setting_disable_hover_cards: Disable profile preview on hover setting_disable_swiping: Disable swiping motions setting_display_media: Media display setting_display_media_default: Default @@ -242,11 +243,13 @@ en: warn: Hide with a warning form_admin_settings: activity_api_enabled: Publish aggregate statistics about user activity in the API + app_icon: App icon 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: Remote content retention period custom_css: Custom CSS + favicon: Favicon mascot: Custom mascot (legacy) media_cache_retention_period: Media cache retention period peers_api_enabled: Publish list of discovered servers in the API @@ -311,7 +314,7 @@ en: listable: Allow this hashtag to appear in searches and suggestions name: Hashtag trendable: Allow this hashtag to appear under trends - usable: Allow posts to use this hashtag + usable: Allow posts to use this hashtag locally user: role: Role time_zone: Time zone diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index e83f71a2cb5..3b51c159086 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -203,6 +203,7 @@ eo: setting_default_privacy: Privateco de afiŝado setting_default_sensitive: Ĉiam marki plurmediojn kiel tiklaj setting_delete_modal: Montri konfirman fenestron antaŭ ol forigi mesaĝon + setting_disable_hover_cards: Malebligi profilan antaŭmontron kiam oni musumas setting_disable_swiping: Malebligi svingajn movojn setting_display_media: Montrado de plurmedioj setting_display_media_default: Implicita @@ -234,6 +235,7 @@ eo: warn: Kaŝi malantaŭ averto form_admin_settings: activity_api_enabled: Publikigi entutajn statistikojn pri uzantagado en la API + app_icon: Apbildo 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 @@ -301,7 +303,6 @@ eo: listable: Permesi ĉi tiun kradvorton aperi en serĉoj kaj sugestoj name: Kradvorto trendable: Permesi al ĉi tiu kradvorto aperi en furoraĵoj - usable: Permesi mesaĝojn uzi ĉi tiun kradvorton user: role: Rolo time_zone: Horzono diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index e346a23a028..e26af5b0c60 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -211,6 +211,7 @@ es-AR: setting_default_privacy: Privacidad de mensajes setting_default_sensitive: Siempre marcar medios como sensibles setting_delete_modal: Mostrar diálogo de confirmación antes de eliminar un mensaje + setting_disable_hover_cards: Deshabilitar previsualización del perfil al pasar el cursor setting_disable_swiping: Deshabilitar movimientos de deslizamiento setting_display_media: Visualización de medios setting_display_media_default: Predeterminada @@ -242,11 +243,13 @@ es-AR: warn: Ocultar con una advertencia form_admin_settings: activity_api_enabled: Publicar estadísticas agregadas sobre la actividad de la cuenta en la API + app_icon: Ícono de la aplicación 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 contenido remoto custom_css: CSS personalizado + favicon: Favicón mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de la caché de medios peers_api_enabled: Publicar lista de servidores descubiertos en la API @@ -311,7 +314,7 @@ es-AR: listable: Permitir que esta etiqueta aparezca en las búsquedas y en las sugerencias name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias - usable: Permitir a los mensajes usar esta etiqueta + usable: Permitir que los mensajes usen esta etiqueta localmente user: role: Rol time_zone: Zona horaria diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index b3c8a857e83..733a5c27696 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -211,6 +211,7 @@ es-MX: setting_default_privacy: Privacidad de publicaciones setting_default_sensitive: Marcar siempre imágenes como sensibles setting_delete_modal: Mostrar diálogo de confirmación antes de borrar un toot + setting_disable_hover_cards: Desactivar vista previa del perfil al pasar el cursor setting_disable_swiping: Deshabilitar movimientos de deslizamiento setting_display_media: Visualización multimedia setting_display_media_default: Por defecto @@ -242,11 +243,13 @@ es-MX: warn: Ocultar con una advertencia form_admin_settings: activity_api_enabled: Publicar estadísticas locales acerca de la actividad de usuario en la API + app_icon: Icono de la app 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 contenido remoto custom_css: CSS personalizado + favicon: Favicon mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de caché multimedia peers_api_enabled: Publicar lista de servidores descubiertos en la API @@ -311,7 +314,7 @@ es-MX: listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias - usable: Permitir a los toots usar esta etiqueta + usable: Permitir a las publicaciones usar esta etiqueta localmente user: role: Rol time_zone: Zona horaria diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 2fb5cab987f..02f0562d284 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -211,6 +211,7 @@ es: setting_default_privacy: Privacidad de publicaciones setting_default_sensitive: Marcar siempre imágenes como sensibles setting_delete_modal: Mostrar diálogo de confirmación antes de borrar una publicación + setting_disable_hover_cards: Desactivar vista previa del perfil al pasar el cursor setting_disable_swiping: Deshabilitar movimientos de deslizamiento setting_display_media: Visualización multimedia setting_display_media_default: Por defecto @@ -242,11 +243,13 @@ es: warn: Ocultar con una advertencia form_admin_settings: activity_api_enabled: Publicar estadísticas agregadas sobre la actividad del usuario con la API + app_icon: Icono de la app 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 contenido remoto custom_css: CSS personalizado + favicon: Favicon mascot: Mascota personalizada (legado) media_cache_retention_period: Período de retención de caché multimedia peers_api_enabled: Publicar lista de servidores descubiertos en la API @@ -311,7 +314,7 @@ es: listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias - usable: Permitir a las publicaciones usar esta etiqueta + usable: Permitir a las publicaciones usar esta etiqueta localmente user: role: Rol time_zone: Zona horaria diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index b2ad4c51cfc..74660921d2d 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -77,10 +77,15 @@ 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 + app_icon: WEBP, PNG, GIF või JPG. Asendab mobiilsel seadmel äpi vaikeikooni kohandatud ikooniga. + backups_retention_period: Kasutajatel on võimalus genereerida oma postitustest hiljem allalaaditav arhiiv. Kui määrata positiivne arv, kustutatakse serveri talletusruumist need arhiivid määratud arvu päevade järel automaatselt. bootstrap_timeline_accounts: Need kasutajad kinnitatakse uute kasutajate jälgimissoovituste esiritta. closed_registrations_message: Kuvatakse, kui liitumised pole võimalikud - custom_css: Kohandatud stiile on võimalik kasutada Mastodoni veebiliideses. + content_cache_retention_period: Kõik teiste serverite postitused (sealhulgas jagamised ja vastused) kustutatakse pärast määratud arvu päevade möödumist, sõltumata, kuidas kohalik kasutaja on nende postitustega interakteerunud. Hõlmatud on ka postitused, mille kohalik kasutaja on märkinud järjehoidjaks või lemmikuks. Ka eri instantside kasutajate vahelised privaatsed mainimised kaovad ja neid on võimatu taastada. See seadistus on mõeldud eriotstarbeliste instantside jaoks ja rikub paljude kasutajate ootusi, kui seda rakendatakse üldotstarbelise kasutuse puhul. + custom_css: Mastodoni veebiliideses on võimalik kasutada kohandatud stiile. + favicon: WEBP, PNG, GIF või JPG. Asendab Mastodoni vaike- favicon ikooni kohandatud ikooniga. mascot: Asendab kohandatud veebiliidese illustratsiooni. + media_cache_retention_period: Kaugkasutajate tehtud postituste meediafailid salvestatakse teie serveri vahemällu. Kui see seadistus on seatud positiivsele väärtusele, kustutatakse meediumifailid määratud päevade möödumisel. Kui meediaandmeid küsitakse pärast nende kustutamist, laaditakse need uuesti alla, kui lähtesisu on veel saadaval. Kuna on olemas piirangud, kui tihti tohivad lingikaardid kolmandatelt saitidelt andmeid pärida, on soovitatav määrata väärtuseks vähemalt 14. Vastasel juhul ei uuendata linkide eelvaatekaarte nõudmise korral enne seda aega. 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 @@ -240,6 +245,7 @@ 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: Kaugsisu säilitamise aeg custom_css: Kohandatud CSS mascot: Kohandatud maskott (kunagine) media_cache_retention_period: Meediapuhvri talletusperiood @@ -305,7 +311,6 @@ et: listable: Luba sellel sildil ilmuda profiilide kataloogis name: Silt trendable: Luba sellel sildil trendida - usable: Luba postitustel seda silti kasutada user: role: Roll time_zone: Ajavöönd diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 8c467bc9bff..c7e2667cad0 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -311,7 +311,6 @@ eu: listable: Baimendu traola hau bilaketetan agertzea eta profilen direktorioan name: Traola trendable: Baimendu traola hau joeretan agertzea - usable: Baimendu tootek traola hau erabiltzea user: role: Rola time_zone: Ordu zona diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index dd1c56e3bdd..0610f7fced9 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -286,7 +286,6 @@ fa: listable: اجازه به این برچسب برای ظاهر شدن در جست‌وجوها و پیشنهادها name: برچسب trendable: بگذارید که این برچسب در موضوعات پرطرفدار دیده شود - usable: بگذارید که این برچسب در فرسته‌ها به کار بروند user: role: نقش time_zone: منطقهٔ زمانی diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index b0bc8c735b4..c20ff9fa5f5 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -6,31 +6,31 @@ fi: discoverable: Julkisia julkaisujasi ja profiiliasi voidaan pitää esillä tai suositella Mastodonin eri alueilla ja profiiliasi voidaan ehdottaa toisille käyttäjille. display_name: Koko nimesi tai lempinimesi. fields: Verkkosivustosi, pronominisi, ikäsi ja mitä ikinä haluatkaan ilmoittaa. - indexable: Julkiset julkaisusi voivat näkyä hakutuloksissa Mastodonissa. Ihmiset, jotka ovat olleet vuorovaikutuksessa julkaisujesi kanssa, voivat etsiä niitä asetuksesta riippumatta. + indexable: Julkiset julkaisusi voivat näkyä Mastodonin hakutuloksissa. Käyttäjät, jotka ovat olleet vuorovaikutuksessa julkaisujesi kanssa, voivat etsiä niitä asetuksesta riippumatta. note: 'Voit @mainita muita käyttäjiä tai #aihetunnisteita.' show_collections: Käyttäjät voivat selata seurattujasi ja seuraajiasi. Käyttäjät, joita seuraat, näkevät joka tapauksessa, että seuraat heitä. - unlocked: Käyttäjät voivat seurata sinua pyytämättä hyväksyntää. Poista valinta, jos haluat tarkistaa ja hyväksyä tai hylätä vastaanottamasi seuraamispyynnöt. + unlocked: Käyttäjät voivat seurata sinua pyytämättä hyväksyntääsi. Poista valinta, jos haluat tarkistaa sekä hyväksyä tai hylätä vastaanottamasi seurantapyynnöt. account_alias: - acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, josta haluat siirtyä + acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, josta haluat muuttaa account_migration: - acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, johon haluat siirtyä + acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, jonne haluat muuttaa account_warning_preset: text: Voit käyttää julkaisun syntaksia, kuten URL-osoitteita, aihetunnisteita ja mainintoja title: Valinnainen. Ei näy vastaanottajalle admin_account_action: - include_statuses: Käyttäjä näkee, mitkä julkaisut johtivat valvontatoimeen tai varoitukseen + include_statuses: Käyttäjä näkee, mitkä julkaisut johtivat moderointitoimeen tai -varoitukseen send_email_notification: Käyttäjä saa selvityksen siitä, mitä hänen tililleen tapahtui text_html: Valinnainen. Voit käyttää julkaisun syntaksia. Voit lisätä varoitusasetuksia säästääksesi aikaa type_html: Valitse mitä teet käyttäjälle %{acct} types: disable: Estä käyttäjää käyttämästä tiliään, mutta älä poista tai piilota sen sisältöä. - none: Käytä tätä lähettääksesi varoituksen käyttäjälle käynnistämättä mitään muita toimintoja. + none: Käytä tätä lähettääksesi varoitus käyttäjälle käynnistämättä mitään muita toimia. sensitive: Pakota kaikki tämän käyttäjän mediatiedostot arkaluonteisiksi. - silence: Estä käyttäjää lähettämästä viestejä julkisesti, piilota hänen viestinsä ja ilmoituksensa ihmisiltä, jotka eivät seuraa häntä. Sulkee kaikki tämän tilin raportit. - suspend: Estä kaikki vuorovaikutus tältä -tai tälle tilille ja poista sen kaikki sisältö. Päätös voidaan peruuttaa 30 päivän aikana. Sulkee kaikki raportit tätä tiliä vasten. + silence: Estä käyttäjää lähettämästä julkaisuja, joiden näkyvyys on julkinen, sekä piilota hänen julkaisunsa ja häneen liittyvät ilmoitukset niiltä, jotka eivät seuraa häntä. Sulkee kaikki tiliin kohdistuvat raportit. + suspend: Estä kaikki vuorovaikutus tältä tililtä ja tälle tilille sekä poista kaikki sen sisältö. Peruttavissa 30 päivän ajan. Sulkee kaikki tiliin kohdistuvat raportit. warning_preset_id: Valinnainen. Voit silti lisätä mukautetun tekstin esiasetuksen loppuun announcement: - all_day: Kun valittu, vain valittu aikaväli näytetään + all_day: Kun valittuna, vain aikavälin päivät näytetään ends_at: Valinnainen. Tiedote poistetaan automaattisesti tällä hetkellä scheduled_at: Jätä tyhjäksi julkaistaksesi tiedotteen heti starts_at: Valinnainen. Jos tiedotteesi on sidottu tiettyyn aikaväliin @@ -38,25 +38,25 @@ fi: appeal: text: Voit valittaa varoituksesta vain kerran defaults: - autofollow: Henkilöt, jotka rekisteröityvät kutsun kautta, seuraavat sinua automaattisesti + autofollow: Kutsun kautta rekisteröityvät käyttäjät seuraavat sinua automaattisesti avatar: WEBP, PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px - bot: Tämä tili suorittaa enimmäkseen automaattisia toimintoja eikä sitä ehkä valvota + bot: Ilmaise muille, että tili suorittaa enimmäkseen automaattisia toimia eikä sitä valvota context: Ainakin yksi konteksti, jossa suodattimen pitäisi olla voimassa current_password: Turvallisuussyistä kirjoita nykyisen tilin salasana current_username: Vahvista kirjoittamalla nykyisen tilin käyttäjänimi digest: Lähetetään vain pitkän poissaolon jälkeen ja vain, jos olet saanut suoria viestejä poissaolosi aikana - email: Sinulle lähetetään vahvistussähköposti + email: Sinulle lähetetään vahvistusviesti header: WEBP, PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px inbox_url: Kopioi URL-osoite haluamasi välittäjän etusivulta - irreversible: Suodatetut julkaisut katoavat lopullisesti, vaikka suodatin poistettaisiin myöhemmin - locale: Käyttöliittymän, sähköpostien ja puskuilmoitusten kieli - password: Käytä vähintään 8 merkkiä + irreversible: Suodatetut julkaisut katoavat peruuttamattomasti, vaikka suodatin poistettaisiin myöhemmin + locale: Käyttöliittymän, sähköpostiviestien ja puskuilmoitusten kieli + password: Käytä vähintään 8:aa merkkiä phrase: Täsmää riippumatta tekstin aakkoslajista tai julkaisun sisältövaroituksesta - scopes: Mihin sovellusliittymiin sovellus pääsee käsiksi. Jos valitset ylätason laajuuden, sinun ei tarvitse valita yksittäisiä. + scopes: Mihin ohjelmointirajapintoihin sovelluksella on pääsy. Jos valitset ylätason käyttöoikeuden, sinun ei tarvitse valita yksittäisiä. setting_aggregate_reblogs: Älä näytä uusia tehostuksia julkaisuille, joita on äskettäin tehostettu (koskee vain juuri vastaanotettuja tehostuksia) setting_always_send_emails: Yleensä sähköposti-ilmoituksia ei lähetetä, kun käytät Mastodonia aktiivisesti setting_default_sensitive: Arkaluonteinen media piilotetaan oletusarvoisesti, ja se voidaan näyttää yhdellä napsautuksella - setting_display_media_default: Piilota arkaluonteiseksi merkitty media + setting_display_media_default: Piilota arkaluonteiseksi merkitty mediasisältö setting_display_media_hide_all: Piilota mediasisältö aina setting_display_media_show_all: Näytä mediasisältö aina setting_use_blurhash: Liukuvärit perustuvat piilotettujen kuvien väreihin mutta sumentavat yksityiskohdat @@ -64,43 +64,43 @@ fi: username: Voit käyttää kirjaimia, numeroita ja alaviivoja whole_word: Kun avainsana tai -fraasi on täysin aakkosnumeerinen, suodatin aktivoituu vain sen täysvastineille domain_allow: - domain: Tämä verkkotunnus voi noutaa tietoja tältä palvelimelta ja sieltä saapuvat tiedot käsitellään ja tallennetaan + domain: Tämä verkkotunnus voi noutaa tietoja tältä palvelimelta, ja sieltä saapuvat tiedot käsitellään ja tallennetaan email_domain_block: domain: Tämä voi olla verkkotunnus, joka näkyy sähköpostiosoitteessa tai sen käyttämässä MX-tietueessa. Ne tarkistetaan rekisteröitymisen yhteydessä. - with_dns_records: Annetun verkkotunnuksen DNS-tietueet yritetään ratkaista ja tulokset myös estetään + with_dns_records: Annetun verkkotunnuksen DNS-tietueet yritetään selvittää ja myös tulokset estetään featured_tag: name: 'Tässä muutamia hiljattain käyttämiäsi aihetunnisteita:' filters: action: Valitse, mikä toiminto suoritetaan, kun julkaisu vastaa suodatinta actions: - hide: Piilota suodatettu sisältö kokonaan ja käyttäydy ikään kuin sitä ei olisi olemassa + hide: Piilota suodatettu sisältö kokonaan, ikään kuin sitä ei olisi olemassa warn: Piilota suodatettu sisältö varoituksen taakse, jossa mainitaan suodattimen nimi form_admin_settings: activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä - app_icon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen mobiililaitteiden sovelluskuvakkeen omalla kuvakkeella. - backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun arvo on positiivinen, nämä arkistot poistuvat automaattisesti, kun määritetty määrä päiviä on kulunut. - bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun. + app_icon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen mobiililaitteiden sovelluskuvakkeen haluamallasi kuvakkeella. + backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun kentän arvo on positiivinen, nämä arkistot poistuvat automaattisesti, kun määritetty määrä päiviä on kulunut. + bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seurantasuositusten alkuun. closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu - content_cache_retention_period: Kaikki muiden palvelinten julkaisut (mukaan lukien tehostukset ja vastaukset) poistuvat, kun määritetty määrä päiviä on kulunut, ottamatta huomioon paikallisen käyttäjän vuorovaikutusta näiden julkaisujen kanssa. Sisältää julkaisut, jotka paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikiksi. Myös yksityiset maininnat eri palvelinten käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämä asetus on tarkoitettu käytettäväksi erityistapauksissa ja rikkoo monia käyttäjien odotuksia, kun sitä käytetään yleistarkoituksiin. - custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa. - favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin sivustokuvakkeen (favicon) haluamallasi kuvakkeella. - mascot: Ohittaa kuvituksen edistyneessä selainkäyttöliittymässä. - media_cache_retention_period: Käyttäjien tekemien julkaisujen mediatiedostot ovat välimuistissa palvelimellasi. Kun arvo on positiivinen, media poistuu, kun määritetty määrä päiviä on kulunut. Jos mediaa pyydetään sen poistamisen jälkeen, se ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien esikatselun kyselyitä kolmansien osapuolien sivustoille on rajoitettu, on suositeltavaa asettaa tämä arvo vähintään 14 päivään, tai linkkien kortteja ei päivitetä pyynnöstä ennen tätä ajankohtaa. - peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, oletko liitossa tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla. - profile_directory: Profiilihakemisto lueteloi kaikki käyttäjät, jotka ovat ilmoittaneet olevansa löydettävissä. + content_cache_retention_period: Kaikki muiden palvelinten julkaisut (mukaan lukien tehostukset ja vastaukset) poistuvat, kun määritetty määrä päiviä on kulunut, lukuun ottamatta paikallisen käyttäjän vuorovaikutusta näiden julkaisujen kanssa. Tämä sisältää julkaisut, jotka paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikiksi. Myös yksityismaininnat eri palvelinten käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämä asetus on tarkoitettu käytettäväksi erityistapauksissa ja rikkoo monia käyttäjien odotuksia, kun sitä sovelletaan yleiskäyttöön. + custom_css: Voit käyttää mukautettuja tyylejä Mastodonin selainversiossa. + favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin sivustokuvakkeen haluamallasi kuvakkeella. + mascot: Korvaa kuvituksen edistyneessä selainkäyttöliittymässä. + media_cache_retention_period: Etäkäyttäjien tekemien julkaisujen mediatiedostot ovat välimuistissa palvelimellasi. Kun kentän arvo on positiivinen, media poistuu, kun määritetty määrä päiviä on kulunut. Jos mediaa pyydetään sen poistamisen jälkeen, se ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien esikatselun kyselyitä kolmansien osapuolien sivustoille on rajoitettu, on suositeltavaa asettaa tämä arvo vähintään 14 päivään, tai linkkien kortteja ei päivitetä pyynnöstä ennen tätä ajankohtaa. + peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, federoitko tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla. + profile_directory: Profiilihakemisto luetteloi kaikki käyttäjät, jotka ovat valinneet olla löydettävissä. require_invite_text: Kun rekisteröityminen vaatii manuaalisen hyväksynnän, tee ”Miksi haluat liittyä?” -tekstikentästä pakollinen vapaaehtoisen sijaan - site_contact_email: Kuinka ihmiset voivat tavoittaa sinut oikeudellisissa tai tukikysymyksissä. - site_contact_username: Miten ihmiset voivat tavoittaa sinut Mastodonissa. + site_contact_email: Miten sinut voi tavoittaa oikeus- tai tukikysymyksissä. + site_contact_username: Miten sinut voi tavoittaa Mastodonissa. site_extended_description: Kaikki lisätiedot, jotka voivat olla hyödyllisiä kävijöille ja käyttäjille. Voidaan jäsentää Markdown-syntaksilla. - site_short_description: Lyhyt kuvaus auttaa yksilöimään palvelimesi. Kuka sitä johtaa, kenelle se on tarkoitettu? + site_short_description: Lyhyt kuvaus, joka auttaa yksilöimään palvelimesi. Kuka sitä johtaa, ja keille se on tarkoitettu? site_terms: Käytä omaa tietosuojakäytäntöä tai jätä tyhjäksi, jos haluat käyttää oletusta. Voidaan jäsentää Markdown-syntaksilla. - site_title: Kuinka ihmiset voivat viitata palvelimeen sen verkkotunnuksen lisäksi. - status_page_url: URL-osoite sivulle, jonka kautta tämän palvelimen tila voidaan ongelmatilanteissa tarkastaa + site_title: Miten palvelimeesi voi viitata sen verkkotunnuksen lisäksi. + status_page_url: URL-osoite sivulle, josta tämän palvelimen tilan voi ongelmatilanteissa tarkistaa theme: Teema, jonka uloskirjautuneet vierailijat ja uudet käyttäjät näkevät. - thumbnail: Noin 2:1 kuva näytetään palvelimen tietojen rinnalla. + thumbnail: Noin 2:1 kuva näkyy palvelimen tietojen ohessa. timeline_preview: Uloskirjautuneet vierailijat voivat selata uusimpia julkisia julkaisuja, jotka ovat saatavilla palvelimella. - trendable_by_default: Ohita suositun sisällön manuaalinen tarkistus. Yksittäisiä kohteita voidaan edelleen poistaa jälkikäteen. - trends: Trendit osoittavat, mitkä julkaisut, aihetunnisteet ja uutiset ovat saamassa vetoa palvelimellasi. + trendable_by_default: Ohita suositun sisällön manuaalinen tarkastus. Yksittäisiä kohteita voidaan edelleen poistaa jälkikäteen. + trends: Trendit osoittavat, mitkä julkaisut, aihetunnisteet ja uutiset keräävät huomiota palvelimellasi. trends_as_landing_page: Näytä vierailijoille ja uloskirjautuneille käyttäjille suosittua sisältöä palvelimen kuvauksen sijaan. Edellyttää, että trendit on otettu käyttöön. form_challenge: current_password: Olet menossa suojatulle alueelle @@ -109,19 +109,19 @@ fi: invite_request: text: Tämä auttaa meitä arvioimaan hakemustasi ip_block: - comment: Valinnainen. Muista miksi lisäsit tämän säännön. - expires_in: IP-osoitteet ovat rajallinen resurssi – joskus niitä jaetaan, ja ne vaihtavat usein omistajaa. Niinpä epämääräisiä IP-lohkoja ei suositella. + comment: Valinnainen. Muista, miksi lisäsit tämän säännön. + expires_in: IP-osoitteet ovat rajallinen resurssi – joskus niitä jaetaan eteenpäin, ja ne vaihtavat usein omistajaa. Niinpä epämääräisiä IP-lohkoja ei suositella. ip: Kirjoita IPv4- tai IPv6-osoite. Voit estää kokonaisia IP-osoitealueita CIDR-syntaksin avulla. Varo lukitsemasta itseäsi ulos! severities: no_access: Estä pääsy kaikkiin resursseihin sign_up_block: Uudet rekisteröitymiset eivät ole mahdollisia sign_up_requires_approval: Uudet rekisteröitymiset edellyttävät hyväksyntääsi - severity: Valitse, mitä tapahtuu tämän IP-osoitteen pyynnöille + severity: Valitse, mitä tapahtuu tästä IP-osoitteesta tuleville pyynnöille rule: hint: Vapaaehtoinen. Anna yksityiskohtaisempia tietoja säännöstä text: Kuvaile sääntöä tai edellytystä palvelimesi käyttäjille. Suosi tiivistä, yksinkertaista ilmaisua sessions: - otp: 'Näppäile mobiilisovelluksessa näkyvä kaksivaiheisen todennuksen tunnusluku, tai käytä tarvittaessa palautuskoodia:' + otp: 'Näppäile mobiilisovelluksessa näkyvä kaksivaiheisen todennuksen tunnusluku tai käytä tarvittaessa palautuskoodia:' webauthn: Jos kyseessä on USB-avain, muista laittaa se paikalleen ja tarvittaessa napauttaa sitä. settings: indexable: Profiilisi voi näkyä Googlen, Bingin ja muiden hakukoneiden hakutuloksissa. @@ -129,14 +129,14 @@ fi: tag: name: Voit esimerkiksi vaihtaa suur- ja pienaakkosten kesken helppolukuistaaksesi tekstiäsi user: - chosen_languages: Jos valitset kieliä oheisesta listauksesta, vain niidenkieliset julkaisut näkyvät julkisilla aikajanoilla sinulle + chosen_languages: Jos valitset kieliä oheisesta luettelosta, vain niidenkieliset julkaisut näkyvät sinulle julkisilla aikajanoilla role: Rooli vaikuttaa käyttäjän käyttöoikeuksiin user_role: color: Väri, jota käytetään roolille kaikkialla käyttöliittymässä, RGB-heksadesimaalimuodossa highlighted: Tämä tekee roolista julkisesti näkyvän name: Roolin julkinen nimi, jos rooli on asetettu näytettäväksi merkkinä - permissions_as_keys: Käyttäjillä, joilla on tämä rooli, on käyttöoikeus... - position: Korkeampi rooli ratkaisee konfliktit tietyissä tilanteissa. Tiettyjä toimintoja voidaan suorittaa vain rooleille, joiden prioriteetti on pienempi + permissions_as_keys: Käyttäjillä, joilla on tämä rooli, on käyttöoikeus… + position: Korkeampi rooli ratkaisee konfliktit tietyissä tilanteissa. Tiettyjä toimia voidaan suorittaa vain rooleilla, joiden prioriteetti on pienempi webhook: events: Valitse lähetettävät tapahtumat template: Luo oma JSON-hyötykuorma käyttäen muuttujien interpolointia. Jätä kenttä tyhjäksi käyttääksesi vakio-JSON-kuormaa. @@ -151,9 +151,9 @@ fi: show_collections: Näytä seuratut ja seuraajat profiilissa unlocked: Hyväksy uudet seuraajat automaattisesti account_alias: - acct: Vanhan tilin käyttäjänimi + acct: Vanhan tilin käyttäjätunnus account_migration: - acct: Uuden tilin käyttäjänimi + acct: Uuden tilin käyttäjätunnus account_warning_preset: text: Esimääritetty teksti title: Nimi @@ -201,7 +201,7 @@ fi: note: Elämäkerta otp_attempt: Kaksivaiheisen todennuksen tunnusluku password: Salasana - phrase: Avainsana tai -fraasi + phrase: Avainsana tai fraasi setting_advanced_layout: Ota edistynyt selainkäyttöliittymä käyttöön setting_aggregate_reblogs: Ryhmitä tehostukset aikajanoilla setting_always_send_emails: Lähetä sähköposti-ilmoitukset aina @@ -211,8 +211,9 @@ fi: setting_default_privacy: Julkaisun näkyvyys setting_default_sensitive: Merkitse media aina arkaluonteiseksi setting_delete_modal: Kysy vahvistusta ennen julkaisun poistamista + setting_disable_hover_cards: Poista käytöstä profiilin esikatselu osoitettaessa setting_disable_swiping: Poista pyyhkäisyeleet käytöstä - setting_display_media: Median näyttäminen + setting_display_media: Median näkyminen setting_display_media_default: Oletus setting_display_media_hide_all: Piilota kaikki setting_display_media_show_all: Näytä kaikki @@ -223,7 +224,7 @@ fi: setting_theme: Sivuston teema setting_trends: Näytä päivän trendit setting_unfollow_modal: Kysy vahvistusta ennen seuraamisen lopettamista - setting_use_blurhash: Käytä värikästä liukusävytystä piilotetulle medialle + setting_use_blurhash: Käytä värikästä liukusävytystä piilotetulle mediasisällölle setting_use_pending_items: Hidas tila severity: Vakavuus sign_in_token_attempt: Turvakoodi @@ -233,7 +234,7 @@ fi: username_or_email: Käyttäjänimi tai sähköpostiosoite whole_word: Koko sana email_domain_block: - with_dns_records: Sisällytä toimialueen MX-tietueet ja IP-osoitteet + with_dns_records: Sisällytä verkkotunnuksen MX-tietueet ja IP-osoitteet featured_tag: name: Aihetunniste filters: @@ -242,20 +243,22 @@ fi: warn: Piilota varoittaen form_admin_settings: activity_api_enabled: Julkaise yhteenlasketut tilastot käyttäjätoiminnasta ohjelmointirajapinnassa + app_icon: Sovelluskuvake 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: 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 + favicon: Sivustokuvake + mascot: Mukautettu maskotti (vanhentunut) + media_cache_retention_period: Mediasisällön välimuistin säilytysaika peers_api_enabled: Julkaise löydettyjen palvelinten luettelo ohjelmointirajapinnassa profile_directory: Ota profiilihakemisto käyttöön registrations_mode: Kuka voi rekisteröityä - require_invite_text: Vaadi syy liittyä + require_invite_text: Vaadi liittymissyy show_domain_blocks: Näytä verkkotunnusten estot show_domain_blocks_rationale: Näytä, miksi verkkotunnukset on estetty - site_contact_email: Ota yhteys sähköpostitse + site_contact_email: Yhteyshenkilön sähköpostiosoite site_contact_username: Yhteyshenkilön käyttäjänimi site_extended_description: Laajennettu kuvaus site_short_description: Palvelimen kuvaus @@ -265,9 +268,9 @@ fi: theme: Oletusteema thumbnail: Palvelimen pienoiskuva timeline_preview: Salli todentamaton pääsy julkisille aikajanoille - trendable_by_default: Salli suositun sisällön koonti ilman ennakkotarkastusta + trendable_by_default: Salli trendit ilman ennakkotarkastusta trends: Ota trendit käyttöön - trends_as_landing_page: Käytä suosittua sisältöä aloitussivuna + trends_as_landing_page: Käytä trendejä aloitussivuna interactions: must_be_follower: Estä ilmoitukset käyttäjiltä, jotka eivät seuraa sinua must_be_following: Estä ilmoitukset käyttäjiltä, joita et seuraa @@ -285,22 +288,22 @@ fi: sign_up_requires_approval: Rajoita rekisteröitymisiä severity: Sääntö notification_emails: - appeal: Joku valittaa valvojan päätöksestä + appeal: Joku valittaa moderaattorin päätöksestä digest: Lähetä koosteviestejä sähköpostitse favourite: Joku lisäsi julkaisusi suosikkeihinsa follow: Joku seurasi sinua - follow_request: Joku pyysi saada seurata sinua + follow_request: Joku pyysi lupaa seurata sinua mention: Joku mainitsi sinut - pending_account: Uusi tili tarvitsee tarkistusta + pending_account: Uusi tili tarvitsee tarkastuksen reblog: Joku tehosti julkaisuasi - report: Uusi raportti on lähetetty + report: Uusi raportti lähetettiin software_updates: all: Ilmoita kaikista päivityksistä critical: Ilmoita vain kriittisistä päivityksistä label: Uusi Mastodon-versio on saatavilla none: Älä koskaan ilmoita päivityksistä (ei suositeltu) patch: Ilmoita virhekorjauspäivityksistä - trending_tag: Uusi trendi vaatii tarkistusta + trending_tag: Uusi trendi vaatii tarkastuksen rule: hint: Lisätietoja text: Sääntö @@ -308,10 +311,10 @@ fi: indexable: Sisällytä profiilisivu hakukoneisiin show_application: Näytä, mistä sovelluksesta lähetit julkaisun tag: - listable: Salli tämän aihetunnisteen näkyä hauissa ja ehdotuksissa + listable: Salli tämän aihetunnisteen näkyä hakutuloksissa ja ehdotuksissa name: Aihetunniste trendable: Salli tämän aihetunnisteen näkyä trendeissä - usable: Salli julkaisujen käyttää tätä aihetunnistetta + usable: Salli julkaisujen käyttää tätä aihetunnistetta paikallisesti user: role: Rooli time_zone: Aikavyöhyke @@ -319,7 +322,7 @@ fi: color: Merkin väri highlighted: Näytä rooli merkkinä käyttäjäprofiileissa name: Nimi - permissions_as_keys: Oikeudet + permissions_as_keys: Käyttöoikeudet position: Prioriteetti webhook: events: Käytössä olevat tapahtumat @@ -328,11 +331,11 @@ fi: 'no': Ei not_recommended: Ei suositella overridden: Ohitettu - recommended: Suositeltu + recommended: Suositellaan required: mark: "*" text: vaadittu tieto title: sessions: - webauthn: Käytä yhtä turva-avaimistasi kirjautuaksesi sisään + webauthn: Käytä yhtä suojausavaimistasi kirjautuaksesi sisään 'yes': Kyllä diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 7d4da2b51ee..ecd8402680d 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -211,6 +211,7 @@ fo: setting_default_privacy: Hvussu privatir eru postar? setting_default_sensitive: Merk altíð miðlafílur sum viðkvæmar setting_delete_modal: Vís váttanarmynd, áðrenn postar verða strikaðir + setting_disable_hover_cards: Ger undanvísing, tá músin verður flutt yvir vangan, óvirkna setting_disable_swiping: Ger sveipurørslur óvirknar setting_display_media: Vístir miðlar setting_display_media_default: Sjálvvirði @@ -242,11 +243,13 @@ fo: warn: Fjal við eini ávaring form_admin_settings: activity_api_enabled: Útgev samantald hagtøl um brúkaravirksemi í API'num + app_icon: App ikon 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ð fyri varðveiðslu av fjartilfari custom_css: Serskilt CSS + favicon: Favikon mascot: Serskildur maskottur (arvur) media_cache_retention_period: Tíðarskeið, har miðlagoymslur verða varðveittar peers_api_enabled: Kunnger lista við uppdagaðum ambætarum í API'num @@ -311,7 +314,7 @@ fo: listable: Loyva hesum tvíkrossið, at verða vístur í leitingum og uppskotum name: Tvíkrossur trendable: Loyv hesum frámerki at síggjast undir rákum - usable: Loyva uppsløgum at brúka hendan tvíkross + usable: Loyv postum at brúka hetta frámerki lokalt user: role: Leiklutur time_zone: Tíðarsona diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index 4b3f53e2223..5edffb49d4b 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -305,7 +305,6 @@ fr-CA: listable: Autoriser ce hashtag à apparaître dans les recherches et dans l’annuaire des profils name: Mot-clic trendable: Autoriser ce hashtag à apparaitre dans les tendances - usable: Autoriser les messages à utiliser ce hashtag user: role: Rôle time_zone: Fuseau horaire diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 476f197f417..9694b00b48c 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -305,7 +305,6 @@ fr: listable: Autoriser ce hashtag à apparaître dans les recherches et dans l’annuaire des profils name: Hashtag trendable: Autoriser ce hashtag à apparaitre dans les tendances - usable: Autoriser les messages à utiliser ce hashtag user: role: Rôle time_zone: Fuseau horaire diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index 9e0f67b7072..bde97237f6f 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -211,6 +211,7 @@ fy: setting_default_privacy: Sichtberheid fan nije berjochten setting_default_sensitive: Media altyd as gefoelich markearje setting_delete_modal: Freegje foar it fuortsmiten fan in berjocht in befêstiging + setting_disable_hover_cards: Profylfoarbylden troch der oerhinne te sweven útskeakelje setting_disable_swiping: Feibewegingen útskeakelje setting_display_media: Mediawerjefte setting_display_media_default: Standert @@ -242,11 +243,13 @@ fy: warn: Mei in warskôging ferstopje form_admin_settings: activity_api_enabled: Publyklik meitsjen fan sammele statistiken oer brûkersaktiviteiten yn de API + app_icon: App-piktogram backups_retention_period: Bewartermyn brûkersargyf bootstrap_timeline_accounts: Accounts dy’t altyd oan nije brûkers oanrekommandearre wurde closed_registrations_message: Oanpast berjocht wannear registraasje útskeakele is content_cache_retention_period: Bewartermyn foar eksterne ynhâld custom_css: Oanpaste CSS + favicon: Favicon mascot: Oanpaste maskotte (legacy) media_cache_retention_period: Bewartermyn mediabuffer peers_api_enabled: Publyklik meitsjen fan ûntdekte servers yn de API @@ -311,7 +314,6 @@ fy: listable: Tastean dat dizze hashtag yn sykopdrachten en oanrekommandaasjes te sjen is name: Hashtag trendable: Goedkarre dat dizze hashtag ûnder trends te sjen is - usable: Tastean dat dizze hashtag yn berjochten brûkt wurde mei user: role: Rol time_zone: Tiidsône diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index 3597544ce3a..15ea3094b2f 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -2,47 +2,239 @@ ga: simple_form: hints: + account: + discoverable: Seans go mbeidh do phostálacha poiblí agus do phróifíl le feiceáil nó molta i réimsí éagsúla de Mastodon agus is féidir do phróifíl a mholadh d’úsáideoirí eile. + display_name: D'ainm iomlán nó d'ainm spraoi. + fields: Do leathanach baile, forainmneacha, aois, rud ar bith is mian leat. + indexable: Seans go mbeidh do phostálacha poiblí le feiceáil sna torthaí cuardaigh ar Mastodon. Seans go mbeidh daoine a d’idirghníomhaigh le do phostálacha in ann iad a chuardach beag beann ar. + note: 'Is féidir leat @trá a dhéanamh ar dhaoine eile nó #hashtags.' + show_collections: Beidh daoine in ann brabhsáil trí do seo a leanas agus do leanúna. Feicfidh na daoine a leanann tú go leanann tú iad beag beann ar. + unlocked: Beidh daoine in ann tú a leanúint gan cead a iarraidh. Díthiceáil an dteastaíonn uait athbhreithniú a dhéanamh ar iarratais leantacha agus roghnaigh cé acu an nglacfaidh nó an diúltóidh tú do leantóirí nua. account_alias: acct: Sonraigh ainm@fearann don chuntas ar mhaith leat aistriú uaidh account_migration: acct: Sonraigh ainm@fearann don chuntas ar mhaith leat aistriú chuige + account_warning_preset: + text: Is féidir leat comhréir na bpost a úsáid, mar URLanna, hashtags agus lua + title: Roghnach. Níl sé le feiceáil ag an bhfaighteoir admin_account_action: + include_statuses: Feicfidh an t-úsáideoir cé na poist ba chúis leis an ngníomh modhnóireachta nó leis an rabhadh + send_email_notification: Gheobhaidh an t-úsáideoir míniú ar an méid a tharla lena chuntas + text_html: Roghnach. Is féidir leat comhréir phoist a úsáid. Is féidir leat réamhshocruithe rabhaidh a chur leis chun am a shábháil + type_html: Roghnaigh cad atá le déanamh le %{acct} types: disable: Cuir cosc ar an úsáideoir a chuntas a úsáid, ach ná scrios ná folaigh a bhfuil ann. + none: Bain úsáid as seo chun rabhadh a sheoladh chuig an úsáideoir, gan aon ghníomh eile a spreagadh. + sensitive: Iallach a chur ar cheangaltáin meán an úsáideora seo go léir a bheith íogair. + silence: Cosc a chur ar an úsáideoir ó bheith in ann postáil le hinfheictheacht phoiblí, a gcuid postálacha agus fógraí a cheilt ar dhaoine nach leanann iad. Dúnann sé gach tuairisc i gcoinne an chuntais seo. + suspend: Cosc ar aon idirghníomhaíocht ón gcuntas seo nó chuig an gcuntas seo agus scrios a bhfuil ann. Inchúlaithe laistigh de 30 lá. Dúnann sé gach tuairisc i gcoinne an chuntais seo. + warning_preset_id: Roghnach. Is féidir leat téacs saincheaptha a chur le deireadh an réamhshocraithe fós + announcement: + all_day: Nuair a dhéantar iad a sheiceáil, ní thaispeánfar ach dátaí an raon ama + ends_at: Roghnach. Beidh an fógra neamhfhoilsithe go huathoibríoch ag an am seo + scheduled_at: Fág bán chun an fógra a fhoilsiú láithreach + starts_at: Roghnach. I gcás go bhfuil d'fhógra ceangailte le raon ama ar leith + text: Is féidir leat comhréir phoist a úsáid. Tabhair aird ar an spás a ghlacfaidh an fógra ar scáileán an úsáideora + appeal: + text: Ní féidir leat achomharc a dhéanamh ach uair amháin ar stailc defaults: + autofollow: Leanfaidh daoine a chláraíonn tríd an gcuireadh thú go huathoibríoch + avatar: WEBP, PNG, GIF nó JPG. %{size} ar a mhéad. Íoslaghdófar é go %{dimensions}px + bot: Cuir in iúl do dhaoine eile go ndéanann an cuntas gníomhartha uathoibrithe den chuid is mó agus go mb’fhéidir nach ndéanfar monatóireacht air + context: Comhthéacs amháin nó comhthéacsanna iolracha inar cheart go mbeadh feidhm ag an scagaire + current_password: Chun críocha slándála cuir isteach pasfhocal an chuntais reatha + current_username: Le deimhniú, cuir isteach ainm úsáideora an chuntais reatha + digest: Seoltar é tar éis tréimhse fhada neamhghníomhaíochta amháin agus sa chás sin amháin go bhfuil aon teachtaireachtaí pearsanta faighte agat agus tú as láthair + email: Seolfar ríomhphost deimhnithe chugat + header: WEBP, PNG, GIF nó JPG. %{size} ar a mhéad. Íoslaghdófar é go %{dimensions}px + inbox_url: Cóipeáil an URL ó leathanach tosaigh an athsheachadáin is mian leat a úsáid + irreversible: Imeoidh postálacha scagtha go dochúlaithe, fiú má bhaintear an scagaire níos déanaí + locale: Teanga an chomhéadain úsáideora, r-phoist agus fógraí brú + password: Úsáid ar a laghad 8 gcarachtar + phrase: Déanfar é a mheaitseáil beag beann ar chásáil an téacs nó ar an ábhar atá ag tabhairt foláireamh do phostáil + scopes: Cé na APIanna a mbeidh cead ag an bhfeidhmchlár rochtain a fháil orthu. Má roghnaíonn tú raon feidhme barrleibhéil, ní gá duit cinn aonair a roghnú. + setting_aggregate_reblogs: Ná taispeáin treisithe nua do phoist a treisíodh le déanaí (ní dhéanann difear ach do threisithe nuafhaighte) + setting_always_send_emails: Go hiondúil ní sheolfar fógraí ríomhphoist agus tú ag úsáid Mastodon go gníomhach + setting_default_sensitive: Tá meáin íogair i bhfolach de réir réamhshocraithe agus is féidir iad a nochtadh le cliceáil + setting_display_media_default: Folaigh meáin atá marcáilte mar íogair setting_display_media_hide_all: Folaigh meáin i gcónaí setting_display_media_show_all: Taispeáin meáin i gcónaí + setting_use_blurhash: Tá grádáin bunaithe ar dhathanna na n-amharcanna ceilte ach cuireann siad salach ar aon mhionsonraí + setting_use_pending_items: Folaigh nuashonruithe amlíne taobh thiar de chlic seachas an fotha a scrollú go huathoibríoch + username: Is féidir leat litreacha, uimhreacha, agus béim a úsáid + whole_word: Nuair a bhíonn an eochairfhocal nó frása alfa-uimhriúil amháin, ní chuirfear i bhfeidhm é ach amháin má mheaitseálann sé an focal iomlán + domain_allow: + domain: Beidh an fearann ​​seo in ann sonraí a fháil ón bhfreastalaí seo agus déanfar sonraí a thagann isteach uaidh a phróiseáil agus a stóráil + email_domain_block: + domain: Is féidir gurb é seo an t-ainm fearainn a thaispeánann sa seoladh ríomhphoist nó sa taifead MX a úsáideann sé. Déanfar iad a sheiceáil nuair a chláraítear iad. + with_dns_records: Déanfar iarracht taifid DNS an fhearainn tugtha a réiteach agus cuirfear bac ar na torthaí freisin + featured_tag: + name: 'Seo cuid de na hashtags a d’úsáid tú le déanaí:' + filters: + action: Roghnaigh an gníomh ba cheart a dhéanamh nuair a mheaitseálann postáil an scagaire + actions: + hide: Cuir an t-ábhar scagtha i bhfolach go hiomlán, ag iompar amhail is nach raibh sé ann + warn: Folaigh an t-ábhar scagtha taobh thiar de rabhadh a luann teideal an scagaire + form_admin_settings: + activity_api_enabled: Áireamh na bpost a foilsíodh go háitiúil, úsáideoirí gníomhacha, agus clárúcháin nua i buicéid seachtainiúla + app_icon: WEBP, PNG, GIF nó JPG. Sáraíonn sé an deilbhín réamhshocraithe aipe ar ghléasanna soghluaiste le deilbhín saincheaptha. + backups_retention_period: Tá an cumas ag úsáideoirí cartlanna dá gcuid post a ghiniúint le híoslódáil níos déanaí. Nuair a bheidh luach dearfach socraithe, scriosfar na cartlanna seo go huathoibríoch ó do stór tar éis an líon sonraithe laethanta. + bootstrap_timeline_accounts: Cuirfear na cuntais seo ar bharr na moltaí a leanann úsáideoirí nua. + closed_registrations_message: Ar taispeáint nuair a dhúntar clárúcháin + content_cache_retention_period: Scriosfar gach postáil ó fhreastalaithe eile (lena n-áirítear treisithe agus freagraí) tar éis an líon sonraithe laethanta, gan aird ar aon idirghníomhaíocht úsáideora áitiúil leis na postálacha sin. Áirítear leis seo postálacha ina bhfuil úsáideoir áitiúil tar éis é a mharcáil mar leabharmharcanna nó mar cheanáin. Caillfear tagairtí príobháideacha idir úsáideoirí ó chásanna éagsúla freisin agus ní féidir iad a athchóiriú. Tá úsáid an tsocraithe seo beartaithe le haghaidh cásanna sainchuspóra agus sáraítear go leor ionchais úsáideoirí nuair a chuirtear i bhfeidhm é le haghaidh úsáid ghinearálta. + custom_css: Is féidir leat stíleanna saincheaptha a chur i bhfeidhm ar an leagan gréasáin de Mastodon. + favicon: WEBP, PNG, GIF nó JPG. Sáraíonn sé an favicon Mastodon réamhshocraithe le deilbhín saincheaptha. + mascot: Sáraíonn sé an léaráid san ardchomhéadan gréasáin. + media_cache_retention_period: Déantar comhaid meán ó phoist a dhéanann cianúsáideoirí a thaisceadh ar do fhreastalaí. Nuair a bheidh luach dearfach socraithe, scriosfar na meáin tar éis an líon sonraithe laethanta. Má iarrtar na sonraí meán tar éis é a scriosadh, déanfar é a ath-íoslódáil, má tá an t-ábhar foinse fós ar fáil. Mar gheall ar shrianta ar cé chomh minic is atá cártaí réamhamhairc ag vótaíocht do shuíomhanna tríú páirtí, moltar an luach seo a shocrú go 14 lá ar a laghad, nó ní dhéanfar cártaí réamhamhairc naisc a nuashonrú ar éileamh roimh an am sin. + peers_api_enabled: Liosta de na hainmneacha fearainn ar tháinig an freastalaí seo orthu sa choinbhleacht. Níl aon sonraí san áireamh anseo faoi cé acu an ndéanann tú cónascadh le freastalaí ar leith, díreach go bhfuil a fhios ag do fhreastalaí faoi. Úsáideann seirbhísí a bhailíonn staitisticí ar chónaidhm go ginearálta é seo. + profile_directory: Liostaíonn an t-eolaire próifíle na húsáideoirí go léir a roghnaigh isteach le bheith in-aimsithe. + require_invite_text: Nuair a bhíonn faomhadh láimhe ag teastáil le haghaidh clárúcháin, déan an "Cén fáth ar mhaith leat a bheith páirteach?" ionchur téacs éigeantach seachas roghnach + site_contact_email: Conas is féidir le daoine dul i dteagmháil leat le haghaidh fiosrúchán dlíthiúil nó tacaíochta. + site_contact_username: Conas is féidir le daoine dul i dteagmháil leat ar Mastodon. + site_extended_description: Aon fhaisnéis bhreise a d’fhéadfadh a bheith úsáideach do chuairteoirí agus d’úsáideoirí. Is féidir é a struchtúrú le comhréir Markdown. + site_short_description: Cur síos gairid chun cabhrú le do fhreastalaí a aithint go uathúil. Cé atá á rith, cé dó a bhfuil sé? + site_terms: Bain úsáid as do pholasaí príobháideachta féin nó fág bán é chun an réamhshocrú a úsáid. Is féidir é a struchtúrú le comhréir Markdown. + site_title: Conas is féidir le daoine tagairt a dhéanamh do do fhreastalaí seachas a ainm fearainn. + status_page_url: URL leathanach inar féidir le daoine stádas an fhreastalaí seo a fheiceáil le linn briseadh amach + theme: Téama a fheiceann cuairteoirí logáilte amach agus úsáideoirí nua. + thumbnail: Íomhá thart ar 2:1 ar taispeáint taobh le faisnéis do fhreastalaí. + timeline_preview: Beidh cuairteoirí logáilte amach in ann na postálacha poiblí is déanaí atá ar fáil ar an bhfreastalaí a bhrabhsáil. + trendable_by_default: Léim ar athbhreithniú láimhe ar ábhar treochta. Is féidir míreanna aonair a bhaint as treochtaí fós tar éis an fhíric. + trends: Léiríonn treochtaí cé na postálacha, hashtags agus scéalta nuachta atá ag tarraingt ar do fhreastalaí. + trends_as_landing_page: Taispeáin inneachar treochta d'úsáideoirí agus do chuairteoirí atá logáilte amach in ionad cur síos ar an bhfreastalaí seo. Éilíonn treochtaí a chumasú. + form_challenge: + current_password: Tá tú ag dul isteach i limistéar slán + imports: + data: Comhad CSV easpórtáilte ó fhreastalaí Mastodon eile + invite_request: + text: Cabhróidh sé seo linn d’iarratas a athbhreithniú + ip_block: + comment: Roghnach. Cuimhnigh cén fáth ar chuir tú an riail seo leis. + expires_in: Is acmhainn chríochta iad seoltaí IP, uaireanta roinntear iad agus is minic a athraíonn lámha. Ar an gcúis seo, ní mholtar bloic IP éiginnte. + ip: Cuir isteach seoladh IPv4 nó IPv6. Is féidir leat raonta iomlána a bhlocáil ag baint úsáide as an chomhréir CIDR. Bí cúramach gan tú féin a ghlasáil amach! + severities: + no_access: Cuir bac ar rochtain ar na hacmhainní go léir + sign_up_block: Ní bheidh clárú nua indéanta + sign_up_requires_approval: Beidh do cheadú ag teastáil le haghaidh clárúcháin nua + severity: Roghnaigh cad a tharlóidh le hiarratais ón IP seo + rule: + hint: Roghnach. Tabhair tuilleadh sonraí faoin riail + text: Déan cur síos ar riail nó riachtanas d'úsáideoirí ar an bhfreastalaí seo. Déan iarracht é a choinneáil gearr agus simplí + sessions: + otp: 'Cuir isteach an cód dhá fhachtóir ginte ag d''aip ghutháin nó úsáid ceann de do chóid athshlánaithe:' + webauthn: Más eochair USB atá ann déan cinnte é a chur isteach agus, más gá, tapáil í. + settings: + indexable: Seans go mbeidh do leathanach próifíle le feiceáil i dtorthaí cuardaigh ar Google, Bing agus eile. + show_application: Beidh tú in ann a fheiceáil i gcónaí cén aip a d’fhoilsigh do phostáil beag beann ar. + tag: + name: Ní féidir leat ach cásáil na litreacha a athrú, mar shampla, chun é a dhéanamh níos inléite + user: + chosen_languages: Nuair a dhéantar iad a sheiceáil, ní thaispeánfar ach postálacha i dteangacha roghnaithe in amlínte poiblí + role: Rialaíonn an ról na ceadanna atá ag an úsáideoir + user_role: + color: Dath le húsáid don ról ar fud an Chomhéadain, mar RGB i bhformáid heicsidheachúlach + highlighted: Déanann sé seo an ról le feiceáil go poiblí + name: Ainm poiblí an róil, má tá an ról socraithe le taispeáint mar shuaitheantas + permissions_as_keys: Beidh rochtain ag úsáideoirí a bhfuil an ról seo acu ar... + position: Cinneann ról níos airde réiteach coinbhleachta i gcásanna áirithe. Ní féidir gníomhartha áirithe a dhéanamh ach amháin ar róil a bhfuil tosaíocht níos ísle acu + webhook: + events: Roghnaigh imeachtaí le seoladh + template: Cum do phálasta JSON féin ag baint úsáide as idirshuíomh athróg. Fág bán le haghaidh JSON réamhshocraithe. + url: An áit a seolfar imeachtaí chuig labels: account: + discoverable: Próifíl gné agus postálacha in halgartaim fionnachtana fields: name: Lipéad + value: Ábhar + indexable: Cuir postálacha poiblí san áireamh sna torthaí cuardaigh + show_collections: Taispeáin seo a leanas agus leanúna ar phróifíl + unlocked: Glac le leantóirí nua go huathoibríoch + account_alias: + acct: Láimhseáil an seanchuntais + account_migration: + acct: Láimhseáil an chuntais nua account_warning_preset: + text: Téacs réamhshocraithe title: Teideal admin_account_action: + include_statuses: Cuir postálacha tuairiscithe san áireamh sa ríomhphost + send_email_notification: Cuir an t-úsáideoir ar an eolas trí ríomhphost text: Rabhadh saincheaptha + type: Gníomh types: disable: Reoigh none: Seol rabhadh + sensitive: Íogair silence: Teorannaigh suspend: Cuir ar fionraí + warning_preset_id: Bain úsáid as réamhshocrú rabhaidh announcement: + all_day: Imeacht uile-lae + ends_at: Deireadh an imeachta + scheduled_at: Foilsiú sceideal + starts_at: Tús na hócáide text: Fógra + appeal: + text: Mínigh cén fáth ar cheart an cinneadh seo a fhreaschur defaults: + autofollow: Tabhair cuireadh do chuntas a leanúint avatar: Abhatár + bot: Is cuntas uathoibrithe é seo + chosen_languages: Scag teangacha + confirm_new_password: Deimhnigh pasfhocal nua + confirm_password: Deimhnigh Pasfhocal + context: Comhthéacsanna a scagadh + current_password: Pasfhocal reatha data: Sonraí display_name: Ainm taispeána email: Seoladh ríomhphoist + expires_in: In éag tar éis + fields: Réimsí breise header: Ceanntásc + honeypot: "%{label} (ná líon isteach)" + inbox_url: URL an bhosca isteach sealaíochta + irreversible: Droim ar aghaidh in ionad bheith ag folaigh + locale: Teanga comhéadan + max_uses: Uaslíon úsáidí new_password: Pasfhocal nua note: Beathaisnéis + otp_attempt: Cód dhá-fhachtóir password: Pasfhocal + phrase: Eochairfhocal nó frása + setting_advanced_layout: Cumasaigh ardchomhéadan gréasáin + setting_aggregate_reblogs: Treisithe grúpa i línte ama + setting_always_send_emails: Seol fógraí ríomhphoist i gcónaí + setting_auto_play_gif: Gifs beoite go huathoibríoch a imirt + setting_boost_modal: Taispeáin dialóg deimhnithe roimh threisiú + setting_default_language: Teanga postála + setting_default_privacy: Postáil príobháideachta + setting_default_sensitive: Marcáil na meáin mar íogair i gcónaí + setting_delete_modal: Taispeáin dialóg deimhnithe sula scriostar postáil + setting_disable_hover_cards: Díchumasaigh réamhamharc próifíle ar ainlíon + setting_disable_swiping: Díchumasaigh gluaiseachtaí swiping + setting_display_media: Taispeáint meáin setting_display_media_default: Réamhshocrú setting_display_media_hide_all: Cuir uile i bhfolach setting_display_media_show_all: Taispeáin uile + setting_expand_spoilers: Méadaigh postálacha atá marcáilte le rabhaidh inneachair i gcónaí + setting_hide_network: Folaigh do ghraf sóisialta + setting_reduce_motion: Laghdú ar an tairiscint i beochan + setting_system_font_ui: Úsáid cló réamhshocraithe an chórais setting_theme: Téama suímh setting_trends: Taispeáin treochtaí an lae inniu + setting_unfollow_modal: Taispeáin dialóg deimhnithe sula ndíleanfaidh tú duine éigin + setting_use_blurhash: Taispeáin grádáin ildaite do mheáin fholaithe + setting_use_pending_items: Modh mall + severity: Déine + sign_in_token_attempt: Cód slándála title: Teideal + type: Cineál iompórtála username: Ainm úsáideora + username_or_email: Ainm Úsáideora nó Ríomhphost + whole_word: Focal ar fad + email_domain_block: + with_dns_records: Cuir taifid MX agus IPanna an fhearainn san áireamh featured_tag: name: Haischlib filters: @@ -50,27 +242,100 @@ ga: hide: Cuir i bhfolach go hiomlán warn: Cuir i bhfolach le rabhadh form_admin_settings: + activity_api_enabled: Foilsigh staitisticí comhiomlána faoi ghníomhaíocht úsáideoirí san API + app_icon: Deilbhín aip + backups_retention_period: Tréimhse choinneála cartlainne úsáideora + bootstrap_timeline_accounts: Mol na cuntais seo d'úsáideoirí nua i gcónaí + closed_registrations_message: Teachtaireacht saincheaptha nuair nach bhfuil sínithe suas ar fáil + content_cache_retention_period: Tréimhse choinneála inneachair cianda + custom_css: CSS saincheaptha + favicon: Favicon + mascot: Mascóg saincheaptha (oidhreacht) + media_cache_retention_period: Tréimhse choinneála taisce meán + peers_api_enabled: Foilsigh liosta de na freastalaithe aimsithe san API + profile_directory: Cumasaigh eolaire próifíle + registrations_mode: Cé atá in ann clárú + require_invite_text: A cheangal ar chúis a bheith páirteach + show_domain_blocks: Taispeáin bloic fearainn + show_domain_blocks_rationale: Taispeáin cén fáth ar cuireadh bac ar fhearann + site_contact_email: R-phost teagmhála + site_contact_username: Ainm úsáideora teagmhála site_extended_description: Cur síos fada site_short_description: Cur síos freastalaí site_terms: Polasaí príobháideachais site_title: Ainm freastalaí + status_page_url: URL an leathanaigh stádais + theme: Téama réamhshocraithe + thumbnail: Mionsamhail freastalaí + timeline_preview: Ceadaigh rochtain neamhdheimhnithe ar amlínte poiblí + trendable_by_default: Ceadaigh treochtaí gan athbhreithniú roimh ré + trends: Cumasaigh treochtaí + trends_as_landing_page: Úsáid treochtaí mar an leathanach tuirlingthe + interactions: + must_be_follower: Cuir bac ar fhógraí ó dhaoine nach leantóirí iad + must_be_following: Cuir bac ar fhógraí ó dhaoine nach leanann tú + must_be_following_dm: Cuir bac ar theachtaireachtaí díreacha ó dhaoine nach leanann tú invite: comment: Ráiteas + invite_request: + text: Cén fáth ar mhaith leat a bheith páirteach? ip_block: comment: Ráiteas ip: IP + severities: + no_access: Rochtain a bhlocáil + sign_up_block: Cuir bac ar chlárúcháin + sign_up_requires_approval: Teorainn le clárú severity: Riail notification_emails: + appeal: Déanann duine éigin achomharc i gcoinne chinneadh modhnóra + digest: Seol r-phoist achoimre + favourite: Is fearr le duine éigin do phostáil follow: Lean duine éigin tú + follow_request: D'iarr duine éigin tú a leanúint + mention: Luaigh duine éigin tú + pending_account: Ní mór athbhreithniú a dhéanamh ar chuntas nua reblog: Mhol duine éigin do phostáil + report: Tá tuairisc nua curtha isteach + software_updates: + all: Fógra a thabhairt ar gach nuashonrú + critical: Fógra a thabhairt ar nuashonruithe ríthábhachtacha amháin + label: Tá leagan nua Mastodon ar fáil + none: Ná cuir nuashonruithe ar an eolas choíche (ní mholtar é) + patch: Fógra ar nuashonruithe bugfix + trending_tag: Teastaíonn athbhreithniú ar threocht nua rule: + hint: Eolas breise text: Riail + settings: + indexable: Cuir leathanach próifíle san innill chuardaigh + show_application: Taispeáin cén aip ónar sheol tú postáil tag: + listable: Lig don hashchlib seo a bheith le feiceáil i gcuardach agus i moltaí name: Haischlib + trendable: Lig don haischlib seo a bheith le feiceáil faoi threochtaí + usable: Lig do phostálacha an hashchlib seo a úsáid go háitiúil user: role: Ról + time_zone: Crios ama user_role: + color: Dath suaitheantas + highlighted: Taispeáin ról mar shuaitheantas ar phróifílí úsáideora name: Ainm + permissions_as_keys: Ceadanna + position: Tosaíocht + webhook: + events: Imeachtaí cumasaithe + template: Teimpléad pá-ualach + url: URL críochphointe + 'no': Níl + not_recommended: Ní mholtar + overridden: Sáraithe recommended: Molta required: mark: "*" + text: ag teastáil + title: + sessions: + webauthn: Úsáid ceann de d'eochracha slándála chun síniú isteach + 'yes': Tá diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 8a36f73dc1d..4375feb492b 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -77,10 +77,15 @@ gd: warn: Falaich an t-susbaint chriathraichte air cùlaibh rabhaidh a dh’innseas tiotal na criathraige form_admin_settings: activity_api_enabled: Cunntasan nam postaichean a chaidh fhoillseachadh gu h-ionadail, nan cleachdaichean gnìomhach ’s nan clàraidhean ùra an am bucaidean seachdaineil + app_icon: WEBP, PNG, GIF no JPG. Tar-àithnidh seo ìomhaigheag bhunaiteach na h-aplacaid air uidheaman mobile le ìomhaigheag ghnàthaichte. + backups_retention_period: "’S urrainn do chleachdaichean tasg-lannan dhe na postaichean aca a gintinn airson an luchdadh a-nuas an uairsin. Nuair a bhios luach dearbh air, thèid na tasg-lannan a sguabadh às on stòras agad gu fèin-obrachail às dèidh an àireamh de làithean a shònraich thu." bootstrap_timeline_accounts: Thèid na cunntasan seo a phrìneachadh air bàrr nam molaidhean leantainn dhan luchd-cleachdaidh ùr. closed_registrations_message: Thèid seo a shealltainn nuair a bhios an clàradh dùinte + content_cache_retention_period: Thèid a h-uile post o fhrithealaiche sam bith eile (a’ gabhail a-staigh brosnachaidhean is freagairtean) a sguabadh às às dèidh na h-àireimh de làithean a shònraich thu ’s gun diù a chon air eadar-ghabhail ionadail air na postaichean ud. Gabhaidh seo a-steach na postaichean a chuir cleachdaiche ionadail ris na h-annsachdan aca no comharran-lìn riutha. Thèid iomraidhean prìobhaideach eadar cleachdaichean o ionstansan diofraichte air chall cuideachd agus cha ghabh an aiseag idir. Tha an roghainn seo do dh’ionstansan sònraichte a-mhàin agus briseadh e dùilean an luchd-cleachdaidh nuair a rachadh a chleachdadh gu coitcheann. custom_css: "’S urrainn dhut stoidhlean gnàthaichte a chur an sàs air an tionndadh-lìn de Mhastodon." + favicon: WEBP, PNG, GIF no JPG. Tar-àithnidh seo favicon bunaiteach Mhastodon le ìomhaigheag ghnàthaichte. mascot: Tar-àithnidh seo an sgead-dhealbh san eadar-aghaidh-lìn adhartach. + media_cache_retention_period: Thèid faidhlichean meadhain o phostaichean a chruthaich cleachdaichean cèine a chur ri tasgadan an fhrithealaiche agad. Nuair a shuidhicheas tu seo air luach dearbh, thèid na meadhanan a sguabadh às às dèidh na h-àireimh de làithean a shònraich thu. Ma tha dàta meadhain ga iarraidh às dèidh a sguabaidh às, thèid a luchdadh a-nuas a-rithist ma tha susbaint an tùis ri fhaighinn fhathast. Ri linn cuingeachaidhean air mar a cheasnaicheas cairtean ro-sheallaidh làraichean threas-phàrtaidhean, mholamaid gun suidhich thu an luach seo air 14 làithean ar a char as giorra no cha dèid an ùrachadh nuair a thèid an iarraidh ron àm sin. peers_api_enabled: Seo liosta de dh’ainmean àrainne ris an do thachair am frithealaiche seo sa cho-shaoghal. Chan eil dàta sam bith ’ga ghabhail a-staigh an-seo mu a bheil thu co-naisgte ri frithealaiche sònraichte gus nach eil ach dìreach gu bheil am frithealaiche agad eòlach air. Thèid seo a chleachdadh le seirbheisean a chruinnicheas stadastaireachd air a’ cho-nasgadh san fharsaingeachd. profile_directory: Seallaidh eòlaire nam pròifil liosta dhen luchd-cleachdaidh a dh’aontaich gun gabh an rùrachadh. require_invite_text: Nuair a bhios aontachadh a làimh riatanach dhan chlàradh, dèan an raon teacsa “Carson a bu mhiann leat ballrachd fhaighinn?” riatanach seach roghainneil @@ -206,6 +211,7 @@ gd: setting_default_privacy: Prìobhaideachd postaidh setting_default_sensitive: Cuir comharra ri meadhanan an-còmhnaidh gu bheil iad frionasach setting_delete_modal: Seall còmhradh dearbhaidh mus sguab thu às post + setting_disable_hover_cards: Na ro-sheall pròifil nuair a dh’fhanas mi os a cionn setting_disable_swiping: Cuir gluasadan grad-shlaighdidh à comas setting_display_media: Sealltainn nam meadhanan setting_display_media_default: Bun-roghainn @@ -237,10 +243,13 @@ gd: warn: Falaich le rabhadh form_admin_settings: activity_api_enabled: Foillsich agragaid dhen stadastaireachd mu ghnìomhachd nan cleachdaichean san API + app_icon: Ìomhaigheag na h-aplacaid backups_retention_period: Ùine glèidhidh aig tasg-lannan an luchd-cleachdaidh bootstrap_timeline_accounts: Mol na cunntasan seo do chleachdaichean ùra an-còmhnaidh closed_registrations_message: Teachdaireachd ghnàthaichte nuair nach eil clàradh ri fhaighinn + content_cache_retention_period: Ùine glèidhidh aig susbaint chèin custom_css: CSS gnàthaichte + favicon: Favicon mascot: Suaichnean gnàthaichte (dìleabach) media_cache_retention_period: Ùine glèidhidh aig tasgadan nam meadhanan peers_api_enabled: Foillsich liosta nam frithealaichean a chaidh a rùrachadh san API @@ -305,7 +314,7 @@ gd: listable: Faodaidh an taga hais seo nochdadh ann an toraidhean luirg ’s am measg nam molaidhean name: Taga hais trendable: Faodaidh an taga hais seo nochdadh am measg nan treandaichean - usable: Faodaidh postaichean an taga hais seo a chleachdadh + usable: Faodaidh postaichean an taga hais seo a chleachdadh gu h-ionadail user: role: Dreuchd time_zone: Roinn-tìde diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 0411c45bc16..a7074af0f9b 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -211,6 +211,7 @@ gl: setting_default_privacy: Privacidade da publicación setting_default_sensitive: Marcar sempre multimedia como sensible setting_delete_modal: Solicitar confirmación antes de eliminar unha publicación + setting_disable_hover_cards: Desactivar vista previa do perfil ao poñerse enriba setting_disable_swiping: Desactivar opcións de desprazamento setting_display_media: Mostrar multimedia setting_display_media_default: Por defecto @@ -242,11 +243,13 @@ gl: warn: Agochar tras un aviso form_admin_settings: activity_api_enabled: Publicar na API estatísticas agregadas acerca da actividade das usuarias + app_icon: Icona da app 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 de contido remoto custom_css: CSS personalizado + favicon: Favicon mascot: Mascota propia (herdado) media_cache_retention_period: Período de retención da caché multimedia peers_api_enabled: Publicar na API unha lista dos servidores descubertos @@ -255,7 +258,7 @@ gl: require_invite_text: Pedir unha razón para unirse show_domain_blocks: Amosar dominios bloqueados show_domain_blocks_rationale: Explicar porque están bloqueados os dominios - site_contact_email: Email de contacto + site_contact_email: Correo de contacto site_contact_username: Nome do contacto site_extended_description: Descrición ampla site_short_description: Descrición do servidor @@ -311,7 +314,7 @@ gl: listable: Permitir que este cancelo apareza en buscas e no directorio de perfil name: Cancelo trendable: Permitir que este cancelo apareza en tendencias - usable: Permitir que as publicacións utilicen este cancelo + usable: Permitir que as publicacións usen este cancelo localmente user: role: Rol time_zone: Fuso horario diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 65c6f6110fc..95a334bb3a5 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -211,6 +211,7 @@ he: setting_default_privacy: פרטיות ההודעות setting_default_sensitive: תמיד לתת סימון "רגיש" למדיה setting_delete_modal: להראות תיבת אישור לפני מחיקת חיצרוץ + setting_disable_hover_cards: כבה הצצה מקדימה לפרופיל בעת מעבר עכבר מעליו setting_disable_swiping: ביטול החלקת-צד setting_display_media: תצוגת מדיה setting_display_media_default: ברירת מחדל @@ -242,11 +243,13 @@ he: warn: הסתרה עם אזהרה form_admin_settings: activity_api_enabled: פרסום סטטיסטיקות מקובצות עבור פעילות משתמשים באמצעות מנשק התוכנה + app_icon: אייקון יישומון backups_retention_period: תקופת השמירה של ארכיון המשתמש bootstrap_timeline_accounts: המלצה על חשבונות אלה למשתמשים חדשים closed_registrations_message: הודעה מיוחדת כשההרשמה לא מאופשרת content_cache_retention_period: תקופת השמירה על תוכן חיצוני custom_css: CSS בהתאמה אישית + favicon: סמל מועדפים (Favicon) mascot: סמל השרת (ישן) media_cache_retention_period: תקופת שמירת מטמון מדיה peers_api_enabled: פרסם רשימה של שרתים שנתגלו באמצעות ה-API @@ -311,7 +314,7 @@ he: listable: הרשה/י לתגית זו להופיע בחיפושים והצעות name: תגית trendable: הרשה/י לתגית זו להופיע תחת נושאים חמים - usable: הרשה/י להודעות להכיל תגית זו + usable: הרשה/י להודעות להכיל תגית זו באופן מקומי user: role: תפקיד time_zone: אזור זמן diff --git a/config/locales/simple_form.hi.yml b/config/locales/simple_form.hi.yml index d758a5b5357..51c0868cdbb 100644 --- a/config/locales/simple_form.hi.yml +++ b/config/locales/simple_form.hi.yml @@ -1 +1,6 @@ +--- hi: + simple_form: + labels: + tag: + usable: पोस्ट को ये हैशटैग स्थानीय उपयोग करने दें diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 6ccca2bc847..512e13d3af8 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -211,6 +211,7 @@ hu: setting_default_privacy: Bejegyzések láthatósága setting_default_sensitive: Minden médiafájl megjelölése kényesként setting_delete_modal: Megerősítés kérése bejegyzés törlése előtt + setting_disable_hover_cards: Profilelőnézet letiltása föléhúzás esetén setting_disable_swiping: Elhúzás művelet kikapcsolása setting_display_media: Média megjelenítése setting_display_media_default: Alapértelmezés @@ -242,11 +243,13 @@ hu: warn: Elrejtés figyelmeztetéssel form_admin_settings: activity_api_enabled: Összesített statisztikák közzététele az API-ban a felhasználók aktivitásáról + app_icon: Alkalmazásikon 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: Távoli tartalmak megtartási időszaka custom_css: Egyéni CSS + favicon: Könyvjelzőikon mascot: Egyéni kabala (örökölt) media_cache_retention_period: Média-gyorsítótár megtartási időszaka peers_api_enabled: Felfedezett kiszolgálók listájának közzététele az API-ban @@ -311,7 +314,7 @@ hu: listable: A hashtag megjelenhet a profiladatbázisban name: Hashtag trendable: A hashtag megjelenhet a felkapottak között - usable: Bejegyzések használhatják ezt a hashtaget + usable: A helyi bejegyzések használhatják ezt a hashtaget user: role: Szerep time_zone: Időzóna diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index 0525f2d6fc4..36185f73e42 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -187,7 +187,6 @@ hy: listable: Թոյլատրել, որ այս պիտակը յայտնուի որոնումների եւ հաշուի մատեանում name: Պիտակ trendable: Թոյլատրել, որ այս պիտակը յայտնուի թրենդներում - usable: Թոյլատրել գրառումներին օգտագործել այս պիտակը 'no': Ոչ recommended: Խորհուրդ է տրվում required: diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 2d0af3001ef..00226aee90b 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -242,11 +242,13 @@ ia: warn: Celar con un advertimento form_admin_settings: activity_api_enabled: Publicar statisticas aggregate re le activitate de usator in le API + app_icon: Icone de app backups_retention_period: Periodo de retention del archivo de usator bootstrap_timeline_accounts: Recommenda sempre iste contos a nove usatores closed_registrations_message: Message personalisate quando le inscriptiones non es disponibile content_cache_retention_period: Periodo de retention del contento remote custom_css: CSS personalisate + favicon: Favicon mascot: Personalisar le mascotte (hereditage) media_cache_retention_period: Periodo de retention del cache multimedial peers_api_enabled: Publicar le lista de servitores discoperite in le API @@ -311,7 +313,6 @@ ia: listable: Permitter a iste hashtag apparer in le recercas e suggestiones name: Hashtag trendable: Permitter a iste hashtag de sub tendentias - usable: Permitter al messages usar iste hashtag user: role: Rolo time_zone: Fuso horari diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 1f493435e87..99f4372cc15 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -268,7 +268,6 @@ id: listable: Izinkan tagar ini muncul di penelusuran dan di direktori profil name: Tagar trendable: Izinkan tagar ini muncul di bawah tren - usable: Izinkan toot memakai tagar ini user: role: Peran user_role: diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index 2b995e7efa5..0828139a430 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -311,7 +311,6 @@ ie: listable: Permisser que ti hashtag apari in serchas e suggestiones name: Hashtag trendable: Permisse que ti-ci hashtag apari sub tendenties - usable: Permisser que postas usa ti hashtag user: role: Rol time_zone: Zone temporal diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 81f298249ee..4de7475b2e8 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -300,7 +300,6 @@ io: listable: Permisez ca hashtago aparar en trovaji e sugestaji name: Hashtago trendable: Permisez ca hashtago aparar che tendenci - usable: Permisez posti uzar ca hashtago user: role: Rolo time_zone: Klokozono diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 044e24deb03..a7e2083f4d8 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -211,6 +211,7 @@ is: setting_default_privacy: Gagnaleynd færslna setting_default_sensitive: Alltaf merkja myndefni sem viðkvæmt setting_delete_modal: Birta staðfestingarglugga áður en færslu er eytt + setting_disable_hover_cards: Gera óvirka forskoðun notandasniðs við yfirsvif setting_disable_swiping: Gera strokuhreyfingar óvirkar setting_display_media: Birting myndefnis setting_display_media_default: Sjálfgefið @@ -242,11 +243,13 @@ is: warn: Fela með aðvörun form_admin_settings: activity_api_enabled: Birta samantektartölfræði um virkni notanda í API-kerfisviðmótinu + app_icon: Táknmynd forrits 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ímabil sem á að geyma fjartengt efni custom_css: Sérsniðið CSS + favicon: Auðkennismynd mascot: Sérsniðið gæludýr (eldra) media_cache_retention_period: Tímalengd sem myndefni haldið peers_api_enabled: Birta lista yfir uppgötvaða netþjóna í API-kerfisviðmótinu @@ -311,7 +314,7 @@ is: listable: Leyfa þessu myllumerki að birtast í leitum og í persónusniðamöppunni name: Myllumerki trendable: Leyfa þessu myllumerki að birtast undir vinsælu efni - usable: Leyfa færslum að nota þetta myllumerki + usable: Leyfa færslum að nota þetta myllumerki staðvært user: role: Hlutverk time_zone: Tímabelti diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index f5624344b9a..ea175e2bf56 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -211,6 +211,7 @@ it: setting_default_privacy: Privacy dei post setting_default_sensitive: Segna sempre i media come sensibili setting_delete_modal: Mostra dialogo di conferma prima di eliminare un post + setting_disable_hover_cards: Disabilita l'anteprima del profilo al passaggio del mouse setting_disable_swiping: Disabilita i movimenti di scorrimento setting_display_media: Visualizzazione dei media setting_display_media_default: Predefinita @@ -242,11 +243,13 @@ it: warn: Nascondi con avviso form_admin_settings: activity_api_enabled: Pubblica le statistiche aggregate sull'attività degli utenti nell'API + app_icon: Icona app 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 ritenzione del contenuto remoto custom_css: Personalizza CSS + favicon: Favicon mascot: Personalizza mascotte (legacy) media_cache_retention_period: Periodo di conservazione della cache multimediale peers_api_enabled: Pubblica l'elenco dei server scoperti nell'API @@ -311,7 +314,7 @@ it: listable: Permetti a questo hashtag di apparire nella directory dei profili name: Hashtag trendable: Permetti a questo hashtag di apparire nelle tendenze - usable: Permetti ai post di usare questo hashtag + usable: Permetti ai post di utilizzare questo hashtag localmente user: role: Ruolo time_zone: Fuso orario diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index c0698c3f7a7..7f4a9daeff8 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -81,7 +81,7 @@ ja: 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インターフェースのイラストを上書きします。 @@ -211,6 +211,7 @@ ja: setting_default_privacy: 投稿の公開範囲 setting_default_sensitive: メディアを常に閲覧注意としてマークする setting_delete_modal: 投稿を削除する前に確認ダイアログを表示する + setting_disable_hover_cards: マウスオーバーでプロフィールをポップアップしない setting_disable_swiping: スワイプでの切り替えを無効にする setting_display_media: メディアの表示 setting_display_media_default: 標準 @@ -242,11 +243,13 @@ ja: warn: 警告付きで隠す form_admin_settings: activity_api_enabled: APIでユーザーアクティビティに関する集計統計を公開する + app_icon: アプリアイコン backups_retention_period: ユーザーアーカイブの保持期間 bootstrap_timeline_accounts: おすすめユーザーに常に表示するアカウント closed_registrations_message: アカウント作成を停止している時のカスタムメッセージ content_cache_retention_period: リモートコンテンツの保存期間 custom_css: カスタムCSS + favicon: ブックマークアイコン mascot: カスタムマスコット(レガシー) media_cache_retention_period: メディアキャッシュの保持期間 peers_api_enabled: 発見したサーバーのリストをAPIで公開する @@ -311,7 +314,6 @@ ja: listable: 検索とディレクトリへの使用を許可する name: ハッシュタグ trendable: トレンドへの表示を許可する - usable: 投稿への使用を許可する user: role: ロール time_zone: タイムゾーン diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index 9461f16cd54..b4c0e0032bb 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -5,19 +5,20 @@ kab: account: display_name: Isem-ik·im ummid neɣ isem-ik·im n uqeṣṣer. fields: Asebter-ik·im agejdan, imqimen, leεmer, ayen tebɣiḍ. + note: 'Tzemreḍ ad d-@tbedreḍ imdanen niḍen neɣ #ihacṭagen.' account_alias: acct: Sekcem isem n umseqdac@domain n umiḍan s wansa itebγiḍ ad gujjeḍ account_migration: acct: Sekcem isem n umseqdac@taγult n umiḍan anida itebγiḍ ad gujjeḍ admin_account_action: - send_email_notification: Amseqdac ad t-id-yewweḍ usefhem γef wayen yeḍran akked umiḍan-is + send_email_notification: Amseqdac ad t-id-yewweḍ usefhem ɣef wayen yeḍran akked umiḍan-is type_html: Fren d acu ara txedmeḍ s %{acct} defaults: autofollow: Imdanen ara ijerrden s usnebgi-inek, ad k-ḍefṛen s wudem awurman bot: Smekti-d wiyaḍ dakken amiḍan-a ixeddem s wudem amezwer tigawin tiwurmanin yernu ur yezmir ara ad yettwaɛass email: Ad n-teṭṭfeḍ imayl i usentem irreversible: Tisuffaɣ i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat - locale: Tutlayt n ugrudem, imaylen d tilγa + locale: Tutlayt n ugrudem, imaylen d walɣuten yettudemren password: Seqdec ma drus 8 n yisekkilen setting_display_media_default: Ffer teywalt yettwacreḍ d tanafrit setting_display_media_hide_all: Ffer yal tikkelt akk taywalt @@ -27,6 +28,8 @@ kab: name: 'Ha-t-an kra seg ihacṭagen i tesseqdaceḍ ussan-a ineggura maḍi :' imports: data: Afaylu CSV id yusan seg uqeddac-nniḍen n Maṣṭudun + invite_request: + text: Aya ad aɣ-iɛiwen ad nessenqed tuttra-k·m ip_block: comment: D afrayan. Cfu ɣef wayɣer i terniḍ alugen-a. severities: @@ -36,6 +39,8 @@ kab: fields: name: Tabzimt value: Agbur + account_alias: + acct: Tansa n umiḍan aqbur account_migration: acct: Tansa n umiḍan amaynut account_warning_preset: @@ -51,6 +56,7 @@ kab: suspend: Ḥbes di leεḍil announcement: ends_at: Tagara n tedyant + starts_at: Tazwara n tedyant text: Alɣu defaults: autofollow: Ɛreḍ-it-id ad yeḍfer amiḍan-ik·im @@ -59,20 +65,28 @@ kab: chosen_languages: Sizdeg tutlayin confirm_new_password: Sentem awal uffir amaynut confirm_password: Sentem awal uffir + context: Isatalen n umsizdeg current_password: Awal uffir n tura data: Isefka display_name: Isem ara d-yettwaskanen email: Tansa imayl expires_in: Ad yemmet + fields: Urtiyen niḍen header: Ixef + honeypot: "%{label} (ur tettaččar ara)" + inbox_url: URL n tbewwaḍt n urmas yettwacudden + irreversible: Kkes deg wadeg n tuffra locale: Tutlayt n wegrudem max_uses: Amḍan afellay n iseqdacen new_password: Awal uffir amaynut note: Tameddurt otp_attempt: Tangalt n snat n tarayin password: Awal uffir + phrase: Awal n tsarut neɣ tafyirt + setting_advanced_layout: Rmed agrudem n web leqqayen setting_default_language: Tutlayt n tira setting_default_privacy: Tabaḍnit n tira + setting_display_media: Askanay n imidyaten setting_display_media_default: Akk-a kan setting_display_media_hide_all: Ffer-iten akk setting_display_media_show_all: Sken-iten-id akk @@ -88,11 +102,18 @@ kab: featured_tag: name: Ahacṭag form_admin_settings: + custom_css: CSS udmawan + profile_directory: Rmed akaram n imaγnuten + site_contact_email: Imayl n unermas + site_short_description: Aglam n uqeddac site_terms: Tasertit tabaḍnit site_title: Isem n uqeddac + status_page_url: URL n uusebter n waddaden + theme: Asentel amezwer + thumbnail: Tanfult n uqeddac interactions: - must_be_follower: Ssewḥel ilɣa sɣur wid akked tid ur yellin ara d imeḍfaren-ik·im - must_be_following: Ssewḥel ilɣa sɣur wid akked tid ur tettḍafareḍ ara + must_be_follower: Ssewḥel alɣuten sɣur wid akked tid ur yellin ara d imeḍfaren-ik·im + must_be_following: Ssewḥel alɣuten sɣur wid akked tid ur tettḍafareḍ ara must_be_following_dm: Sewḥel iznan usriden sɣur wid akked tid ur tettḍafareḍ ara invite: comment: Awennit @@ -109,18 +130,25 @@ kab: follow: Yeḍfer-ik·im-id walbɛaḍ follow_request: Ma yella win i d-yessutren ad k·em-yeḍfer mention: Yuder-ik·em-id walbɛaḍ + pending_account: Amiḍan amaynut yesran asenqed reblog: Yella win yesselhan adda-dik·im + report: Aneqis amaynut yettwazen rule: hint: Isallen-nniḍen text: Alugen tag: name: Ahacṭag user: + role: Tamlilt time_zone: Tamnaḍt tasragant user_role: name: Isem permissions_as_keys: Tisirag + webhook: + events: Tidyanin turmidin 'no': Ala + not_recommended: Ur yettuwelleh ara + overridden: Yeččur recommended: Yettuwelleh required: mark: "*" diff --git a/config/locales/simple_form.kk.yml b/config/locales/simple_form.kk.yml index 5c1854d1886..e6ba46fdf87 100644 --- a/config/locales/simple_form.kk.yml +++ b/config/locales/simple_form.kk.yml @@ -86,7 +86,6 @@ kk: listable: Бұл хештегті барлық жерде көрсетуге рұқсат бер name: Хэштег trendable: Хештегті трендтерде көрсетуге рұқсат бер - usable: Бұл хештегті қолдануға рұқсат бер 'no': Жоқ recommended: Рекоменделген required: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 54d36eafe03..5fa3aee6c4c 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -211,6 +211,7 @@ ko: setting_default_privacy: 게시물 프라이버시 setting_default_sensitive: 미디어를 언제나 민감한 콘텐츠로 설정 setting_delete_modal: 게시물 삭제 전 확인 창을 표시 + setting_disable_hover_cards: 호버시 프로필 미리보기를 비활성화 setting_disable_swiping: 스와이프 모션 비활성화 setting_display_media: 미디어 표시 setting_display_media_default: 기본 @@ -242,11 +243,13 @@ ko: warn: 경고와 함께 숨기기 form_admin_settings: activity_api_enabled: API에 유저 활동에 대한 통계 발행 + app_icon: 앱 아이콘 backups_retention_period: 사용자 아카이브 유지 기한 bootstrap_timeline_accounts: 새로운 사용자들에게 추천할 계정들 closed_registrations_message: 가입이 불가능 할 때의 사용자 지정 메시지 content_cache_retention_period: 리모트 콘텐츠 보유 기간 custom_css: 사용자 정의 CSS + favicon: 파비콘 mascot: 사용자 정의 마스코트 (legacy) media_cache_retention_period: 미디어 캐시 유지 기한 peers_api_enabled: API에 발견 된 서버들의 목록 발행 @@ -311,7 +314,7 @@ ko: listable: 이 해시태그가 검색과 추천에 보여지도록 허용 name: 해시태그 trendable: 이 해시태그가 유행에 나타날 수 있도록 허용 - usable: 이 해시태그를 게시물에 사용 가능하도록 허용 + usable: 이 해시태그를 로컬 게시물에서 사용 가능하도록 허용 user: role: 역할 time_zone: 시간대 diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index 0c4f8721313..96e047d9371 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -267,7 +267,6 @@ ku: listable: Bihêle ku ev hashtag werê xuyakirin di lêgerîn û pêşniyaran de name: Hashtag trendable: Bihêle ku ev hashtag werê xuyakirin di bin rojevê de - usable: Bihêle ku şandî ev hashtag bi kar bînin user: role: Rol user_role: diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index cef58e46016..f7093ff73be 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -241,6 +241,7 @@ lad: bootstrap_timeline_accounts: Rekomenda siempre estos kuentos a muevos utilizadores closed_registrations_message: Mesaj personalizado kuando las enrejistrasyones no estan desponivles custom_css: CSS personalizado + favicon: Ikona de favoritos mascot: Maskota personalizada (legado) media_cache_retention_period: Periodo de retensyon de kashe multimedia peers_api_enabled: Publika lista de sirvidores diskuviertos en la API @@ -305,7 +306,6 @@ lad: listable: Permite ke esta etiketa apareska en bushkedas i sujestyones name: Etiketa trendable: Permite ke esta etiketa apareska en trendes - usable: Permite ke publikasyones uzen esta etiketa user: role: Rolo time_zone: Zona de tiempo diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index feec37ae003..02f03609381 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -137,6 +137,7 @@ lt: 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_hover_cards: Išjungti profilio peržiūrą užvedus setting_disable_swiping: Išjungti perbraukimo judėjimus setting_display_media: Medijos rodymas setting_display_media_hide_all: Slėpti viską @@ -164,9 +165,11 @@ lt: warn: Slėpti su įspėjimu form_admin_settings: activity_api_enabled: Skelbti suvestinį statistiką apie naudotojų veiklą per API + app_icon: Programėlės piktograma bootstrap_timeline_accounts: Visada rekomenduoti šias paskyras naujiems naudotojams content_cache_retention_period: Nuotolinio turinio saugojimo laikotarpis custom_css: Pasirinktinis CSS + favicon: Svetainės piktograma mascot: Pasirinktinis talismanas (pasenęs) registrations_mode: Kas gali užsiregistruoti require_invite_text: Reikalauti priežasties prisijungti @@ -205,7 +208,7 @@ lt: listable: Leisti šį saitažodį rodyti paieškose ir pasiūlymuose name: Saitažodis trendable: Leisti šį saitažodį rodyti pagal trendus - usable: Leisti įrašams naudoti šį saitažodį + usable: Leisti įrašams naudoti šį saitažodį vietoje user: role: Vaidmuo time_zone: Laiko juosta diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 017acd0a53c..eedae998e40 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -309,7 +309,6 @@ lv: listable: Atļaut šim tēmturim parādīties meklējumos un ieteikumos name: Tēmturis trendable: Atļaut šim tēmturim parādīties zem tendencēm - usable: Atļaut lietot ziņās šo tēmturi user: role: Loma time_zone: Laika josla diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml index ae375149eb5..da00e2dc2b0 100644 --- a/config/locales/simple_form.ms.yml +++ b/config/locales/simple_form.ms.yml @@ -301,7 +301,6 @@ ms: listable: Benarkan hashtag ini muncul dalam carian dan cadangan name: Tanda pagar trendable: Benarkan hashtag ini muncul di bawah aliran - usable: Benarkan siaran untuk menggunakan tanda pagar ini user: role: Peranan time_zone: Zon masa diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index 20c862ab27a..a44635edd4b 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -301,7 +301,6 @@ my: listable: ရှာဖွေမှုများနှင့် အကြံပြုချက်များတွင် ဤ hashtag ပေါ်လာစေရန် ခွင့်ပြုပါ name: Hashtag trendable: ခေတ်စားနေသောအကြောင်းအရာများအောက်တွင် ဤ hashtag ပေါ်လာစေရန် ခွင့်ပြုပါ - usable: ပို့စ်များကို ဤ hashtag သုံးခွင့်ပြုပါ user: role: အခန်းကဏ္ဍ time_zone: အချိန်ဇုန် diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 2271d7037ef..91ee9bc3e3b 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -211,6 +211,7 @@ nl: setting_default_privacy: Zichtbaarheid van nieuwe berichten setting_default_sensitive: Media altijd als gevoelig markeren setting_delete_modal: Vraag voor het verwijderen van een bericht een bevestiging + setting_disable_hover_cards: Profielvoorbeelden door eroverheen te zweven uitschakelen setting_disable_swiping: Swipebewegingen uitschakelen setting_display_media: Mediaweergave setting_display_media_default: Standaard @@ -242,11 +243,13 @@ nl: warn: Met een waarschuwing verbergen form_admin_settings: activity_api_enabled: Statistieken over gebruikersactiviteit via de API publiceren + app_icon: App-pictogram 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 voor externe inhoud custom_css: Aangepaste CSS + favicon: Favicon mascot: Aangepaste mascotte (legacy) media_cache_retention_period: Bewaartermijn mediacache peers_api_enabled: Lijst van bekende servers via de API publiceren @@ -311,7 +314,7 @@ nl: listable: Toestaan dat deze hashtag in zoekopdrachten en aanbevelingen te zien valt name: Hashtag trendable: Goedkeuren dat deze hashtag onder trends te zien valt - usable: Toestaan dat deze hashtag in berichten gebruikt mag worden + usable: Berichten toestaan deze hashtag lokaal te gebruiken user: role: Rol time_zone: Tijdzone diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index a200e1206e3..f7551cc313e 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -211,6 +211,7 @@ nn: setting_default_privacy: Privatliv setting_default_sensitive: Merk alltid media som nærtakande setting_delete_modal: Vis stadfesting før du slettar eit tut + setting_disable_hover_cards: Skru av profilvising når peikaren er over setting_disable_swiping: Skru av sveipebevegelser setting_display_media: Medievisning setting_display_media_default: Standard @@ -242,11 +243,13 @@ nn: warn: Gøym med ei åtvaring form_admin_settings: activity_api_enabled: Legg ut samla statistikk om brukaraktiviteten i APIet + app_icon: App-ikon 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: Oppbevaringstid for eksternt innhald custom_css: Egendefinert CSS + favicon: Favorittikon mascot: Eigendefinert maskot (eldre funksjon) media_cache_retention_period: Oppbevaringsperiode for mediebuffer peers_api_enabled: Legg ut ei liste over oppdaga tenarar i APIet @@ -311,7 +314,6 @@ nn: listable: Tillat denne emneknaggen å synast i søk og i profilmappa name: Emneknagg trendable: Tillat denne emneknaggen til å synast under trendar - usable: Gje tut lov til å nytta denne emneknaggen user: role: Rolle time_zone: Tidssone diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index de3788aa42d..82de0adb7b5 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -303,7 +303,6 @@ listable: Tillat denne emneknaggen å vises i søk og på profilmappen name: Emneknagg trendable: Tillat denne emneknaggen til å vises under trender - usable: Tillat innlegg å bruke denne emneknaggen user: role: Rolle time_zone: Tidssone diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index ba9c260e472..05b0508a515 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -217,7 +217,6 @@ oc: listable: Permetre a aquesta etiqueta d’aparéisser a las recèrcas e a l’annuari de perfils name: Etiqueta trendable: Permetre a aquesta etiqueta d’aparéisser a las tendéncias - usable: Permetre als tuts d’utilizar aquesta etiqueta user: role: Ròtle user_role: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 9d82384af9d..1a9051b9510 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -211,6 +211,7 @@ pl: setting_default_privacy: Widoczność wpisów setting_default_sensitive: Zawsze oznaczaj zawartość multimedialną jako wrażliwą setting_delete_modal: Pytaj o potwierdzenie przed usunięciem wpisu + setting_disable_hover_cards: Wyłącz podgląd profilu po najechaniu setting_disable_swiping: Wyłącz ruchy przesuwania setting_display_media: Wyświetlanie zawartości multimedialnej setting_display_media_default: Domyślne @@ -242,11 +243,13 @@ pl: warn: Ukryj z ostrzeżeniem form_admin_settings: activity_api_enabled: Publikuj zagregowane statystyki dotyczące aktywności użytkownika w API + app_icon: Ikona aplikacji 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 zachowywania zdalnych treści custom_css: Niestandardowy CSS + favicon: Favicon mascot: Własna ikona media_cache_retention_period: Okres przechowywania pamięci podręcznej peers_api_enabled: Opublikuj listę odkrytych serwerów w API @@ -311,7 +314,7 @@ pl: listable: Pozwól, aby ten hashtag pojawiał się w wynikach wyszukiwania i katalogu profilów name: Hasztag trendable: Pozwól na wyświetlanie tego hashtagu w „Na czasie” - usable: Pozwól na umieszczanie tego hashtagu we wpisach + usable: Pozwól na umieszczanie tego hashtagu w lokalnych wpisach user: role: Rola time_zone: Strefa czasowa diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 77a0d8cd6f5..fc3c09cf1d0 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -311,7 +311,6 @@ pt-BR: listable: Permitir que esta hashtag apareça em pesquisas e sugestões name: Hashtag trendable: Permitir que esta hashtag fique em alta - usable: Permitir que toots usem esta hashtag user: role: Cargo time_zone: Fuso horário diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 7fcbb210c5b..a76076a5cbc 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -211,6 +211,7 @@ pt-PT: setting_default_privacy: Privacidade da publicação setting_default_sensitive: Marcar sempre os media como problemáticos setting_delete_modal: Solicitar confirmação antes de eliminar uma publicação + setting_disable_hover_cards: Desativar visualização de perfil ao passar o cursor setting_disable_swiping: Desativar os movimentos de deslize setting_display_media: Visualização de media setting_display_media_default: Pré-definição @@ -242,11 +243,13 @@ pt-PT: warn: Ocultar com um aviso form_admin_settings: activity_api_enabled: Publicar estatísticas agregadas sobre a atividade dos utilizadores na API + app_icon: Ícone da aplicação 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údos remotos custom_css: CSS personalizado + favicon: Ícone de favoritos mascot: Mascote personalizada (legado) media_cache_retention_period: Período de retenção de ficheiros de media em cache peers_api_enabled: Publicar lista de servidores descobertos na API @@ -311,7 +314,7 @@ pt-PT: listable: Permitir que esta etiqueta apareça em pesquisas e no diretório de perfis name: Etiqueta trendable: Permitir que esta etiqueta apareça em alta - usable: Permitir que as publicações usem esta etiqueta + usable: Permitir que as publicações usem esta hashtag localmente user: role: Cargo time_zone: Fuso horário diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index dfb44c77453..458638ddec1 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -2,6 +2,12 @@ ro: simple_form: hints: + account: + discoverable: Este posibil ca postările și profilul tău să fie recomandate în diferite zone ale Mastodon, iar profilul tău ar poate fi sugerat altor utilizatori. + fields: Pagina ta principală, pronumele tale, vârsta, sau orice îți dorești. + indexable: Postările tale publice pot apărea în rezultatele căutărilor pe Mastodon. Persoanele care au interacționat cu postările tale vor putea să le caute oricând. + note: 'Poți @menționa alte persoane sau #hashtag-uri.' + unlocked: Alte persoane vă vor putea urmări fără a solicita aprobare. Debifați dacă doriți să revizuiți cererile și să alegeți dacă doriți să acceptați sau să respingeți noii urmăritori. account_alias: acct: Specificați numele de utilizator@domeniu al contului de la care doriți să treceți account_migration: @@ -23,12 +29,14 @@ ro: text: Poți folosi sintaxa de postare. Te rugăm să fii atent la spațiul pe care anunțul îl va ocupa pe ecranul utilizatorului defaults: autofollow: Persoanele care se înregistrează datorită invitației tale te vor urmări automat + avatar: WEBP, PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px bot: Acest cont performează în cea mai mare parte acțiuni automate și nu poate fi monitorizat context: Contextele în care filtrul trebuie aplicat current_password: În scopuri de securitate, vă rugăm să introduceţi parola contului curent current_username: Pentru a confirma, vă rugăm să introduceţi numele de utilizator al contului curent digest: Este trimis doar după o lungă perioadă de inactivitate și numai dacă primești mesaje personale în perioada de absență email: Vei primi un e-mail de confirmare + header: WEBP, PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px inbox_url: Copiază adresa URL de pe prima pagină a reului pe care vrei să îl utilizezi irreversible: Postările sortate vor dispărea ireversibil, chiar dacă filtrul este ulterior șters locale: Limba interfaței de utilizator, e-mailurile si notificările push @@ -36,17 +44,27 @@ ro: phrase: Vor fi potrivite indiferent de textul din casetă sau advertismentul unei postări scopes: La care API-uri aplicația are nevoie de acces. Dacă selectezi un scop principal nu mai e nevoie să selectezi fiecare sub-scop al acestuia. setting_aggregate_reblogs: Nu afișa impulsurile noi pentru postările care au fost deja recent impulsionate (afectează doar noile impulsuri primite) + setting_always_send_emails: În mod normal, notificările prin e-mail nu vor fi trimise când utilizați în mod activ Mastodon setting_default_sensitive: Fișierele media sensibile sunt ascunse implicit și pot fi dezvăluite cu un clic setting_display_media_default: Ascunde conținutul media marcat ca sensibil (NSFW) setting_display_media_hide_all: Întotdeauna ascunde tot conținutul media setting_display_media_show_all: Întotdeauna afișează conținutul media marcat ca sensibil setting_use_blurhash: Gradienții sunt bazați pe culorile vizualelor ascunse, dar ofuscă orice detalii setting_use_pending_items: Ascunde actualizările cronologice din spatele unui click în loc de a derula automat fluxul + username: Poți folosi litere, numere sau liniuțe de subliniere whole_word: Când fraza sau cuvântul este doar alfanumeric, acesta se aplică doar dacă există o potrivire completă domain_allow: domain: Acest domeniu va putea prelua date de pe acest server și datele primite de la el vor fi procesate și stocate email_domain_block: + domain: Acesta poate fi numele de domeniu care apare în adresa de e-mail sau în înregistrarea MX pe care o utilizează. Acestea vor fi verificate la înscriere. with_dns_records: Se va face o încercare de a rezolva înregistrările DNS ale domeniului dat și rezultatele vor fi de asemenea afișate pe lista neagră + featured_tag: + name: 'Iată câteva dintre hashtag-urile pe care le-ai folosit cel mai recent:' + filters: + action: Alege ce acţiune va fi efectuată atunci când o postare corespunde filtrului + actions: + hide: Ascunde complet conținutul filtrat, ca și cum nu ar exista + warn: Ascunde conținutul filtrat în spatele unui avertisment care menționează titlul filtrului form_challenge: current_password: Ați intrat într-o zonă securizată imports: @@ -159,7 +177,6 @@ ro: tag: listable: Permite acestui hashtag să apară în căutări și în directorul de profil trendable: Permite acestui hashtag să apară sub tendințe - usable: Permite postărilor să folosească acest hashtag 'no': Nu recommended: Recomandat required: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index a050b5a529f..c2effdcb883 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -203,6 +203,7 @@ ru: setting_default_privacy: Видимость постов setting_default_sensitive: Всегда отмечать медиафайлы как «деликатного характера» setting_delete_modal: Всегда спрашивать перед удалении поста + setting_disable_hover_cards: Отключить предпросмотр профиля при наведении setting_disable_swiping: Отключить анимацию смахивания setting_display_media: Отображение медиафайлов setting_display_media_default: По умолчанию @@ -301,7 +302,6 @@ ru: listable: Разрешить показ хэштега в поиске или в каталоге профилей name: Хэштег trendable: Разрешить показ хэштега в трендах - usable: Разрешить использовать этот хэштег в постах user: role: Роль time_zone: Часовой пояс diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml index 792619e6c7b..fc531039507 100644 --- a/config/locales/simple_form.sc.yml +++ b/config/locales/simple_form.sc.yml @@ -52,7 +52,7 @@ sc: email_domain_block: with_dns_records: S'at a fàghere unu tentativu de risòlvere is registros DNS de su domìniu e fintzas is risultados ant a èssere blocados form_admin_settings: - activity_api_enabled: Nùmeru de tuts publicados in locale, utentes ativos e registros noos in perìodos chidajolos + activity_api_enabled: Nùmeru de publicatziones in locale, utentes ativos e registros noos in perìodos chidajolos form_challenge: current_password: Ses intrende in un'àrea segura imports: @@ -191,12 +191,12 @@ sc: severity: Règula notification_emails: digest: Imbia lìteras eletrònicas de resumu - favourite: Una persone at postu s'istadu tuo in is preferidos suos + favourite: Una persone at postu sa publicatzione tua in is preferidos follow: Una persone t'at incumentzadu a sighire follow_request: Una persone at pedidu de ti sighire mention: Una persone t'at mentovadu pending_account: Unu contu nou tenet bisòngiu de una revisione - reblog: Una persone at cumpartzidu s'istadu tuo + reblog: Una persone at potentziadu sa publicatzione tua report: Imbiu de un'informe nou rule: text: Règula @@ -204,7 +204,6 @@ sc: listable: Permite a custa eticheta de apàrrere in is chircas e in sa cartella de is profilos name: Eticheta trendable: Permite a custa eticheta de apàrrere in is tendèntzias - usable: Permite a is tuts de impreare custa eticheta user_role: name: Nòmine permissions_as_keys: Permissos diff --git a/config/locales/simple_form.sco.yml b/config/locales/simple_form.sco.yml index f9dc4ba2911..9fc6fd57dbb 100644 --- a/config/locales/simple_form.sco.yml +++ b/config/locales/simple_form.sco.yml @@ -265,7 +265,6 @@ sco: listable: Alloo this hashtag tae appear in seirches an suggestions name: Hashtag trendable: Alloo this hashtag fir tae appear unner trends - usable: Alloo posts fir tae uise this hashtag user: role: Role user_role: diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index a81ba27bb91..41658c76ac2 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -207,7 +207,6 @@ si: listable: මෙම හැෂ් ටැගය සෙවීම් සහ යෝජනා වල දිස් වීමට ඉඩ දෙන්න name: හෑෂ් ටැගය trendable: මෙම හැෂ් ටැගය ප්‍රවණතා යටතේ දිස් වීමට ඉඩ දෙන්න - usable: ලිපි සඳහා මෙම පූරක අනන්‍යනය භාවිතයට ඉඩදෙන්න user: role: භූමිකාව time_zone: වේලා කලාපය diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 71bd25d6dfe..fa15a6e3f7f 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -165,7 +165,6 @@ sk: listable: Povoľ zobrazovanie tohto haštagu v návrhoch vyhľadávaní name: Haštag trendable: Povoľ zobrazovanie tohto haštagu medzi trendujúcimi - usable: Povoľ používanie tohto haštagu v príspevkoch 'no': Nie recommended: Odporúčané required: diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 96b36307a57..b558a62fc83 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -211,6 +211,7 @@ sl: setting_default_privacy: Zasebnost objave setting_default_sensitive: Vedno označi medije kot občutljive setting_delete_modal: Pred brisanjem objave prikaži okno za pritrditev + setting_disable_hover_cards: Onemogoči predogled profila pod kazalcem setting_disable_swiping: Onemogoči poteze drsanja setting_display_media: Prikaz medijev setting_display_media_default: Privzeto @@ -242,11 +243,13 @@ sl: warn: Skrij z opozorilom form_admin_settings: activity_api_enabled: Objavi združeno statistiko o dejavnosti uporabnikov v API-ju + app_icon: Ikona programa 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 hranjenja vsebine z ostalih strežnikov custom_css: CSS po meri + favicon: Ikona spletne strani mascot: Maskota po meri (opuščeno) media_cache_retention_period: Obdobje hrambe predpomnilnika predstavnosti peers_api_enabled: Objavi seznam odkritih strežnikov v API-ju @@ -311,7 +314,6 @@ sl: listable: Dovoli, da se ta ključnik pojavi v iskanjih in predlogih name: Ključnik trendable: Dovoli, da se ta ključnik pojavi med trendi - usable: Dovoli, da objave uporabljajo ta ključnik user: role: Vloga time_zone: Časovni pas diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index c3c3920962d..8b00751d982 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -211,6 +211,7 @@ sq: setting_default_privacy: Privatësi postimi setting_default_sensitive: Mediave vëru përherë shenjë si rezervat setting_delete_modal: Shfaq dialog ripohimi përpara fshirjes së një mesazhi + setting_disable_hover_cards: Çaktivizo paraparje profili, kur i kalohet kursori përsipër setting_disable_swiping: Çaktivizo lëvizje me fërkim setting_display_media: Shfaqje mediash setting_display_media_default: Parazgjedhje @@ -242,11 +243,13 @@ sq: warn: Fshihe me një sinjalizim form_admin_settings: activity_api_enabled: Publikoni te API statistika përmbledhëse rreth veprimtarisë së përdoruesve + app_icon: Ikonë aplikacioni 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 të largët custom_css: CSS Vetjake + favicon: Favikonë mascot: Simbol vetjak (e dikurshme) media_cache_retention_period: Periudhë mbajtjeje lënde media peers_api_enabled: Publiko te API listë shërbyesish të zbuluar @@ -311,7 +314,7 @@ sq: listable: Lejoje këtë hashtag të shfaqet në kërkime dhe në drejtori profilesh name: Hashtag trendable: Lejoje këtë hashtag të shfaqet në prirje - usable: Lejoji mesazhet të përdorin këtë hashtag + usable: Lejoji postimet të përdorin lokalisht këtë hashtag user: role: Rol time_zone: Zonë kohore diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 710f81e84fd..e163de2f80a 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -211,6 +211,7 @@ sr-Latn: setting_default_privacy: Privatnost objava setting_default_sensitive: Uvek označi multimediju kao osetljivu setting_delete_modal: Prikaži dijalog za potvrdu pre brisanja objave + setting_disable_hover_cards: Onemogući pregled profila prelaskom kursora setting_disable_swiping: Onemogući pokrete prevlačenja setting_display_media: Prikaz medija setting_display_media_default: Podrazumevano @@ -242,11 +243,13 @@ sr-Latn: warn: Sakrij uz upozorenje form_admin_settings: activity_api_enabled: Objavi prikupljenu statistiku o korisničkoj aktivnosti u API + app_icon: Ikonica aplikacije 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 zadržavanja udaljenog sadržaja custom_css: Prilagođeni CSS + favicon: Favikon mascot: Prilagođena maskota (nasleđe) media_cache_retention_period: Period čuvanja keša medija peers_api_enabled: Objavite listu otkrivenih servera u API @@ -311,7 +314,6 @@ sr-Latn: listable: Dozvoli da se ova heš oznaka pojavljuje u pretragama i predlozima name: Heš oznaka trendable: Dozvoli da se ova heš oznaka pojavi u okviru trendova - usable: Dozvoli objavama da koriste ovu heš oznaku user: role: Uloga time_zone: Vremenska zona diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index c5fbc9185a5..d7142390c91 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -211,6 +211,7 @@ sr: setting_default_privacy: Приватност објава setting_default_sensitive: Увек означи мултимедију као осетљиву setting_delete_modal: Прикажи дијалог за потврду пре брисања објаве + setting_disable_hover_cards: Онемогући преглед профила преласком курсора setting_disable_swiping: Онемогући покрете превлачења setting_display_media: Приказ медија setting_display_media_default: Подразумевано @@ -242,11 +243,13 @@ sr: warn: Сакриј уз упозорење form_admin_settings: activity_api_enabled: Објави прикупљену статистику о корисничкој активности у API + app_icon: Иконица апликације backups_retention_period: Период чувања корисничке архиве bootstrap_timeline_accounts: Увек препоручи ове налоге новим корисницима closed_registrations_message: Прилагођена порука када пријаве нису могуће content_cache_retention_period: Период задржавања удаљеног садржаја custom_css: Прилагођени CSS + favicon: Фавикон mascot: Прилагођена маскота (наслеђе) media_cache_retention_period: Период чувања кеша медија peers_api_enabled: Објавите листу откривених сервера у API @@ -311,7 +314,6 @@ sr: listable: Дозволи да се ова хеш ознака појављује у претрагама и предлозима name: Хеш ознака trendable: Дозволи да се ова хеш ознака појави у оквиру трендова - usable: Дозволи објавама да користе ову хеш ознаку user: role: Улога time_zone: Временска зона diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 11d142a2bd6..b0b974d7421 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -211,6 +211,7 @@ sv: setting_default_privacy: Inläggsintegritet setting_default_sensitive: Markera alltid media som känsligt setting_delete_modal: Visa bekräftelsedialog innan radering av inlägg + setting_disable_hover_cards: Inaktivera profilförhandsgranskning vid hovring setting_disable_swiping: Inaktivera svepande rörelser setting_display_media: Mediavisning setting_display_media_default: Standard @@ -242,11 +243,13 @@ sv: warn: Dölj med en varning form_admin_settings: activity_api_enabled: Publicera aggregerad statistik om användaraktivitet i API:et + app_icon: Appikon 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: Förvaringsperiod för fjärrinnehåll custom_css: Anpassad CSS + favicon: Favicon mascot: Anpassad maskot (tekniskt arv) media_cache_retention_period: Tid för bibehållande av mediecache peers_api_enabled: Publicera lista över upptäckta servrar i API:et @@ -311,7 +314,6 @@ sv: listable: Tillåt denna hashtagg att visas i sökningar och förslag name: Hashtagg trendable: Tillåt denna hashtagg att visas under trender - usable: Tillåt inlägg att använda denna hashtagg user: role: Roll time_zone: Tidszon diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 0d9a88bc380..387f74e7420 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -83,7 +83,7 @@ th: closed_registrations_message: แสดงเมื่อมีการปิดการลงทะเบียน content_cache_retention_period: จะลบโพสต์ทั้งหมดจากเซิร์ฟเวอร์อื่น ๆ (รวมถึงการดันและการตอบกลับ) หลังจากจำนวนวันที่ระบุ โดยไม่คำนึงถึงการโต้ตอบใด ๆ ของผู้ใช้ในเซิร์ฟเวอร์กับโพสต์เหล่านั้น สิ่งนี้รวมถึงโพสต์ที่ผู้ใช้ในเซิร์ฟเวอร์ได้ทำเครื่องหมายโพสต์ว่าเป็นที่คั่นหน้าหรือรายการโปรด การกล่าวถึงแบบส่วนตัวระหว่างผู้ใช้จากอินสแตนซ์ที่แตกต่างกันจะหายไปและไม่สามารถคืนค่าได้เช่นกัน การใช้การตั้งค่านี้มีไว้สำหรับอินสแตนซ์ที่มีวัตถุประสงค์พิเศษและทำลายความคาดหวังของผู้ใช้จำนวนมากเมื่อนำไปใช้สำหรับการใช้งานที่มีวัตถุประสงค์ทั่วไป custom_css: คุณสามารถนำไปใช้ลักษณะที่กำหนดเองใน Mastodon รุ่นเว็บ - favicon: WEBP, PNG, GIF หรือ JPG เขียนทับ Favicon ของ Mastodon เริ่มต้นด้วยไอคอนที่กำหนดเอง + favicon: WEBP, PNG, GIF หรือ JPG เขียนทับไอคอนเว็บของ Mastodon เริ่มต้นด้วยไอคอนที่กำหนดเอง mascot: เขียนทับภาพประกอบในส่วนติดต่อเว็บขั้นสูง media_cache_retention_period: จะแคชไฟล์สื่อจากโพสต์ที่สร้างโดยผู้ใช้ระยะไกลในเซิร์ฟเวอร์ของคุณ เมื่อตั้งเป็นค่าบวก จะลบสื่อหลังจากจำนวนวันที่ระบุ หากมีการขอข้อมูลสื่อหลังจากมีการลบสื่อ จะดาวน์โหลดสื่อใหม่ หากเนื้อหาต้นฉบับยังคงใช้งานได้ เนื่องจากข้อจำกัดเกี่ยวกับความถี่ที่บัตรตัวอย่างลิงก์สำรวจไซต์จากบุคคลที่สาม ขอแนะนำให้ตั้งค่านี้เป็นอย่างน้อย 14 วัน มิฉะนั้นจะไม่อัปเดตบัตรตัวอย่างลิงก์ตามความต้องการก่อนเวลานั้น peers_api_enabled: รายการชื่อโดเมนที่เซิร์ฟเวอร์นี้พบในจักรวาลสหพันธ์ ไม่มีข้อมูลรวมอยู่ที่นี่เกี่ยวกับว่าคุณติดต่อกับเซิร์ฟเวอร์ที่กำหนดหรือไม่ เพียงแค่ว่าเซิร์ฟเวอร์ของคุณทราบเกี่ยวกับเซิร์ฟเวอร์ที่กำหนด มีการใช้สิ่งนี้โดยบริการที่เก็บรวบรวมสถิติในการติดต่อกับภายนอกในความหมายทั่วไป @@ -211,6 +211,7 @@ th: setting_default_privacy: ความเป็นส่วนตัวของการโพสต์ setting_default_sensitive: ทำเครื่องหมายสื่อว่าละเอียดอ่อนเสมอ setting_delete_modal: แสดงกล่องโต้ตอบการยืนยันก่อนลบโพสต์ + setting_disable_hover_cards: ปิดใช้งานตัวอย่างโปรไฟล์เมื่อวางเมาส์เหนือ setting_disable_swiping: ปิดใช้งานการเคลื่อนไหวในการปัด setting_display_media: การแสดงสื่อ setting_display_media_default: ค่าเริ่มต้น @@ -242,11 +243,13 @@ th: warn: ซ่อนด้วยคำเตือน form_admin_settings: activity_api_enabled: เผยแพร่สถิติรวมเกี่ยวกับกิจกรรมผู้ใช้ใน API + app_icon: ไอคอนแอป backups_retention_period: ระยะเวลาการเก็บรักษาการเก็บถาวรผู้ใช้ bootstrap_timeline_accounts: แนะนำบัญชีเหล่านี้ให้กับผู้ใช้ใหม่เสมอ closed_registrations_message: ข้อความที่กำหนดเองเมื่อการลงทะเบียนไม่พร้อมใช้งาน content_cache_retention_period: ระยะเวลาการเก็บรักษาเนื้อหาระยะไกล custom_css: CSS ที่กำหนดเอง + favicon: ไอคอนเว็บ mascot: มาสคอตที่กำหนดเอง (ดั้งเดิม) media_cache_retention_period: ระยะเวลาการเก็บรักษาแคชสื่อ peers_api_enabled: เผยแพร่รายการเซิร์ฟเวอร์ที่ค้นพบใน API @@ -311,7 +314,6 @@ th: listable: อนุญาตให้แฮชแท็กนี้ปรากฏในการค้นหาและข้อเสนอแนะ name: แฮชแท็ก trendable: อนุญาตให้แฮชแท็กนี้ปรากฏภายใต้แนวโน้ม - usable: อนุญาตให้โพสต์ใช้แฮชแท็กนี้ user: role: บทบาท time_zone: โซนเวลา diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 697417a5415..b07a79d3ebc 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -211,6 +211,7 @@ tr: setting_default_privacy: Gönderi gizliliği setting_default_sensitive: Medyayı her zaman hassas olarak işaretle setting_delete_modal: Bir gönderiyi silmeden önce onay iletişim kutusu göster + setting_disable_hover_cards: Üstüne geldiğinde profil önizlemesini devre dışı bırak setting_disable_swiping: Kaydırma hareketlerini devre dışı bırak setting_display_media: Medya görüntüleme setting_display_media_default: Varsayılan @@ -242,11 +243,13 @@ tr: warn: Uyarıyla gizle form_admin_settings: activity_api_enabled: API'deki kullanıcı etkinliği hakkında toplu istatistikler yayınlayın + app_icon: Uygulama simgesi 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: Uzak içerik saklama süresi custom_css: Özel CSS + favicon: Yer imi simgesi mascot: Özel maskot (eski) media_cache_retention_period: Medya önbelleği saklama süresi peers_api_enabled: API'de keşfedilen sunucuların listesini yayınla @@ -311,7 +314,7 @@ tr: listable: Bu etiketin aramalarda ve profil dizininde görünmesine izin ver name: Etiket trendable: Bu etiketin gündem altında görünmesine izin ver - usable: Gönderilerin bu etiketi kullanmasına izin ver + usable: Gönderilerin yerelde bu etiketi kullanmasına izin ver user: role: Rol time_zone: Zaman dilimi diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 11337f2f61f..7d7f0fc7657 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -77,13 +77,13 @@ uk: warn: Сховати відфільтрований вміст за попередженням, у якому вказано заголовок фільтра form_admin_settings: activity_api_enabled: Кількість локальних опублікованих дописів, активних і нових користувачів у тижневих розрізах - app_icon: WEBP, PNG, GIF або JPG. Замінює іконку програми за замовчуванням на мобільних пристроях на власну іконку. + app_icon: WEBP, PNG, GIF або JPG. Замінює типову піктограму застосунку на мобільних пристроях на власну. backups_retention_period: Користувачі мають можливість створювати архіви своїх дописів, щоб завантажити їх пізніше. Якщо встановлено додатне значення, ці архіви будуть автоматично видалені з вашого сховища через вказану кількість днів. bootstrap_timeline_accounts: Ці облікові записи будуть закріплені в топі пропозицій для нових користувачів. closed_registrations_message: Показується, коли реєстрація закрита content_cache_retention_period: Усі дописи з інших серверів (включно з коментарями та відповідями) будуть видалені через певну кількість днів, незважаючи на будь-яку локальну взаємодію користувачів з цими дописами. Сюди входять дописи, які локальний користувач позначив як закладки або вибране. Приватні згадки між користувачами з різних інстанцій також будуть втрачені і не підлягатимуть відновленню. Використання цього параметра призначено для екземплярів спеціального призначення і порушує багато очікувань користувачів, якщо його застосовано для загального використання. custom_css: Ви можете застосувати користувацькі стилі у вебверсії Mastodon. - favicon: WEBP, PNG, GIF або JPG. Замінює стандартну піктограму Mastodon на власну піктограму. + favicon: WEBP, PNG, GIF або JPG. Замінює стандартну піктограму Mastodon на власну. mascot: Змінює ілюстрацію в розширеному вебінтерфейсі. media_cache_retention_period: Медіафайли з дописів віддалених користувачів кешуються на вашому сервері. Якщо встановлено додатне значення, медіа буде видалено через вказану кількість днів. Якщо медіа-дані будуть запитані після видалення, вони будуть завантажені повторно, якщо вихідний вміст все ще доступний. Через обмеження на частоту опитування карток попереднього перегляду посилань на сторонніх сайтах, рекомендується встановити це значення не менше 14 днів, інакше картки попереднього перегляду посилань не будуть оновлюватися на вимогу раніше цього часу. peers_api_enabled: Список доменів імен цього сервера з'явився у федівсесвіті. Сюди не входять дані чи ви пов'язані федерацією з цим сервером, а лише відомості, що вашому серверу відомо про нього. Його використовують служби, які збирають загальну статистику про федерації. @@ -211,6 +211,7 @@ uk: setting_default_privacy: Видимість дописів setting_default_sensitive: Позначати медіа делікатними setting_delete_modal: Показувати діалог підтвердження під час видалення допису + setting_disable_hover_cards: Вимкнути попередній перегляд профілю при наведенні setting_disable_swiping: Вимкнути рух посування setting_display_media: Показ медіа setting_display_media_default: За промовчанням @@ -242,11 +243,13 @@ uk: warn: Сховати за попередженням form_admin_settings: activity_api_enabled: Публікація агрегованої статистики про активність користувачів + app_icon: Піктограма застосунку backups_retention_period: Період утримання архіву користувача bootstrap_timeline_accounts: Завжди рекомендувати новим користувачам ці облікові записи closed_registrations_message: Показуване повідомлення, якщо реєстрація недоступна content_cache_retention_period: Період збереження віддаленого вмісту custom_css: Користувацький CSS + favicon: Піктограма сайту mascot: Користувацький символ (застарілий) media_cache_retention_period: Період збереження кешу медіа peers_api_enabled: Опублікувати список знайдених серверів у API @@ -311,7 +314,6 @@ uk: listable: Дозволити появу цього хештеґа у каталозі пошуку і пропозицій name: Хештеґ trendable: Дозволити появу цього хештеґа у списку популярних хештеґів - usable: Дозволити дописам використовувати цей хештег user: role: Роль time_zone: Часовий пояс diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index e5063e61122..7954bb1e6ff 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -211,6 +211,7 @@ vi: setting_default_privacy: Kiểu đăng setting_default_sensitive: Đánh dấu media nhạy cảm setting_delete_modal: Hỏi trước khi xóa tút + setting_disable_hover_cards: Tắt thẻ xem trước hồ sơ setting_disable_swiping: Không dùng chuyển động vuốt setting_display_media: Media nhạy cảm setting_display_media_default: Mặc định @@ -242,11 +243,13 @@ vi: warn: Ẩn kèm theo cảnh báo form_admin_settings: activity_api_enabled: Công khai số liệu thống kê tổng hợp về hoạt động của người dùng trong API + app_icon: Biểu tượng ứng dụng 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: Khoảng thời gian lưu giữ nội dung máy chủ khác custom_css: Tùy chỉnh CSS + favicon: Favicon mascot: Tùy chỉnh linh vật (kế thừa) media_cache_retention_period: Thời hạn lưu trữ cache media peers_api_enabled: Công khai danh sách các máy chủ được phát hiện trong API @@ -311,7 +314,7 @@ vi: listable: Cho phép xuất hiện trong tìm kiếm và đề xuất name: Hashtag trendable: Cho phép hashtag này lên xu hướng - usable: Cho phép dùng trong tút + usable: Cho phép dùng hashtag này khi soạn tút user: role: Vai trò time_zone: Múi giờ diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 6058cc00cff..d059adf0e6b 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -211,6 +211,7 @@ zh-CN: setting_default_privacy: 嘟文默认可见范围 setting_default_sensitive: 始终标记媒体为敏感内容 setting_delete_modal: 在删除嘟文前询问我 + setting_disable_hover_cards: 禁用悬停资料预览 setting_disable_swiping: 禁用滑动动作 setting_display_media: 媒体显示 setting_display_media_default: 默认 @@ -242,11 +243,13 @@ zh-CN: warn: 隐藏时显示警告信息 form_admin_settings: activity_api_enabled: 在 API 中发布有关用户活动的汇总统计数据 + app_icon: 应用图标 backups_retention_period: 用户存档保留期 bootstrap_timeline_accounts: 推荐新用户关注以下账号 closed_registrations_message: 在关闭注册时显示的自定义消息 content_cache_retention_period: 外站内容保留期 custom_css: 自定义 CSS + favicon: Favicon mascot: 自定义吉祥物(旧) media_cache_retention_period: 媒体缓存保留期 peers_api_enabled: 在API中公开的已知实例的服务器的列表 @@ -311,7 +314,7 @@ zh-CN: listable: 允许这个话题标签在用户目录中显示 name: 话题标签 trendable: 允许在热门下显示此话题 - usable: 允许嘟文使用此话题标签 + usable: 允许本站嘟文使用此话题标签 user: role: 角色 time_zone: 时区 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 0e2ee81db7f..6a7cd5a2471 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -309,7 +309,6 @@ zh-HK: listable: 允許此主題標籤在搜尋及個人檔案目錄中顯示 name: 主題標籤 trendable: 允許此主題標籤在趨勢下顯示 - usable: 允許文章使用此主題標籤 user: role: 角色 time_zone: 時區 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index b7a67c6a6fb..15ccaf8a177 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -24,7 +24,7 @@ zh-TW: type_html: 設定要使用 %{acct} 做的事 types: disable: 禁止該使用者使用他們的帳號,但是不刪除或隱藏他們的內容。 - none: 使用這個寄送警告給該使用者,而不進行其他動作。 + none: 使用這個寄送警告至該使用者,而不進行其他動作。 sensitive: 強制標記此使用者所有多媒體附加檔案為敏感內容。 silence: 禁止該使用者發公開嘟文,從無跟隨他們的帳號中隱藏嘟文與通知。關閉所有對此帳號之檢舉報告。 suspend: 禁止所有對該帳號任何互動,並且刪除其內容。三十天內可以撤銷此動作。關閉所有對此帳號之檢舉報告。 @@ -34,7 +34,7 @@ zh-TW: ends_at: 可選的。公告會於該時間點自動取消發布 scheduled_at: 空白則立即發布公告 starts_at: 可選的。使公告於特定時間範圍內顯示 - text: 您可以使用嘟文語法,但請小心別讓公告太鴨霸而佔據使用者的整個版面。 + text: 您可以使用嘟文語法,但請小心別使公告太鴨霸而佔據使用者的整個版面。 appeal: text: 您只能對警示提出一次申訴 defaults: @@ -47,7 +47,7 @@ zh-TW: digest: 僅於您長時間未登入且於未登入期間收到私訊時傳送 email: 您將收到一封確認電子郵件 header: 支援 WEBP、PNG、GIF 或 JPG 圖片格式,檔案最大為 %{size}。將等比例縮減至 %{dimensions} 像素 - inbox_url: 從您想要使用的中繼首頁複製網址 + inbox_url: 自您想要使用的中繼首頁複製網址 irreversible: 已過濾的嘟文將會不可逆地消失,即便之後移除過濾器也一樣 locale: 使用者介面、電子郵件與推播通知的語言 password: 使用至少 8 個字元 @@ -92,7 +92,7 @@ zh-TW: site_contact_email: 其他人如何聯繫您關於法律或支援之諮詢。 site_contact_username: 其他人如何於 Mastodon 上聯繫您。 site_extended_description: 任何其他可能對訪客或使用者有用的額外資訊。可由 Markdown 語法撰寫。 - site_short_description: 一段有助於辨別您伺服器的簡短說明。例如:誰運行該伺服器、該伺服器是提供給哪些人群? + site_short_description: 一段有助於辨別您伺服器的簡短說明。例如:誰運行該伺服器、該伺服器是提供至哪些人群? site_terms: 使用您自己的隱私權政策,或者保留空白以使用預設值。可由 Markdown 語法撰寫。 site_title: 除了網域外,其他人該如何指稱您的伺服器。 status_page_url: 當服務中斷時,可以提供使用者了解伺服器資訊頁面之 URL @@ -101,11 +101,11 @@ zh-TW: timeline_preview: 未登入之訪客能夠瀏覽此伺服器上最新的公開嘟文。 trendable_by_default: 跳過手動審核熱門內容。仍能於登上熱門趨勢後移除個別內容。 trends: 熱門趨勢將顯示於您伺服器上正在吸引大量注意力的嘟文、主題標籤、或者新聞。 - trends_as_landing_page: 顯示熱門趨勢內容給未登入使用者及訪客而不是關於此伺服器之描述。需要啟用熱門趨勢。 + trends_as_landing_page: 顯示熱門趨勢內容至未登入使用者及訪客而不是關於此伺服器之描述。需要啟用熱門趨勢。 form_challenge: current_password: 您正要進入安全區域 imports: - data: 從其他 Mastodon 伺服器匯出的 CSV 檔案 + data: 自其他 Mastodon 伺服器匯出的 CSV 檔案 invite_request: text: 這會協助我們審核您的申請 ip_block: @@ -133,7 +133,7 @@ zh-TW: role: 角色控制使用者有哪些權限 user_role: color: 於整個使用者介面中用於角色的顏色,十六進位格式的 RGB - highlighted: 這會使角色公開可見 + highlighted: 這將使角色公開可見 name: 角色的公開名稱,如果角色設定為顯示為徽章 permissions_as_keys: 有此角色的使用者將有權存取... position: 某些情況下,衝突的解決方式由更高階的角色決定。某些動作只能由優先程度較低的角色執行 @@ -211,6 +211,7 @@ zh-TW: setting_default_privacy: 嘟文隱私設定 setting_default_sensitive: 總是將媒體標記為敏感內容 setting_delete_modal: 刪除嘟文前先詢問我 + setting_disable_hover_cards: 停用於滑鼠懸停時預覽個人檔案 setting_disable_swiping: 停用滑動手勢 setting_display_media: 媒體顯示 setting_display_media_default: 預設 @@ -242,11 +243,13 @@ zh-TW: warn: 隱藏於警告之後 form_admin_settings: activity_api_enabled: 於 API 中公開使用者活躍度的統計數據 + app_icon: 應用程式圖示 backups_retention_period: 使用者封存資料保留期間 - bootstrap_timeline_accounts: 永遠推薦這些帳號給新使用者 + bootstrap_timeline_accounts: 永遠推薦這些帳號至新使用者 closed_registrations_message: 當註冊關閉時的客製化訊息 content_cache_retention_period: 遠端內容保留期限 custom_css: 自訂 CSS + favicon: 網站圖示 (Favicon) mascot: 自訂吉祥物 (legacy) media_cache_retention_period: 多媒體快取資料保留期間 peers_api_enabled: 於 API 中公開已知伺服器的列表 diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 6087b1a1749..f63aadd6c8f 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -232,6 +232,7 @@ sl: update_custom_emoji: Posodobi emotikon po meri update_domain_block: Posodobi blokado domene update_ip_block: Posodobi pravilo IP + update_report: Posodobi poročilo update_status: Posodobi objavo update_user_role: Posodobi vlogo actions: @@ -662,6 +663,7 @@ sl: report: 'Prijavi #%{id}' reported_account: Prijavljeni račun reported_by: Prijavil/a + reported_with_application: Prijavljeno s programom resolved: Razrešeni resolved_msg: Prijava je uspešno razrešena! skip_to_actions: Preskoči na dejanja diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 5439f08a04a..92e182cfda3 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -226,6 +226,7 @@ sq: update_custom_emoji: Përditëso Emoxhi Vetjake update_domain_block: Përditëso Bllok Përkatësish update_ip_block: Përditësoni rregull IP + update_report: Përditësoni Raportimin update_status: Përditëso Gjendjen update_user_role: Përditësoni Rol actions: @@ -469,6 +470,9 @@ sq: title: Rekomandime ndjekjeje unsuppress: Rikthe rekomandime ndjekjeje instances: + audit_log: + title: Regjistra Auditimesh Së Fundi + view_all: Shihni regjistra të plotë auditimesh availability: description_html: one: Nëse dhënia e mesazheve te përkatësia dështon për %{count} ditë pa sukses, s’do të bëhen përpjekje të tjera për dhënie, veç në u marrtë një dërgim prej përkatësisë. @@ -876,7 +880,21 @@ sq: action: Për më tepër hollësi, shihni këtu message_html: "Depozita juaj e objekteve është e formësuar keq. Privatësia e përdoruesve tuaj është në rrezik." tags: + moderation: + not_usable: Të papërdorshme + pending_review: Në pritje të shqyrtimit + review_requested: U kërkua shqyrtim + reviewed: Shqyrtuar + title: Gjendje + unreviewed: Të pashqyrtuar + usable: Të përdorshëm + name: Emër + newest: Më të rejat + oldest: Më të vjetrat + reset: Riktheje te parazgjedhjet review: Gjendje rishikimi + search: Kërkim + title: Hashtag-ë updated_msg: Rregullimet për hashtag-ët u përditësuan me sukses title: Administrim trends: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 776e473ee7a..f6e6d4d2a68 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -577,7 +577,7 @@ sr-Latn: relays: add_new: Dodaj novi relej delete: Obriši - description_html: "Federalni relej je posrednički server koji razmenjuje velike količine javnih truba između servera na koji je pretplaćen i na koji objavljuje.Može pomoći malim i srednjim serverima da otkriju sadržaj iz fediversa, koji inače zahteva od lokalnih korisnika da ručno pratiti ostale ljude na udaljenim serverima." + description_html: "Federalni relej je posrednički server koji razmenjuje velike količine javnih objava između servera na koji je pretplaćen i na koji objavljuje.Može pomoći malim i srednjim serverima da otkriju sadržaj iz fediverzuma, koji inače zahteva od lokalnih korisnika da ručno pratiti ostale ljude na udaljenim serverima." disable: Isključi disabled: Isključen enable: Uključi diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 365b358d5af..9bfefde83c0 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -577,7 +577,7 @@ sr: relays: add_new: Додај нови релеј delete: Обриши - description_html: "Федерални релеј је посреднички сервер који размењује велике количине јавних труба између сервера на који је претплаћен и на који објављује.Може помоћи малим и средњим серверима да открију садржај из федиверса, који иначе захтева од локалних корисника да ручно пратити остале људе на удаљеним серверима." + description_html: "Федерални релеј је посреднички сервер који размењује велике количине јавних објава између сервера на који је претплаћен и на који објављује.Може помоћи малим и средњим серверима да открију садржај из федиверзума, који иначе захтева од локалних корисника да ручно пратити остале људе на удаљеним серверима." disable: Искључи disabled: Искључен enable: Укључи diff --git a/config/locales/sv.yml b/config/locales/sv.yml index a3d31547cec..8054c113558 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -226,6 +226,7 @@ sv: update_custom_emoji: Uppdatera egna emojis update_domain_block: Uppdatera blockerad domän update_ip_block: Uppdatera IP-regel + update_report: Uppdatera rapport update_status: Uppdatera inlägg update_user_role: Uppdatera roll actions: @@ -293,6 +294,7 @@ sv: filter_by_action: Filtrera efter åtgärd filter_by_user: Filtrera efter användare title: Revisionslogg + unavailable_instance: "(domännamn inte tillgängligt)" announcements: destroyed_msg: Kungörelsen raderades! edit: @@ -469,6 +471,9 @@ sv: title: Följ rekommendationer unsuppress: Återställ följrekommendation instances: + audit_log: + title: Senaste revisionsloggar + view_all: Visa fullständiga revisionssloggar availability: description_html: one: Om leveranser till domänen misslyckas i %{count} dag kommer inga ytterligare leveransförsök att göras förrän en leverans från domänen tas emot. @@ -637,6 +642,7 @@ sv: report: 'Rapport #%{id}' reported_account: Anmält konto reported_by: Anmäld av + reported_with_application: Rapporterat med applikation resolved: Löst resolved_msg: Anmälan har lösts framgångsrikt! skip_to_actions: Hoppa till åtgärder @@ -879,7 +885,12 @@ sv: action: Kolla här för mer information message_html: "Din objektlagring är felkonfigurerad. Sekretessen för dina användare är i riskzonen." tags: + moderation: + title: Status + name: Namn + reset: Återställ review: Granskningsstatus + search: Sök updated_msg: Hashtagg-inställningarna har uppdaterats title: Administration trends: diff --git a/config/locales/th.yml b/config/locales/th.yml index df76d97c00a..678b5ab638f 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -223,6 +223,7 @@ th: update_custom_emoji: อัปเดตอีโมจิที่กำหนดเอง update_domain_block: อัปเดตการปิดกั้นโดเมน update_ip_block: อัปเดตกฎ IP + update_report: อัปเดตรายงาน update_status: อัปเดตโพสต์ update_user_role: อัปเดตบทบาท actions: @@ -462,6 +463,9 @@ th: title: คำแนะนำการติดตาม unsuppress: คืนค่าคำแนะนำการติดตาม instances: + audit_log: + title: รายการบันทึกการตรวจสอบล่าสุด + view_all: ดูรายการบันทึกการตรวจสอบแบบเต็ม availability: description_html: other: หากการจัดส่งไปยังโดเมนล้มเหลวเป็นเวลา %{count} วันที่แตกต่างกัน โดยไม่สำเร็จ จะไม่ทำการพยายามจัดส่งเพิ่มเติมเว้นแต่จะได้รับการจัดส่ง จาก โดเมน @@ -626,6 +630,7 @@ th: report: 'รายงาน #%{id}' reported_account: บัญชีที่ได้รับการรายงาน reported_by: รายงานโดย + reported_with_application: รายงานด้วยแอปพลิเคชัน resolved: แก้ปัญหาแล้ว resolved_msg: แก้ปัญหารายงานสำเร็จ! skip_to_actions: ข้ามไปยังการกระทำ diff --git a/config/locales/tr.yml b/config/locales/tr.yml index c690d22580c..dac16917f5b 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -226,6 +226,7 @@ tr: update_custom_emoji: Özel İfadeyi Güncelle update_domain_block: Engellenen Alan Adını Güncelle update_ip_block: IP kuralını güncelle + update_report: Raporu Güncelle update_status: Durumu Güncelle update_user_role: Rolü Güncelle actions: @@ -470,6 +471,9 @@ tr: title: Takip önerileri unsuppress: Takip önerisini geri getir instances: + audit_log: + title: En Son Denetim Günlükleri + view_all: Tüm denetim günlüklerini görüntüle availability: description_html: one: Eğer alan adına teslimat %{count} gün boyunca başarısız olursa, alan adından bir teslimat gelmedikçe yeni bir iletim denemesi yapılmayacak. @@ -638,6 +642,7 @@ tr: report: 'Şikayet #%{id}' reported_account: Şikayet edilen hesap reported_by: Şikayet eden + reported_with_application: Uygulamayla bildirildi resolved: Giderildi resolved_msg: Şikayet başarıyla çözümlendi! skip_to_actions: İşlemlere atla @@ -723,7 +728,7 @@ tr: manage_users_description: Kullanıcıların, diğer kullanıcıların ayrıntılarını görüntülemesine ve onlara karşı denetim eylemleri gerçekleştirmesine izin verir manage_webhooks: Webhookları Yönetme manage_webhooks_description: Kullanıcıların yönetsel olaylar için webhook kurmasına izin verir - view_audit_log: Denetim Kaydını Görüntüleme + view_audit_log: Denetim Günlüğünü Görüntüleme view_audit_log_description: Kullanıcıların sunucudaki yönetsel eylemlerin bir tarihçesini görüntülemesine izin verir view_dashboard: Ana Paneli Görüntüleme view_dashboard_description: Kullanıcıların ana panele ve çeşitli ölçütlere erişmesine izin verir @@ -880,7 +885,23 @@ tr: action: Daha fazla bilgi için buraya göz atın message_html: "Nesne depolamanız hatalı yapılandırılmış. Kullanıcılarınızın gizliliği tehlikede." tags: + moderation: + not_trendable: Öne çıkarılamaz + not_usable: Kullanılamaz + pending_review: İnceleme bekliyor + review_requested: İnceleme istendi + reviewed: İncelendi + title: Durum + trendable: Öne çıkarılabilir + unreviewed: İncelenmemiş + usable: Kullanılabilir + name: Ad + newest: En yeni + oldest: En eski + reset: Sıfırla review: Durumu gözden geçir + search: Ara + title: Etiketler updated_msg: Etiket ayarları başarıyla güncellendi title: Yönetim trends: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 9994cd9d0da..e7aa5e40846 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -232,6 +232,7 @@ uk: update_custom_emoji: Оновити користувацькі емодзі update_domain_block: Оновити блокування домену update_ip_block: Оновити правило IP + update_report: Оновити звіт update_status: Оновити допис update_user_role: Оновити роль actions: @@ -291,7 +292,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_report_html: "%{name} оновлює звіт %{target}" update_status_html: "%{name} оновлює допис %{target}" update_user_role_html: "%{name} змінює роль %{target}" deleted_account: видалений обліковий запис @@ -486,6 +487,9 @@ uk: title: Поради щодо підписок unsuppress: Відновити поради щодо підписок instances: + audit_log: + title: Останні журнали перевірки + view_all: Переглянути повні журнали перевірки availability: description_html: few: Якщо доставлення до домену не вдалася за %{count} інших дні, жодних спроб доставлення не здійснюється, доки доставлення від домену не отримуватиметься. @@ -662,6 +666,7 @@ uk: report: 'Скарга #%{id}' reported_account: Обліковий запис порушника reported_by: Відправник скарги + reported_with_application: Повідомлено через застосунок resolved: Вирішено resolved_msg: Скаргу успішно вирішено! skip_to_actions: Перейти до дій diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 8b24a267c17..dacaafd7681 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -223,6 +223,7 @@ vi: update_custom_emoji: Cập nhật emoji update_domain_block: Cập nhật máy chủ chặn update_ip_block: Cập nhật chặn IP + update_report: Cập nhật báo cáo update_status: Cập nhật tút update_user_role: Cập nhật vai trò actions: @@ -462,6 +463,9 @@ vi: title: Gợi ý theo dõi unsuppress: Mở lại gợi ý theo dõi instances: + audit_log: + title: Kiểm duyệt gần đây + view_all: Xem lịch sử đầy đủ availability: description_html: other: Nếu chuyển đến tên miền %{count} ngày mà không thành công, không chuyển gì nữa cho tới khi sự tiếp nhận từ máy chủ được nhận. @@ -626,6 +630,7 @@ vi: report: 'Báo cáo #%{id}' reported_account: Tài khoản bị báo cáo reported_by: Báo cáo bởi + reported_with_application: Báo cáo bằng ứng dụng resolved: Đã xong resolved_msg: Đã xử lý báo cáo xong! skip_to_actions: Kiểm duyệt @@ -866,7 +871,23 @@ vi: action: Nhấn vào đây để biết thêm thông tin message_html: "Lưu trữ đối tượng của bạn bị cấu hình sai. Có nguy cơ ảnh hưởng bảo mật của người dùng." tags: + moderation: + not_trendable: Không xu hướng + not_usable: Không được dùng + pending_review: Chờ duyệt + review_requested: Yêu cầu duyệt + reviewed: Đã duyệt + title: Trạng thái + trendable: Có thể xu hướng + unreviewed: Chưa duyệt + usable: Có thể dùng + name: Tên + newest: Mới nhất + oldest: Cũ nhất + reset: Đặt lại review: Phê duyệt + search: Tìm kiếm + title: Hashtag updated_msg: Hashtag đã được cập nhật thành công title: Quản trị trends: @@ -1791,8 +1812,8 @@ vi: suspicious_sign_in: change_password: đổi mật khẩu của bạn details: 'Chi tiết thông tin đăng nhập:' - explanation: Chúng tôi phát hiện lần đăng nhập bất thường tài khoản của bạn từ một địa chỉ IP mới. - further_actions_html: Nếu đó không phải là bạn, chúng tôi khuyến nghị %{action} lập tức và bật xác minh hai bước để giữ tài khoản được an toàn. + explanation: Chúng tôi phát hiện tài khoản của bạn đăng nhập bất thường từ một địa chỉ IP mới. + further_actions_html: Nếu đây không phải là bạn, hãy %{action} lập tức và bật xác minh hai bước để giữ tài khoản được an toàn. subject: Đăng nhập tài khoản từ địa chỉ IP mới title: Lần đăng nhập mới warning: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 794b8344c10..f08142719aa 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -223,6 +223,7 @@ zh-CN: update_custom_emoji: 更新自定义表情符号 update_domain_block: 更新域名屏蔽 update_ip_block: 编辑 IP 封禁规则 + update_report: 更新举报 update_status: 更新嘟文 update_user_role: 更新角色 actions: @@ -462,6 +463,9 @@ zh-CN: title: 关注推荐 unsuppress: 恢复推荐关注 instances: + audit_log: + title: 近期审计日志 + view_all: 查看完整审计日志 availability: description_html: other: 如果连续 %{count} 天 均无法成功向该域名投递消息,则将不再尝试向其投递,直至收到来自该域名的消息。 @@ -626,6 +630,7 @@ zh-CN: report: '举报 #%{id}' reported_account: 举报用户 reported_by: 举报人 + reported_with_application: 举报人使用的应用 resolved: 已处理 resolved_msg: 举报处理成功! skip_to_actions: 跳转到操作 @@ -866,7 +871,23 @@ zh-CN: action: 点击这里查看更多信息 message_html: "您的对象存储空间配置错误,您用户的隐私处于危险中。" tags: + moderation: + not_trendable: 不在趋势中显示 + not_usable: 不可用 + pending_review: 待审核 + review_requested: 已请求审核 + reviewed: 已审核 + title: 状态 + trendable: 可在趋势中显示 + unreviewed: 未审核 + usable: 可用 + name: 名称 + newest: 最新 + oldest: 最早 + reset: 重置 review: 审核状态 + search: 搜索 + title: 话题标签 updated_msg: 话题标签设置更新成功 title: 管理 trends: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index ddc6571e6da..6ec0b098349 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1739,7 +1739,7 @@ zh-HK: system: 自動(使用系統主題) time: formats: - default: "%Y年%-m月%d日 %H:%M" + default: "%Y年%b月%d日 %H:%M" month: "%b %Y" time: "%H:%M" with_time_zone: "%b %d, %Y, %H:%M %Z" diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 93de27c0b29..ef2da39f30b 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -223,11 +223,12 @@ zh-TW: update_custom_emoji: 更新自訂 emoji 表情符號 update_domain_block: 更新網域封鎖 update_ip_block: 更新 IP 規則 + update_report: 更新檢舉報告 update_status: 更新狀態 update_user_role: 更新角色 actions: approve_appeal_html: "%{name} 已批准來自 %{target} 的審核決定申訴" - approve_user_html: "%{name} 已批准從 %{target} 而來的註冊" + approve_user_html: "%{name} 已批准自 %{target} 而來的註冊" assigned_to_self_report_html: "%{name} 將報告 %{target} 指派給自己" change_email_user_html: "%{name} 已變更使用者 %{target} 的電子郵件地址" change_role_user_html: "%{name} 已變更 %{target} 的角色" @@ -264,10 +265,10 @@ zh-TW: memorialize_account_html: "%{name} 將 %{target} 設定為追悼帳號" promote_user_html: "%{name} 對使用者 %{target} 已進行晉級操作" reject_appeal_html: "%{name} 已回絕來自 %{target} 的審核決定申訴" - reject_user_html: "%{name} 已回絕從 %{target} 而來的註冊" + reject_user_html: "%{name} 已回絕自 %{target} 而來的註冊" remove_avatar_user_html: "%{name} 已移除 %{target} 的大頭貼" reopen_report_html: "%{name} 重新開啟 %{target} 的檢舉" - resend_user_html: "%{name} 已重新發送驗證信給 %{target}" + resend_user_html: "%{name} 已重新發送驗證信至 %{target}" reset_password_user_html: "%{name} 已重新設定使用者 %{target} 的密碼" resolve_report_html: "%{name} 已處理 %{target} 的檢舉" sensitive_account_html: "%{name} 將 %{target} 的媒體檔案標記為敏感內容" @@ -383,7 +384,7 @@ zh-TW: confirm: 停權 permanent_action: 撤銷停權將不會回復任何資料或跟隨關係 preamble_html: 您將要停權 %{domain} 及其子網域。 - remove_all_data: 此操作將從您伺服器移除所有來自此網域帳號之內容、媒體、個人檔案資料。 + remove_all_data: 此操作將自您伺服器移除所有來自此網域帳號之內容、媒體、個人檔案資料。 stop_communication: 您伺服器將停止與這些伺服器交流。 title: 確認對 %{domain} 網域之封鎖 undo_relationships: 此操作將撤銷任何您伺服器與此伺服器帳號間之跟隨關係。 @@ -462,6 +463,9 @@ zh-TW: title: 跟隨建議 unsuppress: 回復跟隨建議 instances: + audit_log: + title: 近期審計紀錄 + view_all: 檢視完整審計紀錄 availability: description_html: other: 若於 %{count} 天向某個網域遞送失敗,除非收到某個網域的遞送表單,否則不會繼續嘗試遞送。 @@ -525,7 +529,7 @@ zh-TW: total_followed_by_us: 被我們跟隨 total_reported: 關於他們的檢舉報告 total_storage: 多媒體附加檔案 - totals_time_period_hint_html: 以下顯示之總和包含所有時間的資料。 + totals_time_period_hint_html: 以下顯示之統計包含所有時間的資料。 unknown_instance: 此伺服器目前沒有這個網域的紀錄。 invites: deactivate_all: 全部停用 @@ -555,11 +559,11 @@ zh-TW: relays: add_new: 新增中繼站 delete: 刪除 - description_html: "聯邦中繼站 是種中繼伺服器,會於訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。中繼站也能協助小型或中型伺服器從聯邦宇宙中探索內容,而無須本地使用者手動跟隨遠端伺服器的其他使用者。" + description_html: "聯邦中繼站 是種中繼伺服器,會於訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。中繼站也能協助小型或中型伺服器自聯邦宇宙中探索內容,而無須本地使用者手動跟隨遠端伺服器的其他使用者。" disable: 停用 disabled: 停用 enable: 啟用 - enable_hint: 啟用後,您的伺服器將訂閱該中繼的所有公開文章,並將會此伺服器的公開文章發送給它。 + enable_hint: 啟用後,您的伺服器將訂閱該中繼的所有公開文章,並將此伺服器的公開文章向它發送。 enabled: 已啟用 inbox_url: 中繼 URL pending: 等待中繼站審核 @@ -626,6 +630,7 @@ zh-TW: report: '檢舉 #%{id}' reported_account: 被檢舉使用者 reported_by: 檢舉人 + reported_with_application: 透過應用程式檢舉 resolved: 已解決 resolved_msg: 檢舉報告已處理完成! skip_to_actions: 跳過行動 @@ -648,7 +653,7 @@ zh-TW: delete_data_html: 於即日起 30 天後刪除 @%{acct}之個人檔案與內容,除非他們於期限前被解除停權 preview_preamble_html: "@%{acct} 將收到關於以下內容之警告:" record_strike_html: 紀錄關於 @%{acct}之警示有助於您升級對此帳號未來違規處理 - send_email_html: 寄一封警告 e-mail 給 @%{acct} + send_email_html: 寄一封警告 e-mail 至 @%{acct} warning_placeholder: 選填之其他站務動作理由。 target_origin: 檢舉帳號之來源 title: 檢舉 @@ -671,7 +676,7 @@ zh-TW: description_html: 透過使用者角色,您可以自訂您的使用者可以存取 Mastodon 的哪些功能與區域。 edit: 編輯「%{name}」角色 everyone: 預設權限 - everyone_full_description_html: 這是會影響所有使用者基本角色,即使是那些沒有被分配角色的使用者也一樣。其他所有的角色都從它繼承權限。 + everyone_full_description_html: 這是會影響所有使用者基本角色,即使是那些沒有被分配角色的使用者也一樣。其他所有的角色都自它繼承權限。 permissions_count: other: "%{count} 個權限" privileges: @@ -757,8 +762,8 @@ zh-TW: title: 探索 trends: 熱門趨勢 domain_blocks: - all: 給任何人 - disabled: 給沒有人 + all: 至任何人 + disabled: 至沒有人 users: 套用至所有登入的本站使用者 registrations: moderation_recommandation: 對所有人開放註冊之前,請確保您有人手充足且反應靈敏的管理員團隊! @@ -797,7 +802,7 @@ zh-TW: back_to_account: 返回帳號資訊頁面 back_to_report: 回到檢舉報告頁面 batch: - remove_from_report: 從檢舉報告中移除 + remove_from_report: 自檢舉報告中移除 report: 檢舉報告 deleted: 已刪除 favourites: 最愛 @@ -868,7 +873,23 @@ zh-TW: action: 檢查這裡以取得更多資訊 message_html: "您的物件資料儲存空間 (object storage) 設定錯誤。您的使用者隱私正暴露於風險之中。" tags: + moderation: + not_trendable: 無法作為熱門趨勢 + not_usable: 無法使用 + pending_review: 等待審核中 + review_requested: 需要審核 + reviewed: 已審核 + title: 狀態 + trendable: 可作為熱門趨勢 + unreviewed: 待審核 + usable: 可以使用 + name: 名稱 + newest: 最新 + oldest: 最舊 + reset: 重設 review: 審核嘟文 + search: 搜尋 + title: 主題標籤 updated_msg: 成功更新主題標籤設定 title: 管理介面 trends: @@ -1055,7 +1076,7 @@ zh-TW: dont_have_your_security_key: 找不到您的安全金鑰? forgot_password: 忘記密碼? invalid_reset_password_token: 密碼重設 token 無效或已過期。請重新設定密碼。 - link_to_otp: 請從您手機輸入兩階段驗證 (2FA) 或備用驗證碼 + link_to_otp: 請自您手機輸入兩階段驗證 (2FA) 或備用驗證碼 link_to_webauth: 使用您的安全金鑰 log_in_with: 登入,使用 login: 登入 @@ -1138,7 +1159,7 @@ zh-TW: x_seconds: "%{count}秒" deletes: challenge_not_passed: 您所輸入的資料不正確 - confirm_password: 輸入您現在的密碼以驗證身份 + confirm_password: 輸入您目前的密碼以驗證身份 confirm_username: 請輸入您的使用者名稱以作確認 proceed: 刪除帳號 success_msg: 您的帳號已經成功刪除 @@ -1170,7 +1191,7 @@ zh-TW: recipient: 此致 reject_appeal: 駁回申訴 status: '嘟文編號 #%{id}' - status_removed: 嘟文已從系統中移除 + status_removed: 嘟文已自系統中移除 title: "%{action} 來自 %{date}" title_actions: delete_statuses: 嘟文移除 @@ -1238,10 +1259,10 @@ zh-TW: add_keyword: 新增關鍵字 keywords: 關鍵字 statuses: 各別嘟文 - statuses_hint_html: 此過濾器會套用至所選之各別嘟文,無論其是否符合下列關鍵字。審閱或從過濾條件移除嘟文。 + statuses_hint_html: 此過濾器會套用至所選之各別嘟文,無論其是否符合下列關鍵字。審閱或自過濾條件移除嘟文。 title: 編輯過濾條件 errors: - deprecated_api_multiple_keywords: 這些參數無法從此應用程式中更改,因為它們適用於一或多個過濾器關鍵字。請使用較新的應用程式或是網頁介面。 + deprecated_api_multiple_keywords: 這些參數無法自此應用程式中更改,因為它們適用於一或多個過濾器關鍵字。請使用較新的應用程式或是網頁介面。 invalid_context: 沒有提供內文或內文無效 index: contexts: "%{contexts} 中的過濾器" @@ -1262,7 +1283,7 @@ zh-TW: statuses: back_to_filter: 回到過濾器 batch: - remove: 從過濾器中移除 + remove: 自過濾器中移除 index: hint: 此過濾器會套用至所選之各別嘟文,不管它們有無符合其他條件。您可以從網頁介面中將更多嘟文加入至此過濾器。 title: 已過濾之嘟文 @@ -1419,7 +1440,7 @@ zh-TW: on_cooldown: 您最近已轉移過您的帳號。此功能將於 %{count} 天後可再度使用。 past_migrations: 以往的轉移紀錄 proceed_with_move: 移動跟隨者 - redirected_msg: 您的帳號現在指向 %{acct} + redirected_msg: 您的帳號目前重導向至 %{acct}。 redirecting_to: 您的帳號目前正被重新導向到 %{acct} set_redirect: 設定重新導向 warning: @@ -1552,7 +1573,7 @@ zh-TW: mutual: 跟隨彼此 primary: 主要 relationship: 關係 - remove_selected_domains: 從所選取網域中移除所有跟隨者 + remove_selected_domains: 自所選取網域中移除所有跟隨者 remove_selected_followers: 移除選取的跟隨者 remove_selected_follows: 取消跟隨選取的使用者 status: 帳號狀態 @@ -1599,7 +1620,7 @@ zh-TW: current_session: 目前的 session date: 日期 description: "%{platform} 上的 %{browser}" - explanation: 這些是現在正登入於您 Mastodon 帳號的瀏覽器。 + explanation: 這些是目前正登入於您 Mastodon 帳號的瀏覽器。 ip: IP 位址 platforms: adobe_air: Adobe Air diff --git a/config/navigation.rb b/config/navigation.rb index c1dd81501cf..f006f39a540 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -40,13 +40,14 @@ SimpleNavigation::Configuration.run do |navigation| n.item :trends, safe_join([fa_icon('fire fw'), t('admin.trends.title')]), admin_trends_statuses_path, if: -> { current_user.can?(:manage_taxonomies) && !self_destruct } do |s| s.item :statuses, safe_join([fa_icon('comments-o fw'), t('admin.trends.statuses.title')]), admin_trends_statuses_path, highlights_on: %r{/admin/trends/statuses} - s.item :tags, safe_join([fa_icon('hashtag fw'), t('admin.trends.tags.title')]), admin_trends_tags_path, highlights_on: %r{/admin/tags|/admin/trends/tags} + s.item :tags, safe_join([fa_icon('hashtag fw'), t('admin.trends.tags.title')]), admin_trends_tags_path, highlights_on: %r{/admin/trends/tags} s.item :links, safe_join([fa_icon('newspaper-o fw'), t('admin.trends.links.title')]), admin_trends_links_path, highlights_on: %r{/admin/trends/links} end n.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) && !self_destruct } do |s| s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports|admin/report_notes}, if: -> { current_user.can?(:manage_reports) } s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|admin/account_moderation_notes|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) } + s.item :tags, safe_join([fa_icon('hashtag fw'), t('admin.tags.title')]), admin_tags_path, highlights_on: %r{/admin/tags}, if: -> { current_user.can?(:manage_taxonomies) } s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path, if: -> { current_user.can?(:manage_invites) } s.item :follow_recommendations, safe_join([fa_icon('user-plus fw'), t('admin.follow_recommendations.title')]), admin_follow_recommendations_path, highlights_on: %r{/admin/follow_recommendations}, if: -> { current_user.can?(:manage_taxonomies) } s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_path(limited: limited_federation_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) } diff --git a/config/routes.rb b/config/routes.rb index f4662dd5da4..3ac619519d4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -27,7 +27,9 @@ Rails.application.routes.draw do /public/remote /conversations /lists/(*any) + /links/(*any) /notifications/(*any) + /notifications_v2/(*any) /favourites /bookmarks /pinned @@ -62,12 +64,16 @@ 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 - get '.well-known/change-password', to: redirect('/auth/edit') - get '.well-known/proxy', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" } + scope path: '.well-known' do + scope module: :well_known do + get 'oauth-authorization-server', to: 'oauth_metadata#show', as: :oauth_metadata, defaults: { format: 'json' } + get 'host-meta', to: 'host_meta#show', as: :host_meta, defaults: { format: 'xml' } + get 'nodeinfo', to: 'node_info#index', as: :nodeinfo, defaults: { format: 'json' } + get 'webfinger', to: 'webfinger#show', as: :webfinger + end + get 'change-password', to: redirect('/auth/edit'), as: nil + get 'proxy', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" }, as: nil + end get '/nodeinfo/2.0', to: 'well_known/node_info#show', as: :nodeinfo_schema @@ -93,19 +99,15 @@ Rails.application.routes.draw do namespace :auth do resource :setup, only: [:show, :update], controller: :setup - resource :challenge, only: [:create], controller: :challenges + resource :challenge, only: [:create] get 'sessions/security_key_options', to: 'sessions#webauthn_options' post 'captcha_confirmation', to: 'confirmations#confirm_captcha', as: :captcha_confirmation end end - devise_for :users, path: 'auth', format: false, controllers: { - omniauth_callbacks: 'auth/omniauth_callbacks', - sessions: 'auth/sessions', - registrations: 'auth/registrations', - passwords: 'auth/passwords', - confirmations: 'auth/confirmations', - } + scope module: :auth do + devise_for :users, path: 'auth', format: false + end with_options constraints: ->(req) { req.format.nil? || req.format.html? } do get '/users/:username', to: redirect_with_vary('/@%{username}') @@ -140,7 +142,11 @@ Rails.application.routes.draw do resource :inbox, only: [:create], module: :activitypub - get '/:encoded_at(*path)', to: redirect('/@%{path}'), constraints: { encoded_at: /%40/ } + constraints(encoded_path: /%40.*/) do + get '/:encoded_path', to: redirect { |params| + "/#{params[:encoded_path].gsub('%40', '@')}" + } + end constraints(username: %r{[^@/.]+}) do with_options to: 'accounts#show' do diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 207cb0580dc..50c4c10594a 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -163,7 +163,7 @@ namespace :admin do resources :roles, except: [:show] resources :account_moderation_notes, only: [:create, :destroy] resource :follow_recommendations, only: [:show, :update] - resources :tags, only: [:show, :update] + resources :tags, only: [:index, :show, :update] namespace :trends do resources :links, only: [:index] do diff --git a/config/routes/api.rb b/config/routes/api.rb index 3eb4bb4b4d5..fa74c025b4e 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -155,6 +155,11 @@ namespace :api, format: false do namespace :notifications do resources :requests, only: [:index, :show] do + collection do + post :accept, to: 'requests#accept_bulk' + post :dismiss, to: 'requests#dismiss_bulk' + end + member do post :accept post :dismiss @@ -167,6 +172,7 @@ namespace :api, format: false do resources :notifications, only: [:index, :show] do collection do post :clear + get :unread_count end member do @@ -203,9 +209,11 @@ namespace :api, format: false do post :unmute end - resource :pin, only: :create, controller: 'accounts/pins' - post :unpin, to: 'accounts/pins#destroy' - resource :note, only: :create, controller: 'accounts/notes' + scope module: :accounts do + resource :pin, only: :create + post :unpin, to: 'pins#destroy' + resource :note, only: :create + end end resources :tags, only: [:show] do @@ -218,7 +226,7 @@ namespace :api, format: false do resources :followed_tags, only: [:index] resources :lists, only: [:index, :create, :show, :update, :destroy] do - resource :accounts, only: [:show, :create, :destroy], controller: 'lists/accounts' + resource :accounts, only: [:show, :create, :destroy], module: :lists end namespace :featured_tags do @@ -228,7 +236,7 @@ namespace :api, format: false do resources :featured_tags, only: [:index, :create, :destroy] resources :polls, only: [:create, :show] do - resources :votes, only: :create, controller: 'polls/votes' + resources :votes, only: :create, module: :polls end namespace :push do @@ -314,8 +322,10 @@ namespace :api, format: false do resources :suggestions, only: [:index] resource :instance, only: [:show] resources :filters, only: [:index, :create, :show, :update, :destroy] do - resources :keywords, only: [:index, :create], controller: 'filters/keywords' - resources :statuses, only: [:index, :create], controller: 'filters/statuses' + scope module: :filters do + resources :keywords, only: [:index, :create] + resources :statuses, only: [:index, :create] + end end namespace :filters do @@ -332,6 +342,7 @@ namespace :api, format: false do resources :notifications, only: [:index, :show] do collection do post :clear + get :unread_count end member do diff --git a/config/routes/settings.rb b/config/routes/settings.rb index 888fa9ecb55..297b80942c9 100644 --- a/config/routes/settings.rb +++ b/config/routes/settings.rb @@ -26,9 +26,9 @@ namespace :settings do resources :follows, only: :index, controller: :following_accounts resources :blocks, only: :index, controller: :blocked_accounts resources :mutes, only: :index, controller: :muted_accounts - resources :lists, only: :index, controller: :lists + resources :lists, only: :index resources :domain_blocks, only: :index, controller: :blocked_domains - resources :bookmarks, only: :index, controller: :bookmarks + resources :bookmarks, only: :index end resources :two_factor_authentication_methods, only: [:index] do @@ -37,13 +37,13 @@ namespace :settings do end end - resource :otp_authentication, only: [:show, :create], controller: 'two_factor_authentication/otp_authentication' + scope module: :two_factor_authentication do + resource :otp_authentication, only: [:show, :create], controller: :otp_authentication - resources :webauthn_credentials, only: [:index, :new, :create, :destroy], - path: 'security_keys', - controller: 'two_factor_authentication/webauthn_credentials' do - collection do - get :options + resources :webauthn_credentials, only: [:index, :new, :create, :destroy], path: 'security_keys' do + collection do + get :options + end end end diff --git a/config/templates/privacy-policy.md b/config/templates/privacy-policy.md index 9e042af80a8..4f5ab4ca03d 100644 --- a/config/templates/privacy-policy.md +++ b/config/templates/privacy-policy.md @@ -1,10 +1,10 @@ -This privacy policy describes how %{domain}s ("%{domain}s", "we", "us") -collects, protects and uses the personally identifiable information you may -provide through the %{domain}s website or its API. The policy also -describes the choices available to you regarding our use of your personal -information and how you can access and update this information. This policy -does not apply to the practices of companies that %{domain}s does not own -or control, or to individuals that %{domain}s does not employ or manage. +This privacy policy describes how %{domain} ("%{domain}", "we", "us") collects, +protects and uses the personally identifiable information you may provide +through the %{domain} website or its API. The policy also describes the choices +available to you regarding our use of your personal information and how you can +access and update this information. This policy does not apply to the practices +of companies that %{domain} does not own or control, or to individuals that +%{domain} does not employ or manage. # What information do we collect? diff --git a/config/webpack/rules/babel.js b/config/webpack/rules/babel.js index c7bf886e795..902b823e1f8 100644 --- a/config/webpack/rules/babel.js +++ b/config/webpack/rules/babel.js @@ -2,19 +2,19 @@ const { join, resolve } = require('path'); const { env, settings } = require('../configuration'); +// Those modules contain modern ES code that need to be transpiled for Webpack to process it +const nodeModulesToProcess = [ + '@reduxjs', 'fuzzysort' +]; + module.exports = { test: /\.(js|jsx|mjs|ts|tsx)$/, include: [ settings.source_path, ...settings.resolved_paths, - 'node_modules/@reduxjs' + ...nodeModulesToProcess.map(p => resolve(`node_modules/${p}`)), ].map(p => resolve(p)), - exclude: function(modulePath) { - return ( - /node_modules/.test(modulePath) && - !/@reduxjs/.test(modulePath) - ); - }, + exclude: new RegExp('node_modules\\/(?!(' + nodeModulesToProcess.join('|')+')\\/).*'), use: [ { loader: 'babel-loader', diff --git a/db/migrate/20160223164502_make_uris_nullable_in_statuses.rb b/db/migrate/20160223164502_make_uris_nullable_in_statuses.rb index fff07093c8e..ebb572bd60d 100644 --- a/db/migrate/20160223164502_make_uris_nullable_in_statuses.rb +++ b/db/migrate/20160223164502_make_uris_nullable_in_statuses.rb @@ -1,7 +1,11 @@ # frozen_string_literal: true class MakeUrisNullableInStatuses < ActiveRecord::Migration[4.2] - def change + def up change_column :statuses, :uri, :string, null: true, default: nil end + + def down + raise ActiveRecord::IrreversibleMigration + end end diff --git a/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb b/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb index 534df25eed1..cfe4c23de3a 100644 --- a/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb +++ b/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class AddAttachmentAvatarToAccounts < ActiveRecord::Migration[4.2] - def self.up + def up change_table :accounts do |t| # The following corresponds to `t.attachment :avatar` in an older version of Paperclip t.string :avatar_file_name @@ -11,7 +11,7 @@ class AddAttachmentAvatarToAccounts < ActiveRecord::Migration[4.2] end end - def self.down + def down remove_attachment :accounts, :avatar end end diff --git a/db/migrate/20160305115639_add_devise_to_users.rb b/db/migrate/20160305115639_add_devise_to_users.rb index 64ad78dbc6a..22697b2389e 100644 --- a/db/migrate/20160305115639_add_devise_to_users.rb +++ b/db/migrate/20160305115639_add_devise_to_users.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class AddDeviseToUsers < ActiveRecord::Migration[4.2] - def self.up + def up change_table(:users, bulk: true) do |t| ## Database authenticatable t.string :encrypted_password, null: false, default: '' @@ -24,7 +24,7 @@ class AddDeviseToUsers < ActiveRecord::Migration[4.2] add_index :users, :reset_password_token, unique: true end - def self.down + def down remove_index :users, :reset_password_token remove_column :users, :encrypted_password diff --git a/db/migrate/20160312193225_add_attachment_header_to_accounts.rb b/db/migrate/20160312193225_add_attachment_header_to_accounts.rb index b481fc52906..45dc65236b1 100644 --- a/db/migrate/20160312193225_add_attachment_header_to_accounts.rb +++ b/db/migrate/20160312193225_add_attachment_header_to_accounts.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class AddAttachmentHeaderToAccounts < ActiveRecord::Migration[4.2] - def self.up + def up change_table :accounts do |t| # The following corresponds to `t.attachment :header` in an older version of Paperclip t.string :header_file_name @@ -11,7 +11,7 @@ class AddAttachmentHeaderToAccounts < ActiveRecord::Migration[4.2] end end - def self.down + def down remove_attachment :accounts, :header end end diff --git a/db/migrate/20161006213403_rails_settings_migration.rb b/db/migrate/20161006213403_rails_settings_migration.rb index 9764196fab4..d08ad2efd9b 100644 --- a/db/migrate/20161006213403_rails_settings_migration.rb +++ b/db/migrate/20161006213403_rails_settings_migration.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class RailsSettingsMigration < ActiveRecord::Migration[5.0] - def self.up + def up create_table :settings do |t| t.string :var, null: false t.text :value @@ -11,7 +11,7 @@ class RailsSettingsMigration < ActiveRecord::Migration[5.0] add_index :settings, [:target_type, :target_id, :var], unique: true end - def self.down + def down drop_table :settings end end diff --git a/db/migrate/20170322143850_change_primary_key_to_bigint_on_statuses.rb b/db/migrate/20170322143850_change_primary_key_to_bigint_on_statuses.rb index b98fffab836..e7fcb75a44a 100644 --- a/db/migrate/20170322143850_change_primary_key_to_bigint_on_statuses.rb +++ b/db/migrate/20170322143850_change_primary_key_to_bigint_on_statuses.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class ChangePrimaryKeyToBigintOnStatuses < ActiveRecord::Migration[5.0] - def change + def up change_table(:statuses, bulk: true) do |t| t.change :id, :bigint t.change :reblog_of_id, :bigint @@ -16,4 +16,8 @@ class ChangePrimaryKeyToBigintOnStatuses < ActiveRecord::Migration[5.0] change_column :statuses_tags, :status_id, :bigint change_column :stream_entries, :activity_id, :bigint end + + def down + raise ActiveRecord::IrreversibleMigration + end end diff --git a/db/migrate/20170330164118_add_attachment_data_to_imports.rb b/db/migrate/20170330164118_add_attachment_data_to_imports.rb index 0daaa9d02e7..afacfa86dae 100644 --- a/db/migrate/20170330164118_add_attachment_data_to_imports.rb +++ b/db/migrate/20170330164118_add_attachment_data_to_imports.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class AddAttachmentDataToImports < ActiveRecord::Migration[4.2] - def self.up + def up change_table :imports do |t| # The following corresponds to `t.attachment :data` in an older version of Paperclip t.string :data_file_name @@ -11,7 +11,7 @@ class AddAttachmentDataToImports < ActiveRecord::Migration[4.2] end end - def self.down + def down remove_attachment :imports, :data end end diff --git a/db/migrate/20170520145338_change_language_filter_to_opt_out.rb b/db/migrate/20170520145338_change_language_filter_to_opt_out.rb index f0a95819c33..0e91c468037 100644 --- a/db/migrate/20170520145338_change_language_filter_to_opt_out.rb +++ b/db/migrate/20170520145338_change_language_filter_to_opt_out.rb @@ -5,7 +5,7 @@ class ChangeLanguageFilterToOptOut < ActiveRecord::Migration[5.0] remove_index :users, :allowed_languages change_table(:users, bulk: true) do |t| - t.remove :allowed_languages + t.remove :allowed_languages, type: :string, array: true, default: [], null: false t.column :filtered_languages, :string, array: true, default: [], null: false end diff --git a/db/migrate/20170609145826_remove_default_language_from_statuses.rb b/db/migrate/20170609145826_remove_default_language_from_statuses.rb index 28b4172a8c0..122c3222878 100644 --- a/db/migrate/20170609145826_remove_default_language_from_statuses.rb +++ b/db/migrate/20170609145826_remove_default_language_from_statuses.rb @@ -1,7 +1,11 @@ # frozen_string_literal: true class RemoveDefaultLanguageFromStatuses < ActiveRecord::Migration[5.1] - def change + def up change_column :statuses, :language, :string, default: nil, null: true end + + def down + raise ActiveRecord::IrreversibleMigration + end end diff --git a/db/migrate/20240713171841_add_application_to_reports.rb b/db/migrate/20240713171841_add_application_to_reports.rb new file mode 100644 index 00000000000..42ba14e9b26 --- /dev/null +++ b/db/migrate/20240713171841_add_application_to_reports.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AddApplicationToReports < ActiveRecord::Migration[7.1] + def change + add_column :reports, :application_id, :bigint, null: true + add_foreign_key :reports, :oauth_applications, column: :application_id, on_delete: :nullify, validate: false + end +end diff --git a/db/migrate/20240713171909_validate_add_application_to_reports.rb b/db/migrate/20240713171909_validate_add_application_to_reports.rb new file mode 100644 index 00000000000..34ae690a390 --- /dev/null +++ b/db/migrate/20240713171909_validate_add_application_to_reports.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class ValidateAddApplicationToReports < ActiveRecord::Migration[7.1] + def change + validate_foreign_key :reports, :oauth_applications + end +end diff --git a/db/migrate/20240724181224_enable_pkce.rb b/db/migrate/20240724181224_enable_pkce.rb new file mode 100644 index 00000000000..4816f58f07d --- /dev/null +++ b/db/migrate/20240724181224_enable_pkce.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class EnablePkce < ActiveRecord::Migration[7.1] + def change + add_column :oauth_access_grants, :code_challenge, :string, null: true + add_column :oauth_access_grants, :code_challenge_method, :string, null: true + end +end diff --git a/db/post_migrate/20240712064044_remove_dismissed_from_notification_requests.rb b/db/post_migrate/20240712064044_remove_dismissed_from_notification_requests.rb new file mode 100644 index 00000000000..0d858380730 --- /dev/null +++ b/db/post_migrate/20240712064044_remove_dismissed_from_notification_requests.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class RemoveDismissedFromNotificationRequests < ActiveRecord::Migration[7.1] + def up + safety_assured do + execute 'DELETE FROM notification_requests WHERE dismissed' + remove_column :notification_requests, :dismissed + end + end + + def down + add_column :notification_requests, :dismissed, :boolean, default: false, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 5f8c7e693f4..d4796079cae 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_06_07_094856) do +ActiveRecord::Schema[7.1].define(version: 2024_07_24_181224) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -194,8 +194,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do t.integer "avatar_storage_schema_version" t.integer "header_storage_schema_version" t.string "devices_url" - t.integer "suspension_origin" t.datetime "sensitized_at", precision: nil + t.integer "suspension_origin" t.boolean "trendable" t.datetime "reviewed_at", precision: nil t.datetime "requested_review_at", precision: nil @@ -579,12 +579,12 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do end create_table "ip_blocks", force: :cascade do |t| - t.datetime "created_at", precision: nil, null: false - t.datetime "updated_at", precision: nil, null: false - t.datetime "expires_at", precision: nil t.inet "ip", default: "0.0.0.0", null: false t.integer "severity", default: 0, null: false + t.datetime "expires_at", precision: nil t.text "comment", default: "", null: false + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false t.index ["ip"], name: "index_ip_blocks_on_ip", unique: true end @@ -706,11 +706,9 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do t.bigint "from_account_id", null: false t.bigint "last_status_id" t.bigint "notifications_count", default: 0, null: false - t.boolean "dismissed", default: false, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["account_id", "from_account_id"], name: "index_notification_requests_on_account_id_and_from_account_id", unique: true - t.index ["account_id", "id"], name: "index_notification_requests_on_account_id_and_id", order: { id: :desc }, where: "(dismissed = false)" t.index ["from_account_id"], name: "index_notification_requests_on_from_account_id" t.index ["last_status_id"], name: "index_notification_requests_on_last_status_id" end @@ -741,6 +739,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do t.string "scopes" t.bigint "application_id", null: false t.bigint "resource_owner_id", null: false + t.string "code_challenge" + t.string "code_challenge_method" t.index ["resource_owner_id"], name: "index_oauth_access_grants_on_resource_owner_id" t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true end @@ -931,6 +931,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do t.integer "category", default: 0, null: false t.datetime "action_taken_at", precision: nil t.bigint "rule_ids", array: true + t.bigint "application_id" t.index ["account_id"], name: "index_reports_on_account_id" t.index ["action_taken_by_account_id"], name: "index_reports_on_action_taken_by_account_id", where: "(action_taken_by_account_id IS NOT NULL)" t.index ["assigned_account_id"], name: "index_reports_on_assigned_account_id", where: "(assigned_account_id IS NOT NULL)" @@ -1363,6 +1364,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do add_foreign_key "reports", "accounts", column: "assigned_account_id", on_delete: :nullify add_foreign_key "reports", "accounts", column: "target_account_id", name: "fk_eb37af34f0", on_delete: :cascade add_foreign_key "reports", "accounts", name: "fk_4b81f7522c", on_delete: :cascade + add_foreign_key "reports", "oauth_applications", column: "application_id", on_delete: :nullify add_foreign_key "scheduled_statuses", "accounts", on_delete: :cascade add_foreign_key "session_activations", "oauth_access_tokens", column: "access_token_id", name: "fk_957e5bda89", on_delete: :cascade add_foreign_key "session_activations", "users", name: "fk_e5fda67334", on_delete: :cascade @@ -1421,9 +1423,9 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do add_index "instances", ["domain"], name: "index_instances_on_domain", unique: true create_view "user_ips", sql_definition: <<-SQL - SELECT t0.user_id, - t0.ip, - max(t0.used_at) AS used_at + SELECT user_id, + ip, + max(used_at) AS used_at FROM ( SELECT users.id AS user_id, users.sign_up_ip AS ip, users.created_at AS used_at @@ -1440,7 +1442,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do login_activities.created_at FROM login_activities WHERE (login_activities.success = true)) t0 - GROUP BY t0.user_id, t0.ip; + GROUP BY user_id, ip; SQL create_view "account_summaries", materialized: true, sql_definition: <<-SQL SELECT accounts.id AS account_id, @@ -1461,9 +1463,9 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do add_index "account_summaries", ["account_id"], name: "index_account_summaries_on_account_id", unique: true create_view "global_follow_recommendations", materialized: true, sql_definition: <<-SQL - SELECT t0.account_id, - sum(t0.rank) AS rank, - array_agg(t0.reason) AS reason + SELECT account_id, + sum(rank) AS rank, + array_agg(reason) AS reason FROM ( SELECT account_summaries.account_id, ((count(follows.id))::numeric / (1.0 + (count(follows.id))::numeric)) AS rank, 'most_followed'::text AS reason @@ -1487,8 +1489,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_07_094856) do WHERE (follow_recommendation_suppressions.account_id = statuses.account_id))))) GROUP BY account_summaries.account_id HAVING (sum((status_stats.reblogs_count + status_stats.favourites_count)) >= (5)::numeric)) t0 - GROUP BY t0.account_id - ORDER BY (sum(t0.rank)) DESC; + GROUP BY account_id + ORDER BY (sum(rank)) DESC; SQL add_index "global_follow_recommendations", ["account_id"], name: "index_global_follow_recommendations_on_account_id", unique: true diff --git a/docker-compose.yml b/docker-compose.yml index 7089b0d14f3..7a6f9be5099 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,7 +58,7 @@ services: web: build: . - image: ghcr.io/mastodon/mastodon:v4.2.9 + image: ghcr.io/mastodon/mastodon:v4.2.10 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -79,7 +79,7 @@ services: streaming: build: . - image: ghcr.io/mastodon/mastodon:v4.2.9 + image: ghcr.io/mastodon/mastodon:v4.2.10 restart: always env_file: .env.production command: node ./streaming @@ -97,7 +97,7 @@ services: sidekiq: build: . - image: ghcr.io/mastodon/mastodon:v4.2.9 + image: ghcr.io/mastodon/mastodon:v4.2.10 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 03972ba938d..fd05dac7b98 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'alpha.4' + 'alpha.5' end def prerelease @@ -65,7 +65,7 @@ module Mastodon end def user_agent - @user_agent ||= "#{HTTP::Request::USER_AGENT} (Mastodon/#{Version}; +http#{Rails.configuration.x.use_https ? 's' : ''}://#{Rails.configuration.x.web_domain}/)" + @user_agent ||= "Mastodon/#{Version} (#{HTTP::Request::USER_AGENT}; +http#{Rails.configuration.x.use_https ? 's' : ''}://#{Rails.configuration.x.web_domain}/)" end end end diff --git a/lib/paperclip/color_extractor.rb b/lib/paperclip/color_extractor.rb index 378af0961de..fba32ba4cb5 100644 --- a/lib/paperclip/color_extractor.rb +++ b/lib/paperclip/color_extractor.rb @@ -116,34 +116,23 @@ module Paperclip # The number of occurrences of a color (r, g, b) is thus encoded in band `b` at pixel position `(r, g)` histogram = image.hist_find_ndim(bins: BINS) - # `histogram.max` returns an array of maxima with their pixel positions, but we don't know in which - # band they are + # With `bandunfold`, we get back to a (BINS*BINS)×BINS 2D image with a single band. + # The number of occurrences of a color (r, g, b) is thus encoded at pixel position `(r * BINS + b, g)` + histogram = histogram.bandunfold + _, colors = histogram.max(size: 10, out_array: true, x_array: true, y_array: true) - colors['out_array'].zip(colors['x_array'], colors['y_array']).map do |v, x, y| - rgb_from_xyv(histogram, x, y, v) - end.flatten.reverse.uniq + colors['x_array'].zip(colors['y_array']).map do |x, y| + rgb_from_hist_xy(x, y) + end.flatten.reverse end # rubocop:disable Naming/MethodParameterName - def rgb_from_xyv(image, x, y, v) - pixel = image.getpoint(x, y) - - # As we only have the first 2 dimensions for this maximum, we - # can't distinguish with different maxima with the same `r` and `g` - # values but different `b` values. - # - # Therefore, we return an array of maxima, which is always non-empty, - # but may contain multiple colors with the same values. - - pixel.filter_map.with_index do |pv, z| - next if pv != v - - r = (x + 0.5) * 256 / BINS - g = (y + 0.5) * 256 / BINS - b = (z + 0.5) * 256 / BINS - ColorDiff::Color::RGB.new(r, g, b) - end + def rgb_from_hist_xy(x, y) + r = ((x / BINS) + 0.5) * 256 / BINS + g = (y + 0.5) * 256 / BINS + b = ((x % BINS) + 0.5) * 256 / BINS + ColorDiff::Color::RGB.new(r, g, b) end def w3c_contrast(color1, color2) diff --git a/lib/sanitize_ext/sanitize_config.rb b/lib/sanitize_ext/sanitize_config.rb index 70efe7c1ae5..3379823cb78 100644 --- a/lib/sanitize_ext/sanitize_config.rb +++ b/lib/sanitize_ext/sanitize_config.rb @@ -65,7 +65,7 @@ class Sanitize end MASTODON_STRICT = freeze_config( - elements: %w(p br span a del pre blockquote code b strong u i em ul ol li), + elements: %w(p br span a del pre blockquote code b strong u i em ul ol li ruby rt rp), attributes: { 'a' => %w(href rel class translate), diff --git a/lib/stoplight/redis_data_store_extensions.rb b/lib/stoplight/redis_data_store_extensions.rb new file mode 100644 index 00000000000..90074878401 --- /dev/null +++ b/lib/stoplight/redis_data_store_extensions.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +# Restore compatibility with Redis < 6.2 + +module Stoplight + module DataStore + module RedisExtensions + def query_failures(light, transaction: @redis) + window_start = Time.now.to_i - light.window_size + + transaction.zrevrangebyscore(failures_key(light), Float::INFINITY, window_start) + end + end + end +end + +Stoplight::DataStore::Redis.prepend(Stoplight::DataStore::RedisExtensions) diff --git a/lib/tasks/branding.rake b/lib/tasks/branding.rake index 608fb3af9c4..be72454ce29 100644 --- a/lib/tasks/branding.rake +++ b/lib/tasks/branding.rake @@ -42,7 +42,6 @@ namespace :branding do output_dest = Rails.root.join('app', 'javascript', 'icons') rsvg_convert = Terrapin::CommandLine.new('rsvg-convert', '-w :size -h :size --keep-aspect-ratio :input -o :output') - convert = Terrapin::CommandLine.new('convert', ':input :output', environment: { 'MAGICK_CONFIGURE_PATH' => nil }) favicon_sizes = [16, 32, 48] apple_icon_sizes = [57, 60, 72, 76, 114, 120, 144, 152, 167, 180, 1024] @@ -56,8 +55,6 @@ namespace :branding do rsvg_convert.run(size: size, input: favicon_source, output: output_path) end - convert.run(input: favicons, output: Rails.public_path.join('favicon.ico')) - apple_icon_sizes.each do |size| rsvg_convert.run(size: size, input: app_icon_source, output: output_dest.join("apple-touch-icon-#{size}x#{size}.png")) end diff --git a/lib/tasks/statistics.rake b/lib/tasks/statistics.rake index dde7890f6b4..82840f4fdc8 100644 --- a/lib/tasks/statistics.rake +++ b/lib/tasks/statistics.rake @@ -9,11 +9,13 @@ namespace :mastodon do [ ['App Libraries', 'app/lib'], %w(Presenters app/presenters), + %w(Policies app/policies), + %w(Serializers app/serializers), %w(Services app/services), %w(Validators app/validators), %w(Workers app/workers), ].each do |name, dir| - STATS_DIRECTORIES << [name, Rails.root.join(dir)] + STATS_DIRECTORIES << [name, dir] end end end diff --git a/package.json b/package.json index d52f0ea1cc2..26ee3570a9e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.3.0", + "packageManager": "yarn@4.4.0", "engines": { "node": ">=18" }, @@ -50,7 +50,6 @@ "@svgr/webpack": "^5.5.0", "arrow-key-navigation": "^1.2.0", "async-mutex": "^0.5.0", - "autoprefixer": "^10.4.14", "axios": "^1.4.0", "babel-loader": "^8.3.0", "babel-plugin-formatjs": "^10.5.1", @@ -72,7 +71,7 @@ "escape-html": "^1.0.3", "file-loader": "^6.2.0", "font-awesome": "^4.7.0", - "fuzzysort": "^2.0.4", + "fuzzysort": "^3.0.0", "glob": "^10.2.6", "history": "^4.10.1", "hoist-non-react-statics": "^3.3.2", @@ -88,7 +87,7 @@ "path-complete-extname": "^1.0.0", "postcss": "^8.4.24", "postcss-loader": "^4.3.0", - "postcss-preset-env": "^9.5.2", + "postcss-preset-env": "^10.0.0", "prop-types": "^15.8.1", "punycode": "^2.3.0", "react": "^18.2.0", @@ -123,11 +122,12 @@ "tesseract.js": "^2.1.5", "tiny-queue": "^0.2.1", "twitter-text": "3.1.0", + "use-debounce": "^10.0.0", "webpack": "^4.47.0", "webpack-assets-manifest": "^4.0.6", "webpack-bundle-analyzer": "^4.8.0", "webpack-cli": "^3.3.12", - "webpack-merge": "^5.9.0", + "webpack-merge": "^6.0.0", "wicg-inert": "^3.1.2", "workbox-expiration": "^7.0.0", "workbox-precaching": "^7.0.0", @@ -138,8 +138,9 @@ }, "devDependencies": { "@formatjs/cli": "^6.1.1", + "@testing-library/dom": "^10.2.0", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^15.0.0", + "@testing-library/react": "^16.0.0", "@types/babel__core": "^7.20.1", "@types/emoji-mart": "^3.0.9", "@types/escape-html": "^1.0.2", @@ -177,15 +178,15 @@ "eslint-plugin-formatjs": "^4.10.1", "eslint-plugin-import": "~2.29.0", "eslint-plugin-jsdoc": "^48.0.0", - "eslint-plugin-jsx-a11y": "~6.8.0", - "eslint-plugin-promise": "~6.2.0", + "eslint-plugin-jsx-a11y": "~6.9.0", + "eslint-plugin-promise": "~6.6.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "husky": "^9.0.11", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "lint-staged": "^15.0.0", - "prettier": "^3.0.0", + "prettier": "^3.3.3", "react-test-renderer": "^18.2.0", "stylelint": "^16.0.2", "stylelint-config-standard-scss": "^13.0.0", diff --git a/postcss.config.js b/postcss.config.js index 63aeafb36d9..ddcbbbeeec3 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,8 +1,13 @@ +const postcssPresetEnv = require('postcss-preset-env'); + /** @type {import('postcss-load-config').Config} */ const config = ({ env }) => ({ plugins: [ - require('postcss-preset-env'), - require('autoprefixer'), + postcssPresetEnv({ + features: { + 'logical-properties-and-values': false + } + }), env === 'production' ? require('cssnano') : '', ], }); diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index b09a98bb9b0..00000000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/spec/controllers/activitypub/collections_controller_spec.rb b/spec/controllers/activitypub/collections_controller_spec.rb index 11ef03c8425..a5718fbd7d3 100644 --- a/spec/controllers/activitypub/collections_controller_spec.rb +++ b/spec/controllers/activitypub/collections_controller_spec.rb @@ -25,14 +25,12 @@ RSpec.describe ActivityPub::CollectionsController do context 'without signature' do let(:remote_account) { nil } - it 'returns http success and correct media type' do - expect(response).to have_http_status(200) - expect(response.media_type).to eq 'application/activity+json' - end - it_behaves_like 'cacheable response' - it 'returns orderedItems with correct items' do + it 'returns http success and correct media type and correct items' do + expect(response).to have_http_status(200) + expect(response.media_type).to eq 'application/activity+json' + expect(body_as_json[:orderedItems]) .to be_an(Array) .and have_attributes(size: 3) @@ -66,14 +64,12 @@ RSpec.describe ActivityPub::CollectionsController do let(:remote_account) { Fabricate(:account, domain: 'example.com') } context 'when getting a featured resource' do - it 'returns http success and correct media type' do - expect(response).to have_http_status(200) - expect(response.media_type).to eq 'application/activity+json' - end - it_behaves_like 'cacheable response' - it 'returns orderedItems with expected items' do + it 'returns http success and correct media type and expected items' do + expect(response).to have_http_status(200) + expect(response.media_type).to eq 'application/activity+json' + expect(body_as_json[:orderedItems]) .to be_an(Array) .and have_attributes(size: 3) @@ -92,16 +88,14 @@ RSpec.describe ActivityPub::CollectionsController do account.block!(remote_account) end - it 'returns http success and correct media type and cache headers' do + it 'returns http success and correct media type and cache headers and empty items' do expect(response).to have_http_status(200) expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Cache-Control']).to include 'private' - end - it 'returns empty orderedItems' do expect(body_as_json[:orderedItems]) .to be_an(Array) - .and have_attributes(size: 0) + .and be_empty end end @@ -110,16 +104,14 @@ RSpec.describe ActivityPub::CollectionsController do account.block_domain!(remote_account.domain) end - it 'returns http success and correct media type and cache headers' do + it 'returns http success and correct media type and cache headers and empty items' do expect(response).to have_http_status(200) expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Cache-Control']).to include 'private' - end - it 'returns empty orderedItems' do expect(body_as_json[:orderedItems]) .to be_an(Array) - .and have_attributes(size: 0) + .and be_empty end end end diff --git a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb index b50c7b9cdcb..c030078d43a 100644 --- a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb +++ b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb @@ -37,25 +37,18 @@ RSpec.describe ActivityPub::FollowersSynchronizationsController do let(:body) { body_as_json } let(:remote_account) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/instance') } - it 'returns http success' do + it 'returns http success and cache control and activity json types and correct items' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do - expect(response.media_type).to eq 'application/activity+json' - end - - it 'returns orderedItems with followers from example.com' do - expect(body[:orderedItems]).to be_an Array - expect(body[:orderedItems]).to contain_exactly( - follower_example_com_instance_actor.uri, - follower_example_com_user_a.uri, - follower_example_com_user_b.uri - ) - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.media_type).to eq 'application/activity+json' + + expect(body[:orderedItems]) + .to be_an(Array) + .and contain_exactly( + follower_example_com_instance_actor.uri, + follower_example_com_user_a.uri, + follower_example_com_user_b.uri + ) end context 'when account is permanently suspended' do diff --git a/spec/controllers/activitypub/outboxes_controller_spec.rb b/spec/controllers/activitypub/outboxes_controller_spec.rb index ead231f29fb..3c8e8e399f6 100644 --- a/spec/controllers/activitypub/outboxes_controller_spec.rb +++ b/spec/controllers/activitypub/outboxes_controller_spec.rb @@ -25,22 +25,13 @@ RSpec.describe ActivityPub::OutboxesController do context 'with page not requested' do let(:page) { nil } - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do - expect(response.media_type).to eq 'application/activity+json' - end - - it 'returns totalItems' do - expect(body[:totalItems]).to eq 4 - end - it_behaves_like 'cacheable response' - it 'does not have a Vary header' do + it 'returns http success and correct media type and headers and items count' do + expect(response).to have_http_status(200) + expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Vary']).to be_nil + expect(body[:totalItems]).to eq 4 end context 'when account is permanently suspended' do @@ -68,26 +59,18 @@ RSpec.describe ActivityPub::OutboxesController do context 'with page requested' do let(:page) { 'true' } - it 'returns http success' do + it_behaves_like 'cacheable response' + + it 'returns http success and correct media type and vary header and items' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' - end + expect(response.headers['Vary']).to include 'Signature' - it 'returns orderedItems with public or unlisted statuses' do expect(body[:orderedItems]).to be_an Array expect(body[:orderedItems].size).to eq 2 expect(body[:orderedItems].all? { |item| targets_public_collection?(item) }).to be true end - it_behaves_like 'cacheable response' - - it 'returns Vary header with Signature' do - expect(response.headers['Vary']).to include 'Signature' - end - context 'when account is permanently suspended' do before do account.suspend! @@ -120,23 +103,14 @@ RSpec.describe ActivityPub::OutboxesController do get :show, params: { account_username: account.username, page: page } end - it 'returns http success' do + it 'returns http success and correct media type and headers and items' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' - end - - it 'returns orderedItems with public or unlisted statuses' do - json = body_as_json - expect(json[:orderedItems]).to be_an Array - expect(json[:orderedItems].size).to eq 2 - expect(json[:orderedItems].all? { |item| targets_public_collection?(item) }).to be true - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to eq 'max-age=60, private' + + expect(body_as_json[:orderedItems]).to be_an Array + expect(body_as_json[:orderedItems].size).to eq 2 + expect(body_as_json[:orderedItems].all? { |item| targets_public_collection?(item) }).to be true end end @@ -146,23 +120,14 @@ RSpec.describe ActivityPub::OutboxesController do get :show, params: { account_username: account.username, page: page } end - it 'returns http success' do + it 'returns http success and correct media type and headers and items' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' - end - - it 'returns orderedItems with private statuses' do - json = body_as_json - expect(json[:orderedItems]).to be_an Array - expect(json[:orderedItems].size).to eq 3 - expect(json[:orderedItems].all? { |item| targets_public_collection?(item) || targets_followers_collection?(item, account) }).to be true - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to eq 'max-age=60, private' + + expect(body_as_json[:orderedItems]).to be_an Array + expect(body_as_json[:orderedItems].size).to eq 3 + expect(body_as_json[:orderedItems].all? { |item| targets_public_collection?(item) || targets_followers_collection?(item, account) }).to be true end end @@ -172,22 +137,14 @@ RSpec.describe ActivityPub::OutboxesController do get :show, params: { account_username: account.username, page: page } end - it 'returns http success' do + it 'returns http success and correct media type and headers and items' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' - end - - it 'returns empty orderedItems' do - json = body_as_json - expect(json[:orderedItems]).to be_an Array - expect(json[:orderedItems].size).to eq 0 - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to eq 'max-age=60, private' + + expect(body_as_json[:orderedItems]) + .to be_an(Array) + .and be_empty end end @@ -197,22 +154,14 @@ RSpec.describe ActivityPub::OutboxesController do get :show, params: { account_username: account.username, page: page } end - it 'returns http success' do + it 'returns http success and correct media type and headers and items' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' - end - - it 'returns empty orderedItems' do - json = body_as_json - expect(json[:orderedItems]).to be_an Array - expect(json[:orderedItems].size).to eq 0 - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to eq 'max-age=60, private' + + expect(body_as_json[:orderedItems]) + .to be_an(Array) + .and be_empty end end end diff --git a/spec/controllers/activitypub/replies_controller_spec.rb b/spec/controllers/activitypub/replies_controller_spec.rb index db7f60d3f87..c556e072704 100644 --- a/spec/controllers/activitypub/replies_controller_spec.rb +++ b/spec/controllers/activitypub/replies_controller_spec.rb @@ -66,19 +66,15 @@ RSpec.describe ActivityPub::RepliesController do context 'when status is public' do let(:parent_visibility) { :public } - let(:json) { body_as_json } - let(:page_json) { json[:first] } - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do - expect(response.media_type).to eq 'application/activity+json' - end + let(:page_json) { body_as_json[:first] } it_behaves_like 'cacheable response' + it 'returns http success and correct media type' do + expect(response).to have_http_status(200) + expect(response.media_type).to eq 'application/activity+json' + end + context 'without only_other_accounts' do it "returns items with thread author's replies" do expect(page_json).to be_a Hash diff --git a/spec/controllers/admin/disputes/appeals_controller_spec.rb b/spec/controllers/admin/disputes/appeals_controller_spec.rb index bf7f9bd7048..678ceee1158 100644 --- a/spec/controllers/admin/disputes/appeals_controller_spec.rb +++ b/spec/controllers/admin/disputes/appeals_controller_spec.rb @@ -34,7 +34,7 @@ RSpec.describe Admin::Disputes::AppealsController do let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } - it 'redirects back to the strike page and notifies target account about approved appeal', :sidekiq_inline do + it 'redirects back to the strike page and notifies target account about approved appeal', :inline_jobs do emails = capture_emails { subject } expect(response) @@ -58,7 +58,7 @@ RSpec.describe Admin::Disputes::AppealsController do let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } - it 'redirects back to the strike page and notifies target account about rejected appeal', :sidekiq_inline do + it 'redirects back to the strike page and notifies target account about rejected appeal', :inline_jobs do emails = capture_emails { subject } expect(response) diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb index 87b08323da9..eb2c6265d12 100644 --- a/spec/controllers/admin/domain_blocks_controller_spec.rb +++ b/spec/controllers/admin/domain_blocks_controller_spec.rb @@ -176,7 +176,7 @@ RSpec.describe Admin::DomainBlocksController do end end - describe 'PUT #update', :sidekiq_inline do + describe 'PUT #update', :inline_jobs do subject do post :update, params: { :id => domain_block.id, :domain_block => { domain: 'example.com', severity: new_severity }, 'confirm' => '' } end diff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb index e6fa0b9def2..ca64dd90a04 100644 --- a/spec/controllers/admin/instances_controller_spec.rb +++ b/spec/controllers/admin/instances_controller_spec.rb @@ -37,10 +37,32 @@ RSpec.describe Admin::InstancesController do end describe 'GET #show' do + before do + allow(Admin::ActionLogFilter).to receive(:new).and_call_original + end + it 'shows an instance page' do get :show, params: { id: account_popular_main.domain } expect(response).to have_http_status(200) + + instance = assigns(:instance) + expect(instance).to_not be_new_record + + expect(Admin::ActionLogFilter).to have_received(:new).with(target_domain: account_popular_main.domain) + + action_logs = assigns(:action_logs).to_a + expect(action_logs.size).to eq 0 + end + + context 'with an unknown domain' do + it 'returns http success' do + get :show, params: { id: 'unknown.example' } + expect(response).to have_http_status(200) + + instance = assigns(:instance) + expect(instance).to be_new_record + end end end diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb index 02760154fbe..5849163b5fe 100644 --- a/spec/controllers/admin/reports_controller_spec.rb +++ b/spec/controllers/admin/reports_controller_spec.rb @@ -64,7 +64,7 @@ describe Admin::ReportsController do describe 'POST #reopen' do it 'reopens the report' do - report = Fabricate(:report) + report = Fabricate(:report, action_taken_at: 3.days.ago) put :reopen, params: { id: report } expect(response).to redirect_to(admin_report_path(report)) @@ -89,7 +89,7 @@ describe Admin::ReportsController do describe 'POST #unassign' do it 'reopens the report' do - report = Fabricate(:report) + report = Fabricate(:report, assigned_account_id: Account.last.id) put :unassign, params: { id: report } expect(response).to redirect_to(admin_report_path(report)) diff --git a/spec/controllers/admin/resets_controller_spec.rb b/spec/controllers/admin/resets_controller_spec.rb index 10ed2cf9697..0cbc3b60ab6 100644 --- a/spec/controllers/admin/resets_controller_spec.rb +++ b/spec/controllers/admin/resets_controller_spec.rb @@ -13,7 +13,7 @@ describe Admin::ResetsController do sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end - describe 'POST #create', :sidekiq_inline do + describe 'POST #create', :inline_jobs do it 'redirects to admin accounts page' do emails = capture_emails { subject } diff --git a/spec/controllers/admin/statuses_controller_spec.rb b/spec/controllers/admin/statuses_controller_spec.rb index 4e8bf9ead68..4ab6d109ef8 100644 --- a/spec/controllers/admin/statuses_controller_spec.rb +++ b/spec/controllers/admin/statuses_controller_spec.rb @@ -33,7 +33,7 @@ describe Admin::StatusesController do context 'when filtering by media' do before do - get :index, params: { account_id: account.id, media: '1' } + get :index, params: { account_id: account.id, media: true } end it 'returns http success' do @@ -44,6 +44,11 @@ describe Admin::StatusesController do describe 'GET #show' do before do + status.media_attachments << Fabricate(:media_attachment, type: :image, account: status.account) + status.save! + status.snapshot!(at_time: status.created_at, rate_limit: false) + status.update!(text: 'Hello, this is an edited post') + status.snapshot!(rate_limit: false) get :show, params: { account_id: account.id, id: status.id } end diff --git a/spec/controllers/admin/tags_controller_spec.rb b/spec/controllers/admin/tags_controller_spec.rb index 4e06adaca67..1df2bc40030 100644 --- a/spec/controllers/admin/tags_controller_spec.rb +++ b/spec/controllers/admin/tags_controller_spec.rb @@ -9,6 +9,43 @@ RSpec.describe Admin::TagsController do sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) end + describe 'GET #index' do + before do + Fabricate(:tag) + + tag_filter = instance_double(Admin::TagFilter, results: Tag.all) + allow(Admin::TagFilter).to receive(:new).and_return(tag_filter) + end + + let(:params) { { order: 'newest' } } + + it 'returns http success' do + get :index + + expect(response).to have_http_status(200) + expect(response).to render_template(:index) + + expect(Admin::TagFilter) + .to have_received(:new) + .with(hash_including(params)) + end + + describe 'with filters' do + let(:params) { { order: 'newest', name: 'test' } } + + it 'returns http success' do + get :index, params: { name: 'test' } + + expect(response).to have_http_status(200) + expect(response).to render_template(:index) + + expect(Admin::TagFilter) + .to have_received(:new) + .with(hash_including(params)) + end + end + end + describe 'GET #show' do let!(:tag) { Fabricate(:tag) } diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index e78554ec7dc..9a94e5e1a1a 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -123,7 +123,7 @@ RSpec.describe Auth::SessionsController do user.update(current_sign_in_at: 1.month.ago) end - it 'logs the user in and sends suspicious email and redirects home', :sidekiq_inline do + it 'logs the user in and sends suspicious email and redirects home', :inline_jobs do emails = capture_emails { subject } expect(response) @@ -263,7 +263,7 @@ RSpec.describe Auth::SessionsController do travel_to '2023-12-20T10:00:00Z' end - it 'does not log the user in, sets a flash message, and sends a suspicious sign in email', :sidekiq_inline do + it 'does not log the user in, sets a flash message, and sends a suspicious sign in email', :inline_jobs do emails = capture_emails do Auth::SessionsController::MAX_2FA_ATTEMPTS_PER_HOUR.times do post :create, params: { user: { otp_attempt: '1234' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } diff --git a/spec/controllers/concerns/user_tracking_concern_spec.rb b/spec/controllers/concerns/user_tracking_concern_spec.rb index b1de3cf4e2e..f23d482f5f9 100644 --- a/spec/controllers/concerns/user_tracking_concern_spec.rb +++ b/spec/controllers/concerns/user_tracking_concern_spec.rb @@ -75,7 +75,7 @@ describe UserTrackingConcern do expect(redis.ttl("account:#{user.account_id}:regeneration")).to be >= 0 end - it 'regenerates feed when sign in is older than two weeks', :sidekiq_inline do + it 'regenerates feed when sign in is older than two weeks', :inline_jobs do get :show expect_updated_sign_in_at(user) diff --git a/spec/controllers/disputes/appeals_controller_spec.rb b/spec/controllers/disputes/appeals_controller_spec.rb index 99d5a8b17f0..3e874bbdcc0 100644 --- a/spec/controllers/disputes/appeals_controller_spec.rb +++ b/spec/controllers/disputes/appeals_controller_spec.rb @@ -17,7 +17,7 @@ RSpec.describe Disputes::AppealsController do let(:strike) { Fabricate(:account_warning, target_account: current_user.account) } let(:params) { { strike_id: strike.id, appeal: { text: 'Foo' } } } - it 'notifies staff about new appeal and redirects back to strike page', :sidekiq_inline do + it 'notifies staff about new appeal and redirects back to strike page', :inline_jobs do emails = capture_emails { subject } expect(emails.size) @@ -36,7 +36,7 @@ RSpec.describe Disputes::AppealsController do let(:strike) { Fabricate(:account_warning, target_account: current_user.account) } let(:params) { { strike_id: strike.id, appeal: { text: '' } } } - it 'does not send email and renders strike show page', :sidekiq_inline do + it 'does not send email and renders strike show page', :inline_jobs do emails = capture_emails { subject } expect(emails).to be_empty diff --git a/spec/controllers/invites_controller_spec.rb b/spec/controllers/invites_controller_spec.rb index 3190c828842..5221941267f 100644 --- a/spec/controllers/invites_controller_spec.rb +++ b/spec/controllers/invites_controller_spec.rb @@ -69,19 +69,16 @@ describe InvitesController do end end - describe 'DELETE #create' do + describe 'DELETE #destroy' do + subject { delete :destroy, params: { id: invite.id } } + let(:invite) { Fabricate(:invite, user: user, expires_at: nil) } - before do - delete :destroy, params: { id: invite.id } - end - - it 'redirects' do - expect(response).to redirect_to invites_path - end - - it 'expires invite' do - expect(invite.reload).to be_expired + it 'expires invite and redirects' do + expect { subject } + .to(change { invite.reload.expired? }.to(true)) + expect(response) + .to redirect_to invites_path end end end diff --git a/spec/controllers/oauth/authorizations_controller_spec.rb b/spec/controllers/oauth/authorizations_controller_spec.rb index 9b3ae251e6c..9bb520211c2 100644 --- a/spec/controllers/oauth/authorizations_controller_spec.rb +++ b/spec/controllers/oauth/authorizations_controller_spec.rb @@ -3,8 +3,6 @@ require 'rails_helper' RSpec.describe Oauth::AuthorizationsController do - render_views - let(:app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: 'http://localhost/', scopes: 'read') } describe 'GET #new' do @@ -36,11 +34,6 @@ RSpec.describe Oauth::AuthorizationsController do expect(response.headers['Cache-Control']).to include('private, no-store') end - it 'gives options to authorize and deny' do - subject - expect(response.body).to match(/Authorize/) - end - include_examples 'stores location for user' context 'when app is already authorized' do @@ -61,7 +54,8 @@ RSpec.describe Oauth::AuthorizationsController do it 'does not redirect to callback with force_login=true' do get :new, params: { client_id: app.uid, response_type: 'code', redirect_uri: 'http://localhost/', scope: 'read', force_login: 'true' } - expect(response.body).to match(/Authorize/) + + expect(response).to have_http_status(:success) end end end diff --git a/spec/controllers/oauth/authorized_applications_controller_spec.rb b/spec/controllers/oauth/authorized_applications_controller_spec.rb index b46b944d0ea..3fd9f9499f4 100644 --- a/spec/controllers/oauth/authorized_applications_controller_spec.rb +++ b/spec/controllers/oauth/authorized_applications_controller_spec.rb @@ -50,9 +50,11 @@ describe Oauth::AuthorizedApplicationsController do let!(:application) { Fabricate(:application) } let!(:access_token) { Fabricate(:accessible_access_token, application: application, resource_owner_id: user.id) } let!(:web_push_subscription) { Fabricate(:web_push_subscription, user: user, access_token: access_token) } + let(:redis_pipeline_stub) { instance_double(Redis::Namespace, publish: nil) } before do sign_in user, scope: :user + allow(redis).to receive(:pipelined).and_yield(redis_pipeline_stub) post :destroy, params: { id: application.id } end @@ -67,5 +69,9 @@ describe Oauth::AuthorizedApplicationsController do it 'removes the web_push_subscription' do expect { web_push_subscription.reload }.to raise_error(ActiveRecord::RecordNotFound) end + + it 'sends a session kill payload to the streaming server' do + expect(redis_pipeline_stub).to have_received(:publish).with("timeline:access_token:#{access_token.id}", '{"event":"kill"}') + end end end diff --git a/spec/controllers/settings/applications_controller_spec.rb b/spec/controllers/settings/applications_controller_spec.rb index ccbb6349117..ce2e0749a76 100644 --- a/spec/controllers/settings/applications_controller_spec.rb +++ b/spec/controllers/settings/applications_controller_spec.rb @@ -147,14 +147,22 @@ describe Settings::ApplicationsController do end describe 'destroy' do + let(:redis_pipeline_stub) { instance_double(Redis::Namespace, publish: nil) } + let!(:access_token) { Fabricate(:accessible_access_token, application: app) } + before do + allow(redis).to receive(:pipelined).and_yield(redis_pipeline_stub) post :destroy, params: { id: app.id } end - it 'redirects back to applications page and removes the app' do + it 'redirects back to applications page removes the app' do expect(response).to redirect_to(settings_applications_path) expect(Doorkeeper::Application.find_by(id: app.id)).to be_nil end + + it 'sends a session kill payload to the streaming server' do + expect(redis_pipeline_stub).to have_received(:publish).with("timeline:access_token:#{access_token.id}", '{"event":"kill"}') + end end describe 'regenerate' do diff --git a/spec/controllers/settings/deletes_controller_spec.rb b/spec/controllers/settings/deletes_controller_spec.rb index ccca4564e73..3342599bc11 100644 --- a/spec/controllers/settings/deletes_controller_spec.rb +++ b/spec/controllers/settings/deletes_controller_spec.rb @@ -50,7 +50,7 @@ describe Settings::DeletesController do delete :destroy, params: { form_delete_confirmation: { password: 'petsmoldoggos' } } end - it 'removes user record and redirects', :aggregate_failures, :sidekiq_inline do + it 'removes user record and redirects', :aggregate_failures, :inline_jobs do expect(response).to redirect_to '/auth/sign_in' expect(User.find_by(id: user.id)).to be_nil expect(user.account.reload).to be_suspended diff --git a/spec/fabricators/notification_request_fabricator.rb b/spec/fabricators/notification_request_fabricator.rb index 05a13b8ef80..a20d3b3ef2b 100644 --- a/spec/fabricators/notification_request_fabricator.rb +++ b/spec/fabricators/notification_request_fabricator.rb @@ -4,5 +4,4 @@ Fabricator(:notification_request) do account from_account { Fabricate.build(:account) } last_status { Fabricate.build(:status) } - dismissed false end diff --git a/spec/fixtures/requests/activitypub-webfinger.txt b/spec/fixtures/requests/activitypub-webfinger.txt index 465066d84e1..733b1693dc8 100644 --- a/spec/fixtures/requests/activitypub-webfinger.txt +++ b/spec/fixtures/requests/activitypub-webfinger.txt @@ -4,4 +4,4 @@ Content-Type: application/jrd+json; charset=utf-8 X-Content-Type-Options: nosniff Date: Sun, 17 Sep 2017 06:22:50 GMT -{"subject":"acct:foo@ap.example.com","aliases":["https://ap.example.com/@foo","https://ap.example.com/users/foo"],"links":[{"rel":"http://webfinger.net/rel/profile-page","type":"text/html","href":"https://ap.example.com/@foo"},{"rel":"http://schemas.google.com/g/2010#updates-from","type":"application/atom+xml","href":"https://ap.example.com/users/foo.atom"},{"rel":"self","type":"application/activity+json","href":"https://ap.example.com/users/foo"},{"rel":"salmon","href":"https://ap.example.com/api/salmon/1"},{"rel":"magic-public-key","href":"data:application/magic-public-key,RSA.u3L4vnpNLzVH31MeWI394F0wKeJFsLDAsNXGeOu0QF2x-h1zLWZw_agqD2R3JPU9_kaDJGPIV2Sn5zLyUA9S6swCCMOtn7BBR9g9sucgXJmUFB0tACH2QSgHywMAybGfmSb3LsEMNKsGJ9VsvYoh8lDET6X4Pyw-ZJU0_OLo_41q9w-OrGtlsTm_PuPIeXnxa6BLqnDaxC-4IcjG_FiPahNCTINl_1F_TgSSDZ4Taf4U9XFEIFw8wmgploELozzIzKq-t8nhQYkgAkt64euWpva3qL5KD1mTIZQEP-LZvh3s2WHrLi3fhbdRuwQ2c0KkJA2oSTFPDpqqbPGZ3QvuHQ==.AQAB"},{"rel":"http://ostatus.org/schema/1.0/subscribe","template":"https://ap.example.com/authorize_follow?acct={uri}"}]} \ No newline at end of file +{"subject":"acct:foo@ap.example.com","aliases":["https://ap.example.com/@foo","https://ap.example.com/users/foo"],"links":[{"rel":"http://webfinger.net/rel/profile-page","type":"text/html","href":"https://ap.example.com/@foo"},{"rel":"http://schemas.google.com/g/2010#updates-from","type":"application/atom+xml","href":"https://ap.example.com/users/foo.atom"},{"rel":"self","type":"application/html","href":"https://ap.example.com/users/foo.html"},{"rel":"self","type":"application/activity+json","href":"https://ap.example.com/users/foo"},{"rel":"self","type":"application/json","href":"https://ap.example.com/users/foo.json"},{"rel":"salmon","href":"https://ap.example.com/api/salmon/1"},{"rel":"magic-public-key","href":"data:application/magic-public-key,RSA.u3L4vnpNLzVH31MeWI394F0wKeJFsLDAsNXGeOu0QF2x-h1zLWZw_agqD2R3JPU9_kaDJGPIV2Sn5zLyUA9S6swCCMOtn7BBR9g9sucgXJmUFB0tACH2QSgHywMAybGfmSb3LsEMNKsGJ9VsvYoh8lDET6X4Pyw-ZJU0_OLo_41q9w-OrGtlsTm_PuPIeXnxa6BLqnDaxC-4IcjG_FiPahNCTINl_1F_TgSSDZ4Taf4U9XFEIFw8wmgploELozzIzKq-t8nhQYkgAkt64euWpva3qL5KD1mTIZQEP-LZvh3s2WHrLi3fhbdRuwQ2c0KkJA2oSTFPDpqqbPGZ3QvuHQ==.AQAB"},{"rel":"http://ostatus.org/schema/1.0/subscribe","template":"https://ap.example.com/authorize_follow?acct={uri}"}]} \ No newline at end of file diff --git a/spec/fixtures/requests/alternative_utf8_spelling_in_header.txt b/spec/fixtures/requests/alternative_utf8_spelling_in_header.txt new file mode 100644 index 00000000000..7aaea370e86 --- /dev/null +++ b/spec/fixtures/requests/alternative_utf8_spelling_in_header.txt @@ -0,0 +1,18 @@ +HTTP/1.1 200 OK +server: nginx +date: Thu, 13 Jun 2024 14:33:13 GMT +content-type: text/html; charset=utf8 +content-length: 192 +accept-ranges: bytes + + + + + + Webserver Configs R Us + + +

Welcome

+

Sneaky non-UTF character:

+ + diff --git a/spec/fixtures/requests/latin1_posing_as_utf8_broken.txt b/spec/fixtures/requests/latin1_posing_as_utf8_broken.txt new file mode 100644 index 00000000000..ed8a4716a3e --- /dev/null +++ b/spec/fixtures/requests/latin1_posing_as_utf8_broken.txt @@ -0,0 +1,17 @@ +HTTP/1.1 200 OK +server: nginx +date: Thu, 13 Jun 2024 14:33:13 GMT +content-type: text/html; charset=utf-8 +content-length: 158 +accept-ranges: bytes + + + + + + Tofu l'orange + + +

Tofu l'orange

+ + diff --git a/spec/fixtures/requests/latin1_posing_as_utf8_recoverable.txt b/spec/fixtures/requests/latin1_posing_as_utf8_recoverable.txt new file mode 100644 index 00000000000..a24985832ca --- /dev/null +++ b/spec/fixtures/requests/latin1_posing_as_utf8_recoverable.txt @@ -0,0 +1,17 @@ +HTTP/1.1 200 OK +server: nginx +date: Thu, 13 Jun 2024 14:33:13 GMT +content-type: text/html; charset=utf-8 +content-length: 158 +accept-ranges: bytes + + + + + + Tofu with orange sauce + + +

Tofu l'orange

+ + diff --git a/spec/fixtures/requests/long_canonical_url.txt b/spec/fixtures/requests/long_canonical_url.txt new file mode 100644 index 00000000000..97d6c93961f --- /dev/null +++ b/spec/fixtures/requests/long_canonical_url.txt @@ -0,0 +1,18 @@ +HTTP/1.1 200 OK +server: nginx +date: Thu, 13 Jun 2024 14:33:13 GMT +content-type: text/html; charset=utf-8 +content-length: 3225 +accept-ranges: bytes + + + + + + + Very long canonical URL + + +

We have very long URLs

+ + diff --git a/spec/fixtures/requests/low_confidence_latin1.txt b/spec/fixtures/requests/low_confidence_latin1.txt new file mode 100644 index 00000000000..39c3e23d649 --- /dev/null +++ b/spec/fixtures/requests/low_confidence_latin1.txt @@ -0,0 +1,17 @@ +HTTP/1.1 200 OK +server: nginx +date: Thu, 13 Jun 2024 14:33:13 GMT +content-type: text/html; charset=ISO-8859-1 +content-length: 158 +accept-ranges: bytes + + + + + + Tofu l'orange + + +

Tofu l'orange

+ + diff --git a/spec/fixtures/requests/page_without_title.txt b/spec/fixtures/requests/page_without_title.txt new file mode 100644 index 00000000000..0054aa3b7e0 --- /dev/null +++ b/spec/fixtures/requests/page_without_title.txt @@ -0,0 +1,17 @@ +HTTP/1.1 200 OK +server: nginx +date: Thu, 13 Jun 2024 14:33:13 GMT +content-type: text/html; charset=utf-8 +content-length: 171 +accept-ranges: bytes + + + + + + + +

I am not a valid page

+

Thankfully, browsers do not care

+ + diff --git a/spec/fixtures/requests/redirect_with_utf8_url.txt b/spec/fixtures/requests/redirect_with_utf8_url.txt new file mode 100644 index 00000000000..08f99ee2aed --- /dev/null +++ b/spec/fixtures/requests/redirect_with_utf8_url.txt @@ -0,0 +1,5 @@ +HTTP/1.1 301 Moved Permanently +server: nginx +date: Thu, 27 Jun 2024 11:04:53 GMT +content-type: text/html; charset=UTF-8 +location: http://example.com/ärgerliche-umlaute.html diff --git a/spec/fixtures/requests/webfinger.txt b/spec/fixtures/requests/webfinger.txt index f337ecae6f1..fce821bddbf 100644 --- a/spec/fixtures/requests/webfinger.txt +++ b/spec/fixtures/requests/webfinger.txt @@ -8,4 +8,4 @@ Access-Control-Allow-Origin: * Vary: Accept-Encoding,Cookie Strict-Transport-Security: max-age=31536000; includeSubdomains; -{"subject":"acct:gargron@quitter.no","aliases":["https:\/\/quitter.no\/user\/7477","https:\/\/quitter.no\/gargron","https:\/\/quitter.no\/index.php\/user\/7477","https:\/\/quitter.no\/index.php\/gargron"],"links":[{"rel":"http:\/\/webfinger.net\/rel\/profile-page","type":"text\/html","href":"https:\/\/quitter.no\/gargron"},{"rel":"http:\/\/gmpg.org\/xfn\/11","type":"text\/html","href":"https:\/\/quitter.no\/gargron"},{"rel":"describedby","type":"application\/rdf+xml","href":"https:\/\/quitter.no\/gargron\/foaf"},{"rel":"http:\/\/apinamespace.org\/atom","type":"application\/atomsvc+xml","href":"https:\/\/quitter.no\/api\/statusnet\/app\/service\/gargron.xml"},{"rel":"http:\/\/apinamespace.org\/twitter","href":"https:\/\/quitter.no\/api\/"},{"rel":"http:\/\/specs.openid.net\/auth\/2.0\/provider","href":"https:\/\/quitter.no\/gargron"},{"rel":"http:\/\/schemas.google.com\/g\/2010#updates-from","type":"application\/atom+xml","href":"https:\/\/quitter.no\/api\/statuses\/user_timeline\/7477.atom"},{"rel":"magic-public-key","href":"data:application\/magic-public-key,RSA.1ZBkHTavLvxH3FzlKv4O6WtlILKRFfNami3_Rcu8EuogtXSYiS-bB6hElZfUCSHbC4uLemOA34PEhz__CDMozax1iI_t8dzjDnh1x0iFSup7pSfW9iXk_WU3Dm74yWWW2jildY41vWgrEstuQ1dJ8vVFfSJ9T_tO4c-T9y8vDI8=.AQAB"},{"rel":"salmon","href":"https:\/\/quitter.no\/main\/salmon\/user\/7477"},{"rel":"http:\/\/salmon-protocol.org\/ns\/salmon-replies","href":"https:\/\/quitter.no\/main\/salmon\/user\/7477"},{"rel":"http:\/\/salmon-protocol.org\/ns\/salmon-mention","href":"https:\/\/quitter.no\/main\/salmon\/user\/7477"},{"rel":"http:\/\/ostatus.org\/schema\/1.0\/subscribe","template":"https:\/\/quitter.no\/main\/ostatussub?profile={uri}"}]} +{"subject":"acct:gargron@quitter.no","aliases":["https:\/\/quitter.no\/user\/7477","https:\/\/quitter.no\/gargron","https:\/\/quitter.no\/index.php\/user\/7477","https:\/\/quitter.no\/index.php\/gargron"],"links":[{"rel":"http:\/\/webfinger.net\/rel\/profile-page","type":"text\/html","href":"https:\/\/quitter.no\/gargron"},{"rel":"http:\/\/gmpg.org\/xfn\/11","type":"text\/html","href":"https:\/\/quitter.no\/gargron"},{"rel":"describedby","type":"application\/rdf+xml","href":"https:\/\/quitter.no\/gargron\/foaf"},{"rel":"self","type":"application/activity+json","href":"https://ap.example.com/users/foo"},{"rel":"http:\/\/apinamespace.org\/atom","type":"application\/atomsvc+xml","href":"https:\/\/quitter.no\/api\/statusnet\/app\/service\/gargron.xml"},{"rel":"http:\/\/apinamespace.org\/twitter","href":"https:\/\/quitter.no\/api\/"},{"rel":"http:\/\/specs.openid.net\/auth\/2.0\/provider","href":"https:\/\/quitter.no\/gargron"},{"rel":"http:\/\/schemas.google.com\/g\/2010#updates-from","type":"application\/atom+xml","href":"https:\/\/quitter.no\/api\/statuses\/user_timeline\/7477.atom"},{"rel":"magic-public-key","href":"data:application\/magic-public-key,RSA.1ZBkHTavLvxH3FzlKv4O6WtlILKRFfNami3_Rcu8EuogtXSYiS-bB6hElZfUCSHbC4uLemOA34PEhz__CDMozax1iI_t8dzjDnh1x0iFSup7pSfW9iXk_WU3Dm74yWWW2jildY41vWgrEstuQ1dJ8vVFfSJ9T_tO4c-T9y8vDI8=.AQAB"},{"rel":"salmon","href":"https:\/\/quitter.no\/main\/salmon\/user\/7477"},{"rel":"http:\/\/salmon-protocol.org\/ns\/salmon-replies","href":"https:\/\/quitter.no\/main\/salmon\/user\/7477"},{"rel":"http:\/\/salmon-protocol.org\/ns\/salmon-mention","href":"https:\/\/quitter.no\/main\/salmon\/user\/7477"},{"rel":"http:\/\/ostatus.org\/schema\/1.0\/subscribe","template":"https:\/\/quitter.no\/main\/ostatussub?profile={uri}"}]} diff --git a/spec/flatware_helper.rb b/spec/flatware_helper.rb new file mode 100644 index 00000000000..57a7c1f56a4 --- /dev/null +++ b/spec/flatware_helper.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +if defined?(Flatware) + Flatware.configure do |config| + config.after_fork do |test_env_number| + unless ENV.fetch('DISABLE_SIMPLECOV', nil) == 'true' + require 'simplecov' + SimpleCov.at_fork.call(test_env_number) # Combines parallel coverage results + end + end + end +end diff --git a/spec/lib/activitypub/activity/delete_spec.rb b/spec/lib/activitypub/activity/delete_spec.rb index 48421a11629..71977a96a2b 100644 --- a/spec/lib/activitypub/activity/delete_spec.rb +++ b/spec/lib/activitypub/activity/delete_spec.rb @@ -47,7 +47,7 @@ RSpec.describe ActivityPub::Activity::Delete do expect(Status.find_by(id: status.id)).to be_nil end - it 'sends delete activity to followers of rebloggers', :sidekiq_inline do + it 'sends delete activity to followers of rebloggers', :inline_jobs do expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once end diff --git a/spec/lib/activitypub/activity/flag_spec.rb b/spec/lib/activitypub/activity/flag_spec.rb index 426cd97df9a..be1bd42a14a 100644 --- a/spec/lib/activitypub/activity/flag_spec.rb +++ b/spec/lib/activitypub/activity/flag_spec.rb @@ -36,6 +36,7 @@ RSpec.describe ActivityPub::Activity::Flag do expect(report).to_not be_nil expect(report.comment).to eq 'Boo!!' expect(report.status_ids).to eq [status.id] + expect(report.application).to be_nil end end diff --git a/spec/lib/activitypub/activity/move_spec.rb b/spec/lib/activitypub/activity/move_spec.rb index 4dda014a068..02c3380ab3e 100644 --- a/spec/lib/activitypub/activity/move_spec.rb +++ b/spec/lib/activitypub/activity/move_spec.rb @@ -3,6 +3,9 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Move do + RSpec::Matchers.define_negated_matcher :not_be_following, :be_following + RSpec::Matchers.define_negated_matcher :not_be_requested, :be_requested + let(:follower) { Fabricate(:account) } let(:old_account) { Fabricate(:account, uri: 'https://example.org/alice', domain: 'example.org', protocol: :activitypub, inbox_url: 'https://example.org/inbox') } let(:new_account) { Fabricate(:account, uri: 'https://example.com/alice', domain: 'example.com', protocol: :activitypub, inbox_url: 'https://example.com/inbox', also_known_as: also_known_as) } @@ -38,49 +41,37 @@ RSpec.describe ActivityPub::Activity::Move do subject.perform end - context 'when all conditions are met', :sidekiq_inline do - it 'sets moved account on old account' do - expect(old_account.reload.moved_to_account_id).to eq new_account.id - end - - it 'makes followers unfollow old account' do - expect(follower.following?(old_account)).to be false - end - - it 'makes followers follow-request the new account' do - expect(follower.requested?(new_account)).to be true + context 'when all conditions are met', :inline_jobs do + it 'sets moved on old account, followers unfollow old account, followers request the new account' do + expect(old_account.reload.moved_to_account_id) + .to eq new_account.id + expect(follower) + .to not_be_following(old_account) + .and be_requested(new_account) end end context "when the new account can't be resolved" do let(:returned_account) { nil } - it 'does not set moved account on old account' do - expect(old_account.reload.moved_to_account_id).to be_nil - end - - it 'does not make followers unfollow old account' do - expect(follower.following?(old_account)).to be true - end - - it 'does not make followers follow-request the new account' do - expect(follower.requested?(new_account)).to be false + it 'does not set moved on old account, does not unfollow old, does not follow request new' do + expect(old_account.reload.moved_to_account_id) + .to be_nil + expect(follower) + .to be_following(old_account) + .and not_be_requested(new_account) end end context 'when the new account does not references the old account' do let(:also_known_as) { [] } - it 'does not set moved account on old account' do - expect(old_account.reload.moved_to_account_id).to be_nil - end - - it 'does not make followers unfollow old account' do - expect(follower.following?(old_account)).to be true - end - - it 'does not make followers follow-request the new account' do - expect(follower.requested?(new_account)).to be false + it 'does not set moved on old account, does not unfollow old, does not follow request new' do + expect(old_account.reload.moved_to_account_id) + .to be_nil + expect(follower) + .to be_following(old_account) + .and not_be_requested(new_account) end end @@ -91,16 +82,12 @@ RSpec.describe ActivityPub::Activity::Move do redis.del("move_in_progress:#{old_account.id}") end - it 'does not set moved account on old account' do - expect(old_account.reload.moved_to_account_id).to be_nil - end - - it 'does not make followers unfollow old account' do - expect(follower.following?(old_account)).to be true - end - - it 'does not make followers follow-request the new account' do - expect(follower.requested?(new_account)).to be false + it 'does not set moved on old account, does not unfollow old, does not follow request new' do + expect(old_account.reload.moved_to_account_id) + .to be_nil + expect(follower) + .to be_following(old_account) + .and not_be_requested(new_account) end end end diff --git a/spec/lib/activitypub/adapter_spec.rb b/spec/lib/activitypub/adapter_spec.rb index 7d8d703ec25..5ecdfe81205 100644 --- a/spec/lib/activitypub/adapter_spec.rb +++ b/spec/lib/activitypub/adapter_spec.rb @@ -59,7 +59,7 @@ RSpec.describe ActivityPub::Adapter do let(:serializer_class) { TestWithBasicContextSerializer } it 'renders a basic @context' do - expect(subject).to include({ '@context' => 'https://www.w3.org/ns/activitystreams' }) + expect(subject).to include({ '@context': 'https://www.w3.org/ns/activitystreams' }) end end @@ -67,7 +67,7 @@ RSpec.describe ActivityPub::Adapter do let(:serializer_class) { TestWithNamedContextSerializer } it 'renders a @context with both items' do - expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }) + expect(subject).to include({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }) end end @@ -75,7 +75,7 @@ RSpec.describe ActivityPub::Adapter do let(:serializer_class) { TestWithNestedNamedContextSerializer } it 'renders a @context with both items' do - expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }) + expect(subject).to include({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }) end end @@ -83,7 +83,7 @@ RSpec.describe ActivityPub::Adapter do let(:serializer_class) { TestWithContextExtensionSerializer } it 'renders a @context with the extension' do - expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', { 'sensitive' => 'as:sensitive' }] }) + expect(subject).to include({ '@context': ['https://www.w3.org/ns/activitystreams', { 'sensitive' => 'as:sensitive' }] }) end end @@ -91,7 +91,7 @@ RSpec.describe ActivityPub::Adapter do let(:serializer_class) { TestWithNestedContextExtensionSerializer } it 'renders a @context with both extensions' do - expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', { 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers', 'sensitive' => 'as:sensitive' }] }) + expect(subject).to include({ '@context': ['https://www.w3.org/ns/activitystreams', { 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers', 'sensitive' => 'as:sensitive' }] }) end end end diff --git a/spec/lib/cache_buster_spec.rb b/spec/lib/cache_buster_spec.rb index 78ca183490e..84085608e85 100644 --- a/spec/lib/cache_buster_spec.rb +++ b/spec/lib/cache_buster_spec.rb @@ -28,14 +28,6 @@ describe CacheBuster do end context 'when using default options' do - around do |example| - # Disables the CacheBuster.new deprecation warning about default arguments. - # Remove this `silence` block when default arg support is removed from CacheBuster - Rails.application.deprecators[:mastodon].silence do - example.run - end - end - include_examples 'makes_request' end diff --git a/spec/lib/extractor_spec.rb b/spec/lib/extractor_spec.rb index b6c910171d3..af5c62d4c8a 100644 --- a/spec/lib/extractor_spec.rb +++ b/spec/lib/extractor_spec.rb @@ -69,10 +69,10 @@ describe Extractor do end end - describe 'extract_cashtags_with_indices' do - it 'returns []' do + describe 'extract_entities_with_indices' do + it 'returns empty array when cashtag present' do text = '$cashtag' - extracted = described_class.extract_cashtags_with_indices(text) + extracted = described_class.extract_entities_with_indices(text) expect(extracted).to eq [] end end diff --git a/spec/lib/html_aware_formatter_spec.rb b/spec/lib/html_aware_formatter_spec.rb index a20902d4f9e..b75ccb06e76 100644 --- a/spec/lib/html_aware_formatter_spec.rb +++ b/spec/lib/html_aware_formatter_spec.rb @@ -41,6 +41,14 @@ RSpec.describe HtmlAwareFormatter do expect(subject).to_not include 'status__content__spoiler-link' end end + + context 'when given text containing ruby tags for east-asian languages' do + let(:text) { '明日 (Ashita)' } + + it 'keeps the ruby tags' do + expect(subject).to eq '明日 (Ashita)' + end + end end end end diff --git a/spec/lib/link_details_extractor_spec.rb b/spec/lib/link_details_extractor_spec.rb index 26d9d4e2659..b1e5cedced3 100644 --- a/spec/lib/link_details_extractor_spec.rb +++ b/spec/lib/link_details_extractor_spec.rb @@ -129,6 +129,24 @@ RSpec.describe LinkDetailsExtractor do include_examples 'structured data' end + context 'with the first tag is null' do + let(:html) { <<~HTML } + + + + + + + + HTML + + include_examples 'structured data' + end + context 'with preceding block of unsupported LD+JSON' do let(:html) { <<~HTML } @@ -192,6 +210,35 @@ RSpec.describe LinkDetailsExtractor do include_examples 'structured data' end + + context 'with author names as array' do + let(:ld_json) do + { + '@context' => 'https://schema.org', + '@type' => 'NewsArticle', + 'headline' => 'A lot of authors', + 'description' => 'But we decided to cram them into one', + 'author' => { + '@type' => 'Person', + 'name' => ['Author 1', 'Author 2'], + }, + }.to_json + end + let(:html) { <<~HTML } + + + + + + + HTML + + it 'joins author names' do + expect(subject.author_name).to eq 'Author 1, Author 2' + end + end end context 'when Open Graph protocol data is present' do diff --git a/spec/lib/plain_text_formatter_spec.rb b/spec/lib/plain_text_formatter_spec.rb index 80b3c331a6b..b22f473d0ce 100644 --- a/spec/lib/plain_text_formatter_spec.rb +++ b/spec/lib/plain_text_formatter_spec.rb @@ -72,6 +72,14 @@ RSpec.describe PlainTextFormatter do expect(subject).to eq 'Lorem ipsum' end end + + context 'when text contains HTML ruby tags' do + let(:status) { Fabricate(:status, account: remote_account, text: '

Lorem 明日 (Ashita) ipsum

') } + + it 'strips the comment' do + expect(subject).to eq 'Lorem 明日 (Ashita) ipsum' + end + end end end end diff --git a/spec/lib/sanitize/config_spec.rb b/spec/lib/sanitize/config_spec.rb index 2d8dc2f63be..fe0b272c0a2 100644 --- a/spec/lib/sanitize/config_spec.rb +++ b/spec/lib/sanitize/config_spec.rb @@ -18,6 +18,10 @@ describe Sanitize::Config do expect(Sanitize.fragment('

Check out:

  1. Foo
  2. Bar
', subject)).to eq '

Check out:

  1. Foo
  2. Bar
' end + it 'keeps ruby tags' do + expect(Sanitize.fragment('

明日 (Ashita)

', subject)).to eq '

明日 (Ashita)

' + end + it 'removes a without href' do expect(Sanitize.fragment('Test', subject)).to eq 'Test' end diff --git a/spec/lib/text_formatter_spec.rb b/spec/lib/text_formatter_spec.rb index 8b922c018b0..bde17bb79c5 100644 --- a/spec/lib/text_formatter_spec.rb +++ b/spec/lib/text_formatter_spec.rb @@ -224,6 +224,14 @@ RSpec.describe TextFormatter do end end + context 'when given a URL with trailing @ symbol' do + let(:text) { 'https://gta.fandom.com/wiki/TW@ Content' } + + it 'matches the full URL' do + expect(subject).to include 'href="https://gta.fandom.com/wiki/TW@"' + end + end + context 'when given a URL containing unsafe code (XSS attack, visible part)' do let(:text) { 'http://example.com/bb' } diff --git a/spec/lib/vacuum/media_attachments_vacuum_spec.rb b/spec/lib/vacuum/media_attachments_vacuum_spec.rb index 3c17ecb0003..1039c36cea6 100644 --- a/spec/lib/vacuum/media_attachments_vacuum_spec.rb +++ b/spec/lib/vacuum/media_attachments_vacuum_spec.rb @@ -17,32 +17,21 @@ RSpec.describe Vacuum::MediaAttachmentsVacuum do let!(:old_unattached_media) { Fabricate(:media_attachment, account_id: nil, created_at: 10.days.ago) } let!(:new_unattached_media) { Fabricate(:media_attachment, account_id: nil, created_at: 1.hour.ago) } - before do - subject.perform - end + before { subject.perform } - it 'deletes cache of remote media attachments past the retention period' do - expect(old_remote_media.reload.file).to be_blank - end - - it 'does not touch local media attachments past the retention period' do - expect(old_local_media.reload.file).to_not be_blank - end - - it 'does not delete cache of remote media attachments within the retention period' do - expect(new_remote_media.reload.file).to_not be_blank - end - - it 'does not touch local media attachments within the retention period' do - expect(new_local_media.reload.file).to_not be_blank - end - - it 'deletes unattached media attachments past TTL' do - expect { old_unattached_media.reload }.to raise_error(ActiveRecord::RecordNotFound) - end - - it 'does not delete unattached media attachments within TTL' do - expect(new_unattached_media.reload).to be_persisted + it 'handles attachments based on metadata details' do + expect(old_remote_media.reload.file) # Remote and past retention period + .to be_blank + expect(old_local_media.reload.file) # Local and past retention + .to_not be_blank + expect(new_remote_media.reload.file) # Remote and within retention + .to_not be_blank + expect(new_local_media.reload.file) # Local and within retention + .to_not be_blank + expect { old_unattached_media.reload } # Unattached and past TTL + .to raise_error(ActiveRecord::RecordNotFound) + expect(new_unattached_media.reload) # Unattached and within TTL + .to be_persisted end end end diff --git a/spec/lib/webfinger_spec.rb b/spec/lib/webfinger_spec.rb new file mode 100644 index 00000000000..5015deac7ff --- /dev/null +++ b/spec/lib/webfinger_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Webfinger do + describe 'self link' do + context 'when self link is specified with type application/activity+json' do + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } + + it 'correctly parses the response' do + stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) + + response = described_class.new('acct:alice@example.com').perform + + expect(response.self_link_href).to eq 'https://example.com/alice' + end + end + + context 'when self link is specified with type application/ld+json' do + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' }] } } + + it 'correctly parses the response' do + stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) + + response = described_class.new('acct:alice@example.com').perform + + expect(response.self_link_href).to eq 'https://example.com/alice' + end + end + + context 'when self link is specified with incorrect type' do + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/json"' }] } } + + it 'raises an error' do + stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) + + expect { described_class.new('acct:alice@example.com').perform }.to raise_error(Webfinger::Error) + end + end + end +end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 225929ae39f..8e5648a0b0e 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -592,7 +592,7 @@ RSpec.describe Account do expect(results).to eq [match] end - it 'limits by 10 by default' do + it 'limits result count by default value' do stub_const('Account::Search::DEFAULT_LIMIT', 1) 2.times { Fabricate(:account, display_name: 'Display Name') } results = described_class.advanced_search_for('display', account) @@ -711,6 +711,14 @@ RSpec.describe Account do it 'does not match URL query string' do expect(subject.match('https://example.com/?x=@alice')).to be_nil end + + it 'matches usernames immediately following the letter ß' do + expect(subject.match('Hello toß @alice from me')[1]).to eq 'alice' + end + + it 'matches usernames containing uppercase characters' do + expect(subject.match('Hello to @aLice@Example.com from me')[1]).to eq 'aLice@Example.com' + end end describe 'validations' do @@ -775,7 +783,7 @@ RSpec.describe Account do end it 'is invalid if the display name is longer than the character limit' do - account = Fabricate.build(:account, display_name: username_over_limit) + account = Fabricate.build(:account, display_name: display_name_over_limit) account.valid? expect(account).to model_have_error_on_field(:display_name) end @@ -821,7 +829,7 @@ RSpec.describe Account do end it 'is valid even if the display name is longer than the character limit' do - account = Fabricate.build(:account, domain: 'domain', display_name: username_over_limit) + account = Fabricate.build(:account, domain: 'domain', display_name: display_name_over_limit) account.valid? expect(account).to_not model_have_error_on_field(:display_name) end @@ -837,6 +845,10 @@ RSpec.describe Account do 'a' * described_class::USERNAME_LENGTH_LIMIT * 2 end + def display_name_over_limit + 'a' * described_class::DISPLAY_NAME_LENGTH_LIMIT * 2 + end + def account_note_over_limit 'a' * described_class::NOTE_LENGTH_LIMIT * 2 end @@ -1015,21 +1027,26 @@ RSpec.describe Account do context 'when is local' do it 'generates keys' do - account = described_class.create!(domain: nil, username: Faker::Internet.user_name(separators: ['_'])) - expect(account.keypair).to be_private - expect(account.keypair).to be_public + account = described_class.create!(domain: nil, username: 'user_without_keys') + + expect(account) + .to be_private_key + .and be_public_key + expect(account.keypair) + .to be_private + .and be_public end end context 'when is remote' do it 'does not generate keys' do key = OpenSSL::PKey::RSA.new(1024).public_key - account = described_class.create!(domain: 'remote', uri: 'https://remote/actor', username: Faker::Internet.user_name(separators: ['_']), public_key: key.to_pem) + account = described_class.create!(domain: 'remote', uri: 'https://remote/actor', username: 'remote_user_with_public', public_key: key.to_pem) expect(account.keypair.params).to eq key.params end it 'normalizes domain' do - account = described_class.create!(domain: 'にゃん', uri: 'https://xn--r9j5b5b/actor', username: Faker::Internet.user_name(separators: ['_'])) + account = described_class.create!(domain: 'にゃん', uri: 'https://xn--r9j5b5b/actor', username: 'remote_user_with_idn_domain') expect(account.domain).to eq 'xn--r9j5b5b' end end diff --git a/spec/models/admin/account_action_spec.rb b/spec/models/admin/account_action_spec.rb index e55db2f814a..49bc2b4a91c 100644 --- a/spec/models/admin/account_action_spec.rb +++ b/spec/models/admin/account_action_spec.rb @@ -69,7 +69,7 @@ RSpec.describe Admin::AccountAction do end end - it 'sends email to target account user', :sidekiq_inline do + it 'sends email to target account user', :inline_jobs do emails = capture_emails { subject } expect(emails).to contain_exactly( diff --git a/spec/models/admin/tag_filter_spec.rb b/spec/models/admin/tag_filter_spec.rb new file mode 100644 index 00000000000..21dc28affb3 --- /dev/null +++ b/spec/models/admin/tag_filter_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Admin::TagFilter do + describe 'with invalid params' do + it 'raises with key error' do + filter = described_class.new(wrong: true) + + expect { filter.results }.to raise_error(/wrong/) + end + + it 'raises with status scope error' do + filter = described_class.new(status: 'unknown') + + expect { filter.results }.to raise_error(/Unknown status: unknown/) + end + + it 'raises with order value error' do + filter = described_class.new(order: 'unknown') + + expect { filter.results }.to raise_error(/Unknown order: unknown/) + end + end + + describe '#results' do + let(:listable_tag) { Fabricate(:tag, name: 'test1', listable: true) } + let(:not_listable_tag) { Fabricate(:tag, name: 'test2', listable: false) } + + it 'returns tags filtered by name' do + filter = described_class.new(name: 'test') + + expect(filter.results).to eq([listable_tag, not_listable_tag]) + end + end +end diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb index 038d1d0c6cd..cb8cb5c11bd 100644 --- a/spec/models/custom_emoji_spec.rb +++ b/spec/models/custom_emoji_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe CustomEmoji, :paperclip_processing do +RSpec.describe CustomEmoji, :attachment_processing do describe '#search' do subject { described_class.search(search_term) } diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb index 221645ac5ae..3142b291fb2 100644 --- a/spec/models/media_attachment_spec.rb +++ b/spec/models/media_attachment_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe MediaAttachment, :paperclip_processing do +RSpec.describe MediaAttachment, :attachment_processing do describe 'local?' do subject { media_attachment.local? } @@ -90,7 +90,7 @@ RSpec.describe MediaAttachment, :paperclip_processing do media.destroy end - it 'saves media attachment with correct file metadata' do + it 'saves media attachment with correct file and size metadata' do expect(media) .to be_persisted .and be_processing_complete @@ -103,14 +103,12 @@ RSpec.describe MediaAttachment, :paperclip_processing do # Rack::Mime (used by PublicFileServerMiddleware) recognizes file extension expect(Rack::Mime.mime_type(extension, nil)).to eq content_type - end - it 'saves media attachment with correct size metadata' do - # strips original file name + # Strip original file name expect(media.file_file_name) .to_not start_with '600x400' - # sets meta for original and thumbnail + # Set meta for original and thumbnail expect(media.file.meta.deep_symbolize_keys) .to include( original: include( @@ -174,10 +172,18 @@ RSpec.describe MediaAttachment, :paperclip_processing do let(:media) { Fabricate(:media_attachment, file: attachment_fixture('avatar.gif')) } it 'sets correct file metadata' do - expect(media.type).to eq 'gifv' - expect(media.file_content_type).to eq 'video/mp4' - expect(media.file.meta['original']['width']).to eq 128 - expect(media.file.meta['original']['height']).to eq 128 + expect(media) + .to have_attributes( + type: eq('gifv'), + file_content_type: eq('video/mp4') + ) + expect(media_metadata) + .to include( + original: include( + width: eq(128), + height: eq(128) + ) + ) end end @@ -192,11 +198,19 @@ RSpec.describe MediaAttachment, :paperclip_processing do let(:media) { Fabricate(:media_attachment, file: attachment_fixture(fixture[:filename])) } it 'sets correct file metadata' do - expect(media.type).to eq 'image' - expect(media.file_content_type).to eq 'image/gif' - expect(media.file.meta['original']['width']).to eq fixture[:width] - expect(media.file.meta['original']['height']).to eq fixture[:height] - expect(media.file.meta['original']['aspect']).to eq fixture[:aspect] + expect(media) + .to have_attributes( + type: eq('image'), + file_content_type: eq('image/gif') + ) + expect(media_metadata) + .to include( + original: include( + width: eq(fixture[:width]), + height: eq(fixture[:height]), + aspect: eq(fixture[:aspect]) + ) + ) end end end @@ -204,35 +218,42 @@ RSpec.describe MediaAttachment, :paperclip_processing do describe 'ogg with cover art' do let(:media) { Fabricate(:media_attachment, file: attachment_fixture('boop.ogg')) } + let(:expected_media_duration) { 0.235102 } + + # The libvips and ImageMagick implementations produce different results + let(:expected_background_color) { Rails.configuration.x.use_vips ? '#268cd9' : '#3088d4' } it 'sets correct file metadata' do - expect(media.type).to eq 'audio' - expect(media.file.meta['original']['duration']).to be_within(0.05).of(0.235102) - expect(media.thumbnail.present?).to be true + expect(media) + .to have_attributes( + type: eq('audio'), + thumbnail: be_present, + file_file_name: not_eq('boop.ogg') + ) - # NOTE: Our libvips and ImageMagick implementations currently have different results - expect(media.file.meta['colors']['background']).to eq(ENV['MASTODON_USE_LIBVIPS'] ? '#268cd9' : '#3088d4') - expect(media.file_file_name).to_not eq 'boop.ogg' + expect(media_metadata) + .to include( + original: include(duration: be_within(0.05).of(expected_media_duration)), + colors: include(background: eq(expected_background_color)) + ) end end describe 'mp3 with large cover art' do let(:media) { Fabricate(:media_attachment, file: attachment_fixture('boop.mp3')) } + let(:expected_media_duration) { 0.235102 } - it 'detects it as an audio file' do - expect(media.type).to eq 'audio' - end - - it 'sets meta for the duration' do - expect(media.file.meta['original']['duration']).to be_within(0.05).of(0.235102) - end - - it 'extracts thumbnail' do - expect(media.thumbnail.present?).to be true - end - - it 'gives the file a random name' do - expect(media.file_file_name).to_not eq 'boop.mp3' + it 'detects file type and sets correct metadata' do + expect(media) + .to have_attributes( + type: eq('audio'), + thumbnail: be_present, + file_file_name: not_eq('boop.mp3') + ) + expect(media_metadata) + .to include( + original: include(duration: be_within(0.05).of(expected_media_duration)) + ) end end @@ -270,4 +291,10 @@ RSpec.describe MediaAttachment, :paperclip_processing do expect(media.valid?).to be true end end + + private + + def media_metadata + media.file.meta.deep_symbolize_keys + end end diff --git a/spec/models/notification_request_spec.rb b/spec/models/notification_request_spec.rb index 07bbc3e0a8e..4adddc194f0 100644 --- a/spec/models/notification_request_spec.rb +++ b/spec/models/notification_request_spec.rb @@ -4,9 +4,7 @@ require 'rails_helper' RSpec.describe NotificationRequest do describe '#reconsider_existence!' do - subject { Fabricate(:notification_request, dismissed: dismissed) } - - let(:dismissed) { false } + subject { Fabricate(:notification_request) } context 'when there are remaining notifications' do before do @@ -28,14 +26,6 @@ RSpec.describe NotificationRequest do subject.reconsider_existence! end - context 'when dismissed' do - let(:dismissed) { true } - - it 'leaves request intact' do - expect(subject.destroyed?).to be false - end - end - it 'removes the request' do expect(subject.destroyed?).to be true end diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 271cf8690ec..df67c365eb3 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -247,6 +247,41 @@ RSpec.describe Status do end end + describe '#ordered_media_attachments' do + let(:status) { Fabricate(:status) } + + let(:first_attachment) { Fabricate(:media_attachment) } + let(:second_attachment) { Fabricate(:media_attachment) } + let(:last_attachment) { Fabricate(:media_attachment) } + let(:extra_attachment) { Fabricate(:media_attachment) } + + before do + stub_const('Status::MEDIA_ATTACHMENTS_LIMIT', 3) + + # Add attachments out of order + status.media_attachments << second_attachment + status.media_attachments << last_attachment + status.media_attachments << extra_attachment + status.media_attachments << first_attachment + end + + context 'when ordered_media_attachment_ids is not set' do + it 'returns up to MEDIA_ATTACHMENTS_LIMIT attachments' do + expect(status.ordered_media_attachments.size).to eq Status::MEDIA_ATTACHMENTS_LIMIT + end + end + + context 'when ordered_media_attachment_ids is set' do + before do + status.update!(ordered_media_attachment_ids: [first_attachment.id, second_attachment.id, last_attachment.id, extra_attachment.id]) + end + + it 'returns up to MEDIA_ATTACHMENTS_LIMIT attachments in the expected order' do + expect(status.ordered_media_attachments).to eq [first_attachment, second_attachment, last_attachment] + 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 7799afe44b2..ff0a0551133 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -95,6 +95,14 @@ RSpec.describe Tag do it 'does not match purely-numeric hashtags' do expect(subject.match('hello #0123456')).to be_nil end + + it 'matches hashtags immediately following the letter ß' do + expect(subject.match('Hello toß #ruby').to_s).to eq '#ruby' + end + + it 'matches hashtags containing uppercase characters' do + expect(subject.match('Hello #rubyOnRails').to_s).to eq '#rubyOnRails' + end end describe '#to_param' do @@ -104,6 +112,18 @@ RSpec.describe Tag do end end + describe '#formatted_name' do + it 'returns name with a proceeding hash symbol' do + tag = Fabricate(:tag, name: 'foo') + expect(tag.formatted_name).to eq '#foo' + end + + it 'returns display_name with a proceeding hash symbol, if display name present' do + tag = Fabricate(:tag, name: 'foobar', display_name: 'FooBar') + expect(tag.formatted_name).to eq '#FooBar' + end + end + describe '.recently_used' do let(:account) { Fabricate(:account) } let(:other_person_status) { Fabricate(:status) } @@ -232,5 +252,23 @@ RSpec.describe Tag do expect(results).to eq [tag, similar_tag] end + + it 'finds only listable tags' do + tag = Fabricate(:tag, name: 'match') + _miss_tag = Fabricate(:tag, name: 'matchunlisted', listable: false) + + results = described_class.search_for('match') + + expect(results).to eq [tag] + end + + it 'finds non-listable tags as well via option' do + tag = Fabricate(:tag, name: 'match') + unlisted_tag = Fabricate(:tag, name: 'matchunlisted', listable: false) + + results = described_class.search_for('match', 5, 0, exclude_unlistable: false) + + expect(results).to eq [tag, unlisted_tag] + end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index fa0a0503a65..4755500fc4e 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -101,7 +101,7 @@ RSpec.describe User do end end - describe 'scopes', :sidekiq_inline do + describe 'scopes', :inline_jobs do describe 'recent' do it 'returns an array of recent users ordered by id' do first_user = Fabricate(:user) @@ -507,7 +507,7 @@ RSpec.describe User do context 'when user is new' do let(:confirmed_at) { nil } - it 'confirms user and delivers welcome email', :sidekiq_inline do + it 'confirms user and delivers welcome email', :inline_jobs do emails = capture_emails { subject } expect(user.confirmed_at).to be_present diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 38aa711089e..d4b9bddf93f 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -120,7 +120,7 @@ RSpec.configure do |config| end config.around do |example| - if example.metadata[:sidekiq_inline] == true + if example.metadata[:inline_jobs] == true Sidekiq::Testing.inline! else Sidekiq::Testing.fake! @@ -137,7 +137,7 @@ RSpec.configure do |config| end config.before do |example| - unless example.metadata[:paperclip_processing] + unless example.metadata[:attachment_processing] allow_any_instance_of(Paperclip::Attachment).to receive(:post_process).and_return(true) # rubocop:disable RSpec/AnyInstance end end @@ -161,6 +161,7 @@ RSpec::Sidekiq.configure do |config| end RSpec::Matchers.define_negated_matcher :not_change, :change +RSpec::Matchers.define_negated_matcher :not_eq, :eq RSpec::Matchers.define_negated_matcher :not_include, :include def request_fixture(name) diff --git a/spec/requests/account_show_page_spec.rb b/spec/requests/account_show_page_spec.rb index 81e965e6e6c..830d7786081 100644 --- a/spec/requests/account_show_page_spec.rb +++ b/spec/requests/account_show_page_spec.rb @@ -9,7 +9,7 @@ describe 'The account show page' do get '/@alice' - expect(head_link_icons.size).to eq(4) # One general favicon and three with sizes + expect(head_link_icons.size).to eq(3) # Three favicons with sizes expect(head_meta_content('og:title')).to match alice.display_name expect(head_meta_content('og:type')).to eq 'profile' diff --git a/spec/requests/api/v1/accounts/statuses_spec.rb b/spec/requests/api/v1/accounts/statuses_spec.rb index 371867b2157..97cdbe0156f 100644 --- a/spec/requests/api/v1/accounts/statuses_spec.rb +++ b/spec/requests/api/v1/accounts/statuses_spec.rb @@ -10,12 +10,15 @@ describe 'API V1 Accounts Statuses' do describe 'GET /api/v1/accounts/:account_id/statuses' do it 'returns expected headers', :aggregate_failures do - Fabricate(:status, account: user.account) + status = Fabricate(:status, account: user.account) get "/api/v1/accounts/#{user.account.id}/statuses", params: { limit: 1 }, headers: headers - expect(response).to have_http_status(200) - expect(links_from_header.size) - .to eq(2) + expect(response) + .to have_http_status(200) + .and include_pagination_headers( + prev: api_v1_account_statuses_url(limit: 1, min_id: status.id), + next: api_v1_account_statuses_url(limit: 1, max_id: status.id) + ) end context 'with only media' do @@ -55,16 +58,9 @@ describe 'API V1 Accounts Statuses' do it 'returns http success and includes a header link' do get "/api/v1/accounts/#{user.account.id}/statuses", params: { pinned: true }, headers: headers - expect(response).to have_http_status(200) - expect(links_from_header.size) - .to eq(1) - expect(links_from_header) - .to contain_exactly( - have_attributes( - href: /pinned=true/, - attr_pairs: contain_exactly(['rel', 'prev']) - ) - ) + expect(response) + .to have_http_status(200) + .and include_pagination_headers(prev: api_v1_account_statuses_url(pinned: true, min_id: Status.first.id)) end end @@ -77,19 +73,11 @@ describe 'API V1 Accounts Statuses' do it 'returns http success and header pagination links to prev and next' do get "/api/v1/accounts/#{user.account.id}/statuses", params: { pinned: true }, headers: headers - expect(response).to have_http_status(200) - expect(links_from_header.size) - .to eq(2) - expect(links_from_header) - .to contain_exactly( - have_attributes( - href: /pinned=true/, - attr_pairs: contain_exactly(['rel', 'next']) - ), - have_attributes( - href: /pinned=true/, - attr_pairs: contain_exactly(['rel', 'prev']) - ) + expect(response) + .to have_http_status(200) + .and include_pagination_headers( + prev: api_v1_account_statuses_url(pinned: true, min_id: Status.first.id), + next: api_v1_account_statuses_url(pinned: true, max_id: Status.first.id) ) end end @@ -138,12 +126,4 @@ describe 'API V1 Accounts Statuses' do end end end - - private - - def links_from_header - response - .headers['Link'] - .links - end end diff --git a/spec/requests/api/v1/admin/account_actions_spec.rb b/spec/requests/api/v1/admin/account_actions_spec.rb index 778658508ec..5bcf809401d 100644 --- a/spec/requests/api/v1/admin/account_actions_spec.rb +++ b/spec/requests/api/v1/admin/account_actions_spec.rb @@ -10,7 +10,7 @@ RSpec.describe 'Account actions' do let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } shared_examples 'a successful notification delivery' do - it 'notifies the user about the action taken', :sidekiq_inline do + it 'notifies the user about the action taken', :inline_jobs do emails = capture_emails { subject } expect(emails.size) diff --git a/spec/requests/api/v1/admin/measures_spec.rb b/spec/requests/api/v1/admin/measures_spec.rb index 15f2df84c63..80fed79d9a6 100644 --- a/spec/requests/api/v1/admin/measures_spec.rb +++ b/spec/requests/api/v1/admin/measures_spec.rb @@ -7,11 +7,28 @@ describe 'Admin Measures' do let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let(:account) { Fabricate(:account) } + let(:params) do + { + keys: %w(instance_accounts instance_follows instance_followers), + instance_accounts: { + domain: 'mastodon.social', + include_subdomains: true, + }, + instance_follows: { + domain: 'mastodon.social', + include_subdomains: true, + }, + instance_followers: { + domain: 'mastodon.social', + include_subdomains: true, + }, + } + end describe 'GET /api/v1/admin/measures' do context 'when not authorized' do it 'returns http forbidden' do - post '/api/v1/admin/measures', params: { account_id: account.id, limit: 2 } + post '/api/v1/admin/measures', params: params expect(response) .to have_http_status(403) @@ -22,7 +39,7 @@ describe 'Admin Measures' do let(:scopes) { 'admin:read' } it 'returns http success and status json' do - post '/api/v1/admin/measures', params: { account_id: account.id, limit: 2 }, headers: headers + post '/api/v1/admin/measures', params: params, headers: headers expect(response) .to have_http_status(200) diff --git a/spec/requests/api/v1/conversations_spec.rb b/spec/requests/api/v1/conversations_spec.rb index caa0f5c52c0..f136e1f4e84 100644 --- a/spec/requests/api/v1/conversations_spec.rb +++ b/spec/requests/api/v1/conversations_spec.rb @@ -10,7 +10,7 @@ RSpec.describe 'API V1 Conversations' do let(:other) { Fabricate(:user) } - describe 'GET /api/v1/conversations', :sidekiq_inline do + describe 'GET /api/v1/conversations', :inline_jobs do before do user.account.follow!(other.account) PostStatusService.new.call(other.account, text: 'Hey @alice', visibility: 'direct') @@ -20,8 +20,12 @@ RSpec.describe 'API V1 Conversations' do it 'returns pagination headers', :aggregate_failures do get '/api/v1/conversations', params: { limit: 1 }, headers: headers - expect(response).to have_http_status(200) - expect(response.headers['Link'].links.size).to eq(2) + expect(response) + .to have_http_status(200) + .and include_pagination_headers( + prev: api_v1_conversations_url(limit: 1, min_id: Status.first.id), + next: api_v1_conversations_url(limit: 1, max_id: Status.first.id) + ) end it 'returns conversations', :aggregate_failures do diff --git a/spec/requests/api/v1/featured_tags_spec.rb b/spec/requests/api/v1/featured_tags_spec.rb index f499dd1d09a..4b969887041 100644 --- a/spec/requests/api/v1/featured_tags_spec.rb +++ b/spec/requests/api/v1/featured_tags_spec.rb @@ -147,7 +147,7 @@ RSpec.describe 'FeaturedTags' do expect(body).to be_empty end - it 'deletes the featured tag', :sidekiq_inline do + it 'deletes the featured tag', :inline_jobs do delete "/api/v1/featured_tags/#{id}", headers: headers featured_tag = FeaturedTag.find_by(id: id) diff --git a/spec/requests/api/v1/media_spec.rb b/spec/requests/api/v1/media_spec.rb index 26c76b9c5b9..c89c49afdf4 100644 --- a/spec/requests/api/v1/media_spec.rb +++ b/spec/requests/api/v1/media_spec.rb @@ -121,19 +121,19 @@ RSpec.describe 'Media' do end end - context 'with image/jpeg', :paperclip_processing do + context 'with image/jpeg', :attachment_processing do let(:params) { { file: fixture_file_upload('attachment.jpg', 'image/jpeg'), description: 'jpeg image' } } it_behaves_like 'a successful media upload', 'image' end - context 'with image/gif', :paperclip_processing do + context 'with image/gif', :attachment_processing do let(:params) { { file: fixture_file_upload('attachment.gif', 'image/gif') } } it_behaves_like 'a successful media upload', 'image' end - context 'with video/webm', :paperclip_processing do + context 'with video/webm', :attachment_processing do let(:params) { { file: fixture_file_upload('attachment.webm', 'video/webm') } } it_behaves_like 'a successful media upload', 'gifv' diff --git a/spec/requests/api/v1/notifications/policies_spec.rb b/spec/requests/api/v1/notifications/policies_spec.rb index d02d2ed0d7b..cbd4499772d 100644 --- a/spec/requests/api/v1/notifications/policies_spec.rb +++ b/spec/requests/api/v1/notifications/policies_spec.rb @@ -8,7 +8,7 @@ RSpec.describe 'Policies' do let(:scopes) { 'read:notifications write:notifications' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - describe 'GET /api/v1/notifications/policy', :sidekiq_inline do + describe 'GET /api/v1/notifications/policy', :inline_jobs do subject do get '/api/v1/notifications/policy', headers: headers, params: params end diff --git a/spec/requests/api/v1/notifications/requests_spec.rb b/spec/requests/api/v1/notifications/requests_spec.rb index 772402a6b5a..e1fe17426a2 100644 --- a/spec/requests/api/v1/notifications/requests_spec.rb +++ b/spec/requests/api/v1/notifications/requests_spec.rb @@ -8,7 +8,7 @@ RSpec.describe 'Requests' do let(:scopes) { 'read:notifications write:notifications' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - describe 'GET /api/v1/notifications/requests', :sidekiq_inline do + describe 'GET /api/v1/notifications/requests', :inline_jobs do subject do get '/api/v1/notifications/requests', headers: headers, params: params end @@ -17,7 +17,6 @@ RSpec.describe 'Requests' do before do Fabricate(:notification_request, account: user.account) - Fabricate(:notification_request, account: user.account, dismissed: true) end it_behaves_like 'forbidden for wrong scope', 'write write:notifications' @@ -29,16 +28,6 @@ RSpec.describe 'Requests' do expect(response).to have_http_status(200) end end - - context 'with dismissed' do - let(:params) { { dismissed: '1' } } - - it 'returns http success', :aggregate_failures do - subject - - expect(response).to have_http_status(200) - end - end end describe 'POST /api/v1/notifications/requests/:id/accept' do @@ -78,15 +67,14 @@ RSpec.describe 'Requests' do post "/api/v1/notifications/requests/#{notification_request.id}/dismiss", headers: headers end - let(:notification_request) { Fabricate(:notification_request, account: user.account) } + let!(:notification_request) { Fabricate(:notification_request, account: user.account) } it_behaves_like 'forbidden for wrong scope', 'read read:notifications' - it 'returns http success and dismisses the notification request', :aggregate_failures do - subject + it 'returns http success and destroys the notification request', :aggregate_failures do + expect { subject }.to change(NotificationRequest, :count).by(-1) expect(response).to have_http_status(200) - expect(notification_request.reload.dismissed?).to be true end context 'when notification request belongs to someone else' do @@ -99,4 +87,37 @@ RSpec.describe 'Requests' do end end end + + describe 'POST /api/v1/notifications/requests/accept' do + subject do + post '/api/v1/notifications/requests/accept', params: { id: [notification_request.id] }, headers: headers + end + + let!(:notification_request) { Fabricate(:notification_request, account: user.account) } + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'returns http success and creates notification permission', :aggregate_failures do + subject + + expect(NotificationPermission.find_by(account: notification_request.account, from_account: notification_request.from_account)).to_not be_nil + expect(response).to have_http_status(200) + end + end + + describe 'POST /api/v1/notifications/requests/dismiss' do + subject do + post '/api/v1/notifications/requests/dismiss', params: { id: [notification_request.id] }, headers: headers + end + + let!(:notification_request) { Fabricate(:notification_request, account: user.account) } + + it_behaves_like 'forbidden for wrong scope', 'read read:notifications' + + it 'returns http success and destroys the notification request', :aggregate_failures do + expect { subject }.to change(NotificationRequest, :count).by(-1) + + expect(response).to have_http_status(200) + end + end end diff --git a/spec/requests/api/v1/notifications_spec.rb b/spec/requests/api/v1/notifications_spec.rb index 55d3cdac948..3d1e8a4787b 100644 --- a/spec/requests/api/v1/notifications_spec.rb +++ b/spec/requests/api/v1/notifications_spec.rb @@ -8,7 +8,84 @@ RSpec.describe 'Notifications' do let(:scopes) { 'read:notifications write:notifications' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - describe 'GET /api/v1/notifications', :sidekiq_inline do + describe 'GET /api/v1/notifications/unread_count', :inline_jobs do + subject do + get '/api/v1/notifications/unread_count', headers: headers, params: params + end + + let(:params) { {} } + + before do + first_status = PostStatusService.new.call(user.account, text: 'Test') + ReblogService.new.call(Fabricate(:account), first_status) + PostStatusService.new.call(Fabricate(:account), text: 'Hello @alice') + FavouriteService.new.call(Fabricate(:account), first_status) + FavouriteService.new.call(Fabricate(:account), first_status) + FollowService.new.call(Fabricate(:account), user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'with no options' do + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 5 + end + end + + context 'with a read marker' do + before do + id = user.account.notifications.browserable.order(id: :desc).offset(2).first.id + user.markers.create!(timeline: 'notifications', last_read_id: id) + end + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 2 + end + end + + context 'with exclude_types param' do + let(:params) { { exclude_types: %w(mention) } } + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 4 + end + end + + context 'with a user-provided limit' do + let(:params) { { limit: 2 } } + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 2 + end + end + + context 'when there are more notifications than the limit' do + before do + stub_const('Api::V1::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT', 2) + end + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq Api::V1::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT + end + end + end + + describe 'GET /api/v1/notifications', :inline_jobs do subject do get '/api/v1/notifications', headers: headers, params: params end @@ -20,8 +97,8 @@ RSpec.describe 'Notifications' do before do first_status = PostStatusService.new.call(user.account, text: 'Test') ReblogService.new.call(bob.account, first_status) - mentioning_status = PostStatusService.new.call(bob.account, text: 'Hello @alice') - mentioning_status.mentions.first + PostStatusService.new.call(bob.account, text: 'Hello @alice') + PostStatusService.new.call(tom.account, text: 'Hello @alice', visibility: :direct) # Filtered by default FavouriteService.new.call(bob.account, first_status) FavouriteService.new.call(tom.account, first_status) FollowService.new.call(bob.account, user.account) @@ -34,10 +111,22 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_json_types).to include 'reblog' - expect(body_json_types).to include 'mention' - expect(body_json_types).to include 'favourite' - expect(body_json_types).to include 'follow' + expect(body_as_json.size).to eq 5 + expect(body_json_types).to include('reblog', 'mention', 'favourite', 'follow') + expect(body_as_json.any? { |x| x[:filtered] }).to be false + end + end + + context 'with include_filtered' do + let(:params) { { include_filtered: true } } + + it 'returns expected notification types, including filtered notifications' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json.size).to eq 6 + expect(body_json_types).to include('reblog', 'mention', 'favourite', 'follow') + expect(body_as_json.any? { |x| x[:filtered] }).to be true end end @@ -96,7 +185,7 @@ RSpec.describe 'Notifications' do it 'returns the requested number of notifications paginated', :aggregate_failures do subject - notifications = user.account.notifications + notifications = user.account.notifications.browserable expect(body_as_json.size) .to eq(params[:limit]) diff --git a/spec/requests/api/v1/polls/votes_spec.rb b/spec/requests/api/v1/polls/votes_spec.rb index e2b22708be8..669f64b6e45 100644 --- a/spec/requests/api/v1/polls/votes_spec.rb +++ b/spec/requests/api/v1/polls/votes_spec.rb @@ -10,9 +10,10 @@ RSpec.describe 'API V1 Polls Votes' do describe 'POST /api/v1/polls/:poll_id/votes' do let(:poll) { Fabricate(:poll) } + let(:params) { { choices: %w(1) } } before do - post "/api/v1/polls/#{poll.id}/votes", params: { choices: %w(1) }, headers: headers + post "/api/v1/polls/#{poll.id}/votes", params: params, headers: headers end it 'creates a vote', :aggregate_failures do @@ -24,6 +25,14 @@ RSpec.describe 'API V1 Polls Votes' do expect(poll.reload.cached_tallies).to eq [0, 1] end + context 'when the required choices param is not provided' do + let(:params) { {} } + + it 'returns http bad request' do + expect(response).to have_http_status(400) + end + end + private def vote diff --git a/spec/requests/api/v1/reports_spec.rb b/spec/requests/api/v1/reports_spec.rb index 9e8954a4c65..a72d9bbcd85 100644 --- a/spec/requests/api/v1/reports_spec.rb +++ b/spec/requests/api/v1/reports_spec.rb @@ -33,7 +33,7 @@ RSpec.describe 'Reports' do it_behaves_like 'forbidden for wrong scope', 'read read:reports' - it 'creates a report', :aggregate_failures, :sidekiq_inline do + it 'creates a report', :aggregate_failures, :inline_jobs do emails = capture_emails { subject } expect(response).to have_http_status(200) @@ -47,6 +47,7 @@ RSpec.describe 'Reports' do expect(target_account.targeted_reports).to_not be_empty expect(target_account.targeted_reports.first.comment).to eq 'reasons' + expect(target_account.targeted_reports.first.application).to eq token.application expect(emails.size) .to eq(1) diff --git a/spec/requests/api/v1/scheduled_status_spec.rb b/spec/requests/api/v1/scheduled_status_spec.rb index 49ccde275ce..f4612410bf3 100644 --- a/spec/requests/api/v1/scheduled_status_spec.rb +++ b/spec/requests/api/v1/scheduled_status_spec.rb @@ -25,6 +25,17 @@ describe 'Scheduled Statuses' do it_behaves_like 'forbidden for wrong scope', 'write write:statuses' end + context 'with an application token' do + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: nil, scopes: 'read:statuses') } + + it 'returns http unprocessable entity' do + get api_v1_scheduled_statuses_path, headers: headers + + expect(response) + .to have_http_status(422) + end + end + context 'with correct scope' do let(:scopes) { 'read:statuses' } diff --git a/spec/requests/api/v1/statuses/favourited_by_accounts_spec.rb b/spec/requests/api/v1/statuses/favourited_by_accounts_spec.rb index 44296f4c37e..2fd79f424b1 100644 --- a/spec/requests/api/v1/statuses/favourited_by_accounts_spec.rb +++ b/spec/requests/api/v1/statuses/favourited_by_accounts_spec.rb @@ -29,8 +29,10 @@ RSpec.describe 'API V1 Statuses Favourited by Accounts' do expect(response) .to have_http_status(200) - expect(response.headers['Link'].links.size) - .to eq(2) + .and include_pagination_headers( + prev: api_v1_status_favourited_by_index_url(limit: 2, since_id: Favourite.last.id), + next: api_v1_status_favourited_by_index_url(limit: 2, max_id: Favourite.first.id) + ) expect(body_as_json.size) .to eq(2) diff --git a/spec/requests/api/v1/statuses/favourites_spec.rb b/spec/requests/api/v1/statuses/favourites_spec.rb index 033aed7e285..22d0e4831fc 100644 --- a/spec/requests/api/v1/statuses/favourites_spec.rb +++ b/spec/requests/api/v1/statuses/favourites_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe 'Favourites', :sidekiq_inline do +RSpec.describe 'Favourites', :inline_jobs do let(:user) { Fabricate(:user) } let(:scopes) { 'write:favourites' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } diff --git a/spec/requests/api/v1/statuses/reblogged_by_accounts_spec.rb b/spec/requests/api/v1/statuses/reblogged_by_accounts_spec.rb index 6f99ce94646..5fc54042f91 100644 --- a/spec/requests/api/v1/statuses/reblogged_by_accounts_spec.rb +++ b/spec/requests/api/v1/statuses/reblogged_by_accounts_spec.rb @@ -28,8 +28,10 @@ RSpec.describe 'API V1 Statuses Reblogged by Accounts' do expect(response) .to have_http_status(200) - expect(response.headers['Link'].links.size) - .to eq(2) + .and include_pagination_headers( + prev: api_v1_status_reblogged_by_index_url(limit: 2, since_id: bob.statuses.first.id), + next: api_v1_status_reblogged_by_index_url(limit: 2, max_id: alice.statuses.first.id) + ) expect(body_as_json.size) .to eq(2) diff --git a/spec/requests/api/v1/statuses/reblogs_spec.rb b/spec/requests/api/v1/statuses/reblogs_spec.rb index cf0a1f861d9..503d804ed01 100644 --- a/spec/requests/api/v1/statuses/reblogs_spec.rb +++ b/spec/requests/api/v1/statuses/reblogs_spec.rb @@ -41,7 +41,7 @@ describe 'API V1 Statuses Reblogs' do end end - describe 'POST /api/v1/statuses/:status_id/unreblog', :sidekiq_inline do + describe 'POST /api/v1/statuses/:status_id/unreblog', :inline_jobs do context 'with public status' do let(:status) { Fabricate(:status, account: user.account) } diff --git a/spec/requests/api/v1/statuses/translations_spec.rb b/spec/requests/api/v1/statuses/translations_spec.rb index 5b0a994561c..e2ab5d0b806 100644 --- a/spec/requests/api/v1/statuses/translations_spec.rb +++ b/spec/requests/api/v1/statuses/translations_spec.rb @@ -8,6 +8,22 @@ describe 'API V1 Statuses Translations' do let(:scopes) { 'read:statuses' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + context 'with an application token' do + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: nil, scopes: scopes) } + + describe 'POST /api/v1/statuses/:status_id/translate' do + let(:status) { Fabricate(:status, account: user.account, text: 'Hola', language: 'es') } + + before do + post "/api/v1/statuses/#{status.id}/translate", headers: headers + end + + it 'returns http unprocessable entity' do + expect(response).to have_http_status(422) + end + end + end + context 'with an oauth token' do describe 'POST /api/v1/statuses/:status_id/translate' do let(:status) { Fabricate(:status, account: user.account, text: 'Hola', language: 'es') } diff --git a/spec/requests/api/v1/timelines/home_spec.rb b/spec/requests/api/v1/timelines/home_spec.rb index 2bebe8cf452..96bd153affe 100644 --- a/spec/requests/api/v1/timelines/home_spec.rb +++ b/spec/requests/api/v1/timelines/home_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe 'Home', :sidekiq_inline do +describe 'Home', :inline_jobs do let(:user) { Fabricate(:user) } let(:scopes) { 'read:statuses' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } diff --git a/spec/requests/api/v1/timelines/link_spec.rb b/spec/requests/api/v1/timelines/link_spec.rb index a219c9bcdde..e1c914ab81a 100644 --- a/spec/requests/api/v1/timelines/link_spec.rb +++ b/spec/requests/api/v1/timelines/link_spec.rb @@ -41,6 +41,8 @@ describe 'Link' do end end + it_behaves_like 'forbidden for wrong scope', 'profile' + context 'when there is no preview card' do let(:preview_card) { nil } @@ -80,13 +82,25 @@ describe 'Link' do Form::AdminSettings.new(timeline_preview: false).save end - context 'when the user is not authenticated' do + it_behaves_like 'forbidden for wrong scope', 'profile' + + context 'without an authentication token' do let(:headers) { {} } - it 'returns http unauthorized' do + it 'returns http unprocessable entity' do subject - expect(response).to have_http_status(401) + expect(response).to have_http_status(422) + end + end + + context 'with an application access token, not bound to a user' do + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: nil, scopes: scopes) } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) end end diff --git a/spec/requests/api/v1/timelines/public_spec.rb b/spec/requests/api/v1/timelines/public_spec.rb index 364e48d3d2f..100f6c1bfc1 100644 --- a/spec/requests/api/v1/timelines/public_spec.rb +++ b/spec/requests/api/v1/timelines/public_spec.rb @@ -34,6 +34,8 @@ describe 'Public' do context 'when the instance allows public preview' do let(:expected_statuses) { [local_status, remote_status, media_status] } + it_behaves_like 'forbidden for wrong scope', 'profile' + context 'with an authorized user' do it_behaves_like 'a successful request to the public timeline' end @@ -99,13 +101,9 @@ describe 'Public' do Form::AdminSettings.new(timeline_preview: false).save end - context 'with an authenticated user' do - let(:expected_statuses) { [local_status, remote_status, media_status] } + it_behaves_like 'forbidden for wrong scope', 'profile' - it_behaves_like 'a successful request to the public timeline' - end - - context 'with an unauthenticated user' do + context 'without an authentication token' do let(:headers) { {} } it 'returns http unprocessable entity' do @@ -114,6 +112,22 @@ describe 'Public' do expect(response).to have_http_status(422) end end + + context 'with an application access token, not bound to a user' do + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: nil, scopes: scopes) } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'with an authenticated user' do + let(:expected_statuses) { [local_status, remote_status, media_status] } + + it_behaves_like 'a successful request to the public timeline' + end end end end diff --git a/spec/requests/api/v1/timelines/tag_spec.rb b/spec/requests/api/v1/timelines/tag_spec.rb index 8611341702d..5e1415bb1ac 100644 --- a/spec/requests/api/v1/timelines/tag_spec.rb +++ b/spec/requests/api/v1/timelines/tag_spec.rb @@ -30,6 +30,8 @@ RSpec.describe 'Tag' do let(:params) { {} } let(:hashtag) { 'life' } + it_behaves_like 'forbidden for wrong scope', 'profile' + context 'when given only one hashtag' do let(:expected_statuses) { [life_status] } @@ -93,13 +95,15 @@ RSpec.describe 'Tag' do Form::AdminSettings.new(timeline_preview: false).save end - context 'when the user is not authenticated' do + it_behaves_like 'forbidden for wrong scope', 'profile' + + context 'without an authentication token' do let(:headers) { {} } - it 'returns http unauthorized' do + it 'returns http unprocessable entity' do subject - expect(response).to have_http_status(401) + expect(response).to have_http_status(422) end end diff --git a/spec/requests/api/v2/admin/accounts_spec.rb b/spec/requests/api/v2/admin/accounts_spec.rb index f5db93233c2..8f52c6a6134 100644 --- a/spec/requests/api/v2/admin/accounts_spec.rb +++ b/spec/requests/api/v2/admin/accounts_spec.rb @@ -83,7 +83,8 @@ RSpec.describe 'API V2 Admin Accounts' do let(:params) { { limit: 1 } } it 'sets the correct pagination headers' do - expect(response.headers['Link'].find_link(%w(rel next)).href).to eq api_v2_admin_accounts_url(limit: 1, max_id: admin_account.id) + expect(response) + .to include_pagination_headers(next: api_v2_admin_accounts_url(limit: 1, max_id: admin_account.id)) end end end diff --git a/spec/requests/api/v2/media_spec.rb b/spec/requests/api/v2/media_spec.rb index 990fa5d0bae..97540413f15 100644 --- a/spec/requests/api/v2/media_spec.rb +++ b/spec/requests/api/v2/media_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe 'Media API', :paperclip_processing do +RSpec.describe 'Media API', :attachment_processing do let(:user) { Fabricate(:user) } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:scopes) { 'write' } diff --git a/spec/requests/api/v2_alpha/notifications_spec.rb b/spec/requests/api/v2_alpha/notifications_spec.rb index ac44605ac5d..fc1daef43fe 100644 --- a/spec/requests/api/v2_alpha/notifications_spec.rb +++ b/spec/requests/api/v2_alpha/notifications_spec.rb @@ -8,7 +8,84 @@ RSpec.describe 'Notifications' do let(:scopes) { 'read:notifications write:notifications' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - describe 'GET /api/v2_alpha/notifications', :sidekiq_inline do + describe 'GET /api/v2_alpha/notifications/unread_count', :inline_jobs do + subject do + get '/api/v2_alpha/notifications/unread_count', headers: headers, params: params + end + + let(:params) { {} } + + before do + first_status = PostStatusService.new.call(user.account, text: 'Test') + ReblogService.new.call(Fabricate(:account), first_status) + PostStatusService.new.call(Fabricate(:account), text: 'Hello @alice') + FavouriteService.new.call(Fabricate(:account), first_status) + FavouriteService.new.call(Fabricate(:account), first_status) + FollowService.new.call(Fabricate(:account), user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'with no options' do + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 4 + end + end + + context 'with a read marker' do + before do + id = user.account.notifications.browserable.order(id: :desc).offset(2).first.id + user.markers.create!(timeline: 'notifications', last_read_id: id) + end + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 2 + end + end + + context 'with exclude_types param' do + let(:params) { { exclude_types: %w(mention) } } + + it 'returns expected notifications count' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 3 + end + end + + context 'with a user-provided limit' do + let(:params) { { limit: 2 } } + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq 2 + end + end + + context 'when there are more notifications than the limit' do + before do + stub_const('Api::V2Alpha::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT', 2) + end + + it 'returns a capped value' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json[:count]).to eq Api::V2Alpha::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT + end + end + end + + describe 'GET /api/v2_alpha/notifications', :inline_jobs do subject do get '/api/v2_alpha/notifications', headers: headers, params: params end @@ -58,7 +135,7 @@ RSpec.describe 'Notifications' do expect(response).to have_http_status(200) expect(body_json_types.uniq).to eq ['mention'] - expect(body_as_json[0][:page_min_id]).to_not be_nil + expect(body_as_json.dig(:notification_groups, 0, :page_min_id)).to_not be_nil end end @@ -70,7 +147,7 @@ RSpec.describe 'Notifications' do notifications = user.account.notifications - expect(body_as_json.size) + expect(body_as_json[:notification_groups].size) .to eq(params[:limit]) expect(response) @@ -84,7 +161,7 @@ RSpec.describe 'Notifications' do end def body_json_types - body_as_json.pluck(:type) + body_as_json[:notification_groups].pluck(:type) end end diff --git a/spec/requests/well_known/oauth_metadata_spec.rb b/spec/requests/well_known/oauth_metadata_spec.rb index 3350d593156..9d2d2022867 100644 --- a/spec/requests/well_known/oauth_metadata_spec.rb +++ b/spec/requests/well_known/oauth_metadata_spec.rb @@ -29,7 +29,10 @@ describe 'The /.well-known/oauth-authorization-server request' do revocation_endpoint: oauth_revoke_url(protocol: protocol), scopes_supported: Doorkeeper.configuration.scopes.map(&:to_s), response_types_supported: Doorkeeper.configuration.authorization_response_types, + response_modes_supported: Doorkeeper.configuration.authorization_response_flows.flat_map(&:response_mode_matches).uniq, + token_endpoint_auth_methods_supported: %w(client_secret_basic client_secret_post), grant_types_supported: grant_types_supported, + code_challenge_methods_supported: ['S256'], # non-standard extension: app_registration_endpoint: api_v1_apps_url(protocol: protocol) ) diff --git a/spec/routing/accounts_routing_spec.rb b/spec/routing/accounts_routing_spec.rb index 8b2c124fd21..588855943e6 100644 --- a/spec/routing/accounts_routing_spec.rb +++ b/spec/routing/accounts_routing_spec.rb @@ -47,6 +47,61 @@ describe 'Routes under accounts/' do end end + context 'with local username encoded at' do + include RSpec::Rails::RequestExampleGroup + let(:username) { 'alice' } + + it 'routes /%40:username' do + get "/%40#{username}" + expect(response).to redirect_to("/@#{username}") + end + + it 'routes /%40:username.json' do + get("/%40#{username}.json") + expect(response).to redirect_to("/@#{username}.json") + end + + it 'routes /%40:username.rss' do + get("/%40#{username}.rss") + expect(response).to redirect_to("/@#{username}.rss") + end + + it 'routes /%40:username/:id' do + get("/%40#{username}/123") + expect(response).to redirect_to("/@#{username}/123") + end + + it 'routes /%40:username/:id/embed' do + get("/%40#{username}/123/embed") + expect(response).to redirect_to("/@#{username}/123/embed") + end + + it 'routes /%40:username/following' do + get("/%40#{username}/following") + expect(response).to redirect_to("/@#{username}/following") + end + + it 'routes /%40:username/followers' do + get("/%40#{username}/followers") + expect(response).to redirect_to("/@#{username}/followers") + end + + it 'routes /%40:username/with_replies' do + get("/%40#{username}/with_replies") + expect(response).to redirect_to("/@#{username}/with_replies") + end + + it 'routes /%40:username/media' do + get("/%40#{username}/media") + expect(response).to redirect_to("/@#{username}/media") + end + + it 'routes /%40:username/tagged/:tag' do + get("/%40#{username}/tagged/foo") + expect(response).to redirect_to("/@#{username}/tagged/foo") + end + end + context 'with remote username' do let(:username) { 'alice@example.com' } @@ -82,4 +137,50 @@ describe 'Routes under accounts/' do expect(get("/@#{username}/tagged/foo")).to route_to('home#index', username_with_domain: username, any: 'tagged/foo') end end + + context 'with remote username encoded at' do + include RSpec::Rails::RequestExampleGroup + let(:username) { 'alice%40example.com' } + let(:username_decoded) { 'alice@example.com' } + + it 'routes /%40:username' do + get("/%40#{username}") + expect(response).to redirect_to("/@#{username_decoded}") + end + + it 'routes /%40:username/:id' do + get("/%40#{username}/123") + expect(response).to redirect_to("/@#{username_decoded}/123") + end + + it 'routes /%40:username/:id/embed' do + get("/%40#{username}/123/embed") + expect(response).to redirect_to("/@#{username_decoded}/123/embed") + end + + it 'routes /%40:username/following' do + get("/%40#{username}/following") + expect(response).to redirect_to("/@#{username_decoded}/following") + end + + it 'routes /%40:username/followers' do + get("/%40#{username}/followers") + expect(response).to redirect_to("/@#{username_decoded}/followers") + end + + it 'routes /%40:username/with_replies' do + get("/%40#{username}/with_replies") + expect(response).to redirect_to("/@#{username_decoded}/with_replies") + end + + it 'routes /%40:username/media' do + get("/%40#{username}/media") + expect(response).to redirect_to("/@#{username_decoded}/media") + end + + it 'routes /%40:username/tagged/:tag' do + get("/%40#{username}/tagged/foo") + expect(response).to redirect_to("/@#{username_decoded}/tagged/foo") + end + end end diff --git a/spec/search/models/concerns/account/statuses_search_spec.rb b/spec/search/models/concerns/account/statuses_search_spec.rb index a1b0bf405c5..b1bf4968ca9 100644 --- a/spec/search/models/concerns/account/statuses_search_spec.rb +++ b/spec/search/models/concerns/account/statuses_search_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe Account::StatusesSearch, :sidekiq_inline do +describe Account::StatusesSearch, :inline_jobs do describe 'a non-indexable account becoming indexable' do let(:account) { Account.find_by(username: 'search_test_account_1') } diff --git a/spec/services/activitypub/fetch_remote_account_service_spec.rb b/spec/services/activitypub/fetch_remote_account_service_spec.rb index 789a705c41e..175ac9cb61f 100644 --- a/spec/services/activitypub/fetch_remote_account_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_account_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService do end context 'when the account does not have a inbox' do - let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } before do actor[:inbox] = nil @@ -51,7 +51,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService do end context 'when URI and WebFinger share the same host' do - let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } before do stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) @@ -72,7 +72,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService do end context 'when WebFinger presents different domain than URI' do - let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } + let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } before do stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) @@ -95,7 +95,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService do end context 'when WebFinger returns a different URI' do - let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob', type: 'application/activity+json' }] } } before do stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) @@ -111,7 +111,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService do end context 'when WebFinger returns a different URI after a redirection' do - let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } + let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob', type: 'application/activity+json' }] } } before do stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) diff --git a/spec/services/activitypub/fetch_remote_actor_service_spec.rb b/spec/services/activitypub/fetch_remote_actor_service_spec.rb index 025051e9fa7..9d031cb89bc 100644 --- a/spec/services/activitypub/fetch_remote_actor_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_actor_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService do end context 'when the account does not have a inbox' do - let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } before do actor[:inbox] = nil @@ -51,7 +51,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService do end context 'when URI and WebFinger share the same host' do - let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } before do stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) @@ -72,7 +72,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService do end context 'when WebFinger presents different domain than URI' do - let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } + let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } before do stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) @@ -95,7 +95,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService do end context 'when WebFinger returns a different URI' do - let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } + let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob', type: 'application/activity+json' }] } } before do stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) @@ -111,7 +111,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService do end context 'when WebFinger returns a different URI after a redirection' do - let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } + let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob', type: 'application/activity+json' }] } } before do stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) diff --git a/spec/services/activitypub/fetch_remote_key_service_spec.rb b/spec/services/activitypub/fetch_remote_key_service_spec.rb index b6fcf3f479a..847a154108c 100644 --- a/spec/services/activitypub/fetch_remote_key_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_key_service_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' RSpec.describe ActivityPub::FetchRemoteKeyService do subject { described_class.new } - let(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } + let(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } let(:public_key_pem) do <<~TEXT diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb index a86f141fe0b..635fcb7976c 100644 --- a/spec/services/activitypub/fetch_remote_status_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb @@ -225,9 +225,9 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do end end - context 'with statuses referencing other statuses', :sidekiq_inline do + context 'with statuses referencing other statuses', :inline_jobs do before do - stub_const 'ActivityPub::FetchRemoteStatusService::DISCOVERIES_PER_REQUEST', 5 + stub_const 'ActivityPub::FetchRemoteStatusService::DISCOVERIES_PER_REQUEST', 3 end context 'when using inReplyTo' do @@ -243,7 +243,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do end before do - 8.times do |i| + 5.times do |i| status_json = { '@context': 'https://www.w3.org/ns/activitystreams', id: "https://foo.bar/@foo/#{i}", @@ -257,12 +257,10 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do end end - it 'creates at least some statuses' do - expect { subject.call(object[:id], prefetched_body: Oj.dump(object)) }.to change { sender.statuses.count }.by_at_least(2) - end - - it 'creates no more account than the limit allows' do - expect { subject.call(object[:id], prefetched_body: Oj.dump(object)) }.to change { sender.statuses.count }.by_at_most(5) + it 'creates statuses but not more than limit allows' do + expect { subject.call(object[:id], prefetched_body: Oj.dump(object)) } + .to change { sender.statuses.count }.by_at_least(2) + .and change { sender.statuses.count }.by_at_most(3) end end @@ -287,7 +285,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do end before do - 8.times do |i| + 5.times do |i| status_json = { '@context': 'https://www.w3.org/ns/activitystreams', id: "https://foo.bar/@foo/#{i}", @@ -309,12 +307,10 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do end end - it 'creates at least some statuses' do - expect { subject.call(object[:id], prefetched_body: Oj.dump(object)) }.to change { sender.statuses.count }.by_at_least(2) - end - - it 'creates no more account than the limit allows' do - expect { subject.call(object[:id], prefetched_body: Oj.dump(object)) }.to change { sender.statuses.count }.by_at_most(5) + it 'creates statuses but not more than limit allows' do + expect { subject.call(object[:id], prefetched_body: Oj.dump(object)) } + .to change { sender.statuses.count }.by_at_least(2) + .and change { sender.statuses.count }.by_at_most(3) end end end diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index 8b80dafe45a..86314e6b485 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -215,7 +215,7 @@ RSpec.describe ActivityPub::ProcessAccountService do }.with_indifferent_access webfinger = { subject: "acct:user#{i}@foo.test", - links: [{ rel: 'self', href: "https://foo.test/users/#{i}" }], + links: [{ rel: 'self', href: "https://foo.test/users/#{i}", type: 'application/activity+json' }], }.with_indifferent_access stub_request(:get, "https://foo.test/users/#{i}").to_return(status: 200, body: actor_json.to_json, headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, "https://foo.test/users/#{i}/featured").to_return(status: 200, body: featured_json.to_json, headers: { 'Content-Type': 'application/activity+json' }) @@ -224,7 +224,7 @@ RSpec.describe ActivityPub::ProcessAccountService do end end - it 'creates accounts without exceeding rate limit', :sidekiq_inline do + it 'creates accounts without exceeding rate limit', :inline_jobs do expect { subject.call('user1', 'foo.test', payload) } .to create_some_remote_accounts .and create_fewer_than_rate_limit_accounts diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb index e451d15dc03..a97e8408026 100644 --- a/spec/services/activitypub/process_status_update_service_spec.rb +++ b/spec/services/activitypub/process_status_update_service_spec.rb @@ -40,14 +40,13 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end describe '#call' do - it 'updates text' do + it 'updates text and content warning' do subject.call(status, json, json) - expect(status.reload.text).to eq 'Hello universe' - end - - it 'updates content warning' do - subject.call(status, json, json) - expect(status.reload.spoiler_text).to eq 'Show more' + expect(status.reload) + .to have_attributes( + text: eq('Hello universe'), + spoiler_text: eq('Show more') + ) end context 'when the changes are only in sanitized-out HTML' do @@ -67,12 +66,9 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do subject.call(status, json, json) end - it 'does not create any edits' do + it 'does not create any edits and does not mark status edited' do expect(status.reload.edits).to be_empty - end - - it 'does not mark status as edited' do - expect(status.edited?).to be false + expect(status).to_not be_edited end end @@ -90,15 +86,9 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do subject.call(status, json, json) end - it 'does not create any edits' do + it 'does not create any edits, mark status edited, or update text' do expect(status.reload.edits).to be_empty - end - - it 'does not mark status as edited' do - expect(status.reload.edited?).to be false - end - - it 'does not update the text' do + expect(status.reload).to_not be_edited expect(status.reload.text).to eq 'Hello world' end end @@ -137,19 +127,10 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do subject.call(status, json, json) end - it 'does not create any edits' do + it 'does not create any edits, mark status edited, update text but does update tallies' do expect(status.reload.edits).to be_empty - end - - it 'does not mark status as edited' do - expect(status.reload.edited?).to be false - end - - it 'does not update the text' do + expect(status.reload).to_not be_edited expect(status.reload.text).to eq 'Hello world' - end - - it 'updates tallies' do expect(status.poll.reload.cached_tallies).to eq [4, 3] end end @@ -189,19 +170,10 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do subject.call(status, json, json) end - it 'does not create any edits' do + it 'does not create any edits, mark status edited, update text, or update tallies' do expect(status.reload.edits).to be_empty - end - - it 'does not mark status as edited' do - expect(status.reload.edited?).to be false - end - - it 'does not update the text' do + expect(status.reload).to_not be_edited expect(status.reload.text).to eq 'Hello world' - end - - it 'does not update tallies' do expect(status.poll.reload.cached_tallies).to eq [0, 0] end end @@ -213,13 +185,10 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do status.snapshot!(rate_limit: false) end - it 'does not create any edits' do - expect { subject.call(status, json, json) }.to_not(change { status.reload.edits.pluck(&:id) }) - end - - it 'does not update the text, spoiler_text or edited_at' do + it 'does not create any edits or update relevant attributes' do expect { subject.call(status, json, json) } - .to_not(change { status.reload.attributes.slice('text', 'spoiler_text', 'edited_at').values }) + .to not_change { status.reload.edits.pluck(&:id) } + .and(not_change { status.reload.attributes.slice('text', 'spoiler_text', 'edited_at').values }) end end @@ -237,12 +206,9 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do subject.call(status, json, json) end - it 'does not create any edits' do + it 'does not create any edits or mark status edited' do expect(status.reload.edits).to be_empty - end - - it 'does not mark status as edited' do - expect(status.edited?).to be false + expect(status).to_not be_edited end end @@ -261,12 +227,9 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do subject.call(status, json, json) end - it 'does not create any edits' do + it 'does not create any edits or mark status edited' do expect(status.reload.edits).to be_empty - end - - it 'does not mark status as edited' do - expect(status.edited?).to be false + expect(status).to_not be_edited end end @@ -412,11 +375,8 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do subject.call(status, json, json) end - it 'removes poll' do + it 'removes poll and records media change in edit' do expect(status.reload.poll).to be_nil - end - - it 'records media change in edit' do expect(status.edits.reload.last.poll_options).to be_nil end end @@ -442,26 +402,21 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do subject.call(status, json, json) end - it 'creates a poll' do + it 'creates a poll and records media change in edit' do poll = status.reload.poll expect(poll).to_not be_nil expect(poll.options).to eq %w(Foo Bar Baz) - end - - it 'records media change in edit' do expect(status.edits.reload.last.poll_options).to eq %w(Foo Bar Baz) end end - it 'creates edit history' do + it 'creates edit history and sets edit timestamp' do subject.call(status, json, json) - expect(status.edits.reload.map(&:text)).to eq ['Hello world', 'Hello universe'] - end - - it 'sets edited timestamp' do - subject.call(status, json, json) - expect(status.reload.edited_at.to_s).to eq '2021-09-08 22:39:25 UTC' + expect(status.edits.reload.map(&:text)) + .to eq ['Hello world', 'Hello universe'] + expect(status.reload.edited_at.to_s) + .to eq '2021-09-08 22:39:25 UTC' end end end diff --git a/spec/services/activitypub/synchronize_followers_service_spec.rb b/spec/services/activitypub/synchronize_followers_service_spec.rb index 648f9a33212..974368b7d77 100644 --- a/spec/services/activitypub/synchronize_followers_service_spec.rb +++ b/spec/services/activitypub/synchronize_followers_service_spec.rb @@ -13,11 +13,9 @@ RSpec.describe ActivityPub::SynchronizeFollowersService do let(:collection_uri) { 'http://example.com/partial-followers' } let(:items) do - [ - ActivityPub::TagManager.instance.uri_for(alice), - ActivityPub::TagManager.instance.uri_for(eve), - ActivityPub::TagManager.instance.uri_for(mallory), - ] + [alice, eve, mallory].map do |account| + ActivityPub::TagManager.instance.uri_for(account) + end end let(:payload) do @@ -40,20 +38,15 @@ RSpec.describe ActivityPub::SynchronizeFollowersService do subject.call(actor, collection_uri) end - it 'keeps expected followers' do - expect(alice.following?(actor)).to be true - end - - it 'removes local followers not in the remote list' do - expect(bob.following?(actor)).to be false - end - - it 'converts follow requests to follow relationships when they have been accepted' do - expect(mallory.following?(actor)).to be true - end - - it 'sends an Undo Follow to the actor' do - expect(ActivityPub::DeliveryWorker).to have_received(:perform_async).with(anything, eve.id, actor.inbox_url) + it 'maintains following records and sends Undo Follow to actor' do + expect(alice) + .to be_following(actor) # Keep expected followers + expect(bob) + .to_not be_following(actor) # Remove local followers not in remote list + expect(mallory) + .to be_following(actor) # Convert follow request to follow when accepted + expect(ActivityPub::DeliveryWorker) + .to have_received(:perform_async).with(anything, eve.id, actor.inbox_url) # Send Undo Follow to actor end end diff --git a/spec/services/appeal_service_spec.rb b/spec/services/appeal_service_spec.rb index 3fad74db9d8..6a47bb2cea6 100644 --- a/spec/services/appeal_service_spec.rb +++ b/spec/services/appeal_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe AppealService, :sidekiq_inline do +RSpec.describe AppealService, :inline_jobs do describe '#call' do let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } diff --git a/spec/services/authorize_follow_service_spec.rb b/spec/services/authorize_follow_service_spec.rb index be2a8641854..533b791fb7f 100644 --- a/spec/services/authorize_follow_service_spec.rb +++ b/spec/services/authorize_follow_service_spec.rb @@ -41,7 +41,7 @@ RSpec.describe AuthorizeFollowService do expect(bob.following?(sender)).to be true end - it 'sends an accept activity', :sidekiq_inline do + it 'sends an accept activity', :inline_jobs do expect(a_request(:post, bob.inbox_url)).to have_been_made.once end end diff --git a/spec/services/backup_service_spec.rb b/spec/services/backup_service_spec.rb index 145b06e3722..878405a0fec 100644 --- a/spec/services/backup_service_spec.rb +++ b/spec/services/backup_service_spec.rb @@ -60,6 +60,7 @@ RSpec.describe BackupService do aggregate_failures do expect(body.scan('@context').count).to eq 1 + expect(body.scan('orderedItems').count).to eq 1 expect(json['@context']).to_not be_nil expect(json['type']).to eq 'OrderedCollection' expect(json['totalItems']).to eq 2 diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb index e501b9ba84a..628bb198ef0 100644 --- a/spec/services/batched_remove_status_service_spec.rb +++ b/spec/services/batched_remove_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe BatchedRemoveStatusService, :sidekiq_inline do +RSpec.describe BatchedRemoveStatusService, :inline_jobs do subject { described_class.new } let!(:alice) { Fabricate(:account) } diff --git a/spec/services/block_domain_service_spec.rb b/spec/services/block_domain_service_spec.rb index d4f0c042d45..839137db449 100644 --- a/spec/services/block_domain_service_spec.rb +++ b/spec/services/block_domain_service_spec.rb @@ -49,7 +49,7 @@ RSpec.describe BlockDomainService do end describe 'for a silence with reject media' do - it 'does not mark the domain as blocked, but silences accounts with an appropriate silencing date, clears media', :aggregate_failures, :sidekiq_inline do + it 'does not mark the domain as blocked, but silences accounts with an appropriate silencing date, clears media', :aggregate_failures, :inline_jobs do subject.call(DomainBlock.create!(domain: 'evil.org', severity: :silence, reject_media: true)) expect(DomainBlock.blocked?('evil.org')).to be false diff --git a/spec/services/block_service_spec.rb b/spec/services/block_service_spec.rb index d096aa1ea35..46dd6919869 100644 --- a/spec/services/block_service_spec.rb +++ b/spec/services/block_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe BlockService do expect(sender.blocking?(bob)).to be true end - it 'sends a block activity', :sidekiq_inline do + it 'sends a block activity', :inline_jobs do expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once end end diff --git a/spec/services/delete_account_service_spec.rb b/spec/services/delete_account_service_spec.rb index de93862435a..741ac340cfa 100644 --- a/spec/services/delete_account_service_spec.rb +++ b/spec/services/delete_account_service_spec.rb @@ -62,7 +62,7 @@ RSpec.describe DeleteAccountService do end end - describe '#call on local account', :sidekiq_inline do + describe '#call on local account', :inline_jobs do before do stub_request(:post, remote_alice.inbox_url).to_return(status: 201) stub_request(:post, remote_bob.inbox_url).to_return(status: 201) @@ -83,7 +83,7 @@ RSpec.describe DeleteAccountService do end end - describe '#call on remote account', :sidekiq_inline do + describe '#call on remote account', :inline_jobs do before do stub_request(:post, account.inbox_url).to_return(status: 201) end diff --git a/spec/services/fan_out_on_write_service_spec.rb b/spec/services/fan_out_on_write_service_spec.rb index b51d802a5b9..c6dd020cdff 100644 --- a/spec/services/fan_out_on_write_service_spec.rb +++ b/spec/services/fan_out_on_write_service_spec.rb @@ -34,21 +34,14 @@ RSpec.describe FanOutOnWriteService do context 'when status is public' do let(:visibility) { 'public' } - it 'is added to the home feed of its author' do - expect(home_feed_of(alice)).to include status.id - end + it 'adds status to home feed of author and followers and broadcasts', :inline_jobs do + expect(status.id) + .to be_in(home_feed_of(alice)) + .and be_in(home_feed_of(bob)) + .and be_in(home_feed_of(tom)) - it 'is added to the home feed of a follower', :sidekiq_inline do - expect(home_feed_of(bob)).to include status.id - expect(home_feed_of(tom)).to include status.id - end - - it 'is broadcast to the hashtag stream' do expect(redis).to have_received(:publish).with('timeline:hashtag:hoge', anything) expect(redis).to have_received(:publish).with('timeline:hashtag:hoge:local', anything) - end - - it 'is broadcast to the public stream' do expect(redis).to have_received(:publish).with('timeline:public', anything) expect(redis).to have_received(:publish).with('timeline:public:local', anything) expect(redis).to have_received(:publish).with('timeline:public:media', anything) @@ -58,60 +51,41 @@ RSpec.describe FanOutOnWriteService do context 'when status is limited' do let(:visibility) { 'limited' } - it 'is added to the home feed of its author' do - expect(home_feed_of(alice)).to include status.id - end + it 'adds status to home feed of author and mentioned followers and does not broadcast', :inline_jobs do + expect(status.id) + .to be_in(home_feed_of(alice)) + .and be_in(home_feed_of(bob)) + expect(status.id) + .to_not be_in(home_feed_of(tom)) - it 'is added to the home feed of the mentioned follower', :sidekiq_inline do - expect(home_feed_of(bob)).to include status.id - end - - it 'is not added to the home feed of the other follower' do - expect(home_feed_of(tom)).to_not include status.id - end - - it 'is not broadcast publicly' do - expect(redis).to_not have_received(:publish).with('timeline:hashtag:hoge', anything) - expect(redis).to_not have_received(:publish).with('timeline:public', anything) + expect_no_broadcasting end end context 'when status is private' do let(:visibility) { 'private' } - it 'is added to the home feed of its author' do - expect(home_feed_of(alice)).to include status.id - end + it 'adds status to home feed of author and followers and does not broadcast', :inline_jobs do + expect(status.id) + .to be_in(home_feed_of(alice)) + .and be_in(home_feed_of(bob)) + .and be_in(home_feed_of(tom)) - it 'is added to the home feed of a follower', :sidekiq_inline do - expect(home_feed_of(bob)).to include status.id - expect(home_feed_of(tom)).to include status.id - end - - it 'is not broadcast publicly' do - expect(redis).to_not have_received(:publish).with('timeline:hashtag:hoge', anything) - expect(redis).to_not have_received(:publish).with('timeline:public', anything) + expect_no_broadcasting end end context 'when status is direct' do let(:visibility) { 'direct' } - it 'is added to the home feed of its author' do - expect(home_feed_of(alice)).to include status.id - end + it 'is added to the home feed of its author and mentioned followers and does not broadcast', :inline_jobs do + expect(status.id) + .to be_in(home_feed_of(alice)) + .and be_in(home_feed_of(bob)) + expect(status.id) + .to_not be_in(home_feed_of(tom)) - it 'is added to the home feed of the mentioned follower', :sidekiq_inline do - expect(home_feed_of(bob)).to include status.id - end - - it 'is not added to the home feed of the other follower' do - expect(home_feed_of(tom)).to_not include status.id - end - - it 'is not broadcast publicly' do - expect(redis).to_not have_received(:publish).with('timeline:hashtag:hoge', anything) - expect(redis).to_not have_received(:publish).with('timeline:public', anything) + expect_no_broadcasting end context 'when handling status updates' do @@ -131,4 +105,13 @@ RSpec.describe FanOutOnWriteService do end end end + + def expect_no_broadcasting + expect(redis) + .to_not have_received(:publish) + .with('timeline:hashtag:hoge', anything) + expect(redis) + .to_not have_received(:publish) + .with('timeline:public', anything) + end end diff --git a/spec/services/favourite_service_spec.rb b/spec/services/favourite_service_spec.rb index d0f1ff17c1e..c39362def2f 100644 --- a/spec/services/favourite_service_spec.rb +++ b/spec/services/favourite_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe FavouriteService do expect(status.favourites.first).to_not be_nil end - it 'sends a like activity', :sidekiq_inline do + it 'sends a like activity', :inline_jobs do expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once end end diff --git a/spec/services/fetch_link_card_service_spec.rb b/spec/services/fetch_link_card_service_spec.rb index 63ebc3b978d..2f64f405583 100644 --- a/spec/services/fetch_link_card_service_spec.rb +++ b/spec/services/fetch_link_card_service_spec.rb @@ -26,6 +26,13 @@ RSpec.describe FetchLinkCardService do stub_request(:get, 'http://example.com/sjis_with_wrong_charset').to_return(request_fixture('sjis_with_wrong_charset.txt')) stub_request(:get, 'http://example.com/koi8-r').to_return(request_fixture('koi8-r.txt')) stub_request(:get, 'http://example.com/windows-1251').to_return(request_fixture('windows-1251.txt')) + stub_request(:get, 'http://example.com/low_confidence_latin1').to_return(request_fixture('low_confidence_latin1.txt')) + stub_request(:get, 'http://example.com/latin1_posing_as_utf8_broken').to_return(request_fixture('latin1_posing_as_utf8_broken.txt')) + stub_request(:get, 'http://example.com/latin1_posing_as_utf8_recoverable').to_return(request_fixture('latin1_posing_as_utf8_recoverable.txt')) + stub_request(:get, 'http://example.com/aergerliche-umlaute').to_return(request_fixture('redirect_with_utf8_url.txt')) + stub_request(:get, 'http://example.com/page_without_title').to_return(request_fixture('page_without_title.txt')) + stub_request(:get, 'http://example.com/long_canonical_url').to_return(request_fixture('long_canonical_url.txt')) + stub_request(:get, 'http://example.com/alternative_utf8_spelling_in_header').to_return(request_fixture('alternative_utf8_spelling_in_header.txt')) Rails.cache.write('oembed_endpoint:example.com', oembed_cache) if oembed_cache @@ -100,6 +107,22 @@ RSpec.describe FetchLinkCardService do end end + context 'with a redirect URL with faulty encoding' do + let(:status) { Fabricate(:status, text: 'http://example.com/aergerliche-umlaute') } + + it 'does not create a preview card' do + expect(status.preview_card).to be_nil + end + end + + context 'with a page that has no title' do + let(:status) { Fabricate(:status, text: 'http://example.com/page_without_title') } + + it 'does not create a preview card' do + expect(status.preview_card).to be_nil + end + end + context 'with a 404 URL' do let(:status) { Fabricate(:status, text: 'http://example.com/not-found') } @@ -148,6 +171,34 @@ RSpec.describe FetchLinkCardService do end end + context 'with a URL of a page in ISO-8859-1 encoding, that charlock_holmes cannot detect' do + context 'when encoding in http header is correct' do + let(:status) { Fabricate(:status, text: 'Check out http://example.com/low_confidence_latin1') } + + it 'decodes the HTML' do + expect(status.preview_card.title).to eq("Tofu á l'orange") + end + end + + context 'when encoding in http header is incorrect' do + context 'when encoding problems appear in unrelated tags' do + let(:status) { Fabricate(:status, text: 'Check out http://example.com/latin1_posing_as_utf8_recoverable') } + + it 'decodes the HTML' do + expect(status.preview_card.title).to eq('Tofu with orange sauce') + end + end + + context 'when encoding problems appear in title tag' do + let(:status) { Fabricate(:status, text: 'Check out http://example.com/latin1_posing_as_utf8_broken') } + + it 'does not create a preview card' do + expect(status.preview_card).to be_nil + end + end + end + end + context 'with a Japanese path URL' do let(:status) { Fabricate(:status, text: 'テストhttp://example.com/日本語') } @@ -234,6 +285,22 @@ RSpec.describe FetchLinkCardService do end end end + + context 'with a URL of a page that includes a canonical URL too long for PostgreSQL unique indexes' do + let(:status) { Fabricate(:status, text: 'test http://example.com/long_canonical_url') } + + it 'does not create a preview card' do + expect(status.preview_card).to be_nil + end + end + + context 'with a URL where the `Content-Type` header uses `utf8` instead of `utf-8`' do + let(:status) { Fabricate(:status, text: 'test http://example.com/alternative_utf8_spelling_in_header') } + + it 'does not create a preview card' do + expect(status.preview_card.title).to eq 'Webserver Configs R Us' + end + end end context 'with a remote status' do diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb index bea2412a3d3..0c4cd600460 100644 --- a/spec/services/follow_service_spec.rb +++ b/spec/services/follow_service_spec.rb @@ -150,7 +150,7 @@ RSpec.describe FollowService do expect(FollowRequest.find_by(account: sender, target_account: bob)).to_not be_nil end - it 'sends a follow activity to the inbox', :sidekiq_inline do + it 'sends a follow activity to the inbox', :inline_jobs do expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once end end diff --git a/spec/services/import_service_spec.rb b/spec/services/import_service_spec.rb index 90877d99975..0a99c5e748d 100644 --- a/spec/services/import_service_spec.rb +++ b/spec/services/import_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe ImportService, :sidekiq_inline do +RSpec.describe ImportService, :inline_jobs do include RoutingHelper let!(:account) { Fabricate(:account, locked: false) } diff --git a/spec/services/mute_service_spec.rb b/spec/services/mute_service_spec.rb index 681afc0b16e..3bde92b87ae 100644 --- a/spec/services/mute_service_spec.rb +++ b/spec/services/mute_service_spec.rb @@ -17,7 +17,7 @@ RSpec.describe MuteService do redis.del(home_timeline_key) end - it "clears account's statuses", :sidekiq_inline do + it "clears account's statuses", :inline_jobs do FeedManager.instance.push_to_home(account, status) FeedManager.instance.push_to_home(account, other_account_status) diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb index 8c810f1c32b..c7e00129b2c 100644 --- a/spec/services/notify_service_spec.rb +++ b/spec/services/notify_service_spec.rb @@ -105,7 +105,7 @@ RSpec.describe NotifyService do context 'when email notification is enabled' do let(:enabled) { true } - it 'sends email', :sidekiq_inline do + it 'sends email', :inline_jobs do emails = capture_emails { subject } expect(emails.size) @@ -129,6 +129,39 @@ RSpec.describe NotifyService do end end + context 'with filtered notifications' do + let(:unknown) { Fabricate(:account, username: 'unknown') } + let(:status) { Fabricate(:status, account: unknown) } + let(:activity) { Fabricate(:mention, account: recipient, status: status) } + let(:type) { :mention } + + before do + Fabricate(:notification_policy, account: recipient, filter_not_following: true) + end + + it 'creates a filtered notification' do + expect { subject }.to change(Notification, :count) + expect(Notification.last).to be_filtered + end + + context 'when no notification request exists' do + it 'creates a notification request' do + expect { subject }.to change(NotificationRequest, :count) + end + end + + context 'when a notification request exists' do + let!(:notification_request) do + Fabricate(:notification_request, account: recipient, from_account: unknown, last_status: Fabricate(:status, account: unknown)) + end + + it 'updates the existing notification request' do + expect { subject }.to_not change(NotificationRequest, :count) + expect(notification_request.reload.last_status).to eq status + end + end + end + describe NotifyService::DismissCondition do subject { described_class.new(notification) } diff --git a/spec/services/reject_follow_service_spec.rb b/spec/services/reject_follow_service_spec.rb index 98aaf704785..d2c7a002062 100644 --- a/spec/services/reject_follow_service_spec.rb +++ b/spec/services/reject_follow_service_spec.rb @@ -41,7 +41,7 @@ RSpec.describe RejectFollowService do expect(bob.following?(sender)).to be false end - it 'sends a reject activity', :sidekiq_inline do + it 'sends a reject activity', :inline_jobs do expect(a_request(:post, bob.inbox_url)).to have_been_made.once end end diff --git a/spec/services/remove_from_followers_service_spec.rb b/spec/services/remove_from_followers_service_spec.rb index d6420f76742..515600096cf 100644 --- a/spec/services/remove_from_followers_service_spec.rb +++ b/spec/services/remove_from_followers_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe RemoveFromFollowersService do expect(bob.followed_by?(sender)).to be false end - it 'sends a reject activity', :sidekiq_inline do + it 'sends a reject activity', :inline_jobs do expect(a_request(:post, sender.inbox_url)).to have_been_made.once end end diff --git a/spec/services/remove_status_service_spec.rb b/spec/services/remove_status_service_spec.rb index 917b66c6df4..08f519b5360 100644 --- a/spec/services/remove_status_service_spec.rb +++ b/spec/services/remove_status_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe RemoveStatusService, :sidekiq_inline do +RSpec.describe RemoveStatusService, :inline_jobs do subject { described_class.new } let!(:alice) { Fabricate(:account) } diff --git a/spec/services/report_service_spec.rb b/spec/services/report_service_spec.rb index 141dc8c3be5..6518c5c27ad 100644 --- a/spec/services/report_service_spec.rb +++ b/spec/services/report_service_spec.rb @@ -23,7 +23,12 @@ RSpec.describe ReportService do stub_request(:post, 'http://example.com/inbox').to_return(status: 200) end - context 'when forward is true', :sidekiq_inline do + it 'does not have an application' do + report = subject.call(source_account, remote_account) + expect(report.application).to be_nil + end + + context 'when forward is true', :inline_jobs do let(:forward) { true } it 'sends ActivityPub payload when forward is true' do @@ -96,6 +101,15 @@ RSpec.describe ReportService do end end + context 'when passed an application' do + let(:application) { Fabricate(:application) } + + it 'has an application' do + report = subject.call(source_account, target_account, application: application) + expect(report.application).to eq application + end + end + context 'when the reported status is a DM' do subject do -> { described_class.new.call(source_account, target_account, status_ids: [status.id]) } diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb index 316266c8f8e..e0084a15791 100644 --- a/spec/services/resolve_account_service_spec.rb +++ b/spec/services/resolve_account_service_spec.rb @@ -195,7 +195,7 @@ RSpec.describe ResolveAccountService do expect(account.uri).to eq 'https://ap.example.com/users/foo' end - it 'merges accounts', :sidekiq_inline do + it 'merges accounts', :inline_jobs do account = subject.call('foo@ap.example.com') expect(status.reload.account_id).to eq account.id diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb index 7c72a4776b4..4a2f494e0cb 100644 --- a/spec/services/suspend_account_service_spec.rb +++ b/spec/services/suspend_account_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe SuspendAccountService, :sidekiq_inline do +RSpec.describe SuspendAccountService, :inline_jobs do shared_examples 'common behavior' do subject { described_class.new.call(account) } diff --git a/spec/services/unallow_domain_service_spec.rb b/spec/services/unallow_domain_service_spec.rb index caec3d596ff..4bf6c540432 100644 --- a/spec/services/unallow_domain_service_spec.rb +++ b/spec/services/unallow_domain_service_spec.rb @@ -13,7 +13,7 @@ RSpec.describe UnallowDomainService do let!(:already_banned_account) { Fabricate(:account, username: 'badguy', domain: bad_domain, suspended: true, silenced: true) } let!(:domain_allow) { Fabricate(:domain_allow, domain: bad_domain) } - context 'with limited federation mode', :sidekiq_inline do + context 'with limited federation mode', :inline_jobs do before do allow(Rails.configuration.x).to receive(:limited_federation_mode).and_return(true) end diff --git a/spec/services/unblock_service_spec.rb b/spec/services/unblock_service_spec.rb index 4c9fcb9aeec..6132e74415e 100644 --- a/spec/services/unblock_service_spec.rb +++ b/spec/services/unblock_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe UnblockService do expect(sender.blocking?(bob)).to be false end - it 'sends an unblock activity', :sidekiq_inline do + it 'sends an unblock activity', :inline_jobs do expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once end end diff --git a/spec/services/unfollow_service_spec.rb b/spec/services/unfollow_service_spec.rb index bba17a8d270..0c206c4b983 100644 --- a/spec/services/unfollow_service_spec.rb +++ b/spec/services/unfollow_service_spec.rb @@ -20,7 +20,7 @@ RSpec.describe UnfollowService do end end - describe 'remote ActivityPub', :sidekiq_inline do + describe 'remote ActivityPub', :inline_jobs do let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } before do @@ -38,7 +38,7 @@ RSpec.describe UnfollowService do end end - describe 'remote ActivityPub (reverse)', :sidekiq_inline do + describe 'remote ActivityPub (reverse)', :inline_jobs do let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } before do diff --git a/spec/services/unsuspend_account_service_spec.rb b/spec/services/unsuspend_account_service_spec.rb index 79a4441d3ec..8d4882c37f8 100644 --- a/spec/services/unsuspend_account_service_spec.rb +++ b/spec/services/unsuspend_account_service_spec.rb @@ -45,7 +45,7 @@ RSpec.describe UnsuspendAccountService do remote_follower.follow!(account) end - it 'merges back into feeds of local followers and sends update', :sidekiq_inline do + it 'merges back into feeds of local followers and sends update', :inline_jobs do subject expect_feeds_merged diff --git a/spec/services/update_account_service_spec.rb b/spec/services/update_account_service_spec.rb index 5204f1f34d4..d066db481e5 100644 --- a/spec/services/update_account_service_spec.rb +++ b/spec/services/update_account_service_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' RSpec.describe UpdateAccountService do subject { described_class.new } - describe 'switching form locked to unlocked accounts', :sidekiq_inline do + describe 'switching form locked to unlocked accounts', :inline_jobs do let(:account) { Fabricate(:account, locked: true) } let(:alice) { Fabricate(:account) } let(:bob) { Fabricate(:account) } diff --git a/spec/support/examples/models/concerns/account_avatar.rb b/spec/support/examples/models/concerns/account_avatar.rb index 2c9b5514aad..ab6020d834a 100644 --- a/spec/support/examples/models/concerns/account_avatar.rb +++ b/spec/support/examples/models/concerns/account_avatar.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true shared_examples 'AccountAvatar' do |fabricator| - describe 'static avatars', :paperclip_processing do + describe 'static avatars', :attachment_processing do describe 'when GIF' do it 'creates a png static style' do account = Fabricate(fabricator, avatar: attachment_fixture('avatar.gif')) @@ -17,7 +17,7 @@ shared_examples 'AccountAvatar' do |fabricator| end end - describe 'base64-encoded files', :paperclip_processing do + describe 'base64-encoded files', :attachment_processing do let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" } let(:account) { Fabricate(fabricator, avatar: base64_attachment) } diff --git a/spec/support/examples/models/concerns/account_header.rb b/spec/support/examples/models/concerns/account_header.rb index ce09eb006b8..43bbdaacf42 100644 --- a/spec/support/examples/models/concerns/account_header.rb +++ b/spec/support/examples/models/concerns/account_header.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true shared_examples 'AccountHeader' do |fabricator| - describe 'base64-encoded files', :paperclip_processing do + describe 'base64-encoded files', :attachment_processing do let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" } let(:account) { Fabricate(fabricator, header: base64_attachment) } diff --git a/spec/support/javascript_errors.rb b/spec/support/javascript_errors.rb index 28a43b3b8a5..ef5945f37dc 100644 --- a/spec/support/javascript_errors.rb +++ b/spec/support/javascript_errors.rb @@ -2,7 +2,15 @@ RSpec.configure do |config| config.after(:each, :js, type: :system) do - errors = page.driver.browser.logs.get(:browser) + # Classes of intermittent ignorable errors + ignored_errors = [ + /Error while trying to use the following icon from the Manifest/, # https://github.com/mastodon/mastodon/pull/30793 + /Manifest: Line: 1, column: 1, Syntax error/, # Similar parsing/interruption issue as above + ] + errors = page.driver.browser.logs.get(:browser).reject do |error| + ignored_errors.any? { |pattern| pattern.match(error.message) } + end + if errors.present? aggregate_failures 'javascript errrors' do errors.each do |error| diff --git a/spec/support/matchers/api_pagination.rb b/spec/support/matchers/api_pagination.rb index 81e27e44b80..f7d552b242a 100644 --- a/spec/support/matchers/api_pagination.rb +++ b/spec/support/matchers/api_pagination.rb @@ -7,7 +7,7 @@ RSpec::Matchers.define :include_pagination_headers do |links| end.all? end - failure_message do |header| - "expected that #{header} would have the same values as #{links}." + failure_message do |response| + "expected that #{response.headers['Link']} would have the same values as #{links}." end end diff --git a/spec/support/matchers/json/match_json_schema.rb b/spec/support/matchers/json/match_json_schema.rb index 3a275199efd..b4ced8addbd 100644 --- a/spec/support/matchers/json/match_json_schema.rb +++ b/spec/support/matchers/json/match_json_schema.rb @@ -6,3 +6,14 @@ RSpec::Matchers.define :match_json_schema do |schema| JSON::Validator.validate(schema_path, input_json, validate_schema: true) end end + +RSpec::Matchers.define :match_json_values do |values| + match do |string| + expect(json_str_to_hash(string)) + .to include(values) + end + + failure_message do |value| + "expected that #{value} would have the same values as #{values}." + end +end diff --git a/spec/support/stories/profile_stories.rb b/spec/support/stories/profile_stories.rb index f5fc9a441fd..07eaaca9fb9 100644 --- a/spec/support/stories/profile_stories.rb +++ b/spec/support/stories/profile_stories.rb @@ -3,6 +3,12 @@ module ProfileStories attr_reader :bob, :alice, :alice_bio + def fill_in_auth_details(email, password) + fill_in 'user_email', with: email + fill_in 'user_password', with: password + click_on I18n.t('auth.login') + end + def as_a_registered_user @bob = Fabricate( :user, @@ -16,9 +22,7 @@ module ProfileStories def as_a_logged_in_user as_a_registered_user visit new_user_session_path - fill_in 'user_email', with: email - fill_in 'user_password', with: password - click_on I18n.t('auth.login') + fill_in_auth_details(email, password) end def as_a_logged_in_admin diff --git a/spec/support/streaming_server_manager.rb b/spec/support/streaming_server_manager.rb index 3facf16b8eb..376d6b87251 100644 --- a/spec/support/streaming_server_manager.rb +++ b/spec/support/streaming_server_manager.rb @@ -80,9 +80,6 @@ end RSpec.configure do |config| config.before :suite do if streaming_examples_present? - # Compile assets - Webpacker.compile - # Start the node streaming server streaming_server_manager.start(port: STREAMING_PORT) end diff --git a/spec/system/admin/accounts_spec.rb b/spec/system/admin/accounts_spec.rb index 54d755b914d..20813f6be42 100644 --- a/spec/system/admin/accounts_spec.rb +++ b/spec/system/admin/accounts_spec.rb @@ -48,7 +48,7 @@ describe 'Admin::Accounts' do end end - context 'with action of `reject`', :sidekiq_inline do + context 'with action of `reject`', :inline_jobs do it 'rejects and removes the account' do batch_checkbox_for(unapproved_user_account).check diff --git a/spec/system/log_in_spec.rb b/spec/system/log_in_spec.rb index c64e19d2b7c..8a73c42d2ed 100644 --- a/spec/system/log_in_spec.rb +++ b/spec/system/log_in_spec.rb @@ -17,17 +17,13 @@ describe 'Log in' do end it 'A valid email and password user is able to log in' do - fill_in 'user_email', with: email - fill_in 'user_password', with: password - click_on I18n.t('auth.login') + fill_in_auth_details(email, password) expect(subject).to have_css('div.app-holder') end it 'A invalid email and password user is not able to log in' do - fill_in 'user_email', with: 'invalid_email' - fill_in 'user_password', with: 'invalid_password' - click_on I18n.t('auth.login') + fill_in_auth_details('invalid_email', 'invalid_password') expect(subject).to have_css('.flash-message', text: failure_message('invalid')) end @@ -36,9 +32,7 @@ describe 'Log in' do let(:confirmed_at) { nil } it 'A unconfirmed user is able to log in' do - fill_in 'user_email', with: email - fill_in 'user_password', with: password - click_on I18n.t('auth.login') + fill_in_auth_details(email, password) expect(subject).to have_css('div.admin-wrapper') end diff --git a/spec/system/new_statuses_spec.rb b/spec/system/new_statuses_spec.rb index 725ea8fe520..2f2fcf22485 100644 --- a/spec/system/new_statuses_spec.rb +++ b/spec/system/new_statuses_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe 'NewStatuses', :js, :sidekiq_inline, :streaming do +describe 'NewStatuses', :inline_jobs, :js, :streaming do include ProfileStories subject { page } diff --git a/spec/system/oauth_spec.rb b/spec/system/oauth_spec.rb index 1c9aca31141..5d06f6111ce 100644 --- a/spec/system/oauth_spec.rb +++ b/spec/system/oauth_spec.rb @@ -2,8 +2,15 @@ require 'rails_helper' -describe 'Using OAuth from an external app', :js, :streaming do +describe 'Using OAuth from an external app' do + include ProfileStories + + subject { visit "/oauth/authorize?#{params.to_query}" } + let(:client_app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: about_url(host: Rails.application.config.x.local_domain), scopes: 'read') } + let(:params) do + { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } + end context 'when the user is already logged in' do let!(:user) { Fabricate(:user) } @@ -14,8 +21,7 @@ describe 'Using OAuth from an external app', :js, :streaming do end it 'when accepting the authorization request' do - params = { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } - visit "/oauth/authorize?#{params.to_query}" + subject # It presents the user with an authorization page expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.authorize')) @@ -29,8 +35,7 @@ describe 'Using OAuth from an external app', :js, :streaming do end it 'when rejecting the authorization request' do - params = { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } - visit "/oauth/authorize?#{params.to_query}" + subject # It presents the user with an authorization page expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.deny')) @@ -42,6 +47,79 @@ describe 'Using OAuth from an external app', :js, :streaming do # It does not grant the app access to the account expect(Doorkeeper::AccessGrant.exists?(application: client_app, resource_owner_id: user.id)).to be false end + + # The tests in this context ensures that requests without PKCE parameters + # still work; In the future we likely want to force usage of PKCE for + # security reasons, as per: + # + # https://www.ietf.org/archive/id/draft-ietf-oauth-security-topics-27.html#section-2.1.1-9 + context 'when not using PKCE' do + it 'does not include the PKCE values in the hidden inputs' do + subject + + code_challenge_inputs = all('.oauth-prompt input[name=code_challenge]', visible: false) + code_challenge_method_inputs = all('.oauth-prompt input[name=code_challenge_method]', visible: false) + + expect(code_challenge_inputs).to_not be_empty + expect(code_challenge_method_inputs).to_not be_empty + + (code_challenge_inputs.to_a + code_challenge_method_inputs.to_a).each do |input| + expect(input.value).to be_nil + end + end + end + + context 'when using PKCE' do + let(:params) do + { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read', code_challenge_method: pkce_code_challenge_method, code_challenge: pkce_code_challenge } + end + let(:pkce_code_challenge) { SecureRandom.hex(32) } + let(:pkce_code_challenge_method) { 'S256' } + + context 'when using S256 code challenge method' do + it 'includes the PKCE values in the hidden inputs' do + subject + + code_challenge_inputs = all('.oauth-prompt input[name=code_challenge]', visible: false) + code_challenge_method_inputs = all('.oauth-prompt input[name=code_challenge_method]', visible: false) + + expect(code_challenge_inputs).to_not be_empty + expect(code_challenge_method_inputs).to_not be_empty + + code_challenge_inputs.each do |input| + expect(input.value).to eq pkce_code_challenge + end + code_challenge_method_inputs.each do |input| + expect(input.value).to eq pkce_code_challenge_method + end + end + end + + context 'when using plain code challenge method' do + let(:pkce_code_challenge_method) { 'plain' } + + it 'does not include the PKCE values in the response' do + subject + + expect(page).to have_no_css('.oauth-prompt input[name=code_challenge]') + expect(page).to have_no_css('.oauth-prompt input[name=code_challenge_method]') + end + + it 'does not include the authorize button' do + subject + + expect(page).to have_no_css('.oauth-prompt button[type="submit"]') + end + + it 'includes an error message' do + subject + + within '.form-container .flash-message' do + expect(page).to have_content(I18n.t('doorkeeper.errors.messages.invalid_code_challenge_method')) + end + end + end + end end context 'when the user is not already logged in' do @@ -170,12 +248,6 @@ describe 'Using OAuth from an external app', :js, :streaming do private - def fill_in_auth_details(email, password) - fill_in 'user_email', with: email - fill_in 'user_password', with: password - click_on I18n.t('auth.login') - end - def fill_in_otp_details(value) fill_in 'user_otp_attempt', with: value click_on I18n.t('auth.login') diff --git a/spec/system/ocr_spec.rb b/spec/system/ocr_spec.rb index 4f4941adca5..17d18af1586 100644 --- a/spec/system/ocr_spec.rb +++ b/spec/system/ocr_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe 'OCR', :js, :paperclip_processing, :sidekiq_inline, :streaming do +describe 'OCR', :attachment_processing, :inline_jobs, :js, :streaming do include ProfileStories let(:email) { 'test@example.com' } diff --git a/spec/system/report_interface_spec.rb b/spec/system/report_interface_spec.rb index f82604aae89..e6cc3b1b688 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', :js, :paperclip_processing, :streaming do +describe 'report interface', :attachment_processing, :js, :streaming do include ProfileStories let(:email) { 'admin@example.com' } diff --git a/spec/validators/note_length_validator_spec.rb b/spec/validators/note_length_validator_spec.rb index 66fccad3ece..3bca93a283d 100644 --- a/spec/validators/note_length_validator_spec.rb +++ b/spec/validators/note_length_validator_spec.rb @@ -6,7 +6,7 @@ describe NoteLengthValidator do subject { described_class.new(attributes: { note: true }, maximum: 500) } describe '#validate' do - it 'adds an error when text is over 500 characters' do + it 'adds an error when text is over configured character limit' do text = 'a' * 520 account = instance_double(Account, note: text, errors: activemodel_errors) @@ -14,16 +14,16 @@ describe NoteLengthValidator do expect(account.errors).to have_received(:add) end - it 'counts URLs as 23 characters flat' do - text = ('a' * 476) + " http://#{'b' * 30}.com/example" + it 'reduces calculated length of auto-linkable space-separated URLs' do + text = [starting_string, example_link].join(' ') account = instance_double(Account, note: text, errors: activemodel_errors) subject.validate_each(account, 'note', text) expect(account.errors).to_not have_received(:add) end - it 'does not count non-autolinkable URLs as 23 characters flat' do - text = ('a' * 476) + "http://#{'b' * 30}.com/example" + it 'does not reduce calculated length of non-autolinkable URLs' do + text = [starting_string, example_link].join account = instance_double(Account, note: text, errors: activemodel_errors) subject.validate_each(account, 'note', text) @@ -32,6 +32,14 @@ describe NoteLengthValidator do private + def starting_string + 'a' * 476 + end + + def example_link + "http://#{'b' * 30}.com/example" + end + def activemodel_errors instance_double(ActiveModel::Errors, add: nil) end diff --git a/spec/validators/reaction_validator_spec.rb b/spec/validators/reaction_validator_spec.rb index d73104cb692..f99c1cb5f93 100644 --- a/spec/validators/reaction_validator_spec.rb +++ b/spec/validators/reaction_validator_spec.rb @@ -19,8 +19,9 @@ describe ReactionValidator do expect(reaction.errors).to be_empty end - it 'adds error when 8 reactions already exist' do - %w(🐘 ❤️ 🙉 😍 😋 😂 😞 👍).each do |name| + it 'adds error when reaction limit count has already been reached' do + stub_const 'ReactionValidator::LIMIT', 2 + %w(🐘 ❤️).each do |name| announcement.announcement_reactions.create!(name: name, account: Fabricate(:account)) end diff --git a/spec/validators/status_length_validator_spec.rb b/spec/validators/status_length_validator_spec.rb index ead69dfe21d..249b90f4904 100644 --- a/spec/validators/status_length_validator_spec.rb +++ b/spec/validators/status_length_validator_spec.rb @@ -42,23 +42,23 @@ describe StatusLengthValidator do expect(status.errors).to have_received(:add) end - it 'counts URLs as 23 characters flat' do - text = ('a' * 476) + " http://#{'b' * 30}.com/example" + it 'reduces calculated length of auto-linkable space-separated URLs' do + text = [starting_string, example_link].join(' ') status = status_double(text: text) subject.validate(status) expect(status.errors).to_not have_received(:add) end - it 'does not count non-autolinkable URLs as 23 characters flat' do - text = ('a' * 476) + "http://#{'b' * 30}.com/example" + it 'does not reduce calculated length of non-autolinkable URLs' do + text = [starting_string, example_link].join status = status_double(text: text) subject.validate(status) expect(status.errors).to have_received(:add) end - it 'does not count overly long URLs as 23 characters flat' do + it 'does not reduce calculated length of count overly long URLs' do text = "http://example.com/valid?#{'#foo?' * 1000}" status = status_double(text: text) subject.validate(status) @@ -84,6 +84,14 @@ describe StatusLengthValidator do private + def starting_string + 'a' * 476 + end + + def example_link + "http://#{'b' * 30}.com/example" + end + def status_double(spoiler_text: '', text: '') instance_double( Status, diff --git a/spec/workers/activitypub/distribute_poll_update_worker_spec.rb b/spec/workers/activitypub/distribute_poll_update_worker_spec.rb index afe2b291fd0..4427cfdf959 100644 --- a/spec/workers/activitypub/distribute_poll_update_worker_spec.rb +++ b/spec/workers/activitypub/distribute_poll_update_worker_spec.rb @@ -16,7 +16,7 @@ describe ActivityPub::DistributePollUpdateWorker do end it 'delivers to followers' do - expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[kind_of(String), account.id, 'http://example.com']]) do + expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[match_json_values(type: 'Update'), account.id, 'http://example.com']]) do subject.perform(status.id) end end diff --git a/spec/workers/activitypub/distribution_worker_spec.rb b/spec/workers/activitypub/distribution_worker_spec.rb index 2706967fcae..0eb6227859d 100644 --- a/spec/workers/activitypub/distribution_worker_spec.rb +++ b/spec/workers/activitypub/distribution_worker_spec.rb @@ -19,7 +19,7 @@ describe ActivityPub::DistributionWorker do end it 'delivers to followers' do - expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[kind_of(String), status.account.id, 'http://example.com', anything]]) do + expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[match_json_values(type: 'Create'), status.account.id, 'http://example.com', anything]]) do subject.perform(status.id) end end @@ -31,7 +31,7 @@ describe ActivityPub::DistributionWorker do end it 'delivers to followers' do - expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[kind_of(String), status.account.id, 'http://example.com', anything]]) do + expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[match_json_values(type: 'Create'), status.account.id, 'http://example.com', anything]]) do subject.perform(status.id) end end @@ -46,7 +46,7 @@ describe ActivityPub::DistributionWorker do end it 'delivers to mentioned accounts' do - expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[kind_of(String), status.account.id, 'https://foo.bar/inbox', anything]]) do + expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[match_json_values(type: 'Create'), status.account.id, 'https://foo.bar/inbox', anything]]) do subject.perform(status.id) end end diff --git a/spec/workers/activitypub/move_distribution_worker_spec.rb b/spec/workers/activitypub/move_distribution_worker_spec.rb index 75ca21733ce..c810b33c23a 100644 --- a/spec/workers/activitypub/move_distribution_worker_spec.rb +++ b/spec/workers/activitypub/move_distribution_worker_spec.rb @@ -16,12 +16,16 @@ describe ActivityPub::MoveDistributionWorker do end it 'delivers to followers and known blockers' do - expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [ - [kind_of(String), migration.account.id, 'http://example.com'], - [kind_of(String), migration.account.id, 'http://example2.com'], - ]) do + expect_push_bulk_to_match(ActivityPub::DeliveryWorker, expected_migration_deliveries) do subject.perform(migration.id) end end + + def expected_migration_deliveries + [ + [match_json_values(type: 'Move'), migration.account.id, 'http://example.com'], + [match_json_values(type: 'Move'), migration.account.id, 'http://example2.com'], + ] + end end end diff --git a/spec/workers/activitypub/status_update_distribution_worker_spec.rb b/spec/workers/activitypub/status_update_distribution_worker_spec.rb index a4fd246e534..66e52c4f288 100644 --- a/spec/workers/activitypub/status_update_distribution_worker_spec.rb +++ b/spec/workers/activitypub/status_update_distribution_worker_spec.rb @@ -25,7 +25,7 @@ describe ActivityPub::StatusUpdateDistributionWorker do end it 'delivers to followers' do - expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[kind_of(String), status.account.id, 'http://example.com', anything]]) do + expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[match_json_values(type: 'Update'), status.account.id, 'http://example.com', anything]]) do subject.perform(status.id) end end @@ -37,7 +37,7 @@ describe ActivityPub::StatusUpdateDistributionWorker do end it 'delivers to followers' do - expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[kind_of(String), status.account.id, 'http://example.com', anything]]) do + expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[match_json_values(type: 'Update'), status.account.id, 'http://example.com', anything]]) do subject.perform(status.id) end end diff --git a/spec/workers/activitypub/update_distribution_worker_spec.rb b/spec/workers/activitypub/update_distribution_worker_spec.rb index 4a0ed050bb7..b183a58dfd0 100644 --- a/spec/workers/activitypub/update_distribution_worker_spec.rb +++ b/spec/workers/activitypub/update_distribution_worker_spec.rb @@ -14,7 +14,7 @@ describe ActivityPub::UpdateDistributionWorker do end it 'delivers to followers' do - expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[kind_of(String), account.id, 'http://example.com', anything]]) do + expect_push_bulk_to_match(ActivityPub::DeliveryWorker, [[match_json_values(type: 'Update'), account.id, 'http://example.com', anything]]) do subject.perform(account.id) end end diff --git a/spec/workers/backup_worker_spec.rb b/spec/workers/backup_worker_spec.rb index 74928c7ca6b..db1b50140b6 100644 --- a/spec/workers/backup_worker_spec.rb +++ b/spec/workers/backup_worker_spec.rb @@ -14,7 +14,7 @@ describe BackupWorker do let(:backup) { Fabricate(:backup) } let!(:other_backup) { Fabricate(:backup, user: backup.user) } - it 'sends the backup to the service and removes other backups', :sidekiq_inline do + it 'sends the backup to the service and removes other backups', :inline_jobs do emails = capture_emails { worker.perform(backup.id) } expect(service).to have_received(:call).with(backup) diff --git a/spec/workers/move_worker_spec.rb b/spec/workers/move_worker_spec.rb index 0513dc42e52..b25992e44bd 100644 --- a/spec/workers/move_worker_spec.rb +++ b/spec/workers/move_worker_spec.rb @@ -104,7 +104,7 @@ describe MoveWorker do end shared_examples 'lists handling' do - it 'puts the new account on the list and makes valid lists', :sidekiq_inline do + it 'puts the new account on the list and makes valid lists', :inline_jobs do subject.perform(source_account.id, target_account.id) expect(list.accounts.include?(target_account)).to be true diff --git a/spec/workers/post_process_media_worker_spec.rb b/spec/workers/post_process_media_worker_spec.rb index 828da5244f5..1a274623d73 100644 --- a/spec/workers/post_process_media_worker_spec.rb +++ b/spec/workers/post_process_media_worker_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe PostProcessMediaWorker, :paperclip_processing do +describe PostProcessMediaWorker, :attachment_processing do let(:worker) { described_class.new } describe '#perform' do diff --git a/spec/workers/scheduler/user_cleanup_scheduler_spec.rb b/spec/workers/scheduler/user_cleanup_scheduler_spec.rb index c3940901d4e..7952f2c1463 100644 --- a/spec/workers/scheduler/user_cleanup_scheduler_spec.rb +++ b/spec/workers/scheduler/user_cleanup_scheduler_spec.rb @@ -12,29 +12,31 @@ describe Scheduler::UserCleanupScheduler do describe '#perform' do before do - # Need to update the already-existing users because their initialization overrides confirmation_sent_at + # Update already-existing users because initialization overrides `confirmation_sent_at` new_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: Time.now.utc) old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 10.days.ago) confirmed_user.update!(confirmed_at: 1.day.ago) end - it 'deletes the old unconfirmed user, their account, and the moderation note' do + it 'deletes the old unconfirmed user and metadata while preserving confirmed user and newer unconfirmed user' do expect { subject.perform } - .to change { User.exists?(old_unconfirmed_user.id) }.from(true).to(false) - .and change { Account.exists?(old_unconfirmed_user.account_id) }.from(true).to(false) - expect { moderation_note.reload }.to raise_error(ActiveRecord::RecordNotFound) + .to change { User.exists?(old_unconfirmed_user.id) } + .from(true).to(false) + .and change { Account.exists?(old_unconfirmed_user.account_id) } + .from(true).to(false) + expect { moderation_note.reload } + .to raise_error(ActiveRecord::RecordNotFound) + expect_preservation_of(new_unconfirmed_user) + expect_preservation_of(confirmed_user) end - it 'does not delete the new unconfirmed user or their account' do - subject.perform - expect(User.exists?(new_unconfirmed_user.id)).to be true - expect(Account.exists?(new_unconfirmed_user.account_id)).to be true - end + private - it 'does not delete the confirmed user or their account' do - subject.perform - expect(User.exists?(confirmed_user.id)).to be true - expect(Account.exists?(confirmed_user.account_id)).to be true + def expect_preservation_of(user) + expect(User.exists?(user.id)) + .to be true + expect(Account.exists?(user.account_id)) + .to be true end end end diff --git a/streaming/Dockerfile b/streaming/Dockerfile index 564e717a402..938f1655d15 100644 --- a/streaming/Dockerfile +++ b/streaming/Dockerfile @@ -1,4 +1,4 @@ -# syntax=docker/dockerfile:1.7 +# syntax=docker/dockerfile:1.9 # Please see https://docs.docker.com/engine/reference/builder for information about # the extended buildx capabilities used in this file. @@ -13,7 +13,14 @@ 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 streaming +FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS streaming + +# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA +# Example: v4.3.0-nightly.2023.11.09+pr-123456 +# Overwrite existence of 'alpha.X' in version.rb [--build-arg MASTODON_VERSION_PRERELEASE="nightly.2023.11.09"] +ARG MASTODON_VERSION_PRERELEASE="" +# Append build metadata or fork information to version.rb [--build-arg MASTODON_VERSION_METADATA="pr-123456"] +ARG MASTODON_VERSION_METADATA="" # Timezone used by the Docker container and runtime, change with [--build-arg TZ=Europe/Berlin] ARG TZ="Etc/UTC" @@ -103,4 +110,4 @@ USER mastodon # Expose default Streaming ports EXPOSE 4000 # Run streaming when started -CMD [ node ./streaming/index.js ] +CMD [ "node", "./streaming/index.js" ] diff --git a/streaming/index.js b/streaming/index.js index cf477134dca..cfc6b4b24aa 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -12,7 +12,7 @@ import { Redis } from 'ioredis'; import { JSDOM } from 'jsdom'; import pg from 'pg'; import pgConnectionString from 'pg-connection-string'; -import WebSocket from 'ws'; +import { WebSocketServer } from 'ws'; import { AuthenticationError, RequestError, extractStatusAndMessage as extractErrorStatusAndMessage } from './errors.js'; import { logger, httpLogger, initializeLogLevel, attachWebsocketHttpLogger, createWebsocketLogger } from './logging.js'; @@ -248,6 +248,10 @@ const redisConfigFromEnv = (env) => { let redisParams = { host: env.REDIS_HOST || '127.0.0.1', port: redisPort, + // Force support for both IPv6 and IPv4, by default ioredis sets this to 4, + // only allowing IPv4 connections: + // https://github.com/redis/ioredis/issues/1576 + family: 0, db: redisDatabase, password: env.REDIS_PASSWORD || undefined, }; @@ -302,7 +306,7 @@ const CHANNEL_NAMES = [ const startServer = async () => { const pgPool = new pg.Pool(pgConfigFromEnv(process.env)); const server = http.createServer(); - const wss = new WebSocket.Server({ noServer: true }); + const wss = new WebSocketServer({ noServer: true }); // Set the X-Request-Id header on WebSockets: wss.on("headers", function onHeaders(headers, req) { @@ -537,43 +541,27 @@ const startServer = async () => { * @param {any} req * @returns {Promise} */ - const accountFromToken = (token, req) => new Promise((resolve, reject) => { - pgPool.connect((err, client, done) => { - if (err) { - reject(err); - return; - } + const accountFromToken = async (token, req) => { + const result = await pgPool.query('SELECT oauth_access_tokens.id, oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes, devices.device_id FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id LEFT OUTER JOIN devices ON oauth_access_tokens.id = devices.access_token_id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL LIMIT 1', [token]); - // @ts-ignore - client.query('SELECT oauth_access_tokens.id, oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes, devices.device_id FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id LEFT OUTER JOIN devices ON oauth_access_tokens.id = devices.access_token_id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL LIMIT 1', [token], (err, result) => { - done(); + if (result.rows.length === 0) { + throw new AuthenticationError('Invalid access token'); + } - if (err) { - reject(err); - return; - } + req.accessTokenId = result.rows[0].id; + req.scopes = result.rows[0].scopes.split(' '); + req.accountId = result.rows[0].account_id; + req.chosenLanguages = result.rows[0].chosen_languages; + req.deviceId = result.rows[0].device_id; - if (result.rows.length === 0) { - reject(new AuthenticationError('Invalid access token')); - return; - } - - req.accessTokenId = result.rows[0].id; - req.scopes = result.rows[0].scopes.split(' '); - req.accountId = result.rows[0].account_id; - req.chosenLanguages = result.rows[0].chosen_languages; - req.deviceId = result.rows[0].device_id; - - resolve({ - accessTokenId: result.rows[0].id, - scopes: result.rows[0].scopes.split(' '), - accountId: result.rows[0].account_id, - chosenLanguages: result.rows[0].chosen_languages, - deviceId: result.rows[0].device_id - }); - }); - }); - }); + return { + accessTokenId: result.rows[0].id, + scopes: result.rows[0].scopes.split(' '), + accountId: result.rows[0].account_id, + chosenLanguages: result.rows[0].chosen_languages, + deviceId: result.rows[0].device_id + }; + }; /** * @param {any} req @@ -784,28 +772,15 @@ const startServer = async () => { * @param {any} req * @returns {Promise.} */ - const authorizeListAccess = (listId, req) => new Promise((resolve, reject) => { + const authorizeListAccess = async (listId, req) => { const { accountId } = req; - pgPool.connect((err, client, done) => { - if (err) { - reject(); - return; - } + const result = await pgPool.query('SELECT id, account_id FROM lists WHERE id = $1 AND account_id = $2 LIMIT 1', [listId, accountId]); - // @ts-ignore - client.query('SELECT id, account_id FROM lists WHERE id = $1 LIMIT 1', [listId], (err, result) => { - done(); - - if (err || result.rows.length === 0 || result.rows[0].account_id !== accountId) { - reject(); - return; - } - - resolve(); - }); - }); - }); + if (result.rows.length === 0) { + throw new AuthenticationError('List not found'); + } + }; /** * @param {string[]} channelIds @@ -1120,7 +1095,7 @@ const startServer = async () => { /** * @param {http.IncomingMessage} req - * @param {WebSocket} ws + * @param {import('ws').WebSocket} ws * @param {string[]} streamName * @returns {function(string, string): void} */ @@ -1337,7 +1312,7 @@ const startServer = async () => { /** * @typedef WebSocketSession - * @property {WebSocket & { isAlive: boolean}} websocket + * @property {import('ws').WebSocket & { isAlive: boolean}} websocket * @property {http.IncomingMessage & ResolvedAccount} request * @property {import('pino').Logger} logger * @property {Object.} subscriptions @@ -1463,7 +1438,7 @@ const startServer = async () => { }; /** - * @param {WebSocket & { isAlive: boolean }} ws + * @param {import('ws').WebSocket & { isAlive: boolean }} ws * @param {http.IncomingMessage & ResolvedAccount} req * @param {import('pino').Logger} log */ diff --git a/streaming/package.json b/streaming/package.json index ba024fe7af4..4f44927831d 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.3.0", + "packageManager": "yarn@4.4.0", "engines": { "node": ">=18" }, @@ -34,7 +34,7 @@ "@types/cors": "^2.8.16", "@types/express": "^4.17.17", "@types/pg": "^8.6.6", - "@types/uuid": "^9.0.0", + "@types/uuid": "^10.0.0", "@types/ws": "^8.5.9", "eslint-define-config": "^2.0.0", "pino-pretty": "^11.0.0", diff --git a/yarn.lock b/yarn.lock index 01b45d15690..9786925f65d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,45 +52,45 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/compat-data@npm:7.24.7" - checksum: 10c0/dcd93a5632b04536498fbe2be5af1057f635fd7f7090483d8e797878559037e5130b26862ceb359acbae93ed27e076d395ddb4663db6b28a665756ffd02d324f +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/compat-data@npm:7.25.2" + checksum: 10c0/5bf1f14d6e5f0d37c19543e99209ff4a94bb97915e1ce01e5334a144aa08cd56b6e62ece8135dac77e126723d63d4d4b96fc603a12c43b88c28f4b5e070270c5 languageName: node linkType: hard "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1, @babel/core@npm:^7.24.4": - version: 7.24.7 - resolution: "@babel/core@npm:7.24.7" + version: 7.25.2 + resolution: "@babel/core@npm:7.25.2" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helpers": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" + "@babel/generator": "npm:^7.25.0" + "@babel/helper-compilation-targets": "npm:^7.25.2" + "@babel/helper-module-transforms": "npm:^7.25.2" + "@babel/helpers": "npm:^7.25.0" + "@babel/parser": "npm:^7.25.0" + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.2" + "@babel/types": "npm:^7.25.2" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/4004ba454d3c20a46ea66264e06c15b82e9f6bdc35f88819907d24620da70dbf896abac1cb4cc4b6bb8642969e45f4d808497c9054a1388a386cf8c12e9b9e0d + checksum: 10c0/a425fa40e73cb72b6464063a57c478bc2de9dbcc19c280f1b55a3d88b35d572e87e8594e7d7b4880331addb6faef641bbeb701b91b41b8806cd4deae5d74f401 languageName: node linkType: hard -"@babel/generator@npm:^7.24.7, @babel/generator@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/generator@npm:7.24.7" +"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.7.2": + version: 7.25.0 + resolution: "@babel/generator@npm:7.25.0" dependencies: - "@babel/types": "npm:^7.24.7" + "@babel/types": "npm:^7.25.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10c0/06b1f3350baf527a3309e50ffd7065f7aee04dd06e1e7db794ddfde7fe9d81f28df64edd587173f8f9295496a7ddb74b9a185d4bf4de7bb619e6d4ec45c8fd35 + checksum: 10c0/d0e2dfcdc8bdbb5dded34b705ceebf2e0bc1b06795a1530e64fb6a3ccf313c189db7f60c1616effae48114e1a25adc75855bc4496f3779a396b3377bae718ce7 languageName: node linkType: hard @@ -123,16 +123,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-compilation-targets@npm:7.24.7" +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-compilation-targets@npm:7.25.2" dependencies: - "@babel/compat-data": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - browserslist: "npm:^4.22.2" + "@babel/compat-data": "npm:^7.25.2" + "@babel/helper-validator-option": "npm:^7.24.8" + browserslist: "npm:^4.23.1" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10c0/1d580a9bcacefe65e6bf02ba1dafd7ab278269fef45b5e281d8354d95c53031e019890464e7f9351898c01502dd2e633184eb0bcda49ed2ecd538675ce310f51 + checksum: 10c0/de10e986b5322c9f807350467dc845ec59df9e596a5926a3b5edbb4710d8e3b8009d4396690e70b88c3844fe8ec4042d61436dd4b92d1f5f75655cf43ab07e99 languageName: node linkType: hard @@ -155,16 +155,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.7" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7, @babel/helper-create-regexp-features-plugin@npm:^7.25.0": + version: 7.25.2 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.24.7" regexpu-core: "npm:^5.3.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/ed611a7eb0c71843f9cdc471eeb38767972229f9225f7aaa90d124d7ee0062cf6908fd53ee9c34f731394c429594f06049a7738a71d342e0191d4047b2fc0ac2 + checksum: 10c0/85a7e3639c118856fb1113f54fb7e3bf7698171ddfd0cd6fccccd5426b3727bc1434fe7f69090441dcde327feef9de917e00d35e47ab820047057518dd675317 languageName: node linkType: hard @@ -202,22 +202,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-hoist-variables@npm:7.24.7" +"@babel/helper-member-expression-to-functions@npm:^7.24.7, @babel/helper-member-expression-to-functions@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10c0/19ee37563bbd1219f9d98991ad0e9abef77803ee5945fd85aa7aa62a67c69efca9a801696a1b58dda27f211e878b3327789e6fd2a6f6c725ccefe36774b5ce95 - languageName: node - linkType: hard - -"@babel/helper-member-expression-to-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/9638c1d33cf6aba028461ccd3db6061c76ff863ca0d5013dd9a088bf841f2f77c46956493f9da18355c16759449d23b74cc1de4da357ade5c5c34c858f840f0a + "@babel/traverse": "npm:^7.24.8" + "@babel/types": "npm:^7.24.8" + checksum: 10c0/7e14a5acc91f6cd26305a4441b82eb6f616bd70b096a4d2099a968f16b26d50207eec0b9ebfc466fefd62bd91587ac3be878117cdfec819b7151911183cb0e5a languageName: node linkType: hard @@ -231,18 +222,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-transforms@npm:7.24.7" +"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.0, @babel/helper-module-transforms@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-module-transforms@npm:7.25.2" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" "@babel/helper-module-imports": "npm:^7.24.7" "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" "@babel/helper-validator-identifier": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.2" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/4f311755fcc3b4cbdb689386309cdb349cf0575a938f0b9ab5d678e1a81bbb265aa34ad93174838245f2ac7ff6d5ddbd0104638a75e4e961958ed514355687b6 + checksum: 10c0/adaa15970ace0aee5934b5a633789b5795b6229c6a9cf3e09a7e80aa33e478675eee807006a862aa9aa517935d81f88a6db8a9f5936e3a2a40ec75f8062bc329 languageName: node linkType: hard @@ -255,36 +245,36 @@ __metadata: 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.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.7 - resolution: "@babel/helper-plugin-utils@npm:7.24.7" - checksum: 10c0/c3d38cd9b3520757bb4a279255cc3f956fc0ac1c193964bd0816ebd5c86e30710be8e35252227e0c9d9e0f4f56d9b5f916537f2bc588084b0988b4787a967d31 +"@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.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.24.8 + resolution: "@babel/helper-plugin-utils@npm:7.24.8" + checksum: 10c0/0376037f94a3bfe6b820a39f81220ac04f243eaee7193774b983e956c1750883ff236b30785795abbcda43fac3ece74750566830c2daa4d6e3870bb0dff34c2d languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7" +"@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-wrap-function": "npm:^7.24.7" + "@babel/helper-wrap-function": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/4e7fa2cdcbc488e41c27066c16e562857ef3c5c2bfe70d2f1e32e9ee7546b17c3fc1c20d05bf2a7f1c291bd9e7a0a219f6a9fa387209013294be79a26fcfe64d + checksum: 10c0/0d17b5f7bb6a607edc9cc62fff8056dd9f341bf2f919884f97b99170d143022a5e7ae57922c4891e4fc360ad291e708d2f8cd8989f1d3cd7a17600159984f5a6 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-replace-supers@npm:7.24.7" +"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-replace-supers@npm:7.25.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.7" + "@babel/helper-member-expression-to-functions": "npm:^7.24.8" "@babel/helper-optimise-call-expression": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/0e133bb03371dee78e519c334a09c08e1493103a239d9628db0132dfaac3fc16380479ca3c590d278a9b71b624030a338c18ebbfe6d430ebb2e4653775c4b3e3 + checksum: 10c0/b4b6650ab3d56c39a259367cd97f8df2f21c9cebb3716fea7bca40a150f8847bfb82f481e98927c7c6579b48a977b5a8f77318a1c6aeb497f41ecd6dbc3fdfef languageName: node linkType: hard @@ -317,10 +307,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-string-parser@npm:7.24.7" - checksum: 10c0/47840c7004e735f3dc93939c77b099bb41a64bf3dda0cae62f60e6f74a5ff80b63e9b7cf77b5ec25a324516381fc994e1f62f922533236a8e3a6af57decb5e1e +"@babel/helper-string-parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-string-parser@npm:7.24.8" + checksum: 10c0/6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 languageName: node linkType: hard @@ -331,32 +321,31 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-option@npm:7.24.7" - checksum: 10c0/21aea2b7bc5cc8ddfb828741d5c8116a84cbc35b4a3184ec53124f08e09746f1f67a6f9217850188995ca86059a7942e36d8965a6730784901def777b7e8a436 +"@babel/helper-validator-option@npm:^7.24.7, @babel/helper-validator-option@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-validator-option@npm:7.24.8" + checksum: 10c0/73db93a34ae89201351288bee7623eed81a54000779462a986105b54ffe82069e764afd15171a428b82e7c7a9b5fec10b5d5603b216317a414062edf5c67a21f languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-wrap-function@npm:7.24.7" +"@babel/helper-wrap-function@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-wrap-function@npm:7.25.0" dependencies: - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/d5689f031bf0eb38c0d7fad6b7e320ddef4bfbdf08d12d7d76ef41b7ca365a32721e74cb5ed5a9a9ec634bc20f9b7a27314fa6fb08f1576b8f6d8330fcea6f47 + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/d54601a98384c191cbc1ff07b03a19e288ef8d5c6bfafe270b2a303d96e7304eb296002921ed464cc1b105a547d1db146eb86b0be617924dee1ba1b379cdc216 languageName: node linkType: hard -"@babel/helpers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helpers@npm:7.24.7" +"@babel/helpers@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helpers@npm:7.25.0" dependencies: - "@babel/template": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/aa8e230f6668773e17e141dbcab63e935c514b4b0bf1fed04d2eaefda17df68e16b61a56573f7f1d4d1e605ce6cc162b5f7e9fdf159fde1fd9b77c920ae47d27 + "@babel/template": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/b7fe007fc4194268abf70aa3810365085e290e6528dcb9fbbf7a765d43c74b6369ce0f99c5ccd2d44c413853099daa449c9a0123f0b212ac8d18643f2e8174b8 languageName: node linkType: hard @@ -372,35 +361,48 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/parser@npm:7.24.7" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": + version: 7.25.3 + resolution: "@babel/parser@npm:7.25.3" + dependencies: + "@babel/types": "npm:^7.25.2" bin: parser: ./bin/babel-parser.js - checksum: 10c0/8b244756872185a1c6f14b979b3535e682ff08cb5a2a5fd97cc36c017c7ef431ba76439e95e419d43000c5b07720495b00cf29a7f0d9a483643d08802b58819b + checksum: 10c0/874b01349aedb805d6694f867a752fdc7469778fad76aca4548d2cc6ce96087c3ba5fb917a6f8d05d2d1a74aae309b5f50f1a4dba035f5a2c9fcfe6e106d2c4e languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.7" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.3": + version: 7.25.3 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.3" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.3" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/394c30e2b708ad385fa1219528e039066a1f1cb40f47986f283878848fd354c745e6397f588b4e5a046ee8d64bfdf4c208e4c3dfbdcfb2fd34315ec67c64e7af + checksum: 10c0/814b4d3f102e7556a5053d1acf57ef601cfcff39a2c81b8cdc6a5c842e3cb9838f5925d1466a5f1e6416e74c9c83586a3c07fbd7fb8610a396c2becdf9ae5790 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.7" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/a36307428ecc1a01b00cf90812335eed1575d13f211ab24fe4d0c55c28a2fcbd4135f142efabc3b277b2a8e09ee05df594a1272353f061b63829495b5dcfdb96 + checksum: 10c0/9645a1f47b3750acadb1353c02e71cc712d072aafe5ce115ed3a886bc14c5d9200cfb0b5b5e60e813baa549b800cf798f8714019fd246c699053cf68c428e426 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ed1ce1c90cac46c01825339fd0f2a96fa071b016fb819d8dfaf8e96300eae30e74870cb47e4dc80d4ce2fb287869f102878b4f3b35bc927fec8b1d0d76bcf612 languageName: node linkType: hard @@ -417,15 +419,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/2b52a73e444f6adc73f927b623e53a4cf64397170dd1071268536df1b3db1e02131418c8dc91351af48837a6298212118f4a72d5407f8005cf9a732370a315b0 + checksum: 10c0/45988025537a9d4a27b610fd696a18fd9ba9336621a69b4fb40560eeb10c79657f85c92a37f30c7c8fb29c22970eea0b373315795a891f1a05549a6cfe5a6bfe languageName: node linkType: hard @@ -681,17 +683,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.7" +"@babel/plugin-transform-async-generator-functions@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-remap-async-to-generator": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-remap-async-to-generator": "npm:^7.25.0" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6b5e33ae66dce0afce9b06d8dace6fa052528e60f7622aa6cfd3e71bd372ca5079d426e78336ca564bc0d5f37acbcda1b21f4fe656fcb642f1a93a697ab39742 + checksum: 10c0/5348c3a33d16e0d62f13482c6fa432185ba096d58880b08d42450f7db662d6b03e6149d495c8620897dcd3da35061068cbd6c09da7d0ec95743e55a788809e4e languageName: node linkType: hard @@ -719,14 +721,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoping@npm:7.24.7" +"@babel/plugin-transform-block-scoping@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/dcbc5e385c0ca5fb5736b1c720c90755cffe9f91d8c854f82e61e59217dd3f6c91b3633eeee4b55a89d3f59e5275d0f5b0b1b1363d4fa70c49c468b55aa87700 + checksum: 10c0/382931c75a5d0ea560387e76cb57b03461300527e4784efcb2fb62f36c1eb0ab331327b6034def256baa0cad9050925a61f9c0d56261b6afd6a29c3065fb0bd4 languageName: node linkType: hard @@ -755,21 +757,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-classes@npm:7.24.7" +"@babel/plugin-transform-classes@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-classes@npm:7.25.0" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-replace-supers": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e51dba7ce8b770d1eee929e098d5a3be3efc3e8b941e22dda7d0097dc4e7be5feabd2da7b707ac06fcac5661b31223c541941dec08ce76c1faa55544d87d06ec + checksum: 10c0/4451dccf8a7979427ae042afe381233f30764a8072faf0de1337a4fc297c6d7cb40df9e28931ac096e5b56392d0cd97d3ce10aee68288150a8701624d362a791 languageName: node linkType: hard @@ -785,14 +785,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.7" +"@babel/plugin-transform-destructuring@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/929f07a807fb62230bfbf881cfcedf187ac5daf2f1b01da94a75c7a0f6f72400268cf4bcfee534479e43260af8193e42c31ee03c8b0278ba77d0036ed6709c27 + checksum: 10c0/804968c1d5f5072c717505296c1e5d5ec33e90550423de66de82bbcb78157156e8470bbe77a04ab8c710a88a06360a30103cf223ac7eff4829adedd6150de5ce languageName: node linkType: hard @@ -819,6 +819,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/1c9b57ddd9b33696e88911d0e7975e1573ebc46219c4b30eb1dc746cbb71aedfac6f6dab7fdfdec54dd58f31468bf6ab56b157661ea4ffe58f906d71f89544c8 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" @@ -867,16 +879,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-function-name@npm:7.24.7" +"@babel/plugin-transform-function-name@npm:^7.25.1": + version: 7.25.1 + resolution: "@babel/plugin-transform-function-name@npm:7.25.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3e9642428d6952851850d89ea9307d55946528d18973784d0e2f04a651b23bd9924dd8a2641c824b483bd4ab1223bab1d2f6a1106a939998f7ced512cb60ac5b + checksum: 10c0/e74912174d5e33d1418b840443c2e226a7b76cc017c1ed20ee30a566e4f1794d4a123be03180da046241576e8b692731807ba1f52608922acf1cb2cb6957593f languageName: node linkType: hard @@ -892,14 +904,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-literals@npm:7.24.7" +"@babel/plugin-transform-literals@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/plugin-transform-literals@npm:7.25.2" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9f3f6f3831929cd2a977748c07addf9944d5cccb50bd3a24a58beb54f91f00d6cacd3d7831d13ffe1ad6f8aba0aefd7bca5aec65d63b77f39c62ad1f2d484a3e + checksum: 10c0/0796883217b0885d37e7f6d350773be349e469a812b6bf11ccf862a6edf65103d3e7c849529d65381b441685c12e756751d8c2489a0fd3f8139bb5ef93185f58 languageName: node linkType: hard @@ -938,30 +950,30 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.7" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.7, @babel/plugin-transform-modules-commonjs@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.24.8" "@babel/helper-simple-access": "npm:^7.24.7" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/9442292b3daf6a5076cdc3c4c32bf423bda824ccaeb0dd0dc8b3effaa1fecfcb0130ae6e647fef12a5d5ff25bcc99a0d6bfc6d24a7525345e1bcf46fcdf81752 + checksum: 10c0/f1cf552307ebfced20d3907c1dd8be941b277f0364aa655e2b5fee828c84c54065745183104dae86f1f93ea0406db970a463ef7ceaaed897623748e99640e5a7 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.7" +"@babel/plugin-transform-modules-systemjs@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0" dependencies: - "@babel/helper-hoist-variables": "npm:^7.24.7" - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.24.8" "@babel/helper-validator-identifier": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e2a795e0a6baafe26f4a74010622212ddd873170742d673f450e0097f8d984f6e6a95eb8ce41b05071ee9790c4be088b33801aaab3f78ee202c567634e52a331 + checksum: 10c0/fca6198da71237e4bb1274b3b67a0c81d56013c9535361242b6bfa87d70a9597854aadb45d4d8203369be4a655e158be2a5d20af0040b1f8d1bfc47db3ad7b68 languageName: node linkType: hard @@ -1062,16 +1074,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.7" +"@babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b9e3649b299e103b0d1767bbdba56574d065ff776e5350403b7bfd4e3982743c0cdb373d33bdbf94fa3c322d155e45d0aad946acf0aa741b870aed22dfec8b8e + checksum: 10c0/4ffbe1aad7dec7c9aa2bf6ceb4b2f91f96815b2784f2879bde80e46934f59d64a12cb2c6262e40897c4754d77d2c35d8a5cfed63044fdebf94978b1ed3d14b17 languageName: node linkType: hard @@ -1279,14 +1291,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.7" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.8" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5649e7260a138681e68b296ab5931e2b1f132f287d6b4131d49b24f9dc20d62902b7e9d63c4d2decd5683b41df35ef4b9b03f58c7f9f65e4c25a6d8bbf04e9e9 + checksum: 10c0/2f570a4fbbdc5fd85f48165a97452826560051e3b8efb48c3bb0a0a33ee8485633439e7b71bfe3ef705583a1df43f854f49125bd759abdedc195b2cf7e60012a languageName: node linkType: hard @@ -1352,17 +1364,18 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": - version: 7.24.7 - resolution: "@babel/preset-env@npm:7.24.7" + version: 7.25.3 + resolution: "@babel/preset-env@npm:7.25.3" dependencies: - "@babel/compat-data": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.7" + "@babel/compat-data": "npm:^7.25.2" + "@babel/helper-compilation-targets": "npm:^7.25.2" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-validator-option": "npm:^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.0" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.0" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" @@ -1383,29 +1396,30 @@ __metadata: "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.0" "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" - "@babel/plugin-transform-block-scoping": "npm:^7.24.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.0" "@babel/plugin-transform-class-properties": "npm:^7.24.7" "@babel/plugin-transform-class-static-block": "npm:^7.24.7" - "@babel/plugin-transform-classes": "npm:^7.24.7" + "@babel/plugin-transform-classes": "npm:^7.25.0" "@babel/plugin-transform-computed-properties": "npm:^7.24.7" - "@babel/plugin-transform-destructuring": "npm:^7.24.7" + "@babel/plugin-transform-destructuring": "npm:^7.24.8" "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.0" "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.24.7" + "@babel/plugin-transform-function-name": "npm:^7.25.1" "@babel/plugin-transform-json-strings": "npm:^7.24.7" - "@babel/plugin-transform-literals": "npm:^7.24.7" + "@babel/plugin-transform-literals": "npm:^7.25.2" "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" "@babel/plugin-transform-modules-amd": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" - "@babel/plugin-transform-modules-systemjs": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.0" "@babel/plugin-transform-modules-umd": "npm:^7.24.7" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" "@babel/plugin-transform-new-target": "npm:^7.24.7" @@ -1414,7 +1428,7 @@ __metadata: "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" "@babel/plugin-transform-object-super": "npm:^7.24.7" "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" "@babel/plugin-transform-parameters": "npm:^7.24.7" "@babel/plugin-transform-private-methods": "npm:^7.24.7" "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" @@ -1425,7 +1439,7 @@ __metadata: "@babel/plugin-transform-spread": "npm:^7.24.7" "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" "@babel/plugin-transform-template-literals": "npm:^7.24.7" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.7" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.8" "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" @@ -1434,11 +1448,11 @@ __metadata: babel-plugin-polyfill-corejs2: "npm:^0.4.10" babel-plugin-polyfill-corejs3: "npm:^0.10.4" babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.31.0" + core-js-compat: "npm:^3.37.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c6714346f3ccc1271eaa90051c75b8bb57b20ef57408ab68740e2f3552693ae0ee5a4bcce3a00211d40e4947af1f7b8ab422066b953f0095461937fb72d11274 + checksum: 10c0/9287dc2e296fe2aa3367d84c2a799db17c9d1e48bba86525f47c6f51f5ba2e2cce454f45f4ae2ef928f9077c0640b04556b55b94835675ceeca94a0c5133205e languageName: node linkType: hard @@ -1502,52 +1516,49 @@ __metadata: languageName: node 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.7 - resolution: "@babel/runtime@npm:7.24.7" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": + version: 7.25.0 + resolution: "@babel/runtime@npm:7.25.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/b6fa3ec61a53402f3c1d75f4d808f48b35e0dfae0ec8e2bb5c6fc79fb95935da75766e0ca534d0f1c84871f6ae0d2ebdd950727cfadb745a2cdbef13faef5513 + checksum: 10c0/bd3faf246170826cef2071a94d7b47b49d532351360ecd17722d03f6713fd93a3eb3dbd9518faa778d5e8ccad7392a7a604e56bd37aaad3f3aa68d619ccd983d languageName: node linkType: hard -"@babel/template@npm:^7.24.7, @babel/template@npm:^7.3.3": - version: 7.24.7 - resolution: "@babel/template@npm:7.24.7" +"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0, @babel/template@npm:^7.3.3": + version: 7.25.0 + resolution: "@babel/template@npm:7.25.0" dependencies: "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/95b0b3ee80fcef685b7f4426f5713a855ea2cd5ac4da829b213f8fb5afe48a2a14683c2ea04d446dbc7f711c33c5cd4a965ef34dcbe5bc387c9e966b67877ae3 + "@babel/parser": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b languageName: node linkType: hard -"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/traverse@npm:7.24.7" +"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3": + version: 7.25.3 + resolution: "@babel/traverse@npm:7.25.3" dependencies: "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-hoist-variables": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" + "@babel/generator": "npm:^7.25.0" + "@babel/parser": "npm:^7.25.3" + "@babel/template": "npm:^7.25.0" + "@babel/types": "npm:^7.25.2" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/a5135e589c3f1972b8877805f50a084a04865ccb1d68e5e1f3b94a8841b3485da4142e33413d8fd76bc0e6444531d3adf1f59f359c11ffac452b743d835068ab + checksum: 10c0/4c8a1966fa90b53a783a4afd2fcdaa6ab1a912e6621dca9fcc6633e80ccb9491620e88caf73b537da4e16cefd537b548c87d7087868d5b0066414dea375c0e9b languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.24.7 - resolution: "@babel/types@npm:7.24.7" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.25.2 + resolution: "@babel/types@npm:7.25.2" dependencies: - "@babel/helper-string-parser": "npm:^7.24.7" + "@babel/helper-string-parser": "npm:^7.24.8" "@babel/helper-validator-identifier": "npm:^7.24.7" to-fast-properties: "npm:^2.0.0" - checksum: 10c0/d9ecbfc3eb2b05fb1e6eeea546836ac30d990f395ef3fe3f75ced777a222c3cfc4489492f72e0ce3d9a5a28860a1ce5f81e66b88cf5088909068b3ff4fab72c1 + checksum: 10c0/e489435856be239f8cc1120c90a197e4c2865385121908e5edb7223cfdff3768cba18f489adfe0c26955d9e7bbb1fb10625bc2517505908ceb0af848989bd864 languageName: node linkType: hard @@ -1558,435 +1569,475 @@ __metadata: languageName: node linkType: hard -"@csstools/cascade-layer-name-parser@npm:^1.0.11": - version: 1.0.11 - resolution: "@csstools/cascade-layer-name-parser@npm:1.0.11" +"@csstools/cascade-layer-name-parser@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/cascade-layer-name-parser@npm:2.0.0" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.3 - "@csstools/css-tokenizer": ^2.3.1 - checksum: 10c0/52ac8369877c8072ff5c111f656bd87e9a2a4b9e44e48fe005c26faeb6cffd83bfe2f463f4f385a2ae5cfe1f82bbf95d26ddaabca18b66c6b657c4fe1520fb43 + "@csstools/css-parser-algorithms": ^3.0.0 + "@csstools/css-tokenizer": ^3.0.0 + checksum: 10c0/11de0c4abad1316a6b29a2c4f7966fc39af5cbcd0a542d92cbcca8a8173d472f3d577175fc097bebf793158936193a74829a035e1cb2abccbe056473a3076d89 languageName: node linkType: hard -"@csstools/color-helpers@npm:^4.2.0": - version: 4.2.0 - resolution: "@csstools/color-helpers@npm:4.2.0" - checksum: 10c0/3f1feac43c2ef35f38b3b06fe74e0acc130283d7efb6874f6624e45e178c1a7b3c7e39816c7421cddbffc2666430906aa6f0d3dd7c7209db1369c0afd4a29b1b +"@csstools/color-helpers@npm:^4.2.1": + version: 4.2.1 + resolution: "@csstools/color-helpers@npm:4.2.1" + checksum: 10c0/72e11b186ad0f6019a9b4b3752e620fa798c2a40cf47e8cad565dff46e572c9342eb8cf804542d7886344a1e540555d77f20119ace6b2d8a45b6e5ef8a41685c languageName: node linkType: hard -"@csstools/css-calc@npm:^1.2.2": - version: 1.2.2 - resolution: "@csstools/css-calc@npm:1.2.2" +"@csstools/css-calc@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/css-calc@npm:2.0.0" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.3 - "@csstools/css-tokenizer": ^2.3.1 - checksum: 10c0/6032b482764a11c1b882d7502928950ab11760044fa7a2c23ecee802002902f6ea8fca045ee2919302af5a5c399e7baa9f68dff001ac6246ac7fef48fb3f6df7 + "@csstools/css-parser-algorithms": ^3.0.0 + "@csstools/css-tokenizer": ^3.0.0 + checksum: 10c0/441f8fafaa4f87302b85e2c46bc8a3efb388e0357f0db5c45438fe99c5660afeb524332a0a3339574fdd26392e65f8db9c7ab6db3361726f1702987e8522c531 languageName: node linkType: hard -"@csstools/css-color-parser@npm:^2.0.2": - version: 2.0.2 - resolution: "@csstools/css-color-parser@npm:2.0.2" +"@csstools/css-color-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/css-color-parser@npm:3.0.0" dependencies: - "@csstools/color-helpers": "npm:^4.2.0" - "@csstools/css-calc": "npm:^1.2.2" + "@csstools/color-helpers": "npm:^4.2.1" + "@csstools/css-calc": "npm:^2.0.0" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.3 - "@csstools/css-tokenizer": ^2.3.1 - checksum: 10c0/c5ae4ad78745e425dce56da9f1ab053fb4f7963399735df3303305b32123bed0b2237689c2e7e99da2c62387e3226c12ea85e70e275c4027c7507e4ac929bffa + "@csstools/css-parser-algorithms": ^3.0.0 + "@csstools/css-tokenizer": ^3.0.0 + checksum: 10c0/9b56ba3b56691d2133f1d9b881131bfd9745024a79f825284109adac05578e15ae3eed0e99c98db162932d69770fc970b5b005996c32cdf7167af3418da263c3 languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.6.3": - version: 2.6.3 - resolution: "@csstools/css-parser-algorithms@npm:2.6.3" +"@csstools/css-parser-algorithms@npm:^2.7.1": + version: 2.7.1 + resolution: "@csstools/css-parser-algorithms@npm:2.7.1" peerDependencies: - "@csstools/css-tokenizer": ^2.3.1 - checksum: 10c0/6648fda75a1c08096320fb5c04fd13656a0168de13584d2795547fecfb26c2c7d8b3b1fb79ba7aa758714851e98bfbec20d89e28697f999f41f91133eafe4207 + "@csstools/css-tokenizer": ^2.4.1 + checksum: 10c0/7d29bef6f5790ddb67d922ad232253bf910e4fa5293f5e4a5ed8b920ae9bd4e8171942df7d8943af23b42fd4e9fb460181394d20c97da9562e6ce98a875e8c47 languageName: node linkType: hard -"@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.11": - version: 2.1.11 - resolution: "@csstools/media-query-list-parser@npm:2.1.11" +"@csstools/css-parser-algorithms@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/css-parser-algorithms@npm:3.0.0" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.3 - "@csstools/css-tokenizer": ^2.3.1 - checksum: 10c0/9bcd99f7d28ae3cdaba73fbbfef571b0393dd4e841f522cc796fe5161744f17e327ba1713dad3c481626fade1357c55890e3d365177abed50e857b69130a9be5 + "@csstools/css-tokenizer": ^3.0.0 + checksum: 10c0/ffa06c9d883e6bbb6198c98b5a395abe9847ff63ae41db54d75812e52764f550b36625fdb427c9a4ea6dfd71362aa98194ccd63afad0e521f6f3470c7515d241 languageName: node linkType: hard -"@csstools/postcss-cascade-layers@npm:^4.0.6": - version: 4.0.6 - resolution: "@csstools/postcss-cascade-layers@npm:4.0.6" +"@csstools/css-tokenizer@npm:^2.4.1": + version: 2.4.1 + resolution: "@csstools/css-tokenizer@npm:2.4.1" + checksum: 10c0/fe71cee85ec7372da07083d088b6a704f43e5d3d2d8071c4b8a86fae60408b559a218a43f8625bf2f0be5c7f90c8f3ad20a1aae1921119a1c02b51c310cc2b6b + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/css-tokenizer@npm:3.0.0" + checksum: 10c0/6d0f3e44bfb4b309bc4e260e6399163653f5715b16ebf1f2907ec98a2b31e9b2de94c09012b6d291c6f4229cc2a521e4f66594cac1b6276a4eb205e8e23e446b + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^2.1.13": + version: 2.1.13 + resolution: "@csstools/media-query-list-parser@npm:2.1.13" + peerDependencies: + "@csstools/css-parser-algorithms": ^2.7.1 + "@csstools/css-tokenizer": ^2.4.1 + checksum: 10c0/8bf72342c15581b8f658633436d83c26a214056f6b960ff121b940271f4b1b5b07e9cc3990a73e684fb72319592f0c392408b4f0e08bbe242b2065aa456e2733 + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/media-query-list-parser@npm:3.0.0" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.0 + "@csstools/css-tokenizer": ^3.0.0 + checksum: 10c0/0a83ab7cba4fec5543c5abf3f7145ab5742c44e0ed3349d41787739a1bd897a8cf27f35f3bc714d1d02a44b2a34f28b3b82ce6d0cb6b9c4fbb679dc034f8a152 + languageName: node + linkType: hard + +"@csstools/postcss-cascade-layers@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-cascade-layers@npm:5.0.0" dependencies: - "@csstools/selector-specificity": "npm:^3.1.1" - postcss-selector-parser: "npm:^6.0.13" + "@csstools/selector-specificity": "npm:^4.0.0" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/134019e9b3f71de39034658e2a284f549883745a309f774d8d272871f9e65680e0981c893766537a8a56ed7f41dba2d0f9fc3cb4fa4057c227bc193976a2ec79 + checksum: 10c0/b608c69c12671682676598e451dcd79bfc6f5030a4e17b4d1bf9659e531f1daf03526be023f9aafdc952ecc87c87b04f379a763309e3eadb2140572cd4aa5b60 languageName: node linkType: hard -"@csstools/postcss-color-function@npm:^3.0.16": - version: 3.0.16 - resolution: "@csstools/postcss-color-function@npm:3.0.16" +"@csstools/postcss-color-function@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-color-function@npm:4.0.0" dependencies: - "@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" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/41756a4601a3f1086290dab6ca92b54e201bd94637b54b439c66a04fd628a14e2a0bd1452ad294d2981e2f4bb306758fa5f44639b1c4332320435050749aa487 + checksum: 10c0/ff0c0c44f5d17bc5e7ea287eff9c10ca334a84d086998a6b243a209f1795d32ba872357935f4176e5206b88dc8d2a204f452c13bc940540b7122e9e807511ac6 languageName: node linkType: hard -"@csstools/postcss-color-mix-function@npm:^2.0.16": - version: 2.0.16 - resolution: "@csstools/postcss-color-mix-function@npm:2.0.16" +"@csstools/postcss-color-mix-function@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.0" dependencies: - "@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" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/70cd5b291dd615e20e4475517bf0027c90c433241397a66866f89acedb12cb91f45552a162bdd1000636ec56f7d6a099b65e44fe100fd03228fc65f17cfae285 + checksum: 10c0/120e96581834b2363df1fb653959dc243d93c01bcd70bf2e34418c20cd418a75f8b4e2e81da6955345619dcbb246e7d023f395521522bacb455583c15f61c677 languageName: node linkType: hard -"@csstools/postcss-exponential-functions@npm:^1.0.7": - version: 1.0.7 - resolution: "@csstools/postcss-exponential-functions@npm:1.0.7" +"@csstools/postcss-content-alt-text@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-content-alt-text@npm:2.0.0" dependencies: - "@csstools/css-calc": "npm:^1.2.2" - "@csstools/css-parser-algorithms": "npm:^2.6.3" - "@csstools/css-tokenizer": "npm:^2.3.1" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/2079c81c3437686ef432d88502fa3a13bf8a27b7af105b4c6c2eb8e779f14adc8967a5a3ed03271ab919eeaf999fc4489fe4b37d32a8f61ab3212439517bddcc + checksum: 10c0/978e99425f1b5420c55282f51de65646b910f9d60621f5ad7adb7a2dace26c68dc384cd4798604e2c5d8bcd1e635a20474a6ea044a7e9b449d068d6db77a2738 languageName: node linkType: hard -"@csstools/postcss-font-format-keywords@npm:^3.0.2": - version: 3.0.2 - resolution: "@csstools/postcss-font-format-keywords@npm:3.0.2" +"@csstools/postcss-exponential-functions@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.0" dependencies: - "@csstools/utilities": "npm:^1.0.0" + "@csstools/css-calc": "npm:^2.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a5ccd4fb5b6f6f370bf07ef8f918658ef4d9865a92d9866f57edfe7479c6a486701520cbe0efb8f39af9b78eda0819d8663554e9797b8bdcadc2291733bf6b3f + languageName: node + linkType: hard + +"@csstools/postcss-font-format-keywords@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-font-format-keywords@npm:4.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/1b9bf031ce1a00fef1fae0b1ad614eddc6bb4c036ecad47e065c99063ba3d2f6ab8e47f9db02a6fbe8b75b0e02a075a7a80480d4296918970ba9e8d36f07a523 + checksum: 10c0/eb794fb95fefcac75e606d185255e601636af177866a317b0c6b6c375055e7240be53918229fd8d4bba00df01bedd2256bdac2b0ad4a4c2ec64f9d27cd6ff639 languageName: node linkType: hard -"@csstools/postcss-gamut-mapping@npm:^1.0.9": - version: 1.0.9 - resolution: "@csstools/postcss-gamut-mapping@npm:1.0.9" +"@csstools/postcss-gamut-mapping@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.0" dependencies: - "@csstools/css-color-parser": "npm:^2.0.2" - "@csstools/css-parser-algorithms": "npm:^2.6.3" - "@csstools/css-tokenizer": "npm:^2.3.1" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/412ae1410f3fce240401576441637c2c4e71d1a54153ac9b7a991b3de7519c253d03e10db78b09872eb10b0776d7f960b442779efabc11332b5be6672163c836 + checksum: 10c0/be1d7f4c96f3bbcb69ed4ccc2ff406a884ae7129e6542ab6800782fbfe4e077159352409961f2da8054ec9fabbf6ed211288f1004c96632a1f6b10bef332d880 languageName: node linkType: hard -"@csstools/postcss-gradients-interpolation-method@npm:^4.0.17": - version: 4.0.17 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.17" +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.0" dependencies: - "@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" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/465ac42856ca1a57aa2b9ea41ede31d9e2bcf2fe84345dbc182ae41f463069a0cfd41041b834b5133108c702cd85ecb8636b51b0b88fff8a221628639b59f386 + checksum: 10c0/04e29fd877a499b9570665aea5b23cd70635b538dd903b9f9706ddd85a2d9c93445aea4b6b7dbcf8986ab58b45bb502ec5060044d945096d0af2eb6cebadb88e languageName: node linkType: hard -"@csstools/postcss-hwb-function@npm:^3.0.15": - version: 3.0.15 - resolution: "@csstools/postcss-hwb-function@npm:3.0.15" +"@csstools/postcss-hwb-function@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-hwb-function@npm:4.0.0" dependencies: - "@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" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/fdfaeefbab1008ab1e4a98a2b45cc3db002b2724c404fa0600954b411a68b1fa4028286250bf9898eed10fa80c44e4d6b4e55f1aca073c3dfce8198a0aaedf3f + checksum: 10c0/1aff69ca364417ac2b7ef1c737f88567f441bfd54d93d7b635e0ad605c61edcc2282bc0e2df73c83d1c6a24487e0acec34a4585d27d5f6027402aaea71696190 languageName: node linkType: hard -"@csstools/postcss-ic-unit@npm:^3.0.6": - version: 3.0.6 - resolution: "@csstools/postcss-ic-unit@npm:3.0.6" +"@csstools/postcss-ic-unit@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-ic-unit@npm:4.0.0" dependencies: - "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" - "@csstools/utilities": "npm:^1.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a4b962327d433419fdcfdcf620ce6a5cf09aa3c93029ad08b035df1e2bc35caae31de49f1d14218de0656fced35c0d2e07e5ff7b8099c29dbfb40395fc283234 + checksum: 10c0/6f94ec31002a245768a30d240c432b8712af4d9ea76a62403e16d4e0afb5be7636348a2d4619046ed29aa7726f88a0c191ca41c96d7ab0f3da940025c91b056e languageName: node linkType: hard -"@csstools/postcss-initial@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-initial@npm:1.0.1" +"@csstools/postcss-initial@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-initial@npm:2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5d21c7c611d90a4b6758ba5be5e38d8d9eea9499c62797c4f5e01fbc9ccc2c68daf1c201850efe70ffa4ff9e979e7dea80b854b8793768550879562881aa6f9f + checksum: 10c0/44c443cba84cc66367f2082bf20db06c8437338c02c244c38798c5bf5342932d89fed0dd13e4409f084ecf7fce47ae6394e9a7a006fd98a973decfa24ab1eb04 languageName: node linkType: hard -"@csstools/postcss-is-pseudo-class@npm:^4.0.8": - version: 4.0.8 - resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.8" +"@csstools/postcss-is-pseudo-class@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.0" dependencies: - "@csstools/selector-specificity": "npm:^3.1.1" - postcss-selector-parser: "npm:^6.0.13" + "@csstools/selector-specificity": "npm:^4.0.0" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/82f191571c3e0973354a54ef15feeb17f9408b4abbefad19fc0f087683b1212fc854cdf09a47324267dd47be4c5cb47d63b8d083695a67c3f8f3e53df3d561f6 + checksum: 10c0/738eb84728b24bfe19ca06ccf6ff773a423552df2f31c87704ce79da4abfd2ccf2a45d5d6d3e11e71e42cc3d92eb35a856209b9cd6116c879acf15ac75454683 languageName: node linkType: hard -"@csstools/postcss-light-dark-function@npm:^1.0.5": - version: 1.0.5 - resolution: "@csstools/postcss-light-dark-function@npm:1.0.5" +"@csstools/postcss-light-dark-function@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-light-dark-function@npm:2.0.0" dependencies: - "@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" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/4fbeda98372d0da25d3ed87da09903c9a0a5d0b8c13cc9de82a98acce4a8f8367e5ba33bfc25c2534d10f2b1db9d5b4278df4ebab755e27ef2b03a95e0ebe264 + checksum: 10c0/d0eb1e04854c4ae425c6aff51ce9d0db90e9457aea3307d3ed916f500d2b5a3314a25d3487ea893e7b006a34c0d155462566d6066c8c54baec33eb104891c6db languageName: node linkType: hard -"@csstools/postcss-logical-float-and-clear@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/postcss-logical-float-and-clear@npm:2.0.1" +"@csstools/postcss-logical-float-and-clear@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-float-and-clear@npm:3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/92d9184bf8a159753a5872463dcfde580abd9b935e2a59f7ebe601cd14d9871f2f9f4dc18d8bbe251e7d8a3e446e302d9d99bf408d9cabbd9a6323825f5e833d + checksum: 10c0/71a20e8c37877bf68ae615d7bb93fc11b4f8da8be8b1dc1a6e0fc69e27f189712ed71436b8ed51fa69fdb98b8e6718df2b5f42f246c4d39badaf0e43020fcfd4 languageName: node linkType: hard -"@csstools/postcss-logical-overflow@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-logical-overflow@npm:1.0.1" +"@csstools/postcss-logical-overflow@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overflow@npm:2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a8f5b1fdaf4ce7b1665407dac2f2e0c0ea11195e6873cfc714d9cd206489170fd91fc172b337330baf60191206f60579e235264f0dc7fee750ccd27ffe02c163 + checksum: 10c0/0e103343d3ff8b34eef01b02355c5e010d272fd12d149a242026bb13ab1577b7f3a11fd4514be9342d96f73d61dac1f093a9bd36ece591753ed09a84eb7fca0a languageName: node linkType: hard -"@csstools/postcss-logical-overscroll-behavior@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-logical-overscroll-behavior@npm:1.0.1" +"@csstools/postcss-logical-overscroll-behavior@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overscroll-behavior@npm:2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/9485502bd9235276525351818d6cc11544ac1b270bb4f527f3fac32fe98ac66269366c34cdb8f61920b10ff9aac5824935004a5927490a5febca77eb41226604 + checksum: 10c0/1649601bb26f04d760fb5ebc42cdf414fa2a380b8ec22fe1c117f664c286665a786bd7bbda01b7e7567eaf3cc018a4f36a5c9805f6751cc497da223e0ffe9524 languageName: node linkType: hard -"@csstools/postcss-logical-resize@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/postcss-logical-resize@npm:2.0.1" +"@csstools/postcss-logical-resize@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-resize@npm:3.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/18f7e19ea465a15b334d8231b9ed98b630c74a6c2a6c52884437b852065f7b55bb1282cdbbdc1136aade479e996605b01799ab0ab771e2c47fd78d966ed33162 + checksum: 10c0/4f12efcaf5468ff359bb3f32f0f66034b9acc9b3ac21fcd2f30a1c8998fc653ebac0091f35c8b7e8dbfe6ccf595aee67f9b06a67adf45a8844e49a82d98b4386 languageName: node linkType: hard -"@csstools/postcss-logical-viewport-units@npm:^2.0.9": - version: 2.0.9 - resolution: "@csstools/postcss-logical-viewport-units@npm:2.0.9" +"@csstools/postcss-logical-viewport-units@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.0" dependencies: - "@csstools/css-tokenizer": "npm:^2.3.1" - "@csstools/utilities": "npm:^1.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/25b01e36b08c571806d09046be63582dbebf97a4612df59be405fa8a92e6eebcd4e768ad7fbe53b0b8739d6ab04d56957964fb04d6a3ea129fc5f72e6d0adf95 + checksum: 10c0/d474f3b8b3949516ad431c8297eb26ad7ba8829dc323c1a99c25be79af0fa16eef43ddd4d980ea97a676599c5587b4b2afd44c9a1055cf3573bfb2090ecbbd5c languageName: node linkType: hard -"@csstools/postcss-media-minmax@npm:^1.1.6": - version: 1.1.6 - resolution: "@csstools/postcss-media-minmax@npm:1.1.6" +"@csstools/postcss-media-minmax@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-media-minmax@npm:2.0.0" dependencies: - "@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" + "@csstools/css-calc": "npm:^2.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/media-query-list-parser": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/2cbfb3728a232c655d82f63d5ac7da36876d14e5fee5d62a0738efed40c58f20ef11f600395ade24d5063d750e8e093251dd93cc361f782b5a6c0e0f80288f51 + checksum: 10c0/30f8cde005ae5d3750f8d2d62a26570381e306a2a4c3fdeef2ad48febbefd389c65ea471914b69ae8772a4abbd11cd52a78ecdb5d8929ed553ca1d5731f212a2 languageName: node linkType: hard -"@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" +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.0" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.6.3" - "@csstools/css-tokenizer": "npm:^2.3.1" - "@csstools/media-query-list-parser": "npm:^2.1.11" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/media-query-list-parser": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/d431d2900a7177c938d9dc2d5bdf3c1930758adc214cc72f94b34e6bbd02fd917c200dc81482db515519c97d4f1e766ba3200f3ec9b55081887f2f8111f68e20 + checksum: 10c0/c7af426e44c4ca2c7cb48c2f54bd8b5e4531d4d7a568011c367038956789bf47bab996fa062f767e255229de3598fb89abdb85011872158c885a4d3ace142509 languageName: node linkType: hard -"@csstools/postcss-nested-calc@npm:^3.0.2": - version: 3.0.2 - resolution: "@csstools/postcss-nested-calc@npm:3.0.2" +"@csstools/postcss-nested-calc@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-nested-calc@npm:4.0.0" dependencies: - "@csstools/utilities": "npm:^1.0.0" + "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/3e24cf641170f9090f0dce088f6dae09ed9a0f38af1bdaa369ecc791a94cce54d7a02a0634f661a97fae24e04f1601c21d753593de018c80ad4236d36144b975 + checksum: 10c0/fb61512fa4909bdf0ee32a23e771145086c445f2208a737b52093c8adfab7362c56d3aeaf2a6e33ffcec067e99a07219775465d2fbb1a3ac30cdcfb278b218b7 languageName: node linkType: hard -"@csstools/postcss-normalize-display-values@npm:^3.0.2": - version: 3.0.2 - resolution: "@csstools/postcss-normalize-display-values@npm:3.0.2" +"@csstools/postcss-normalize-display-values@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-normalize-display-values@npm:4.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a20e2f4c213a5ec6e004c2ba76b543d3288a39aae21b3198b06a57df0d2c7916111d2cd70dcb0e8c6ca1cf1b01751e88fd2fe9abbc070e1efab1a4e54dcdbbbe + checksum: 10c0/d3a3a362b532163bd791f97348ef28b7a43baf01987c7702b06285e751cdc5ea3e3a2553f088260515b4d28263d5c475923d4d4780ecb4078ec66dff50c9e638 languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^3.0.16": - version: 3.0.16 - resolution: "@csstools/postcss-oklab-function@npm:3.0.16" +"@csstools/postcss-oklab-function@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-oklab-function@npm:4.0.0" dependencies: - "@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" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/9c67ee5f51116df16ab6baffa1b3c6c7aa93d53b836f421125ae8824075bd3cfaa1a93594466de0ac935c89c4fc8171e80974e1a15bafa23ea864e4cf1f1c1f2 + checksum: 10c0/9e228049645e6a6baa77d6e7e35b3862f3e2e4836fbf2de43fa246d91f0efa36e7f18eae3f2b224c61e72628aaf14d4bff86c555fb06378d5e05e71dca92f9ec languageName: node linkType: hard -"@csstools/postcss-progressive-custom-properties@npm:^3.2.0": - version: 3.2.0 - resolution: "@csstools/postcss-progressive-custom-properties@npm:3.2.0" +"@csstools/postcss-progressive-custom-properties@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-progressive-custom-properties@npm:4.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/829880844fbbeef1c67e0b380057e574659b4caed38c8414c17d7eb4a0cc727afa1cd74a889bc7ca79c819ecae757810356706901cf6bb677a36ca123915cbb7 + checksum: 10c0/517e5e0b1525667ea1c4469bb2af52995934b9ab3165bba33e3bfdfac63b20bb51c878da582d805957dc0291e396e5a540cac18d1220a08190d98d5463d26ce2 languageName: node linkType: hard -"@csstools/postcss-relative-color-syntax@npm:^2.0.16": - version: 2.0.16 - resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.16" +"@csstools/postcss-relative-color-syntax@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.0" dependencies: - "@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" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/cdc965706212dcbc03394f55c79a0ad043d1e0174059c4d0d90e4267fe8e6fd9eef7cfed4f5bbc1f8e89c225c1c042ae792e115bba198eb2daae763d65f44679 + checksum: 10c0/d7ae180d746bd9778d8b9f74f8d644f4c6a98b29659423d4ee2b48f461e90a3e30b44dcf44a181ade083b6c6d1b0346b7b3e62fe67fdeaba59a13f050a19c7d1 languageName: node linkType: hard -"@csstools/postcss-scope-pseudo-class@npm:^3.0.1": - version: 3.0.1 - resolution: "@csstools/postcss-scope-pseudo-class@npm:3.0.1" +"@csstools/postcss-scope-pseudo-class@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.0" dependencies: - postcss-selector-parser: "npm:^6.0.13" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/489c5469951277b810754ba02e9f6c42196e03f2203b908181a81747bf1dcaa7b194c8c0f5c7dcb6b7276d08f2573a71bd7df4f2251c034ef1b92968c7070285 + checksum: 10c0/a6f562df1417c6f257c0fec95babf4cea99a25622573a2dbcfb416e2fcb8e1e53561127f5e7277d19fcb2a4603bdbc64dd6a4c416429623503c604050c99229a languageName: node linkType: hard -"@csstools/postcss-stepped-value-functions@npm:^3.0.8": - version: 3.0.8 - resolution: "@csstools/postcss-stepped-value-functions@npm:3.0.8" +"@csstools/postcss-stepped-value-functions@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.0" dependencies: - "@csstools/css-calc": "npm:^1.2.2" - "@csstools/css-parser-algorithms": "npm:^2.6.3" - "@csstools/css-tokenizer": "npm:^2.3.1" + "@csstools/css-calc": "npm:^2.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/2be66aa769808245137be8ff14308aa17c3a0d75433f6fd6789114966a78c365dbf173d087e7ff5bc80118c75be2ff740baab83ed39fc0671980f6217779956b + checksum: 10c0/02d9b99921a69838d5df7cc2703f381e8e18d14ac5a4bd8b8b24ff80bc9657ff70b1997cdbfd9c2f1985a5d07478a0e97d1617760519450c5475cc1d8159e788 languageName: node linkType: hard -"@csstools/postcss-text-decoration-shorthand@npm:^3.0.6": - version: 3.0.6 - resolution: "@csstools/postcss-text-decoration-shorthand@npm:3.0.6" +"@csstools/postcss-text-decoration-shorthand@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.0" dependencies: - "@csstools/color-helpers": "npm:^4.2.0" + "@csstools/color-helpers": "npm:^4.2.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5abdc4fad1c3f15e9d47c7af3995dec9cdf4e6f87c5857eb2e149764779b8389f4f4b21d11e6f2509c57c554a0dc5c11f68f212acd04bbc47defa15911ac3eb9 + checksum: 10c0/dedc98134648d5306e795e4176b2c39a578a237669562e7d934d0b0ac7411d37bab4065c8b0adfc075b57250daba62f045b86c79286b5f9be55502acef0d88c6 languageName: node linkType: hard -"@csstools/postcss-trigonometric-functions@npm:^3.0.8": - version: 3.0.8 - resolution: "@csstools/postcss-trigonometric-functions@npm:3.0.8" +"@csstools/postcss-trigonometric-functions@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.0" dependencies: - "@csstools/css-calc": "npm:^1.2.2" - "@csstools/css-parser-algorithms": "npm:^2.6.3" - "@csstools/css-tokenizer": "npm:^2.3.1" + "@csstools/css-calc": "npm:^2.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/aeed8d1026f4a5cb7afafbadd739af84291d5bfcbcdef2f79b77174f003d0cd0c7f9deb3fe0b9377efab37ce9bb17a2499efd4af8211f5ff9eb01b878b0b62b3 + checksum: 10c0/3a53d6724f068511d02a2de3b39e76bf99d622614e1c79b3d2c2eace2f0d36d865288dc2c4a1368fee8db38be7973803504400b2752cd5a1200f825ddc27b253 languageName: node linkType: hard -"@csstools/postcss-unset-value@npm:^3.0.1": - version: 3.0.1 - resolution: "@csstools/postcss-unset-value@npm:3.0.1" +"@csstools/postcss-unset-value@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-unset-value@npm:4.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5032c3125eada0a3a77d0867644cf994e28b789aaa40e990e7eebcdf5a9ed9f36b30e0904827044cea39849c9a9a19c90e82d3ca655550d82a7530872b3b6ff8 + checksum: 10c0/8424ac700ded5bf59d49310335896f10c069e2c3fc6a676b5d13ca5a6fb78689b948f50494df875da284c4c76651deb005eafba70d87e693274628c5a685abfa languageName: node linkType: hard -"@csstools/selector-resolve-nested@npm:^1.1.0": - version: 1.1.0 - resolution: "@csstools/selector-resolve-nested@npm:1.1.0" +"@csstools/selector-resolve-nested@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/selector-resolve-nested@npm:2.0.0" peerDependencies: - postcss-selector-parser: ^6.0.13 - checksum: 10c0/3a53b14e048d48b8900c1cf30442ab5eec1a1087c74ce41459c4dcd42ad7d363c9327890ba7aed25288d09c206d9565178bae126b25cdc3e1170a1d55e763c77 + postcss-selector-parser: ^6.1.0 + checksum: 10c0/10516fd1db5e0a3963063caa57d24eeb1d1f69fcb63f0b5aec5d7a44f8b36ff07b1eded3012e8a9b92fc1f484e1a5a9def0cf57d788aa7f944ee79877837cc77 languageName: node linkType: hard @@ -1999,12 +2050,21 @@ __metadata: languageName: node linkType: hard -"@csstools/utilities@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/utilities@npm:1.0.0" +"@csstools/selector-specificity@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/selector-specificity@npm:4.0.0" + peerDependencies: + postcss-selector-parser: ^6.1.0 + checksum: 10c0/6f4d4ecfdcd37f950100de8ffe0b4c1b1cc8c004aab2c2ebaa5c3e2bca2412d15b17d4628435f47a62d2c56db41bcbf985cb9c69e74b89964d48e421e93e75ba + languageName: node + linkType: hard + +"@csstools/utilities@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/utilities@npm:2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/2ac10895e0a1f9e1fc9c092197c8595a09f632552791af91219f38c55bb39083fb44b74a6a7de9112492cf24a2fe66d20c955a2b4aff041d5c017d87bbebc0f2 + checksum: 10c0/be5c31437b726928f64cd4bb3e47f5b90bfd2e2a69a8eaabd8e89cc6c0977e4f0f7ee48de50c8ed8b07e04e3956a02293247e0da3236d521fb2e836f88f65822 languageName: node linkType: hard @@ -2139,17 +2199,14 @@ __metadata: languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.43.1": - version: 0.43.1 - resolution: "@es-joy/jsdoccomment@npm:0.43.1" +"@es-joy/jsdoccomment@npm:~0.46.0": + version: 0.46.0 + resolution: "@es-joy/jsdoccomment@npm:0.46.0" dependencies: - "@types/eslint": "npm:^8.56.5" - "@types/estree": "npm:^1.0.5" - "@typescript-eslint/types": "npm:^7.2.0" comment-parser: "npm:1.4.1" - esquery: "npm:^1.5.0" + esquery: "npm:^1.6.0" jsdoc-type-pratt-parser: "npm:~4.0.0" - checksum: 10c0/2a4842b0e37eb937d55e3028ab2cd7ece7097e1f8c878bb9e28c3309371844688c2869d25bb949e2664c9ba63e388ea09b769c9f42f77515d328ec40e6fcfed1 + checksum: 10c0/a7a67936ebf6d9aaf74af018c3ac744769af3552b05ad9b88fca96b2ffdca16e724b0ff497f53634ec4cca81e98d8c471b6b6bde0fa5b725af4222ad9a0707f0 languageName: node linkType: hard @@ -2768,8 +2825,9 @@ __metadata: "@rails/ujs": "npm:7.1.3" "@reduxjs/toolkit": "npm:^2.0.1" "@svgr/webpack": "npm:^5.5.0" + "@testing-library/dom": "npm:^10.2.0" "@testing-library/jest-dom": "npm:^6.0.0" - "@testing-library/react": "npm:^15.0.0" + "@testing-library/react": "npm:^16.0.0" "@types/babel__core": "npm:^7.20.1" "@types/emoji-mart": "npm:^3.0.9" "@types/escape-html": "npm:^1.0.2" @@ -2802,7 +2860,6 @@ __metadata: "@typescript-eslint/parser": "npm:^7.0.0" arrow-key-navigation: "npm:^1.2.0" async-mutex: "npm:^0.5.0" - autoprefixer: "npm:^10.4.14" axios: "npm:^1.4.0" babel-jest: "npm:^29.5.0" babel-loader: "npm:^8.3.0" @@ -2829,13 +2886,13 @@ __metadata: eslint-plugin-formatjs: "npm:^4.10.1" 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.2.0" + eslint-plugin-jsx-a11y: "npm:~6.9.0" + eslint-plugin-promise: "npm:~6.6.0" eslint-plugin-react: "npm:^7.33.2" eslint-plugin-react-hooks: "npm:^4.6.0" file-loader: "npm:^6.2.0" font-awesome: "npm:^4.7.0" - fuzzysort: "npm:^2.0.4" + fuzzysort: "npm:^3.0.0" glob: "npm:^10.2.6" history: "npm:^4.10.1" hoist-non-react-statics: "npm:^3.3.2" @@ -2855,8 +2912,8 @@ __metadata: path-complete-extname: "npm:^1.0.0" postcss: "npm:^8.4.24" postcss-loader: "npm:^4.3.0" - postcss-preset-env: "npm:^9.5.2" - prettier: "npm:^3.0.0" + postcss-preset-env: "npm:^10.0.0" + prettier: "npm:^3.3.3" prop-types: "npm:^15.8.1" punycode: "npm:^2.3.0" react: "npm:^18.2.0" @@ -2895,12 +2952,13 @@ __metadata: tiny-queue: "npm:^0.2.1" twitter-text: "npm:3.1.0" typescript: "npm:^5.0.4" + use-debounce: "npm:^10.0.0" webpack: "npm:^4.47.0" webpack-assets-manifest: "npm:^4.0.6" webpack-bundle-analyzer: "npm:^4.8.0" webpack-cli: "npm:^3.3.12" webpack-dev-server: "npm:^3.11.3" - webpack-merge: "npm:^5.9.0" + webpack-merge: "npm:^6.0.0" wicg-inert: "npm:^3.1.2" workbox-expiration: "npm:^7.0.0" workbox-precaching: "npm:^7.0.0" @@ -2925,7 +2983,7 @@ __metadata: "@types/cors": "npm:^2.8.16" "@types/express": "npm:^4.17.17" "@types/pg": "npm:^8.6.6" - "@types/uuid": "npm:^9.0.0" + "@types/uuid": "npm:^10.0.0" "@types/ws": "npm:^8.5.9" bufferutil: "npm:^4.0.7" cors: "npm:^2.8.5" @@ -3035,6 +3093,13 @@ __metadata: languageName: node linkType: hard +"@pkgr/core@npm:^0.1.0": + version: 0.1.1 + resolution: "@pkgr/core@npm:0.1.1" + checksum: 10c0/3f7536bc7f57320ab2cf96f8973664bef624710c403357429fbf680a5c3b4843c1dbd389bb43daa6b1f6f1f007bb082f5abcb76bb2b5dc9f421647743b71d3d8 + languageName: node + linkType: hard + "@polka/url@npm:^1.0.0-next.20": version: 1.0.0-next.21 resolution: "@polka/url@npm:1.0.0-next.21" @@ -3057,8 +3122,8 @@ __metadata: linkType: hard "@reduxjs/toolkit@npm:^2.0.1": - version: 2.2.5 - resolution: "@reduxjs/toolkit@npm:2.2.5" + version: 2.2.6 + resolution: "@reduxjs/toolkit@npm:2.2.6" dependencies: immer: "npm:^10.0.3" redux: "npm:^5.0.1" @@ -3072,7 +3137,7 @@ __metadata: optional: true react-redux: optional: true - checksum: 10c0/be0593bf26852482fb8716b9248531466c6e8782a3114b823ae680fce90267d8c5512a3231cfecc30b17eff81a4604112772b49ad7ca6a3366ddd4f2a838e53c + checksum: 10c0/60af753e6d02c8acd3c5bc843c846d60b19821d93ff9f4415fa7011ebf17a85301ed42132fabc1aaee8523d8f61418b5ba164a11c31ab29937e485842d3744a0 languageName: node linkType: hard @@ -3348,9 +3413,9 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:^10.0.0": - version: 10.0.0 - resolution: "@testing-library/dom@npm:10.0.0" +"@testing-library/dom@npm:^10.2.0": + version: 10.4.0 + resolution: "@testing-library/dom@npm:10.4.0" dependencies: "@babel/code-frame": "npm:^7.10.4" "@babel/runtime": "npm:^7.12.5" @@ -3360,13 +3425,13 @@ __metadata: dom-accessibility-api: "npm:^0.5.9" lz-string: "npm:^1.5.0" pretty-format: "npm:^27.0.2" - checksum: 10c0/2d12d2a6018a6f1d15e91834180bc068932c699ff1fcbfb80aa21aba519a4f5329c861dfa852e06ee5615bcb92ef2a0f0e755e32684ea3dada63bc34248382ab + checksum: 10c0/0352487720ecd433400671e773df0b84b8268fb3fe8e527cdfd7c11b1365b398b4e0eddba6e7e0c85e8d615f48257753283fccec41f6b986fd6c85f15eb5f84f languageName: node linkType: hard "@testing-library/jest-dom@npm:^6.0.0": - version: 6.4.6 - resolution: "@testing-library/jest-dom@npm:6.4.6" + version: 6.4.8 + resolution: "@testing-library/jest-dom@npm:6.4.8" dependencies: "@adobe/css-tools": "npm:^4.4.0" "@babel/runtime": "npm:^7.9.2" @@ -3376,42 +3441,27 @@ __metadata: dom-accessibility-api: "npm:^0.6.3" lodash: "npm:^4.17.21" redent: "npm:^3.0.0" - peerDependencies: - "@jest/globals": ">= 28" - "@types/bun": "*" - "@types/jest": ">= 28" - jest: ">= 28" - vitest: ">= 0.32" - peerDependenciesMeta: - "@jest/globals": - optional: true - "@types/bun": - optional: true - "@types/jest": - optional: true - jest: - optional: true - vitest: - optional: true - checksum: 10c0/8f369c1d27f8128b3794c6b9af5f5b794a47af4670819756e9f4e7cf69e277b30e8b89c548277a279918f648c85c6c7874f1a867e52edd4edb0629a2cf377daa + checksum: 10c0/8eececcac1ec7728c038b9d9eabfc8b8dcf4dc1e997c959450bff16d946e3344275862b84bfe0e1d1beb3817368e782464816aca47ab5c94f0ebf66db71df55d languageName: node linkType: hard -"@testing-library/react@npm:^15.0.0": - version: 15.0.7 - resolution: "@testing-library/react@npm:15.0.7" +"@testing-library/react@npm:^16.0.0": + version: 16.0.0 + resolution: "@testing-library/react@npm:16.0.0" dependencies: "@babel/runtime": "npm:^7.12.5" - "@testing-library/dom": "npm:^10.0.0" - "@types/react-dom": "npm:^18.0.0" peerDependencies: + "@testing-library/dom": ^10.0.0 "@types/react": ^18.0.0 + "@types/react-dom": ^18.0.0 react: ^18.0.0 react-dom: ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/ac8ee8968e81949ecb35f7ee34741c2c043f73dd7fee2247d56f6de6a30de4742af94f25264356863974e54387485b46c9448ecf3f6ca41cf4339011c369f2d4 + "@types/react-dom": + optional: true + checksum: 10c0/297f97bf4722dad05f11d9cafd47d387dbdb096fea4b79b876c7466460f0f2e345b55b81b3e37fc81ed8185c528cb53dd8455ca1b6b019b229edf6c796f11c9f languageName: node linkType: hard @@ -3430,9 +3480,9 @@ __metadata: linkType: hard "@types/aria-query@npm:^5.0.1": - version: 5.0.1 - resolution: "@types/aria-query@npm:5.0.1" - checksum: 10c0/bc9e40ce37bd3a1654948778c7829bd55aea1bc5f2cd06fcf6cd650b07bb388995799e9aab6e2d93a6cf55dcba3b85c155f7ba93adefcc7c2e152fc6057061b5 + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: 10c0/dc667bc6a3acc7bba2bccf8c23d56cb1f2f4defaa704cfef595437107efaa972d3b3db9ec1d66bc2711bfc35086821edd32c302bffab36f2e79b97f312069f08 languageName: node linkType: hard @@ -3530,7 +3580,7 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:7 || 8, @types/eslint@npm:^8.56.5": +"@types/eslint@npm:7 || 8": version: 8.56.10 resolution: "@types/eslint@npm:8.56.10" dependencies: @@ -3540,7 +3590,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": +"@types/estree@npm:*, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d @@ -3622,11 +3672,11 @@ __metadata: linkType: hard "@types/http-link-header@npm:^1.0.3": - version: 1.0.5 - resolution: "@types/http-link-header@npm:1.0.5" + version: 1.0.7 + resolution: "@types/http-link-header@npm:1.0.7" dependencies: "@types/node": "npm:*" - checksum: 10c0/adeb13381b38c3625478149820772924c154b4a7250dca62c346810a8378f8968fc7f3a9a4f55ec61de5d06083637540f862c8a920f6a710310c9645d19a077d + checksum: 10c0/ffde4514a286ee62fab86bd5164958f5c9ad9d8012eaeb4f5536efa6157e6cf9f93121d5a39bf160c3712554d945300a223a9f8b1f3fb08cc70b73f539767338 languageName: node linkType: hard @@ -3712,9 +3762,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.195": - version: 4.17.5 - resolution: "@types/lodash@npm:4.17.5" - checksum: 10c0/55924803ed853e72261512bd3eaf2c5b16558c3817feb0a3125ef757afe46e54b86f33d1960e40b7606c0ddab91a96f47966bf5e6006b7abfd8994c13b04b19b + version: 4.17.7 + resolution: "@types/lodash@npm:4.17.7" + checksum: 10c0/40c965b5ffdcf7ff5c9105307ee08b782da228c01b5c0529122c554c64f6b7168fc8f11dc79aa7bae4e67e17efafaba685dc3a47e294dbf52a65ed2b67100561 languageName: node linkType: hard @@ -3829,7 +3879,7 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.4": +"@types/react-dom@npm:^18.2.4": version: 18.3.0 resolution: "@types/react-dom@npm:18.3.0" dependencies: @@ -4045,10 +4095,10 @@ __metadata: languageName: node linkType: hard -"@types/uuid@npm:^9.0.0": - version: 9.0.8 - resolution: "@types/uuid@npm:9.0.8" - checksum: 10c0/b411b93054cb1d4361919579ef3508a1f12bf15b5fdd97337d3d351bece6c921b52b6daeef89b62340fd73fd60da407878432a1af777f40648cbe53a01723489 +"@types/uuid@npm:^10.0.0": + version: 10.0.0 + resolution: "@types/uuid@npm:10.0.0" + checksum: 10c0/9a1404bf287164481cb9b97f6bb638f78f955be57c40c6513b7655160beb29df6f84c915aaf4089a1559c216557dc4d2f79b48d978742d3ae10b937420ddac60 languageName: node linkType: hard @@ -4092,11 +4142,11 @@ __metadata: linkType: hard "@types/ws@npm:^8.5.9": - version: 8.5.10 - resolution: "@types/ws@npm:8.5.10" + version: 8.5.12 + resolution: "@types/ws@npm:8.5.12" dependencies: "@types/node": "npm:*" - checksum: 10c0/e9af279b984c4a04ab53295a40aa95c3e9685f04888df5c6920860d1dd073fcc57c7bd33578a04b285b2c655a0b52258d34bee0a20569dca8defb8393e1e5d29 + checksum: 10c0/3fd77c9e4e05c24ce42bfc7647f7506b08c40a40fe2aea236ef6d4e96fc7cb4006a81ed1b28ec9c457e177a74a72924f4768b7b4652680b42dfd52bc380e15f9 languageName: node linkType: hard @@ -4117,14 +4167,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^7.0.0": - version: 7.11.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.11.0" + version: 7.17.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.17.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.11.0" - "@typescript-eslint/type-utils": "npm:7.11.0" - "@typescript-eslint/utils": "npm:7.11.0" - "@typescript-eslint/visitor-keys": "npm:7.11.0" + "@typescript-eslint/scope-manager": "npm:7.17.0" + "@typescript-eslint/type-utils": "npm:7.17.0" + "@typescript-eslint/utils": "npm:7.17.0" + "@typescript-eslint/visitor-keys": "npm:7.17.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -4135,25 +4185,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/50fedf832e4de9546569106eab1d10716204ceebc5cc7d62299112c881212270d0f7857e3d6452c07db031d40b58cf27c4d1b1a36043e8e700fc3496e377b54a + checksum: 10c0/654d589531ae45b8ca8f3969e785926b2544100a985968d86c828e2a1ff50331250e19c8b4af83a4ba17847a0047479662eb317e4ad94f6279cac03acd5cda5a languageName: node linkType: hard "@typescript-eslint/parser@npm:^7.0.0": - version: 7.11.0 - resolution: "@typescript-eslint/parser@npm:7.11.0" + version: 7.17.0 + resolution: "@typescript-eslint/parser@npm:7.17.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.11.0" - "@typescript-eslint/types": "npm:7.11.0" - "@typescript-eslint/typescript-estree": "npm:7.11.0" - "@typescript-eslint/visitor-keys": "npm:7.11.0" + "@typescript-eslint/scope-manager": "npm:7.17.0" + "@typescript-eslint/types": "npm:7.17.0" + "@typescript-eslint/typescript-estree": "npm:7.17.0" + "@typescript-eslint/visitor-keys": "npm:7.17.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/f5d1343fae90ccd91aea8adf194e22ed3eb4b2ea79d03d8a9ca6e7b669a6db306e93138ec64f7020c5b3128619d50304dea1f06043eaff6b015071822cad4972 + checksum: 10c0/0cf6922412517b4c005609b035119ddd2798e1b6e74e1bccd487aa53119d27067cfd89311f00b8e96b2b044a0fb7373418a16552be86079879158b260c397418 languageName: node linkType: hard @@ -4167,22 +4217,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.11.0": - version: 7.11.0 - resolution: "@typescript-eslint/scope-manager@npm:7.11.0" +"@typescript-eslint/scope-manager@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/scope-manager@npm:7.17.0" dependencies: - "@typescript-eslint/types": "npm:7.11.0" - "@typescript-eslint/visitor-keys": "npm:7.11.0" - checksum: 10c0/35f9d88f38f2366017b15c9ee752f2605afa8009fa1eaf81c8b2b71fc22ddd2a33fff794a02015c8991a5fa99f315c3d6d76a5957d3fad1ccbb4cd46735c98b5 + "@typescript-eslint/types": "npm:7.17.0" + "@typescript-eslint/visitor-keys": "npm:7.17.0" + checksum: 10c0/e1a693e19dc855fe6d04b46c6c205019bfc937eda5f8b255393f8267ebddd282165568336e37b04aab544b155a807784b9c4a92129dfc7c1eef5a9e9fe052685 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.11.0": - version: 7.11.0 - resolution: "@typescript-eslint/type-utils@npm:7.11.0" +"@typescript-eslint/type-utils@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/type-utils@npm:7.17.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.11.0" - "@typescript-eslint/utils": "npm:7.11.0" + "@typescript-eslint/typescript-estree": "npm:7.17.0" + "@typescript-eslint/utils": "npm:7.17.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependencies: @@ -4190,7 +4240,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/637395cb0f4c424c610e751906a31dcfedcdbd8c479012da6e81f9be6b930f32317bfe170ccb758d93a411b2bd9c4e7e5d18892094466099c6f9c3dceda81a72 + checksum: 10c0/b415cf37c0922cded78735c5049cb5a5b0065e1c0ce4a81ca2a26422763ccacca8945efa45480f40530f2ec414a14d35a88a6798258aa889f7a9cf4ca4a240cd languageName: node linkType: hard @@ -4201,10 +4251,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.11.0, @typescript-eslint/types@npm:^7.2.0": - version: 7.11.0 - resolution: "@typescript-eslint/types@npm:7.11.0" - checksum: 10c0/c5d6c517124017eb44aa180c8ea1fad26ec8e47502f92fd12245ba3141560e69d7f7e35b8aa160ddd5df63a2952af407e2f62cc58b663c86e1f778ffb5b01789 +"@typescript-eslint/types@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/types@npm:7.17.0" + checksum: 10c0/8f734294d432b37c534f17eb2befdfe43b76874d09118d6adf7e308e5a586e9e11b7021abe4f6692a6e6226de58a15b3cfe1300939556ce1c908d9af627b7400 languageName: node linkType: hard @@ -4227,12 +4277,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.11.0": - version: 7.11.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.11.0" +"@typescript-eslint/typescript-estree@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.17.0" dependencies: - "@typescript-eslint/types": "npm:7.11.0" - "@typescript-eslint/visitor-keys": "npm:7.11.0" + "@typescript-eslint/types": "npm:7.17.0" + "@typescript-eslint/visitor-keys": "npm:7.17.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -4242,21 +4292,21 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/a4eda43f352d20edebae0c1c221c4fd9de0673a94988cf1ae3f5e4917ef9cdb9ead8d3673ea8dd6e80d9cf3523a47c295be1326a3fae017b277233f4c4b4026b + checksum: 10c0/10967823ce00c9f8cd4a8b56bed3524c098e38cc0e27aaa49ffd8fad4e671c00226bf0330ba858948750b88dc55527ebeb62c74be8a30bac18a106d6c033ab59 languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.11.0": - version: 7.11.0 - resolution: "@typescript-eslint/utils@npm:7.11.0" +"@typescript-eslint/utils@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/utils@npm:7.17.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.11.0" - "@typescript-eslint/types": "npm:7.11.0" - "@typescript-eslint/typescript-estree": "npm:7.11.0" + "@typescript-eslint/scope-manager": "npm:7.17.0" + "@typescript-eslint/types": "npm:7.17.0" + "@typescript-eslint/typescript-estree": "npm:7.17.0" peerDependencies: eslint: ^8.56.0 - checksum: 10c0/539a7ff8b825ad810fc59a80269094748df1a397a42cdbb212c493fc2486711c7d8fd6d75d4cd8a067822b8e6a11f42c50441977d51c183eec47992506d1cdf8 + checksum: 10c0/1f3e22820b3ab3e47809c45e576614ad4a965f5c8634856eca5c70981386b9351a77fb172ba32345e7c5667479cf9526c673699dd38dccd0616ad6db21704e72 languageName: node linkType: hard @@ -4287,13 +4337,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.11.0": - version: 7.11.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.11.0" +"@typescript-eslint/visitor-keys@npm:7.17.0": + version: 7.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.17.0" dependencies: - "@typescript-eslint/types": "npm:7.11.0" + "@typescript-eslint/types": "npm:7.17.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/664e558d9645896484b7ffc9381837f0d52443bf8d121a5586d02d42ca4d17dc35faf526768c4b1beb52c57c43fae555898eb087651eb1c7a3d60f1085effea1 + checksum: 10c0/fa6b339d51fc3710288bb2ffaa46d639551d77965cc42c36f96c4f43aed663ff12972e8a28652a280f6ce20b7a92dc2aea14b2b4049012799be2fc2d3cbb2c60 languageName: node linkType: hard @@ -4662,12 +4712,12 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^6.2.0": - version: 6.2.0 - resolution: "ansi-escapes@npm:6.2.0" +"ansi-escapes@npm:^7.0.0": + version: 7.0.0 + resolution: "ansi-escapes@npm:7.0.0" dependencies: - type-fest: "npm:^3.0.0" - checksum: 10c0/3eec75deedd8b10192c5f98e4cd9715cc3ff268d33fc463c24b7d22446668bfcd4ad1803993ea89c0f51f88b5a3399572bacb7c8cb1a067fc86e189c5f3b0c7e + environment: "npm:^1.0.0" + checksum: 10c0/86e51e36fabef18c9c004af0a280573e828900641cea35134a124d2715e0c5a473494ab4ce396614505da77638ae290ff72dd8002d9747d2ee53f5d6bbe336be languageName: node linkType: hard @@ -4783,7 +4833,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:5.3.0, aria-query@npm:^5.0.0, aria-query@npm:^5.3.0": +"aria-query@npm:5.3.0, aria-query@npm:^5.0.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" dependencies: @@ -4792,6 +4842,15 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:~5.1.3": + version: 5.1.3 + resolution: "aria-query@npm:5.1.3" + dependencies: + deep-equal: "npm:^2.0.5" + checksum: 10c0/edcbc8044c4663d6f88f785e983e6784f98cb62b4ba1e9dd8d61b725d0203e4cfca38d676aee984c31f354103461102a3d583aa4fbe4fd0a89b679744f4e5faf + languageName: node + linkType: hard + "arr-diff@npm:^4.0.0": version: 4.0.0 resolution: "arr-diff@npm:4.0.0" @@ -4813,7 +4872,7 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" dependencies: @@ -4945,28 +5004,16 @@ __metadata: languageName: node linkType: hard -"array.prototype.toreversed@npm:^1.1.2": - version: 1.1.2 - resolution: "array.prototype.toreversed@npm:1.1.2" +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: 10c0/2b7627ea85eae1e80ecce665a500cc0f3355ac83ee4a1a727562c7c2a1d5f1c0b4dd7b65c468ec6867207e452ba01256910a2c0b41486bfdd11acf875a7a3435 - languageName: node - linkType: hard - -"array.prototype.tosorted@npm:^1.1.3": - version: 1.1.3 - resolution: "array.prototype.tosorted@npm:1.1.3" - dependencies: - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.7" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.3" - es-errors: "npm:^1.1.0" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/a27e1ca51168ecacf6042901f5ef021e43c8fa04b6c6b6f2a30bac3645cd2b519cecbe0bc45db1b85b843f64dc3207f0268f700b4b9fbdec076d12d432cf0865 + checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943 languageName: node linkType: hard @@ -5105,7 +5152,7 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.14, autoprefixer@npm:^10.4.19": +"autoprefixer@npm:^10.4.19": version: 10.4.19 resolution: "autoprefixer@npm:10.4.19" dependencies: @@ -5132,30 +5179,30 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:=4.7.0": - version: 4.7.0 - resolution: "axe-core@npm:4.7.0" - checksum: 10c0/89ac5712b5932ac7d23398b4cb5ba081c394a086e343acc68ba49c83472706e18e0799804e8388c779dcdacc465377deb29f2714241d3fbb389cf3a6b275c9ba +"axe-core@npm:^4.9.1": + version: 4.9.1 + resolution: "axe-core@npm:4.9.1" + checksum: 10c0/ac9e5a0c6fa115a43ebffc32a1d2189e1ca6431b5a78e88cdcf94a72a25c5964185682edd94fe6bdb1cb4266c0d06301b022866e0e50dcdf6e3cefe556470110 languageName: node linkType: hard "axios@npm:^1.4.0": - version: 1.7.2 - resolution: "axios@npm:1.7.2" + version: 1.7.3 + resolution: "axios@npm:1.7.3" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/cbd47ce380fe045313364e740bb03b936420b8b5558c7ea36a4563db1258c658f05e40feb5ddd41f6633fdd96d37ac2a76f884dad599c5b0224b4c451b3fa7ae + checksum: 10c0/a18cbe559203efa05fb1fec2d1898e23bf6329bd2575784ee32aa11b5bbe1d54b9f472c49a261294125519cf62aa4fe5ef6e647bb7482eafc15bffe15ab314ce languageName: node linkType: hard -"axobject-query@npm:^3.2.1": - version: 3.2.1 - resolution: "axobject-query@npm:3.2.1" +"axobject-query@npm:~3.1.1": + version: 3.1.1 + resolution: "axobject-query@npm:3.1.1" dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/f7debc2012e456139b57d888c223f6d3cb4b61eb104164a85e3d346273dd6ef0bc9a04b6660ca9407704a14a8e05fa6b6eb9d55f44f348c7210de7ffb350c3a7 + deep-equal: "npm:^2.0.5" + checksum: 10c0/fff3175a22fd1f41fceb7ae0cd25f6594a0d7fba28c2335dd904538b80eb4e1040432564a3c643025cd2bb748f68d35aaabffb780b794da97ecfc748810b25ad languageName: node linkType: hard @@ -5643,17 +5690,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.22.2, browserslist@npm:^4.22.3, browserslist@npm:^4.23.0": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" +"browserslist@npm:^4.0.0, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1": + version: 4.23.1 + resolution: "browserslist@npm:4.23.1" dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" + caniuse-lite: "npm:^1.0.30001629" + electron-to-chromium: "npm:^1.4.796" node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" + update-browserslist-db: "npm:^1.0.16" bin: browserslist: cli.js - checksum: 10c0/8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 + checksum: 10c0/eb47c7ab9d60db25ce2faca70efeb278faa7282a2f62b7f2fa2f92e5f5251cf65144244566c86559419ff4f6d78f59ea50e39911321ad91f3b27788901f1f5e9 languageName: node linkType: hard @@ -5855,10 +5902,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599": - version: 1.0.30001599 - resolution: "caniuse-lite@npm:1.0.30001599" - checksum: 10c0/8b3b9610b5be88533a3c8d0770d6896f7b1a9fee3dbeb7339e4ee119a514c81e5e07a628a5a289a6541ca291ac78a9402f5a99cf6012139e91f379083488a8eb +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001629": + version: 1.0.30001636 + resolution: "caniuse-lite@npm:1.0.30001636" + checksum: 10c0/e5f965b4da7bae1531fd9f93477d015729ff9e3fa12670ead39a9e6cdc4c43e62c272d47857c5cc332e7b02d697cb3f2f965a1030870ac7476da60c2fc81ee94 languageName: node linkType: hard @@ -6022,12 +6069,12 @@ __metadata: languageName: node linkType: hard -"cli-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-cursor@npm:4.0.0" +"cli-cursor@npm:^5.0.0": + version: 5.0.0 + resolution: "cli-cursor@npm:5.0.0" dependencies: - restore-cursor: "npm:^4.0.0" - checksum: 10c0/e776e8c3c6727300d0539b0d25160b2bb56aed1a63942753ba1826b012f337a6f4b7ace3548402e4f2f13b5e16bfd751be672c44b203205e7eca8be94afec42c + restore-cursor: "npm:^5.0.0" + checksum: 10c0/7ec62f69b79f6734ab209a3e4dbdc8af7422d44d360a7cb1efa8a0887bbe466a6e625650c466fe4359aee44dbe2dc0b6994b583d40a05d0808a5cb193641d220 languageName: node linkType: hard @@ -6359,12 +6406,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.1": - version: 3.36.1 - resolution: "core-js-compat@npm:3.36.1" +"core-js-compat@npm:^3.36.1, core-js-compat@npm:^3.37.1": + version: 3.37.1 + resolution: "core-js-compat@npm:3.37.1" dependencies: browserslist: "npm:^4.23.0" - checksum: 10c0/70fba18a4095cd8ac04e5ba8cee251e328935859cf2851c1f67770068ea9f9fe71accb1b7de17cd3c9a28d304a4c41712bd9aa895110ebb6e3be71b666b029d1 + checksum: 10c0/4e2da9c900f2951a57947af7aeef4d16f2c75d7f7e966c0d0b62953f65225003ade5e84d3ae98847f65b24c109c606821d9dc925db8ca418fb761e7c81963c2a languageName: node linkType: hard @@ -6376,9 +6423,9 @@ __metadata: linkType: hard "core-js@npm:^3.30.2": - version: 3.37.1 - resolution: "core-js@npm:3.37.1" - checksum: 10c0/440eb51a7a39128a320225fe349f870a3641b96c9ecd26470227db730ef8c161ea298eaea621db66ec0ff622a85299efb4e23afebf889c0a1748616102307675 + version: 3.38.0 + resolution: "core-js@npm:3.38.0" + checksum: 10c0/3218ae19bfe0c6560663012cbd3e7f3dc1b36d50fc71e8c365f3b119185e8a35ac4e8bb9698ae510b3c201ef93f40bdc29f9215716ccf31aca28f77969bb4ed0 languageName: node linkType: hard @@ -6545,14 +6592,14 @@ __metadata: languageName: node linkType: hard -"css-blank-pseudo@npm:^6.0.2": - version: 6.0.2 - resolution: "css-blank-pseudo@npm:6.0.2" +"css-blank-pseudo@npm:^7.0.0": + version: 7.0.0 + resolution: "css-blank-pseudo@npm:7.0.0" dependencies: - postcss-selector-parser: "npm:^6.0.13" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/609303551c2a518ca23ed12fed43945ca4f7af04140da68a5536f5dc9d42f33412c13ac3fe5c616d7401a9e13a23d80b4cfa87149a45f94b244d8067bb11f3dd + checksum: 10c0/74c6c0af773a8d2c8c5a53bcfc2b2c06f9c3fd4a8bd756b7aafc102b91a1060b179a4f0aa21475b54685b62bfd9724fee90778dd992b42e0cd3ea3698132af92 languageName: node linkType: hard @@ -6572,16 +6619,16 @@ __metadata: languageName: node linkType: hard -"css-has-pseudo@npm:^6.0.5": - version: 6.0.5 - resolution: "css-has-pseudo@npm:6.0.5" +"css-has-pseudo@npm:^7.0.0": + version: 7.0.0 + resolution: "css-has-pseudo@npm:7.0.0" dependencies: - "@csstools/selector-specificity": "npm:^3.1.1" - postcss-selector-parser: "npm:^6.0.13" + "@csstools/selector-specificity": "npm:^4.0.0" + postcss-selector-parser: "npm:^6.1.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/946930b7e699d6dbcb8426ebcd593228ee0e2143a148fb2399111ea4c9ed8d6eb3447e944251f1be44ae987d5ab16e450b0b006ca197f318c2a3760ba431fbb9 + checksum: 10c0/2c72602ca9bcdb3afe2cce3b014e7dd17548658904c17560042ebf4bd6727b1ed8706961b1f44bff43bbdb8dc932c30a0b29f536c353df858e300e68e163b872 languageName: node linkType: hard @@ -6605,12 +6652,12 @@ __metadata: languageName: node linkType: hard -"css-prefers-color-scheme@npm:^9.0.1": - version: 9.0.1 - resolution: "css-prefers-color-scheme@npm:9.0.1" +"css-prefers-color-scheme@npm:^10.0.0": + version: 10.0.0 + resolution: "css-prefers-color-scheme@npm:10.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b94da00d84c4ebb56eb8fce96d4fdb20d2e622a7cd8cd6d7b87d1d2b718a55ce88bccc9d871771bfe77c5107de06132ba87190e3656f049e45f19f652d50136c + checksum: 10c0/a66c727bb2455328b18862f720819fc98ff5c1486b69f758bdb5c66f46cc6d484f9fc0bfa4f00f2693c5da6707ad136ca789496982f713ade693f08af624930e languageName: node linkType: hard @@ -6707,10 +6754,10 @@ __metadata: languageName: node linkType: hard -"cssdb@npm:^8.0.0": - version: 8.0.0 - resolution: "cssdb@npm:8.0.0" - checksum: 10c0/d9a31b760214624352000b16a8f7194c357f66b6c445e663ab58dd03b6f0f53efaaca6d6f96200d666e205894d2d1c346664ad993d9522ff9fc1c331804a8d62 +"cssdb@npm:^8.1.0": + version: 8.1.0 + resolution: "cssdb@npm:8.1.0" + checksum: 10c0/1fa1f1566c7e9964f5c71e443583eaba16a90933a3ef6803815c4281d084b75da948c415bade33d7085894fe0929c082fcb3135bf4400048cfff40d227ebd5dd languageName: node linkType: hard @@ -6723,43 +6770,43 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^7.0.2": - version: 7.0.2 - resolution: "cssnano-preset-default@npm:7.0.2" +"cssnano-preset-default@npm:^7.0.4": + version: 7.0.4 + resolution: "cssnano-preset-default@npm:7.0.4" dependencies: - browserslist: "npm:^4.23.0" + browserslist: "npm:^4.23.1" css-declaration-sorter: "npm:^7.2.0" cssnano-utils: "npm:^5.0.0" postcss-calc: "npm:^10.0.0" - postcss-colormin: "npm:^7.0.0" - postcss-convert-values: "npm:^7.0.0" - postcss-discard-comments: "npm:^7.0.0" + postcss-colormin: "npm:^7.0.1" + postcss-convert-values: "npm:^7.0.2" + postcss-discard-comments: "npm:^7.0.1" postcss-discard-duplicates: "npm:^7.0.0" postcss-discard-empty: "npm:^7.0.0" postcss-discard-overridden: "npm:^7.0.0" - postcss-merge-longhand: "npm:^7.0.1" - postcss-merge-rules: "npm:^7.0.1" + postcss-merge-longhand: "npm:^7.0.2" + postcss-merge-rules: "npm:^7.0.2" postcss-minify-font-values: "npm:^7.0.0" postcss-minify-gradients: "npm:^7.0.0" - postcss-minify-params: "npm:^7.0.0" - postcss-minify-selectors: "npm:^7.0.1" + postcss-minify-params: "npm:^7.0.1" + postcss-minify-selectors: "npm:^7.0.2" postcss-normalize-charset: "npm:^7.0.0" postcss-normalize-display-values: "npm:^7.0.0" postcss-normalize-positions: "npm:^7.0.0" postcss-normalize-repeat-style: "npm:^7.0.0" postcss-normalize-string: "npm:^7.0.0" postcss-normalize-timing-functions: "npm:^7.0.0" - postcss-normalize-unicode: "npm:^7.0.0" + postcss-normalize-unicode: "npm:^7.0.1" postcss-normalize-url: "npm:^7.0.0" postcss-normalize-whitespace: "npm:^7.0.0" - postcss-ordered-values: "npm:^7.0.0" - postcss-reduce-initial: "npm:^7.0.0" + postcss-ordered-values: "npm:^7.0.1" + postcss-reduce-initial: "npm:^7.0.1" postcss-reduce-transforms: "npm:^7.0.0" postcss-svgo: "npm:^7.0.1" postcss-unique-selectors: "npm:^7.0.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/7c66240594c1d7a0cc761e755236228b17251455aa57abc45be0631f7de0fde070c23b0e41ffa200d39cd8351718514217d8c7a8cc4f06b54289dc1d555dfeb2 + checksum: 10c0/0083821e778bdf7b8aa9589408a01a717be730f73584e7b81756a6fcf87af05b8f17342025e666572a8d573cc30783f2d817b0f7ad63670398bc3135b017ccad languageName: node linkType: hard @@ -6773,14 +6820,14 @@ __metadata: linkType: hard "cssnano@npm:^7.0.0": - version: 7.0.2 - resolution: "cssnano@npm:7.0.2" + version: 7.0.4 + resolution: "cssnano@npm:7.0.4" dependencies: - cssnano-preset-default: "npm:^7.0.2" - lilconfig: "npm:^3.1.1" + cssnano-preset-default: "npm:^7.0.4" + lilconfig: "npm:^3.1.2" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/ad43d8c2e96fa1022fc5103064e4f08da3fdc5501a946d455edf0b81981b58cd06ad2d3f0c68d666e2b687c10c02ffbb383252aa34da0ddc3bd4d075f4a922c7 + checksum: 10c0/3939a0b37b11cb4bae92f7916517c7ba21257551f92517b49a640d5df32e855fb7e73321f4be44d2c2de578309c05d711cdcb1976e95607b1b7f92bd4cbd1350 languageName: node linkType: hard @@ -6925,15 +6972,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:~4.3.6": + version: 4.3.6 + resolution: "debug@npm:4.3.6" dependencies: ms: "npm:2.1.2" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + checksum: 10c0/3293416bff072389c101697d4611c402a6bacd1900ac20c0492f61a9cdd6b3b29750fc7f5e299f8058469ef60ff8fb79b86395a30374fbd2490113c1c7112285 languageName: node linkType: hard @@ -6993,6 +7040,32 @@ __metadata: languageName: node linkType: hard +"deep-equal@npm:^2.0.5": + version: 2.2.3 + resolution: "deep-equal@npm:2.2.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + call-bind: "npm:^1.0.5" + es-get-iterator: "npm:^1.1.3" + get-intrinsic: "npm:^1.2.2" + is-arguments: "npm:^1.1.1" + is-array-buffer: "npm:^3.0.2" + is-date-object: "npm:^1.0.5" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + isarray: "npm:^2.0.5" + object-is: "npm:^1.1.5" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.1" + side-channel: "npm:^1.0.4" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.1" + which-typed-array: "npm:^1.1.13" + checksum: 10c0/a48244f90fa989f63ff5ef0cc6de1e4916b48ea0220a9c89a378561960814794a5800c600254482a2c8fd2e49d6c2e196131dc983976adb024c94a42dfe4949f + languageName: node + linkType: hard + "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -7395,10 +7468,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.668": - version: 1.4.681 - resolution: "electron-to-chromium@npm:1.4.681" - checksum: 10c0/5b2558dfb8bb82c20fb5fa1d9bbe06a3add47431dc3e1e4815e997be6ad387787047d9e534ed96839a9e7012520a5281c865158b09db41d10c029af003f05f94 +"electron-to-chromium@npm:^1.4.796": + version: 1.4.806 + resolution: "electron-to-chromium@npm:1.4.806" + checksum: 10c0/44f925ba64bb623d0482cd2f14fcfb27017cec1f11ee642e0d49cb128cd714ba5e074c2cd8756dfc18010aa66d3c64039cdea891905f7c17160a8963db574fab languageName: node linkType: hard @@ -7539,6 +7612,13 @@ __metadata: languageName: node linkType: hard +"environment@npm:^1.0.0": + version: 1.1.0 + resolution: "environment@npm:1.1.0" + checksum: 10c0/fb26434b0b581ab397039e51ff3c92b34924a98b2039dcb47e41b7bca577b9dbf134a8eadb364415c74464b682e2d3afe1a4c0eb9873dc44ea814c5d3103331d + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -7575,7 +7655,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": +"es-abstract@npm:^1.17.2, es-abstract@npm:^1.17.5, es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": version: 1.23.3 resolution: "es-abstract@npm:1.23.3" dependencies: @@ -7645,14 +7725,31 @@ __metadata: languageName: node linkType: hard -"es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.15, es-iterator-helpers@npm:^1.0.19": +"es-get-iterator@npm:^1.1.3": + version: 1.1.3 + resolution: "es-get-iterator@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.3" + has-symbols: "npm:^1.0.3" + is-arguments: "npm:^1.1.1" + is-map: "npm:^2.0.2" + is-set: "npm:^2.0.2" + is-string: "npm:^1.0.7" + isarray: "npm:^2.0.5" + stop-iteration-iterator: "npm:^1.0.0" + checksum: 10c0/ebd11effa79851ea75d7f079405f9d0dc185559fd65d986c6afea59a0ff2d46c2ed8675f19f03dce7429d7f6c14ff9aede8d121fbab78d75cfda6a263030bac0 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.0.19": version: 1.0.19 resolution: "es-iterator-helpers@npm:1.0.19" dependencies: @@ -7674,6 +7771,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.5.3": + version: 1.5.4 + resolution: "es-module-lexer@npm:1.5.4" + checksum: 10c0/300a469488c2f22081df1e4c8398c78db92358496e639b0df7f89ac6455462aaf5d8893939087c1a1cbcbf20eed4610c70e0bcb8f3e4b0d80a5d2611c539408c + languageName: node + linkType: hard + "es-object-atoms@npm:^1.0.0": version: 1.0.0 resolution: "es-object-atoms@npm:1.0.0" @@ -7714,10 +7818,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: 10c0/afd02e6ca91ffa813e1108b5e7756566173d6bc0d1eb951cb44d6b21702ec17c1cf116cfe75d4a2b02e05acb0b808a7a9387d0d1ca5cf9c04ad03a8445c3e46d +"escalade@npm:^3.1.1, escalade@npm:^3.1.2": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 languageName: node linkType: hard @@ -7864,55 +7968,57 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^48.0.0": - version: 48.2.7 - resolution: "eslint-plugin-jsdoc@npm:48.2.7" + version: 48.8.3 + resolution: "eslint-plugin-jsdoc@npm:48.8.3" dependencies: - "@es-joy/jsdoccomment": "npm:~0.43.1" + "@es-joy/jsdoccomment": "npm:~0.46.0" are-docs-informative: "npm:^0.0.2" comment-parser: "npm:1.4.1" - debug: "npm:^4.3.4" + debug: "npm:^4.3.5" escape-string-regexp: "npm:^4.0.0" - esquery: "npm:^1.5.0" - semver: "npm:^7.6.2" + esquery: "npm:^1.6.0" + parse-imports: "npm:^2.1.1" + semver: "npm:^7.6.3" spdx-expression-parse: "npm:^4.0.0" + synckit: "npm:^0.9.1" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/74d0f95b3d880dd4221dbc0b9341266a6cce3b8ca8d3e30032223af3552364643d6b82ad733d9bc06a20f0d640f21e4d8f5a4b00901d1771572625178b8c40c3 + checksum: 10c0/78d893614b188617de5a03d8163406455e3b739fd7b86192eb05a29cf8e7f06909a6f6a1b9dc2acd31e5ae2bccd94600eaea247d277f58c3c946c0fdb36a57f7 languageName: node linkType: hard -"eslint-plugin-jsx-a11y@npm:~6.8.0": - version: 6.8.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" +"eslint-plugin-jsx-a11y@npm:~6.9.0": + version: 6.9.0 + resolution: "eslint-plugin-jsx-a11y@npm:6.9.0" dependencies: - "@babel/runtime": "npm:^7.23.2" - aria-query: "npm:^5.3.0" - array-includes: "npm:^3.1.7" + aria-query: "npm:~5.1.3" + array-includes: "npm:^3.1.8" array.prototype.flatmap: "npm:^1.3.2" ast-types-flow: "npm:^0.0.8" - axe-core: "npm:=4.7.0" - axobject-query: "npm:^3.2.1" + axe-core: "npm:^4.9.1" + axobject-query: "npm:~3.1.1" damerau-levenshtein: "npm:^1.0.8" emoji-regex: "npm:^9.2.2" - es-iterator-helpers: "npm:^1.0.15" - hasown: "npm:^2.0.0" + es-iterator-helpers: "npm:^1.0.19" + hasown: "npm:^2.0.2" jsx-ast-utils: "npm:^3.3.5" language-tags: "npm:^1.0.9" minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.7" - object.fromentries: "npm:^2.0.7" + object.fromentries: "npm:^2.0.8" + safe-regex-test: "npm:^1.0.3" + string.prototype.includes: "npm:^2.0.0" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/199b883e526e6f9d7c54cb3f094abc54f11a1ec816db5fb6cae3b938eb0e503acc10ccba91ca7451633a9d0b9abc0ea03601844a8aba5fe88c5e8897c9ac8f49 + checksum: 10c0/72ac719ca90b6149c8f3c708ac5b1177f6757668b6e174d72a78512d4ac10329331b9c666c21e9561237a96a45d7f147f6a5d270dadbb99eb4ee093f127792c3 languageName: node linkType: hard -"eslint-plugin-promise@npm:~6.2.0": - version: 6.2.0 - resolution: "eslint-plugin-promise@npm:6.2.0" +"eslint-plugin-promise@npm:~6.6.0": + version: 6.6.0 + resolution: "eslint-plugin-promise@npm:6.6.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/5f42ee774023c089453ecb792076c64c6d0739ea6e9d6cdc9d6a63da5ba928c776e349d01cc110548f2c67045ec55343136aa7eb8b486e4ab145ac016c06a492 + checksum: 10c0/93a667dbc9ff15c4d586b0d40a31c7828314cbbb31b2b9a75802aa4ef536e9457bb3e1a89b384b07aa336dd61b315ae8b0aadc0870210378023dd018819b59b3 languageName: node linkType: hard @@ -7926,30 +8032,30 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.33.2": - version: 7.34.2 - resolution: "eslint-plugin-react@npm:7.34.2" + version: 7.35.0 + resolution: "eslint-plugin-react@npm:7.35.0" dependencies: array-includes: "npm:^3.1.8" array.prototype.findlast: "npm:^1.2.5" array.prototype.flatmap: "npm:^1.3.2" - array.prototype.toreversed: "npm:^1.1.2" - array.prototype.tosorted: "npm:^1.1.3" + array.prototype.tosorted: "npm:^1.1.4" doctrine: "npm:^2.1.0" es-iterator-helpers: "npm:^1.0.19" estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" minimatch: "npm:^3.1.2" object.entries: "npm:^1.1.8" object.fromentries: "npm:^2.0.8" - object.hasown: "npm:^1.1.4" object.values: "npm:^1.2.0" prop-types: "npm:^15.8.1" resolve: "npm:^2.0.0-next.5" semver: "npm:^6.3.1" string.prototype.matchall: "npm:^4.0.11" + string.prototype.repeat: "npm:^1.0.0" peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10c0/37dc04424da8626f20a071466e7238d53ed111c53e5e5398d813ac2cf76a2078f00d91f7833fe5b2f0fc98f2688a75b36e78e9ada9f1068705d23c7031094316 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10c0/eedcc33de4b2cda91d56ae517a4f771a0c76da9c1e26c95543969012871381e11d4d6cffdf6fa8423036585c289eb3500f3f93fb1d314fb2624e0aa1e463305e languageName: node linkType: hard @@ -8049,12 +8155,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2, esquery@npm:^1.5.0": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.4.2, esquery@npm:^1.6.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 languageName: node linkType: hard @@ -8790,10 +8896,10 @@ __metadata: languageName: node linkType: hard -"fuzzysort@npm:^2.0.4": - version: 2.0.4 - resolution: "fuzzysort@npm:2.0.4" - checksum: 10c0/3170d16fccc0f4ac5e31323dbab7d0da7b1a4024878ed4d6b4ec86c0df94e12dc335f8d4181e38d97ca7919ac51bc5de4a9c2ec94914a4e51f9e9c05208c9ea9 +"fuzzysort@npm:^3.0.0": + version: 3.0.2 + resolution: "fuzzysort@npm:3.0.2" + checksum: 10c0/c6cdbd092a8e91ed822aeac6d4fb95559759c10602cb29f27307c1cabd01fdd384fa399f7757722435b595244efb000cd63f144104c41b8551b2faff123279cb languageName: node linkType: hard @@ -8818,7 +8924,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": +"get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" dependencies: @@ -8924,17 +9030,18 @@ __metadata: linkType: hard "glob@npm:^10.2.2, glob@npm:^10.2.6, glob@npm:^10.3.10": - version: 10.4.1 - resolution: "glob@npm:10.4.1" + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^3.1.2" minimatch: "npm:^9.0.4" minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10c0/77f2900ed98b9cc2a0e1901ee5e476d664dae3cd0f1b662b8bfd4ccf00d0edc31a11595807706a274ca10e1e251411bbf2e8e976c82bed0d879a9b89343ed379 + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e languageName: node linkType: hard @@ -9431,13 +9538,13 @@ __metadata: languageName: node linkType: hard -"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" +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" dependencies: agent-base: "npm:^7.0.2" debug: "npm:4" - checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b + checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c languageName: node linkType: hard @@ -9456,11 +9563,11 @@ __metadata: linkType: hard "husky@npm:^9.0.11": - version: 9.0.11 - resolution: "husky@npm:9.0.11" + version: 9.1.4 + resolution: "husky@npm:9.1.4" bin: - husky: bin.mjs - checksum: 10c0/2c787dcf74a837fc9a4fea7da907509d4bd9a289f4ea10ecc9d86279e4d4542b0f5f6443a619bccae19e265f2677172cc2b86aae5c932a35a330cc227d914605 + husky: bin.js + checksum: 10c0/f5185003bef9ad9ec3f40e821963e4c12409b993fdcab89e3d660bed7d8c9d8bfd399f05222e27e0ead6589601fb1bb08d1a589c51751a4ab0547ead3429b8de languageName: node linkType: hard @@ -9534,9 +9641,9 @@ __metadata: linkType: hard "immutable@npm:^4.0.0, immutable@npm:^4.0.0-rc.1, immutable@npm:^4.3.0": - version: 4.3.6 - resolution: "immutable@npm:4.3.6" - checksum: 10c0/7d0952a768b4fadcee47230ed86dc9505a4517095eceaf5a47e65288571c42400c6e4a2ae21eca4eda957cb7bc50720213135b62cf6a181639111f8acae128c3 + version: 4.3.7 + resolution: "immutable@npm:4.3.7" + checksum: 10c0/9b099197081b22f6433003e34929da8ecddbbdc1474cdc8aa3b7669dee4adda349c06143de22def36016d1b6de5322b043eccd7a11db1dad2ca85dad4fff5435 languageName: node linkType: hard @@ -9657,7 +9764,7 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.7": +"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" dependencies: @@ -9773,7 +9880,7 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.0.4": +"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" dependencies: @@ -9783,7 +9890,7 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4": +"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4": version: 3.0.4 resolution: "is-array-buffer@npm:3.0.4" dependencies: @@ -10039,10 +10146,10 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.1": - version: 2.0.2 - resolution: "is-map@npm:2.0.2" - checksum: 10c0/119ff9137a37fd131a72fab3f4ab8c9d6a24b0a1ee26b4eff14dc625900d8675a97785eea5f4174265e2006ed076cc24e89f6e57ebd080a48338d914ec9168a5 +"is-map@npm:^2.0.1, is-map@npm:^2.0.2": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc languageName: node linkType: hard @@ -10164,10 +10271,10 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.1": - version: 2.0.2 - resolution: "is-set@npm:2.0.2" - checksum: 10c0/5f8bd1880df8c0004ce694e315e6e1e47a3452014be792880bb274a3b2cdb952fdb60789636ca6e084c7947ca8b7ae03ccaf54c93a7fcfed228af810559e5432 +"is-set@npm:^2.0.1, is-set@npm:^2.0.2": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 languageName: node linkType: hard @@ -11008,8 +11115,8 @@ __metadata: linkType: hard "jsdom@npm:^24.0.0": - version: 24.1.0 - resolution: "jsdom@npm:24.1.0" + version: 24.1.1 + resolution: "jsdom@npm:24.1.1" dependencies: cssstyle: "npm:^4.0.1" data-urls: "npm:^5.0.0" @@ -11017,11 +11124,11 @@ __metadata: form-data: "npm:^4.0.0" html-encoding-sniffer: "npm:^4.0.0" http-proxy-agent: "npm:^7.0.2" - https-proxy-agent: "npm:^7.0.4" + https-proxy-agent: "npm:^7.0.5" is-potential-custom-element-name: "npm:^1.0.1" - nwsapi: "npm:^2.2.10" + nwsapi: "npm:^2.2.12" parse5: "npm:^7.1.2" - rrweb-cssom: "npm:^0.7.0" + rrweb-cssom: "npm:^0.7.1" saxes: "npm:^6.0.0" symbol-tree: "npm:^3.2.4" tough-cookie: "npm:^4.1.4" @@ -11030,14 +11137,14 @@ __metadata: whatwg-encoding: "npm:^3.1.1" whatwg-mimetype: "npm:^4.0.0" whatwg-url: "npm:^14.0.0" - ws: "npm:^8.17.0" + ws: "npm:^8.18.0" xml-name-validator: "npm:^5.0.0" peerDependencies: canvas: ^2.11.2 peerDependenciesMeta: canvas: optional: true - checksum: 10c0/34eadd8a7ae20c1505abe7a0f3988b2f0881cce7e27d75c4f5224f440f81f8ac08f4f449695b0f4178f048ed1c1709f3594e9d3f2fe0406c28e8da6eddd44f5a + checksum: 10c0/02d6bfe32f09f26329c0e53ad9f9883a3c671fc1f75725167d2089ca412f5b7ca85ff8aa62327d1cc6fc70ffbb3b18dfc7642c4b2096c2c8b19aaf9a48473eb3 languageName: node linkType: hard @@ -11227,10 +11334,10 @@ __metadata: languageName: node linkType: hard -"known-css-properties@npm:^0.31.0": - version: 0.31.0 - resolution: "known-css-properties@npm:0.31.0" - checksum: 10c0/8e643cbed32d7733278ba215c43dfc38fc7e77d391f66b81f07228af97d69ce2cebba03a9bc1ac859479e162aea812e258b30f4c93cb7b7adfd0622a141d36da +"known-css-properties@npm:^0.34.0": + version: 0.34.0 + resolution: "known-css-properties@npm:0.34.0" + checksum: 10c0/8549969f02b1858554e89faf4548ece37625d0d21b42e8d54fa53184e68e1512ef2531bb15941575ad816361ab7447b598c1b18c1b96ce0a868333d1a68f2e2c languageName: node linkType: hard @@ -11267,10 +11374,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:^3.1.1, lilconfig@npm:~3.1.1": - version: 3.1.1 - resolution: "lilconfig@npm:3.1.1" - checksum: 10c0/311b559794546894e3fe176663427326026c1c644145be9e8041c58e268aa9328799b8dfe7e4dd8c6a4ae305feae95a1c9e007db3569f35b42b6e1bc8274754c +"lilconfig@npm:^3.1.2, lilconfig@npm:~3.1.2": + version: 3.1.2 + resolution: "lilconfig@npm:3.1.2" + checksum: 10c0/f059630b1a9bddaeba83059db00c672b64dc14074e9f232adce32b38ca1b5686ab737eb665c5ba3c32f147f0002b4bee7311ad0386a9b98547b5623e87071fbe languageName: node linkType: hard @@ -11282,36 +11389,36 @@ __metadata: linkType: hard "lint-staged@npm:^15.0.0": - version: 15.2.7 - resolution: "lint-staged@npm:15.2.7" + version: 15.2.8 + resolution: "lint-staged@npm:15.2.8" dependencies: chalk: "npm:~5.3.0" commander: "npm:~12.1.0" - debug: "npm:~4.3.4" + debug: "npm:~4.3.6" execa: "npm:~8.0.1" - lilconfig: "npm:~3.1.1" - listr2: "npm:~8.2.1" + lilconfig: "npm:~3.1.2" + listr2: "npm:~8.2.4" micromatch: "npm:~4.0.7" pidtree: "npm:~0.6.0" string-argv: "npm:~0.3.2" - yaml: "npm:~2.4.2" + yaml: "npm:~2.5.0" bin: lint-staged: bin/lint-staged.js - checksum: 10c0/c14399f9782ae222a1748144254f24b5b9afc816dc8840bd02d50f523c6582796ff18410767eb1a73cf1a83bc6e492dea7b1c4f0912bf3e434c068221f13c878 + checksum: 10c0/7d43f11f493d27951c746b4c077fed16ba954c0517cf2fd999034e9e7bf86fde506a797b23531a56a1fde4c24846e0f6583ce6db3bdfd42e92335b1aab367737 languageName: node linkType: hard -"listr2@npm:~8.2.1": - version: 8.2.1 - resolution: "listr2@npm:8.2.1" +"listr2@npm:~8.2.4": + version: 8.2.4 + resolution: "listr2@npm:8.2.4" 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.1" + log-update: "npm:^6.1.0" + rfdc: "npm:^1.4.1" wrap-ansi: "npm:^9.0.0" - checksum: 10c0/ac32cba8e5c79bcf0dbbb43c2fcc73e47902320c1fa1891074fefb3aa3dfaeef9c76348da22909f65334ba9bee1140bfc903e2f0c64427dd08ef4ba8f6b1dbd0 + checksum: 10c0/df5b129e9767de1997973cec6103cd4bd6fc3b3367685b7c23048d12b61d5b7e44fecd8a3d3534c0e1c963bd5ac43ca501d14712f46fa101050037be323a5c16 languageName: node linkType: hard @@ -11479,16 +11586,16 @@ __metadata: languageName: node linkType: hard -"log-update@npm:^6.0.0": - version: 6.0.0 - resolution: "log-update@npm:6.0.0" +"log-update@npm:^6.1.0": + version: 6.1.0 + resolution: "log-update@npm:6.1.0" dependencies: - ansi-escapes: "npm:^6.2.0" - cli-cursor: "npm:^4.0.0" - slice-ansi: "npm:^7.0.0" + ansi-escapes: "npm:^7.0.0" + cli-cursor: "npm:^5.0.0" + slice-ansi: "npm:^7.1.0" strip-ansi: "npm:^7.1.0" wrap-ansi: "npm:^9.0.0" - checksum: 10c0/e0b3c3401ef49ce3eb17e2f83d644765e4f7988498fc1344eaa4f31ab30e510dcc469a7fb64dc01bd1c8d9237d917598fa677a9818705fb3774c10f6e9d4b27c + checksum: 10c0/4b350c0a83d7753fea34dcac6cd797d1dc9603291565de009baa4aa91c0447eab0d3815a05c8ec9ac04fdfffb43c82adcdb03ec1fceafd8518e1a8c1cff4ff89 languageName: node linkType: hard @@ -11844,6 +11951,13 @@ __metadata: languageName: node linkType: hard +"mimic-function@npm:^5.0.0": + version: 5.0.1 + resolution: "mimic-function@npm:5.0.1" + checksum: 10c0/f3d9464dd1816ecf6bdf2aec6ba32c0728022039d992f178237d8e289b48764fee4131319e72eedd4f7f094e22ded0af836c3187a7edc4595d28dd74368fd81d + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -12330,10 +12444,10 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.2.10, nwsapi@npm:^2.2.2": - version: 2.2.10 - resolution: "nwsapi@npm:2.2.10" - checksum: 10c0/43dfa150387bd2a578e37556d0ae3330d5617f99e5a7b64e3400d4c2785620762aa6169caf8f5fbce17b7ef29c372060b602594320c374fba0a39da4163d77ed +"nwsapi@npm:^2.2.12, nwsapi@npm:^2.2.2": + version: 2.2.12 + resolution: "nwsapi@npm:2.2.12" + checksum: 10c0/95e9623d63df111405503df8c5d800e26f71675d319e2c9c70cddfa31e5ace1d3f8b6d98d354544fc156a1506d920ec291e303fab761e4f99296868e199a466e languageName: node linkType: hard @@ -12362,13 +12476,13 @@ __metadata: languageName: node linkType: hard -"object-is@npm:^1.0.1": - version: 1.1.5 - resolution: "object-is@npm:1.1.5" +"object-is@npm:^1.0.1, object-is@npm:^1.1.5": + version: 1.1.6 + resolution: "object-is@npm:1.1.6" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - checksum: 10c0/8c263fb03fc28f1ffb54b44b9147235c5e233dc1ca23768e7d2569740b5d860154d7cc29a30220fe28ed6d8008e2422aefdebfe987c103e1c5d190cf02d9d886 + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + checksum: 10c0/506af444c4dce7f8e31f34fc549e2fb8152d6b9c4a30c6e62852badd7f520b579c679af433e7a072f9d78eb7808d230dc12e1cf58da9154dfbf8813099ea0fe0 languageName: node linkType: hard @@ -12400,7 +12514,7 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.7, object.entries@npm:^1.1.8": +"object.entries@npm:^1.1.8": version: 1.1.8 resolution: "object.entries@npm:1.1.8" dependencies: @@ -12448,17 +12562,6 @@ __metadata: languageName: node linkType: hard -"object.hasown@npm:^1.1.4": - version: 1.1.4 - resolution: "object.hasown@npm:1.1.4" - dependencies: - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/f23187b08d874ef1aea060118c8259eb7f99f93c15a50771d710569534119062b90e087b92952b2d0fb1bb8914d61fb0b43c57fb06f622aaad538fe6868ab987 - languageName: node - linkType: hard - "object.pick@npm:^1.3.0": version: 1.3.0 resolution: "object.pick@npm:1.3.0" @@ -12518,7 +12621,7 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": +"onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" dependencies: @@ -12536,6 +12639,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^7.0.0": + version: 7.0.0 + resolution: "onetime@npm:7.0.0" + dependencies: + mimic-function: "npm:^5.0.0" + checksum: 10c0/5cb9179d74b63f52a196a2e7037ba2b9a893245a5532d3f44360012005c9cadb60851d56716ebff18a6f47129dab7168022445df47c2aff3b276d92585ed1221 + languageName: node + linkType: hard + "opencollective-postinstall@npm:^2.0.2": version: 2.0.3 resolution: "opencollective-postinstall@npm:2.0.3" @@ -12668,6 +12780,13 @@ __metadata: languageName: node linkType: hard +"package-json-from-dist@npm:^1.0.0": + version: 1.0.0 + resolution: "package-json-from-dist@npm:1.0.0" + checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033 + languageName: node + linkType: hard + "pako@npm:~1.0.5": version: 1.0.11 resolution: "pako@npm:1.0.11" @@ -12697,6 +12816,16 @@ __metadata: languageName: node linkType: hard +"parse-imports@npm:^2.1.1": + version: 2.1.1 + resolution: "parse-imports@npm:2.1.1" + dependencies: + es-module-lexer: "npm:^1.5.3" + slashes: "npm:^3.0.12" + checksum: 10c0/c9bb0b4e1823f84f034d2d7bd2b37415b1715a5c963fda14968c706186b48b02c10e97d04bce042b9dcd679b42f29c391ea120799ddf581c7f54786edd99e3a9 + languageName: node + linkType: hard + "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -13050,20 +13179,20 @@ __metadata: linkType: hard "pino-http@npm:^10.0.0": - version: 10.1.0 - resolution: "pino-http@npm:10.1.0" + version: 10.2.0 + resolution: "pino-http@npm:10.2.0" dependencies: get-caller-file: "npm:^2.0.5" pino: "npm:^9.0.0" pino-std-serializers: "npm:^7.0.0" process-warning: "npm:^3.0.0" - checksum: 10c0/d97691f2ee248b0aca0e49169d0c7ca0d4c604ee57b63ae264a6f9914fc7277cace74686d5088a876f8152a8d5b8211af904b2d24a516728a662de0e9cc79e9f + checksum: 10c0/0b79cd3602531ee5043693e2a3ccf9d955bd93759e80c0b3a458b95b241f36ca8ebc72c8050b395e9d8fcb9581ebc18ecd6b7dc136526bebe924bc5c5079374d languageName: node linkType: hard "pino-pretty@npm:^11.0.0": - version: 11.2.1 - resolution: "pino-pretty@npm:11.2.1" + version: 11.2.2 + resolution: "pino-pretty@npm:11.2.2" dependencies: colorette: "npm:^2.0.7" dateformat: "npm:^4.6.3" @@ -13081,7 +13210,7 @@ __metadata: strip-json-comments: "npm:^3.1.1" bin: pino-pretty: bin.js - checksum: 10c0/6c7f15b5bf8a007c8b7157eae445675b13cd95097ffa512d5ebd661f9e7abd328fa27592b25708756a09f098f87cb03ca81837518cd725c16e3f801129b941d4 + checksum: 10c0/3ce1769907886a5584f6c8123d9bc987712ad10a375797733a0fe95a238df587dac8e2b709bab291c4e30d41b0cf65808c708c96f8eb98b2778b6df60afa7e66 languageName: node linkType: hard @@ -13093,15 +13222,15 @@ __metadata: linkType: hard "pino@npm:^9.0.0": - version: 9.2.0 - resolution: "pino@npm:9.2.0" + version: 9.3.2 + resolution: "pino@npm:9.3.2" dependencies: atomic-sleep: "npm:^1.0.0" fast-redact: "npm:^3.1.1" on-exit-leak-free: "npm:^2.1.0" pino-abstract-transport: "npm:^1.2.0" pino-std-serializers: "npm:^7.0.0" - process-warning: "npm:^3.0.0" + process-warning: "npm:^4.0.0" quick-format-unescaped: "npm:^4.0.3" real-require: "npm:^0.2.0" safe-stable-stringify: "npm:^2.3.1" @@ -13109,7 +13238,7 @@ __metadata: thread-stream: "npm:^3.0.0" bin: pino: bin.js - checksum: 10c0/5fbd226ff7dab0961232b5aa5eca0530cdc5bb29f6bf17d929e42239293b1a587a26cc311db6abc1090c9dd57e8f7b031eae341b41d00d4a642b4f1736474c80 + checksum: 10c0/698eb2ebfcc4252da9d035fcf9c999bf27615b66ebc47f9b3d7e942750e50ebe38429e6457abcf8014d70125964ddf114e696cb8225b480d9930271708e3fb52 languageName: node linkType: hard @@ -13163,14 +13292,14 @@ __metadata: languageName: node linkType: hard -"postcss-attribute-case-insensitive@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-attribute-case-insensitive@npm:6.0.3" +"postcss-attribute-case-insensitive@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-attribute-case-insensitive@npm:7.0.0" dependencies: - postcss-selector-parser: "npm:^6.0.13" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/6161a625356db17ea23daa50797e23fa830a15629fa45e7438b5ac72a389f81ba51088503c5893a941d34d287857882867199584c5f03bf7762258c74570f456 + checksum: 10c0/ce2a96bc29f59a6113953f1f72bfa2d4d34e54b194ff4d49aad0d548aa738835afaf479f22060a2605952b842f63aeae278b44e41f8f3a05731df28d08e2df97 languageName: node linkType: hard @@ -13197,131 +13326,133 @@ __metadata: languageName: node linkType: hard -"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.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/7fd75e6881cf62f536f79dfc0ae1b709ea0b8b84833cce1671372711f6019ab4360c6a17089b654b2d376b87e7f9455b94f0d13b45ab0ab767e547b604709b3d - languageName: node - linkType: hard - -"postcss-color-hex-alpha@npm:^9.0.4": - version: 9.0.4 - resolution: "postcss-color-hex-alpha@npm:9.0.4" - dependencies: - "@csstools/utilities": "npm:^1.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/57b5cfe17e0b659d5444f267c485462b8b25f6ab087b810c7dd44662af4828e1e8f9c4a9169b8635a4755509ca7c0f3463c2e96444764c4e6ff9f4036aad05e5 - languageName: node - linkType: hard - -"postcss-color-rebeccapurple@npm:^9.0.3": - version: 9.0.3 - resolution: "postcss-color-rebeccapurple@npm:9.0.3" - dependencies: - "@csstools/utilities": "npm:^1.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/ab36d29df23dd475a2a540101427640ef9c7936bbf941816e8582caea05feced26c65f795a849e2ad17469cee6682d1bbccd2f8ab0da07fe91efcc0649568038 - languageName: node - linkType: hard - -"postcss-colormin@npm:^7.0.0": +"postcss-color-functional-notation@npm:^7.0.0": version: 7.0.0 - resolution: "postcss-colormin@npm:7.0.0" + resolution: "postcss-color-functional-notation@npm:7.0.0" dependencies: - browserslist: "npm:^4.23.0" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/6afe7b681a16783a27fa9600db348f995dfdbc9c945f6cdcec94ee2419e09cfd1c6e533264b830207f130e19ae18ff689ad9b48bced338f27f898eaecd61f844 + languageName: node + linkType: hard + +"postcss-color-hex-alpha@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-hex-alpha@npm:10.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/8a6dcb27403d04b55d6de88bf3074622bcea537fc4436bbcb346e92289c4d17059444e2e6c3554c325e7a777bb4cdc711e764a83123b4000aec211052e957d5b + languageName: node + linkType: hard + +"postcss-color-rebeccapurple@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-rebeccapurple@npm:10.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/308e33f76f2b48c1c2121d4502fc053e869f3415898de7d30314353df680e79b37497e7b628e3447edc1049091da3672f7d891e45604f238598e846e06b893ed + languageName: node + linkType: hard + +"postcss-colormin@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-colormin@npm:7.0.1" + dependencies: + browserslist: "npm:^4.23.1" caniuse-api: "npm:^3.0.0" colord: "npm:^2.9.3" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/d365a5365e0a94748309d32c7208cd06249bc53eb82cc32c771de4073b109fa8552e58d60dbe84d7e69e68081ed8a01fbf645d38a650e90cb2e13b21043cd796 + checksum: 10c0/e01e9e129ce39320cf10bb09ee2a3ab5b44b77805d3f7827eea07297644838b85c33b78996eeae0a1aba327ffd72a6ab1d24949ebc831523e310e916d5500371 languageName: node linkType: hard -"postcss-convert-values@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-convert-values@npm:7.0.0" +"postcss-convert-values@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-convert-values@npm:7.0.2" dependencies: - browserslist: "npm:^4.23.0" + browserslist: "npm:^4.23.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/5d7cfa06f307e024574a1842016f006691e0c1932352f53a99ce8f2f9930c64c3c1ae17518e9e4e5176630b99f1beaab37bc339bc779fb07dc543670ae66bb21 + checksum: 10c0/beb59faf6aae97e6d3c233c5e6ed06cc60d65c49eec576036e3d0da1a831a1e827e3d41f5e81d016440b4f0bdf1406268ae069c4d5b38a6667b310c3da079d22 languageName: node linkType: hard -"postcss-custom-media@npm:^10.0.6": - version: 10.0.6 - resolution: "postcss-custom-media@npm:10.0.6" +"postcss-custom-media@npm:^11.0.0": + version: 11.0.0 + resolution: "postcss-custom-media@npm:11.0.0" dependencies: - "@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" + "@csstools/cascade-layer-name-parser": "npm:^2.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/media-query-list-parser": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/98a524bc46b780a86094bbe8007f1e577137da5490823631a683d4b3df4a13e40c5e1ab52380275a54f7011abfd98bb597c6293d964c14f9f22ec6cf9d75c550 + checksum: 10c0/99e58454453581a1a4f5b7eae5cf6504c445e45d48035f09857603437fe80de06a216d0dad6036d32d14108b490e82a0845e1b4e0ec5114f752b325e388f0f1c languageName: node linkType: hard -"postcss-custom-properties@npm:^13.3.10": - version: 13.3.10 - resolution: "postcss-custom-properties@npm:13.3.10" +"postcss-custom-properties@npm:^14.0.0": + version: 14.0.0 + resolution: "postcss-custom-properties@npm:14.0.0" dependencies: - "@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" + "@csstools/cascade-layer-name-parser": "npm:^2.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/52688fd0aaadccfdf4a3d86d3a2ab988163e8108088c5e33fc9145d261f75b92b8321c044a8161345abda10df5715d674330309dcc0c17f2980db5515f6a76d6 + checksum: 10c0/f587e2f3026fa7ceb63dd111674848b97dc452f9e75a6480b4b87611a4705dd97e5ae5247e7d34888aecd95b4e50706170c93f57f14f05fb352135d2decdc00f languageName: node linkType: hard -"postcss-custom-selectors@npm:^7.1.10": - version: 7.1.10 - resolution: "postcss-custom-selectors@npm:7.1.10" +"postcss-custom-selectors@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-custom-selectors@npm:8.0.0" dependencies: - "@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" + "@csstools/cascade-layer-name-parser": "npm:^2.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/11311ae6f306420223c6bf926fb1798738f3aa525a267de204de8e8ee9de467bf63b580d9ad5dbb0fff4bd9266770a3fa7e27a24af08a2e0a4115d0727d1d043 + checksum: 10c0/efc9ce0e9c92f298b9196e1cf240ef0e15f88bb3f90f441beecd05756e31628b27a56dcb176f696d3d34c8d4d879c0eb70d1cb62b44c55e01ebd2a653b8a9e94 languageName: node linkType: hard -"postcss-dir-pseudo-class@npm:^8.0.1": - version: 8.0.1 - resolution: "postcss-dir-pseudo-class@npm:8.0.1" +"postcss-dir-pseudo-class@npm:^9.0.0": + version: 9.0.0 + resolution: "postcss-dir-pseudo-class@npm:9.0.0" dependencies: - postcss-selector-parser: "npm:^6.0.13" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/8c096e096b09e4041818bd2edf5581b5172375621f5eeca013633166ea100ab98e71bf60fccd92fa20cfa7b55c57598605a1655c6bcbe54a80728a7d4e36859e + checksum: 10c0/debae71bf508c0e494ebb1892ce6b3c1c4eeb6b23231180151a93920a12fec771815510cdec54db54605e090ae56af9f07c68ef6a61260d0c837adc719f9e1e4 languageName: node linkType: hard -"postcss-discard-comments@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-discard-comments@npm:7.0.0" +"postcss-discard-comments@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-discard-comments@npm:7.0.1" + dependencies: + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/7fef7deea85c1e68161f69057be19a3aedd54d23c9b464c9b1531faa7a115f0c96a4f0ee3a560ce300578599dbc8114fe0fb744208b20b9d2fd8df1b4b39c58a + checksum: 10c0/64de3fced7e0e49dfea6aede8a5ca495b81dcd01c3c47734a5fbc86a3cb2b1ae39e1958e34e9bea64ecabd5fb4d8c287ec1d6189cf175c2434c6b6582da79948 languageName: node linkType: hard @@ -13352,38 +13483,38 @@ __metadata: languageName: node linkType: hard -"postcss-double-position-gradients@npm:^5.0.6": - version: 5.0.6 - resolution: "postcss-double-position-gradients@npm:5.0.6" +"postcss-double-position-gradients@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-double-position-gradients@npm:6.0.0" dependencies: - "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" - "@csstools/utilities": "npm:^1.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/9b24b13043fe506c0ddd94e707fe4f21f4f9a6c05ca49a4f45e23412951fd6a4cfa0095002d10b322ca8be60df0badae3715a27eefdeb7bf8da4fdd1ecd5d7a2 + checksum: 10c0/7a0e119df1b4af59d169b1a9dfc563275ce29b4ae5e6a6c90be29a7a59272ebc55bf3b2ed05a962f73b03194f7a88f6fe738e65c1659d43351fbdc705cc951ad languageName: node linkType: hard -"postcss-focus-visible@npm:^9.0.1": - version: 9.0.1 - resolution: "postcss-focus-visible@npm:9.0.1" +"postcss-focus-visible@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-focus-visible@npm:10.0.0" dependencies: - postcss-selector-parser: "npm:^6.0.13" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b8eb14ef51df62969559a7b2b4a4b6313a802fc2de225de293ad484ed6528833fc6bb7574aad5fabe7eeb27e8cd62663c2d547b25ff058d31c06d3d066abd904 + checksum: 10c0/b86b825bac597092b300127c2686c0669ce0766165716ecda42f298f21ca69dda721e44917732cbcb2611a4ab650f1231bf8c5d4d07c9daefef815329251ae8a languageName: node linkType: hard -"postcss-focus-within@npm:^8.0.1": - version: 8.0.1 - resolution: "postcss-focus-within@npm:8.0.1" +"postcss-focus-within@npm:^9.0.0": + version: 9.0.0 + resolution: "postcss-focus-within@npm:9.0.0" dependencies: - postcss-selector-parser: "npm:^6.0.13" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/cb0380d89f3b9313345dbea65c78c7ad16a6e6ab2ba9e90451d5b14f05ee691a0cdf458376368061327182e031644da21eee7e6e9ae508d195f083e0a20c0502 + checksum: 10c0/1d6f1b4f4d12e23a2824f394652d520942f00fd582d3016c933a492fe0ba38aaf26bc1855576878aaeaeda1d6fc38da39bb51e8e6470c50ef03f3ea9a286b3d1 languageName: node linkType: hard @@ -13396,39 +13527,39 @@ __metadata: languageName: node linkType: hard -"postcss-gap-properties@npm:^5.0.1": - version: 5.0.1 - resolution: "postcss-gap-properties@npm:5.0.1" +"postcss-gap-properties@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-gap-properties@npm:6.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/3b28c38819add37a2fc7decd7e3bdda1cab1de861af228abfb3e4310d87786eff4572a693bec6cea1c435bcd3dd0bb58bc9a58f1dde3a1c7def9feaf800762b8 + checksum: 10c0/4e07e0d3927d0e65d67eaf047ac39e08d39cb1bf74e16e10c7df7f0d01b184a77ea59f63fd5691b5ed6df159970b972db28cb784d883e26e981137696460897d languageName: node linkType: hard -"postcss-image-set-function@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-image-set-function@npm:6.0.3" +"postcss-image-set-function@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-image-set-function@npm:7.0.0" dependencies: - "@csstools/utilities": "npm:^1.0.0" + "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b35ce25aeca95f7abc5e5820f2398588150f5be02209054d714e870ae2fa01a8482fd10600fe1f847add898c39690275a60a5999f83f6bed6c66be9b0444b704 + checksum: 10c0/913fd9492f00122aa0c2550fb0d72130428cbe1e6465bc65e8fe71e9deb10ac0c01d7caceb68b560da759139e8cbc6c90ed22dfe6cf34949af49bb86bcbf4d3a languageName: node linkType: hard -"postcss-lab-function@npm:^6.0.16": - version: 6.0.16 - resolution: "postcss-lab-function@npm:6.0.16" +"postcss-lab-function@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-lab-function@npm:7.0.0" dependencies: - "@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" + "@csstools/css-color-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^3.0.0" + "@csstools/css-tokenizer": "npm:^3.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/ba8717cd8a197ec17acaac1b61631cd4403f07bd406b0c92f2e430a55e3f786cd6c338b626c3326e9178a0f3e58ff838ebaded19f480f39197a9cb17349ecdcd + checksum: 10c0/f3647bcdd8d6140631b97276ecf51f40df2c7564610262a20c608c37c8ab79bf6e02888419dc657afc4720a7378e3ad19f4fdf811a69363424160d548ac68daf languageName: node linkType: hard @@ -13448,14 +13579,14 @@ __metadata: languageName: node linkType: hard -"postcss-logical@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-logical@npm:7.0.1" +"postcss-logical@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-logical@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/66a06b5d3cb31181dd76c80286addd219205066a4a8c216076869fc54769ee0011cdaa8063e1b2c19c114cdc5ad12a2e2e8b730f6971960dc77d55f25f290223 + checksum: 10c0/2caa04e45227ab9dec728416ccde47514e1c347ee72aac58e13ecee3bc7fbc8b53e3fe4f1e2e4396432feb1d54e70a1f06ec5a74d60e84bafff05ab82f196475 languageName: node linkType: hard @@ -13466,29 +13597,29 @@ __metadata: languageName: node linkType: hard -"postcss-merge-longhand@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-merge-longhand@npm:7.0.1" +"postcss-merge-longhand@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-merge-longhand@npm:7.0.2" dependencies: postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^7.0.1" + stylehacks: "npm:^7.0.2" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/e3d20502e65c82c9c4ba2e400bd093ee6b9c1b0019618ccd50eb40ef0e496206dd518c7e655a6986d780d5a52576e32e8f310d00484b15f67c77664a148df6eb + checksum: 10c0/71d22418e5850e134bfcf2038acb1c91eeb48d9b6f9e4c0252fee757e11dc4ae351097a855c327fbc38dc7658fa6edc7cc7f458c08bb4044b82c6005dc565fcb languageName: node linkType: hard -"postcss-merge-rules@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-merge-rules@npm:7.0.1" +"postcss-merge-rules@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-merge-rules@npm:7.0.2" dependencies: - browserslist: "npm:^4.23.0" + browserslist: "npm:^4.23.1" caniuse-api: "npm:^3.0.0" cssnano-utils: "npm:^5.0.0" postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/d380c162327e7aad59efb55cfddc5ec4e3bf51d18b07b832fdd876505279bac3cb44511ada8e1e1992428dcec4f64c7ec457b6ff9109063c5a61abf4b59b7176 + checksum: 10c0/fbad20382ca45f1b3b5ff704c075f899cc9ba8418ae6effbdeb9e7c1f9b5c24996d1941ad36cd0936d60cbf127a72f235b2cbb0c44d9239a8a61042406d95b4a languageName: node linkType: hard @@ -13516,27 +13647,28 @@ __metadata: languageName: node linkType: hard -"postcss-minify-params@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-minify-params@npm:7.0.0" +"postcss-minify-params@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-minify-params@npm:7.0.1" dependencies: - browserslist: "npm:^4.23.0" + browserslist: "npm:^4.23.1" cssnano-utils: "npm:^5.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/28a7ae313a197aeaff8b3fa1e695a6443b11a74258374a05adee6a1b05f5849ef52037b7a5069d6910614b03b4610acdaf4a76f38b89cb42e813a8cb5ec2fc01 + checksum: 10c0/84e1c4de5af47178c1f48e10ce16341560f32bb2becf5ec9b014103f6c706174bc70885e2e13ced4de9b4f1959fb970193261cbd4751c8b87d5159e859e8c5ec languageName: node linkType: hard -"postcss-minify-selectors@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-minify-selectors@npm:7.0.1" +"postcss-minify-selectors@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-minify-selectors@npm:7.0.2" dependencies: + cssesc: "npm:^3.0.0" postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/a8ff69657fb1808d8f0f105b13a416426902d6f498a4b7ebb3b96b4b9149e97ee2e2ad6cd98108e2f0b8f781701724e6c51e120e215cee3e40c2d7a2afac755a + checksum: 10c0/87e0c21a0135b6c61b58d62c4c1e0cbd3cfb516ff8105db714c6a33a5edc477846ae220399d368e4ef6518529c711aa2dee9ff49e9befd93e83d5c939f3084a1 languageName: node linkType: hard @@ -13584,16 +13716,16 @@ __metadata: languageName: node linkType: hard -"postcss-nesting@npm:^12.1.5": - version: 12.1.5 - resolution: "postcss-nesting@npm:12.1.5" +"postcss-nesting@npm:^13.0.0": + version: 13.0.0 + resolution: "postcss-nesting@npm:13.0.0" dependencies: - "@csstools/selector-resolve-nested": "npm:^1.1.0" - "@csstools/selector-specificity": "npm:^3.1.1" + "@csstools/selector-resolve-nested": "npm:^2.0.0" + "@csstools/selector-specificity": "npm:^4.0.0" postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/8f049fe24dccb186707e065ffb697f9f0633a03b0e1139e9c24656f3d2158a738a51c7b1f405b48fdb8b4f19515ad4ad9d3cd4ec9d9fe1dd4e5f18729bf8e589 + checksum: 10c0/b82a3c7010f7c6097bd3f3fe6c03f3f3af9a63a58e255f120dadd506a0ea9444aeeaba994f2a3fa34fb26e666dc72032edf5786c5fbdade790b02ad07d91ef95 languageName: node linkType: hard @@ -13661,15 +13793,15 @@ __metadata: languageName: node linkType: hard -"postcss-normalize-unicode@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-unicode@npm:7.0.0" +"postcss-normalize-unicode@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-normalize-unicode@npm:7.0.1" dependencies: - browserslist: "npm:^4.23.0" + browserslist: "npm:^4.23.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/f2d6ab0076c006dcf3ed33ba30686f2d29e81a408c66acced22e2c942df6d613697ea786137833dd258aafab5fda4d3eb27df13a82df830357dbad9b79154881 + checksum: 10c0/fcabac738765f608cb211ac01a19f9a7d784f99d223ef6f31352f37b9bcf008e0ca7849414c9e77116be8660d78b01dba6fc4a87cee7c9a977d3c2741d6a222d languageName: node linkType: hard @@ -13704,26 +13836,26 @@ __metadata: languageName: node linkType: hard -"postcss-ordered-values@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-ordered-values@npm:7.0.0" +"postcss-ordered-values@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-ordered-values@npm:7.0.1" dependencies: cssnano-utils: "npm:^5.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/42b14f9518b573318594c2aeb2f13fd1fbe44936d14f1b28a438e7a82644ace9a2946699bebfe7a2d383534dc24e7203c35308d749f3c585a86daa238ad920a4 + checksum: 10c0/9fc62e9039c7d4fa417d165678b065fc577a7232aa41a94a4e9208ad7db2268e1ce003aaad7c6a569afdf890a43416b0bf21047461505b4e3a16eec311a6eb63 languageName: node linkType: hard -"postcss-overflow-shorthand@npm:^5.0.1": - version: 5.0.1 - resolution: "postcss-overflow-shorthand@npm:5.0.1" +"postcss-overflow-shorthand@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-overflow-shorthand@npm:6.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/328407adffae084c096b3ea2c03037f0083a0000cae744872bb1168fdd317eef12bb049cdfef749343c3ed65b4275dc6eefe577d99cbc78e3617cb36d07e8717 + checksum: 10c0/6598321b2ed0b68461135395bba9c7f76a4672617770df1e8487f459bc975f4ded6c3d37b6f72a44f4f77f7b6789e0c6f927e66dbbf1bcde1537167dbea39968 languageName: node linkType: hard @@ -13736,107 +13868,108 @@ __metadata: languageName: node linkType: hard -"postcss-place@npm:^9.0.1": - version: 9.0.1 - resolution: "postcss-place@npm:9.0.1" +"postcss-place@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-place@npm:10.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/d0fb5b0416fd15d5ac7da5fcc1829b9b78c5a90caba5bd045052c6ac0467910cbbeb2fff6c5257190affa656be27168c94ff339f86c0b7df54f9bea04bcadba7 + checksum: 10c0/ebb13deaac7648ba6042622375a31f78fbcc5209b7d196e478debbdf94525963fe621c932f4737a5b6b3d487af3b5ed6d059ed6193fdcbff6d3d5b150886ccc1 languageName: node linkType: hard -"postcss-preset-env@npm:^9.5.2": - version: 9.5.14 - resolution: "postcss-preset-env@npm:9.5.14" +"postcss-preset-env@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-preset-env@npm:10.0.0" dependencies: - "@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.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.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.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.16" - "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" - "@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.8" - "@csstools/postcss-text-decoration-shorthand": "npm:^3.0.6" - "@csstools/postcss-trigonometric-functions": "npm:^3.0.8" - "@csstools/postcss-unset-value": "npm:^3.0.1" + "@csstools/postcss-cascade-layers": "npm:^5.0.0" + "@csstools/postcss-color-function": "npm:^4.0.0" + "@csstools/postcss-color-mix-function": "npm:^3.0.0" + "@csstools/postcss-content-alt-text": "npm:^2.0.0" + "@csstools/postcss-exponential-functions": "npm:^2.0.0" + "@csstools/postcss-font-format-keywords": "npm:^4.0.0" + "@csstools/postcss-gamut-mapping": "npm:^2.0.0" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.0" + "@csstools/postcss-hwb-function": "npm:^4.0.0" + "@csstools/postcss-ic-unit": "npm:^4.0.0" + "@csstools/postcss-initial": "npm:^2.0.0" + "@csstools/postcss-is-pseudo-class": "npm:^5.0.0" + "@csstools/postcss-light-dark-function": "npm:^2.0.0" + "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0" + "@csstools/postcss-logical-overflow": "npm:^2.0.0" + "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" + "@csstools/postcss-logical-resize": "npm:^3.0.0" + "@csstools/postcss-logical-viewport-units": "npm:^3.0.0" + "@csstools/postcss-media-minmax": "npm:^2.0.0" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.0" + "@csstools/postcss-nested-calc": "npm:^4.0.0" + "@csstools/postcss-normalize-display-values": "npm:^4.0.0" + "@csstools/postcss-oklab-function": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.0" + "@csstools/postcss-scope-pseudo-class": "npm:^4.0.0" + "@csstools/postcss-stepped-value-functions": "npm:^4.0.0" + "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.0" + "@csstools/postcss-trigonometric-functions": "npm:^4.0.0" + "@csstools/postcss-unset-value": "npm:^4.0.0" autoprefixer: "npm:^10.4.19" - browserslist: "npm:^4.22.3" - css-blank-pseudo: "npm:^6.0.2" - 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" + browserslist: "npm:^4.23.1" + css-blank-pseudo: "npm:^7.0.0" + css-has-pseudo: "npm:^7.0.0" + css-prefers-color-scheme: "npm:^10.0.0" + cssdb: "npm:^8.1.0" + postcss-attribute-case-insensitive: "npm:^7.0.0" postcss-clamp: "npm:^4.1.0" - 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.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" - postcss-focus-within: "npm:^8.0.1" + postcss-color-functional-notation: "npm:^7.0.0" + postcss-color-hex-alpha: "npm:^10.0.0" + postcss-color-rebeccapurple: "npm:^10.0.0" + postcss-custom-media: "npm:^11.0.0" + postcss-custom-properties: "npm:^14.0.0" + postcss-custom-selectors: "npm:^8.0.0" + postcss-dir-pseudo-class: "npm:^9.0.0" + postcss-double-position-gradients: "npm:^6.0.0" + postcss-focus-visible: "npm:^10.0.0" + postcss-focus-within: "npm:^9.0.0" 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.16" - postcss-logical: "npm:^7.0.1" - postcss-nesting: "npm:^12.1.5" + postcss-gap-properties: "npm:^6.0.0" + postcss-image-set-function: "npm:^7.0.0" + postcss-lab-function: "npm:^7.0.0" + postcss-logical: "npm:^8.0.0" + postcss-nesting: "npm:^13.0.0" postcss-opacity-percentage: "npm:^2.0.0" - postcss-overflow-shorthand: "npm:^5.0.1" + postcss-overflow-shorthand: "npm:^6.0.0" postcss-page-break: "npm:^3.0.4" - postcss-place: "npm:^9.0.1" - postcss-pseudo-class-any-link: "npm:^9.0.2" + postcss-place: "npm:^10.0.0" + postcss-pseudo-class-any-link: "npm:^10.0.0" postcss-replace-overflow-wrap: "npm:^4.0.0" - postcss-selector-not: "npm:^7.0.2" + postcss-selector-not: "npm:^8.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/8e0c8f5c2e7b8385a770c13185986dc50d7a73b10b98c65c2f86bb4cd2860de722caef8172b1676962dafbbc044d6be1955f2a092e951976a30d4ee33b0d7571 + checksum: 10c0/0b61c44233ee7fd17e32912ce028edc19998f30183f1ff2186523c4f9eac4a2a36513af31670e13ceb05f2146c4549a0b870ba0de0e3a08e77a9d57d8de72654 languageName: node linkType: hard -"postcss-pseudo-class-any-link@npm:^9.0.2": - version: 9.0.2 - resolution: "postcss-pseudo-class-any-link@npm:9.0.2" +"postcss-pseudo-class-any-link@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-pseudo-class-any-link@npm:10.0.0" dependencies: - postcss-selector-parser: "npm:^6.0.13" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/cc2cb455a793b1f5dc0ac290e02296eafb317d9ce987dc9f2102027e22f265299666dbd1e78f1d7836fce549dead73f41e24251c08a2dd0cf482f3cc43cf7909 + checksum: 10c0/8357716e0ba0f01c70dba65a1efd268f610249ac2fbd41833e5e87dc19ffa7911c8d5e234d0d7c77d94ba6cdfa04fe7f0f98461c34f64cdbb59abd9737ab7d32 languageName: node linkType: hard -"postcss-reduce-initial@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-reduce-initial@npm:7.0.0" +"postcss-reduce-initial@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-reduce-initial@npm:7.0.1" dependencies: - browserslist: "npm:^4.23.0" + browserslist: "npm:^4.23.1" caniuse-api: "npm:^3.0.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/ed50cd680ce258df953b82ce9b3fb52564d08548724577810800e236d017d80430cbccb4b1ad38b0f4d521663598e44ab93136b20064231181ef49e1e113ae10 + checksum: 10c0/3e7c6c1d0cc4ace38f44971f02d0dd98131af678cf114aa05cfa0c066420019d5329c221ef8507644b8a79d0e76534303f747c97860ac777fe17f57110edefe1 languageName: node linkType: hard @@ -13860,10 +13993,10 @@ __metadata: languageName: node linkType: hard -"postcss-resolve-nested-selector@npm:^0.1.1": - version: 0.1.1 - resolution: "postcss-resolve-nested-selector@npm:0.1.1" - checksum: 10c0/e86412064c5d805fbee20f4e851395304102addd7d583b6a991adaa5616e8d5f45549864eb6292d4cf15075cd261c289f069acdf6a2556689fc44fe72bcb306e +"postcss-resolve-nested-selector@npm:^0.1.1, postcss-resolve-nested-selector@npm:^0.1.4": + version: 0.1.4 + resolution: "postcss-resolve-nested-selector@npm:0.1.4" + checksum: 10c0/c265c35ddd474968bc4efbe4027e33f28910ef3931ffae9c448878d7c02735aeeea6d33aa6f89902e4c111e6fe87f2cc2aa72dcb3ac242d58809f1f932baa2b6 languageName: node linkType: hard @@ -13885,24 +14018,24 @@ __metadata: languageName: node linkType: hard -"postcss-selector-not@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-selector-not@npm:7.0.2" +"postcss-selector-not@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-selector-not@npm:8.0.0" dependencies: - postcss-selector-parser: "npm:^6.0.13" + postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/624b6e516d37d43406ff1414b3413fe7a5dc34eccadd6a6082fe7df13c5c2fab3e244af33ff0916f9be0a4f7db91d1c22102f5166d7a6e6595e7c00e11e20281 + checksum: 10c0/677f2cd9d0cd481d276663b57001b2ba96db94ad5bba397f277e53d560ccb074b27c21792deff44720a9f2d96da85fa34f438bb1d33198305b5866b35f1a4708 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, postcss-selector-parser@npm:^6.1.0": - version: 6.1.0 - resolution: "postcss-selector-parser@npm:6.1.0" +"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, postcss-selector-parser@npm:^6.1.1": + version: 6.1.1 + resolution: "postcss-selector-parser@npm:6.1.1" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/91e9c6434772506bc7f318699dd9d19d32178b52dfa05bed24cb0babbdab54f8fb765d9920f01ac548be0a642aab56bce493811406ceb00ae182bbb53754c473 + checksum: 10c0/5608765e033fee35d448e1f607ffbaa750eb86901824a8bc4a911ea8bc137cb82f29239330787427c5d3695afd90d8721e190f211dbbf733e25033d8b3100763 languageName: node linkType: hard @@ -13936,14 +14069,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.38": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" +"postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.40": + version: 8.4.40 + resolution: "postcss@npm:8.4.40" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" + picocolors: "npm:^1.0.1" source-map-js: "npm:^1.2.0" - checksum: 10c0/955407b8f70cf0c14acf35dab3615899a2a60a26718a63c848cf3c29f2467b0533991b985a2b994430d890bd7ec2b1963e36352b0774a19143b5f591540f7c06 + checksum: 10c0/65ed67573e5443beaeb582282ff27a6be7c7fe3b4d9fa15761157616f2b97510cb1c335023c26220b005909f007337026d6e3ff092f25010b484ad484e80ea7f languageName: node linkType: hard @@ -14021,12 +14154,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.0.0": - version: 3.3.2 - resolution: "prettier@npm:3.3.2" +"prettier@npm:^3.3.3": + version: 3.3.3 + resolution: "prettier@npm:3.3.3" bin: prettier: bin/prettier.cjs - checksum: 10c0/39ed27d17f0238da6dd6571d63026566bd790d3d0edac57c285fbab525982060c8f1e01955fe38134ab10f0951a6076da37f015db8173c02f14bc7f0803a384c + checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26 languageName: node linkType: hard @@ -14080,6 +14213,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^4.0.0": + version: 4.0.0 + resolution: "process-warning@npm:4.0.0" + checksum: 10c0/5312a72b69d37a1b82ad03f3dfa0090dab3804a8fd995d06c28e3c002852bd82f5584217d9f4a3f197892bb2afc22d57e2c662c7e906b5abb48c0380c7b0880d + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -14088,12 +14228,12 @@ __metadata: linkType: hard "prom-client@npm:^15.0.0": - version: 15.1.2 - resolution: "prom-client@npm:15.1.2" + version: 15.1.3 + resolution: "prom-client@npm:15.1.3" dependencies: "@opentelemetry/api": "npm:^1.4.0" tdigest: "npm:^0.1.1" - checksum: 10c0/a221db148fa64e29dfd4c6cdcaaae14635495a4272b68917e2b44fcfd988bc57027d275b04489ceeea4d0c4d64d058af842c1300966d2c1ffa255f1fa6af1277 + checksum: 10c0/816525572e5799a2d1d45af78512fb47d073c842dc899c446e94d17cfc343d04282a1627c488c7ca1bcd47f766446d3e49365ab7249f6d9c22c7664a5bce7021 languageName: node linkType: hard @@ -14926,7 +15066,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.5.2": +"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2": version: 1.5.2 resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: @@ -15162,13 +15302,13 @@ __metadata: languageName: node linkType: hard -"restore-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "restore-cursor@npm:4.0.0" +"restore-cursor@npm:^5.0.0": + version: 5.1.0 + resolution: "restore-cursor@npm:5.1.0" dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 10c0/6f7da8c5e422ac26aa38354870b1afac09963572cf2879443540449068cb43476e9cbccf6f8de3e0171e0d6f7f533c2bc1a0a008003c9a525bbc098e89041318 + onetime: "npm:^7.0.0" + signal-exit: "npm:^4.1.0" + checksum: 10c0/c2ba89131eea791d1b25205bdfdc86699767e2b88dee2a590b1a6caa51737deac8bad0260a5ded2f7c074b7db2f3a626bcf1fcf3cdf35974cbeea5e2e6764f60 languageName: node linkType: hard @@ -15193,10 +15333,10 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.1": - version: 1.3.1 - resolution: "rfdc@npm:1.3.1" - checksum: 10c0/69f65e3ed30970f8055fac9fbbef9ce578800ca19554eab1dcbffe73a4b8aef536bc4248313889cf25e3b4e38b212c721eabe30856575bf2b2bc3d90f8ba93ef +"rfdc@npm:^1.4.1": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 languageName: node linkType: hard @@ -15253,10 +15393,10 @@ __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 +"rrweb-cssom@npm:^0.7.1": + version: 0.7.1 + resolution: "rrweb-cssom@npm:0.7.1" + checksum: 10c0/127b8ca6c8aac45e2755abbae6138d4a813b1bedc2caabf79466ae83ab3cfc84b5bfab513b7033f0aa4561c7753edf787d0dd01163ceacdee2e8eb1b6bf7237e languageName: node linkType: hard @@ -15355,15 +15495,15 @@ __metadata: linkType: hard "sass@npm:^1.62.1": - version: 1.77.5 - resolution: "sass@npm:1.77.5" + version: 1.77.8 + resolution: "sass@npm:1.77.8" 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/9da049b0a3fadab419084d6becdf471e107cf6e3c8ac87cabea2feb845afac75e86c99e06ee721a5aa4f6a2d833ec5380137c4e540ab2f760edf1e4eb6139e69 + checksum: 10c0/2bfd62794070352c804f949e69bd8bb5b4ec846deeb924251b2c3f7b503170fb1ae186f513f0166907749eb34e0277dee747edcb78c886fb471aac01be1e864c languageName: node linkType: hard @@ -15476,12 +15616,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2": - version: 7.6.2 - resolution: "semver@npm:7.6.2" +"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf languageName: node linkType: hard @@ -15728,6 +15868,13 @@ __metadata: languageName: node linkType: hard +"slashes@npm:^3.0.12": + version: 3.0.12 + resolution: "slashes@npm:3.0.12" + checksum: 10c0/71ca2a1fcd1ab6814b0fdb8cf9c33a3d54321deec2aa8d173510f0086880201446021a9b9e6a18561f7c472b69a2145977c6a8fb9c53a8ff7be31778f203d175 + languageName: node + linkType: hard + "slice-ansi@npm:^4.0.0": version: 4.0.0 resolution: "slice-ansi@npm:4.0.0" @@ -15749,7 +15896,7 @@ __metadata: languageName: node linkType: hard -"slice-ansi@npm:^7.0.0": +"slice-ansi@npm:^7.1.0": version: 7.1.0 resolution: "slice-ansi@npm:7.1.0" dependencies: @@ -16137,6 +16284,15 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.0.0": + version: 1.0.0 + resolution: "stop-iteration-iterator@npm:1.0.0" + dependencies: + internal-slot: "npm:^1.0.4" + checksum: 10c0/c4158d6188aac510d9e92925b58709207bd94699e9c31186a040c80932a687f84a51356b5895e6dc72710aad83addb9411c22171832c9ae0e6e11b7d61b0dfb9 + languageName: node + linkType: hard + "stream-browserify@npm:^2.0.1": version: 2.0.2 resolution: "stream-browserify@npm:2.0.2" @@ -16221,6 +16377,16 @@ __metadata: languageName: node linkType: hard +"string.prototype.includes@npm:^2.0.0": + version: 2.0.0 + resolution: "string.prototype.includes@npm:2.0.0" + dependencies: + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10c0/32dff118c9e9dcc87e240b05462fa8ee7248d9e335c0015c1442fe18152261508a2146d9bb87ddae56abab69148a83c61dfaea33f53853812a6a2db737689ed2 + languageName: node + linkType: hard + "string.prototype.matchall@npm:^4.0.11, string.prototype.matchall@npm:^4.0.6": version: 4.0.11 resolution: "string.prototype.matchall@npm:4.0.11" @@ -16241,6 +16407,16 @@ __metadata: languageName: node linkType: hard +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" + dependencies: + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.9": version: 1.2.9 resolution: "string.prototype.trim@npm:1.2.9" @@ -16407,15 +16583,15 @@ __metadata: languageName: node linkType: hard -"stylehacks@npm:^7.0.1": - version: 7.0.1 - resolution: "stylehacks@npm:7.0.1" +"stylehacks@npm:^7.0.2": + version: 7.0.2 + resolution: "stylehacks@npm:7.0.2" dependencies: - browserslist: "npm:^4.23.0" + browserslist: "npm:^4.23.1" postcss-selector-parser: "npm:^6.1.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/538d5d9c6d84906efad3706f0873b85b67fa224f17759b122bad3d60f2928c31204fd658dd16ec952bf54858a3aeaef4643e040c04030459285ce1b13c4cae91 + checksum: 10c0/552299e869ac430e1076c025ace6c80bdfd5b672632435625eb1bd45ff5611aad7f3ee810e72edc04dc0fc3761e08dec40d27b72c50b95690eea2de43238b8d8 languageName: node linkType: hard @@ -16488,12 +16664,12 @@ __metadata: linkType: hard "stylelint@npm:^16.0.2": - version: 16.6.1 - resolution: "stylelint@npm:16.6.1" + version: 16.8.1 + resolution: "stylelint@npm:16.8.1" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.6.3" - "@csstools/css-tokenizer": "npm:^2.3.1" - "@csstools/media-query-list-parser": "npm:^2.1.11" + "@csstools/css-parser-algorithms": "npm:^2.7.1" + "@csstools/css-tokenizer": "npm:^2.4.1" + "@csstools/media-query-list-parser": "npm:^2.1.13" "@csstools/selector-specificity": "npm:^3.1.1" "@dual-bundle/import-meta-resolve": "npm:^4.1.0" balanced-match: "npm:^2.0.0" @@ -16501,7 +16677,7 @@ __metadata: cosmiconfig: "npm:^9.0.0" css-functions-list: "npm:^3.2.2" css-tree: "npm:^2.3.1" - debug: "npm:^4.3.4" + debug: "npm:^4.3.6" fast-glob: "npm:^3.3.2" fastest-levenshtein: "npm:^1.0.16" file-entry-cache: "npm:^9.0.0" @@ -16512,16 +16688,16 @@ __metadata: ignore: "npm:^5.3.1" imurmurhash: "npm:^0.1.4" is-plain-object: "npm:^5.0.0" - known-css-properties: "npm:^0.31.0" + known-css-properties: "npm:^0.34.0" mathml-tag-names: "npm:^2.1.3" meow: "npm:^13.2.0" micromatch: "npm:^4.0.7" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.0.1" - postcss: "npm:^8.4.38" - postcss-resolve-nested-selector: "npm:^0.1.1" + postcss: "npm:^8.4.40" + postcss-resolve-nested-selector: "npm:^0.1.4" postcss-safe-parser: "npm:^7.0.0" - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^6.1.1" postcss-value-parser: "npm:^4.2.0" resolve-from: "npm:^5.0.0" string-width: "npm:^4.2.3" @@ -16532,7 +16708,7 @@ __metadata: write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/8dc9b0024d6fb109380a142171ab8a134c3863aa8b8736f0083310a0d05f173dcda5680f29267697dfa0aaeb2f08aef4ef113e4bb4f8582fcfdd97f35be51d71 + checksum: 10c0/7bc6b0193f83420b2170026078b427d7fb22a07d3345fc99a16241625a572f2fc3e1fa1999e54c01cc2b15bd59d135715c2b140b089c17aa7f4e377ded1fc1b5 languageName: node linkType: hard @@ -16664,6 +16840,16 @@ __metadata: languageName: node linkType: hard +"synckit@npm:^0.9.1": + version: 0.9.1 + resolution: "synckit@npm:0.9.1" + dependencies: + "@pkgr/core": "npm:^0.1.0" + tslib: "npm:^2.6.2" + checksum: 10c0/d8b89e1bf30ba3ffb469d8418c836ad9c0c062bf47028406b4d06548bc66af97155ea2303b96c93bf5c7c0f0d66153a6fbd6924c76521b434e6a9898982abc2e + languageName: node + linkType: hard + "table@npm:^6.8.2": version: 6.8.2 resolution: "table@npm:6.8.2" @@ -17000,13 +17186,20 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.6.2, tslib@npm:^2.4.0": +"tslib@npm:2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb languageName: node linkType: hard +"tslib@npm:^2.4.0, tslib@npm:^2.6.2": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a + languageName: node + linkType: hard + "tty-browserify@npm:0.0.0": version: 0.0.0 resolution: "tty-browserify@npm:0.0.0" @@ -17070,13 +17263,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^3.0.0": - version: 3.13.1 - resolution: "type-fest@npm:3.13.1" - checksum: 10c0/547d22186f73a8c04590b70dcf63baff390078c75ea8acd366bbd510fd0646e348bd1970e47ecf795b7cff0b41d26e9c475c1fedd6ef5c45c82075fbf916b629 - languageName: node - linkType: hard - "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -17140,22 +17326,22 @@ __metadata: linkType: hard "typescript@npm:5, typescript@npm:^5.0.4": - version: 5.4.5 - resolution: "typescript@npm:5.4.5" + version: 5.5.4 + resolution: "typescript@npm:5.5.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e + checksum: 10c0/422be60f89e661eab29ac488c974b6cc0a660fb2228003b297c3d10c32c90f3bcffc1009b43876a082515a3c376b1eefcce823d6e78982e6878408b9a923199c languageName: node linkType: hard "typescript@patch:typescript@npm%3A5#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": - version: 5.4.5 - resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" + version: 5.5.4 + resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/db2ad2a16ca829f50427eeb1da155e7a45e598eec7b086d8b4e8ba44e5a235f758e606d681c66992230d3fc3b8995865e5fd0b22a2c95486d0b3200f83072ec9 + checksum: 10c0/73409d7b9196a5a1217b3aaad929bf76294d3ce7d6e9766dd880ece296ee91cf7d7db6b16c6c6c630ee5096eccde726c0ef17c7dfa52b01a243e57ae1f09ef07 languageName: node linkType: hard @@ -17334,17 +17520,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.0.16": + version: 1.0.16 + resolution: "update-browserslist-db@npm:1.0.16" dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" + escalade: "npm:^3.1.2" + picocolors: "npm:^1.0.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/e52b8b521c78ce1e0c775f356cd16a9c22c70d25f3e01180839c407a5dc787fb05a13f67560cbaf316770d26fa99f78f1acd711b1b54a4f35d4820d4ea7136e6 + checksum: 10c0/5995399fc202adbb51567e4810e146cdf7af630a92cc969365a099150cb00597e425cc14987ca7080b09a4d0cfd2a3de53fbe72eebff171aed7f9bb81f9bf405 languageName: node linkType: hard @@ -17393,6 +17579,15 @@ __metadata: languageName: node linkType: hard +"use-debounce@npm:^10.0.0": + version: 10.0.2 + resolution: "use-debounce@npm:10.0.2" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/2d992108557a0ad3e59bc35028c0dbc6ad12088a08d992fd52aad3881dd24663606fe71f7fd925327fb98599c6252bfa4c143649351d48e6243d7a3332594fd6 + languageName: node + linkType: hard + "use-isomorphic-layout-effect@npm:^1.1.1, use-isomorphic-layout-effect@npm:^1.1.2": version: 1.1.2 resolution: "use-isomorphic-layout-effect@npm:1.1.2" @@ -17793,14 +17988,14 @@ __metadata: languageName: node linkType: hard -"webpack-merge@npm:^5.9.0": - version: 5.10.0 - resolution: "webpack-merge@npm:5.10.0" +"webpack-merge@npm:^6.0.0": + version: 6.0.1 + resolution: "webpack-merge@npm:6.0.1" dependencies: clone-deep: "npm:^4.0.1" flat: "npm:^5.0.2" - wildcard: "npm:^2.0.0" - checksum: 10c0/b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b + wildcard: "npm:^2.0.1" + checksum: 10c0/bf1429567858b353641801b8a2696ca0aac270fc8c55d4de8a7b586fe07d27fdcfc83099a98ab47e6162383db8dd63bb8cc25b1beb2ec82150422eec843b0dc0 languageName: node linkType: hard @@ -17995,7 +18190,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.9": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15" dependencies: @@ -18048,7 +18243,7 @@ __metadata: languageName: node linkType: hard -"wildcard@npm:^2.0.0": +"wildcard@npm:^2.0.1": version: 2.0.1 resolution: "wildcard@npm:2.0.1" checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 @@ -18355,9 +18550,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.11.0, ws@npm:^8.12.1, ws@npm:^8.17.0": - version: 8.17.1 - resolution: "ws@npm:8.17.1" +"ws@npm:^8.11.0, ws@npm:^8.12.1, ws@npm:^8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -18366,7 +18561,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/f4a49064afae4500be772abdc2211c8518f39e1c959640457dcee15d4488628620625c783902a52af2dd02f68558da2868fd06e6fd0e67ebcd09e6881b1b5bfe + checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 languageName: node linkType: hard @@ -18433,12 +18628,12 @@ __metadata: languageName: node linkType: hard -"yaml@npm:~2.4.2": - version: 2.4.2 - resolution: "yaml@npm:2.4.2" +"yaml@npm:~2.5.0": + version: 2.5.0 + resolution: "yaml@npm:2.5.0" bin: yaml: bin.mjs - checksum: 10c0/280ddb2e43ffa7d91a95738e80c8f33e860749cdc25aa6d9e4d350a28e174fd7e494e4aa023108aaee41388e451e3dc1292261d8f022aabcf90df9c63d647549 + checksum: 10c0/771a1df083c8217cf04ef49f87244ae2dd7d7457094425e793b8f056159f167602ce172aa32d6bca21f787d24ec724aee3cecde938f6643564117bd151452631 languageName: node linkType: hard